From d6e94b0352f431948214c540057c68b8b0abc933 Mon Sep 17 00:00:00 2001 From: Ng Zhi An <zhin@chromium.org> Date: Tue, 5 May 2020 13:57:26 -0700 Subject: [PATCH] [wasm-simd] Fix decoding memarg in interpreter The location of the immediates depend on the opcode length if a s128.load/store was encoded using multiple bytes. Bug: v8:10258 Change-Id: I09de8a37d442c0711de96ba4bb1746ae6732d83e Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2182960 Reviewed-by: Clemens Backes <clemensb@chromium.org> Commit-Queue: Zhi An Ng <zhin@chromium.org> Cr-Commit-Position: refs/heads/master@{#67623} --- src/wasm/wasm-interpreter.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wasm/wasm-interpreter.cc b/src/wasm/wasm-interpreter.cc index e053dfc0a9d..2c319c1f0dc 100644 --- a/src/wasm/wasm-interpreter.cc +++ b/src/wasm/wasm-interpreter.cc @@ -2519,11 +2519,11 @@ class ThreadImpl { case kExprS128LoadMem: return ExecuteLoad<Simd128, Simd128>(decoder, code, pc, len, MachineRepresentation::kSimd128, - /*prefix_len=*/1); + /*prefix_len=*/opcode_length); case kExprS128StoreMem: return ExecuteStore<Simd128, Simd128>(decoder, code, pc, len, MachineRepresentation::kSimd128, - /*prefix_len=*/1); + /*prefix_len=*/opcode_length); #define SHIFT_CASE(op, name, stype, count, expr) \ case kExpr##op: { \ uint32_t shift = Pop().to<uint32_t>(); \ @@ -2795,7 +2795,7 @@ class ThreadImpl { static_assert(sizeof(wide_type) == sizeof(narrow_type) * 2, "size mismatch for wide and narrow types"); if (!ExecuteLoad<uint64_t, uint64_t>(decoder, code, pc, len, rep, - /*prefix_len=*/1)) { + /*prefix_len=*/*len - 1)) { return false; } constexpr int lanes = kSimd128Size / sizeof(wide_type); -- 2.18.1