1 /* { dg-do assemble { target { aarch64_asm_sve_ok && { ! ilp32 } } } } */
2 /* { dg-options "-march=armv8.2-a+sve -O -msve-vector-bits=256 --save-temps" } */
4 typedef __INT8_TYPE__ vnx16qi __attribute__((vector_size(32)));
5 typedef __INT16_TYPE__ vnx8hi __attribute__((vector_size(32)));
6 typedef __INT32_TYPE__ vnx4si __attribute__((vector_size(32)));
7 typedef __INT64_TYPE__ vnx2di __attribute__((vector_size(32)));
9 typedef __UINT8_TYPE__ v32qu __attribute__((vector_size(32)));
10 typedef __UINT16_TYPE__ v16hu __attribute__((vector_size(32)));
11 typedef __UINT32_TYPE__ v8su __attribute__((vector_size(32)));
12 typedef __UINT64_TYPE__ v4du __attribute__((vector_size(32)));
14 #define DEF_VCOND_VAR(TYPE, COND, SUFFIX) \
15 TYPE vcond_##TYPE##_##SUFFIX (TYPE x, TYPE y, TYPE a, TYPE b) \
18 r = a COND b ? x : y; \
22 #define DEF_VCOND_IMM(TYPE, COND, IMM, SUFFIX) \
23 TYPE vcond_imm_##TYPE##_##SUFFIX (TYPE x, TYPE y, TYPE a) \
26 r = a COND IMM ? x : y; \
30 #define TEST_COND_VAR_SIGNED_ALL(T, COND, SUFFIX) \
31 T (vnx16qi, COND, SUFFIX) \
32 T (vnx8hi, COND, SUFFIX) \
33 T (vnx4si, COND, SUFFIX) \
34 T (vnx2di, COND, SUFFIX)
36 #define TEST_COND_VAR_UNSIGNED_ALL(T, COND, SUFFIX) \
37 T (v32qu, COND, SUFFIX) \
38 T (v16hu, COND, SUFFIX) \
39 T (v8su, COND, SUFFIX) \
40 T (v4du, COND, SUFFIX)
42 #define TEST_COND_VAR_ALL(T, COND, SUFFIX) \
43 TEST_COND_VAR_SIGNED_ALL (T, COND, SUFFIX) \
44 TEST_COND_VAR_UNSIGNED_ALL (T, COND, SUFFIX)
46 #define TEST_VAR_ALL(T) \
47 TEST_COND_VAR_ALL (T, >, gt) \
48 TEST_COND_VAR_ALL (T, <, lt) \
49 TEST_COND_VAR_ALL (T, >=, ge) \
50 TEST_COND_VAR_ALL (T, <=, le) \
51 TEST_COND_VAR_ALL (T, ==, eq) \
52 TEST_COND_VAR_ALL (T, !=, ne)
54 #define TEST_COND_IMM_SIGNED_ALL(T, COND, IMM, SUFFIX) \
55 T (vnx16qi, COND, IMM, SUFFIX) \
56 T (vnx8hi, COND, IMM, SUFFIX) \
57 T (vnx4si, COND, IMM, SUFFIX) \
58 T (vnx2di, COND, IMM, SUFFIX)
60 #define TEST_COND_IMM_UNSIGNED_ALL(T, COND, IMM, SUFFIX) \
61 T (v32qu, COND, IMM, SUFFIX) \
62 T (v16hu, COND, IMM, SUFFIX) \
63 T (v8su, COND, IMM, SUFFIX) \
64 T (v4du, COND, IMM, SUFFIX)
66 #define TEST_COND_IMM_ALL(T, COND, IMM, SUFFIX) \
67 TEST_COND_IMM_SIGNED_ALL (T, COND, IMM, SUFFIX) \
68 TEST_COND_IMM_UNSIGNED_ALL (T, COND, IMM, SUFFIX)
70 #define TEST_IMM_ALL(T) \
71 /* Expect immediates to make it into the encoding. */ \
72 TEST_COND_IMM_ALL (T, >, 5, gt) \
73 TEST_COND_IMM_ALL (T, <, 5, lt) \
74 TEST_COND_IMM_ALL (T, >=, 5, ge) \
75 TEST_COND_IMM_ALL (T, <=, 5, le) \
76 TEST_COND_IMM_ALL (T, ==, 5, eq) \
77 TEST_COND_IMM_ALL (T, !=, 5, ne) \
79 TEST_COND_IMM_SIGNED_ALL (T, >, 15, gt2) \
80 TEST_COND_IMM_SIGNED_ALL (T, <, 15, lt2) \
81 TEST_COND_IMM_SIGNED_ALL (T, >=, 15, ge2) \
82 TEST_COND_IMM_SIGNED_ALL (T, <=, 15, le2) \
83 TEST_COND_IMM_SIGNED_ALL (T, ==, 15, eq2) \
84 TEST_COND_IMM_SIGNED_ALL (T, !=, 15, ne2) \
86 TEST_COND_IMM_SIGNED_ALL (T, >, -16, gt3) \
87 TEST_COND_IMM_SIGNED_ALL (T, <, -16, lt3) \
88 TEST_COND_IMM_SIGNED_ALL (T, >=, -16, ge3) \
89 TEST_COND_IMM_SIGNED_ALL (T, <=, -16, le3) \
90 TEST_COND_IMM_SIGNED_ALL (T, ==, -16, eq3) \
91 TEST_COND_IMM_SIGNED_ALL (T, !=, -16, ne3) \
93 TEST_COND_IMM_UNSIGNED_ALL (T, >, 0, gt4) \
94 /* Testing if an unsigned value >= 0 or < 0 is pointless as it will \
95 get folded away by the compiler. */ \
96 TEST_COND_IMM_UNSIGNED_ALL (T, <=, 0, le4) \
98 TEST_COND_IMM_UNSIGNED_ALL (T, >, 31, gt5) \
99 TEST_COND_IMM_UNSIGNED_ALL (T, <, 31, lt5) \
100 TEST_COND_IMM_UNSIGNED_ALL (T, >=, 31, ge5) \
101 TEST_COND_IMM_UNSIGNED_ALL (T, <=, 31, le5) \
103 /* Expect immediates to NOT make it into the encoding, and instead be \
104 forced into a register. */ \
105 TEST_COND_IMM_ALL (T, >, 32, gt6) \
106 TEST_COND_IMM_ALL (T, <, 32, lt6) \
107 TEST_COND_IMM_ALL (T, >=, 32, ge6) \
108 TEST_COND_IMM_ALL (T, <=, 32, le6) \
109 TEST_COND_IMM_ALL (T, ==, 32, eq6) \
110 TEST_COND_IMM_ALL (T, !=, 32, ne6)
112 TEST_VAR_ALL (DEF_VCOND_VAR)
113 TEST_IMM_ALL (DEF_VCOND_IMM)
115 /* { dg-final { scan-assembler {\tsel\tz[0-9]+\.b, p[0-7], z[0-9]+\.b, z[0-9]+\.b\n} } } */
116 /* { dg-final { scan-assembler {\tsel\tz[0-9]+\.h, p[0-7], z[0-9]+\.h, z[0-9]+\.h\n} } } */
117 /* { dg-final { scan-assembler {\tsel\tz[0-9]+\.s, p[0-7], z[0-9]+\.s, z[0-9]+\.s\n} } } */
118 /* { dg-final { scan-assembler {\tsel\tz[0-9]+\.d, p[0-7], z[0-9]+\.d, z[0-9]+\.d\n} } } */
120 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, z[0-9]+\.b\n} } } */
121 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
122 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} } } */
123 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} } } */
125 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, z[0-9]+\.b\n} } } */
126 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
127 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} } } */
128 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} } } */
130 /* { dg-final { scan-assembler {\tcmphs\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, z[0-9]+\.b\n} } } */
131 /* { dg-final { scan-assembler {\tcmphs\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
132 /* { dg-final { scan-assembler {\tcmphs\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} } } */
133 /* { dg-final { scan-assembler {\tcmphs\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} } } */
135 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, z[0-9]+\.b\n} } } */
136 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
137 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} } } */
138 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} } } */
140 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, z[0-9]+\.b\n} } } */
141 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
142 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} } } */
143 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} } } */
145 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, z[0-9]+\.b\n} } } */
146 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
147 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} } } */
148 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} } } */
152 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #15\n} } } */
153 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #15\n} } } */
154 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #15\n} } } */
155 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #15\n} } } */
157 /* { dg-final { scan-assembler {\tcmplt\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #15\n} } } */
158 /* { dg-final { scan-assembler {\tcmplt\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #15\n} } } */
159 /* { dg-final { scan-assembler {\tcmplt\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #15\n} } } */
160 /* { dg-final { scan-assembler {\tcmplt\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #15\n} } } */
162 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #15\n} } } */
163 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #15\n} } } */
164 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #15\n} } } */
165 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #15\n} } } */
167 /* { dg-final { scan-assembler {\tcmple\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #15\n} } } */
168 /* { dg-final { scan-assembler {\tcmple\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #15\n} } } */
169 /* { dg-final { scan-assembler {\tcmple\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #15\n} } } */
170 /* { dg-final { scan-assembler {\tcmple\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #15\n} } } */
172 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #15\n} } } */
173 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #15\n} } } */
174 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #15\n} } } */
175 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #15\n} } } */
177 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #15\n} } } */
178 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #15\n} } } */
179 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #15\n} } } */
180 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #15\n} } } */
182 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #-16\n} } } */
183 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #-16\n} } } */
184 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #-16\n} } } */
185 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #-16\n} } } */
187 /* { dg-final { scan-assembler {\tcmplt\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #-16\n} } } */
188 /* { dg-final { scan-assembler {\tcmplt\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #-16\n} } } */
189 /* { dg-final { scan-assembler {\tcmplt\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #-16\n} } } */
190 /* { dg-final { scan-assembler {\tcmplt\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #-16\n} } } */
192 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #-16\n} } } */
193 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #-16\n} } } */
194 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #-16\n} } } */
195 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #-16\n} } } */
197 /* { dg-final { scan-assembler {\tcmple\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #-16\n} } } */
198 /* { dg-final { scan-assembler {\tcmple\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #-16\n} } } */
199 /* { dg-final { scan-assembler {\tcmple\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #-16\n} } } */
200 /* { dg-final { scan-assembler {\tcmple\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #-16\n} } } */
202 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #-16\n} } } */
203 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #-16\n} } } */
204 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #-16\n} } } */
205 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #-16\n} } } */
207 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #-16\n} } } */
208 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #-16\n} } } */
209 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #-16\n} } } */
210 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #-16\n} } } */
214 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #0\n} } } */
215 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #0\n} } } */
216 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #0\n} } } */
217 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #0\n} } } */
219 /* { dg-final { scan-assembler {\tcmpls\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #0\n} } } */
220 /* { dg-final { scan-assembler {\tcmpls\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #0\n} } } */
221 /* { dg-final { scan-assembler {\tcmpls\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #0\n} } } */
222 /* { dg-final { scan-assembler {\tcmpls\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #0\n} } } */
225 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #31\n} } } */
226 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #31\n} } } */
227 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #31\n} } } */
228 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #31\n} } } */
230 /* { dg-final { scan-assembler {\tcmplo\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #31\n} } } */
231 /* { dg-final { scan-assembler {\tcmplo\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #31\n} } } */
232 /* { dg-final { scan-assembler {\tcmplo\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #31\n} } } */
233 /* { dg-final { scan-assembler {\tcmplo\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #31\n} } } */
235 /* { dg-final { scan-assembler {\tcmphs\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #31\n} } } */
236 /* { dg-final { scan-assembler {\tcmphs\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #31\n} } } */
237 /* { dg-final { scan-assembler {\tcmphs\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #31\n} } } */
238 /* { dg-final { scan-assembler {\tcmphs\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #31\n} } } */
240 /* { dg-final { scan-assembler {\tcmpls\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #31\n} } } */
241 /* { dg-final { scan-assembler {\tcmpls\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #31\n} } } */
242 /* { dg-final { scan-assembler {\tcmpls\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #31\n} } } */
243 /* { dg-final { scan-assembler {\tcmpls\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #31\n} } } */