Index: src/wasm/ast-decoder.cc |
diff --git a/src/wasm/ast-decoder.cc b/src/wasm/ast-decoder.cc |
index 025ccdf1d7bfc0d2c159e511600b0d313cf0fa9b..a9282841d6b8716d1b55e8f7a5cd43ffef55735b 100644 |
--- a/src/wasm/ast-decoder.cc |
+++ b/src/wasm/ast-decoder.cc |
@@ -241,7 +241,8 @@ class WasmDecoder : public Decoder { |
} |
unsigned OpcodeLength(const byte* pc) { |
- switch (static_cast<WasmOpcode>(*pc)) { |
+ WasmOpcode opcode = ExtractWasmOpcode(pc); |
titzer
2016/10/12 19:06:55
Could you do the trick in the main decoder loop of
aseemgarg
2016/10/17 19:01:44
Done. Actually seems like we don't need this at al
titzer
2016/10/19 18:31:49
No, you do, since we still want to be able to iter
aseemgarg
2016/10/19 23:37:33
Done.
|
+ switch (opcode) { |
#define DECLARE_OPCODE_CASE(name, opcode, sig) case kExpr##name: |
FOREACH_LOAD_MEM_OPCODE(DECLARE_OPCODE_CASE) |
FOREACH_STORE_MEM_OPCODE(DECLARE_OPCODE_CASE) |
@@ -308,6 +309,15 @@ class WasmDecoder : public Decoder { |
return 1; |
} |
} |
+ |
+ private: |
+ WasmOpcode ExtractWasmOpcode(const byte* pc) { |
+ WasmOpcode opcode = static_cast<WasmOpcode>(*pc); |
+ if (opcode == kSimdPrefix) { |
+ opcode = static_cast<WasmOpcode>((opcode << 8) | *(pc + 1)); |
+ } |
+ return opcode; |
+ } |
}; |
static const int32_t kNullCatch = -1; |
@@ -1248,18 +1258,28 @@ class WasmFullDecoder : public WasmDecoder { |
return 1 + operand.length; |
} |
+ unsigned ExtractLane(WasmOpcode opcode, LocalType type) { |
titzer
2016/10/12 19:06:55
Please make a LaneOperand class similar to the oth
aseemgarg
2016/10/17 19:01:44
Done.
|
+ unsigned len = 0; |
+ uint8_t lane = this->checked_read_u8(pc_, 2, "lane number"); |
+ if (lane < 0 || lane > 3) { |
+ error(pc_, pc_ + 2, "invalid extract lane value"); |
+ } |
+ TFNode* input = Pop(0, LocalType::kSimd128).node; |
+ TFNode* node = BUILD(SimdExtractLane, opcode, lane, input); |
+ Push(type, node); |
+ len++; |
+ return len; |
+ } |
+ |
unsigned DecodeSimdOpcode(WasmOpcode opcode) { |
unsigned len = 0; |
switch (opcode) { |
case kExprI32x4ExtractLane: { |
- uint8_t lane = this->checked_read_u8(pc_, 2, "lane number"); |
- if (lane < 0 || lane > 3) { |
- error(pc_, pc_ + 2, "invalid extract lane value"); |
- } |
- TFNode* input = Pop(0, LocalType::kSimd128).node; |
- TFNode* node = BUILD(SimdExtractLane, opcode, lane, input); |
- Push(LocalType::kWord32, node); |
- len++; |
+ len = ExtractLane(opcode, LocalType::kWord32); |
+ break; |
+ } |
+ case kExprF32x4ExtractLane: { |
+ len = ExtractLane(opcode, LocalType::kFloat32); |
break; |
} |
default: { |