Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Unified Diff: src/compiler/simplified-operator.cc

Issue 2220573002: [turbofan] Add NumberOperationHint for speculative number operations. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Update comment. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/compiler/simplified-operator.h ('k') | test/unittests/compiler/js-typed-lowering-unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/simplified-operator.cc
diff --git a/src/compiler/simplified-operator.cc b/src/compiler/simplified-operator.cc
index 989aa3613e0337bdd9c72b47313bf1d2c624bcfa..ea271677536b9171ca3704b48d105c80d001aa87 100644
--- a/src/compiler/simplified-operator.cc
+++ b/src/compiler/simplified-operator.cc
@@ -269,7 +269,24 @@ ElementsTransition ElementsTransitionOf(const Operator* op) {
return OpParameter<ElementsTransition>(op);
}
-BinaryOperationHints::Hint BinaryOperationHintOf(const Operator* op) {
+std::ostream& operator<<(std::ostream& os, NumberOperationHint hint) {
+ switch (hint) {
+ case NumberOperationHint::kSignedSmall:
+ return os << "SignedSmall";
+ case NumberOperationHint::kSigned32:
+ return os << "Signed32";
+ case NumberOperationHint::kNumberOrOddball:
+ return os << "NumberOrOddball";
+ }
+ UNREACHABLE();
+ return os;
+}
+
+size_t hash_value(NumberOperationHint hint) {
+ return static_cast<uint8_t>(hint);
+}
+
+NumberOperationHint NumberOperationHintOf(const Operator* op) {
DCHECK(op->opcode() == IrOpcode::kSpeculativeNumberAdd ||
op->opcode() == IrOpcode::kSpeculativeNumberSubtract ||
op->opcode() == IrOpcode::kSpeculativeNumberMultiply ||
@@ -280,15 +297,11 @@ BinaryOperationHints::Hint BinaryOperationHintOf(const Operator* op) {
op->opcode() == IrOpcode::kSpeculativeNumberShiftRightLogical ||
op->opcode() == IrOpcode::kSpeculativeNumberBitwiseAnd ||
op->opcode() == IrOpcode::kSpeculativeNumberBitwiseOr ||
- op->opcode() == IrOpcode::kSpeculativeNumberBitwiseXor);
- return OpParameter<BinaryOperationHints::Hint>(op);
-}
-
-CompareOperationHints::Hint CompareOperationHintOf(const Operator* op) {
- DCHECK(op->opcode() == IrOpcode::kSpeculativeNumberEqual ||
+ op->opcode() == IrOpcode::kSpeculativeNumberBitwiseXor ||
+ op->opcode() == IrOpcode::kSpeculativeNumberEqual ||
op->opcode() == IrOpcode::kSpeculativeNumberLessThan ||
op->opcode() == IrOpcode::kSpeculativeNumberLessThanOrEqual);
- return OpParameter<CompareOperationHints::Hint>(op);
+ return OpParameter<NumberOperationHint>(op);
}
#define PURE_OP_LIST(V) \
@@ -370,18 +383,11 @@ CompareOperationHints::Hint CompareOperationHintOf(const Operator* op) {
V(StringLessThan, Operator::kNoProperties, 2, 0) \
V(StringLessThanOrEqual, Operator::kNoProperties, 2, 0)
-#define SPECULATIVE_BINOP_LIST(V) \
- V(SpeculativeNumberAdd) \
- V(SpeculativeNumberSubtract) \
- V(SpeculativeNumberDivide) \
- V(SpeculativeNumberMultiply) \
- V(SpeculativeNumberModulus) \
- V(SpeculativeNumberShiftLeft) \
- V(SpeculativeNumberShiftRight) \
- V(SpeculativeNumberShiftRightLogical) \
- V(SpeculativeNumberBitwiseAnd) \
- V(SpeculativeNumberBitwiseOr) \
- V(SpeculativeNumberBitwiseXor)
+#define SPECULATIVE_NUMBER_BINOP_LIST(V) \
+ SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(V) \
+ V(SpeculativeNumberEqual) \
+ V(SpeculativeNumberLessThan) \
+ V(SpeculativeNumberLessThanOrEqual)
#define CHECKED_OP_LIST(V) \
V(CheckBounds, 2, 1) \
@@ -513,6 +519,22 @@ struct SimplifiedOperatorGlobalCache final {
};
EnsureWritableFastElementsOperator kEnsureWritableFastElements;
+#define SPECULATIVE_NUMBER_BINOP(Name) \
+ template <NumberOperationHint kHint> \
+ struct Name##Operator final : public Operator1<NumberOperationHint> { \
+ Name##Operator() \
+ : Operator1<NumberOperationHint>( \
+ IrOpcode::k##Name, Operator::kFoldable | Operator::kNoThrow, \
+ #Name, 2, 1, 1, 1, 1, 0, kHint) {} \
+ }; \
+ Name##Operator<NumberOperationHint::kSignedSmall> \
+ k##Name##SignedSmallOperator; \
+ Name##Operator<NumberOperationHint::kSigned32> k##Name##Signed32Operator; \
+ Name##Operator<NumberOperationHint::kNumberOrOddball> \
+ k##Name##NumberOrOddballOperator;
+ SPECULATIVE_NUMBER_BINOP_LIST(SPECULATIVE_NUMBER_BINOP)
+#undef SPECULATIVE_NUMBER_BINOP
+
#define BUFFER_ACCESS(Type, type, TYPE, ctype, size) \
struct LoadBuffer##Type##Operator final : public Operator1<BufferAccess> { \
LoadBuffer##Type##Operator() \
@@ -679,39 +701,21 @@ const Operator* SimplifiedOperatorBuilder::StoreBuffer(BufferAccess access) {
return nullptr;
}
-#define SPECULATIVE_BINOP_DEF(Name) \
- const Operator* SimplifiedOperatorBuilder::Name( \
- BinaryOperationHints::Hint hint) { \
- return new (zone()) Operator1<BinaryOperationHints::Hint>( \
- IrOpcode::k##Name, Operator::kFoldable | Operator::kNoThrow, #Name, 2, \
- 1, 1, 1, 1, 0, hint); \
+#define SPECULATIVE_NUMBER_BINOP(Name) \
+ const Operator* SimplifiedOperatorBuilder::Name(NumberOperationHint hint) { \
+ switch (hint) { \
+ case NumberOperationHint::kSignedSmall: \
+ return &cache_.k##Name##SignedSmallOperator; \
+ case NumberOperationHint::kSigned32: \
+ return &cache_.k##Name##Signed32Operator; \
+ case NumberOperationHint::kNumberOrOddball: \
+ return &cache_.k##Name##NumberOrOddballOperator; \
+ } \
+ UNREACHABLE(); \
+ return nullptr; \
}
-SPECULATIVE_BINOP_LIST(SPECULATIVE_BINOP_DEF)
-#undef SPECULATIVE_BINOP_DEF
-
-const Operator* SimplifiedOperatorBuilder::SpeculativeNumberEqual(
- CompareOperationHints::Hint hint) {
- return new (zone()) Operator1<CompareOperationHints::Hint>(
- IrOpcode::kSpeculativeNumberEqual,
- Operator::kFoldable | Operator::kNoThrow, "SpeculativeNumberEqual", 2, 1,
- 1, 1, 1, 0, hint);
-}
-
-const Operator* SimplifiedOperatorBuilder::SpeculativeNumberLessThan(
- CompareOperationHints::Hint hint) {
- return new (zone()) Operator1<CompareOperationHints::Hint>(
- IrOpcode::kSpeculativeNumberLessThan,
- Operator::kFoldable | Operator::kNoThrow, "SpeculativeNumberLessThan", 2,
- 1, 1, 1, 1, 0, hint);
-}
-
-const Operator* SimplifiedOperatorBuilder::SpeculativeNumberLessThanOrEqual(
- CompareOperationHints::Hint hint) {
- return new (zone()) Operator1<CompareOperationHints::Hint>(
- IrOpcode::kSpeculativeNumberLessThanOrEqual,
- Operator::kFoldable | Operator::kNoThrow,
- "SpeculativeNumberLessThanOrEqual", 2, 1, 1, 1, 1, 0, hint);
-}
+SPECULATIVE_NUMBER_BINOP_LIST(SPECULATIVE_NUMBER_BINOP)
+#undef SPECULATIVE_NUMBER_BINOP
#define ACCESS_OP_LIST(V) \
V(LoadField, FieldAccess, Operator::kNoWrite, 1, 1, 1) \
« no previous file with comments | « src/compiler/simplified-operator.h ('k') | test/unittests/compiler/js-typed-lowering-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698