]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
ARM: Fix base register coalescing.
authorMike Pall <mike>
Sat, 25 Aug 2012 16:38:30 +0000 (18:38 +0200)
committerMike Pall <mike>
Sat, 25 Aug 2012 16:38:30 +0000 (18:38 +0200)
src/lj_asm.c
src/lj_asm_arm.h

index 426730be43b14de71cd5fe5cff25bc37768f9637..8deddd65b15486d83b893cd90be4012b95ccecbf 100644 (file)
@@ -644,6 +644,7 @@ static void ra_destreg(ASMState *as, IRIns *ir, Reg r)
 {
   Reg dest = ra_dest(as, ir, RID2RSET(r));
   if (dest != r) {
+    lua_assert(rset_test(as->freeset, r));
     ra_modified(as, r);
     emit_movrr(as, ir, dest, r);
   }
index e865850dbd2888135e0761a52cb85dc341653790..f307d6b8fb66fd6a8ed66a3a764c00406d1104f4 100644 (file)
@@ -2102,9 +2102,12 @@ static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow)
   if (ra_hasspill(irp->s)) {
     rset_clear(allow, ra_dest(as, ir, allow));
   } else {
-    lua_assert(ra_hasreg(irp->r));
-    rset_clear(allow, irp->r);
-    ra_destreg(as, ir, irp->r);
+    Reg r = irp->r;
+    lua_assert(ra_hasreg(r));
+    rset_clear(allow, r);
+    if (r != ir->r && !rset_test(as->freeset, r))
+      ra_restore(as, regcost_ref(as->cost[r]));
+    ra_destreg(as, ir, r);
   }
   return allow;
 }