xref: /llvm-project/llvm/test/CodeGen/LoongArch/lasx/ir-instruction/extractelement.ll (revision 47c88bcd5de91522241cca1aaa1b7762ceb01394)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s
3
4define void @extract_32xi8(ptr %src, ptr %dst) nounwind {
5; CHECK-LABEL: extract_32xi8:
6; CHECK:       # %bb.0:
7; CHECK-NEXT:    xvld $xr0, $a0, 0
8; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 1
9; CHECK-NEXT:    st.b $a0, $a1, 0
10; CHECK-NEXT:    ret
11  %v = load volatile <32 x i8>, ptr %src
12  %e = extractelement <32 x i8> %v, i32 1
13  store i8 %e, ptr %dst
14  ret void
15}
16
17define void @extract_16xi16(ptr %src, ptr %dst) nounwind {
18; CHECK-LABEL: extract_16xi16:
19; CHECK:       # %bb.0:
20; CHECK-NEXT:    xvld $xr0, $a0, 0
21; CHECK-NEXT:    vpickve2gr.h $a0, $vr0, 1
22; CHECK-NEXT:    st.h $a0, $a1, 0
23; CHECK-NEXT:    ret
24  %v = load volatile <16 x i16>, ptr %src
25  %e = extractelement <16 x i16> %v, i32 1
26  store i16 %e, ptr %dst
27  ret void
28}
29
30define void @extract_8xi32(ptr %src, ptr %dst) nounwind {
31; CHECK-LABEL: extract_8xi32:
32; CHECK:       # %bb.0:
33; CHECK-NEXT:    xvld $xr0, $a0, 0
34; CHECK-NEXT:    xvpickve2gr.w $a0, $xr0, 1
35; CHECK-NEXT:    st.w $a0, $a1, 0
36; CHECK-NEXT:    ret
37  %v = load volatile <8 x i32>, ptr %src
38  %e = extractelement <8 x i32> %v, i32 1
39  store i32 %e, ptr %dst
40  ret void
41}
42
43define void @extract_4xi64(ptr %src, ptr %dst) nounwind {
44; CHECK-LABEL: extract_4xi64:
45; CHECK:       # %bb.0:
46; CHECK-NEXT:    xvld $xr0, $a0, 0
47; CHECK-NEXT:    xvpickve2gr.d $a0, $xr0, 1
48; CHECK-NEXT:    st.d $a0, $a1, 0
49; CHECK-NEXT:    ret
50  %v = load volatile <4 x i64>, ptr %src
51  %e = extractelement <4 x i64> %v, i32 1
52  store i64 %e, ptr %dst
53  ret void
54}
55
56define void @extract_8xfloat(ptr %src, ptr %dst) nounwind {
57; CHECK-LABEL: extract_8xfloat:
58; CHECK:       # %bb.0:
59; CHECK-NEXT:    xvld $xr0, $a0, 0
60; CHECK-NEXT:    xvpickve2gr.w $a0, $xr0, 7
61; CHECK-NEXT:    movgr2fr.w $fa0, $a0
62; CHECK-NEXT:    fst.s $fa0, $a1, 0
63; CHECK-NEXT:    ret
64  %v = load volatile <8 x float>, ptr %src
65  %e = extractelement <8 x float> %v, i32 7
66  store float %e, ptr %dst
67  ret void
68}
69
70define void @extract_4xdouble(ptr %src, ptr %dst) nounwind {
71; CHECK-LABEL: extract_4xdouble:
72; CHECK:       # %bb.0:
73; CHECK-NEXT:    xvld $xr0, $a0, 0
74; CHECK-NEXT:    xvpickve2gr.d $a0, $xr0, 3
75; CHECK-NEXT:    movgr2fr.d $fa0, $a0
76; CHECK-NEXT:    fst.d $fa0, $a1, 0
77; CHECK-NEXT:    ret
78  %v = load volatile <4 x double>, ptr %src
79  %e = extractelement <4 x double> %v, i32 3
80  store double %e, ptr %dst
81  ret void
82}
83
84define void @extract_32xi8_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
85; CHECK-LABEL: extract_32xi8_idx:
86; CHECK:       # %bb.0:
87; CHECK-NEXT:    addi.d $sp, $sp, -64
88; CHECK-NEXT:    st.d $ra, $sp, 56 # 8-byte Folded Spill
89; CHECK-NEXT:    st.d $fp, $sp, 48 # 8-byte Folded Spill
90; CHECK-NEXT:    addi.d $fp, $sp, 64
91; CHECK-NEXT:    bstrins.d $sp, $zero, 4, 0
92; CHECK-NEXT:    xvld $xr0, $a0, 0
93; CHECK-NEXT:    xvst $xr0, $sp, 0
94; CHECK-NEXT:    addi.d $a0, $sp, 0
95; CHECK-NEXT:    bstrins.d $a0, $a2, 4, 0
96; CHECK-NEXT:    ld.b $a0, $a0, 0
97; CHECK-NEXT:    st.b $a0, $a1, 0
98; CHECK-NEXT:    addi.d $sp, $fp, -64
99; CHECK-NEXT:    ld.d $fp, $sp, 48 # 8-byte Folded Reload
100; CHECK-NEXT:    ld.d $ra, $sp, 56 # 8-byte Folded Reload
101; CHECK-NEXT:    addi.d $sp, $sp, 64
102; CHECK-NEXT:    ret
103  %v = load volatile <32 x i8>, ptr %src
104  %e = extractelement <32 x i8> %v, i32 %idx
105  store i8 %e, ptr %dst
106  ret void
107}
108
109define void @extract_16xi16_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
110; CHECK-LABEL: extract_16xi16_idx:
111; CHECK:       # %bb.0:
112; CHECK-NEXT:    addi.d $sp, $sp, -64
113; CHECK-NEXT:    st.d $ra, $sp, 56 # 8-byte Folded Spill
114; CHECK-NEXT:    st.d $fp, $sp, 48 # 8-byte Folded Spill
115; CHECK-NEXT:    addi.d $fp, $sp, 64
116; CHECK-NEXT:    bstrins.d $sp, $zero, 4, 0
117; CHECK-NEXT:    xvld $xr0, $a0, 0
118; CHECK-NEXT:    xvst $xr0, $sp, 0
119; CHECK-NEXT:    addi.d $a0, $sp, 0
120; CHECK-NEXT:    bstrins.d $a0, $a2, 4, 1
121; CHECK-NEXT:    ld.h $a0, $a0, 0
122; CHECK-NEXT:    st.h $a0, $a1, 0
123; CHECK-NEXT:    addi.d $sp, $fp, -64
124; CHECK-NEXT:    ld.d $fp, $sp, 48 # 8-byte Folded Reload
125; CHECK-NEXT:    ld.d $ra, $sp, 56 # 8-byte Folded Reload
126; CHECK-NEXT:    addi.d $sp, $sp, 64
127; CHECK-NEXT:    ret
128  %v = load volatile <16 x i16>, ptr %src
129  %e = extractelement <16 x i16> %v, i32 %idx
130  store i16 %e, ptr %dst
131  ret void
132}
133
134define void @extract_8xi32_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
135; CHECK-LABEL: extract_8xi32_idx:
136; CHECK:       # %bb.0:
137; CHECK-NEXT:    addi.d $sp, $sp, -64
138; CHECK-NEXT:    st.d $ra, $sp, 56 # 8-byte Folded Spill
139; CHECK-NEXT:    st.d $fp, $sp, 48 # 8-byte Folded Spill
140; CHECK-NEXT:    addi.d $fp, $sp, 64
141; CHECK-NEXT:    bstrins.d $sp, $zero, 4, 0
142; CHECK-NEXT:    xvld $xr0, $a0, 0
143; CHECK-NEXT:    xvst $xr0, $sp, 0
144; CHECK-NEXT:    addi.d $a0, $sp, 0
145; CHECK-NEXT:    bstrins.d $a0, $a2, 4, 2
146; CHECK-NEXT:    ld.w $a0, $a0, 0
147; CHECK-NEXT:    st.w $a0, $a1, 0
148; CHECK-NEXT:    addi.d $sp, $fp, -64
149; CHECK-NEXT:    ld.d $fp, $sp, 48 # 8-byte Folded Reload
150; CHECK-NEXT:    ld.d $ra, $sp, 56 # 8-byte Folded Reload
151; CHECK-NEXT:    addi.d $sp, $sp, 64
152; CHECK-NEXT:    ret
153  %v = load volatile <8 x i32>, ptr %src
154  %e = extractelement <8 x i32> %v, i32 %idx
155  store i32 %e, ptr %dst
156  ret void
157}
158
159define void @extract_4xi64_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
160; CHECK-LABEL: extract_4xi64_idx:
161; CHECK:       # %bb.0:
162; CHECK-NEXT:    addi.d $sp, $sp, -64
163; CHECK-NEXT:    st.d $ra, $sp, 56 # 8-byte Folded Spill
164; CHECK-NEXT:    st.d $fp, $sp, 48 # 8-byte Folded Spill
165; CHECK-NEXT:    addi.d $fp, $sp, 64
166; CHECK-NEXT:    bstrins.d $sp, $zero, 4, 0
167; CHECK-NEXT:    xvld $xr0, $a0, 0
168; CHECK-NEXT:    xvst $xr0, $sp, 0
169; CHECK-NEXT:    addi.d $a0, $sp, 0
170; CHECK-NEXT:    bstrins.d $a0, $a2, 4, 3
171; CHECK-NEXT:    ld.d $a0, $a0, 0
172; CHECK-NEXT:    st.d $a0, $a1, 0
173; CHECK-NEXT:    addi.d $sp, $fp, -64
174; CHECK-NEXT:    ld.d $fp, $sp, 48 # 8-byte Folded Reload
175; CHECK-NEXT:    ld.d $ra, $sp, 56 # 8-byte Folded Reload
176; CHECK-NEXT:    addi.d $sp, $sp, 64
177; CHECK-NEXT:    ret
178  %v = load volatile <4 x i64>, ptr %src
179  %e = extractelement <4 x i64> %v, i32 %idx
180  store i64 %e, ptr %dst
181  ret void
182}
183
184define void @extract_8xfloat_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
185; CHECK-LABEL: extract_8xfloat_idx:
186; CHECK:       # %bb.0:
187; CHECK-NEXT:    addi.d $sp, $sp, -64
188; CHECK-NEXT:    st.d $ra, $sp, 56 # 8-byte Folded Spill
189; CHECK-NEXT:    st.d $fp, $sp, 48 # 8-byte Folded Spill
190; CHECK-NEXT:    addi.d $fp, $sp, 64
191; CHECK-NEXT:    bstrins.d $sp, $zero, 4, 0
192; CHECK-NEXT:    xvld $xr0, $a0, 0
193; CHECK-NEXT:    xvst $xr0, $sp, 0
194; CHECK-NEXT:    addi.d $a0, $sp, 0
195; CHECK-NEXT:    bstrins.d $a0, $a2, 4, 2
196; CHECK-NEXT:    fld.s $fa0, $a0, 0
197; CHECK-NEXT:    fst.s $fa0, $a1, 0
198; CHECK-NEXT:    addi.d $sp, $fp, -64
199; CHECK-NEXT:    ld.d $fp, $sp, 48 # 8-byte Folded Reload
200; CHECK-NEXT:    ld.d $ra, $sp, 56 # 8-byte Folded Reload
201; CHECK-NEXT:    addi.d $sp, $sp, 64
202; CHECK-NEXT:    ret
203  %v = load volatile <8 x float>, ptr %src
204  %e = extractelement <8 x float> %v, i32 %idx
205  store float %e, ptr %dst
206  ret void
207}
208
209define void @extract_4xdouble_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
210; CHECK-LABEL: extract_4xdouble_idx:
211; CHECK:       # %bb.0:
212; CHECK-NEXT:    addi.d $sp, $sp, -64
213; CHECK-NEXT:    st.d $ra, $sp, 56 # 8-byte Folded Spill
214; CHECK-NEXT:    st.d $fp, $sp, 48 # 8-byte Folded Spill
215; CHECK-NEXT:    addi.d $fp, $sp, 64
216; CHECK-NEXT:    bstrins.d $sp, $zero, 4, 0
217; CHECK-NEXT:    xvld $xr0, $a0, 0
218; CHECK-NEXT:    xvst $xr0, $sp, 0
219; CHECK-NEXT:    addi.d $a0, $sp, 0
220; CHECK-NEXT:    bstrins.d $a0, $a2, 4, 3
221; CHECK-NEXT:    fld.d $fa0, $a0, 0
222; CHECK-NEXT:    fst.d $fa0, $a1, 0
223; CHECK-NEXT:    addi.d $sp, $fp, -64
224; CHECK-NEXT:    ld.d $fp, $sp, 48 # 8-byte Folded Reload
225; CHECK-NEXT:    ld.d $ra, $sp, 56 # 8-byte Folded Reload
226; CHECK-NEXT:    addi.d $sp, $sp, 64
227; CHECK-NEXT:    ret
228  %v = load volatile <4 x double>, ptr %src
229  %e = extractelement <4 x double> %v, i32 %idx
230  store double %e, ptr %dst
231  ret void
232}
233