1  /* { dg-do compile } */
       2  /* { dg-options "-O2 -ftree-vectorize -ffast-math -dp" } */
       3  
       4  #include <stdint.h>
       5  
       6  #ifndef FN
       7  #define FN(X) __builtin_fmax##X
       8  #endif
       9  
      10  #define DEF_LOOP(FN, TYPE, PRED_TYPE, NAME, CONST)                             \
      11    void __attribute__ ((noipa))                                                 \
      12    test_##TYPE##_##NAME (TYPE *__restrict x, TYPE *__restrict y,                \
      13  			PRED_TYPE *__restrict pred, int n)                     \
      14    {                                                                            \
      15      for (int i = 0; i < n; ++i)                                                \
      16        x[i] = pred[i] != 1 ? FN (y[i], CONST) : y[i];                           \
      17    }
      18  
      19  #define TEST_TYPE(T, FN, TYPE, PRED_TYPE)                                      \
      20    T (FN, TYPE, PRED_TYPE, zero, 0)                                             \
      21    T (FN, TYPE, PRED_TYPE, one, 1)                                              \
      22    T (FN, TYPE, PRED_TYPE, two, 2)
      23  
      24  #define TEST_ALL(T)                                                            \
      25    TEST_TYPE (T, FN (f32), float, int32_t)                                      \
      26    TEST_TYPE (T, FN (f64), double, int64_t)
      27  
      28  TEST_ALL (DEF_LOOP)
      29  
      30  /* { dg-final { scan-assembler-times {smaxv64sf3_exec} 3 } } */
      31  /* { dg-final { scan-assembler-times {smaxv64df3_exec} 3 } } */
      32  
      33  /* { dg-final { scan-assembler-not {\tv_writelane_b32\tv[0-9]+, vcc_..} } } */