Index: src/compiler/simplified-operator.cc |
diff --git a/src/compiler/simplified-operator.cc b/src/compiler/simplified-operator.cc |
index 9377398c56622b63f8429ca313815d0f0fdb736c..d82133b484f15144f0d6f92ce4711ac45006878b 100644 |
--- a/src/compiler/simplified-operator.cc |
+++ b/src/compiler/simplified-operator.cc |
@@ -177,6 +177,12 @@ Type* TypeOf(const Operator* op) { |
return OpParameter<Type*>(op); |
} |
+BinaryOperationHints::Hint BinaryOperationHintOf(const Operator* op) { |
+ DCHECK(op->opcode() == IrOpcode::kSpeculativeNumberAdd || |
+ op->opcode() == IrOpcode::kSpeculativeNumberSubtract); |
+ return OpParameter<BinaryOperationHints::Hint>(op); |
+} |
+ |
#define PURE_OP_LIST(V) \ |
V(BooleanNot, Operator::kNoProperties, 1) \ |
V(BooleanToNumber, Operator::kNoProperties, 1) \ |
@@ -227,6 +233,12 @@ Type* TypeOf(const Operator* op) { |
V(StringLessThan, Operator::kNoProperties, 2) \ |
V(StringLessThanOrEqual, Operator::kNoProperties, 2) |
+#define CHECKED_OP_LIST(V) \ |
+ V(CheckedUint32ToInt32) \ |
+ V(CheckedFloat64ToInt32) \ |
+ V(CheckedTaggedToInt32) \ |
+ V(CheckedTaggedToFloat64) |
+ |
struct SimplifiedOperatorGlobalCache final { |
#define PURE(Name, properties, input_count) \ |
struct Name##Operator final : public Operator { \ |
@@ -238,6 +250,16 @@ struct SimplifiedOperatorGlobalCache final { |
PURE_OP_LIST(PURE) |
#undef PURE |
+#define CHECKED(Name) \ |
+ struct Name##Operator final : public Operator { \ |
+ Name##Operator() \ |
+ : Operator(IrOpcode::k##Name, Operator::kNoThrow, #Name, 1, 1, 1, 1, \ |
+ 1, 1) {} \ |
+ }; \ |
+ Name##Operator k##Name; |
+ CHECKED_OP_LIST(CHECKED) |
+#undef CHECKED |
+ |
template <PretenureFlag kPretenure> |
struct AllocateOperator final : public Operator1<PretenureFlag> { |
AllocateOperator() |
@@ -276,12 +298,15 @@ static base::LazyInstance<SimplifiedOperatorGlobalCache>::type kCache = |
SimplifiedOperatorBuilder::SimplifiedOperatorBuilder(Zone* zone) |
: cache_(kCache.Get()), zone_(zone) {} |
- |
#define GET_FROM_CACHE(Name, properties, input_count) \ |
const Operator* SimplifiedOperatorBuilder::Name() { return &cache_.k##Name; } |
PURE_OP_LIST(GET_FROM_CACHE) |
#undef GET_FROM_CACHE |
+#define GET_FROM_CACHE(Name) \ |
+ const Operator* SimplifiedOperatorBuilder::Name() { return &cache_.k##Name; } |
+CHECKED_OP_LIST(GET_FROM_CACHE) |
+#undef GET_FROM_CACHE |
const Operator* SimplifiedOperatorBuilder::ReferenceEqual(Type* type) { |
return new (zone()) Operator(IrOpcode::kReferenceEqual, |
@@ -343,6 +368,19 @@ const Operator* SimplifiedOperatorBuilder::StoreBuffer(BufferAccess access) { |
return nullptr; |
} |
+const Operator* SimplifiedOperatorBuilder::SpeculativeNumberAdd( |
+ BinaryOperationHints::Hint hint) { |
+ return new (zone()) Operator1<BinaryOperationHints::Hint>( |
+ IrOpcode::kSpeculativeNumberAdd, Operator::kNoThrow, |
+ "SpeculativeNumberAdd", 2, 1, 1, 1, 1, 1, hint); |
+} |
+ |
+const Operator* SimplifiedOperatorBuilder::SpeculativeNumberSubtract( |
+ BinaryOperationHints::Hint hint) { |
+ return new (zone()) Operator1<BinaryOperationHints::Hint>( |
+ IrOpcode::kSpeculativeNumberSubtract, Operator::kNoThrow, |
+ "SpeculativeNumberSubtract", 2, 1, 1, 1, 1, 1, hint); |
+} |
#define ACCESS_OP_LIST(V) \ |
V(LoadField, FieldAccess, Operator::kNoWrite, 1, 1, 1) \ |