1 /* { dg-do compile } */
2 /* { dg-options "-O2 -ftree-vectorize -ffast-math" } */
3 
4 #include <stdint.h>
5 
6 #define TEST_LOOP(NAME, OUTTYPE, INTYPE, MASKTYPE)		\
7   void __attribute__ ((noinline, noclone))			\
8   NAME##_3 (OUTTYPE *__restrict dest, INTYPE *__restrict src,	\
9 	    MASKTYPE *__restrict cond, int n)			\
10   {								\
11     for (int i = 0; i < n; ++i)					\
12       if (cond[i])						\
13 	dest[i] = src[i * 3] + src[i * 3 + 1];			\
14   }
15 
16 #define TEST2(NAME, OUTTYPE, INTYPE) \
17   TEST_LOOP (NAME##_i8, OUTTYPE, INTYPE, int8_t) \
18   TEST_LOOP (NAME##_i16, OUTTYPE, INTYPE, uint16_t) \
19   TEST_LOOP (NAME##_f32, OUTTYPE, INTYPE, float) \
20   TEST_LOOP (NAME##_f64, OUTTYPE, INTYPE, double)
21 
22 #define TEST1(NAME, OUTTYPE) \
23   TEST2 (NAME##_i8, OUTTYPE, int8_t) \
24   TEST2 (NAME##_i16, OUTTYPE, uint16_t) \
25   TEST2 (NAME##_i32, OUTTYPE, int32_t) \
26   TEST2 (NAME##_i64, OUTTYPE, uint64_t)
27 
28 #define TEST(NAME) \
29   TEST1 (NAME##_i8, int8_t) \
30   TEST1 (NAME##_i16, uint16_t) \
31   TEST1 (NAME##_i32, int32_t) \
32   TEST1 (NAME##_i64, uint64_t) \
33   TEST2 (NAME##_f16_f16, _Float16, _Float16) \
34   TEST2 (NAME##_f32_f32, float, float) \
35   TEST2 (NAME##_f64_f64, double, double)
36 
37 TEST (test)
38 
39 /* { dg-final { scan-assembler-not {\tld3b\t} } } */
40 /* { dg-final { scan-assembler-not {\tld3h\t} } } */
41 /* { dg-final { scan-assembler-not {\tld3w\t} } } */
42 /* { dg-final { scan-assembler-not {\tld3d\t} } } */
43