[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