[wasm] Compute opcode length for Atomic ops

When atomic operations are used in loops, return the correct opcode length
for loop assignment.

Bug=v8:6842,v8:6532

Change-Id: I306db704d8a0baa5d98c05702360e6dfae11cbfa
Reviewed-on: https://chromium-review.googlesource.com/699561
Reviewed-by: Brad Nelson <bradnelson@chromium.org>
Commit-Queue: Brad Nelson <bradnelson@chromium.org>
Commit-Queue: Deepti Gandluri <gdeepti@chromium.org>
Cr-Commit-Position: refs/heads/master@{#48273}
This commit is contained in:
Deepti Gandluri 2017-10-03 17:23:55 -07:00 committed by Commit Bot
parent d96463a2bf
commit 06d1ffb5c9
2 changed files with 44 additions and 0 deletions

View File

@ -970,6 +970,23 @@ class WasmDecoder : public Decoder {
return 2;
}
}
case kAtomicPrefix: {
byte atomic_index = decoder->read_u8<validate>(pc + 1, "atomic_index");
WasmOpcode opcode =
static_cast<WasmOpcode>(kAtomicPrefix << 8 | atomic_index);
switch (opcode) {
#define DECLARE_OPCODE_CASE(name, opcode, sig) case kExpr##name:
FOREACH_ATOMIC_OPCODE(DECLARE_OPCODE_CASE)
#undef DECLARE_OPCODE_CASE
{
MemoryAccessOperand<validate> operand(decoder, pc + 1, UINT32_MAX);
return 2 + operand.length;
}
default:
decoder->error(pc, "invalid Atomics opcode");
return 2;
}
}
default:
return 1;
}

View File

@ -384,3 +384,30 @@ function TestStore(func, buffer, value, size) {
assertEquals(20, instance.exports.loadStore());
assertTraps(kTrapMemOutOfBounds, instance.exports.storeOob);
})();
(function TestAtomicOpinLoop() {
print("TestAtomicOpinLoop");
var builder = new WasmModuleBuilder();
let memory = new WebAssembly.Memory({
initial: 16, maximum: 128, shared: true});
builder.addImportedMemory("m", "imported_mem", 16, 128, "shared");
builder.addFunction("main", kSig_i_v)
.addBody([
kExprLoop, kWasmStmt,
kExprI32Const, 16,
kExprI32Const, 20,
kAtomicPrefix,
kExprI32AtomicStore, 2, 0,
kExprI32Const, 16,
kAtomicPrefix,
kExprI32AtomicLoad, 2, 0,
kExprReturn,
kExprEnd,
kExprI32Const, 0
])
.exportFunc();
let module = new WebAssembly.Module(builder.toBuffer());
let instance = (new WebAssembly.Instance(module,
{m: {imported_mem: memory}}));
assertEquals(20, instance.exports.main());
})();