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

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

Issue 2228983002: [turbofan] Simplify BinaryOperationHints and CompareOperationHints. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix compile for realz 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/js-operator.h ('k') | src/compiler/js-typed-lowering.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/js-operator.cc
diff --git a/src/compiler/js-operator.cc b/src/compiler/js-operator.cc
index 7c5ec75e1a27546369b321c9009f9f8919611fd8..d19bb767b4a42fe3a1287c6e53a7a69770d5b301 100644
--- a/src/compiler/js-operator.cc
+++ b/src/compiler/js-operator.cc
@@ -376,7 +376,7 @@ const CreateLiteralParameters& CreateLiteralParametersOf(const Operator* op) {
return OpParameter<CreateLiteralParameters>(op);
}
-const BinaryOperationHints& BinaryOperationHintsOf(const Operator* op) {
+const BinaryOperationHint BinaryOperationHintOf(const Operator* op) {
DCHECK(op->opcode() == IrOpcode::kJSBitwiseOr ||
op->opcode() == IrOpcode::kJSBitwiseXor ||
op->opcode() == IrOpcode::kJSBitwiseAnd ||
@@ -388,10 +388,10 @@ const BinaryOperationHints& BinaryOperationHintsOf(const Operator* op) {
op->opcode() == IrOpcode::kJSMultiply ||
op->opcode() == IrOpcode::kJSDivide ||
op->opcode() == IrOpcode::kJSModulus);
- return OpParameter<BinaryOperationHints>(op);
+ return OpParameter<BinaryOperationHint>(op);
}
-const CompareOperationHints& CompareOperationHintsOf(const Operator* op) {
+const CompareOperationHint CompareOperationHintOf(const Operator* op) {
DCHECK(op->opcode() == IrOpcode::kJSEqual ||
op->opcode() == IrOpcode::kJSNotEqual ||
op->opcode() == IrOpcode::kJSStrictEqual ||
@@ -400,7 +400,7 @@ const CompareOperationHints& CompareOperationHintsOf(const Operator* op) {
op->opcode() == IrOpcode::kJSGreaterThan ||
op->opcode() == IrOpcode::kJSLessThanOrEqual ||
op->opcode() == IrOpcode::kJSGreaterThanOrEqual);
- return OpParameter<CompareOperationHints>(op);
+ return OpParameter<CompareOperationHint>(op);
}
#define CACHED_OP_LIST(V) \
@@ -425,210 +425,132 @@ const CompareOperationHints& CompareOperationHintsOf(const Operator* op) {
V(StackCheck, Operator::kNoWrite, 0, 0) \
V(CreateWithContext, Operator::kNoProperties, 2, 1)
+#define BINARY_OP_LIST(V) \
+ V(BitwiseOr) \
+ V(BitwiseXor) \
+ V(BitwiseAnd) \
+ V(ShiftLeft) \
+ V(ShiftRight) \
+ V(ShiftRightLogical) \
+ V(Add) \
+ V(Subtract) \
+ V(Multiply) \
+ V(Divide) \
+ V(Modulus)
+
+#define COMPARE_OP_LIST(V) \
+ V(Equal, Operator::kNoProperties) \
+ V(NotEqual, Operator::kNoProperties) \
+ V(StrictEqual, Operator::kPure) \
+ V(StrictNotEqual, Operator::kPure) \
+ V(LessThan, Operator::kNoProperties) \
+ V(GreaterThan, Operator::kNoProperties) \
+ V(LessThanOrEqual, Operator::kNoProperties) \
+ V(GreaterThanOrEqual, Operator::kNoProperties)
+
struct JSOperatorGlobalCache final {
-#define CACHED(Name, properties, value_input_count, value_output_count) \
- struct Name##Operator final : public Operator { \
- Name##Operator() \
- : Operator(IrOpcode::kJS##Name, properties, "JS" #Name, \
- value_input_count, Operator::ZeroIfPure(properties), \
- Operator::ZeroIfEliminatable(properties), \
- value_output_count, Operator::ZeroIfPure(properties), \
- Operator::ZeroIfNoThrow(properties)) {} \
- }; \
+#define CACHED_OP(Name, properties, value_input_count, value_output_count) \
+ struct Name##Operator final : public Operator { \
+ Name##Operator() \
+ : Operator(IrOpcode::kJS##Name, properties, "JS" #Name, \
+ value_input_count, Operator::ZeroIfPure(properties), \
+ Operator::ZeroIfEliminatable(properties), \
+ value_output_count, Operator::ZeroIfPure(properties), \
+ Operator::ZeroIfNoThrow(properties)) {} \
+ }; \
Name##Operator k##Name##Operator;
- CACHED_OP_LIST(CACHED)
-#undef CACHED
+ CACHED_OP_LIST(CACHED_OP)
+#undef CACHED_OP
+
+#define BINARY_OP(Name) \
+ template <BinaryOperationHint kHint> \
+ struct Name##Operator final : public Operator1<BinaryOperationHint> { \
+ Name##Operator() \
+ : Operator1<BinaryOperationHint>(IrOpcode::kJS##Name, \
+ Operator::kNoProperties, "JS" #Name, \
+ 2, 1, 1, 1, 1, 2, kHint) {} \
+ }; \
+ Name##Operator<BinaryOperationHint::kNone> k##Name##NoneOperator; \
+ Name##Operator<BinaryOperationHint::kSignedSmall> \
+ k##Name##SignedSmallOperator; \
+ Name##Operator<BinaryOperationHint::kSigned32> k##Name##Signed32Operator; \
+ Name##Operator<BinaryOperationHint::kNumberOrOddball> \
+ k##Name##NumberOrOddballOperator; \
+ Name##Operator<BinaryOperationHint::kAny> k##Name##AnyOperator;
+ BINARY_OP_LIST(BINARY_OP)
+#undef BINARY_OP
+
+#define COMPARE_OP(Name, properties) \
+ template <CompareOperationHint kHint> \
+ struct Name##Operator final : public Operator1<CompareOperationHint> { \
+ Name##Operator() \
+ : Operator1<CompareOperationHint>( \
+ IrOpcode::kJS##Name, properties, "JS" #Name, 2, 1, 1, 1, 1, \
+ Operator::ZeroIfNoThrow(properties), kHint) {} \
+ }; \
+ Name##Operator<CompareOperationHint::kNone> k##Name##NoneOperator; \
+ Name##Operator<CompareOperationHint::kSignedSmall> \
+ k##Name##SignedSmallOperator; \
+ Name##Operator<CompareOperationHint::kNumber> k##Name##NumberOperator; \
+ Name##Operator<CompareOperationHint::kNumberOrOddball> \
+ k##Name##NumberOrOddballOperator; \
+ Name##Operator<CompareOperationHint::kAny> k##Name##AnyOperator;
+ COMPARE_OP_LIST(COMPARE_OP)
+#undef COMPARE_OP
};
-
static base::LazyInstance<JSOperatorGlobalCache>::type kCache =
LAZY_INSTANCE_INITIALIZER;
-
JSOperatorBuilder::JSOperatorBuilder(Zone* zone)
: cache_(kCache.Get()), zone_(zone) {}
-
-#define CACHED(Name, properties, value_input_count, value_output_count) \
- const Operator* JSOperatorBuilder::Name() { \
- return &cache_.k##Name##Operator; \
+#define CACHED_OP(Name, properties, value_input_count, value_output_count) \
+ const Operator* JSOperatorBuilder::Name() { \
+ return &cache_.k##Name##Operator; \
}
-CACHED_OP_LIST(CACHED)
-#undef CACHED
-
-const Operator* JSOperatorBuilder::BitwiseOr(BinaryOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<BinaryOperationHints>( //--
- IrOpcode::kJSBitwiseOr, Operator::kNoProperties, // opcode
- "JSBitwiseOr", // name
- 2, 1, 1, 1, 1, 2, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::BitwiseXor(BinaryOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<BinaryOperationHints>( //--
- IrOpcode::kJSBitwiseXor, Operator::kNoProperties, // opcode
- "JSBitwiseXor", // name
- 2, 1, 1, 1, 1, 2, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::BitwiseAnd(BinaryOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<BinaryOperationHints>( //--
- IrOpcode::kJSBitwiseAnd, Operator::kNoProperties, // opcode
- "JSBitwiseAnd", // name
- 2, 1, 1, 1, 1, 2, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::ShiftLeft(BinaryOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<BinaryOperationHints>( //--
- IrOpcode::kJSShiftLeft, Operator::kNoProperties, // opcode
- "JSShiftLeft", // name
- 2, 1, 1, 1, 1, 2, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::ShiftRight(BinaryOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<BinaryOperationHints>( //--
- IrOpcode::kJSShiftRight, Operator::kNoProperties, // opcode
- "JSShiftRight", // name
- 2, 1, 1, 1, 1, 2, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::ShiftRightLogical(
- BinaryOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<BinaryOperationHints>( //--
- IrOpcode::kJSShiftRightLogical, Operator::kNoProperties, // opcode
- "JSShiftRightLogical", // name
- 2, 1, 1, 1, 1, 2, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::Add(BinaryOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<BinaryOperationHints>( //--
- IrOpcode::kJSAdd, Operator::kNoProperties, // opcode
- "JSAdd", // name
- 2, 1, 1, 1, 1, 2, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::Subtract(BinaryOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<BinaryOperationHints>( //--
- IrOpcode::kJSSubtract, Operator::kNoProperties, // opcode
- "JSSubtract", // name
- 2, 1, 1, 1, 1, 2, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::Multiply(BinaryOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<BinaryOperationHints>( //--
- IrOpcode::kJSMultiply, Operator::kNoProperties, // opcode
- "JSMultiply", // name
- 2, 1, 1, 1, 1, 2, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::Divide(BinaryOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<BinaryOperationHints>( //--
- IrOpcode::kJSDivide, Operator::kNoProperties, // opcode
- "JSDivide", // name
- 2, 1, 1, 1, 1, 2, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::Modulus(BinaryOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<BinaryOperationHints>( //--
- IrOpcode::kJSModulus, Operator::kNoProperties, // opcode
- "JSModulus", // name
- 2, 1, 1, 1, 1, 2, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::Equal(CompareOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<CompareOperationHints>( //--
- IrOpcode::kJSEqual, Operator::kNoProperties, // opcode
- "JSEqual", // name
- 2, 1, 1, 1, 1, 2, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::NotEqual(CompareOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<CompareOperationHints>( //--
- IrOpcode::kJSNotEqual, Operator::kNoProperties, // opcode
- "JSNotEqual", // name
- 2, 1, 1, 1, 1, 2, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::StrictEqual(CompareOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<CompareOperationHints>( //--
- IrOpcode::kJSStrictEqual, Operator::kPure, // opcode
- "JSStrictEqual", // name
- 2, 1, 1, 1, 1, 0, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::StrictNotEqual(CompareOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<CompareOperationHints>( //--
- IrOpcode::kJSStrictNotEqual, Operator::kPure, // opcode
- "JSStrictNotEqual", // name
- 2, 1, 1, 1, 1, 0, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::LessThan(CompareOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<CompareOperationHints>( //--
- IrOpcode::kJSLessThan, Operator::kNoProperties, // opcode
- "JSLessThan", // name
- 2, 1, 1, 1, 1, 2, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::GreaterThan(CompareOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<CompareOperationHints>( //--
- IrOpcode::kJSGreaterThan, Operator::kNoProperties, // opcode
- "JSGreaterThan", // name
- 2, 1, 1, 1, 1, 2, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::LessThanOrEqual(
- CompareOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<CompareOperationHints>( //--
- IrOpcode::kJSLessThanOrEqual, Operator::kNoProperties, // opcode
- "JSLessThanOrEqual", // name
- 2, 1, 1, 1, 1, 2, // inputs/outputs
- hints); // parameter
-}
-
-const Operator* JSOperatorBuilder::GreaterThanOrEqual(
- CompareOperationHints hints) {
- // TODO(turbofan): Cache most important versions of this operator.
- return new (zone()) Operator1<CompareOperationHints>( //--
- IrOpcode::kJSGreaterThanOrEqual, Operator::kNoProperties, // opcode
- "JSGreaterThanOrEqual", // name
- 2, 1, 1, 1, 1, 2, // inputs/outputs
- hints); // parameter
-}
+CACHED_OP_LIST(CACHED_OP)
+#undef CACHED_OP
+
+#define BINARY_OP(Name) \
+ const Operator* JSOperatorBuilder::Name(BinaryOperationHint hint) { \
+ switch (hint) { \
+ case BinaryOperationHint::kNone: \
+ return &cache_.k##Name##NoneOperator; \
+ case BinaryOperationHint::kSignedSmall: \
+ return &cache_.k##Name##SignedSmallOperator; \
+ case BinaryOperationHint::kSigned32: \
+ return &cache_.k##Name##Signed32Operator; \
+ case BinaryOperationHint::kNumberOrOddball: \
+ return &cache_.k##Name##NumberOrOddballOperator; \
+ case BinaryOperationHint::kAny: \
+ return &cache_.k##Name##AnyOperator; \
+ } \
+ UNREACHABLE(); \
+ return nullptr; \
+ }
+BINARY_OP_LIST(BINARY_OP)
+#undef BINARY_OP
+
+#define COMPARE_OP(Name, ...) \
+ const Operator* JSOperatorBuilder::Name(CompareOperationHint hint) { \
+ switch (hint) { \
+ case CompareOperationHint::kNone: \
+ return &cache_.k##Name##NoneOperator; \
+ case CompareOperationHint::kSignedSmall: \
+ return &cache_.k##Name##SignedSmallOperator; \
+ case CompareOperationHint::kNumber: \
+ return &cache_.k##Name##NumberOperator; \
+ case CompareOperationHint::kNumberOrOddball: \
+ return &cache_.k##Name##NumberOrOddballOperator; \
+ case CompareOperationHint::kAny: \
+ return &cache_.k##Name##AnyOperator; \
+ } \
+ UNREACHABLE(); \
+ return nullptr; \
+ }
+COMPARE_OP_LIST(COMPARE_OP)
+#undef COMPARE_OP
const Operator* JSOperatorBuilder::ToBoolean(ToBooleanHints hints) {
// TODO(turbofan): Cache most important versions of this operator.
« no previous file with comments | « src/compiler/js-operator.h ('k') | src/compiler/js-typed-lowering.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698