aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2012-08-19 18:42:08 +0200
committerMike Pall <mike>2012-08-19 18:42:08 +0200
commit1481263aaa5630e6557f094e7d875fe28874870d (patch)
treeb7a88009592eaafb2c807359e0fc14123b21495c /src
parent2ac083cb5a0ce5f24fb1182eacf14438bb45e7ba (diff)
downloadluajit-1481263aaa5630e6557f094e7d875fe28874870d.tar.gz
luajit-1481263aaa5630e6557f094e7d875fe28874870d.tar.bz2
luajit-1481263aaa5630e6557f094e7d875fe28874870d.zip
ARM, MIPS, PPC: Rematerialize FPR invariants first.
Diffstat (limited to 'src')
-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);