FFI: Fix widening semantics for 64 bit arithmetic.

Thanks to Frityet. #1492
This commit is contained in:
Mike Pall 2026-07-25 20:53:11 +02:00
parent 859ad934bc
commit e4d805163f
2 changed files with 1 additions and 5 deletions

View File

@ -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); sp[i] = emitconv(sp[i], dt, st, IRCONV_TRUNC|IRCONV_ANY);
else if (!(st == IRT_I64 || st == IRT_U64)) else if (!(st == IRT_I64 || st == IRT_U64))
sp[i] = emitconv(sp[i], dt, IRT_INT, 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) { if (mm < MM_add) {
comp: comp:

View File

@ -956,14 +956,10 @@ LJFOLDF(simplify_conv_i64_num)
fins->op2 = ((IRT_I64<<5)|IRT_INT|IRCONV_SEXT); fins->op2 = ((IRT_I64<<5)|IRT_INT|IRCONV_SEXT);
return RETRYFOLD; return RETRYFOLD;
} else if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) { } else if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) {
#if LJ_TARGET_X64
return fleft->op1;
#else
/* Reduce to a zero-extension. */ /* Reduce to a zero-extension. */
fins->op1 = fleft->op1; fins->op1 = fleft->op1;
fins->op2 = (IRT_I64<<5)|IRT_U32; fins->op2 = (IRT_I64<<5)|IRT_U32;
return RETRYFOLD; return RETRYFOLD;
#endif
} }
return NEXTFOLD; return NEXTFOLD;
} }