]>
Commit | Line | Data |
---|---|---|
eece7fe5 | 1 | /* Operation with 128 bit bitmask. |
7adcbafe | 2 | Copyright (C) 2013-2022 Free Software Foundation, Inc. |
eece7fe5 JK |
3 | |
4 | This file is part of GCC. | |
5 | ||
6 | GCC is free software; you can redistribute it and/or modify it under | |
7 | the terms of the GNU General Public License as published by the Free | |
8 | Software Foundation; either version 3, or (at your option) any later | |
9 | version. | |
10 | ||
11 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
12 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 | for more details. | |
15 | ||
16 | You should have received a copy of the GNU General Public License | |
17 | along with GCC; see the file COPYING3. If not see | |
18 | <http://www.gnu.org/licenses/>. */ | |
19 | ||
20 | #ifndef GCC_WIDE_INT_BITMASK_H | |
21 | #define GCC_WIDE_INT_BITMASK_H | |
22 | ||
6c1dae73 | 23 | class wide_int_bitmask |
eece7fe5 | 24 | { |
6c1dae73 | 25 | public: |
a1541628 JJ |
26 | constexpr wide_int_bitmask (); |
27 | constexpr wide_int_bitmask (uint64_t l); | |
28 | constexpr wide_int_bitmask (uint64_t l, uint64_t h); | |
eece7fe5 JK |
29 | inline wide_int_bitmask &operator &= (wide_int_bitmask); |
30 | inline wide_int_bitmask &operator |= (wide_int_bitmask); | |
a1541628 JJ |
31 | constexpr wide_int_bitmask operator ~ () const; |
32 | constexpr wide_int_bitmask operator & (wide_int_bitmask) const; | |
33 | constexpr wide_int_bitmask operator | (wide_int_bitmask) const; | |
eece7fe5 JK |
34 | inline wide_int_bitmask operator >> (int); |
35 | inline wide_int_bitmask operator << (int); | |
36 | inline bool operator == (wide_int_bitmask) const; | |
37 | inline bool operator != (wide_int_bitmask) const; | |
38 | uint64_t low, high; | |
39 | }; | |
40 | ||
a1541628 | 41 | constexpr |
eece7fe5 JK |
42 | wide_int_bitmask::wide_int_bitmask () |
43 | : low (0), high (0) | |
44 | { | |
45 | } | |
46 | ||
a1541628 | 47 | constexpr |
eece7fe5 JK |
48 | wide_int_bitmask::wide_int_bitmask (uint64_t l) |
49 | : low (l), high (0) | |
50 | { | |
51 | } | |
52 | ||
a1541628 | 53 | constexpr |
eece7fe5 JK |
54 | wide_int_bitmask::wide_int_bitmask (uint64_t l, uint64_t h) |
55 | : low (l), high (h) | |
56 | { | |
57 | } | |
58 | ||
59 | inline wide_int_bitmask & | |
60 | wide_int_bitmask::operator &= (wide_int_bitmask b) | |
61 | { | |
62 | low &= b.low; | |
63 | high &= b.high; | |
64 | return *this; | |
65 | } | |
66 | ||
67 | inline wide_int_bitmask & | |
68 | wide_int_bitmask::operator |= (wide_int_bitmask b) | |
69 | { | |
70 | low |= b.low; | |
71 | high |= b.high; | |
72 | return *this; | |
73 | } | |
74 | ||
a1541628 | 75 | constexpr wide_int_bitmask |
eece7fe5 JK |
76 | wide_int_bitmask::operator ~ () const |
77 | { | |
a1541628 | 78 | return wide_int_bitmask (~low, ~high); |
eece7fe5 JK |
79 | } |
80 | ||
a1541628 | 81 | constexpr wide_int_bitmask |
eece7fe5 JK |
82 | wide_int_bitmask::operator | (wide_int_bitmask b) const |
83 | { | |
a1541628 | 84 | return wide_int_bitmask (low | b.low, high | b.high); |
eece7fe5 JK |
85 | } |
86 | ||
a1541628 | 87 | constexpr wide_int_bitmask |
eece7fe5 JK |
88 | wide_int_bitmask::operator & (wide_int_bitmask b) const |
89 | { | |
a1541628 | 90 | return wide_int_bitmask (low & b.low, high & b.high); |
eece7fe5 JK |
91 | } |
92 | ||
93 | inline wide_int_bitmask | |
94 | wide_int_bitmask::operator << (int amount) | |
95 | { | |
96 | wide_int_bitmask ret; | |
97 | if (amount >= 64) | |
98 | { | |
99 | ret.low = 0; | |
100 | ret.high = low << (amount - 64); | |
101 | } | |
102 | else if (amount == 0) | |
103 | ret = *this; | |
104 | else | |
105 | { | |
106 | ret.low = low << amount; | |
107 | ret.high = (low >> (64 - amount)) | (high << amount); | |
108 | } | |
109 | return ret; | |
110 | } | |
111 | ||
112 | inline wide_int_bitmask | |
113 | wide_int_bitmask::operator >> (int amount) | |
114 | { | |
115 | wide_int_bitmask ret; | |
116 | if (amount >= 64) | |
117 | { | |
118 | ret.low = high >> (amount - 64); | |
119 | ret.high = 0; | |
120 | } | |
121 | else if (amount == 0) | |
122 | ret = *this; | |
123 | else | |
124 | { | |
125 | ret.low = (high << (64 - amount)) | (low >> amount); | |
126 | ret.high = high >> amount; | |
127 | } | |
128 | return ret; | |
129 | } | |
130 | ||
131 | inline bool | |
132 | wide_int_bitmask::operator == (wide_int_bitmask b) const | |
133 | { | |
134 | return low == b.low && high == b.high; | |
135 | } | |
136 | ||
137 | inline bool | |
138 | wide_int_bitmask::operator != (wide_int_bitmask b) const | |
139 | { | |
140 | return low != b.low || high != b.high; | |
141 | } | |
142 | ||
143 | #endif /* ! GCC_WIDE_INT_BITMASK_H */ |