152
|
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_OPERATIONS != 1
|
|
10 #error "__ARM_FEATURE_SVE_VECTOR_OPERATIONS 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)
|