xref: /aosp_15_r20/external/llvm/test/CodeGen/PowerPC/swaps-le-2.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -O3 -mcpu=pwr8 -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Test swap removal when a vector splat must be adjusted to make it legal.
4*9880d681SAndroid Build Coastguard Worker;
5*9880d681SAndroid Build Coastguard Worker; Test generated from following C code:
6*9880d681SAndroid Build Coastguard Worker;
7*9880d681SAndroid Build Coastguard Worker; vector char vc = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
8*9880d681SAndroid Build Coastguard Worker; vector char vcr;
9*9880d681SAndroid Build Coastguard Worker; vector short vs = {0, 1, 2, 3, 4, 5, 6, 7};
10*9880d681SAndroid Build Coastguard Worker; vector short vsr;
11*9880d681SAndroid Build Coastguard Worker; vector int vi = {0, 1, 2, 3};
12*9880d681SAndroid Build Coastguard Worker; vector int vir;
13*9880d681SAndroid Build Coastguard Worker;
14*9880d681SAndroid Build Coastguard Worker; void cfoo ()
15*9880d681SAndroid Build Coastguard Worker; {
16*9880d681SAndroid Build Coastguard Worker;   vcr = (vector char){vc[5], vc[5], vc[5], vc[5], vc[5], vc[5], vc[5], vc[5],
17*9880d681SAndroid Build Coastguard Worker;                       vc[5], vc[5], vc[5], vc[5], vc[5], vc[5], vc[5], vc[5]};
18*9880d681SAndroid Build Coastguard Worker; }
19*9880d681SAndroid Build Coastguard Worker;
20*9880d681SAndroid Build Coastguard Worker; void sfoo ()
21*9880d681SAndroid Build Coastguard Worker; {
22*9880d681SAndroid Build Coastguard Worker;   vsr = (vector short){vs[6], vs[6], vs[6], vs[6],
23*9880d681SAndroid Build Coastguard Worker;                        vs[6], vs[6], vs[6], vs[6]};
24*9880d681SAndroid Build Coastguard Worker; }
25*9880d681SAndroid Build Coastguard Worker;
26*9880d681SAndroid Build Coastguard Worker; void ifoo ()
27*9880d681SAndroid Build Coastguard Worker; {
28*9880d681SAndroid Build Coastguard Worker;   vir = (vector int){vi[1], vi[1], vi[1], vi[1]};
29*9880d681SAndroid Build Coastguard Worker; }
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker@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*9880d681SAndroid Build Coastguard Worker@vs = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
33*9880d681SAndroid Build Coastguard Worker@vi = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
34*9880d681SAndroid Build Coastguard Worker@vcr = common global <16 x i8> zeroinitializer, align 16
35*9880d681SAndroid Build Coastguard Worker@vsr = common global <8 x i16> zeroinitializer, align 16
36*9880d681SAndroid Build Coastguard Worker@vir = common global <4 x i32> zeroinitializer, align 16
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind
39*9880d681SAndroid Build Coastguard Workerdefine void @cfoo() {
40*9880d681SAndroid Build Coastguard Workerentry:
41*9880d681SAndroid Build Coastguard Worker  %0 = load <16 x i8>, <16 x i8>* @vc, align 16
42*9880d681SAndroid Build Coastguard Worker  %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*9880d681SAndroid Build Coastguard Worker  store <16 x i8> %vecinit30, <16 x i8>* @vcr, align 16
44*9880d681SAndroid Build Coastguard Worker  ret void
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind
48*9880d681SAndroid Build Coastguard Workerdefine void @sfoo() {
49*9880d681SAndroid Build Coastguard Workerentry:
50*9880d681SAndroid Build Coastguard Worker  %0 = load <8 x i16>, <8 x i16>* @vs, align 16
51*9880d681SAndroid Build Coastguard Worker  %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*9880d681SAndroid Build Coastguard Worker  store <8 x i16> %vecinit14, <8 x i16>* @vsr, align 16
53*9880d681SAndroid Build Coastguard Worker  ret void
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind
57*9880d681SAndroid Build Coastguard Workerdefine void @ifoo() {
58*9880d681SAndroid Build Coastguard Workerentry:
59*9880d681SAndroid Build Coastguard Worker  %0 = load <4 x i32>, <4 x i32>* @vi, align 16
60*9880d681SAndroid Build Coastguard Worker  %vecinit6 = shufflevector <4 x i32> %0, <4 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
61*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %vecinit6, <4 x i32>* @vir, align 16
62*9880d681SAndroid Build Coastguard Worker  ret void
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker; Justification:
66*9880d681SAndroid Build Coastguard Worker;  Byte splat of element 5 (BE) becomes element 15-5 = 10 (LE)
67*9880d681SAndroid Build Coastguard Worker;  which becomes (10+8)%16 = 2 (LE swapped).
68*9880d681SAndroid Build Coastguard Worker;
69*9880d681SAndroid Build Coastguard Worker;  Halfword splat of element 6 (BE) becomes element 7-6 = 1 (LE)
70*9880d681SAndroid Build Coastguard Worker;  which becomes (1+4)%8 = 5 (LE swapped).
71*9880d681SAndroid Build Coastguard Worker;
72*9880d681SAndroid Build Coastguard Worker;  Word splat of element 1 (BE) becomes element 3-1 = 2 (LE)
73*9880d681SAndroid Build Coastguard Worker;  which becomes (2+2)%4 = 0 (LE swapped).
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: xxpermdi
76*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: xxswapd
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @cfoo
79*9880d681SAndroid Build Coastguard Worker; CHECK: lxvd2x
80*9880d681SAndroid Build Coastguard Worker; CHECK: vspltb {{[0-9]+}}, {{[0-9]+}}, 2
81*9880d681SAndroid Build Coastguard Worker; CHECK: stxvd2x
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sfoo
84*9880d681SAndroid Build Coastguard Worker; CHECK: lxvd2x
85*9880d681SAndroid Build Coastguard Worker; CHECK: vsplth {{[0-9]+}}, {{[0-9]+}}, 5
86*9880d681SAndroid Build Coastguard Worker; CHECK: stxvd2x
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ifoo
89*9880d681SAndroid Build Coastguard Worker; CHECK: lxvd2x
90*9880d681SAndroid Build Coastguard Worker; CHECK: xxspltw {{[0-9]+}}, {{[0-9]+}}, 0
91*9880d681SAndroid Build Coastguard Worker; CHECK: stxvd2x
92