diff options
author | Mike Pall <mike> | 2014-03-28 19:09:45 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2014-03-28 19:09:45 +0100 |
commit | c735293921724b3d660d2353c08f2ce15887b71d (patch) | |
tree | 696f3d9669b0875ffcdea362f89aaf4eb02e7684 /src | |
parent | 095344ce7ca1f8eb30987086a2b4dc78b9d813e6 (diff) | |
download | luajit-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.c | 20 |
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; |