aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2014-03-28 19:09:45 +0100
committerMike Pall <mike>2014-03-28 19:09:45 +0100
commitc735293921724b3d660d2353c08f2ce15887b71d (patch)
tree696f3d9669b0875ffcdea362f89aaf4eb02e7684 /src
parent095344ce7ca1f8eb30987086a2b4dc78b9d813e6 (diff)
downloadluajit-c735293921724b3d660d2353c08f2ce15887b71d.tar.gz
luajit-c735293921724b3d660d2353c08f2ce15887b71d.tar.bz2
luajit-c735293921724b3d660d2353c08f2ce15887b71d.zip
FFI: Fix pseudo type conversions for type punning.
Diffstat (limited to 'src')
-rw-r--r--src/lj_opt_mem.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/src/lj_opt_mem.c b/src/lj_opt_mem.c
index c8cdc3e5..d5f5290c 100644
--- a/src/lj_opt_mem.c
+++ b/src/lj_opt_mem.c
@@ -740,21 +740,19 @@ retry:
740 case ALIAS_MUST: 740 case ALIAS_MUST:
741 /* Emit conversion if the loaded type doesn't match the forwarded type. */ 741 /* Emit conversion if the loaded type doesn't match the forwarded type. */
742 if (!irt_sametype(fins->t, IR(store->op2)->t)) { 742 if (!irt_sametype(fins->t, IR(store->op2)->t)) {
743 IRType st = irt_type(fins->t); 743 IRType dt = irt_type(fins->t), st = irt_type(IR(store->op2)->t);
744 if (st == IRT_I8 || st == IRT_I16) { /* Trunc + sign-extend. */ 744 if (dt == IRT_I8 || dt == IRT_I16) { /* Trunc + sign-extend. */
745 st |= IRCONV_SEXT; 745 st = dt | IRCONV_SEXT;
746 } else if (st == IRT_U8 || st == IRT_U16) { /* Trunc + zero-extend. */ 746 dt = IRT_INT;
747 } else if (st == IRT_INT) { 747 } else if (dt == IRT_U8 || dt == IRT_U16) { /* Trunc + zero-extend. */
748 st = irt_type(IR(store->op2)->t); /* Needs dummy CONV.int.*. */ 748 st = dt;
749 } else { /* I64/U64 are boxed, U32 is hidden behind a CONV.num.u32. */ 749 dt = IRT_INT;
750 goto store_fwd;
751 } 750 }
752 fins->ot = IRTI(IR_CONV); 751 fins->ot = IRT(IR_CONV, dt);
753 fins->op1 = store->op2; 752 fins->op1 = store->op2;
754 fins->op2 = (IRT_INT<<5)|st; 753 fins->op2 = (dt<<5)|st;
755 return RETRYFOLD; 754 return RETRYFOLD;
756 } 755 }
757 store_fwd:
758 return store->op2; /* Store forwarding. */ 756 return store->op2; /* Store forwarding. */
759 } 757 }
760 ref = store->prev; 758 ref = store->prev;