Home | History | Annotate | Download | only in Ipf
      1 /*++
      2 
      3 Copyright (c) 2004, 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   math.c
     15 
     16 Abstract:
     17 
     18   64-bit Math worker functions for Intel Itanium(TM) processors.
     19 
     20 --*/
     21 
     22 #include "Tiano.h"
     23 #include "Pei.h"
     24 #include "PeiLib.h"
     25 
     26 UINT64
     27 LShiftU64 (
     28   IN UINT64   Operand,
     29   IN UINTN    Count
     30   )
     31 /*++
     32 
     33 Routine Description:
     34 
     35   This routine allows a 64 bit value to be left shifted by 32 bits and
     36   returns the shifted value.
     37   Count is valid up 63. (Only Bits 0-5 is valid for Count)
     38 
     39 Arguments:
     40 
     41   Operand - Value to be shifted
     42   Count   - Number of times to shift left.
     43 
     44 Returns:
     45 
     46   Value shifted left identified by the Count.
     47 
     48 --*/
     49 {
     50   return Operand << Count;
     51 }
     52 
     53 UINT64
     54 RShiftU64 (
     55   IN UINT64   Operand,
     56   IN UINTN    Count
     57   )
     58 /*++
     59 
     60 Routine Description:
     61 
     62   This routine allows a 64 bit value to be right shifted by 32 bits and returns the
     63   shifted value.
     64   Count is valid up 63. (Only Bits 0-5 is valid for Count)
     65 
     66 Arguments:
     67 
     68   Operand - Value to be shifted
     69   Count   - Number of times to shift right.
     70 
     71 Returns:
     72 
     73   Value shifted right identified by the Count.
     74 
     75 --*/
     76 {
     77   return Operand >> Count;
     78 }
     79 
     80 UINT64
     81 MultU64x32 (
     82   IN UINT64   Multiplicand,
     83   IN UINTN    Multiplier
     84   )
     85 /*++
     86 
     87 Routine Description:
     88 
     89   This routine allows a 64 bit value to be multiplied with a 32 bit
     90   value returns 64bit result.
     91   No checking if the result is greater than 64bits
     92 
     93 Arguments:
     94 
     95   Multiplicand  - multiplicand
     96   Multiplier    - multiplier
     97 
     98 Returns:
     99 
    100   Multiplicand * Multiplier
    101 
    102 --*/
    103 {
    104   return Multiplicand * Multiplier;
    105 }
    106 
    107 UINT64
    108 DivU64x32 (
    109   IN UINT64   Dividend,
    110   IN UINTN    Divisor,
    111   OUT UINTN   *Remainder OPTIONAL
    112   )
    113 /*++
    114 
    115 Routine Description:
    116 
    117   This routine allows a 64 bit value to be divided with a 32 bit value returns
    118   64bit result and the Remainder.
    119   N.B. only works for 31bit divisors!!
    120 
    121 Arguments:
    122 
    123   Dividend  - dividend
    124   Divisor   - divisor
    125   Remainder - buffer for remainder
    126 
    127 Returns:
    128 
    129   Dividend  / Divisor
    130   Remainder = Dividend mod Divisor
    131 
    132 --*/
    133 {
    134   if (Remainder) {
    135     *Remainder = Dividend % Divisor;
    136   }
    137 
    138   return Dividend / Divisor;
    139 }
    140