[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / extract-insert.ll
blob8c133d76ce3173e6627e596b8fe2e6b963395738
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64_be-- < %s | FileCheck %s --check-prefix=BE
3 ; RUN: llc -mtriple=aarch64--    < %s | FileCheck %s --check-prefix=LE
5 define i32 @trunc_i64_to_i32_le(i64 %x) {
6 ; BE-LABEL: trunc_i64_to_i32_le:
7 ; BE:       // %bb.0:
8 ; BE-NEXT:    lsr x0, x0, #32
9 ; BE-NEXT:    // kill: def $w0 killed $w0 killed $x0
10 ; BE-NEXT:    ret
12 ; LE-LABEL: trunc_i64_to_i32_le:
13 ; LE:       // %bb.0:
14 ; LE-NEXT:    // kill: def $w0 killed $w0 killed $x0
15 ; LE-NEXT:    ret
16   %ins = insertelement <2 x i64> undef, i64 %x, i32 0
17   %bc = bitcast <2 x i64> %ins to <4 x i32>
18   %ext = extractelement <4 x i32> %bc, i32 0
19   ret i32 %ext
22 define i32 @trunc_i64_to_i32_be(i64 %x) {
23 ; BE-LABEL: trunc_i64_to_i32_be:
24 ; BE:       // %bb.0:
25 ; BE-NEXT:    // kill: def $w0 killed $w0 killed $x0
26 ; BE-NEXT:    ret
28 ; LE-LABEL: trunc_i64_to_i32_be:
29 ; LE:       // %bb.0:
30 ; LE-NEXT:    lsr x0, x0, #32
31 ; LE-NEXT:    // kill: def $w0 killed $w0 killed $x0
32 ; LE-NEXT:    ret
33   %ins = insertelement <2 x i64> undef, i64 %x, i32 0
34   %bc = bitcast <2 x i64> %ins to <4 x i32>
35   %ext = extractelement <4 x i32> %bc, i32 1
36   ret i32 %ext
39 define i16 @trunc_i64_to_i16_le(i64 %x) {
40 ; BE-LABEL: trunc_i64_to_i16_le:
41 ; BE:       // %bb.0:
42 ; BE-NEXT:    lsr x0, x0, #48
43 ; BE-NEXT:    // kill: def $w0 killed $w0 killed $x0
44 ; BE-NEXT:    ret
46 ; LE-LABEL: trunc_i64_to_i16_le:
47 ; LE:       // %bb.0:
48 ; LE-NEXT:    // kill: def $w0 killed $w0 killed $x0
49 ; LE-NEXT:    ret
50   %ins = insertelement <2 x i64> undef, i64 %x, i32 0
51   %bc = bitcast <2 x i64> %ins to <8 x i16>
52   %ext = extractelement <8 x i16> %bc, i32 0
53   ret i16 %ext
56 define i16 @trunc_i64_to_i16_be(i64 %x) {
57 ; BE-LABEL: trunc_i64_to_i16_be:
58 ; BE:       // %bb.0:
59 ; BE-NEXT:    // kill: def $w0 killed $w0 killed $x0
60 ; BE-NEXT:    ret
62 ; LE-LABEL: trunc_i64_to_i16_be:
63 ; LE:       // %bb.0:
64 ; LE-NEXT:    lsr x0, x0, #48
65 ; LE-NEXT:    // kill: def $w0 killed $w0 killed $x0
66 ; LE-NEXT:    ret
67   %ins = insertelement <2 x i64> undef, i64 %x, i32 0
68   %bc = bitcast <2 x i64> %ins to <8 x i16>
69   %ext = extractelement <8 x i16> %bc, i32 3
70   ret i16 %ext
73 define i8 @trunc_i32_to_i8_le(i32 %x) {
74 ; BE-LABEL: trunc_i32_to_i8_le:
75 ; BE:       // %bb.0:
76 ; BE-NEXT:    lsr w0, w0, #24
77 ; BE-NEXT:    ret
79 ; LE-LABEL: trunc_i32_to_i8_le:
80 ; LE:       // %bb.0:
81 ; LE-NEXT:    ret
82   %ins = insertelement <4 x i32> undef, i32 %x, i32 0
83   %bc = bitcast <4 x i32> %ins to <16 x i8>
84   %ext = extractelement <16 x i8> %bc, i32 0
85   ret i8 %ext
88 define i8 @trunc_i32_to_i8_be(i32 %x) {
89 ; BE-LABEL: trunc_i32_to_i8_be:
90 ; BE:       // %bb.0:
91 ; BE-NEXT:    ret
93 ; LE-LABEL: trunc_i32_to_i8_be:
94 ; LE:       // %bb.0:
95 ; LE-NEXT:    lsr w0, w0, #24
96 ; LE-NEXT:    ret
97   %ins = insertelement <4 x i32> undef, i32 %x, i32 0
98   %bc = bitcast <4 x i32> %ins to <16 x i8>
99   %ext = extractelement <16 x i8> %bc, i32 3
100   ret i8 %ext
103 ; Weird type (non-power-of-2 vector) is ok.
105 define i8 @trunc_i64_to_i8_be(i64 %x) {
106 ; BE-LABEL: trunc_i64_to_i8_be:
107 ; BE:       // %bb.0:
108 ; BE-NEXT:    // kill: def $w0 killed $w0 killed $x0
109 ; BE-NEXT:    ret
111 ; LE-LABEL: trunc_i64_to_i8_be:
112 ; LE:       // %bb.0:
113 ; LE-NEXT:    lsr x0, x0, #56
114 ; LE-NEXT:    // kill: def $w0 killed $w0 killed $x0
115 ; LE-NEXT:    ret
116   %ins = insertelement <3 x i64> undef, i64 %x, i32 0
117   %bc = bitcast <3 x i64> %ins to <24 x i8>
118   %ext = extractelement <24 x i8> %bc, i32 7
119   ret i8 %ext