1 /** @file
2   Set error flag for all division functions
3 
4   Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
5   This program and the accompanying materials
6   are licensed and made available under the terms and conditions of the BSD License
7   which accompanies this distribution.  The full text of the license may be found at
8   http://opensource.org/licenses/bsd-license.php.
9 
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 /**
16   Divides a 64-bit unsigned integer by a 32-bit unsigned integer and
17   generates a 64-bit unsigned result and an optional 32-bit unsigned remainder.
18 
19   This function divides the 64-bit unsigned value Dividend by the 32-bit
20   unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder
21   is not NULL, then the 32-bit unsigned remainder is returned in Remainder.
22   This function returns the 64-bit unsigned quotient.
23 
24   @param  Dividend  A 64-bit unsigned value.
25   @param  Divisor   A 32-bit unsigned value.
26   @param  Remainder A pointer to a 32-bit unsigned value. This parameter is
27                     optional and may be NULL.
28 
29   @return Dividend / Divisor
30 
31 **/
32 UINT64
33 EFIAPI
InternalMathDivRemU64x32(IN UINT64 Dividend,IN UINT32 Divisor,OUT UINT32 * Remainder)34 InternalMathDivRemU64x32 (
35   IN      UINT64                    Dividend,
36   IN      UINT32                    Divisor,
37   OUT     UINT32                    *Remainder
38   )
39 {
40   _asm {
41     mov     ecx, Divisor
42     mov     eax, dword ptr [Dividend + 4]
43     xor     edx, edx
44     div     ecx
45     push    eax
46     mov     eax, dword ptr [Dividend + 0]
47     div     ecx
48     mov     ecx, Remainder
49     jecxz   RemainderNull                      // abandon remainder if Remainder == NULL
50     mov     [ecx], edx
51 RemainderNull:
52     pop     edx
53   }
54 }
55 
56