4 #if __INT_MAX__ > 2147483647L
5 # if __INT_MAX__ >= 9223372036854775807L
6 # define BITSIZEOF_INT 64
8 # define BITSIZEOF_INT 32
11 # if __INT_MAX__ >= 2147483647L
12 # define BITSIZEOF_INT 32
14 # define BITSIZEOF_INT 16
18 #if __LONG_MAX__ > 2147483647L
19 # if __LONG_MAX__ >= 9223372036854775807L
20 # define BITSIZEOF_LONG 64
22 # define BITSIZEOF_LONG 32
25 # define BITSIZEOF_LONG 32
28 #if __LONG_LONG_MAX__ > 2147483647L
29 # if __LONG_LONG_MAX__ >= 9223372036854775807L
30 # define BITSIZEOF_LONG_LONG 64
32 # define BITSIZEOF_LONG_LONG 32
35 # define BITSIZEOF_LONG_LONG 32
38 #define MAKE_FUNS(suffix, type) \
39 int my_ffs##suffix(type x) { \
43 for (i = 0; i < CHAR_BIT * sizeof (type); i++) \
44 if (x & ((type) 1 << i)) \
49 int my_ctz##suffix(type x) { \
51 for (i = 0; i < CHAR_BIT * sizeof (type); i++) \
52 if (x & ((type) 1 << i)) \
57 int my_clz##suffix(type x) { \
59 for (i = 0; i < CHAR_BIT * sizeof (type); i++) \
60 if (x & ((type) 1 << ((CHAR_BIT * sizeof (type)) - i - 1))) \
65 int my_clrsb##suffix(type x) { \
67 int leading = (x >> CHAR_BIT * sizeof (type) - 1) & 1; \
68 for (i = 1; i < CHAR_BIT * sizeof (type); i++) \
69 if (((x >> ((CHAR_BIT * sizeof (type)) - i - 1)) & 1) \
75 int my_popcount##suffix(type x) { \
78 for (i = 0; i < CHAR_BIT * sizeof (type); i++) \
79 if (x & ((type) 1 << i)) \
84 int my_parity##suffix(type x) { \
87 for (i = 0; i < CHAR_BIT * sizeof (type); i++) \
88 if (x & ((type) 1 << i)) \
93 MAKE_FUNS (, unsigned);
94 MAKE_FUNS (l
, unsigned long);
95 MAKE_FUNS (ll
, unsigned long long);
97 extern void abort (void);
98 extern void exit (int);
134 0x0000000000000000ULL, \
135 0x0000000000000001ULL, \
136 0x8000000000000000ULL, \
137 0x0000000000000002ULL, \
138 0x4000000000000000ULL, \
139 0x0000000100000000ULL, \
140 0x0000000080000000ULL, \
141 0xa5a5a5a5a5a5a5a5ULL, \
142 0x5a5a5a5a5a5a5a5aULL, \
143 0xcafecafe00000000ULL, \
144 0x0000cafecafe0000ULL, \
145 0x00000000cafecafeULL, \
146 0xffffffffffffffffULL \
149 unsigned int ints
[] =
150 #if BITSIZEOF_INT == 64
152 #elif BITSIZEOF_INT == 32
158 unsigned long longs
[] =
159 #if BITSIZEOF_LONG == 64
165 unsigned long long longlongs
[] =
166 #if BITSIZEOF_LONG_LONG == 64
172 #define N(table) (sizeof (table) / sizeof (table[0]))
179 for (i
= 0; i
< N(ints
); i
++)
181 if (__builtin_ffs (ints
[i
]) != my_ffs (ints
[i
]))
184 && __builtin_clz (ints
[i
]) != my_clz (ints
[i
]))
187 && __builtin_ctz (ints
[i
]) != my_ctz (ints
[i
]))
189 if (__builtin_clrsb (ints
[i
]) != my_clrsb (ints
[i
]))
191 if (__builtin_popcount (ints
[i
]) != my_popcount (ints
[i
]))
193 if (__builtin_parity (ints
[i
]) != my_parity (ints
[i
]))
197 for (i
= 0; i
< N(longs
); i
++)
199 if (__builtin_ffsl (longs
[i
]) != my_ffsl (longs
[i
]))
202 && __builtin_clzl (longs
[i
]) != my_clzl (longs
[i
]))
205 && __builtin_ctzl (longs
[i
]) != my_ctzl (longs
[i
]))
207 if (__builtin_clrsbl (longs
[i
]) != my_clrsbl (longs
[i
]))
209 if (__builtin_popcountl (longs
[i
]) != my_popcountl (longs
[i
]))
211 if (__builtin_parityl (longs
[i
]) != my_parityl (longs
[i
]))
215 for (i
= 0; i
< N(longlongs
); i
++)
217 if (__builtin_ffsll (longlongs
[i
]) != my_ffsll (longlongs
[i
]))
219 if (longlongs
[i
] != 0
220 && __builtin_clzll (longlongs
[i
]) != my_clzll (longlongs
[i
]))
222 if (longlongs
[i
] != 0
223 && __builtin_ctzll (longlongs
[i
]) != my_ctzll (longlongs
[i
]))
225 if (__builtin_clrsbll (longlongs
[i
]) != my_clrsbll (longlongs
[i
]))
227 if (__builtin_popcountll (longlongs
[i
]) != my_popcountll (longlongs
[i
]))
229 if (__builtin_parityll (longlongs
[i
]) != my_parityll (longlongs
[i
]))
233 /* Test constant folding. */
235 #define TEST(x, suffix) \
236 if (__builtin_ffs##suffix (x) != my_ffs##suffix (x)) \
238 if (x != 0 && __builtin_clz##suffix (x) != my_clz##suffix (x)) \
240 if (x != 0 && __builtin_ctz##suffix (x) != my_ctz##suffix (x)) \
242 if (__builtin_clrsb##suffix (x) != my_clrsb##suffix (x)) \
244 if (__builtin_popcount##suffix (x) != my_popcount##suffix (x)) \
246 if (__builtin_parity##suffix (x) != my_parity##suffix (x)) \
249 #if BITSIZEOF_INT == 32
264 #if BITSIZEOF_LONG_LONG == 64
265 TEST(0x0000000000000000ULL
, ll
);
266 TEST(0x0000000000000001ULL
, ll
);
267 TEST(0x8000000000000000ULL
, ll
);
268 TEST(0x0000000000000002ULL
, ll
);
269 TEST(0x4000000000000000ULL
, ll
);
270 TEST(0x0000000100000000ULL
, ll
);
271 TEST(0x0000000080000000ULL
, ll
);
272 TEST(0xa5a5a5a5a5a5a5a5ULL
, ll
);
273 TEST(0x5a5a5a5a5a5a5a5aULL
, ll
);
274 TEST(0xcafecafe00000000ULL
, ll
);
275 TEST(0x0000cafecafe0000ULL
, ll
);
276 TEST(0x00000000cafecafeULL
, ll
);
277 TEST(0xffffffffffffffffULL
, ll
);