d8bb229df0
As discussed offline, the current implementation implement each situation separately. I think we can simplify the code a lot by sharing code between the different paths. This CL does that by 1) implementing the kI64Store case separately, because it does not have all the register contraints that the others have, and 2) moving all logic to ensure that the {src} register is usable before the switch, such that it's shared by all the compare-exchange cases. As a side produce, this also fixes issue 1045225, because for i64 stores which actually only use the lower half of {src}, only that half will be pinned. R=ahaas@chromium.org Bug: chromium:1045225, v8:10108 Change-Id: I0be025b9706d563835ae6337d45b88e0233eacad Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2029414 Reviewed-by: Andreas Haas <ahaas@chromium.org> Commit-Queue: Clemens Backes <clemensb@chromium.org> Cr-Commit-Position: refs/heads/master@{#66062}
29 lines
838 B
JavaScript
29 lines
838 B
JavaScript
// Copyright 2020 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// Flags: --wasm-staging
|
|
|
|
load('test/mjsunit/wasm/wasm-module-builder.js');
|
|
|
|
(function() {
|
|
const builder = new WasmModuleBuilder();
|
|
builder.addMemory(16, 32, false, true);
|
|
builder.addType(makeSig([kWasmI32, kWasmI32, kWasmI32], [kWasmI32]));
|
|
// Generate function 1 (out of 1).
|
|
builder.addFunction(undefined, 0 /* sig */)
|
|
.addBodyWithEnd([
|
|
// signature: i_iii
|
|
// body:
|
|
kExprI32Const, 0x80, 0x01,
|
|
kExprI32Clz,
|
|
kExprI32Const, 0x00,
|
|
kExprI64Const, 0x00,
|
|
kAtomicPrefix, kExprI64AtomicStore8U, 0x00, 0x00,
|
|
kExprEnd, // @13
|
|
]);
|
|
builder.addExport('main', 0);
|
|
const instance = builder.instantiate();
|
|
print(instance.exports.main(1, 2, 3));
|
|
})();
|