aboutsummaryrefslogtreecommitdiff
path: root/src/lj_asm_x86.h
diff options
context:
space:
mode:
authorMike Pall <mike>2016-05-21 00:30:36 +0200
committerMike Pall <mike>2016-05-21 01:00:49 +0200
commit786dbb2ebdde16eadd7464cd5cbeb5d95a5e46f0 (patch)
tree8b66463365b467be31250334ea434a2f572b3c5d /src/lj_asm_x86.h
parentcfa188f1349ba4c843394b53f270cb64635b9805 (diff)
downloadluajit-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.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;