1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
3; RUN:   -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | \
4; RUN:   FileCheck %s --check-prefix=LE-PAIRED
5; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
6; RUN:   -mcpu=pwr10 -ppc-asm-full-reg-names \
7; RUN:   -ppc-vsr-nums-as-vr < %s | FileCheck %s --check-prefix=BE-PAIRED
8
9@f = common dso_local local_unnamed_addr global <512 x i1> zeroinitializer, align 16
10@g = common dso_local local_unnamed_addr global <256 x i1> zeroinitializer, align 16
11
12define dso_local void @testLdSt(i64 %SrcIdx, i64 %DstIdx) {
13; LE-PAIRED-LABEL: testLdSt:
14; LE-PAIRED:       # %bb.0: # %entry
15; LE-PAIRED-NEXT:    plxv vs1, f@PCREL+96(0), 1
16; LE-PAIRED-NEXT:    plxv vs0, f@PCREL+112(0), 1
17; LE-PAIRED-NEXT:    plxv vs3, f@PCREL+64(0), 1
18; LE-PAIRED-NEXT:    plxv vs2, f@PCREL+80(0), 1
19; LE-PAIRED-NEXT:    pstxv vs0, f@PCREL+176(0), 1
20; LE-PAIRED-NEXT:    pstxv vs1, f@PCREL+160(0), 1
21; LE-PAIRED-NEXT:    pstxv vs2, f@PCREL+144(0), 1
22; LE-PAIRED-NEXT:    pstxv vs3, f@PCREL+128(0), 1
23; LE-PAIRED-NEXT:    blr
24;
25; BE-PAIRED-LABEL: testLdSt:
26; BE-PAIRED:       # %bb.0: # %entry
27; BE-PAIRED-NEXT:    addis r3, r2, f@toc@ha
28; BE-PAIRED-NEXT:    addi r3, r3, f@toc@l
29; BE-PAIRED-NEXT:    lxv vs1, 80(r3)
30; BE-PAIRED-NEXT:    lxv vs0, 64(r3)
31; BE-PAIRED-NEXT:    lxv vs3, 112(r3)
32; BE-PAIRED-NEXT:    lxv vs2, 96(r3)
33; BE-PAIRED-NEXT:    stxv vs1, 144(r3)
34; BE-PAIRED-NEXT:    stxv vs0, 128(r3)
35; BE-PAIRED-NEXT:    stxv vs3, 176(r3)
36; BE-PAIRED-NEXT:    stxv vs2, 160(r3)
37; BE-PAIRED-NEXT:    blr
38entry:
39  %arrayidx = getelementptr inbounds <512 x i1>, <512 x i1>* @f, i64 1
40  %0 = load <512 x i1>, <512 x i1>* %arrayidx, align 64
41  %arrayidx1 = getelementptr inbounds <512 x i1>, <512 x i1>* @f, i64 2
42  store <512 x i1> %0, <512 x i1>* %arrayidx1, align 64
43  ret void
44}
45
46define dso_local void @testXLdSt(i64 %SrcIdx, i64 %DstIdx) {
47; LE-PAIRED-LABEL: testXLdSt:
48; LE-PAIRED:       # %bb.0: # %entry
49; LE-PAIRED-NEXT:    sldi r3, r3, 6
50; LE-PAIRED-NEXT:    paddi r5, 0, f@PCREL, 1
51; LE-PAIRED-NEXT:    add r6, r5, r3
52; LE-PAIRED-NEXT:    lxv vs1, 32(r6)
53; LE-PAIRED-NEXT:    lxv vs0, 48(r6)
54; LE-PAIRED-NEXT:    lxvx vs3, r5, r3
55; LE-PAIRED-NEXT:    lxv vs2, 16(r6)
56; LE-PAIRED-NEXT:    sldi r3, r4, 6
57; LE-PAIRED-NEXT:    stxvx vs3, r5, r3
58; LE-PAIRED-NEXT:    add r3, r5, r3
59; LE-PAIRED-NEXT:    stxv vs0, 48(r3)
60; LE-PAIRED-NEXT:    stxv vs1, 32(r3)
61; LE-PAIRED-NEXT:    stxv vs2, 16(r3)
62; LE-PAIRED-NEXT:    blr
63;
64; BE-PAIRED-LABEL: testXLdSt:
65; BE-PAIRED:       # %bb.0: # %entry
66; BE-PAIRED-NEXT:    addis r5, r2, f@toc@ha
67; BE-PAIRED-NEXT:    sldi r3, r3, 6
68; BE-PAIRED-NEXT:    addi r5, r5, f@toc@l
69; BE-PAIRED-NEXT:    add r6, r5, r3
70; BE-PAIRED-NEXT:    lxvx vs0, r5, r3
71; BE-PAIRED-NEXT:    sldi r3, r4, 6
72; BE-PAIRED-NEXT:    lxv vs1, 16(r6)
73; BE-PAIRED-NEXT:    lxv vs3, 48(r6)
74; BE-PAIRED-NEXT:    lxv vs2, 32(r6)
75; BE-PAIRED-NEXT:    stxvx vs0, r5, r3
76; BE-PAIRED-NEXT:    add r3, r5, r3
77; BE-PAIRED-NEXT:    stxv vs1, 16(r3)
78; BE-PAIRED-NEXT:    stxv vs3, 48(r3)
79; BE-PAIRED-NEXT:    stxv vs2, 32(r3)
80; BE-PAIRED-NEXT:    blr
81entry:
82  %arrayidx = getelementptr inbounds <512 x i1>, <512 x i1>* @f, i64 %SrcIdx
83  %0 = load <512 x i1>, <512 x i1>* %arrayidx, align 64
84  %arrayidx1 = getelementptr inbounds <512 x i1>, <512 x i1>* @f, i64 %DstIdx
85  store <512 x i1> %0, <512 x i1>* %arrayidx1, align 64
86  ret void
87}
88
89define dso_local void @testUnalignedLdSt() {
90; LE-PAIRED-LABEL: testUnalignedLdSt:
91; LE-PAIRED:       # %bb.0: # %entry
92; LE-PAIRED-NEXT:    plxv vs1, f@PCREL+43(0), 1
93; LE-PAIRED-NEXT:    plxv vs0, f@PCREL+59(0), 1
94; LE-PAIRED-NEXT:    plxv vs3, f@PCREL+11(0), 1
95; LE-PAIRED-NEXT:    plxv vs2, f@PCREL+27(0), 1
96; LE-PAIRED-NEXT:    pstxv vs0, f@PCREL+67(0), 1
97; LE-PAIRED-NEXT:    pstxv vs1, f@PCREL+51(0), 1
98; LE-PAIRED-NEXT:    pstxv vs2, f@PCREL+35(0), 1
99; LE-PAIRED-NEXT:    pstxv vs3, f@PCREL+19(0), 1
100; LE-PAIRED-NEXT:    blr
101;
102; BE-PAIRED-LABEL: testUnalignedLdSt:
103; BE-PAIRED:       # %bb.0: # %entry
104; BE-PAIRED-NEXT:    addis r3, r2, f@toc@ha
105; BE-PAIRED-NEXT:    addi r3, r3, f@toc@l
106; BE-PAIRED-NEXT:    plxv vs1, 27(r3), 0
107; BE-PAIRED-NEXT:    plxv vs0, 11(r3), 0
108; BE-PAIRED-NEXT:    plxv vs3, 59(r3), 0
109; BE-PAIRED-NEXT:    plxv vs2, 43(r3), 0
110; BE-PAIRED-NEXT:    pstxv vs1, 35(r3), 0
111; BE-PAIRED-NEXT:    pstxv vs0, 19(r3), 0
112; BE-PAIRED-NEXT:    pstxv vs3, 67(r3), 0
113; BE-PAIRED-NEXT:    pstxv vs2, 51(r3), 0
114; BE-PAIRED-NEXT:    blr
115entry:
116  %0 = bitcast <512 x i1>* @f to i8*
117  %add.ptr = getelementptr inbounds i8, i8* %0, i64 11
118  %add.ptr1 = getelementptr inbounds i8, i8* %0, i64 19
119  %1 = bitcast i8* %add.ptr to <512 x i1>*
120  %2 = bitcast i8* %add.ptr1 to <512 x i1>*
121  %3 = load <512 x i1>, <512 x i1>* %1, align 64
122  store <512 x i1> %3, <512 x i1>* %2, align 64
123  ret void
124}
125
126define dso_local void @testLdStPair(i64 %SrcIdx, i64 %DstIdx) {
127; LE-PAIRED-LABEL: testLdStPair:
128; LE-PAIRED:       # %bb.0: # %entry
129; LE-PAIRED-NEXT:    plxv v3, g@PCREL+32(0), 1
130; LE-PAIRED-NEXT:    plxv v2, g@PCREL+48(0), 1
131; LE-PAIRED-NEXT:    pstxv v3, g@PCREL+64(0), 1
132; LE-PAIRED-NEXT:    pstxv v2, g@PCREL+80(0), 1
133; LE-PAIRED-NEXT:    blr
134;
135; BE-PAIRED-LABEL: testLdStPair:
136; BE-PAIRED:       # %bb.0: # %entry
137; BE-PAIRED-NEXT:    addis r3, r2, g@toc@ha
138; BE-PAIRED-NEXT:    addi r3, r3, g@toc@l
139; BE-PAIRED-NEXT:    lxv v3, 48(r3)
140; BE-PAIRED-NEXT:    lxv v2, 32(r3)
141; BE-PAIRED-NEXT:    stxv v3, 80(r3)
142; BE-PAIRED-NEXT:    stxv v2, 64(r3)
143; BE-PAIRED-NEXT:    blr
144entry:
145  %arrayidx = getelementptr inbounds <256 x i1>, <256 x i1>* @g, i64 1
146  %0 = load <256 x i1>, <256 x i1>* %arrayidx, align 64
147  %arrayidx1 = getelementptr inbounds <256 x i1>, <256 x i1>* @g, i64 2
148  store <256 x i1> %0, <256 x i1>* %arrayidx1, align 64
149  ret void
150}
151
152define dso_local void @testXLdStPair(i64 %SrcIdx, i64 %DstIdx) {
153; LE-PAIRED-LABEL: testXLdStPair:
154; LE-PAIRED:       # %bb.0: # %entry
155; LE-PAIRED-NEXT:    sldi r3, r3, 5
156; LE-PAIRED-NEXT:    paddi r5, 0, g@PCREL, 1
157; LE-PAIRED-NEXT:    add r6, r5, r3
158; LE-PAIRED-NEXT:    lxvx v3, r5, r3
159; LE-PAIRED-NEXT:    sldi r3, r4, 5
160; LE-PAIRED-NEXT:    lxv v2, 16(r6)
161; LE-PAIRED-NEXT:    add r4, r5, r3
162; LE-PAIRED-NEXT:    stxvx v3, r5, r3
163; LE-PAIRED-NEXT:    stxv v2, 16(r4)
164; LE-PAIRED-NEXT:    blr
165;
166; BE-PAIRED-LABEL: testXLdStPair:
167; BE-PAIRED:       # %bb.0: # %entry
168; BE-PAIRED-NEXT:    addis r5, r2, g@toc@ha
169; BE-PAIRED-NEXT:    sldi r3, r3, 5
170; BE-PAIRED-NEXT:    addi r5, r5, g@toc@l
171; BE-PAIRED-NEXT:    add r6, r5, r3
172; BE-PAIRED-NEXT:    lxvx v2, r5, r3
173; BE-PAIRED-NEXT:    sldi r3, r4, 5
174; BE-PAIRED-NEXT:    lxv v3, 16(r6)
175; BE-PAIRED-NEXT:    add r4, r5, r3
176; BE-PAIRED-NEXT:    stxvx v2, r5, r3
177; BE-PAIRED-NEXT:    stxv v3, 16(r4)
178; BE-PAIRED-NEXT:    blr
179entry:
180  %arrayidx = getelementptr inbounds <256 x i1>, <256 x i1>* @g, i64 %SrcIdx
181  %0 = load <256 x i1>, <256 x i1>* %arrayidx, align 64
182  %arrayidx1 = getelementptr inbounds <256 x i1>, <256 x i1>* @g, i64 %DstIdx
183  store <256 x i1> %0, <256 x i1>* %arrayidx1, align 64
184  ret void
185}
186
187define dso_local void @testUnalignedLdStPair() {
188; LE-PAIRED-LABEL: testUnalignedLdStPair:
189; LE-PAIRED:       # %bb.0: # %entry
190; LE-PAIRED-NEXT:    plxv v3, g@PCREL+11(0), 1
191; LE-PAIRED-NEXT:    plxv v2, g@PCREL+27(0), 1
192; LE-PAIRED-NEXT:    pstxv v3, g@PCREL+19(0), 1
193; LE-PAIRED-NEXT:    pstxv v2, g@PCREL+35(0), 1
194; LE-PAIRED-NEXT:    blr
195;
196; BE-PAIRED-LABEL: testUnalignedLdStPair:
197; BE-PAIRED:       # %bb.0: # %entry
198; BE-PAIRED-NEXT:    addis r3, r2, g@toc@ha
199; BE-PAIRED-NEXT:    addi r3, r3, g@toc@l
200; BE-PAIRED-NEXT:    plxv v3, 27(r3), 0
201; BE-PAIRED-NEXT:    plxv v2, 11(r3), 0
202; BE-PAIRED-NEXT:    pstxv v3, 35(r3), 0
203; BE-PAIRED-NEXT:    pstxv v2, 19(r3), 0
204; BE-PAIRED-NEXT:    blr
205entry:
206  %0 = bitcast <256 x i1>* @g to i8*
207  %add.ptr = getelementptr inbounds i8, i8* %0, i64 11
208  %add.ptr1 = getelementptr inbounds i8, i8* %0, i64 19
209  %1 = bitcast i8* %add.ptr to <256 x i1>*
210  %2 = bitcast i8* %add.ptr1 to <256 x i1>*
211  %3 = load <256 x i1>, <256 x i1>* %1, align 64
212  store <256 x i1> %3, <256 x i1>* %2, align 64
213  ret void
214}
215