diff options
author | Mike Pall <mike> | 2012-11-06 17:05:37 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2012-11-06 17:05:37 +0100 |
commit | 4e5ef81b869dd15238ccfd5aeef09ce577f9b805 (patch) | |
tree | 4f87b74e0ad1c0ee9390cc34a513379fb4f6cd48 /src | |
parent | 8a1a6097bef28df3875f5f9c2624952bd173cf81 (diff) | |
download | luajit-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.h | 4 | ||||
-rw-r--r-- | src/lj_crecord.c | 5 | ||||
-rw-r--r-- | src/lj_target_x86.h | 2 |
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), |