]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
FFI: Fix recording of bool call result check on x86/x64.
authorMike Pall <mike>
Tue, 6 Nov 2012 16:05:37 +0000 (17:05 +0100)
committerMike Pall <mike>
Tue, 6 Nov 2012 16:05:37 +0000 (17:05 +0100)
src/lj_asm_x86.h
src/lj_crecord.c
src/lj_target_x86.h

index 4e4f351d7426109f89abc823810cf61e5908d6bc..6d7dd5a38175983e911e5a2180b6cb54dca5f357 100644 (file)
@@ -1815,7 +1815,7 @@ static void asm_intarith(ASMState *as, IRIns *ir, x86Arith xa)
   int32_t k = 0;
   if (as->flagmcp == as->mcp) {  /* Drop test r,r instruction. */
     as->flagmcp = NULL;
-    as->mcp += (LJ_64 && *as->mcp != XI_TEST) ? 3 : 2;
+    as->mcp += (LJ_64 && *as->mcp < XI_TESTb) ? 3 : 2;
   }
   right = IR(rref)->r;
   if (ra_hasreg(right)) {
@@ -2151,7 +2151,7 @@ static void asm_comp(ASMState *as, IRIns *ir, uint32_t cc)
        asm_guardcc(as, cc);
        if (usetest && left != RID_MRM) {
          /* Use test r,r instead of cmp r,0. */
-         emit_rr(as, XO_TEST, r64 + left, left);
+         emit_rr(as, irt_isu8(ir->t) ? XO_TESTb : XO_TEST, r64 + left, left);
          if (irl+1 == ir)  /* Referencing previous ins? */
            as->flagmcp = as->mcp;  /* Set flag to drop test r,r if possible. */
        } else {
index 9d361a7a18bd1408a491cef5173bb9344e116fd7..c9cdb261d6b6407b948446a4a9a0fda4df96d692 100644 (file)
@@ -1140,7 +1140,12 @@ static int crec_call(jit_State *J, RecordFFData *rd, GCcdata *cd)
        tr = TREF_NIL;
       } else {
        crec_snap_caller(J);
+#if LJ_TARGET_X86ORX64
+       /* Note: only the x86/x64 backend supports U8 and only for EQ(tr, 0). */
+       lj_ir_set(J, IRTG(IR_NE, IRT_U8), tr, lj_ir_kint(J, 0));
+#else
        lj_ir_set(J, IRTGI(IR_NE), tr, lj_ir_kint(J, 0));
+#endif
        J->postproc = LJ_POST_FIXGUARDSNAP;
        tr = TREF_TRUE;
       }
index c718bdb54a5a484ac9a1ddc38b830822fd6cd1a2..95b80322aae06ba3319122aeadfed7e20f95755e 100644 (file)
@@ -205,6 +205,7 @@ typedef enum {
   XI_ARITHi =  0x81,
   XI_ARITHi8 = 0x83,
   XI_PUSHi8 =  0x6a,
+  XI_TESTb =   0x84,
   XI_TEST =    0x85,
   XI_MOVmi =   0xc7,
   XI_GROUP5 =  0xff,
@@ -244,6 +245,7 @@ typedef enum {
   XO_IMULi =   XO_(69),
   XO_IMULi8 =  XO_(6b),
   XO_CMP =     XO_(3b),
+  XO_TESTb =   XO_(84),
   XO_TEST =    XO_(85),
   XO_GROUP3b = XO_(f6),
   XO_GROUP3 =  XO_(f7),