]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
x86: Don't spill an explicit REF_BASE in the IR.
authorMike Pall <mike>
Mon, 23 May 2016 04:24:19 +0000 (06:24 +0200)
committerMike Pall <mike>
Mon, 23 May 2016 04:46:30 +0000 (06:46 +0200)
Thanks to Vyacheslav Egorov.

src/lj_asm_x86.h

index db3e49f856ce646862c62cc402bf0dbcf7469803..a380094bbdae26ee97c76f7cb8b178076f3f0971 100644 (file)
@@ -325,11 +325,11 @@ static Reg asm_fuseload(ASMState *as, IRRef ref, RegSet allow)
       as->mrm.base = as->mrm.idx = RID_NONE;
       return RID_MRM;
     }
-  } else if (ir->o == IR_KINT64) {
+  } else if (ref == REF_BASE || ir->o == IR_KINT64) {
     RegSet avail = as->freeset & ~as->modset & RSET_GPR;
     lua_assert(allow != RSET_EMPTY);
     if (!(avail & (avail-1))) {  /* Fuse if less than two regs available. */
-      as->mrm.ofs = ptr2addr(ir_kint64(ir));
+      as->mrm.ofs = ptr2addr(ref == REF_BASE ? (void *)&J2G(as->J)->jit_base : (void *)ir_kint64(ir));
       as->mrm.base = as->mrm.idx = RID_NONE;
       return RID_MRM;
     }
@@ -369,7 +369,7 @@ static Reg asm_fuseload(ASMState *as, IRRef ref, RegSet allow)
       return RID_MRM;
     }
   }
-  if (!(as->freeset & allow) && !irref_isk(ref) &&
+  if (!(as->freeset & allow) && !emit_canremat(ref) &&
       (allow == RSET_EMPTY || ra_hasspill(ir->s) || iscrossref(as, ref)))
     goto fusespill;
   return ra_allocref(as, ref, allow);