siddhesh / rpms / luajit

Forked from rpms/luajit 5 years ago
Clone

Blame 0067-Revert-FFI-Make-FP-to-U64-conversions-match-JIT-back.patch

Siddhesh Poyarekar e22e03a
From 49f19e7b31fc033ac1e9208580b5be31e2b66b19 Mon Sep 17 00:00:00 2001
Siddhesh Poyarekar e22e03a
From: Siddhesh Poyarekar <siddhesh@sourceware.org>
Siddhesh Poyarekar e22e03a
Date: Thu, 14 Mar 2019 23:08:24 +0530
Siddhesh Poyarekar e22e03a
Subject: [PATCH 67/72] Revert "FFI: Make FP to U64 conversions match JIT
Siddhesh Poyarekar e22e03a
 backend behavior."
Siddhesh Poyarekar e22e03a
Siddhesh Poyarekar e22e03a
This reverts commit f5d424afe8b9395f0df05aba905e0e1f6a2262b8.
Siddhesh Poyarekar e22e03a
Siddhesh Poyarekar e22e03a
The patch breaks test 279, i.e.
Siddhesh Poyarekar e22e03a
Siddhesh Poyarekar e22e03a
  assert(tostring(bit.band(1ll, 1, 1ull, -1)) == "1ULL")
Siddhesh Poyarekar e22e03a
Siddhesh Poyarekar e22e03a
The patch was put in to make the JIT and interpreter behaviour
Siddhesh Poyarekar e22e03a
consistent[1] for float to unsigned int conversions but it ended up
Siddhesh Poyarekar e22e03a
making things worse.  There needs to be a better fix for this.
Siddhesh Poyarekar e22e03a
Siddhesh Poyarekar e22e03a
[1] https://github.com/LuaJIT/LuaJIT/pull/415
Siddhesh Poyarekar e22e03a
---
Siddhesh Poyarekar e22e03a
 src/lj_obj.h | 18 +++++-------------
Siddhesh Poyarekar e22e03a
 1 file changed, 5 insertions(+), 13 deletions(-)
Siddhesh Poyarekar e22e03a
Siddhesh Poyarekar e22e03a
diff --git a/src/lj_obj.h b/src/lj_obj.h
Siddhesh Poyarekar e22e03a
index 72b7ace..c7e4742 100644
Siddhesh Poyarekar e22e03a
--- a/src/lj_obj.h
Siddhesh Poyarekar e22e03a
+++ b/src/lj_obj.h
Siddhesh Poyarekar e22e03a
@@ -942,22 +942,14 @@ static LJ_AINLINE int32_t lj_num2bit(lua_Number n)
Siddhesh Poyarekar e22e03a
 
Siddhesh Poyarekar e22e03a
 #define lj_num2int(n)   ((int32_t)(n))
Siddhesh Poyarekar e22e03a
 
Siddhesh Poyarekar e22e03a
-/*
Siddhesh Poyarekar e22e03a
-** This must match the JIT backend behavior. In particular for archs
Siddhesh Poyarekar e22e03a
-** that don't have a common hardware instruction for this conversion.
Siddhesh Poyarekar e22e03a
-** Note that signed FP to unsigned int conversions have an undefined
Siddhesh Poyarekar e22e03a
-** result and should never be relied upon in portable FFI code.
Siddhesh Poyarekar e22e03a
-** See also: C99 or C11 standard, 6.3.1.4, footnote of (1).
Siddhesh Poyarekar e22e03a
-*/
Siddhesh Poyarekar e22e03a
 static LJ_AINLINE uint64_t lj_num2u64(lua_Number n)
Siddhesh Poyarekar e22e03a
 {
Siddhesh Poyarekar e22e03a
-#if LJ_TARGET_X86ORX64 || LJ_TARGET_MIPS
Siddhesh Poyarekar e22e03a
-  int64_t i = (int64_t)n;
Siddhesh Poyarekar e22e03a
-  if (i < 0) i = (int64_t)(n - 18446744073709551616.0);
Siddhesh Poyarekar e22e03a
-  return (uint64_t)i;
Siddhesh Poyarekar e22e03a
-#else
Siddhesh Poyarekar e22e03a
-  return (uint64_t)n;
Siddhesh Poyarekar e22e03a
+#ifdef _MSC_VER
Siddhesh Poyarekar e22e03a
+  if (n >= 9223372036854775808.0)  /* They think it's a feature. */
Siddhesh Poyarekar e22e03a
+    return (uint64_t)(int64_t)(n - 18446744073709551616.0);
Siddhesh Poyarekar e22e03a
+  else
Siddhesh Poyarekar e22e03a
 #endif
Siddhesh Poyarekar e22e03a
+    return (uint64_t)n;
Siddhesh Poyarekar e22e03a
 }
Siddhesh Poyarekar e22e03a
 
Siddhesh Poyarekar e22e03a
 static LJ_AINLINE int32_t numberVint(cTValue *o)
Siddhesh Poyarekar e22e03a
-- 
Siddhesh Poyarekar e22e03a
2.20.1
Siddhesh Poyarekar e22e03a