Index: src/wasm/ast-decoder.cc |
diff --git a/src/wasm/ast-decoder.cc b/src/wasm/ast-decoder.cc |
index a869206e5be5f49aa7e95b6cb50bafa0ba67d15c..594ad7af48d44477de7aace1af2100d9bc2efa02 100644 |
--- a/src/wasm/ast-decoder.cc |
+++ b/src/wasm/ast-decoder.cc |
@@ -1331,16 +1331,35 @@ class WasmFullDecoder : public WasmDecoder { |
unsigned ExtractLane(WasmOpcode opcode, LocalType type) { |
LaneOperand operand(this, pc_); |
if (Validate(pc_, operand)) { |
- TFNode* input = Pop(0, LocalType::kSimd128).node; |
- TFNode* node = BUILD(SimdExtractLane, opcode, operand.lane, input); |
+ compiler::NodeVector inputs(2, zone_); |
+ inputs[1] = builder_->Int32Constant(operand.lane); |
+ inputs[0] = Pop(0, LocalType::kSimd128).node; |
+ TFNode* node = BUILD(SimdOp, opcode, inputs); |
Push(type, node); |
} |
return operand.length; |
} |
+ unsigned ReplaceLane(WasmOpcode opcode, LocalType type) { |
+ LaneOperand operand(this, pc_); |
+ if (Validate(pc_, operand)) { |
+ compiler::NodeVector inputs(3, zone_); |
+ inputs[2] = Pop(1, type).node; |
+ inputs[1] = builder_->Int32Constant(operand.lane); |
+ inputs[0] = Pop(0, LocalType::kSimd128).node; |
+ TFNode* node = BUILD(SimdOp, opcode, inputs); |
+ Push(LocalType::kSimd128, node); |
+ } |
+ return operand.length; |
+ } |
+ |
unsigned DecodeSimdOpcode(WasmOpcode opcode) { |
unsigned len = 0; |
switch (opcode) { |
+ case kExprI32x4ReplaceLane: { |
+ len = ReplaceLane(opcode, LocalType::kWord32); |
+ break; |
+ } |
case kExprI32x4ExtractLane: { |
len = ExtractLane(opcode, LocalType::kWord32); |
break; |