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