/** @file | |
64-bit Math Worker Function. | |
The 32-bit versions of C compiler generate calls to library routines | |
to handle 64-bit math. These functions use non-standard calling conventions. | |
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR> | |
This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
#include <Library/BaseLib.h> | |
/* | |
* Multiplies a 64-bit signed or unsigned value by a 64-bit signed or unsigned value | |
* and returns a 64-bit result. | |
*/ | |
__declspec(naked) void __cdecl _allmul (void) | |
{ | |
// | |
// Wrapper Implementation over EDKII MultS64x64() routine | |
// INT64 | |
// EFIAPI | |
// MultS64x64 ( | |
// IN INT64 Multiplicand, | |
// IN INT64 Multiplier | |
// ) | |
// | |
_asm { | |
; Original local stack when calling _allmul | |
; ----------------- | |
; | | | |
; |---------------| | |
; | | | |
; |--Multiplier --| | |
; | | | |
; |---------------| | |
; | | | |
; |--Multiplicand-| | |
; | | | |
; |---------------| | |
; | ReturnAddr** | | |
; ESP---->|---------------| | |
; | |
; | |
; Set up the local stack for Multiplicand parameter | |
; | |
mov eax, [esp + 16] | |
push eax | |
mov eax, [esp + 16] | |
push eax | |
; | |
; Set up the local stack for Multiplier parameter | |
; | |
mov eax, [esp + 16] | |
push eax | |
mov eax, [esp + 16] | |
push eax | |
; | |
; Call native MulS64x64 of BaseLib | |
; | |
call MultS64x64 | |
; | |
; Adjust stack | |
; | |
add esp, 16 | |
ret 16 | |
} | |
} |