| Index: src/compiler/simd-scalar-lowering.h
|
| diff --git a/src/compiler/simd-scalar-lowering.h b/src/compiler/simd-scalar-lowering.h
|
| index 70186fdf11d4283868f8215bbab12e4908428493..3d5e3fc88135d2cd5f0ca0dc1831e9f699d01018 100644
|
| --- a/src/compiler/simd-scalar-lowering.h
|
| +++ b/src/compiler/simd-scalar-lowering.h
|
| @@ -28,14 +28,18 @@ class SimdScalarLowering {
|
| private:
|
| enum class State : uint8_t { kUnvisited, kOnStack, kVisited };
|
|
|
| - enum class SimdType : uint8_t { kInt32, kFloat32, kSimd1x4 };
|
| -
|
| - static const int kMaxLanes = 4;
|
| - static const int kLaneWidth = 16 / kMaxLanes;
|
| + enum class SimdType : uint8_t {
|
| + kFloat32x4,
|
| + kInt32x4,
|
| + kInt16x8,
|
| + kSimd1x4,
|
| + kSimd1x8
|
| + };
|
|
|
| struct Replacement {
|
| - Node* node[kMaxLanes];
|
| - SimdType type; // represents what input type is expected
|
| + Node** node = nullptr;
|
| + SimdType type; // represents output type
|
| + int num_replacements = 0;
|
| };
|
|
|
| struct NodeState {
|
| @@ -52,24 +56,35 @@ class SimdScalarLowering {
|
| void LowerNode(Node* node);
|
| bool DefaultLowering(Node* node);
|
|
|
| - void ReplaceNode(Node* old, Node** new_nodes);
|
| + int NumLanes(SimdType type);
|
| + void ReplaceNode(Node* old, Node** new_nodes, int count);
|
| bool HasReplacement(size_t index, Node* node);
|
| Node** GetReplacements(Node* node);
|
| + int ReplacementCount(Node* node);
|
| + void Float32ToInt32(Node** replacements, Node** result);
|
| + void Int32ToFloat32(Node** replacements, Node** result);
|
| Node** GetReplacementsWithType(Node* node, SimdType type);
|
| SimdType ReplacementType(Node* node);
|
| void PreparePhiReplacement(Node* phi);
|
| void SetLoweredType(Node* node, Node* output);
|
| - void GetIndexNodes(Node* index, Node** new_indices);
|
| + void GetIndexNodes(Node* index, Node** new_indices, SimdType type);
|
| void LowerLoadOp(MachineRepresentation rep, Node* node,
|
| - const Operator* load_op);
|
| + const Operator* load_op, SimdType type);
|
| void LowerStoreOp(MachineRepresentation rep, Node* node,
|
| const Operator* store_op, SimdType rep_type);
|
| void LowerBinaryOp(Node* node, SimdType input_rep_type, const Operator* op,
|
| bool invert_inputs = false);
|
| + Node* FixUpperBits(Node* input, int32_t shift);
|
| + void LowerBinaryOpForSmallInt(Node* node, SimdType input_rep_type,
|
| + const Operator* op);
|
| + Node* Mask(Node* input, int32_t mask);
|
| + void LowerSaturateBinaryOp(Node* node, SimdType input_rep_type,
|
| + const Operator* op, bool is_signed);
|
| void LowerUnaryOp(Node* node, SimdType input_rep_type, const Operator* op);
|
| - void LowerIntMinMax(Node* node, const Operator* op, bool is_max);
|
| + void LowerIntMinMax(Node* node, const Operator* op, bool is_max,
|
| + SimdType type);
|
| void LowerConvertFromFloat(Node* node, bool is_signed);
|
| - void LowerShiftOp(Node* node, const Operator* op);
|
| + void LowerShiftOp(Node* node, SimdType type);
|
| Node* BuildF64Trunc(Node* input);
|
| void LowerNotEqual(Node* node, SimdType input_rep_type, const Operator* op);
|
|
|
|
|