diff --git a/src/lj_asm.c b/src/lj_asm.c index 8d2cafb3..426730be 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c @@ -451,7 +451,7 @@ static void ra_evictset(ASMState *as, RegSet drop) checkmclim(as); } #endif - work = (drop & ~as->freeset) & RSET_GPR; + work = (drop & ~as->freeset); while (work) { Reg r = rset_pickbot(work); ra_restore(as, regcost_ref(as->cost[r])); @@ -644,7 +644,7 @@ static void ra_destreg(ASMState *as, IRIns *ir, Reg r) { Reg dest = ra_dest(as, ir, RID2RSET(r)); if (dest != r) { - ra_scratch(as, RID2RSET(r)); + ra_modified(as, r); emit_movrr(as, ir, dest, r); } } @@ -1110,6 +1110,15 @@ static void asm_phi_shuffle(ASMState *as) } /* Restore/remat invariants whose registers are modified inside the loop. */ +#if !LJ_SOFTFP + work = as->modset & ~(as->freeset | as->phiset) & RSET_FPR; + while (work) { + Reg r = rset_pickbot(work); + ra_restore(as, regcost_ref(as->cost[r])); + rset_clear(work, r); + checkmclim(as); + } +#endif work = as->modset & ~(as->freeset | as->phiset); while (work) { Reg r = rset_pickbot(work);