diff --git a/MdePkg/Library/BaseFdtLib/BaseFdtLib.inf b/MdePkg/Library/BaseFdtLib/BaseFdtLib.inf index b5815380c5..3b6127138b 100644 --- a/MdePkg/Library/BaseFdtLib/BaseFdtLib.inf +++ b/MdePkg/Library/BaseFdtLib/BaseFdtLib.inf @@ -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 diff --git a/MdePkg/Library/BaseFdtLib/Ia32/MathLShiftS64.c b/MdePkg/Library/BaseFdtLib/Ia32/MathLShiftS64.c new file mode 100644 index 0000000000..1c14b5d21c --- /dev/null +++ b/MdePkg/Library/BaseFdtLib/Ia32/MathLShiftS64.c @@ -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.
+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 + } +} diff --git a/MdePkg/Library/BaseFdtLib/Ia32/MathRShiftU64.c b/MdePkg/Library/BaseFdtLib/Ia32/MathRShiftU64.c new file mode 100644 index 0000000000..4f5f9112d3 --- /dev/null +++ b/MdePkg/Library/BaseFdtLib/Ia32/MathRShiftU64.c @@ -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.
+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 + } +}