ARM: Fix stack check code generation.

Thanks to Peter Cawley. #1068
This commit is contained in:
Mike Pall 2023-09-09 18:16:31 +02:00
parent 43eff4aad4
commit 44da356e97

View File

@ -1947,6 +1947,7 @@ static void asm_hiop(ASMState *as, IRIns *ir)
static void asm_stack_check(ASMState *as, BCReg topslot, static void asm_stack_check(ASMState *as, BCReg topslot,
IRIns *irp, RegSet allow, ExitNo exitno) IRIns *irp, RegSet allow, ExitNo exitno)
{ {
int savereg = 0;
Reg pbase; Reg pbase;
uint32_t k; uint32_t k;
if (irp) { if (irp) {
@ -1957,12 +1958,14 @@ static void asm_stack_check(ASMState *as, BCReg topslot,
pbase = rset_pickbot(allow); pbase = rset_pickbot(allow);
} else { } else {
pbase = RID_RET; pbase = RID_RET;
emit_lso(as, ARMI_LDR, RID_RET, RID_SP, 0); /* Restore temp. register. */ savereg = 1;
} }
} else { } else {
pbase = RID_BASE; pbase = RID_BASE;
} }
emit_branch(as, ARMF_CC(ARMI_BL, CC_LS), exitstub_addr(as->J, exitno)); emit_branch(as, ARMF_CC(ARMI_BL, CC_LS), exitstub_addr(as->J, exitno));
if (savereg)
emit_lso(as, ARMI_LDR, RID_RET, RID_SP, 0); /* Restore temp. register. */
k = emit_isk12(0, (int32_t)(8*topslot)); k = emit_isk12(0, (int32_t)(8*topslot));
lua_assert(k); lua_assert(k);
emit_n(as, ARMI_CMP^k, RID_TMP); emit_n(as, ARMI_CMP^k, RID_TMP);
@ -1974,7 +1977,7 @@ static void asm_stack_check(ASMState *as, BCReg topslot,
if (ra_hasspill(irp->s)) if (ra_hasspill(irp->s))
emit_lso(as, ARMI_LDR, pbase, RID_SP, sps_scale(irp->s)); emit_lso(as, ARMI_LDR, pbase, RID_SP, sps_scale(irp->s));
emit_lso(as, ARMI_LDR, RID_TMP, RID_TMP, (i & 4095)); emit_lso(as, ARMI_LDR, RID_TMP, RID_TMP, (i & 4095));
if (ra_hasspill(irp->s) && !allow) if (savereg)
emit_lso(as, ARMI_STR, RID_RET, RID_SP, 0); /* Save temp. register. */ emit_lso(as, ARMI_STR, RID_RET, RID_SP, 0); /* Save temp. register. */
emit_loadi(as, RID_TMP, (i & ~4095)); emit_loadi(as, RID_TMP, (i & ~4095));
} else { } else {