Add support for conditional reductions using SVE CLASTB
[official-gcc.git] / gcc / testsuite / gcc.target / aarch64 / sve / vcond_1.C
blob6fd6b420eeff9c8f60f1b0f30704d51f565b99b9
1 /* { dg-do assemble { target aarch64_asm_sve_ok } } */
2 /* { dg-options "-O -msve-vector-bits=256 --save-temps" } */
4 #include <stdint.h>
6 typedef int8_t vnx16qi __attribute__((vector_size(32)));
7 typedef int16_t vnx8hi __attribute__((vector_size(32)));
8 typedef int32_t vnx4si __attribute__((vector_size(32)));
9 typedef int64_t vnx2di __attribute__((vector_size(32)));
11 typedef uint8_t v32qu __attribute__((vector_size(32)));
12 typedef uint16_t v16hu __attribute__((vector_size(32)));
13 typedef uint32_t v8su __attribute__((vector_size(32)));
14 typedef uint64_t v4du __attribute__((vector_size(32)));
16 #define DEF_VCOND_VAR(TYPE, COND, SUFFIX)                       \
17 TYPE vcond_##TYPE##_##SUFFIX (TYPE x, TYPE y, TYPE a, TYPE b)   \
18 {                                                               \
19   TYPE r;                                                       \
20   r = a COND b ? x : y;                                         \
21   return r;                                                     \
24 #define DEF_VCOND_IMM(TYPE, COND, IMM, SUFFIX)                  \
25 TYPE vcond_imm_##TYPE##_##SUFFIX (TYPE x, TYPE y, TYPE a)       \
26 {                                                               \
27   TYPE r;                                                       \
28   r = a COND IMM ? x : y;                                       \
29   return r;                                                     \
32 #define TEST_COND_VAR_SIGNED_ALL(T, COND, SUFFIX)       \
33   T (vnx16qi, COND, SUFFIX)                             \
34   T (vnx8hi, COND, SUFFIX)                              \
35   T (vnx4si, COND, SUFFIX)                              \
36   T (vnx2di, COND, SUFFIX)
38 #define TEST_COND_VAR_UNSIGNED_ALL(T, COND, SUFFIX)     \
39   T (v32qu, COND, SUFFIX)                               \
40   T (v16hu, COND, SUFFIX)                               \
41   T (v8su, COND, SUFFIX)                                \
42   T (v4du, COND, SUFFIX)
44 #define TEST_COND_VAR_ALL(T, COND, SUFFIX)              \
45   TEST_COND_VAR_SIGNED_ALL (T, COND, SUFFIX)            \
46   TEST_COND_VAR_UNSIGNED_ALL (T, COND, SUFFIX)
48 #define TEST_VAR_ALL(T)                         \
49   TEST_COND_VAR_ALL (T, >, gt)                  \
50   TEST_COND_VAR_ALL (T, <, lt)                  \
51   TEST_COND_VAR_ALL (T, >=, ge)                 \
52   TEST_COND_VAR_ALL (T, <=, le)                 \
53   TEST_COND_VAR_ALL (T, ==, eq)                 \
54   TEST_COND_VAR_ALL (T, !=, ne)
56 #define TEST_COND_IMM_SIGNED_ALL(T, COND, IMM, SUFFIX)  \
57   T (vnx16qi, COND, IMM, SUFFIX)                                \
58   T (vnx8hi, COND, IMM, SUFFIX)                         \
59   T (vnx4si, COND, IMM, SUFFIX)                         \
60   T (vnx2di, COND, IMM, SUFFIX)
62 #define TEST_COND_IMM_UNSIGNED_ALL(T, COND, IMM, SUFFIX)        \
63   T (v32qu, COND, IMM, SUFFIX)                                  \
64   T (v16hu, COND, IMM, SUFFIX)                                  \
65   T (v8su, COND, IMM, SUFFIX)                                   \
66   T (v4du, COND, IMM, SUFFIX)
68 #define TEST_COND_IMM_ALL(T, COND, IMM, SUFFIX)         \
69   TEST_COND_IMM_SIGNED_ALL (T, COND, IMM, SUFFIX)       \
70   TEST_COND_IMM_UNSIGNED_ALL (T, COND, IMM, SUFFIX)
72 #define TEST_IMM_ALL(T)                                                 \
73   /* Expect immediates to make it into the encoding.  */                \
74   TEST_COND_IMM_ALL (T, >, 5, gt)                                       \
75   TEST_COND_IMM_ALL (T, <, 5, lt)                                       \
76   TEST_COND_IMM_ALL (T, >=, 5, ge)                                      \
77   TEST_COND_IMM_ALL (T, <=, 5, le)                                      \
78   TEST_COND_IMM_ALL (T, ==, 5, eq)                                      \
79   TEST_COND_IMM_ALL (T, !=, 5, ne)                                      \
80                                                                         \
81   TEST_COND_IMM_SIGNED_ALL (T, >, 15, gt2)                              \
82   TEST_COND_IMM_SIGNED_ALL (T, <, 15, lt2)                              \
83   TEST_COND_IMM_SIGNED_ALL (T, >=, 15, ge2)                             \
84   TEST_COND_IMM_SIGNED_ALL (T, <=, 15, le2)                             \
85   TEST_COND_IMM_SIGNED_ALL (T, ==, 15, eq2)                             \
86   TEST_COND_IMM_SIGNED_ALL (T, !=, 15, ne2)                             \
87                                                                         \
88   TEST_COND_IMM_SIGNED_ALL (T, >, -16, gt3)                             \
89   TEST_COND_IMM_SIGNED_ALL (T, <, -16, lt3)                             \
90   TEST_COND_IMM_SIGNED_ALL (T, >=, -16, ge3)                            \
91   TEST_COND_IMM_SIGNED_ALL (T, <=, -16, le3)                            \
92   TEST_COND_IMM_SIGNED_ALL (T, ==, -16, eq3)                            \
93   TEST_COND_IMM_SIGNED_ALL (T, !=, -16, ne3)                            \
94                                                                         \
95   TEST_COND_IMM_UNSIGNED_ALL (T, >, 0, gt4)                             \
96   /* Testing if an unsigned value >= 0 or < 0 is pointless as it will   \
97      get folded away by the compiler.  */                               \
98   TEST_COND_IMM_UNSIGNED_ALL (T, <=, 0, le4)                            \
99                                                                         \
100   TEST_COND_IMM_UNSIGNED_ALL (T, >, 31, gt5)                            \
101   TEST_COND_IMM_UNSIGNED_ALL (T, <, 31, lt5)                            \
102   TEST_COND_IMM_UNSIGNED_ALL (T, >=, 31, ge5)                           \
103   TEST_COND_IMM_UNSIGNED_ALL (T, <=, 31, le5)                           \
104                                                                         \
105   /* Expect immediates to NOT make it into the encoding, and instead be \
106      forced into a register.  */                                        \
107   TEST_COND_IMM_ALL (T, >, 32, gt6)                                     \
108   TEST_COND_IMM_ALL (T, <, 32, lt6)                                     \
109   TEST_COND_IMM_ALL (T, >=, 32, ge6)                                    \
110   TEST_COND_IMM_ALL (T, <=, 32, le6)                                    \
111   TEST_COND_IMM_ALL (T, ==, 32, eq6)                                    \
112   TEST_COND_IMM_ALL (T, !=, 32, ne6)
114 TEST_VAR_ALL (DEF_VCOND_VAR)
115 TEST_IMM_ALL (DEF_VCOND_IMM)
117 /* { dg-final { scan-assembler {\tsel\tz[0-9]+\.b, p[0-7], z[0-9]+\.b, z[0-9]+\.b\n} } } */
118 /* { dg-final { scan-assembler {\tsel\tz[0-9]+\.h, p[0-7], z[0-9]+\.h, z[0-9]+\.h\n} } } */
119 /* { dg-final { scan-assembler {\tsel\tz[0-9]+\.s, p[0-7], z[0-9]+\.s, z[0-9]+\.s\n} } } */
120 /* { dg-final { scan-assembler {\tsel\tz[0-9]+\.d, p[0-7], z[0-9]+\.d, z[0-9]+\.d\n} } } */
122 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, z[0-9]+\.b\n} } } */
123 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
124 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} } } */
125 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} } } */
127 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, z[0-9]+\.b\n} } } */
128 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
129 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} } } */
130 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} } } */
132 /* { dg-final { scan-assembler {\tcmphs\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, z[0-9]+\.b\n} } } */
133 /* { dg-final { scan-assembler {\tcmphs\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
134 /* { dg-final { scan-assembler {\tcmphs\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} } } */
135 /* { dg-final { scan-assembler {\tcmphs\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} } } */
137 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, z[0-9]+\.b\n} } } */
138 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
139 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} } } */
140 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} } } */
142 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, z[0-9]+\.b\n} } } */
143 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
144 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} } } */
145 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} } } */
147 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, z[0-9]+\.b\n} } } */
148 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, z[0-9]+\.h\n} } } */
149 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, z[0-9]+\.s\n} } } */
150 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, z[0-9]+\.d\n} } } */
154 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #15\n} } } */
155 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #15\n} } } */
156 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #15\n} } } */
157 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #15\n} } } */
159 /* { dg-final { scan-assembler {\tcmplt\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #15\n} } } */
160 /* { dg-final { scan-assembler {\tcmplt\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #15\n} } } */
161 /* { dg-final { scan-assembler {\tcmplt\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #15\n} } } */
162 /* { dg-final { scan-assembler {\tcmplt\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #15\n} } } */
164 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #15\n} } } */
165 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #15\n} } } */
166 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #15\n} } } */
167 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #15\n} } } */
169 /* { dg-final { scan-assembler {\tcmple\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #15\n} } } */
170 /* { dg-final { scan-assembler {\tcmple\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #15\n} } } */
171 /* { dg-final { scan-assembler {\tcmple\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #15\n} } } */
172 /* { dg-final { scan-assembler {\tcmple\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #15\n} } } */
174 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #15\n} } } */
175 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #15\n} } } */
176 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #15\n} } } */
177 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #15\n} } } */
179 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #15\n} } } */
180 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #15\n} } } */
181 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #15\n} } } */
182 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #15\n} } } */
184 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #-16\n} } } */
185 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #-16\n} } } */
186 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #-16\n} } } */
187 /* { dg-final { scan-assembler {\tcmpgt\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #-16\n} } } */
189 /* { dg-final { scan-assembler {\tcmplt\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #-16\n} } } */
190 /* { dg-final { scan-assembler {\tcmplt\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #-16\n} } } */
191 /* { dg-final { scan-assembler {\tcmplt\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #-16\n} } } */
192 /* { dg-final { scan-assembler {\tcmplt\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #-16\n} } } */
194 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #-16\n} } } */
195 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #-16\n} } } */
196 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #-16\n} } } */
197 /* { dg-final { scan-assembler {\tcmpge\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #-16\n} } } */
199 /* { dg-final { scan-assembler {\tcmple\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #-16\n} } } */
200 /* { dg-final { scan-assembler {\tcmple\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #-16\n} } } */
201 /* { dg-final { scan-assembler {\tcmple\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #-16\n} } } */
202 /* { dg-final { scan-assembler {\tcmple\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #-16\n} } } */
204 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #-16\n} } } */
205 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #-16\n} } } */
206 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #-16\n} } } */
207 /* { dg-final { scan-assembler {\tcmpeq\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #-16\n} } } */
209 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #-16\n} } } */
210 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #-16\n} } } */
211 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #-16\n} } } */
212 /* { dg-final { scan-assembler {\tcmpne\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #-16\n} } } */
216 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #0\n} } } */
217 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #0\n} } } */
218 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #0\n} } } */
219 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #0\n} } } */
221 /* { dg-final { scan-assembler {\tcmpls\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #0\n} } } */
222 /* { dg-final { scan-assembler {\tcmpls\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #0\n} } } */
223 /* { dg-final { scan-assembler {\tcmpls\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #0\n} } } */
224 /* { dg-final { scan-assembler {\tcmpls\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #0\n} } } */
227 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #31\n} } } */
228 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #31\n} } } */
229 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #31\n} } } */
230 /* { dg-final { scan-assembler {\tcmphi\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #31\n} } } */
232 /* { dg-final { scan-assembler {\tcmplo\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #31\n} } } */
233 /* { dg-final { scan-assembler {\tcmplo\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #31\n} } } */
234 /* { dg-final { scan-assembler {\tcmplo\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #31\n} } } */
235 /* { dg-final { scan-assembler {\tcmplo\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #31\n} } } */
237 /* { dg-final { scan-assembler {\tcmphs\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #31\n} } } */
238 /* { dg-final { scan-assembler {\tcmphs\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #31\n} } } */
239 /* { dg-final { scan-assembler {\tcmphs\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #31\n} } } */
240 /* { dg-final { scan-assembler {\tcmphs\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #31\n} } } */
242 /* { dg-final { scan-assembler {\tcmpls\tp[0-7]\.b, p[0-7]/z, z[0-9]+\.b, #31\n} } } */
243 /* { dg-final { scan-assembler {\tcmpls\tp[0-7]\.h, p[0-7]/z, z[0-9]+\.h, #31\n} } } */
244 /* { dg-final { scan-assembler {\tcmpls\tp[0-7]\.s, p[0-7]/z, z[0-9]+\.s, #31\n} } } */
245 /* { dg-final { scan-assembler {\tcmpls\tp[0-7]\.d, p[0-7]/z, z[0-9]+\.d, #31\n} } } */