diff --git a/src/compiler/machine-operator.cc b/src/compiler/machine-operator.cc index 6a506d26ad..d721042202 100644 --- a/src/compiler/machine-operator.cc +++ b/src/compiler/machine-operator.cc @@ -202,7 +202,191 @@ MachineRepresentation StackSlotRepresentationOf(Operator const* op) { V(Int32PairMul, Operator::kNoProperties, 4, 0, 2) \ V(Word32PairShl, Operator::kNoProperties, 3, 0, 2) \ V(Word32PairShr, Operator::kNoProperties, 3, 0, 2) \ - V(Word32PairSar, Operator::kNoProperties, 3, 0, 2) + V(Word32PairSar, Operator::kNoProperties, 3, 0, 2) \ + V(CreateFloat32x4, Operator::kNoProperties, 4, 0, 1) \ + V(Float32x4ExtractLane, Operator::kNoProperties, 2, 0, 1) \ + V(Float32x4ReplaceLane, Operator::kNoProperties, 3, 0, 1) \ + V(Float32x4Abs, Operator::kNoProperties, 1, 0, 1) \ + V(Float32x4Neg, Operator::kNoProperties, 1, 0, 1) \ + V(Float32x4Sqrt, Operator::kNoProperties, 1, 0, 1) \ + V(Float32x4RecipApprox, Operator::kNoProperties, 1, 0, 1) \ + V(Float32x4RecipSqrtApprox, Operator::kNoProperties, 1, 0, 1) \ + V(Float32x4Add, Operator::kCommutative, 2, 0, 1) \ + V(Float32x4Sub, Operator::kNoProperties, 2, 0, 1) \ + V(Float32x4Mul, Operator::kCommutative, 2, 0, 1) \ + V(Float32x4Div, Operator::kNoProperties, 2, 0, 1) \ + V(Float32x4Min, Operator::kCommutative, 2, 0, 1) \ + V(Float32x4Max, Operator::kCommutative, 2, 0, 1) \ + V(Float32x4MinNum, Operator::kCommutative, 2, 0, 1) \ + V(Float32x4MaxNum, Operator::kCommutative, 2, 0, 1) \ + V(Float32x4Equal, Operator::kCommutative, 2, 0, 1) \ + V(Float32x4NotEqual, Operator::kCommutative, 2, 0, 1) \ + V(Float32x4LessThan, Operator::kNoProperties, 2, 0, 1) \ + V(Float32x4LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ + V(Float32x4GreaterThan, Operator::kNoProperties, 2, 0, 1) \ + V(Float32x4GreaterThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ + V(Float32x4Select, Operator::kNoProperties, 3, 0, 1) \ + V(Float32x4Swizzle, Operator::kNoProperties, 5, 0, 1) \ + V(Float32x4Shuffle, Operator::kNoProperties, 6, 0, 1) \ + V(Float32x4FromInt32x4, Operator::kNoProperties, 1, 0, 1) \ + V(Float32x4FromUint32x4, Operator::kNoProperties, 1, 0, 1) \ + V(Float32x4Load1, Operator::kNoProperties, 2, 0, 1) \ + V(Float32x4Load2, Operator::kNoProperties, 2, 0, 1) \ + V(Float32x4Load3, Operator::kNoProperties, 2, 0, 1) \ + V(Float32x4Store1, Operator::kNoProperties, 3, 0, 1) \ + V(Float32x4Store2, Operator::kNoProperties, 3, 0, 1) \ + V(Float32x4Store3, Operator::kNoProperties, 3, 0, 1) \ + V(CreateInt32x4, Operator::kNoProperties, 4, 0, 1) \ + V(Int32x4ExtractLane, Operator::kNoProperties, 2, 0, 1) \ + V(Int32x4ReplaceLane, Operator::kNoProperties, 3, 0, 1) \ + V(Int32x4Neg, Operator::kNoProperties, 1, 0, 1) \ + V(Int32x4Add, Operator::kCommutative, 2, 0, 1) \ + V(Int32x4Sub, Operator::kNoProperties, 2, 0, 1) \ + V(Int32x4Mul, Operator::kCommutative, 2, 0, 1) \ + V(Int32x4Min, Operator::kCommutative, 2, 0, 1) \ + V(Int32x4Max, Operator::kCommutative, 2, 0, 1) \ + V(Int32x4And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Int32x4Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Int32x4Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Int32x4Not, Operator::kNoProperties, 1, 0, 1) \ + V(Int32x4ShiftLeftByScalar, Operator::kNoProperties, 2, 0, 1) \ + V(Int32x4ShiftRightByScalar, Operator::kNoProperties, 2, 0, 1) \ + V(Int32x4Equal, Operator::kCommutative, 2, 0, 1) \ + V(Int32x4NotEqual, Operator::kCommutative, 2, 0, 1) \ + V(Int32x4LessThan, Operator::kNoProperties, 2, 0, 1) \ + V(Int32x4LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ + V(Int32x4GreaterThan, Operator::kNoProperties, 2, 0, 1) \ + V(Int32x4GreaterThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ + V(Int32x4Select, Operator::kNoProperties, 3, 0, 1) \ + V(Int32x4Swizzle, Operator::kNoProperties, 5, 0, 1) \ + V(Int32x4Shuffle, Operator::kNoProperties, 6, 0, 1) \ + V(Int32x4FromFloat32x4, Operator::kNoProperties, 1, 0, 1) \ + V(Int32x4Load1, Operator::kNoProperties, 2, 0, 1) \ + V(Int32x4Load2, Operator::kNoProperties, 2, 0, 1) \ + V(Int32x4Load3, Operator::kNoProperties, 2, 0, 1) \ + V(Int32x4Store1, Operator::kNoProperties, 3, 0, 1) \ + V(Int32x4Store2, Operator::kNoProperties, 3, 0, 1) \ + V(Int32x4Store3, Operator::kNoProperties, 3, 0, 1) \ + V(Uint32x4Min, Operator::kCommutative, 2, 0, 1) \ + V(Uint32x4Max, Operator::kCommutative, 2, 0, 1) \ + V(Uint32x4ShiftLeftByScalar, Operator::kNoProperties, 2, 0, 1) \ + V(Uint32x4ShiftRightByScalar, Operator::kNoProperties, 2, 0, 1) \ + V(Uint32x4LessThan, Operator::kNoProperties, 2, 0, 1) \ + V(Uint32x4LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ + V(Uint32x4GreaterThan, Operator::kNoProperties, 2, 0, 1) \ + V(Uint32x4GreaterThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ + V(Uint32x4FromFloat32x4, Operator::kNoProperties, 1, 0, 1) \ + V(CreateBool32x4, Operator::kNoProperties, 4, 0, 1) \ + V(Bool32x4ExtractLane, Operator::kNoProperties, 2, 0, 1) \ + V(Bool32x4ReplaceLane, Operator::kNoProperties, 3, 0, 1) \ + V(Bool32x4And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Bool32x4Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Bool32x4Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Bool32x4Not, Operator::kNoProperties, 1, 0, 1) \ + V(Bool32x4AnyTrue, Operator::kNoProperties, 1, 0, 1) \ + V(Bool32x4AllTrue, Operator::kNoProperties, 1, 0, 1) \ + V(Bool32x4Swizzle, Operator::kNoProperties, 5, 0, 1) \ + V(Bool32x4Shuffle, Operator::kNoProperties, 6, 0, 1) \ + V(Bool32x4Equal, Operator::kCommutative, 2, 0, 1) \ + V(Bool32x4NotEqual, Operator::kCommutative, 2, 0, 1) \ + V(CreateInt16x8, Operator::kNoProperties, 8, 0, 1) \ + V(Int16x8ExtractLane, Operator::kNoProperties, 2, 0, 1) \ + V(Int16x8ReplaceLane, Operator::kNoProperties, 3, 0, 1) \ + V(Int16x8Neg, Operator::kNoProperties, 1, 0, 1) \ + V(Int16x8Add, Operator::kCommutative, 2, 0, 1) \ + V(Int16x8AddSaturate, Operator::kCommutative, 2, 0, 1) \ + V(Int16x8Sub, Operator::kNoProperties, 2, 0, 1) \ + V(Int16x8SubSaturate, Operator::kNoProperties, 2, 0, 1) \ + V(Int16x8Mul, Operator::kCommutative, 2, 0, 1) \ + V(Int16x8Min, Operator::kCommutative, 2, 0, 1) \ + V(Int16x8Max, Operator::kCommutative, 2, 0, 1) \ + V(Int16x8And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Int16x8Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Int16x8Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Int16x8Not, Operator::kNoProperties, 1, 0, 1) \ + V(Int16x8ShiftLeftByScalar, Operator::kNoProperties, 2, 0, 1) \ + V(Int16x8ShiftRightByScalar, Operator::kNoProperties, 2, 0, 1) \ + V(Int16x8Equal, Operator::kCommutative, 2, 0, 1) \ + V(Int16x8NotEqual, Operator::kCommutative, 2, 0, 1) \ + V(Int16x8LessThan, Operator::kNoProperties, 2, 0, 1) \ + V(Int16x8LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ + V(Int16x8GreaterThan, Operator::kNoProperties, 2, 0, 1) \ + V(Int16x8GreaterThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ + V(Int16x8Select, Operator::kNoProperties, 3, 0, 1) \ + V(Int16x8Swizzle, Operator::kNoProperties, 9, 0, 1) \ + V(Int16x8Shuffle, Operator::kNoProperties, 10, 0, 1) \ + V(Uint16x8AddSaturate, Operator::kCommutative, 2, 0, 1) \ + V(Uint16x8SubSaturate, Operator::kNoProperties, 2, 0, 1) \ + V(Uint16x8Min, Operator::kCommutative, 2, 0, 1) \ + V(Uint16x8Max, Operator::kCommutative, 2, 0, 1) \ + V(Uint16x8ShiftLeftByScalar, Operator::kNoProperties, 2, 0, 1) \ + V(Uint16x8ShiftRightByScalar, Operator::kNoProperties, 2, 0, 1) \ + V(Uint16x8LessThan, Operator::kNoProperties, 2, 0, 1) \ + V(Uint16x8LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ + V(Uint16x8GreaterThan, Operator::kNoProperties, 2, 0, 1) \ + V(Uint16x8GreaterThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ + V(CreateBool16x8, Operator::kNoProperties, 8, 0, 1) \ + V(Bool16x8ExtractLane, Operator::kNoProperties, 2, 0, 1) \ + V(Bool16x8ReplaceLane, Operator::kNoProperties, 3, 0, 1) \ + V(Bool16x8And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Bool16x8Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Bool16x8Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Bool16x8Not, Operator::kNoProperties, 1, 0, 1) \ + V(Bool16x8AnyTrue, Operator::kNoProperties, 1, 0, 1) \ + V(Bool16x8AllTrue, Operator::kNoProperties, 1, 0, 1) \ + V(Bool16x8Swizzle, Operator::kNoProperties, 9, 0, 1) \ + V(Bool16x8Shuffle, Operator::kNoProperties, 10, 0, 1) \ + V(Bool16x8Equal, Operator::kCommutative, 2, 0, 1) \ + V(Bool16x8NotEqual, Operator::kCommutative, 2, 0, 1) \ + V(CreateInt8x16, Operator::kNoProperties, 16, 0, 1) \ + V(Int8x16ExtractLane, Operator::kNoProperties, 2, 0, 1) \ + V(Int8x16ReplaceLane, Operator::kNoProperties, 3, 0, 1) \ + V(Int8x16Neg, Operator::kNoProperties, 1, 0, 1) \ + V(Int8x16Add, Operator::kCommutative, 2, 0, 1) \ + V(Int8x16AddSaturate, Operator::kCommutative, 2, 0, 1) \ + V(Int8x16Sub, Operator::kNoProperties, 2, 0, 1) \ + V(Int8x16SubSaturate, Operator::kNoProperties, 2, 0, 1) \ + V(Int8x16Mul, Operator::kCommutative, 2, 0, 1) \ + V(Int8x16Min, Operator::kCommutative, 2, 0, 1) \ + V(Int8x16Max, Operator::kCommutative, 2, 0, 1) \ + V(Int8x16And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Int8x16Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Int8x16Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Int8x16Not, Operator::kNoProperties, 1, 0, 1) \ + V(Int8x16ShiftLeftByScalar, Operator::kNoProperties, 2, 0, 1) \ + V(Int8x16ShiftRightByScalar, Operator::kNoProperties, 2, 0, 1) \ + V(Int8x16Equal, Operator::kCommutative, 2, 0, 1) \ + V(Int8x16NotEqual, Operator::kCommutative, 2, 0, 1) \ + V(Int8x16LessThan, Operator::kNoProperties, 2, 0, 1) \ + V(Int8x16LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ + V(Int8x16GreaterThan, Operator::kNoProperties, 2, 0, 1) \ + V(Int8x16GreaterThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ + V(Int8x16Select, Operator::kNoProperties, 3, 0, 1) \ + V(Int8x16Swizzle, Operator::kNoProperties, 17, 0, 1) \ + V(Int8x16Shuffle, Operator::kNoProperties, 18, 0, 1) \ + V(Uint8x16AddSaturate, Operator::kCommutative, 2, 0, 1) \ + V(Uint8x16SubSaturate, Operator::kNoProperties, 2, 0, 1) \ + V(Uint8x16Min, Operator::kCommutative, 2, 0, 1) \ + V(Uint8x16Max, Operator::kCommutative, 2, 0, 1) \ + V(Uint8x16ShiftLeftByScalar, Operator::kNoProperties, 2, 0, 1) \ + V(Uint8x16ShiftRightByScalar, Operator::kNoProperties, 2, 0, 1) \ + V(Uint8x16LessThan, Operator::kNoProperties, 2, 0, 1) \ + V(Uint8x16LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ + V(Uint8x16GreaterThan, Operator::kNoProperties, 2, 0, 1) \ + V(Uint8x16GreaterThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ + V(CreateBool8x16, Operator::kNoProperties, 16, 0, 1) \ + V(Bool8x16ExtractLane, Operator::kNoProperties, 2, 0, 1) \ + V(Bool8x16ReplaceLane, Operator::kNoProperties, 3, 0, 1) \ + V(Bool8x16And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Bool8x16Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Bool8x16Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ + V(Bool8x16Not, Operator::kNoProperties, 1, 0, 1) \ + V(Bool8x16AnyTrue, Operator::kNoProperties, 1, 0, 1) \ + V(Bool8x16AllTrue, Operator::kNoProperties, 1, 0, 1) \ + V(Bool8x16Swizzle, Operator::kNoProperties, 17, 0, 1) \ + V(Bool8x16Shuffle, Operator::kNoProperties, 18, 0, 1) \ + V(Bool8x16Equal, Operator::kCommutative, 2, 0, 1) \ + V(Bool8x16NotEqual, Operator::kCommutative, 2, 0, 1) #define PURE_OPTIONAL_OP_LIST(V) \ V(Word32Ctz, Operator::kNoProperties, 1, 0, 1) \ diff --git a/src/compiler/machine-operator.h b/src/compiler/machine-operator.h index 68e393aadd..6af0d96985 100644 --- a/src/compiler/machine-operator.h +++ b/src/compiler/machine-operator.h @@ -317,6 +317,201 @@ class MachineOperatorBuilder final : public ZoneObject { const Operator* Float64InsertLowWord32(); const Operator* Float64InsertHighWord32(); + // SIMD operators. + const Operator* CreateFloat32x4(); + const Operator* Float32x4ExtractLane(); + const Operator* Float32x4ReplaceLane(); + const Operator* Float32x4Abs(); + const Operator* Float32x4Neg(); + const Operator* Float32x4Sqrt(); + const Operator* Float32x4RecipApprox(); + const Operator* Float32x4RecipSqrtApprox(); + const Operator* Float32x4Add(); + const Operator* Float32x4Sub(); + const Operator* Float32x4Mul(); + const Operator* Float32x4Div(); + const Operator* Float32x4Min(); + const Operator* Float32x4Max(); + const Operator* Float32x4MinNum(); + const Operator* Float32x4MaxNum(); + const Operator* Float32x4Equal(); + const Operator* Float32x4NotEqual(); + const Operator* Float32x4LessThan(); + const Operator* Float32x4LessThanOrEqual(); + const Operator* Float32x4GreaterThan(); + const Operator* Float32x4GreaterThanOrEqual(); + const Operator* Float32x4Select(); + const Operator* Float32x4Swizzle(); + const Operator* Float32x4Shuffle(); + const Operator* Float32x4FromInt32x4(); + const Operator* Float32x4FromUint32x4(); + const Operator* Float32x4Load1(); + const Operator* Float32x4Load2(); + const Operator* Float32x4Load3(); + const Operator* Float32x4Store1(); + const Operator* Float32x4Store2(); + const Operator* Float32x4Store3(); + + const Operator* CreateInt32x4(); + const Operator* Int32x4ExtractLane(); + const Operator* Int32x4ReplaceLane(); + const Operator* Int32x4Neg(); + const Operator* Int32x4Add(); + const Operator* Int32x4Sub(); + const Operator* Int32x4Mul(); + const Operator* Int32x4Min(); + const Operator* Int32x4Max(); + const Operator* Int32x4And(); + const Operator* Int32x4Or(); + const Operator* Int32x4Xor(); + const Operator* Int32x4Not(); + const Operator* Int32x4ShiftLeftByScalar(); + const Operator* Int32x4ShiftRightByScalar(); + const Operator* Int32x4Equal(); + const Operator* Int32x4NotEqual(); + const Operator* Int32x4LessThan(); + const Operator* Int32x4LessThanOrEqual(); + const Operator* Int32x4GreaterThan(); + const Operator* Int32x4GreaterThanOrEqual(); + const Operator* Int32x4Select(); + const Operator* Int32x4Swizzle(); + const Operator* Int32x4Shuffle(); + const Operator* Int32x4FromFloat32x4(); + const Operator* Int32x4Load1(); + const Operator* Int32x4Load2(); + const Operator* Int32x4Load3(); + const Operator* Int32x4Store1(); + const Operator* Int32x4Store2(); + const Operator* Int32x4Store3(); + + const Operator* Uint32x4Min(); + const Operator* Uint32x4Max(); + const Operator* Uint32x4ShiftLeftByScalar(); + const Operator* Uint32x4ShiftRightByScalar(); + const Operator* Uint32x4LessThan(); + const Operator* Uint32x4LessThanOrEqual(); + const Operator* Uint32x4GreaterThan(); + const Operator* Uint32x4GreaterThanOrEqual(); + const Operator* Uint32x4FromFloat32x4(); + + const Operator* CreateBool32x4(); + const Operator* Bool32x4ExtractLane(); + const Operator* Bool32x4ReplaceLane(); + const Operator* Bool32x4And(); + const Operator* Bool32x4Or(); + const Operator* Bool32x4Xor(); + const Operator* Bool32x4Not(); + const Operator* Bool32x4AnyTrue(); + const Operator* Bool32x4AllTrue(); + const Operator* Bool32x4Swizzle(); + const Operator* Bool32x4Shuffle(); + const Operator* Bool32x4Equal(); + const Operator* Bool32x4NotEqual(); + + const Operator* CreateInt16x8(); + const Operator* Int16x8ExtractLane(); + const Operator* Int16x8ReplaceLane(); + const Operator* Int16x8Neg(); + const Operator* Int16x8Add(); + const Operator* Int16x8AddSaturate(); + const Operator* Int16x8Sub(); + const Operator* Int16x8SubSaturate(); + const Operator* Int16x8Mul(); + const Operator* Int16x8Min(); + const Operator* Int16x8Max(); + const Operator* Int16x8And(); + const Operator* Int16x8Or(); + const Operator* Int16x8Xor(); + const Operator* Int16x8Not(); + const Operator* Int16x8ShiftLeftByScalar(); + const Operator* Int16x8ShiftRightByScalar(); + const Operator* Int16x8Equal(); + const Operator* Int16x8NotEqual(); + const Operator* Int16x8LessThan(); + const Operator* Int16x8LessThanOrEqual(); + const Operator* Int16x8GreaterThan(); + const Operator* Int16x8GreaterThanOrEqual(); + const Operator* Int16x8Select(); + const Operator* Int16x8Swizzle(); + const Operator* Int16x8Shuffle(); + + const Operator* Uint16x8AddSaturate(); + const Operator* Uint16x8SubSaturate(); + const Operator* Uint16x8Min(); + const Operator* Uint16x8Max(); + const Operator* Uint16x8ShiftLeftByScalar(); + const Operator* Uint16x8ShiftRightByScalar(); + const Operator* Uint16x8LessThan(); + const Operator* Uint16x8LessThanOrEqual(); + const Operator* Uint16x8GreaterThan(); + const Operator* Uint16x8GreaterThanOrEqual(); + + const Operator* CreateBool16x8(); + const Operator* Bool16x8ExtractLane(); + const Operator* Bool16x8ReplaceLane(); + const Operator* Bool16x8And(); + const Operator* Bool16x8Or(); + const Operator* Bool16x8Xor(); + const Operator* Bool16x8Not(); + const Operator* Bool16x8AnyTrue(); + const Operator* Bool16x8AllTrue(); + const Operator* Bool16x8Swizzle(); + const Operator* Bool16x8Shuffle(); + const Operator* Bool16x8Equal(); + const Operator* Bool16x8NotEqual(); + + const Operator* CreateInt8x16(); + const Operator* Int8x16ExtractLane(); + const Operator* Int8x16ReplaceLane(); + const Operator* Int8x16Neg(); + const Operator* Int8x16Add(); + const Operator* Int8x16AddSaturate(); + const Operator* Int8x16Sub(); + const Operator* Int8x16SubSaturate(); + const Operator* Int8x16Mul(); + const Operator* Int8x16Min(); + const Operator* Int8x16Max(); + const Operator* Int8x16And(); + const Operator* Int8x16Or(); + const Operator* Int8x16Xor(); + const Operator* Int8x16Not(); + const Operator* Int8x16ShiftLeftByScalar(); + const Operator* Int8x16ShiftRightByScalar(); + const Operator* Int8x16Equal(); + const Operator* Int8x16NotEqual(); + const Operator* Int8x16LessThan(); + const Operator* Int8x16LessThanOrEqual(); + const Operator* Int8x16GreaterThan(); + const Operator* Int8x16GreaterThanOrEqual(); + const Operator* Int8x16Select(); + const Operator* Int8x16Swizzle(); + const Operator* Int8x16Shuffle(); + + const Operator* Uint8x16AddSaturate(); + const Operator* Uint8x16SubSaturate(); + const Operator* Uint8x16Min(); + const Operator* Uint8x16Max(); + const Operator* Uint8x16ShiftLeftByScalar(); + const Operator* Uint8x16ShiftRightByScalar(); + const Operator* Uint8x16LessThan(); + const Operator* Uint8x16LessThanOrEqual(); + const Operator* Uint8x16GreaterThan(); + const Operator* Uint8x16GreaterThanOrEqual(); + + const Operator* CreateBool8x16(); + const Operator* Bool8x16ExtractLane(); + const Operator* Bool8x16ReplaceLane(); + const Operator* Bool8x16And(); + const Operator* Bool8x16Or(); + const Operator* Bool8x16Xor(); + const Operator* Bool8x16Not(); + const Operator* Bool8x16AnyTrue(); + const Operator* Bool8x16AllTrue(); + const Operator* Bool8x16Swizzle(); + const Operator* Bool8x16Shuffle(); + const Operator* Bool8x16Equal(); + const Operator* Bool8x16NotEqual(); + // load [base + index] const Operator* Load(LoadRepresentation rep); diff --git a/src/compiler/opcodes.h b/src/compiler/opcodes.h index c8b3671a9e..b725c3acee 100644 --- a/src/compiler/opcodes.h +++ b/src/compiler/opcodes.h @@ -350,10 +350,206 @@ V(Word32PairShr) \ V(Word32PairSar) -#define VALUE_OP_LIST(V) \ - COMMON_OP_LIST(V) \ - SIMPLIFIED_OP_LIST(V) \ - MACHINE_OP_LIST(V) \ +#define MACHINE_SIMD_RETURN_SIMD_OP_LIST(V) \ + V(CreateFloat32x4) \ + V(Float32x4ReplaceLane) \ + V(Float32x4Abs) \ + V(Float32x4Neg) \ + V(Float32x4Sqrt) \ + V(Float32x4RecipApprox) \ + V(Float32x4RecipSqrtApprox) \ + V(Float32x4Add) \ + V(Float32x4Sub) \ + V(Float32x4Mul) \ + V(Float32x4Div) \ + V(Float32x4Min) \ + V(Float32x4Max) \ + V(Float32x4MinNum) \ + V(Float32x4MaxNum) \ + V(Float32x4Equal) \ + V(Float32x4NotEqual) \ + V(Float32x4LessThan) \ + V(Float32x4LessThanOrEqual) \ + V(Float32x4GreaterThan) \ + V(Float32x4GreaterThanOrEqual) \ + V(Float32x4Select) \ + V(Float32x4Swizzle) \ + V(Float32x4Shuffle) \ + V(Float32x4FromInt32x4) \ + V(Float32x4FromUint32x4) \ + V(Float32x4Load1) \ + V(Float32x4Load2) \ + V(Float32x4Load3) \ + V(Float32x4Store1) \ + V(Float32x4Store2) \ + V(Float32x4Store3) \ + V(CreateInt32x4) \ + V(Int32x4ReplaceLane) \ + V(Int32x4Neg) \ + V(Int32x4Add) \ + V(Int32x4Sub) \ + V(Int32x4Mul) \ + V(Int32x4Min) \ + V(Int32x4Max) \ + V(Int32x4And) \ + V(Int32x4Or) \ + V(Int32x4Xor) \ + V(Int32x4Not) \ + V(Int32x4ShiftLeftByScalar) \ + V(Int32x4ShiftRightByScalar) \ + V(Int32x4Equal) \ + V(Int32x4NotEqual) \ + V(Int32x4LessThan) \ + V(Int32x4LessThanOrEqual) \ + V(Int32x4GreaterThan) \ + V(Int32x4GreaterThanOrEqual) \ + V(Int32x4Select) \ + V(Int32x4Swizzle) \ + V(Int32x4Shuffle) \ + V(Int32x4FromFloat32x4) \ + V(Int32x4Load1) \ + V(Int32x4Load2) \ + V(Int32x4Load3) \ + V(Int32x4Store1) \ + V(Int32x4Store2) \ + V(Int32x4Store3) \ + V(Uint32x4Min) \ + V(Uint32x4Max) \ + V(Uint32x4ShiftLeftByScalar) \ + V(Uint32x4ShiftRightByScalar) \ + V(Uint32x4LessThan) \ + V(Uint32x4LessThanOrEqual) \ + V(Uint32x4GreaterThan) \ + V(Uint32x4GreaterThanOrEqual) \ + V(Uint32x4FromFloat32x4) \ + V(CreateBool32x4) \ + V(Bool32x4ReplaceLane) \ + V(Bool32x4And) \ + V(Bool32x4Or) \ + V(Bool32x4Xor) \ + V(Bool32x4Not) \ + V(Bool32x4Swizzle) \ + V(Bool32x4Shuffle) \ + V(Bool32x4Equal) \ + V(Bool32x4NotEqual) \ + V(CreateInt16x8) \ + V(Int16x8ReplaceLane) \ + V(Int16x8Neg) \ + V(Int16x8Add) \ + V(Int16x8AddSaturate) \ + V(Int16x8Sub) \ + V(Int16x8SubSaturate) \ + V(Int16x8Mul) \ + V(Int16x8Min) \ + V(Int16x8Max) \ + V(Int16x8And) \ + V(Int16x8Or) \ + V(Int16x8Xor) \ + V(Int16x8Not) \ + V(Int16x8ShiftLeftByScalar) \ + V(Int16x8ShiftRightByScalar) \ + V(Int16x8Equal) \ + V(Int16x8NotEqual) \ + V(Int16x8LessThan) \ + V(Int16x8LessThanOrEqual) \ + V(Int16x8GreaterThan) \ + V(Int16x8GreaterThanOrEqual) \ + V(Int16x8Select) \ + V(Int16x8Swizzle) \ + V(Int16x8Shuffle) \ + V(Uint16x8AddSaturate) \ + V(Uint16x8SubSaturate) \ + V(Uint16x8Min) \ + V(Uint16x8Max) \ + V(Uint16x8ShiftLeftByScalar) \ + V(Uint16x8ShiftRightByScalar) \ + V(Uint16x8LessThan) \ + V(Uint16x8LessThanOrEqual) \ + V(Uint16x8GreaterThan) \ + V(Uint16x8GreaterThanOrEqual) \ + V(CreateBool16x8) \ + V(Bool16x8ReplaceLane) \ + V(Bool16x8And) \ + V(Bool16x8Or) \ + V(Bool16x8Xor) \ + V(Bool16x8Not) \ + V(Bool16x8Swizzle) \ + V(Bool16x8Shuffle) \ + V(Bool16x8Equal) \ + V(Bool16x8NotEqual) \ + V(CreateInt8x16) \ + V(Int8x16ReplaceLane) \ + V(Int8x16Neg) \ + V(Int8x16Add) \ + V(Int8x16AddSaturate) \ + V(Int8x16Sub) \ + V(Int8x16SubSaturate) \ + V(Int8x16Mul) \ + V(Int8x16Min) \ + V(Int8x16Max) \ + V(Int8x16And) \ + V(Int8x16Or) \ + V(Int8x16Xor) \ + V(Int8x16Not) \ + V(Int8x16ShiftLeftByScalar) \ + V(Int8x16ShiftRightByScalar) \ + V(Int8x16Equal) \ + V(Int8x16NotEqual) \ + V(Int8x16LessThan) \ + V(Int8x16LessThanOrEqual) \ + V(Int8x16GreaterThan) \ + V(Int8x16GreaterThanOrEqual) \ + V(Int8x16Select) \ + V(Int8x16Swizzle) \ + V(Int8x16Shuffle) \ + V(Uint8x16AddSaturate) \ + V(Uint8x16SubSaturate) \ + V(Uint8x16Min) \ + V(Uint8x16Max) \ + V(Uint8x16ShiftLeftByScalar) \ + V(Uint8x16ShiftRightByScalar) \ + V(Uint8x16LessThan) \ + V(Uint8x16LessThanOrEqual) \ + V(Uint8x16GreaterThan) \ + V(Uint8x16GreaterThanOrEqual) \ + V(CreateBool8x16) \ + V(Bool8x16ReplaceLane) \ + V(Bool8x16And) \ + V(Bool8x16Or) \ + V(Bool8x16Xor) \ + V(Bool8x16Not) \ + V(Bool8x16Swizzle) \ + V(Bool8x16Shuffle) \ + V(Bool8x16Equal) \ + V(Bool8x16NotEqual) + +#define MACHINE_SIMD_RETURN_NUM_OP_LIST(V) \ + V(Float32x4ExtractLane) \ + V(Int32x4ExtractLane) \ + V(Int16x8ExtractLane) \ + V(Int8x16ExtractLane) + +#define MACHINE_SIMD_RETURN_BOOL_OP_LIST(V) \ + V(Bool32x4ExtractLane) \ + V(Bool32x4AnyTrue) \ + V(Bool32x4AllTrue) \ + V(Bool16x8ExtractLane) \ + V(Bool16x8AnyTrue) \ + V(Bool16x8AllTrue) \ + V(Bool8x16ExtractLane) \ + V(Bool8x16AnyTrue) \ + V(Bool8x16AllTrue) + +#define MACHINE_SIMD_OP_LIST(V) \ + MACHINE_SIMD_RETURN_SIMD_OP_LIST(V) \ + MACHINE_SIMD_RETURN_NUM_OP_LIST(V) \ + MACHINE_SIMD_RETURN_BOOL_OP_LIST(V) + +#define VALUE_OP_LIST(V) \ + COMMON_OP_LIST(V) \ + SIMPLIFIED_OP_LIST(V) \ + MACHINE_OP_LIST(V) \ + MACHINE_SIMD_OP_LIST(V) \ JS_OP_LIST(V) // The combination of all operators at all levels and the common operators. diff --git a/src/compiler/typer.cc b/src/compiler/typer.cc index 2f784f7af8..ee0b7c1d43 100644 --- a/src/compiler/typer.cc +++ b/src/compiler/typer.cc @@ -97,6 +97,7 @@ class Typer::Visitor : public Reducer { COMMON_OP_LIST(DECLARE_CASE) SIMPLIFIED_OP_LIST(DECLARE_CASE) MACHINE_OP_LIST(DECLARE_CASE) + MACHINE_SIMD_OP_LIST(DECLARE_CASE) JS_SIMPLE_UNOP_LIST(DECLARE_CASE) JS_OBJECT_OP_LIST(DECLARE_CASE) JS_CONTEXT_OP_LIST(DECLARE_CASE) @@ -143,6 +144,7 @@ class Typer::Visitor : public Reducer { COMMON_OP_LIST(DECLARE_CASE) SIMPLIFIED_OP_LIST(DECLARE_CASE) MACHINE_OP_LIST(DECLARE_CASE) + MACHINE_SIMD_OP_LIST(DECLARE_CASE) JS_SIMPLE_UNOP_LIST(DECLARE_CASE) JS_OBJECT_OP_LIST(DECLARE_CASE) JS_CONTEXT_OP_LIST(DECLARE_CASE) @@ -2519,8 +2521,24 @@ Type* Typer::Visitor::TypeWord32PairShr(Node* node) { return Type::Internal(); } Type* Typer::Visitor::TypeWord32PairSar(Node* node) { return Type::Internal(); } -// Heap constants. +// SIMD type methods. +#define SIMD_RETURN_SIMD(Name) \ + Type* Typer::Visitor::Type##Name(Node* node) { return Type::Simd(); } +MACHINE_SIMD_RETURN_SIMD_OP_LIST(SIMD_RETURN_SIMD) +#undef SIMD_RETURN_SIMD + +#define SIMD_RETURN_NUM(Name) \ + Type* Typer::Visitor::Type##Name(Node* node) { return Type::Number(); } +MACHINE_SIMD_RETURN_NUM_OP_LIST(SIMD_RETURN_NUM) +#undef SIMD_RETURN_NUM + +#define SIMD_RETURN_BOOL(Name) \ + Type* Typer::Visitor::Type##Name(Node* node) { return Type::Boolean(); } +MACHINE_SIMD_RETURN_BOOL_OP_LIST(SIMD_RETURN_BOOL) +#undef SIMD_RETURN_BOOL + +// Heap constants. Type* Typer::Visitor::TypeConstant(Handle value) { if (value->IsJSTypedArray()) { diff --git a/src/compiler/verifier.cc b/src/compiler/verifier.cc index 1fe71205da..d6e52609df 100644 --- a/src/compiler/verifier.cc +++ b/src/compiler/verifier.cc @@ -984,6 +984,11 @@ void Verifier::Visitor::Check(Node* node) { case IrOpcode::kLoadParentFramePointer: case IrOpcode::kCheckedLoad: case IrOpcode::kCheckedStore: + +#define SIMD_MACHINE_OP_CASE(Name) case IrOpcode::k##Name: + MACHINE_SIMD_OP_LIST(SIMD_MACHINE_OP_CASE) +#undef SIMD_MACHINE_OP_CASE + // TODO(rossberg): Check. break; }