1 /* { dg-do compile } */ 2 /* { dg-options "-O2 -ftree-vectorize" } */ 3 4 #define N 119 5 6 #define DEF_LOOP(INV, TYPE, CMPTYPE, SUFFIX) \ 7 void __attribute__ ((noipa)) \ 8 f_##INV##_##SUFFIX (TYPE *restrict a, TYPE *restrict b, \ 9 TYPE *restrict c, TYPE *restrict d, \ 10 CMPTYPE *restrict cond) \ 11 { \ 12 for (int i = 0; i < N; ++i) \ 13 { \ 14 TYPE mb = (INV & 1 ? -b[i] : b[i]); \ 15 TYPE mc = c[i]; \ 16 TYPE md = (INV & 2 ? -d[i] : d[i]); \ 17 TYPE fma = __builtin_fma##SUFFIX (mb, mc, md); \ 18 TYPE truev = (INV & 4 ? -fma : fma); \ 19 a[i] = cond[i] < 10 ? truev : 10; \ 20 } \ 21 } 22 23 #define FOR_EACH_TYPE(T, INV) \ 24 T (INV, _Float16, short, f16) \ 25 T (INV, float, float, f32) \ 26 T (INV, double, double, f64) 27 28 #define FOR_EACH_INV(T) \ 29 FOR_EACH_TYPE (T, 0) \ 30 FOR_EACH_TYPE (T, 1) \ 31 FOR_EACH_TYPE (T, 2) \ 32 FOR_EACH_TYPE (T, 3) \ 33 FOR_EACH_TYPE (T, 4) \ 34 FOR_EACH_TYPE (T, 5) \ 35 FOR_EACH_TYPE (T, 6) \ 36 FOR_EACH_TYPE (T, 7) 37 38 FOR_EACH_INV (DEF_LOOP) 39 40 /* { dg-final { scan-assembler-times {\tsel\t} 24 } } */ 41 /* { dg-final { scan-assembler-not {\tmovprfx\t} } } */ 42 /* { dg-final { scan-assembler-not {\tmov\tz[0-9]+\.., z[0-9]+} } } */ 43 44 /* { dg-final { scan-assembler-times {\tfmla\tz[0-9]+\.h,} 2 } } */ 45 /* { dg-final { scan-assembler-times {\tfmla\tz[0-9]+\.s,} 2 } } */ 46 /* { dg-final { scan-assembler-times {\tfmla\tz[0-9]+\.d,} 2 } } */ 47 48 /* { dg-final { scan-assembler-times {\tfmls\tz[0-9]+\.h,} 2 } } */ 49 /* { dg-final { scan-assembler-times {\tfmls\tz[0-9]+\.s,} 2 } } */ 50 /* { dg-final { scan-assembler-times {\tfmls\tz[0-9]+\.d,} 2 } } */ 51 52 /* { dg-final { scan-assembler-times {\tfnmla\tz[0-9]+\.h,} 2 } } */ 53 /* { dg-final { scan-assembler-times {\tfnmla\tz[0-9]+\.s,} 2 } } */ 54 /* { dg-final { scan-assembler-times {\tfnmla\tz[0-9]+\.d,} 2 } } */ 55 56 /* { dg-final { scan-assembler-times {\tfnmls\tz[0-9]+\.h,} 2 } } */ 57 /* { dg-final { scan-assembler-times {\tfnmls\tz[0-9]+\.s,} 2 } } */ 58 /* { dg-final { scan-assembler-times {\tfnmls\tz[0-9]+\.d,} 2 } } */ 59