aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2012-11-06 17:05:37 +0100
committerMike Pall <mike>2012-11-06 17:05:37 +0100
commit4e5ef81b869dd15238ccfd5aeef09ce577f9b805 (patch)
tree4f87b74e0ad1c0ee9390cc34a513379fb4f6cd48 /src
parent8a1a6097bef28df3875f5f9c2624952bd173cf81 (diff)
downloadluajit-4e5ef81b869dd15238ccfd5aeef09ce577f9b805.tar.gz
luajit-4e5ef81b869dd15238ccfd5aeef09ce577f9b805.tar.bz2
luajit-4e5ef81b869dd15238ccfd5aeef09ce577f9b805.zip
FFI: Fix recording of bool call result check on x86/x64.
Diffstat (limited to 'src')
-rw-r--r--src/lj_asm_x86.h4
-rw-r--r--src/lj_crecord.c5
-rw-r--r--src/lj_target_x86.h2
3 files changed, 9 insertions, 2 deletions
diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h
index 4e4f351d..6d7dd5a3 100644
--- a/src/lj_asm_x86.h
+++ b/src/lj_asm_x86.h
@@ -1815,7 +1815,7 @@ static void asm_intarith(ASMState *as, IRIns *ir, x86Arith xa)
1815 int32_t k = 0; 1815 int32_t k = 0;
1816 if (as->flagmcp == as->mcp) { /* Drop test r,r instruction. */ 1816 if (as->flagmcp == as->mcp) { /* Drop test r,r instruction. */
1817 as->flagmcp = NULL; 1817 as->flagmcp = NULL;
1818 as->mcp += (LJ_64 && *as->mcp != XI_TEST) ? 3 : 2; 1818 as->mcp += (LJ_64 && *as->mcp < XI_TESTb) ? 3 : 2;
1819 } 1819 }
1820 right = IR(rref)->r; 1820 right = IR(rref)->r;
1821 if (ra_hasreg(right)) { 1821 if (ra_hasreg(right)) {
@@ -2151,7 +2151,7 @@ static void asm_comp(ASMState *as, IRIns *ir, uint32_t cc)
2151 asm_guardcc(as, cc); 2151 asm_guardcc(as, cc);
2152 if (usetest && left != RID_MRM) { 2152 if (usetest && left != RID_MRM) {
2153 /* Use test r,r instead of cmp r,0. */ 2153 /* Use test r,r instead of cmp r,0. */
2154 emit_rr(as, XO_TEST, r64 + left, left); 2154 emit_rr(as, irt_isu8(ir->t) ? XO_TESTb : XO_TEST, r64 + left, left);
2155 if (irl+1 == ir) /* Referencing previous ins? */ 2155 if (irl+1 == ir) /* Referencing previous ins? */
2156 as->flagmcp = as->mcp; /* Set flag to drop test r,r if possible. */ 2156 as->flagmcp = as->mcp; /* Set flag to drop test r,r if possible. */
2157 } else { 2157 } else {
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index 9d361a7a..c9cdb261 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -1140,7 +1140,12 @@ static int crec_call(jit_State *J, RecordFFData *rd, GCcdata *cd)
1140 tr = TREF_NIL; 1140 tr = TREF_NIL;
1141 } else { 1141 } else {
1142 crec_snap_caller(J); 1142 crec_snap_caller(J);
1143#if LJ_TARGET_X86ORX64
1144 /* Note: only the x86/x64 backend supports U8 and only for EQ(tr, 0). */
1145 lj_ir_set(J, IRTG(IR_NE, IRT_U8), tr, lj_ir_kint(J, 0));
1146#else
1143 lj_ir_set(J, IRTGI(IR_NE), tr, lj_ir_kint(J, 0)); 1147 lj_ir_set(J, IRTGI(IR_NE), tr, lj_ir_kint(J, 0));
1148#endif
1144 J->postproc = LJ_POST_FIXGUARDSNAP; 1149 J->postproc = LJ_POST_FIXGUARDSNAP;
1145 tr = TREF_TRUE; 1150 tr = TREF_TRUE;
1146 } 1151 }
diff --git a/src/lj_target_x86.h b/src/lj_target_x86.h
index c718bdb5..95b80322 100644
--- a/src/lj_target_x86.h
+++ b/src/lj_target_x86.h
@@ -205,6 +205,7 @@ typedef enum {
205 XI_ARITHi = 0x81, 205 XI_ARITHi = 0x81,
206 XI_ARITHi8 = 0x83, 206 XI_ARITHi8 = 0x83,
207 XI_PUSHi8 = 0x6a, 207 XI_PUSHi8 = 0x6a,
208 XI_TESTb = 0x84,
208 XI_TEST = 0x85, 209 XI_TEST = 0x85,
209 XI_MOVmi = 0xc7, 210 XI_MOVmi = 0xc7,
210 XI_GROUP5 = 0xff, 211 XI_GROUP5 = 0xff,
@@ -244,6 +245,7 @@ typedef enum {
244 XO_IMULi = XO_(69), 245 XO_IMULi = XO_(69),
245 XO_IMULi8 = XO_(6b), 246 XO_IMULi8 = XO_(6b),
246 XO_CMP = XO_(3b), 247 XO_CMP = XO_(3b),
248 XO_TESTb = XO_(84),
247 XO_TEST = XO_(85), 249 XO_TEST = XO_(85),
248 XO_GROUP3b = XO_(f6), 250 XO_GROUP3b = XO_(f6),
249 XO_GROUP3 = XO_(f7), 251 XO_GROUP3 = XO_(f7),