aboutsummaryrefslogtreecommitdiff
path: root/src/lj_asm_x86.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lj_asm_x86.h11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h
index e3ed7554..69d1256e 100644
--- a/src/lj_asm_x86.h
+++ b/src/lj_asm_x86.h
@@ -205,8 +205,13 @@ static void asm_fuseahuref(ASMState *as, IRRef ref, RegSet allow)
205static void asm_fusefref(ASMState *as, IRIns *ir, RegSet allow) 205static void asm_fusefref(ASMState *as, IRIns *ir, RegSet allow)
206{ 206{
207 lua_assert(ir->o == IR_FLOAD || ir->o == IR_FREF); 207 lua_assert(ir->o == IR_FLOAD || ir->o == IR_FREF);
208 as->mrm.ofs = field_ofs[ir->op2];
209 as->mrm.idx = RID_NONE; 208 as->mrm.idx = RID_NONE;
209 if (ir->op1 == REF_NIL) {
210 as->mrm.ofs = (int32_t)ir->op2 + ptr2addr(J2GG(as->J));
211 as->mrm.base = RID_NONE;
212 return;
213 }
214 as->mrm.ofs = field_ofs[ir->op2];
210 if (irref_isk(ir->op1)) { 215 if (irref_isk(ir->op1)) {
211 as->mrm.ofs += IR(ir->op1)->i; 216 as->mrm.ofs += IR(ir->op1)->i;
212 as->mrm.base = RID_NONE; 217 as->mrm.base = RID_NONE;
@@ -369,6 +374,10 @@ static Reg asm_fuseload(ASMState *as, IRRef ref, RegSet allow)
369 return RID_MRM; 374 return RID_MRM;
370 } 375 }
371 } 376 }
377 if (ir->o == IR_FLOAD && ir->op1 == REF_NIL) {
378 asm_fusefref(as, ir, RSET_EMPTY);
379 return RID_MRM;
380 }
372 if (!(as->freeset & allow) && !irref_isk(ref) && 381 if (!(as->freeset & allow) && !irref_isk(ref) &&
373 (allow == RSET_EMPTY || ra_hasspill(ir->s) || iscrossref(as, ref))) 382 (allow == RSET_EMPTY || ra_hasspill(ir->s) || iscrossref(as, ref)))
374 goto fusespill; 383 goto fusespill;