1 | /* Operation with 128 bit bitmask. |
2 | Copyright (C) 2013-2023 Free Software Foundation, Inc. |
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 | |
23 | class wide_int_bitmask |
24 | { |
25 | public: |
26 | constexpr wide_int_bitmask (); |
27 | constexpr wide_int_bitmask (uint64_t l); |
28 | constexpr wide_int_bitmask (uint64_t l, uint64_t h); |
29 | inline wide_int_bitmask &operator &= (wide_int_bitmask); |
30 | inline wide_int_bitmask &operator |= (wide_int_bitmask); |
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; |
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 | |
41 | constexpr |
42 | wide_int_bitmask::wide_int_bitmask () |
43 | : low (0), high (0) |
44 | { |
45 | } |
46 | |
47 | constexpr |
48 | wide_int_bitmask::wide_int_bitmask (uint64_t l) |
49 | : low (l), high (0) |
50 | { |
51 | } |
52 | |
53 | constexpr |
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 | |
75 | constexpr wide_int_bitmask |
76 | wide_int_bitmask::operator ~ () const |
77 | { |
78 | return wide_int_bitmask (~low, ~high); |
79 | } |
80 | |
81 | constexpr wide_int_bitmask |
82 | wide_int_bitmask::operator | (wide_int_bitmask b) const |
83 | { |
84 | return wide_int_bitmask (low | b.low, high | b.high); |
85 | } |
86 | |
87 | constexpr wide_int_bitmask |
88 | wide_int_bitmask::operator & (wide_int_bitmask b) const |
89 | { |
90 | return wide_int_bitmask (low & b.low, high & b.high); |
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 */ |
144 | |