diff options
author | Mike Pall <mike> | 2016-05-21 00:30:36 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2016-05-21 01:00:49 +0200 |
commit | 786dbb2ebdde16eadd7464cd5cbeb5d95a5e46f0 (patch) | |
tree | 8b66463365b467be31250334ea434a2f572b3c5d /src/lj_asm_x86.h | |
parent | cfa188f1349ba4c843394b53f270cb64635b9805 (diff) | |
download | luajit-786dbb2ebdde16eadd7464cd5cbeb5d95a5e46f0.tar.gz luajit-786dbb2ebdde16eadd7464cd5cbeb5d95a5e46f0.tar.bz2 luajit-786dbb2ebdde16eadd7464cd5cbeb5d95a5e46f0.zip |
Add IR_FLOAD with REF_NIL for field loads from GG_State.
Contributed by Peter Cawley.
Diffstat (limited to 'src/lj_asm_x86.h')
-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; |