[PATCH v3 3/4] ntdll: Avoid depending on compiler support for 64-bit shift functions.

Zebediah Figura wine at gitlab.winehq.org
Wed Jul 6 22:42:19 CDT 2022


From: Zebediah Figura <zfigura at codeweavers.com>

---
 dlls/ntdll/large_int.c | 45 +++++++++++++++++++++++++++++++++++++++---
 1 file changed, 42 insertions(+), 3 deletions(-)

diff --git a/dlls/ntdll/large_int.c b/dlls/ntdll/large_int.c
index 15716b132a2..038a552545f 100644
--- a/dlls/ntdll/large_int.c
+++ b/dlls/ntdll/large_int.c
@@ -812,7 +812,20 @@ ULONGLONG WINAPI _aulldiv( ULONGLONG a, ULONGLONG b )
 
 LONGLONG __stdcall __regs__allshl( LONGLONG a, unsigned char b )
 {
-    return a << b;
+    const LARGE_INTEGER x = { .QuadPart = a };
+    LARGE_INTEGER ret;
+
+    if (b >= 32)
+    {
+        ret.HighPart = x.LowPart << (b & 31);
+        ret.LowPart = 0;
+    }
+    else
+    {
+        ret.HighPart = (x.LowPart >> (32 - b)) | (x.HighPart << b);
+        ret.LowPart = x.LowPart << b;
+    }
+    return ret.QuadPart;
 }
 
 /******************************************************************************
@@ -828,7 +841,20 @@ __ASM_GLOBAL_FUNC( _allshl,
 
 LONGLONG __stdcall __regs__allshr( LONGLONG a, unsigned char b )
 {
-    return a >> b;
+    const LARGE_INTEGER x = { .QuadPart = a };
+    LARGE_INTEGER ret;
+
+    if (b >= 32)
+    {
+        ret.HighPart = x.HighPart >> 31;
+        ret.LowPart = x.HighPart >> (b & 31);
+    }
+    else
+    {
+        ret.HighPart = x.HighPart >> b;
+        ret.LowPart = (x.HighPart << (32 - b)) | (x.LowPart >> b);
+    }
+    return ret.QuadPart;
 }
 
 /******************************************************************************
@@ -844,7 +870,20 @@ __ASM_GLOBAL_FUNC( _allshr,
 
 ULONGLONG __stdcall __regs__aullshr( ULONGLONG a, unsigned char b )
 {
-    return a >> b;
+    const ULARGE_INTEGER x = { .QuadPart = a };
+    ULARGE_INTEGER ret;
+
+    if (b >= 32)
+    {
+        ret.HighPart = 0;
+        ret.LowPart = x.HighPart >> (b & 31);
+    }
+    else
+    {
+        ret.HighPart = x.HighPart >> b;
+        ret.LowPart = (x.HighPart << (32 - b)) | (x.LowPart >> b);
+    }
+    return ret.QuadPart;
 }
 
 /******************************************************************************
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/375



More information about the wine-devel mailing list