xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/merge-consecutive-loads-256.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512F
5*9880d681SAndroid Build Coastguard Worker;
6*9880d681SAndroid Build Coastguard Worker; Just one 32-bit run to make sure we do reasonable things.
7*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=X32-AVX
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @merge_4f64_2f64_23(<2 x double>* %ptr) nounwind uwtable noinline ssp {
10*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_4f64_2f64_23:
11*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
12*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovups 32(%rdi), %ymm0
13*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
14*9880d681SAndroid Build Coastguard Worker;
15*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_4f64_2f64_23:
16*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
17*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
18*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovups 32(%eax), %ymm0
19*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
20*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds <2 x double>, <2 x double>* %ptr, i64 2
21*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds <2 x double>, <2 x double>* %ptr, i64 3
22*9880d681SAndroid Build Coastguard Worker  %val0 = load <2 x double>, <2 x double>* %ptr0
23*9880d681SAndroid Build Coastguard Worker  %val1 = load <2 x double>, <2 x double>* %ptr1
24*9880d681SAndroid Build Coastguard Worker  %res = shufflevector <2 x double> %val0, <2 x double> %val1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
25*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %res
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @merge_4f64_2f64_2z(<2 x double>* %ptr) nounwind uwtable noinline ssp {
29*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_4f64_2f64_2z:
30*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
31*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovaps 32(%rdi), %xmm0
32*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
33*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
34*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
35*9880d681SAndroid Build Coastguard Worker;
36*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_4f64_2f64_2z:
37*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
38*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
39*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovaps 32(%eax), %xmm0
40*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
41*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
42*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
43*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds <2 x double>, <2 x double>* %ptr, i64 2
44*9880d681SAndroid Build Coastguard Worker  %val0 = load <2 x double>, <2 x double>* %ptr0
45*9880d681SAndroid Build Coastguard Worker  %res = shufflevector <2 x double> %val0, <2 x double> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
46*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %res
47*9880d681SAndroid Build Coastguard Worker}
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @merge_4f64_f64_2345(double* %ptr) nounwind uwtable noinline ssp {
50*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_4f64_f64_2345:
51*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
52*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovups 16(%rdi), %ymm0
53*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
54*9880d681SAndroid Build Coastguard Worker;
55*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_4f64_f64_2345:
56*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
57*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
58*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovups 16(%eax), %ymm0
59*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
60*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds double, double* %ptr, i64 2
61*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds double, double* %ptr, i64 3
62*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds double, double* %ptr, i64 4
63*9880d681SAndroid Build Coastguard Worker  %ptr3 = getelementptr inbounds double, double* %ptr, i64 5
64*9880d681SAndroid Build Coastguard Worker  %val0 = load double, double* %ptr0
65*9880d681SAndroid Build Coastguard Worker  %val1 = load double, double* %ptr1
66*9880d681SAndroid Build Coastguard Worker  %val2 = load double, double* %ptr2
67*9880d681SAndroid Build Coastguard Worker  %val3 = load double, double* %ptr3
68*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <4 x double> undef, double %val0, i32 0
69*9880d681SAndroid Build Coastguard Worker  %res1 = insertelement <4 x double> %res0, double %val1, i32 1
70*9880d681SAndroid Build Coastguard Worker  %res2 = insertelement <4 x double> %res1, double %val2, i32 2
71*9880d681SAndroid Build Coastguard Worker  %res3 = insertelement <4 x double> %res2, double %val3, i32 3
72*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %res3
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @merge_4f64_f64_3zuu(double* %ptr) nounwind uwtable noinline ssp {
76*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_4f64_f64_3zuu:
77*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
78*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
79*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
80*9880d681SAndroid Build Coastguard Worker;
81*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_4f64_f64_3zuu:
82*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
83*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
84*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
85*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
86*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds double, double* %ptr, i64 3
87*9880d681SAndroid Build Coastguard Worker  %val0 = load double, double* %ptr0
88*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <4 x double> undef, double %val0, i32 0
89*9880d681SAndroid Build Coastguard Worker  %res1 = insertelement <4 x double> %res0, double 0.0, i32 1
90*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %res1
91*9880d681SAndroid Build Coastguard Worker}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @merge_4f64_f64_34uu(double* %ptr) nounwind uwtable noinline ssp {
94*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_4f64_f64_34uu:
95*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
96*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovups 24(%rdi), %xmm0
97*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
98*9880d681SAndroid Build Coastguard Worker;
99*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_4f64_f64_34uu:
100*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
101*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
102*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovups 24(%eax), %xmm0
103*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
104*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds double, double* %ptr, i64 3
105*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds double, double* %ptr, i64 4
106*9880d681SAndroid Build Coastguard Worker  %val0 = load double, double* %ptr0
107*9880d681SAndroid Build Coastguard Worker  %val1 = load double, double* %ptr1
108*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <4 x double> undef, double %val0, i32 0
109*9880d681SAndroid Build Coastguard Worker  %res1 = insertelement <4 x double> %res0, double %val1, i32 1
110*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %res1
111*9880d681SAndroid Build Coastguard Worker}
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @merge_4f64_f64_45zz(double* %ptr) nounwind uwtable noinline ssp {
114*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_4f64_f64_45zz:
115*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
116*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovups 32(%rdi), %xmm0
117*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
118*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
119*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
120*9880d681SAndroid Build Coastguard Worker;
121*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_4f64_f64_45zz:
122*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
123*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
124*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovups 32(%eax), %xmm0
125*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
126*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
127*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
128*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds double, double* %ptr, i64 4
129*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds double, double* %ptr, i64 5
130*9880d681SAndroid Build Coastguard Worker  %val0 = load double, double* %ptr0
131*9880d681SAndroid Build Coastguard Worker  %val1 = load double, double* %ptr1
132*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <4 x double> zeroinitializer, double %val0, i32 0
133*9880d681SAndroid Build Coastguard Worker  %res1 = insertelement <4 x double> %res0, double %val1, i32 1
134*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %res1
135*9880d681SAndroid Build Coastguard Worker}
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @merge_4f64_f64_34z6(double* %ptr) nounwind uwtable noinline ssp {
138*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_4f64_f64_34z6:
139*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
140*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vxorpd %ymm0, %ymm0, %ymm0
141*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendpd {{.*#+}} ymm0 = mem[0,1],ymm0[2],mem[3]
142*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
143*9880d681SAndroid Build Coastguard Worker;
144*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_4f64_f64_34z6:
145*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
146*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
147*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vxorpd %ymm0, %ymm0, %ymm0
148*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vblendpd {{.*#+}} ymm0 = mem[0,1],ymm0[2],mem[3]
149*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
150*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds double, double* %ptr, i64 3
151*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds double, double* %ptr, i64 4
152*9880d681SAndroid Build Coastguard Worker  %ptr3 = getelementptr inbounds double, double* %ptr, i64 6
153*9880d681SAndroid Build Coastguard Worker  %val0 = load double, double* %ptr0
154*9880d681SAndroid Build Coastguard Worker  %val1 = load double, double* %ptr1
155*9880d681SAndroid Build Coastguard Worker  %val3 = load double, double* %ptr3
156*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <4 x double> undef, double %val0, i32 0
157*9880d681SAndroid Build Coastguard Worker  %res1 = insertelement <4 x double> %res0, double %val1, i32 1
158*9880d681SAndroid Build Coastguard Worker  %res2 = insertelement <4 x double> %res1, double   0.0, i32 2
159*9880d681SAndroid Build Coastguard Worker  %res3 = insertelement <4 x double> %res2, double %val3, i32 3
160*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %res3
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @merge_4i64_2i64_3z(<2 x i64>* %ptr) nounwind uwtable noinline ssp {
164*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_4i64_2i64_3z:
165*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
166*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovaps 48(%rdi), %xmm0
167*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
168*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
169*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
170*9880d681SAndroid Build Coastguard Worker;
171*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_4i64_2i64_3z:
172*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
173*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
174*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovaps 48(%eax), %xmm0
175*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
176*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
177*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
178*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds <2 x i64>, <2 x i64>* %ptr, i64 3
179*9880d681SAndroid Build Coastguard Worker  %val0 = load <2 x i64>, <2 x i64>* %ptr0
180*9880d681SAndroid Build Coastguard Worker  %res = shufflevector <2 x i64> %val0, <2 x i64> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
181*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %res
182*9880d681SAndroid Build Coastguard Worker}
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @merge_4i64_i64_1234(i64* %ptr) nounwind uwtable noinline ssp {
185*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_4i64_i64_1234:
186*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
187*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovups 8(%rdi), %ymm0
188*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
189*9880d681SAndroid Build Coastguard Worker;
190*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_4i64_i64_1234:
191*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
192*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
193*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovups 8(%eax), %ymm0
194*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
195*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds i64, i64* %ptr, i64 1
196*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds i64, i64* %ptr, i64 2
197*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds i64, i64* %ptr, i64 3
198*9880d681SAndroid Build Coastguard Worker  %ptr3 = getelementptr inbounds i64, i64* %ptr, i64 4
199*9880d681SAndroid Build Coastguard Worker  %val0 = load i64, i64* %ptr0
200*9880d681SAndroid Build Coastguard Worker  %val1 = load i64, i64* %ptr1
201*9880d681SAndroid Build Coastguard Worker  %val2 = load i64, i64* %ptr2
202*9880d681SAndroid Build Coastguard Worker  %val3 = load i64, i64* %ptr3
203*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <4 x i64> undef, i64 %val0, i32 0
204*9880d681SAndroid Build Coastguard Worker  %res1 = insertelement <4 x i64> %res0, i64 %val1, i32 1
205*9880d681SAndroid Build Coastguard Worker  %res2 = insertelement <4 x i64> %res1, i64 %val2, i32 2
206*9880d681SAndroid Build Coastguard Worker  %res3 = insertelement <4 x i64> %res2, i64 %val3, i32 3
207*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %res3
208*9880d681SAndroid Build Coastguard Worker}
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @merge_4i64_i64_1zzu(i64* %ptr) nounwind uwtable noinline ssp {
211*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_4i64_i64_1zzu:
212*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
213*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
214*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
215*9880d681SAndroid Build Coastguard Worker;
216*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_4i64_i64_1zzu:
217*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
218*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
219*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
220*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
221*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds i64, i64* %ptr, i64 1
222*9880d681SAndroid Build Coastguard Worker  %val0 = load i64, i64* %ptr0
223*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <4 x i64> undef, i64 %val0, i32 0
224*9880d681SAndroid Build Coastguard Worker  %res1 = insertelement <4 x i64> %res0, i64 0, i32 1
225*9880d681SAndroid Build Coastguard Worker  %res2 = insertelement <4 x i64> %res1, i64 0, i32 1
226*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %res2
227*9880d681SAndroid Build Coastguard Worker}
228*9880d681SAndroid Build Coastguard Worker
229*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @merge_4i64_i64_23zz(i64* %ptr) nounwind uwtable noinline ssp {
230*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_4i64_i64_23zz:
231*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
232*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovups 16(%rdi), %xmm0
233*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
234*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
235*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
236*9880d681SAndroid Build Coastguard Worker;
237*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_4i64_i64_23zz:
238*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
239*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
240*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovups 16(%eax), %xmm0
241*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
242*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
243*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
244*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds i64, i64* %ptr, i64 2
245*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds i64, i64* %ptr, i64 3
246*9880d681SAndroid Build Coastguard Worker  %val0 = load i64, i64* %ptr0
247*9880d681SAndroid Build Coastguard Worker  %val1 = load i64, i64* %ptr1
248*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <4 x i64> zeroinitializer, i64 %val0, i32 0
249*9880d681SAndroid Build Coastguard Worker  %res1 = insertelement <4 x i64> %res0, i64 %val1, i32 1
250*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %res1
251*9880d681SAndroid Build Coastguard Worker}
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @merge_8f32_2f32_23z5(<2 x float>* %ptr) nounwind uwtable noinline ssp {
254*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: merge_8f32_2f32_23z5:
255*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
256*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vmovupd 16(%rdi), %xmm0
257*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
258*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
259*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
260*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
261*9880d681SAndroid Build Coastguard Worker;
262*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: merge_8f32_2f32_23z5:
263*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
264*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vmovupd 16(%rdi), %xmm0
265*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
266*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
267*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
268*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
269*9880d681SAndroid Build Coastguard Worker;
270*9880d681SAndroid Build Coastguard Worker; AVX512F-LABEL: merge_8f32_2f32_23z5:
271*9880d681SAndroid Build Coastguard Worker; AVX512F:       # BB#0:
272*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vmovups 16(%rdi), %xmm0
273*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vxorps %xmm1, %xmm1, %xmm1
274*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
275*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
276*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    retq
277*9880d681SAndroid Build Coastguard Worker;
278*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_8f32_2f32_23z5:
279*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
280*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
281*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vxorpd %ymm0, %ymm0, %ymm0
282*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vblendpd {{.*#+}} ymm0 = mem[0,1],ymm0[2],mem[3]
283*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
284*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds <2 x float>, <2 x float>* %ptr, i64 2
285*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds <2 x float>, <2 x float>* %ptr, i64 3
286*9880d681SAndroid Build Coastguard Worker  %ptr3 = getelementptr inbounds <2 x float>, <2 x float>* %ptr, i64 5
287*9880d681SAndroid Build Coastguard Worker  %val0 = load <2 x float>, <2 x float>* %ptr0
288*9880d681SAndroid Build Coastguard Worker  %val1 = load <2 x float>, <2 x float>* %ptr1
289*9880d681SAndroid Build Coastguard Worker  %val3 = load <2 x float>, <2 x float>* %ptr3
290*9880d681SAndroid Build Coastguard Worker  %res01 = shufflevector <2 x float> %val0, <2 x float> %val1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
291*9880d681SAndroid Build Coastguard Worker  %res23 = shufflevector <2 x float> zeroinitializer, <2 x float> %val3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
292*9880d681SAndroid Build Coastguard Worker  %res = shufflevector <4 x float> %res01, <4 x float> %res23, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
293*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %res
294*9880d681SAndroid Build Coastguard Worker}
295*9880d681SAndroid Build Coastguard Worker
296*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @merge_8f32_4f32_z2(<4 x float>* %ptr) nounwind uwtable noinline ssp {
297*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_8f32_4f32_z2:
298*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
299*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
300*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vinsertf128 $1, 32(%rdi), %ymm0, %ymm0
301*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
302*9880d681SAndroid Build Coastguard Worker;
303*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_8f32_4f32_z2:
304*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
305*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
306*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
307*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vinsertf128 $1, 32(%eax), %ymm0, %ymm0
308*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
309*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds <4 x float>, <4 x float>* %ptr, i64 2
310*9880d681SAndroid Build Coastguard Worker  %val1 = load <4 x float>, <4 x float>* %ptr1
311*9880d681SAndroid Build Coastguard Worker  %res = shufflevector <4 x float> zeroinitializer, <4 x float> %val1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
312*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %res
313*9880d681SAndroid Build Coastguard Worker}
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @merge_8f32_f32_12zzuuzz(float* %ptr) nounwind uwtable noinline ssp {
316*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_8f32_f32_12zzuuzz:
317*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
318*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
319*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
320*9880d681SAndroid Build Coastguard Worker;
321*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_8f32_f32_12zzuuzz:
322*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
323*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
324*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
325*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
326*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds float, float* %ptr, i64 1
327*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds float, float* %ptr, i64 2
328*9880d681SAndroid Build Coastguard Worker  %val0 = load float, float* %ptr0
329*9880d681SAndroid Build Coastguard Worker  %val1 = load float, float* %ptr1
330*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <8 x float> undef, float %val0, i32 0
331*9880d681SAndroid Build Coastguard Worker  %res1 = insertelement <8 x float> %res0, float %val1, i32 1
332*9880d681SAndroid Build Coastguard Worker  %res2 = insertelement <8 x float> %res1, float   0.0, i32 2
333*9880d681SAndroid Build Coastguard Worker  %res3 = insertelement <8 x float> %res2, float   0.0, i32 3
334*9880d681SAndroid Build Coastguard Worker  %res6 = insertelement <8 x float> %res3, float   0.0, i32 6
335*9880d681SAndroid Build Coastguard Worker  %res7 = insertelement <8 x float> %res6, float   0.0, i32 7
336*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %res7
337*9880d681SAndroid Build Coastguard Worker}
338*9880d681SAndroid Build Coastguard Worker
339*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @merge_8f32_f32_1u3u5zu8(float* %ptr) nounwind uwtable noinline ssp {
340*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_8f32_f32_1u3u5zu8:
341*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
342*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vxorps %ymm0, %ymm0, %ymm0
343*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendps {{.*#+}} ymm0 = mem[0,1,2,3,4],ymm0[5],mem[6,7]
344*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
345*9880d681SAndroid Build Coastguard Worker;
346*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_8f32_f32_1u3u5zu8:
347*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
348*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
349*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vxorps %ymm0, %ymm0, %ymm0
350*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vblendps {{.*#+}} ymm0 = mem[0,1,2,3,4],ymm0[5],mem[6,7]
351*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
352*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds float, float* %ptr, i64 1
353*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds float, float* %ptr, i64 3
354*9880d681SAndroid Build Coastguard Worker  %ptr4 = getelementptr inbounds float, float* %ptr, i64 5
355*9880d681SAndroid Build Coastguard Worker  %ptr7 = getelementptr inbounds float, float* %ptr, i64 8
356*9880d681SAndroid Build Coastguard Worker  %val0 = load float, float* %ptr0
357*9880d681SAndroid Build Coastguard Worker  %val2 = load float, float* %ptr2
358*9880d681SAndroid Build Coastguard Worker  %val4 = load float, float* %ptr4
359*9880d681SAndroid Build Coastguard Worker  %val7 = load float, float* %ptr7
360*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <8 x float> undef, float %val0, i32 0
361*9880d681SAndroid Build Coastguard Worker  %res2 = insertelement <8 x float> %res0, float %val2, i32 2
362*9880d681SAndroid Build Coastguard Worker  %res4 = insertelement <8 x float> %res2, float %val4, i32 4
363*9880d681SAndroid Build Coastguard Worker  %res5 = insertelement <8 x float> %res4, float   0.0, i32 5
364*9880d681SAndroid Build Coastguard Worker  %res7 = insertelement <8 x float> %res5, float %val7, i32 7
365*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %res7
366*9880d681SAndroid Build Coastguard Worker}
367*9880d681SAndroid Build Coastguard Worker
368*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @merge_8i32_4i32_z3(<4 x i32>* %ptr) nounwind uwtable noinline ssp {
369*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_8i32_4i32_z3:
370*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
371*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
372*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vinsertf128 $1, 48(%rdi), %ymm0, %ymm0
373*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
374*9880d681SAndroid Build Coastguard Worker;
375*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_8i32_4i32_z3:
376*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
377*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
378*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
379*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vinsertf128 $1, 48(%eax), %ymm0, %ymm0
380*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
381*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds <4 x i32>, <4 x i32>* %ptr, i64 3
382*9880d681SAndroid Build Coastguard Worker  %val1 = load <4 x i32>, <4 x i32>* %ptr1
383*9880d681SAndroid Build Coastguard Worker  %res = shufflevector <4 x i32> zeroinitializer, <4 x i32> %val1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
384*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %res
385*9880d681SAndroid Build Coastguard Worker}
386*9880d681SAndroid Build Coastguard Worker
387*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @merge_8i32_i32_56zz9uzz(i32* %ptr) nounwind uwtable noinline ssp {
388*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: merge_8i32_i32_56zz9uzz:
389*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
390*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
391*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
392*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
393*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
394*9880d681SAndroid Build Coastguard Worker;
395*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: merge_8i32_i32_56zz9uzz:
396*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
397*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
398*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
399*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
400*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
401*9880d681SAndroid Build Coastguard Worker;
402*9880d681SAndroid Build Coastguard Worker; AVX512F-LABEL: merge_8i32_i32_56zz9uzz:
403*9880d681SAndroid Build Coastguard Worker; AVX512F:       # BB#0:
404*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
405*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
406*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
407*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    retq
408*9880d681SAndroid Build Coastguard Worker;
409*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_8i32_i32_56zz9uzz:
410*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
411*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
412*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
413*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
414*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
415*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
416*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds i32, i32* %ptr, i64 5
417*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds i32, i32* %ptr, i64 6
418*9880d681SAndroid Build Coastguard Worker  %ptr4 = getelementptr inbounds i32, i32* %ptr, i64 9
419*9880d681SAndroid Build Coastguard Worker  %val0 = load i32, i32* %ptr0
420*9880d681SAndroid Build Coastguard Worker  %val1 = load i32, i32* %ptr1
421*9880d681SAndroid Build Coastguard Worker  %val4 = load i32, i32* %ptr4
422*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <8 x i32> undef, i32 %val0, i32 0
423*9880d681SAndroid Build Coastguard Worker  %res1 = insertelement <8 x i32> %res0, i32 %val1, i32 1
424*9880d681SAndroid Build Coastguard Worker  %res2 = insertelement <8 x i32> %res1, i32     0, i32 2
425*9880d681SAndroid Build Coastguard Worker  %res3 = insertelement <8 x i32> %res2, i32     0, i32 3
426*9880d681SAndroid Build Coastguard Worker  %res4 = insertelement <8 x i32> %res3, i32 %val4, i32 4
427*9880d681SAndroid Build Coastguard Worker  %res6 = insertelement <8 x i32> %res4, i32     0, i32 6
428*9880d681SAndroid Build Coastguard Worker  %res7 = insertelement <8 x i32> %res6, i32     0, i32 7
429*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %res7
430*9880d681SAndroid Build Coastguard Worker}
431*9880d681SAndroid Build Coastguard Worker
432*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @merge_8i32_i32_1u3u5zu8(i32* %ptr) nounwind uwtable noinline ssp {
433*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: merge_8i32_i32_1u3u5zu8:
434*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
435*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vxorps %ymm0, %ymm0, %ymm0
436*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = mem[0,1,2,3,4],ymm0[5],mem[6,7]
437*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
438*9880d681SAndroid Build Coastguard Worker;
439*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: merge_8i32_i32_1u3u5zu8:
440*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
441*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpxor %ymm0, %ymm0, %ymm0
442*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = mem[0,1,2,3,4],ymm0[5],mem[6,7]
443*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
444*9880d681SAndroid Build Coastguard Worker;
445*9880d681SAndroid Build Coastguard Worker; AVX512F-LABEL: merge_8i32_i32_1u3u5zu8:
446*9880d681SAndroid Build Coastguard Worker; AVX512F:       # BB#0:
447*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vpxor %ymm0, %ymm0, %ymm0
448*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vpblendd {{.*#+}} ymm0 = mem[0,1,2,3,4],ymm0[5],mem[6,7]
449*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    retq
450*9880d681SAndroid Build Coastguard Worker;
451*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_8i32_i32_1u3u5zu8:
452*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
453*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
454*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vxorps %ymm0, %ymm0, %ymm0
455*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vblendps {{.*#+}} ymm0 = mem[0,1,2,3,4],ymm0[5],mem[6,7]
456*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
457*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds i32, i32* %ptr, i64 1
458*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds i32, i32* %ptr, i64 3
459*9880d681SAndroid Build Coastguard Worker  %ptr4 = getelementptr inbounds i32, i32* %ptr, i64 5
460*9880d681SAndroid Build Coastguard Worker  %ptr7 = getelementptr inbounds i32, i32* %ptr, i64 8
461*9880d681SAndroid Build Coastguard Worker  %val0 = load i32, i32* %ptr0
462*9880d681SAndroid Build Coastguard Worker  %val2 = load i32, i32* %ptr2
463*9880d681SAndroid Build Coastguard Worker  %val4 = load i32, i32* %ptr4
464*9880d681SAndroid Build Coastguard Worker  %val7 = load i32, i32* %ptr7
465*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <8 x i32> undef, i32 %val0, i32 0
466*9880d681SAndroid Build Coastguard Worker  %res2 = insertelement <8 x i32> %res0, i32 %val2, i32 2
467*9880d681SAndroid Build Coastguard Worker  %res4 = insertelement <8 x i32> %res2, i32 %val4, i32 4
468*9880d681SAndroid Build Coastguard Worker  %res5 = insertelement <8 x i32> %res4, i32     0, i32 5
469*9880d681SAndroid Build Coastguard Worker  %res7 = insertelement <8 x i32> %res5, i32 %val7, i32 7
470*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %res7
471*9880d681SAndroid Build Coastguard Worker}
472*9880d681SAndroid Build Coastguard Worker
473*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @merge_16i16_i16_89zzzuuuuuuuuuuuz(i16* %ptr) nounwind uwtable noinline ssp {
474*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_16i16_i16_89zzzuuuuuuuuuuuz:
475*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
476*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
477*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
478*9880d681SAndroid Build Coastguard Worker;
479*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_16i16_i16_89zzzuuuuuuuuuuuz:
480*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
481*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
482*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
483*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
484*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds i16, i16* %ptr, i64 8
485*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds i16, i16* %ptr, i64 9
486*9880d681SAndroid Build Coastguard Worker  %val0 = load i16, i16* %ptr0
487*9880d681SAndroid Build Coastguard Worker  %val1 = load i16, i16* %ptr1
488*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <16 x i16> undef, i16 %val0, i16 0
489*9880d681SAndroid Build Coastguard Worker  %res1 = insertelement <16 x i16> %res0, i16 %val1, i16 1
490*9880d681SAndroid Build Coastguard Worker  %res2 = insertelement <16 x i16> %res1, i16     0, i16 2
491*9880d681SAndroid Build Coastguard Worker  %res3 = insertelement <16 x i16> %res2, i16     0, i16 3
492*9880d681SAndroid Build Coastguard Worker  %res4 = insertelement <16 x i16> %res3, i16     0, i16 4
493*9880d681SAndroid Build Coastguard Worker  %resF = insertelement <16 x i16> %res4, i16     0, i16 15
494*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %resF
495*9880d681SAndroid Build Coastguard Worker}
496*9880d681SAndroid Build Coastguard Worker
497*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @merge_16i16_i16_45u7uuuuuuuuuuuu(i16* %ptr) nounwind uwtable noinline ssp {
498*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_16i16_i16_45u7uuuuuuuuuuuu:
499*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
500*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
501*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
502*9880d681SAndroid Build Coastguard Worker;
503*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_16i16_i16_45u7uuuuuuuuuuuu:
504*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
505*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
506*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
507*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
508*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds i16, i16* %ptr, i64 4
509*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds i16, i16* %ptr, i64 5
510*9880d681SAndroid Build Coastguard Worker  %ptr3 = getelementptr inbounds i16, i16* %ptr, i64 7
511*9880d681SAndroid Build Coastguard Worker  %val0 = load i16, i16* %ptr0
512*9880d681SAndroid Build Coastguard Worker  %val1 = load i16, i16* %ptr1
513*9880d681SAndroid Build Coastguard Worker  %val3 = load i16, i16* %ptr3
514*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <16 x i16> undef, i16 %val0, i16 0
515*9880d681SAndroid Build Coastguard Worker  %res1 = insertelement <16 x i16> %res0, i16 %val1, i16 1
516*9880d681SAndroid Build Coastguard Worker  %res3 = insertelement <16 x i16> %res1, i16 %val3, i16 3
517*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %res3
518*9880d681SAndroid Build Coastguard Worker}
519*9880d681SAndroid Build Coastguard Worker
520*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @merge_16i16_i16_0uu3uuuuuuuuCuEF(i16* %ptr) nounwind uwtable noinline ssp {
521*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_16i16_i16_0uu3uuuuuuuuCuEF:
522*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
523*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovups (%rdi), %ymm0
524*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
525*9880d681SAndroid Build Coastguard Worker;
526*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_16i16_i16_0uu3uuuuuuuuCuEF:
527*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
528*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
529*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovups (%eax), %ymm0
530*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
531*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds i16, i16* %ptr, i64 0
532*9880d681SAndroid Build Coastguard Worker  %ptr3 = getelementptr inbounds i16, i16* %ptr, i64 3
533*9880d681SAndroid Build Coastguard Worker  %ptrC = getelementptr inbounds i16, i16* %ptr, i64 12
534*9880d681SAndroid Build Coastguard Worker  %ptrE = getelementptr inbounds i16, i16* %ptr, i64 14
535*9880d681SAndroid Build Coastguard Worker  %ptrF = getelementptr inbounds i16, i16* %ptr, i64 15
536*9880d681SAndroid Build Coastguard Worker  %val0 = load i16, i16* %ptr0
537*9880d681SAndroid Build Coastguard Worker  %val3 = load i16, i16* %ptr3
538*9880d681SAndroid Build Coastguard Worker  %valC = load i16, i16* %ptrC
539*9880d681SAndroid Build Coastguard Worker  %valE = load i16, i16* %ptrE
540*9880d681SAndroid Build Coastguard Worker  %valF = load i16, i16* %ptrF
541*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <16 x i16> undef, i16 %val0, i16 0
542*9880d681SAndroid Build Coastguard Worker  %res3 = insertelement <16 x i16> %res0, i16 %val3, i16 3
543*9880d681SAndroid Build Coastguard Worker  %resC = insertelement <16 x i16> %res3, i16 %valC, i16 12
544*9880d681SAndroid Build Coastguard Worker  %resE = insertelement <16 x i16> %resC, i16 %valE, i16 14
545*9880d681SAndroid Build Coastguard Worker  %resF = insertelement <16 x i16> %resE, i16 %valF, i16 15
546*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %resF
547*9880d681SAndroid Build Coastguard Worker}
548*9880d681SAndroid Build Coastguard Worker
549*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @merge_16i16_i16_0uu3zzuuuuuzCuEF(i16* %ptr) nounwind uwtable noinline ssp {
550*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: merge_16i16_i16_0uu3zzuuuuuzCuEF:
551*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
552*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vmovaps {{.*#+}} ymm0 = [65535,0,0,65535,0,0,0,0,0,0,0,0,65535,0,65535,65535]
553*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vandps (%rdi), %ymm0, %ymm0
554*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
555*9880d681SAndroid Build Coastguard Worker;
556*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: merge_16i16_i16_0uu3zzuuuuuzCuEF:
557*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
558*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vmovups (%rdi), %ymm0
559*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
560*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
561*9880d681SAndroid Build Coastguard Worker;
562*9880d681SAndroid Build Coastguard Worker; AVX512F-LABEL: merge_16i16_i16_0uu3zzuuuuuzCuEF:
563*9880d681SAndroid Build Coastguard Worker; AVX512F:       # BB#0:
564*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vmovups (%rdi), %ymm0
565*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
566*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    retq
567*9880d681SAndroid Build Coastguard Worker;
568*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_16i16_i16_0uu3zzuuuuuzCuEF:
569*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
570*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
571*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [65535,0,0,65535,0,0,0,0,0,0,0,0,65535,0,65535,65535]
572*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vandps (%eax), %ymm0, %ymm0
573*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
574*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds i16, i16* %ptr, i64 0
575*9880d681SAndroid Build Coastguard Worker  %ptr3 = getelementptr inbounds i16, i16* %ptr, i64 3
576*9880d681SAndroid Build Coastguard Worker  %ptrC = getelementptr inbounds i16, i16* %ptr, i64 12
577*9880d681SAndroid Build Coastguard Worker  %ptrE = getelementptr inbounds i16, i16* %ptr, i64 14
578*9880d681SAndroid Build Coastguard Worker  %ptrF = getelementptr inbounds i16, i16* %ptr, i64 15
579*9880d681SAndroid Build Coastguard Worker  %val0 = load i16, i16* %ptr0
580*9880d681SAndroid Build Coastguard Worker  %val3 = load i16, i16* %ptr3
581*9880d681SAndroid Build Coastguard Worker  %valC = load i16, i16* %ptrC
582*9880d681SAndroid Build Coastguard Worker  %valE = load i16, i16* %ptrE
583*9880d681SAndroid Build Coastguard Worker  %valF = load i16, i16* %ptrF
584*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <16 x i16> undef, i16 %val0, i16 0
585*9880d681SAndroid Build Coastguard Worker  %res3 = insertelement <16 x i16> %res0, i16 %val3, i16 3
586*9880d681SAndroid Build Coastguard Worker  %res4 = insertelement <16 x i16> %res3, i16     0, i16 4
587*9880d681SAndroid Build Coastguard Worker  %res5 = insertelement <16 x i16> %res4, i16     0, i16 5
588*9880d681SAndroid Build Coastguard Worker  %resC = insertelement <16 x i16> %res5, i16 %valC, i16 12
589*9880d681SAndroid Build Coastguard Worker  %resD = insertelement <16 x i16> %resC, i16     0, i16 13
590*9880d681SAndroid Build Coastguard Worker  %resE = insertelement <16 x i16> %resD, i16 %valE, i16 14
591*9880d681SAndroid Build Coastguard Worker  %resF = insertelement <16 x i16> %resE, i16 %valF, i16 15
592*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %resF
593*9880d681SAndroid Build Coastguard Worker}
594*9880d681SAndroid Build Coastguard Worker
595*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @merge_32i8_i8_45u7uuuuuuuuuuuuuuuuuuuuuuuuuuuu(i8* %ptr) nounwind uwtable noinline ssp {
596*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_32i8_i8_45u7uuuuuuuuuuuuuuuuuuuuuuuuuuuu:
597*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
598*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
599*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
600*9880d681SAndroid Build Coastguard Worker;
601*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_32i8_i8_45u7uuuuuuuuuuuuuuuuuuuuuuuuuuuu:
602*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
603*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
604*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
605*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
606*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds i8, i8* %ptr, i64 4
607*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds i8, i8* %ptr, i64 5
608*9880d681SAndroid Build Coastguard Worker  %ptr3 = getelementptr inbounds i8, i8* %ptr, i64 7
609*9880d681SAndroid Build Coastguard Worker  %val0 = load i8, i8* %ptr0
610*9880d681SAndroid Build Coastguard Worker  %val1 = load i8, i8* %ptr1
611*9880d681SAndroid Build Coastguard Worker  %val3 = load i8, i8* %ptr3
612*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <32 x i8> undef, i8 %val0, i8 0
613*9880d681SAndroid Build Coastguard Worker  %res1 = insertelement <32 x i8> %res0, i8 %val1, i8 1
614*9880d681SAndroid Build Coastguard Worker  %res3 = insertelement <32 x i8> %res1, i8 %val3, i8 3
615*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %res3
616*9880d681SAndroid Build Coastguard Worker}
617*9880d681SAndroid Build Coastguard Worker
618*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @merge_32i8_i8_23u5uuuuuuuuuuzzzzuuuuuuuuuuuuuu(i8* %ptr) nounwind uwtable noinline ssp {
619*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: merge_32i8_i8_23u5uuuuuuuuuuzzzzuuuuuuuuuuuuuu:
620*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
621*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
622*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
623*9880d681SAndroid Build Coastguard Worker;
624*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_32i8_i8_23u5uuuuuuuuuuzzzzuuuuuuuuuuuuuu:
625*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
626*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
627*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
628*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
629*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds i8, i8* %ptr, i64 2
630*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds i8, i8* %ptr, i64 3
631*9880d681SAndroid Build Coastguard Worker  %ptr3 = getelementptr inbounds i8, i8* %ptr, i64 5
632*9880d681SAndroid Build Coastguard Worker  %val0 = load i8, i8* %ptr0
633*9880d681SAndroid Build Coastguard Worker  %val1 = load i8, i8* %ptr1
634*9880d681SAndroid Build Coastguard Worker  %val3 = load i8, i8* %ptr3
635*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <32 x i8> undef, i8 %val0, i8 0
636*9880d681SAndroid Build Coastguard Worker  %res1 = insertelement <32 x i8> %res0, i8 %val1, i8 1
637*9880d681SAndroid Build Coastguard Worker  %res3 = insertelement <32 x i8> %res1, i8 %val3, i8 3
638*9880d681SAndroid Build Coastguard Worker  %resE = insertelement <32 x i8> %res3, i8     0, i8 14
639*9880d681SAndroid Build Coastguard Worker  %resF = insertelement <32 x i8> %resE, i8     0, i8 15
640*9880d681SAndroid Build Coastguard Worker  %resG = insertelement <32 x i8> %resF, i8     0, i8 16
641*9880d681SAndroid Build Coastguard Worker  %resH = insertelement <32 x i8> %resG, i8     0, i8 17
642*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %resH
643*9880d681SAndroid Build Coastguard Worker}
644*9880d681SAndroid Build Coastguard Worker
645*9880d681SAndroid Build Coastguard Worker;
646*9880d681SAndroid Build Coastguard Worker; consecutive loads including any/all volatiles may not be combined
647*9880d681SAndroid Build Coastguard Worker;
648*9880d681SAndroid Build Coastguard Worker
649*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @merge_4f64_f64_34uz_volatile(double* %ptr) nounwind uwtable noinline ssp {
650*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: merge_4f64_f64_34uz_volatile:
651*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
652*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
653*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vmovhpd {{.*#+}} xmm0 = xmm0[0],mem[0]
654*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
655*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
656*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
657*9880d681SAndroid Build Coastguard Worker;
658*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: merge_4f64_f64_34uz_volatile:
659*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
660*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
661*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vmovhpd {{.*#+}} xmm0 = xmm0[0],mem[0]
662*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
663*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
664*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
665*9880d681SAndroid Build Coastguard Worker;
666*9880d681SAndroid Build Coastguard Worker; AVX512F-LABEL: merge_4f64_f64_34uz_volatile:
667*9880d681SAndroid Build Coastguard Worker; AVX512F:       # BB#0:
668*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
669*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vmovhpd {{.*#+}} xmm0 = xmm0[0],mem[0]
670*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vxorps %xmm1, %xmm1, %xmm1
671*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
672*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    retq
673*9880d681SAndroid Build Coastguard Worker;
674*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_4f64_f64_34uz_volatile:
675*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
676*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
677*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
678*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vmovhpd {{.*#+}} xmm0 = xmm0[0],mem[0]
679*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
680*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
681*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
682*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds double, double* %ptr, i64 3
683*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds double, double* %ptr, i64 4
684*9880d681SAndroid Build Coastguard Worker  %val0 = load volatile double, double* %ptr0
685*9880d681SAndroid Build Coastguard Worker  %val1 = load volatile double, double* %ptr1
686*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <4 x double> undef, double %val0, i32 0
687*9880d681SAndroid Build Coastguard Worker  %res1 = insertelement <4 x double> %res0, double %val1, i32 1
688*9880d681SAndroid Build Coastguard Worker  %res3 = insertelement <4 x double> %res1, double   0.0, i32 3
689*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %res3
690*9880d681SAndroid Build Coastguard Worker}
691*9880d681SAndroid Build Coastguard Worker
692*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @merge_16i16_i16_0uu3zzuuuuuzCuEF_volatile(i16* %ptr) nounwind uwtable noinline ssp {
693*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: merge_16i16_i16_0uu3zzuuuuuzCuEF_volatile:
694*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
695*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpxor %xmm0, %xmm0, %xmm0
696*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpinsrw $0, (%rdi), %xmm0, %xmm1
697*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpinsrw $3, 6(%rdi), %xmm1, %xmm1
698*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpinsrw $4, 24(%rdi), %xmm0, %xmm0
699*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpinsrw $6, 28(%rdi), %xmm0, %xmm0
700*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpinsrw $7, 30(%rdi), %xmm0, %xmm0
701*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
702*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
703*9880d681SAndroid Build Coastguard Worker;
704*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: merge_16i16_i16_0uu3zzuuuuuzCuEF_volatile:
705*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
706*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpxor %xmm0, %xmm0, %xmm0
707*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpinsrw $0, (%rdi), %xmm0, %xmm1
708*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpinsrw $3, 6(%rdi), %xmm1, %xmm1
709*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpinsrw $4, 24(%rdi), %xmm0, %xmm0
710*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpinsrw $6, 28(%rdi), %xmm0, %xmm0
711*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpinsrw $7, 30(%rdi), %xmm0, %xmm0
712*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
713*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
714*9880d681SAndroid Build Coastguard Worker;
715*9880d681SAndroid Build Coastguard Worker; AVX512F-LABEL: merge_16i16_i16_0uu3zzuuuuuzCuEF_volatile:
716*9880d681SAndroid Build Coastguard Worker; AVX512F:       # BB#0:
717*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vpxor %xmm0, %xmm0, %xmm0
718*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vpinsrw $0, (%rdi), %xmm0, %xmm1
719*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vpinsrw $3, 6(%rdi), %xmm1, %xmm1
720*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vpinsrw $4, 24(%rdi), %xmm0, %xmm0
721*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vpinsrw $6, 28(%rdi), %xmm0, %xmm0
722*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vpinsrw $7, 30(%rdi), %xmm0, %xmm0
723*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
724*9880d681SAndroid Build Coastguard Worker; AVX512F-NEXT:    retq
725*9880d681SAndroid Build Coastguard Worker;
726*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: merge_16i16_i16_0uu3zzuuuuuzCuEF_volatile:
727*9880d681SAndroid Build Coastguard Worker; X32-AVX:       # BB#0:
728*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
729*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm0
730*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vpinsrw $0, (%eax), %xmm0, %xmm1
731*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vpinsrw $3, 6(%eax), %xmm1, %xmm1
732*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vpinsrw $4, 24(%eax), %xmm0, %xmm0
733*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vpinsrw $6, 28(%eax), %xmm0, %xmm0
734*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vpinsrw $7, 30(%eax), %xmm0, %xmm0
735*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
736*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT:    retl
737*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds i16, i16* %ptr, i64 0
738*9880d681SAndroid Build Coastguard Worker  %ptr3 = getelementptr inbounds i16, i16* %ptr, i64 3
739*9880d681SAndroid Build Coastguard Worker  %ptrC = getelementptr inbounds i16, i16* %ptr, i64 12
740*9880d681SAndroid Build Coastguard Worker  %ptrE = getelementptr inbounds i16, i16* %ptr, i64 14
741*9880d681SAndroid Build Coastguard Worker  %ptrF = getelementptr inbounds i16, i16* %ptr, i64 15
742*9880d681SAndroid Build Coastguard Worker  %val0 = load volatile i16, i16* %ptr0
743*9880d681SAndroid Build Coastguard Worker  %val3 = load i16, i16* %ptr3
744*9880d681SAndroid Build Coastguard Worker  %valC = load i16, i16* %ptrC
745*9880d681SAndroid Build Coastguard Worker  %valE = load i16, i16* %ptrE
746*9880d681SAndroid Build Coastguard Worker  %valF = load volatile i16, i16* %ptrF
747*9880d681SAndroid Build Coastguard Worker  %res0 = insertelement <16 x i16> undef, i16 %val0, i16 0
748*9880d681SAndroid Build Coastguard Worker  %res3 = insertelement <16 x i16> %res0, i16 %val3, i16 3
749*9880d681SAndroid Build Coastguard Worker  %res4 = insertelement <16 x i16> %res3, i16     0, i16 4
750*9880d681SAndroid Build Coastguard Worker  %res5 = insertelement <16 x i16> %res4, i16     0, i16 5
751*9880d681SAndroid Build Coastguard Worker  %resC = insertelement <16 x i16> %res5, i16 %valC, i16 12
752*9880d681SAndroid Build Coastguard Worker  %resD = insertelement <16 x i16> %resC, i16     0, i16 13
753*9880d681SAndroid Build Coastguard Worker  %resE = insertelement <16 x i16> %resD, i16 %valE, i16 14
754*9880d681SAndroid Build Coastguard Worker  %resF = insertelement <16 x i16> %resE, i16 %valF, i16 15
755*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %resF
756*9880d681SAndroid Build Coastguard Worker}
757