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)
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)
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)
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
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)
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)
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)
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
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)
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
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)
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
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
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)
104 ; CHECK-P9-LABEL: testd1:
105 ; CHECK-P9: # %bb.0: # %entry
106 ; CHECK-P9-NEXT: stxsd v2, 24(r7)
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
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)
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)
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)
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
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)
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)
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)
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
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)
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)
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)
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
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)
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)
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)
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
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)
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)
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)
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
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)
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)
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)
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
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)
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)
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)
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
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)
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)
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)
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