Imported Upstream version 3.0
[platform/upstream/gnu-efi.git] / lib / ia64 / math.c
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 }