Home | History | Annotate | Download | only in Ia32
      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