ARM: Fix stack check for spilled BASE in parent.

This commit is contained in:
Mike Pall 2011-12-10 00:18:19 +01:00
parent 2591b4524a
commit 60b8e9e2fb

View File

@ -1422,8 +1422,9 @@ static void asm_stack_check(ASMState *as, BCReg topslot,
Reg pbase;
uint32_t k;
if (irp) {
if (ra_hasreg(irp->r)) {
if (!ra_hasspill(irp->s)) {
pbase = irp->r;
lua_assert(ra_hasreg(pbase));
} else if (allow) {
pbase = rset_pickbot(allow);
} else {
@ -1442,14 +1443,11 @@ static void asm_stack_check(ASMState *as, BCReg topslot,
(int32_t)offsetof(lua_State, maxstack));
if (irp) { /* Must not spill arbitrary registers in head of side trace. */
int32_t i = i32ptr(&J2G(as->J)->jit_L);
if (ra_noreg(irp->r)) {
lua_assert(ra_hasspill(irp->s));
emit_lso(as, ARMI_LDR, RID_RET, RID_SP, sps_scale(irp->s));
}
if (ra_hasspill(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));
if (ra_noreg(irp->r)) {
if (ra_hasspill(irp->s) && !allow)
emit_lso(as, ARMI_STR, RID_RET, RID_SP, 0); /* Save temp. register. */
}
emit_loadi(as, RID_TMP, (i & ~4095));
} else {
emit_getgl(as, RID_TMP, jit_L);