Pārlūkot izejas kodu

FFI: Fix 64 bit to 32 bit truncations on x64.

Mike Pall 14 gadi atpakaļ
vecāks
revīzija
cf88c43dd6
1 mainītis faili ar 2 papildinājumiem un 8 dzēšanām
  1. 2 8
      src/lj_crecord.c

+ 2 - 8
src/lj_crecord.c

@@ -179,18 +179,12 @@ static TRef crec_ct_ct(jit_State *J, CType *d, CType *s, TRef dp, TRef sp,
   case CCX(I, I):
   case CCX(I, I):
   conv_I_I:
   conv_I_I:
     if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi;
     if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi;
-#if LJ_64
-    /* Sign-extend 32 to 64 bit integer. */
-    if (dsize == 8 && ssize < 8 && !(sinfo & CTF_UNSIGNED))
-      sp = emitconv(sp, dt, IRT_INT, IRCONV_SEXT);
-    /* All other conversions are no-ops on x64. */
-#else
-    if (dsize == 8 && ssize < 8)  /* Extend to 64 bit integer. */
+    /* Extend 32 to 64 bit integer. */
+    if (dsize == 8 && ssize < 8 && !(LJ_64 && (sinfo & CTF_UNSIGNED)))
       sp = emitconv(sp, dt, ssize < 4 ? IRT_INT : st,
       sp = emitconv(sp, dt, ssize < 4 ? IRT_INT : st,
 		    (sinfo & CTF_UNSIGNED) ? 0 : IRCONV_SEXT);
 		    (sinfo & CTF_UNSIGNED) ? 0 : IRCONV_SEXT);
     else if (dsize < 8 && ssize == 8)  /* Truncate from 64 bit integer. */
     else if (dsize < 8 && ssize == 8)  /* Truncate from 64 bit integer. */
       sp = emitconv(sp, dsize < 4 ? IRT_INT : dt, st, 0);
       sp = emitconv(sp, dsize < 4 ? IRT_INT : dt, st, 0);
-#endif
   xstore:
   xstore:
     if (dt == IRT_I64 || dt == IRT_U64) lj_needsplit(J);
     if (dt == IRT_I64 || dt == IRT_U64) lj_needsplit(J);
     if (dp == 0) return sp;
     if (dp == 0) return sp;