Branch data Line data Source code
1 : : /* Operation with 128 bit bitmask.
2 : : Copyright (C) 2013-2024 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 : 282672628 : wide_int_bitmask::wide_int_bitmask (uint64_t l)
49 : 1416 : : low (l), high (0)
50 : : {
51 : : }
52 : :
53 : : constexpr
54 : 6638263366 : 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 : 18087 : wide_int_bitmask::operator &= (wide_int_bitmask b)
61 : : {
62 : 18087 : low &= b.low;
63 : 18087 : high &= b.high;
64 : 18087 : return *this;
65 : : }
66 : :
67 : : inline wide_int_bitmask &
68 : 63609 : wide_int_bitmask::operator |= (wide_int_bitmask b)
69 : : {
70 : 63609 : low |= b.low;
71 : 63609 : high |= b.high;
72 : 63609 : return *this;
73 : : }
74 : :
75 : : constexpr wide_int_bitmask
76 : 18087 : wide_int_bitmask::operator ~ () const
77 : : {
78 : 18087 : return wide_int_bitmask (~low, ~high);
79 : : }
80 : :
81 : : constexpr wide_int_bitmask
82 : 121889 : wide_int_bitmask::operator | (wide_int_bitmask b) const
83 : : {
84 : 20894 : return wide_int_bitmask (low | b.low, high | b.high);
85 : : }
86 : :
87 : : constexpr wide_int_bitmask
88 : 6638158579 : wide_int_bitmask::operator & (wide_int_bitmask b) const
89 : : {
90 : 284257465 : return wide_int_bitmask (low & b.low, high & b.high);
91 : : }
92 : :
93 : : inline wide_int_bitmask
94 : 624 : wide_int_bitmask::operator << (int amount)
95 : : {
96 : 389567 : wide_int_bitmask ret;
97 : 624 : if (amount >= 64)
98 : : {
99 : 1298 : ret.low = 0;
100 : 217 : ret.high = low << (amount - 64);
101 : : }
102 : 407 : else if (amount == 0)
103 : : ret = *this;
104 : : else
105 : : {
106 : 122012 : ret.low = low << amount;
107 : 407 : ret.high = (low >> (64 - amount)) | (high << amount);
108 : : }
109 : 624 : return ret;
110 : : }
111 : :
112 : : inline wide_int_bitmask
113 : 105601 : wide_int_bitmask::operator >> (int amount)
114 : : {
115 : 105601 : wide_int_bitmask ret;
116 : 97614 : if (amount >= 64)
117 : : {
118 : 18938 : ret.low = high >> (amount - 64);
119 : 17465 : ret.high = 0;
120 : : }
121 : 80149 : else if (amount == 0)
122 : 0 : ret = *this;
123 : : else
124 : : {
125 : 86663 : ret.low = (high << (64 - amount)) | (low >> amount);
126 : 80149 : ret.high = high >> amount;
127 : : }
128 : 105601 : return ret;
129 : : }
130 : :
131 : : inline bool
132 : 113756174 : wide_int_bitmask::operator == (wide_int_bitmask b) const
133 : : {
134 : 113717902 : return low == b.low && high == b.high;
135 : : }
136 : :
137 : : inline bool
138 : 6524402405 : wide_int_bitmask::operator != (wide_int_bitmask b) const
139 : : {
140 : 643533284 : return low != b.low || high != b.high;
141 : : }
142 : :
143 : : #endif /* ! GCC_WIDE_INT_BITMASK_H */
|