[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-intrinsics-perm-select-matmul-fp64.ll
blobf4a46c20a877718e7be6e77359dde79f5d5d7ff8
1 ; RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+sve,+f64mm -asm-verbose=0 < %s -o - | FileCheck %s
4 ; TRN1Q
7 define <vscale x 16 x i8> @trn1_i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) nounwind {
8 ; CHECK-LABEL: trn1_i8:
9 ; CHECK-NEXT:  trn1 z0.q, z0.q, z1.q
10 ; CHECK-NEXT:  ret
11   %out = call <vscale x 16 x i8> @llvm.aarch64.sve.trn1q.nxv16i8(<vscale x 16 x i8> %a,
12                                                                  <vscale x 16 x i8> %b)
13   ret <vscale x 16 x i8> %out
16 define <vscale x 8 x i16> @trn1_i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) nounwind {
17 ; CHECK-LABEL: trn1_i16:
18 ; CHECK-NEXT:  trn1 z0.q, z0.q, z1.q
19 ; CHECK-NEXT:  ret
20   %out = call <vscale x 8 x i16> @llvm.aarch64.sve.trn1q.nxv8i16(<vscale x 8 x i16> %a,
21                                                                  <vscale x 8 x i16> %b)
22   ret <vscale x 8 x i16> %out
25 define <vscale x 4 x i32> @trn1_i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) nounwind {
26 ; CHECK-LABEL: trn1_i32:
27 ; CHECK-NEXT:  trn1 z0.q, z0.q, z1.q
28 ; CHECK-NEXT:  ret
29   %out = call <vscale x 4 x i32> @llvm.aarch64.sve.trn1q.nxv4i32(<vscale x 4 x i32> %a,
30                                                                  <vscale x 4 x i32> %b)
31   ret <vscale x 4 x i32> %out
34 define <vscale x 2 x i64> @trn1_i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) nounwind {
35 ; CHECK-LABEL: trn1_i64:
36 ; CHECK-NEXT:  trn1 z0.q, z0.q, z1.q
37 ; CHECK-NEXT:  ret
38   %out = call <vscale x 2 x i64> @llvm.aarch64.sve.trn1q.nxv2i64(<vscale x 2 x i64> %a,
39                                                                  <vscale x 2 x i64> %b)
40   ret <vscale x 2 x i64> %out
43 define <vscale x 8 x half> @trn1_f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b) nounwind {
44 ; CHECK-LABEL: trn1_f16:
45 ; CHECK-NEXT:  trn1 z0.q, z0.q, z1.q
46 ; CHECK-NEXT:  ret
47   %out = call <vscale x 8 x half> @llvm.aarch64.sve.trn1q.nxv8f16(<vscale x 8 x half> %a,
48                                                                   <vscale x 8 x half> %b)
49   ret <vscale x 8 x half> %out
52 define <vscale x 8 x bfloat> @trn1_bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) nounwind #0 {
53 ; CHECK-LABEL: trn1_bf16:
54 ; CHECK-NEXT:  trn1 z0.q, z0.q, z1.q
55 ; CHECK-NEXT:  ret
56   %out = call <vscale x 8 x bfloat> @llvm.aarch64.sve.trn1q.nxv8bf16(<vscale x 8 x bfloat> %a,
57                                                                      <vscale x 8 x bfloat> %b)
58   ret <vscale x 8 x bfloat> %out
61 define <vscale x 4 x float> @trn1_f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b) nounwind {
62 ; CHECK-LABEL: trn1_f32:
63 ; CHECK-NEXT:  trn1 z0.q, z0.q, z1.q
64 ; CHECK-NEXT:  ret
65   %out = call <vscale x 4 x float> @llvm.aarch64.sve.trn1q.nxv4f32(<vscale x 4 x float> %a,
66                                                                    <vscale x 4 x float> %b)
67   ret <vscale x 4 x float> %out
70 define <vscale x 2 x double> @trn1_f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b) nounwind {
71 ; CHECK-LABEL: trn1_f64:
72 ; CHECK-NEXT:  trn1 z0.q, z0.q, z1.q
73 ; CHECK-NEXT:  ret
74   %out = call <vscale x 2 x double> @llvm.aarch64.sve.trn1q.nxv2f64(<vscale x 2 x double> %a,
75                                                                     <vscale x 2 x double> %b)
76   ret <vscale x 2 x double> %out
80 ; TRN2Q
83 define <vscale x 16 x i8> @trn2_i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) nounwind {
84 ; CHECK-LABEL: trn2_i8:
85 ; CHECK-NEXT:  trn2 z0.q, z0.q, z1.q
86 ; CHECK-NEXT:  ret
87   %out = call <vscale x 16 x i8> @llvm.aarch64.sve.trn2q.nxv16i8(<vscale x 16 x i8> %a,
88                                                                  <vscale x 16 x i8> %b)
89   ret <vscale x 16 x i8> %out
92 define <vscale x 8 x i16> @trn2_i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) nounwind {
93 ; CHECK-LABEL: trn2_i16:
94 ; CHECK-NEXT:  trn2 z0.q, z0.q, z1.q
95 ; CHECK-NEXT:  ret
96   %out = call <vscale x 8 x i16> @llvm.aarch64.sve.trn2q.nxv8i16(<vscale x 8 x i16> %a,
97                                                                  <vscale x 8 x i16> %b)
98   ret <vscale x 8 x i16> %out
101 define <vscale x 4 x i32> @trn2_i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) nounwind {
102 ; CHECK-LABEL: trn2_i32:
103 ; CHECK-NEXT:  trn2 z0.q, z0.q, z1.q
104 ; CHECK-NEXT:  ret
105   %out = call <vscale x 4 x i32> @llvm.aarch64.sve.trn2q.nxv4i32(<vscale x 4 x i32> %a,
106                                                                  <vscale x 4 x i32> %b)
107   ret <vscale x 4 x i32> %out
110 define <vscale x 2 x i64> @trn2_i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) nounwind {
111 ; CHECK-LABEL: trn2_i64:
112 ; CHECK-NEXT:  trn2 z0.q, z0.q, z1.q
113 ; CHECK-NEXT:  ret
114   %out = call <vscale x 2 x i64> @llvm.aarch64.sve.trn2q.nxv2i64(<vscale x 2 x i64> %a,
115                                                                  <vscale x 2 x i64> %b)
116   ret <vscale x 2 x i64> %out
119 define <vscale x 8 x half> @trn2_f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b) nounwind {
120 ; CHECK-LABEL: trn2_f16:
121 ; CHECK-NEXT:  trn2 z0.q, z0.q, z1.q
122 ; CHECK-NEXT:  ret
123   %out = call <vscale x 8 x half> @llvm.aarch64.sve.trn2q.nxv8f16(<vscale x 8 x half> %a,
124                                                                   <vscale x 8 x half> %b)
125   ret <vscale x 8 x half> %out
128 define <vscale x 8 x bfloat> @trn2_bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) nounwind #0 {
129 ; CHECK-LABEL: trn2_bf16:
130 ; CHECK-NEXT:  trn2 z0.q, z0.q, z1.q
131 ; CHECK-NEXT:  ret
132   %out = call <vscale x 8 x bfloat> @llvm.aarch64.sve.trn2q.nxv8bf16(<vscale x 8 x bfloat> %a,
133                                                                      <vscale x 8 x bfloat> %b)
134   ret <vscale x 8 x bfloat> %out
137 define <vscale x 4 x float> @trn2_f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b) nounwind {
138 ; CHECK-LABEL: trn2_f32:
139 ; CHECK-NEXT:  trn2 z0.q, z0.q, z1.q
140 ; CHECK-NEXT:  ret
141   %out = call <vscale x 4 x float> @llvm.aarch64.sve.trn2q.nxv4f32(<vscale x 4 x float> %a,
142                                                                    <vscale x 4 x float> %b)
143   ret <vscale x 4 x float> %out
146 define <vscale x 2 x double> @trn2_f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b) nounwind {
147 ; CHECK-LABEL: trn2_f64:
148 ; CHECK-NEXT:  trn2 z0.q, z0.q, z1.q
149 ; CHECK-NEXT:  ret
150   %out = call <vscale x 2 x double> @llvm.aarch64.sve.trn2q.nxv2f64(<vscale x 2 x double> %a,
151                                                                     <vscale x 2 x double> %b)
152   ret <vscale x 2 x double> %out
156 ; UZP1Q
159 define <vscale x 16 x i8> @uzp1_i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) nounwind {
160 ; CHECK-LABEL: uzp1_i8:
161 ; CHECK-NEXT:  uzp1 z0.q, z0.q, z1.q
162 ; CHECK-NEXT:  ret
163   %out = call <vscale x 16 x i8> @llvm.aarch64.sve.uzp1q.nxv16i8(<vscale x 16 x i8> %a,
164                                                                  <vscale x 16 x i8> %b)
165   ret <vscale x 16 x i8> %out
168 define <vscale x 8 x i16> @uzp1_i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) nounwind {
169 ; CHECK-LABEL: uzp1_i16:
170 ; CHECK-NEXT:  uzp1 z0.q, z0.q, z1.q
171 ; CHECK-NEXT:  ret
172   %out = call <vscale x 8 x i16> @llvm.aarch64.sve.uzp1q.nxv8i16(<vscale x 8 x i16> %a,
173                                                                  <vscale x 8 x i16> %b)
174   ret <vscale x 8 x i16> %out
177 define <vscale x 4 x i32> @uzp1_i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) nounwind {
178 ; CHECK-LABEL: uzp1_i32:
179 ; CHECK-NEXT:  uzp1 z0.q, z0.q, z1.q
180 ; CHECK-NEXT:  ret
181   %out = call <vscale x 4 x i32> @llvm.aarch64.sve.uzp1q.nxv4i32(<vscale x 4 x i32> %a,
182                                                                  <vscale x 4 x i32> %b)
183   ret <vscale x 4 x i32> %out
186 define <vscale x 2 x i64> @uzp1_i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) nounwind {
187 ; CHECK-LABEL: uzp1_i64:
188 ; CHECK-NEXT:  uzp1 z0.q, z0.q, z1.q
189 ; CHECK-NEXT:  ret
190   %out = call <vscale x 2 x i64> @llvm.aarch64.sve.uzp1q.nxv2i64(<vscale x 2 x i64> %a,
191                                                                  <vscale x 2 x i64> %b)
192   ret <vscale x 2 x i64> %out
195 define <vscale x 8 x half> @uzp1_f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b) nounwind {
196 ; CHECK-LABEL: uzp1_f16:
197 ; CHECK-NEXT:  uzp1 z0.q, z0.q, z1.q
198 ; CHECK-NEXT:  ret
199   %out = call <vscale x 8 x half> @llvm.aarch64.sve.uzp1q.nxv8f16(<vscale x 8 x half> %a,
200                                                                   <vscale x 8 x half> %b)
201   ret <vscale x 8 x half> %out
204 define <vscale x 8 x bfloat> @uzp1_bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) nounwind #0 {
205 ; CHECK-LABEL: uzp1_bf16:
206 ; CHECK-NEXT:  uzp1 z0.q, z0.q, z1.q
207 ; CHECK-NEXT:  ret
208   %out = call <vscale x 8 x bfloat> @llvm.aarch64.sve.uzp1q.nxv8bf16(<vscale x 8 x bfloat> %a,
209                                                                      <vscale x 8 x bfloat> %b)
210   ret <vscale x 8 x bfloat> %out
213 define <vscale x 4 x float> @uzp1_f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b) nounwind {
214 ; CHECK-LABEL: uzp1_f32:
215 ; CHECK-NEXT:  uzp1 z0.q, z0.q, z1.q
216 ; CHECK-NEXT:  ret
217   %out = call <vscale x 4 x float> @llvm.aarch64.sve.uzp1q.nxv4f32(<vscale x 4 x float> %a,
218                                                                    <vscale x 4 x float> %b)
219   ret <vscale x 4 x float> %out
222 define <vscale x 2 x double> @uzp1_f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b) nounwind {
223 ; CHECK-LABEL: uzp1_f64:
224 ; CHECK-NEXT:  uzp1 z0.q, z0.q, z1.q
225 ; CHECK-NEXT:  ret
226   %out = call <vscale x 2 x double> @llvm.aarch64.sve.uzp1q.nxv2f64(<vscale x 2 x double> %a,
227                                                                     <vscale x 2 x double> %b)
228   ret <vscale x 2 x double> %out
232 ; UZP2Q
235 define <vscale x 16 x i8> @uzp2_i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) nounwind {
236 ; CHECK-LABEL: uzp2_i8:
237 ; CHECK-NEXT:  uzp2 z0.q, z0.q, z1.q
238 ; CHECK-NEXT:  ret
239   %out = call <vscale x 16 x i8> @llvm.aarch64.sve.uzp2q.nxv16i8(<vscale x 16 x i8> %a,
240                                                                  <vscale x 16 x i8> %b)
241   ret <vscale x 16 x i8> %out
244 define <vscale x 8 x i16> @uzp2_i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) nounwind {
245 ; CHECK-LABEL: uzp2_i16:
246 ; CHECK-NEXT:  uzp2 z0.q, z0.q, z1.q
247 ; CHECK-NEXT:  ret
248   %out = call <vscale x 8 x i16> @llvm.aarch64.sve.uzp2q.nxv8i16(<vscale x 8 x i16> %a,
249                                                                  <vscale x 8 x i16> %b)
250   ret <vscale x 8 x i16> %out
253 define <vscale x 4 x i32> @uzp2_i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) nounwind {
254 ; CHECK-LABEL: uzp2_i32:
255 ; CHECK-NEXT:  uzp2 z0.q, z0.q, z1.q
256 ; CHECK-NEXT:  ret
257   %out = call <vscale x 4 x i32> @llvm.aarch64.sve.uzp2q.nxv4i32(<vscale x 4 x i32> %a,
258                                                                  <vscale x 4 x i32> %b)
259   ret <vscale x 4 x i32> %out
262 define <vscale x 2 x i64> @uzp2_i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) nounwind {
263 ; CHECK-LABEL: uzp2_i64:
264 ; CHECK-NEXT:  uzp2 z0.q, z0.q, z1.q
265 ; CHECK-NEXT:  ret
266   %out = call <vscale x 2 x i64> @llvm.aarch64.sve.uzp2q.nxv2i64(<vscale x 2 x i64> %a,
267                                                                  <vscale x 2 x i64> %b)
268   ret <vscale x 2 x i64> %out
271 define <vscale x 8 x half> @uzp2_f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b) nounwind {
272 ; CHECK-LABEL: uzp2_f16:
273 ; CHECK-NEXT:  uzp2 z0.q, z0.q, z1.q
274 ; CHECK-NEXT:  ret
275   %out = call <vscale x 8 x half> @llvm.aarch64.sve.uzp2q.nxv8f16(<vscale x 8 x half> %a,
276                                                                   <vscale x 8 x half> %b)
277   ret <vscale x 8 x half> %out
280 define <vscale x 8 x bfloat> @uzp2_bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) nounwind #0 {
281 ; CHECK-LABEL: uzp2_bf16:
282 ; CHECK-NEXT:  uzp2 z0.q, z0.q, z1.q
283 ; CHECK-NEXT:  ret
284   %out = call <vscale x 8 x bfloat> @llvm.aarch64.sve.uzp2q.nxv8bf16(<vscale x 8 x bfloat> %a,
285                                                                      <vscale x 8 x bfloat> %b)
286   ret <vscale x 8 x bfloat> %out
289 define <vscale x 4 x float> @uzp2_f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b) nounwind {
290 ; CHECK-LABEL: uzp2_f32:
291 ; CHECK-NEXT:  uzp2 z0.q, z0.q, z1.q
292 ; CHECK-NEXT:  ret
293   %out = call <vscale x 4 x float> @llvm.aarch64.sve.uzp2q.nxv4f32(<vscale x 4 x float> %a,
294                                                                    <vscale x 4 x float> %b)
295   ret <vscale x 4 x float> %out
298 define <vscale x 2 x double> @uzp2_f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b) nounwind {
299 ; CHECK-LABEL: uzp2_f64:
300 ; CHECK-NEXT:  uzp2 z0.q, z0.q, z1.q
301 ; CHECK-NEXT:  ret
302   %out = call <vscale x 2 x double> @llvm.aarch64.sve.uzp2q.nxv2f64(<vscale x 2 x double> %a,
303                                                                     <vscale x 2 x double> %b)
304   ret <vscale x 2 x double> %out
308 ; ZIP1Q
311 define <vscale x 16 x i8> @zip1_i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) nounwind {
312 ; CHECK-LABEL: zip1_i8:
313 ; CHECK-NEXT:  zip1 z0.q, z0.q, z1.q
314 ; CHECK-NEXT:  ret
315   %out = call <vscale x 16 x i8> @llvm.aarch64.sve.zip1q.nxv16i8(<vscale x 16 x i8> %a,
316                                                                 <vscale x 16 x i8> %b)
317   ret <vscale x 16 x i8> %out
320 define <vscale x 8 x i16> @zip1_i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) nounwind {
321 ; CHECK-LABEL: zip1_i16:
322 ; CHECK-NEXT:  zip1 z0.q, z0.q, z1.q
323 ; CHECK-NEXT:  ret
324   %out = call <vscale x 8 x i16> @llvm.aarch64.sve.zip1q.nxv8i16(<vscale x 8 x i16> %a,
325                                                                  <vscale x 8 x i16> %b)
326   ret <vscale x 8 x i16> %out
329 define <vscale x 4 x i32> @zip1_i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) nounwind {
330 ; CHECK-LABEL: zip1_i32:
331 ; CHECK-NEXT:  zip1 z0.q, z0.q, z1.q
332 ; CHECK-NEXT:  ret
333   %out = call <vscale x 4 x i32> @llvm.aarch64.sve.zip1q.nxv4i32(<vscale x 4 x i32> %a,
334                                                                  <vscale x 4 x i32> %b)
335   ret <vscale x 4 x i32> %out
338 define <vscale x 2 x i64> @zip1_i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) nounwind {
339 ; CHECK-LABEL: zip1_i64:
340 ; CHECK-NEXT:  zip1 z0.q, z0.q, z1.q
341 ; CHECK-NEXT:  ret
342   %out = call <vscale x 2 x i64> @llvm.aarch64.sve.zip1q.nxv2i64(<vscale x 2 x i64> %a,
343                                                                  <vscale x 2 x i64> %b)
344   ret <vscale x 2 x i64> %out
347 define <vscale x 8 x half> @zip1_f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b) nounwind {
348 ; CHECK-LABEL: zip1_f16:
349 ; CHECK-NEXT:  zip1 z0.q, z0.q, z1.q
350 ; CHECK-NEXT:  ret
351   %out = call <vscale x 8 x half> @llvm.aarch64.sve.zip1q.nxv8f16(<vscale x 8 x half> %a,
352                                                                   <vscale x 8 x half> %b)
353   ret <vscale x 8 x half> %out
356 define <vscale x 8 x bfloat> @zip1_bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) nounwind #0 {
357 ; CHECK-LABEL: zip1_bf16:
358 ; CHECK-NEXT:  zip1 z0.q, z0.q, z1.q
359 ; CHECK-NEXT:  ret
360   %out = call <vscale x 8 x bfloat> @llvm.aarch64.sve.zip1q.nxv8bf16(<vscale x 8 x bfloat> %a,
361                                                                      <vscale x 8 x bfloat> %b)
362   ret <vscale x 8 x bfloat> %out
365 define <vscale x 4 x float> @zip1_f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b) nounwind {
366 ; CHECK-LABEL: zip1_f32:
367 ; CHECK-NEXT:  zip1 z0.q, z0.q, z1.q
368 ; CHECK-NEXT:  ret
369   %out = call <vscale x 4 x float> @llvm.aarch64.sve.zip1q.nxv4f32(<vscale x 4 x float> %a,
370                                                                    <vscale x 4 x float> %b)
371   ret <vscale x 4 x float> %out
374 define <vscale x 2 x double> @zip1_f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b) nounwind {
375 ; CHECK-LABEL: zip1_f64:
376 ; CHECK-NEXT:  zip1 z0.q, z0.q, z1.q
377 ; CHECK-NEXT:  ret
378   %out = call <vscale x 2 x double> @llvm.aarch64.sve.zip1q.nxv2f64(<vscale x 2 x double> %a,
379                                                                     <vscale x 2 x double> %b)
380   ret <vscale x 2 x double> %out
384 ; ZIP2Q
387 define <vscale x 16 x i8> @zip2_i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) nounwind {
388 ; CHECK-LABEL: zip2_i8:
389 ; CHECK-NEXT:  zip2 z0.q, z0.q, z1.q
390 ; CHECK-NEXT:  ret
391   %out = call <vscale x 16 x i8> @llvm.aarch64.sve.zip2q.nxv16i8(<vscale x 16 x i8> %a,
392                                                                  <vscale x 16 x i8> %b)
393   ret <vscale x 16 x i8> %out
396 define <vscale x 8 x i16> @zip2_i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) nounwind {
397 ; CHECK-LABEL: zip2_i16:
398 ; CHECK-NEXT:  zip2 z0.q, z0.q, z1.q
399 ; CHECK-NEXT:  ret
400   %out = call <vscale x 8 x i16> @llvm.aarch64.sve.zip2q.nxv8i16(<vscale x 8 x i16> %a,
401                                                                  <vscale x 8 x i16> %b)
402   ret <vscale x 8 x i16> %out
405 define <vscale x 4 x i32> @zip2_i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) nounwind {
406 ; CHECK-LABEL: zip2_i32:
407 ; CHECK-NEXT:  zip2 z0.q, z0.q, z1.q
408 ; CHECK-NEXT:  ret
409   %out = call <vscale x 4 x i32> @llvm.aarch64.sve.zip2q.nxv4i32(<vscale x 4 x i32> %a,
410                                                                  <vscale x 4 x i32> %b)
411   ret <vscale x 4 x i32> %out
414 define <vscale x 2 x i64> @zip2_i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) nounwind {
415 ; CHECK-LABEL: zip2_i64:
416 ; CHECK-NEXT:  zip2 z0.q, z0.q, z1.q
417 ; CHECK-NEXT:  ret
418   %out = call <vscale x 2 x i64> @llvm.aarch64.sve.zip2q.nxv2i64(<vscale x 2 x i64> %a,
419                                                                  <vscale x 2 x i64> %b)
420   ret <vscale x 2 x i64> %out
423 define <vscale x 8 x half> @zip2_f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b) nounwind {
424 ; CHECK-LABEL: zip2_f16:
425 ; CHECK-NEXT:  zip2 z0.q, z0.q, z1.q
426 ; CHECK-NEXT:  ret
427   %out = call <vscale x 8 x half> @llvm.aarch64.sve.zip2q.nxv8f16(<vscale x 8 x half> %a,
428                                                                   <vscale x 8 x half> %b)
429   ret <vscale x 8 x half> %out
432 define <vscale x 8 x bfloat> @zip2_bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) nounwind #0 {
433 ; CHECK-LABEL: zip2_bf16:
434 ; CHECK-NEXT:  zip2 z0.q, z0.q, z1.q
435 ; CHECK-NEXT:  ret
436   %out = call <vscale x 8 x bfloat> @llvm.aarch64.sve.zip2q.nxv8bf16(<vscale x 8 x bfloat> %a,
437                                                                      <vscale x 8 x bfloat> %b)
438   ret <vscale x 8 x bfloat> %out
441 define <vscale x 4 x float> @zip2_f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b) nounwind {
442 ; CHECK-LABEL: zip2_f32:
443 ; CHECK-NEXT:  zip2 z0.q, z0.q, z1.q
444 ; CHECK-NEXT:  ret
445   %out = call <vscale x 4 x float> @llvm.aarch64.sve.zip2q.nxv4f32(<vscale x 4 x float> %a,
446                                                                    <vscale x 4 x float> %b)
447   ret <vscale x 4 x float> %out
450 define <vscale x 2 x double> @zip2_f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b) nounwind {
451 ; CHECK-LABEL: zip2_f64:
452 ; CHECK-NEXT:  zip2 z0.q, z0.q, z1.q
453 ; CHECK-NEXT:  ret
454   %out = call <vscale x 2 x double> @llvm.aarch64.sve.zip2q.nxv2f64(<vscale x 2 x double> %a,
455                                                                     <vscale x 2 x double> %b)
456   ret <vscale x 2 x double> %out
460 declare <vscale x 2 x double> @llvm.aarch64.sve.trn1q.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>)
461 declare <vscale x 2 x i64> @llvm.aarch64.sve.trn1q.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>)
462 declare <vscale x 4 x float> @llvm.aarch64.sve.trn1q.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>)
463 declare <vscale x 4 x i32> @llvm.aarch64.sve.trn1q.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>)
464 declare <vscale x 8 x bfloat> @llvm.aarch64.sve.trn1q.nxv8bf16(<vscale x 8 x bfloat>, <vscale x 8 x bfloat>)
465 declare <vscale x 8 x half> @llvm.aarch64.sve.trn1q.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>)
466 declare <vscale x 8 x i16> @llvm.aarch64.sve.trn1q.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>)
467 declare <vscale x 16 x i8> @llvm.aarch64.sve.trn1q.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>)
469 declare <vscale x 2 x double> @llvm.aarch64.sve.trn2q.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>)
470 declare <vscale x 2 x i64> @llvm.aarch64.sve.trn2q.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>)
471 declare <vscale x 4 x float> @llvm.aarch64.sve.trn2q.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>)
472 declare <vscale x 4 x i32> @llvm.aarch64.sve.trn2q.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>)
473 declare <vscale x 8 x bfloat> @llvm.aarch64.sve.trn2q.nxv8bf16(<vscale x 8 x bfloat>, <vscale x 8 x bfloat>)
474 declare <vscale x 8 x half> @llvm.aarch64.sve.trn2q.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>)
475 declare <vscale x 8 x i16> @llvm.aarch64.sve.trn2q.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>)
476 declare <vscale x 16 x i8> @llvm.aarch64.sve.trn2q.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>)
478 declare <vscale x 2 x double> @llvm.aarch64.sve.uzp1q.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>)
479 declare <vscale x 2 x i64> @llvm.aarch64.sve.uzp1q.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>)
480 declare <vscale x 4 x float> @llvm.aarch64.sve.uzp1q.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>)
481 declare <vscale x 4 x i32> @llvm.aarch64.sve.uzp1q.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>)
482 declare <vscale x 8 x bfloat> @llvm.aarch64.sve.uzp1q.nxv8bf16(<vscale x 8 x bfloat>, <vscale x 8 x bfloat>)
483 declare <vscale x 8 x half> @llvm.aarch64.sve.uzp1q.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>)
484 declare <vscale x 8 x i16> @llvm.aarch64.sve.uzp1q.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>)
485 declare <vscale x 16 x i8> @llvm.aarch64.sve.uzp1q.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>)
487 declare <vscale x 2 x double> @llvm.aarch64.sve.uzp2q.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>)
488 declare <vscale x 2 x i64> @llvm.aarch64.sve.uzp2q.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>)
489 declare <vscale x 4 x float> @llvm.aarch64.sve.uzp2q.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>)
490 declare <vscale x 4 x i32> @llvm.aarch64.sve.uzp2q.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>)
491 declare <vscale x 8 x bfloat> @llvm.aarch64.sve.uzp2q.nxv8bf16(<vscale x 8 x bfloat>, <vscale x 8 x bfloat>)
492 declare <vscale x 8 x half> @llvm.aarch64.sve.uzp2q.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>)
493 declare <vscale x 8 x i16> @llvm.aarch64.sve.uzp2q.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>)
494 declare <vscale x 16 x i8> @llvm.aarch64.sve.uzp2q.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>)
496 declare <vscale x 2 x double> @llvm.aarch64.sve.zip1q.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>)
497 declare <vscale x 2 x i64> @llvm.aarch64.sve.zip1q.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>)
498 declare <vscale x 4 x float> @llvm.aarch64.sve.zip1q.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>)
499 declare <vscale x 4 x i32> @llvm.aarch64.sve.zip1q.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>)
500 declare <vscale x 8 x bfloat> @llvm.aarch64.sve.zip1q.nxv8bf16(<vscale x 8 x bfloat>, <vscale x 8 x bfloat>)
501 declare <vscale x 8 x half> @llvm.aarch64.sve.zip1q.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>)
502 declare <vscale x 8 x i16> @llvm.aarch64.sve.zip1q.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>)
503 declare <vscale x 16 x i8> @llvm.aarch64.sve.zip1q.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>)
505 declare <vscale x 2 x double> @llvm.aarch64.sve.zip2q.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>)
506 declare <vscale x 2 x i64> @llvm.aarch64.sve.zip2q.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>)
507 declare <vscale x 4 x float> @llvm.aarch64.sve.zip2q.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>)
508 declare <vscale x 4 x i32> @llvm.aarch64.sve.zip2q.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>)
509 declare <vscale x 8 x bfloat> @llvm.aarch64.sve.zip2q.nxv8bf16(<vscale x 8 x bfloat>, <vscale x 8 x bfloat>)
510 declare <vscale x 8 x half> @llvm.aarch64.sve.zip2q.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>)
511 declare <vscale x 8 x i16> @llvm.aarch64.sve.zip2q.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>)
512 declare <vscale x 16 x i8> @llvm.aarch64.sve.zip2q.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>)
514 ; +bf16 is required for the bfloat version.
515 attributes #0 = { "target-features"="+sve,+fp64mm,+bf16" }