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 \
4; RUN:   -disable-auto-paired-vec-st=false < %s | FileCheck %s \
5; RUN:   --check-prefix=LE-PAIRED
6; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
7; RUN:   -mcpu=pwr10 -ppc-asm-full-reg-names \
8; RUN:   -ppc-vsr-nums-as-vr -disable-auto-paired-vec-st=false < %s | \
9; RUN:   FileCheck %s --check-prefix=BE-PAIRED
10; RUN: llc -verify-machineinstrs -mcpu=pwr9 -ppc-vsr-nums-as-vr \
11; RUN:   -ppc-asm-full-reg-names -mtriple=powerpc64le-unknown-linux-gnu < %s \
12; RUN:   | FileCheck %s --check-prefix=LE-PWR9
13; RUN: llc -verify-machineinstrs -mcpu=pwr8 -ppc-vsr-nums-as-vr \
14; RUN:   -ppc-asm-full-reg-names -mtriple=powerpc64le-unknown-linux-gnu < %s \
15; RUN:   | FileCheck %s --check-prefix=LE-PWR8
16; RUN: llc -verify-machineinstrs -mcpu=pwr9 -ppc-vsr-nums-as-vr \
17; RUN:   -ppc-asm-full-reg-names -mtriple=powerpc64-unknown-linux-gnu < %s \
18; RUN:   | FileCheck %s --check-prefix=BE-PWR9
19; RUN: llc -verify-machineinstrs -mcpu=pwr8 -ppc-vsr-nums-as-vr \
20; RUN:   -ppc-asm-full-reg-names -mtriple=powerpc64-unknown-linux-gnu < %s \
21; RUN:   | FileCheck %s --check-prefix=BE-PWR8
22
23@f = common dso_local local_unnamed_addr global <512 x i1> zeroinitializer, align 16
24@g = common dso_local local_unnamed_addr global <256 x i1> zeroinitializer, align 16
25
26define dso_local void @testLdSt(i64 %SrcIdx, i64 %DstIdx) {
27; LE-PAIRED-LABEL: testLdSt:
28; LE-PAIRED:       # %bb.0: # %entry
29; LE-PAIRED-NEXT:    plxv vs1, f@PCREL+96(0), 1
30; LE-PAIRED-NEXT:    plxv vs0, f@PCREL+112(0), 1
31; LE-PAIRED-NEXT:    plxv vs3, f@PCREL+64(0), 1
32; LE-PAIRED-NEXT:    plxv vs2, f@PCREL+80(0), 1
33; LE-PAIRED-NEXT:    pstxv vs0, f@PCREL+176(0), 1
34; LE-PAIRED-NEXT:    pstxv vs1, f@PCREL+160(0), 1
35; LE-PAIRED-NEXT:    pstxv vs2, f@PCREL+144(0), 1
36; LE-PAIRED-NEXT:    pstxv vs3, f@PCREL+128(0), 1
37; LE-PAIRED-NEXT:    blr
38;
39; BE-PAIRED-LABEL: testLdSt:
40; BE-PAIRED:       # %bb.0: # %entry
41; BE-PAIRED-NEXT:    addis r3, r2, f@toc@ha
42; BE-PAIRED-NEXT:    addi r3, r3, f@toc@l
43; BE-PAIRED-NEXT:    lxv vs1, 80(r3)
44; BE-PAIRED-NEXT:    lxv vs0, 64(r3)
45; BE-PAIRED-NEXT:    lxv vs3, 112(r3)
46; BE-PAIRED-NEXT:    lxv vs2, 96(r3)
47; BE-PAIRED-NEXT:    stxv vs1, 144(r3)
48; BE-PAIRED-NEXT:    stxv vs0, 128(r3)
49; BE-PAIRED-NEXT:    stxv vs3, 176(r3)
50; BE-PAIRED-NEXT:    stxv vs2, 160(r3)
51; BE-PAIRED-NEXT:    blr
52;
53; LE-PWR9-LABEL: testLdSt:
54; LE-PWR9:       # %bb.0: # %entry
55; LE-PWR9-NEXT:    addis r3, r2, f@toc@ha
56; LE-PWR9-NEXT:    addi r3, r3, f@toc@l
57; LE-PWR9-NEXT:    lxv vs1, 96(r3)
58; LE-PWR9-NEXT:    lxv vs0, 64(r3)
59; LE-PWR9-NEXT:    lxv vs2, 112(r3)
60; LE-PWR9-NEXT:    stxv vs1, 160(r3)
61; LE-PWR9-NEXT:    lxv vs1, 80(r3)
62; LE-PWR9-NEXT:    stxv vs2, 176(r3)
63; LE-PWR9-NEXT:    stxv vs0, 128(r3)
64; LE-PWR9-NEXT:    stxv vs1, 144(r3)
65; LE-PWR9-NEXT:    blr
66;
67; LE-PWR8-LABEL: testLdSt:
68; LE-PWR8:       # %bb.0: # %entry
69; LE-PWR8-NEXT:    addis r3, r2, f@toc@ha
70; LE-PWR8-NEXT:    li r4, 96
71; LE-PWR8-NEXT:    li r5, 112
72; LE-PWR8-NEXT:    addi r3, r3, f@toc@l
73; LE-PWR8-NEXT:    lxvd2x vs0, r3, r4
74; LE-PWR8-NEXT:    li r4, 64
75; LE-PWR8-NEXT:    lxvd2x vs1, r3, r5
76; LE-PWR8-NEXT:    li r5, 80
77; LE-PWR8-NEXT:    lxvd2x vs2, r3, r4
78; LE-PWR8-NEXT:    lxvd2x vs3, r3, r5
79; LE-PWR8-NEXT:    li r4, 176
80; LE-PWR8-NEXT:    li r5, 160
81; LE-PWR8-NEXT:    stxvd2x vs1, r3, r4
82; LE-PWR8-NEXT:    li r4, 144
83; LE-PWR8-NEXT:    stxvd2x vs0, r3, r5
84; LE-PWR8-NEXT:    li r5, 128
85; LE-PWR8-NEXT:    stxvd2x vs3, r3, r4
86; LE-PWR8-NEXT:    stxvd2x vs2, r3, r5
87; LE-PWR8-NEXT:    blr
88;
89; BE-PWR9-LABEL: testLdSt:
90; BE-PWR9:       # %bb.0: # %entry
91; BE-PWR9-NEXT:    addis r3, r2, f@toc@ha
92; BE-PWR9-NEXT:    addi r3, r3, f@toc@l
93; BE-PWR9-NEXT:    lxv vs1, 96(r3)
94; BE-PWR9-NEXT:    lxv vs0, 64(r3)
95; BE-PWR9-NEXT:    lxv vs2, 112(r3)
96; BE-PWR9-NEXT:    stxv vs1, 160(r3)
97; BE-PWR9-NEXT:    lxv vs1, 80(r3)
98; BE-PWR9-NEXT:    stxv vs2, 176(r3)
99; BE-PWR9-NEXT:    stxv vs0, 128(r3)
100; BE-PWR9-NEXT:    stxv vs1, 144(r3)
101; BE-PWR9-NEXT:    blr
102;
103; BE-PWR8-LABEL: testLdSt:
104; BE-PWR8:       # %bb.0: # %entry
105; BE-PWR8-NEXT:    addis r3, r2, f@toc@ha
106; BE-PWR8-NEXT:    li r4, 96
107; BE-PWR8-NEXT:    li r5, 112
108; BE-PWR8-NEXT:    addi r3, r3, f@toc@l
109; BE-PWR8-NEXT:    lxvd2x vs0, r3, r4
110; BE-PWR8-NEXT:    li r4, 64
111; BE-PWR8-NEXT:    lxvd2x vs1, r3, r5
112; BE-PWR8-NEXT:    li r5, 80
113; BE-PWR8-NEXT:    lxvd2x vs2, r3, r4
114; BE-PWR8-NEXT:    lxvd2x vs3, r3, r5
115; BE-PWR8-NEXT:    li r4, 176
116; BE-PWR8-NEXT:    li r5, 160
117; BE-PWR8-NEXT:    stxvd2x vs1, r3, r4
118; BE-PWR8-NEXT:    li r4, 144
119; BE-PWR8-NEXT:    stxvd2x vs0, r3, r5
120; BE-PWR8-NEXT:    li r5, 128
121; BE-PWR8-NEXT:    stxvd2x vs3, r3, r4
122; BE-PWR8-NEXT:    stxvd2x vs2, r3, r5
123; BE-PWR8-NEXT:    blr
124entry:
125  %arrayidx = getelementptr inbounds <512 x i1>, <512 x i1>* @f, i64 1
126  %0 = load <512 x i1>, <512 x i1>* %arrayidx, align 64
127  %arrayidx1 = getelementptr inbounds <512 x i1>, <512 x i1>* @f, i64 2
128  store <512 x i1> %0, <512 x i1>* %arrayidx1, align 64
129  ret void
130}
131
132define dso_local void @testXLdSt(i64 %SrcIdx, i64 %DstIdx) {
133; LE-PAIRED-LABEL: testXLdSt:
134; LE-PAIRED:       # %bb.0: # %entry
135; LE-PAIRED-NEXT:    paddi r5, 0, f@PCREL, 1
136; LE-PAIRED-NEXT:    sldi r3, r3, 6
137; LE-PAIRED-NEXT:    add r6, r5, r3
138; LE-PAIRED-NEXT:    lxv vs1, 32(r6)
139; LE-PAIRED-NEXT:    lxv vs0, 48(r6)
140; LE-PAIRED-NEXT:    lxvx vs3, r5, r3
141; LE-PAIRED-NEXT:    lxv vs2, 16(r6)
142; LE-PAIRED-NEXT:    sldi r3, r4, 6
143; LE-PAIRED-NEXT:    add r4, r5, r3
144; LE-PAIRED-NEXT:    stxvx vs3, r5, r3
145; LE-PAIRED-NEXT:    stxv vs0, 48(r4)
146; LE-PAIRED-NEXT:    stxv vs1, 32(r4)
147; LE-PAIRED-NEXT:    stxv vs2, 16(r4)
148; LE-PAIRED-NEXT:    blr
149;
150; BE-PAIRED-LABEL: testXLdSt:
151; BE-PAIRED:       # %bb.0: # %entry
152; BE-PAIRED-NEXT:    addis r5, r2, f@toc@ha
153; BE-PAIRED-NEXT:    addi r5, r5, f@toc@l
154; BE-PAIRED-NEXT:    sldi r3, r3, 6
155; BE-PAIRED-NEXT:    add r6, r5, r3
156; BE-PAIRED-NEXT:    lxvx vs0, r5, r3
157; BE-PAIRED-NEXT:    sldi r3, r4, 6
158; BE-PAIRED-NEXT:    add r4, r5, r3
159; BE-PAIRED-NEXT:    lxv vs1, 16(r6)
160; BE-PAIRED-NEXT:    lxv vs3, 48(r6)
161; BE-PAIRED-NEXT:    lxv vs2, 32(r6)
162; BE-PAIRED-NEXT:    stxvx vs0, r5, r3
163; BE-PAIRED-NEXT:    stxv vs1, 16(r4)
164; BE-PAIRED-NEXT:    stxv vs3, 48(r4)
165; BE-PAIRED-NEXT:    stxv vs2, 32(r4)
166; BE-PAIRED-NEXT:    blr
167;
168; LE-PWR9-LABEL: testXLdSt:
169; LE-PWR9:       # %bb.0: # %entry
170; LE-PWR9-NEXT:    addis r5, r2, f@toc@ha
171; LE-PWR9-NEXT:    sldi r3, r3, 6
172; LE-PWR9-NEXT:    addi r5, r5, f@toc@l
173; LE-PWR9-NEXT:    add r6, r5, r3
174; LE-PWR9-NEXT:    lxvx vs3, r5, r3
175; LE-PWR9-NEXT:    sldi r3, r4, 6
176; LE-PWR9-NEXT:    lxv vs0, 16(r6)
177; LE-PWR9-NEXT:    lxv vs1, 32(r6)
178; LE-PWR9-NEXT:    lxv vs2, 48(r6)
179; LE-PWR9-NEXT:    stxvx vs3, r5, r3
180; LE-PWR9-NEXT:    add r3, r5, r3
181; LE-PWR9-NEXT:    stxv vs2, 48(r3)
182; LE-PWR9-NEXT:    stxv vs1, 32(r3)
183; LE-PWR9-NEXT:    stxv vs0, 16(r3)
184; LE-PWR9-NEXT:    blr
185;
186; LE-PWR8-LABEL: testXLdSt:
187; LE-PWR8:       # %bb.0: # %entry
188; LE-PWR8-NEXT:    addis r5, r2, f@toc@ha
189; LE-PWR8-NEXT:    sldi r3, r3, 6
190; LE-PWR8-NEXT:    li r6, 48
191; LE-PWR8-NEXT:    li r8, 16
192; LE-PWR8-NEXT:    li r9, 32
193; LE-PWR8-NEXT:    addi r5, r5, f@toc@l
194; LE-PWR8-NEXT:    add r7, r5, r3
195; LE-PWR8-NEXT:    lxvd2x vs0, r5, r3
196; LE-PWR8-NEXT:    sldi r3, r4, 6
197; LE-PWR8-NEXT:    lxvd2x vs1, r7, r6
198; LE-PWR8-NEXT:    lxvd2x vs2, r7, r8
199; LE-PWR8-NEXT:    add r4, r5, r3
200; LE-PWR8-NEXT:    lxvd2x vs3, r7, r9
201; LE-PWR8-NEXT:    stxvd2x vs0, r5, r3
202; LE-PWR8-NEXT:    stxvd2x vs1, r4, r6
203; LE-PWR8-NEXT:    stxvd2x vs3, r4, r9
204; LE-PWR8-NEXT:    stxvd2x vs2, r4, r8
205; LE-PWR8-NEXT:    blr
206;
207; BE-PWR9-LABEL: testXLdSt:
208; BE-PWR9:       # %bb.0: # %entry
209; BE-PWR9-NEXT:    addis r5, r2, f@toc@ha
210; BE-PWR9-NEXT:    sldi r3, r3, 6
211; BE-PWR9-NEXT:    addi r5, r5, f@toc@l
212; BE-PWR9-NEXT:    add r6, r5, r3
213; BE-PWR9-NEXT:    lxvx vs3, r5, r3
214; BE-PWR9-NEXT:    sldi r3, r4, 6
215; BE-PWR9-NEXT:    lxv vs0, 16(r6)
216; BE-PWR9-NEXT:    lxv vs1, 32(r6)
217; BE-PWR9-NEXT:    lxv vs2, 48(r6)
218; BE-PWR9-NEXT:    stxvx vs3, r5, r3
219; BE-PWR9-NEXT:    add r3, r5, r3
220; BE-PWR9-NEXT:    stxv vs2, 48(r3)
221; BE-PWR9-NEXT:    stxv vs1, 32(r3)
222; BE-PWR9-NEXT:    stxv vs0, 16(r3)
223; BE-PWR9-NEXT:    blr
224;
225; BE-PWR8-LABEL: testXLdSt:
226; BE-PWR8:       # %bb.0: # %entry
227; BE-PWR8-NEXT:    addis r5, r2, f@toc@ha
228; BE-PWR8-NEXT:    sldi r3, r3, 6
229; BE-PWR8-NEXT:    li r6, 32
230; BE-PWR8-NEXT:    li r7, 48
231; BE-PWR8-NEXT:    li r9, 16
232; BE-PWR8-NEXT:    addi r5, r5, f@toc@l
233; BE-PWR8-NEXT:    add r8, r5, r3
234; BE-PWR8-NEXT:    lxvd2x vs2, r5, r3
235; BE-PWR8-NEXT:    sldi r3, r4, 6
236; BE-PWR8-NEXT:    lxvd2x vs0, r8, r6
237; BE-PWR8-NEXT:    lxvd2x vs1, r8, r7
238; BE-PWR8-NEXT:    add r4, r5, r3
239; BE-PWR8-NEXT:    lxvd2x vs3, r8, r9
240; BE-PWR8-NEXT:    stxvd2x vs2, r5, r3
241; BE-PWR8-NEXT:    stxvd2x vs1, r4, r7
242; BE-PWR8-NEXT:    stxvd2x vs0, r4, r6
243; BE-PWR8-NEXT:    stxvd2x vs3, r4, r9
244; BE-PWR8-NEXT:    blr
245entry:
246  %arrayidx = getelementptr inbounds <512 x i1>, <512 x i1>* @f, i64 %SrcIdx
247  %0 = load <512 x i1>, <512 x i1>* %arrayidx, align 64
248  %arrayidx1 = getelementptr inbounds <512 x i1>, <512 x i1>* @f, i64 %DstIdx
249  store <512 x i1> %0, <512 x i1>* %arrayidx1, align 64
250  ret void
251}
252
253define dso_local void @testUnalignedLdSt() {
254; LE-PAIRED-LABEL: testUnalignedLdSt:
255; LE-PAIRED:       # %bb.0: # %entry
256; LE-PAIRED-NEXT:    plxv vs1, f@PCREL+43(0), 1
257; LE-PAIRED-NEXT:    plxv vs0, f@PCREL+59(0), 1
258; LE-PAIRED-NEXT:    plxv vs3, f@PCREL+11(0), 1
259; LE-PAIRED-NEXT:    plxv vs2, f@PCREL+27(0), 1
260; LE-PAIRED-NEXT:    pstxv vs0, f@PCREL+67(0), 1
261; LE-PAIRED-NEXT:    pstxv vs1, f@PCREL+51(0), 1
262; LE-PAIRED-NEXT:    pstxv vs2, f@PCREL+35(0), 1
263; LE-PAIRED-NEXT:    pstxv vs3, f@PCREL+19(0), 1
264; LE-PAIRED-NEXT:    blr
265;
266; BE-PAIRED-LABEL: testUnalignedLdSt:
267; BE-PAIRED:       # %bb.0: # %entry
268; BE-PAIRED-NEXT:    addis r3, r2, f@toc@ha
269; BE-PAIRED-NEXT:    addi r3, r3, f@toc@l
270; BE-PAIRED-NEXT:    plxv vs1, 27(r3), 0
271; BE-PAIRED-NEXT:    plxv vs0, 11(r3), 0
272; BE-PAIRED-NEXT:    plxv vs3, 59(r3), 0
273; BE-PAIRED-NEXT:    plxv vs2, 43(r3), 0
274; BE-PAIRED-NEXT:    pstxv vs1, 35(r3), 0
275; BE-PAIRED-NEXT:    pstxv vs0, 19(r3), 0
276; BE-PAIRED-NEXT:    pstxv vs3, 67(r3), 0
277; BE-PAIRED-NEXT:    pstxv vs2, 51(r3), 0
278; BE-PAIRED-NEXT:    blr
279;
280; LE-PWR9-LABEL: testUnalignedLdSt:
281; LE-PWR9:       # %bb.0: # %entry
282; LE-PWR9-NEXT:    addis r3, r2, f@toc@ha
283; LE-PWR9-NEXT:    li r4, 11
284; LE-PWR9-NEXT:    addi r3, r3, f@toc@l
285; LE-PWR9-NEXT:    lxvx vs0, r3, r4
286; LE-PWR9-NEXT:    li r4, 27
287; LE-PWR9-NEXT:    lxvx vs1, r3, r4
288; LE-PWR9-NEXT:    li r4, 43
289; LE-PWR9-NEXT:    lxvx vs2, r3, r4
290; LE-PWR9-NEXT:    li r4, 59
291; LE-PWR9-NEXT:    lxvx vs3, r3, r4
292; LE-PWR9-NEXT:    li r4, 67
293; LE-PWR9-NEXT:    stxvx vs3, r3, r4
294; LE-PWR9-NEXT:    li r4, 51
295; LE-PWR9-NEXT:    stxvx vs2, r3, r4
296; LE-PWR9-NEXT:    li r4, 35
297; LE-PWR9-NEXT:    stxvx vs1, r3, r4
298; LE-PWR9-NEXT:    li r4, 19
299; LE-PWR9-NEXT:    stxvx vs0, r3, r4
300; LE-PWR9-NEXT:    blr
301;
302; LE-PWR8-LABEL: testUnalignedLdSt:
303; LE-PWR8:       # %bb.0: # %entry
304; LE-PWR8-NEXT:    addis r3, r2, f@toc@ha
305; LE-PWR8-NEXT:    li r4, 43
306; LE-PWR8-NEXT:    li r5, 59
307; LE-PWR8-NEXT:    addi r3, r3, f@toc@l
308; LE-PWR8-NEXT:    lxvd2x vs0, r3, r4
309; LE-PWR8-NEXT:    li r4, 11
310; LE-PWR8-NEXT:    lxvd2x vs1, r3, r5
311; LE-PWR8-NEXT:    li r5, 27
312; LE-PWR8-NEXT:    lxvd2x vs2, r3, r4
313; LE-PWR8-NEXT:    lxvd2x vs3, r3, r5
314; LE-PWR8-NEXT:    li r4, 67
315; LE-PWR8-NEXT:    li r5, 51
316; LE-PWR8-NEXT:    stxvd2x vs1, r3, r4
317; LE-PWR8-NEXT:    li r4, 35
318; LE-PWR8-NEXT:    stxvd2x vs0, r3, r5
319; LE-PWR8-NEXT:    li r5, 19
320; LE-PWR8-NEXT:    stxvd2x vs3, r3, r4
321; LE-PWR8-NEXT:    stxvd2x vs2, r3, r5
322; LE-PWR8-NEXT:    blr
323;
324; BE-PWR9-LABEL: testUnalignedLdSt:
325; BE-PWR9:       # %bb.0: # %entry
326; BE-PWR9-NEXT:    addis r3, r2, f@toc@ha
327; BE-PWR9-NEXT:    li r4, 11
328; BE-PWR9-NEXT:    addi r3, r3, f@toc@l
329; BE-PWR9-NEXT:    lxvx vs0, r3, r4
330; BE-PWR9-NEXT:    li r4, 27
331; BE-PWR9-NEXT:    lxvx vs1, r3, r4
332; BE-PWR9-NEXT:    li r4, 43
333; BE-PWR9-NEXT:    lxvx vs2, r3, r4
334; BE-PWR9-NEXT:    li r4, 59
335; BE-PWR9-NEXT:    lxvx vs3, r3, r4
336; BE-PWR9-NEXT:    li r4, 67
337; BE-PWR9-NEXT:    stxvx vs3, r3, r4
338; BE-PWR9-NEXT:    li r4, 51
339; BE-PWR9-NEXT:    stxvx vs2, r3, r4
340; BE-PWR9-NEXT:    li r4, 35
341; BE-PWR9-NEXT:    stxvx vs1, r3, r4
342; BE-PWR9-NEXT:    li r4, 19
343; BE-PWR9-NEXT:    stxvx vs0, r3, r4
344; BE-PWR9-NEXT:    blr
345;
346; BE-PWR8-LABEL: testUnalignedLdSt:
347; BE-PWR8:       # %bb.0: # %entry
348; BE-PWR8-NEXT:    addis r3, r2, f@toc@ha
349; BE-PWR8-NEXT:    li r4, 43
350; BE-PWR8-NEXT:    li r5, 59
351; BE-PWR8-NEXT:    addi r3, r3, f@toc@l
352; BE-PWR8-NEXT:    lxvd2x vs0, r3, r4
353; BE-PWR8-NEXT:    li r4, 11
354; BE-PWR8-NEXT:    lxvd2x vs1, r3, r5
355; BE-PWR8-NEXT:    li r5, 27
356; BE-PWR8-NEXT:    lxvd2x vs2, r3, r4
357; BE-PWR8-NEXT:    lxvd2x vs3, r3, r5
358; BE-PWR8-NEXT:    li r4, 67
359; BE-PWR8-NEXT:    li r5, 51
360; BE-PWR8-NEXT:    stxvd2x vs1, r3, r4
361; BE-PWR8-NEXT:    li r4, 35
362; BE-PWR8-NEXT:    stxvd2x vs0, r3, r5
363; BE-PWR8-NEXT:    li r5, 19
364; BE-PWR8-NEXT:    stxvd2x vs3, r3, r4
365; BE-PWR8-NEXT:    stxvd2x vs2, r3, r5
366; BE-PWR8-NEXT:    blr
367entry:
368  %0 = bitcast <512 x i1>* @f to i8*
369  %add.ptr = getelementptr inbounds i8, i8* %0, i64 11
370  %add.ptr1 = getelementptr inbounds i8, i8* %0, i64 19
371  %1 = bitcast i8* %add.ptr to <512 x i1>*
372  %2 = bitcast i8* %add.ptr1 to <512 x i1>*
373  %3 = load <512 x i1>, <512 x i1>* %1, align 64
374  store <512 x i1> %3, <512 x i1>* %2, align 64
375  ret void
376}
377
378define dso_local void @testLdStPair(i64 %SrcIdx, i64 %DstIdx) {
379; LE-PAIRED-LABEL: testLdStPair:
380; LE-PAIRED:       # %bb.0: # %entry
381; LE-PAIRED-NEXT:    plxv v3, g@PCREL+32(0), 1
382; LE-PAIRED-NEXT:    plxv v2, g@PCREL+48(0), 1
383; LE-PAIRED-NEXT:    pstxv v3, g@PCREL+64(0), 1
384; LE-PAIRED-NEXT:    pstxv v2, g@PCREL+80(0), 1
385; LE-PAIRED-NEXT:    blr
386;
387; BE-PAIRED-LABEL: testLdStPair:
388; BE-PAIRED:       # %bb.0: # %entry
389; BE-PAIRED-NEXT:    addis r3, r2, g@toc@ha
390; BE-PAIRED-NEXT:    addi r3, r3, g@toc@l
391; BE-PAIRED-NEXT:    lxv v3, 48(r3)
392; BE-PAIRED-NEXT:    lxv v2, 32(r3)
393; BE-PAIRED-NEXT:    stxv v3, 80(r3)
394; BE-PAIRED-NEXT:    stxv v2, 64(r3)
395; BE-PAIRED-NEXT:    blr
396;
397; LE-PWR9-LABEL: testLdStPair:
398; LE-PWR9:       # %bb.0: # %entry
399; LE-PWR9-NEXT:    addis r3, r2, g@toc@ha
400; LE-PWR9-NEXT:    addi r3, r3, g@toc@l
401; LE-PWR9-NEXT:    lxv vs0, 32(r3)
402; LE-PWR9-NEXT:    lxv vs1, 48(r3)
403; LE-PWR9-NEXT:    stxv vs1, 80(r3)
404; LE-PWR9-NEXT:    stxv vs0, 64(r3)
405; LE-PWR9-NEXT:    blr
406;
407; LE-PWR8-LABEL: testLdStPair:
408; LE-PWR8:       # %bb.0: # %entry
409; LE-PWR8-NEXT:    addis r3, r2, g@toc@ha
410; LE-PWR8-NEXT:    li r4, 32
411; LE-PWR8-NEXT:    li r5, 48
412; LE-PWR8-NEXT:    addi r3, r3, g@toc@l
413; LE-PWR8-NEXT:    lxvd2x vs0, r3, r4
414; LE-PWR8-NEXT:    lxvd2x vs1, r3, r5
415; LE-PWR8-NEXT:    li r4, 80
416; LE-PWR8-NEXT:    li r5, 64
417; LE-PWR8-NEXT:    stxvd2x vs1, r3, r4
418; LE-PWR8-NEXT:    stxvd2x vs0, r3, r5
419; LE-PWR8-NEXT:    blr
420;
421; BE-PWR9-LABEL: testLdStPair:
422; BE-PWR9:       # %bb.0: # %entry
423; BE-PWR9-NEXT:    addis r3, r2, g@toc@ha
424; BE-PWR9-NEXT:    addi r3, r3, g@toc@l
425; BE-PWR9-NEXT:    lxv vs0, 32(r3)
426; BE-PWR9-NEXT:    lxv vs1, 48(r3)
427; BE-PWR9-NEXT:    stxv vs1, 80(r3)
428; BE-PWR9-NEXT:    stxv vs0, 64(r3)
429; BE-PWR9-NEXT:    blr
430;
431; BE-PWR8-LABEL: testLdStPair:
432; BE-PWR8:       # %bb.0: # %entry
433; BE-PWR8-NEXT:    addis r3, r2, g@toc@ha
434; BE-PWR8-NEXT:    li r4, 32
435; BE-PWR8-NEXT:    li r5, 48
436; BE-PWR8-NEXT:    addi r3, r3, g@toc@l
437; BE-PWR8-NEXT:    lxvd2x vs0, r3, r4
438; BE-PWR8-NEXT:    lxvd2x vs1, r3, r5
439; BE-PWR8-NEXT:    li r4, 80
440; BE-PWR8-NEXT:    li r5, 64
441; BE-PWR8-NEXT:    stxvd2x vs1, r3, r4
442; BE-PWR8-NEXT:    stxvd2x vs0, r3, r5
443; BE-PWR8-NEXT:    blr
444entry:
445  %arrayidx = getelementptr inbounds <256 x i1>, <256 x i1>* @g, i64 1
446  %0 = load <256 x i1>, <256 x i1>* %arrayidx, align 64
447  %arrayidx1 = getelementptr inbounds <256 x i1>, <256 x i1>* @g, i64 2
448  store <256 x i1> %0, <256 x i1>* %arrayidx1, align 64
449  ret void
450}
451
452define dso_local void @testXLdStPair(i64 %SrcIdx, i64 %DstIdx) {
453; LE-PAIRED-LABEL: testXLdStPair:
454; LE-PAIRED:       # %bb.0: # %entry
455; LE-PAIRED-NEXT:    sldi r3, r3, 5
456; LE-PAIRED-NEXT:    paddi r5, 0, g@PCREL, 1
457; LE-PAIRED-NEXT:    add r6, r5, r3
458; LE-PAIRED-NEXT:    lxvx v3, r5, r3
459; LE-PAIRED-NEXT:    sldi r3, r4, 5
460; LE-PAIRED-NEXT:    lxv v2, 16(r6)
461; LE-PAIRED-NEXT:    add r4, r5, r3
462; LE-PAIRED-NEXT:    stxvx v3, r5, r3
463; LE-PAIRED-NEXT:    stxv v2, 16(r4)
464; LE-PAIRED-NEXT:    blr
465;
466; BE-PAIRED-LABEL: testXLdStPair:
467; BE-PAIRED:       # %bb.0: # %entry
468; BE-PAIRED-NEXT:    addis r5, r2, g@toc@ha
469; BE-PAIRED-NEXT:    sldi r3, r3, 5
470; BE-PAIRED-NEXT:    addi r5, r5, g@toc@l
471; BE-PAIRED-NEXT:    add r6, r5, r3
472; BE-PAIRED-NEXT:    lxvx v2, r5, r3
473; BE-PAIRED-NEXT:    sldi r3, r4, 5
474; BE-PAIRED-NEXT:    lxv v3, 16(r6)
475; BE-PAIRED-NEXT:    add r4, r5, r3
476; BE-PAIRED-NEXT:    stxvx v2, r5, r3
477; BE-PAIRED-NEXT:    stxv v3, 16(r4)
478; BE-PAIRED-NEXT:    blr
479;
480; LE-PWR9-LABEL: testXLdStPair:
481; LE-PWR9:       # %bb.0: # %entry
482; LE-PWR9-NEXT:    addis r5, r2, g@toc@ha
483; LE-PWR9-NEXT:    sldi r3, r3, 5
484; LE-PWR9-NEXT:    sldi r4, r4, 5
485; LE-PWR9-NEXT:    addi r5, r5, g@toc@l
486; LE-PWR9-NEXT:    add r6, r5, r3
487; LE-PWR9-NEXT:    lxvx vs1, r5, r3
488; LE-PWR9-NEXT:    lxv vs0, 16(r6)
489; LE-PWR9-NEXT:    add r6, r5, r4
490; LE-PWR9-NEXT:    stxvx vs1, r5, r4
491; LE-PWR9-NEXT:    stxv vs0, 16(r6)
492; LE-PWR9-NEXT:    blr
493;
494; LE-PWR8-LABEL: testXLdStPair:
495; LE-PWR8:       # %bb.0: # %entry
496; LE-PWR8-NEXT:    addis r5, r2, g@toc@ha
497; LE-PWR8-NEXT:    sldi r3, r3, 5
498; LE-PWR8-NEXT:    li r7, 16
499; LE-PWR8-NEXT:    addi r5, r5, g@toc@l
500; LE-PWR8-NEXT:    add r6, r5, r3
501; LE-PWR8-NEXT:    lxvd2x vs1, r5, r3
502; LE-PWR8-NEXT:    sldi r3, r4, 5
503; LE-PWR8-NEXT:    lxvd2x vs0, r6, r7
504; LE-PWR8-NEXT:    add r4, r5, r3
505; LE-PWR8-NEXT:    stxvd2x vs1, r5, r3
506; LE-PWR8-NEXT:    stxvd2x vs0, r4, r7
507; LE-PWR8-NEXT:    blr
508;
509; BE-PWR9-LABEL: testXLdStPair:
510; BE-PWR9:       # %bb.0: # %entry
511; BE-PWR9-NEXT:    addis r5, r2, g@toc@ha
512; BE-PWR9-NEXT:    sldi r3, r3, 5
513; BE-PWR9-NEXT:    sldi r4, r4, 5
514; BE-PWR9-NEXT:    addi r5, r5, g@toc@l
515; BE-PWR9-NEXT:    add r6, r5, r3
516; BE-PWR9-NEXT:    lxvx vs1, r5, r3
517; BE-PWR9-NEXT:    lxv vs0, 16(r6)
518; BE-PWR9-NEXT:    add r6, r5, r4
519; BE-PWR9-NEXT:    stxvx vs1, r5, r4
520; BE-PWR9-NEXT:    stxv vs0, 16(r6)
521; BE-PWR9-NEXT:    blr
522;
523; BE-PWR8-LABEL: testXLdStPair:
524; BE-PWR8:       # %bb.0: # %entry
525; BE-PWR8-NEXT:    addis r5, r2, g@toc@ha
526; BE-PWR8-NEXT:    sldi r3, r3, 5
527; BE-PWR8-NEXT:    li r7, 16
528; BE-PWR8-NEXT:    addi r5, r5, g@toc@l
529; BE-PWR8-NEXT:    add r6, r5, r3
530; BE-PWR8-NEXT:    lxvd2x vs0, r5, r3
531; BE-PWR8-NEXT:    sldi r3, r4, 5
532; BE-PWR8-NEXT:    lxvd2x vs1, r6, r7
533; BE-PWR8-NEXT:    add r4, r5, r3
534; BE-PWR8-NEXT:    stxvd2x vs0, r5, r3
535; BE-PWR8-NEXT:    stxvd2x vs1, r4, r7
536; BE-PWR8-NEXT:    blr
537entry:
538  %arrayidx = getelementptr inbounds <256 x i1>, <256 x i1>* @g, i64 %SrcIdx
539  %0 = load <256 x i1>, <256 x i1>* %arrayidx, align 64
540  %arrayidx1 = getelementptr inbounds <256 x i1>, <256 x i1>* @g, i64 %DstIdx
541  store <256 x i1> %0, <256 x i1>* %arrayidx1, align 64
542  ret void
543}
544
545define dso_local void @testUnalignedLdStPair() {
546; LE-PAIRED-LABEL: testUnalignedLdStPair:
547; LE-PAIRED:       # %bb.0: # %entry
548; LE-PAIRED-NEXT:    plxv v3, g@PCREL+11(0), 1
549; LE-PAIRED-NEXT:    plxv v2, g@PCREL+27(0), 1
550; LE-PAIRED-NEXT:    pstxv v3, g@PCREL+19(0), 1
551; LE-PAIRED-NEXT:    pstxv v2, g@PCREL+35(0), 1
552; LE-PAIRED-NEXT:    blr
553;
554; BE-PAIRED-LABEL: testUnalignedLdStPair:
555; BE-PAIRED:       # %bb.0: # %entry
556; BE-PAIRED-NEXT:    addis r3, r2, g@toc@ha
557; BE-PAIRED-NEXT:    addi r3, r3, g@toc@l
558; BE-PAIRED-NEXT:    plxv v3, 27(r3), 0
559; BE-PAIRED-NEXT:    plxv v2, 11(r3), 0
560; BE-PAIRED-NEXT:    pstxv v3, 35(r3), 0
561; BE-PAIRED-NEXT:    pstxv v2, 19(r3), 0
562; BE-PAIRED-NEXT:    blr
563;
564; LE-PWR9-LABEL: testUnalignedLdStPair:
565; LE-PWR9:       # %bb.0: # %entry
566; LE-PWR9-NEXT:    addis r3, r2, g@toc@ha
567; LE-PWR9-NEXT:    li r4, 11
568; LE-PWR9-NEXT:    addi r3, r3, g@toc@l
569; LE-PWR9-NEXT:    lxvx vs0, r3, r4
570; LE-PWR9-NEXT:    li r4, 27
571; LE-PWR9-NEXT:    lxvx vs1, r3, r4
572; LE-PWR9-NEXT:    li r4, 35
573; LE-PWR9-NEXT:    stxvx vs1, r3, r4
574; LE-PWR9-NEXT:    li r4, 19
575; LE-PWR9-NEXT:    stxvx vs0, r3, r4
576; LE-PWR9-NEXT:    blr
577;
578; LE-PWR8-LABEL: testUnalignedLdStPair:
579; LE-PWR8:       # %bb.0: # %entry
580; LE-PWR8-NEXT:    addis r3, r2, g@toc@ha
581; LE-PWR8-NEXT:    li r4, 11
582; LE-PWR8-NEXT:    li r5, 27
583; LE-PWR8-NEXT:    addi r3, r3, g@toc@l
584; LE-PWR8-NEXT:    lxvd2x vs0, r3, r4
585; LE-PWR8-NEXT:    lxvd2x vs1, r3, r5
586; LE-PWR8-NEXT:    li r4, 35
587; LE-PWR8-NEXT:    li r5, 19
588; LE-PWR8-NEXT:    stxvd2x vs1, r3, r4
589; LE-PWR8-NEXT:    stxvd2x vs0, r3, r5
590; LE-PWR8-NEXT:    blr
591;
592; BE-PWR9-LABEL: testUnalignedLdStPair:
593; BE-PWR9:       # %bb.0: # %entry
594; BE-PWR9-NEXT:    addis r3, r2, g@toc@ha
595; BE-PWR9-NEXT:    li r4, 11
596; BE-PWR9-NEXT:    addi r3, r3, g@toc@l
597; BE-PWR9-NEXT:    lxvx vs0, r3, r4
598; BE-PWR9-NEXT:    li r4, 27
599; BE-PWR9-NEXT:    lxvx vs1, r3, r4
600; BE-PWR9-NEXT:    li r4, 35
601; BE-PWR9-NEXT:    stxvx vs1, r3, r4
602; BE-PWR9-NEXT:    li r4, 19
603; BE-PWR9-NEXT:    stxvx vs0, r3, r4
604; BE-PWR9-NEXT:    blr
605;
606; BE-PWR8-LABEL: testUnalignedLdStPair:
607; BE-PWR8:       # %bb.0: # %entry
608; BE-PWR8-NEXT:    addis r3, r2, g@toc@ha
609; BE-PWR8-NEXT:    li r4, 11
610; BE-PWR8-NEXT:    li r5, 27
611; BE-PWR8-NEXT:    addi r3, r3, g@toc@l
612; BE-PWR8-NEXT:    lxvd2x vs0, r3, r4
613; BE-PWR8-NEXT:    lxvd2x vs1, r3, r5
614; BE-PWR8-NEXT:    li r4, 35
615; BE-PWR8-NEXT:    li r5, 19
616; BE-PWR8-NEXT:    stxvd2x vs1, r3, r4
617; BE-PWR8-NEXT:    stxvd2x vs0, r3, r5
618; BE-PWR8-NEXT:    blr
619entry:
620  %0 = bitcast <256 x i1>* @g to i8*
621  %add.ptr = getelementptr inbounds i8, i8* %0, i64 11
622  %add.ptr1 = getelementptr inbounds i8, i8* %0, i64 19
623  %1 = bitcast i8* %add.ptr to <256 x i1>*
624  %2 = bitcast i8* %add.ptr1 to <256 x i1>*
625  %3 = load <256 x i1>, <256 x i1>* %1, align 64
626  store <256 x i1> %3, <256 x i1>* %2, align 64
627  ret void
628}
629