summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MdePkg/Library/BaseLib/BaseLib.inf2
-rw-r--r--MdePkg/Library/BaseLib/Ia32/DivU64x64Remainder.c71
2 files changed, 1 insertions, 72 deletions
diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf
index 324bf9d4db..b474857eee 100644
--- a/MdePkg/Library/BaseLib/BaseLib.inf
+++ b/MdePkg/Library/BaseLib/BaseLib.inf
@@ -148,7 +148,7 @@
Ia32/EnablePaging32.c | MSFT
Ia32/EnableInterrupts.c | MSFT
Ia32/EnableDisableInterrupts.c | MSFT
- Ia32/DivU64x64Remainder.c | MSFT
+ Ia32/DivU64x64Remainder.asm | MSFT
Ia32/DivU64x32Remainder.c | MSFT
Ia32/DivU64x32.c | MSFT
Ia32/DisablePaging32.c | MSFT
diff --git a/MdePkg/Library/BaseLib/Ia32/DivU64x64Remainder.c b/MdePkg/Library/BaseLib/Ia32/DivU64x64Remainder.c
deleted file mode 100644
index 46ef12b204..0000000000
--- a/MdePkg/Library/BaseLib/Ia32/DivU64x64Remainder.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/** @file
- Calculate the quotient of a 64-bit integer by a 64-bit integer and returns
- both the quotient and the remainderSet error flag for all division functions
-
- Copyright (c) 2006 - 2007, Intel Corporation<BR>
- 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.
-
-**/
-
-//
-// Include common header file for this module.
-//
-
-
-UINT64
-EFIAPI
-InternalMathDivRemU64x64 (
- IN UINT64 Dividend,
- IN UINT64 Divisor,
- OUT UINT64 *Remainder OPTIONAL
- )
-{
- _asm {
- mov edx, dword ptr [Dividend + 4]
- mov eax, dword ptr [Dividend + 0] // edx:eax <- dividend
- mov edi, edx
- mov esi, eax // edi:esi <- dividend
- mov ecx, dword ptr [Divisor + 4]
- mov ebx, dword ptr [Divisor + 0] // ecx:ebx <- divisor
-BitLoop:
- shr edx, 1
- rcr eax, 1
- shrd ebx, ecx, 1
- shr ecx, 1
- jnz BitLoop
- div ebx
- mov ebx, eax // ebx <- quotient
- mov ecx, dword ptr [Divisor + 4]
- mul dword ptr [Divisor]
- imul ecx, ebx
- add edx, ecx
- mov ecx, Remainder
- jc TooLarge // product > 2^64
- cmp edi, edx // compare high 32 bits
- ja Correct
- jb TooLarge // product > dividend
- cmp esi, eax
- jae Correct // product <= dividend
-TooLarge:
- dec ebx // adjust quotient by -1
- jecxz Return // return if Remainder == NULL
- sub eax, dword ptr [Divisor + 0]
- sbb edx, dword ptr [Divisor + 4]
-Correct:
- jecxz Return
- sub esi, eax
- sbb edi, edx // edi:esi <- remainder
- mov [ecx], esi
- mov [ecx + 4], edi
-Return:
- mov eax, ebx // eax <- quotient
- xor edx, edx
- }
-}
-