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 signed value by another 64-bit signed value and returns 22 * the 64-bit signed remainder. 23 */ 24 __declspec(naked) void __cdecl _allrem(void) 25 { 26 // 27 // Wrapper Implementation over EDKII DivS64x64Remainder() routine 28 // UINT64 29 // EFIAPI 30 // DivS64x64Remainder ( 31 // IN UINT64 Dividend, 32 // IN UINT64 Divisor, 33 // OUT UINT64 *Remainder 34 // ) 35 // 36 _asm { 37 ; Original local stack when calling _allrem 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 DivS64x64Remainder of BaseLib 77 ; 78 call DivS64x64Remainder 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