MdePkg/Library/BaseFdtLib: Fix VS2022 NOOPT IA32 issues

VS2022 NOOPT IA32 builds of BaseFdtLib introduce use of
intrinsics __allshl and __aullshr from the libfdt submodule
that can not be modified.  Add the implementation of
__allshl and __aullshr intrinsics from from the CryptoPkg
to BaseFdtLib.

Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
This commit is contained in:
Michael D Kinney 2026-01-19 11:30:23 -08:00 committed by mergify[bot]
parent f9076a3a2b
commit 9ff5bf99f4
3 changed files with 109 additions and 0 deletions

View file

@ -49,6 +49,10 @@
$(FDT_LIB_PATH)/libfdt_env.h
$(FDT_LIB_PATH)/libfdt_internal.h
[Sources.IA32]
Ia32/MathLShiftS64.c | MSFT
Ia32/MathRShiftU64.c | MSFT
[Packages]
MdePkg/MdePkg.dec

View file

@ -0,0 +1,51 @@
/** @file
64-bit Math Worker Function.
The 32-bit versions of C compiler generate calls to library routines
to handle 64-bit math. These functions use non-standard calling conventions.
Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
/*
* Shifts a 64-bit signed value left by a particular number of bits.
*/
__declspec(naked) void __cdecl
_allshl (
void
)
{
_asm {
;
; Handle shifting of 64 or more bits (return 0)
;
cmp cl, 64
jae short ReturnZero
;
; Handle shifting of between 0 and 31 bits
;
cmp cl, 32
jae short More32
shld edx, eax, cl
shl eax, cl
ret
;
; Handle shifting of between 32 and 63 bits
;
More32:
mov edx, eax
xor eax, eax
and cl, 31
shl edx, cl
ret
ReturnZero:
xor eax,eax
xor edx,edx
ret
}
}

View file

@ -0,0 +1,54 @@
/** @file
64-bit Math Worker Function.
The 32-bit versions of C compiler generate calls to library routines
to handle 64-bit math. These functions use non-standard calling conventions.
Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
/*
* Shifts a 64-bit unsigned value right by a certain number of bits.
*/
__declspec(naked) void __cdecl
_aullshr (
void
)
{
_asm {
;
; Checking: Only handle 64bit shifting or more
;
cmp cl, 64
jae _Exit
;
; Handle shifting between 0 and 31 bits
;
cmp cl, 32
jae More32
shrd eax, edx, cl
shr edx, cl
ret
;
; Handle shifting of 32-63 bits
;
More32:
mov eax, edx
xor edx, edx
and cl, 31
shr eax, cl
ret
;
; Invalid number (less then 32bits), return 0
;
_Exit:
xor eax, eax
xor edx, edx
ret
}
}