Skip to content

Commit 59d52e3

Browse files
Milad FaV8 LUCI CQ
authored andcommitted
[liftoff] Fix parameter passing during CallC
Values smaller than 8 bytes need to be sign/zero extended to 8 bytes then pushed on to the stack. Change-Id: I5c9a2179ef2b65cf08b7e773180d78b252c2253f Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/6597365 Commit-Queue: Milad Farazmand <[email protected]> Reviewed-by: Junliang Yan <[email protected]> Cr-Commit-Position: refs/heads/main@{#100578}
1 parent 4ee374d commit 59d52e3

2 files changed

Lines changed: 59 additions & 12 deletions

File tree

src/wasm/baseline/ppc/liftoff-assembler-ppc-inl.h

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2950,14 +2950,38 @@ void LiftoffAssembler::CallC(const std::initializer_list<VarState> args,
29502950
parallel_move.LoadIntoRegister(LiftoffRegister{kCArgRegs[reg_args]}, arg);
29512951
++reg_args;
29522952
} else {
2953-
int bias = 0;
2954-
// On BE machines values with less than 8 bytes are right justified.
2955-
// bias here is relative to the stack pointer.
2956-
if (arg.kind() == kI32 || arg.kind() == kF32) bias = -stack_bias;
29572953
int offset =
29582954
(kStackFrameExtraParamSlot + stack_args) * kSystemPointerSize;
2959-
MemOperand dst{sp, offset + bias};
2960-
liftoff::StoreToMemory(this, dst, arg, r0, ip);
2955+
MemOperand dst{sp, offset};
2956+
Register scratch1 = r0;
2957+
Register scratch2 = ip;
2958+
if (arg.is_reg()) {
2959+
switch (arg.kind()) {
2960+
case kI16:
2961+
extsh(scratch1, arg.reg().gp());
2962+
StoreU64(scratch1, dst);
2963+
break;
2964+
case kI32:
2965+
extsw(scratch1, arg.reg().gp());
2966+
StoreU64(scratch1, dst);
2967+
break;
2968+
case kI64:
2969+
StoreU64(arg.reg().gp(), dst);
2970+
break;
2971+
default:
2972+
UNREACHABLE();
2973+
}
2974+
} else if (arg.is_const()) {
2975+
mov(scratch1, Operand(static_cast<int64_t>(arg.i32_const())));
2976+
StoreU64(scratch1, dst);
2977+
} else if (value_kind_size(arg.kind()) == 4) {
2978+
LoadS32(scratch1, liftoff::GetStackSlot(arg.offset()), scratch2);
2979+
StoreU64(scratch1, dst);
2980+
} else {
2981+
DCHECK_EQ(8, value_kind_size(arg.kind()));
2982+
LoadU64(scratch1, liftoff::GetStackSlot(arg.offset()), scratch1);
2983+
StoreU64(scratch1, dst);
2984+
}
29612985
++stack_args;
29622986
}
29632987
}

src/wasm/baseline/s390/liftoff-assembler-s390-inl.h

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3289,14 +3289,37 @@ void LiftoffAssembler::CallC(const std::initializer_list<VarState> args,
32893289
parallel_move.LoadIntoRegister(LiftoffRegister{kCArgRegs[reg_args]}, arg);
32903290
++reg_args;
32913291
} else {
3292-
int bias = 0;
3293-
// On BE machines values with less than 8 bytes are right justified.
3294-
// bias here is relative to the stack pointer.
3295-
if (arg.kind() == kI32 || arg.kind() == kF32) bias = -stack_bias;
32963292
int offset =
32973293
(kStackFrameExtraParamSlot + stack_args) * kSystemPointerSize;
3298-
MemOperand dst{sp, offset + bias};
3299-
liftoff::StoreToMemory(this, dst, arg, ip);
3294+
MemOperand dst{sp, offset};
3295+
Register scratch = ip;
3296+
if (arg.is_reg()) {
3297+
switch (arg.kind()) {
3298+
case kI16:
3299+
LoadS16(scratch, arg.reg().gp());
3300+
StoreU64(scratch, dst);
3301+
break;
3302+
case kI32:
3303+
LoadS32(scratch, arg.reg().gp());
3304+
StoreU64(scratch, dst);
3305+
break;
3306+
case kI64:
3307+
StoreU64(arg.reg().gp(), dst);
3308+
break;
3309+
default:
3310+
UNREACHABLE();
3311+
}
3312+
} else if (arg.is_const()) {
3313+
mov(scratch, Operand(static_cast<int64_t>(arg.i32_const())));
3314+
StoreU64(scratch, dst);
3315+
} else if (value_kind_size(arg.kind()) == 4) {
3316+
LoadS32(scratch, liftoff::GetStackSlot(arg.offset()), scratch);
3317+
StoreU64(scratch, dst);
3318+
} else {
3319+
DCHECK_EQ(8, value_kind_size(arg.kind()));
3320+
LoadU64(scratch, liftoff::GetStackSlot(arg.offset()), scratch);
3321+
StoreU64(scratch, dst);
3322+
}
33003323
++stack_args;
33013324
}
33023325
}

0 commit comments

Comments
 (0)