cc862e69c9
During a C call, a previous value of the stack pointer is stored in a platform specific callee saved register. Loading the out argument of the C call might overwrite the value in that register, if the destination register collides with the platform specific register. Hence, do first use that register to restore the previous stack pointer, and only then load the out argument. Similarly, when pushing arguments to the stack, do first push all values and then set the platform specific register in order to avoid overwriting an argument value held in that register. Drive-by: Fix offset computations for parameters pushed to the stack for c calls. R=titzer@chromium.org Bug: chromium:820802,chromium:820896,chromium:820807,v8:6600 Change-Id: If4567467b7912454f0bd2cad5927233c98894b03 Reviewed-on: https://chromium-review.googlesource.com/959064 Reviewed-by: Ben Titzer <titzer@chromium.org> Commit-Queue: Clemens Hammacher <clemensh@chromium.org> Cr-Commit-Position: refs/heads/master@{#51916}
22 lines
766 B
JavaScript
22 lines
766 B
JavaScript
// Copyright 2018 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.
|
|
|
|
load('test/mjsunit/wasm/wasm-constants.js');
|
|
load('test/mjsunit/wasm/wasm-module-builder.js');
|
|
|
|
const builder = new WasmModuleBuilder();
|
|
builder.addMemory(16, 32);
|
|
builder.addGlobal(kWasmI32, 0);
|
|
const sig0 = makeSig([kWasmI32, kWasmI32, kWasmI32], [kWasmI32]);
|
|
builder.addFunction(undefined, sig0).addBody([
|
|
kExprI32Const, 1, // i32.const 1
|
|
kExprI32Const, 0, // i32.const 0
|
|
kExprI32Const, 3, // i32.const 3
|
|
kExprI32GeU, // i32.ge_u
|
|
kExprI32Rol, // i32.rol
|
|
]);
|
|
builder.addExport('main', 0);
|
|
const instance = builder.instantiate();
|
|
assertEquals(1, instance.exports.main());
|