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
22 define dso_local void @test(ptr nocapture %c, ptr nocapture readonly %a) local_unnamed_addr {
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)
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
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
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)
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
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
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
74 define dso_local void @test2(ptr nocapture %c, ptr nocapture readonly %a) local_unnamed_addr {
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)
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
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
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)
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
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
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
130 define dso_local void @test3(ptr nocapture %c, ptr nocapture readonly %a) local_unnamed_addr {
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)
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
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
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)
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
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
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
187 define dso_local void @test4(ptr nocapture %c, ptr nocapture readonly %a) local_unnamed_addr {
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)
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
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
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)
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
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
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
264 define void @test5(ptr %a, ptr %in) {
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)
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
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
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)
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
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
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
341 define void @test6(ptr %a, ptr %in) {
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)
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
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
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)
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
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
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
418 define void @test7(ptr %a, ptr %in) {
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)
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
436 ; P7: # %bb.0: # %entry
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
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)
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
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
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
480 define void @test8(ptr %a, ptr %in) {
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)
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
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
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)
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
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
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
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
543 ; P8-LABEL: unadjusted_lxvwsx:
544 ; P8: # %bb.0: # %entry
545 ; P8-NEXT: lfiwzx f0, 0, r3
546 ; P8-NEXT: xxspltw v2, vs0, 1
549 ; P7-LABEL: unadjusted_lxvwsx:
550 ; P7: # %bb.0: # %entry
551 ; P7-NEXT: lfiwzx f0, 0, r3
552 ; P7-NEXT: xxspltw v2, vs0, 1
555 ; P9-AIX32-LABEL: unadjusted_lxvwsx:
556 ; P9-AIX32: # %bb.0: # %entry
557 ; P9-AIX32-NEXT: lxvwsx v2, 0, r3
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
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
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>
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
584 ; P8-LABEL: adjusted_lxvwsx:
585 ; P8: # %bb.0: # %entry
586 ; P8-NEXT: lfdx f0, 0, r3
587 ; P8-NEXT: xxspltw v2, vs0, 0
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
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
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
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
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>
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
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
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
643 ; P9-AIX32-LABEL: unadjusted_lxvwsx_v16i8:
644 ; P9-AIX32: # %bb.0: # %entry
645 ; P9-AIX32-NEXT: lxvwsx v2, 0, r3
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
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
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>
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
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
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
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
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
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
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>
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
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
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
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
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
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
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>
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
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
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
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
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
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
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>
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
800 ; P8-LABEL: unadjusted_lxvdsx:
801 ; P8: # %bb.0: # %entry
802 ; P8-NEXT: lxvdsx v2, 0, r3
805 ; P7-LABEL: unadjusted_lxvdsx:
806 ; P7: # %bb.0: # %entry
807 ; P7-NEXT: lxvdsx v2, 0, r3
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
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
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
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>
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
861 ; P8-LABEL: unadjusted_lxvdsx_v16i8:
862 ; P8: # %bb.0: # %entry
863 ; P8-NEXT: lxvdsx v2, 0, r3
866 ; P7-LABEL: unadjusted_lxvdsx_v16i8:
867 ; P7: # %bb.0: # %entry
868 ; P7-NEXT: lxvdsx v2, 0, r3
871 ; P9-AIX32-LABEL: unadjusted_lxvdsx_v16i8:
872 ; P9-AIX32: # %bb.0: # %entry
873 ; P9-AIX32-NEXT: lxvdsx v2, 0, r3
876 ; P8-AIX32-LABEL: unadjusted_lxvdsx_v16i8:
877 ; P8-AIX32: # %bb.0: # %entry
878 ; P8-AIX32-NEXT: lxvdsx v2, 0, r3
881 ; P7-AIX32-LABEL: unadjusted_lxvdsx_v16i8:
882 ; P7-AIX32: # %bb.0: # %entry
883 ; P7-AIX32-NEXT: lxvdsx v2, 0, r3
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>
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
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
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
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
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
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
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>
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
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
948 ; P7-LABEL: test_unaligned_v8i16:
949 ; P7: # %bb.0: # %entry
950 ; P7-NEXT: addi r3, r3, 6
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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)
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)
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)
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
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
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
1334 ; P7-LABEL: test_splatW:
1335 ; P7: # %bb.0: # %entry
1336 ; P7-NEXT: lxvw4x vs0, 0, r3
1337 ; P7-NEXT: xxspltw v2, vs0, 0
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
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>
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
1369 ; P8-LABEL: test_splatD:
1370 ; P8: # %bb.0: # %entry
1371 ; P8-NEXT: lxvdsx v2, 0, r3
1374 ; P7-LABEL: test_splatD:
1375 ; P7: # %bb.0: # %entry
1376 ; P7-NEXT: lxvdsx v2, 0, r3
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
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>