1  /* { dg-do run { target aarch64_sve_hw } } */
       2  /* { dg-options "-O2 -ftree-vectorize" } */
       3  
       4  #include "vcond_2.c"
       5  
       6  #define N 97
       7  
       8  #define TEST_VCOND_VAR(DATA_TYPE, CMP_TYPE, COND, SUFFIX)	\
       9  {								\
      10    DATA_TYPE x[N], y[N], r[N];					\
      11    CMP_TYPE a[N], b[N];						\
      12    for (int i = 0; i < N; ++i)					\
      13      {								\
      14        x[i] = i;							\
      15        y[i] = (i & 1) + 5;					\
      16        a[i] = i - N / 3;						\
      17        b[i] = N - N / 3 - i;					\
      18        asm volatile ("" ::: "memory");				\
      19      }								\
      20    vcond_var_##CMP_TYPE##_##SUFFIX (r, x, y, a, b, N);		\
      21    for (int i = 0; i < N; ++i)					\
      22      if (r[i] != (a[i] COND b[i] ? x[i] : y[i]))			\
      23        __builtin_abort ();					\
      24  }
      25  
      26  #define TEST_VCOND_IMM(DATA_TYPE, CMP_TYPE, COND, IMM, SUFFIX)	\
      27  {								\
      28    DATA_TYPE x[N], y[N], r[N];					\
      29    CMP_TYPE a[N];						\
      30    for (int i = 0; i < N; ++i)					\
      31      {								\
      32        x[i] = i;							\
      33        y[i] = (i & 1) + 5;					\
      34        a[i] = IMM - N / 3 + i;					\
      35        asm volatile ("" ::: "memory");				\
      36      }								\
      37    vcond_imm_##CMP_TYPE##_##SUFFIX (r, x, y, a, N);		\
      38    for (int i = 0; i < N; ++i)					\
      39      if (r[i] != (a[i] COND (CMP_TYPE) IMM ? x[i] : y[i]))	\
      40        __builtin_abort ();					\
      41  }
      42  
      43  int __attribute__ ((optimize (1)))
      44  main (int argc, char **argv)
      45  {
      46    TEST_VAR_ALL (TEST_VCOND_VAR)
      47    TEST_IMM_ALL (TEST_VCOND_IMM)
      48    return 0;
      49  }