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