aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-02-20 00:18:46 +0100
committerMike Pall <mike>2011-02-20 00:18:46 +0100
commitcf88c43dd687f2db3c32e4497257798851c286d6 (patch)
tree50d74875a48088e2ddd27fad414478fe1b650d84 /src
parent32eaa48c792f8a03b7144383128a9ee82babab83 (diff)
downloadluajit-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.c10
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;