Commit edd50ad2 authored by Santiago Aboy Solanes's avatar Santiago Aboy Solanes Committed by Commit Bot

[turbofan][64][ptr-compr] Optimize Smi Tagging for 31 bit smis

In both ChangeIntPtrToSmi and ChangeInt32ToSmi we can use bitcasts
instead of change nodes for Smi Tagging, when we are using 31 bit
smis in 64 bit architectures with pointer compression enabled.

In ChangeIntPtrToSmi we can ignore the truncation as well.

Updated DecompressionOptimizer to match the new pattern.

Change-Id: I4487ba40ba9fda7b1ab31da95ff7bd144407d02d
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1924355
Commit-Queue: Santiago Aboy Solanes <solanes@chromium.org>
Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
Cr-Commit-Position: refs/heads/master@{#65168}
parent 3b25378e
...@@ -1651,6 +1651,12 @@ void InstructionSelector::VisitTryTruncateFloat64ToUint64(Node* node) { ...@@ -1651,6 +1651,12 @@ void InstructionSelector::VisitTryTruncateFloat64ToUint64(Node* node) {
Emit(kArm64Float64ToUint64, output_count, outputs, 1, inputs); Emit(kArm64Float64ToUint64, output_count, outputs, 1, inputs);
} }
void InstructionSelector::VisitBitcastWord32ToWord64(Node* node) {
DCHECK(SmiValuesAre31Bits());
DCHECK(COMPRESS_POINTERS_BOOL);
EmitIdentity(node);
}
void InstructionSelector::VisitChangeInt32ToInt64(Node* node) { void InstructionSelector::VisitChangeInt32ToInt64(Node* node) {
Node* value = node->InputAt(0); Node* value = node->InputAt(0);
if (value->opcode() == IrOpcode::kLoad && CanCover(node, value)) { if (value->opcode() == IrOpcode::kLoad && CanCover(node, value)) {
......
...@@ -1570,6 +1570,8 @@ void InstructionSelector::VisitNode(Node* node) { ...@@ -1570,6 +1570,8 @@ void InstructionSelector::VisitNode(Node* node) {
return MarkAsWord64(node), VisitTryTruncateFloat32ToUint64(node); return MarkAsWord64(node), VisitTryTruncateFloat32ToUint64(node);
case IrOpcode::kTryTruncateFloat64ToUint64: case IrOpcode::kTryTruncateFloat64ToUint64:
return MarkAsWord64(node), VisitTryTruncateFloat64ToUint64(node); return MarkAsWord64(node), VisitTryTruncateFloat64ToUint64(node);
case IrOpcode::kBitcastWord32ToWord64:
return MarkAsWord64(node), VisitBitcastWord32ToWord64(node);
case IrOpcode::kChangeInt32ToInt64: case IrOpcode::kChangeInt32ToInt64:
return MarkAsWord64(node), VisitChangeInt32ToInt64(node); return MarkAsWord64(node), VisitChangeInt32ToInt64(node);
case IrOpcode::kChangeUint32ToUint64: case IrOpcode::kChangeUint32ToUint64:
...@@ -2437,6 +2439,10 @@ void InstructionSelector::VisitUint64LessThanOrEqual(Node* node) { ...@@ -2437,6 +2439,10 @@ void InstructionSelector::VisitUint64LessThanOrEqual(Node* node) {
void InstructionSelector::VisitUint64Mod(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitUint64Mod(Node* node) { UNIMPLEMENTED(); }
void InstructionSelector::VisitBitcastWord32ToWord64(Node* node) {
UNIMPLEMENTED();
}
void InstructionSelector::VisitChangeInt32ToInt64(Node* node) { void InstructionSelector::VisitChangeInt32ToInt64(Node* node) {
UNIMPLEMENTED(); UNIMPLEMENTED();
} }
......
...@@ -1225,6 +1225,12 @@ void InstructionSelector::VisitTryTruncateFloat64ToUint64(Node* node) { ...@@ -1225,6 +1225,12 @@ void InstructionSelector::VisitTryTruncateFloat64ToUint64(Node* node) {
Emit(kSSEFloat64ToUint64, output_count, outputs, 1, inputs); Emit(kSSEFloat64ToUint64, output_count, outputs, 1, inputs);
} }
void InstructionSelector::VisitBitcastWord32ToWord64(Node* node) {
DCHECK(SmiValuesAre31Bits());
DCHECK(COMPRESS_POINTERS_BOOL);
EmitIdentity(node);
}
void InstructionSelector::VisitChangeInt32ToInt64(Node* node) { void InstructionSelector::VisitChangeInt32ToInt64(Node* node) {
X64OperandGenerator g(this); X64OperandGenerator g(this);
Node* const value = node->InputAt(0); Node* const value = node->InputAt(0);
......
...@@ -80,6 +80,7 @@ void DecompressionOptimizer::MarkNodeInputs(Node* node) { ...@@ -80,6 +80,7 @@ void DecompressionOptimizer::MarkNodeInputs(Node* node) {
case IrOpcode::kUint32LessThanOrEqual: case IrOpcode::kUint32LessThanOrEqual:
case IrOpcode::kWord32And: case IrOpcode::kWord32And:
case IrOpcode::kWord32Equal: case IrOpcode::kWord32Equal:
case IrOpcode::kWord32Shl:
DCHECK_EQ(node->op()->ValueInputCount(), 2); DCHECK_EQ(node->op()->ValueInputCount(), 2);
MaybeMarkAndQueueForRevisit(node->InputAt(0), MaybeMarkAndQueueForRevisit(node->InputAt(0),
State::kOnly32BitsObserved); // value_0 State::kOnly32BitsObserved); // value_0
......
...@@ -4425,8 +4425,11 @@ Node* EffectControlLinearizer::AllocateHeapNumberWithValue(Node* value) { ...@@ -4425,8 +4425,11 @@ Node* EffectControlLinearizer::AllocateHeapNumberWithValue(Node* value) {
Node* EffectControlLinearizer::ChangeIntPtrToSmi(Node* value) { Node* EffectControlLinearizer::ChangeIntPtrToSmi(Node* value) {
// Do shift on 32bit values if Smis are stored in the lower word. // Do shift on 32bit values if Smis are stored in the lower word.
if (machine()->Is64() && SmiValuesAre31Bits()) { if (machine()->Is64() && SmiValuesAre31Bits()) {
return __ ChangeInt32ToInt64( Node* smi_value = __ Word32Shl(value, SmiShiftBitsConstant());
__ Word32Shl(__ TruncateInt64ToInt32(value), SmiShiftBitsConstant())); // In pointer compression, we smi-corrupt. Then, the upper bits are not
// important.
return COMPRESS_POINTERS_BOOL ? __ BitcastWord32ToWord64(smi_value)
: __ ChangeInt32ToInt64(smi_value);
} }
return __ WordShl(value, SmiShiftBitsConstant()); return __ WordShl(value, SmiShiftBitsConstant());
} }
...@@ -4448,7 +4451,7 @@ Node* EffectControlLinearizer::ChangeIntPtrToInt32(Node* value) { ...@@ -4448,7 +4451,7 @@ Node* EffectControlLinearizer::ChangeIntPtrToInt32(Node* value) {
Node* EffectControlLinearizer::ChangeInt32ToSmi(Node* value) { Node* EffectControlLinearizer::ChangeInt32ToSmi(Node* value) {
// Do shift on 32bit values if Smis are stored in the lower word. // Do shift on 32bit values if Smis are stored in the lower word.
if (machine()->Is64() && SmiValuesAre31Bits()) { if (machine()->Is64() && SmiValuesAre31Bits()) {
return __ ChangeInt32ToInt64(__ Word32Shl(value, SmiShiftBitsConstant())); return ChangeIntPtrToSmi(value);
} }
return ChangeIntPtrToSmi(ChangeInt32ToIntPtr(value)); return ChangeIntPtrToSmi(ChangeInt32ToIntPtr(value));
} }
...@@ -4468,7 +4471,11 @@ Node* EffectControlLinearizer::ChangeUint32ToUintPtr(Node* value) { ...@@ -4468,7 +4471,11 @@ Node* EffectControlLinearizer::ChangeUint32ToUintPtr(Node* value) {
Node* EffectControlLinearizer::ChangeUint32ToSmi(Node* value) { Node* EffectControlLinearizer::ChangeUint32ToSmi(Node* value) {
// Do shift on 32bit values if Smis are stored in the lower word. // Do shift on 32bit values if Smis are stored in the lower word.
if (machine()->Is64() && SmiValuesAre31Bits()) { if (machine()->Is64() && SmiValuesAre31Bits()) {
return __ ChangeUint32ToUint64(__ Word32Shl(value, SmiShiftBitsConstant())); Node* smi_value = __ Word32Shl(value, SmiShiftBitsConstant());
// In pointer compression, we smi-corrupt. Then, the upper bits are not
// important.
return COMPRESS_POINTERS_BOOL ? __ BitcastWord32ToWord64(smi_value)
: __ ChangeUint32ToUint64(smi_value);
} else { } else {
return __ WordShl(ChangeUint32ToUintPtr(value), SmiShiftBitsConstant()); return __ WordShl(ChangeUint32ToUintPtr(value), SmiShiftBitsConstant());
} }
......
...@@ -25,6 +25,7 @@ class BasicBlock; ...@@ -25,6 +25,7 @@ class BasicBlock;
V(BitcastFloat32ToInt32) \ V(BitcastFloat32ToInt32) \
V(BitcastFloat64ToInt64) \ V(BitcastFloat64ToInt64) \
V(BitcastInt32ToFloat32) \ V(BitcastInt32ToFloat32) \
V(BitcastWord32ToWord64) \
V(BitcastInt64ToFloat64) \ V(BitcastInt64ToFloat64) \
V(ChangeFloat64ToInt32) \ V(ChangeFloat64ToInt32) \
V(ChangeFloat64ToInt64) \ V(ChangeFloat64ToInt64) \
......
...@@ -455,6 +455,7 @@ class MachineRepresentationChecker { ...@@ -455,6 +455,7 @@ class MachineRepresentationChecker {
case IrOpcode::kRoundInt32ToFloat32: case IrOpcode::kRoundInt32ToFloat32:
case IrOpcode::kRoundUint32ToFloat32: case IrOpcode::kRoundUint32ToFloat32:
case IrOpcode::kBitcastInt32ToFloat32: case IrOpcode::kBitcastInt32ToFloat32:
case IrOpcode::kBitcastWord32ToWord64:
case IrOpcode::kChangeInt32ToInt64: case IrOpcode::kChangeInt32ToInt64:
case IrOpcode::kChangeUint32ToUint64: case IrOpcode::kChangeUint32ToUint64:
MACHINE_UNOP_32_LIST(LABEL) { CheckValueInputForInt32Op(node, 0); } MACHINE_UNOP_32_LIST(LABEL) { CheckValueInputForInt32Op(node, 0); }
......
...@@ -632,6 +632,11 @@ Reduction MachineOperatorReducer::Reduce(Node* node) { ...@@ -632,6 +632,11 @@ Reduction MachineOperatorReducer::Reduce(Node* node) {
if (m.HasValue()) return ReplaceFloat64(FastI2D(m.Value())); if (m.HasValue()) return ReplaceFloat64(FastI2D(m.Value()));
break; break;
} }
case IrOpcode::kBitcastWord32ToWord64: {
Int32Matcher m(node->InputAt(0));
if (m.HasValue()) return ReplaceInt64(m.Value());
break;
}
case IrOpcode::kChangeInt32ToInt64: { case IrOpcode::kChangeInt32ToInt64: {
Int32Matcher m(node->InputAt(0)); Int32Matcher m(node->InputAt(0));
if (m.HasValue()) return ReplaceInt64(m.Value()); if (m.HasValue()) return ReplaceInt64(m.Value());
......
...@@ -200,266 +200,267 @@ MachineType AtomicOpType(Operator const* op) { ...@@ -200,266 +200,267 @@ MachineType AtomicOpType(Operator const* op) {
// The format is: // The format is:
// V(Name, properties, value_input_count, control_input_count, output_count) // V(Name, properties, value_input_count, control_input_count, output_count)
#define MACHINE_PURE_OP_LIST(V) \ #define MACHINE_PURE_OP_LIST(V) \
PURE_BINARY_OP_LIST_32(V) \ PURE_BINARY_OP_LIST_32(V) \
PURE_BINARY_OP_LIST_64(V) \ PURE_BINARY_OP_LIST_64(V) \
V(Word32Clz, Operator::kNoProperties, 1, 0, 1) \ V(Word32Clz, Operator::kNoProperties, 1, 0, 1) \
V(Word64Clz, Operator::kNoProperties, 1, 0, 1) \ V(Word64Clz, Operator::kNoProperties, 1, 0, 1) \
V(Word32ReverseBytes, Operator::kNoProperties, 1, 0, 1) \ V(Word32ReverseBytes, Operator::kNoProperties, 1, 0, 1) \
V(Word64ReverseBytes, Operator::kNoProperties, 1, 0, 1) \ V(Word64ReverseBytes, Operator::kNoProperties, 1, 0, 1) \
V(Simd128ReverseBytes, Operator::kNoProperties, 1, 0, 1) \ V(Simd128ReverseBytes, Operator::kNoProperties, 1, 0, 1) \
V(BitcastTaggedToWordForTagAndSmiBits, Operator::kNoProperties, 1, 0, 1) \ V(BitcastTaggedToWordForTagAndSmiBits, Operator::kNoProperties, 1, 0, 1) \
V(BitcastWordToTaggedSigned, Operator::kNoProperties, 1, 0, 1) \ V(BitcastWordToTaggedSigned, Operator::kNoProperties, 1, 0, 1) \
V(TruncateFloat64ToWord32, Operator::kNoProperties, 1, 0, 1) \ V(TruncateFloat64ToWord32, Operator::kNoProperties, 1, 0, 1) \
V(ChangeFloat32ToFloat64, Operator::kNoProperties, 1, 0, 1) \ V(ChangeFloat32ToFloat64, Operator::kNoProperties, 1, 0, 1) \
V(ChangeFloat64ToInt32, Operator::kNoProperties, 1, 0, 1) \ V(ChangeFloat64ToInt32, Operator::kNoProperties, 1, 0, 1) \
V(ChangeFloat64ToInt64, Operator::kNoProperties, 1, 0, 1) \ V(ChangeFloat64ToInt64, Operator::kNoProperties, 1, 0, 1) \
V(ChangeFloat64ToUint32, Operator::kNoProperties, 1, 0, 1) \ V(ChangeFloat64ToUint32, Operator::kNoProperties, 1, 0, 1) \
V(ChangeFloat64ToUint64, Operator::kNoProperties, 1, 0, 1) \ V(ChangeFloat64ToUint64, Operator::kNoProperties, 1, 0, 1) \
V(TruncateFloat64ToInt64, Operator::kNoProperties, 1, 0, 1) \ V(TruncateFloat64ToInt64, Operator::kNoProperties, 1, 0, 1) \
V(TruncateFloat64ToUint32, Operator::kNoProperties, 1, 0, 1) \ V(TruncateFloat64ToUint32, Operator::kNoProperties, 1, 0, 1) \
V(TruncateFloat32ToInt32, Operator::kNoProperties, 1, 0, 1) \ V(TruncateFloat32ToInt32, Operator::kNoProperties, 1, 0, 1) \
V(TruncateFloat32ToUint32, Operator::kNoProperties, 1, 0, 1) \ V(TruncateFloat32ToUint32, Operator::kNoProperties, 1, 0, 1) \
V(TryTruncateFloat32ToInt64, Operator::kNoProperties, 1, 0, 2) \ V(TryTruncateFloat32ToInt64, Operator::kNoProperties, 1, 0, 2) \
V(TryTruncateFloat64ToInt64, Operator::kNoProperties, 1, 0, 2) \ V(TryTruncateFloat64ToInt64, Operator::kNoProperties, 1, 0, 2) \
V(TryTruncateFloat32ToUint64, Operator::kNoProperties, 1, 0, 2) \ V(TryTruncateFloat32ToUint64, Operator::kNoProperties, 1, 0, 2) \
V(TryTruncateFloat64ToUint64, Operator::kNoProperties, 1, 0, 2) \ V(TryTruncateFloat64ToUint64, Operator::kNoProperties, 1, 0, 2) \
V(ChangeInt32ToFloat64, Operator::kNoProperties, 1, 0, 1) \ V(ChangeInt32ToFloat64, Operator::kNoProperties, 1, 0, 1) \
V(ChangeInt64ToFloat64, Operator::kNoProperties, 1, 0, 1) \ V(ChangeInt64ToFloat64, Operator::kNoProperties, 1, 0, 1) \
V(Float64SilenceNaN, Operator::kNoProperties, 1, 0, 1) \ V(Float64SilenceNaN, Operator::kNoProperties, 1, 0, 1) \
V(RoundFloat64ToInt32, Operator::kNoProperties, 1, 0, 1) \ V(RoundFloat64ToInt32, Operator::kNoProperties, 1, 0, 1) \
V(RoundInt32ToFloat32, Operator::kNoProperties, 1, 0, 1) \ V(RoundInt32ToFloat32, Operator::kNoProperties, 1, 0, 1) \
V(RoundInt64ToFloat32, Operator::kNoProperties, 1, 0, 1) \ V(RoundInt64ToFloat32, Operator::kNoProperties, 1, 0, 1) \
V(RoundInt64ToFloat64, Operator::kNoProperties, 1, 0, 1) \ V(RoundInt64ToFloat64, Operator::kNoProperties, 1, 0, 1) \
V(RoundUint32ToFloat32, Operator::kNoProperties, 1, 0, 1) \ V(RoundUint32ToFloat32, Operator::kNoProperties, 1, 0, 1) \
V(RoundUint64ToFloat32, Operator::kNoProperties, 1, 0, 1) \ V(RoundUint64ToFloat32, Operator::kNoProperties, 1, 0, 1) \
V(RoundUint64ToFloat64, Operator::kNoProperties, 1, 0, 1) \ V(RoundUint64ToFloat64, Operator::kNoProperties, 1, 0, 1) \
V(ChangeInt32ToInt64, Operator::kNoProperties, 1, 0, 1) \ V(BitcastWord32ToWord64, Operator::kNoProperties, 1, 0, 1) \
V(ChangeUint32ToFloat64, Operator::kNoProperties, 1, 0, 1) \ V(ChangeInt32ToInt64, Operator::kNoProperties, 1, 0, 1) \
V(ChangeUint32ToUint64, Operator::kNoProperties, 1, 0, 1) \ V(ChangeUint32ToFloat64, Operator::kNoProperties, 1, 0, 1) \
V(ChangeTaggedToCompressed, Operator::kNoProperties, 1, 0, 1) \ V(ChangeUint32ToUint64, Operator::kNoProperties, 1, 0, 1) \
V(TruncateFloat64ToFloat32, Operator::kNoProperties, 1, 0, 1) \ V(ChangeTaggedToCompressed, Operator::kNoProperties, 1, 0, 1) \
V(TruncateInt64ToInt32, Operator::kNoProperties, 1, 0, 1) \ V(TruncateFloat64ToFloat32, Operator::kNoProperties, 1, 0, 1) \
V(BitcastFloat32ToInt32, Operator::kNoProperties, 1, 0, 1) \ V(TruncateInt64ToInt32, Operator::kNoProperties, 1, 0, 1) \
V(BitcastFloat64ToInt64, Operator::kNoProperties, 1, 0, 1) \ V(BitcastFloat32ToInt32, Operator::kNoProperties, 1, 0, 1) \
V(BitcastInt32ToFloat32, Operator::kNoProperties, 1, 0, 1) \ V(BitcastFloat64ToInt64, Operator::kNoProperties, 1, 0, 1) \
V(BitcastInt64ToFloat64, Operator::kNoProperties, 1, 0, 1) \ V(BitcastInt32ToFloat32, Operator::kNoProperties, 1, 0, 1) \
V(SignExtendWord8ToInt32, Operator::kNoProperties, 1, 0, 1) \ V(BitcastInt64ToFloat64, Operator::kNoProperties, 1, 0, 1) \
V(SignExtendWord16ToInt32, Operator::kNoProperties, 1, 0, 1) \ V(SignExtendWord8ToInt32, Operator::kNoProperties, 1, 0, 1) \
V(SignExtendWord8ToInt64, Operator::kNoProperties, 1, 0, 1) \ V(SignExtendWord16ToInt32, Operator::kNoProperties, 1, 0, 1) \
V(SignExtendWord16ToInt64, Operator::kNoProperties, 1, 0, 1) \ V(SignExtendWord8ToInt64, Operator::kNoProperties, 1, 0, 1) \
V(SignExtendWord32ToInt64, Operator::kNoProperties, 1, 0, 1) \ V(SignExtendWord16ToInt64, Operator::kNoProperties, 1, 0, 1) \
V(Float32Abs, Operator::kNoProperties, 1, 0, 1) \ V(SignExtendWord32ToInt64, Operator::kNoProperties, 1, 0, 1) \
V(Float32Add, Operator::kCommutative, 2, 0, 1) \ V(Float32Abs, Operator::kNoProperties, 1, 0, 1) \
V(Float32Sub, Operator::kNoProperties, 2, 0, 1) \ V(Float32Add, Operator::kCommutative, 2, 0, 1) \
V(Float32Mul, Operator::kCommutative, 2, 0, 1) \ V(Float32Sub, Operator::kNoProperties, 2, 0, 1) \
V(Float32Div, Operator::kNoProperties, 2, 0, 1) \ V(Float32Mul, Operator::kCommutative, 2, 0, 1) \
V(Float32Neg, Operator::kNoProperties, 1, 0, 1) \ V(Float32Div, Operator::kNoProperties, 2, 0, 1) \
V(Float32Sqrt, Operator::kNoProperties, 1, 0, 1) \ V(Float32Neg, Operator::kNoProperties, 1, 0, 1) \
V(Float32Max, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ V(Float32Sqrt, Operator::kNoProperties, 1, 0, 1) \
V(Float32Min, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ V(Float32Max, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
V(Float64Abs, Operator::kNoProperties, 1, 0, 1) \ V(Float32Min, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
V(Float64Acos, Operator::kNoProperties, 1, 0, 1) \ V(Float64Abs, Operator::kNoProperties, 1, 0, 1) \
V(Float64Acosh, Operator::kNoProperties, 1, 0, 1) \ V(Float64Acos, Operator::kNoProperties, 1, 0, 1) \
V(Float64Asin, Operator::kNoProperties, 1, 0, 1) \ V(Float64Acosh, Operator::kNoProperties, 1, 0, 1) \
V(Float64Asinh, Operator::kNoProperties, 1, 0, 1) \ V(Float64Asin, Operator::kNoProperties, 1, 0, 1) \
V(Float64Atan, Operator::kNoProperties, 1, 0, 1) \ V(Float64Asinh, Operator::kNoProperties, 1, 0, 1) \
V(Float64Atan2, Operator::kNoProperties, 2, 0, 1) \ V(Float64Atan, Operator::kNoProperties, 1, 0, 1) \
V(Float64Atanh, Operator::kNoProperties, 1, 0, 1) \ V(Float64Atan2, Operator::kNoProperties, 2, 0, 1) \
V(Float64Cbrt, Operator::kNoProperties, 1, 0, 1) \ V(Float64Atanh, Operator::kNoProperties, 1, 0, 1) \
V(Float64Cos, Operator::kNoProperties, 1, 0, 1) \ V(Float64Cbrt, Operator::kNoProperties, 1, 0, 1) \
V(Float64Cosh, Operator::kNoProperties, 1, 0, 1) \ V(Float64Cos, Operator::kNoProperties, 1, 0, 1) \
V(Float64Exp, Operator::kNoProperties, 1, 0, 1) \ V(Float64Cosh, Operator::kNoProperties, 1, 0, 1) \
V(Float64Expm1, Operator::kNoProperties, 1, 0, 1) \ V(Float64Exp, Operator::kNoProperties, 1, 0, 1) \
V(Float64Log, Operator::kNoProperties, 1, 0, 1) \ V(Float64Expm1, Operator::kNoProperties, 1, 0, 1) \
V(Float64Log1p, Operator::kNoProperties, 1, 0, 1) \ V(Float64Log, Operator::kNoProperties, 1, 0, 1) \
V(Float64Log2, Operator::kNoProperties, 1, 0, 1) \ V(Float64Log1p, Operator::kNoProperties, 1, 0, 1) \
V(Float64Log10, Operator::kNoProperties, 1, 0, 1) \ V(Float64Log2, Operator::kNoProperties, 1, 0, 1) \
V(Float64Max, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ V(Float64Log10, Operator::kNoProperties, 1, 0, 1) \
V(Float64Min, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ V(Float64Max, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
V(Float64Neg, Operator::kNoProperties, 1, 0, 1) \ V(Float64Min, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
V(Float64Add, Operator::kCommutative, 2, 0, 1) \ V(Float64Neg, Operator::kNoProperties, 1, 0, 1) \
V(Float64Sub, Operator::kNoProperties, 2, 0, 1) \ V(Float64Add, Operator::kCommutative, 2, 0, 1) \
V(Float64Mul, Operator::kCommutative, 2, 0, 1) \ V(Float64Sub, Operator::kNoProperties, 2, 0, 1) \
V(Float64Div, Operator::kNoProperties, 2, 0, 1) \ V(Float64Mul, Operator::kCommutative, 2, 0, 1) \
V(Float64Mod, Operator::kNoProperties, 2, 0, 1) \ V(Float64Div, Operator::kNoProperties, 2, 0, 1) \
V(Float64Pow, Operator::kNoProperties, 2, 0, 1) \ V(Float64Mod, Operator::kNoProperties, 2, 0, 1) \
V(Float64Sin, Operator::kNoProperties, 1, 0, 1) \ V(Float64Pow, Operator::kNoProperties, 2, 0, 1) \
V(Float64Sinh, Operator::kNoProperties, 1, 0, 1) \ V(Float64Sin, Operator::kNoProperties, 1, 0, 1) \
V(Float64Sqrt, Operator::kNoProperties, 1, 0, 1) \ V(Float64Sinh, Operator::kNoProperties, 1, 0, 1) \
V(Float64Tan, Operator::kNoProperties, 1, 0, 1) \ V(Float64Sqrt, Operator::kNoProperties, 1, 0, 1) \
V(Float64Tanh, Operator::kNoProperties, 1, 0, 1) \ V(Float64Tan, Operator::kNoProperties, 1, 0, 1) \
V(Float32Equal, Operator::kCommutative, 2, 0, 1) \ V(Float64Tanh, Operator::kNoProperties, 1, 0, 1) \
V(Float32LessThan, Operator::kNoProperties, 2, 0, 1) \ V(Float32Equal, Operator::kCommutative, 2, 0, 1) \
V(Float32LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ V(Float32LessThan, Operator::kNoProperties, 2, 0, 1) \
V(Float64Equal, Operator::kCommutative, 2, 0, 1) \ V(Float32LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \
V(Float64LessThan, Operator::kNoProperties, 2, 0, 1) \ V(Float64Equal, Operator::kCommutative, 2, 0, 1) \
V(Float64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ V(Float64LessThan, Operator::kNoProperties, 2, 0, 1) \
V(Float64ExtractLowWord32, Operator::kNoProperties, 1, 0, 1) \ V(Float64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \
V(Float64ExtractHighWord32, Operator::kNoProperties, 1, 0, 1) \ V(Float64ExtractLowWord32, Operator::kNoProperties, 1, 0, 1) \
V(Float64InsertLowWord32, Operator::kNoProperties, 2, 0, 1) \ V(Float64ExtractHighWord32, Operator::kNoProperties, 1, 0, 1) \
V(Float64InsertHighWord32, Operator::kNoProperties, 2, 0, 1) \ V(Float64InsertLowWord32, Operator::kNoProperties, 2, 0, 1) \
V(LoadStackCheckOffset, Operator::kNoProperties, 0, 0, 1) \ V(Float64InsertHighWord32, Operator::kNoProperties, 2, 0, 1) \
V(LoadFramePointer, Operator::kNoProperties, 0, 0, 1) \ V(LoadStackCheckOffset, Operator::kNoProperties, 0, 0, 1) \
V(LoadParentFramePointer, Operator::kNoProperties, 0, 0, 1) \ V(LoadFramePointer, Operator::kNoProperties, 0, 0, 1) \
V(Int32PairAdd, Operator::kNoProperties, 4, 0, 2) \ V(LoadParentFramePointer, Operator::kNoProperties, 0, 0, 1) \
V(Int32PairSub, Operator::kNoProperties, 4, 0, 2) \ V(Int32PairAdd, Operator::kNoProperties, 4, 0, 2) \
V(Int32PairMul, Operator::kNoProperties, 4, 0, 2) \ V(Int32PairSub, Operator::kNoProperties, 4, 0, 2) \
V(Word32PairShl, Operator::kNoProperties, 3, 0, 2) \ V(Int32PairMul, Operator::kNoProperties, 4, 0, 2) \
V(Word32PairShr, Operator::kNoProperties, 3, 0, 2) \ V(Word32PairShl, Operator::kNoProperties, 3, 0, 2) \
V(Word32PairSar, Operator::kNoProperties, 3, 0, 2) \ V(Word32PairShr, Operator::kNoProperties, 3, 0, 2) \
V(F64x2Splat, Operator::kNoProperties, 1, 0, 1) \ V(Word32PairSar, Operator::kNoProperties, 3, 0, 2) \
V(F64x2SConvertI64x2, Operator::kNoProperties, 1, 0, 1) \ V(F64x2Splat, Operator::kNoProperties, 1, 0, 1) \
V(F64x2UConvertI64x2, Operator::kNoProperties, 1, 0, 1) \ V(F64x2SConvertI64x2, Operator::kNoProperties, 1, 0, 1) \
V(F64x2Abs, Operator::kNoProperties, 1, 0, 1) \ V(F64x2UConvertI64x2, Operator::kNoProperties, 1, 0, 1) \
V(F64x2Neg, Operator::kNoProperties, 1, 0, 1) \ V(F64x2Abs, Operator::kNoProperties, 1, 0, 1) \
V(F64x2Sqrt, Operator::kNoProperties, 1, 0, 1) \ V(F64x2Neg, Operator::kNoProperties, 1, 0, 1) \
V(F64x2Add, Operator::kCommutative, 2, 0, 1) \ V(F64x2Sqrt, Operator::kNoProperties, 1, 0, 1) \
V(F64x2Sub, Operator::kNoProperties, 2, 0, 1) \ V(F64x2Add, Operator::kCommutative, 2, 0, 1) \
V(F64x2Mul, Operator::kCommutative, 2, 0, 1) \ V(F64x2Sub, Operator::kNoProperties, 2, 0, 1) \
V(F64x2Div, Operator::kNoProperties, 2, 0, 1) \ V(F64x2Mul, Operator::kCommutative, 2, 0, 1) \
V(F64x2Min, Operator::kCommutative, 2, 0, 1) \ V(F64x2Div, Operator::kNoProperties, 2, 0, 1) \
V(F64x2Max, Operator::kCommutative, 2, 0, 1) \ V(F64x2Min, Operator::kCommutative, 2, 0, 1) \
V(F64x2Eq, Operator::kCommutative, 2, 0, 1) \ V(F64x2Max, Operator::kCommutative, 2, 0, 1) \
V(F64x2Ne, Operator::kCommutative, 2, 0, 1) \ V(F64x2Eq, Operator::kCommutative, 2, 0, 1) \
V(F64x2Lt, Operator::kNoProperties, 2, 0, 1) \ V(F64x2Ne, Operator::kCommutative, 2, 0, 1) \
V(F64x2Le, Operator::kNoProperties, 2, 0, 1) \ V(F64x2Lt, Operator::kNoProperties, 2, 0, 1) \
V(F64x2Qfma, Operator::kNoProperties, 3, 0, 1) \ V(F64x2Le, Operator::kNoProperties, 2, 0, 1) \
V(F64x2Qfms, Operator::kNoProperties, 3, 0, 1) \ V(F64x2Qfma, Operator::kNoProperties, 3, 0, 1) \
V(F32x4Splat, Operator::kNoProperties, 1, 0, 1) \ V(F64x2Qfms, Operator::kNoProperties, 3, 0, 1) \
V(F32x4SConvertI32x4, Operator::kNoProperties, 1, 0, 1) \ V(F32x4Splat, Operator::kNoProperties, 1, 0, 1) \
V(F32x4UConvertI32x4, Operator::kNoProperties, 1, 0, 1) \ V(F32x4SConvertI32x4, Operator::kNoProperties, 1, 0, 1) \
V(F32x4Abs, Operator::kNoProperties, 1, 0, 1) \ V(F32x4UConvertI32x4, Operator::kNoProperties, 1, 0, 1) \
V(F32x4Neg, Operator::kNoProperties, 1, 0, 1) \ V(F32x4Abs, Operator::kNoProperties, 1, 0, 1) \
V(F32x4Sqrt, Operator::kNoProperties, 1, 0, 1) \ V(F32x4Neg, Operator::kNoProperties, 1, 0, 1) \
V(F32x4RecipApprox, Operator::kNoProperties, 1, 0, 1) \ V(F32x4Sqrt, Operator::kNoProperties, 1, 0, 1) \
V(F32x4RecipSqrtApprox, Operator::kNoProperties, 1, 0, 1) \ V(F32x4RecipApprox, Operator::kNoProperties, 1, 0, 1) \
V(F32x4Add, Operator::kCommutative, 2, 0, 1) \ V(F32x4RecipSqrtApprox, Operator::kNoProperties, 1, 0, 1) \
V(F32x4AddHoriz, Operator::kNoProperties, 2, 0, 1) \ V(F32x4Add, Operator::kCommutative, 2, 0, 1) \
V(F32x4Sub, Operator::kNoProperties, 2, 0, 1) \ V(F32x4AddHoriz, Operator::kNoProperties, 2, 0, 1) \
V(F32x4Mul, Operator::kCommutative, 2, 0, 1) \ V(F32x4Sub, Operator::kNoProperties, 2, 0, 1) \
V(F32x4Div, Operator::kNoProperties, 2, 0, 1) \ V(F32x4Mul, Operator::kCommutative, 2, 0, 1) \
V(F32x4Min, Operator::kCommutative, 2, 0, 1) \ V(F32x4Div, Operator::kNoProperties, 2, 0, 1) \
V(F32x4Max, Operator::kCommutative, 2, 0, 1) \ V(F32x4Min, Operator::kCommutative, 2, 0, 1) \
V(F32x4Eq, Operator::kCommutative, 2, 0, 1) \ V(F32x4Max, Operator::kCommutative, 2, 0, 1) \
V(F32x4Ne, Operator::kCommutative, 2, 0, 1) \ V(F32x4Eq, Operator::kCommutative, 2, 0, 1) \
V(F32x4Lt, Operator::kNoProperties, 2, 0, 1) \ V(F32x4Ne, Operator::kCommutative, 2, 0, 1) \
V(F32x4Le, Operator::kNoProperties, 2, 0, 1) \ V(F32x4Lt, Operator::kNoProperties, 2, 0, 1) \
V(F32x4Qfma, Operator::kNoProperties, 3, 0, 1) \ V(F32x4Le, Operator::kNoProperties, 2, 0, 1) \
V(F32x4Qfms, Operator::kNoProperties, 3, 0, 1) \ V(F32x4Qfma, Operator::kNoProperties, 3, 0, 1) \
V(I64x2Splat, Operator::kNoProperties, 1, 0, 1) \ V(F32x4Qfms, Operator::kNoProperties, 3, 0, 1) \
V(I64x2SplatI32Pair, Operator::kNoProperties, 2, 0, 1) \ V(I64x2Splat, Operator::kNoProperties, 1, 0, 1) \
V(I64x2Neg, Operator::kNoProperties, 1, 0, 1) \ V(I64x2SplatI32Pair, Operator::kNoProperties, 2, 0, 1) \
V(I64x2Shl, Operator::kNoProperties, 2, 0, 1) \ V(I64x2Neg, Operator::kNoProperties, 1, 0, 1) \
V(I64x2ShrS, Operator::kNoProperties, 2, 0, 1) \ V(I64x2Shl, Operator::kNoProperties, 2, 0, 1) \
V(I64x2Add, Operator::kCommutative, 2, 0, 1) \ V(I64x2ShrS, Operator::kNoProperties, 2, 0, 1) \
V(I64x2Sub, Operator::kNoProperties, 2, 0, 1) \ V(I64x2Add, Operator::kCommutative, 2, 0, 1) \
V(I64x2Mul, Operator::kCommutative, 2, 0, 1) \ V(I64x2Sub, Operator::kNoProperties, 2, 0, 1) \
V(I64x2MinS, Operator::kCommutative, 2, 0, 1) \ V(I64x2Mul, Operator::kCommutative, 2, 0, 1) \
V(I64x2MaxS, Operator::kCommutative, 2, 0, 1) \ V(I64x2MinS, Operator::kCommutative, 2, 0, 1) \
V(I64x2Eq, Operator::kCommutative, 2, 0, 1) \ V(I64x2MaxS, Operator::kCommutative, 2, 0, 1) \
V(I64x2Ne, Operator::kCommutative, 2, 0, 1) \ V(I64x2Eq, Operator::kCommutative, 2, 0, 1) \
V(I64x2GtS, Operator::kNoProperties, 2, 0, 1) \ V(I64x2Ne, Operator::kCommutative, 2, 0, 1) \
V(I64x2GeS, Operator::kNoProperties, 2, 0, 1) \ V(I64x2GtS, Operator::kNoProperties, 2, 0, 1) \
V(I64x2ShrU, Operator::kNoProperties, 2, 0, 1) \ V(I64x2GeS, Operator::kNoProperties, 2, 0, 1) \
V(I64x2MinU, Operator::kCommutative, 2, 0, 1) \ V(I64x2ShrU, Operator::kNoProperties, 2, 0, 1) \
V(I64x2MaxU, Operator::kCommutative, 2, 0, 1) \ V(I64x2MinU, Operator::kCommutative, 2, 0, 1) \
V(I64x2GtU, Operator::kNoProperties, 2, 0, 1) \ V(I64x2MaxU, Operator::kCommutative, 2, 0, 1) \
V(I64x2GeU, Operator::kNoProperties, 2, 0, 1) \ V(I64x2GtU, Operator::kNoProperties, 2, 0, 1) \
V(I32x4Splat, Operator::kNoProperties, 1, 0, 1) \ V(I64x2GeU, Operator::kNoProperties, 2, 0, 1) \
V(I32x4SConvertF32x4, Operator::kNoProperties, 1, 0, 1) \ V(I32x4Splat, Operator::kNoProperties, 1, 0, 1) \
V(I32x4SConvertI16x8Low, Operator::kNoProperties, 1, 0, 1) \ V(I32x4SConvertF32x4, Operator::kNoProperties, 1, 0, 1) \
V(I32x4SConvertI16x8High, Operator::kNoProperties, 1, 0, 1) \ V(I32x4SConvertI16x8Low, Operator::kNoProperties, 1, 0, 1) \
V(I32x4Neg, Operator::kNoProperties, 1, 0, 1) \ V(I32x4SConvertI16x8High, Operator::kNoProperties, 1, 0, 1) \
V(I32x4Shl, Operator::kNoProperties, 2, 0, 1) \ V(I32x4Neg, Operator::kNoProperties, 1, 0, 1) \
V(I32x4ShrS, Operator::kNoProperties, 2, 0, 1) \ V(I32x4Shl, Operator::kNoProperties, 2, 0, 1) \
V(I32x4Add, Operator::kCommutative, 2, 0, 1) \ V(I32x4ShrS, Operator::kNoProperties, 2, 0, 1) \
V(I32x4AddHoriz, Operator::kNoProperties, 2, 0, 1) \ V(I32x4Add, Operator::kCommutative, 2, 0, 1) \
V(I32x4Sub, Operator::kNoProperties, 2, 0, 1) \ V(I32x4AddHoriz, Operator::kNoProperties, 2, 0, 1) \
V(I32x4Mul, Operator::kCommutative, 2, 0, 1) \ V(I32x4Sub, Operator::kNoProperties, 2, 0, 1) \
V(I32x4MinS, Operator::kCommutative, 2, 0, 1) \ V(I32x4Mul, Operator::kCommutative, 2, 0, 1) \
V(I32x4MaxS, Operator::kCommutative, 2, 0, 1) \ V(I32x4MinS, Operator::kCommutative, 2, 0, 1) \
V(I32x4Eq, Operator::kCommutative, 2, 0, 1) \ V(I32x4MaxS, Operator::kCommutative, 2, 0, 1) \
V(I32x4Ne, Operator::kCommutative, 2, 0, 1) \ V(I32x4Eq, Operator::kCommutative, 2, 0, 1) \
V(I32x4GtS, Operator::kNoProperties, 2, 0, 1) \ V(I32x4Ne, Operator::kCommutative, 2, 0, 1) \
V(I32x4GeS, Operator::kNoProperties, 2, 0, 1) \ V(I32x4GtS, Operator::kNoProperties, 2, 0, 1) \
V(I32x4UConvertF32x4, Operator::kNoProperties, 1, 0, 1) \ V(I32x4GeS, Operator::kNoProperties, 2, 0, 1) \
V(I32x4UConvertI16x8Low, Operator::kNoProperties, 1, 0, 1) \ V(I32x4UConvertF32x4, Operator::kNoProperties, 1, 0, 1) \
V(I32x4UConvertI16x8High, Operator::kNoProperties, 1, 0, 1) \ V(I32x4UConvertI16x8Low, Operator::kNoProperties, 1, 0, 1) \
V(I32x4ShrU, Operator::kNoProperties, 2, 0, 1) \ V(I32x4UConvertI16x8High, Operator::kNoProperties, 1, 0, 1) \
V(I32x4MinU, Operator::kCommutative, 2, 0, 1) \ V(I32x4ShrU, Operator::kNoProperties, 2, 0, 1) \
V(I32x4MaxU, Operator::kCommutative, 2, 0, 1) \ V(I32x4MinU, Operator::kCommutative, 2, 0, 1) \
V(I32x4GtU, Operator::kNoProperties, 2, 0, 1) \ V(I32x4MaxU, Operator::kCommutative, 2, 0, 1) \
V(I32x4GeU, Operator::kNoProperties, 2, 0, 1) \ V(I32x4GtU, Operator::kNoProperties, 2, 0, 1) \
V(I16x8Splat, Operator::kNoProperties, 1, 0, 1) \ V(I32x4GeU, Operator::kNoProperties, 2, 0, 1) \
V(I16x8SConvertI8x16Low, Operator::kNoProperties, 1, 0, 1) \ V(I16x8Splat, Operator::kNoProperties, 1, 0, 1) \
V(I16x8SConvertI8x16High, Operator::kNoProperties, 1, 0, 1) \ V(I16x8SConvertI8x16Low, Operator::kNoProperties, 1, 0, 1) \
V(I16x8Neg, Operator::kNoProperties, 1, 0, 1) \ V(I16x8SConvertI8x16High, Operator::kNoProperties, 1, 0, 1) \
V(I16x8Shl, Operator::kNoProperties, 2, 0, 1) \ V(I16x8Neg, Operator::kNoProperties, 1, 0, 1) \
V(I16x8ShrS, Operator::kNoProperties, 2, 0, 1) \ V(I16x8Shl, Operator::kNoProperties, 2, 0, 1) \
V(I16x8SConvertI32x4, Operator::kNoProperties, 2, 0, 1) \ V(I16x8ShrS, Operator::kNoProperties, 2, 0, 1) \
V(I16x8Add, Operator::kCommutative, 2, 0, 1) \ V(I16x8SConvertI32x4, Operator::kNoProperties, 2, 0, 1) \
V(I16x8AddSaturateS, Operator::kCommutative, 2, 0, 1) \ V(I16x8Add, Operator::kCommutative, 2, 0, 1) \
V(I16x8AddHoriz, Operator::kNoProperties, 2, 0, 1) \ V(I16x8AddSaturateS, Operator::kCommutative, 2, 0, 1) \
V(I16x8Sub, Operator::kNoProperties, 2, 0, 1) \ V(I16x8AddHoriz, Operator::kNoProperties, 2, 0, 1) \
V(I16x8SubSaturateS, Operator::kNoProperties, 2, 0, 1) \ V(I16x8Sub, Operator::kNoProperties, 2, 0, 1) \
V(I16x8Mul, Operator::kCommutative, 2, 0, 1) \ V(I16x8SubSaturateS, Operator::kNoProperties, 2, 0, 1) \
V(I16x8MinS, Operator::kCommutative, 2, 0, 1) \ V(I16x8Mul, Operator::kCommutative, 2, 0, 1) \
V(I16x8MaxS, Operator::kCommutative, 2, 0, 1) \ V(I16x8MinS, Operator::kCommutative, 2, 0, 1) \
V(I16x8Eq, Operator::kCommutative, 2, 0, 1) \ V(I16x8MaxS, Operator::kCommutative, 2, 0, 1) \
V(I16x8Ne, Operator::kCommutative, 2, 0, 1) \ V(I16x8Eq, Operator::kCommutative, 2, 0, 1) \
V(I16x8GtS, Operator::kNoProperties, 2, 0, 1) \ V(I16x8Ne, Operator::kCommutative, 2, 0, 1) \
V(I16x8GeS, Operator::kNoProperties, 2, 0, 1) \ V(I16x8GtS, Operator::kNoProperties, 2, 0, 1) \
V(I16x8UConvertI8x16Low, Operator::kNoProperties, 1, 0, 1) \ V(I16x8GeS, Operator::kNoProperties, 2, 0, 1) \
V(I16x8UConvertI8x16High, Operator::kNoProperties, 1, 0, 1) \ V(I16x8UConvertI8x16Low, Operator::kNoProperties, 1, 0, 1) \
V(I16x8ShrU, Operator::kNoProperties, 2, 0, 1) \ V(I16x8UConvertI8x16High, Operator::kNoProperties, 1, 0, 1) \
V(I16x8UConvertI32x4, Operator::kNoProperties, 2, 0, 1) \ V(I16x8ShrU, Operator::kNoProperties, 2, 0, 1) \
V(I16x8AddSaturateU, Operator::kCommutative, 2, 0, 1) \ V(I16x8UConvertI32x4, Operator::kNoProperties, 2, 0, 1) \
V(I16x8SubSaturateU, Operator::kNoProperties, 2, 0, 1) \ V(I16x8AddSaturateU, Operator::kCommutative, 2, 0, 1) \
V(I16x8MinU, Operator::kCommutative, 2, 0, 1) \ V(I16x8SubSaturateU, Operator::kNoProperties, 2, 0, 1) \
V(I16x8MaxU, Operator::kCommutative, 2, 0, 1) \ V(I16x8MinU, Operator::kCommutative, 2, 0, 1) \
V(I16x8GtU, Operator::kNoProperties, 2, 0, 1) \ V(I16x8MaxU, Operator::kCommutative, 2, 0, 1) \
V(I16x8GeU, Operator::kNoProperties, 2, 0, 1) \ V(I16x8GtU, Operator::kNoProperties, 2, 0, 1) \
V(I8x16Splat, Operator::kNoProperties, 1, 0, 1) \ V(I16x8GeU, Operator::kNoProperties, 2, 0, 1) \
V(I8x16Neg, Operator::kNoProperties, 1, 0, 1) \ V(I8x16Splat, Operator::kNoProperties, 1, 0, 1) \
V(I8x16Shl, Operator::kNoProperties, 2, 0, 1) \ V(I8x16Neg, Operator::kNoProperties, 1, 0, 1) \
V(I8x16ShrS, Operator::kNoProperties, 2, 0, 1) \ V(I8x16Shl, Operator::kNoProperties, 2, 0, 1) \
V(I8x16SConvertI16x8, Operator::kNoProperties, 2, 0, 1) \ V(I8x16ShrS, Operator::kNoProperties, 2, 0, 1) \
V(I8x16Add, Operator::kCommutative, 2, 0, 1) \ V(I8x16SConvertI16x8, Operator::kNoProperties, 2, 0, 1) \
V(I8x16AddSaturateS, Operator::kCommutative, 2, 0, 1) \ V(I8x16Add, Operator::kCommutative, 2, 0, 1) \
V(I8x16Sub, Operator::kNoProperties, 2, 0, 1) \ V(I8x16AddSaturateS, Operator::kCommutative, 2, 0, 1) \
V(I8x16SubSaturateS, Operator::kNoProperties, 2, 0, 1) \ V(I8x16Sub, Operator::kNoProperties, 2, 0, 1) \
V(I8x16Mul, Operator::kCommutative, 2, 0, 1) \ V(I8x16SubSaturateS, Operator::kNoProperties, 2, 0, 1) \
V(I8x16MinS, Operator::kCommutative, 2, 0, 1) \ V(I8x16Mul, Operator::kCommutative, 2, 0, 1) \
V(I8x16MaxS, Operator::kCommutative, 2, 0, 1) \ V(I8x16MinS, Operator::kCommutative, 2, 0, 1) \
V(I8x16Eq, Operator::kCommutative, 2, 0, 1) \ V(I8x16MaxS, Operator::kCommutative, 2, 0, 1) \
V(I8x16Ne, Operator::kCommutative, 2, 0, 1) \ V(I8x16Eq, Operator::kCommutative, 2, 0, 1) \
V(I8x16GtS, Operator::kNoProperties, 2, 0, 1) \ V(I8x16Ne, Operator::kCommutative, 2, 0, 1) \
V(I8x16GeS, Operator::kNoProperties, 2, 0, 1) \ V(I8x16GtS, Operator::kNoProperties, 2, 0, 1) \
V(I8x16ShrU, Operator::kNoProperties, 2, 0, 1) \ V(I8x16GeS, Operator::kNoProperties, 2, 0, 1) \
V(I8x16UConvertI16x8, Operator::kNoProperties, 2, 0, 1) \ V(I8x16ShrU, Operator::kNoProperties, 2, 0, 1) \
V(I8x16AddSaturateU, Operator::kCommutative, 2, 0, 1) \ V(I8x16UConvertI16x8, Operator::kNoProperties, 2, 0, 1) \
V(I8x16SubSaturateU, Operator::kNoProperties, 2, 0, 1) \ V(I8x16AddSaturateU, Operator::kCommutative, 2, 0, 1) \
V(I8x16MinU, Operator::kCommutative, 2, 0, 1) \ V(I8x16SubSaturateU, Operator::kNoProperties, 2, 0, 1) \
V(I8x16MaxU, Operator::kCommutative, 2, 0, 1) \ V(I8x16MinU, Operator::kCommutative, 2, 0, 1) \
V(I8x16GtU, Operator::kNoProperties, 2, 0, 1) \ V(I8x16MaxU, Operator::kCommutative, 2, 0, 1) \
V(I8x16GeU, Operator::kNoProperties, 2, 0, 1) \ V(I8x16GtU, Operator::kNoProperties, 2, 0, 1) \
V(S128Load, Operator::kNoProperties, 2, 0, 1) \ V(I8x16GeU, Operator::kNoProperties, 2, 0, 1) \
V(S128Store, Operator::kNoProperties, 3, 0, 1) \ V(S128Load, Operator::kNoProperties, 2, 0, 1) \
V(S128Zero, Operator::kNoProperties, 0, 0, 1) \ V(S128Store, Operator::kNoProperties, 3, 0, 1) \
V(S128And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ V(S128Zero, Operator::kNoProperties, 0, 0, 1) \
V(S128Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ V(S128And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
V(S128Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ V(S128Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
V(S128Not, Operator::kNoProperties, 1, 0, 1) \ V(S128Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
V(S128Select, Operator::kNoProperties, 3, 0, 1) \ V(S128Not, Operator::kNoProperties, 1, 0, 1) \
V(S1x2AnyTrue, Operator::kNoProperties, 1, 0, 1) \ V(S128Select, Operator::kNoProperties, 3, 0, 1) \
V(S1x2AllTrue, Operator::kNoProperties, 1, 0, 1) \ V(S1x2AnyTrue, Operator::kNoProperties, 1, 0, 1) \
V(S1x4AnyTrue, Operator::kNoProperties, 1, 0, 1) \ V(S1x2AllTrue, Operator::kNoProperties, 1, 0, 1) \
V(S1x4AllTrue, Operator::kNoProperties, 1, 0, 1) \ V(S1x4AnyTrue, Operator::kNoProperties, 1, 0, 1) \
V(S1x8AnyTrue, Operator::kNoProperties, 1, 0, 1) \ V(S1x4AllTrue, Operator::kNoProperties, 1, 0, 1) \
V(S1x8AllTrue, Operator::kNoProperties, 1, 0, 1) \ V(S1x8AnyTrue, Operator::kNoProperties, 1, 0, 1) \
V(S1x16AnyTrue, Operator::kNoProperties, 1, 0, 1) \ V(S1x8AllTrue, Operator::kNoProperties, 1, 0, 1) \
V(S1x16AllTrue, Operator::kNoProperties, 1, 0, 1) \ V(S1x16AnyTrue, Operator::kNoProperties, 1, 0, 1) \
V(S1x16AllTrue, Operator::kNoProperties, 1, 0, 1) \
V(S8x16Swizzle, Operator::kNoProperties, 2, 0, 1) V(S8x16Swizzle, Operator::kNoProperties, 2, 0, 1)
// The format is: // The format is:
......
...@@ -385,6 +385,7 @@ class V8_EXPORT_PRIVATE MachineOperatorBuilder final ...@@ -385,6 +385,7 @@ class V8_EXPORT_PRIVATE MachineOperatorBuilder final
const Operator* TryTruncateFloat32ToUint64(); const Operator* TryTruncateFloat32ToUint64();
const Operator* TryTruncateFloat64ToUint64(); const Operator* TryTruncateFloat64ToUint64();
const Operator* ChangeInt32ToFloat64(); const Operator* ChangeInt32ToFloat64();
const Operator* BitcastWord32ToWord64();
const Operator* ChangeInt32ToInt64(); const Operator* ChangeInt32ToInt64();
const Operator* ChangeInt64ToFloat64(); const Operator* ChangeInt64ToFloat64();
const Operator* ChangeUint32ToFloat64(); const Operator* ChangeUint32ToFloat64();
......
...@@ -648,96 +648,97 @@ ...@@ -648,96 +648,97 @@
V(Word64AtomicExchange) \ V(Word64AtomicExchange) \
V(Word64AtomicCompareExchange) V(Word64AtomicCompareExchange)
#define MACHINE_OP_LIST(V) \ #define MACHINE_OP_LIST(V) \
MACHINE_UNOP_32_LIST(V) \ MACHINE_UNOP_32_LIST(V) \
MACHINE_BINOP_32_LIST(V) \ MACHINE_BINOP_32_LIST(V) \
MACHINE_BINOP_64_LIST(V) \ MACHINE_BINOP_64_LIST(V) \
MACHINE_COMPARE_BINOP_LIST(V) \ MACHINE_COMPARE_BINOP_LIST(V) \
MACHINE_FLOAT32_BINOP_LIST(V) \ MACHINE_FLOAT32_BINOP_LIST(V) \
MACHINE_FLOAT32_UNOP_LIST(V) \ MACHINE_FLOAT32_UNOP_LIST(V) \
MACHINE_FLOAT64_BINOP_LIST(V) \ MACHINE_FLOAT64_BINOP_LIST(V) \
MACHINE_FLOAT64_UNOP_LIST(V) \ MACHINE_FLOAT64_UNOP_LIST(V) \
MACHINE_ATOMIC_OP_LIST(V) \ MACHINE_ATOMIC_OP_LIST(V) \
V(AbortCSAAssert) \ V(AbortCSAAssert) \
V(DebugBreak) \ V(DebugBreak) \
V(Comment) \ V(Comment) \
V(Load) \ V(Load) \
V(PoisonedLoad) \ V(PoisonedLoad) \
V(Store) \ V(Store) \
V(StackSlot) \ V(StackSlot) \
V(Word32Popcnt) \ V(Word32Popcnt) \
V(Word64Popcnt) \ V(Word64Popcnt) \
V(Word64Clz) \ V(Word64Clz) \
V(Word64Ctz) \ V(Word64Ctz) \
V(Word64ReverseBits) \ V(Word64ReverseBits) \
V(Word64ReverseBytes) \ V(Word64ReverseBytes) \
V(Simd128ReverseBytes) \ V(Simd128ReverseBytes) \
V(Int64AbsWithOverflow) \ V(Int64AbsWithOverflow) \
V(BitcastTaggedToWord) \ V(BitcastTaggedToWord) \
V(BitcastTaggedToWordForTagAndSmiBits) \ V(BitcastTaggedToWordForTagAndSmiBits) \
V(BitcastWordToTagged) \ V(BitcastWordToTagged) \
V(BitcastWordToTaggedSigned) \ V(BitcastWordToTaggedSigned) \
V(TruncateFloat64ToWord32) \ V(TruncateFloat64ToWord32) \
V(ChangeFloat32ToFloat64) \ V(ChangeFloat32ToFloat64) \
V(ChangeFloat64ToInt32) \ V(ChangeFloat64ToInt32) \
V(ChangeFloat64ToInt64) \ V(ChangeFloat64ToInt64) \
V(ChangeFloat64ToUint32) \ V(ChangeFloat64ToUint32) \
V(ChangeFloat64ToUint64) \ V(ChangeFloat64ToUint64) \
V(Float64SilenceNaN) \ V(Float64SilenceNaN) \
V(TruncateFloat64ToInt64) \ V(TruncateFloat64ToInt64) \
V(TruncateFloat64ToUint32) \ V(TruncateFloat64ToUint32) \
V(TruncateFloat32ToInt32) \ V(TruncateFloat32ToInt32) \
V(TruncateFloat32ToUint32) \ V(TruncateFloat32ToUint32) \
V(TryTruncateFloat32ToInt64) \ V(TryTruncateFloat32ToInt64) \
V(TryTruncateFloat64ToInt64) \ V(TryTruncateFloat64ToInt64) \
V(TryTruncateFloat32ToUint64) \ V(TryTruncateFloat32ToUint64) \
V(TryTruncateFloat64ToUint64) \ V(TryTruncateFloat64ToUint64) \
V(ChangeInt32ToFloat64) \ V(ChangeInt32ToFloat64) \
V(ChangeInt32ToInt64) \ V(BitcastWord32ToWord64) \
V(ChangeInt64ToFloat64) \ V(ChangeInt32ToInt64) \
V(ChangeUint32ToFloat64) \ V(ChangeInt64ToFloat64) \
V(ChangeUint32ToUint64) \ V(ChangeUint32ToFloat64) \
V(ChangeTaggedToCompressed) \ V(ChangeUint32ToUint64) \
V(TruncateFloat64ToFloat32) \ V(ChangeTaggedToCompressed) \
V(TruncateInt64ToInt32) \ V(TruncateFloat64ToFloat32) \
V(RoundFloat64ToInt32) \ V(TruncateInt64ToInt32) \
V(RoundInt32ToFloat32) \ V(RoundFloat64ToInt32) \
V(RoundInt64ToFloat32) \ V(RoundInt32ToFloat32) \
V(RoundInt64ToFloat64) \ V(RoundInt64ToFloat32) \
V(RoundUint32ToFloat32) \ V(RoundInt64ToFloat64) \
V(RoundUint64ToFloat32) \ V(RoundUint32ToFloat32) \
V(RoundUint64ToFloat64) \ V(RoundUint64ToFloat32) \
V(BitcastFloat32ToInt32) \ V(RoundUint64ToFloat64) \
V(BitcastFloat64ToInt64) \ V(BitcastFloat32ToInt32) \
V(BitcastInt32ToFloat32) \ V(BitcastFloat64ToInt64) \
V(BitcastInt64ToFloat64) \ V(BitcastInt32ToFloat32) \
V(Float64ExtractLowWord32) \ V(BitcastInt64ToFloat64) \
V(Float64ExtractHighWord32) \ V(Float64ExtractLowWord32) \
V(Float64InsertLowWord32) \ V(Float64ExtractHighWord32) \
V(Float64InsertHighWord32) \ V(Float64InsertLowWord32) \
V(TaggedPoisonOnSpeculation) \ V(Float64InsertHighWord32) \
V(Word32PoisonOnSpeculation) \ V(TaggedPoisonOnSpeculation) \
V(Word64PoisonOnSpeculation) \ V(Word32PoisonOnSpeculation) \
V(LoadStackCheckOffset) \ V(Word64PoisonOnSpeculation) \
V(LoadFramePointer) \ V(LoadStackCheckOffset) \
V(LoadParentFramePointer) \ V(LoadFramePointer) \
V(UnalignedLoad) \ V(LoadParentFramePointer) \
V(UnalignedStore) \ V(UnalignedLoad) \
V(Int32PairAdd) \ V(UnalignedStore) \
V(Int32PairSub) \ V(Int32PairAdd) \
V(Int32PairMul) \ V(Int32PairSub) \
V(Word32PairShl) \ V(Int32PairMul) \
V(Word32PairShr) \ V(Word32PairShl) \
V(Word32PairSar) \ V(Word32PairShr) \
V(ProtectedLoad) \ V(Word32PairSar) \
V(ProtectedStore) \ V(ProtectedLoad) \
V(MemoryBarrier) \ V(ProtectedStore) \
V(SignExtendWord8ToInt32) \ V(MemoryBarrier) \
V(SignExtendWord16ToInt32) \ V(SignExtendWord8ToInt32) \
V(SignExtendWord8ToInt64) \ V(SignExtendWord16ToInt32) \
V(SignExtendWord16ToInt64) \ V(SignExtendWord8ToInt64) \
V(SignExtendWord32ToInt64) \ V(SignExtendWord16ToInt64) \
V(UnsafePointerAdd) \ V(SignExtendWord32ToInt64) \
V(UnsafePointerAdd) \
V(StackPointerGreaterThan) V(StackPointerGreaterThan)
#define MACHINE_SIMD_OP_LIST(V) \ #define MACHINE_SIMD_OP_LIST(V) \
......
...@@ -1822,6 +1822,7 @@ void Verifier::Visitor::Check(Node* node, const AllNodes& all) { ...@@ -1822,6 +1822,7 @@ void Verifier::Visitor::Check(Node* node, const AllNodes& all) {
case IrOpcode::kBitcastTaggedToWordForTagAndSmiBits: case IrOpcode::kBitcastTaggedToWordForTagAndSmiBits:
case IrOpcode::kBitcastWordToTagged: case IrOpcode::kBitcastWordToTagged:
case IrOpcode::kBitcastWordToTaggedSigned: case IrOpcode::kBitcastWordToTaggedSigned:
case IrOpcode::kBitcastWord32ToWord64:
case IrOpcode::kChangeInt32ToInt64: case IrOpcode::kChangeInt32ToInt64:
case IrOpcode::kChangeUint32ToUint64: case IrOpcode::kChangeUint32ToUint64:
case IrOpcode::kChangeTaggedToCompressed: case IrOpcode::kChangeTaggedToCompressed:
......
...@@ -195,13 +195,12 @@ TEST_F(DecompressionOptimizerTest, Word32ShlSmiTag) { ...@@ -195,13 +195,12 @@ TEST_F(DecompressionOptimizerTest, Word32ShlSmiTag) {
// Create the graph. // Create the graph.
Node* load = graph()->NewNode(machine()->Load(MachineType::AnyTagged()), Node* load = graph()->NewNode(machine()->Load(MachineType::AnyTagged()),
object, index, effect, control); object, index, effect, control);
Node* truncation = graph()->NewNode(machine()->TruncateInt64ToInt32(), load);
Node* smi_shift_bits = Node* smi_shift_bits =
graph()->NewNode(common()->Int32Constant(kSmiShiftSize + kSmiTagSize)); graph()->NewNode(common()->Int32Constant(kSmiShiftSize + kSmiTagSize));
Node* word32_shl = Node* word32_shl =
graph()->NewNode(machine()->Word32Shl(), truncation, smi_shift_bits); graph()->NewNode(machine()->Word32Shl(), load, smi_shift_bits);
graph()->SetEnd( graph()->SetEnd(
graph()->NewNode(machine()->ChangeInt32ToInt64(), word32_shl)); graph()->NewNode(machine()->BitcastWord32ToWord64(), word32_shl));
// Change the nodes, and test the change. // Change the nodes, and test the change.
Reduce(); Reduce();
EXPECT_EQ(LoadMachRep(load), CompressedMachRep(MachineType::AnyTagged())); EXPECT_EQ(LoadMachRep(load), CompressedMachRep(MachineType::AnyTagged()));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment