[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-bitcast.ll
blobbab42f3899170777a6c331d5c367558449adef55
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s
3 ; RUN: not --crash llc -mtriple=aarch64_be -mattr=+sve < %s
5 define <vscale x 16 x i8> @bitcast_i16_to_i8(<vscale x 8 x i16> %v) {
6 ; CHECK-LABEL: bitcast_i16_to_i8:
7 ; CHECK:       // %bb.0:
8 ; CHECK-NEXT:    ret
9   %bc = bitcast <vscale x 8 x i16> %v to <vscale x 16 x i8>
10   ret <vscale x 16 x i8> %bc
13 define <vscale x 16 x i8> @bitcast_i32_to_i8(<vscale x 4 x i32> %v) {
14 ; CHECK-LABEL: bitcast_i32_to_i8:
15 ; CHECK:       // %bb.0:
16 ; CHECK-NEXT:    ret
17   %bc = bitcast <vscale x 4 x i32> %v to <vscale x 16 x i8>
18   ret <vscale x 16 x i8> %bc
21 define <vscale x 16 x i8> @bitcast_i64_to_i8(<vscale x 2 x i64> %v) {
22 ; CHECK-LABEL: bitcast_i64_to_i8:
23 ; CHECK:       // %bb.0:
24 ; CHECK-NEXT:    ret
25   %bc = bitcast <vscale x 2 x i64> %v to <vscale x 16 x i8>
26   ret <vscale x 16 x i8> %bc
29 define <vscale x 16 x i8> @bitcast_half_to_i8(<vscale x 8 x half> %v) {
30 ; CHECK-LABEL: bitcast_half_to_i8:
31 ; CHECK:       // %bb.0:
32 ; CHECK-NEXT:    ret
33   %bc = bitcast <vscale x 8 x half> %v to <vscale x 16 x i8>
34   ret <vscale x 16 x i8> %bc
37 define <vscale x 16 x i8> @bitcast_float_to_i8(<vscale x 4 x float> %v) {
38 ; CHECK-LABEL: bitcast_float_to_i8:
39 ; CHECK:       // %bb.0:
40 ; CHECK-NEXT:    ret
41   %bc = bitcast <vscale x 4 x float> %v to <vscale x 16 x i8>
42   ret <vscale x 16 x i8> %bc
45 define <vscale x 16 x i8> @bitcast_double_to_i8(<vscale x 2 x double> %v) {
46 ; CHECK-LABEL: bitcast_double_to_i8:
47 ; CHECK:       // %bb.0:
48 ; CHECK-NEXT:    ret
49   %bc = bitcast <vscale x 2 x double> %v to <vscale x 16 x i8>
50   ret <vscale x 16 x i8> %bc
53 define <vscale x 8 x i16> @bitcast_i8_to_i16(<vscale x 16 x i8> %v) {
54 ; CHECK-LABEL: bitcast_i8_to_i16:
55 ; CHECK:       // %bb.0:
56 ; CHECK-NEXT:    ret
57   %bc = bitcast <vscale x 16 x i8> %v to <vscale x 8 x i16>
58   ret <vscale x 8 x i16> %bc
61 define <vscale x 8 x i16> @bitcast_i32_to_i16(<vscale x 4 x i32> %v) {
62 ; CHECK-LABEL: bitcast_i32_to_i16:
63 ; CHECK:       // %bb.0:
64 ; CHECK-NEXT:    ret
65   %bc = bitcast <vscale x 4 x i32> %v to <vscale x 8 x i16>
66   ret <vscale x 8 x i16> %bc
69 define <vscale x 8 x i16> @bitcast_i64_to_i16(<vscale x 2 x i64> %v) {
70 ; CHECK-LABEL: bitcast_i64_to_i16:
71 ; CHECK:       // %bb.0:
72 ; CHECK-NEXT:    ret
73   %bc = bitcast <vscale x 2 x i64> %v to <vscale x 8 x i16>
74   ret <vscale x 8 x i16> %bc
77 define <vscale x 8 x i16> @bitcast_half_to_i16(<vscale x 8 x half> %v) {
78 ; CHECK-LABEL: bitcast_half_to_i16:
79 ; CHECK:       // %bb.0:
80 ; CHECK-NEXT:    ret
81   %bc = bitcast <vscale x 8 x half> %v to <vscale x 8 x i16>
82   ret <vscale x 8 x i16> %bc
85 define <vscale x 8 x i16> @bitcast_float_to_i16(<vscale x 4 x float> %v) {
86 ; CHECK-LABEL: bitcast_float_to_i16:
87 ; CHECK:       // %bb.0:
88 ; CHECK-NEXT:    ret
89   %bc = bitcast <vscale x 4 x float> %v to <vscale x 8 x i16>
90   ret <vscale x 8 x i16> %bc
93 define <vscale x 8 x i16> @bitcast_double_to_i16(<vscale x 2 x double> %v) {
94 ; CHECK-LABEL: bitcast_double_to_i16:
95 ; CHECK:       // %bb.0:
96 ; CHECK-NEXT:    ret
97   %bc = bitcast <vscale x 2 x double> %v to <vscale x 8 x i16>
98   ret <vscale x 8 x i16> %bc
101 define <vscale x 4 x i32> @bitcast_i8_to_i32(<vscale x 16 x i8> %v) {
102 ; CHECK-LABEL: bitcast_i8_to_i32:
103 ; CHECK:       // %bb.0:
104 ; CHECK-NEXT:    ret
105   %bc = bitcast <vscale x 16 x i8> %v to <vscale x 4 x i32>
106   ret <vscale x 4 x i32> %bc
109 define <vscale x 4 x i32> @bitcast_i16_to_i32(<vscale x 8 x i16> %v) {
110 ; CHECK-LABEL: bitcast_i16_to_i32:
111 ; CHECK:       // %bb.0:
112 ; CHECK-NEXT:    ret
113   %bc = bitcast <vscale x 8 x i16> %v to <vscale x 4 x i32>
114   ret <vscale x 4 x i32> %bc
117 define <vscale x 4 x i32> @bitcast_i64_to_i32(<vscale x 2 x i64> %v) {
118 ; CHECK-LABEL: bitcast_i64_to_i32:
119 ; CHECK:       // %bb.0:
120 ; CHECK-NEXT:    ret
121   %bc = bitcast <vscale x 2 x i64> %v to <vscale x 4 x i32>
122   ret <vscale x 4 x i32> %bc
125 define <vscale x 4 x i32> @bitcast_half_to_i32(<vscale x 8 x half> %v) {
126 ; CHECK-LABEL: bitcast_half_to_i32:
127 ; CHECK:       // %bb.0:
128 ; CHECK-NEXT:    ret
129   %bc = bitcast <vscale x 8 x half> %v to <vscale x 4 x i32>
130   ret <vscale x 4 x i32> %bc
133 define <vscale x 4 x i32> @bitcast_float_to_i32(<vscale x 4 x float> %v) {
134 ; CHECK-LABEL: bitcast_float_to_i32:
135 ; CHECK:       // %bb.0:
136 ; CHECK-NEXT:    ret
137   %bc = bitcast <vscale x 4 x float> %v to <vscale x 4 x i32>
138   ret <vscale x 4 x i32> %bc
141 define <vscale x 4 x i32> @bitcast_double_to_i32(<vscale x 2 x double> %v) {
142 ; CHECK-LABEL: bitcast_double_to_i32:
143 ; CHECK:       // %bb.0:
144 ; CHECK-NEXT:    ret
145   %bc = bitcast <vscale x 2 x double> %v to <vscale x 4 x i32>
146   ret <vscale x 4 x i32> %bc
149 define <vscale x 2 x i64> @bitcast_i8_to_i64(<vscale x 16 x i8> %v) {
150 ; CHECK-LABEL: bitcast_i8_to_i64:
151 ; CHECK:       // %bb.0:
152 ; CHECK-NEXT:    ret
153   %bc = bitcast <vscale x 16 x i8> %v to <vscale x 2 x i64>
154   ret <vscale x 2 x i64> %bc
157 define <vscale x 2 x i64> @bitcast_i16_to_i64(<vscale x 8 x i16> %v) {
158 ; CHECK-LABEL: bitcast_i16_to_i64:
159 ; CHECK:       // %bb.0:
160 ; CHECK-NEXT:    ret
161   %bc = bitcast <vscale x 8 x i16> %v to <vscale x 2 x i64>
162   ret <vscale x 2 x i64> %bc
165 define <vscale x 2 x i64> @bitcast_i32_to_i64(<vscale x 4 x i32> %v) {
166 ; CHECK-LABEL: bitcast_i32_to_i64:
167 ; CHECK:       // %bb.0:
168 ; CHECK-NEXT:    ret
169   %bc = bitcast <vscale x 4 x i32> %v to <vscale x 2 x i64>
170   ret <vscale x 2 x i64> %bc
173 define <vscale x 2 x i64> @bitcast_half_to_i64(<vscale x 8 x half> %v) {
174 ; CHECK-LABEL: bitcast_half_to_i64:
175 ; CHECK:       // %bb.0:
176 ; CHECK-NEXT:    ret
177   %bc = bitcast <vscale x 8 x half> %v to <vscale x 2 x i64>
178   ret <vscale x 2 x i64> %bc
181 define <vscale x 2 x i64> @bitcast_float_to_i64(<vscale x 4 x float> %v) {
182 ; CHECK-LABEL: bitcast_float_to_i64:
183 ; CHECK:       // %bb.0:
184 ; CHECK-NEXT:    ret
185   %bc = bitcast <vscale x 4 x float> %v to <vscale x 2 x i64>
186   ret <vscale x 2 x i64> %bc
189 define <vscale x 2 x i64> @bitcast_double_to_i64(<vscale x 2 x double> %v) {
190 ; CHECK-LABEL: bitcast_double_to_i64:
191 ; CHECK:       // %bb.0:
192 ; CHECK-NEXT:    ret
193   %bc = bitcast <vscale x 2 x double> %v to <vscale x 2 x i64>
194   ret <vscale x 2 x i64> %bc
197 define <vscale x 8 x half> @bitcast_i8_to_half(<vscale x 16 x i8> %v) {
198 ; CHECK-LABEL: bitcast_i8_to_half:
199 ; CHECK:       // %bb.0:
200 ; CHECK-NEXT:    ret
201   %bc = bitcast <vscale x 16 x i8> %v to <vscale x 8 x half>
202   ret <vscale x 8 x half> %bc
205 define <vscale x 8 x half> @bitcast_i16_to_half(<vscale x 8 x i16> %v) {
206 ; CHECK-LABEL: bitcast_i16_to_half:
207 ; CHECK:       // %bb.0:
208 ; CHECK-NEXT:    ret
209   %bc = bitcast <vscale x 8 x i16> %v to <vscale x 8 x half>
210   ret <vscale x 8 x half> %bc
213 define <vscale x 8 x half> @bitcast_i32_to_half(<vscale x 4 x i32> %v) {
214 ; CHECK-LABEL: bitcast_i32_to_half:
215 ; CHECK:       // %bb.0:
216 ; CHECK-NEXT:    ret
217   %bc = bitcast <vscale x 4 x i32> %v to <vscale x 8 x half>
218   ret <vscale x 8 x half> %bc
221 define <vscale x 8 x half> @bitcast_i64_to_half(<vscale x 2 x i64> %v) {
222 ; CHECK-LABEL: bitcast_i64_to_half:
223 ; CHECK:       // %bb.0:
224 ; CHECK-NEXT:    ret
225   %bc = bitcast <vscale x 2 x i64> %v to <vscale x 8 x half>
226   ret <vscale x 8 x half> %bc
229 define <vscale x 8 x half> @bitcast_float_to_half(<vscale x 4 x float> %v) {
230 ; CHECK-LABEL: bitcast_float_to_half:
231 ; CHECK:       // %bb.0:
232 ; CHECK-NEXT:    ret
233   %bc = bitcast <vscale x 4 x float> %v to <vscale x 8 x half>
234   ret <vscale x 8 x half> %bc
237 define <vscale x 8 x half> @bitcast_double_to_half(<vscale x 2 x double> %v) {
238 ; CHECK-LABEL: bitcast_double_to_half:
239 ; CHECK:       // %bb.0:
240 ; CHECK-NEXT:    ret
241   %bc = bitcast <vscale x 2 x double> %v to <vscale x 8 x half>
242   ret <vscale x 8 x half> %bc
245 define <vscale x 4 x float> @bitcast_i8_to_float(<vscale x 16 x i8> %v) {
246 ; CHECK-LABEL: bitcast_i8_to_float:
247 ; CHECK:       // %bb.0:
248 ; CHECK-NEXT:    ret
249   %bc = bitcast <vscale x 16 x i8> %v to <vscale x 4 x float>
250   ret <vscale x 4 x float> %bc
253 define <vscale x 4 x float> @bitcast_i16_to_float(<vscale x 8 x i16> %v) {
254 ; CHECK-LABEL: bitcast_i16_to_float:
255 ; CHECK:       // %bb.0:
256 ; CHECK-NEXT:    ret
257   %bc = bitcast <vscale x 8 x i16> %v to <vscale x 4 x float>
258   ret <vscale x 4 x float> %bc
261 define <vscale x 4 x float> @bitcast_i32_to_float(<vscale x 4 x i32> %v) {
262 ; CHECK-LABEL: bitcast_i32_to_float:
263 ; CHECK:       // %bb.0:
264 ; CHECK-NEXT:    ret
265   %bc = bitcast <vscale x 4 x i32> %v to <vscale x 4 x float>
266   ret <vscale x 4 x float> %bc
269 define <vscale x 4 x float> @bitcast_i64_to_float(<vscale x 2 x i64> %v) {
270 ; CHECK-LABEL: bitcast_i64_to_float:
271 ; CHECK:       // %bb.0:
272 ; CHECK-NEXT:    ret
273   %bc = bitcast <vscale x 2 x i64> %v to <vscale x 4 x float>
274   ret <vscale x 4 x float> %bc
277 define <vscale x 4 x float> @bitcast_half_to_float(<vscale x 8 x half> %v) {
278 ; CHECK-LABEL: bitcast_half_to_float:
279 ; CHECK:       // %bb.0:
280 ; CHECK-NEXT:    ret
281   %bc = bitcast <vscale x 8 x half> %v to <vscale x 4 x float>
282   ret <vscale x 4 x float> %bc
285 define <vscale x 4 x float> @bitcast_double_to_float(<vscale x 2 x double> %v) {
286 ; CHECK-LABEL: bitcast_double_to_float:
287 ; CHECK:       // %bb.0:
288 ; CHECK-NEXT:    ret
289   %bc = bitcast <vscale x 2 x double> %v to <vscale x 4 x float>
290   ret <vscale x 4 x float> %bc
293 define <vscale x 2 x double> @bitcast_i8_to_double(<vscale x 16 x i8> %v) {
294 ; CHECK-LABEL: bitcast_i8_to_double:
295 ; CHECK:       // %bb.0:
296 ; CHECK-NEXT:    ret
297   %bc = bitcast <vscale x 16 x i8> %v to <vscale x 2 x double>
298   ret <vscale x 2 x double> %bc
301 define <vscale x 2 x double> @bitcast_i16_to_double(<vscale x 8 x i16> %v) {
302 ; CHECK-LABEL: bitcast_i16_to_double:
303 ; CHECK:       // %bb.0:
304 ; CHECK-NEXT:    ret
305   %bc = bitcast <vscale x 8 x i16> %v to <vscale x 2 x double>
306   ret <vscale x 2 x double> %bc
309 define <vscale x 2 x double> @bitcast_i32_to_double(<vscale x 4 x i32> %v) {
310 ; CHECK-LABEL: bitcast_i32_to_double:
311 ; CHECK:       // %bb.0:
312 ; CHECK-NEXT:    ret
313   %bc = bitcast <vscale x 4 x i32> %v to <vscale x 2 x double>
314   ret <vscale x 2 x double> %bc
317 define <vscale x 2 x double> @bitcast_i64_to_double(<vscale x 2 x i64> %v) {
318 ; CHECK-LABEL: bitcast_i64_to_double:
319 ; CHECK:       // %bb.0:
320 ; CHECK-NEXT:    ret
321   %bc = bitcast <vscale x 2 x i64> %v to <vscale x 2 x double>
322   ret <vscale x 2 x double> %bc
325 define <vscale x 2 x double> @bitcast_half_to_double(<vscale x 8 x half> %v) {
326 ; CHECK-LABEL: bitcast_half_to_double:
327 ; CHECK:       // %bb.0:
328 ; CHECK-NEXT:    ret
329   %bc = bitcast <vscale x 8 x half> %v to <vscale x 2 x double>
330   ret <vscale x 2 x double> %bc
333 define <vscale x 2 x double> @bitcast_float_to_double(<vscale x 4 x float> %v) {
334 ; CHECK-LABEL: bitcast_float_to_double:
335 ; CHECK:       // %bb.0:
336 ; CHECK-NEXT:    ret
337   %bc = bitcast <vscale x 4 x float> %v to <vscale x 2 x double>
338   ret <vscale x 2 x double> %bc
341 define <vscale x 16 x i8> @bitcast_bfloat_to_i8(<vscale x 8 x bfloat> %v) #0 {
342 ; CHECK-LABEL: bitcast_bfloat_to_i8:
343 ; CHECK:       // %bb.0:
344 ; CHECK-NEXT:    ret
345   %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 16 x i8>
346   ret <vscale x 16 x i8> %bc
349 define <vscale x 8 x i16> @bitcast_bfloat_to_i16(<vscale x 8 x bfloat> %v) #0 {
350 ; CHECK-LABEL: bitcast_bfloat_to_i16:
351 ; CHECK:       // %bb.0:
352 ; CHECK-NEXT:    ret
353   %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 8 x i16>
354   ret <vscale x 8 x i16> %bc
357 define <vscale x 4 x i32> @bitcast_bfloat_to_i32(<vscale x 8 x bfloat> %v) #0 {
358 ; CHECK-LABEL: bitcast_bfloat_to_i32:
359 ; CHECK:       // %bb.0:
360 ; CHECK-NEXT:    ret
361   %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 4 x i32>
362   ret <vscale x 4 x i32> %bc
365 define <vscale x 2 x i64> @bitcast_bfloat_to_i64(<vscale x 8 x bfloat> %v) #0 {
366 ; CHECK-LABEL: bitcast_bfloat_to_i64:
367 ; CHECK:       // %bb.0:
368 ; CHECK-NEXT:    ret
369   %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 2 x i64>
370   ret <vscale x 2 x i64> %bc
373 define <vscale x 8 x half> @bitcast_bfloat_to_half(<vscale x 8 x bfloat> %v) #0 {
374 ; CHECK-LABEL: bitcast_bfloat_to_half:
375 ; CHECK:       // %bb.0:
376 ; CHECK-NEXT:    ret
377   %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 8 x half>
378   ret <vscale x 8 x half> %bc
381 define <vscale x 4 x float> @bitcast_bfloat_to_float(<vscale x 8 x bfloat> %v) #0 {
382 ; CHECK-LABEL: bitcast_bfloat_to_float:
383 ; CHECK:       // %bb.0:
384 ; CHECK-NEXT:    ret
385   %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 4 x float>
386   ret <vscale x 4 x float> %bc
389 define <vscale x 2 x double> @bitcast_bfloat_to_double(<vscale x 8 x bfloat> %v) #0 {
390 ; CHECK-LABEL: bitcast_bfloat_to_double:
391 ; CHECK:       // %bb.0:
392 ; CHECK-NEXT:    ret
393   %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 2 x double>
394   ret <vscale x 2 x double> %bc
397 define <vscale x 8 x bfloat> @bitcast_i8_to_bfloat(<vscale x 16 x i8> %v) #0 {
398 ; CHECK-LABEL: bitcast_i8_to_bfloat:
399 ; CHECK:       // %bb.0:
400 ; CHECK-NEXT:    ret
401   %bc = bitcast <vscale x 16 x i8> %v to <vscale x 8 x bfloat>
402   ret <vscale x 8 x bfloat> %bc
405 define <vscale x 8 x bfloat> @bitcast_i16_to_bfloat(<vscale x 8 x i16> %v) #0 {
406 ; CHECK-LABEL: bitcast_i16_to_bfloat:
407 ; CHECK:       // %bb.0:
408 ; CHECK-NEXT:    ret
409   %bc = bitcast <vscale x 8 x i16> %v to <vscale x 8 x bfloat>
410   ret <vscale x 8 x bfloat> %bc
413 define <vscale x 8 x bfloat> @bitcast_i32_to_bfloat(<vscale x 4 x i32> %v) #0 {
414 ; CHECK-LABEL: bitcast_i32_to_bfloat:
415 ; CHECK:       // %bb.0:
416 ; CHECK-NEXT:    ret
417   %bc = bitcast <vscale x 4 x i32> %v to <vscale x 8 x bfloat>
418   ret <vscale x 8 x bfloat> %bc
421 define <vscale x 8 x bfloat> @bitcast_i64_to_bfloat(<vscale x 2 x i64> %v) #0 {
422 ; CHECK-LABEL: bitcast_i64_to_bfloat:
423 ; CHECK:       // %bb.0:
424 ; CHECK-NEXT:    ret
425   %bc = bitcast <vscale x 2 x i64> %v to <vscale x 8 x bfloat>
426   ret <vscale x 8 x bfloat> %bc
429 define <vscale x 8 x bfloat> @bitcast_half_to_bfloat(<vscale x 8 x half> %v) #0 {
430 ; CHECK-LABEL: bitcast_half_to_bfloat:
431 ; CHECK:       // %bb.0:
432 ; CHECK-NEXT:    ret
433   %bc = bitcast <vscale x 8 x half> %v to <vscale x 8 x bfloat>
434   ret <vscale x 8 x bfloat> %bc
437 define <vscale x 8 x bfloat> @bitcast_float_to_bfloat(<vscale x 4 x float> %v) #0 {
438 ; CHECK-LABEL: bitcast_float_to_bfloat:
439 ; CHECK:       // %bb.0:
440 ; CHECK-NEXT:    ret
441   %bc = bitcast <vscale x 4 x float> %v to <vscale x 8 x bfloat>
442   ret <vscale x 8 x bfloat> %bc
445 define <vscale x 8 x bfloat> @bitcast_double_to_bfloat(<vscale x 2 x double> %v) #0 {
446 ; CHECK-LABEL: bitcast_double_to_bfloat:
447 ; CHECK:       // %bb.0:
448 ; CHECK-NEXT:    ret
449   %bc = bitcast <vscale x 2 x double> %v to <vscale x 8 x bfloat>
450   ret <vscale x 8 x bfloat> %bc
453 define <vscale x 2 x i16> @bitcast_short2_half_to_i16(<vscale x 2 x half> %v) {
454 ; CHECK-LABEL: bitcast_short2_half_to_i16:
455 ; CHECK:       // %bb.0:
456 ; CHECK-NEXT:    ret
457   %bc = bitcast <vscale x 2 x half> %v to <vscale x 2 x i16>
458   ret <vscale x 2 x i16> %bc
461 define <vscale x 4 x i16> @bitcast_short4_half_to_i16(<vscale x 4 x half> %v) {
462 ; CHECK-LABEL: bitcast_short4_half_to_i16:
463 ; CHECK:       // %bb.0:
464 ; CHECK-NEXT:    ret
465   %bc = bitcast <vscale x 4 x half> %v to <vscale x 4 x i16>
466   ret <vscale x 4 x i16> %bc
469 define <vscale x 2 x i16> @bitcast_short2_bfloat_to_i16(<vscale x 2 x bfloat> %v) #0 {
470 ; CHECK-LABEL: bitcast_short2_bfloat_to_i16:
471 ; CHECK:       // %bb.0:
472 ; CHECK-NEXT:    ret
473   %bc = bitcast <vscale x 2 x bfloat> %v to <vscale x 2 x i16>
474   ret <vscale x 2 x i16> %bc
477 define <vscale x 4 x i16> @bitcast_short4_bfloat_to_i16(<vscale x 4 x bfloat> %v) #0 {
478 ; CHECK-LABEL: bitcast_short4_bfloat_to_i16:
479 ; CHECK:       // %bb.0:
480 ; CHECK-NEXT:    ret
481   %bc = bitcast <vscale x 4 x bfloat> %v to <vscale x 4 x i16>
482   ret <vscale x 4 x i16> %bc
485 define <vscale x 2 x half> @bitcast_short2_i16_to_half(<vscale x 2 x i16> %v) {
486 ; CHECK-LABEL: bitcast_short2_i16_to_half:
487 ; CHECK:       // %bb.0:
488 ; CHECK-NEXT:    ret
489   %bc = bitcast <vscale x 2 x i16> %v to <vscale x 2 x half>
490   ret <vscale x 2 x half> %bc
493 define <vscale x 4 x half> @bitcast_short4_i16_to_half(<vscale x 4 x i16> %v) {
494 ; CHECK-LABEL: bitcast_short4_i16_to_half:
495 ; CHECK:       // %bb.0:
496 ; CHECK-NEXT:    ret
497   %bc = bitcast <vscale x 4 x i16> %v to <vscale x 4 x half>
498   ret <vscale x 4 x half> %bc
501 define <vscale x 2 x bfloat> @bitcast_short2_i16_to_bfloat(<vscale x 2 x i16> %v) #0 {
502 ; CHECK-LABEL: bitcast_short2_i16_to_bfloat:
503 ; CHECK:       // %bb.0:
504 ; CHECK-NEXT:    ret
505   %bc = bitcast <vscale x 2 x i16> %v to <vscale x 2 x bfloat>
506   ret <vscale x 2 x bfloat> %bc
509 define <vscale x 4 x bfloat> @bitcast_short4_i16_to_bfloat(<vscale x 4 x i16> %v) #0 {
510 ; CHECK-LABEL: bitcast_short4_i16_to_bfloat:
511 ; CHECK:       // %bb.0:
512 ; CHECK-NEXT:    ret
513   %bc = bitcast <vscale x 4 x i16> %v to <vscale x 4 x bfloat>
514   ret <vscale x 4 x bfloat> %bc
517 define <vscale x 2 x i32> @bitcast_short_float_to_i32(<vscale x 2 x double> %v) #0 {
518 ; CHECK-LABEL: bitcast_short_float_to_i32:
519 ; CHECK:       // %bb.0:
520 ; CHECK-NEXT:    ptrue p0.d
521 ; CHECK-NEXT:    fcvt z0.s, p0/m, z0.d
522 ; CHECK-NEXT:    ret
523   %trunc = fptrunc <vscale x 2 x double> %v to <vscale x 2 x float>
524   %bitcast = bitcast <vscale x 2 x float> %trunc to <vscale x 2 x i32>
525   ret <vscale x 2 x i32> %bitcast
528 define <vscale x 2 x double> @bitcast_short_i32_to_float(<vscale x 2 x i64> %v) #0 {
529 ; CHECK-LABEL: bitcast_short_i32_to_float:
530 ; CHECK:       // %bb.0:
531 ; CHECK-NEXT:    ptrue p0.d
532 ; CHECK-NEXT:    fcvt z0.d, p0/m, z0.s
533 ; CHECK-NEXT:    ret
534   %trunc = trunc <vscale x 2 x i64> %v to <vscale x 2 x i32>
535   %bitcast = bitcast <vscale x 2 x i32> %trunc to <vscale x 2 x float>
536   %extended = fpext <vscale x 2 x float> %bitcast to <vscale x 2 x double>
537   ret <vscale x 2 x double> %extended
540 define <vscale x 2 x float> @bitcast_short_half_to_float(<vscale x 4 x half> %v) #0 {
541 ; CHECK-LABEL: bitcast_short_half_to_float:
542 ; CHECK:       // %bb.0:
543 ; CHECK-NEXT:    ptrue p0.s
544 ; CHECK-NEXT:    fadd z0.h, p0/m, z0.h, z0.h
545 ; CHECK-NEXT:    ret
546   %add = fadd <vscale x 4 x half> %v, %v
547   %bitcast = bitcast <vscale x 4 x half> %add to <vscale x 2 x float>
548   ret <vscale x 2 x float> %bitcast
551 ; +bf16 is required for the bfloat version.
552 attributes #0 = { "target-features"="+sve,+bf16" }