]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
FFI: Fix pseudo type conversions for type punning.
authorMike Pall <mike>
Fri, 28 Mar 2014 18:09:45 +0000 (19:09 +0100)
committerMike Pall <mike>
Fri, 28 Mar 2014 18:09:45 +0000 (19:09 +0100)
src/lj_opt_mem.c

index c8cdc3e5f0124acb34194c399d85bdc7ae44896f..d5f5290c7fafa61986d0e25041b0d8374e32a99e 100644 (file)
@@ -740,21 +740,19 @@ retry:
     case ALIAS_MUST:
       /* Emit conversion if the loaded type doesn't match the forwarded type. */
       if (!irt_sametype(fins->t, IR(store->op2)->t)) {
-       IRType st = irt_type(fins->t);
-       if (st == IRT_I8 || st == IRT_I16) {  /* Trunc + sign-extend. */
-         st |= IRCONV_SEXT;
-       } else if (st == IRT_U8 || st == IRT_U16) {  /* Trunc + zero-extend. */
-       } else if (st == IRT_INT) {
-         st = irt_type(IR(store->op2)->t);  /* Needs dummy CONV.int.*. */
-       } else {  /* I64/U64 are boxed, U32 is hidden behind a CONV.num.u32. */
-         goto store_fwd;
+       IRType dt = irt_type(fins->t), st = irt_type(IR(store->op2)->t);
+       if (dt == IRT_I8 || dt == IRT_I16) {  /* Trunc + sign-extend. */
+         st = dt | IRCONV_SEXT;
+         dt = IRT_INT;
+       } else if (dt == IRT_U8 || dt == IRT_U16) {  /* Trunc + zero-extend. */
+         st = dt;
+         dt = IRT_INT;
        }
-       fins->ot = IRTI(IR_CONV);
+       fins->ot = IRT(IR_CONV, dt);
        fins->op1 = store->op2;
-       fins->op2 = (IRT_INT<<5)|st;
+       fins->op2 = (dt<<5)|st;
        return RETRYFOLD;
       }
-    store_fwd:
       return store->op2;  /* Store forwarding. */
     }
     ref = store->prev;