1 /* { dg-add-options vect_early_break } */
2 /* { dg-require-effective-target vect_early_break_hw } */
3 /* { dg-require-effective-target vect_int } */
5 /* { dg-additional-options "-O3" } */
6 /* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-* arm*-*-*" } } } } */
11 #include "tree-vect.h"
13 #if __INT_MAX__ > 2147483647L
14 # if __INT_MAX__ >= 9223372036854775807L
15 # define BITSIZEOF_INT 64
17 # define BITSIZEOF_INT 32
20 # if __INT_MAX__ >= 2147483647L
21 # define BITSIZEOF_INT 32
23 # define BITSIZEOF_INT 16
27 #if __LONG_MAX__ > 2147483647L
28 # if __LONG_MAX__ >= 9223372036854775807L
29 # define BITSIZEOF_LONG 64
31 # define BITSIZEOF_LONG 32
34 # define BITSIZEOF_LONG 32
37 #if __LONG_LONG_MAX__ > 2147483647L
38 # if __LONG_LONG_MAX__ >= 9223372036854775807L
39 # define BITSIZEOF_LONG_LONG 64
41 # define BITSIZEOF_LONG_LONG 32
44 # define BITSIZEOF_LONG_LONG 32
47 #define MAKE_FUNS(suffix, type) \
48 __attribute__((noinline)) \
49 int my_ffs##suffix(type x) { \
53 for (i = 0; i < CHAR_BIT * sizeof (type); i++) \
54 if (x & ((type) 1 << i)) \
59 int my_ctz##suffix(type x) { \
61 for (i = 0; i < CHAR_BIT * sizeof (type); i++) \
62 if (x & ((type) 1 << i)) \
67 __attribute__((noinline)) \
68 int my_clz##suffix(type x) { \
70 for (i = 0; i < CHAR_BIT * sizeof (type); i++) \
71 if (x & ((type) 1 << ((CHAR_BIT * sizeof (type)) - i - 1))) \
76 int my_clrsb##suffix(type x) { \
78 int leading = (x >> CHAR_BIT * sizeof (type) - 1) & 1; \
79 for (i = 1; i < CHAR_BIT * sizeof (type); i++) \
80 if (((x >> ((CHAR_BIT * sizeof (type)) - i - 1)) & 1) \
86 __attribute__((noinline)) \
87 int my_popcount##suffix(type x) { \
90 for (i = 0; i < CHAR_BIT * sizeof (type); i++) \
91 if (x & ((type) 1 << i)) \
96 __attribute__((noinline)) \
97 int my_parity##suffix(type x) { \
100 for (i = 0; i < CHAR_BIT * sizeof (type); i++) \
101 if (x & ((type) 1 << i)) \
106 MAKE_FUNS (ll
, unsigned long long);
108 extern void abort (void);
109 extern void exit (int);
145 0x0000000000000000ULL, \
146 0x0000000000000001ULL, \
147 0x8000000000000000ULL, \
148 0x0000000000000002ULL, \
149 0x4000000000000000ULL, \
150 0x0000000100000000ULL, \
151 0x0000000080000000ULL, \
152 0xa5a5a5a5a5a5a5a5ULL, \
153 0x5a5a5a5a5a5a5a5aULL, \
154 0xcafecafe00000000ULL, \
155 0x0000cafecafe0000ULL, \
156 0x00000000cafecafeULL, \
157 0xffffffffffffffffULL \
160 unsigned int ints
[] =
161 #if BITSIZEOF_INT == 64
163 #elif BITSIZEOF_INT == 32
169 unsigned long longs
[] =
170 #if BITSIZEOF_LONG == 64
176 unsigned long long longlongs
[] =
177 #if BITSIZEOF_LONG_LONG == 64
183 #define N(table) (sizeof (table) / sizeof (table[0]))
193 for (i
= 0; i
< N(longlongs
); i
++)
195 if (__builtin_ffsll (longlongs
[i
]) != my_ffsll (longlongs
[i
]))
197 if (longlongs
[i
] != 0
198 && __builtin_clzll (longlongs
[i
]) != my_clzll (longlongs
[i
]))
200 if (longlongs
[i
] != 0
201 && __builtin_ctzll (longlongs
[i
]) != my_ctzll (longlongs
[i
]))
203 if (__builtin_clrsbll (longlongs
[i
]) != my_clrsbll (longlongs
[i
]))
205 if (__builtin_popcountll (longlongs
[i
]) != my_popcountll (longlongs
[i
]))
207 if (__builtin_parityll (longlongs
[i
]) != my_parityll (longlongs
[i
]))
211 /* Test constant folding. */
213 #define TEST(x, suffix) \
214 if (__builtin_ffs##suffix (x) != my_ffs##suffix (x)) \
217 #if BITSIZEOF_LONG_LONG == 64
218 TEST(0x0000000000000000ULL
, ll
);
219 TEST(0x0000000000000001ULL
, ll
);
220 TEST(0x8000000000000000ULL
, ll
);
221 TEST(0x0000000000000002ULL
, ll
);
222 TEST(0x4000000000000000ULL
, ll
);
223 TEST(0x0000000100000000ULL
, ll
);
224 TEST(0x0000000080000000ULL
, ll
);
225 TEST(0xa5a5a5a5a5a5a5a5ULL
, ll
);
226 TEST(0x5a5a5a5a5a5a5a5aULL
, ll
);
227 TEST(0xcafecafe00000000ULL
, ll
);
228 TEST(0x0000cafecafe0000ULL
, ll
);
229 TEST(0x00000000cafecafeULL
, ll
);
230 TEST(0xffffffffffffffffULL
, ll
);