1 /*++ 2 3 Copyright (c) 2006, 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 MultU64x32.c 15 16 Abstract: 17 18 64-bit Multiplication function for IA-32 19 20 --*/ 21 22 #include "Tiano.h" 23 24 UINT64 25 MultU64x32 ( 26 IN UINT64 Multiplicand, 27 IN UINTN Multiplier 28 ) 29 /*++ 30 31 Routine Description: 32 33 This routine allows a 64 bit value to be multiplied with a 32 bit 34 value returns 64bit result. 35 No checking if the result is greater than 64bits 36 37 Arguments: 38 39 Multiplicand - multiplicand 40 Multiplier - multiplier 41 42 Returns: 43 44 Multiplicand * Multiplier 45 46 --*/ 47 { 48 __asm { 49 mov eax, dword ptr Multiplicand[0] 50 mul Multiplier 51 push eax 52 push edx 53 mov eax, dword ptr Multiplicand[4] 54 mul Multiplier 55 ; 56 ; The value in edx stored by second multiplication overflows 57 ; the output and should be discarded. So here we overwrite it 58 ; with the edx value of first multiplication. 59 ; 60 pop edx 61 add edx, eax 62 pop eax 63 } 64 } 65