diff options
Diffstat (limited to 'MdePkg/Library/BaseLib/Ia32/DivU64x64Remainder.S')
-rw-r--r-- | MdePkg/Library/BaseLib/Ia32/DivU64x64Remainder.S | 52 |
1 files changed, 26 insertions, 26 deletions
diff --git a/MdePkg/Library/BaseLib/Ia32/DivU64x64Remainder.S b/MdePkg/Library/BaseLib/Ia32/DivU64x64Remainder.S index f779e39159..b78697c73e 100644 --- a/MdePkg/Library/BaseLib/Ia32/DivU64x64Remainder.S +++ b/MdePkg/Library/BaseLib/Ia32/DivU64x64Remainder.S @@ -32,13 +32,13 @@ # );
#------------------------------------------------------------------------------
ASM_PFX(InternalMathDivRemU64x64):
- movl 16(%esp), %ecx
+ movl 16(%esp), %ecx # ecx <- divisor[32..63]
testl %ecx, %ecx
- jnz Hard
+ jnz Hard # call _@DivRemU64x64 if Divisor > 2^32
movl 20(%esp), %ecx
jecxz L1
- and $0, 4(%ecx)
- movl %ecx, 16(%esp)
+ and $0, 4(%ecx) # zero high dword of remainder
+ movl %ecx, 16(%esp) # set up stack frame to match DivRemU64x32
L1:
jmp ASM_PFX(InternalMathDivRemU64x32)
Hard:
@@ -46,10 +46,10 @@ Hard: push %esi
push %edi
mov 20(%esp), %edx
- mov 16(%esp), %eax
+ mov 16(%esp), %eax # edx:eax <- dividend
movl %edx, %edi
- movl %eax, %esi
- mov 24(%esp), %ebx
+ movl %eax, %esi # edi:esi <- dividend
+ mov 24(%esp), %ebx # ecx:ebx <- divisor
L2:
shrl %edx
rcrl $1, %eax
@@ -57,32 +57,32 @@ L2: shrl %ecx
jnz L2
divl %ebx
- movl %eax, %ebx
- movl 28(%esp), %ecx
- mull 24(%esp)
- imull %ebx, %ecx
- addl %ecx, %edx
- mov 32(%esp), %ecx
- jc TooLarge
- cmpl %edx, %edi
- ja Correct
- jb TooLarge
- cmpl %eax, %esi
- jae Correct
+ movl %eax, %ebx # ebx <- quotient
+ movl 28(%esp), %ecx # ecx <- high dword of divisor
+ mull 24(%esp) # edx:eax <- quotient * divisor[0..31]
+ imull %ebx, %ecx # ecx <- quotient * divisor[32..63]
+ addl %ecx, %edx # edx <- (quotient * divisor)[32..63]
+ mov 32(%esp), %ecx # ecx <- addr for Remainder
+ jc TooLarge # product > 2^64
+ cmpl %edx, %edi # compare high 32 bits
+ ja Correct
+ jb TooLarge # product > dividend
+ cmpl %eax, %esi
+ jae Correct # product <= dividend
TooLarge:
- decl %ebx
- jecxz Return
- sub 24(%esp), %eax
- sbb 28(%esp), %edx
+ decl %ebx # adjust quotient by -1
+ jecxz Return # return if Remainder == NULL
+ sub 24(%esp), %eax
+ sbb 28(%esp), %edx # edx:eax <- (quotient - 1) * divisor
Correct:
jecxz Return
subl %eax, %esi
- sbbl %edx, %edi
+ sbbl %edx, %edi # edi:esi <- remainder
movl %esi, (%ecx)
movl %edi, 4(%ecx)
Return:
- movl %ebx, %eax
- xorl %edx, %edx
+ movl %ebx, %eax # eax <- quotient
+ xorl %edx, %edx # quotient is 32 bits long
pop %edi
pop %esi
pop %ebx
|