[wasm] Implement simd lowering for I16x8
R=bbudge@chromium.org,gdeepti@chromium.org,mtrofin@chromium.org BUG=v8:6020 Review-Url: https://codereview.chromium.org/2843523002 Cr-Commit-Position: refs/heads/master@{#45004}
This commit is contained in:
parent
f79c3b5142
commit
cda2e2dd91
File diff suppressed because it is too large
Load Diff
@ -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);
|
||||
|
||||
|
@ -660,7 +660,7 @@ WASM_EXEC_COMPILED_TEST(I32x4ReplaceLane) {
|
||||
CHECK_EQ(1, r.Call(1, 2));
|
||||
}
|
||||
|
||||
#if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64
|
||||
#if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET
|
||||
WASM_EXEC_COMPILED_TEST(I16x8Splat) {
|
||||
FLAG_wasm_simd_prototype = true;
|
||||
|
||||
@ -723,7 +723,9 @@ WASM_EXEC_COMPILED_TEST(I16x8ReplaceLane) {
|
||||
|
||||
CHECK_EQ(1, r.Call(1, 2));
|
||||
}
|
||||
#endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET
|
||||
|
||||
#if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64
|
||||
WASM_EXEC_COMPILED_TEST(I8x16Splat) {
|
||||
FLAG_wasm_simd_prototype = true;
|
||||
|
||||
@ -1179,7 +1181,7 @@ WASM_EXEC_COMPILED_TEST(I16x8ConvertI32x4) {
|
||||
}
|
||||
#endif // V8_TARGET_ARCH_ARM
|
||||
|
||||
#if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64
|
||||
#if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET
|
||||
void RunI16x8BinOpTest(WasmOpcode simd_op, Int16BinOp expected_op) {
|
||||
FLAG_wasm_simd_prototype = true;
|
||||
WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled);
|
||||
@ -1263,9 +1265,9 @@ WASM_EXEC_COMPILED_TEST(I16x8Eq) { RunI16x8CompareOpTest(kExprI16x8Eq, Equal); }
|
||||
WASM_EXEC_COMPILED_TEST(I16x8Ne) {
|
||||
RunI16x8CompareOpTest(kExprI16x8Ne, NotEqual);
|
||||
}
|
||||
#endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64
|
||||
#endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET
|
||||
|
||||
#if V8_TARGET_ARCH_ARM
|
||||
#if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET
|
||||
WASM_EXEC_COMPILED_TEST(I16x8LtS) {
|
||||
RunI16x8CompareOpTest(kExprI16x8LtS, Less);
|
||||
}
|
||||
@ -1297,9 +1299,9 @@ WASM_EXEC_COMPILED_TEST(I16x8LtU) {
|
||||
WASM_EXEC_COMPILED_TEST(I16x8LeU) {
|
||||
RunI16x8CompareOpTest(kExprI16x8LeU, UnsignedLessEqual);
|
||||
}
|
||||
#endif // V8_TARGET_ARCH_ARM
|
||||
#endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET
|
||||
|
||||
#if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64
|
||||
#if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET
|
||||
void RunI16x8ShiftOpTest(WasmOpcode simd_op, Int16ShiftOp expected_op,
|
||||
int shift) {
|
||||
FLAG_wasm_simd_prototype = true;
|
||||
@ -1326,7 +1328,7 @@ WASM_EXEC_COMPILED_TEST(I16x8ShrS) {
|
||||
WASM_EXEC_COMPILED_TEST(I16x8ShrU) {
|
||||
RunI16x8ShiftOpTest(kExprI16x8ShrU, LogicalShiftRight, 1);
|
||||
}
|
||||
#endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64
|
||||
#endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || SIMD_LOWERING_TARGET
|
||||
|
||||
#if V8_TARGET_ARCH_ARM
|
||||
void RunI8x16UnOpTest(WasmOpcode simd_op, Int8UnOp expected_op) {
|
||||
|
Loading…
Reference in New Issue
Block a user