From e4d805163f0942693ae15fee3e3a8bdd9a08554b Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sat, 25 Jul 2026 20:53:11 +0200 Subject: FFI: Fix widening semantics for 64 bit arithmetic. Thanks to Frityet. #1492 --- src/lj_crecord.c | 2 +- src/lj_opt_fold.c | 4 ---- 2 files changed, 1 insertion(+), 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) sp[i] = emitconv(sp[i], dt, st, IRCONV_TRUNC|IRCONV_ANY); else if (!(st == IRT_I64 || st == IRT_U64)) sp[i] = emitconv(sp[i], dt, IRT_INT, - (s[i]->info & CTF_UNSIGNED) ? 0 : IRCONV_SEXT); + ((st - IRT_I8) & 1) ? 0 : IRCONV_SEXT); } if (mm < MM_add) { 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) fins->op2 = ((IRT_I64<<5)|IRT_INT|IRCONV_SEXT); return RETRYFOLD; } else if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) { -#if LJ_TARGET_X64 - return fleft->op1; -#else /* Reduce to a zero-extension. */ fins->op1 = fleft->op1; fins->op2 = (IRT_I64<<5)|IRT_U32; return RETRYFOLD; -#endif } return NEXTFOLD; } -- cgit v1.2.3-55-g6feb