Zebediah Figura : ntdll: Avoid depending on compiler support for 64-bit shift functions.
Alexandre Julliard
julliard at winehq.org
Fri Jul 8 16:02:12 CDT 2022
Module: wine
Branch: master
Commit: 9ef7246243ad5446350130bb57b392d688f678ef
URL: https://source.winehq.org/git/wine.git/?a=commit;h=9ef7246243ad5446350130bb57b392d688f678ef
Author: Zebediah Figura <zfigura at codeweavers.com>
Date: Tue Jul 5 21:32:01 2022 -0500
ntdll: Avoid depending on compiler support for 64-bit shift functions.
---
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;
}
/******************************************************************************
More information about the wine-cvs
mailing list