xref: /DragonStub/lib/ia64/math.c (revision b95f138fa1550040e68ac3dd34cfce7d148d7984)
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
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
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
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
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