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