1 /* { dg-do compile } */
2 /* { dg-options "-O2 -ftree-vectorize" } */
3 
4 #include <stdint.h>
5 #include <stdbool.h>
6 
7 #define VEC_BOOL(NAME, OP, VARTYPE, INDUCTYPE)				\
8 void __attribute__ ((noinline, noclone))				\
9 vec_bool_##NAME##_##VARTYPE##_##INDUCTYPE (VARTYPE *dst, VARTYPE *src,	\
10 					   INDUCTYPE start,		\
11 					   INDUCTYPE n,			\
12 					   INDUCTYPE mask)		\
13 {									\
14   for (INDUCTYPE i = 0; i < n; i++)					\
15     {									\
16       bool lhs = i >= start;						\
17       bool rhs = (i & mask) != 0x3D;					\
18       if (lhs OP rhs)							\
19         dst[i] = src[i];						\
20     }									\
21 }
22 
23 #define TEST_OP(T, NAME, OP)			\
24   T (NAME, OP, uint8_t, uint8_t)		\
25   T (NAME, OP, uint16_t, uint16_t)		\
26   T (NAME, OP, uint32_t, uint32_t)		\
27   T (NAME, OP, uint64_t, uint64_t)		\
28   T (NAME, OP, float, uint32_t)			\
29   T (NAME, OP, double, uint64_t)
30 
31 #define TEST_ALL(T)				\
32   TEST_OP (T, cmpeq, ==)			\
33   TEST_OP (T, cmpne, !=)
34 
35 TEST_ALL (VEC_BOOL)
36 
37 /* Both cmpne and cmpeq loops will contain an exclusive predicate or.  */
38 /* { dg-final { scan-assembler-times {\teors?\tp[0-9]*\.b, p[0-7]/z, p[0-9]*\.b, p[0-9]*\.b\n} 12 } } */
39 /* cmpeq will also contain a masked predicate not operation, which gets
40    folded to BIC.  */
41 /* { dg-final { scan-assembler-times {\tbic\tp[0-9]+\.b, p[0-7]/z, p[0-9]+\.b, p[0-9]+\.b\n} 6 } } */
42