]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
ARM, MIPS, PPC: Rematerialize FPR invariants first.
authorMike Pall <mike>
Sun, 19 Aug 2012 16:42:08 +0000 (18:42 +0200)
committerMike Pall <mike>
Sun, 19 Aug 2012 16:42:08 +0000 (18:42 +0200)
src/lj_asm.c

index 8d2cafb30b7cd75a70eaf79d5ca97b2a0352cdfe..426730be43b14de71cd5fe5cff25bc37768f9637 100644 (file)
@@ -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);