]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BaseLib/Ia32/DivU64x64Remainder.asm
1. Updated function headers in all assembly files.
[mirror_edk2.git] / MdePkg / Library / BaseLib / Ia32 / DivU64x64Remainder.asm
index 261211b946f4aec191987ec9d3c3c7b138bde9b8..61a53d1e3a42f7d1d115322d910347ec41598e18 100644 (file)
 \r
 EXTERN  InternalMathDivRemU64x32:PROC\r
 \r
+;------------------------------------------------------------------------------\r
+; UINT64\r
+; EFIAPI\r
+; InternalMathDivRemU64x64 (\r
+;   IN      UINT64                    Dividend,\r
+;   IN      UINT64                    Divisor,\r
+;   OUT     UINT64                    *Remainder    OPTIONAL\r
+;   );\r
+;------------------------------------------------------------------------------\r
 InternalMathDivRemU64x64    PROC\r
     mov     ecx, [esp + 16]\r
     test    ecx, ecx\r
-    jnz     _@DivRemU64x64\r
+    jnz     _@DivRemU64x64              ; call _@DivRemU64x64 if Divisor > 2^32\r
     mov     ecx, [esp + 20]\r
     jecxz   @F\r
     and     dword ptr [ecx + 4], 0\r
@@ -40,10 +49,10 @@ InternalMathDivRemU64x64    ENDP
 \r
 _@DivRemU64x64  PROC    USES    ebx esi edi\r
     mov     edx, dword ptr [esp + 20]\r
-    mov     eax, dword ptr [esp + 16]\r
+    mov     eax, dword ptr [esp + 16]   ; edx:eax <- dividend\r
     mov     edi, edx\r
-    mov     esi, eax\r
-    mov     ebx, dword ptr [esp + 24]\r
+    mov     esi, eax                    ; edi:esi <- dividend\r
+    mov     ebx, dword ptr [esp + 24]   ; ecx:ebx <- divisor\r
 @@:\r
     shr     edx, 1\r
     rcr     eax, 1\r
@@ -51,31 +60,31 @@ _@DivRemU64x64  PROC    USES    ebx esi edi
     shr     ecx, 1\r
     jnz     @B\r
     div     ebx\r
-    mov     ebx, eax\r
+    mov     ebx, eax                    ; ebx <- quotient\r
     mov     ecx, [esp + 28]\r
     mul     dword ptr [esp + 24]\r
     imul    ecx, ebx\r
     add     edx, ecx\r
     mov     ecx, dword ptr [esp + 32]\r
-    jc      @TooLarge\r
-    cmp     edi, edx\r
+    jc      @TooLarge                   ; product > 2^64\r
+    cmp     edi, edx                    ; compare high 32 bits\r
     ja      @Correct\r
-    jb      @TooLarge\r
+    jb      @TooLarge                   ; product > dividend\r
     cmp     esi, eax\r
-    jae     @Correct\r
+    jae     @Correct                    ; product <= dividend\r
 @TooLarge:\r
-    dec     ebx\r
-    jecxz   @Return\r
+    dec     ebx                         ; adjust quotient by -1\r
+    jecxz   @Return                     ; return if Remainder == NULL\r
     sub     eax, dword ptr [esp + 24]\r
     sbb     edx, dword ptr [esp + 28]\r
 @Correct:\r
     jecxz   @Return\r
     sub     esi, eax\r
-    sbb     edi, edx\r
+    sbb     edi, edx                    ; edi:esi <- remainder\r
     mov     [ecx], esi\r
     mov     [ecx + 4], edi\r
 @Return:\r
-    mov     eax, ebx\r
+    mov     eax, ebx                    ; eax <- quotient\r
     xor     edx, edx\r
     ret\r
 _@DivRemU64x64  ENDP\r