diff options
Diffstat (limited to 'src/VBox/Devices/EFI/Firmware/CryptoPkg/Library/IntrinsicLib/Ia32/MathLShiftS64.c')
-rw-r--r-- | src/VBox/Devices/EFI/Firmware/CryptoPkg/Library/IntrinsicLib/Ia32/MathLShiftS64.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/VBox/Devices/EFI/Firmware/CryptoPkg/Library/IntrinsicLib/Ia32/MathLShiftS64.c b/src/VBox/Devices/EFI/Firmware/CryptoPkg/Library/IntrinsicLib/Ia32/MathLShiftS64.c new file mode 100644 index 00000000..3b1255db --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/CryptoPkg/Library/IntrinsicLib/Ia32/MathLShiftS64.c @@ -0,0 +1,48 @@ +/** @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 + } +} |