diff options
| author | Mike Pall <mike> | 2011-02-20 00:18:46 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2011-02-20 00:18:46 +0100 |
| commit | cf88c43dd687f2db3c32e4497257798851c286d6 (patch) | |
| tree | 50d74875a48088e2ddd27fad414478fe1b650d84 /src | |
| parent | 32eaa48c792f8a03b7144383128a9ee82babab83 (diff) | |
| download | luajit-cf88c43dd687f2db3c32e4497257798851c286d6.tar.gz luajit-cf88c43dd687f2db3c32e4497257798851c286d6.tar.bz2 luajit-cf88c43dd687f2db3c32e4497257798851c286d6.zip | |
FFI: Fix 64 bit to 32 bit truncations on x64.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lj_crecord.c | 10 |
1 files changed, 2 insertions, 8 deletions
diff --git a/src/lj_crecord.c b/src/lj_crecord.c index a24c541e..63890001 100644 --- a/src/lj_crecord.c +++ b/src/lj_crecord.c | |||
| @@ -179,18 +179,12 @@ static TRef crec_ct_ct(jit_State *J, CType *d, CType *s, TRef dp, TRef sp, | |||
| 179 | case CCX(I, I): | 179 | case CCX(I, I): |
| 180 | conv_I_I: | 180 | conv_I_I: |
| 181 | if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi; | 181 | if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi; |
| 182 | #if LJ_64 | 182 | /* Extend 32 to 64 bit integer. */ |
| 183 | /* Sign-extend 32 to 64 bit integer. */ | 183 | if (dsize == 8 && ssize < 8 && !(LJ_64 && (sinfo & CTF_UNSIGNED))) |
| 184 | if (dsize == 8 && ssize < 8 && !(sinfo & CTF_UNSIGNED)) | ||
| 185 | sp = emitconv(sp, dt, IRT_INT, IRCONV_SEXT); | ||
| 186 | /* All other conversions are no-ops on x64. */ | ||
| 187 | #else | ||
| 188 | if (dsize == 8 && ssize < 8) /* Extend to 64 bit integer. */ | ||
| 189 | sp = emitconv(sp, dt, ssize < 4 ? IRT_INT : st, | 184 | sp = emitconv(sp, dt, ssize < 4 ? IRT_INT : st, |
| 190 | (sinfo & CTF_UNSIGNED) ? 0 : IRCONV_SEXT); | 185 | (sinfo & CTF_UNSIGNED) ? 0 : IRCONV_SEXT); |
| 191 | else if (dsize < 8 && ssize == 8) /* Truncate from 64 bit integer. */ | 186 | else if (dsize < 8 && ssize == 8) /* Truncate from 64 bit integer. */ |
| 192 | sp = emitconv(sp, dsize < 4 ? IRT_INT : dt, st, 0); | 187 | sp = emitconv(sp, dsize < 4 ? IRT_INT : dt, st, 0); |
| 193 | #endif | ||
| 194 | xstore: | 188 | xstore: |
| 195 | if (dt == IRT_I64 || dt == IRT_U64) lj_needsplit(J); | 189 | if (dt == IRT_I64 || dt == IRT_U64) lj_needsplit(J); |
| 196 | if (dp == 0) return sp; | 190 | if (dp == 0) return sp; |
