aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lj_asm.c13
1 files changed, 11 insertions, 2 deletions
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)
451 checkmclim(as); 451 checkmclim(as);
452 } 452 }
453#endif 453#endif
454 work = (drop & ~as->freeset) & RSET_GPR; 454 work = (drop & ~as->freeset);
455 while (work) { 455 while (work) {
456 Reg r = rset_pickbot(work); 456 Reg r = rset_pickbot(work);
457 ra_restore(as, regcost_ref(as->cost[r])); 457 ra_restore(as, regcost_ref(as->cost[r]));
@@ -644,7 +644,7 @@ static void ra_destreg(ASMState *as, IRIns *ir, Reg r)
644{ 644{
645 Reg dest = ra_dest(as, ir, RID2RSET(r)); 645 Reg dest = ra_dest(as, ir, RID2RSET(r));
646 if (dest != r) { 646 if (dest != r) {
647 ra_scratch(as, RID2RSET(r)); 647 ra_modified(as, r);
648 emit_movrr(as, ir, dest, r); 648 emit_movrr(as, ir, dest, r);
649 } 649 }
650} 650}
@@ -1110,6 +1110,15 @@ static void asm_phi_shuffle(ASMState *as)
1110 } 1110 }
1111 1111
1112 /* Restore/remat invariants whose registers are modified inside the loop. */ 1112 /* Restore/remat invariants whose registers are modified inside the loop. */
1113#if !LJ_SOFTFP
1114 work = as->modset & ~(as->freeset | as->phiset) & RSET_FPR;
1115 while (work) {
1116 Reg r = rset_pickbot(work);
1117 ra_restore(as, regcost_ref(as->cost[r]));
1118 rset_clear(work, r);
1119 checkmclim(as);
1120 }
1121#endif
1113 work = as->modset & ~(as->freeset | as->phiset); 1122 work = as->modset & ~(as->freeset | as->phiset);
1114 while (work) { 1123 while (work) {
1115 Reg r = rset_pickbot(work); 1124 Reg r = rset_pickbot(work);