[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:
parent
d96463a2bf
commit
06d1ffb5c9
@ -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;
|
||||
}
|
||||
|
@ -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());
|
||||
})();
|
||||
|
Loading…
Reference in New Issue
Block a user