summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/simplified-operator.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/simplified-operator.cc')
-rw-r--r--deps/v8/src/compiler/simplified-operator.cc588
1 files changed, 384 insertions, 204 deletions
diff --git a/deps/v8/src/compiler/simplified-operator.cc b/deps/v8/src/compiler/simplified-operator.cc
index 42dacef032..996f47bcb2 100644
--- a/deps/v8/src/compiler/simplified-operator.cc
+++ b/deps/v8/src/compiler/simplified-operator.cc
@@ -153,6 +153,43 @@ std::ostream& operator<<(std::ostream& os, ObjectAccess const& access) {
return os;
}
+#if V8_ENABLE_WEBASSEMBLY
+
+V8_EXPORT_PRIVATE bool operator==(WasmFieldInfo const& lhs,
+ WasmFieldInfo const& rhs) {
+ return lhs.field_index == rhs.field_index && lhs.type == rhs.type &&
+ lhs.is_signed == rhs.is_signed && lhs.null_check == rhs.null_check;
+}
+
+size_t hash_value(WasmFieldInfo const& info) {
+ return base::hash_combine(info.field_index, info.type, info.is_signed,
+ info.null_check);
+}
+
+V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
+ WasmFieldInfo const& info) {
+ return os << info.field_index << ", "
+ << (info.is_signed ? "signed" : "unsigned") << ", "
+ << (info.null_check == kWithNullCheck ? "null check"
+ : "no null check");
+}
+
+V8_EXPORT_PRIVATE bool operator==(WasmElementInfo const& lhs,
+ WasmElementInfo const& rhs) {
+ return lhs.type == rhs.type && lhs.is_signed == rhs.is_signed;
+}
+
+size_t hash_value(WasmElementInfo const& info) {
+ return base::hash_combine(info.type, info.is_signed);
+}
+
+V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
+ WasmElementInfo const& info) {
+ return os << (info.is_signed ? "signed" : "unsigned");
+}
+
+#endif
+
const FieldAccess& FieldAccessOf(const Operator* op) {
DCHECK_NOT_NULL(op);
DCHECK(op->opcode() == IrOpcode::kLoadField ||
@@ -548,7 +585,15 @@ BigIntOperationHint BigIntOperationHintOf(const Operator* op) {
op->opcode() == IrOpcode::kSpeculativeBigIntSubtract ||
op->opcode() == IrOpcode::kSpeculativeBigIntMultiply ||
op->opcode() == IrOpcode::kSpeculativeBigIntDivide ||
- op->opcode() == IrOpcode::kSpeculativeBigIntModulus);
+ op->opcode() == IrOpcode::kSpeculativeBigIntModulus ||
+ op->opcode() == IrOpcode::kSpeculativeBigIntBitwiseAnd ||
+ op->opcode() == IrOpcode::kSpeculativeBigIntBitwiseOr ||
+ op->opcode() == IrOpcode::kSpeculativeBigIntBitwiseXor ||
+ op->opcode() == IrOpcode::kSpeculativeBigIntShiftLeft ||
+ op->opcode() == IrOpcode::kSpeculativeBigIntShiftRight ||
+ op->opcode() == IrOpcode::kSpeculativeBigIntEqual ||
+ op->opcode() == IrOpcode::kSpeculativeBigIntLessThan ||
+ op->opcode() == IrOpcode::kSpeculativeBigIntLessThanOrEqual);
return OpParameter<BigIntOperationHint>(op);
}
@@ -572,6 +617,26 @@ NumberOperationParameters const& NumberOperationParametersOf(
return OpParameter<NumberOperationParameters>(op);
}
+bool operator==(BigIntOperationParameters const& lhs,
+ BigIntOperationParameters const& rhs) {
+ return lhs.hint() == rhs.hint() && lhs.feedback() == rhs.feedback();
+}
+
+size_t hash_value(BigIntOperationParameters const& p) {
+ FeedbackSource::Hash feedback_hash;
+ return base::hash_combine(p.hint(), feedback_hash(p.feedback()));
+}
+
+std::ostream& operator<<(std::ostream& os, BigIntOperationParameters const& p) {
+ return os << p.hint() << ", " << p.feedback();
+}
+
+BigIntOperationParameters const& BigIntOperationParametersOf(
+ Operator const* op) {
+ DCHECK_EQ(IrOpcode::kSpeculativeToBigInt, op->opcode());
+ return OpParameter<BigIntOperationParameters>(op);
+}
+
bool operator==(SpeculativeBigIntAsNParameters const& lhs,
SpeculativeBigIntAsNParameters const& rhs) {
return lhs.bits() == rhs.bits() && lhs.feedback() == rhs.feedback();
@@ -678,129 +743,149 @@ bool operator==(CheckMinusZeroParameters const& lhs,
return lhs.mode() == rhs.mode() && lhs.feedback() == rhs.feedback();
}
-#define PURE_OP_LIST(V) \
- V(BooleanNot, Operator::kNoProperties, 1, 0) \
- V(NumberEqual, Operator::kCommutative, 2, 0) \
- V(NumberLessThan, Operator::kNoProperties, 2, 0) \
- V(NumberLessThanOrEqual, Operator::kNoProperties, 2, 0) \
- V(NumberAdd, Operator::kCommutative, 2, 0) \
- V(NumberSubtract, Operator::kNoProperties, 2, 0) \
- V(NumberMultiply, Operator::kCommutative, 2, 0) \
- V(NumberDivide, Operator::kNoProperties, 2, 0) \
- V(NumberModulus, Operator::kNoProperties, 2, 0) \
- V(NumberBitwiseOr, Operator::kCommutative, 2, 0) \
- V(NumberBitwiseXor, Operator::kCommutative, 2, 0) \
- V(NumberBitwiseAnd, Operator::kCommutative, 2, 0) \
- V(NumberShiftLeft, Operator::kNoProperties, 2, 0) \
- V(NumberShiftRight, Operator::kNoProperties, 2, 0) \
- V(NumberShiftRightLogical, Operator::kNoProperties, 2, 0) \
- V(NumberImul, Operator::kCommutative, 2, 0) \
- V(NumberAbs, Operator::kNoProperties, 1, 0) \
- V(NumberClz32, Operator::kNoProperties, 1, 0) \
- V(NumberCeil, Operator::kNoProperties, 1, 0) \
- V(NumberFloor, Operator::kNoProperties, 1, 0) \
- V(NumberFround, Operator::kNoProperties, 1, 0) \
- V(NumberAcos, Operator::kNoProperties, 1, 0) \
- V(NumberAcosh, Operator::kNoProperties, 1, 0) \
- V(NumberAsin, Operator::kNoProperties, 1, 0) \
- V(NumberAsinh, Operator::kNoProperties, 1, 0) \
- V(NumberAtan, Operator::kNoProperties, 1, 0) \
- V(NumberAtan2, Operator::kNoProperties, 2, 0) \
- V(NumberAtanh, Operator::kNoProperties, 1, 0) \
- V(NumberCbrt, Operator::kNoProperties, 1, 0) \
- V(NumberCos, Operator::kNoProperties, 1, 0) \
- V(NumberCosh, Operator::kNoProperties, 1, 0) \
- V(NumberExp, Operator::kNoProperties, 1, 0) \
- V(NumberExpm1, Operator::kNoProperties, 1, 0) \
- V(NumberLog, Operator::kNoProperties, 1, 0) \
- V(NumberLog1p, Operator::kNoProperties, 1, 0) \
- V(NumberLog10, Operator::kNoProperties, 1, 0) \
- V(NumberLog2, Operator::kNoProperties, 1, 0) \
- V(NumberMax, Operator::kNoProperties, 2, 0) \
- V(NumberMin, Operator::kNoProperties, 2, 0) \
- V(NumberPow, Operator::kNoProperties, 2, 0) \
- V(NumberRound, Operator::kNoProperties, 1, 0) \
- V(NumberSign, Operator::kNoProperties, 1, 0) \
- V(NumberSin, Operator::kNoProperties, 1, 0) \
- V(NumberSinh, Operator::kNoProperties, 1, 0) \
- V(NumberSqrt, Operator::kNoProperties, 1, 0) \
- V(NumberTan, Operator::kNoProperties, 1, 0) \
- V(NumberTanh, Operator::kNoProperties, 1, 0) \
- V(NumberTrunc, Operator::kNoProperties, 1, 0) \
- V(NumberToBoolean, Operator::kNoProperties, 1, 0) \
- V(NumberToInt32, Operator::kNoProperties, 1, 0) \
- V(NumberToString, Operator::kNoProperties, 1, 0) \
- V(NumberToUint32, Operator::kNoProperties, 1, 0) \
- V(NumberToUint8Clamped, Operator::kNoProperties, 1, 0) \
- V(NumberSilenceNaN, Operator::kNoProperties, 1, 0) \
- V(BigIntNegate, Operator::kNoProperties, 1, 0) \
- V(StringConcat, Operator::kNoProperties, 3, 0) \
- V(StringToNumber, Operator::kNoProperties, 1, 0) \
- V(StringFromSingleCharCode, Operator::kNoProperties, 1, 0) \
- V(StringFromSingleCodePoint, Operator::kNoProperties, 1, 0) \
- V(StringIndexOf, Operator::kNoProperties, 3, 0) \
- V(StringLength, Operator::kNoProperties, 1, 0) \
- V(StringToLowerCaseIntl, Operator::kNoProperties, 1, 0) \
- V(StringToUpperCaseIntl, Operator::kNoProperties, 1, 0) \
- V(TypeOf, Operator::kNoProperties, 1, 1) \
- V(PlainPrimitiveToNumber, Operator::kNoProperties, 1, 0) \
- V(PlainPrimitiveToWord32, Operator::kNoProperties, 1, 0) \
- V(PlainPrimitiveToFloat64, Operator::kNoProperties, 1, 0) \
- V(ChangeTaggedSignedToInt32, Operator::kNoProperties, 1, 0) \
- V(ChangeTaggedSignedToInt64, Operator::kNoProperties, 1, 0) \
- V(ChangeTaggedToInt32, Operator::kNoProperties, 1, 0) \
- V(ChangeTaggedToInt64, Operator::kNoProperties, 1, 0) \
- V(ChangeTaggedToUint32, Operator::kNoProperties, 1, 0) \
- V(ChangeTaggedToFloat64, Operator::kNoProperties, 1, 0) \
- V(ChangeTaggedToTaggedSigned, Operator::kNoProperties, 1, 0) \
- V(ChangeFloat64ToTaggedPointer, Operator::kNoProperties, 1, 0) \
- V(ChangeInt31ToTaggedSigned, Operator::kNoProperties, 1, 0) \
- V(ChangeInt32ToTagged, Operator::kNoProperties, 1, 0) \
- V(ChangeInt64ToTagged, Operator::kNoProperties, 1, 0) \
- V(ChangeUint32ToTagged, Operator::kNoProperties, 1, 0) \
- V(ChangeUint64ToTagged, Operator::kNoProperties, 1, 0) \
- V(ChangeTaggedToBit, Operator::kNoProperties, 1, 0) \
- V(ChangeBitToTagged, Operator::kNoProperties, 1, 0) \
- V(TruncateBigIntToWord64, Operator::kNoProperties, 1, 0) \
- V(ChangeInt64ToBigInt, Operator::kNoProperties, 1, 0) \
- V(ChangeUint64ToBigInt, Operator::kNoProperties, 1, 0) \
- V(TruncateTaggedToBit, Operator::kNoProperties, 1, 0) \
- V(TruncateTaggedPointerToBit, Operator::kNoProperties, 1, 0) \
- V(TruncateTaggedToWord32, Operator::kNoProperties, 1, 0) \
- V(TruncateTaggedToFloat64, Operator::kNoProperties, 1, 0) \
- V(ObjectIsArrayBufferView, Operator::kNoProperties, 1, 0) \
- V(ObjectIsBigInt, Operator::kNoProperties, 1, 0) \
- V(ObjectIsCallable, Operator::kNoProperties, 1, 0) \
- V(ObjectIsConstructor, Operator::kNoProperties, 1, 0) \
- V(ObjectIsDetectableCallable, Operator::kNoProperties, 1, 0) \
- V(ObjectIsMinusZero, Operator::kNoProperties, 1, 0) \
- V(NumberIsMinusZero, Operator::kNoProperties, 1, 0) \
- V(ObjectIsNaN, Operator::kNoProperties, 1, 0) \
- V(NumberIsNaN, Operator::kNoProperties, 1, 0) \
- V(ObjectIsNonCallable, Operator::kNoProperties, 1, 0) \
- V(ObjectIsNumber, Operator::kNoProperties, 1, 0) \
- V(ObjectIsReceiver, Operator::kNoProperties, 1, 0) \
- V(ObjectIsSmi, Operator::kNoProperties, 1, 0) \
- V(ObjectIsString, Operator::kNoProperties, 1, 0) \
- V(ObjectIsSymbol, Operator::kNoProperties, 1, 0) \
- V(ObjectIsUndetectable, Operator::kNoProperties, 1, 0) \
- V(NumberIsFloat64Hole, Operator::kNoProperties, 1, 0) \
- V(NumberIsFinite, Operator::kNoProperties, 1, 0) \
- V(ObjectIsFiniteNumber, Operator::kNoProperties, 1, 0) \
- V(NumberIsInteger, Operator::kNoProperties, 1, 0) \
- V(ObjectIsSafeInteger, Operator::kNoProperties, 1, 0) \
- V(NumberIsSafeInteger, Operator::kNoProperties, 1, 0) \
- V(ObjectIsInteger, Operator::kNoProperties, 1, 0) \
- V(ConvertTaggedHoleToUndefined, Operator::kNoProperties, 1, 0) \
- V(SameValue, Operator::kCommutative, 2, 0) \
- V(SameValueNumbersOnly, Operator::kCommutative, 2, 0) \
- V(NumberSameValue, Operator::kCommutative, 2, 0) \
- V(ReferenceEqual, Operator::kCommutative, 2, 0) \
- V(StringEqual, Operator::kCommutative, 2, 0) \
- V(StringLessThan, Operator::kNoProperties, 2, 0) \
- V(StringLessThanOrEqual, Operator::kNoProperties, 2, 0) \
- V(ToBoolean, Operator::kNoProperties, 1, 0) \
- V(NewConsString, Operator::kNoProperties, 3, 0) \
+#if V8_ENABLE_WEBASSEMBLY
+V8_EXPORT_PRIVATE std::ostream& operator<<(
+ std::ostream& os, AssertNotNullParameters const& params) {
+ return os << params.type << ", " << params.trap_id;
+}
+
+size_t hash_value(AssertNotNullParameters const& params) {
+ return base::hash_combine(params.type, params.trap_id);
+}
+
+bool operator==(AssertNotNullParameters const& lhs,
+ AssertNotNullParameters const& rhs) {
+ return lhs.type == rhs.type && lhs.trap_id == rhs.trap_id;
+}
+#endif
+
+#define PURE_OP_LIST(V) \
+ V(BooleanNot, Operator::kNoProperties, 1, 0) \
+ V(NumberEqual, Operator::kCommutative, 2, 0) \
+ V(NumberLessThan, Operator::kNoProperties, 2, 0) \
+ V(NumberLessThanOrEqual, Operator::kNoProperties, 2, 0) \
+ V(NumberAdd, Operator::kCommutative, 2, 0) \
+ V(NumberSubtract, Operator::kNoProperties, 2, 0) \
+ V(NumberMultiply, Operator::kCommutative, 2, 0) \
+ V(NumberDivide, Operator::kNoProperties, 2, 0) \
+ V(NumberModulus, Operator::kNoProperties, 2, 0) \
+ V(NumberBitwiseOr, Operator::kCommutative, 2, 0) \
+ V(NumberBitwiseXor, Operator::kCommutative, 2, 0) \
+ V(NumberBitwiseAnd, Operator::kCommutative, 2, 0) \
+ V(NumberShiftLeft, Operator::kNoProperties, 2, 0) \
+ V(NumberShiftRight, Operator::kNoProperties, 2, 0) \
+ V(NumberShiftRightLogical, Operator::kNoProperties, 2, 0) \
+ V(NumberImul, Operator::kCommutative, 2, 0) \
+ V(NumberAbs, Operator::kNoProperties, 1, 0) \
+ V(NumberClz32, Operator::kNoProperties, 1, 0) \
+ V(NumberCeil, Operator::kNoProperties, 1, 0) \
+ V(NumberFloor, Operator::kNoProperties, 1, 0) \
+ V(NumberFround, Operator::kNoProperties, 1, 0) \
+ V(NumberAcos, Operator::kNoProperties, 1, 0) \
+ V(NumberAcosh, Operator::kNoProperties, 1, 0) \
+ V(NumberAsin, Operator::kNoProperties, 1, 0) \
+ V(NumberAsinh, Operator::kNoProperties, 1, 0) \
+ V(NumberAtan, Operator::kNoProperties, 1, 0) \
+ V(NumberAtan2, Operator::kNoProperties, 2, 0) \
+ V(NumberAtanh, Operator::kNoProperties, 1, 0) \
+ V(NumberCbrt, Operator::kNoProperties, 1, 0) \
+ V(NumberCos, Operator::kNoProperties, 1, 0) \
+ V(NumberCosh, Operator::kNoProperties, 1, 0) \
+ V(NumberExp, Operator::kNoProperties, 1, 0) \
+ V(NumberExpm1, Operator::kNoProperties, 1, 0) \
+ V(NumberLog, Operator::kNoProperties, 1, 0) \
+ V(NumberLog1p, Operator::kNoProperties, 1, 0) \
+ V(NumberLog10, Operator::kNoProperties, 1, 0) \
+ V(NumberLog2, Operator::kNoProperties, 1, 0) \
+ V(NumberMax, Operator::kNoProperties, 2, 0) \
+ V(NumberMin, Operator::kNoProperties, 2, 0) \
+ V(NumberPow, Operator::kNoProperties, 2, 0) \
+ V(NumberRound, Operator::kNoProperties, 1, 0) \
+ V(NumberSign, Operator::kNoProperties, 1, 0) \
+ V(NumberSin, Operator::kNoProperties, 1, 0) \
+ V(NumberSinh, Operator::kNoProperties, 1, 0) \
+ V(NumberSqrt, Operator::kNoProperties, 1, 0) \
+ V(NumberTan, Operator::kNoProperties, 1, 0) \
+ V(NumberTanh, Operator::kNoProperties, 1, 0) \
+ V(NumberTrunc, Operator::kNoProperties, 1, 0) \
+ V(NumberToBoolean, Operator::kNoProperties, 1, 0) \
+ V(NumberToInt32, Operator::kNoProperties, 1, 0) \
+ V(NumberToString, Operator::kNoProperties, 1, 0) \
+ V(NumberToUint32, Operator::kNoProperties, 1, 0) \
+ V(NumberToUint8Clamped, Operator::kNoProperties, 1, 0) \
+ V(Integral32OrMinusZeroToBigInt, Operator::kNoProperties, 1, 0) \
+ V(NumberSilenceNaN, Operator::kNoProperties, 1, 0) \
+ V(BigIntEqual, Operator::kNoProperties, 2, 0) \
+ V(BigIntLessThan, Operator::kNoProperties, 2, 0) \
+ V(BigIntLessThanOrEqual, Operator::kNoProperties, 2, 0) \
+ V(BigIntNegate, Operator::kNoProperties, 1, 0) \
+ V(StringConcat, Operator::kNoProperties, 3, 0) \
+ V(StringToNumber, Operator::kNoProperties, 1, 0) \
+ V(StringFromSingleCharCode, Operator::kNoProperties, 1, 0) \
+ V(StringFromSingleCodePoint, Operator::kNoProperties, 1, 0) \
+ V(StringIndexOf, Operator::kNoProperties, 3, 0) \
+ V(StringLength, Operator::kNoProperties, 1, 0) \
+ V(StringToLowerCaseIntl, Operator::kNoProperties, 1, 0) \
+ V(StringToUpperCaseIntl, Operator::kNoProperties, 1, 0) \
+ V(TypeOf, Operator::kNoProperties, 1, 1) \
+ V(PlainPrimitiveToNumber, Operator::kNoProperties, 1, 0) \
+ V(PlainPrimitiveToWord32, Operator::kNoProperties, 1, 0) \
+ V(PlainPrimitiveToFloat64, Operator::kNoProperties, 1, 0) \
+ V(ChangeTaggedSignedToInt32, Operator::kNoProperties, 1, 0) \
+ V(ChangeTaggedSignedToInt64, Operator::kNoProperties, 1, 0) \
+ V(ChangeTaggedToInt32, Operator::kNoProperties, 1, 0) \
+ V(ChangeTaggedToInt64, Operator::kNoProperties, 1, 0) \
+ V(ChangeTaggedToUint32, Operator::kNoProperties, 1, 0) \
+ V(ChangeTaggedToFloat64, Operator::kNoProperties, 1, 0) \
+ V(ChangeTaggedToTaggedSigned, Operator::kNoProperties, 1, 0) \
+ V(ChangeFloat64ToTaggedPointer, Operator::kNoProperties, 1, 0) \
+ V(ChangeInt31ToTaggedSigned, Operator::kNoProperties, 1, 0) \
+ V(ChangeInt32ToTagged, Operator::kNoProperties, 1, 0) \
+ V(ChangeInt64ToTagged, Operator::kNoProperties, 1, 0) \
+ V(ChangeUint32ToTagged, Operator::kNoProperties, 1, 0) \
+ V(ChangeUint64ToTagged, Operator::kNoProperties, 1, 0) \
+ V(ChangeTaggedToBit, Operator::kNoProperties, 1, 0) \
+ V(ChangeBitToTagged, Operator::kNoProperties, 1, 0) \
+ V(TruncateBigIntToWord64, Operator::kNoProperties, 1, 0) \
+ V(ChangeInt64ToBigInt, Operator::kNoProperties, 1, 0) \
+ V(ChangeUint64ToBigInt, Operator::kNoProperties, 1, 0) \
+ V(TruncateTaggedToBit, Operator::kNoProperties, 1, 0) \
+ V(TruncateTaggedPointerToBit, Operator::kNoProperties, 1, 0) \
+ V(TruncateTaggedToWord32, Operator::kNoProperties, 1, 0) \
+ V(TruncateTaggedToFloat64, Operator::kNoProperties, 1, 0) \
+ V(ObjectIsArrayBufferView, Operator::kNoProperties, 1, 0) \
+ V(ObjectIsBigInt, Operator::kNoProperties, 1, 0) \
+ V(ObjectIsCallable, Operator::kNoProperties, 1, 0) \
+ V(ObjectIsConstructor, Operator::kNoProperties, 1, 0) \
+ V(ObjectIsDetectableCallable, Operator::kNoProperties, 1, 0) \
+ V(ObjectIsMinusZero, Operator::kNoProperties, 1, 0) \
+ V(NumberIsMinusZero, Operator::kNoProperties, 1, 0) \
+ V(ObjectIsNaN, Operator::kNoProperties, 1, 0) \
+ V(NumberIsNaN, Operator::kNoProperties, 1, 0) \
+ V(ObjectIsNonCallable, Operator::kNoProperties, 1, 0) \
+ V(ObjectIsNumber, Operator::kNoProperties, 1, 0) \
+ V(ObjectIsReceiver, Operator::kNoProperties, 1, 0) \
+ V(ObjectIsSmi, Operator::kNoProperties, 1, 0) \
+ V(ObjectIsString, Operator::kNoProperties, 1, 0) \
+ V(ObjectIsSymbol, Operator::kNoProperties, 1, 0) \
+ V(ObjectIsUndetectable, Operator::kNoProperties, 1, 0) \
+ V(NumberIsFloat64Hole, Operator::kNoProperties, 1, 0) \
+ V(NumberIsFinite, Operator::kNoProperties, 1, 0) \
+ V(ObjectIsFiniteNumber, Operator::kNoProperties, 1, 0) \
+ V(NumberIsInteger, Operator::kNoProperties, 1, 0) \
+ V(ObjectIsSafeInteger, Operator::kNoProperties, 1, 0) \
+ V(NumberIsSafeInteger, Operator::kNoProperties, 1, 0) \
+ V(ObjectIsInteger, Operator::kNoProperties, 1, 0) \
+ V(ConvertTaggedHoleToUndefined, Operator::kNoProperties, 1, 0) \
+ V(SameValue, Operator::kCommutative, 2, 0) \
+ V(SameValueNumbersOnly, Operator::kCommutative, 2, 0) \
+ V(NumberSameValue, Operator::kCommutative, 2, 0) \
+ V(ReferenceEqual, Operator::kCommutative, 2, 0) \
+ V(StringEqual, Operator::kCommutative, 2, 0) \
+ V(StringLessThan, Operator::kNoProperties, 2, 0) \
+ V(StringLessThanOrEqual, Operator::kNoProperties, 2, 0) \
+ V(ToBoolean, Operator::kNoProperties, 1, 0) \
+ V(NewConsString, Operator::kNoProperties, 3, 0) \
V(Unsigned32Divide, Operator::kNoProperties, 2, 0)
#define EFFECT_DEPENDENT_OP_LIST(V) \
@@ -810,6 +895,10 @@ bool operator==(CheckMinusZeroParameters const& lhs,
V(BigIntDivide, Operator::kNoProperties, 2, 1) \
V(BigIntModulus, Operator::kNoProperties, 2, 1) \
V(BigIntBitwiseAnd, Operator::kNoProperties, 2, 1) \
+ V(BigIntBitwiseOr, Operator::kNoProperties, 2, 1) \
+ V(BigIntBitwiseXor, Operator::kNoProperties, 2, 1) \
+ V(BigIntShiftLeft, Operator::kNoProperties, 2, 1) \
+ V(BigIntShiftRight, Operator::kNoProperties, 2, 1) \
V(StringCharCodeAt, Operator::kNoProperties, 2, 1) \
V(StringCodePointAt, Operator::kNoProperties, 2, 1) \
V(StringFromCodePointAt, Operator::kNoProperties, 2, 1) \
@@ -1168,37 +1257,37 @@ struct SimplifiedOperatorGlobalCache final {
LoadStackArgumentOperator kLoadStackArgument;
#if V8_ENABLE_WEBASSEMBLY
- // Note: The following two operators have a control input solely to find the
- // typing context from the control path in wasm-gc-operator-reducer.
- struct IsNullOperator final : public Operator {
- IsNullOperator()
- : Operator(IrOpcode::kIsNull, Operator::kPure, "IsNull", 1, 0, 1, 1, 0,
- 0) {}
+ struct WasmArrayLengthOperator final : public Operator1<bool> {
+ explicit WasmArrayLengthOperator(bool null_check)
+ : Operator1<bool>(IrOpcode::kWasmArrayLength, Operator::kEliminatable,
+ "WasmArrayLength", 1, 1, 1, 1, 1, 1, null_check) {}
};
- IsNullOperator kIsNull;
-
- struct IsNotNullOperator final : public Operator {
- IsNotNullOperator()
- : Operator(IrOpcode::kIsNotNull, Operator::kPure, "IsNotNull", 1, 0, 1,
- 1, 0, 0) {}
+ WasmArrayLengthOperator kWasmArrayLengthNullCheck{true};
+ WasmArrayLengthOperator kWasmArrayLengthNoNullCheck{false};
+
+ struct WasmArrayInitializeLengthOperator final : public Operator {
+ WasmArrayInitializeLengthOperator()
+ : Operator(IrOpcode::kWasmArrayInitializeLength,
+ Operator::kNoThrow | Operator::kNoRead | Operator::kNoDeopt,
+ "WasmArrayInitializeLength", 2, 1, 1, 0, 1, 0) {}
};
- IsNotNullOperator kIsNotNull;
+ WasmArrayInitializeLengthOperator kWasmArrayInitializeLength;
- struct NullOperator final : public Operator {
- NullOperator()
- : Operator(IrOpcode::kNull, Operator::kPure, "Null", 0, 0, 0, 1, 0, 0) {
- }
+ struct StringAsWtf16Operator final : public Operator {
+ StringAsWtf16Operator()
+ : Operator(IrOpcode::kStringAsWtf16, Operator::kEliminatable,
+ "StringAsWtf16", 1, 1, 1, 1, 1, 1) {}
};
- NullOperator kNull;
-
- struct AssertNotNullOperator final : public Operator {
- AssertNotNullOperator()
- : Operator(
- IrOpcode::kAssertNotNull,
- Operator::kNoWrite | Operator::kNoThrow | Operator::kIdempotent,
- "AssertNotNull", 1, 1, 1, 1, 1, 1) {}
+ StringAsWtf16Operator kStringAsWtf16;
+
+ struct StringPrepareForGetCodeunitOperator final : public Operator {
+ StringPrepareForGetCodeunitOperator()
+ : Operator(IrOpcode::kStringPrepareForGetCodeunit,
+ Operator::kEliminatable, "StringPrepareForGetCodeunit", 1, 1,
+ 1, 3, 1, 1) {}
};
- AssertNotNullOperator kAssertNotNull;
+ StringPrepareForGetCodeunitOperator kStringPrepareForGetCodeunit;
+
#endif
#define SPECULATIVE_NUMBER_BINOP(Name) \
@@ -1237,6 +1326,21 @@ struct SimplifiedOperatorGlobalCache final {
kSpeculativeToNumberNumberOperator;
SpeculativeToNumberOperator<NumberOperationHint::kNumberOrOddball>
kSpeculativeToNumberNumberOrOddballOperator;
+
+ template <BigIntOperationHint kHint>
+ struct SpeculativeToBigIntOperator final
+ : public Operator1<BigIntOperationParameters> {
+ SpeculativeToBigIntOperator()
+ : Operator1<BigIntOperationParameters>(
+ IrOpcode::kSpeculativeToBigInt,
+ Operator::kFoldable | Operator::kNoThrow, "SpeculativeToBigInt",
+ 1, 1, 1, 1, 1, 0,
+ BigIntOperationParameters(kHint, FeedbackSource())) {}
+ };
+ SpeculativeToBigIntOperator<BigIntOperationHint::kBigInt64>
+ kSpeculativeToBigIntBigInt64Operator;
+ SpeculativeToBigIntOperator<BigIntOperationHint::kBigInt>
+ kSpeculativeToBigIntBigIntOperator;
};
namespace {
@@ -1372,6 +1476,12 @@ const Operator* SimplifiedOperatorBuilder::VerifyType() {
"VerifyType", 1, 0, 0, 1, 0, 0);
}
+const Operator* SimplifiedOperatorBuilder::CheckTurboshaftTypeOf() {
+ return zone()->New<Operator>(IrOpcode::kCheckTurboshaftTypeOf,
+ Operator::kNoThrow | Operator::kNoDeopt,
+ "CheckTurboshaftTypeOf", 2, 1, 1, 1, 1, 0);
+}
+
#if V8_ENABLE_WEBASSEMBLY
const Operator* SimplifiedOperatorBuilder::WasmTypeCheck(
WasmTypeCheckConfig config) {
@@ -1390,18 +1500,59 @@ const Operator* SimplifiedOperatorBuilder::WasmTypeCast(
const Operator* SimplifiedOperatorBuilder::RttCanon(int index) {
return zone()->New<Operator1<int>>(IrOpcode::kRttCanon, Operator::kPure,
- "RttCanon", 0, 0, 0, 1, 0, 0, index);
+ "RttCanon", 1, 0, 0, 1, 0, 0, index);
+}
+
+// Note: The following two operators have a control input solely to find the
+// typing context from the control path in wasm-gc-operator-reducer.
+struct IsNullOperator final : public Operator1<wasm::ValueType> {
+ explicit IsNullOperator(wasm::ValueType type)
+ : Operator1(IrOpcode::kIsNull, Operator::kPure, "IsNull", 1, 0, 1, 1, 0,
+ 0, type) {}
+};
+
+struct IsNotNullOperator final : public Operator1<wasm::ValueType> {
+ explicit IsNotNullOperator(wasm::ValueType type)
+ : Operator1(IrOpcode::kIsNotNull, Operator::kPure, "IsNotNull", 1, 0, 1,
+ 1, 0, 0, type) {}
+};
+
+struct NullOperator final : public Operator1<wasm::ValueType> {
+ explicit NullOperator(wasm::ValueType type)
+ : Operator1(IrOpcode::kNull, Operator::kPure, "Null", 0, 0, 0, 1, 0, 0,
+ type) {}
+};
+
+struct AssertNotNullOperator final : public Operator1<AssertNotNullParameters> {
+ explicit AssertNotNullOperator(wasm::ValueType type, TrapId trap_id)
+ : Operator1(
+ IrOpcode::kAssertNotNull,
+ Operator::kNoWrite | Operator::kNoThrow | Operator::kIdempotent,
+ "AssertNotNull", 1, 1, 1, 1, 1, 1, {type, trap_id}) {}
+};
+
+const Operator* SimplifiedOperatorBuilder::Null(wasm::ValueType type) {
+ return zone()->New<NullOperator>(type);
}
-const Operator* SimplifiedOperatorBuilder::Null() { return &cache_.kNull; }
+const Operator* SimplifiedOperatorBuilder::AssertNotNull(wasm::ValueType type,
+ TrapId trap_id) {
+ return zone()->New<AssertNotNullOperator>(type, trap_id);
+}
+
+const Operator* SimplifiedOperatorBuilder::IsNull(wasm::ValueType type) {
+ return zone()->New<IsNullOperator>(type);
+}
+const Operator* SimplifiedOperatorBuilder::IsNotNull(wasm::ValueType type) {
+ return zone()->New<IsNotNullOperator>(type);
+}
-const Operator* SimplifiedOperatorBuilder::AssertNotNull() {
- return &cache_.kAssertNotNull;
+const Operator* SimplifiedOperatorBuilder::StringAsWtf16() {
+ return &cache_.kStringAsWtf16;
}
-const Operator* SimplifiedOperatorBuilder::IsNull() { return &cache_.kIsNull; }
-const Operator* SimplifiedOperatorBuilder::IsNotNull() {
- return &cache_.kIsNotNull;
+const Operator* SimplifiedOperatorBuilder::StringPrepareForGetCodeunit() {
+ return &cache_.kStringPrepareForGetCodeunit;
}
const Operator* SimplifiedOperatorBuilder::WasmExternInternalize() {
@@ -1415,6 +1566,49 @@ const Operator* SimplifiedOperatorBuilder::WasmExternExternalize() {
Operator::kEliminatable, "WasmExternExternalize",
1, 1, 1, 1, 1, 1);
}
+
+const Operator* SimplifiedOperatorBuilder::WasmStructGet(
+ const wasm::StructType* type, int field_index, bool is_signed,
+ CheckForNull null_check) {
+ return zone()->New<Operator1<WasmFieldInfo>>(
+ IrOpcode::kWasmStructGet, Operator::kEliminatable, "WasmStructGet", 1, 1,
+ 1, 1, 1, 1, WasmFieldInfo{type, field_index, is_signed, null_check});
+}
+
+const Operator* SimplifiedOperatorBuilder::WasmStructSet(
+ const wasm::StructType* type, int field_index, CheckForNull null_check) {
+ return zone()->New<Operator1<WasmFieldInfo>>(
+ IrOpcode::kWasmStructSet,
+ Operator::kNoDeopt | Operator::kNoThrow | Operator::kNoRead,
+ "WasmStructSet", 2, 1, 1, 0, 1, 1,
+ WasmFieldInfo{type, field_index, true /* unused */, null_check});
+}
+
+const Operator* SimplifiedOperatorBuilder::WasmArrayGet(
+ const wasm::ArrayType* type, bool is_signed) {
+ return zone()->New<Operator1<WasmElementInfo>>(
+ IrOpcode::kWasmArrayGet, Operator::kEliminatable, "WasmArrayGet", 2, 1, 1,
+ 1, 1, 0, WasmElementInfo{type, is_signed});
+}
+
+const Operator* SimplifiedOperatorBuilder::WasmArraySet(
+ const wasm::ArrayType* type) {
+ return zone()->New<Operator1<const wasm::ArrayType*>>(
+ IrOpcode::kWasmArraySet,
+ Operator::kNoDeopt | Operator::kNoThrow | Operator::kNoRead,
+ "WasmArraySet", 3, 1, 1, 0, 1, 0, type);
+}
+
+const Operator* SimplifiedOperatorBuilder::WasmArrayLength(
+ CheckForNull null_check) {
+ return null_check == kWithNullCheck ? &cache_.kWasmArrayLengthNullCheck
+ : &cache_.kWasmArrayLengthNoNullCheck;
+}
+
+const Operator* SimplifiedOperatorBuilder::WasmArrayInitializeLength() {
+ return &cache_.kWasmArrayInitializeLength;
+}
+
#endif // V8_ENABLE_WEBASSEMBLY
const Operator* SimplifiedOperatorBuilder::CheckIf(
@@ -1560,9 +1754,13 @@ const Operator* SimplifiedOperatorBuilder::CheckMaps(
CheckMapsFlags flags, ZoneHandleSet<Map> maps,
const FeedbackSource& feedback) {
CheckMapsParameters const parameters(flags, maps, feedback);
+ Operator::Properties operator_props = Operator::kNoThrow;
+ if (!(flags & CheckMapsFlag::kTryMigrateInstance)) {
+ operator_props |= Operator::kNoWrite;
+ }
return zone()->New<Operator1<CheckMapsParameters>>( // --
IrOpcode::kCheckMaps, // opcode
- Operator::kNoThrow | Operator::kNoWrite, // flags
+ operator_props, // flags
"CheckMaps", // name
1, 1, 1, 0, 1, 0, // counts
parameters); // parameter
@@ -1618,52 +1816,18 @@ const Operator* SimplifiedOperatorBuilder::CheckFloat64Hole(
CheckFloat64HoleParameters(mode, feedback));
}
-const Operator* SimplifiedOperatorBuilder::SpeculativeBigIntAdd(
- BigIntOperationHint hint) {
- return zone()->New<Operator1<BigIntOperationHint>>(
- IrOpcode::kSpeculativeBigIntAdd, Operator::kFoldable | Operator::kNoThrow,
- "SpeculativeBigIntAdd", 2, 1, 1, 1, 1, 0, hint);
-}
-
-const Operator* SimplifiedOperatorBuilder::SpeculativeBigIntSubtract(
- BigIntOperationHint hint) {
- return zone()->New<Operator1<BigIntOperationHint>>(
- IrOpcode::kSpeculativeBigIntSubtract,
- Operator::kFoldable | Operator::kNoThrow, "SpeculativeBigIntSubtract", 2,
- 1, 1, 1, 1, 0, hint);
-}
-
-const Operator* SimplifiedOperatorBuilder::SpeculativeBigIntMultiply(
- BigIntOperationHint hint) {
- return zone()->New<Operator1<BigIntOperationHint>>(
- IrOpcode::kSpeculativeBigIntMultiply,
- Operator::kFoldable | Operator::kNoThrow, "SpeculativeBigIntMultiply", 2,
- 1, 1, 1, 1, 0, hint);
-}
-
-const Operator* SimplifiedOperatorBuilder::SpeculativeBigIntDivide(
- BigIntOperationHint hint) {
- return zone()->New<Operator1<BigIntOperationHint>>(
- IrOpcode::kSpeculativeBigIntDivide,
- Operator::kFoldable | Operator::kNoThrow, "SpeculativeBigIntDivide", 2, 1,
- 1, 1, 1, 0, hint);
-}
-
-const Operator* SimplifiedOperatorBuilder::SpeculativeBigIntModulus(
- BigIntOperationHint hint) {
- return zone()->New<Operator1<BigIntOperationHint>>(
- IrOpcode::kSpeculativeBigIntModulus,
- Operator::kFoldable | Operator::kNoThrow, "SpeculativeBigIntModulus", 2,
- 1, 1, 1, 1, 0, hint);
-}
-
-const Operator* SimplifiedOperatorBuilder::SpeculativeBigIntBitwiseAnd(
- BigIntOperationHint hint) {
- return zone()->New<Operator1<BigIntOperationHint>>(
- IrOpcode::kSpeculativeBigIntBitwiseAnd,
- Operator::kFoldable | Operator::kNoThrow, "SpeculativeBigIntBitwiseAnd",
- 2, 1, 1, 1, 1, 0, hint);
-}
+// TODO(panq): Cache speculative bigint operators.
+#define SPECULATIVE_BIGINT_BINOP(Name) \
+ const Operator* SimplifiedOperatorBuilder::Name(BigIntOperationHint hint) { \
+ return zone()->New<Operator1<BigIntOperationHint>>( \
+ IrOpcode::k##Name, Operator::kFoldable | Operator::kNoThrow, #Name, 2, \
+ 1, 1, 1, 1, 0, hint); \
+ }
+SIMPLIFIED_SPECULATIVE_BIGINT_BINOP_LIST(SPECULATIVE_BIGINT_BINOP)
+SPECULATIVE_BIGINT_BINOP(SpeculativeBigIntEqual)
+SPECULATIVE_BIGINT_BINOP(SpeculativeBigIntLessThan)
+SPECULATIVE_BIGINT_BINOP(SpeculativeBigIntLessThanOrEqual)
+#undef SPECULATIVE_BIGINT_BINOP
const Operator* SimplifiedOperatorBuilder::SpeculativeBigIntNegate(
BigIntOperationHint hint) {
@@ -1673,6 +1837,22 @@ const Operator* SimplifiedOperatorBuilder::SpeculativeBigIntNegate(
1, 1, 1, 0, hint);
}
+const Operator* SimplifiedOperatorBuilder::SpeculativeToBigInt(
+ BigIntOperationHint hint, const FeedbackSource& feedback) {
+ if (!feedback.IsValid()) {
+ switch (hint) {
+ case BigIntOperationHint::kBigInt64:
+ return &cache_.kSpeculativeToBigIntBigInt64Operator;
+ case BigIntOperationHint::kBigInt:
+ return &cache_.kSpeculativeToBigIntBigIntOperator;
+ }
+ }
+ return zone()->New<Operator1<BigIntOperationParameters>>(
+ IrOpcode::kSpeculativeToBigInt, Operator::kFoldable | Operator::kNoThrow,
+ "SpeculativeToBigInt", 1, 1, 1, 1, 1, 0,
+ BigIntOperationParameters(hint, feedback));
+}
+
const Operator* SimplifiedOperatorBuilder::CheckClosure(
const Handle<FeedbackCell>& feedback_cell) {
return zone()->New<Operator1<Handle<FeedbackCell>>>( // --