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