1 /*++
2
3 Copyright (c) 1998 Intel Corporation
4
5 Module Name:
6
7 math.c
8
9 Abstract:
10
11
12
13
14 Revision History
15
16 --*/
17
18 #include "lib.h"
19
20
21 //
22 // Declare runtime functions
23 //
24
25 #ifdef RUNTIME_CODE
26 #ifndef __GNUC__
27 #pragma RUNTIME_CODE(LShiftU64)
28 #pragma RUNTIME_CODE(RShiftU64)
29 #pragma RUNTIME_CODE(MultU64x32)
30 #pragma RUNTIME_CODE(DivU64x32)
31 #endif
32 #endif
33
34 //
35 //
36 //
37
38
39
40
41 UINT64
LShiftU64(IN UINT64 Operand,IN UINTN Count)42 LShiftU64 (
43 IN UINT64 Operand,
44 IN UINTN Count
45 )
46 // Left shift 64bit by 32bit and get a 64bit result
47 {
48 return Operand << Count;
49 }
50
51 UINT64
RShiftU64(IN UINT64 Operand,IN UINTN Count)52 RShiftU64 (
53 IN UINT64 Operand,
54 IN UINTN Count
55 )
56 // Right shift 64bit by 32bit and get a 64bit result
57 {
58 return Operand >> Count;
59 }
60
61
62 UINT64
MultU64x32(IN UINT64 Multiplicand,IN UINTN Multiplier)63 MultU64x32 (
64 IN UINT64 Multiplicand,
65 IN UINTN Multiplier
66 )
67 // Multiple 64bit by 32bit and get a 64bit result
68 {
69 return Multiplicand * Multiplier;
70 }
71
72 UINT64
DivU64x32(IN UINT64 Dividend,IN UINTN Divisor,OUT UINTN * Remainder OPTIONAL)73 DivU64x32 (
74 IN UINT64 Dividend,
75 IN UINTN Divisor,
76 OUT UINTN *Remainder OPTIONAL
77 )
78 // divide 64bit by 32bit and get a 64bit result
79 // N.B. only works for 31bit divisors!!
80 {
81 ASSERT (Divisor != 0);
82
83 if (Remainder) {
84 *Remainder = Dividend % Divisor;
85 }
86
87 return Dividend / Divisor;
88 }
89