• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   64-bit Math Worker Function.
3   The 32-bit versions of C compiler generate calls to library routines
4   to handle 64-bit math. These functions use non-standard calling conventions.
5 
6   Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
7   This program and the accompanying materials are licensed and made available
8   under the terms and conditions of the BSD License which accompanies this
9   distribution.  The full text of the license may be found at
10   http://opensource.org/licenses/bsd-license.php.
11 
12   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 
15 **/
16 
17 #include <Library/BaseLib.h>
18 
19 
20 /*
21  * Divides a 64-bit unsigned value by another 64-bit unsigned value and returns
22  * the 64-bit unsigned remainder.
23  */
_aullrem(void)24 __declspec(naked) void __cdecl _aullrem(void)
25 {
26   //
27   // Wrapper Implementation over EDKII DivU64x64Remainder() routine
28   //    UINT64
29   //    EFIAPI
30   //    DivU64x64Remainder (
31   //      IN      UINT64     Dividend,
32   //      IN      UINT64     Divisor,
33   //      OUT     UINT64     *Remainder  OPTIONAL
34   //      )
35   //
36   _asm {
37     ; Original local stack when calling _aullrem
38     ;               -----------------
39     ;               |               |
40     ;               |---------------|
41     ;               |               |
42     ;               |--  Divisor  --|
43     ;               |               |
44     ;               |---------------|
45     ;               |               |
46     ;               |--  Dividend --|
47     ;               |               |
48     ;               |---------------|
49     ;               |  ReturnAddr** |
50     ;       ESP---->|---------------|
51     ;
52 
53     ;
54     ; Set up the local stack for Reminder pointer
55     ;
56     sub  esp, 8
57     push esp
58 
59     ;
60     ; Set up the local stack for Divisor parameter
61     ;
62     mov  eax, [esp + 28]
63     push eax
64     mov  eax, [esp + 28]
65     push eax
66 
67     ;
68     ; Set up the local stack for Dividend parameter
69     ;
70     mov  eax, [esp + 28]
71     push eax
72     mov  eax, [esp + 28]
73     push eax
74 
75     ;
76     ; Call native DivU64x64Remainder of BaseLib
77     ;
78     call DivU64x64Remainder
79 
80     ;
81     ; Put the Reminder in EDX:EAX as return value
82     ;
83     mov  eax, [esp + 20]
84     mov  edx, [esp + 24]
85 
86     ;
87     ; Adjust stack
88     ;
89     add  esp, 28
90 
91     ret  16
92   }
93 }
94