]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
FFI: Make FP to U64 conversions match JIT backend behavior.
authorMike Pall <mike>
Sun, 20 May 2018 10:25:36 +0000 (12:25 +0200)
committerMike Pall <mike>
Sun, 20 May 2018 10:25:36 +0000 (12:25 +0200)
src/lj_obj.h

index e70b003225665da07ab2880125e8224f7a30ec85..2ee526cf803b548a43d1f02bc98389347c24cb29 100644 (file)
@@ -816,14 +816,22 @@ static LJ_AINLINE int32_t lj_num2bit(lua_Number n)
 #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)