• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
LShiftU64(IN UINT64 Operand,IN UINTN Count)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
RShiftU64(IN UINT64 Operand,IN UINTN Count)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
MultU64x32(IN UINT64 Multiplicand,IN UINTN Multiplier)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
DivU64x32(IN UINT64 Dividend,IN UINTN Divisor,OUT UINTN * Remainder OPTIONAL)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