diff options
Diffstat (limited to '')
-rw-r--r-- | src/lj_asm_x86.h | 11 |
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) | |||
205 | static void asm_fusefref(ASMState *as, IRIns *ir, RegSet allow) | 205 | static 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; |