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 {
(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);