| #/*++ |
| # |
| #Copyright (c) 2006, Intel Corporation |
| #All rights reserved. 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. |
| # |
| #Module Name: |
| # |
| # MultU64x32.c |
| # |
| #Abstract: |
| # |
| # 64-bit Multiplication function for IA-32 |
| # |
| #--*/ |
| #include "EfiBind.h" |
| #--------------------------------------------------------------------------- |
| .686: |
| #.MODEL flat,C |
| .code: |
| |
| #--------------------------------------------------------------------------- |
| .globl ASM_PFX(MultU64x32) |
| #UINT64 |
| #MultU64x32 ( |
| # IN UINT64 Multiplicand, |
| # IN UINTN Multiplier |
| # ) |
| #/*++ |
| # |
| #Routine Description: |
| # |
| # This routine allows a 64 bit value to be multiplied with a 32 bit |
| # value returns 64bit result. |
| # No checking if the result is greater than 64bits |
| # |
| #Arguments: |
| # |
| # Multiplicand - multiplicand |
| # Multiplier - multiplier |
| # |
| #Returns: |
| # |
| # Multiplicand * Multiplier |
| # |
| #--*/ |
| ASM_PFX(MultU64x32): |
| |
| movl 4(%esp), %eax # dword ptr Multiplicand[0] |
| mull 0xC(%esp) # Multiplier |
| pushl %eax |
| pushl %edx |
| movl 0x10(%esp), %eax # dword ptr Multiplicand[4] |
| mull 0x14(%esp) # Multiplier |
| # |
| # The value in edx stored by second multiplication overflows |
| # the output and should be discarded. So here we overwrite it |
| # with the edx value of first multiplication. |
| # |
| popl %edx |
| addl %eax, %edx |
| popl %eax |
| |
| ret |
| #MultU64x32 ENDP |
| |