diff options
| author | Mike Pall <mike> | 2026-07-25 20:53:11 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2026-07-25 20:53:11 +0200 |
| commit | e4d805163f0942693ae15fee3e3a8bdd9a08554b (patch) | |
| tree | 37318dd29bb49507e5c316f3d90cecc80ebbcf39 /src | |
| parent | 859ad934bc3b92125043c3e599492aecd3586992 (diff) | |
| download | luajit-e4d805163f0942693ae15fee3e3a8bdd9a08554b.tar.gz luajit-e4d805163f0942693ae15fee3e3a8bdd9a08554b.tar.bz2 luajit-e4d805163f0942693ae15fee3e3a8bdd9a08554b.zip | |
FFI: Fix widening semantics for 64 bit arithmetic.
Thanks to Frityet. #1492
Diffstat (limited to 'src')
| -rw-r--r-- | src/lj_crecord.c | 2 | ||||
| -rw-r--r-- | src/lj_opt_fold.c | 4 |
2 files changed, 1 insertions, 5 deletions
diff --git a/src/lj_crecord.c b/src/lj_crecord.c index 4adfefe63..59420184a 100644 --- a/src/lj_crecord.c +++ b/src/lj_crecord.c | |||
| @@ -1249,7 +1249,7 @@ static TRef crec_arith_int64(jit_State *J, TRef *sp, CType **s, MMS mm) | |||
| 1249 | sp[i] = emitconv(sp[i], dt, st, IRCONV_TRUNC|IRCONV_ANY); | 1249 | sp[i] = emitconv(sp[i], dt, st, IRCONV_TRUNC|IRCONV_ANY); |
| 1250 | else if (!(st == IRT_I64 || st == IRT_U64)) | 1250 | else if (!(st == IRT_I64 || st == IRT_U64)) |
| 1251 | sp[i] = emitconv(sp[i], dt, IRT_INT, | 1251 | sp[i] = emitconv(sp[i], dt, IRT_INT, |
| 1252 | (s[i]->info & CTF_UNSIGNED) ? 0 : IRCONV_SEXT); | 1252 | ((st - IRT_I8) & 1) ? 0 : IRCONV_SEXT); |
| 1253 | } | 1253 | } |
| 1254 | if (mm < MM_add) { | 1254 | if (mm < MM_add) { |
| 1255 | comp: | 1255 | comp: |
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index b8676a577..03d869d00 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
| @@ -956,14 +956,10 @@ LJFOLDF(simplify_conv_i64_num) | |||
| 956 | fins->op2 = ((IRT_I64<<5)|IRT_INT|IRCONV_SEXT); | 956 | fins->op2 = ((IRT_I64<<5)|IRT_INT|IRCONV_SEXT); |
| 957 | return RETRYFOLD; | 957 | return RETRYFOLD; |
| 958 | } else if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) { | 958 | } else if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) { |
| 959 | #if LJ_TARGET_X64 | ||
| 960 | return fleft->op1; | ||
| 961 | #else | ||
| 962 | /* Reduce to a zero-extension. */ | 959 | /* Reduce to a zero-extension. */ |
| 963 | fins->op1 = fleft->op1; | 960 | fins->op1 = fleft->op1; |
| 964 | fins->op2 = (IRT_I64<<5)|IRT_U32; | 961 | fins->op2 = (IRT_I64<<5)|IRT_U32; |
| 965 | return RETRYFOLD; | 962 | return RETRYFOLD; |
| 966 | #endif | ||
| 967 | } | 963 | } |
| 968 | return NEXTFOLD; | 964 | return NEXTFOLD; |
| 969 | } | 965 | } |
