Index: src/wasm/ast-decoder.cc |
diff --git a/src/wasm/ast-decoder.cc b/src/wasm/ast-decoder.cc |
index facdab62eeecd7c568dc33180daee24dca7e1a88..88e70cbf17e5062a88f18ccb47172e6c12047a17 100644 |
--- a/src/wasm/ast-decoder.cc |
+++ b/src/wasm/ast-decoder.cc |
@@ -1019,6 +1019,15 @@ class WasmFullDecoder : public WasmDecoder { |
len = 1 + operand.length; |
break; |
} |
+ case kSimdPrefix: { |
+ if (FLAG_wasm_simd_prototype) { |
+ len++; |
+ byte simd_index = *(pc_ + 1); |
+ opcode = static_cast<WasmOpcode>(opcode << 8 | simd_index); |
+ DecodeSimdOpcode(opcode); |
+ break; |
+ } |
+ } |
case kExprJITSingleFunction: { |
if (FLAG_wasm_jit_prototype) { |
JITSingleFunctionOperand operand(this, pc_); |
@@ -1139,6 +1148,17 @@ class WasmFullDecoder : public WasmDecoder { |
return 1 + operand.length; |
} |
+ void DecodeSimdOpcode(WasmOpcode opcode) { |
+ FunctionSig* sig = WasmOpcodes::Signature(opcode); |
+ compiler::NodeVector inputs(sig->parameter_count(), zone_); |
+ for (size_t i = sig->parameter_count(); i > 0; i--) { |
+ Value val = Pop(static_cast<int>(i - 1), sig->GetParam(i - 1)); |
+ inputs[i - 1] = val.node; |
+ } |
+ TFNode* node = BUILD(SimdOp, opcode, inputs); |
+ Push(GetReturnType(sig), node); |
+ } |
+ |
void DoReturn() { |
int count = static_cast<int>(sig_->return_count()); |
TFNode** buffer = nullptr; |