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**/
32UINT64
33EFIAPI
34InternalMathDivRemU64x32 (
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
51RemainderNull:
52    pop     edx
53  }
54}
55
56