Prechádzať zdrojové kódy

ARM, MIPS, PPC: Rematerialize FPR invariants first.

Mike Pall 13 rokov pred
rodič
commit
1481263aaa
1 zmenil súbory, kde vykonal 11 pridanie a 2 odobranie
  1. 11 2
      src/lj_asm.c

+ 11 - 2
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);