Commit b7ec33b4 authored by Yu Yin's avatar Yu Yin Committed by Commit Bot

[mips][wasm-c-api] Fix unaligned store.

when wasm have multiple returns but not aligned such as return
{kWasmI32, kWasmI64, kWasmI64, kWasmI32 } like
test/wasm-api-tests/multi-return.cc do, wasm compiler will generate
store instructions but not unaligned store instructions to store the
return values, this will cause check failed on mips simulator, the
test maybe will successful on mips native machine if the host kernel
can handle the unaligend stores.

This patch also fix the return address offset.

Change-Id: I7de93fdbef3341e7d0057f6ecbc95a9d2f86c943
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1824309
Commit-Queue: Clemens Backes [né Hammacher] <clemensh@chromium.org>
Reviewed-by: 's avatarClemens Backes [né Hammacher] <clemensh@chromium.org>
Reviewed-by: 's avatarJakob Kummerow <jkummerow@chromium.org>
Cr-Commit-Position: refs/heads/master@{#63963}
parent db90b8d6
......@@ -782,7 +782,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
Label start_call;
bool isWasmCapiFunction =
linkage()->GetIncomingDescriptor()->IsWasmCapiFunction();
int offset = 48;
// from start_call to return address.
int offset = 40;
#if V8_HOST_ARCH_MIPS
if (__ emit_debug_code()) {
offset += 16;
......@@ -794,7 +795,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ bind(&start_call);
__ nal();
__ nop();
__ Addu(ra, ra, offset);
__ Addu(ra, ra, offset - 8); // 8 = nop + nal
__ sw(ra, MemOperand(fp, WasmExitFrameConstants::kCallingPCOffset));
__ mov(ra, kScratchReg);
}
......
......@@ -760,6 +760,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
Label start_call;
bool isWasmCapiFunction =
linkage()->GetIncomingDescriptor()->IsWasmCapiFunction();
// from start_call to return address.
int offset = 48;
#if V8_HOST_ARCH_MIPS64
if (__ emit_debug_code()) {
......@@ -772,7 +773,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ bind(&start_call);
__ nal();
__ nop();
__ Daddu(ra, ra, offset);
__ Daddu(ra, ra, offset - 8); // 8 = nop + nal
__ sd(ra, MemOperand(fp, WasmExitFrameConstants::kCallingPCOffset));
__ mov(ra, kScratchReg);
}
......
......@@ -6206,14 +6206,12 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
pos = 0;
offset = 0;
for (wasm::ValueType type : sig_->returns()) {
StoreRepresentation store_rep(
wasm::ValueTypes::MachineRepresentationFor(type), kNoWriteBarrier);
Node* value = sig_->return_count() == 1
? call
: graph()->NewNode(mcgraph()->common()->Projection(pos),
call, Control());
SetEffect(graph()->NewNode(mcgraph()->machine()->Store(store_rep),
arg_buffer, Int32Constant(offset), value,
SetEffect(graph()->NewNode(GetSafeStoreOperator(offset, type), arg_buffer,
Int32Constant(offset), value,
Effect(), Control()));
offset += wasm::ValueTypes::ElementSizeInBytes(type);
pos++;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment