1 | //===-- Definition of macros to be used with stdbit functions ----------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef __LLVM_LIBC_MACROS_STDBIT_MACROS_H |
10 | #define __LLVM_LIBC_MACROS_STDBIT_MACROS_H |
11 | |
12 | #define __STDC_VERSION_STDBIT_H__ 202311L |
13 | #define __STDC_ENDIAN_LITTLE__ __ORDER_LITTLE_ENDIAN__ |
14 | #define __STDC_ENDIAN_BIG__ __ORDER_BIG_ENDIAN__ |
15 | #define __STDC_ENDIAN_NATIVE__ __BYTE_ORDER__ |
16 | |
17 | // TODO(https://github.com/llvm/llvm-project/issues/80509): support _BitInt(). |
18 | #ifdef __cplusplus |
19 | inline unsigned stdc_leading_zeros(unsigned char x) { |
20 | return stdc_leading_zeros_uc(x); |
21 | } |
22 | inline unsigned stdc_leading_zeros(unsigned short x) { |
23 | return stdc_leading_zeros_us(x); |
24 | } |
25 | inline unsigned stdc_leading_zeros(unsigned x) { |
26 | return stdc_leading_zeros_ui(x); |
27 | } |
28 | inline unsigned stdc_leading_zeros(unsigned long x) { |
29 | return stdc_leading_zeros_ul(x); |
30 | } |
31 | inline unsigned stdc_leading_zeros(unsigned long long x) { |
32 | return stdc_leading_zeros_ull(x); |
33 | } |
34 | inline unsigned stdc_leading_ones(unsigned char x) { |
35 | return stdc_leading_ones_uc(x); |
36 | } |
37 | inline unsigned stdc_leading_ones(unsigned short x) { |
38 | return stdc_leading_ones_us(x); |
39 | } |
40 | inline unsigned stdc_leading_ones(unsigned x) { |
41 | return stdc_leading_ones_ui(x); |
42 | } |
43 | inline unsigned stdc_leading_ones(unsigned long x) { |
44 | return stdc_leading_ones_ul(x); |
45 | } |
46 | inline unsigned stdc_leading_ones(unsigned long long x) { |
47 | return stdc_leading_ones_ull(x); |
48 | } |
49 | inline unsigned stdc_trailing_zeros(unsigned char x) { |
50 | return stdc_trailing_zeros_uc(x); |
51 | } |
52 | inline unsigned stdc_trailing_zeros(unsigned short x) { |
53 | return stdc_trailing_zeros_us(x); |
54 | } |
55 | inline unsigned stdc_trailing_zeros(unsigned x) { |
56 | return stdc_trailing_zeros_ui(x); |
57 | } |
58 | inline unsigned stdc_trailing_zeros(unsigned long x) { |
59 | return stdc_trailing_zeros_ul(x); |
60 | } |
61 | inline unsigned stdc_trailing_zeros(unsigned long long x) { |
62 | return stdc_trailing_zeros_ull(x); |
63 | } |
64 | inline unsigned stdc_trailing_ones(unsigned char x) { |
65 | return stdc_trailing_ones_uc(x); |
66 | } |
67 | inline unsigned stdc_trailing_ones(unsigned short x) { |
68 | return stdc_trailing_ones_us(x); |
69 | } |
70 | inline unsigned stdc_trailing_ones(unsigned x) { |
71 | return stdc_trailing_ones_ui(x); |
72 | } |
73 | inline unsigned stdc_trailing_ones(unsigned long x) { |
74 | return stdc_trailing_ones_ul(x); |
75 | } |
76 | inline unsigned stdc_trailing_ones(unsigned long long x) { |
77 | return stdc_trailing_ones_ull(x); |
78 | } |
79 | inline unsigned stdc_first_leading_zero(unsigned char x) { |
80 | return stdc_first_leading_zero_uc(x); |
81 | } |
82 | inline unsigned stdc_first_leading_zero(unsigned short x) { |
83 | return stdc_first_leading_zero_us(x); |
84 | } |
85 | inline unsigned stdc_first_leading_zero(unsigned x) { |
86 | return stdc_first_leading_zero_ui(x); |
87 | } |
88 | inline unsigned stdc_first_leading_zero(unsigned long x) { |
89 | return stdc_first_leading_zero_ul(x); |
90 | } |
91 | inline unsigned stdc_first_leading_zero(unsigned long long x) { |
92 | return stdc_first_leading_zero_ull(x); |
93 | } |
94 | inline unsigned stdc_first_leading_one(unsigned char x) { |
95 | return stdc_first_leading_one_uc(x); |
96 | } |
97 | inline unsigned stdc_first_leading_one(unsigned short x) { |
98 | return stdc_first_leading_one_us(x); |
99 | } |
100 | inline unsigned stdc_first_leading_one(unsigned x) { |
101 | return stdc_first_leading_one_ui(x); |
102 | } |
103 | inline unsigned stdc_first_leading_one(unsigned long x) { |
104 | return stdc_first_leading_one_ul(x); |
105 | } |
106 | inline unsigned stdc_first_leading_one(unsigned long long x) { |
107 | return stdc_first_leading_one_ull(x); |
108 | } |
109 | inline unsigned stdc_first_trailing_zero(unsigned char x) { |
110 | return stdc_first_trailing_zero_uc(x); |
111 | } |
112 | inline unsigned stdc_first_trailing_zero(unsigned short x) { |
113 | return stdc_first_trailing_zero_us(x); |
114 | } |
115 | inline unsigned stdc_first_trailing_zero(unsigned x) { |
116 | return stdc_first_trailing_zero_ui(x); |
117 | } |
118 | inline unsigned stdc_first_trailing_zero(unsigned long x) { |
119 | return stdc_first_trailing_zero_ul(x); |
120 | } |
121 | inline unsigned stdc_first_trailing_zero(unsigned long long x) { |
122 | return stdc_first_trailing_zero_ull(x); |
123 | } |
124 | inline unsigned stdc_first_trailing_one(unsigned char x) { |
125 | return stdc_first_trailing_one_uc(x); |
126 | } |
127 | inline unsigned stdc_first_trailing_one(unsigned short x) { |
128 | return stdc_first_trailing_one_us(x); |
129 | } |
130 | inline unsigned stdc_first_trailing_one(unsigned x) { |
131 | return stdc_first_trailing_one_ui(x); |
132 | } |
133 | inline unsigned stdc_first_trailing_one(unsigned long x) { |
134 | return stdc_first_trailing_one_ul(x); |
135 | } |
136 | inline unsigned stdc_first_trailing_one(unsigned long long x) { |
137 | return stdc_first_trailing_one_ull(x); |
138 | } |
139 | inline unsigned stdc_count_zeros(unsigned char x) { |
140 | return stdc_count_zeros_uc(x); |
141 | } |
142 | inline unsigned stdc_count_zeros(unsigned short x) { |
143 | return stdc_count_zeros_us(x); |
144 | } |
145 | inline unsigned stdc_count_zeros(unsigned x) { return stdc_count_zeros_ui(x); } |
146 | inline unsigned stdc_count_zeros(unsigned long x) { |
147 | return stdc_count_zeros_ul(x); |
148 | } |
149 | inline unsigned stdc_count_zeros(unsigned long long x) { |
150 | return stdc_count_zeros_ull(x); |
151 | } |
152 | inline unsigned stdc_count_ones(unsigned char x) { |
153 | return stdc_count_ones_uc(x); |
154 | } |
155 | inline unsigned stdc_count_ones(unsigned short x) { |
156 | return stdc_count_ones_us(x); |
157 | } |
158 | inline unsigned stdc_count_ones(unsigned x) { return stdc_count_ones_ui(x); } |
159 | inline unsigned stdc_count_ones(unsigned long x) { |
160 | return stdc_count_ones_ul(x); |
161 | } |
162 | inline unsigned stdc_count_ones(unsigned long long x) { |
163 | return stdc_count_ones_ull(x); |
164 | } |
165 | inline bool stdc_has_single_bit(unsigned char x) { |
166 | return stdc_has_single_bit_uc(x); |
167 | } |
168 | inline bool stdc_has_single_bit(unsigned short x) { |
169 | return stdc_has_single_bit_us(x); |
170 | } |
171 | inline bool stdc_has_single_bit(unsigned x) { |
172 | return stdc_has_single_bit_ui(x); |
173 | } |
174 | inline bool stdc_has_single_bit(unsigned long x) { |
175 | return stdc_has_single_bit_ul(x); |
176 | } |
177 | inline bool stdc_has_single_bit(unsigned long long x) { |
178 | return stdc_has_single_bit_ull(x); |
179 | } |
180 | inline unsigned stdc_bit_width(unsigned char x) { return stdc_bit_width_uc(x); } |
181 | inline unsigned stdc_bit_width(unsigned short x) { |
182 | return stdc_bit_width_us(x); |
183 | } |
184 | inline unsigned stdc_bit_width(unsigned x) { return stdc_bit_width_ui(x); } |
185 | inline unsigned stdc_bit_width(unsigned long x) { return stdc_bit_width_ul(x); } |
186 | inline unsigned stdc_bit_width(unsigned long long x) { |
187 | return stdc_bit_width_ull(x); |
188 | } |
189 | inline unsigned char stdc_bit_floor(unsigned char x) { |
190 | return stdc_bit_floor_uc(x); |
191 | } |
192 | inline unsigned short stdc_bit_floor(unsigned short x) { |
193 | return stdc_bit_floor_us(x); |
194 | } |
195 | inline unsigned stdc_bit_floor(unsigned x) { return stdc_bit_floor_ui(x); } |
196 | inline unsigned long stdc_bit_floor(unsigned long x) { |
197 | return stdc_bit_floor_ul(x); |
198 | } |
199 | inline unsigned long long stdc_bit_floor(unsigned long long x) { |
200 | return stdc_bit_floor_ull(x); |
201 | } |
202 | inline unsigned char stdc_bit_ceil(unsigned char x) { |
203 | return stdc_bit_ceil_uc(x); |
204 | } |
205 | inline unsigned short stdc_bit_ceil(unsigned short x) { |
206 | return stdc_bit_ceil_us(x); |
207 | } |
208 | inline unsigned stdc_bit_ceil(unsigned x) { return stdc_bit_ceil_ui(x); } |
209 | inline unsigned long stdc_bit_ceil(unsigned long x) { |
210 | return stdc_bit_ceil_ul(x); |
211 | } |
212 | inline unsigned long long stdc_bit_ceil(unsigned long long x) { |
213 | return stdc_bit_ceil_ull(x); |
214 | } |
215 | #else |
216 | #define stdc_leading_zeros(x) \ |
217 | _Generic((x), \ |
218 | unsigned char: stdc_leading_zeros_uc, \ |
219 | unsigned short: stdc_leading_zeros_us, \ |
220 | unsigned: stdc_leading_zeros_ui, \ |
221 | unsigned long: stdc_leading_zeros_ul, \ |
222 | unsigned long long: stdc_leading_zeros_ull)(x) |
223 | #define stdc_leading_ones(x) \ |
224 | _Generic((x), \ |
225 | unsigned char: stdc_leading_ones_uc, \ |
226 | unsigned short: stdc_leading_ones_us, \ |
227 | unsigned: stdc_leading_ones_ui, \ |
228 | unsigned long: stdc_leading_ones_ul, \ |
229 | unsigned long long: stdc_leading_ones_ull)(x) |
230 | #define stdc_trailing_zeros(x) \ |
231 | _Generic((x), \ |
232 | unsigned char: stdc_trailing_zeros_uc, \ |
233 | unsigned short: stdc_trailing_zeros_us, \ |
234 | unsigned: stdc_trailing_zeros_ui, \ |
235 | unsigned long: stdc_trailing_zeros_ul, \ |
236 | unsigned long long: stdc_trailing_zeros_ull)(x) |
237 | #define stdc_trailing_ones(x) \ |
238 | _Generic((x), \ |
239 | unsigned char: stdc_trailing_ones_uc, \ |
240 | unsigned short: stdc_trailing_ones_us, \ |
241 | unsigned: stdc_trailing_ones_ui, \ |
242 | unsigned long: stdc_trailing_ones_ul, \ |
243 | unsigned long long: stdc_trailing_ones_ull)(x) |
244 | #define stdc_first_leading_zero(x) \ |
245 | _Generic((x), \ |
246 | unsigned char: stdc_first_leading_zero_uc, \ |
247 | unsigned short: stdc_first_leading_zero_us, \ |
248 | unsigned: stdc_first_leading_zero_ui, \ |
249 | unsigned long: stdc_first_leading_zero_ul, \ |
250 | unsigned long long: stdc_first_leading_zero_ull)(x) |
251 | #define stdc_first_leading_one(x) \ |
252 | _Generic((x), \ |
253 | unsigned char: stdc_first_leading_one_uc, \ |
254 | unsigned short: stdc_first_leading_one_us, \ |
255 | unsigned: stdc_first_leading_one_ui, \ |
256 | unsigned long: stdc_first_leading_one_ul, \ |
257 | unsigned long long: stdc_first_leading_one_ull)(x) |
258 | #define stdc_first_trailing_zero(x) \ |
259 | _Generic((x), \ |
260 | unsigned char: stdc_first_trailing_zero_uc, \ |
261 | unsigned short: stdc_first_trailing_zero_us, \ |
262 | unsigned: stdc_first_trailing_zero_ui, \ |
263 | unsigned long: stdc_first_trailing_zero_ul, \ |
264 | unsigned long long: stdc_first_trailing_zero_ull)(x) |
265 | #define stdc_first_trailing_one(x) \ |
266 | _Generic((x), \ |
267 | unsigned char: stdc_first_trailing_one_uc, \ |
268 | unsigned short: stdc_first_trailing_one_us, \ |
269 | unsigned: stdc_first_trailing_one_ui, \ |
270 | unsigned long: stdc_first_trailing_one_ul, \ |
271 | unsigned long long: stdc_first_trailing_one_ull)(x) |
272 | #define stdc_count_zeros(x) \ |
273 | _Generic((x), \ |
274 | unsigned char: stdc_count_zeros_uc, \ |
275 | unsigned short: stdc_count_zeros_us, \ |
276 | unsigned: stdc_count_zeros_ui, \ |
277 | unsigned long: stdc_count_zeros_ul, \ |
278 | unsigned long long: stdc_count_zeros_ull)(x) |
279 | #define stdc_count_ones(x) \ |
280 | _Generic((x), \ |
281 | unsigned char: stdc_count_ones_uc, \ |
282 | unsigned short: stdc_count_ones_us, \ |
283 | unsigned: stdc_count_ones_ui, \ |
284 | unsigned long: stdc_count_ones_ul, \ |
285 | unsigned long long: stdc_count_ones_ull)(x) |
286 | #define stdc_has_single_bit(x) \ |
287 | _Generic((x), \ |
288 | unsigned char: stdc_has_single_bit_uc, \ |
289 | unsigned short: stdc_has_single_bit_us, \ |
290 | unsigned: stdc_has_single_bit_ui, \ |
291 | unsigned long: stdc_has_single_bit_ul, \ |
292 | unsigned long long: stdc_has_single_bit_ull)(x) |
293 | #define stdc_bit_width(x) \ |
294 | _Generic((x), \ |
295 | unsigned char: stdc_bit_width_uc, \ |
296 | unsigned short: stdc_bit_width_us, \ |
297 | unsigned: stdc_bit_width_ui, \ |
298 | unsigned long: stdc_bit_width_ul, \ |
299 | unsigned long long: stdc_bit_width_ull)(x) |
300 | #define stdc_bit_floor(x) \ |
301 | _Generic((x), \ |
302 | unsigned char: stdc_bit_floor_uc, \ |
303 | unsigned short: stdc_bit_floor_us, \ |
304 | unsigned: stdc_bit_floor_ui, \ |
305 | unsigned long: stdc_bit_floor_ul, \ |
306 | unsigned long long: stdc_bit_floor_ull)(x) |
307 | #define stdc_bit_ceil(x) \ |
308 | _Generic((x), \ |
309 | unsigned char: stdc_bit_ceil_uc, \ |
310 | unsigned short: stdc_bit_ceil_us, \ |
311 | unsigned: stdc_bit_ceil_ui, \ |
312 | unsigned long: stdc_bit_ceil_ul, \ |
313 | unsigned long long: stdc_bit_ceil_ull)(x) |
314 | #endif // __cplusplus |
315 | |
316 | #endif // __LLVM_LIBC_MACROS_STDBIT_MACROS_H |
317 | |