xref: /aosp_15_r20/external/llvm-libc/include/llvm-libc-macros/stdbit-macros.h (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
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
stdc_leading_zeros(unsigned char x)19 inline unsigned stdc_leading_zeros(unsigned char x) {
20   return stdc_leading_zeros_uc(x);
21 }
stdc_leading_zeros(unsigned short x)22 inline unsigned stdc_leading_zeros(unsigned short x) {
23   return stdc_leading_zeros_us(x);
24 }
stdc_leading_zeros(unsigned x)25 inline unsigned stdc_leading_zeros(unsigned x) {
26   return stdc_leading_zeros_ui(x);
27 }
stdc_leading_zeros(unsigned long x)28 inline unsigned stdc_leading_zeros(unsigned long x) {
29   return stdc_leading_zeros_ul(x);
30 }
stdc_leading_zeros(unsigned long long x)31 inline unsigned stdc_leading_zeros(unsigned long long x) {
32   return stdc_leading_zeros_ull(x);
33 }
stdc_leading_ones(unsigned char x)34 inline unsigned stdc_leading_ones(unsigned char x) {
35   return stdc_leading_ones_uc(x);
36 }
stdc_leading_ones(unsigned short x)37 inline unsigned stdc_leading_ones(unsigned short x) {
38   return stdc_leading_ones_us(x);
39 }
stdc_leading_ones(unsigned x)40 inline unsigned stdc_leading_ones(unsigned x) {
41   return stdc_leading_ones_ui(x);
42 }
stdc_leading_ones(unsigned long x)43 inline unsigned stdc_leading_ones(unsigned long x) {
44   return stdc_leading_ones_ul(x);
45 }
stdc_leading_ones(unsigned long long x)46 inline unsigned stdc_leading_ones(unsigned long long x) {
47   return stdc_leading_ones_ull(x);
48 }
stdc_trailing_zeros(unsigned char x)49 inline unsigned stdc_trailing_zeros(unsigned char x) {
50   return stdc_trailing_zeros_uc(x);
51 }
stdc_trailing_zeros(unsigned short x)52 inline unsigned stdc_trailing_zeros(unsigned short x) {
53   return stdc_trailing_zeros_us(x);
54 }
stdc_trailing_zeros(unsigned x)55 inline unsigned stdc_trailing_zeros(unsigned x) {
56   return stdc_trailing_zeros_ui(x);
57 }
stdc_trailing_zeros(unsigned long x)58 inline unsigned stdc_trailing_zeros(unsigned long x) {
59   return stdc_trailing_zeros_ul(x);
60 }
stdc_trailing_zeros(unsigned long long x)61 inline unsigned stdc_trailing_zeros(unsigned long long x) {
62   return stdc_trailing_zeros_ull(x);
63 }
stdc_trailing_ones(unsigned char x)64 inline unsigned stdc_trailing_ones(unsigned char x) {
65   return stdc_trailing_ones_uc(x);
66 }
stdc_trailing_ones(unsigned short x)67 inline unsigned stdc_trailing_ones(unsigned short x) {
68   return stdc_trailing_ones_us(x);
69 }
stdc_trailing_ones(unsigned x)70 inline unsigned stdc_trailing_ones(unsigned x) {
71   return stdc_trailing_ones_ui(x);
72 }
stdc_trailing_ones(unsigned long x)73 inline unsigned stdc_trailing_ones(unsigned long x) {
74   return stdc_trailing_ones_ul(x);
75 }
stdc_trailing_ones(unsigned long long x)76 inline unsigned stdc_trailing_ones(unsigned long long x) {
77   return stdc_trailing_ones_ull(x);
78 }
stdc_first_leading_zero(unsigned char x)79 inline unsigned stdc_first_leading_zero(unsigned char x) {
80   return stdc_first_leading_zero_uc(x);
81 }
stdc_first_leading_zero(unsigned short x)82 inline unsigned stdc_first_leading_zero(unsigned short x) {
83   return stdc_first_leading_zero_us(x);
84 }
stdc_first_leading_zero(unsigned x)85 inline unsigned stdc_first_leading_zero(unsigned x) {
86   return stdc_first_leading_zero_ui(x);
87 }
stdc_first_leading_zero(unsigned long x)88 inline unsigned stdc_first_leading_zero(unsigned long x) {
89   return stdc_first_leading_zero_ul(x);
90 }
stdc_first_leading_zero(unsigned long long x)91 inline unsigned stdc_first_leading_zero(unsigned long long x) {
92   return stdc_first_leading_zero_ull(x);
93 }
stdc_first_leading_one(unsigned char x)94 inline unsigned stdc_first_leading_one(unsigned char x) {
95   return stdc_first_leading_one_uc(x);
96 }
stdc_first_leading_one(unsigned short x)97 inline unsigned stdc_first_leading_one(unsigned short x) {
98   return stdc_first_leading_one_us(x);
99 }
stdc_first_leading_one(unsigned x)100 inline unsigned stdc_first_leading_one(unsigned x) {
101   return stdc_first_leading_one_ui(x);
102 }
stdc_first_leading_one(unsigned long x)103 inline unsigned stdc_first_leading_one(unsigned long x) {
104   return stdc_first_leading_one_ul(x);
105 }
stdc_first_leading_one(unsigned long long x)106 inline unsigned stdc_first_leading_one(unsigned long long x) {
107   return stdc_first_leading_one_ull(x);
108 }
stdc_first_trailing_zero(unsigned char x)109 inline unsigned stdc_first_trailing_zero(unsigned char x) {
110   return stdc_first_trailing_zero_uc(x);
111 }
stdc_first_trailing_zero(unsigned short x)112 inline unsigned stdc_first_trailing_zero(unsigned short x) {
113   return stdc_first_trailing_zero_us(x);
114 }
stdc_first_trailing_zero(unsigned x)115 inline unsigned stdc_first_trailing_zero(unsigned x) {
116   return stdc_first_trailing_zero_ui(x);
117 }
stdc_first_trailing_zero(unsigned long x)118 inline unsigned stdc_first_trailing_zero(unsigned long x) {
119   return stdc_first_trailing_zero_ul(x);
120 }
stdc_first_trailing_zero(unsigned long long x)121 inline unsigned stdc_first_trailing_zero(unsigned long long x) {
122   return stdc_first_trailing_zero_ull(x);
123 }
stdc_first_trailing_one(unsigned char x)124 inline unsigned stdc_first_trailing_one(unsigned char x) {
125   return stdc_first_trailing_one_uc(x);
126 }
stdc_first_trailing_one(unsigned short x)127 inline unsigned stdc_first_trailing_one(unsigned short x) {
128   return stdc_first_trailing_one_us(x);
129 }
stdc_first_trailing_one(unsigned x)130 inline unsigned stdc_first_trailing_one(unsigned x) {
131   return stdc_first_trailing_one_ui(x);
132 }
stdc_first_trailing_one(unsigned long x)133 inline unsigned stdc_first_trailing_one(unsigned long x) {
134   return stdc_first_trailing_one_ul(x);
135 }
stdc_first_trailing_one(unsigned long long x)136 inline unsigned stdc_first_trailing_one(unsigned long long x) {
137   return stdc_first_trailing_one_ull(x);
138 }
stdc_count_zeros(unsigned char x)139 inline unsigned stdc_count_zeros(unsigned char x) {
140   return stdc_count_zeros_uc(x);
141 }
stdc_count_zeros(unsigned short x)142 inline unsigned stdc_count_zeros(unsigned short x) {
143   return stdc_count_zeros_us(x);
144 }
stdc_count_zeros(unsigned x)145 inline unsigned stdc_count_zeros(unsigned x) { return stdc_count_zeros_ui(x); }
stdc_count_zeros(unsigned long x)146 inline unsigned stdc_count_zeros(unsigned long x) {
147   return stdc_count_zeros_ul(x);
148 }
stdc_count_zeros(unsigned long long x)149 inline unsigned stdc_count_zeros(unsigned long long x) {
150   return stdc_count_zeros_ull(x);
151 }
stdc_count_ones(unsigned char x)152 inline unsigned stdc_count_ones(unsigned char x) {
153   return stdc_count_ones_uc(x);
154 }
stdc_count_ones(unsigned short x)155 inline unsigned stdc_count_ones(unsigned short x) {
156   return stdc_count_ones_us(x);
157 }
stdc_count_ones(unsigned x)158 inline unsigned stdc_count_ones(unsigned x) { return stdc_count_ones_ui(x); }
stdc_count_ones(unsigned long x)159 inline unsigned stdc_count_ones(unsigned long x) {
160   return stdc_count_ones_ul(x);
161 }
stdc_count_ones(unsigned long long x)162 inline unsigned stdc_count_ones(unsigned long long x) {
163   return stdc_count_ones_ull(x);
164 }
stdc_has_single_bit(unsigned char x)165 inline bool stdc_has_single_bit(unsigned char x) {
166   return stdc_has_single_bit_uc(x);
167 }
stdc_has_single_bit(unsigned short x)168 inline bool stdc_has_single_bit(unsigned short x) {
169   return stdc_has_single_bit_us(x);
170 }
stdc_has_single_bit(unsigned x)171 inline bool stdc_has_single_bit(unsigned x) {
172   return stdc_has_single_bit_ui(x);
173 }
stdc_has_single_bit(unsigned long x)174 inline bool stdc_has_single_bit(unsigned long x) {
175   return stdc_has_single_bit_ul(x);
176 }
stdc_has_single_bit(unsigned long long x)177 inline bool stdc_has_single_bit(unsigned long long x) {
178   return stdc_has_single_bit_ull(x);
179 }
stdc_bit_width(unsigned char x)180 inline unsigned stdc_bit_width(unsigned char x) { return stdc_bit_width_uc(x); }
stdc_bit_width(unsigned short x)181 inline unsigned stdc_bit_width(unsigned short x) {
182   return stdc_bit_width_us(x);
183 }
stdc_bit_width(unsigned x)184 inline unsigned stdc_bit_width(unsigned x) { return stdc_bit_width_ui(x); }
stdc_bit_width(unsigned long x)185 inline unsigned stdc_bit_width(unsigned long x) { return stdc_bit_width_ul(x); }
stdc_bit_width(unsigned long long x)186 inline unsigned stdc_bit_width(unsigned long long x) {
187   return stdc_bit_width_ull(x);
188 }
stdc_bit_floor(unsigned char x)189 inline unsigned char stdc_bit_floor(unsigned char x) {
190   return stdc_bit_floor_uc(x);
191 }
stdc_bit_floor(unsigned short x)192 inline unsigned short stdc_bit_floor(unsigned short x) {
193   return stdc_bit_floor_us(x);
194 }
stdc_bit_floor(unsigned x)195 inline unsigned stdc_bit_floor(unsigned x) { return stdc_bit_floor_ui(x); }
stdc_bit_floor(unsigned long x)196 inline unsigned long stdc_bit_floor(unsigned long x) {
197   return stdc_bit_floor_ul(x);
198 }
stdc_bit_floor(unsigned long long x)199 inline unsigned long long stdc_bit_floor(unsigned long long x) {
200   return stdc_bit_floor_ull(x);
201 }
stdc_bit_ceil(unsigned char x)202 inline unsigned char stdc_bit_ceil(unsigned char x) {
203   return stdc_bit_ceil_uc(x);
204 }
stdc_bit_ceil(unsigned short x)205 inline unsigned short stdc_bit_ceil(unsigned short x) {
206   return stdc_bit_ceil_us(x);
207 }
stdc_bit_ceil(unsigned x)208 inline unsigned stdc_bit_ceil(unsigned x) { return stdc_bit_ceil_ui(x); }
stdc_bit_ceil(unsigned long x)209 inline unsigned long stdc_bit_ceil(unsigned long x) {
210   return stdc_bit_ceil_ul(x);
211 }
stdc_bit_ceil(unsigned long long x)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