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