From: Mike Pall Date: Sun, 20 May 2018 10:28:10 +0000 (+0200) Subject: Merge branch 'master' into v2.1 X-Git-Tag: v2.1.ROLLING~322 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=362f034c1b91d52ea2cf971314ed4e0c24348bff;p=thirdparty%2FLuaJIT.git Merge branch 'master' into v2.1 --- 362f034c1b91d52ea2cf971314ed4e0c24348bff diff --cc src/lj_obj.h index c7e47422,2ee526cf..72b7ace8 --- a/src/lj_obj.h +++ b/src/lj_obj.h @@@ -940,16 -810,28 +940,24 @@@ static LJ_AINLINE int32_t lj_num2bit(lu #endif } -#if LJ_TARGET_X86 && !defined(__SSE2__) -#define lj_num2int(n) lj_num2bit((n)) -#else #define lj_num2int(n) ((int32_t)(n)) -#endif + /* + ** This must match the JIT backend behavior. In particular for archs + ** that don't have a common hardware instruction for this conversion. + ** Note that signed FP to unsigned int conversions have an undefined + ** result and should never be relied upon in portable FFI code. + ** See also: C99 or C11 standard, 6.3.1.4, footnote of (1). + */ static LJ_AINLINE uint64_t lj_num2u64(lua_Number n) { - #ifdef _MSC_VER - if (n >= 9223372036854775808.0) /* They think it's a feature. */ - return (uint64_t)(int64_t)(n - 18446744073709551616.0); - else + #if LJ_TARGET_X86ORX64 || LJ_TARGET_MIPS + int64_t i = (int64_t)n; + if (i < 0) i = (int64_t)(n - 18446744073709551616.0); + return (uint64_t)i; + #else + return (uint64_t)n; #endif - return (uint64_t)n; } static LJ_AINLINE int32_t numberVint(cTValue *o)