From 669f2b584dd5baf58bdef8b0ca54f182c5f5d430 Mon Sep 17 00:00:00 2001 From: Jeff Fan Date: Tue, 25 Aug 2015 06:37:27 +0000 Subject: Copy head(r18255) from main trunk excluding UNI files. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jeff Fan Signed-off-by: Hao Wu git-svn-id: https://svn.code.sf.net/p/edk2/code/branches/UDK2010.SR1@18304 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Library/IntrinsicLib/Ia32/MathRShiftU64.c | 57 ++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 CryptoPkg/Library/IntrinsicLib/Ia32/MathRShiftU64.c (limited to 'CryptoPkg/Library/IntrinsicLib/Ia32/MathRShiftU64.c') diff --git a/CryptoPkg/Library/IntrinsicLib/Ia32/MathRShiftU64.c b/CryptoPkg/Library/IntrinsicLib/Ia32/MathRShiftU64.c new file mode 100644 index 0000000000..86b10040dd --- /dev/null +++ b/CryptoPkg/Library/IntrinsicLib/Ia32/MathRShiftU64.c @@ -0,0 +1,57 @@ +/** @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.
+This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + + +/* + * 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 + } +} -- cgit v1.2.3