xref: /llvm-project/llvm/test/CodeGen/PowerPC/v8i16_scalar_to_vector_shuffle.ll (revision 4981f8cb72ea7d04da601c868763b38bdc11e74e)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -mcpu=pwr8 -ppc-asm-full-reg-names \
3; RUN:   -ppc-vsr-nums-as-vr -mtriple=powerpc64le-unknown-linux-gnu < %s | \
4; RUN: FileCheck %s --check-prefix=CHECK-LE-P8
5; RUN: llc -verify-machineinstrs -mcpu=pwr9 -ppc-asm-full-reg-names \
6; RUN:   -ppc-vsr-nums-as-vr -mtriple=powerpc64le-unknown-linux-gnu < %s | \
7; RUN: FileCheck %s --check-prefix=CHECK-LE-P9
8; RUN: llc -verify-machineinstrs -mcpu=pwr8 -ppc-asm-full-reg-names \
9; RUN:   -ppc-vsr-nums-as-vr -mtriple=powerpc64-unknown-linux-gnu < %s | \
10; RUN: FileCheck %s --check-prefix=CHECK-BE-P8
11; RUN: llc -verify-machineinstrs -mcpu=pwr9 -ppc-asm-full-reg-names \
12; RUN:   -ppc-vsr-nums-as-vr -mtriple=powerpc64-unknown-linux-gnu < %s | \
13; RUN: FileCheck %s --check-prefix=CHECK-BE-P9
14
15; RUN: llc -verify-machineinstrs -mcpu=pwr8 -ppc-asm-full-reg-names \
16; RUN:   -ppc-vsr-nums-as-vr -mtriple=powerpc64-ibm-aix < %s | \
17; RUN: FileCheck %s --check-prefix=CHECK-AIX-64-P8
18; RUN: llc -verify-machineinstrs -mcpu=pwr9 -ppc-asm-full-reg-names \
19; RUN:   -ppc-vsr-nums-as-vr -mtriple=powerpc64-ibm-aix < %s | \
20; RUN: FileCheck %s --check-prefix=CHECK-AIX-64-P9
21; RUN: llc -verify-machineinstrs -mcpu=pwr8 -ppc-asm-full-reg-names \
22; RUN:   -ppc-vsr-nums-as-vr -mtriple=powerpc-ibm-aix < %s | \
23; RUN: FileCheck %s --check-prefix=CHECK-AIX-32-P8
24; RUN: llc -verify-machineinstrs -mcpu=pwr9 -ppc-asm-full-reg-names \
25; RUN:   -ppc-vsr-nums-as-vr -mtriple=powerpc-ibm-aix < %s | \
26; RUN: FileCheck %s --check-prefix=CHECK-AIX-32-P9
27
28define void @test_none_v8i16(ptr %a0, ptr %a1, <16 x i8> %a, <8 x i16> %b, i8 %arg) {
29; CHECK-LE-P8-LABEL: test_none_v8i16:
30; CHECK-LE-P8:       # %bb.0: # %entry
31; CHECK-LE-P8-NEXT:    addis r4, r2, .LCPI0_0@toc@ha
32; CHECK-LE-P8-NEXT:    lhz r3, 0(r3)
33; CHECK-LE-P8-NEXT:    addi r4, r4, .LCPI0_0@toc@l
34; CHECK-LE-P8-NEXT:    mtvsrd v4, r3
35; CHECK-LE-P8-NEXT:    lxvd2x vs0, 0, r4
36; CHECK-LE-P8-NEXT:    xxswapd v3, vs0
37; CHECK-LE-P8-NEXT:    vperm v2, v4, v2, v3
38; CHECK-LE-P8-NEXT:    xxswapd vs0, v2
39; CHECK-LE-P8-NEXT:    stxvd2x vs0, 0, r3
40; CHECK-LE-P8-NEXT:    blr
41;
42; CHECK-LE-P9-LABEL: test_none_v8i16:
43; CHECK-LE-P9:       # %bb.0: # %entry
44; CHECK-LE-P9-NEXT:    lxsihzx f0, 0, r3
45; CHECK-LE-P9-NEXT:    addis r3, r2, .LCPI0_0@toc@ha
46; CHECK-LE-P9-NEXT:    addi r3, r3, .LCPI0_0@toc@l
47; CHECK-LE-P9-NEXT:    lxv vs1, 0(r3)
48; CHECK-LE-P9-NEXT:    xxperm v2, vs0, vs1
49; CHECK-LE-P9-NEXT:    stxv v2, 0(r3)
50; CHECK-LE-P9-NEXT:    blr
51;
52; CHECK-BE-P8-LABEL: test_none_v8i16:
53; CHECK-BE-P8:       # %bb.0: # %entry
54; CHECK-BE-P8-NEXT:    lhz r3, 0(r3)
55; CHECK-BE-P8-NEXT:    mtvsrwz v3, r3
56; CHECK-BE-P8-NEXT:    addis r3, r2, .LCPI0_0@toc@ha
57; CHECK-BE-P8-NEXT:    addi r3, r3, .LCPI0_0@toc@l
58; CHECK-BE-P8-NEXT:    lxvw4x v4, 0, r3
59; CHECK-BE-P8-NEXT:    vperm v2, v2, v3, v4
60; CHECK-BE-P8-NEXT:    stxvw4x v2, 0, r3
61; CHECK-BE-P8-NEXT:    blr
62;
63; CHECK-BE-P9-LABEL: test_none_v8i16:
64; CHECK-BE-P9:       # %bb.0: # %entry
65; CHECK-BE-P9-NEXT:    lxsihzx f0, 0, r3
66; CHECK-BE-P9-NEXT:    addis r3, r2, .LCPI0_0@toc@ha
67; CHECK-BE-P9-NEXT:    addi r3, r3, .LCPI0_0@toc@l
68; CHECK-BE-P9-NEXT:    lxv vs1, 0(r3)
69; CHECK-BE-P9-NEXT:    xxperm vs0, v2, vs1
70; CHECK-BE-P9-NEXT:    stxv vs0, 0(r3)
71; CHECK-BE-P9-NEXT:    blr
72;
73; CHECK-AIX-64-P8-LABEL: test_none_v8i16:
74; CHECK-AIX-64-P8:       # %bb.0: # %entry
75; CHECK-AIX-64-P8-NEXT:    lhz r3, 0(r3)
76; CHECK-AIX-64-P8-NEXT:    mtvsrwz v3, r3
77; CHECK-AIX-64-P8-NEXT:    ld r3, L..C0(r2) # %const.0
78; CHECK-AIX-64-P8-NEXT:    lxvw4x v4, 0, r3
79; CHECK-AIX-64-P8-NEXT:    vperm v2, v2, v3, v4
80; CHECK-AIX-64-P8-NEXT:    stxvw4x v2, 0, r3
81; CHECK-AIX-64-P8-NEXT:    blr
82;
83; CHECK-AIX-64-P9-LABEL: test_none_v8i16:
84; CHECK-AIX-64-P9:       # %bb.0: # %entry
85; CHECK-AIX-64-P9-NEXT:    lxsihzx f0, 0, r3
86; CHECK-AIX-64-P9-NEXT:    ld r3, L..C0(r2) # %const.0
87; CHECK-AIX-64-P9-NEXT:    lxv vs1, 0(r3)
88; CHECK-AIX-64-P9-NEXT:    xxperm vs0, v2, vs1
89; CHECK-AIX-64-P9-NEXT:    stxv vs0, 0(r3)
90; CHECK-AIX-64-P9-NEXT:    blr
91;
92; CHECK-AIX-32-P8-LABEL: test_none_v8i16:
93; CHECK-AIX-32-P8:       # %bb.0: # %entry
94; CHECK-AIX-32-P8-NEXT:    lhz r3, 0(r3)
95; CHECK-AIX-32-P8-NEXT:    mtvsrwz v3, r3
96; CHECK-AIX-32-P8-NEXT:    lwz r3, L..C0(r2) # %const.0
97; CHECK-AIX-32-P8-NEXT:    lxvw4x v4, 0, r3
98; CHECK-AIX-32-P8-NEXT:    vperm v2, v2, v3, v4
99; CHECK-AIX-32-P8-NEXT:    stxvw4x v2, 0, r3
100; CHECK-AIX-32-P8-NEXT:    blr
101;
102; CHECK-AIX-32-P9-LABEL: test_none_v8i16:
103; CHECK-AIX-32-P9:       # %bb.0: # %entry
104; CHECK-AIX-32-P9-NEXT:    lxsihzx f0, 0, r3
105; CHECK-AIX-32-P9-NEXT:    lwz r3, L..C0(r2) # %const.0
106; CHECK-AIX-32-P9-NEXT:    lxv vs1, 0(r3)
107; CHECK-AIX-32-P9-NEXT:    xxperm vs0, v2, vs1
108; CHECK-AIX-32-P9-NEXT:    stxv vs0, 0(r3)
109; CHECK-AIX-32-P9-NEXT:    blr
110entry:
111  %load0.tmp = load <2 x i8>, ptr %a0
112  %load0.tmp1 = bitcast <2 x i8> %load0.tmp to i16
113  %load0 = insertelement <8 x i16> %b, i16 %load0.tmp1, i64 0
114  %load1.tmp = insertelement <16 x i8> %a, i8 %arg, i32 0
115  %load1 = bitcast <16 x i8> %load1.tmp to <8 x i16>
116  %shuff = shufflevector <8 x i16> %load0, <8 x i16> %load1, <8 x i32> <i32 9, i32 0, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
117  store <8 x i16> %shuff, ptr undef
118  ret void
119}
120
121define void @test_v8i16_none(ptr %a0, ptr %a1, <16 x i8> %a, <8 x i16> %b, i8 %arg) {
122; CHECK-LE-P8-LABEL: test_v8i16_none:
123; CHECK-LE-P8:       # %bb.0: # %entry
124; CHECK-LE-P8-NEXT:    addis r4, r2, .LCPI1_0@toc@ha
125; CHECK-LE-P8-NEXT:    mtvsrd v4, r9
126; CHECK-LE-P8-NEXT:    lhz r3, 0(r3)
127; CHECK-LE-P8-NEXT:    addi r4, r4, .LCPI1_0@toc@l
128; CHECK-LE-P8-NEXT:    lxvd2x vs0, 0, r4
129; CHECK-LE-P8-NEXT:    addis r4, r2, .LCPI1_1@toc@ha
130; CHECK-LE-P8-NEXT:    addi r4, r4, .LCPI1_1@toc@l
131; CHECK-LE-P8-NEXT:    xxswapd v3, vs0
132; CHECK-LE-P8-NEXT:    lxvd2x vs0, 0, r4
133; CHECK-LE-P8-NEXT:    vperm v2, v2, v4, v3
134; CHECK-LE-P8-NEXT:    mtvsrd v4, r3
135; CHECK-LE-P8-NEXT:    xxswapd v3, vs0
136; CHECK-LE-P8-NEXT:    vperm v2, v2, v4, v3
137; CHECK-LE-P8-NEXT:    xxswapd vs0, v2
138; CHECK-LE-P8-NEXT:    stxvd2x vs0, 0, r3
139; CHECK-LE-P8-NEXT:    blr
140;
141; CHECK-LE-P9-LABEL: test_v8i16_none:
142; CHECK-LE-P9:       # %bb.0: # %entry
143; CHECK-LE-P9-NEXT:    lxsihzx f0, 0, r3
144; CHECK-LE-P9-NEXT:    addis r3, r2, .LCPI1_0@toc@ha
145; CHECK-LE-P9-NEXT:    mtvsrwz v3, r9
146; CHECK-LE-P9-NEXT:    addi r3, r3, .LCPI1_0@toc@l
147; CHECK-LE-P9-NEXT:    vinsertb v2, v3, 15
148; CHECK-LE-P9-NEXT:    lxv vs1, 0(r3)
149; CHECK-LE-P9-NEXT:    xxperm vs0, v2, vs1
150; CHECK-LE-P9-NEXT:    stxv vs0, 0(r3)
151; CHECK-LE-P9-NEXT:    blr
152;
153; CHECK-BE-P8-LABEL: test_v8i16_none:
154; CHECK-BE-P8:       # %bb.0: # %entry
155; CHECK-BE-P8-NEXT:    addis r4, r2, .LCPI1_0@toc@ha
156; CHECK-BE-P8-NEXT:    mtvsrwz v4, r9
157; CHECK-BE-P8-NEXT:    lhz r3, 0(r3)
158; CHECK-BE-P8-NEXT:    addi r4, r4, .LCPI1_0@toc@l
159; CHECK-BE-P8-NEXT:    lxvw4x v3, 0, r4
160; CHECK-BE-P8-NEXT:    vperm v2, v4, v2, v3
161; CHECK-BE-P8-NEXT:    mtvsrwz v3, r3
162; CHECK-BE-P8-NEXT:    addis r3, r2, .LCPI1_1@toc@ha
163; CHECK-BE-P8-NEXT:    addi r3, r3, .LCPI1_1@toc@l
164; CHECK-BE-P8-NEXT:    lxvw4x v4, 0, r3
165; CHECK-BE-P8-NEXT:    vperm v2, v3, v2, v4
166; CHECK-BE-P8-NEXT:    stxvw4x v2, 0, r3
167; CHECK-BE-P8-NEXT:    blr
168;
169; CHECK-BE-P9-LABEL: test_v8i16_none:
170; CHECK-BE-P9:       # %bb.0: # %entry
171; CHECK-BE-P9-NEXT:    lxsihzx f0, 0, r3
172; CHECK-BE-P9-NEXT:    addis r3, r2, .LCPI1_0@toc@ha
173; CHECK-BE-P9-NEXT:    mtvsrwz v3, r9
174; CHECK-BE-P9-NEXT:    addi r3, r3, .LCPI1_0@toc@l
175; CHECK-BE-P9-NEXT:    vinsertb v2, v3, 0
176; CHECK-BE-P9-NEXT:    lxv vs1, 0(r3)
177; CHECK-BE-P9-NEXT:    xxperm v2, vs0, vs1
178; CHECK-BE-P9-NEXT:    stxv v2, 0(r3)
179; CHECK-BE-P9-NEXT:    blr
180;
181; CHECK-AIX-64-P8-LABEL: test_v8i16_none:
182; CHECK-AIX-64-P8:       # %bb.0: # %entry
183; CHECK-AIX-64-P8-NEXT:    ld r4, L..C1(r2) # %const.0
184; CHECK-AIX-64-P8-NEXT:    mtvsrwz v4, r5
185; CHECK-AIX-64-P8-NEXT:    lhz r3, 0(r3)
186; CHECK-AIX-64-P8-NEXT:    lxvw4x v3, 0, r4
187; CHECK-AIX-64-P8-NEXT:    vperm v2, v4, v2, v3
188; CHECK-AIX-64-P8-NEXT:    mtvsrwz v3, r3
189; CHECK-AIX-64-P8-NEXT:    ld r3, L..C2(r2) # %const.1
190; CHECK-AIX-64-P8-NEXT:    lxvw4x v4, 0, r3
191; CHECK-AIX-64-P8-NEXT:    vperm v2, v3, v2, v4
192; CHECK-AIX-64-P8-NEXT:    stxvw4x v2, 0, r3
193; CHECK-AIX-64-P8-NEXT:    blr
194;
195; CHECK-AIX-64-P9-LABEL: test_v8i16_none:
196; CHECK-AIX-64-P9:       # %bb.0: # %entry
197; CHECK-AIX-64-P9-NEXT:    lxsihzx f0, 0, r3
198; CHECK-AIX-64-P9-NEXT:    ld r3, L..C1(r2) # %const.0
199; CHECK-AIX-64-P9-NEXT:    mtvsrwz v3, r5
200; CHECK-AIX-64-P9-NEXT:    vinsertb v2, v3, 0
201; CHECK-AIX-64-P9-NEXT:    lxv vs1, 0(r3)
202; CHECK-AIX-64-P9-NEXT:    xxperm v2, vs0, vs1
203; CHECK-AIX-64-P9-NEXT:    stxv v2, 0(r3)
204; CHECK-AIX-64-P9-NEXT:    blr
205;
206; CHECK-AIX-32-P8-LABEL: test_v8i16_none:
207; CHECK-AIX-32-P8:       # %bb.0: # %entry
208; CHECK-AIX-32-P8-NEXT:    lwz r4, L..C1(r2) # %const.0
209; CHECK-AIX-32-P8-NEXT:    mtvsrwz v4, r5
210; CHECK-AIX-32-P8-NEXT:    lhz r3, 0(r3)
211; CHECK-AIX-32-P8-NEXT:    lxvw4x v3, 0, r4
212; CHECK-AIX-32-P8-NEXT:    vperm v2, v4, v2, v3
213; CHECK-AIX-32-P8-NEXT:    mtvsrwz v3, r3
214; CHECK-AIX-32-P8-NEXT:    lwz r3, L..C2(r2) # %const.1
215; CHECK-AIX-32-P8-NEXT:    lxvw4x v4, 0, r3
216; CHECK-AIX-32-P8-NEXT:    vperm v2, v3, v2, v4
217; CHECK-AIX-32-P8-NEXT:    stxvw4x v2, 0, r3
218; CHECK-AIX-32-P8-NEXT:    blr
219;
220; CHECK-AIX-32-P9-LABEL: test_v8i16_none:
221; CHECK-AIX-32-P9:       # %bb.0: # %entry
222; CHECK-AIX-32-P9-NEXT:    lxsihzx f0, 0, r3
223; CHECK-AIX-32-P9-NEXT:    lwz r3, L..C1(r2) # %const.0
224; CHECK-AIX-32-P9-NEXT:    mtvsrwz v3, r5
225; CHECK-AIX-32-P9-NEXT:    vinsertb v2, v3, 0
226; CHECK-AIX-32-P9-NEXT:    lxv vs1, 0(r3)
227; CHECK-AIX-32-P9-NEXT:    xxperm v2, vs0, vs1
228; CHECK-AIX-32-P9-NEXT:    stxv v2, 0(r3)
229; CHECK-AIX-32-P9-NEXT:    blr
230entry:
231  %load0.tmp = load <2 x i8>, ptr %a0
232  %load0.tmp1 = bitcast <2 x i8> %load0.tmp to i16
233  %load0 = insertelement <8 x i16> %b, i16 %load0.tmp1, i64 0
234  %load1.tmp = insertelement <16 x i8> %a, i8 %arg, i32 0
235  %load1 = bitcast <16 x i8> %load1.tmp to <8 x i16>
236  %shuff = shufflevector <8 x i16> %load0, <8 x i16> %load1, <8 x i32> <i32 0, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14>
237  store <8 x i16> %shuff, ptr undef
238  ret void
239}
240
241define void @test_none_v4i32(ptr %ptr, ptr %ptr2, i8 %v3) local_unnamed_addr #0 {
242; CHECK-LE-P8-LABEL: test_none_v4i32:
243; CHECK-LE-P8:       # %bb.0: # %entry
244; CHECK-LE-P8-NEXT:    mtfprd f0, r5
245; CHECK-LE-P8-NEXT:    addis r4, r2, .LCPI2_0@toc@ha
246; CHECK-LE-P8-NEXT:    lxsiwzx v4, 0, r3
247; CHECK-LE-P8-NEXT:    addi r4, r4, .LCPI2_0@toc@l
248; CHECK-LE-P8-NEXT:    xxswapd v2, vs0
249; CHECK-LE-P8-NEXT:    lxvd2x vs0, 0, r4
250; CHECK-LE-P8-NEXT:    vmrglh v2, v2, v2
251; CHECK-LE-P8-NEXT:    xxswapd v3, vs0
252; CHECK-LE-P8-NEXT:    vperm v2, v2, v4, v3
253; CHECK-LE-P8-NEXT:    xxswapd vs0, v2
254; CHECK-LE-P8-NEXT:    stfdx f0, 0, r3
255; CHECK-LE-P8-NEXT:    blr
256;
257; CHECK-LE-P9-LABEL: test_none_v4i32:
258; CHECK-LE-P9:       # %bb.0: # %entry
259; CHECK-LE-P9-NEXT:    lxsiwzx v2, 0, r3
260; CHECK-LE-P9-NEXT:    addis r3, r2, .LCPI2_0@toc@ha
261; CHECK-LE-P9-NEXT:    mtfprd f0, r5
262; CHECK-LE-P9-NEXT:    addi r3, r3, .LCPI2_0@toc@l
263; CHECK-LE-P9-NEXT:    xxswapd v3, vs0
264; CHECK-LE-P9-NEXT:    lxv v4, 0(r3)
265; CHECK-LE-P9-NEXT:    vmrglh v3, v3, v3
266; CHECK-LE-P9-NEXT:    vperm v2, v3, v2, v4
267; CHECK-LE-P9-NEXT:    xxswapd vs0, v2
268; CHECK-LE-P9-NEXT:    stfd f0, 0(r3)
269; CHECK-LE-P9-NEXT:    blr
270;
271; CHECK-BE-P8-LABEL: test_none_v4i32:
272; CHECK-BE-P8:       # %bb.0: # %entry
273; CHECK-BE-P8-NEXT:    sldi r4, r5, 56
274; CHECK-BE-P8-NEXT:    lxsiwzx v3, 0, r3
275; CHECK-BE-P8-NEXT:    addis r3, r2, .LCPI2_0@toc@ha
276; CHECK-BE-P8-NEXT:    mtvsrd v2, r4
277; CHECK-BE-P8-NEXT:    addi r3, r3, .LCPI2_0@toc@l
278; CHECK-BE-P8-NEXT:    lxvw4x v4, 0, r3
279; CHECK-BE-P8-NEXT:    vmrghh v2, v2, v2
280; CHECK-BE-P8-NEXT:    vperm v2, v3, v2, v4
281; CHECK-BE-P8-NEXT:    stxsdx v2, 0, r3
282; CHECK-BE-P8-NEXT:    blr
283;
284; CHECK-BE-P9-LABEL: test_none_v4i32:
285; CHECK-BE-P9:       # %bb.0: # %entry
286; CHECK-BE-P9-NEXT:    lxsiwzx v2, 0, r3
287; CHECK-BE-P9-NEXT:    sldi r3, r5, 56
288; CHECK-BE-P9-NEXT:    mtvsrd v3, r3
289; CHECK-BE-P9-NEXT:    addis r3, r2, .LCPI2_0@toc@ha
290; CHECK-BE-P9-NEXT:    addi r3, r3, .LCPI2_0@toc@l
291; CHECK-BE-P9-NEXT:    vmrghh v3, v3, v3
292; CHECK-BE-P9-NEXT:    lxv v4, 0(r3)
293; CHECK-BE-P9-NEXT:    vperm v2, v2, v3, v4
294; CHECK-BE-P9-NEXT:    stxsd v2, 0(r3)
295; CHECK-BE-P9-NEXT:    blr
296;
297; CHECK-AIX-64-P8-LABEL: test_none_v4i32:
298; CHECK-AIX-64-P8:       # %bb.0: # %entry
299; CHECK-AIX-64-P8-NEXT:    sldi r4, r5, 56
300; CHECK-AIX-64-P8-NEXT:    lxsiwzx v3, 0, r3
301; CHECK-AIX-64-P8-NEXT:    ld r3, L..C3(r2) # %const.0
302; CHECK-AIX-64-P8-NEXT:    mtvsrd v2, r4
303; CHECK-AIX-64-P8-NEXT:    lxvw4x v4, 0, r3
304; CHECK-AIX-64-P8-NEXT:    vmrghh v2, v2, v2
305; CHECK-AIX-64-P8-NEXT:    vperm v2, v3, v2, v4
306; CHECK-AIX-64-P8-NEXT:    stxsdx v2, 0, r3
307; CHECK-AIX-64-P8-NEXT:    blr
308;
309; CHECK-AIX-64-P9-LABEL: test_none_v4i32:
310; CHECK-AIX-64-P9:       # %bb.0: # %entry
311; CHECK-AIX-64-P9-NEXT:    lxsiwzx v2, 0, r3
312; CHECK-AIX-64-P9-NEXT:    sldi r3, r5, 56
313; CHECK-AIX-64-P9-NEXT:    mtvsrd v3, r3
314; CHECK-AIX-64-P9-NEXT:    ld r3, L..C2(r2) # %const.0
315; CHECK-AIX-64-P9-NEXT:    vmrghh v3, v3, v3
316; CHECK-AIX-64-P9-NEXT:    lxv v4, 0(r3)
317; CHECK-AIX-64-P9-NEXT:    vperm v2, v2, v3, v4
318; CHECK-AIX-64-P9-NEXT:    stxsd v2, 0(r3)
319; CHECK-AIX-64-P9-NEXT:    blr
320;
321; CHECK-AIX-32-P8-LABEL: test_none_v4i32:
322; CHECK-AIX-32-P8:       # %bb.0: # %entry
323; CHECK-AIX-32-P8-NEXT:    lxsiwzx v2, 0, r3
324; CHECK-AIX-32-P8-NEXT:    addi r3, r1, -32
325; CHECK-AIX-32-P8-NEXT:    stb r5, -32(r1)
326; CHECK-AIX-32-P8-NEXT:    lxvw4x v3, 0, r3
327; CHECK-AIX-32-P8-NEXT:    lwz r3, L..C3(r2) # %const.0
328; CHECK-AIX-32-P8-NEXT:    lxvw4x v4, 0, r3
329; CHECK-AIX-32-P8-NEXT:    addi r3, r1, -16
330; CHECK-AIX-32-P8-NEXT:    vmrghh v3, v3, v3
331; CHECK-AIX-32-P8-NEXT:    vperm v2, v2, v3, v4
332; CHECK-AIX-32-P8-NEXT:    stxvw4x v2, 0, r3
333; CHECK-AIX-32-P8-NEXT:    lwz r3, -12(r1)
334; CHECK-AIX-32-P8-NEXT:    stw r3, 0(r3)
335; CHECK-AIX-32-P8-NEXT:    lwz r3, -16(r1)
336; CHECK-AIX-32-P8-NEXT:    stw r3, 0(r3)
337; CHECK-AIX-32-P8-NEXT:    blr
338;
339; CHECK-AIX-32-P9-LABEL: test_none_v4i32:
340; CHECK-AIX-32-P9:       # %bb.0: # %entry
341; CHECK-AIX-32-P9-NEXT:    lxsiwzx v2, 0, r3
342; CHECK-AIX-32-P9-NEXT:    lwz r3, L..C2(r2) # %const.0
343; CHECK-AIX-32-P9-NEXT:    stb r5, -32(r1)
344; CHECK-AIX-32-P9-NEXT:    lxv v3, -32(r1)
345; CHECK-AIX-32-P9-NEXT:    lxv v4, 0(r3)
346; CHECK-AIX-32-P9-NEXT:    vmrghh v3, v3, v3
347; CHECK-AIX-32-P9-NEXT:    vperm v2, v2, v3, v4
348; CHECK-AIX-32-P9-NEXT:    stxv v2, -16(r1)
349; CHECK-AIX-32-P9-NEXT:    lwz r3, -12(r1)
350; CHECK-AIX-32-P9-NEXT:    stw r3, 0(r3)
351; CHECK-AIX-32-P9-NEXT:    lwz r3, -16(r1)
352; CHECK-AIX-32-P9-NEXT:    stw r3, 0(r3)
353; CHECK-AIX-32-P9-NEXT:    blr
354entry:
355  %0 = load <2 x i16>, ptr %ptr, align 4
356  %tmp = insertelement <4 x i8> undef, i8 %v3, i32 0
357  %tmp0 = bitcast <4 x i8> %tmp to <2 x i16>
358  %1 = shufflevector <2 x i16> %0, <2 x i16> %tmp0, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
359  store <4 x i16> %1, ptr undef, align 4
360  ret void
361}
362
363define void @test_v4i32_none(ptr nocapture readonly %ptr1, ptr nocapture readonly %ptr2) {
364; CHECK-LE-P8-LABEL: test_v4i32_none:
365; CHECK-LE-P8:       # %bb.0: # %entry
366; CHECK-LE-P8-NEXT:    addis r4, r2, .LCPI3_0@toc@ha
367; CHECK-LE-P8-NEXT:    lxsiwzx v3, 0, r3
368; CHECK-LE-P8-NEXT:    xxlxor v4, v4, v4
369; CHECK-LE-P8-NEXT:    addi r4, r4, .LCPI3_0@toc@l
370; CHECK-LE-P8-NEXT:    lxvd2x vs0, 0, r4
371; CHECK-LE-P8-NEXT:    xxswapd v2, vs0
372; CHECK-LE-P8-NEXT:    vperm v2, v4, v3, v2
373; CHECK-LE-P8-NEXT:    xxswapd vs0, v2
374; CHECK-LE-P8-NEXT:    stxvd2x vs0, 0, r3
375; CHECK-LE-P8-NEXT:    blr
376;
377; CHECK-LE-P9-LABEL: test_v4i32_none:
378; CHECK-LE-P9:       # %bb.0: # %entry
379; CHECK-LE-P9-NEXT:    lfiwzx f0, 0, r3
380; CHECK-LE-P9-NEXT:    addis r3, r2, .LCPI3_0@toc@ha
381; CHECK-LE-P9-NEXT:    xxlxor vs2, vs2, vs2
382; CHECK-LE-P9-NEXT:    addi r3, r3, .LCPI3_0@toc@l
383; CHECK-LE-P9-NEXT:    lxv vs1, 0(r3)
384; CHECK-LE-P9-NEXT:    xxperm vs0, vs2, vs1
385; CHECK-LE-P9-NEXT:    stxv vs0, 0(r3)
386; CHECK-LE-P9-NEXT:    blr
387;
388; CHECK-BE-P8-LABEL: test_v4i32_none:
389; CHECK-BE-P8:       # %bb.0: # %entry
390; CHECK-BE-P8-NEXT:    lxsiwzx v2, 0, r3
391; CHECK-BE-P8-NEXT:    addis r3, r2, .LCPI3_0@toc@ha
392; CHECK-BE-P8-NEXT:    xxlxor v4, v4, v4
393; CHECK-BE-P8-NEXT:    addi r3, r3, .LCPI3_0@toc@l
394; CHECK-BE-P8-NEXT:    lxvw4x v3, 0, r3
395; CHECK-BE-P8-NEXT:    vperm v2, v4, v2, v3
396; CHECK-BE-P8-NEXT:    stxvw4x v2, 0, r3
397; CHECK-BE-P8-NEXT:    blr
398;
399; CHECK-BE-P9-LABEL: test_v4i32_none:
400; CHECK-BE-P9:       # %bb.0: # %entry
401; CHECK-BE-P9-NEXT:    lfiwzx f0, 0, r3
402; CHECK-BE-P9-NEXT:    addis r3, r2, .LCPI3_0@toc@ha
403; CHECK-BE-P9-NEXT:    xxlxor vs2, vs2, vs2
404; CHECK-BE-P9-NEXT:    addi r3, r3, .LCPI3_0@toc@l
405; CHECK-BE-P9-NEXT:    lxv vs1, 0(r3)
406; CHECK-BE-P9-NEXT:    xxperm vs0, vs2, vs1
407; CHECK-BE-P9-NEXT:    stxv vs0, 0(r3)
408; CHECK-BE-P9-NEXT:    blr
409;
410; CHECK-AIX-64-P8-LABEL: test_v4i32_none:
411; CHECK-AIX-64-P8:       # %bb.0: # %entry
412; CHECK-AIX-64-P8-NEXT:    lxsiwzx v2, 0, r3
413; CHECK-AIX-64-P8-NEXT:    ld r3, L..C4(r2) # %const.0
414; CHECK-AIX-64-P8-NEXT:    xxlxor v4, v4, v4
415; CHECK-AIX-64-P8-NEXT:    lxvw4x v3, 0, r3
416; CHECK-AIX-64-P8-NEXT:    vperm v2, v4, v2, v3
417; CHECK-AIX-64-P8-NEXT:    stxvw4x v2, 0, r3
418; CHECK-AIX-64-P8-NEXT:    blr
419;
420; CHECK-AIX-64-P9-LABEL: test_v4i32_none:
421; CHECK-AIX-64-P9:       # %bb.0: # %entry
422; CHECK-AIX-64-P9-NEXT:    lfiwzx f0, 0, r3
423; CHECK-AIX-64-P9-NEXT:    ld r3, L..C3(r2) # %const.0
424; CHECK-AIX-64-P9-NEXT:    xxlxor vs2, vs2, vs2
425; CHECK-AIX-64-P9-NEXT:    lxv vs1, 0(r3)
426; CHECK-AIX-64-P9-NEXT:    xxperm vs0, vs2, vs1
427; CHECK-AIX-64-P9-NEXT:    stxv vs0, 0(r3)
428; CHECK-AIX-64-P9-NEXT:    blr
429;
430; CHECK-AIX-32-P8-LABEL: test_v4i32_none:
431; CHECK-AIX-32-P8:       # %bb.0: # %entry
432; CHECK-AIX-32-P8-NEXT:    lxsiwzx v2, 0, r3
433; CHECK-AIX-32-P8-NEXT:    lwz r3, L..C4(r2) # %const.0
434; CHECK-AIX-32-P8-NEXT:    xxlxor v4, v4, v4
435; CHECK-AIX-32-P8-NEXT:    lxvw4x v3, 0, r3
436; CHECK-AIX-32-P8-NEXT:    vperm v2, v4, v2, v3
437; CHECK-AIX-32-P8-NEXT:    stxvw4x v2, 0, r3
438; CHECK-AIX-32-P8-NEXT:    blr
439;
440; CHECK-AIX-32-P9-LABEL: test_v4i32_none:
441; CHECK-AIX-32-P9:       # %bb.0: # %entry
442; CHECK-AIX-32-P9-NEXT:    lfiwzx f0, 0, r3
443; CHECK-AIX-32-P9-NEXT:    lwz r3, L..C3(r2) # %const.0
444; CHECK-AIX-32-P9-NEXT:    xxlxor vs2, vs2, vs2
445; CHECK-AIX-32-P9-NEXT:    lxv vs1, 0(r3)
446; CHECK-AIX-32-P9-NEXT:    xxperm vs0, vs2, vs1
447; CHECK-AIX-32-P9-NEXT:    stxv vs0, 0(r3)
448; CHECK-AIX-32-P9-NEXT:    blr
449entry:
450  %0 = load <2 x i16>, ptr %ptr1, align 1
451  %1 = load <2 x i16>, ptr %ptr2, align 1
452  %shuffle1 = shufflevector <2 x i16> %0, <2 x i16> %1, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
453  %2 = zext <4 x i16> %shuffle1 to <4 x i32>
454  store <4 x i32> %2, ptr undef, align 16
455  ret void
456}
457
458define void @test_none_v2i64(ptr nocapture readonly %ptr1, ptr nocapture readonly %ptr2) {
459; CHECK-LE-P8-LABEL: test_none_v2i64:
460; CHECK-LE-P8:       # %bb.0: # %entry
461; CHECK-LE-P8-NEXT:    addis r5, r2, .LCPI4_0@toc@ha
462; CHECK-LE-P8-NEXT:    lxsdx v3, 0, r3
463; CHECK-LE-P8-NEXT:    addis r3, r2, .LCPI4_1@toc@ha
464; CHECK-LE-P8-NEXT:    lxvd2x v4, 0, r4
465; CHECK-LE-P8-NEXT:    addi r5, r5, .LCPI4_0@toc@l
466; CHECK-LE-P8-NEXT:    addi r3, r3, .LCPI4_1@toc@l
467; CHECK-LE-P8-NEXT:    lxvd2x vs0, 0, r5
468; CHECK-LE-P8-NEXT:    xxswapd v2, vs0
469; CHECK-LE-P8-NEXT:    lxvd2x vs0, 0, r3
470; CHECK-LE-P8-NEXT:    vperm v2, v3, v4, v2
471; CHECK-LE-P8-NEXT:    xxlxor v4, v4, v4
472; CHECK-LE-P8-NEXT:    xxswapd v3, vs0
473; CHECK-LE-P8-NEXT:    vperm v2, v4, v2, v3
474; CHECK-LE-P8-NEXT:    xxswapd vs0, v2
475; CHECK-LE-P8-NEXT:    stxvd2x vs0, 0, r3
476; CHECK-LE-P8-NEXT:    blr
477;
478; CHECK-LE-P9-LABEL: test_none_v2i64:
479; CHECK-LE-P9:       # %bb.0: # %entry
480; CHECK-LE-P9-NEXT:    lfd f0, 0(r3)
481; CHECK-LE-P9-NEXT:    addis r3, r2, .LCPI4_0@toc@ha
482; CHECK-LE-P9-NEXT:    lxv v2, 0(r4)
483; CHECK-LE-P9-NEXT:    xxlxor v4, v4, v4
484; CHECK-LE-P9-NEXT:    addi r3, r3, .LCPI4_0@toc@l
485; CHECK-LE-P9-NEXT:    lxv vs1, 0(r3)
486; CHECK-LE-P9-NEXT:    addis r3, r2, .LCPI4_1@toc@ha
487; CHECK-LE-P9-NEXT:    addi r3, r3, .LCPI4_1@toc@l
488; CHECK-LE-P9-NEXT:    lxv v3, 0(r3)
489; CHECK-LE-P9-NEXT:    xxperm v2, vs0, vs1
490; CHECK-LE-P9-NEXT:    vperm v2, v4, v2, v3
491; CHECK-LE-P9-NEXT:    stxv v2, 0(r3)
492; CHECK-LE-P9-NEXT:    blr
493;
494; CHECK-BE-P8-LABEL: test_none_v2i64:
495; CHECK-BE-P8:       # %bb.0: # %entry
496; CHECK-BE-P8-NEXT:    lxsdx v2, 0, r3
497; CHECK-BE-P8-NEXT:    addis r3, r2, .LCPI4_0@toc@ha
498; CHECK-BE-P8-NEXT:    lxvw4x v3, 0, r4
499; CHECK-BE-P8-NEXT:    addi r3, r3, .LCPI4_0@toc@l
500; CHECK-BE-P8-NEXT:    lxvw4x v4, 0, r3
501; CHECK-BE-P8-NEXT:    vperm v2, v3, v2, v4
502; CHECK-BE-P8-NEXT:    xxlxor v3, v3, v3
503; CHECK-BE-P8-NEXT:    vmrghh v2, v3, v2
504; CHECK-BE-P8-NEXT:    stxvw4x v2, 0, r3
505; CHECK-BE-P8-NEXT:    blr
506;
507; CHECK-BE-P9-LABEL: test_none_v2i64:
508; CHECK-BE-P9:       # %bb.0: # %entry
509; CHECK-BE-P9-NEXT:    lxsd v2, 0(r3)
510; CHECK-BE-P9-NEXT:    addis r3, r2, .LCPI4_0@toc@ha
511; CHECK-BE-P9-NEXT:    lxv vs0, 0(r4)
512; CHECK-BE-P9-NEXT:    xxlxor v3, v3, v3
513; CHECK-BE-P9-NEXT:    addi r3, r3, .LCPI4_0@toc@l
514; CHECK-BE-P9-NEXT:    lxv vs1, 0(r3)
515; CHECK-BE-P9-NEXT:    xxperm v2, vs0, vs1
516; CHECK-BE-P9-NEXT:    vmrghh v2, v3, v2
517; CHECK-BE-P9-NEXT:    stxv v2, 0(r3)
518; CHECK-BE-P9-NEXT:    blr
519;
520; CHECK-AIX-64-P8-LABEL: test_none_v2i64:
521; CHECK-AIX-64-P8:       # %bb.0: # %entry
522; CHECK-AIX-64-P8-NEXT:    lxsdx v2, 0, r3
523; CHECK-AIX-64-P8-NEXT:    ld r3, L..C5(r2) # %const.0
524; CHECK-AIX-64-P8-NEXT:    lxvw4x v3, 0, r4
525; CHECK-AIX-64-P8-NEXT:    lxvw4x v4, 0, r3
526; CHECK-AIX-64-P8-NEXT:    vperm v2, v3, v2, v4
527; CHECK-AIX-64-P8-NEXT:    xxlxor v3, v3, v3
528; CHECK-AIX-64-P8-NEXT:    vmrghh v2, v3, v2
529; CHECK-AIX-64-P8-NEXT:    stxvw4x v2, 0, r3
530; CHECK-AIX-64-P8-NEXT:    blr
531;
532; CHECK-AIX-64-P9-LABEL: test_none_v2i64:
533; CHECK-AIX-64-P9:       # %bb.0: # %entry
534; CHECK-AIX-64-P9-NEXT:    lxsd v2, 0(r3)
535; CHECK-AIX-64-P9-NEXT:    ld r3, L..C4(r2) # %const.0
536; CHECK-AIX-64-P9-NEXT:    lxv vs0, 0(r4)
537; CHECK-AIX-64-P9-NEXT:    xxlxor v3, v3, v3
538; CHECK-AIX-64-P9-NEXT:    lxv vs1, 0(r3)
539; CHECK-AIX-64-P9-NEXT:    xxperm v2, vs0, vs1
540; CHECK-AIX-64-P9-NEXT:    vmrghh v2, v3, v2
541; CHECK-AIX-64-P9-NEXT:    stxv v2, 0(r3)
542; CHECK-AIX-64-P9-NEXT:    blr
543;
544; CHECK-AIX-32-P8-LABEL: test_none_v2i64:
545; CHECK-AIX-32-P8:       # %bb.0: # %entry
546; CHECK-AIX-32-P8-NEXT:    lxsiwzx v2, 0, r3
547; CHECK-AIX-32-P8-NEXT:    lwz r3, L..C5(r2) # %const.0
548; CHECK-AIX-32-P8-NEXT:    lxvw4x v3, 0, r4
549; CHECK-AIX-32-P8-NEXT:    lxvw4x v4, 0, r3
550; CHECK-AIX-32-P8-NEXT:    vperm v2, v3, v2, v4
551; CHECK-AIX-32-P8-NEXT:    xxlxor v3, v3, v3
552; CHECK-AIX-32-P8-NEXT:    vmrghh v2, v3, v2
553; CHECK-AIX-32-P8-NEXT:    stxvw4x v2, 0, r3
554; CHECK-AIX-32-P8-NEXT:    blr
555;
556; CHECK-AIX-32-P9-LABEL: test_none_v2i64:
557; CHECK-AIX-32-P9:       # %bb.0: # %entry
558; CHECK-AIX-32-P9-NEXT:    lxsiwzx v2, 0, r3
559; CHECK-AIX-32-P9-NEXT:    lwz r3, L..C4(r2) # %const.0
560; CHECK-AIX-32-P9-NEXT:    lxv vs0, 0(r4)
561; CHECK-AIX-32-P9-NEXT:    xxlxor v3, v3, v3
562; CHECK-AIX-32-P9-NEXT:    lxv vs1, 0(r3)
563; CHECK-AIX-32-P9-NEXT:    xxperm v2, vs0, vs1
564; CHECK-AIX-32-P9-NEXT:    vmrghh v2, v3, v2
565; CHECK-AIX-32-P9-NEXT:    stxv v2, 0(r3)
566; CHECK-AIX-32-P9-NEXT:    blr
567entry:
568  %0 = load <4 x i16>, ptr %ptr1, align 1
569  %1 = load <4 x i32>, ptr %ptr2, align 1
570  %bc = trunc <4 x i32> %1 to <4 x i16>
571  %shuffle1 = shufflevector <4 x i16> %0, <4 x i16> %bc, <4 x i32> <i32 4, i32 5, i32 1, i32 0>
572  %2 = zext <4 x i16> %shuffle1 to <4 x i32>
573  store <4 x i32> %2, ptr undef, align 16
574  ret void
575}
576
577define void @test_v2i64_none(ptr nocapture readonly %ptr1) {
578; CHECK-LE-P8-LABEL: test_v2i64_none:
579; CHECK-LE-P8:       # %bb.0: # %entry
580; CHECK-LE-P8-NEXT:    addis r4, r2, .LCPI5_0@toc@ha
581; CHECK-LE-P8-NEXT:    lxsdx v3, 0, r3
582; CHECK-LE-P8-NEXT:    xxlxor v4, v4, v4
583; CHECK-LE-P8-NEXT:    addi r4, r4, .LCPI5_0@toc@l
584; CHECK-LE-P8-NEXT:    lxvd2x vs0, 0, r4
585; CHECK-LE-P8-NEXT:    xxswapd v2, vs0
586; CHECK-LE-P8-NEXT:    vperm v2, v4, v3, v2
587; CHECK-LE-P8-NEXT:    xxswapd vs0, v2
588; CHECK-LE-P8-NEXT:    stxvd2x vs0, 0, r3
589; CHECK-LE-P8-NEXT:    blr
590;
591; CHECK-LE-P9-LABEL: test_v2i64_none:
592; CHECK-LE-P9:       # %bb.0: # %entry
593; CHECK-LE-P9-NEXT:    lfd f0, 0(r3)
594; CHECK-LE-P9-NEXT:    addis r3, r2, .LCPI5_0@toc@ha
595; CHECK-LE-P9-NEXT:    xxlxor vs2, vs2, vs2
596; CHECK-LE-P9-NEXT:    addi r3, r3, .LCPI5_0@toc@l
597; CHECK-LE-P9-NEXT:    lxv vs1, 0(r3)
598; CHECK-LE-P9-NEXT:    xxperm vs0, vs2, vs1
599; CHECK-LE-P9-NEXT:    stxv vs0, 0(r3)
600; CHECK-LE-P9-NEXT:    blr
601;
602; CHECK-BE-P8-LABEL: test_v2i64_none:
603; CHECK-BE-P8:       # %bb.0: # %entry
604; CHECK-BE-P8-NEXT:    lxsdx v2, 0, r3
605; CHECK-BE-P8-NEXT:    addis r3, r2, .LCPI5_0@toc@ha
606; CHECK-BE-P8-NEXT:    xxlxor v4, v4, v4
607; CHECK-BE-P8-NEXT:    addi r3, r3, .LCPI5_0@toc@l
608; CHECK-BE-P8-NEXT:    lxvw4x v3, 0, r3
609; CHECK-BE-P8-NEXT:    vperm v2, v4, v2, v3
610; CHECK-BE-P8-NEXT:    stxvw4x v2, 0, r3
611; CHECK-BE-P8-NEXT:    blr
612;
613; CHECK-BE-P9-LABEL: test_v2i64_none:
614; CHECK-BE-P9:       # %bb.0: # %entry
615; CHECK-BE-P9-NEXT:    lfd f0, 0(r3)
616; CHECK-BE-P9-NEXT:    addis r3, r2, .LCPI5_0@toc@ha
617; CHECK-BE-P9-NEXT:    xxlxor vs2, vs2, vs2
618; CHECK-BE-P9-NEXT:    addi r3, r3, .LCPI5_0@toc@l
619; CHECK-BE-P9-NEXT:    lxv vs1, 0(r3)
620; CHECK-BE-P9-NEXT:    xxperm vs0, vs2, vs1
621; CHECK-BE-P9-NEXT:    stxv vs0, 0(r3)
622; CHECK-BE-P9-NEXT:    blr
623;
624; CHECK-AIX-64-P8-LABEL: test_v2i64_none:
625; CHECK-AIX-64-P8:       # %bb.0: # %entry
626; CHECK-AIX-64-P8-NEXT:    lxsdx v2, 0, r3
627; CHECK-AIX-64-P8-NEXT:    ld r3, L..C6(r2) # %const.0
628; CHECK-AIX-64-P8-NEXT:    xxlxor v4, v4, v4
629; CHECK-AIX-64-P8-NEXT:    lxvw4x v3, 0, r3
630; CHECK-AIX-64-P8-NEXT:    vperm v2, v4, v2, v3
631; CHECK-AIX-64-P8-NEXT:    stxvw4x v2, 0, r3
632; CHECK-AIX-64-P8-NEXT:    blr
633;
634; CHECK-AIX-64-P9-LABEL: test_v2i64_none:
635; CHECK-AIX-64-P9:       # %bb.0: # %entry
636; CHECK-AIX-64-P9-NEXT:    lfd f0, 0(r3)
637; CHECK-AIX-64-P9-NEXT:    ld r3, L..C5(r2) # %const.0
638; CHECK-AIX-64-P9-NEXT:    xxlxor vs2, vs2, vs2
639; CHECK-AIX-64-P9-NEXT:    lxv vs1, 0(r3)
640; CHECK-AIX-64-P9-NEXT:    xxperm vs0, vs2, vs1
641; CHECK-AIX-64-P9-NEXT:    stxv vs0, 0(r3)
642; CHECK-AIX-64-P9-NEXT:    blr
643;
644; CHECK-AIX-32-P8-LABEL: test_v2i64_none:
645; CHECK-AIX-32-P8:       # %bb.0: # %entry
646; CHECK-AIX-32-P8-NEXT:    li r4, 4
647; CHECK-AIX-32-P8-NEXT:    lfiwzx f1, 0, r3
648; CHECK-AIX-32-P8-NEXT:    xxlxor v4, v4, v4
649; CHECK-AIX-32-P8-NEXT:    lfiwzx f0, r3, r4
650; CHECK-AIX-32-P8-NEXT:    lwz r3, L..C6(r2) # %const.0
651; CHECK-AIX-32-P8-NEXT:    lxvw4x v3, 0, r3
652; CHECK-AIX-32-P8-NEXT:    xxspltw vs1, vs1, 1
653; CHECK-AIX-32-P8-NEXT:    xxspltw vs0, vs0, 1
654; CHECK-AIX-32-P8-NEXT:    xxmrghw v2, vs1, vs0
655; CHECK-AIX-32-P8-NEXT:    vperm v2, v4, v2, v3
656; CHECK-AIX-32-P8-NEXT:    stxvw4x v2, 0, r3
657; CHECK-AIX-32-P8-NEXT:    blr
658;
659; CHECK-AIX-32-P9-LABEL: test_v2i64_none:
660; CHECK-AIX-32-P9:       # %bb.0: # %entry
661; CHECK-AIX-32-P9-NEXT:    li r4, 4
662; CHECK-AIX-32-P9-NEXT:    lxvwsx vs1, 0, r3
663; CHECK-AIX-32-P9-NEXT:    xxlxor vs2, vs2, vs2
664; CHECK-AIX-32-P9-NEXT:    lxvwsx vs0, r3, r4
665; CHECK-AIX-32-P9-NEXT:    lwz r3, L..C5(r2) # %const.0
666; CHECK-AIX-32-P9-NEXT:    xxmrghw vs0, vs1, vs0
667; CHECK-AIX-32-P9-NEXT:    lxv vs1, 0(r3)
668; CHECK-AIX-32-P9-NEXT:    xxperm vs0, vs2, vs1
669; CHECK-AIX-32-P9-NEXT:    stxv vs0, 0(r3)
670; CHECK-AIX-32-P9-NEXT:    blr
671entry:
672  %0 = load <4 x i16>, ptr %ptr1, align 1
673  %shuffle1 = shufflevector <4 x i16> %0, <4 x i16> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
674  %1 = zext <4 x i16> %shuffle1 to <4 x i32>
675  store <4 x i32> %1, ptr undef, align 16
676  ret void
677}
678
679define <16 x i8> @test_v8i16_v8i16(ptr %a, ptr %b) {
680; CHECK-LE-P8-LABEL: test_v8i16_v8i16:
681; CHECK-LE-P8:       # %bb.0: # %entry
682; CHECK-LE-P8-NEXT:    addis r5, r2, .LCPI6_0@toc@ha
683; CHECK-LE-P8-NEXT:    lhz r3, 0(r3)
684; CHECK-LE-P8-NEXT:    addi r5, r5, .LCPI6_0@toc@l
685; CHECK-LE-P8-NEXT:    mtvsrd v3, r3
686; CHECK-LE-P8-NEXT:    lhz r3, 0(r4)
687; CHECK-LE-P8-NEXT:    lxvd2x vs0, 0, r5
688; CHECK-LE-P8-NEXT:    mtvsrd v4, r3
689; CHECK-LE-P8-NEXT:    xxswapd v2, vs0
690; CHECK-LE-P8-NEXT:    vperm v2, v4, v3, v2
691; CHECK-LE-P8-NEXT:    blr
692;
693; CHECK-LE-P9-LABEL: test_v8i16_v8i16:
694; CHECK-LE-P9:       # %bb.0: # %entry
695; CHECK-LE-P9-NEXT:    lxsihzx v2, 0, r3
696; CHECK-LE-P9-NEXT:    addis r3, r2, .LCPI6_0@toc@ha
697; CHECK-LE-P9-NEXT:    lxsihzx f0, 0, r4
698; CHECK-LE-P9-NEXT:    addi r3, r3, .LCPI6_0@toc@l
699; CHECK-LE-P9-NEXT:    lxv vs1, 0(r3)
700; CHECK-LE-P9-NEXT:    xxperm v2, vs0, vs1
701; CHECK-LE-P9-NEXT:    blr
702;
703; CHECK-BE-P8-LABEL: test_v8i16_v8i16:
704; CHECK-BE-P8:       # %bb.0: # %entry
705; CHECK-BE-P8-NEXT:    lhz r3, 0(r3)
706; CHECK-BE-P8-NEXT:    mtvsrwz v2, r3
707; CHECK-BE-P8-NEXT:    lhz r3, 0(r4)
708; CHECK-BE-P8-NEXT:    mtvsrwz v3, r3
709; CHECK-BE-P8-NEXT:    addis r3, r2, .LCPI6_0@toc@ha
710; CHECK-BE-P8-NEXT:    addi r3, r3, .LCPI6_0@toc@l
711; CHECK-BE-P8-NEXT:    lxvw4x v4, 0, r3
712; CHECK-BE-P8-NEXT:    vperm v2, v2, v3, v4
713; CHECK-BE-P8-NEXT:    blr
714;
715; CHECK-BE-P9-LABEL: test_v8i16_v8i16:
716; CHECK-BE-P9:       # %bb.0: # %entry
717; CHECK-BE-P9-NEXT:    lxsihzx f0, 0, r3
718; CHECK-BE-P9-NEXT:    addis r3, r2, .LCPI6_0@toc@ha
719; CHECK-BE-P9-NEXT:    lxsihzx v2, 0, r4
720; CHECK-BE-P9-NEXT:    addi r3, r3, .LCPI6_0@toc@l
721; CHECK-BE-P9-NEXT:    lxv vs1, 0(r3)
722; CHECK-BE-P9-NEXT:    xxperm v2, vs0, vs1
723; CHECK-BE-P9-NEXT:    blr
724;
725; CHECK-AIX-64-P8-LABEL: test_v8i16_v8i16:
726; CHECK-AIX-64-P8:       # %bb.0: # %entry
727; CHECK-AIX-64-P8-NEXT:    lhz r3, 0(r3)
728; CHECK-AIX-64-P8-NEXT:    mtvsrwz v2, r3
729; CHECK-AIX-64-P8-NEXT:    lhz r3, 0(r4)
730; CHECK-AIX-64-P8-NEXT:    mtvsrwz v3, r3
731; CHECK-AIX-64-P8-NEXT:    ld r3, L..C7(r2) # %const.0
732; CHECK-AIX-64-P8-NEXT:    lxvw4x v4, 0, r3
733; CHECK-AIX-64-P8-NEXT:    vperm v2, v2, v3, v4
734; CHECK-AIX-64-P8-NEXT:    blr
735;
736; CHECK-AIX-64-P9-LABEL: test_v8i16_v8i16:
737; CHECK-AIX-64-P9:       # %bb.0: # %entry
738; CHECK-AIX-64-P9-NEXT:    lxsihzx f0, 0, r3
739; CHECK-AIX-64-P9-NEXT:    ld r3, L..C6(r2) # %const.0
740; CHECK-AIX-64-P9-NEXT:    lxsihzx v2, 0, r4
741; CHECK-AIX-64-P9-NEXT:    lxv vs1, 0(r3)
742; CHECK-AIX-64-P9-NEXT:    xxperm v2, vs0, vs1
743; CHECK-AIX-64-P9-NEXT:    blr
744;
745; CHECK-AIX-32-P8-LABEL: test_v8i16_v8i16:
746; CHECK-AIX-32-P8:       # %bb.0: # %entry
747; CHECK-AIX-32-P8-NEXT:    lhz r3, 0(r3)
748; CHECK-AIX-32-P8-NEXT:    mtvsrwz v2, r3
749; CHECK-AIX-32-P8-NEXT:    lhz r3, 0(r4)
750; CHECK-AIX-32-P8-NEXT:    mtvsrwz v3, r3
751; CHECK-AIX-32-P8-NEXT:    lwz r3, L..C7(r2) # %const.0
752; CHECK-AIX-32-P8-NEXT:    lxvw4x v4, 0, r3
753; CHECK-AIX-32-P8-NEXT:    vperm v2, v2, v3, v4
754; CHECK-AIX-32-P8-NEXT:    blr
755;
756; CHECK-AIX-32-P9-LABEL: test_v8i16_v8i16:
757; CHECK-AIX-32-P9:       # %bb.0: # %entry
758; CHECK-AIX-32-P9-NEXT:    lxsihzx f0, 0, r3
759; CHECK-AIX-32-P9-NEXT:    lwz r3, L..C6(r2) # %const.0
760; CHECK-AIX-32-P9-NEXT:    lxsihzx v2, 0, r4
761; CHECK-AIX-32-P9-NEXT:    lxv vs1, 0(r3)
762; CHECK-AIX-32-P9-NEXT:    xxperm v2, vs0, vs1
763; CHECK-AIX-32-P9-NEXT:    blr
764entry:
765  %load1 = load <2 x i8>, ptr %a
766  %load2 = load <2 x i8>, ptr %b
767  %shuffle1 = shufflevector <2 x i8> %load1, <2 x i8> %load2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
768  %shuffle2 = shufflevector <8 x i8> %shuffle1, <8 x i8> %shuffle1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
769  ret <16 x i8> %shuffle2
770}
771
772define <16 x i8> @test_v8i16_v4i32(ptr %a, ptr %b) local_unnamed_addr {
773; CHECK-LE-P8-LABEL: test_v8i16_v4i32:
774; CHECK-LE-P8:       # %bb.0: # %entry
775; CHECK-LE-P8-NEXT:    lhz r3, 0(r3)
776; CHECK-LE-P8-NEXT:    lxsiwzx v3, 0, r4
777; CHECK-LE-P8-NEXT:    mtvsrd v2, r3
778; CHECK-LE-P8-NEXT:    vmrghh v2, v3, v2
779; CHECK-LE-P8-NEXT:    blr
780;
781; CHECK-LE-P9-LABEL: test_v8i16_v4i32:
782; CHECK-LE-P9:       # %bb.0: # %entry
783; CHECK-LE-P9-NEXT:    lxsihzx v2, 0, r3
784; CHECK-LE-P9-NEXT:    lxsiwzx v3, 0, r4
785; CHECK-LE-P9-NEXT:    vmrghh v2, v3, v2
786; CHECK-LE-P9-NEXT:    blr
787;
788; CHECK-BE-P8-LABEL: test_v8i16_v4i32:
789; CHECK-BE-P8:       # %bb.0: # %entry
790; CHECK-BE-P8-NEXT:    lhz r3, 0(r3)
791; CHECK-BE-P8-NEXT:    lxsiwzx v3, 0, r4
792; CHECK-BE-P8-NEXT:    mtvsrwz v2, r3
793; CHECK-BE-P8-NEXT:    addis r3, r2, .LCPI7_0@toc@ha
794; CHECK-BE-P8-NEXT:    addi r3, r3, .LCPI7_0@toc@l
795; CHECK-BE-P8-NEXT:    lxvw4x v4, 0, r3
796; CHECK-BE-P8-NEXT:    vperm v2, v2, v3, v4
797; CHECK-BE-P8-NEXT:    blr
798;
799; CHECK-BE-P9-LABEL: test_v8i16_v4i32:
800; CHECK-BE-P9:       # %bb.0: # %entry
801; CHECK-BE-P9-NEXT:    lxsihzx f0, 0, r3
802; CHECK-BE-P9-NEXT:    addis r3, r2, .LCPI7_0@toc@ha
803; CHECK-BE-P9-NEXT:    lxsiwzx v2, 0, r4
804; CHECK-BE-P9-NEXT:    addi r3, r3, .LCPI7_0@toc@l
805; CHECK-BE-P9-NEXT:    lxv vs1, 0(r3)
806; CHECK-BE-P9-NEXT:    xxperm v2, vs0, vs1
807; CHECK-BE-P9-NEXT:    blr
808;
809; CHECK-AIX-64-P8-LABEL: test_v8i16_v4i32:
810; CHECK-AIX-64-P8:       # %bb.0: # %entry
811; CHECK-AIX-64-P8-NEXT:    lhz r3, 0(r3)
812; CHECK-AIX-64-P8-NEXT:    lxsiwzx v3, 0, r4
813; CHECK-AIX-64-P8-NEXT:    mtvsrwz v2, r3
814; CHECK-AIX-64-P8-NEXT:    ld r3, L..C8(r2) # %const.0
815; CHECK-AIX-64-P8-NEXT:    lxvw4x v4, 0, r3
816; CHECK-AIX-64-P8-NEXT:    vperm v2, v2, v3, v4
817; CHECK-AIX-64-P8-NEXT:    blr
818;
819; CHECK-AIX-64-P9-LABEL: test_v8i16_v4i32:
820; CHECK-AIX-64-P9:       # %bb.0: # %entry
821; CHECK-AIX-64-P9-NEXT:    lxsihzx f0, 0, r3
822; CHECK-AIX-64-P9-NEXT:    ld r3, L..C7(r2) # %const.0
823; CHECK-AIX-64-P9-NEXT:    lxsiwzx v2, 0, r4
824; CHECK-AIX-64-P9-NEXT:    lxv vs1, 0(r3)
825; CHECK-AIX-64-P9-NEXT:    xxperm v2, vs0, vs1
826; CHECK-AIX-64-P9-NEXT:    blr
827;
828; CHECK-AIX-32-P8-LABEL: test_v8i16_v4i32:
829; CHECK-AIX-32-P8:       # %bb.0: # %entry
830; CHECK-AIX-32-P8-NEXT:    lhz r3, 0(r3)
831; CHECK-AIX-32-P8-NEXT:    lxsiwzx v3, 0, r4
832; CHECK-AIX-32-P8-NEXT:    mtvsrwz v2, r3
833; CHECK-AIX-32-P8-NEXT:    lwz r3, L..C8(r2) # %const.0
834; CHECK-AIX-32-P8-NEXT:    lxvw4x v4, 0, r3
835; CHECK-AIX-32-P8-NEXT:    vperm v2, v2, v3, v4
836; CHECK-AIX-32-P8-NEXT:    blr
837;
838; CHECK-AIX-32-P9-LABEL: test_v8i16_v4i32:
839; CHECK-AIX-32-P9:       # %bb.0: # %entry
840; CHECK-AIX-32-P9-NEXT:    lxsihzx f0, 0, r3
841; CHECK-AIX-32-P9-NEXT:    lwz r3, L..C7(r2) # %const.0
842; CHECK-AIX-32-P9-NEXT:    lxsiwzx v2, 0, r4
843; CHECK-AIX-32-P9-NEXT:    lxv vs1, 0(r3)
844; CHECK-AIX-32-P9-NEXT:    xxperm v2, vs0, vs1
845; CHECK-AIX-32-P9-NEXT:    blr
846entry:
847  %0 = load <2 x i8>, ptr %a
848  %bc1 = bitcast <2 x i8> %0 to i16
849  %vecinit3 = insertelement <8 x i16> poison, i16 %bc1, i64 0
850  %1 = load <2 x i8>, ptr %b, align 4
851  %bc2 = bitcast <2 x i8> %1 to i16
852  %vecinit6 = insertelement <8 x i16> undef, i16 %bc2, i64 0
853  %2 = bitcast <8 x i16> %vecinit3 to <16 x i8>
854  %3 = bitcast <8 x i16> %vecinit6 to <16 x i8>
855  %shuffle = shufflevector <16 x i8> %2, <16 x i8> %3, <16 x i32> <i32 0, i32 1, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
856  ret <16 x i8> %shuffle
857}
858
859define <16 x i8> @test_v8i16_v2i64(ptr %a, ptr %b) local_unnamed_addr {
860; CHECK-LE-P8-LABEL: test_v8i16_v2i64:
861; CHECK-LE-P8:       # %bb.0: # %entry
862; CHECK-LE-P8-NEXT:    lhz r3, 0(r3)
863; CHECK-LE-P8-NEXT:    lxsdx v3, 0, r4
864; CHECK-LE-P8-NEXT:    mtvsrd v2, r3
865; CHECK-LE-P8-NEXT:    vmrghh v2, v3, v2
866; CHECK-LE-P8-NEXT:    blr
867;
868; CHECK-LE-P9-LABEL: test_v8i16_v2i64:
869; CHECK-LE-P9:       # %bb.0: # %entry
870; CHECK-LE-P9-NEXT:    lxsihzx v2, 0, r3
871; CHECK-LE-P9-NEXT:    lxsd v3, 0(r4)
872; CHECK-LE-P9-NEXT:    vmrghh v2, v3, v2
873; CHECK-LE-P9-NEXT:    blr
874;
875; CHECK-BE-P8-LABEL: test_v8i16_v2i64:
876; CHECK-BE-P8:       # %bb.0: # %entry
877; CHECK-BE-P8-NEXT:    lhz r3, 0(r3)
878; CHECK-BE-P8-NEXT:    lxsdx v3, 0, r4
879; CHECK-BE-P8-NEXT:    sldi r3, r3, 48
880; CHECK-BE-P8-NEXT:    mtvsrd v2, r3
881; CHECK-BE-P8-NEXT:    vmrghh v2, v2, v3
882; CHECK-BE-P8-NEXT:    blr
883;
884; CHECK-BE-P9-LABEL: test_v8i16_v2i64:
885; CHECK-BE-P9:       # %bb.0: # %entry
886; CHECK-BE-P9-NEXT:    lxsihzx v2, 0, r3
887; CHECK-BE-P9-NEXT:    lxsd v3, 0(r4)
888; CHECK-BE-P9-NEXT:    vsplth v2, v2, 3
889; CHECK-BE-P9-NEXT:    vmrghh v2, v2, v3
890; CHECK-BE-P9-NEXT:    blr
891;
892; CHECK-AIX-64-P8-LABEL: test_v8i16_v2i64:
893; CHECK-AIX-64-P8:       # %bb.0: # %entry
894; CHECK-AIX-64-P8-NEXT:    lhz r3, 0(r3)
895; CHECK-AIX-64-P8-NEXT:    lxsdx v3, 0, r4
896; CHECK-AIX-64-P8-NEXT:    sldi r3, r3, 48
897; CHECK-AIX-64-P8-NEXT:    mtvsrd v2, r3
898; CHECK-AIX-64-P8-NEXT:    vmrghh v2, v2, v3
899; CHECK-AIX-64-P8-NEXT:    blr
900;
901; CHECK-AIX-64-P9-LABEL: test_v8i16_v2i64:
902; CHECK-AIX-64-P9:       # %bb.0: # %entry
903; CHECK-AIX-64-P9-NEXT:    lxsihzx v2, 0, r3
904; CHECK-AIX-64-P9-NEXT:    lxsd v3, 0(r4)
905; CHECK-AIX-64-P9-NEXT:    vsplth v2, v2, 3
906; CHECK-AIX-64-P9-NEXT:    vmrghh v2, v2, v3
907; CHECK-AIX-64-P9-NEXT:    blr
908;
909; CHECK-AIX-32-P8-LABEL: test_v8i16_v2i64:
910; CHECK-AIX-32-P8:       # %bb.0: # %entry
911; CHECK-AIX-32-P8-NEXT:    lhz r3, 0(r3)
912; CHECK-AIX-32-P8-NEXT:    lxsiwzx v3, 0, r4
913; CHECK-AIX-32-P8-NEXT:    mtvsrwz v2, r3
914; CHECK-AIX-32-P8-NEXT:    lwz r3, L..C9(r2) # %const.0
915; CHECK-AIX-32-P8-NEXT:    lxvw4x v4, 0, r3
916; CHECK-AIX-32-P8-NEXT:    vperm v2, v2, v3, v4
917; CHECK-AIX-32-P8-NEXT:    blr
918;
919; CHECK-AIX-32-P9-LABEL: test_v8i16_v2i64:
920; CHECK-AIX-32-P9:       # %bb.0: # %entry
921; CHECK-AIX-32-P9-NEXT:    lxsihzx f0, 0, r3
922; CHECK-AIX-32-P9-NEXT:    lwz r3, L..C8(r2) # %const.0
923; CHECK-AIX-32-P9-NEXT:    lxsiwzx v2, 0, r4
924; CHECK-AIX-32-P9-NEXT:    lxv vs1, 0(r3)
925; CHECK-AIX-32-P9-NEXT:    xxperm v2, vs0, vs1
926; CHECK-AIX-32-P9-NEXT:    blr
927entry:
928  %0 = load <2 x i8>, ptr %a
929  %bc1 = bitcast <2 x i8> %0 to i16
930  %vecinit3 = insertelement <8 x i16> poison, i16 %bc1, i64 0
931  %1 = load <2 x i8>, ptr %b, align 8
932  %bc2 = bitcast <2 x i8> %1 to i16
933  %vecinit6 = insertelement <8 x i16> undef, i16 %bc2, i64 0
934  %2 = bitcast <8 x i16> %vecinit3 to <16 x i8>
935  %3 = bitcast <8 x i16> %vecinit6 to <16 x i8>
936  %shuffle = shufflevector <16 x i8> %2, <16 x i8> %3, <16 x i32> <i32 0, i32 1, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
937  ret <16 x i8> %shuffle
938}
939
940define void @test_v4i32_v4i32(ptr nocapture readonly %ptr1, ptr nocapture readonly %ptr2) {
941; CHECK-LE-P8-LABEL: test_v4i32_v4i32:
942; CHECK-LE-P8:       # %bb.0: # %entry
943; CHECK-LE-P8-NEXT:    addis r5, r2, .LCPI9_0@toc@ha
944; CHECK-LE-P8-NEXT:    lxsiwzx v3, 0, r3
945; CHECK-LE-P8-NEXT:    addis r3, r2, .LCPI9_1@toc@ha
946; CHECK-LE-P8-NEXT:    lxsiwzx v4, 0, r4
947; CHECK-LE-P8-NEXT:    addi r5, r5, .LCPI9_0@toc@l
948; CHECK-LE-P8-NEXT:    addi r3, r3, .LCPI9_1@toc@l
949; CHECK-LE-P8-NEXT:    lxvd2x vs0, 0, r5
950; CHECK-LE-P8-NEXT:    xxswapd v2, vs0
951; CHECK-LE-P8-NEXT:    lxvd2x vs0, 0, r3
952; CHECK-LE-P8-NEXT:    vperm v2, v3, v4, v2
953; CHECK-LE-P8-NEXT:    xxlxor v4, v4, v4
954; CHECK-LE-P8-NEXT:    xxswapd v3, vs0
955; CHECK-LE-P8-NEXT:    vperm v2, v4, v2, v3
956; CHECK-LE-P8-NEXT:    xxswapd vs0, v2
957; CHECK-LE-P8-NEXT:    stxvd2x vs0, 0, r3
958; CHECK-LE-P8-NEXT:    blr
959;
960; CHECK-LE-P9-LABEL: test_v4i32_v4i32:
961; CHECK-LE-P9:       # %bb.0: # %entry
962; CHECK-LE-P9-NEXT:    lfiwzx f0, 0, r3
963; CHECK-LE-P9-NEXT:    addis r3, r2, .LCPI9_0@toc@ha
964; CHECK-LE-P9-NEXT:    lxsiwzx v2, 0, r4
965; CHECK-LE-P9-NEXT:    xxlxor v4, v4, v4
966; CHECK-LE-P9-NEXT:    addi r3, r3, .LCPI9_0@toc@l
967; CHECK-LE-P9-NEXT:    lxv vs1, 0(r3)
968; CHECK-LE-P9-NEXT:    addis r3, r2, .LCPI9_1@toc@ha
969; CHECK-LE-P9-NEXT:    addi r3, r3, .LCPI9_1@toc@l
970; CHECK-LE-P9-NEXT:    lxv v3, 0(r3)
971; CHECK-LE-P9-NEXT:    xxperm v2, vs0, vs1
972; CHECK-LE-P9-NEXT:    vperm v2, v4, v2, v3
973; CHECK-LE-P9-NEXT:    stxv v2, 0(r3)
974; CHECK-LE-P9-NEXT:    blr
975;
976; CHECK-BE-P8-LABEL: test_v4i32_v4i32:
977; CHECK-BE-P8:       # %bb.0: # %entry
978; CHECK-BE-P8-NEXT:    lxsiwzx v2, 0, r3
979; CHECK-BE-P8-NEXT:    addis r3, r2, .LCPI9_0@toc@ha
980; CHECK-BE-P8-NEXT:    lxsiwzx v3, 0, r4
981; CHECK-BE-P8-NEXT:    addi r3, r3, .LCPI9_0@toc@l
982; CHECK-BE-P8-NEXT:    lxvw4x v4, 0, r3
983; CHECK-BE-P8-NEXT:    vperm v2, v3, v2, v4
984; CHECK-BE-P8-NEXT:    xxlxor v3, v3, v3
985; CHECK-BE-P8-NEXT:    vmrghh v2, v3, v2
986; CHECK-BE-P8-NEXT:    stxvw4x v2, 0, r3
987; CHECK-BE-P8-NEXT:    blr
988;
989; CHECK-BE-P9-LABEL: test_v4i32_v4i32:
990; CHECK-BE-P9:       # %bb.0: # %entry
991; CHECK-BE-P9-NEXT:    lxsiwzx v2, 0, r3
992; CHECK-BE-P9-NEXT:    addis r3, r2, .LCPI9_0@toc@ha
993; CHECK-BE-P9-NEXT:    lfiwzx f0, 0, r4
994; CHECK-BE-P9-NEXT:    xxlxor v3, v3, v3
995; CHECK-BE-P9-NEXT:    addi r3, r3, .LCPI9_0@toc@l
996; CHECK-BE-P9-NEXT:    lxv vs1, 0(r3)
997; CHECK-BE-P9-NEXT:    xxperm v2, vs0, vs1
998; CHECK-BE-P9-NEXT:    vmrghh v2, v3, v2
999; CHECK-BE-P9-NEXT:    stxv v2, 0(r3)
1000; CHECK-BE-P9-NEXT:    blr
1001;
1002; CHECK-AIX-64-P8-LABEL: test_v4i32_v4i32:
1003; CHECK-AIX-64-P8:       # %bb.0: # %entry
1004; CHECK-AIX-64-P8-NEXT:    lxsiwzx v2, 0, r3
1005; CHECK-AIX-64-P8-NEXT:    ld r3, L..C9(r2) # %const.0
1006; CHECK-AIX-64-P8-NEXT:    lxsiwzx v3, 0, r4
1007; CHECK-AIX-64-P8-NEXT:    lxvw4x v4, 0, r3
1008; CHECK-AIX-64-P8-NEXT:    vperm v2, v3, v2, v4
1009; CHECK-AIX-64-P8-NEXT:    xxlxor v3, v3, v3
1010; CHECK-AIX-64-P8-NEXT:    vmrghh v2, v3, v2
1011; CHECK-AIX-64-P8-NEXT:    stxvw4x v2, 0, r3
1012; CHECK-AIX-64-P8-NEXT:    blr
1013;
1014; CHECK-AIX-64-P9-LABEL: test_v4i32_v4i32:
1015; CHECK-AIX-64-P9:       # %bb.0: # %entry
1016; CHECK-AIX-64-P9-NEXT:    lxsiwzx v2, 0, r3
1017; CHECK-AIX-64-P9-NEXT:    ld r3, L..C8(r2) # %const.0
1018; CHECK-AIX-64-P9-NEXT:    lfiwzx f0, 0, r4
1019; CHECK-AIX-64-P9-NEXT:    xxlxor v3, v3, v3
1020; CHECK-AIX-64-P9-NEXT:    lxv vs1, 0(r3)
1021; CHECK-AIX-64-P9-NEXT:    xxperm v2, vs0, vs1
1022; CHECK-AIX-64-P9-NEXT:    vmrghh v2, v3, v2
1023; CHECK-AIX-64-P9-NEXT:    stxv v2, 0(r3)
1024; CHECK-AIX-64-P9-NEXT:    blr
1025;
1026; CHECK-AIX-32-P8-LABEL: test_v4i32_v4i32:
1027; CHECK-AIX-32-P8:       # %bb.0: # %entry
1028; CHECK-AIX-32-P8-NEXT:    lxsiwzx v2, 0, r3
1029; CHECK-AIX-32-P8-NEXT:    lwz r3, L..C10(r2) # %const.0
1030; CHECK-AIX-32-P8-NEXT:    lxsiwzx v3, 0, r4
1031; CHECK-AIX-32-P8-NEXT:    lxvw4x v4, 0, r3
1032; CHECK-AIX-32-P8-NEXT:    vperm v2, v3, v2, v4
1033; CHECK-AIX-32-P8-NEXT:    xxlxor v3, v3, v3
1034; CHECK-AIX-32-P8-NEXT:    vmrghh v2, v3, v2
1035; CHECK-AIX-32-P8-NEXT:    stxvw4x v2, 0, r3
1036; CHECK-AIX-32-P8-NEXT:    blr
1037;
1038; CHECK-AIX-32-P9-LABEL: test_v4i32_v4i32:
1039; CHECK-AIX-32-P9:       # %bb.0: # %entry
1040; CHECK-AIX-32-P9-NEXT:    lxsiwzx v2, 0, r3
1041; CHECK-AIX-32-P9-NEXT:    lwz r3, L..C9(r2) # %const.0
1042; CHECK-AIX-32-P9-NEXT:    lfiwzx f0, 0, r4
1043; CHECK-AIX-32-P9-NEXT:    xxlxor v3, v3, v3
1044; CHECK-AIX-32-P9-NEXT:    lxv vs1, 0(r3)
1045; CHECK-AIX-32-P9-NEXT:    xxperm v2, vs0, vs1
1046; CHECK-AIX-32-P9-NEXT:    vmrghh v2, v3, v2
1047; CHECK-AIX-32-P9-NEXT:    stxv v2, 0(r3)
1048; CHECK-AIX-32-P9-NEXT:    blr
1049entry:
1050  %0 = load <2 x i16>, ptr %ptr1, align 1
1051  %1 = load <2 x i16>, ptr %ptr2, align 1
1052  %shuffle1 = shufflevector <2 x i16> %0, <2 x i16> %1, <4 x i32> <i32 2, i32 3, i32 1, i32 0>
1053  %2 = zext <4 x i16> %shuffle1 to <4 x i32>
1054  store <4 x i32> %2, ptr undef, align 16
1055  ret void
1056}
1057
1058define <16 x i8> @test_v4i32_v8i16(ptr %a, ptr %b) local_unnamed_addr {
1059; CHECK-LE-P8-LABEL: test_v4i32_v8i16:
1060; CHECK-LE-P8:       # %bb.0: # %entry
1061; CHECK-LE-P8-NEXT:    lhz r3, 0(r3)
1062; CHECK-LE-P8-NEXT:    lxsiwzx v3, 0, r4
1063; CHECK-LE-P8-NEXT:    mtvsrd v2, r3
1064; CHECK-LE-P8-NEXT:    vmrghh v2, v2, v3
1065; CHECK-LE-P8-NEXT:    blr
1066;
1067; CHECK-LE-P9-LABEL: test_v4i32_v8i16:
1068; CHECK-LE-P9:       # %bb.0: # %entry
1069; CHECK-LE-P9-NEXT:    lxsihzx v2, 0, r3
1070; CHECK-LE-P9-NEXT:    lxsiwzx v3, 0, r4
1071; CHECK-LE-P9-NEXT:    vmrghh v2, v2, v3
1072; CHECK-LE-P9-NEXT:    blr
1073;
1074; CHECK-BE-P8-LABEL: test_v4i32_v8i16:
1075; CHECK-BE-P8:       # %bb.0: # %entry
1076; CHECK-BE-P8-NEXT:    lhz r3, 0(r3)
1077; CHECK-BE-P8-NEXT:    lxsiwzx v3, 0, r4
1078; CHECK-BE-P8-NEXT:    mtvsrwz v2, r3
1079; CHECK-BE-P8-NEXT:    addis r3, r2, .LCPI10_0@toc@ha
1080; CHECK-BE-P8-NEXT:    addi r3, r3, .LCPI10_0@toc@l
1081; CHECK-BE-P8-NEXT:    lxvw4x v4, 0, r3
1082; CHECK-BE-P8-NEXT:    vperm v2, v3, v2, v4
1083; CHECK-BE-P8-NEXT:    blr
1084;
1085; CHECK-BE-P9-LABEL: test_v4i32_v8i16:
1086; CHECK-BE-P9:       # %bb.0: # %entry
1087; CHECK-BE-P9-NEXT:    lxsihzx v2, 0, r3
1088; CHECK-BE-P9-NEXT:    addis r3, r2, .LCPI10_0@toc@ha
1089; CHECK-BE-P9-NEXT:    lfiwzx f0, 0, r4
1090; CHECK-BE-P9-NEXT:    addi r3, r3, .LCPI10_0@toc@l
1091; CHECK-BE-P9-NEXT:    lxv vs1, 0(r3)
1092; CHECK-BE-P9-NEXT:    xxperm v2, vs0, vs1
1093; CHECK-BE-P9-NEXT:    blr
1094;
1095; CHECK-AIX-64-P8-LABEL: test_v4i32_v8i16:
1096; CHECK-AIX-64-P8:       # %bb.0: # %entry
1097; CHECK-AIX-64-P8-NEXT:    lhz r3, 0(r3)
1098; CHECK-AIX-64-P8-NEXT:    lxsiwzx v3, 0, r4
1099; CHECK-AIX-64-P8-NEXT:    mtvsrwz v2, r3
1100; CHECK-AIX-64-P8-NEXT:    ld r3, L..C10(r2) # %const.0
1101; CHECK-AIX-64-P8-NEXT:    lxvw4x v4, 0, r3
1102; CHECK-AIX-64-P8-NEXT:    vperm v2, v3, v2, v4
1103; CHECK-AIX-64-P8-NEXT:    blr
1104;
1105; CHECK-AIX-64-P9-LABEL: test_v4i32_v8i16:
1106; CHECK-AIX-64-P9:       # %bb.0: # %entry
1107; CHECK-AIX-64-P9-NEXT:    lxsihzx v2, 0, r3
1108; CHECK-AIX-64-P9-NEXT:    ld r3, L..C9(r2) # %const.0
1109; CHECK-AIX-64-P9-NEXT:    lfiwzx f0, 0, r4
1110; CHECK-AIX-64-P9-NEXT:    lxv vs1, 0(r3)
1111; CHECK-AIX-64-P9-NEXT:    xxperm v2, vs0, vs1
1112; CHECK-AIX-64-P9-NEXT:    blr
1113;
1114; CHECK-AIX-32-P8-LABEL: test_v4i32_v8i16:
1115; CHECK-AIX-32-P8:       # %bb.0: # %entry
1116; CHECK-AIX-32-P8-NEXT:    lhz r3, 0(r3)
1117; CHECK-AIX-32-P8-NEXT:    lxsiwzx v3, 0, r4
1118; CHECK-AIX-32-P8-NEXT:    mtvsrwz v2, r3
1119; CHECK-AIX-32-P8-NEXT:    lwz r3, L..C11(r2) # %const.0
1120; CHECK-AIX-32-P8-NEXT:    lxvw4x v4, 0, r3
1121; CHECK-AIX-32-P8-NEXT:    vperm v2, v3, v2, v4
1122; CHECK-AIX-32-P8-NEXT:    blr
1123;
1124; CHECK-AIX-32-P9-LABEL: test_v4i32_v8i16:
1125; CHECK-AIX-32-P9:       # %bb.0: # %entry
1126; CHECK-AIX-32-P9-NEXT:    lxsihzx v2, 0, r3
1127; CHECK-AIX-32-P9-NEXT:    lwz r3, L..C10(r2) # %const.0
1128; CHECK-AIX-32-P9-NEXT:    lfiwzx f0, 0, r4
1129; CHECK-AIX-32-P9-NEXT:    lxv vs1, 0(r3)
1130; CHECK-AIX-32-P9-NEXT:    xxperm v2, vs0, vs1
1131; CHECK-AIX-32-P9-NEXT:    blr
1132entry:
1133  %0 = load <2 x i8>, ptr %a
1134  %bc1 = bitcast <2 x i8> %0 to i16
1135  %vecinit3 = insertelement <8 x i16> poison, i16 %bc1, i64 0
1136  %1 = load <2 x i8>, ptr %b, align 4
1137  %bc2 = bitcast <2 x i8> %1 to i16
1138  %vecinit6 = insertelement <8 x i16> undef, i16 %bc2, i64 0
1139  %2 = bitcast <8 x i16> %vecinit3 to <16 x i8>
1140  %3 = bitcast <8 x i16> %vecinit6 to <16 x i8>
1141  %shuffle = shufflevector <16 x i8> %3, <16 x i8> %2, <16 x i32> <i32 0, i32 1, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1142  ret <16 x i8> %shuffle
1143}
1144
1145define <16 x i8> @test_v4i32_v2i64(ptr %a, ptr %b) local_unnamed_addr {
1146; CHECK-LE-P8-LABEL: test_v4i32_v2i64:
1147; CHECK-LE-P8:       # %bb.0: # %entry
1148; CHECK-LE-P8-NEXT:    lxsiwzx v2, 0, r3
1149; CHECK-LE-P8-NEXT:    lxsdx v3, 0, r4
1150; CHECK-LE-P8-NEXT:    vmrghh v2, v3, v2
1151; CHECK-LE-P8-NEXT:    blr
1152;
1153; CHECK-LE-P9-LABEL: test_v4i32_v2i64:
1154; CHECK-LE-P9:       # %bb.0: # %entry
1155; CHECK-LE-P9-NEXT:    lxsiwzx v2, 0, r3
1156; CHECK-LE-P9-NEXT:    lxsd v3, 0(r4)
1157; CHECK-LE-P9-NEXT:    vmrghh v2, v3, v2
1158; CHECK-LE-P9-NEXT:    blr
1159;
1160; CHECK-BE-P8-LABEL: test_v4i32_v2i64:
1161; CHECK-BE-P8:       # %bb.0: # %entry
1162; CHECK-BE-P8-NEXT:    lfiwzx f0, 0, r3
1163; CHECK-BE-P8-NEXT:    lxsdx v3, 0, r4
1164; CHECK-BE-P8-NEXT:    xxsldwi v2, f0, f0, 1
1165; CHECK-BE-P8-NEXT:    vmrghh v2, v2, v3
1166; CHECK-BE-P8-NEXT:    blr
1167;
1168; CHECK-BE-P9-LABEL: test_v4i32_v2i64:
1169; CHECK-BE-P9:       # %bb.0: # %entry
1170; CHECK-BE-P9-NEXT:    lfiwzx f0, 0, r3
1171; CHECK-BE-P9-NEXT:    lxsd v3, 0(r4)
1172; CHECK-BE-P9-NEXT:    xxsldwi v2, f0, f0, 1
1173; CHECK-BE-P9-NEXT:    vmrghh v2, v2, v3
1174; CHECK-BE-P9-NEXT:    blr
1175;
1176; CHECK-AIX-64-P8-LABEL: test_v4i32_v2i64:
1177; CHECK-AIX-64-P8:       # %bb.0: # %entry
1178; CHECK-AIX-64-P8-NEXT:    lfiwzx f0, 0, r3
1179; CHECK-AIX-64-P8-NEXT:    lxsdx v3, 0, r4
1180; CHECK-AIX-64-P8-NEXT:    xxsldwi v2, f0, f0, 1
1181; CHECK-AIX-64-P8-NEXT:    vmrghh v2, v2, v3
1182; CHECK-AIX-64-P8-NEXT:    blr
1183;
1184; CHECK-AIX-64-P9-LABEL: test_v4i32_v2i64:
1185; CHECK-AIX-64-P9:       # %bb.0: # %entry
1186; CHECK-AIX-64-P9-NEXT:    lfiwzx f0, 0, r3
1187; CHECK-AIX-64-P9-NEXT:    lxsd v3, 0(r4)
1188; CHECK-AIX-64-P9-NEXT:    xxsldwi v2, f0, f0, 1
1189; CHECK-AIX-64-P9-NEXT:    vmrghh v2, v2, v3
1190; CHECK-AIX-64-P9-NEXT:    blr
1191;
1192; CHECK-AIX-32-P8-LABEL: test_v4i32_v2i64:
1193; CHECK-AIX-32-P8:       # %bb.0: # %entry
1194; CHECK-AIX-32-P8-NEXT:    lxsiwzx v2, 0, r3
1195; CHECK-AIX-32-P8-NEXT:    lwz r3, L..C12(r2) # %const.0
1196; CHECK-AIX-32-P8-NEXT:    lxsiwzx v3, 0, r4
1197; CHECK-AIX-32-P8-NEXT:    lxvw4x v4, 0, r3
1198; CHECK-AIX-32-P8-NEXT:    vperm v2, v2, v3, v4
1199; CHECK-AIX-32-P8-NEXT:    blr
1200;
1201; CHECK-AIX-32-P9-LABEL: test_v4i32_v2i64:
1202; CHECK-AIX-32-P9:       # %bb.0: # %entry
1203; CHECK-AIX-32-P9-NEXT:    lfiwzx f0, 0, r3
1204; CHECK-AIX-32-P9-NEXT:    lwz r3, L..C11(r2) # %const.0
1205; CHECK-AIX-32-P9-NEXT:    lxsiwzx v2, 0, r4
1206; CHECK-AIX-32-P9-NEXT:    lxv vs1, 0(r3)
1207; CHECK-AIX-32-P9-NEXT:    xxperm v2, vs0, vs1
1208; CHECK-AIX-32-P9-NEXT:    blr
1209entry:
1210  %0 = load <2 x i8>, ptr %a, align 4
1211  %bc1 = bitcast <2 x i8> %0 to i16
1212  %vecinit3 = insertelement <8 x i16> poison, i16 %bc1, i64 0
1213  %1 = load <2 x i8>, ptr %b, align 8
1214  %bc2 = bitcast <2 x i8> %1 to i16
1215  %vecinit6 = insertelement <8 x i16> undef, i16 %bc2, i64 0
1216  %2 = bitcast <8 x i16> %vecinit3 to <16 x i8>
1217  %3 = bitcast <8 x i16> %vecinit6 to <16 x i8>
1218  %shuffle = shufflevector <16 x i8> %2, <16 x i8> %3, <16 x i32> <i32 0, i32 1, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1219  ret <16 x i8> %shuffle
1220}
1221
1222define void @test_v2i64_v2i64(ptr nocapture readonly %ptr1, ptr nocapture readonly %ptr2) {
1223; CHECK-LE-P8-LABEL: test_v2i64_v2i64:
1224; CHECK-LE-P8:       # %bb.0: # %entry
1225; CHECK-LE-P8-NEXT:    addis r5, r2, .LCPI12_0@toc@ha
1226; CHECK-LE-P8-NEXT:    lxsdx v3, 0, r3
1227; CHECK-LE-P8-NEXT:    addis r3, r2, .LCPI12_1@toc@ha
1228; CHECK-LE-P8-NEXT:    lxsdx v4, 0, r4
1229; CHECK-LE-P8-NEXT:    addi r5, r5, .LCPI12_0@toc@l
1230; CHECK-LE-P8-NEXT:    addi r3, r3, .LCPI12_1@toc@l
1231; CHECK-LE-P8-NEXT:    lxvd2x vs0, 0, r5
1232; CHECK-LE-P8-NEXT:    xxswapd v2, vs0
1233; CHECK-LE-P8-NEXT:    lxvd2x vs0, 0, r3
1234; CHECK-LE-P8-NEXT:    vperm v2, v3, v4, v2
1235; CHECK-LE-P8-NEXT:    xxlxor v4, v4, v4
1236; CHECK-LE-P8-NEXT:    xxswapd v3, vs0
1237; CHECK-LE-P8-NEXT:    vperm v2, v4, v2, v3
1238; CHECK-LE-P8-NEXT:    xxswapd vs0, v2
1239; CHECK-LE-P8-NEXT:    stxvd2x vs0, 0, r3
1240; CHECK-LE-P8-NEXT:    blr
1241;
1242; CHECK-LE-P9-LABEL: test_v2i64_v2i64:
1243; CHECK-LE-P9:       # %bb.0: # %entry
1244; CHECK-LE-P9-NEXT:    lfd f0, 0(r3)
1245; CHECK-LE-P9-NEXT:    addis r3, r2, .LCPI12_0@toc@ha
1246; CHECK-LE-P9-NEXT:    lxsd v2, 0(r4)
1247; CHECK-LE-P9-NEXT:    xxlxor v4, v4, v4
1248; CHECK-LE-P9-NEXT:    addi r3, r3, .LCPI12_0@toc@l
1249; CHECK-LE-P9-NEXT:    lxv vs1, 0(r3)
1250; CHECK-LE-P9-NEXT:    addis r3, r2, .LCPI12_1@toc@ha
1251; CHECK-LE-P9-NEXT:    addi r3, r3, .LCPI12_1@toc@l
1252; CHECK-LE-P9-NEXT:    lxv v3, 0(r3)
1253; CHECK-LE-P9-NEXT:    xxperm v2, vs0, vs1
1254; CHECK-LE-P9-NEXT:    vperm v2, v4, v2, v3
1255; CHECK-LE-P9-NEXT:    stxv v2, 0(r3)
1256; CHECK-LE-P9-NEXT:    blr
1257;
1258; CHECK-BE-P8-LABEL: test_v2i64_v2i64:
1259; CHECK-BE-P8:       # %bb.0: # %entry
1260; CHECK-BE-P8-NEXT:    lxsdx v2, 0, r3
1261; CHECK-BE-P8-NEXT:    addis r3, r2, .LCPI12_0@toc@ha
1262; CHECK-BE-P8-NEXT:    lxsdx v3, 0, r4
1263; CHECK-BE-P8-NEXT:    addi r3, r3, .LCPI12_0@toc@l
1264; CHECK-BE-P8-NEXT:    lxvw4x v4, 0, r3
1265; CHECK-BE-P8-NEXT:    vperm v2, v3, v2, v4
1266; CHECK-BE-P8-NEXT:    xxlxor v3, v3, v3
1267; CHECK-BE-P8-NEXT:    vmrghh v2, v3, v2
1268; CHECK-BE-P8-NEXT:    stxvw4x v2, 0, r3
1269; CHECK-BE-P8-NEXT:    blr
1270;
1271; CHECK-BE-P9-LABEL: test_v2i64_v2i64:
1272; CHECK-BE-P9:       # %bb.0: # %entry
1273; CHECK-BE-P9-NEXT:    lxsd v2, 0(r3)
1274; CHECK-BE-P9-NEXT:    addis r3, r2, .LCPI12_0@toc@ha
1275; CHECK-BE-P9-NEXT:    lfd f0, 0(r4)
1276; CHECK-BE-P9-NEXT:    xxlxor v3, v3, v3
1277; CHECK-BE-P9-NEXT:    addi r3, r3, .LCPI12_0@toc@l
1278; CHECK-BE-P9-NEXT:    lxv vs1, 0(r3)
1279; CHECK-BE-P9-NEXT:    xxperm v2, vs0, vs1
1280; CHECK-BE-P9-NEXT:    vmrghh v2, v3, v2
1281; CHECK-BE-P9-NEXT:    stxv v2, 0(r3)
1282; CHECK-BE-P9-NEXT:    blr
1283;
1284; CHECK-AIX-64-P8-LABEL: test_v2i64_v2i64:
1285; CHECK-AIX-64-P8:       # %bb.0: # %entry
1286; CHECK-AIX-64-P8-NEXT:    lxsdx v2, 0, r3
1287; CHECK-AIX-64-P8-NEXT:    ld r3, L..C11(r2) # %const.0
1288; CHECK-AIX-64-P8-NEXT:    lxsdx v3, 0, r4
1289; CHECK-AIX-64-P8-NEXT:    lxvw4x v4, 0, r3
1290; CHECK-AIX-64-P8-NEXT:    vperm v2, v3, v2, v4
1291; CHECK-AIX-64-P8-NEXT:    xxlxor v3, v3, v3
1292; CHECK-AIX-64-P8-NEXT:    vmrghh v2, v3, v2
1293; CHECK-AIX-64-P8-NEXT:    stxvw4x v2, 0, r3
1294; CHECK-AIX-64-P8-NEXT:    blr
1295;
1296; CHECK-AIX-64-P9-LABEL: test_v2i64_v2i64:
1297; CHECK-AIX-64-P9:       # %bb.0: # %entry
1298; CHECK-AIX-64-P9-NEXT:    lxsd v2, 0(r3)
1299; CHECK-AIX-64-P9-NEXT:    ld r3, L..C10(r2) # %const.0
1300; CHECK-AIX-64-P9-NEXT:    lfd f0, 0(r4)
1301; CHECK-AIX-64-P9-NEXT:    xxlxor v3, v3, v3
1302; CHECK-AIX-64-P9-NEXT:    lxv vs1, 0(r3)
1303; CHECK-AIX-64-P9-NEXT:    xxperm v2, vs0, vs1
1304; CHECK-AIX-64-P9-NEXT:    vmrghh v2, v3, v2
1305; CHECK-AIX-64-P9-NEXT:    stxv v2, 0(r3)
1306; CHECK-AIX-64-P9-NEXT:    blr
1307;
1308; CHECK-AIX-32-P8-LABEL: test_v2i64_v2i64:
1309; CHECK-AIX-32-P8:       # %bb.0: # %entry
1310; CHECK-AIX-32-P8-NEXT:    lxsiwzx v2, 0, r3
1311; CHECK-AIX-32-P8-NEXT:    lwz r3, L..C13(r2) # %const.0
1312; CHECK-AIX-32-P8-NEXT:    lxsiwzx v3, 0, r4
1313; CHECK-AIX-32-P8-NEXT:    lxvw4x v4, 0, r3
1314; CHECK-AIX-32-P8-NEXT:    vperm v2, v3, v2, v4
1315; CHECK-AIX-32-P8-NEXT:    xxlxor v3, v3, v3
1316; CHECK-AIX-32-P8-NEXT:    vmrghh v2, v3, v2
1317; CHECK-AIX-32-P8-NEXT:    stxvw4x v2, 0, r3
1318; CHECK-AIX-32-P8-NEXT:    blr
1319;
1320; CHECK-AIX-32-P9-LABEL: test_v2i64_v2i64:
1321; CHECK-AIX-32-P9:       # %bb.0: # %entry
1322; CHECK-AIX-32-P9-NEXT:    lxsiwzx v2, 0, r3
1323; CHECK-AIX-32-P9-NEXT:    lwz r3, L..C12(r2) # %const.0
1324; CHECK-AIX-32-P9-NEXT:    lfiwzx f0, 0, r4
1325; CHECK-AIX-32-P9-NEXT:    xxlxor v3, v3, v3
1326; CHECK-AIX-32-P9-NEXT:    lxv vs1, 0(r3)
1327; CHECK-AIX-32-P9-NEXT:    xxperm v2, vs0, vs1
1328; CHECK-AIX-32-P9-NEXT:    vmrghh v2, v3, v2
1329; CHECK-AIX-32-P9-NEXT:    stxv v2, 0(r3)
1330; CHECK-AIX-32-P9-NEXT:    blr
1331entry:
1332  %0 = load <4 x i16>, ptr %ptr1, align 1
1333  %1 = load <4 x i16>, ptr %ptr2, align 1
1334  %shuffle1 = shufflevector <4 x i16> %0, <4 x i16> %1, <4 x i32> <i32 4, i32 5, i32 1, i32 0>
1335  %2 = zext <4 x i16> %shuffle1 to <4 x i32>
1336  store <4 x i32> %2, ptr undef, align 16
1337  ret void
1338}
1339
1340define <16 x i8> @test_v2i64_v4i32(ptr %a, ptr %b) local_unnamed_addr {
1341; CHECK-LE-P8-LABEL: test_v2i64_v4i32:
1342; CHECK-LE-P8:       # %bb.0: # %entry
1343; CHECK-LE-P8-NEXT:    lxsiwzx v2, 0, r3
1344; CHECK-LE-P8-NEXT:    lxsdx v3, 0, r4
1345; CHECK-LE-P8-NEXT:    vmrghh v2, v2, v3
1346; CHECK-LE-P8-NEXT:    blr
1347;
1348; CHECK-LE-P9-LABEL: test_v2i64_v4i32:
1349; CHECK-LE-P9:       # %bb.0: # %entry
1350; CHECK-LE-P9-NEXT:    lxsiwzx v2, 0, r3
1351; CHECK-LE-P9-NEXT:    lxsd v3, 0(r4)
1352; CHECK-LE-P9-NEXT:    vmrghh v2, v2, v3
1353; CHECK-LE-P9-NEXT:    blr
1354;
1355; CHECK-BE-P8-LABEL: test_v2i64_v4i32:
1356; CHECK-BE-P8:       # %bb.0: # %entry
1357; CHECK-BE-P8-NEXT:    lfiwzx f0, 0, r3
1358; CHECK-BE-P8-NEXT:    lxsdx v3, 0, r4
1359; CHECK-BE-P8-NEXT:    xxsldwi v2, f0, f0, 1
1360; CHECK-BE-P8-NEXT:    vmrghh v2, v3, v2
1361; CHECK-BE-P8-NEXT:    blr
1362;
1363; CHECK-BE-P9-LABEL: test_v2i64_v4i32:
1364; CHECK-BE-P9:       # %bb.0: # %entry
1365; CHECK-BE-P9-NEXT:    lfiwzx f0, 0, r3
1366; CHECK-BE-P9-NEXT:    lxsd v3, 0(r4)
1367; CHECK-BE-P9-NEXT:    xxsldwi v2, f0, f0, 1
1368; CHECK-BE-P9-NEXT:    vmrghh v2, v3, v2
1369; CHECK-BE-P9-NEXT:    blr
1370;
1371; CHECK-AIX-64-P8-LABEL: test_v2i64_v4i32:
1372; CHECK-AIX-64-P8:       # %bb.0: # %entry
1373; CHECK-AIX-64-P8-NEXT:    lfiwzx f0, 0, r3
1374; CHECK-AIX-64-P8-NEXT:    lxsdx v3, 0, r4
1375; CHECK-AIX-64-P8-NEXT:    xxsldwi v2, f0, f0, 1
1376; CHECK-AIX-64-P8-NEXT:    vmrghh v2, v3, v2
1377; CHECK-AIX-64-P8-NEXT:    blr
1378;
1379; CHECK-AIX-64-P9-LABEL: test_v2i64_v4i32:
1380; CHECK-AIX-64-P9:       # %bb.0: # %entry
1381; CHECK-AIX-64-P9-NEXT:    lfiwzx f0, 0, r3
1382; CHECK-AIX-64-P9-NEXT:    lxsd v3, 0(r4)
1383; CHECK-AIX-64-P9-NEXT:    xxsldwi v2, f0, f0, 1
1384; CHECK-AIX-64-P9-NEXT:    vmrghh v2, v3, v2
1385; CHECK-AIX-64-P9-NEXT:    blr
1386;
1387; CHECK-AIX-32-P8-LABEL: test_v2i64_v4i32:
1388; CHECK-AIX-32-P8:       # %bb.0: # %entry
1389; CHECK-AIX-32-P8-NEXT:    lxsiwzx v2, 0, r3
1390; CHECK-AIX-32-P8-NEXT:    lwz r3, L..C14(r2) # %const.0
1391; CHECK-AIX-32-P8-NEXT:    lxsiwzx v3, 0, r4
1392; CHECK-AIX-32-P8-NEXT:    lxvw4x v4, 0, r3
1393; CHECK-AIX-32-P8-NEXT:    vperm v2, v3, v2, v4
1394; CHECK-AIX-32-P8-NEXT:    blr
1395;
1396; CHECK-AIX-32-P9-LABEL: test_v2i64_v4i32:
1397; CHECK-AIX-32-P9:       # %bb.0: # %entry
1398; CHECK-AIX-32-P9-NEXT:    lxsiwzx v2, 0, r3
1399; CHECK-AIX-32-P9-NEXT:    lwz r3, L..C13(r2) # %const.0
1400; CHECK-AIX-32-P9-NEXT:    lfiwzx f0, 0, r4
1401; CHECK-AIX-32-P9-NEXT:    lxv vs1, 0(r3)
1402; CHECK-AIX-32-P9-NEXT:    xxperm v2, vs0, vs1
1403; CHECK-AIX-32-P9-NEXT:    blr
1404entry:
1405  %0 = load <2 x i8>, ptr %a, align 4
1406  %bc1 = bitcast <2 x i8> %0 to i16
1407  %vecinit3 = insertelement <8 x i16> poison, i16 %bc1, i64 0
1408  %1 = load <2 x i8>, ptr %b, align 8
1409  %bc2 = bitcast <2 x i8> %1 to i16
1410  %vecinit6 = insertelement <8 x i16> undef, i16 %bc2, i64 0
1411  %2 = bitcast <8 x i16> %vecinit3 to <16 x i8>
1412  %3 = bitcast <8 x i16> %vecinit6 to <16 x i8>
1413  %shuffle = shufflevector <16 x i8> %3, <16 x i8> %2, <16 x i32> <i32 0, i32 1, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1414  ret <16 x i8> %shuffle
1415}
1416
1417define <16 x i8> @test_v2i64_v8i16(ptr %a, ptr %b) local_unnamed_addr {
1418; CHECK-LE-P8-LABEL: test_v2i64_v8i16:
1419; CHECK-LE-P8:       # %bb.0: # %entry
1420; CHECK-LE-P8-NEXT:    lhz r3, 0(r3)
1421; CHECK-LE-P8-NEXT:    lxsdx v3, 0, r4
1422; CHECK-LE-P8-NEXT:    mtvsrd v2, r3
1423; CHECK-LE-P8-NEXT:    vmrghh v2, v2, v3
1424; CHECK-LE-P8-NEXT:    blr
1425;
1426; CHECK-LE-P9-LABEL: test_v2i64_v8i16:
1427; CHECK-LE-P9:       # %bb.0: # %entry
1428; CHECK-LE-P9-NEXT:    lxsihzx v2, 0, r3
1429; CHECK-LE-P9-NEXT:    lxsd v3, 0(r4)
1430; CHECK-LE-P9-NEXT:    vmrghh v2, v2, v3
1431; CHECK-LE-P9-NEXT:    blr
1432;
1433; CHECK-BE-P8-LABEL: test_v2i64_v8i16:
1434; CHECK-BE-P8:       # %bb.0: # %entry
1435; CHECK-BE-P8-NEXT:    lhz r3, 0(r3)
1436; CHECK-BE-P8-NEXT:    lxsdx v3, 0, r4
1437; CHECK-BE-P8-NEXT:    sldi r3, r3, 48
1438; CHECK-BE-P8-NEXT:    mtvsrd v2, r3
1439; CHECK-BE-P8-NEXT:    vmrghh v2, v3, v2
1440; CHECK-BE-P8-NEXT:    blr
1441;
1442; CHECK-BE-P9-LABEL: test_v2i64_v8i16:
1443; CHECK-BE-P9:       # %bb.0: # %entry
1444; CHECK-BE-P9-NEXT:    lxsihzx v2, 0, r3
1445; CHECK-BE-P9-NEXT:    lxsd v3, 0(r4)
1446; CHECK-BE-P9-NEXT:    vsplth v2, v2, 3
1447; CHECK-BE-P9-NEXT:    vmrghh v2, v3, v2
1448; CHECK-BE-P9-NEXT:    blr
1449;
1450; CHECK-AIX-64-P8-LABEL: test_v2i64_v8i16:
1451; CHECK-AIX-64-P8:       # %bb.0: # %entry
1452; CHECK-AIX-64-P8-NEXT:    lhz r3, 0(r3)
1453; CHECK-AIX-64-P8-NEXT:    lxsdx v3, 0, r4
1454; CHECK-AIX-64-P8-NEXT:    sldi r3, r3, 48
1455; CHECK-AIX-64-P8-NEXT:    mtvsrd v2, r3
1456; CHECK-AIX-64-P8-NEXT:    vmrghh v2, v3, v2
1457; CHECK-AIX-64-P8-NEXT:    blr
1458;
1459; CHECK-AIX-64-P9-LABEL: test_v2i64_v8i16:
1460; CHECK-AIX-64-P9:       # %bb.0: # %entry
1461; CHECK-AIX-64-P9-NEXT:    lxsihzx v2, 0, r3
1462; CHECK-AIX-64-P9-NEXT:    lxsd v3, 0(r4)
1463; CHECK-AIX-64-P9-NEXT:    vsplth v2, v2, 3
1464; CHECK-AIX-64-P9-NEXT:    vmrghh v2, v3, v2
1465; CHECK-AIX-64-P9-NEXT:    blr
1466;
1467; CHECK-AIX-32-P8-LABEL: test_v2i64_v8i16:
1468; CHECK-AIX-32-P8:       # %bb.0: # %entry
1469; CHECK-AIX-32-P8-NEXT:    lhz r3, 0(r3)
1470; CHECK-AIX-32-P8-NEXT:    lxsiwzx v3, 0, r4
1471; CHECK-AIX-32-P8-NEXT:    mtvsrwz v2, r3
1472; CHECK-AIX-32-P8-NEXT:    lwz r3, L..C15(r2) # %const.0
1473; CHECK-AIX-32-P8-NEXT:    lxvw4x v4, 0, r3
1474; CHECK-AIX-32-P8-NEXT:    vperm v2, v3, v2, v4
1475; CHECK-AIX-32-P8-NEXT:    blr
1476;
1477; CHECK-AIX-32-P9-LABEL: test_v2i64_v8i16:
1478; CHECK-AIX-32-P9:       # %bb.0: # %entry
1479; CHECK-AIX-32-P9-NEXT:    lxsihzx v2, 0, r3
1480; CHECK-AIX-32-P9-NEXT:    lwz r3, L..C14(r2) # %const.0
1481; CHECK-AIX-32-P9-NEXT:    lfiwzx f0, 0, r4
1482; CHECK-AIX-32-P9-NEXT:    lxv vs1, 0(r3)
1483; CHECK-AIX-32-P9-NEXT:    xxperm v2, vs0, vs1
1484; CHECK-AIX-32-P9-NEXT:    blr
1485entry:
1486  %0 = load <2 x i8>, ptr %a
1487  %bc1 = bitcast <2 x i8> %0 to i16
1488  %vecinit3 = insertelement <8 x i16> poison, i16 %bc1, i64 0
1489  %1 = load <2 x i8>, ptr %b, align 8
1490  %bc2 = bitcast <2 x i8> %1 to i16
1491  %vecinit6 = insertelement <8 x i16> undef, i16 %bc2, i64 0
1492  %2 = bitcast <8 x i16> %vecinit3 to <16 x i8>
1493  %3 = bitcast <8 x i16> %vecinit6 to <16 x i8>
1494  %shuffle = shufflevector <16 x i8> %3, <16 x i8> %2, <16 x i32> <i32 0, i32 1, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1495  ret <16 x i8> %shuffle
1496}
1497