From dfa8858555070f08ba9df2c2dde837f8c7620b51 Mon Sep 17 00:00:00 2001 From: Daryl McDaniel Date: Wed, 20 Aug 2014 20:38:43 +0000 Subject: StdLib: Add a runtime helper function for VC++ 64-bit right shift on Ia32 target architectures. Add new file StdLib/LibC/CRT/Ia32/llshr.c Add references to the new file to StdLib/LibC/LibC.inf Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Daryl McDaniel Reviewed-by: Erik Bjorge git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15855 6f19259b-4bc3-4df7-8a09-765794883524 --- StdLib/LibC/CRT/Ia32/llshr.c | 58 ++++++++++++++++++++++++++++++++++++++++++++ StdLib/LibC/LibC.inf | 4 ++- 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 StdLib/LibC/CRT/Ia32/llshr.c (limited to 'StdLib') diff --git a/StdLib/LibC/CRT/Ia32/llshr.c b/StdLib/LibC/CRT/Ia32/llshr.c new file mode 100644 index 0000000000..38770ac43f --- /dev/null +++ b/StdLib/LibC/CRT/Ia32/llshr.c @@ -0,0 +1,58 @@ +/** @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) 2009 - 2011, 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 signed value right by a particular number of bits. + */ +__declspec(naked) void __cdecl _allshr (void) +{ + _asm { + ; + ; Handle shifts of 64 bits or more (if shifting 64 bits or more, the result + ; depends only on the high order bit of edx). + ; + cmp cl,64 + jae short SIGNRETURN + + ; + ; Handle shifts of between 0 and 31 bits + ; + cmp cl, 32 + jae short MORE32 + shrd eax,edx,cl + sar edx,cl + ret + + ; + ; Handle shifts of between 32 and 63 bits + ; +MORE32: + mov eax,edx + sar edx,31 + and cl,31 + sar eax,cl + ret + + ; + ; Return double precision 0 or -1, depending on the sign of edx + ; +SIGNRETURN: + sar edx,31 + mov eax,edx + ret + } +} diff --git a/StdLib/LibC/LibC.inf b/StdLib/LibC/LibC.inf index 23647cb428..d8704db907 100644 --- a/StdLib/LibC/LibC.inf +++ b/StdLib/LibC/LibC.inf @@ -1,7 +1,7 @@ ## @file # Standard C library: Miscelaneous implementations. # -# Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+# Copyright (c) 2010 - 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 @@ -50,6 +50,7 @@ # Compiler helper (C RunTime) functions CRT/Ia32/llmul.c | MSFT # __allmul CRT/Ia32/llshl.c | MSFT # __allshl + CRT/Ia32/llshr.c | MSFT # __allshr CRT/Ia32/ulldiv.c | MSFT # __aulldiv CRT/Ia32/ullrem.c | MSFT # __aullrem CRT/Ia32/ullshr.c | MSFT # __aullshr @@ -60,6 +61,7 @@ CRT/Ia32/llmul.c | INTEL CRT/Ia32/llshl.c | INTEL + CRT/Ia32/llshr.c | INTEL CRT/Ia32/ulldiv.c | INTEL CRT/Ia32/ullrem.c | INTEL CRT/Ia32/ullshr.c | INTEL -- cgit v1.2.3