Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / PowerPC / load-and-splat.ll
blob6d2f3b3abc42dc601998f9f6bea2995090419463
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
3 ; RUN:   -mtriple=powerpc64-unknown-unknown < %s | FileCheck %s \
4 ; RUN:   -check-prefix=P9
5 ; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
6 ; RUN:   -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s \
7 ; RUN:   -check-prefix=P8
8 ; RUN: llc -mcpu=pwr7 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
9 ; RUN:   -mtriple=powerpc64-unknown-unknown < %s | FileCheck %s \
10 ; RUN:   -check-prefix=P7
11 ; RUN: llc -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
12 ; RUN:   -mtriple=powerpc-ibm-aix-xcoff < %s | FileCheck %s \
13 ; RUN:   -check-prefix=P9-AIX32
14 ; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
15 ; RUN:   -mtriple=powerpc-ibm-aix-xcoff < %s | FileCheck %s \
16 ; RUN:   -check-prefix=P8-AIX32
17 ; RUN: llc -mcpu=pwr7 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
18 ; RUN:   -mtriple=powerpc-ibm-aix-xcoff < %s | FileCheck %s \
19 ; RUN:   -check-prefix=P7-AIX32
21 ; v2f64
22 define dso_local void @test(ptr nocapture %c, ptr nocapture readonly %a) local_unnamed_addr {
23 ; P9-LABEL: test:
24 ; P9:       # %bb.0: # %entry
25 ; P9-NEXT:    addi r4, r4, 24
26 ; P9-NEXT:    lxvdsx vs0, 0, r4
27 ; P9-NEXT:    stxv vs0, 0(r3)
28 ; P9-NEXT:    blr
30 ; P8-LABEL: test:
31 ; P8:       # %bb.0: # %entry
32 ; P8-NEXT:    addi r4, r4, 24
33 ; P8-NEXT:    lxvdsx vs0, 0, r4
34 ; P8-NEXT:    stxvd2x vs0, 0, r3
35 ; P8-NEXT:    blr
37 ; P7-LABEL: test:
38 ; P7:       # %bb.0: # %entry
39 ; P7-NEXT:    addi r4, r4, 24
40 ; P7-NEXT:    lxvdsx vs0, 0, r4
41 ; P7-NEXT:    stxvd2x vs0, 0, r3
42 ; P7-NEXT:    blr
44 ; P9-AIX32-LABEL: test:
45 ; P9-AIX32:       # %bb.0: # %entry
46 ; P9-AIX32-NEXT:    addi r4, r4, 24
47 ; P9-AIX32-NEXT:    lxvdsx vs0, 0, r4
48 ; P9-AIX32-NEXT:    stxv vs0, 0(r3)
49 ; P9-AIX32-NEXT:    blr
51 ; P8-AIX32-LABEL: test:
52 ; P8-AIX32:       # %bb.0: # %entry
53 ; P8-AIX32-NEXT:    addi r4, r4, 24
54 ; P8-AIX32-NEXT:    lxvdsx vs0, 0, r4
55 ; P8-AIX32-NEXT:    stxvd2x vs0, 0, r3
56 ; P8-AIX32-NEXT:    blr
58 ; P7-AIX32-LABEL: test:
59 ; P7-AIX32:       # %bb.0: # %entry
60 ; P7-AIX32-NEXT:    addi r4, r4, 24
61 ; P7-AIX32-NEXT:    lxvdsx vs0, 0, r4
62 ; P7-AIX32-NEXT:    stxvd2x vs0, 0, r3
63 ; P7-AIX32-NEXT:    blr
64 entry:
65   %arrayidx = getelementptr inbounds double, ptr %a, i64 3
66   %0 = load double, ptr %arrayidx, align 8
67   %splat.splatinsert.i = insertelement <2 x double> undef, double %0, i32 0
68   %splat.splat.i = shufflevector <2 x double> %splat.splatinsert.i, <2 x double> undef, <2 x i32> zeroinitializer
69   store <2 x double> %splat.splat.i, ptr %c, align 16
70   ret void
73 ; v4f32
74 define dso_local void @test2(ptr nocapture %c, ptr nocapture readonly %a) local_unnamed_addr {
75 ; P9-LABEL: test2:
76 ; P9:       # %bb.0: # %entry
77 ; P9-NEXT:    addi r4, r4, 12
78 ; P9-NEXT:    lxvwsx vs0, 0, r4
79 ; P9-NEXT:    stxv vs0, 0(r3)
80 ; P9-NEXT:    blr
82 ; P8-LABEL: test2:
83 ; P8:       # %bb.0: # %entry
84 ; P8-NEXT:    addi r4, r4, 12
85 ; P8-NEXT:    lfiwzx f0, 0, r4
86 ; P8-NEXT:    xxspltw vs0, vs0, 1
87 ; P8-NEXT:    stxvd2x vs0, 0, r3
88 ; P8-NEXT:    blr
90 ; P7-LABEL: test2:
91 ; P7:       # %bb.0: # %entry
92 ; P7-NEXT:    addi r4, r4, 12
93 ; P7-NEXT:    lfiwzx f0, 0, r4
94 ; P7-NEXT:    xxspltw vs0, vs0, 1
95 ; P7-NEXT:    stxvw4x vs0, 0, r3
96 ; P7-NEXT:    blr
98 ; P9-AIX32-LABEL: test2:
99 ; P9-AIX32:       # %bb.0: # %entry
100 ; P9-AIX32-NEXT:    addi r4, r4, 12
101 ; P9-AIX32-NEXT:    lxvwsx vs0, 0, r4
102 ; P9-AIX32-NEXT:    stxv vs0, 0(r3)
103 ; P9-AIX32-NEXT:    blr
105 ; P8-AIX32-LABEL: test2:
106 ; P8-AIX32:       # %bb.0: # %entry
107 ; P8-AIX32-NEXT:    addi r4, r4, 12
108 ; P8-AIX32-NEXT:    lfiwzx f0, 0, r4
109 ; P8-AIX32-NEXT:    xxspltw vs0, vs0, 1
110 ; P8-AIX32-NEXT:    stxvw4x vs0, 0, r3
111 ; P8-AIX32-NEXT:    blr
113 ; P7-AIX32-LABEL: test2:
114 ; P7-AIX32:       # %bb.0: # %entry
115 ; P7-AIX32-NEXT:    addi r4, r4, 12
116 ; P7-AIX32-NEXT:    lfiwzx f0, 0, r4
117 ; P7-AIX32-NEXT:    xxspltw vs0, vs0, 1
118 ; P7-AIX32-NEXT:    stxvw4x vs0, 0, r3
119 ; P7-AIX32-NEXT:    blr
120 entry:
121   %arrayidx = getelementptr inbounds float, ptr %a, i64 3
122   %0 = load float, ptr %arrayidx, align 4
123   %splat.splatinsert.i = insertelement <4 x float> undef, float %0, i32 0
124   %splat.splat.i = shufflevector <4 x float> %splat.splatinsert.i, <4 x float> undef, <4 x i32> zeroinitializer
125   store <4 x float> %splat.splat.i, ptr %c, align 16
126   ret void
129 ; v4i32
130 define dso_local void @test3(ptr nocapture %c, ptr nocapture readonly %a) local_unnamed_addr {
131 ; P9-LABEL: test3:
132 ; P9:       # %bb.0: # %entry
133 ; P9-NEXT:    addi r4, r4, 12
134 ; P9-NEXT:    lxvwsx vs0, 0, r4
135 ; P9-NEXT:    stxv vs0, 0(r3)
136 ; P9-NEXT:    blr
138 ; P8-LABEL: test3:
139 ; P8:       # %bb.0: # %entry
140 ; P8-NEXT:    addi r4, r4, 12
141 ; P8-NEXT:    lfiwzx f0, 0, r4
142 ; P8-NEXT:    xxspltw vs0, vs0, 1
143 ; P8-NEXT:    stxvd2x vs0, 0, r3
144 ; P8-NEXT:    blr
146 ; P7-LABEL: test3:
147 ; P7:       # %bb.0: # %entry
148 ; P7-NEXT:    addi r4, r4, 12
149 ; P7-NEXT:    lfiwzx f0, 0, r4
150 ; P7-NEXT:    xxspltw vs0, vs0, 1
151 ; P7-NEXT:    stxvw4x vs0, 0, r3
152 ; P7-NEXT:    blr
154 ; P9-AIX32-LABEL: test3:
155 ; P9-AIX32:       # %bb.0: # %entry
156 ; P9-AIX32-NEXT:    addi r4, r4, 12
157 ; P9-AIX32-NEXT:    lxvwsx vs0, 0, r4
158 ; P9-AIX32-NEXT:    stxv vs0, 0(r3)
159 ; P9-AIX32-NEXT:    blr
161 ; P8-AIX32-LABEL: test3:
162 ; P8-AIX32:       # %bb.0: # %entry
163 ; P8-AIX32-NEXT:    addi r4, r4, 12
164 ; P8-AIX32-NEXT:    lfiwzx f0, 0, r4
165 ; P8-AIX32-NEXT:    xxspltw vs0, vs0, 1
166 ; P8-AIX32-NEXT:    stxvw4x vs0, 0, r3
167 ; P8-AIX32-NEXT:    blr
169 ; P7-AIX32-LABEL: test3:
170 ; P7-AIX32:       # %bb.0: # %entry
171 ; P7-AIX32-NEXT:    addi r4, r4, 12
172 ; P7-AIX32-NEXT:    lfiwzx f0, 0, r4
173 ; P7-AIX32-NEXT:    xxspltw vs0, vs0, 1
174 ; P7-AIX32-NEXT:    stxvw4x vs0, 0, r3
175 ; P7-AIX32-NEXT:    blr
176 entry:
177   %arrayidx = getelementptr inbounds i32, ptr %a, i64 3
178   %0 = load i32, ptr %arrayidx, align 4
179   %splat.splatinsert.i = insertelement <4 x i32> undef, i32 %0, i32 0
180   %splat.splat.i = shufflevector <4 x i32> %splat.splatinsert.i, <4 x i32> undef, <4 x i32> zeroinitializer
181   store <4 x i32> %splat.splat.i, ptr %c, align 16
182   ret void
186 ; v2i64
187 define dso_local void @test4(ptr nocapture %c, ptr nocapture readonly %a) local_unnamed_addr {
188 ; P9-LABEL: test4:
189 ; P9:       # %bb.0: # %entry
190 ; P9-NEXT:    addi r4, r4, 24
191 ; P9-NEXT:    lxvdsx vs0, 0, r4
192 ; P9-NEXT:    stxv vs0, 0(r3)
193 ; P9-NEXT:    blr
195 ; P8-LABEL: test4:
196 ; P8:       # %bb.0: # %entry
197 ; P8-NEXT:    addi r4, r4, 24
198 ; P8-NEXT:    lxvdsx vs0, 0, r4
199 ; P8-NEXT:    stxvd2x vs0, 0, r3
200 ; P8-NEXT:    blr
202 ; P7-LABEL: test4:
203 ; P7:       # %bb.0: # %entry
204 ; P7-NEXT:    addi r4, r4, 24
205 ; P7-NEXT:    lxvdsx vs0, 0, r4
206 ; P7-NEXT:    stxvd2x vs0, 0, r3
207 ; P7-NEXT:    blr
209 ; P9-AIX32-LABEL: test4:
210 ; P9-AIX32:       # %bb.0: # %entry
211 ; P9-AIX32-NEXT:    lwz r5, 24(r4)
212 ; P9-AIX32-NEXT:    lwz r4, 28(r4)
213 ; P9-AIX32-NEXT:    stw r4, -16(r1)
214 ; P9-AIX32-NEXT:    lwz r4, L..C0(r2) # %const.0
215 ; P9-AIX32-NEXT:    stw r5, -32(r1)
216 ; P9-AIX32-NEXT:    lxv vs1, -16(r1)
217 ; P9-AIX32-NEXT:    lxv vs2, -32(r1)
218 ; P9-AIX32-NEXT:    lxv vs0, 0(r4)
219 ; P9-AIX32-NEXT:    xxperm vs1, vs2, vs0
220 ; P9-AIX32-NEXT:    stxv vs1, 0(r3)
221 ; P9-AIX32-NEXT:    blr
223 ; P8-AIX32-LABEL: test4:
224 ; P8-AIX32:       # %bb.0: # %entry
225 ; P8-AIX32-NEXT:    lwz r5, 24(r4)
226 ; P8-AIX32-NEXT:    lwz r4, 28(r4)
227 ; P8-AIX32-NEXT:    stw r4, -16(r1)
228 ; P8-AIX32-NEXT:    lwz r4, L..C0(r2) # %const.0
229 ; P8-AIX32-NEXT:    stw r5, -32(r1)
230 ; P8-AIX32-NEXT:    lxvw4x v2, 0, r4
231 ; P8-AIX32-NEXT:    addi r4, r1, -16
232 ; P8-AIX32-NEXT:    lxvw4x v3, 0, r4
233 ; P8-AIX32-NEXT:    addi r4, r1, -32
234 ; P8-AIX32-NEXT:    lxvw4x v4, 0, r4
235 ; P8-AIX32-NEXT:    vperm v2, v4, v3, v2
236 ; P8-AIX32-NEXT:    stxvw4x v2, 0, r3
237 ; P8-AIX32-NEXT:    blr
239 ; P7-AIX32-LABEL: test4:
240 ; P7-AIX32:       # %bb.0: # %entry
241 ; P7-AIX32-NEXT:    lwz r5, 24(r4)
242 ; P7-AIX32-NEXT:    lwz r4, 28(r4)
243 ; P7-AIX32-NEXT:    stw r4, -16(r1)
244 ; P7-AIX32-NEXT:    lwz r4, L..C0(r2) # %const.0
245 ; P7-AIX32-NEXT:    stw r5, -32(r1)
246 ; P7-AIX32-NEXT:    lxvw4x v2, 0, r4
247 ; P7-AIX32-NEXT:    addi r4, r1, -16
248 ; P7-AIX32-NEXT:    lxvw4x v3, 0, r4
249 ; P7-AIX32-NEXT:    addi r4, r1, -32
250 ; P7-AIX32-NEXT:    lxvw4x v4, 0, r4
251 ; P7-AIX32-NEXT:    vperm v2, v4, v3, v2
252 ; P7-AIX32-NEXT:    stxvw4x v2, 0, r3
253 ; P7-AIX32-NEXT:    blr
254 entry:
255   %arrayidx = getelementptr inbounds i64, ptr %a, i64 3
256   %0 = load i64, ptr %arrayidx, align 8
257   %splat.splatinsert.i = insertelement <2 x i64> undef, i64 %0, i32 0
258   %splat.splat.i = shufflevector <2 x i64> %splat.splatinsert.i, <2 x i64> undef, <2 x i32> zeroinitializer
259   store <2 x i64> %splat.splat.i, ptr %c, align 16
260   ret void
263 ; sext v2i64
264 define void @test5(ptr %a, ptr %in) {
265 ; P9-LABEL: test5:
266 ; P9:       # %bb.0: # %entry
267 ; P9-NEXT:    lfiwax f0, 0, r4
268 ; P9-NEXT:    xxspltd vs0, f0, 0
269 ; P9-NEXT:    stxv vs0, 0(r3)
270 ; P9-NEXT:    blr
272 ; P8-LABEL: test5:
273 ; P8:       # %bb.0: # %entry
274 ; P8-NEXT:    lfiwax f0, 0, r4
275 ; P8-NEXT:    xxspltd vs0, f0, 0
276 ; P8-NEXT:    stxvd2x vs0, 0, r3
277 ; P8-NEXT:    blr
279 ; P7-LABEL: test5:
280 ; P7:       # %bb.0: # %entry
281 ; P7-NEXT:    lfiwax f0, 0, r4
282 ; P7-NEXT:    xxspltd vs0, f0, 0
283 ; P7-NEXT:    stxvd2x vs0, 0, r3
284 ; P7-NEXT:    blr
286 ; P9-AIX32-LABEL: test5:
287 ; P9-AIX32:       # %bb.0: # %entry
288 ; P9-AIX32-NEXT:    lwz r4, 0(r4)
289 ; P9-AIX32-NEXT:    srawi r5, r4, 31
290 ; P9-AIX32-NEXT:    stw r4, -16(r1)
291 ; P9-AIX32-NEXT:    lwz r4, L..C1(r2) # %const.0
292 ; P9-AIX32-NEXT:    lxv vs1, -16(r1)
293 ; P9-AIX32-NEXT:    stw r5, -32(r1)
294 ; P9-AIX32-NEXT:    lxv vs2, -32(r1)
295 ; P9-AIX32-NEXT:    lxv vs0, 0(r4)
296 ; P9-AIX32-NEXT:    xxperm vs1, vs2, vs0
297 ; P9-AIX32-NEXT:    stxv vs1, 0(r3)
298 ; P9-AIX32-NEXT:    blr
300 ; P8-AIX32-LABEL: test5:
301 ; P8-AIX32:       # %bb.0: # %entry
302 ; P8-AIX32-NEXT:    lwz r4, 0(r4)
303 ; P8-AIX32-NEXT:    srawi r5, r4, 31
304 ; P8-AIX32-NEXT:    stw r4, -16(r1)
305 ; P8-AIX32-NEXT:    lwz r4, L..C1(r2) # %const.0
306 ; P8-AIX32-NEXT:    stw r5, -32(r1)
307 ; P8-AIX32-NEXT:    lxvw4x v2, 0, r4
308 ; P8-AIX32-NEXT:    addi r4, r1, -16
309 ; P8-AIX32-NEXT:    lxvw4x v3, 0, r4
310 ; P8-AIX32-NEXT:    addi r4, r1, -32
311 ; P8-AIX32-NEXT:    lxvw4x v4, 0, r4
312 ; P8-AIX32-NEXT:    vperm v2, v4, v3, v2
313 ; P8-AIX32-NEXT:    stxvw4x v2, 0, r3
314 ; P8-AIX32-NEXT:    blr
316 ; P7-AIX32-LABEL: test5:
317 ; P7-AIX32:       # %bb.0: # %entry
318 ; P7-AIX32-NEXT:    lwz r4, 0(r4)
319 ; P7-AIX32-NEXT:    stw r4, -16(r1)
320 ; P7-AIX32-NEXT:    srawi r4, r4, 31
321 ; P7-AIX32-NEXT:    stw r4, -32(r1)
322 ; P7-AIX32-NEXT:    lwz r4, L..C1(r2) # %const.0
323 ; P7-AIX32-NEXT:    lxvw4x v2, 0, r4
324 ; P7-AIX32-NEXT:    addi r4, r1, -16
325 ; P7-AIX32-NEXT:    lxvw4x v3, 0, r4
326 ; P7-AIX32-NEXT:    addi r4, r1, -32
327 ; P7-AIX32-NEXT:    lxvw4x v4, 0, r4
328 ; P7-AIX32-NEXT:    vperm v2, v4, v3, v2
329 ; P7-AIX32-NEXT:    stxvw4x v2, 0, r3
330 ; P7-AIX32-NEXT:    blr
331 entry:
332   %0 = load i32, ptr %in, align 4
333   %conv = sext i32 %0 to i64
334   %splat.splatinsert.i = insertelement <2 x i64> poison, i64 %conv, i32 0
335   %splat.splat.i = shufflevector <2 x i64> %splat.splatinsert.i, <2 x i64> poison, <2 x i32> zeroinitializer
336   store <2 x i64> %splat.splat.i, ptr %a, align 16
337   ret void
340 ; zext v2i64
341 define void @test6(ptr %a, ptr %in) {
342 ; P9-LABEL: test6:
343 ; P9:       # %bb.0: # %entry
344 ; P9-NEXT:    lfiwzx f0, 0, r4
345 ; P9-NEXT:    xxspltd vs0, f0, 0
346 ; P9-NEXT:    stxv vs0, 0(r3)
347 ; P9-NEXT:    blr
349 ; P8-LABEL: test6:
350 ; P8:       # %bb.0: # %entry
351 ; P8-NEXT:    lfiwzx f0, 0, r4
352 ; P8-NEXT:    xxspltd vs0, f0, 0
353 ; P8-NEXT:    stxvd2x vs0, 0, r3
354 ; P8-NEXT:    blr
356 ; P7-LABEL: test6:
357 ; P7:       # %bb.0: # %entry
358 ; P7-NEXT:    lfiwzx f0, 0, r4
359 ; P7-NEXT:    xxspltd vs0, f0, 0
360 ; P7-NEXT:    stxvd2x vs0, 0, r3
361 ; P7-NEXT:    blr
363 ; P9-AIX32-LABEL: test6:
364 ; P9-AIX32:       # %bb.0: # %entry
365 ; P9-AIX32-NEXT:    lwz r4, 0(r4)
366 ; P9-AIX32-NEXT:    li r5, 0
367 ; P9-AIX32-NEXT:    stw r5, -32(r1)
368 ; P9-AIX32-NEXT:    lxv vs1, -32(r1)
369 ; P9-AIX32-NEXT:    stw r4, -16(r1)
370 ; P9-AIX32-NEXT:    lwz r4, L..C2(r2) # %const.0
371 ; P9-AIX32-NEXT:    lxv vs2, -16(r1)
372 ; P9-AIX32-NEXT:    lxv vs0, 0(r4)
373 ; P9-AIX32-NEXT:    xxperm vs2, vs1, vs0
374 ; P9-AIX32-NEXT:    stxv vs2, 0(r3)
375 ; P9-AIX32-NEXT:    blr
377 ; P8-AIX32-LABEL: test6:
378 ; P8-AIX32:       # %bb.0: # %entry
379 ; P8-AIX32-NEXT:    lwz r4, 0(r4)
380 ; P8-AIX32-NEXT:    li r5, 0
381 ; P8-AIX32-NEXT:    stw r5, -32(r1)
382 ; P8-AIX32-NEXT:    stw r4, -16(r1)
383 ; P8-AIX32-NEXT:    lwz r4, L..C2(r2) # %const.0
384 ; P8-AIX32-NEXT:    lxvw4x v2, 0, r4
385 ; P8-AIX32-NEXT:    addi r4, r1, -32
386 ; P8-AIX32-NEXT:    lxvw4x v3, 0, r4
387 ; P8-AIX32-NEXT:    addi r4, r1, -16
388 ; P8-AIX32-NEXT:    lxvw4x v4, 0, r4
389 ; P8-AIX32-NEXT:    vperm v2, v3, v4, v2
390 ; P8-AIX32-NEXT:    stxvw4x v2, 0, r3
391 ; P8-AIX32-NEXT:    blr
393 ; P7-AIX32-LABEL: test6:
394 ; P7-AIX32:       # %bb.0: # %entry
395 ; P7-AIX32-NEXT:    lwz r4, 0(r4)
396 ; P7-AIX32-NEXT:    li r5, 0
397 ; P7-AIX32-NEXT:    stw r5, -32(r1)
398 ; P7-AIX32-NEXT:    stw r4, -16(r1)
399 ; P7-AIX32-NEXT:    lwz r4, L..C2(r2) # %const.0
400 ; P7-AIX32-NEXT:    lxvw4x v2, 0, r4
401 ; P7-AIX32-NEXT:    addi r4, r1, -32
402 ; P7-AIX32-NEXT:    lxvw4x v3, 0, r4
403 ; P7-AIX32-NEXT:    addi r4, r1, -16
404 ; P7-AIX32-NEXT:    lxvw4x v4, 0, r4
405 ; P7-AIX32-NEXT:    vperm v2, v3, v4, v2
406 ; P7-AIX32-NEXT:    stxvw4x v2, 0, r3
407 ; P7-AIX32-NEXT:    blr
408 entry:
409   %0 = load i32, ptr %in, align 4
410   %conv = zext i32 %0 to i64
411   %splat.splatinsert.i = insertelement <2 x i64> poison, i64 %conv, i32 0
412   %splat.splat.i = shufflevector <2 x i64> %splat.splatinsert.i, <2 x i64> poison, <2 x i32> zeroinitializer
413   store <2 x i64> %splat.splat.i, ptr %a, align 16
414   ret void
417 ; v8i16
418 define void @test7(ptr %a, ptr %in) {
419 ; P9-LABEL: test7:
420 ; P9:       # %bb.0: # %entry
421 ; P9-NEXT:    lxsihzx v2, 0, r4
422 ; P9-NEXT:    vsplth v2, v2, 3
423 ; P9-NEXT:    stxv v2, 0(r3)
424 ; P9-NEXT:    blr
426 ; P8-LABEL: test7:
427 ; P8:       # %bb.0: # %entry
428 ; P8-NEXT:    lhzx r4, 0, r4
429 ; P8-NEXT:    mtvsrwz v2, r4
430 ; P8-NEXT:    vsplth v2, v2, 3
431 ; P8-NEXT:    xxswapd vs0, v2
432 ; P8-NEXT:    stxvd2x vs0, 0, r3
433 ; P8-NEXT:    blr
435 ; P7-LABEL: test7:
436 ; P7:       # %bb.0: # %entry
437 ; P7-NEXT:    li r5, 1
438 ; P7-NEXT:    lvx v2, 0, r4
439 ; P7-NEXT:    lvsl v4, 0, r4
440 ; P7-NEXT:    lvx v3, r5, r4
441 ; P7-NEXT:    vperm v2, v2, v3, v4
442 ; P7-NEXT:    vsplth v2, v2, 0
443 ; P7-NEXT:    stxvw4x v2, 0, r3
444 ; P7-NEXT:    blr
446 ; P9-AIX32-LABEL: test7:
447 ; P9-AIX32:       # %bb.0: # %entry
448 ; P9-AIX32-NEXT:    lxsihzx v2, 0, r4
449 ; P9-AIX32-NEXT:    vsplth v2, v2, 3
450 ; P9-AIX32-NEXT:    stxv v2, 0(r3)
451 ; P9-AIX32-NEXT:    blr
453 ; P8-AIX32-LABEL: test7:
454 ; P8-AIX32:       # %bb.0: # %entry
455 ; P8-AIX32-NEXT:    lhzx r4, 0, r4
456 ; P8-AIX32-NEXT:    mtvsrwz v2, r4
457 ; P8-AIX32-NEXT:    vsplth v2, v2, 3
458 ; P8-AIX32-NEXT:    stxvw4x v2, 0, r3
459 ; P8-AIX32-NEXT:    blr
461 ; P7-AIX32-LABEL: test7:
462 ; P7-AIX32:       # %bb.0: # %entry
463 ; P7-AIX32-NEXT:    li r5, 1
464 ; P7-AIX32-NEXT:    lvx v2, 0, r4
465 ; P7-AIX32-NEXT:    lvsl v4, 0, r4
466 ; P7-AIX32-NEXT:    lvx v3, r5, r4
467 ; P7-AIX32-NEXT:    vperm v2, v2, v3, v4
468 ; P7-AIX32-NEXT:    vsplth v2, v2, 0
469 ; P7-AIX32-NEXT:    stxvw4x v2, 0, r3
470 ; P7-AIX32-NEXT:    blr
471 entry:
472   %0 = load i16, ptr %in, align 2
473   %splat.splatinsert.i = insertelement <8 x i16> poison, i16 %0, i32 0
474   %splat.splat.i = shufflevector <8 x i16> %splat.splatinsert.i, <8 x i16> poison, <8 x i32> zeroinitializer
475   store <8 x i16> %splat.splat.i, ptr %a, align 16
476   ret void
479 ; v16i8
480 define void @test8(ptr %a, ptr %in) {
481 ; P9-LABEL: test8:
482 ; P9:       # %bb.0: # %entry
483 ; P9-NEXT:    lxsibzx v2, 0, r4
484 ; P9-NEXT:    vspltb v2, v2, 7
485 ; P9-NEXT:    stxv v2, 0(r3)
486 ; P9-NEXT:    blr
488 ; P8-LABEL: test8:
489 ; P8:       # %bb.0: # %entry
490 ; P8-NEXT:    lbzx r4, 0, r4
491 ; P8-NEXT:    mtvsrwz v2, r4
492 ; P8-NEXT:    vspltb v2, v2, 7
493 ; P8-NEXT:    xxswapd vs0, v2
494 ; P8-NEXT:    stxvd2x vs0, 0, r3
495 ; P8-NEXT:    blr
497 ; P7-LABEL: test8:
498 ; P7:       # %bb.0: # %entry
499 ; P7-NEXT:    lvsl v2, 0, r4
500 ; P7-NEXT:    lvx v3, 0, r4
501 ; P7-NEXT:    vperm v2, v3, v3, v2
502 ; P7-NEXT:    vspltb v2, v2, 0
503 ; P7-NEXT:    stxvw4x v2, 0, r3
504 ; P7-NEXT:    blr
506 ; P9-AIX32-LABEL: test8:
507 ; P9-AIX32:       # %bb.0: # %entry
508 ; P9-AIX32-NEXT:    lxsibzx v2, 0, r4
509 ; P9-AIX32-NEXT:    vspltb v2, v2, 7
510 ; P9-AIX32-NEXT:    stxv v2, 0(r3)
511 ; P9-AIX32-NEXT:    blr
513 ; P8-AIX32-LABEL: test8:
514 ; P8-AIX32:       # %bb.0: # %entry
515 ; P8-AIX32-NEXT:    lbzx r4, 0, r4
516 ; P8-AIX32-NEXT:    mtvsrwz v2, r4
517 ; P8-AIX32-NEXT:    vspltb v2, v2, 7
518 ; P8-AIX32-NEXT:    stxvw4x v2, 0, r3
519 ; P8-AIX32-NEXT:    blr
521 ; P7-AIX32-LABEL: test8:
522 ; P7-AIX32:       # %bb.0: # %entry
523 ; P7-AIX32-NEXT:    lvsl v2, 0, r4
524 ; P7-AIX32-NEXT:    lvx v3, 0, r4
525 ; P7-AIX32-NEXT:    vperm v2, v3, v3, v2
526 ; P7-AIX32-NEXT:    vspltb v2, v2, 0
527 ; P7-AIX32-NEXT:    stxvw4x v2, 0, r3
528 ; P7-AIX32-NEXT:    blr
529 entry:
530   %0 = load i8, ptr %in, align 1
531   %splat.splatinsert.i = insertelement <16 x i8> poison, i8 %0, i32 0
532   %splat.splat.i = shufflevector <16 x i8> %splat.splatinsert.i, <16 x i8> poison, <16 x i32> zeroinitializer
533   store <16 x i8> %splat.splat.i, ptr %a, align 16
534   ret void
537 define <16 x i8> @unadjusted_lxvwsx(ptr %s, ptr %t) {
538 ; P9-LABEL: unadjusted_lxvwsx:
539 ; P9:       # %bb.0: # %entry
540 ; P9-NEXT:    lxvwsx v2, 0, r3
541 ; P9-NEXT:    blr
543 ; P8-LABEL: unadjusted_lxvwsx:
544 ; P8:       # %bb.0: # %entry
545 ; P8-NEXT:    lfiwzx f0, 0, r3
546 ; P8-NEXT:    xxspltw v2, vs0, 1
547 ; P8-NEXT:    blr
549 ; P7-LABEL: unadjusted_lxvwsx:
550 ; P7:       # %bb.0: # %entry
551 ; P7-NEXT:    lfiwzx f0, 0, r3
552 ; P7-NEXT:    xxspltw v2, vs0, 1
553 ; P7-NEXT:    blr
555 ; P9-AIX32-LABEL: unadjusted_lxvwsx:
556 ; P9-AIX32:       # %bb.0: # %entry
557 ; P9-AIX32-NEXT:    lxvwsx v2, 0, r3
558 ; P9-AIX32-NEXT:    blr
560 ; P8-AIX32-LABEL: unadjusted_lxvwsx:
561 ; P8-AIX32:       # %bb.0: # %entry
562 ; P8-AIX32-NEXT:    lfiwzx f0, 0, r3
563 ; P8-AIX32-NEXT:    xxspltw v2, vs0, 1
564 ; P8-AIX32-NEXT:    blr
566 ; P7-AIX32-LABEL: unadjusted_lxvwsx:
567 ; P7-AIX32:       # %bb.0: # %entry
568 ; P7-AIX32-NEXT:    lfiwzx f0, 0, r3
569 ; P7-AIX32-NEXT:    xxspltw v2, vs0, 1
570 ; P7-AIX32-NEXT:    blr
571   entry:
572     %0 = load <4 x i8>, ptr %s, align 4
573     %1 = shufflevector <4 x i8> %0, <4 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
574     ret <16 x i8> %1
577 define <16 x i8> @adjusted_lxvwsx(ptr %s, ptr %t) {
578 ; P9-LABEL: adjusted_lxvwsx:
579 ; P9:       # %bb.0: # %entry
580 ; P9-NEXT:    addi r3, r3, 4
581 ; P9-NEXT:    lxvwsx v2, 0, r3
582 ; P9-NEXT:    blr
584 ; P8-LABEL: adjusted_lxvwsx:
585 ; P8:       # %bb.0: # %entry
586 ; P8-NEXT:    lfdx f0, 0, r3
587 ; P8-NEXT:    xxspltw v2, vs0, 0
588 ; P8-NEXT:    blr
590 ; P7-LABEL: adjusted_lxvwsx:
591 ; P7:       # %bb.0: # %entry
592 ; P7-NEXT:    ld r3, 0(r3)
593 ; P7-NEXT:    std r3, -16(r1)
594 ; P7-NEXT:    addi r3, r1, -16
595 ; P7-NEXT:    lxvw4x vs0, 0, r3
596 ; P7-NEXT:    xxspltw v2, vs0, 1
597 ; P7-NEXT:    blr
599 ; P9-AIX32-LABEL: adjusted_lxvwsx:
600 ; P9-AIX32:       # %bb.0: # %entry
601 ; P9-AIX32-NEXT:    addi r3, r3, 4
602 ; P9-AIX32-NEXT:    lxvwsx v2, 0, r3
603 ; P9-AIX32-NEXT:    blr
605 ; P8-AIX32-LABEL: adjusted_lxvwsx:
606 ; P8-AIX32:       # %bb.0: # %entry
607 ; P8-AIX32-NEXT:    addi r3, r3, 4
608 ; P8-AIX32-NEXT:    lfiwzx f0, 0, r3
609 ; P8-AIX32-NEXT:    xxspltw v2, vs0, 1
610 ; P8-AIX32-NEXT:    blr
612 ; P7-AIX32-LABEL: adjusted_lxvwsx:
613 ; P7-AIX32:       # %bb.0: # %entry
614 ; P7-AIX32-NEXT:    addi r3, r3, 4
615 ; P7-AIX32-NEXT:    lfiwzx f0, 0, r3
616 ; P7-AIX32-NEXT:    xxspltw v2, vs0, 1
617 ; P7-AIX32-NEXT:    blr
618   entry:
619     %0 = load <8 x i8>, ptr %s, align 8
620     %1 = shufflevector <8 x i8> %0, <8 x i8> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7>
621     ret <16 x i8> %1
624 define <16 x i8> @unadjusted_lxvwsx_v16i8(ptr %s, <16 x i8> %t) {
625 ; P9-LABEL: unadjusted_lxvwsx_v16i8:
626 ; P9:       # %bb.0: # %entry
627 ; P9-NEXT:    lxvwsx v2, 0, r3
628 ; P9-NEXT:    blr
630 ; P8-LABEL: unadjusted_lxvwsx_v16i8:
631 ; P8:       # %bb.0: # %entry
632 ; P8-NEXT:    lxvd2x vs0, 0, r3
633 ; P8-NEXT:    xxswapd v2, vs0
634 ; P8-NEXT:    xxspltw v2, v2, 3
635 ; P8-NEXT:    blr
637 ; P7-LABEL: unadjusted_lxvwsx_v16i8:
638 ; P7:       # %bb.0: # %entry
639 ; P7-NEXT:    lxvw4x vs0, 0, r3
640 ; P7-NEXT:    xxspltw v2, vs0, 0
641 ; P7-NEXT:    blr
643 ; P9-AIX32-LABEL: unadjusted_lxvwsx_v16i8:
644 ; P9-AIX32:       # %bb.0: # %entry
645 ; P9-AIX32-NEXT:    lxvwsx v2, 0, r3
646 ; P9-AIX32-NEXT:    blr
648 ; P8-AIX32-LABEL: unadjusted_lxvwsx_v16i8:
649 ; P8-AIX32:       # %bb.0: # %entry
650 ; P8-AIX32-NEXT:    lxvw4x vs0, 0, r3
651 ; P8-AIX32-NEXT:    xxspltw v2, vs0, 0
652 ; P8-AIX32-NEXT:    blr
654 ; P7-AIX32-LABEL: unadjusted_lxvwsx_v16i8:
655 ; P7-AIX32:       # %bb.0: # %entry
656 ; P7-AIX32-NEXT:    lxvw4x vs0, 0, r3
657 ; P7-AIX32-NEXT:    xxspltw v2, vs0, 0
658 ; P7-AIX32-NEXT:    blr
659   entry:
660     %0 = load <16 x i8>, ptr %s, align 16
661     %1 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
662     ret <16 x i8> %1
665 define <16 x i8> @adjusted_lxvwsx_v16i8(ptr %s, <16 x i8> %t) {
666 ; P9-LABEL: adjusted_lxvwsx_v16i8:
667 ; P9:       # %bb.0: # %entry
668 ; P9-NEXT:    addi r3, r3, 4
669 ; P9-NEXT:    lxvwsx v2, 0, r3
670 ; P9-NEXT:    blr
672 ; P8-LABEL: adjusted_lxvwsx_v16i8:
673 ; P8:       # %bb.0: # %entry
674 ; P8-NEXT:    lxvd2x vs0, 0, r3
675 ; P8-NEXT:    xxswapd v2, vs0
676 ; P8-NEXT:    xxspltw v2, v2, 2
677 ; P8-NEXT:    blr
679 ; P7-LABEL: adjusted_lxvwsx_v16i8:
680 ; P7:       # %bb.0: # %entry
681 ; P7-NEXT:    lxvw4x vs0, 0, r3
682 ; P7-NEXT:    xxspltw v2, vs0, 1
683 ; P7-NEXT:    blr
685 ; P9-AIX32-LABEL: adjusted_lxvwsx_v16i8:
686 ; P9-AIX32:       # %bb.0: # %entry
687 ; P9-AIX32-NEXT:    addi r3, r3, 4
688 ; P9-AIX32-NEXT:    lxvwsx v2, 0, r3
689 ; P9-AIX32-NEXT:    blr
691 ; P8-AIX32-LABEL: adjusted_lxvwsx_v16i8:
692 ; P8-AIX32:       # %bb.0: # %entry
693 ; P8-AIX32-NEXT:    lxvw4x vs0, 0, r3
694 ; P8-AIX32-NEXT:    xxspltw v2, vs0, 1
695 ; P8-AIX32-NEXT:    blr
697 ; P7-AIX32-LABEL: adjusted_lxvwsx_v16i8:
698 ; P7-AIX32:       # %bb.0: # %entry
699 ; P7-AIX32-NEXT:    lxvw4x vs0, 0, r3
700 ; P7-AIX32-NEXT:    xxspltw v2, vs0, 1
701 ; P7-AIX32-NEXT:    blr
702   entry:
703     %0 = load <16 x i8>, ptr %s, align 16
704     %1 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7>
705     ret <16 x i8> %1
708 define <16 x i8> @adjusted_lxvwsx_v16i8_2(ptr %s, <16 x i8> %t) {
709 ; P9-LABEL: adjusted_lxvwsx_v16i8_2:
710 ; P9:       # %bb.0: # %entry
711 ; P9-NEXT:    addi r3, r3, 8
712 ; P9-NEXT:    lxvwsx v2, 0, r3
713 ; P9-NEXT:    blr
715 ; P8-LABEL: adjusted_lxvwsx_v16i8_2:
716 ; P8:       # %bb.0: # %entry
717 ; P8-NEXT:    lxvd2x vs0, 0, r3
718 ; P8-NEXT:    xxswapd v2, vs0
719 ; P8-NEXT:    xxspltw v2, v2, 1
720 ; P8-NEXT:    blr
722 ; P7-LABEL: adjusted_lxvwsx_v16i8_2:
723 ; P7:       # %bb.0: # %entry
724 ; P7-NEXT:    lxvw4x vs0, 0, r3
725 ; P7-NEXT:    xxspltw v2, vs0, 2
726 ; P7-NEXT:    blr
728 ; P9-AIX32-LABEL: adjusted_lxvwsx_v16i8_2:
729 ; P9-AIX32:       # %bb.0: # %entry
730 ; P9-AIX32-NEXT:    addi r3, r3, 8
731 ; P9-AIX32-NEXT:    lxvwsx v2, 0, r3
732 ; P9-AIX32-NEXT:    blr
734 ; P8-AIX32-LABEL: adjusted_lxvwsx_v16i8_2:
735 ; P8-AIX32:       # %bb.0: # %entry
736 ; P8-AIX32-NEXT:    lxvw4x vs0, 0, r3
737 ; P8-AIX32-NEXT:    xxspltw v2, vs0, 2
738 ; P8-AIX32-NEXT:    blr
740 ; P7-AIX32-LABEL: adjusted_lxvwsx_v16i8_2:
741 ; P7-AIX32:       # %bb.0: # %entry
742 ; P7-AIX32-NEXT:    lxvw4x vs0, 0, r3
743 ; P7-AIX32-NEXT:    xxspltw v2, vs0, 2
744 ; P7-AIX32-NEXT:    blr
745   entry:
746     %0 = load <16 x i8>, ptr %s, align 16
747     %1 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 8, i32 9, i32 10, i32 11, i32 8, i32 9, i32 10, i32 11, i32 8, i32 9, i32 10, i32 11>
748     ret <16 x i8> %1
751 define <16 x i8> @adjusted_lxvwsx_v16i8_3(ptr %s, <16 x i8> %t) {
752 ; P9-LABEL: adjusted_lxvwsx_v16i8_3:
753 ; P9:       # %bb.0: # %entry
754 ; P9-NEXT:    addi r3, r3, 12
755 ; P9-NEXT:    lxvwsx v2, 0, r3
756 ; P9-NEXT:    blr
758 ; P8-LABEL: adjusted_lxvwsx_v16i8_3:
759 ; P8:       # %bb.0: # %entry
760 ; P8-NEXT:    lxvd2x vs0, 0, r3
761 ; P8-NEXT:    xxswapd v2, vs0
762 ; P8-NEXT:    xxspltw v2, v2, 0
763 ; P8-NEXT:    blr
765 ; P7-LABEL: adjusted_lxvwsx_v16i8_3:
766 ; P7:       # %bb.0: # %entry
767 ; P7-NEXT:    lxvw4x vs0, 0, r3
768 ; P7-NEXT:    xxspltw v2, vs0, 3
769 ; P7-NEXT:    blr
771 ; P9-AIX32-LABEL: adjusted_lxvwsx_v16i8_3:
772 ; P9-AIX32:       # %bb.0: # %entry
773 ; P9-AIX32-NEXT:    addi r3, r3, 12
774 ; P9-AIX32-NEXT:    lxvwsx v2, 0, r3
775 ; P9-AIX32-NEXT:    blr
777 ; P8-AIX32-LABEL: adjusted_lxvwsx_v16i8_3:
778 ; P8-AIX32:       # %bb.0: # %entry
779 ; P8-AIX32-NEXT:    lxvw4x vs0, 0, r3
780 ; P8-AIX32-NEXT:    xxspltw v2, vs0, 3
781 ; P8-AIX32-NEXT:    blr
783 ; P7-AIX32-LABEL: adjusted_lxvwsx_v16i8_3:
784 ; P7-AIX32:       # %bb.0: # %entry
785 ; P7-AIX32-NEXT:    lxvw4x vs0, 0, r3
786 ; P7-AIX32-NEXT:    xxspltw v2, vs0, 3
787 ; P7-AIX32-NEXT:    blr
788   entry:
789     %0 = load <16 x i8>, ptr %s, align 16
790     %1 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> <i32 12, i32 13, i32 14, i32 15, i32 12, i32 13, i32 14, i32 15, i32 12, i32 13, i32 14, i32 15, i32 12, i32 13, i32 14, i32 15>
791     ret <16 x i8> %1
794 define <16 x i8> @unadjusted_lxvdsx(ptr %s, ptr %t) {
795 ; P9-LABEL: unadjusted_lxvdsx:
796 ; P9:       # %bb.0: # %entry
797 ; P9-NEXT:    lxvdsx v2, 0, r3
798 ; P9-NEXT:    blr
800 ; P8-LABEL: unadjusted_lxvdsx:
801 ; P8:       # %bb.0: # %entry
802 ; P8-NEXT:    lxvdsx v2, 0, r3
803 ; P8-NEXT:    blr
805 ; P7-LABEL: unadjusted_lxvdsx:
806 ; P7:       # %bb.0: # %entry
807 ; P7-NEXT:    lxvdsx v2, 0, r3
808 ; P7-NEXT:    blr
810 ; P9-AIX32-LABEL: unadjusted_lxvdsx:
811 ; P9-AIX32:       # %bb.0: # %entry
812 ; P9-AIX32-NEXT:    lwz r4, 4(r3)
813 ; P9-AIX32-NEXT:    stw r4, -16(r1)
814 ; P9-AIX32-NEXT:    lwz r3, 0(r3)
815 ; P9-AIX32-NEXT:    lxv vs0, -16(r1)
816 ; P9-AIX32-NEXT:    stw r3, -32(r1)
817 ; P9-AIX32-NEXT:    lxv vs1, -32(r1)
818 ; P9-AIX32-NEXT:    xxmrghw vs0, vs1, vs0
819 ; P9-AIX32-NEXT:    xxmrghd v2, vs0, vs0
820 ; P9-AIX32-NEXT:    blr
822 ; P8-AIX32-LABEL: unadjusted_lxvdsx:
823 ; P8-AIX32:       # %bb.0: # %entry
824 ; P8-AIX32-NEXT:    lwz r4, 4(r3)
825 ; P8-AIX32-NEXT:    stw r4, -16(r1)
826 ; P8-AIX32-NEXT:    lwz r3, 0(r3)
827 ; P8-AIX32-NEXT:    stw r3, -32(r1)
828 ; P8-AIX32-NEXT:    addi r3, r1, -16
829 ; P8-AIX32-NEXT:    lxvw4x vs0, 0, r3
830 ; P8-AIX32-NEXT:    addi r3, r1, -32
831 ; P8-AIX32-NEXT:    lxvw4x vs1, 0, r3
832 ; P8-AIX32-NEXT:    xxmrghw vs0, vs1, vs0
833 ; P8-AIX32-NEXT:    xxmrghd v2, vs0, vs0
834 ; P8-AIX32-NEXT:    blr
836 ; P7-AIX32-LABEL: unadjusted_lxvdsx:
837 ; P7-AIX32:       # %bb.0: # %entry
838 ; P7-AIX32-NEXT:    lwz r4, 4(r3)
839 ; P7-AIX32-NEXT:    stw r4, -16(r1)
840 ; P7-AIX32-NEXT:    lwz r3, 0(r3)
841 ; P7-AIX32-NEXT:    stw r3, -32(r1)
842 ; P7-AIX32-NEXT:    addi r3, r1, -16
843 ; P7-AIX32-NEXT:    lxvw4x vs0, 0, r3
844 ; P7-AIX32-NEXT:    addi r3, r1, -32
845 ; P7-AIX32-NEXT:    lxvw4x vs1, 0, r3
846 ; P7-AIX32-NEXT:    xxmrghw vs0, vs1, vs0
847 ; P7-AIX32-NEXT:    xxmrghd v2, vs0, vs0
848 ; P7-AIX32-NEXT:    blr
849   entry:
850     %0 = load <8 x i8>, ptr %s, align 8
851     %1 = shufflevector <8 x i8> %0, <8 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
852     ret <16 x i8> %1
855 define <16 x i8> @unadjusted_lxvdsx_v16i8(ptr %s, <16 x i8> %t) {
856 ; P9-LABEL: unadjusted_lxvdsx_v16i8:
857 ; P9:       # %bb.0: # %entry
858 ; P9-NEXT:    lxvdsx v2, 0, r3
859 ; P9-NEXT:    blr
861 ; P8-LABEL: unadjusted_lxvdsx_v16i8:
862 ; P8:       # %bb.0: # %entry
863 ; P8-NEXT:    lxvdsx v2, 0, r3
864 ; P8-NEXT:    blr
866 ; P7-LABEL: unadjusted_lxvdsx_v16i8:
867 ; P7:       # %bb.0: # %entry
868 ; P7-NEXT:    lxvdsx v2, 0, r3
869 ; P7-NEXT:    blr
871 ; P9-AIX32-LABEL: unadjusted_lxvdsx_v16i8:
872 ; P9-AIX32:       # %bb.0: # %entry
873 ; P9-AIX32-NEXT:    lxvdsx v2, 0, r3
874 ; P9-AIX32-NEXT:    blr
876 ; P8-AIX32-LABEL: unadjusted_lxvdsx_v16i8:
877 ; P8-AIX32:       # %bb.0: # %entry
878 ; P8-AIX32-NEXT:    lxvdsx v2, 0, r3
879 ; P8-AIX32-NEXT:    blr
881 ; P7-AIX32-LABEL: unadjusted_lxvdsx_v16i8:
882 ; P7-AIX32:       # %bb.0: # %entry
883 ; P7-AIX32-NEXT:    lxvdsx v2, 0, r3
884 ; P7-AIX32-NEXT:    blr
885   entry:
886     %0 = load <16 x i8>, ptr %s, align 16
887     %1 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
888     ret <16 x i8> %1
891 define <16 x i8> @adjusted_lxvdsx_v16i8(ptr %s, <16 x i8> %t) {
892 ; P9-LABEL: adjusted_lxvdsx_v16i8:
893 ; P9:       # %bb.0: # %entry
894 ; P9-NEXT:    addi r3, r3, 8
895 ; P9-NEXT:    lxvdsx v2, 0, r3
896 ; P9-NEXT:    blr
898 ; P8-LABEL: adjusted_lxvdsx_v16i8:
899 ; P8:       # %bb.0: # %entry
900 ; P8-NEXT:    addi r3, r3, 8
901 ; P8-NEXT:    lxvdsx v2, 0, r3
902 ; P8-NEXT:    blr
904 ; P7-LABEL: adjusted_lxvdsx_v16i8:
905 ; P7:       # %bb.0: # %entry
906 ; P7-NEXT:    addi r3, r3, 8
907 ; P7-NEXT:    lxvdsx v2, 0, r3
908 ; P7-NEXT:    blr
910 ; P9-AIX32-LABEL: adjusted_lxvdsx_v16i8:
911 ; P9-AIX32:       # %bb.0: # %entry
912 ; P9-AIX32-NEXT:    addi r3, r3, 8
913 ; P9-AIX32-NEXT:    lxvdsx v2, 0, r3
914 ; P9-AIX32-NEXT:    blr
916 ; P8-AIX32-LABEL: adjusted_lxvdsx_v16i8:
917 ; P8-AIX32:       # %bb.0: # %entry
918 ; P8-AIX32-NEXT:    addi r3, r3, 8
919 ; P8-AIX32-NEXT:    lxvdsx v2, 0, r3
920 ; P8-AIX32-NEXT:    blr
922 ; P7-AIX32-LABEL: adjusted_lxvdsx_v16i8:
923 ; P7-AIX32:       # %bb.0: # %entry
924 ; P7-AIX32-NEXT:    addi r3, r3, 8
925 ; P7-AIX32-NEXT:    lxvdsx v2, 0, r3
926 ; P7-AIX32-NEXT:    blr
927   entry:
928     %0 = load <16 x i8>, ptr %s, align 16
929     %1 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
930     ret <16 x i8> %1
933 define <8 x i16> @test_unaligned_v8i16(ptr %Ptr) {
934 ; P9-LABEL: test_unaligned_v8i16:
935 ; P9:       # %bb.0: # %entry
936 ; P9-NEXT:    addi r3, r3, 6
937 ; P9-NEXT:    lxsihzx v2, 0, r3
938 ; P9-NEXT:    vsplth v2, v2, 3
939 ; P9-NEXT:    blr
941 ; P8-LABEL: test_unaligned_v8i16:
942 ; P8:       # %bb.0: # %entry
943 ; P8-NEXT:    lhz r3, 6(r3)
944 ; P8-NEXT:    mtvsrwz v2, r3
945 ; P8-NEXT:    vsplth v2, v2, 3
946 ; P8-NEXT:    blr
948 ; P7-LABEL: test_unaligned_v8i16:
949 ; P7:       # %bb.0: # %entry
950 ; P7-NEXT:    addi r3, r3, 6
951 ; P7-NEXT:    li r4, 1
952 ; P7-NEXT:    lvx v2, 0, r3
953 ; P7-NEXT:    lvx v3, r4, r3
954 ; P7-NEXT:    lvsl v4, 0, r3
955 ; P7-NEXT:    vperm v2, v2, v3, v4
956 ; P7-NEXT:    vsplth v2, v2, 0
957 ; P7-NEXT:    blr
959 ; P9-AIX32-LABEL: test_unaligned_v8i16:
960 ; P9-AIX32:       # %bb.0: # %entry
961 ; P9-AIX32-NEXT:    addi r3, r3, 6
962 ; P9-AIX32-NEXT:    lxsihzx v2, 0, r3
963 ; P9-AIX32-NEXT:    vsplth v2, v2, 3
964 ; P9-AIX32-NEXT:    blr
966 ; P8-AIX32-LABEL: test_unaligned_v8i16:
967 ; P8-AIX32:       # %bb.0: # %entry
968 ; P8-AIX32-NEXT:    lhz r3, 6(r3)
969 ; P8-AIX32-NEXT:    mtvsrwz v2, r3
970 ; P8-AIX32-NEXT:    vsplth v2, v2, 3
971 ; P8-AIX32-NEXT:    blr
973 ; P7-AIX32-LABEL: test_unaligned_v8i16:
974 ; P7-AIX32:       # %bb.0: # %entry
975 ; P7-AIX32-NEXT:    addi r3, r3, 6
976 ; P7-AIX32-NEXT:    li r4, 1
977 ; P7-AIX32-NEXT:    lvx v2, 0, r3
978 ; P7-AIX32-NEXT:    lvx v3, r4, r3
979 ; P7-AIX32-NEXT:    lvsl v4, 0, r3
980 ; P7-AIX32-NEXT:    vperm v2, v2, v3, v4
981 ; P7-AIX32-NEXT:    vsplth v2, v2, 0
982 ; P7-AIX32-NEXT:    blr
983 entry:
984   %add.ptr = getelementptr inbounds i16, ptr %Ptr, i64 3
985   %0 = load i16, ptr %add.ptr, align 16
986   %splat.splatinsert = insertelement <8 x i16> poison, i16 %0, i32 0
987   %splat.splat = shufflevector <8 x i16> %splat.splatinsert, <8 x i16> poison, <8 x i32> zeroinitializer
988   ret <8 x i16> %splat.splat
991 define <16 x i8> @test_unaligned_v16i8(ptr %Ptr) {
992 ; P9-LABEL: test_unaligned_v16i8:
993 ; P9:       # %bb.0: # %entry
994 ; P9-NEXT:    addi r3, r3, 3
995 ; P9-NEXT:    lxsibzx v2, 0, r3
996 ; P9-NEXT:    vspltb v2, v2, 7
997 ; P9-NEXT:    blr
999 ; P8-LABEL: test_unaligned_v16i8:
1000 ; P8:       # %bb.0: # %entry
1001 ; P8-NEXT:    lbz r3, 3(r3)
1002 ; P8-NEXT:    mtvsrwz v2, r3
1003 ; P8-NEXT:    vspltb v2, v2, 7
1004 ; P8-NEXT:    blr
1006 ; P7-LABEL: test_unaligned_v16i8:
1007 ; P7:       # %bb.0: # %entry
1008 ; P7-NEXT:    addi r3, r3, 3
1009 ; P7-NEXT:    lvsl v2, 0, r3
1010 ; P7-NEXT:    lvx v3, 0, r3
1011 ; P7-NEXT:    vperm v2, v3, v3, v2
1012 ; P7-NEXT:    vspltb v2, v2, 0
1013 ; P7-NEXT:    blr
1015 ; P9-AIX32-LABEL: test_unaligned_v16i8:
1016 ; P9-AIX32:       # %bb.0: # %entry
1017 ; P9-AIX32-NEXT:    addi r3, r3, 3
1018 ; P9-AIX32-NEXT:    lxsibzx v2, 0, r3
1019 ; P9-AIX32-NEXT:    vspltb v2, v2, 7
1020 ; P9-AIX32-NEXT:    blr
1022 ; P8-AIX32-LABEL: test_unaligned_v16i8:
1023 ; P8-AIX32:       # %bb.0: # %entry
1024 ; P8-AIX32-NEXT:    lbz r3, 3(r3)
1025 ; P8-AIX32-NEXT:    mtvsrwz v2, r3
1026 ; P8-AIX32-NEXT:    vspltb v2, v2, 7
1027 ; P8-AIX32-NEXT:    blr
1029 ; P7-AIX32-LABEL: test_unaligned_v16i8:
1030 ; P7-AIX32:       # %bb.0: # %entry
1031 ; P7-AIX32-NEXT:    addi r3, r3, 3
1032 ; P7-AIX32-NEXT:    lvsl v2, 0, r3
1033 ; P7-AIX32-NEXT:    lvx v3, 0, r3
1034 ; P7-AIX32-NEXT:    vperm v2, v3, v3, v2
1035 ; P7-AIX32-NEXT:    vspltb v2, v2, 0
1036 ; P7-AIX32-NEXT:    blr
1037 entry:
1038   %add.ptr = getelementptr inbounds i8, ptr %Ptr, i64 3
1039   %0 = load i8, ptr %add.ptr, align 16
1040   %splat.splatinsert = insertelement <16 x i8> poison, i8 %0, i32 0
1041   %splat.splat = shufflevector <16 x i8> %splat.splatinsert, <16 x i8> poison, <16 x i32> zeroinitializer
1042   ret <16 x i8> %splat.splat
1045 define <8 x i16> @test_aligned_v8i16_1(ptr %Ptr) {
1046 ; P9-LABEL: test_aligned_v8i16_1:
1047 ; P9:       # %bb.0: # %entry
1048 ; P9-NEXT:    lxsihzx v2, 0, r3
1049 ; P9-NEXT:    vsplth v2, v2, 3
1050 ; P9-NEXT:    blr
1052 ; P8-LABEL: test_aligned_v8i16_1:
1053 ; P8:       # %bb.0: # %entry
1054 ; P8-NEXT:    lvx v2, 0, r3
1055 ; P8-NEXT:    vsplth v2, v2, 7
1056 ; P8-NEXT:    blr
1058 ; P7-LABEL: test_aligned_v8i16_1:
1059 ; P7:       # %bb.0: # %entry
1060 ; P7-NEXT:    lvx v2, 0, r3
1061 ; P7-NEXT:    vsplth v2, v2, 0
1062 ; P7-NEXT:    blr
1064 ; P9-AIX32-LABEL: test_aligned_v8i16_1:
1065 ; P9-AIX32:       # %bb.0: # %entry
1066 ; P9-AIX32-NEXT:    lxsihzx v2, 0, r3
1067 ; P9-AIX32-NEXT:    vsplth v2, v2, 3
1068 ; P9-AIX32-NEXT:    blr
1070 ; P8-AIX32-LABEL: test_aligned_v8i16_1:
1071 ; P8-AIX32:       # %bb.0: # %entry
1072 ; P8-AIX32-NEXT:    lvx v2, 0, r3
1073 ; P8-AIX32-NEXT:    vsplth v2, v2, 0
1074 ; P8-AIX32-NEXT:    blr
1076 ; P7-AIX32-LABEL: test_aligned_v8i16_1:
1077 ; P7-AIX32:       # %bb.0: # %entry
1078 ; P7-AIX32-NEXT:    lvx v2, 0, r3
1079 ; P7-AIX32-NEXT:    vsplth v2, v2, 0
1080 ; P7-AIX32-NEXT:    blr
1081 entry:
1082   %0 = load i16, ptr %Ptr, align 16
1083   %splat.splatinsert = insertelement <8 x i16> poison, i16 %0, i32 0
1084   %splat.splat = shufflevector <8 x i16> %splat.splatinsert, <8 x i16> poison, <8 x i32> zeroinitializer
1085   ret <8 x i16> %splat.splat
1088 define <8 x i16> @test_aligned_v8i16_2(ptr %Ptr) {
1089 ; P9-LABEL: test_aligned_v8i16_2:
1090 ; P9:       # %bb.0: # %entry
1091 ; P9-NEXT:    addi r3, r3, 32
1092 ; P9-NEXT:    lxsihzx v2, 0, r3
1093 ; P9-NEXT:    vsplth v2, v2, 3
1094 ; P9-NEXT:    blr
1096 ; P8-LABEL: test_aligned_v8i16_2:
1097 ; P8:       # %bb.0: # %entry
1098 ; P8-NEXT:    addi r3, r3, 32
1099 ; P8-NEXT:    lvx v2, 0, r3
1100 ; P8-NEXT:    vsplth v2, v2, 7
1101 ; P8-NEXT:    blr
1103 ; P7-LABEL: test_aligned_v8i16_2:
1104 ; P7:       # %bb.0: # %entry
1105 ; P7-NEXT:    addi r3, r3, 32
1106 ; P7-NEXT:    lvx v2, 0, r3
1107 ; P7-NEXT:    vsplth v2, v2, 0
1108 ; P7-NEXT:    blr
1110 ; P9-AIX32-LABEL: test_aligned_v8i16_2:
1111 ; P9-AIX32:       # %bb.0: # %entry
1112 ; P9-AIX32-NEXT:    addi r3, r3, 32
1113 ; P9-AIX32-NEXT:    lxsihzx v2, 0, r3
1114 ; P9-AIX32-NEXT:    vsplth v2, v2, 3
1115 ; P9-AIX32-NEXT:    blr
1117 ; P8-AIX32-LABEL: test_aligned_v8i16_2:
1118 ; P8-AIX32:       # %bb.0: # %entry
1119 ; P8-AIX32-NEXT:    addi r3, r3, 32
1120 ; P8-AIX32-NEXT:    lvx v2, 0, r3
1121 ; P8-AIX32-NEXT:    vsplth v2, v2, 0
1122 ; P8-AIX32-NEXT:    blr
1124 ; P7-AIX32-LABEL: test_aligned_v8i16_2:
1125 ; P7-AIX32:       # %bb.0: # %entry
1126 ; P7-AIX32-NEXT:    addi r3, r3, 32
1127 ; P7-AIX32-NEXT:    lvx v2, 0, r3
1128 ; P7-AIX32-NEXT:    vsplth v2, v2, 0
1129 ; P7-AIX32-NEXT:    blr
1130 entry:
1131   %add.ptr = getelementptr inbounds i16, ptr %Ptr, i64 16
1132   %0 = load i16, ptr %add.ptr, align 16
1133   %splat.splatinsert = insertelement <8 x i16> poison, i16 %0, i32 0
1134   %splat.splat = shufflevector <8 x i16> %splat.splatinsert, <8 x i16> poison, <8 x i32> zeroinitializer
1135   ret <8 x i16> %splat.splat
1138 define <16 x i8> @test_aligned_v16i8_1(ptr %Ptr) {
1139 ; P9-LABEL: test_aligned_v16i8_1:
1140 ; P9:       # %bb.0: # %entry
1141 ; P9-NEXT:    lxsibzx v2, 0, r3
1142 ; P9-NEXT:    vspltb v2, v2, 7
1143 ; P9-NEXT:    blr
1145 ; P8-LABEL: test_aligned_v16i8_1:
1146 ; P8:       # %bb.0: # %entry
1147 ; P8-NEXT:    lvx v2, 0, r3
1148 ; P8-NEXT:    vspltb v2, v2, 15
1149 ; P8-NEXT:    blr
1151 ; P7-LABEL: test_aligned_v16i8_1:
1152 ; P7:       # %bb.0: # %entry
1153 ; P7-NEXT:    lvx v2, 0, r3
1154 ; P7-NEXT:    vspltb v2, v2, 0
1155 ; P7-NEXT:    blr
1157 ; P9-AIX32-LABEL: test_aligned_v16i8_1:
1158 ; P9-AIX32:       # %bb.0: # %entry
1159 ; P9-AIX32-NEXT:    lxsibzx v2, 0, r3
1160 ; P9-AIX32-NEXT:    vspltb v2, v2, 7
1161 ; P9-AIX32-NEXT:    blr
1163 ; P8-AIX32-LABEL: test_aligned_v16i8_1:
1164 ; P8-AIX32:       # %bb.0: # %entry
1165 ; P8-AIX32-NEXT:    lvx v2, 0, r3
1166 ; P8-AIX32-NEXT:    vspltb v2, v2, 0
1167 ; P8-AIX32-NEXT:    blr
1169 ; P7-AIX32-LABEL: test_aligned_v16i8_1:
1170 ; P7-AIX32:       # %bb.0: # %entry
1171 ; P7-AIX32-NEXT:    lvx v2, 0, r3
1172 ; P7-AIX32-NEXT:    vspltb v2, v2, 0
1173 ; P7-AIX32-NEXT:    blr
1174 entry:
1175   %0 = load i8, ptr %Ptr, align 16
1176   %splat.splatinsert = insertelement <16 x i8> poison, i8 %0, i32 0
1177   %splat.splat = shufflevector <16 x i8> %splat.splatinsert, <16 x i8> poison, <16 x i32> zeroinitializer
1178   ret <16 x i8> %splat.splat
1181 define <16 x i8> @test_aligned_v16i8_2(ptr %Ptr) {
1182 ; P9-LABEL: test_aligned_v16i8_2:
1183 ; P9:       # %bb.0: # %entry
1184 ; P9-NEXT:    addi r3, r3, 16
1185 ; P9-NEXT:    lxsibzx v2, 0, r3
1186 ; P9-NEXT:    vspltb v2, v2, 7
1187 ; P9-NEXT:    blr
1189 ; P8-LABEL: test_aligned_v16i8_2:
1190 ; P8:       # %bb.0: # %entry
1191 ; P8-NEXT:    addi r3, r3, 16
1192 ; P8-NEXT:    lvx v2, 0, r3
1193 ; P8-NEXT:    vspltb v2, v2, 15
1194 ; P8-NEXT:    blr
1196 ; P7-LABEL: test_aligned_v16i8_2:
1197 ; P7:       # %bb.0: # %entry
1198 ; P7-NEXT:    addi r3, r3, 16
1199 ; P7-NEXT:    lvx v2, 0, r3
1200 ; P7-NEXT:    vspltb v2, v2, 0
1201 ; P7-NEXT:    blr
1203 ; P9-AIX32-LABEL: test_aligned_v16i8_2:
1204 ; P9-AIX32:       # %bb.0: # %entry
1205 ; P9-AIX32-NEXT:    addi r3, r3, 16
1206 ; P9-AIX32-NEXT:    lxsibzx v2, 0, r3
1207 ; P9-AIX32-NEXT:    vspltb v2, v2, 7
1208 ; P9-AIX32-NEXT:    blr
1210 ; P8-AIX32-LABEL: test_aligned_v16i8_2:
1211 ; P8-AIX32:       # %bb.0: # %entry
1212 ; P8-AIX32-NEXT:    addi r3, r3, 16
1213 ; P8-AIX32-NEXT:    lvx v2, 0, r3
1214 ; P8-AIX32-NEXT:    vspltb v2, v2, 0
1215 ; P8-AIX32-NEXT:    blr
1217 ; P7-AIX32-LABEL: test_aligned_v16i8_2:
1218 ; P7-AIX32:       # %bb.0: # %entry
1219 ; P7-AIX32-NEXT:    addi r3, r3, 16
1220 ; P7-AIX32-NEXT:    lvx v2, 0, r3
1221 ; P7-AIX32-NEXT:    vspltb v2, v2, 0
1222 ; P7-AIX32-NEXT:    blr
1223 entry:
1224   %add.ptr = getelementptr inbounds i8, ptr %Ptr, i64 16
1225   %0 = load i8, ptr %add.ptr, align 16
1226   %splat.splatinsert = insertelement <16 x i8> poison, i8 %0, i32 0
1227   %splat.splat = shufflevector <16 x i8> %splat.splatinsert, <16 x i8> poison, <16 x i32> zeroinitializer
1228   ret <16 x i8> %splat.splat
1231 ; The following test case should not produce a load and splat node,
1232 ; as we cannot handle extending loads (from f32 to f64), and this test
1233 ; shows that there are multiple uses of the extending load (other than
1234 ; a build vector node). `lxvdsx` should not be produced in this case.
1235 define <2 x double> @test_v2f64_multiple_use(ptr nocapture readonly %a, ptr nocapture %b, ptr nocapture %c) {
1236 ; P9-LABEL: test_v2f64_multiple_use:
1237 ; P9:       # %bb.0: # %entry
1238 ; P9-NEXT:    lfs f0, 0(r3)
1239 ; P9-NEXT:    xxspltd v2, vs0, 0
1240 ; P9-NEXT:    lfd f1, 0(r4)
1241 ; P9-NEXT:    xsadddp f1, f1, f0
1242 ; P9-NEXT:    stfd f1, 0(r4)
1243 ; P9-NEXT:    lfd f1, 0(r5)
1244 ; P9-NEXT:    xsadddp f1, f1, f0
1245 ; P9-NEXT:    stfd f1, 0(r5)
1246 ; P9-NEXT:    blr
1248 ; P8-LABEL: test_v2f64_multiple_use:
1249 ; P8:       # %bb.0: # %entry
1250 ; P8-NEXT:    lfs f0, 0(r3)
1251 ; P8-NEXT:    lfd f1, 0(r4)
1252 ; P8-NEXT:    xsadddp f1, f1, f0
1253 ; P8-NEXT:    stfd f1, 0(r4)
1254 ; P8-NEXT:    lfd f1, 0(r5)
1255 ; P8-NEXT:    xxspltd v2, vs0, 0
1256 ; P8-NEXT:    xsadddp f0, f1, f0
1257 ; P8-NEXT:    stfd f0, 0(r5)
1258 ; P8-NEXT:    blr
1260 ; P7-LABEL: test_v2f64_multiple_use:
1261 ; P7:       # %bb.0: # %entry
1262 ; P7-NEXT:    lfs f0, 0(r3)
1263 ; P7-NEXT:    lfd f1, 0(r4)
1264 ; P7-NEXT:    xsadddp f1, f1, f0
1265 ; P7-NEXT:    stfd f1, 0(r4)
1266 ; P7-NEXT:    lfd f1, 0(r5)
1267 ; P7-NEXT:    xxspltd v2, vs0, 0
1268 ; P7-NEXT:    xsadddp f0, f1, f0
1269 ; P7-NEXT:    stfd f0, 0(r5)
1270 ; P7-NEXT:    blr
1272 ; P9-AIX32-LABEL: test_v2f64_multiple_use:
1273 ; P9-AIX32:       # %bb.0: # %entry
1274 ; P9-AIX32-NEXT:    lfs f0, 0(r3)
1275 ; P9-AIX32-NEXT:    xxmrghd v2, vs0, vs0
1276 ; P9-AIX32-NEXT:    lfd f1, 0(r4)
1277 ; P9-AIX32-NEXT:    xsadddp f1, f1, f0
1278 ; P9-AIX32-NEXT:    stfd f1, 0(r4)
1279 ; P9-AIX32-NEXT:    lfd f1, 0(r5)
1280 ; P9-AIX32-NEXT:    xsadddp f1, f1, f0
1281 ; P9-AIX32-NEXT:    stfd f1, 0(r5)
1282 ; P9-AIX32-NEXT:    blr
1284 ; P8-AIX32-LABEL: test_v2f64_multiple_use:
1285 ; P8-AIX32:       # %bb.0: # %entry
1286 ; P8-AIX32-NEXT:    lfs f0, 0(r3)
1287 ; P8-AIX32-NEXT:    lfd f1, 0(r4)
1288 ; P8-AIX32-NEXT:    xsadddp f1, f1, f0
1289 ; P8-AIX32-NEXT:    stfd f1, 0(r4)
1290 ; P8-AIX32-NEXT:    lfd f1, 0(r5)
1291 ; P8-AIX32-NEXT:    xxmrghd v2, vs0, vs0
1292 ; P8-AIX32-NEXT:    xsadddp f0, f1, f0
1293 ; P8-AIX32-NEXT:    stfd f0, 0(r5)
1294 ; P8-AIX32-NEXT:    blr
1296 ; P7-AIX32-LABEL: test_v2f64_multiple_use:
1297 ; P7-AIX32:       # %bb.0: # %entry
1298 ; P7-AIX32-NEXT:    lfs f0, 0(r3)
1299 ; P7-AIX32-NEXT:    lfd f1, 0(r4)
1300 ; P7-AIX32-NEXT:    xsadddp f1, f1, f0
1301 ; P7-AIX32-NEXT:    stfd f1, 0(r4)
1302 ; P7-AIX32-NEXT:    lfd f1, 0(r5)
1303 ; P7-AIX32-NEXT:    xxmrghd v2, vs0, vs0
1304 ; P7-AIX32-NEXT:    xsadddp f0, f1, f0
1305 ; P7-AIX32-NEXT:    stfd f0, 0(r5)
1306 ; P7-AIX32-NEXT:    blr
1307 entry:
1308   %0 = load float, ptr %a, align 4
1309   %conv = fpext float %0 to double
1310   %1 = load double, ptr %b, align 8
1311   %add = fadd double %1, %conv
1312   store double %add, ptr %b, align 8
1313   %2 = load double, ptr %c, align 8
1314   %add2 = fadd double %2, %conv
1315   store double %add2, ptr %c, align 8
1316   %vecinit = insertelement <2 x double> undef, double %conv, i64 0
1317   %vecinit5 = shufflevector <2 x double> %vecinit, <2 x double> poison, <2 x i32> zeroinitializer
1318   ret <2 x double> %vecinit5
1321 define <4 x i32> @test_splatW(ptr %ptr) {
1322 ; P9-LABEL: test_splatW:
1323 ; P9:       # %bb.0: # %entry
1324 ; P9-NEXT:    lxvwsx v2, 0, r3
1325 ; P9-NEXT:    blr
1327 ; P8-LABEL: test_splatW:
1328 ; P8:       # %bb.0: # %entry
1329 ; P8-NEXT:    lxvd2x vs0, 0, r3
1330 ; P8-NEXT:    xxswapd v2, vs0
1331 ; P8-NEXT:    xxspltw v2, v2, 3
1332 ; P8-NEXT:    blr
1334 ; P7-LABEL: test_splatW:
1335 ; P7:       # %bb.0: # %entry
1336 ; P7-NEXT:    lxvw4x vs0, 0, r3
1337 ; P7-NEXT:    xxspltw v2, vs0, 0
1338 ; P7-NEXT:    blr
1340 ; P9-AIX32-LABEL: test_splatW:
1341 ; P9-AIX32:       # %bb.0: # %entry
1342 ; P9-AIX32-NEXT:    lxvwsx v2, 0, r3
1343 ; P9-AIX32-NEXT:    blr
1345 ; P8-AIX32-LABEL: test_splatW:
1346 ; P8-AIX32:       # %bb.0: # %entry
1347 ; P8-AIX32-NEXT:    lxvw4x vs0, 0, r3
1348 ; P8-AIX32-NEXT:    xxspltw v2, vs0, 0
1349 ; P8-AIX32-NEXT:    blr
1351 ; P7-AIX32-LABEL: test_splatW:
1352 ; P7-AIX32:       # %bb.0: # %entry
1353 ; P7-AIX32-NEXT:    lxvw4x vs0, 0, r3
1354 ; P7-AIX32-NEXT:    xxspltw v2, vs0, 0
1355 ; P7-AIX32-NEXT:    blr
1356 entry:
1357   %0 = load <8 x i16>, ptr %ptr, align 16
1358   %1 = shufflevector <8 x i16> %0, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>
1359   %2 = bitcast<8 x i16> %1 to <4 x i32>
1360   ret <4 x i32> %2
1363 define <4 x i32> @test_splatD(ptr %ptr) {
1364 ; P9-LABEL: test_splatD:
1365 ; P9:       # %bb.0: # %entry
1366 ; P9-NEXT:    lxvdsx v2, 0, r3
1367 ; P9-NEXT:    blr
1369 ; P8-LABEL: test_splatD:
1370 ; P8:       # %bb.0: # %entry
1371 ; P8-NEXT:    lxvdsx v2, 0, r3
1372 ; P8-NEXT:    blr
1374 ; P7-LABEL: test_splatD:
1375 ; P7:       # %bb.0: # %entry
1376 ; P7-NEXT:    lxvdsx v2, 0, r3
1377 ; P7-NEXT:    blr
1379 ; P9-AIX32-LABEL: test_splatD:
1380 ; P9-AIX32:       # %bb.0: # %entry
1381 ; P9-AIX32-NEXT:    lxvdsx v2, 0, r3
1382 ; P9-AIX32-NEXT:    blr
1384 ; P8-AIX32-LABEL: test_splatD:
1385 ; P8-AIX32:       # %bb.0: # %entry
1386 ; P8-AIX32-NEXT:    lxvdsx v2, 0, r3
1387 ; P8-AIX32-NEXT:    blr
1389 ; P7-AIX32-LABEL: test_splatD:
1390 ; P7-AIX32:       # %bb.0: # %entry
1391 ; P7-AIX32-NEXT:    lxvdsx v2, 0, r3
1392 ; P7-AIX32-NEXT:    blr
1393 entry:
1394   %0 = load <8 x i16>, ptr %ptr, align 16
1395   %1 = shufflevector <8 x i16> %0, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
1396   %2 = bitcast<8 x i16> %1 to <4 x i32>
1397   ret <4 x i32> %2