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