1 /* Operation with 128 bit bitmask.
2 Copyright (C) 2013-2018 Free Software Foundation, Inc.
4 This file is part of GCC.
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
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
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/>. */
20 #ifndef GCC_WIDE_INT_BITMASK_H
21 #define GCC_WIDE_INT_BITMASK_H
23 struct wide_int_bitmask
25 inline wide_int_bitmask ();
26 inline wide_int_bitmask (uint64_t l
);
27 inline wide_int_bitmask (uint64_t l
, uint64_t h
);
28 inline wide_int_bitmask
&operator &= (wide_int_bitmask
);
29 inline wide_int_bitmask
&operator |= (wide_int_bitmask
);
30 inline wide_int_bitmask
operator ~ () const;
31 inline wide_int_bitmask
operator & (wide_int_bitmask
) const;
32 inline wide_int_bitmask
operator | (wide_int_bitmask
) const;
33 inline wide_int_bitmask
operator >> (int);
34 inline wide_int_bitmask
operator << (int);
35 inline bool operator == (wide_int_bitmask
) const;
36 inline bool operator != (wide_int_bitmask
) const;
41 wide_int_bitmask::wide_int_bitmask ()
47 wide_int_bitmask::wide_int_bitmask (uint64_t l
)
53 wide_int_bitmask::wide_int_bitmask (uint64_t l
, uint64_t h
)
58 inline wide_int_bitmask
&
59 wide_int_bitmask::operator &= (wide_int_bitmask b
)
66 inline wide_int_bitmask
&
67 wide_int_bitmask::operator |= (wide_int_bitmask b
)
74 inline wide_int_bitmask
75 wide_int_bitmask::operator ~ () const
77 wide_int_bitmask
ret (~low
, ~high
);
81 inline wide_int_bitmask
82 wide_int_bitmask::operator | (wide_int_bitmask b
) const
84 wide_int_bitmask
ret (low
| b
.low
, high
| b
.high
);
88 inline wide_int_bitmask
89 wide_int_bitmask::operator & (wide_int_bitmask b
) const
91 wide_int_bitmask
ret (low
& b
.low
, high
& b
.high
);
95 inline wide_int_bitmask
96 wide_int_bitmask::operator << (int amount
)
102 ret
.high
= low
<< (amount
- 64);
104 else if (amount
== 0)
108 ret
.low
= low
<< amount
;
109 ret
.high
= (low
>> (64 - amount
)) | (high
<< amount
);
114 inline wide_int_bitmask
115 wide_int_bitmask::operator >> (int amount
)
117 wide_int_bitmask ret
;
120 ret
.low
= high
>> (amount
- 64);
123 else if (amount
== 0)
127 ret
.low
= (high
<< (64 - amount
)) | (low
>> amount
);
128 ret
.high
= high
>> amount
;
134 wide_int_bitmask::operator == (wide_int_bitmask b
) const
136 return low
== b
.low
&& high
== b
.high
;
140 wide_int_bitmask::operator != (wide_int_bitmask b
) const
142 return low
!= b
.low
|| high
!= b
.high
;
145 #endif /* ! GCC_WIDE_INT_BITMASK_H */