1  /* { dg-options "-msve-vector-bits=256" } */
       2  
       3  #include <arm_sve.h>
       4  
       5  #ifndef __ARM_FEATURE_SVE_BITS
       6  #error "__ARM_FEATURE_SVE_BITS is not defined but should be"
       7  #endif
       8  
       9  #if __ARM_FEATURE_SVE_VECTOR_OPERATORS != 1
      10  #error "__ARM_FEATURE_SVE_VECTOR_OPERATORS should be equal to 1"
      11  #endif
      12  
      13  #ifndef __cplusplus
      14  #define alignof _Alignof
      15  #endif
      16  
      17  #define N __ARM_FEATURE_SVE_BITS
      18  #define FIXED_ATTR __attribute__ ((arm_sve_vector_bits (N)))
      19  #define GNU_ATTR __attribute__ ((vector_size (N / 8)))
      20  
      21  typedef svint8_t fixed_int8_t FIXED_ATTR;
      22  typedef svint16_t fixed_int16_t FIXED_ATTR;
      23  typedef svint32_t fixed_int32_t FIXED_ATTR;
      24  typedef svint64_t fixed_int64_t FIXED_ATTR;
      25  
      26  typedef svuint8_t fixed_uint8_t FIXED_ATTR;
      27  typedef svuint16_t fixed_uint16_t FIXED_ATTR;
      28  typedef svuint32_t fixed_uint32_t FIXED_ATTR;
      29  typedef svuint64_t fixed_uint64_t FIXED_ATTR;
      30  
      31  typedef svbfloat16_t fixed_bfloat16_t FIXED_ATTR;
      32  typedef svfloat16_t fixed_float16_t FIXED_ATTR;
      33  typedef svfloat32_t fixed_float32_t FIXED_ATTR;
      34  typedef svfloat64_t fixed_float64_t FIXED_ATTR;
      35  
      36  typedef svbool_t fixed_bool_t FIXED_ATTR;
      37  
      38  typedef int8_t gnu_int8_t GNU_ATTR;
      39  typedef int16_t gnu_int16_t GNU_ATTR;
      40  typedef int32_t gnu_int32_t GNU_ATTR;
      41  typedef int64_t gnu_int64_t GNU_ATTR;
      42  
      43  typedef uint8_t gnu_uint8_t GNU_ATTR;
      44  typedef uint16_t gnu_uint16_t GNU_ATTR;
      45  typedef uint32_t gnu_uint32_t GNU_ATTR;
      46  typedef uint64_t gnu_uint64_t GNU_ATTR;
      47  
      48  typedef bfloat16_t gnu_bfloat16_t GNU_ATTR;
      49  typedef float16_t gnu_float16_t GNU_ATTR;
      50  typedef float32_t gnu_float32_t GNU_ATTR;
      51  typedef float64_t gnu_float64_t GNU_ATTR;
      52  
      53  void f() {
      54  #define TEST_VECTOR(TYPE) \
      55    do \
      56      { \
      57        int assert_sizeof[sizeof (TYPE) == N / 8 ? 1 : -1]; \
      58        int assert_alignof[alignof (TYPE) == 16 ? 1 : -1]; \
      59      } \
      60    while (0)
      61  
      62    TEST_VECTOR (fixed_int8_t);
      63    TEST_VECTOR (fixed_int16_t);
      64    TEST_VECTOR (fixed_int32_t);
      65    TEST_VECTOR (fixed_int64_t);
      66  
      67    TEST_VECTOR (fixed_uint8_t);
      68    TEST_VECTOR (fixed_uint16_t);
      69    TEST_VECTOR (fixed_uint32_t);
      70    TEST_VECTOR (fixed_uint64_t);
      71  
      72    TEST_VECTOR (fixed_bfloat16_t);
      73    TEST_VECTOR (fixed_float16_t);
      74    TEST_VECTOR (fixed_float32_t);
      75    TEST_VECTOR (fixed_float64_t);
      76  
      77  #undef TEST_VECTOR
      78  
      79    {
      80      int assert_sizeof[sizeof(fixed_bool_t) == N / 64 ? 1 : -1];
      81      int assert_alignof[alignof(fixed_bool_t) == 2 ? 1 : -1];
      82    }
      83  }
      84  
      85  #define TEST_GLOBAL(TYPE)			\
      86    extern fixed_##TYPE extern_##TYPE;		\
      87    fixed_##TYPE global_##TYPE;
      88  
      89  #define TEST_STRUCT(TYPE)			\
      90    struct struct_##TYPE				\
      91    {						\
      92      fixed_##TYPE a, b, c[3];			\
      93    };						\
      94  						\
      95    union union_##TYPE				\
      96    {						\
      97      fixed_##TYPE a, b, c[3];			\
      98    };
      99  
     100  #define TEST_CONVERT(TYPE, PREFIX)		\
     101    PREFIX##TYPE					\
     102    to_##PREFIX##TYPE (fixed_##TYPE x)		\
     103    {						\
     104      return x;					\
     105    }						\
     106  						\
     107    fixed_##TYPE					\
     108    from_##PREFIX##TYPE (PREFIX##TYPE x)		\
     109    {						\
     110      return x;					\
     111    }
     112  
     113  #define TEST_UNARY(TYPE, NAME, OP)		\
     114    fixed_##TYPE					\
     115    NAME##_##TYPE (fixed_##TYPE x)		\
     116    {						\
     117      return OP x;				\
     118    }
     119  
     120  #define TEST_BINARY(TYPE, NAME, OP)			\
     121    fixed_##TYPE						\
     122    NAME##_##TYPE (fixed_##TYPE x, fixed_##TYPE y)	\
     123    {							\
     124      return x OP y;					\
     125    }							\
     126  							\
     127    fixed_##TYPE						\
     128    NAME##_##TYPE##_eq (fixed_##TYPE x, fixed_##TYPE y)	\
     129    {							\
     130      x OP##= y; return x;				\
     131    }
     132  
     133  #define TEST_COMPARISON(TYPE, NAME, OP)			\
     134    fixed_##TYPE						\
     135    NAME##_##TYPE (fixed_##TYPE x, fixed_##TYPE y)	\
     136    {							\
     137      return x OP y;					\
     138    }
     139  
     140  #define TEST_CALL(TYPE)							\
     141    fixed_##TYPE								\
     142    call_##TYPE##_ff (svbool_t pg, fixed_##TYPE x, fixed_##TYPE y)	\
     143    {									\
     144      return svsel (pg, x, y);						\
     145    }									\
     146  									\
     147    fixed_##TYPE								\
     148    call_##TYPE##_sf (svbool_t pg, sv##TYPE x, fixed_##TYPE y)		\
     149    {									\
     150      return svsel (pg, x, y);						\
     151    }									\
     152  									\
     153    fixed_##TYPE								\
     154    call_##TYPE##_fs (svbool_t pg, fixed_##TYPE x, sv##TYPE y)		\
     155    {									\
     156      return svsel (pg, x, y);						\
     157    }
     158  
     159  #define TEST_COMMON(TYPE)			\
     160    TEST_GLOBAL (TYPE)				\
     161    TEST_STRUCT (TYPE)				\
     162    TEST_CONVERT (TYPE, sv)			\
     163    TEST_CALL (TYPE)
     164  
     165  #define TEST_VECTOR(TYPE)			\
     166    TEST_COMMON (TYPE)				\
     167    TEST_CONVERT (TYPE, gnu_)			\
     168    TEST_UNARY (TYPE, nop, +)			\
     169    TEST_UNARY (TYPE, neg, -)			\
     170    TEST_BINARY (TYPE, add, +)			\
     171    TEST_BINARY (TYPE, sub, -)			\
     172    TEST_BINARY (TYPE, mul, *)			\
     173    TEST_BINARY (TYPE, div, /)			\
     174  
     175  #define TEST_INT_VECTOR(TYPE)			\
     176    TEST_VECTOR (TYPE)				\
     177    TEST_UNARY (TYPE, inv, ~)			\
     178    TEST_BINARY (TYPE, mod, %)			\
     179    TEST_BINARY (TYPE, shl, <<)			\
     180    TEST_BINARY (TYPE, shr, >>)			\
     181    TEST_BINARY (TYPE, and, &)			\
     182    TEST_BINARY (TYPE, ior, |)			\
     183    TEST_BINARY (TYPE, xor, ^)			\
     184    TEST_COMPARISON (TYPE, eq, =)			\
     185    TEST_COMPARISON (TYPE, ne, !=)		\
     186    TEST_COMPARISON (TYPE, lt, <)			\
     187    TEST_COMPARISON (TYPE, le, <=)		\
     188    TEST_COMPARISON (TYPE, ge, >=)		\
     189    TEST_COMPARISON (TYPE, gt, >)
     190  
     191  TEST_INT_VECTOR (int8_t);
     192  TEST_INT_VECTOR (int16_t);
     193  TEST_INT_VECTOR (int32_t);
     194  TEST_INT_VECTOR (int64_t);
     195  
     196  TEST_INT_VECTOR (uint8_t);
     197  TEST_INT_VECTOR (uint16_t);
     198  TEST_INT_VECTOR (uint32_t);
     199  TEST_INT_VECTOR (uint64_t);
     200  
     201  TEST_VECTOR (float16_t);
     202  TEST_VECTOR (float32_t);
     203  TEST_VECTOR (float64_t);
     204  
     205  TEST_COMMON (bool_t)