Commit ff8bbe24 authored by aseemgarg's avatar aseemgarg Committed by Commit bot

[wasm] implement simd lowering for replaceLane, load, store and test for phi

BUG=v8:4124
TEST:test-run-wasm-simd-lowering
R=bradnelson@chromium.org,titzer@chromium.org,mtrofin@chromium.org

Review-Url: https://codereview.chromium.org/2498283002
Cr-Commit-Position: refs/heads/master@{#41443}
parent 2c1fb7a8
This diff is collapsed.
...@@ -31,6 +31,7 @@ class SimdScalarLowering { ...@@ -31,6 +31,7 @@ class SimdScalarLowering {
enum class SimdType : uint8_t { kInt32, kFloat32 }; enum class SimdType : uint8_t { kInt32, kFloat32 };
static const int kMaxLanes = 4; static const int kMaxLanes = 4;
static const int kLaneWidth = 16 / kMaxLanes;
struct Replacement { struct Replacement {
Node* node[kMaxLanes]; Node* node[kMaxLanes];
...@@ -53,6 +54,12 @@ class SimdScalarLowering { ...@@ -53,6 +54,12 @@ class SimdScalarLowering {
SimdType ReplacementType(Node* node); SimdType ReplacementType(Node* node);
void PreparePhiReplacement(Node* phi); void PreparePhiReplacement(Node* phi);
void SetLoweredType(Node* node, Node* output); void SetLoweredType(Node* node, Node* output);
void GetIndexNodes(Node* index, Node** new_indices);
void LowerLoadOp(MachineRepresentation rep, Node* node,
const Operator* load_op);
void LowerStoreOp(MachineRepresentation rep, Node* node,
const Operator* store_op, SimdType rep_type);
void LowerBinaryOp(Node* node, SimdType rep_type, const Operator* op);
struct NodeState { struct NodeState {
Node* node; Node* node;
......
...@@ -3124,9 +3124,6 @@ Node* WasmGraphBuilder::SimdOp(wasm::WasmOpcode opcode, ...@@ -3124,9 +3124,6 @@ Node* WasmGraphBuilder::SimdOp(wasm::WasmOpcode opcode,
case wasm::kExprI32x4Add: case wasm::kExprI32x4Add:
return graph()->NewNode(jsgraph()->machine()->Int32x4Add(), inputs[0], return graph()->NewNode(jsgraph()->machine()->Int32x4Add(), inputs[0],
inputs[1]); inputs[1]);
case wasm::kExprF32x4ExtractLane:
return graph()->NewNode(jsgraph()->machine()->Float32x4ExtractLane(),
inputs[0], inputs[1]);
case wasm::kExprF32x4Splat: case wasm::kExprF32x4Splat:
return graph()->NewNode(jsgraph()->machine()->CreateFloat32x4(), return graph()->NewNode(jsgraph()->machine()->CreateFloat32x4(),
inputs[0], inputs[0], inputs[0], inputs[0]); inputs[0], inputs[0], inputs[0], inputs[0]);
...@@ -3152,6 +3149,20 @@ Node* WasmGraphBuilder::SimdExtractLane(wasm::WasmOpcode opcode, uint8_t lane, ...@@ -3152,6 +3149,20 @@ Node* WasmGraphBuilder::SimdExtractLane(wasm::WasmOpcode opcode, uint8_t lane,
} }
} }
Node* WasmGraphBuilder::SimdReplaceLane(wasm::WasmOpcode opcode, uint8_t lane,
Node* input, Node* replacement) {
switch (opcode) {
case wasm::kExprI32x4ReplaceLane:
return graph()->NewNode(jsgraph()->machine()->Int32x4ReplaceLane(), input,
Int32Constant(lane), replacement);
case wasm::kExprF32x4ReplaceLane:
return graph()->NewNode(jsgraph()->machine()->Float32x4ReplaceLane(),
input, Int32Constant(lane), replacement);
default:
return graph()->NewNode(UnsupportedOpcode(opcode), nullptr);
}
}
static void RecordFunctionCompilation(CodeEventListener::LogEventsAndTags tag, static void RecordFunctionCompilation(CodeEventListener::LogEventsAndTags tag,
Isolate* isolate, Handle<Code> code, Isolate* isolate, Handle<Code> code,
const char* message, uint32_t index, const char* message, uint32_t index,
......
...@@ -218,6 +218,8 @@ class WasmGraphBuilder { ...@@ -218,6 +218,8 @@ class WasmGraphBuilder {
Node* SimdOp(wasm::WasmOpcode opcode, const NodeVector& inputs); Node* SimdOp(wasm::WasmOpcode opcode, const NodeVector& inputs);
Node* SimdExtractLane(wasm::WasmOpcode opcode, uint8_t lane, Node* input); Node* SimdExtractLane(wasm::WasmOpcode opcode, uint8_t lane, Node* input);
Node* SimdReplaceLane(wasm::WasmOpcode opcode, uint8_t lane, Node* input,
Node* replacement);
private: private:
static const int kDefaultBufferSize = 16; static const int kDefaultBufferSize = 16;
......
...@@ -1338,6 +1338,18 @@ class WasmFullDecoder : public WasmDecoder { ...@@ -1338,6 +1338,18 @@ class WasmFullDecoder : public WasmDecoder {
return operand.length; return operand.length;
} }
unsigned ReplaceLane(WasmOpcode opcode, LocalType type) {
LaneOperand operand(this, pc_);
if (Validate(pc_, operand)) {
TFNode* input = Pop(0, LocalType::kSimd128).node;
TFNode* replacement = Pop(1, type).node;
TFNode* node =
BUILD(SimdReplaceLane, opcode, operand.lane, input, replacement);
Push(LocalType::kSimd128, node);
}
return operand.length;
}
unsigned DecodeSimdOpcode(WasmOpcode opcode) { unsigned DecodeSimdOpcode(WasmOpcode opcode) {
unsigned len = 0; unsigned len = 0;
switch (opcode) { switch (opcode) {
...@@ -1349,6 +1361,14 @@ class WasmFullDecoder : public WasmDecoder { ...@@ -1349,6 +1361,14 @@ class WasmFullDecoder : public WasmDecoder {
len = ExtractLane(opcode, LocalType::kFloat32); len = ExtractLane(opcode, LocalType::kFloat32);
break; break;
} }
case kExprI32x4ReplaceLane: {
len = ReplaceLane(opcode, LocalType::kWord32);
break;
}
case kExprF32x4ReplaceLane: {
len = ReplaceLane(opcode, LocalType::kFloat32);
break;
}
default: { default: {
FunctionSig* sig = WasmOpcodes::Signature(opcode); FunctionSig* sig = WasmOpcodes::Signature(opcode);
if (sig != nullptr) { if (sig != nullptr) {
......
...@@ -629,6 +629,10 @@ class LocalDeclEncoder { ...@@ -629,6 +629,10 @@ class LocalDeclEncoder {
#define WASM_SIMD_F32x4_EXTRACT_LANE(lane, x) \ #define WASM_SIMD_F32x4_EXTRACT_LANE(lane, x) \
x, kSimdPrefix, kExprF32x4ExtractLane & 0xff, static_cast<byte>(lane) x, kSimdPrefix, kExprF32x4ExtractLane & 0xff, static_cast<byte>(lane)
#define WASM_SIMD_F32x4_ADD(x, y) x, y, kSimdPrefix, kExprF32x4Add & 0xff #define WASM_SIMD_F32x4_ADD(x, y) x, y, kSimdPrefix, kExprF32x4Add & 0xff
#define WASM_SIMD_I32x4_REPLACE_LANE(lane, x, y) \
y, x, kSimdPrefix, kExprI32x4ReplaceLane & 0xff, static_cast<byte>(lane)
#define WASM_SIMD_F32x4_REPLACE_LANE(lane, x, y) \
y, x, kSimdPrefix, kExprF32x4ReplaceLane & 0xff, static_cast<byte>(lane)
#define SIG_ENTRY_v_v kWasmFunctionTypeForm, 0, 0 #define SIG_ENTRY_v_v kWasmFunctionTypeForm, 0, 0
#define SIZEOF_SIG_ENTRY_v_v 3 #define SIZEOF_SIG_ENTRY_v_v 3
......
...@@ -276,7 +276,6 @@ const WasmCodePosition kNoCodePosition = -1; ...@@ -276,7 +276,6 @@ const WasmCodePosition kNoCodePosition = -1;
#define FOREACH_SIMD_0_OPERAND_OPCODE(V) \ #define FOREACH_SIMD_0_OPERAND_OPCODE(V) \
V(F32x4Splat, 0xe500, s_f) \ V(F32x4Splat, 0xe500, s_f) \
V(F32x4ReplaceLane, 0xe502, s_sif) \
V(F32x4Abs, 0xe503, s_s) \ V(F32x4Abs, 0xe503, s_s) \
V(F32x4Neg, 0xe504, s_s) \ V(F32x4Neg, 0xe504, s_s) \
V(F32x4Sqrt, 0xe505, s_s) \ V(F32x4Sqrt, 0xe505, s_s) \
...@@ -299,7 +298,6 @@ const WasmCodePosition kNoCodePosition = -1; ...@@ -299,7 +298,6 @@ const WasmCodePosition kNoCodePosition = -1;
V(F32x4FromInt32x4, 0xe519, s_s) \ V(F32x4FromInt32x4, 0xe519, s_s) \
V(F32x4FromUint32x4, 0xe51a, s_s) \ V(F32x4FromUint32x4, 0xe51a, s_s) \
V(I32x4Splat, 0xe51b, s_i) \ V(I32x4Splat, 0xe51b, s_i) \
V(I32x4ReplaceLane, 0xe51d, s_sii) \
V(I32x4Neg, 0xe51e, s_s) \ V(I32x4Neg, 0xe51e, s_s) \
V(I32x4Add, 0xe51f, s_ss) \ V(I32x4Add, 0xe51f, s_ss) \
V(I32x4Sub, 0xe520, s_ss) \ V(I32x4Sub, 0xe520, s_ss) \
...@@ -327,7 +325,6 @@ const WasmCodePosition kNoCodePosition = -1; ...@@ -327,7 +325,6 @@ const WasmCodePosition kNoCodePosition = -1;
V(I32x4Ge_u, 0xe536, s_ss) \ V(I32x4Ge_u, 0xe536, s_ss) \
V(Ui32x4FromFloat32x4, 0xe537, s_s) \ V(Ui32x4FromFloat32x4, 0xe537, s_s) \
V(I16x8Splat, 0xe538, s_i) \ V(I16x8Splat, 0xe538, s_i) \
V(I16x8ReplaceLane, 0xe53a, s_sii) \
V(I16x8Neg, 0xe53b, s_s) \ V(I16x8Neg, 0xe53b, s_s) \
V(I16x8Add, 0xe53c, s_ss) \ V(I16x8Add, 0xe53c, s_ss) \
V(I16x8AddSaturate_s, 0xe53d, s_ss) \ V(I16x8AddSaturate_s, 0xe53d, s_ss) \
...@@ -357,7 +354,6 @@ const WasmCodePosition kNoCodePosition = -1; ...@@ -357,7 +354,6 @@ const WasmCodePosition kNoCodePosition = -1;
V(I16x8Gt_u, 0xe555, s_ss) \ V(I16x8Gt_u, 0xe555, s_ss) \
V(I16x8Ge_u, 0xe556, s_ss) \ V(I16x8Ge_u, 0xe556, s_ss) \
V(I8x16Splat, 0xe557, s_i) \ V(I8x16Splat, 0xe557, s_i) \
V(I8x16ReplaceLane, 0xe559, s_sii) \
V(I8x16Neg, 0xe55a, s_s) \ V(I8x16Neg, 0xe55a, s_s) \
V(I8x16Add, 0xe55b, s_ss) \ V(I8x16Add, 0xe55b, s_ss) \
V(I8x16AddSaturate_s, 0xe55c, s_ss) \ V(I8x16AddSaturate_s, 0xe55c, s_ss) \
...@@ -398,7 +394,11 @@ const WasmCodePosition kNoCodePosition = -1; ...@@ -398,7 +394,11 @@ const WasmCodePosition kNoCodePosition = -1;
V(F32x4ExtractLane, 0xe501, _) \ V(F32x4ExtractLane, 0xe501, _) \
V(I32x4ExtractLane, 0xe51c, _) \ V(I32x4ExtractLane, 0xe51c, _) \
V(I16x8ExtractLane, 0xe539, _) \ V(I16x8ExtractLane, 0xe539, _) \
V(I8x16ExtractLane, 0xe558, _) V(I8x16ExtractLane, 0xe558, _) \
V(F32x4ReplaceLane, 0xe502, _) \
V(I32x4ReplaceLane, 0xe51d, _) \
V(I16x8ReplaceLane, 0xe53a, _) \
V(I8x16ReplaceLane, 0xe559, _)
#define FOREACH_ATOMIC_OPCODE(V) \ #define FOREACH_ATOMIC_OPCODE(V) \
V(I32AtomicAdd8S, 0xe601, i_ii) \ V(I32AtomicAdd8S, 0xe601, i_ii) \
......
...@@ -791,15 +791,17 @@ class WasmRunner { ...@@ -791,15 +791,17 @@ class WasmRunner {
}; };
// A macro to define tests that run in different engine configurations. // A macro to define tests that run in different engine configurations.
// Currently only supports compiled tests, but a future
// RunWasmInterpreted_##name version will allow each test to also run in the
// interpreter.
#define WASM_EXEC_TEST(name) \ #define WASM_EXEC_TEST(name) \
void RunWasm_##name(WasmExecutionMode execution_mode); \ void RunWasm_##name(WasmExecutionMode execution_mode); \
TEST(RunWasmCompiled_##name) { RunWasm_##name(kExecuteCompiled); } \ TEST(RunWasmCompiled_##name) { RunWasm_##name(kExecuteCompiled); } \
TEST(RunWasmInterpreted_##name) { RunWasm_##name(kExecuteInterpreted); } \ TEST(RunWasmInterpreted_##name) { RunWasm_##name(kExecuteInterpreted); } \
void RunWasm_##name(WasmExecutionMode execution_mode) void RunWasm_##name(WasmExecutionMode execution_mode)
#define WASM_EXEC_COMPILED_TEST(name) \
void RunWasm_##name(WasmExecutionMode execution_mode); \
TEST(RunWasmCompiled_##name) { RunWasm_##name(kExecuteCompiled); } \
void RunWasm_##name(WasmExecutionMode execution_mode)
} // namespace } // namespace
#endif #endif
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