Index: src/compiler/js-operator.cc |
diff --git a/src/compiler/js-operator.cc b/src/compiler/js-operator.cc |
index aeb317bcc9c4f87685bd54b585f67c845041037a..716592bd972b3928bf7fccbba0baf08f7b8ef342 100644 |
--- a/src/compiler/js-operator.cc |
+++ b/src/compiler/js-operator.cc |
@@ -213,21 +213,6 @@ const StoreNamedParameters& StoreNamedParametersOf(const Operator* op) { |
V(NotEqual, Operator::kNoProperties, 2, 1) \ |
V(StrictEqual, Operator::kPure, 2, 1) \ |
V(StrictNotEqual, Operator::kPure, 2, 1) \ |
- V(LessThan, Operator::kNoProperties, 2, 1) \ |
- V(GreaterThan, Operator::kNoProperties, 2, 1) \ |
- V(LessThanOrEqual, Operator::kNoProperties, 2, 1) \ |
- V(GreaterThanOrEqual, Operator::kNoProperties, 2, 1) \ |
- V(BitwiseOr, Operator::kNoProperties, 2, 1) \ |
- V(BitwiseXor, Operator::kNoProperties, 2, 1) \ |
- V(BitwiseAnd, Operator::kNoProperties, 2, 1) \ |
- V(ShiftLeft, Operator::kNoProperties, 2, 1) \ |
- V(ShiftRight, Operator::kNoProperties, 2, 1) \ |
- V(ShiftRightLogical, Operator::kNoProperties, 2, 1) \ |
- V(Add, Operator::kNoProperties, 2, 1) \ |
- V(Subtract, Operator::kNoProperties, 2, 1) \ |
- V(Multiply, Operator::kNoProperties, 2, 1) \ |
- V(Divide, Operator::kNoProperties, 2, 1) \ |
- V(Modulus, Operator::kNoProperties, 2, 1) \ |
V(UnaryNot, Operator::kPure, 1, 1) \ |
V(ToBoolean, Operator::kPure, 1, 1) \ |
V(ToNumber, Operator::kNoProperties, 1, 1) \ |
@@ -247,6 +232,24 @@ const StoreNamedParameters& StoreNamedParametersOf(const Operator* op) { |
V(CreateScriptContext, Operator::kNoProperties, 2, 1) |
+#define CACHED_OP_LIST_WITH_LANGUAGE_MODE(V) \ |
+ V(LessThan, Operator::kNoProperties, 2, 1) \ |
+ V(GreaterThan, Operator::kNoProperties, 2, 1) \ |
+ V(LessThanOrEqual, Operator::kNoProperties, 2, 1) \ |
+ V(GreaterThanOrEqual, Operator::kNoProperties, 2, 1) \ |
+ V(BitwiseOr, Operator::kNoProperties, 2, 1) \ |
+ V(BitwiseXor, Operator::kNoProperties, 2, 1) \ |
+ V(BitwiseAnd, Operator::kNoProperties, 2, 1) \ |
+ V(ShiftLeft, Operator::kNoProperties, 2, 1) \ |
+ V(ShiftRight, Operator::kNoProperties, 2, 1) \ |
+ V(ShiftRightLogical, Operator::kNoProperties, 2, 1) \ |
+ V(Add, Operator::kNoProperties, 2, 1) \ |
+ V(Subtract, Operator::kNoProperties, 2, 1) \ |
+ V(Multiply, Operator::kNoProperties, 2, 1) \ |
+ V(Divide, Operator::kNoProperties, 2, 1) \ |
+ V(Modulus, Operator::kNoProperties, 2, 1) |
+ |
+ |
struct JSOperatorGlobalCache final { |
#define CACHED(Name, properties, value_input_count, value_output_count) \ |
struct Name##Operator final : public Operator { \ |
@@ -261,6 +264,24 @@ struct JSOperatorGlobalCache final { |
CACHED_OP_LIST(CACHED) |
#undef CACHED |
+ |
+#define CACHED_WITH_STRONG(Name, properties, value_input_count, \ |
+ value_output_count) \ |
+ template <LanguageMode kLanguageMode> \ |
+ struct Name##Operator final : public Operator1<LanguageMode> { \ |
+ Name##Operator() \ |
+ : Operator1<LanguageMode>(IrOpcode::kJS##Name, properties, "JS" #Name, \ |
+ value_input_count, Operator::ZeroIfPure(properties), \ |
+ Operator::ZeroIfEliminatable(properties), \ |
+ value_output_count, Operator::ZeroIfPure(properties), \ |
+ Operator::ZeroIfNoThrow(properties), kLanguageMode) {} \ |
+ }; \ |
+ Name##Operator<SLOPPY> k##Name##SloppyOperator; \ |
+ Name##Operator<STRONG> k##Name##StrongOperator; |
+ CACHED_OP_LIST_WITH_LANGUAGE_MODE(CACHED_WITH_STRONG) |
+#undef CACHED_WITH_STRONG |
+ |
+ |
template <LanguageMode kLanguageMode> |
struct StorePropertyOperator final : public Operator1<LanguageMode> { |
StorePropertyOperator() |
@@ -289,6 +310,21 @@ CACHED_OP_LIST(CACHED) |
#undef CACHED |
+#define CACHED_WITH_STRONG(Name, properties, value_input_count, \ |
+ value_output_count) \ |
+ const Operator* JSOperatorBuilder::Name(LanguageMode language_mode) { \ |
+ if (is_strong(language_mode)) { \ |
+ return &cache_.k##Name##StrongOperator; \ |
+ } else { \ |
+ return &cache_.k##Name##SloppyOperator; \ |
+ } \ |
+ UNREACHABLE(); \ |
+ return nullptr; \ |
+ } |
+CACHED_OP_LIST_WITH_LANGUAGE_MODE(CACHED_WITH_STRONG) |
+#undef CACHED_WITH_STRONG |
+ |
+ |
const Operator* JSOperatorBuilder::CallFunction(size_t arity, |
CallFunctionFlags flags) { |
CallFunctionParameters parameters(arity, flags); |