[LLVM][IR] Use splat syntax when printing ConstantExpr based splats. (#116856)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-bitcast.ll
blobbe80af89f270c8ae8a0f5497cba43e287db03152
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64-linux-gnu < %s | FileCheck %s
3 ; RUN: llc -mtriple=aarch64_be < %s | FileCheck %s --check-prefix=CHECK_BE
6 ; bitcast to nxv16i8
9 define <vscale x 16 x i8> @bitcast_nxv8i16_to_nxv16i8(<vscale x 8 x i16> %v) #0 {
10 ; CHECK-LABEL: bitcast_nxv8i16_to_nxv16i8:
11 ; CHECK:       // %bb.0:
12 ; CHECK-NEXT:    ret
14 ; CHECK_BE-LABEL: bitcast_nxv8i16_to_nxv16i8:
15 ; CHECK_BE:       // %bb.0:
16 ; CHECK_BE-NEXT:    ptrue p0.h
17 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
18 ; CHECK_BE-NEXT:    ret
19   %bc = bitcast <vscale x 8 x i16> %v to <vscale x 16 x i8>
20   ret <vscale x 16 x i8> %bc
23 define <vscale x 16 x i8> @bitcast_nxv4i32_to_nxv16i8(<vscale x 4 x i32> %v) #0 {
24 ; CHECK-LABEL: bitcast_nxv4i32_to_nxv16i8:
25 ; CHECK:       // %bb.0:
26 ; CHECK-NEXT:    ret
28 ; CHECK_BE-LABEL: bitcast_nxv4i32_to_nxv16i8:
29 ; CHECK_BE:       // %bb.0:
30 ; CHECK_BE-NEXT:    ptrue p0.s
31 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
32 ; CHECK_BE-NEXT:    ret
33   %bc = bitcast <vscale x 4 x i32> %v to <vscale x 16 x i8>
34   ret <vscale x 16 x i8> %bc
37 define <vscale x 16 x i8> @bitcast_nxv2i64_to_nxv16i8(<vscale x 2 x i64> %v) #0 {
38 ; CHECK-LABEL: bitcast_nxv2i64_to_nxv16i8:
39 ; CHECK:       // %bb.0:
40 ; CHECK-NEXT:    ret
42 ; CHECK_BE-LABEL: bitcast_nxv2i64_to_nxv16i8:
43 ; CHECK_BE:       // %bb.0:
44 ; CHECK_BE-NEXT:    ptrue p0.d
45 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
46 ; CHECK_BE-NEXT:    ret
47   %bc = bitcast <vscale x 2 x i64> %v to <vscale x 16 x i8>
48   ret <vscale x 16 x i8> %bc
51 define <vscale x 16 x i8> @bitcast_nxv8f16_to_nxv16i8(<vscale x 8 x half> %v) #0 {
52 ; CHECK-LABEL: bitcast_nxv8f16_to_nxv16i8:
53 ; CHECK:       // %bb.0:
54 ; CHECK-NEXT:    ret
56 ; CHECK_BE-LABEL: bitcast_nxv8f16_to_nxv16i8:
57 ; CHECK_BE:       // %bb.0:
58 ; CHECK_BE-NEXT:    ptrue p0.h
59 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
60 ; CHECK_BE-NEXT:    ret
61   %bc = bitcast <vscale x 8 x half> %v to <vscale x 16 x i8>
62   ret <vscale x 16 x i8> %bc
65 define <vscale x 16 x i8> @bitcast_nxv4f32_to_nxv16i8(<vscale x 4 x float> %v) #0 {
66 ; CHECK-LABEL: bitcast_nxv4f32_to_nxv16i8:
67 ; CHECK:       // %bb.0:
68 ; CHECK-NEXT:    ret
70 ; CHECK_BE-LABEL: bitcast_nxv4f32_to_nxv16i8:
71 ; CHECK_BE:       // %bb.0:
72 ; CHECK_BE-NEXT:    ptrue p0.s
73 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
74 ; CHECK_BE-NEXT:    ret
75   %bc = bitcast <vscale x 4 x float> %v to <vscale x 16 x i8>
76   ret <vscale x 16 x i8> %bc
79 define <vscale x 16 x i8> @bitcast_nxv2f64_to_nxv16i8(<vscale x 2 x double> %v) #0 {
80 ; CHECK-LABEL: bitcast_nxv2f64_to_nxv16i8:
81 ; CHECK:       // %bb.0:
82 ; CHECK-NEXT:    ret
84 ; CHECK_BE-LABEL: bitcast_nxv2f64_to_nxv16i8:
85 ; CHECK_BE:       // %bb.0:
86 ; CHECK_BE-NEXT:    ptrue p0.d
87 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
88 ; CHECK_BE-NEXT:    ret
89   %bc = bitcast <vscale x 2 x double> %v to <vscale x 16 x i8>
90   ret <vscale x 16 x i8> %bc
93 define <vscale x 16 x i8> @bitcast_nxv8bf16_to_nxv16i8(<vscale x 8 x bfloat> %v) #0 {
94 ; CHECK-LABEL: bitcast_nxv8bf16_to_nxv16i8:
95 ; CHECK:       // %bb.0:
96 ; CHECK-NEXT:    ret
98 ; CHECK_BE-LABEL: bitcast_nxv8bf16_to_nxv16i8:
99 ; CHECK_BE:       // %bb.0:
100 ; CHECK_BE-NEXT:    ptrue p0.h
101 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
102 ; CHECK_BE-NEXT:    ret
103   %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 16 x i8>
104   ret <vscale x 16 x i8> %bc
108 ; bitcast to nxv8i16
111 define <vscale x 8 x i16> @bitcast_nxv16i8_to_nxv8i16(<vscale x 16 x i8> %v) #0 {
112 ; CHECK-LABEL: bitcast_nxv16i8_to_nxv8i16:
113 ; CHECK:       // %bb.0:
114 ; CHECK-NEXT:    ret
116 ; CHECK_BE-LABEL: bitcast_nxv16i8_to_nxv8i16:
117 ; CHECK_BE:       // %bb.0:
118 ; CHECK_BE-NEXT:    ptrue p0.h
119 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
120 ; CHECK_BE-NEXT:    ret
121   %bc = bitcast <vscale x 16 x i8> %v to <vscale x 8 x i16>
122   ret <vscale x 8 x i16> %bc
125 define <vscale x 8 x i16> @bitcast_nxv4i32_to_nxv8i16(<vscale x 4 x i32> %v) #0 {
126 ; CHECK-LABEL: bitcast_nxv4i32_to_nxv8i16:
127 ; CHECK:       // %bb.0:
128 ; CHECK-NEXT:    ret
130 ; CHECK_BE-LABEL: bitcast_nxv4i32_to_nxv8i16:
131 ; CHECK_BE:       // %bb.0:
132 ; CHECK_BE-NEXT:    ptrue p0.s
133 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
134 ; CHECK_BE-NEXT:    ptrue p0.h
135 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
136 ; CHECK_BE-NEXT:    ret
137   %bc = bitcast <vscale x 4 x i32> %v to <vscale x 8 x i16>
138   ret <vscale x 8 x i16> %bc
141 define <vscale x 8 x i16> @bitcast_nxv2i64_to_nxv8i16(<vscale x 2 x i64> %v) #0 {
142 ; CHECK-LABEL: bitcast_nxv2i64_to_nxv8i16:
143 ; CHECK:       // %bb.0:
144 ; CHECK-NEXT:    ret
146 ; CHECK_BE-LABEL: bitcast_nxv2i64_to_nxv8i16:
147 ; CHECK_BE:       // %bb.0:
148 ; CHECK_BE-NEXT:    ptrue p0.d
149 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
150 ; CHECK_BE-NEXT:    ptrue p0.h
151 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
152 ; CHECK_BE-NEXT:    ret
153   %bc = bitcast <vscale x 2 x i64> %v to <vscale x 8 x i16>
154   ret <vscale x 8 x i16> %bc
157 define <vscale x 8 x i16> @bitcast_nxv8f16_to_nxv8i16(<vscale x 8 x half> %v) #0 {
158 ; CHECK-LABEL: bitcast_nxv8f16_to_nxv8i16:
159 ; CHECK:       // %bb.0:
160 ; CHECK-NEXT:    ret
162 ; CHECK_BE-LABEL: bitcast_nxv8f16_to_nxv8i16:
163 ; CHECK_BE:       // %bb.0:
164 ; CHECK_BE-NEXT:    ret
165   %bc = bitcast <vscale x 8 x half> %v to <vscale x 8 x i16>
166   ret <vscale x 8 x i16> %bc
169 define <vscale x 8 x i16> @bitcast_nxv4f32_to_nxv8i16(<vscale x 4 x float> %v) #0 {
170 ; CHECK-LABEL: bitcast_nxv4f32_to_nxv8i16:
171 ; CHECK:       // %bb.0:
172 ; CHECK-NEXT:    ret
174 ; CHECK_BE-LABEL: bitcast_nxv4f32_to_nxv8i16:
175 ; CHECK_BE:       // %bb.0:
176 ; CHECK_BE-NEXT:    ptrue p0.s
177 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
178 ; CHECK_BE-NEXT:    ptrue p0.h
179 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
180 ; CHECK_BE-NEXT:    ret
181   %bc = bitcast <vscale x 4 x float> %v to <vscale x 8 x i16>
182   ret <vscale x 8 x i16> %bc
185 define <vscale x 8 x i16> @bitcast_nxv2f64_to_nxv8i16(<vscale x 2 x double> %v) #0 {
186 ; CHECK-LABEL: bitcast_nxv2f64_to_nxv8i16:
187 ; CHECK:       // %bb.0:
188 ; CHECK-NEXT:    ret
190 ; CHECK_BE-LABEL: bitcast_nxv2f64_to_nxv8i16:
191 ; CHECK_BE:       // %bb.0:
192 ; CHECK_BE-NEXT:    ptrue p0.d
193 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
194 ; CHECK_BE-NEXT:    ptrue p0.h
195 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
196 ; CHECK_BE-NEXT:    ret
197   %bc = bitcast <vscale x 2 x double> %v to <vscale x 8 x i16>
198   ret <vscale x 8 x i16> %bc
201 define <vscale x 8 x i16> @bitcast_nxv8bf16_to_nxv8i16(<vscale x 8 x bfloat> %v) #0 {
202 ; CHECK-LABEL: bitcast_nxv8bf16_to_nxv8i16:
203 ; CHECK:       // %bb.0:
204 ; CHECK-NEXT:    ret
206 ; CHECK_BE-LABEL: bitcast_nxv8bf16_to_nxv8i16:
207 ; CHECK_BE:       // %bb.0:
208 ; CHECK_BE-NEXT:    ret
209   %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 8 x i16>
210   ret <vscale x 8 x i16> %bc
214 ; bitcast to nxv4i32
217 define <vscale x 4 x i32> @bitcast_nxv16i8_to_nxv4i32(<vscale x 16 x i8> %v) #0 {
218 ; CHECK-LABEL: bitcast_nxv16i8_to_nxv4i32:
219 ; CHECK:       // %bb.0:
220 ; CHECK-NEXT:    ret
222 ; CHECK_BE-LABEL: bitcast_nxv16i8_to_nxv4i32:
223 ; CHECK_BE:       // %bb.0:
224 ; CHECK_BE-NEXT:    ptrue p0.s
225 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
226 ; CHECK_BE-NEXT:    ret
227   %bc = bitcast <vscale x 16 x i8> %v to <vscale x 4 x i32>
228   ret <vscale x 4 x i32> %bc
231 define <vscale x 4 x i32> @bitcast_nxv8i16_to_nxv4i32(<vscale x 8 x i16> %v) #0 {
232 ; CHECK-LABEL: bitcast_nxv8i16_to_nxv4i32:
233 ; CHECK:       // %bb.0:
234 ; CHECK-NEXT:    ret
236 ; CHECK_BE-LABEL: bitcast_nxv8i16_to_nxv4i32:
237 ; CHECK_BE:       // %bb.0:
238 ; CHECK_BE-NEXT:    ptrue p0.h
239 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
240 ; CHECK_BE-NEXT:    ptrue p0.s
241 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
242 ; CHECK_BE-NEXT:    ret
243   %bc = bitcast <vscale x 8 x i16> %v to <vscale x 4 x i32>
244   ret <vscale x 4 x i32> %bc
247 define <vscale x 4 x i32> @bitcast_nxv2i64_to_nxv4i32(<vscale x 2 x i64> %v) #0 {
248 ; CHECK-LABEL: bitcast_nxv2i64_to_nxv4i32:
249 ; CHECK:       // %bb.0:
250 ; CHECK-NEXT:    ret
252 ; CHECK_BE-LABEL: bitcast_nxv2i64_to_nxv4i32:
253 ; CHECK_BE:       // %bb.0:
254 ; CHECK_BE-NEXT:    ptrue p0.d
255 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
256 ; CHECK_BE-NEXT:    ptrue p0.s
257 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
258 ; CHECK_BE-NEXT:    ret
259   %bc = bitcast <vscale x 2 x i64> %v to <vscale x 4 x i32>
260   ret <vscale x 4 x i32> %bc
263 define <vscale x 4 x i32> @bitcast_nxv8f16_to_nxv4i32(<vscale x 8 x half> %v) #0 {
264 ; CHECK-LABEL: bitcast_nxv8f16_to_nxv4i32:
265 ; CHECK:       // %bb.0:
266 ; CHECK-NEXT:    ret
268 ; CHECK_BE-LABEL: bitcast_nxv8f16_to_nxv4i32:
269 ; CHECK_BE:       // %bb.0:
270 ; CHECK_BE-NEXT:    ptrue p0.h
271 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
272 ; CHECK_BE-NEXT:    ptrue p0.s
273 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
274 ; CHECK_BE-NEXT:    ret
275   %bc = bitcast <vscale x 8 x half> %v to <vscale x 4 x i32>
276   ret <vscale x 4 x i32> %bc
279 define <vscale x 4 x i32> @bitcast_nxv4f32_to_nxv4i32(<vscale x 4 x float> %v) #0 {
280 ; CHECK-LABEL: bitcast_nxv4f32_to_nxv4i32:
281 ; CHECK:       // %bb.0:
282 ; CHECK-NEXT:    ret
284 ; CHECK_BE-LABEL: bitcast_nxv4f32_to_nxv4i32:
285 ; CHECK_BE:       // %bb.0:
286 ; CHECK_BE-NEXT:    ret
287   %bc = bitcast <vscale x 4 x float> %v to <vscale x 4 x i32>
288   ret <vscale x 4 x i32> %bc
291 define <vscale x 4 x i32> @bitcast_nxv2f64_to_nxv4i32(<vscale x 2 x double> %v) #0 {
292 ; CHECK-LABEL: bitcast_nxv2f64_to_nxv4i32:
293 ; CHECK:       // %bb.0:
294 ; CHECK-NEXT:    ret
296 ; CHECK_BE-LABEL: bitcast_nxv2f64_to_nxv4i32:
297 ; CHECK_BE:       // %bb.0:
298 ; CHECK_BE-NEXT:    ptrue p0.d
299 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
300 ; CHECK_BE-NEXT:    ptrue p0.s
301 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
302 ; CHECK_BE-NEXT:    ret
303   %bc = bitcast <vscale x 2 x double> %v to <vscale x 4 x i32>
304   ret <vscale x 4 x i32> %bc
307 define <vscale x 4 x i32> @bitcast_nxv8bf16_to_nxv4i32(<vscale x 8 x bfloat> %v) #0 {
308 ; CHECK-LABEL: bitcast_nxv8bf16_to_nxv4i32:
309 ; CHECK:       // %bb.0:
310 ; CHECK-NEXT:    ret
312 ; CHECK_BE-LABEL: bitcast_nxv8bf16_to_nxv4i32:
313 ; CHECK_BE:       // %bb.0:
314 ; CHECK_BE-NEXT:    ptrue p0.h
315 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
316 ; CHECK_BE-NEXT:    ptrue p0.s
317 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
318 ; CHECK_BE-NEXT:    ret
319   %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 4 x i32>
320   ret <vscale x 4 x i32> %bc
324 ; bitcast to nxv2i64
327 define <vscale x 2 x i64> @bitcast_nxv16i8_to_nxv2i64(<vscale x 16 x i8> %v) #0 {
328 ; CHECK-LABEL: bitcast_nxv16i8_to_nxv2i64:
329 ; CHECK:       // %bb.0:
330 ; CHECK-NEXT:    ret
332 ; CHECK_BE-LABEL: bitcast_nxv16i8_to_nxv2i64:
333 ; CHECK_BE:       // %bb.0:
334 ; CHECK_BE-NEXT:    ptrue p0.d
335 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
336 ; CHECK_BE-NEXT:    ret
337   %bc = bitcast <vscale x 16 x i8> %v to <vscale x 2 x i64>
338   ret <vscale x 2 x i64> %bc
341 define <vscale x 2 x i64> @bitcast_nxv8i16_to_nxv2i64(<vscale x 8 x i16> %v) #0 {
342 ; CHECK-LABEL: bitcast_nxv8i16_to_nxv2i64:
343 ; CHECK:       // %bb.0:
344 ; CHECK-NEXT:    ret
346 ; CHECK_BE-LABEL: bitcast_nxv8i16_to_nxv2i64:
347 ; CHECK_BE:       // %bb.0:
348 ; CHECK_BE-NEXT:    ptrue p0.h
349 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
350 ; CHECK_BE-NEXT:    ptrue p0.d
351 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
352 ; CHECK_BE-NEXT:    ret
353   %bc = bitcast <vscale x 8 x i16> %v to <vscale x 2 x i64>
354   ret <vscale x 2 x i64> %bc
357 define <vscale x 2 x i64> @bitcast_nxv4i32_to_nxv2i64(<vscale x 4 x i32> %v) #0 {
358 ; CHECK-LABEL: bitcast_nxv4i32_to_nxv2i64:
359 ; CHECK:       // %bb.0:
360 ; CHECK-NEXT:    ret
362 ; CHECK_BE-LABEL: bitcast_nxv4i32_to_nxv2i64:
363 ; CHECK_BE:       // %bb.0:
364 ; CHECK_BE-NEXT:    ptrue p0.s
365 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
366 ; CHECK_BE-NEXT:    ptrue p0.d
367 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
368 ; CHECK_BE-NEXT:    ret
369   %bc = bitcast <vscale x 4 x i32> %v to <vscale x 2 x i64>
370   ret <vscale x 2 x i64> %bc
373 define <vscale x 2 x i64> @bitcast_nxv8f16_to_nxv2i64(<vscale x 8 x half> %v) #0 {
374 ; CHECK-LABEL: bitcast_nxv8f16_to_nxv2i64:
375 ; CHECK:       // %bb.0:
376 ; CHECK-NEXT:    ret
378 ; CHECK_BE-LABEL: bitcast_nxv8f16_to_nxv2i64:
379 ; CHECK_BE:       // %bb.0:
380 ; CHECK_BE-NEXT:    ptrue p0.h
381 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
382 ; CHECK_BE-NEXT:    ptrue p0.d
383 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
384 ; CHECK_BE-NEXT:    ret
385   %bc = bitcast <vscale x 8 x half> %v to <vscale x 2 x i64>
386   ret <vscale x 2 x i64> %bc
389 define <vscale x 2 x i64> @bitcast_nxv4f32_to_nxv2i64(<vscale x 4 x float> %v) #0 {
390 ; CHECK-LABEL: bitcast_nxv4f32_to_nxv2i64:
391 ; CHECK:       // %bb.0:
392 ; CHECK-NEXT:    ret
394 ; CHECK_BE-LABEL: bitcast_nxv4f32_to_nxv2i64:
395 ; CHECK_BE:       // %bb.0:
396 ; CHECK_BE-NEXT:    ptrue p0.s
397 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
398 ; CHECK_BE-NEXT:    ptrue p0.d
399 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
400 ; CHECK_BE-NEXT:    ret
401   %bc = bitcast <vscale x 4 x float> %v to <vscale x 2 x i64>
402   ret <vscale x 2 x i64> %bc
405 define <vscale x 2 x i64> @bitcast_nxv2f64_to_nxv2i64(<vscale x 2 x double> %v) #0 {
406 ; CHECK-LABEL: bitcast_nxv2f64_to_nxv2i64:
407 ; CHECK:       // %bb.0:
408 ; CHECK-NEXT:    ret
410 ; CHECK_BE-LABEL: bitcast_nxv2f64_to_nxv2i64:
411 ; CHECK_BE:       // %bb.0:
412 ; CHECK_BE-NEXT:    ret
413   %bc = bitcast <vscale x 2 x double> %v to <vscale x 2 x i64>
414   ret <vscale x 2 x i64> %bc
417 define <vscale x 2 x i64> @bitcast_nxv8bf16_to_nxv2i64(<vscale x 8 x bfloat> %v) #0 {
418 ; CHECK-LABEL: bitcast_nxv8bf16_to_nxv2i64:
419 ; CHECK:       // %bb.0:
420 ; CHECK-NEXT:    ret
422 ; CHECK_BE-LABEL: bitcast_nxv8bf16_to_nxv2i64:
423 ; CHECK_BE:       // %bb.0:
424 ; CHECK_BE-NEXT:    ptrue p0.h
425 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
426 ; CHECK_BE-NEXT:    ptrue p0.d
427 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
428 ; CHECK_BE-NEXT:    ret
429   %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 2 x i64>
430   ret <vscale x 2 x i64> %bc
434 ; bitcast to nxv8f16
437 define <vscale x 8 x half> @bitcast_nxv16i8_to_nxv8f16(<vscale x 16 x i8> %v) #0 {
438 ; CHECK-LABEL: bitcast_nxv16i8_to_nxv8f16:
439 ; CHECK:       // %bb.0:
440 ; CHECK-NEXT:    ret
442 ; CHECK_BE-LABEL: bitcast_nxv16i8_to_nxv8f16:
443 ; CHECK_BE:       // %bb.0:
444 ; CHECK_BE-NEXT:    ptrue p0.h
445 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
446 ; CHECK_BE-NEXT:    ret
447   %bc = bitcast <vscale x 16 x i8> %v to <vscale x 8 x half>
448   ret <vscale x 8 x half> %bc
451 define <vscale x 8 x half> @bitcast_nxv8i16_to_nxv8f16(<vscale x 8 x i16> %v) #0 {
452 ; CHECK-LABEL: bitcast_nxv8i16_to_nxv8f16:
453 ; CHECK:       // %bb.0:
454 ; CHECK-NEXT:    ret
456 ; CHECK_BE-LABEL: bitcast_nxv8i16_to_nxv8f16:
457 ; CHECK_BE:       // %bb.0:
458 ; CHECK_BE-NEXT:    ret
459   %bc = bitcast <vscale x 8 x i16> %v to <vscale x 8 x half>
460   ret <vscale x 8 x half> %bc
463 define <vscale x 8 x half> @bitcast_nxv4i32_to_nxv8f16(<vscale x 4 x i32> %v) #0 {
464 ; CHECK-LABEL: bitcast_nxv4i32_to_nxv8f16:
465 ; CHECK:       // %bb.0:
466 ; CHECK-NEXT:    ret
468 ; CHECK_BE-LABEL: bitcast_nxv4i32_to_nxv8f16:
469 ; CHECK_BE:       // %bb.0:
470 ; CHECK_BE-NEXT:    ptrue p0.s
471 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
472 ; CHECK_BE-NEXT:    ptrue p0.h
473 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
474 ; CHECK_BE-NEXT:    ret
475   %bc = bitcast <vscale x 4 x i32> %v to <vscale x 8 x half>
476   ret <vscale x 8 x half> %bc
479 define <vscale x 8 x half> @bitcast_nxv2i64_to_nxv8f16(<vscale x 2 x i64> %v) #0 {
480 ; CHECK-LABEL: bitcast_nxv2i64_to_nxv8f16:
481 ; CHECK:       // %bb.0:
482 ; CHECK-NEXT:    ret
484 ; CHECK_BE-LABEL: bitcast_nxv2i64_to_nxv8f16:
485 ; CHECK_BE:       // %bb.0:
486 ; CHECK_BE-NEXT:    ptrue p0.d
487 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
488 ; CHECK_BE-NEXT:    ptrue p0.h
489 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
490 ; CHECK_BE-NEXT:    ret
491   %bc = bitcast <vscale x 2 x i64> %v to <vscale x 8 x half>
492   ret <vscale x 8 x half> %bc
495 define <vscale x 8 x half> @bitcast_nxv4f32_to_nxv8f16(<vscale x 4 x float> %v) #0 {
496 ; CHECK-LABEL: bitcast_nxv4f32_to_nxv8f16:
497 ; CHECK:       // %bb.0:
498 ; CHECK-NEXT:    ret
500 ; CHECK_BE-LABEL: bitcast_nxv4f32_to_nxv8f16:
501 ; CHECK_BE:       // %bb.0:
502 ; CHECK_BE-NEXT:    ptrue p0.s
503 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
504 ; CHECK_BE-NEXT:    ptrue p0.h
505 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
506 ; CHECK_BE-NEXT:    ret
507   %bc = bitcast <vscale x 4 x float> %v to <vscale x 8 x half>
508   ret <vscale x 8 x half> %bc
511 define <vscale x 8 x half> @bitcast_nxv2f64_to_nxv8f16(<vscale x 2 x double> %v) #0 {
512 ; CHECK-LABEL: bitcast_nxv2f64_to_nxv8f16:
513 ; CHECK:       // %bb.0:
514 ; CHECK-NEXT:    ret
516 ; CHECK_BE-LABEL: bitcast_nxv2f64_to_nxv8f16:
517 ; CHECK_BE:       // %bb.0:
518 ; CHECK_BE-NEXT:    ptrue p0.d
519 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
520 ; CHECK_BE-NEXT:    ptrue p0.h
521 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
522 ; CHECK_BE-NEXT:    ret
523   %bc = bitcast <vscale x 2 x double> %v to <vscale x 8 x half>
524   ret <vscale x 8 x half> %bc
527 define <vscale x 8 x half> @bitcast_nxv8bf16_to_nxv8f16(<vscale x 8 x bfloat> %v) #0 {
528 ; CHECK-LABEL: bitcast_nxv8bf16_to_nxv8f16:
529 ; CHECK:       // %bb.0:
530 ; CHECK-NEXT:    ret
532 ; CHECK_BE-LABEL: bitcast_nxv8bf16_to_nxv8f16:
533 ; CHECK_BE:       // %bb.0:
534 ; CHECK_BE-NEXT:    ret
535   %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 8 x half>
536   ret <vscale x 8 x half> %bc
540 ; bitcast to nxv4f32
543 define <vscale x 4 x float> @bitcast_nxv16i8_to_nxv4f32(<vscale x 16 x i8> %v) #0 {
544 ; CHECK-LABEL: bitcast_nxv16i8_to_nxv4f32:
545 ; CHECK:       // %bb.0:
546 ; CHECK-NEXT:    ret
548 ; CHECK_BE-LABEL: bitcast_nxv16i8_to_nxv4f32:
549 ; CHECK_BE:       // %bb.0:
550 ; CHECK_BE-NEXT:    ptrue p0.s
551 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
552 ; CHECK_BE-NEXT:    ret
553   %bc = bitcast <vscale x 16 x i8> %v to <vscale x 4 x float>
554   ret <vscale x 4 x float> %bc
557 define <vscale x 4 x float> @bitcast_nxv8i16_to_nxv4f32(<vscale x 8 x i16> %v) #0 {
558 ; CHECK-LABEL: bitcast_nxv8i16_to_nxv4f32:
559 ; CHECK:       // %bb.0:
560 ; CHECK-NEXT:    ret
562 ; CHECK_BE-LABEL: bitcast_nxv8i16_to_nxv4f32:
563 ; CHECK_BE:       // %bb.0:
564 ; CHECK_BE-NEXT:    ptrue p0.h
565 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
566 ; CHECK_BE-NEXT:    ptrue p0.s
567 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
568 ; CHECK_BE-NEXT:    ret
569   %bc = bitcast <vscale x 8 x i16> %v to <vscale x 4 x float>
570   ret <vscale x 4 x float> %bc
573 define <vscale x 4 x float> @bitcast_nxv4i32_to_nxv4f32(<vscale x 4 x i32> %v) #0 {
574 ; CHECK-LABEL: bitcast_nxv4i32_to_nxv4f32:
575 ; CHECK:       // %bb.0:
576 ; CHECK-NEXT:    ret
578 ; CHECK_BE-LABEL: bitcast_nxv4i32_to_nxv4f32:
579 ; CHECK_BE:       // %bb.0:
580 ; CHECK_BE-NEXT:    ret
581   %bc = bitcast <vscale x 4 x i32> %v to <vscale x 4 x float>
582   ret <vscale x 4 x float> %bc
585 define <vscale x 4 x float> @bitcast_nxv2i64_to_nxv4f32(<vscale x 2 x i64> %v) #0 {
586 ; CHECK-LABEL: bitcast_nxv2i64_to_nxv4f32:
587 ; CHECK:       // %bb.0:
588 ; CHECK-NEXT:    ret
590 ; CHECK_BE-LABEL: bitcast_nxv2i64_to_nxv4f32:
591 ; CHECK_BE:       // %bb.0:
592 ; CHECK_BE-NEXT:    ptrue p0.d
593 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
594 ; CHECK_BE-NEXT:    ptrue p0.s
595 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
596 ; CHECK_BE-NEXT:    ret
597   %bc = bitcast <vscale x 2 x i64> %v to <vscale x 4 x float>
598   ret <vscale x 4 x float> %bc
601 define <vscale x 4 x float> @bitcast_nxv8f16_to_nxv4f32(<vscale x 8 x half> %v) #0 {
602 ; CHECK-LABEL: bitcast_nxv8f16_to_nxv4f32:
603 ; CHECK:       // %bb.0:
604 ; CHECK-NEXT:    ret
606 ; CHECK_BE-LABEL: bitcast_nxv8f16_to_nxv4f32:
607 ; CHECK_BE:       // %bb.0:
608 ; CHECK_BE-NEXT:    ptrue p0.h
609 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
610 ; CHECK_BE-NEXT:    ptrue p0.s
611 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
612 ; CHECK_BE-NEXT:    ret
613   %bc = bitcast <vscale x 8 x half> %v to <vscale x 4 x float>
614   ret <vscale x 4 x float> %bc
617 define <vscale x 4 x float> @bitcast_nxv2f64_to_nxv4f32(<vscale x 2 x double> %v) #0 {
618 ; CHECK-LABEL: bitcast_nxv2f64_to_nxv4f32:
619 ; CHECK:       // %bb.0:
620 ; CHECK-NEXT:    ret
622 ; CHECK_BE-LABEL: bitcast_nxv2f64_to_nxv4f32:
623 ; CHECK_BE:       // %bb.0:
624 ; CHECK_BE-NEXT:    ptrue p0.d
625 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
626 ; CHECK_BE-NEXT:    ptrue p0.s
627 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
628 ; CHECK_BE-NEXT:    ret
629   %bc = bitcast <vscale x 2 x double> %v to <vscale x 4 x float>
630   ret <vscale x 4 x float> %bc
633 define <vscale x 4 x float> @bitcast_nxv8bf16_to_nxv4f32(<vscale x 8 x bfloat> %v) #0 {
634 ; CHECK-LABEL: bitcast_nxv8bf16_to_nxv4f32:
635 ; CHECK:       // %bb.0:
636 ; CHECK-NEXT:    ret
638 ; CHECK_BE-LABEL: bitcast_nxv8bf16_to_nxv4f32:
639 ; CHECK_BE:       // %bb.0:
640 ; CHECK_BE-NEXT:    ptrue p0.h
641 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
642 ; CHECK_BE-NEXT:    ptrue p0.s
643 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
644 ; CHECK_BE-NEXT:    ret
645   %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 4 x float>
646   ret <vscale x 4 x float> %bc
650 ; bitcast to nxv2f64
653 define <vscale x 2 x double> @bitcast_nxv16i8_to_nxv2f64(<vscale x 16 x i8> %v) #0 {
654 ; CHECK-LABEL: bitcast_nxv16i8_to_nxv2f64:
655 ; CHECK:       // %bb.0:
656 ; CHECK-NEXT:    ret
658 ; CHECK_BE-LABEL: bitcast_nxv16i8_to_nxv2f64:
659 ; CHECK_BE:       // %bb.0:
660 ; CHECK_BE-NEXT:    ptrue p0.d
661 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
662 ; CHECK_BE-NEXT:    ret
663   %bc = bitcast <vscale x 16 x i8> %v to <vscale x 2 x double>
664   ret <vscale x 2 x double> %bc
667 define <vscale x 2 x double> @bitcast_nxv8i16_to_nxv2f64(<vscale x 8 x i16> %v) #0 {
668 ; CHECK-LABEL: bitcast_nxv8i16_to_nxv2f64:
669 ; CHECK:       // %bb.0:
670 ; CHECK-NEXT:    ret
672 ; CHECK_BE-LABEL: bitcast_nxv8i16_to_nxv2f64:
673 ; CHECK_BE:       // %bb.0:
674 ; CHECK_BE-NEXT:    ptrue p0.h
675 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
676 ; CHECK_BE-NEXT:    ptrue p0.d
677 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
678 ; CHECK_BE-NEXT:    ret
679   %bc = bitcast <vscale x 8 x i16> %v to <vscale x 2 x double>
680   ret <vscale x 2 x double> %bc
683 define <vscale x 2 x double> @bitcast_nxv4i32_to_nxv2f64(<vscale x 4 x i32> %v) #0 {
684 ; CHECK-LABEL: bitcast_nxv4i32_to_nxv2f64:
685 ; CHECK:       // %bb.0:
686 ; CHECK-NEXT:    ret
688 ; CHECK_BE-LABEL: bitcast_nxv4i32_to_nxv2f64:
689 ; CHECK_BE:       // %bb.0:
690 ; CHECK_BE-NEXT:    ptrue p0.s
691 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
692 ; CHECK_BE-NEXT:    ptrue p0.d
693 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
694 ; CHECK_BE-NEXT:    ret
695   %bc = bitcast <vscale x 4 x i32> %v to <vscale x 2 x double>
696   ret <vscale x 2 x double> %bc
699 define <vscale x 2 x double> @bitcast_nxv2i64_to_nxv2f64(<vscale x 2 x i64> %v) #0 {
700 ; CHECK-LABEL: bitcast_nxv2i64_to_nxv2f64:
701 ; CHECK:       // %bb.0:
702 ; CHECK-NEXT:    ret
704 ; CHECK_BE-LABEL: bitcast_nxv2i64_to_nxv2f64:
705 ; CHECK_BE:       // %bb.0:
706 ; CHECK_BE-NEXT:    ret
707   %bc = bitcast <vscale x 2 x i64> %v to <vscale x 2 x double>
708   ret <vscale x 2 x double> %bc
711 define <vscale x 2 x double> @bitcast_nxv8f16_to_nxv2f64(<vscale x 8 x half> %v) #0 {
712 ; CHECK-LABEL: bitcast_nxv8f16_to_nxv2f64:
713 ; CHECK:       // %bb.0:
714 ; CHECK-NEXT:    ret
716 ; CHECK_BE-LABEL: bitcast_nxv8f16_to_nxv2f64:
717 ; CHECK_BE:       // %bb.0:
718 ; CHECK_BE-NEXT:    ptrue p0.h
719 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
720 ; CHECK_BE-NEXT:    ptrue p0.d
721 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
722 ; CHECK_BE-NEXT:    ret
723   %bc = bitcast <vscale x 8 x half> %v to <vscale x 2 x double>
724   ret <vscale x 2 x double> %bc
727 define <vscale x 2 x double> @bitcast_nxv4f32_to_nxv2f64(<vscale x 4 x float> %v) #0 {
728 ; CHECK-LABEL: bitcast_nxv4f32_to_nxv2f64:
729 ; CHECK:       // %bb.0:
730 ; CHECK-NEXT:    ret
732 ; CHECK_BE-LABEL: bitcast_nxv4f32_to_nxv2f64:
733 ; CHECK_BE:       // %bb.0:
734 ; CHECK_BE-NEXT:    ptrue p0.s
735 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
736 ; CHECK_BE-NEXT:    ptrue p0.d
737 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
738 ; CHECK_BE-NEXT:    ret
739   %bc = bitcast <vscale x 4 x float> %v to <vscale x 2 x double>
740   ret <vscale x 2 x double> %bc
743 define <vscale x 2 x double> @bitcast_nxv8bf16_to_nxv2f64(<vscale x 8 x bfloat> %v) #0 {
744 ; CHECK-LABEL: bitcast_nxv8bf16_to_nxv2f64:
745 ; CHECK:       // %bb.0:
746 ; CHECK-NEXT:    ret
748 ; CHECK_BE-LABEL: bitcast_nxv8bf16_to_nxv2f64:
749 ; CHECK_BE:       // %bb.0:
750 ; CHECK_BE-NEXT:    ptrue p0.h
751 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
752 ; CHECK_BE-NEXT:    ptrue p0.d
753 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
754 ; CHECK_BE-NEXT:    ret
755   %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 2 x double>
756   ret <vscale x 2 x double> %bc
760 ; bitcast to nxv8bf16
763 define <vscale x 8 x bfloat> @bitcast_nxv16i8_to_nxv8bf16(<vscale x 16 x i8> %v) #0 {
764 ; CHECK-LABEL: bitcast_nxv16i8_to_nxv8bf16:
765 ; CHECK:       // %bb.0:
766 ; CHECK-NEXT:    ret
768 ; CHECK_BE-LABEL: bitcast_nxv16i8_to_nxv8bf16:
769 ; CHECK_BE:       // %bb.0:
770 ; CHECK_BE-NEXT:    ptrue p0.h
771 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
772 ; CHECK_BE-NEXT:    ret
773   %bc = bitcast <vscale x 16 x i8> %v to <vscale x 8 x bfloat>
774   ret <vscale x 8 x bfloat> %bc
777 define <vscale x 8 x bfloat> @bitcast_nxv8i16_to_nxv8bf16(<vscale x 8 x i16> %v) #0 {
778 ; CHECK-LABEL: bitcast_nxv8i16_to_nxv8bf16:
779 ; CHECK:       // %bb.0:
780 ; CHECK-NEXT:    ret
782 ; CHECK_BE-LABEL: bitcast_nxv8i16_to_nxv8bf16:
783 ; CHECK_BE:       // %bb.0:
784 ; CHECK_BE-NEXT:    ret
785   %bc = bitcast <vscale x 8 x i16> %v to <vscale x 8 x bfloat>
786   ret <vscale x 8 x bfloat> %bc
789 define <vscale x 8 x bfloat> @bitcast_nxv4i32_to_nxv8bf16(<vscale x 4 x i32> %v) #0 {
790 ; CHECK-LABEL: bitcast_nxv4i32_to_nxv8bf16:
791 ; CHECK:       // %bb.0:
792 ; CHECK-NEXT:    ret
794 ; CHECK_BE-LABEL: bitcast_nxv4i32_to_nxv8bf16:
795 ; CHECK_BE:       // %bb.0:
796 ; CHECK_BE-NEXT:    ptrue p0.s
797 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
798 ; CHECK_BE-NEXT:    ptrue p0.h
799 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
800 ; CHECK_BE-NEXT:    ret
801   %bc = bitcast <vscale x 4 x i32> %v to <vscale x 8 x bfloat>
802   ret <vscale x 8 x bfloat> %bc
805 define <vscale x 8 x bfloat> @bitcast_nxv2i64_to_nxv8bf16(<vscale x 2 x i64> %v) #0 {
806 ; CHECK-LABEL: bitcast_nxv2i64_to_nxv8bf16:
807 ; CHECK:       // %bb.0:
808 ; CHECK-NEXT:    ret
810 ; CHECK_BE-LABEL: bitcast_nxv2i64_to_nxv8bf16:
811 ; CHECK_BE:       // %bb.0:
812 ; CHECK_BE-NEXT:    ptrue p0.d
813 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
814 ; CHECK_BE-NEXT:    ptrue p0.h
815 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
816 ; CHECK_BE-NEXT:    ret
817   %bc = bitcast <vscale x 2 x i64> %v to <vscale x 8 x bfloat>
818   ret <vscale x 8 x bfloat> %bc
821 define <vscale x 8 x bfloat> @bitcast_nxv8f16_to_nxv8bf16(<vscale x 8 x half> %v) #0 {
822 ; CHECK-LABEL: bitcast_nxv8f16_to_nxv8bf16:
823 ; CHECK:       // %bb.0:
824 ; CHECK-NEXT:    ret
826 ; CHECK_BE-LABEL: bitcast_nxv8f16_to_nxv8bf16:
827 ; CHECK_BE:       // %bb.0:
828 ; CHECK_BE-NEXT:    ret
829   %bc = bitcast <vscale x 8 x half> %v to <vscale x 8 x bfloat>
830   ret <vscale x 8 x bfloat> %bc
833 define <vscale x 8 x bfloat> @bitcast_nxv4f32_to_nxv8bf16(<vscale x 4 x float> %v) #0 {
834 ; CHECK-LABEL: bitcast_nxv4f32_to_nxv8bf16:
835 ; CHECK:       // %bb.0:
836 ; CHECK-NEXT:    ret
838 ; CHECK_BE-LABEL: bitcast_nxv4f32_to_nxv8bf16:
839 ; CHECK_BE:       // %bb.0:
840 ; CHECK_BE-NEXT:    ptrue p0.s
841 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
842 ; CHECK_BE-NEXT:    ptrue p0.h
843 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
844 ; CHECK_BE-NEXT:    ret
845   %bc = bitcast <vscale x 4 x float> %v to <vscale x 8 x bfloat>
846   ret <vscale x 8 x bfloat> %bc
849 define <vscale x 8 x bfloat> @bitcast_nxv2f64_to_nxv8bf16(<vscale x 2 x double> %v) #0 {
850 ; CHECK-LABEL: bitcast_nxv2f64_to_nxv8bf16:
851 ; CHECK:       // %bb.0:
852 ; CHECK-NEXT:    ret
854 ; CHECK_BE-LABEL: bitcast_nxv2f64_to_nxv8bf16:
855 ; CHECK_BE:       // %bb.0:
856 ; CHECK_BE-NEXT:    ptrue p0.d
857 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
858 ; CHECK_BE-NEXT:    ptrue p0.h
859 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
860 ; CHECK_BE-NEXT:    ret
861   %bc = bitcast <vscale x 2 x double> %v to <vscale x 8 x bfloat>
862   ret <vscale x 8 x bfloat> %bc
866 ; bitcast to nxv8i8
869 define <vscale x 8 x i8> @bitcast_nxv4i16_to_nxv8i8(<vscale x 4 x i16> %v) #0 {
870 ; CHECK-LABEL: bitcast_nxv4i16_to_nxv8i8:
871 ; CHECK:       // %bb.0:
872 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
873 ; CHECK-NEXT:    addvl sp, sp, #-1
874 ; CHECK-NEXT:    ptrue p0.s
875 ; CHECK-NEXT:    ptrue p1.h
876 ; CHECK-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
877 ; CHECK-NEXT:    ld1b { z0.h }, p1/z, [sp, #1, mul vl]
878 ; CHECK-NEXT:    addvl sp, sp, #1
879 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
880 ; CHECK-NEXT:    ret
882 ; CHECK_BE-LABEL: bitcast_nxv4i16_to_nxv8i8:
883 ; CHECK_BE:       // %bb.0:
884 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
885 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
886 ; CHECK_BE-NEXT:    ptrue p0.s
887 ; CHECK_BE-NEXT:    ptrue p1.h
888 ; CHECK_BE-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
889 ; CHECK_BE-NEXT:    ld1b { z0.h }, p1/z, [sp, #1, mul vl]
890 ; CHECK_BE-NEXT:    addvl sp, sp, #1
891 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
892 ; CHECK_BE-NEXT:    ret
893   %bc = bitcast <vscale x 4 x i16> %v to <vscale x 8 x i8>
894   ret <vscale x 8 x i8> %bc
897 define <vscale x 8 x i8> @bitcast_nxv2i32_to_nxv8i8(<vscale x 2 x i32> %v) #0 {
898 ; CHECK-LABEL: bitcast_nxv2i32_to_nxv8i8:
899 ; CHECK:       // %bb.0:
900 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
901 ; CHECK-NEXT:    addvl sp, sp, #-1
902 ; CHECK-NEXT:    ptrue p0.d
903 ; CHECK-NEXT:    ptrue p1.h
904 ; CHECK-NEXT:    st1w { z0.d }, p0, [sp, #1, mul vl]
905 ; CHECK-NEXT:    ld1b { z0.h }, p1/z, [sp, #1, mul vl]
906 ; CHECK-NEXT:    addvl sp, sp, #1
907 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
908 ; CHECK-NEXT:    ret
910 ; CHECK_BE-LABEL: bitcast_nxv2i32_to_nxv8i8:
911 ; CHECK_BE:       // %bb.0:
912 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
913 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
914 ; CHECK_BE-NEXT:    ptrue p0.d
915 ; CHECK_BE-NEXT:    ptrue p1.h
916 ; CHECK_BE-NEXT:    st1w { z0.d }, p0, [sp, #1, mul vl]
917 ; CHECK_BE-NEXT:    ld1b { z0.h }, p1/z, [sp, #1, mul vl]
918 ; CHECK_BE-NEXT:    addvl sp, sp, #1
919 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
920 ; CHECK_BE-NEXT:    ret
921   %bc = bitcast <vscale x 2 x i32> %v to <vscale x 8 x i8>
922   ret <vscale x 8 x i8> %bc
925 define <vscale x 8 x i8> @bitcast_nxv1i64_to_nxv8i8(<vscale x 1 x i64> %v) #0 {
926 ; CHECK-LABEL: bitcast_nxv1i64_to_nxv8i8:
927 ; CHECK:       // %bb.0:
928 ; CHECK-NEXT:    uunpklo z0.h, z0.b
929 ; CHECK-NEXT:    ret
931 ; CHECK_BE-LABEL: bitcast_nxv1i64_to_nxv8i8:
932 ; CHECK_BE:       // %bb.0:
933 ; CHECK_BE-NEXT:    ptrue p0.d
934 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
935 ; CHECK_BE-NEXT:    uunpklo z0.h, z0.b
936 ; CHECK_BE-NEXT:    ret
937   %bc = bitcast <vscale x 1 x i64> %v to <vscale x 8 x i8>
938   ret <vscale x 8 x i8> %bc
941 define <vscale x 8 x i8> @bitcast_nxv4f16_to_nxv8i8(<vscale x 4 x half> %v) #0 {
942 ; CHECK-LABEL: bitcast_nxv4f16_to_nxv8i8:
943 ; CHECK:       // %bb.0:
944 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
945 ; CHECK-NEXT:    addvl sp, sp, #-1
946 ; CHECK-NEXT:    ptrue p0.s
947 ; CHECK-NEXT:    ptrue p1.h
948 ; CHECK-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
949 ; CHECK-NEXT:    ld1b { z0.h }, p1/z, [sp, #1, mul vl]
950 ; CHECK-NEXT:    addvl sp, sp, #1
951 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
952 ; CHECK-NEXT:    ret
954 ; CHECK_BE-LABEL: bitcast_nxv4f16_to_nxv8i8:
955 ; CHECK_BE:       // %bb.0:
956 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
957 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
958 ; CHECK_BE-NEXT:    ptrue p0.s
959 ; CHECK_BE-NEXT:    ptrue p1.h
960 ; CHECK_BE-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
961 ; CHECK_BE-NEXT:    ld1b { z0.h }, p1/z, [sp, #1, mul vl]
962 ; CHECK_BE-NEXT:    addvl sp, sp, #1
963 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
964 ; CHECK_BE-NEXT:    ret
965   %bc = bitcast <vscale x 4 x half> %v to <vscale x 8 x i8>
966   ret <vscale x 8 x i8> %bc
969 define <vscale x 8 x i8> @bitcast_nxv2f32_to_nxv8i8(<vscale x 2 x float> %v) #0 {
970 ; CHECK-LABEL: bitcast_nxv2f32_to_nxv8i8:
971 ; CHECK:       // %bb.0:
972 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
973 ; CHECK-NEXT:    addvl sp, sp, #-1
974 ; CHECK-NEXT:    ptrue p0.d
975 ; CHECK-NEXT:    ptrue p1.h
976 ; CHECK-NEXT:    st1w { z0.d }, p0, [sp, #1, mul vl]
977 ; CHECK-NEXT:    ld1b { z0.h }, p1/z, [sp, #1, mul vl]
978 ; CHECK-NEXT:    addvl sp, sp, #1
979 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
980 ; CHECK-NEXT:    ret
982 ; CHECK_BE-LABEL: bitcast_nxv2f32_to_nxv8i8:
983 ; CHECK_BE:       // %bb.0:
984 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
985 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
986 ; CHECK_BE-NEXT:    ptrue p0.d
987 ; CHECK_BE-NEXT:    ptrue p1.h
988 ; CHECK_BE-NEXT:    st1w { z0.d }, p0, [sp, #1, mul vl]
989 ; CHECK_BE-NEXT:    ld1b { z0.h }, p1/z, [sp, #1, mul vl]
990 ; CHECK_BE-NEXT:    addvl sp, sp, #1
991 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
992 ; CHECK_BE-NEXT:    ret
993   %bc = bitcast <vscale x 2 x float> %v to <vscale x 8 x i8>
994   ret <vscale x 8 x i8> %bc
997 define <vscale x 8 x i8> @bitcast_nxv1f64_to_nxv8i8(<vscale x 1 x double> %v) #0 {
998 ; CHECK-LABEL: bitcast_nxv1f64_to_nxv8i8:
999 ; CHECK:       // %bb.0:
1000 ; CHECK-NEXT:    uunpklo z0.h, z0.b
1001 ; CHECK-NEXT:    ret
1003 ; CHECK_BE-LABEL: bitcast_nxv1f64_to_nxv8i8:
1004 ; CHECK_BE:       // %bb.0:
1005 ; CHECK_BE-NEXT:    ptrue p0.d
1006 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1007 ; CHECK_BE-NEXT:    uunpklo z0.h, z0.b
1008 ; CHECK_BE-NEXT:    ret
1009   %bc = bitcast <vscale x 1 x double> %v to <vscale x 8 x i8>
1010   ret <vscale x 8 x i8> %bc
1013 define <vscale x 8 x i8> @bitcast_nxv4bf16_to_nxv8i8(<vscale x 4 x bfloat> %v) #0 {
1014 ; CHECK-LABEL: bitcast_nxv4bf16_to_nxv8i8:
1015 ; CHECK:       // %bb.0:
1016 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1017 ; CHECK-NEXT:    addvl sp, sp, #-1
1018 ; CHECK-NEXT:    ptrue p0.s
1019 ; CHECK-NEXT:    ptrue p1.h
1020 ; CHECK-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
1021 ; CHECK-NEXT:    ld1b { z0.h }, p1/z, [sp, #1, mul vl]
1022 ; CHECK-NEXT:    addvl sp, sp, #1
1023 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1024 ; CHECK-NEXT:    ret
1026 ; CHECK_BE-LABEL: bitcast_nxv4bf16_to_nxv8i8:
1027 ; CHECK_BE:       // %bb.0:
1028 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1029 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
1030 ; CHECK_BE-NEXT:    ptrue p0.s
1031 ; CHECK_BE-NEXT:    ptrue p1.h
1032 ; CHECK_BE-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
1033 ; CHECK_BE-NEXT:    ld1b { z0.h }, p1/z, [sp, #1, mul vl]
1034 ; CHECK_BE-NEXT:    addvl sp, sp, #1
1035 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1036 ; CHECK_BE-NEXT:    ret
1037   %bc = bitcast <vscale x 4 x bfloat> %v to <vscale x 8 x i8>
1038   ret <vscale x 8 x i8> %bc
1042 ; bitcast to nxv4i16
1045 define <vscale x 4 x i16> @bitcast_nxv8i8_to_nxv4i16(<vscale x 8 x i8> %v) #0 {
1046 ; CHECK-LABEL: bitcast_nxv8i8_to_nxv4i16:
1047 ; CHECK:       // %bb.0:
1048 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1049 ; CHECK-NEXT:    addvl sp, sp, #-1
1050 ; CHECK-NEXT:    ptrue p0.h
1051 ; CHECK-NEXT:    ptrue p1.s
1052 ; CHECK-NEXT:    st1b { z0.h }, p0, [sp, #1, mul vl]
1053 ; CHECK-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
1054 ; CHECK-NEXT:    addvl sp, sp, #1
1055 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1056 ; CHECK-NEXT:    ret
1058 ; CHECK_BE-LABEL: bitcast_nxv8i8_to_nxv4i16:
1059 ; CHECK_BE:       // %bb.0:
1060 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1061 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
1062 ; CHECK_BE-NEXT:    ptrue p0.h
1063 ; CHECK_BE-NEXT:    ptrue p1.s
1064 ; CHECK_BE-NEXT:    st1b { z0.h }, p0, [sp, #1, mul vl]
1065 ; CHECK_BE-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
1066 ; CHECK_BE-NEXT:    addvl sp, sp, #1
1067 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1068 ; CHECK_BE-NEXT:    ret
1069   %bc = bitcast <vscale x 8 x i8> %v to <vscale x 4 x i16>
1070   ret <vscale x 4 x i16> %bc
1073 define <vscale x 4 x i16> @bitcast_nxv2i32_to_nxv4i16(<vscale x 2 x i32> %v) #0 {
1074 ; CHECK-LABEL: bitcast_nxv2i32_to_nxv4i16:
1075 ; CHECK:       // %bb.0:
1076 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1077 ; CHECK-NEXT:    addvl sp, sp, #-1
1078 ; CHECK-NEXT:    ptrue p0.d
1079 ; CHECK-NEXT:    ptrue p1.s
1080 ; CHECK-NEXT:    st1w { z0.d }, p0, [sp, #1, mul vl]
1081 ; CHECK-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
1082 ; CHECK-NEXT:    addvl sp, sp, #1
1083 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1084 ; CHECK-NEXT:    ret
1086 ; CHECK_BE-LABEL: bitcast_nxv2i32_to_nxv4i16:
1087 ; CHECK_BE:       // %bb.0:
1088 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1089 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
1090 ; CHECK_BE-NEXT:    ptrue p0.d
1091 ; CHECK_BE-NEXT:    ptrue p1.s
1092 ; CHECK_BE-NEXT:    st1w { z0.d }, p0, [sp, #1, mul vl]
1093 ; CHECK_BE-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
1094 ; CHECK_BE-NEXT:    addvl sp, sp, #1
1095 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1096 ; CHECK_BE-NEXT:    ret
1097   %bc = bitcast <vscale x 2 x i32> %v to <vscale x 4 x i16>
1098   ret <vscale x 4 x i16> %bc
1101 define <vscale x 4 x i16> @bitcast_nxv1i64_to_nxv4i16(<vscale x 1 x i64> %v) #0 {
1102 ; CHECK-LABEL: bitcast_nxv1i64_to_nxv4i16:
1103 ; CHECK:       // %bb.0:
1104 ; CHECK-NEXT:    uunpklo z0.s, z0.h
1105 ; CHECK-NEXT:    ret
1107 ; CHECK_BE-LABEL: bitcast_nxv1i64_to_nxv4i16:
1108 ; CHECK_BE:       // %bb.0:
1109 ; CHECK_BE-NEXT:    ptrue p0.d
1110 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1111 ; CHECK_BE-NEXT:    ptrue p0.h
1112 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
1113 ; CHECK_BE-NEXT:    uunpklo z0.s, z0.h
1114 ; CHECK_BE-NEXT:    ret
1115   %bc = bitcast <vscale x 1 x i64> %v to <vscale x 4 x i16>
1116   ret <vscale x 4 x i16> %bc
1119 define <vscale x 4 x i16> @bitcast_nxv4f16_to_nxv4i16(<vscale x 4 x half> %v) #0 {
1120 ; CHECK-LABEL: bitcast_nxv4f16_to_nxv4i16:
1121 ; CHECK:       // %bb.0:
1122 ; CHECK-NEXT:    ret
1124 ; CHECK_BE-LABEL: bitcast_nxv4f16_to_nxv4i16:
1125 ; CHECK_BE:       // %bb.0:
1126 ; CHECK_BE-NEXT:    ptrue p0.h
1127 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
1128 ; CHECK_BE-NEXT:    ptrue p0.s
1129 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
1130 ; CHECK_BE-NEXT:    ret
1131   %bc = bitcast <vscale x 4 x half> %v to <vscale x 4 x i16>
1132   ret <vscale x 4 x i16> %bc
1135 define <vscale x 4 x i16> @bitcast_nxv2f32_to_nxv4i16(<vscale x 2 x float> %v) #0 {
1136 ; CHECK-LABEL: bitcast_nxv2f32_to_nxv4i16:
1137 ; CHECK:       // %bb.0:
1138 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1139 ; CHECK-NEXT:    addvl sp, sp, #-1
1140 ; CHECK-NEXT:    ptrue p0.d
1141 ; CHECK-NEXT:    ptrue p1.s
1142 ; CHECK-NEXT:    st1w { z0.d }, p0, [sp, #1, mul vl]
1143 ; CHECK-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
1144 ; CHECK-NEXT:    addvl sp, sp, #1
1145 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1146 ; CHECK-NEXT:    ret
1148 ; CHECK_BE-LABEL: bitcast_nxv2f32_to_nxv4i16:
1149 ; CHECK_BE:       // %bb.0:
1150 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1151 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
1152 ; CHECK_BE-NEXT:    ptrue p0.d
1153 ; CHECK_BE-NEXT:    ptrue p1.s
1154 ; CHECK_BE-NEXT:    st1w { z0.d }, p0, [sp, #1, mul vl]
1155 ; CHECK_BE-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
1156 ; CHECK_BE-NEXT:    addvl sp, sp, #1
1157 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1158 ; CHECK_BE-NEXT:    ret
1159   %bc = bitcast <vscale x 2 x float> %v to <vscale x 4 x i16>
1160   ret <vscale x 4 x i16> %bc
1163 define <vscale x 4 x i16> @bitcast_nxv1f64_to_nxv4i16(<vscale x 1 x double> %v) #0 {
1164 ; CHECK-LABEL: bitcast_nxv1f64_to_nxv4i16:
1165 ; CHECK:       // %bb.0:
1166 ; CHECK-NEXT:    uunpklo z0.s, z0.h
1167 ; CHECK-NEXT:    ret
1169 ; CHECK_BE-LABEL: bitcast_nxv1f64_to_nxv4i16:
1170 ; CHECK_BE:       // %bb.0:
1171 ; CHECK_BE-NEXT:    ptrue p0.d
1172 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1173 ; CHECK_BE-NEXT:    ptrue p0.h
1174 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
1175 ; CHECK_BE-NEXT:    uunpklo z0.s, z0.h
1176 ; CHECK_BE-NEXT:    ret
1177   %bc = bitcast <vscale x 1 x double> %v to <vscale x 4 x i16>
1178   ret <vscale x 4 x i16> %bc
1181 define <vscale x 4 x i16> @bitcast_nxv4bf16_to_nxv4i16(<vscale x 4 x bfloat> %v) #0 {
1182 ; CHECK-LABEL: bitcast_nxv4bf16_to_nxv4i16:
1183 ; CHECK:       // %bb.0:
1184 ; CHECK-NEXT:    ret
1186 ; CHECK_BE-LABEL: bitcast_nxv4bf16_to_nxv4i16:
1187 ; CHECK_BE:       // %bb.0:
1188 ; CHECK_BE-NEXT:    ptrue p0.h
1189 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
1190 ; CHECK_BE-NEXT:    ptrue p0.s
1191 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
1192 ; CHECK_BE-NEXT:    ret
1193   %bc = bitcast <vscale x 4 x bfloat> %v to <vscale x 4 x i16>
1194   ret <vscale x 4 x i16> %bc
1198 ; bitcast to nxv2i32
1201 define <vscale x 2 x i32> @bitcast_nxv8i8_to_nxv2i32(<vscale x 8 x i8> %v) #0 {
1202 ; CHECK-LABEL: bitcast_nxv8i8_to_nxv2i32:
1203 ; CHECK:       // %bb.0:
1204 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1205 ; CHECK-NEXT:    addvl sp, sp, #-1
1206 ; CHECK-NEXT:    ptrue p0.h
1207 ; CHECK-NEXT:    ptrue p1.d
1208 ; CHECK-NEXT:    st1b { z0.h }, p0, [sp, #1, mul vl]
1209 ; CHECK-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
1210 ; CHECK-NEXT:    addvl sp, sp, #1
1211 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1212 ; CHECK-NEXT:    ret
1214 ; CHECK_BE-LABEL: bitcast_nxv8i8_to_nxv2i32:
1215 ; CHECK_BE:       // %bb.0:
1216 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1217 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
1218 ; CHECK_BE-NEXT:    ptrue p0.h
1219 ; CHECK_BE-NEXT:    ptrue p1.d
1220 ; CHECK_BE-NEXT:    st1b { z0.h }, p0, [sp, #1, mul vl]
1221 ; CHECK_BE-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
1222 ; CHECK_BE-NEXT:    addvl sp, sp, #1
1223 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1224 ; CHECK_BE-NEXT:    ret
1225   %bc = bitcast <vscale x 8 x i8> %v to <vscale x 2 x i32>
1226   ret <vscale x 2 x i32> %bc
1229 define <vscale x 2 x i32> @bitcast_nxv4i16_to_nxv2i32(<vscale x 4 x i16> %v) #0 {
1230 ; CHECK-LABEL: bitcast_nxv4i16_to_nxv2i32:
1231 ; CHECK:       // %bb.0:
1232 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1233 ; CHECK-NEXT:    addvl sp, sp, #-1
1234 ; CHECK-NEXT:    ptrue p0.s
1235 ; CHECK-NEXT:    ptrue p1.d
1236 ; CHECK-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
1237 ; CHECK-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
1238 ; CHECK-NEXT:    addvl sp, sp, #1
1239 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1240 ; CHECK-NEXT:    ret
1242 ; CHECK_BE-LABEL: bitcast_nxv4i16_to_nxv2i32:
1243 ; CHECK_BE:       // %bb.0:
1244 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1245 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
1246 ; CHECK_BE-NEXT:    ptrue p0.s
1247 ; CHECK_BE-NEXT:    ptrue p1.d
1248 ; CHECK_BE-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
1249 ; CHECK_BE-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
1250 ; CHECK_BE-NEXT:    addvl sp, sp, #1
1251 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1252 ; CHECK_BE-NEXT:    ret
1253   %bc = bitcast <vscale x 4 x i16> %v to <vscale x 2 x i32>
1254   ret <vscale x 2 x i32> %bc
1257 define <vscale x 2 x i32> @bitcast_nxv1i64_to_nxv2i32(<vscale x 1 x i64> %v) #0 {
1258 ; CHECK-LABEL: bitcast_nxv1i64_to_nxv2i32:
1259 ; CHECK:       // %bb.0:
1260 ; CHECK-NEXT:    uunpklo z0.d, z0.s
1261 ; CHECK-NEXT:    ret
1263 ; CHECK_BE-LABEL: bitcast_nxv1i64_to_nxv2i32:
1264 ; CHECK_BE:       // %bb.0:
1265 ; CHECK_BE-NEXT:    ptrue p0.d
1266 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1267 ; CHECK_BE-NEXT:    ptrue p0.s
1268 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
1269 ; CHECK_BE-NEXT:    uunpklo z0.d, z0.s
1270 ; CHECK_BE-NEXT:    ret
1271   %bc = bitcast <vscale x 1 x i64> %v to <vscale x 2 x i32>
1272   ret <vscale x 2 x i32> %bc
1275 define <vscale x 2 x i32> @bitcast_nxv4f16_to_nxv2i32(<vscale x 4 x half> %v) #0 {
1276 ; CHECK-LABEL: bitcast_nxv4f16_to_nxv2i32:
1277 ; CHECK:       // %bb.0:
1278 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1279 ; CHECK-NEXT:    addvl sp, sp, #-1
1280 ; CHECK-NEXT:    ptrue p0.s
1281 ; CHECK-NEXT:    ptrue p1.d
1282 ; CHECK-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
1283 ; CHECK-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
1284 ; CHECK-NEXT:    addvl sp, sp, #1
1285 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1286 ; CHECK-NEXT:    ret
1288 ; CHECK_BE-LABEL: bitcast_nxv4f16_to_nxv2i32:
1289 ; CHECK_BE:       // %bb.0:
1290 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1291 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
1292 ; CHECK_BE-NEXT:    ptrue p0.s
1293 ; CHECK_BE-NEXT:    ptrue p1.d
1294 ; CHECK_BE-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
1295 ; CHECK_BE-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
1296 ; CHECK_BE-NEXT:    addvl sp, sp, #1
1297 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1298 ; CHECK_BE-NEXT:    ret
1299   %bc = bitcast <vscale x 4 x half> %v to <vscale x 2 x i32>
1300   ret <vscale x 2 x i32> %bc
1303 define <vscale x 2 x i32> @bitcast_nxv2f32_to_nxv2i32(<vscale x 2 x float> %v) #0 {
1304 ; CHECK-LABEL: bitcast_nxv2f32_to_nxv2i32:
1305 ; CHECK:       // %bb.0:
1306 ; CHECK-NEXT:    ret
1308 ; CHECK_BE-LABEL: bitcast_nxv2f32_to_nxv2i32:
1309 ; CHECK_BE:       // %bb.0:
1310 ; CHECK_BE-NEXT:    ptrue p0.s
1311 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
1312 ; CHECK_BE-NEXT:    ptrue p0.d
1313 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1314 ; CHECK_BE-NEXT:    ret
1315   %bc = bitcast <vscale x 2 x float> %v to <vscale x 2 x i32>
1316   ret <vscale x 2 x i32> %bc
1319 define <vscale x 2 x i32> @bitcast_nxv1f64_to_nxv2i32(<vscale x 1 x double> %v) #0 {
1320 ; CHECK-LABEL: bitcast_nxv1f64_to_nxv2i32:
1321 ; CHECK:       // %bb.0:
1322 ; CHECK-NEXT:    uunpklo z0.d, z0.s
1323 ; CHECK-NEXT:    ret
1325 ; CHECK_BE-LABEL: bitcast_nxv1f64_to_nxv2i32:
1326 ; CHECK_BE:       // %bb.0:
1327 ; CHECK_BE-NEXT:    ptrue p0.d
1328 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1329 ; CHECK_BE-NEXT:    ptrue p0.s
1330 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
1331 ; CHECK_BE-NEXT:    uunpklo z0.d, z0.s
1332 ; CHECK_BE-NEXT:    ret
1333   %bc = bitcast <vscale x 1 x double> %v to <vscale x 2 x i32>
1334   ret <vscale x 2 x i32> %bc
1337 define <vscale x 2 x i32> @bitcast_nxv4bf16_to_nxv2i32(<vscale x 4 x bfloat> %v) #0 {
1338 ; CHECK-LABEL: bitcast_nxv4bf16_to_nxv2i32:
1339 ; CHECK:       // %bb.0:
1340 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1341 ; CHECK-NEXT:    addvl sp, sp, #-1
1342 ; CHECK-NEXT:    ptrue p0.s
1343 ; CHECK-NEXT:    ptrue p1.d
1344 ; CHECK-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
1345 ; CHECK-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
1346 ; CHECK-NEXT:    addvl sp, sp, #1
1347 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1348 ; CHECK-NEXT:    ret
1350 ; CHECK_BE-LABEL: bitcast_nxv4bf16_to_nxv2i32:
1351 ; CHECK_BE:       // %bb.0:
1352 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1353 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
1354 ; CHECK_BE-NEXT:    ptrue p0.s
1355 ; CHECK_BE-NEXT:    ptrue p1.d
1356 ; CHECK_BE-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
1357 ; CHECK_BE-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
1358 ; CHECK_BE-NEXT:    addvl sp, sp, #1
1359 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1360 ; CHECK_BE-NEXT:    ret
1361   %bc = bitcast <vscale x 4 x bfloat> %v to <vscale x 2 x i32>
1362   ret <vscale x 2 x i32> %bc
1366 ; bitcast to nxv1i64
1369 define <vscale x 1 x i64> @bitcast_nxv8i8_to_nxv1i64(<vscale x 8 x i8> %v) #0 {
1370 ; CHECK-LABEL: bitcast_nxv8i8_to_nxv1i64:
1371 ; CHECK:       // %bb.0:
1372 ; CHECK-NEXT:    uzp1 z0.b, z0.b, z0.b
1373 ; CHECK-NEXT:    ret
1375 ; CHECK_BE-LABEL: bitcast_nxv8i8_to_nxv1i64:
1376 ; CHECK_BE:       // %bb.0:
1377 ; CHECK_BE-NEXT:    uzp1 z0.b, z0.b, z0.b
1378 ; CHECK_BE-NEXT:    ptrue p0.d
1379 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1380 ; CHECK_BE-NEXT:    ret
1381   %bc = bitcast <vscale x 8 x i8> %v to <vscale x 1 x i64>
1382   ret <vscale x 1 x i64> %bc
1385 define <vscale x 1 x i64> @bitcast_nxv4i16_to_nxv1i64(<vscale x 4 x i16> %v) #0 {
1386 ; CHECK-LABEL: bitcast_nxv4i16_to_nxv1i64:
1387 ; CHECK:       // %bb.0:
1388 ; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
1389 ; CHECK-NEXT:    ret
1391 ; CHECK_BE-LABEL: bitcast_nxv4i16_to_nxv1i64:
1392 ; CHECK_BE:       // %bb.0:
1393 ; CHECK_BE-NEXT:    uzp1 z0.h, z0.h, z0.h
1394 ; CHECK_BE-NEXT:    ptrue p0.h
1395 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
1396 ; CHECK_BE-NEXT:    ptrue p0.d
1397 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1398 ; CHECK_BE-NEXT:    ret
1399   %bc = bitcast <vscale x 4 x i16> %v to <vscale x 1 x i64>
1400   ret <vscale x 1 x i64> %bc
1403 define <vscale x 1 x i64> @bitcast_nxv2i32_to_nxv1i64(<vscale x 2 x i32> %v) #0 {
1404 ; CHECK-LABEL: bitcast_nxv2i32_to_nxv1i64:
1405 ; CHECK:       // %bb.0:
1406 ; CHECK-NEXT:    uzp1 z0.s, z0.s, z0.s
1407 ; CHECK-NEXT:    ret
1409 ; CHECK_BE-LABEL: bitcast_nxv2i32_to_nxv1i64:
1410 ; CHECK_BE:       // %bb.0:
1411 ; CHECK_BE-NEXT:    uzp1 z0.s, z0.s, z0.s
1412 ; CHECK_BE-NEXT:    ptrue p0.s
1413 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
1414 ; CHECK_BE-NEXT:    ptrue p0.d
1415 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1416 ; CHECK_BE-NEXT:    ret
1417   %bc = bitcast <vscale x 2 x i32> %v to <vscale x 1 x i64>
1418   ret <vscale x 1 x i64> %bc
1421 define <vscale x 1 x i64> @bitcast_nxv4f16_to_nxv1i64(<vscale x 4 x half> %v) #0 {
1422 ; CHECK-LABEL: bitcast_nxv4f16_to_nxv1i64:
1423 ; CHECK:       // %bb.0:
1424 ; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
1425 ; CHECK-NEXT:    ret
1427 ; CHECK_BE-LABEL: bitcast_nxv4f16_to_nxv1i64:
1428 ; CHECK_BE:       // %bb.0:
1429 ; CHECK_BE-NEXT:    uzp1 z0.h, z0.h, z0.h
1430 ; CHECK_BE-NEXT:    ptrue p0.h
1431 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
1432 ; CHECK_BE-NEXT:    ptrue p0.d
1433 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1434 ; CHECK_BE-NEXT:    ret
1435   %bc = bitcast <vscale x 4 x half> %v to <vscale x 1 x i64>
1436   ret <vscale x 1 x i64> %bc
1439 define <vscale x 1 x i64> @bitcast_nxv2f32_to_nxv1i64(<vscale x 2 x float> %v) #0 {
1440 ; CHECK-LABEL: bitcast_nxv2f32_to_nxv1i64:
1441 ; CHECK:       // %bb.0:
1442 ; CHECK-NEXT:    uzp1 z0.s, z0.s, z0.s
1443 ; CHECK-NEXT:    ret
1445 ; CHECK_BE-LABEL: bitcast_nxv2f32_to_nxv1i64:
1446 ; CHECK_BE:       // %bb.0:
1447 ; CHECK_BE-NEXT:    uzp1 z0.s, z0.s, z0.s
1448 ; CHECK_BE-NEXT:    ptrue p0.s
1449 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
1450 ; CHECK_BE-NEXT:    ptrue p0.d
1451 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1452 ; CHECK_BE-NEXT:    ret
1453   %bc = bitcast <vscale x 2 x float> %v to <vscale x 1 x i64>
1454   ret <vscale x 1 x i64> %bc
1457 define <vscale x 1 x i64> @bitcast_nxv1f64_to_nxv1i64(<vscale x 1 x double> %v) #0 {
1458 ; CHECK-LABEL: bitcast_nxv1f64_to_nxv1i64:
1459 ; CHECK:       // %bb.0:
1460 ; CHECK-NEXT:    ret
1462 ; CHECK_BE-LABEL: bitcast_nxv1f64_to_nxv1i64:
1463 ; CHECK_BE:       // %bb.0:
1464 ; CHECK_BE-NEXT:    ret
1465   %bc = bitcast <vscale x 1 x double> %v to <vscale x 1 x i64>
1466   ret <vscale x 1 x i64> %bc
1469 define <vscale x 1 x i64> @bitcast_nxv4bf16_to_nxv1i64(<vscale x 4 x bfloat> %v) #0 {
1470 ; CHECK-LABEL: bitcast_nxv4bf16_to_nxv1i64:
1471 ; CHECK:       // %bb.0:
1472 ; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
1473 ; CHECK-NEXT:    ret
1475 ; CHECK_BE-LABEL: bitcast_nxv4bf16_to_nxv1i64:
1476 ; CHECK_BE:       // %bb.0:
1477 ; CHECK_BE-NEXT:    uzp1 z0.h, z0.h, z0.h
1478 ; CHECK_BE-NEXT:    ptrue p0.h
1479 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
1480 ; CHECK_BE-NEXT:    ptrue p0.d
1481 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1482 ; CHECK_BE-NEXT:    ret
1483   %bc = bitcast <vscale x 4 x bfloat> %v to <vscale x 1 x i64>
1484   ret <vscale x 1 x i64> %bc
1488 ; bitcast to nxv4f16
1491 define <vscale x 4 x half> @bitcast_nxv8i8_to_nxv4f16(<vscale x 8 x i8> %v) #0 {
1492 ; CHECK-LABEL: bitcast_nxv8i8_to_nxv4f16:
1493 ; CHECK:       // %bb.0:
1494 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1495 ; CHECK-NEXT:    addvl sp, sp, #-1
1496 ; CHECK-NEXT:    ptrue p0.h
1497 ; CHECK-NEXT:    ptrue p1.s
1498 ; CHECK-NEXT:    st1b { z0.h }, p0, [sp, #1, mul vl]
1499 ; CHECK-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
1500 ; CHECK-NEXT:    addvl sp, sp, #1
1501 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1502 ; CHECK-NEXT:    ret
1504 ; CHECK_BE-LABEL: bitcast_nxv8i8_to_nxv4f16:
1505 ; CHECK_BE:       // %bb.0:
1506 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1507 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
1508 ; CHECK_BE-NEXT:    ptrue p0.h
1509 ; CHECK_BE-NEXT:    ptrue p1.s
1510 ; CHECK_BE-NEXT:    st1b { z0.h }, p0, [sp, #1, mul vl]
1511 ; CHECK_BE-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
1512 ; CHECK_BE-NEXT:    addvl sp, sp, #1
1513 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1514 ; CHECK_BE-NEXT:    ret
1515   %bc = bitcast <vscale x 8 x i8> %v to <vscale x 4 x half>
1516   ret <vscale x 4 x half> %bc
1519 define <vscale x 4 x half> @bitcast_nxv4i16_to_nxv4f16(<vscale x 4 x i16> %v) #0 {
1520 ; CHECK-LABEL: bitcast_nxv4i16_to_nxv4f16:
1521 ; CHECK:       // %bb.0:
1522 ; CHECK-NEXT:    ret
1524 ; CHECK_BE-LABEL: bitcast_nxv4i16_to_nxv4f16:
1525 ; CHECK_BE:       // %bb.0:
1526 ; CHECK_BE-NEXT:    ptrue p0.s
1527 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
1528 ; CHECK_BE-NEXT:    ptrue p0.h
1529 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
1530 ; CHECK_BE-NEXT:    ret
1531   %bc = bitcast <vscale x 4 x i16> %v to <vscale x 4 x half>
1532   ret <vscale x 4 x half> %bc
1535 define <vscale x 4 x half> @bitcast_nxv2i32_to_nxv4f16(<vscale x 2 x i32> %v) #0 {
1536 ; CHECK-LABEL: bitcast_nxv2i32_to_nxv4f16:
1537 ; CHECK:       // %bb.0:
1538 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1539 ; CHECK-NEXT:    addvl sp, sp, #-1
1540 ; CHECK-NEXT:    ptrue p0.d
1541 ; CHECK-NEXT:    ptrue p1.s
1542 ; CHECK-NEXT:    st1w { z0.d }, p0, [sp, #1, mul vl]
1543 ; CHECK-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
1544 ; CHECK-NEXT:    addvl sp, sp, #1
1545 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1546 ; CHECK-NEXT:    ret
1548 ; CHECK_BE-LABEL: bitcast_nxv2i32_to_nxv4f16:
1549 ; CHECK_BE:       // %bb.0:
1550 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1551 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
1552 ; CHECK_BE-NEXT:    ptrue p0.d
1553 ; CHECK_BE-NEXT:    ptrue p1.s
1554 ; CHECK_BE-NEXT:    st1w { z0.d }, p0, [sp, #1, mul vl]
1555 ; CHECK_BE-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
1556 ; CHECK_BE-NEXT:    addvl sp, sp, #1
1557 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1558 ; CHECK_BE-NEXT:    ret
1559   %bc = bitcast <vscale x 2 x i32> %v to <vscale x 4 x half>
1560   ret <vscale x 4 x half> %bc
1563 define <vscale x 4 x half> @bitcast_nxv1i64_to_nxv4f16(<vscale x 1 x i64> %v) #0 {
1564 ; CHECK-LABEL: bitcast_nxv1i64_to_nxv4f16:
1565 ; CHECK:       // %bb.0:
1566 ; CHECK-NEXT:    uunpklo z0.s, z0.h
1567 ; CHECK-NEXT:    ret
1569 ; CHECK_BE-LABEL: bitcast_nxv1i64_to_nxv4f16:
1570 ; CHECK_BE:       // %bb.0:
1571 ; CHECK_BE-NEXT:    ptrue p0.d
1572 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1573 ; CHECK_BE-NEXT:    ptrue p0.h
1574 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
1575 ; CHECK_BE-NEXT:    uunpklo z0.s, z0.h
1576 ; CHECK_BE-NEXT:    ret
1577   %bc = bitcast <vscale x 1 x i64> %v to <vscale x 4 x half>
1578   ret <vscale x 4 x half> %bc
1581 define <vscale x 4 x half> @bitcast_nxv2f32_to_nxv4f16(<vscale x 2 x float> %v) #0 {
1582 ; CHECK-LABEL: bitcast_nxv2f32_to_nxv4f16:
1583 ; CHECK:       // %bb.0:
1584 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1585 ; CHECK-NEXT:    addvl sp, sp, #-1
1586 ; CHECK-NEXT:    ptrue p0.d
1587 ; CHECK-NEXT:    ptrue p1.s
1588 ; CHECK-NEXT:    st1w { z0.d }, p0, [sp, #1, mul vl]
1589 ; CHECK-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
1590 ; CHECK-NEXT:    addvl sp, sp, #1
1591 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1592 ; CHECK-NEXT:    ret
1594 ; CHECK_BE-LABEL: bitcast_nxv2f32_to_nxv4f16:
1595 ; CHECK_BE:       // %bb.0:
1596 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1597 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
1598 ; CHECK_BE-NEXT:    ptrue p0.d
1599 ; CHECK_BE-NEXT:    ptrue p1.s
1600 ; CHECK_BE-NEXT:    st1w { z0.d }, p0, [sp, #1, mul vl]
1601 ; CHECK_BE-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
1602 ; CHECK_BE-NEXT:    addvl sp, sp, #1
1603 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1604 ; CHECK_BE-NEXT:    ret
1605   %bc = bitcast <vscale x 2 x float> %v to <vscale x 4 x half>
1606   ret <vscale x 4 x half> %bc
1609 define <vscale x 4 x half> @bitcast_nxv1f64_to_nxv4f16(<vscale x 1 x double> %v) #0 {
1610 ; CHECK-LABEL: bitcast_nxv1f64_to_nxv4f16:
1611 ; CHECK:       // %bb.0:
1612 ; CHECK-NEXT:    uunpklo z0.s, z0.h
1613 ; CHECK-NEXT:    ret
1615 ; CHECK_BE-LABEL: bitcast_nxv1f64_to_nxv4f16:
1616 ; CHECK_BE:       // %bb.0:
1617 ; CHECK_BE-NEXT:    ptrue p0.d
1618 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1619 ; CHECK_BE-NEXT:    ptrue p0.h
1620 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
1621 ; CHECK_BE-NEXT:    uunpklo z0.s, z0.h
1622 ; CHECK_BE-NEXT:    ret
1623   %bc = bitcast <vscale x 1 x double> %v to <vscale x 4 x half>
1624   ret <vscale x 4 x half> %bc
1627 define <vscale x 4 x half> @bitcast_nxv4bf16_to_nxv4f16(<vscale x 4 x bfloat> %v) #0 {
1628 ; CHECK-LABEL: bitcast_nxv4bf16_to_nxv4f16:
1629 ; CHECK:       // %bb.0:
1630 ; CHECK-NEXT:    ret
1632 ; CHECK_BE-LABEL: bitcast_nxv4bf16_to_nxv4f16:
1633 ; CHECK_BE:       // %bb.0:
1634 ; CHECK_BE-NEXT:    ret
1635   %bc = bitcast <vscale x 4 x bfloat> %v to <vscale x 4 x half>
1636   ret <vscale x 4 x half> %bc
1640 ; bitcast to nxv2f32
1643 define <vscale x 2 x float> @bitcast_nxv8i8_to_nxv2f32(<vscale x 8 x i8> %v) #0 {
1644 ; CHECK-LABEL: bitcast_nxv8i8_to_nxv2f32:
1645 ; CHECK:       // %bb.0:
1646 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1647 ; CHECK-NEXT:    addvl sp, sp, #-1
1648 ; CHECK-NEXT:    ptrue p0.h
1649 ; CHECK-NEXT:    ptrue p1.d
1650 ; CHECK-NEXT:    st1b { z0.h }, p0, [sp, #1, mul vl]
1651 ; CHECK-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
1652 ; CHECK-NEXT:    addvl sp, sp, #1
1653 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1654 ; CHECK-NEXT:    ret
1656 ; CHECK_BE-LABEL: bitcast_nxv8i8_to_nxv2f32:
1657 ; CHECK_BE:       // %bb.0:
1658 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1659 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
1660 ; CHECK_BE-NEXT:    ptrue p0.h
1661 ; CHECK_BE-NEXT:    ptrue p1.d
1662 ; CHECK_BE-NEXT:    st1b { z0.h }, p0, [sp, #1, mul vl]
1663 ; CHECK_BE-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
1664 ; CHECK_BE-NEXT:    addvl sp, sp, #1
1665 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1666 ; CHECK_BE-NEXT:    ret
1667   %bc = bitcast <vscale x 8 x i8> %v to <vscale x 2 x float>
1668   ret <vscale x 2 x float> %bc
1671 define <vscale x 2 x float> @bitcast_nxv4i16_to_nxv2f32(<vscale x 4 x i16> %v) #0 {
1672 ; CHECK-LABEL: bitcast_nxv4i16_to_nxv2f32:
1673 ; CHECK:       // %bb.0:
1674 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1675 ; CHECK-NEXT:    addvl sp, sp, #-1
1676 ; CHECK-NEXT:    ptrue p0.s
1677 ; CHECK-NEXT:    ptrue p1.d
1678 ; CHECK-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
1679 ; CHECK-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
1680 ; CHECK-NEXT:    addvl sp, sp, #1
1681 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1682 ; CHECK-NEXT:    ret
1684 ; CHECK_BE-LABEL: bitcast_nxv4i16_to_nxv2f32:
1685 ; CHECK_BE:       // %bb.0:
1686 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1687 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
1688 ; CHECK_BE-NEXT:    ptrue p0.s
1689 ; CHECK_BE-NEXT:    ptrue p1.d
1690 ; CHECK_BE-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
1691 ; CHECK_BE-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
1692 ; CHECK_BE-NEXT:    addvl sp, sp, #1
1693 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1694 ; CHECK_BE-NEXT:    ret
1695   %bc = bitcast <vscale x 4 x i16> %v to <vscale x 2 x float>
1696   ret <vscale x 2 x float> %bc
1699 define <vscale x 2 x float> @bitcast_nxv2i32_to_nxv2f32(<vscale x 2 x i32> %v) #0 {
1700 ; CHECK-LABEL: bitcast_nxv2i32_to_nxv2f32:
1701 ; CHECK:       // %bb.0:
1702 ; CHECK-NEXT:    ret
1704 ; CHECK_BE-LABEL: bitcast_nxv2i32_to_nxv2f32:
1705 ; CHECK_BE:       // %bb.0:
1706 ; CHECK_BE-NEXT:    ptrue p0.d
1707 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1708 ; CHECK_BE-NEXT:    ptrue p0.s
1709 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
1710 ; CHECK_BE-NEXT:    ret
1711   %bc = bitcast <vscale x 2 x i32> %v to <vscale x 2 x float>
1712   ret <vscale x 2 x float> %bc
1715 define <vscale x 2 x float> @bitcast_nxv1i64_to_nxv2f32(<vscale x 1 x i64> %v) #0 {
1716 ; CHECK-LABEL: bitcast_nxv1i64_to_nxv2f32:
1717 ; CHECK:       // %bb.0:
1718 ; CHECK-NEXT:    uunpklo z0.d, z0.s
1719 ; CHECK-NEXT:    ret
1721 ; CHECK_BE-LABEL: bitcast_nxv1i64_to_nxv2f32:
1722 ; CHECK_BE:       // %bb.0:
1723 ; CHECK_BE-NEXT:    ptrue p0.d
1724 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1725 ; CHECK_BE-NEXT:    ptrue p0.s
1726 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
1727 ; CHECK_BE-NEXT:    uunpklo z0.d, z0.s
1728 ; CHECK_BE-NEXT:    ret
1729   %bc = bitcast <vscale x 1 x i64> %v to <vscale x 2 x float>
1730   ret <vscale x 2 x float> %bc
1733 define <vscale x 2 x float> @bitcast_nxv4f16_to_nxv2f32(<vscale x 4 x half> %v) #0 {
1734 ; CHECK-LABEL: bitcast_nxv4f16_to_nxv2f32:
1735 ; CHECK:       // %bb.0:
1736 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1737 ; CHECK-NEXT:    addvl sp, sp, #-1
1738 ; CHECK-NEXT:    ptrue p0.s
1739 ; CHECK-NEXT:    ptrue p1.d
1740 ; CHECK-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
1741 ; CHECK-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
1742 ; CHECK-NEXT:    addvl sp, sp, #1
1743 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1744 ; CHECK-NEXT:    ret
1746 ; CHECK_BE-LABEL: bitcast_nxv4f16_to_nxv2f32:
1747 ; CHECK_BE:       // %bb.0:
1748 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1749 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
1750 ; CHECK_BE-NEXT:    ptrue p0.s
1751 ; CHECK_BE-NEXT:    ptrue p1.d
1752 ; CHECK_BE-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
1753 ; CHECK_BE-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
1754 ; CHECK_BE-NEXT:    addvl sp, sp, #1
1755 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1756 ; CHECK_BE-NEXT:    ret
1757   %bc = bitcast <vscale x 4 x half> %v to <vscale x 2 x float>
1758   ret <vscale x 2 x float> %bc
1761 define <vscale x 2 x float> @bitcast_nxv1f64_to_nxv2f32(<vscale x 1 x double> %v) #0 {
1762 ; CHECK-LABEL: bitcast_nxv1f64_to_nxv2f32:
1763 ; CHECK:       // %bb.0:
1764 ; CHECK-NEXT:    uunpklo z0.d, z0.s
1765 ; CHECK-NEXT:    ret
1767 ; CHECK_BE-LABEL: bitcast_nxv1f64_to_nxv2f32:
1768 ; CHECK_BE:       // %bb.0:
1769 ; CHECK_BE-NEXT:    ptrue p0.d
1770 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1771 ; CHECK_BE-NEXT:    ptrue p0.s
1772 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
1773 ; CHECK_BE-NEXT:    uunpklo z0.d, z0.s
1774 ; CHECK_BE-NEXT:    ret
1775   %bc = bitcast <vscale x 1 x double> %v to <vscale x 2 x float>
1776   ret <vscale x 2 x float> %bc
1779 define <vscale x 2 x float> @bitcast_nxv4bf16_to_nxv2f32(<vscale x 4 x bfloat> %v) #0 {
1780 ; CHECK-LABEL: bitcast_nxv4bf16_to_nxv2f32:
1781 ; CHECK:       // %bb.0:
1782 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1783 ; CHECK-NEXT:    addvl sp, sp, #-1
1784 ; CHECK-NEXT:    ptrue p0.s
1785 ; CHECK-NEXT:    ptrue p1.d
1786 ; CHECK-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
1787 ; CHECK-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
1788 ; CHECK-NEXT:    addvl sp, sp, #1
1789 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1790 ; CHECK-NEXT:    ret
1792 ; CHECK_BE-LABEL: bitcast_nxv4bf16_to_nxv2f32:
1793 ; CHECK_BE:       // %bb.0:
1794 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1795 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
1796 ; CHECK_BE-NEXT:    ptrue p0.s
1797 ; CHECK_BE-NEXT:    ptrue p1.d
1798 ; CHECK_BE-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
1799 ; CHECK_BE-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
1800 ; CHECK_BE-NEXT:    addvl sp, sp, #1
1801 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1802 ; CHECK_BE-NEXT:    ret
1803   %bc = bitcast <vscale x 4 x bfloat> %v to <vscale x 2 x float>
1804   ret <vscale x 2 x float> %bc
1808 ; bitcast to nxv1f64
1811 define <vscale x 1 x double> @bitcast_nxv8i8_to_nxv1f64(<vscale x 8 x i8> %v) #0 {
1812 ; CHECK-LABEL: bitcast_nxv8i8_to_nxv1f64:
1813 ; CHECK:       // %bb.0:
1814 ; CHECK-NEXT:    uzp1 z0.b, z0.b, z0.b
1815 ; CHECK-NEXT:    ret
1817 ; CHECK_BE-LABEL: bitcast_nxv8i8_to_nxv1f64:
1818 ; CHECK_BE:       // %bb.0:
1819 ; CHECK_BE-NEXT:    uzp1 z0.b, z0.b, z0.b
1820 ; CHECK_BE-NEXT:    ptrue p0.d
1821 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1822 ; CHECK_BE-NEXT:    ret
1823   %bc = bitcast <vscale x 8 x i8> %v to <vscale x 1 x double>
1824   ret <vscale x 1 x double> %bc
1827 define <vscale x 1 x double> @bitcast_nxv4i16_to_nxv1f64(<vscale x 4 x i16> %v) #0 {
1828 ; CHECK-LABEL: bitcast_nxv4i16_to_nxv1f64:
1829 ; CHECK:       // %bb.0:
1830 ; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
1831 ; CHECK-NEXT:    ret
1833 ; CHECK_BE-LABEL: bitcast_nxv4i16_to_nxv1f64:
1834 ; CHECK_BE:       // %bb.0:
1835 ; CHECK_BE-NEXT:    uzp1 z0.h, z0.h, z0.h
1836 ; CHECK_BE-NEXT:    ptrue p0.h
1837 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
1838 ; CHECK_BE-NEXT:    ptrue p0.d
1839 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1840 ; CHECK_BE-NEXT:    ret
1841   %bc = bitcast <vscale x 4 x i16> %v to <vscale x 1 x double>
1842   ret <vscale x 1 x double> %bc
1845 define <vscale x 1 x double> @bitcast_nxv2i32_to_nxv1f64(<vscale x 2 x i32> %v) #0 {
1846 ; CHECK-LABEL: bitcast_nxv2i32_to_nxv1f64:
1847 ; CHECK:       // %bb.0:
1848 ; CHECK-NEXT:    uzp1 z0.s, z0.s, z0.s
1849 ; CHECK-NEXT:    ret
1851 ; CHECK_BE-LABEL: bitcast_nxv2i32_to_nxv1f64:
1852 ; CHECK_BE:       // %bb.0:
1853 ; CHECK_BE-NEXT:    uzp1 z0.s, z0.s, z0.s
1854 ; CHECK_BE-NEXT:    ptrue p0.s
1855 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
1856 ; CHECK_BE-NEXT:    ptrue p0.d
1857 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1858 ; CHECK_BE-NEXT:    ret
1859   %bc = bitcast <vscale x 2 x i32> %v to <vscale x 1 x double>
1860   ret <vscale x 1 x double> %bc
1863 define <vscale x 1 x double> @bitcast_nxv1i64_to_nxv1f64(<vscale x 1 x i64> %v) #0 {
1864 ; CHECK-LABEL: bitcast_nxv1i64_to_nxv1f64:
1865 ; CHECK:       // %bb.0:
1866 ; CHECK-NEXT:    ret
1868 ; CHECK_BE-LABEL: bitcast_nxv1i64_to_nxv1f64:
1869 ; CHECK_BE:       // %bb.0:
1870 ; CHECK_BE-NEXT:    ret
1871   %bc = bitcast <vscale x 1 x i64> %v to <vscale x 1 x double>
1872   ret <vscale x 1 x double> %bc
1875 define <vscale x 1 x double> @bitcast_nxv4f16_to_nxv1f64(<vscale x 4 x half> %v) #0 {
1876 ; CHECK-LABEL: bitcast_nxv4f16_to_nxv1f64:
1877 ; CHECK:       // %bb.0:
1878 ; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
1879 ; CHECK-NEXT:    ret
1881 ; CHECK_BE-LABEL: bitcast_nxv4f16_to_nxv1f64:
1882 ; CHECK_BE:       // %bb.0:
1883 ; CHECK_BE-NEXT:    uzp1 z0.h, z0.h, z0.h
1884 ; CHECK_BE-NEXT:    ptrue p0.h
1885 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
1886 ; CHECK_BE-NEXT:    ptrue p0.d
1887 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1888 ; CHECK_BE-NEXT:    ret
1889   %bc = bitcast <vscale x 4 x half> %v to <vscale x 1 x double>
1890   ret <vscale x 1 x double> %bc
1893 define <vscale x 1 x double> @bitcast_nxv2f32_to_nxv1f64(<vscale x 2 x float> %v) #0 {
1894 ; CHECK-LABEL: bitcast_nxv2f32_to_nxv1f64:
1895 ; CHECK:       // %bb.0:
1896 ; CHECK-NEXT:    uzp1 z0.s, z0.s, z0.s
1897 ; CHECK-NEXT:    ret
1899 ; CHECK_BE-LABEL: bitcast_nxv2f32_to_nxv1f64:
1900 ; CHECK_BE:       // %bb.0:
1901 ; CHECK_BE-NEXT:    uzp1 z0.s, z0.s, z0.s
1902 ; CHECK_BE-NEXT:    ptrue p0.s
1903 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
1904 ; CHECK_BE-NEXT:    ptrue p0.d
1905 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1906 ; CHECK_BE-NEXT:    ret
1907   %bc = bitcast <vscale x 2 x float> %v to <vscale x 1 x double>
1908   ret <vscale x 1 x double> %bc
1911 define <vscale x 1 x double> @bitcast_nxv4bf16_to_nxv1f64(<vscale x 4 x bfloat> %v) #0 {
1912 ; CHECK-LABEL: bitcast_nxv4bf16_to_nxv1f64:
1913 ; CHECK:       // %bb.0:
1914 ; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
1915 ; CHECK-NEXT:    ret
1917 ; CHECK_BE-LABEL: bitcast_nxv4bf16_to_nxv1f64:
1918 ; CHECK_BE:       // %bb.0:
1919 ; CHECK_BE-NEXT:    uzp1 z0.h, z0.h, z0.h
1920 ; CHECK_BE-NEXT:    ptrue p0.h
1921 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
1922 ; CHECK_BE-NEXT:    ptrue p0.d
1923 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
1924 ; CHECK_BE-NEXT:    ret
1925   %bc = bitcast <vscale x 4 x bfloat> %v to <vscale x 1 x double>
1926   ret <vscale x 1 x double> %bc
1930 ; bitcast to nxv4bf16
1933 define <vscale x 4 x bfloat> @bitcast_nxv8i8_to_nxv4bf16(<vscale x 8 x i8> %v) #0 {
1934 ; CHECK-LABEL: bitcast_nxv8i8_to_nxv4bf16:
1935 ; CHECK:       // %bb.0:
1936 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1937 ; CHECK-NEXT:    addvl sp, sp, #-1
1938 ; CHECK-NEXT:    ptrue p0.h
1939 ; CHECK-NEXT:    ptrue p1.s
1940 ; CHECK-NEXT:    st1b { z0.h }, p0, [sp, #1, mul vl]
1941 ; CHECK-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
1942 ; CHECK-NEXT:    addvl sp, sp, #1
1943 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1944 ; CHECK-NEXT:    ret
1946 ; CHECK_BE-LABEL: bitcast_nxv8i8_to_nxv4bf16:
1947 ; CHECK_BE:       // %bb.0:
1948 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1949 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
1950 ; CHECK_BE-NEXT:    ptrue p0.h
1951 ; CHECK_BE-NEXT:    ptrue p1.s
1952 ; CHECK_BE-NEXT:    st1b { z0.h }, p0, [sp, #1, mul vl]
1953 ; CHECK_BE-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
1954 ; CHECK_BE-NEXT:    addvl sp, sp, #1
1955 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1956 ; CHECK_BE-NEXT:    ret
1957   %bc = bitcast <vscale x 8 x i8> %v to <vscale x 4 x bfloat>
1958   ret <vscale x 4 x bfloat> %bc
1961 define <vscale x 4 x bfloat> @bitcast_nxv4i16_to_nxv4bf16(<vscale x 4 x i16> %v) #0 {
1962 ; CHECK-LABEL: bitcast_nxv4i16_to_nxv4bf16:
1963 ; CHECK:       // %bb.0:
1964 ; CHECK-NEXT:    ret
1966 ; CHECK_BE-LABEL: bitcast_nxv4i16_to_nxv4bf16:
1967 ; CHECK_BE:       // %bb.0:
1968 ; CHECK_BE-NEXT:    ptrue p0.s
1969 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
1970 ; CHECK_BE-NEXT:    ptrue p0.h
1971 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
1972 ; CHECK_BE-NEXT:    ret
1973   %bc = bitcast <vscale x 4 x i16> %v to <vscale x 4 x bfloat>
1974   ret <vscale x 4 x bfloat> %bc
1977 define <vscale x 4 x bfloat> @bitcast_nxv2i32_to_nxv4bf16(<vscale x 2 x i32> %v) #0 {
1978 ; CHECK-LABEL: bitcast_nxv2i32_to_nxv4bf16:
1979 ; CHECK:       // %bb.0:
1980 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1981 ; CHECK-NEXT:    addvl sp, sp, #-1
1982 ; CHECK-NEXT:    ptrue p0.d
1983 ; CHECK-NEXT:    ptrue p1.s
1984 ; CHECK-NEXT:    st1w { z0.d }, p0, [sp, #1, mul vl]
1985 ; CHECK-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
1986 ; CHECK-NEXT:    addvl sp, sp, #1
1987 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
1988 ; CHECK-NEXT:    ret
1990 ; CHECK_BE-LABEL: bitcast_nxv2i32_to_nxv4bf16:
1991 ; CHECK_BE:       // %bb.0:
1992 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
1993 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
1994 ; CHECK_BE-NEXT:    ptrue p0.d
1995 ; CHECK_BE-NEXT:    ptrue p1.s
1996 ; CHECK_BE-NEXT:    st1w { z0.d }, p0, [sp, #1, mul vl]
1997 ; CHECK_BE-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
1998 ; CHECK_BE-NEXT:    addvl sp, sp, #1
1999 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
2000 ; CHECK_BE-NEXT:    ret
2001   %bc = bitcast <vscale x 2 x i32> %v to <vscale x 4 x bfloat>
2002   ret <vscale x 4 x bfloat> %bc
2005 define <vscale x 4 x bfloat> @bitcast_nxv1i64_to_nxv4bf16(<vscale x 1 x i64> %v) #0 {
2006 ; CHECK-LABEL: bitcast_nxv1i64_to_nxv4bf16:
2007 ; CHECK:       // %bb.0:
2008 ; CHECK-NEXT:    uunpklo z0.s, z0.h
2009 ; CHECK-NEXT:    ret
2011 ; CHECK_BE-LABEL: bitcast_nxv1i64_to_nxv4bf16:
2012 ; CHECK_BE:       // %bb.0:
2013 ; CHECK_BE-NEXT:    ptrue p0.d
2014 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
2015 ; CHECK_BE-NEXT:    ptrue p0.h
2016 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
2017 ; CHECK_BE-NEXT:    uunpklo z0.s, z0.h
2018 ; CHECK_BE-NEXT:    ret
2019   %bc = bitcast <vscale x 1 x i64> %v to <vscale x 4 x bfloat>
2020   ret <vscale x 4 x bfloat> %bc
2023 define <vscale x 4 x bfloat> @bitcast_nxv4f16_to_nxv4bf16(<vscale x 4 x half> %v) #0 {
2024 ; CHECK-LABEL: bitcast_nxv4f16_to_nxv4bf16:
2025 ; CHECK:       // %bb.0:
2026 ; CHECK-NEXT:    ret
2028 ; CHECK_BE-LABEL: bitcast_nxv4f16_to_nxv4bf16:
2029 ; CHECK_BE:       // %bb.0:
2030 ; CHECK_BE-NEXT:    ret
2031   %bc = bitcast <vscale x 4 x half> %v to <vscale x 4 x bfloat>
2032   ret <vscale x 4 x bfloat> %bc
2035 define <vscale x 4 x bfloat> @bitcast_nxv2f32_to_nxv4bf16(<vscale x 2 x float> %v) #0 {
2036 ; CHECK-LABEL: bitcast_nxv2f32_to_nxv4bf16:
2037 ; CHECK:       // %bb.0:
2038 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
2039 ; CHECK-NEXT:    addvl sp, sp, #-1
2040 ; CHECK-NEXT:    ptrue p0.d
2041 ; CHECK-NEXT:    ptrue p1.s
2042 ; CHECK-NEXT:    st1w { z0.d }, p0, [sp, #1, mul vl]
2043 ; CHECK-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
2044 ; CHECK-NEXT:    addvl sp, sp, #1
2045 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
2046 ; CHECK-NEXT:    ret
2048 ; CHECK_BE-LABEL: bitcast_nxv2f32_to_nxv4bf16:
2049 ; CHECK_BE:       // %bb.0:
2050 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
2051 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
2052 ; CHECK_BE-NEXT:    ptrue p0.d
2053 ; CHECK_BE-NEXT:    ptrue p1.s
2054 ; CHECK_BE-NEXT:    st1w { z0.d }, p0, [sp, #1, mul vl]
2055 ; CHECK_BE-NEXT:    ld1h { z0.s }, p1/z, [sp, #1, mul vl]
2056 ; CHECK_BE-NEXT:    addvl sp, sp, #1
2057 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
2058 ; CHECK_BE-NEXT:    ret
2059   %bc = bitcast <vscale x 2 x float> %v to <vscale x 4 x bfloat>
2060   ret <vscale x 4 x bfloat> %bc
2063 define <vscale x 4 x bfloat> @bitcast_nxv1f64_to_nxv4bf16(<vscale x 1 x double> %v) #0 {
2064 ; CHECK-LABEL: bitcast_nxv1f64_to_nxv4bf16:
2065 ; CHECK:       // %bb.0:
2066 ; CHECK-NEXT:    uunpklo z0.s, z0.h
2067 ; CHECK-NEXT:    ret
2069 ; CHECK_BE-LABEL: bitcast_nxv1f64_to_nxv4bf16:
2070 ; CHECK_BE:       // %bb.0:
2071 ; CHECK_BE-NEXT:    ptrue p0.d
2072 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
2073 ; CHECK_BE-NEXT:    ptrue p0.h
2074 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
2075 ; CHECK_BE-NEXT:    uunpklo z0.s, z0.h
2076 ; CHECK_BE-NEXT:    ret
2077   %bc = bitcast <vscale x 1 x double> %v to <vscale x 4 x bfloat>
2078   ret <vscale x 4 x bfloat> %bc
2082 ; bitcast to nxv4i8
2085 define <vscale x 4 x i8> @bitcast_nxv2i16_to_nxv4i8(<vscale x 2 x i16> %v) #0 {
2086 ; CHECK-LABEL: bitcast_nxv2i16_to_nxv4i8:
2087 ; CHECK:       // %bb.0:
2088 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
2089 ; CHECK-NEXT:    addvl sp, sp, #-1
2090 ; CHECK-NEXT:    ptrue p0.d
2091 ; CHECK-NEXT:    ptrue p1.s
2092 ; CHECK-NEXT:    st1h { z0.d }, p0, [sp, #3, mul vl]
2093 ; CHECK-NEXT:    ld1b { z0.s }, p1/z, [sp, #3, mul vl]
2094 ; CHECK-NEXT:    addvl sp, sp, #1
2095 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
2096 ; CHECK-NEXT:    ret
2098 ; CHECK_BE-LABEL: bitcast_nxv2i16_to_nxv4i8:
2099 ; CHECK_BE:       // %bb.0:
2100 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
2101 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
2102 ; CHECK_BE-NEXT:    ptrue p0.d
2103 ; CHECK_BE-NEXT:    ptrue p1.s
2104 ; CHECK_BE-NEXT:    st1h { z0.d }, p0, [sp, #3, mul vl]
2105 ; CHECK_BE-NEXT:    ld1b { z0.s }, p1/z, [sp, #3, mul vl]
2106 ; CHECK_BE-NEXT:    addvl sp, sp, #1
2107 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
2108 ; CHECK_BE-NEXT:    ret
2109   %bc = bitcast <vscale x 2 x i16> %v to <vscale x 4 x i8>
2110   ret <vscale x 4 x i8> %bc
2113 define <vscale x 4 x i8> @bitcast_nxv1i32_to_nxv4i8(<vscale x 1 x i32> %v) #0 {
2114 ; CHECK-LABEL: bitcast_nxv1i32_to_nxv4i8:
2115 ; CHECK:       // %bb.0:
2116 ; CHECK-NEXT:    uunpklo z0.h, z0.b
2117 ; CHECK-NEXT:    uunpklo z0.s, z0.h
2118 ; CHECK-NEXT:    ret
2120 ; CHECK_BE-LABEL: bitcast_nxv1i32_to_nxv4i8:
2121 ; CHECK_BE:       // %bb.0:
2122 ; CHECK_BE-NEXT:    ptrue p0.s
2123 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
2124 ; CHECK_BE-NEXT:    uunpklo z0.h, z0.b
2125 ; CHECK_BE-NEXT:    uunpklo z0.s, z0.h
2126 ; CHECK_BE-NEXT:    ret
2127   %bc = bitcast <vscale x 1 x i32> %v to <vscale x 4 x i8>
2128   ret <vscale x 4 x i8> %bc
2131 define <vscale x 4 x i8> @bitcast_nxv2f16_to_nxv4i8(<vscale x 2 x half> %v) #0 {
2132 ; CHECK-LABEL: bitcast_nxv2f16_to_nxv4i8:
2133 ; CHECK:       // %bb.0:
2134 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
2135 ; CHECK-NEXT:    addvl sp, sp, #-1
2136 ; CHECK-NEXT:    ptrue p0.d
2137 ; CHECK-NEXT:    ptrue p1.s
2138 ; CHECK-NEXT:    st1h { z0.d }, p0, [sp, #3, mul vl]
2139 ; CHECK-NEXT:    ld1b { z0.s }, p1/z, [sp, #3, mul vl]
2140 ; CHECK-NEXT:    addvl sp, sp, #1
2141 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
2142 ; CHECK-NEXT:    ret
2144 ; CHECK_BE-LABEL: bitcast_nxv2f16_to_nxv4i8:
2145 ; CHECK_BE:       // %bb.0:
2146 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
2147 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
2148 ; CHECK_BE-NEXT:    ptrue p0.d
2149 ; CHECK_BE-NEXT:    ptrue p1.s
2150 ; CHECK_BE-NEXT:    st1h { z0.d }, p0, [sp, #3, mul vl]
2151 ; CHECK_BE-NEXT:    ld1b { z0.s }, p1/z, [sp, #3, mul vl]
2152 ; CHECK_BE-NEXT:    addvl sp, sp, #1
2153 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
2154 ; CHECK_BE-NEXT:    ret
2155   %bc = bitcast <vscale x 2 x half> %v to <vscale x 4 x i8>
2156   ret <vscale x 4 x i8> %bc
2159 ; @bitcast_nxv1f32_to_nxv4i8 is missing
2161 define <vscale x 4 x i8> @bitcast_nxv2bf16_to_nxv4i8(<vscale x 2 x bfloat> %v) #0 {
2162 ; CHECK-LABEL: bitcast_nxv2bf16_to_nxv4i8:
2163 ; CHECK:       // %bb.0:
2164 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
2165 ; CHECK-NEXT:    addvl sp, sp, #-1
2166 ; CHECK-NEXT:    ptrue p0.d
2167 ; CHECK-NEXT:    ptrue p1.s
2168 ; CHECK-NEXT:    st1h { z0.d }, p0, [sp, #3, mul vl]
2169 ; CHECK-NEXT:    ld1b { z0.s }, p1/z, [sp, #3, mul vl]
2170 ; CHECK-NEXT:    addvl sp, sp, #1
2171 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
2172 ; CHECK-NEXT:    ret
2174 ; CHECK_BE-LABEL: bitcast_nxv2bf16_to_nxv4i8:
2175 ; CHECK_BE:       // %bb.0:
2176 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
2177 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
2178 ; CHECK_BE-NEXT:    ptrue p0.d
2179 ; CHECK_BE-NEXT:    ptrue p1.s
2180 ; CHECK_BE-NEXT:    st1h { z0.d }, p0, [sp, #3, mul vl]
2181 ; CHECK_BE-NEXT:    ld1b { z0.s }, p1/z, [sp, #3, mul vl]
2182 ; CHECK_BE-NEXT:    addvl sp, sp, #1
2183 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
2184 ; CHECK_BE-NEXT:    ret
2185   %bc = bitcast <vscale x 2 x bfloat> %v to <vscale x 4 x i8>
2186   ret <vscale x 4 x i8> %bc
2190 ; bitcast to nxv2i16
2193 define <vscale x 2 x i16> @bitcast_nxv4i8_to_nxv2i16(<vscale x 4 x i8> %v) #0 {
2194 ; CHECK-LABEL: bitcast_nxv4i8_to_nxv2i16:
2195 ; CHECK:       // %bb.0:
2196 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
2197 ; CHECK-NEXT:    addvl sp, sp, #-1
2198 ; CHECK-NEXT:    ptrue p0.s
2199 ; CHECK-NEXT:    ptrue p1.d
2200 ; CHECK-NEXT:    st1b { z0.s }, p0, [sp, #3, mul vl]
2201 ; CHECK-NEXT:    ld1h { z0.d }, p1/z, [sp, #3, mul vl]
2202 ; CHECK-NEXT:    addvl sp, sp, #1
2203 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
2204 ; CHECK-NEXT:    ret
2206 ; CHECK_BE-LABEL: bitcast_nxv4i8_to_nxv2i16:
2207 ; CHECK_BE:       // %bb.0:
2208 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
2209 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
2210 ; CHECK_BE-NEXT:    ptrue p0.s
2211 ; CHECK_BE-NEXT:    ptrue p1.d
2212 ; CHECK_BE-NEXT:    st1b { z0.s }, p0, [sp, #3, mul vl]
2213 ; CHECK_BE-NEXT:    ld1h { z0.d }, p1/z, [sp, #3, mul vl]
2214 ; CHECK_BE-NEXT:    addvl sp, sp, #1
2215 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
2216 ; CHECK_BE-NEXT:    ret
2217   %bc = bitcast <vscale x 4 x i8> %v to <vscale x 2 x i16>
2218   ret <vscale x 2 x i16> %bc
2221 define <vscale x 2 x i16> @bitcast_nxv1i32_to_nxv2i16(<vscale x 1 x i32> %v) #0 {
2222 ; CHECK-LABEL: bitcast_nxv1i32_to_nxv2i16:
2223 ; CHECK:       // %bb.0:
2224 ; CHECK-NEXT:    uunpklo z0.s, z0.h
2225 ; CHECK-NEXT:    uunpklo z0.d, z0.s
2226 ; CHECK-NEXT:    ret
2228 ; CHECK_BE-LABEL: bitcast_nxv1i32_to_nxv2i16:
2229 ; CHECK_BE:       // %bb.0:
2230 ; CHECK_BE-NEXT:    ptrue p0.s
2231 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
2232 ; CHECK_BE-NEXT:    ptrue p0.h
2233 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
2234 ; CHECK_BE-NEXT:    uunpklo z0.s, z0.h
2235 ; CHECK_BE-NEXT:    uunpklo z0.d, z0.s
2236 ; CHECK_BE-NEXT:    ret
2237   %bc = bitcast <vscale x 1 x i32> %v to <vscale x 2 x i16>
2238   ret <vscale x 2 x i16> %bc
2241 define <vscale x 2 x i16> @bitcast_nxv2f16_to_nxv2i16(<vscale x 2 x half> %v) #0 {
2242 ; CHECK-LABEL: bitcast_nxv2f16_to_nxv2i16:
2243 ; CHECK:       // %bb.0:
2244 ; CHECK-NEXT:    ret
2246 ; CHECK_BE-LABEL: bitcast_nxv2f16_to_nxv2i16:
2247 ; CHECK_BE:       // %bb.0:
2248 ; CHECK_BE-NEXT:    ptrue p0.h
2249 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
2250 ; CHECK_BE-NEXT:    ptrue p0.d
2251 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
2252 ; CHECK_BE-NEXT:    ret
2253   %bc = bitcast <vscale x 2 x half> %v to <vscale x 2 x i16>
2254   ret <vscale x 2 x i16> %bc
2257 ; @bitcast_nxv1f32_to_nxv2i16 is missing
2259 define <vscale x 2 x i16> @bitcast_nxv2bf16_to_nxv2i16(<vscale x 2 x bfloat> %v) #0 {
2260 ; CHECK-LABEL: bitcast_nxv2bf16_to_nxv2i16:
2261 ; CHECK:       // %bb.0:
2262 ; CHECK-NEXT:    ret
2264 ; CHECK_BE-LABEL: bitcast_nxv2bf16_to_nxv2i16:
2265 ; CHECK_BE:       // %bb.0:
2266 ; CHECK_BE-NEXT:    ptrue p0.h
2267 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
2268 ; CHECK_BE-NEXT:    ptrue p0.d
2269 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
2270 ; CHECK_BE-NEXT:    ret
2271   %bc = bitcast <vscale x 2 x bfloat> %v to <vscale x 2 x i16>
2272   ret <vscale x 2 x i16> %bc
2276 ; bitcast to nxv1i32
2279 define <vscale x 1 x i32> @bitcast_nxv4i8_to_nxv1i32(<vscale x 4 x i8> %v) #0 {
2280 ; CHECK-LABEL: bitcast_nxv4i8_to_nxv1i32:
2281 ; CHECK:       // %bb.0:
2282 ; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
2283 ; CHECK-NEXT:    uzp1 z0.b, z0.b, z0.b
2284 ; CHECK-NEXT:    ret
2286 ; CHECK_BE-LABEL: bitcast_nxv4i8_to_nxv1i32:
2287 ; CHECK_BE:       // %bb.0:
2288 ; CHECK_BE-NEXT:    uzp1 z0.h, z0.h, z0.h
2289 ; CHECK_BE-NEXT:    ptrue p0.s
2290 ; CHECK_BE-NEXT:    uzp1 z0.b, z0.b, z0.b
2291 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
2292 ; CHECK_BE-NEXT:    ret
2293   %bc = bitcast <vscale x 4 x i8> %v to <vscale x 1 x i32>
2294   ret <vscale x 1 x i32> %bc
2297 define <vscale x 1 x i32> @bitcast_nxv2i16_to_nxv1i32(<vscale x 2 x i16> %v) #0 {
2298 ; CHECK-LABEL: bitcast_nxv2i16_to_nxv1i32:
2299 ; CHECK:       // %bb.0:
2300 ; CHECK-NEXT:    uzp1 z0.s, z0.s, z0.s
2301 ; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
2302 ; CHECK-NEXT:    ret
2304 ; CHECK_BE-LABEL: bitcast_nxv2i16_to_nxv1i32:
2305 ; CHECK_BE:       // %bb.0:
2306 ; CHECK_BE-NEXT:    uzp1 z0.s, z0.s, z0.s
2307 ; CHECK_BE-NEXT:    ptrue p0.h
2308 ; CHECK_BE-NEXT:    uzp1 z0.h, z0.h, z0.h
2309 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
2310 ; CHECK_BE-NEXT:    ptrue p0.s
2311 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
2312 ; CHECK_BE-NEXT:    ret
2313   %bc = bitcast <vscale x 2 x i16> %v to <vscale x 1 x i32>
2314   ret <vscale x 1 x i32> %bc
2317 define <vscale x 1 x i32> @bitcast_nxv2f16_to_nxv1i32(<vscale x 2 x half> %v) #0 {
2318 ; CHECK-LABEL: bitcast_nxv2f16_to_nxv1i32:
2319 ; CHECK:       // %bb.0:
2320 ; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
2321 ; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
2322 ; CHECK-NEXT:    ret
2324 ; CHECK_BE-LABEL: bitcast_nxv2f16_to_nxv1i32:
2325 ; CHECK_BE:       // %bb.0:
2326 ; CHECK_BE-NEXT:    uzp1 z0.h, z0.h, z0.h
2327 ; CHECK_BE-NEXT:    ptrue p0.h
2328 ; CHECK_BE-NEXT:    uzp1 z0.h, z0.h, z0.h
2329 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
2330 ; CHECK_BE-NEXT:    ptrue p0.s
2331 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
2332 ; CHECK_BE-NEXT:    ret
2333   %bc = bitcast <vscale x 2 x half> %v to <vscale x 1 x i32>
2334   ret <vscale x 1 x i32> %bc
2337 ; @bitcast_nxv1f32_to_nxv1i32 is missing
2339 define <vscale x 1 x i32> @bitcast_nxv2bf16_to_nxv1i32(<vscale x 2 x bfloat> %v) #0 {
2340 ; CHECK-LABEL: bitcast_nxv2bf16_to_nxv1i32:
2341 ; CHECK:       // %bb.0:
2342 ; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
2343 ; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
2344 ; CHECK-NEXT:    ret
2346 ; CHECK_BE-LABEL: bitcast_nxv2bf16_to_nxv1i32:
2347 ; CHECK_BE:       // %bb.0:
2348 ; CHECK_BE-NEXT:    uzp1 z0.h, z0.h, z0.h
2349 ; CHECK_BE-NEXT:    ptrue p0.h
2350 ; CHECK_BE-NEXT:    uzp1 z0.h, z0.h, z0.h
2351 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
2352 ; CHECK_BE-NEXT:    ptrue p0.s
2353 ; CHECK_BE-NEXT:    revb z0.s, p0/m, z0.s
2354 ; CHECK_BE-NEXT:    ret
2355   %bc = bitcast <vscale x 2 x bfloat> %v to <vscale x 1 x i32>
2356   ret <vscale x 1 x i32> %bc
2360 ; bitcast to nxv2f16
2363 define <vscale x 2 x half> @bitcast_nxv4i8_to_nxv2f16(<vscale x 4 x i8> %v) #0 {
2364 ; CHECK-LABEL: bitcast_nxv4i8_to_nxv2f16:
2365 ; CHECK:       // %bb.0:
2366 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
2367 ; CHECK-NEXT:    addvl sp, sp, #-1
2368 ; CHECK-NEXT:    ptrue p0.s
2369 ; CHECK-NEXT:    ptrue p1.d
2370 ; CHECK-NEXT:    st1b { z0.s }, p0, [sp, #3, mul vl]
2371 ; CHECK-NEXT:    ld1h { z0.d }, p1/z, [sp, #3, mul vl]
2372 ; CHECK-NEXT:    addvl sp, sp, #1
2373 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
2374 ; CHECK-NEXT:    ret
2376 ; CHECK_BE-LABEL: bitcast_nxv4i8_to_nxv2f16:
2377 ; CHECK_BE:       // %bb.0:
2378 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
2379 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
2380 ; CHECK_BE-NEXT:    ptrue p0.s
2381 ; CHECK_BE-NEXT:    ptrue p1.d
2382 ; CHECK_BE-NEXT:    st1b { z0.s }, p0, [sp, #3, mul vl]
2383 ; CHECK_BE-NEXT:    ld1h { z0.d }, p1/z, [sp, #3, mul vl]
2384 ; CHECK_BE-NEXT:    addvl sp, sp, #1
2385 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
2386 ; CHECK_BE-NEXT:    ret
2387   %bc = bitcast <vscale x 4 x i8> %v to <vscale x 2 x half>
2388   ret <vscale x 2 x half> %bc
2391 define <vscale x 2 x half> @bitcast_nxv2i16_to_nxv2f16(<vscale x 2 x i16> %v) #0 {
2392 ; CHECK-LABEL: bitcast_nxv2i16_to_nxv2f16:
2393 ; CHECK:       // %bb.0:
2394 ; CHECK-NEXT:    ret
2396 ; CHECK_BE-LABEL: bitcast_nxv2i16_to_nxv2f16:
2397 ; CHECK_BE:       // %bb.0:
2398 ; CHECK_BE-NEXT:    ptrue p0.d
2399 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
2400 ; CHECK_BE-NEXT:    ptrue p0.h
2401 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
2402 ; CHECK_BE-NEXT:    ret
2403   %bc = bitcast <vscale x 2 x i16> %v to <vscale x 2 x half>
2404   ret <vscale x 2 x half> %bc
2407 ; @bitcast_nxv1i32_to_nxv2f16 is missing
2408 ; @bitcast_nxv1f32_to_nxv2f16 is missing
2410 define <vscale x 2 x half> @bitcast_nxv2bf16_to_nxv2f16(<vscale x 2 x bfloat> %v) #0 {
2411 ; CHECK-LABEL: bitcast_nxv2bf16_to_nxv2f16:
2412 ; CHECK:       // %bb.0:
2413 ; CHECK-NEXT:    ret
2415 ; CHECK_BE-LABEL: bitcast_nxv2bf16_to_nxv2f16:
2416 ; CHECK_BE:       // %bb.0:
2417 ; CHECK_BE-NEXT:    ret
2418   %bc = bitcast <vscale x 2 x bfloat> %v to <vscale x 2 x half>
2419   ret <vscale x 2 x half> %bc
2423 ; bitcast to nxv1f32
2426 ; @bitcast_nxv4i8_to_nxv1f32 is missing
2427 ; @bitcast_nxv2i16_to_nxv1f32 is missing
2428 ; @bitcast_nxv1i32_to_nxv1f32 is missing
2429 ; @bitcast_nxv2f16_to_nxv1f32 is missing
2430 ; @bitcast_nxv2bf16_to_nxv1f32 is missing
2433 ; bitcast to nxv2bf16
2436 define <vscale x 2 x bfloat> @bitcast_nxv4i8_to_nxv2bf16(<vscale x 4 x i8> %v) #0 {
2437 ; CHECK-LABEL: bitcast_nxv4i8_to_nxv2bf16:
2438 ; CHECK:       // %bb.0:
2439 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
2440 ; CHECK-NEXT:    addvl sp, sp, #-1
2441 ; CHECK-NEXT:    ptrue p0.s
2442 ; CHECK-NEXT:    ptrue p1.d
2443 ; CHECK-NEXT:    st1b { z0.s }, p0, [sp, #3, mul vl]
2444 ; CHECK-NEXT:    ld1h { z0.d }, p1/z, [sp, #3, mul vl]
2445 ; CHECK-NEXT:    addvl sp, sp, #1
2446 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
2447 ; CHECK-NEXT:    ret
2449 ; CHECK_BE-LABEL: bitcast_nxv4i8_to_nxv2bf16:
2450 ; CHECK_BE:       // %bb.0:
2451 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
2452 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
2453 ; CHECK_BE-NEXT:    ptrue p0.s
2454 ; CHECK_BE-NEXT:    ptrue p1.d
2455 ; CHECK_BE-NEXT:    st1b { z0.s }, p0, [sp, #3, mul vl]
2456 ; CHECK_BE-NEXT:    ld1h { z0.d }, p1/z, [sp, #3, mul vl]
2457 ; CHECK_BE-NEXT:    addvl sp, sp, #1
2458 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
2459 ; CHECK_BE-NEXT:    ret
2460   %bc = bitcast <vscale x 4 x i8> %v to <vscale x 2 x bfloat>
2461   ret <vscale x 2 x bfloat> %bc
2464 define <vscale x 2 x bfloat> @bitcast_nxv2i16_to_nxv2bf16(<vscale x 2 x i16> %v) #0 {
2465 ; CHECK-LABEL: bitcast_nxv2i16_to_nxv2bf16:
2466 ; CHECK:       // %bb.0:
2467 ; CHECK-NEXT:    ret
2469 ; CHECK_BE-LABEL: bitcast_nxv2i16_to_nxv2bf16:
2470 ; CHECK_BE:       // %bb.0:
2471 ; CHECK_BE-NEXT:    ptrue p0.d
2472 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
2473 ; CHECK_BE-NEXT:    ptrue p0.h
2474 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
2475 ; CHECK_BE-NEXT:    ret
2476   %bc = bitcast <vscale x 2 x i16> %v to <vscale x 2 x bfloat>
2477   ret <vscale x 2 x bfloat> %bc
2480 ; @bitcast_nxv1i32_to_nxv2bf16 is missing
2482 define <vscale x 2 x bfloat> @bitcast_nxv2f16_to_nxv2bf16(<vscale x 2 x half> %v) #0 {
2483 ; CHECK-LABEL: bitcast_nxv2f16_to_nxv2bf16:
2484 ; CHECK:       // %bb.0:
2485 ; CHECK-NEXT:    ret
2487 ; CHECK_BE-LABEL: bitcast_nxv2f16_to_nxv2bf16:
2488 ; CHECK_BE:       // %bb.0:
2489 ; CHECK_BE-NEXT:    ret
2490   %bc = bitcast <vscale x 2 x half> %v to <vscale x 2 x bfloat>
2491   ret <vscale x 2 x bfloat> %bc
2494 ; @bitcast_nxv1f32_to_nxv2bf16 is missing
2497 ; bitcast to nxv2i8
2500 define <vscale x 2 x i8> @bitcast_nxv1i16_to_nxv2i8(<vscale x 1 x i16> %v) #0 {
2501 ; CHECK-LABEL: bitcast_nxv1i16_to_nxv2i8:
2502 ; CHECK:       // %bb.0:
2503 ; CHECK-NEXT:    uunpklo z0.h, z0.b
2504 ; CHECK-NEXT:    uunpklo z0.s, z0.h
2505 ; CHECK-NEXT:    uunpklo z0.d, z0.s
2506 ; CHECK-NEXT:    ret
2508 ; CHECK_BE-LABEL: bitcast_nxv1i16_to_nxv2i8:
2509 ; CHECK_BE:       // %bb.0:
2510 ; CHECK_BE-NEXT:    ptrue p0.h
2511 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
2512 ; CHECK_BE-NEXT:    uunpklo z0.h, z0.b
2513 ; CHECK_BE-NEXT:    uunpklo z0.s, z0.h
2514 ; CHECK_BE-NEXT:    uunpklo z0.d, z0.s
2515 ; CHECK_BE-NEXT:    ret
2516   %bc = bitcast <vscale x 1 x i16> %v to <vscale x 2 x i8>
2517   ret <vscale x 2 x i8> %bc
2520 ; @bitcast_nxv1f16_to_nxv2i8 is missing
2521 ; @bitcast_nxv1bf16_to_nxv2i8 is missing
2524 ; bitcast to nxv1i16
2527 define <vscale x 1 x i16> @bitcast_nxv2i8_to_nxv1i16(<vscale x 2 x i8> %v) #0 {
2528 ; CHECK-LABEL: bitcast_nxv2i8_to_nxv1i16:
2529 ; CHECK:       // %bb.0:
2530 ; CHECK-NEXT:    uzp1 z0.s, z0.s, z0.s
2531 ; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
2532 ; CHECK-NEXT:    uzp1 z0.b, z0.b, z0.b
2533 ; CHECK-NEXT:    ret
2535 ; CHECK_BE-LABEL: bitcast_nxv2i8_to_nxv1i16:
2536 ; CHECK_BE:       // %bb.0:
2537 ; CHECK_BE-NEXT:    uzp1 z0.s, z0.s, z0.s
2538 ; CHECK_BE-NEXT:    ptrue p0.h
2539 ; CHECK_BE-NEXT:    uzp1 z0.h, z0.h, z0.h
2540 ; CHECK_BE-NEXT:    uzp1 z0.b, z0.b, z0.b
2541 ; CHECK_BE-NEXT:    revb z0.h, p0/m, z0.h
2542 ; CHECK_BE-NEXT:    ret
2543   %bc = bitcast <vscale x 2 x i8> %v to <vscale x 1 x i16>
2544   ret <vscale x 1 x i16> %bc
2547 ; @bitcast_nxv1f16_to_nxv1i16 is missing
2548 ; @bitcast_nxv1bf16_to_nxv1i16 is missing
2551 ; bitcast to nxv1f16
2554 ; @bitcast_nxv2i8_to_nxv1f16 is missing
2555 ; @bitcast_nxv1i16_to_nxv1f16 is missing
2556 ; @bitcast_nxv1bf16_to_nxv1f16 is missing
2559 ; bitcast to nxv1bf16
2562 ; @bitcast_nxv2i8_to_nxv1bf16 is missing
2563 ; @bitcast_nxv1i16_to_nxv1bf16 is missing
2564 ; @bitcast_nxv1f16_to_nxv1bf16 is missing
2567 ; Other
2570 define <vscale x 2 x i32> @bitcast_short_float_to_i32(<vscale x 2 x double> %v) #0 {
2571 ; CHECK-LABEL: bitcast_short_float_to_i32:
2572 ; CHECK:       // %bb.0:
2573 ; CHECK-NEXT:    ptrue p0.d
2574 ; CHECK-NEXT:    fcvt z0.s, p0/m, z0.d
2575 ; CHECK-NEXT:    ret
2577 ; CHECK_BE-LABEL: bitcast_short_float_to_i32:
2578 ; CHECK_BE:       // %bb.0:
2579 ; CHECK_BE-NEXT:    ptrue p0.d
2580 ; CHECK_BE-NEXT:    ptrue p1.s
2581 ; CHECK_BE-NEXT:    fcvt z0.s, p0/m, z0.d
2582 ; CHECK_BE-NEXT:    revb z0.s, p1/m, z0.s
2583 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
2584 ; CHECK_BE-NEXT:    ret
2585   %trunc = fptrunc <vscale x 2 x double> %v to <vscale x 2 x float>
2586   %bitcast = bitcast <vscale x 2 x float> %trunc to <vscale x 2 x i32>
2587   ret <vscale x 2 x i32> %bitcast
2590 define <vscale x 2 x double> @bitcast_short_i32_to_float(<vscale x 2 x i64> %v) #0 {
2591 ; CHECK-LABEL: bitcast_short_i32_to_float:
2592 ; CHECK:       // %bb.0:
2593 ; CHECK-NEXT:    ptrue p0.d
2594 ; CHECK-NEXT:    fcvt z0.d, p0/m, z0.s
2595 ; CHECK-NEXT:    ret
2597 ; CHECK_BE-LABEL: bitcast_short_i32_to_float:
2598 ; CHECK_BE:       // %bb.0:
2599 ; CHECK_BE-NEXT:    ptrue p0.d
2600 ; CHECK_BE-NEXT:    ptrue p1.s
2601 ; CHECK_BE-NEXT:    revb z0.d, p0/m, z0.d
2602 ; CHECK_BE-NEXT:    revb z0.s, p1/m, z0.s
2603 ; CHECK_BE-NEXT:    fcvt z0.d, p0/m, z0.s
2604 ; CHECK_BE-NEXT:    ret
2605   %trunc = trunc <vscale x 2 x i64> %v to <vscale x 2 x i32>
2606   %bitcast = bitcast <vscale x 2 x i32> %trunc to <vscale x 2 x float>
2607   %extended = fpext <vscale x 2 x float> %bitcast to <vscale x 2 x double>
2608   ret <vscale x 2 x double> %extended
2611 define <vscale x 2 x float> @bitcast_short_half_to_float(<vscale x 4 x half> %v) #0 {
2612 ; CHECK-LABEL: bitcast_short_half_to_float:
2613 ; CHECK:       // %bb.0:
2614 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
2615 ; CHECK-NEXT:    addvl sp, sp, #-1
2616 ; CHECK-NEXT:    ptrue p0.s
2617 ; CHECK-NEXT:    ptrue p1.d
2618 ; CHECK-NEXT:    fadd z0.h, p0/m, z0.h, z0.h
2619 ; CHECK-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
2620 ; CHECK-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
2621 ; CHECK-NEXT:    addvl sp, sp, #1
2622 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
2623 ; CHECK-NEXT:    ret
2625 ; CHECK_BE-LABEL: bitcast_short_half_to_float:
2626 ; CHECK_BE:       // %bb.0:
2627 ; CHECK_BE-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
2628 ; CHECK_BE-NEXT:    addvl sp, sp, #-1
2629 ; CHECK_BE-NEXT:    ptrue p0.s
2630 ; CHECK_BE-NEXT:    ptrue p1.d
2631 ; CHECK_BE-NEXT:    fadd z0.h, p0/m, z0.h, z0.h
2632 ; CHECK_BE-NEXT:    st1h { z0.s }, p0, [sp, #1, mul vl]
2633 ; CHECK_BE-NEXT:    ld1w { z0.d }, p1/z, [sp, #1, mul vl]
2634 ; CHECK_BE-NEXT:    addvl sp, sp, #1
2635 ; CHECK_BE-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
2636 ; CHECK_BE-NEXT:    ret
2637   %add = fadd <vscale x 4 x half> %v, %v
2638   %bitcast = bitcast <vscale x 4 x half> %add to <vscale x 2 x float>
2639   ret <vscale x 2 x float> %bitcast
2642 ; +bf16 is required for the bfloat version.
2643 attributes #0 = { nounwind "target-features"="+sve,+bf16" }