From: Mike Pall Date: Mon, 23 May 2016 04:47:01 +0000 (+0200) Subject: Merge branch 'master' into v2.1 X-Git-Tag: v2.1.0-beta3~112 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bfe2a353abba4620920cd99511b19780c8d341a2;p=thirdparty%2FLuaJIT.git Merge branch 'master' into v2.1 --- bfe2a353abba4620920cd99511b19780c8d341a2 diff --cc src/lj_asm_x86.h index 7d07336a,a380094b..26705e2c --- a/src/lj_asm_x86.h +++ b/src/lj_asm_x86.h @@@ -420,13 -320,19 +420,26 @@@ static Reg asm_fuseload(ASMState *as, I if (ir->o == IR_KNUM) { RegSet avail = as->freeset & ~as->modset & RSET_FPR; lua_assert(allow != RSET_EMPTY); - if (!(avail & (avail-1))) { /* Fuse if less than two regs available. */ - as->mrm.ofs = ptr2addr(ir_knum(ir)); - as->mrm.base = as->mrm.idx = RID_NONE; - return RID_MRM; - } + if (!(avail & (avail-1))) /* Fuse if less than two regs available. */ + return asm_fuseloadk64(as, ir); - } 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. */ - return asm_fuseloadk64(as, ir); + if (!(avail & (avail-1))) { /* Fuse if less than two regs available. */ - 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; ++ if (ref == REF_BASE) { ++#if LJ_GC64 ++ as->mrm.ofs = (int32_t)dispofs(as, &J2G(as->J)->jit_base); ++ as->mrm.base = RID_DISPATCH; ++#else ++ as->mrm.ofs = ptr2addr(&J2G(as->J)->jit_base); ++ as->mrm.base = RID_NONE; ++#endif ++ as->mrm.idx = RID_NONE; ++ return RID_MRM; ++ } else { ++ return asm_fuseloadk64(as, ir); ++ } + } } else if (mayfuse(as, ref)) { RegSet xallow = (allow & RSET_GPR) ? allow : RSET_GPR; if (ir->o == IR_SLOAD) { @@@ -466,11 -369,7 +479,11 @@@ return RID_MRM; } } + if (ir->o == IR_FLOAD && ir->op1 == REF_NIL) { + asm_fusefref(as, ir, RSET_EMPTY); + 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);