1 ; RUN: llc -O3 -mcpu=pwr8 -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s
3 ; Test swap removal when a vector splat must be adjusted to make it legal.
5 ; Test generated from following C code:
7 ; vector char vc = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
9 ; vector short vs = {0, 1, 2, 3, 4, 5, 6, 7};
11 ; vector int vi = {0, 1, 2, 3};
16 ; vcr = (vector char){vc[5], vc[5], vc[5], vc[5], vc[5], vc[5], vc[5], vc[5],
17 ; vc[5], vc[5], vc[5], vc[5], vc[5], vc[5], vc[5], vc[5]};
22 ; vsr = (vector short){vs[6], vs[6], vs[6], vs[6],
23 ; vs[6], vs[6], vs[6], vs[6]};
28 ; vir = (vector int){vi[1], vi[1], vi[1], vi[1]};
31 @vc = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
32 @vs = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
33 @vi = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
34 @vcr = common global <16 x i8> zeroinitializer, align 16
35 @vsr = common global <8 x i16> zeroinitializer, align 16
36 @vir = common global <4 x i32> zeroinitializer, align 16
38 ; Function Attrs: nounwind
41 %0 = load <16 x i8>, <16 x i8>* @vc, align 16
42 %vecinit30 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
43 store <16 x i8> %vecinit30, <16 x i8>* @vcr, align 16
47 ; Function Attrs: nounwind
50 %0 = load <8 x i16>, <8 x i16>* @vs, align 16
51 %vecinit14 = shufflevector <8 x i16> %0, <8 x i16> undef, <8 x i32> <i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6>
52 store <8 x i16> %vecinit14, <8 x i16>* @vsr, align 16
56 ; Function Attrs: nounwind
59 %0 = load <4 x i32>, <4 x i32>* @vi, align 16
60 %vecinit6 = shufflevector <4 x i32> %0, <4 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
61 store <4 x i32> %vecinit6, <4 x i32>* @vir, align 16
66 ; Byte splat of element 5 (BE) becomes element 15-5 = 10 (LE)
67 ; which becomes (10+8)%16 = 2 (LE swapped).
69 ; Halfword splat of element 6 (BE) becomes element 7-6 = 1 (LE)
70 ; which becomes (1+4)%8 = 5 (LE swapped).
72 ; Word splat of element 1 (BE) becomes element 3-1 = 2 (LE)
73 ; which becomes (2+2)%4 = 0 (LE swapped).
80 ; CHECK: vspltb {{[0-9]+}}, {{[0-9]+}}, 2
85 ; CHECK: vsplth {{[0-9]+}}, {{[0-9]+}}, 5
90 ; CHECK: vspltw {{[0-9]+}}, {{[0-9]+}}, 0