1 #------------------------------------------------------------------------------ 2 # 3 # Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR> 4 # This program and the accompanying materials 5 # are licensed and made available under the terms and conditions of the BSD License 6 # which accompanies this distribution. The full text of the license may be found at 7 # http://opensource.org/licenses/bsd-license.php. 8 # 9 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11 # 12 # Module Name: 13 # 14 # MultU64x64.S 15 # 16 # Abstract: 17 # 18 # Calculate the product of a 64-bit integer and another 64-bit integer 19 # 20 #------------------------------------------------------------------------------ 21 22 ASM_GLOBAL ASM_PFX(InternalMathMultU64x64) 23 24 #------------------------------------------------------------------------------ 25 # UINT64 26 # EFIAPI 27 # InternalMathMultU64x64 ( 28 # IN UINT64 Multiplicand, 29 # IN UINT64 Multiplier 30 # ); 31 #------------------------------------------------------------------------------ 32 ASM_PFX(InternalMathMultU64x64): 33 push %ebx 34 movl 8(%esp), %ebx # ebx <- M1[0..31] 35 movl 16(%esp), %edx # edx <- M2[0..31] 36 movl %ebx, %ecx 37 movl %edx, %eax 38 imull 20(%esp), %ebx # ebx <- M1[0..31] * M2[32..63] 39 imull 12(%esp), %edx # edx <- M1[32..63] * M2[0..31] 40 addl %edx, %ebx # carries are abandoned 41 mull %ecx # edx:eax <- M1[0..31] * M2[0..31] 42 addl %ebx, %edx # carries are abandoned 43 pop %ebx 44 ret 45