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; |
