(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
aarch64/
simd/
vmulx.x
#define PASS_ARRAY(...) {__VA_ARGS__}

#define SETUP_TEST_CASE_VEC(I, INTRINSIC, BASE_TYPE, TYPE1, TYPE2,	\
			    VALS1, VALS2, EXPS, LEN, FM, Q_LD, Q_ST,	\
			    V1, V2)					\
  do									\
    {									\
  int i##I;								\
  BASE_TYPE vec##I##_1_data[] = VALS1;					\
  BASE_TYPE vec##I##_2_data[] = VALS2;					\
  V1 TYPE1 vec##I##_1 = vld1##Q_LD##_##FM (vec##I##_1_data);		\
  V2 TYPE2 vec##I##_2 = vld1##Q_LD##_##FM (vec##I##_2_data);		\
  TYPE1 actual##I##_v = INTRINSIC (vec##I##_1, vec##I##_2);		\
  volatile BASE_TYPE expected##I[] = EXPS;				\
  BASE_TYPE actual##I[LEN];						\
  vst1##Q_ST##_##FM (actual##I, actual##I##_v);				\
  for (i##I = 0; i##I < LEN; ++i##I)					\
    if (actual##I[i##I] != expected##I[i##I])				\
      abort ();								\
    }									\
  while (0)								\

#define SETUP_TEST_CASE_SCALAR(I, INTRINSIC, TYPE, VAL1, VAL2, EXP)	\
  do									\
    {									\
  TYPE vec_##I##_1 = VAL1;						\
  TYPE vec_##I##_2 = VAL2;						\
  TYPE expected_##I = EXP;						\
  volatile TYPE actual_##I = INTRINSIC (vec_##I##_1, vec_##I##_2);	\
  if (actual_##I != expected_##I)					\
    abort ();								\
    }									\
  while (0)								\

/* Functions used to return values that won't be optimised away.  */
float32_t  __attribute__ ((noinline))
foo32 ()
{
  return 1.0;
}

float64_t  __attribute__ ((noinline))
foo64 ()
{
  return 1.0;
}