[PowerPC][NFC] Add a test case for extract and store patterns
[llvm-core.git] / test / CodeGen / PowerPC / extract-and-store.ll
blob6426db7923cc7d2301c0726003a49086abd00158
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unkknown-unknown \
3 ; RUN:   -ppc-asm-full-reg-names -verify-machineinstrs -O2 < %s | FileCheck %s
4 ; RUN: llc -mcpu=pwr8 -mtriple=powerpc64-unkknown-unknown \
5 ; RUN:   -ppc-asm-full-reg-names -verify-machineinstrs -O2 < %s | FileCheck %s \
6 ; RUN:   --check-prefix=CHECK-BE
7 ; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unkknown-unknown \
8 ; RUN:   -ppc-asm-full-reg-names -verify-machineinstrs -O2 < %s | FileCheck %s \
9 ; RUN:   --check-prefix=CHECK-P9
10 ; Function Attrs: norecurse nounwind writeonly
11 define <2 x i64> @testll0(<2 x i64> returned %a, <2 x i64> %b, i64* nocapture %ap) local_unnamed_addr #0 {
12 ; CHECK-LABEL: testll0:
13 ; CHECK:       # %bb.0: # %entry
14 ; CHECK-NEXT:    xxswapd vs0, vs34
15 ; CHECK-NEXT:    mfvsrd r3, f0
16 ; CHECK-NEXT:    std r3, 24(r7)
17 ; CHECK-NEXT:    blr
19 ; CHECK-BE-LABEL: testll0:
20 ; CHECK-BE:       # %bb.0: # %entry
21 ; CHECK-BE-NEXT:    mfvsrd r3, vs34
22 ; CHECK-BE-NEXT:    std r3, 24(r7)
23 ; CHECK-BE-NEXT:    blr
25 ; CHECK-P9-LABEL: testll0:
26 ; CHECK-P9:       # %bb.0: # %entry
27 ; CHECK-P9-NEXT:    mfvsrld r3, vs34
28 ; CHECK-P9-NEXT:    std r3, 24(r7)
29 ; CHECK-P9-NEXT:    blr
30 entry:
31   %vecext = extractelement <2 x i64> %a, i32 0
32   %arrayidx = getelementptr inbounds i64, i64* %ap, i64 3
33   store i64 %vecext, i64* %arrayidx, align 8
34   ret <2 x i64> %a
37 ; Function Attrs: norecurse nounwind writeonly
38 define <2 x i64> @testll1(<2 x i64> returned %a, i64 %b, i64* nocapture %ap) local_unnamed_addr #0 {
39 ; CHECK-LABEL: testll1:
40 ; CHECK:       # %bb.0: # %entry
41 ; CHECK-NEXT:    mfvsrd r3, vs34
42 ; CHECK-NEXT:    std r3, 24(r6)
43 ; CHECK-NEXT:    blr
45 ; CHECK-BE-LABEL: testll1:
46 ; CHECK-BE:       # %bb.0: # %entry
47 ; CHECK-BE-NEXT:    xxswapd vs0, vs34
48 ; CHECK-BE-NEXT:    mfvsrd r3, f0
49 ; CHECK-BE-NEXT:    std r3, 24(r6)
50 ; CHECK-BE-NEXT:    blr
52 ; CHECK-P9-LABEL: testll1:
53 ; CHECK-P9:       # %bb.0: # %entry
54 ; CHECK-P9-NEXT:    mfvsrd r3, vs34
55 ; CHECK-P9-NEXT:    std r3, 24(r6)
56 ; CHECK-P9-NEXT:    blr
57 entry:
58   %vecext = extractelement <2 x i64> %a, i32 1
59   %arrayidx = getelementptr inbounds i64, i64* %ap, i64 3
60   store i64 %vecext, i64* %arrayidx, align 8
61   ret <2 x i64> %a
64 ; Function Attrs: norecurse nounwind writeonly
65 define <2 x double> @testd0(<2 x double> returned %a, <2 x double> %b, double* nocapture %ap) local_unnamed_addr #0 {
66 ; CHECK-LABEL: testd0:
67 ; CHECK:       # %bb.0: # %entry
68 ; CHECK-NEXT:    xxswapd vs0, vs34
69 ; CHECK-NEXT:    stfd f0, 24(r7)
70 ; CHECK-NEXT:    blr
72 ; CHECK-BE-LABEL: testd0:
73 ; CHECK-BE:       # %bb.0: # %entry
74 ; CHECK-BE-NEXT:    addi r3, r7, 24
75 ; CHECK-BE-NEXT:    stxsdx vs34, 0, r3
76 ; CHECK-BE-NEXT:    blr
78 ; CHECK-P9-LABEL: testd0:
79 ; CHECK-P9:       # %bb.0: # %entry
80 ; CHECK-P9-NEXT:    xxswapd vs0, vs34
81 ; CHECK-P9-NEXT:    stfd f0, 24(r7)
82 ; CHECK-P9-NEXT:    blr
83 entry:
84   %vecext = extractelement <2 x double> %a, i32 0
85   %arrayidx = getelementptr inbounds double, double* %ap, i64 3
86   store double %vecext, double* %arrayidx, align 8
87   ret <2 x double> %a
90 ; Function Attrs: norecurse nounwind writeonly
91 define <2 x double> @testd1(<2 x double> returned %a, <2 x double> %b, double* nocapture %ap) local_unnamed_addr #0 {
92 ; CHECK-LABEL: testd1:
93 ; CHECK:       # %bb.0: # %entry
94 ; CHECK-NEXT:    addi r3, r7, 24
95 ; CHECK-NEXT:    stxsdx vs34, 0, r3
96 ; CHECK-NEXT:    blr
98 ; CHECK-BE-LABEL: testd1:
99 ; CHECK-BE:       # %bb.0: # %entry
100 ; CHECK-BE-NEXT:    xxswapd vs0, vs34
101 ; CHECK-BE-NEXT:    stfd f0, 24(r7)
102 ; CHECK-BE-NEXT:    blr
104 ; CHECK-P9-LABEL: testd1:
105 ; CHECK-P9:       # %bb.0: # %entry
106 ; CHECK-P9-NEXT:    stxsd v2, 24(r7)
107 ; CHECK-P9-NEXT:    blr
108 entry:
109   %vecext = extractelement <2 x double> %a, i32 1
110   %arrayidx = getelementptr inbounds double, double* %ap, i64 3
111   store double %vecext, double* %arrayidx, align 8
112   ret <2 x double> %a
115 ; Function Attrs: norecurse nounwind writeonly
116 define <4 x float> @testf0(<4 x float> returned %a, <4 x float> %b, float* nocapture %ap) local_unnamed_addr #0 {
117 ; CHECK-LABEL: testf0:
118 ; CHECK:       # %bb.0: # %entry
119 ; CHECK-NEXT:    xxsldwi vs0, vs34, vs34, 3
120 ; CHECK-NEXT:    xscvspdpn f0, vs0
121 ; CHECK-NEXT:    stfs f0, 12(r7)
122 ; CHECK-NEXT:    blr
124 ; CHECK-BE-LABEL: testf0:
125 ; CHECK-BE:       # %bb.0: # %entry
126 ; CHECK-BE-NEXT:    xscvspdpn f0, vs34
127 ; CHECK-BE-NEXT:    stfs f0, 12(r7)
128 ; CHECK-BE-NEXT:    blr
130 ; CHECK-P9-LABEL: testf0:
131 ; CHECK-P9:       # %bb.0: # %entry
132 ; CHECK-P9-NEXT:    xxsldwi vs0, vs34, vs34, 3
133 ; CHECK-P9-NEXT:    xscvspdpn f0, vs0
134 ; CHECK-P9-NEXT:    stfs f0, 12(r7)
135 ; CHECK-P9-NEXT:    blr
136 entry:
137   %vecext = extractelement <4 x float> %a, i32 0
138   %arrayidx = getelementptr inbounds float, float* %ap, i64 3
139   store float %vecext, float* %arrayidx, align 4
140   ret <4 x float> %a
143 ; Function Attrs: norecurse nounwind writeonly
144 define <4 x float> @testf1(<4 x float> returned %a, <4 x float> %b, float* nocapture %ap) local_unnamed_addr #0 {
145 ; CHECK-LABEL: testf1:
146 ; CHECK:       # %bb.0: # %entry
147 ; CHECK-NEXT:    xxswapd vs0, vs34
148 ; CHECK-NEXT:    xscvspdpn f0, vs0
149 ; CHECK-NEXT:    stfs f0, 12(r7)
150 ; CHECK-NEXT:    blr
152 ; CHECK-BE-LABEL: testf1:
153 ; CHECK-BE:       # %bb.0: # %entry
154 ; CHECK-BE-NEXT:    xxsldwi vs0, vs34, vs34, 1
155 ; CHECK-BE-NEXT:    xscvspdpn f0, vs0
156 ; CHECK-BE-NEXT:    stfs f0, 12(r7)
157 ; CHECK-BE-NEXT:    blr
159 ; CHECK-P9-LABEL: testf1:
160 ; CHECK-P9:       # %bb.0: # %entry
161 ; CHECK-P9-NEXT:    xxswapd vs0, vs34
162 ; CHECK-P9-NEXT:    xscvspdpn f0, vs0
163 ; CHECK-P9-NEXT:    stfs f0, 12(r7)
164 ; CHECK-P9-NEXT:    blr
165 entry:
166   %vecext = extractelement <4 x float> %a, i32 1
167   %arrayidx = getelementptr inbounds float, float* %ap, i64 3
168   store float %vecext, float* %arrayidx, align 4
169   ret <4 x float> %a
172 ; Function Attrs: norecurse nounwind writeonly
173 define <4 x float> @testf2(<4 x float> returned %a, <4 x float> %b, float* nocapture %ap) local_unnamed_addr #0 {
174 ; CHECK-LABEL: testf2:
175 ; CHECK:       # %bb.0: # %entry
176 ; CHECK-NEXT:    xxsldwi vs0, vs34, vs34, 1
177 ; CHECK-NEXT:    xscvspdpn f0, vs0
178 ; CHECK-NEXT:    stfs f0, 12(r7)
179 ; CHECK-NEXT:    blr
181 ; CHECK-BE-LABEL: testf2:
182 ; CHECK-BE:       # %bb.0: # %entry
183 ; CHECK-BE-NEXT:    xxswapd vs0, vs34
184 ; CHECK-BE-NEXT:    xscvspdpn f0, vs0
185 ; CHECK-BE-NEXT:    stfs f0, 12(r7)
186 ; CHECK-BE-NEXT:    blr
188 ; CHECK-P9-LABEL: testf2:
189 ; CHECK-P9:       # %bb.0: # %entry
190 ; CHECK-P9-NEXT:    xxsldwi vs0, vs34, vs34, 1
191 ; CHECK-P9-NEXT:    xscvspdpn f0, vs0
192 ; CHECK-P9-NEXT:    stfs f0, 12(r7)
193 ; CHECK-P9-NEXT:    blr
194 entry:
195   %vecext = extractelement <4 x float> %a, i32 2
196   %arrayidx = getelementptr inbounds float, float* %ap, i64 3
197   store float %vecext, float* %arrayidx, align 4
198   ret <4 x float> %a
201 ; Function Attrs: norecurse nounwind writeonly
202 define <4 x float> @testf3(<4 x float> returned %a, <4 x float> %b, float* nocapture %ap) local_unnamed_addr #0 {
203 ; CHECK-LABEL: testf3:
204 ; CHECK:       # %bb.0: # %entry
205 ; CHECK-NEXT:    xscvspdpn f0, vs34
206 ; CHECK-NEXT:    stfs f0, 12(r7)
207 ; CHECK-NEXT:    blr
209 ; CHECK-BE-LABEL: testf3:
210 ; CHECK-BE:       # %bb.0: # %entry
211 ; CHECK-BE-NEXT:    xxsldwi vs0, vs34, vs34, 3
212 ; CHECK-BE-NEXT:    xscvspdpn f0, vs0
213 ; CHECK-BE-NEXT:    stfs f0, 12(r7)
214 ; CHECK-BE-NEXT:    blr
216 ; CHECK-P9-LABEL: testf3:
217 ; CHECK-P9:       # %bb.0: # %entry
218 ; CHECK-P9-NEXT:    xscvspdpn f0, vs34
219 ; CHECK-P9-NEXT:    stfs f0, 12(r7)
220 ; CHECK-P9-NEXT:    blr
221 entry:
222   %vecext = extractelement <4 x float> %a, i32 3
223   %arrayidx = getelementptr inbounds float, float* %ap, i64 3
224   store float %vecext, float* %arrayidx, align 4
225   ret <4 x float> %a
228 ; Function Attrs: norecurse nounwind writeonly
229 define <4 x i32> @testi0(<4 x i32> returned %a, <4 x i32> %b, i32* nocapture %ap) local_unnamed_addr #0 {
230 ; CHECK-LABEL: testi0:
231 ; CHECK:       # %bb.0: # %entry
232 ; CHECK-NEXT:    xxswapd vs0, vs34
233 ; CHECK-NEXT:    mfvsrwz r3, f0
234 ; CHECK-NEXT:    stw r3, 12(r7)
235 ; CHECK-NEXT:    blr
237 ; CHECK-BE-LABEL: testi0:
238 ; CHECK-BE:       # %bb.0: # %entry
239 ; CHECK-BE-NEXT:    xxsldwi vs0, vs34, vs34, 3
240 ; CHECK-BE-NEXT:    mfvsrwz r3, f0
241 ; CHECK-BE-NEXT:    stw r3, 12(r7)
242 ; CHECK-BE-NEXT:    blr
244 ; CHECK-P9-LABEL: testi0:
245 ; CHECK-P9:       # %bb.0: # %entry
246 ; CHECK-P9-NEXT:    li r3, 0
247 ; CHECK-P9-NEXT:    vextuwrx r3, r3, v2
248 ; CHECK-P9-NEXT:    stw r3, 12(r7)
249 ; CHECK-P9-NEXT:    blr
250 entry:
251   %vecext = extractelement <4 x i32> %a, i32 0
252   %arrayidx = getelementptr inbounds i32, i32* %ap, i64 3
253   store i32 %vecext, i32* %arrayidx, align 4
254   ret <4 x i32> %a
257 ; Function Attrs: norecurse nounwind writeonly
258 define <4 x i32> @testi1(<4 x i32> returned %a, <4 x i32> %b, i32* nocapture %ap) local_unnamed_addr #0 {
259 ; CHECK-LABEL: testi1:
260 ; CHECK:       # %bb.0: # %entry
261 ; CHECK-NEXT:    xxsldwi vs0, vs34, vs34, 1
262 ; CHECK-NEXT:    mfvsrwz r3, f0
263 ; CHECK-NEXT:    stw r3, 12(r7)
264 ; CHECK-NEXT:    blr
266 ; CHECK-BE-LABEL: testi1:
267 ; CHECK-BE:       # %bb.0: # %entry
268 ; CHECK-BE-NEXT:    mfvsrwz r3, vs34
269 ; CHECK-BE-NEXT:    stw r3, 12(r7)
270 ; CHECK-BE-NEXT:    blr
272 ; CHECK-P9-LABEL: testi1:
273 ; CHECK-P9:       # %bb.0: # %entry
274 ; CHECK-P9-NEXT:    li r3, 4
275 ; CHECK-P9-NEXT:    vextuwrx r3, r3, v2
276 ; CHECK-P9-NEXT:    stw r3, 12(r7)
277 ; CHECK-P9-NEXT:    blr
278 entry:
279   %vecext = extractelement <4 x i32> %a, i32 1
280   %arrayidx = getelementptr inbounds i32, i32* %ap, i64 3
281   store i32 %vecext, i32* %arrayidx, align 4
282   ret <4 x i32> %a
285 ; Function Attrs: norecurse nounwind writeonly
286 define <4 x i32> @testi2(<4 x i32> returned %a, <4 x i32> %b, i32* nocapture %ap) local_unnamed_addr #0 {
287 ; CHECK-LABEL: testi2:
288 ; CHECK:       # %bb.0: # %entry
289 ; CHECK-NEXT:    mfvsrwz r3, vs34
290 ; CHECK-NEXT:    stw r3, 12(r7)
291 ; CHECK-NEXT:    blr
293 ; CHECK-BE-LABEL: testi2:
294 ; CHECK-BE:       # %bb.0: # %entry
295 ; CHECK-BE-NEXT:    xxsldwi vs0, vs34, vs34, 1
296 ; CHECK-BE-NEXT:    mfvsrwz r3, f0
297 ; CHECK-BE-NEXT:    stw r3, 12(r7)
298 ; CHECK-BE-NEXT:    blr
300 ; CHECK-P9-LABEL: testi2:
301 ; CHECK-P9:       # %bb.0: # %entry
302 ; CHECK-P9-NEXT:    mfvsrwz r3, vs34
303 ; CHECK-P9-NEXT:    stw r3, 12(r7)
304 ; CHECK-P9-NEXT:    blr
305 entry:
306   %vecext = extractelement <4 x i32> %a, i32 2
307   %arrayidx = getelementptr inbounds i32, i32* %ap, i64 3
308   store i32 %vecext, i32* %arrayidx, align 4
309   ret <4 x i32> %a
312 ; Function Attrs: norecurse nounwind writeonly
313 define <4 x i32> @testi3(<4 x i32> returned %a, <4 x i32> %b, i32* nocapture %ap) local_unnamed_addr #0 {
314 ; CHECK-LABEL: testi3:
315 ; CHECK:       # %bb.0: # %entry
316 ; CHECK-NEXT:    xxsldwi vs0, vs34, vs34, 3
317 ; CHECK-NEXT:    mfvsrwz r3, f0
318 ; CHECK-NEXT:    stw r3, 12(r7)
319 ; CHECK-NEXT:    blr
321 ; CHECK-BE-LABEL: testi3:
322 ; CHECK-BE:       # %bb.0: # %entry
323 ; CHECK-BE-NEXT:    xxswapd vs0, vs34
324 ; CHECK-BE-NEXT:    mfvsrwz r3, f0
325 ; CHECK-BE-NEXT:    stw r3, 12(r7)
326 ; CHECK-BE-NEXT:    blr
328 ; CHECK-P9-LABEL: testi3:
329 ; CHECK-P9:       # %bb.0: # %entry
330 ; CHECK-P9-NEXT:    li r3, 12
331 ; CHECK-P9-NEXT:    vextuwrx r3, r3, v2
332 ; CHECK-P9-NEXT:    stw r3, 12(r7)
333 ; CHECK-P9-NEXT:    blr
334 entry:
335   %vecext = extractelement <4 x i32> %a, i32 3
336   %arrayidx = getelementptr inbounds i32, i32* %ap, i64 3
337   store i32 %vecext, i32* %arrayidx, align 4
338   ret <4 x i32> %a