xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/avx-vbroadcast.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=i686-apple-darwin -mattr=+avx | FileCheck %s --check-prefix=X32
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx | FileCheck %s --check-prefix=X64
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @A(i64* %ptr) nounwind uwtable readnone ssp {
6*9880d681SAndroid Build Coastguard Worker; X32-LABEL: A:
7*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
8*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
9*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl (%eax), %ecx
10*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl 4(%eax), %eax
11*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vmovd %ecx, %xmm0
12*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm0
13*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
14*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
15*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
16*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
17*9880d681SAndroid Build Coastguard Worker;
18*9880d681SAndroid Build Coastguard Worker; X64-LABEL: A:
19*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
20*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastsd (%rdi), %ymm0
21*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
22*9880d681SAndroid Build Coastguard Workerentry:
23*9880d681SAndroid Build Coastguard Worker  %q = load i64, i64* %ptr, align 8
24*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <4 x i64> undef, i64 %q, i32 0
25*9880d681SAndroid Build Coastguard Worker  %vecinit2.i = insertelement <4 x i64> %vecinit.i, i64 %q, i32 1
26*9880d681SAndroid Build Coastguard Worker  %vecinit4.i = insertelement <4 x i64> %vecinit2.i, i64 %q, i32 2
27*9880d681SAndroid Build Coastguard Worker  %vecinit6.i = insertelement <4 x i64> %vecinit4.i, i64 %q, i32 3
28*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %vecinit6.i
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @B(i32* %ptr) nounwind uwtable readnone ssp {
32*9880d681SAndroid Build Coastguard Worker; X32-LABEL: B:
33*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
34*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
35*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastss (%eax), %ymm0
36*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
37*9880d681SAndroid Build Coastguard Worker;
38*9880d681SAndroid Build Coastguard Worker; X64-LABEL: B:
39*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
40*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastss (%rdi), %ymm0
41*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
42*9880d681SAndroid Build Coastguard Workerentry:
43*9880d681SAndroid Build Coastguard Worker  %q = load i32, i32* %ptr, align 4
44*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <8 x i32> undef, i32 %q, i32 0
45*9880d681SAndroid Build Coastguard Worker  %vecinit2.i = insertelement <8 x i32> %vecinit.i, i32 %q, i32 1
46*9880d681SAndroid Build Coastguard Worker  %vecinit4.i = insertelement <8 x i32> %vecinit2.i, i32 %q, i32 2
47*9880d681SAndroid Build Coastguard Worker  %vecinit6.i = insertelement <8 x i32> %vecinit4.i, i32 %q, i32 3
48*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %vecinit6.i
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @C(double* %ptr) nounwind uwtable readnone ssp {
52*9880d681SAndroid Build Coastguard Worker; X32-LABEL: C:
53*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
54*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
55*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastsd (%eax), %ymm0
56*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
57*9880d681SAndroid Build Coastguard Worker;
58*9880d681SAndroid Build Coastguard Worker; X64-LABEL: C:
59*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
60*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastsd (%rdi), %ymm0
61*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
62*9880d681SAndroid Build Coastguard Workerentry:
63*9880d681SAndroid Build Coastguard Worker  %q = load double, double* %ptr, align 8
64*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <4 x double> undef, double %q, i32 0
65*9880d681SAndroid Build Coastguard Worker  %vecinit2.i = insertelement <4 x double> %vecinit.i, double %q, i32 1
66*9880d681SAndroid Build Coastguard Worker  %vecinit4.i = insertelement <4 x double> %vecinit2.i, double %q, i32 2
67*9880d681SAndroid Build Coastguard Worker  %vecinit6.i = insertelement <4 x double> %vecinit4.i, double %q, i32 3
68*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %vecinit6.i
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @D(float* %ptr) nounwind uwtable readnone ssp {
72*9880d681SAndroid Build Coastguard Worker; X32-LABEL: D:
73*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
74*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
75*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastss (%eax), %ymm0
76*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
77*9880d681SAndroid Build Coastguard Worker;
78*9880d681SAndroid Build Coastguard Worker; X64-LABEL: D:
79*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
80*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastss (%rdi), %ymm0
81*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
82*9880d681SAndroid Build Coastguard Workerentry:
83*9880d681SAndroid Build Coastguard Worker  %q = load float, float* %ptr, align 4
84*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <8 x float> undef, float %q, i32 0
85*9880d681SAndroid Build Coastguard Worker  %vecinit2.i = insertelement <8 x float> %vecinit.i, float %q, i32 1
86*9880d681SAndroid Build Coastguard Worker  %vecinit4.i = insertelement <8 x float> %vecinit2.i, float %q, i32 2
87*9880d681SAndroid Build Coastguard Worker  %vecinit6.i = insertelement <8 x float> %vecinit4.i, float %q, i32 3
88*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %vecinit6.i
89*9880d681SAndroid Build Coastguard Worker}
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Worker;;;; 128-bit versions
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @e(float* %ptr) nounwind uwtable readnone ssp {
94*9880d681SAndroid Build Coastguard Worker; X32-LABEL: e:
95*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
96*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
97*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastss (%eax), %xmm0
98*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
99*9880d681SAndroid Build Coastguard Worker;
100*9880d681SAndroid Build Coastguard Worker; X64-LABEL: e:
101*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
102*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastss (%rdi), %xmm0
103*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
104*9880d681SAndroid Build Coastguard Workerentry:
105*9880d681SAndroid Build Coastguard Worker  %q = load float, float* %ptr, align 4
106*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <4 x float> undef, float %q, i32 0
107*9880d681SAndroid Build Coastguard Worker  %vecinit2.i = insertelement <4 x float> %vecinit.i, float %q, i32 1
108*9880d681SAndroid Build Coastguard Worker  %vecinit4.i = insertelement <4 x float> %vecinit2.i, float %q, i32 2
109*9880d681SAndroid Build Coastguard Worker  %vecinit6.i = insertelement <4 x float> %vecinit4.i, float %q, i32 3
110*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %vecinit6.i
111*9880d681SAndroid Build Coastguard Worker}
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker; Don't broadcast constants on pre-AVX2 hardware.
114*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @_e2(float* %ptr) nounwind uwtable readnone ssp {
115*9880d681SAndroid Build Coastguard Worker; X32-LABEL: _e2:
116*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
117*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vmovaps {{.*#+}} xmm0 = [-7.812500e-03,-7.812500e-03,-7.812500e-03,-7.812500e-03]
118*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
119*9880d681SAndroid Build Coastguard Worker;
120*9880d681SAndroid Build Coastguard Worker; X64-LABEL: _e2:
121*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
122*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vmovaps {{.*#+}} xmm0 = [-7.812500e-03,-7.812500e-03,-7.812500e-03,-7.812500e-03]
123*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
124*9880d681SAndroid Build Coastguard Workerentry:
125*9880d681SAndroid Build Coastguard Worker   %vecinit.i = insertelement <4 x float> undef, float       0xbf80000000000000, i32 0
126*9880d681SAndroid Build Coastguard Worker  %vecinit2.i = insertelement <4 x float> %vecinit.i, float  0xbf80000000000000, i32 1
127*9880d681SAndroid Build Coastguard Worker  %vecinit4.i = insertelement <4 x float> %vecinit2.i, float 0xbf80000000000000, i32 2
128*9880d681SAndroid Build Coastguard Worker  %vecinit6.i = insertelement <4 x float> %vecinit4.i, float 0xbf80000000000000, i32 3
129*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %vecinit6.i
130*9880d681SAndroid Build Coastguard Worker}
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @F(i32* %ptr) nounwind uwtable readnone ssp {
134*9880d681SAndroid Build Coastguard Worker; X32-LABEL: F:
135*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
136*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
137*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastss (%eax), %xmm0
138*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
139*9880d681SAndroid Build Coastguard Worker;
140*9880d681SAndroid Build Coastguard Worker; X64-LABEL: F:
141*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
142*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastss (%rdi), %xmm0
143*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
144*9880d681SAndroid Build Coastguard Workerentry:
145*9880d681SAndroid Build Coastguard Worker  %q = load i32, i32* %ptr, align 4
146*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <4 x i32> undef, i32 %q, i32 0
147*9880d681SAndroid Build Coastguard Worker  %vecinit2.i = insertelement <4 x i32> %vecinit.i, i32 %q, i32 1
148*9880d681SAndroid Build Coastguard Worker  %vecinit4.i = insertelement <4 x i32> %vecinit2.i, i32 %q, i32 2
149*9880d681SAndroid Build Coastguard Worker  %vecinit6.i = insertelement <4 x i32> %vecinit4.i, i32 %q, i32 3
150*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vecinit6.i
151*9880d681SAndroid Build Coastguard Worker}
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker; FIXME: Pointer adjusted broadcasts
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @load_splat_4i32_4i32_1111(<4 x i32>* %ptr) nounwind uwtable readnone ssp {
156*9880d681SAndroid Build Coastguard Worker; X32-LABEL: load_splat_4i32_4i32_1111:
157*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
158*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
159*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vpshufd {{.*#+}} xmm0 = mem[1,1,1,1]
160*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
161*9880d681SAndroid Build Coastguard Worker;
162*9880d681SAndroid Build Coastguard Worker; X64-LABEL: load_splat_4i32_4i32_1111:
163*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
164*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vpshufd {{.*#+}} xmm0 = mem[1,1,1,1]
165*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
166*9880d681SAndroid Build Coastguard Workerentry:
167*9880d681SAndroid Build Coastguard Worker  %ld = load <4 x i32>, <4 x i32>* %ptr
168*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <4 x i32> %ld, <4 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
169*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %ret
170*9880d681SAndroid Build Coastguard Worker}
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @load_splat_8i32_4i32_33333333(<4 x i32>* %ptr) nounwind uwtable readnone ssp {
173*9880d681SAndroid Build Coastguard Worker; X32-LABEL: load_splat_8i32_4i32_33333333:
174*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
175*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
176*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastss 12(%eax), %ymm0
177*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
178*9880d681SAndroid Build Coastguard Worker;
179*9880d681SAndroid Build Coastguard Worker; X64-LABEL: load_splat_8i32_4i32_33333333:
180*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
181*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastss 12(%rdi), %ymm0
182*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
183*9880d681SAndroid Build Coastguard Workerentry:
184*9880d681SAndroid Build Coastguard Worker  %ld = load <4 x i32>, <4 x i32>* %ptr
185*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <4 x i32> %ld, <4 x i32> undef, <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
186*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %ret
187*9880d681SAndroid Build Coastguard Worker}
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @load_splat_8i32_8i32_55555555(<8 x i32>* %ptr) nounwind uwtable readnone ssp {
190*9880d681SAndroid Build Coastguard Worker; X32-LABEL: load_splat_8i32_8i32_55555555:
191*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
192*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
193*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastss 20(%eax), %ymm0
194*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
195*9880d681SAndroid Build Coastguard Worker;
196*9880d681SAndroid Build Coastguard Worker; X64-LABEL: load_splat_8i32_8i32_55555555:
197*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
198*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastss 20(%rdi), %ymm0
199*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
200*9880d681SAndroid Build Coastguard Workerentry:
201*9880d681SAndroid Build Coastguard Worker  %ld = load <8 x i32>, <8 x i32>* %ptr
202*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <8 x i32> %ld, <8 x i32> undef, <8 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
203*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %ret
204*9880d681SAndroid Build Coastguard Worker}
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @load_splat_4f32_4f32_1111(<4 x float>* %ptr) nounwind uwtable readnone ssp {
207*9880d681SAndroid Build Coastguard Worker; X32-LABEL: load_splat_4f32_4f32_1111:
208*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
209*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
210*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastss 4(%eax), %xmm0
211*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
212*9880d681SAndroid Build Coastguard Worker;
213*9880d681SAndroid Build Coastguard Worker; X64-LABEL: load_splat_4f32_4f32_1111:
214*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
215*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastss 4(%rdi), %xmm0
216*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
217*9880d681SAndroid Build Coastguard Workerentry:
218*9880d681SAndroid Build Coastguard Worker  %ld = load <4 x float>, <4 x float>* %ptr
219*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <4 x float> %ld, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
220*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %ret
221*9880d681SAndroid Build Coastguard Worker}
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @load_splat_8f32_4f32_33333333(<4 x float>* %ptr) nounwind uwtable readnone ssp {
224*9880d681SAndroid Build Coastguard Worker; X32-LABEL: load_splat_8f32_4f32_33333333:
225*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
226*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
227*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastss 12(%eax), %ymm0
228*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
229*9880d681SAndroid Build Coastguard Worker;
230*9880d681SAndroid Build Coastguard Worker; X64-LABEL: load_splat_8f32_4f32_33333333:
231*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
232*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastss 12(%rdi), %ymm0
233*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
234*9880d681SAndroid Build Coastguard Workerentry:
235*9880d681SAndroid Build Coastguard Worker  %ld = load <4 x float>, <4 x float>* %ptr
236*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <4 x float> %ld, <4 x float> undef, <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
237*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %ret
238*9880d681SAndroid Build Coastguard Worker}
239*9880d681SAndroid Build Coastguard Worker
240*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @load_splat_8f32_8f32_55555555(<8 x float>* %ptr) nounwind uwtable readnone ssp {
241*9880d681SAndroid Build Coastguard Worker; X32-LABEL: load_splat_8f32_8f32_55555555:
242*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
243*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
244*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastss 20(%eax), %ymm0
245*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
246*9880d681SAndroid Build Coastguard Worker;
247*9880d681SAndroid Build Coastguard Worker; X64-LABEL: load_splat_8f32_8f32_55555555:
248*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
249*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastss 20(%rdi), %ymm0
250*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
251*9880d681SAndroid Build Coastguard Workerentry:
252*9880d681SAndroid Build Coastguard Worker  %ld = load <8 x float>, <8 x float>* %ptr
253*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <8 x float> %ld, <8 x float> undef, <8 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
254*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %ret
255*9880d681SAndroid Build Coastguard Worker}
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @load_splat_2i64_2i64_1111(<2 x i64>* %ptr) nounwind uwtable readnone ssp {
258*9880d681SAndroid Build Coastguard Worker; X32-LABEL: load_splat_2i64_2i64_1111:
259*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
260*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
261*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vpshufd {{.*#+}} xmm0 = mem[2,3,2,3]
262*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
263*9880d681SAndroid Build Coastguard Worker;
264*9880d681SAndroid Build Coastguard Worker; X64-LABEL: load_splat_2i64_2i64_1111:
265*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
266*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vpshufd {{.*#+}} xmm0 = mem[2,3,2,3]
267*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
268*9880d681SAndroid Build Coastguard Workerentry:
269*9880d681SAndroid Build Coastguard Worker  %ld = load <2 x i64>, <2 x i64>* %ptr
270*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <2 x i64> %ld, <2 x i64> undef, <2 x i32> <i32 1, i32 1>
271*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %ret
272*9880d681SAndroid Build Coastguard Worker}
273*9880d681SAndroid Build Coastguard Worker
274*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @load_splat_4i64_2i64_1111(<2 x i64>* %ptr) nounwind uwtable readnone ssp {
275*9880d681SAndroid Build Coastguard Worker; X32-LABEL: load_splat_4i64_2i64_1111:
276*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
277*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
278*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastsd 8(%eax), %ymm0
279*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
280*9880d681SAndroid Build Coastguard Worker;
281*9880d681SAndroid Build Coastguard Worker; X64-LABEL: load_splat_4i64_2i64_1111:
282*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
283*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastsd 8(%rdi), %ymm0
284*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
285*9880d681SAndroid Build Coastguard Workerentry:
286*9880d681SAndroid Build Coastguard Worker  %ld = load <2 x i64>, <2 x i64>* %ptr
287*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <2 x i64> %ld, <2 x i64> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
288*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %ret
289*9880d681SAndroid Build Coastguard Worker}
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @load_splat_4i64_4i64_2222(<4 x i64>* %ptr) nounwind uwtable readnone ssp {
292*9880d681SAndroid Build Coastguard Worker; X32-LABEL: load_splat_4i64_4i64_2222:
293*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
294*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
295*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastsd 16(%eax), %ymm0
296*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
297*9880d681SAndroid Build Coastguard Worker;
298*9880d681SAndroid Build Coastguard Worker; X64-LABEL: load_splat_4i64_4i64_2222:
299*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
300*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastsd 16(%rdi), %ymm0
301*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
302*9880d681SAndroid Build Coastguard Workerentry:
303*9880d681SAndroid Build Coastguard Worker  %ld = load <4 x i64>, <4 x i64>* %ptr
304*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <4 x i64> %ld, <4 x i64> undef, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
305*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %ret
306*9880d681SAndroid Build Coastguard Worker}
307*9880d681SAndroid Build Coastguard Worker
308*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @load_splat_2f64_2f64_1111(<2 x double>* %ptr) nounwind uwtable readnone ssp {
309*9880d681SAndroid Build Coastguard Worker; X32-LABEL: load_splat_2f64_2f64_1111:
310*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
311*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
312*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vmovddup {{.*#+}} xmm0 = mem[0,0]
313*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
314*9880d681SAndroid Build Coastguard Worker;
315*9880d681SAndroid Build Coastguard Worker; X64-LABEL: load_splat_2f64_2f64_1111:
316*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
317*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vmovddup {{.*#+}} xmm0 = mem[0,0]
318*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
319*9880d681SAndroid Build Coastguard Workerentry:
320*9880d681SAndroid Build Coastguard Worker  %ld = load <2 x double>, <2 x double>* %ptr
321*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <2 x double> %ld, <2 x double> undef, <2 x i32> <i32 1, i32 1>
322*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %ret
323*9880d681SAndroid Build Coastguard Worker}
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @load_splat_4f64_2f64_1111(<2 x double>* %ptr) nounwind uwtable readnone ssp {
326*9880d681SAndroid Build Coastguard Worker; X32-LABEL: load_splat_4f64_2f64_1111:
327*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
328*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
329*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastsd 8(%eax), %ymm0
330*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
331*9880d681SAndroid Build Coastguard Worker;
332*9880d681SAndroid Build Coastguard Worker; X64-LABEL: load_splat_4f64_2f64_1111:
333*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
334*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastsd 8(%rdi), %ymm0
335*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
336*9880d681SAndroid Build Coastguard Workerentry:
337*9880d681SAndroid Build Coastguard Worker  %ld = load <2 x double>, <2 x double>* %ptr
338*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <2 x double> %ld, <2 x double> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
339*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %ret
340*9880d681SAndroid Build Coastguard Worker}
341*9880d681SAndroid Build Coastguard Worker
342*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @load_splat_4f64_4f64_2222(<4 x double>* %ptr) nounwind uwtable readnone ssp {
343*9880d681SAndroid Build Coastguard Worker; X32-LABEL: load_splat_4f64_4f64_2222:
344*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
345*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
346*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastsd 16(%eax), %ymm0
347*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
348*9880d681SAndroid Build Coastguard Worker;
349*9880d681SAndroid Build Coastguard Worker; X64-LABEL: load_splat_4f64_4f64_2222:
350*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
351*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastsd 16(%rdi), %ymm0
352*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
353*9880d681SAndroid Build Coastguard Workerentry:
354*9880d681SAndroid Build Coastguard Worker  %ld = load <4 x double>, <4 x double>* %ptr
355*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <4 x double> %ld, <4 x double> undef, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
356*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %ret
357*9880d681SAndroid Build Coastguard Worker}
358*9880d681SAndroid Build Coastguard Worker
359*9880d681SAndroid Build Coastguard Worker; Unsupported vbroadcasts
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @G(i64* %ptr) nounwind uwtable readnone ssp {
362*9880d681SAndroid Build Coastguard Worker; X32-LABEL: G:
363*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
364*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
365*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl (%eax), %ecx
366*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl 4(%eax), %eax
367*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vmovd %ecx, %xmm0
368*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm0
369*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
370*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
371*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
372*9880d681SAndroid Build Coastguard Worker;
373*9880d681SAndroid Build Coastguard Worker; X64-LABEL: G:
374*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
375*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
376*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
377*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
378*9880d681SAndroid Build Coastguard Workerentry:
379*9880d681SAndroid Build Coastguard Worker  %q = load i64, i64* %ptr, align 8
380*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <2 x i64> undef, i64 %q, i32 0
381*9880d681SAndroid Build Coastguard Worker  %vecinit2.i = insertelement <2 x i64> %vecinit.i, i64 %q, i32 1
382*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vecinit2.i
383*9880d681SAndroid Build Coastguard Worker}
384*9880d681SAndroid Build Coastguard Worker
385*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @H(<4 x i32> %a) {
386*9880d681SAndroid Build Coastguard Worker; X32-LABEL: H:
387*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
388*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
389*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
390*9880d681SAndroid Build Coastguard Worker;
391*9880d681SAndroid Build Coastguard Worker; X64-LABEL: H:
392*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
393*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
394*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
395*9880d681SAndroid Build Coastguard Workerentry:
396*9880d681SAndroid Build Coastguard Worker  %x = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
397*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %x
398*9880d681SAndroid Build Coastguard Worker}
399*9880d681SAndroid Build Coastguard Worker
400*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @I(double* %ptr) nounwind uwtable readnone ssp {
401*9880d681SAndroid Build Coastguard Worker; X32-LABEL: I:
402*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
403*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
404*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vmovddup {{.*#+}} xmm0 = mem[0,0]
405*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
406*9880d681SAndroid Build Coastguard Worker;
407*9880d681SAndroid Build Coastguard Worker; X64-LABEL: I:
408*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
409*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vmovddup {{.*#+}} xmm0 = mem[0,0]
410*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
411*9880d681SAndroid Build Coastguard Workerentry:
412*9880d681SAndroid Build Coastguard Worker  %q = load double, double* %ptr, align 4
413*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <2 x double> undef, double %q, i32 0
414*9880d681SAndroid Build Coastguard Worker  %vecinit2.i = insertelement <2 x double> %vecinit.i, double %q, i32 1
415*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %vecinit2.i
416*9880d681SAndroid Build Coastguard Worker}
417*9880d681SAndroid Build Coastguard Worker
418*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @_RR(float* %ptr, i32* %k) nounwind uwtable readnone ssp {
419*9880d681SAndroid Build Coastguard Worker; X32-LABEL: _RR:
420*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
421*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
422*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
423*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastss (%ecx), %xmm0
424*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl (%eax), %eax
425*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl %eax, (%eax)
426*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
427*9880d681SAndroid Build Coastguard Worker;
428*9880d681SAndroid Build Coastguard Worker; X64-LABEL: _RR:
429*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
430*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastss (%rdi), %xmm0
431*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    movl (%rsi), %eax
432*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    movl %eax, (%rax)
433*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
434*9880d681SAndroid Build Coastguard Workerentry:
435*9880d681SAndroid Build Coastguard Worker  %q = load float, float* %ptr, align 4
436*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <4 x float> undef, float %q, i32 0
437*9880d681SAndroid Build Coastguard Worker  %vecinit2.i = insertelement <4 x float> %vecinit.i, float %q, i32 1
438*9880d681SAndroid Build Coastguard Worker  %vecinit4.i = insertelement <4 x float> %vecinit2.i, float %q, i32 2
439*9880d681SAndroid Build Coastguard Worker  %vecinit6.i = insertelement <4 x float> %vecinit4.i, float %q, i32 3
440*9880d681SAndroid Build Coastguard Worker  ; force a chain
441*9880d681SAndroid Build Coastguard Worker  %j = load i32, i32* %k, align 4
442*9880d681SAndroid Build Coastguard Worker  store i32 %j, i32* undef
443*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %vecinit6.i
444*9880d681SAndroid Build Coastguard Worker}
445*9880d681SAndroid Build Coastguard Worker
446*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @_RR2(float* %ptr, i32* %k) nounwind uwtable readnone ssp {
447*9880d681SAndroid Build Coastguard Worker; X32-LABEL: _RR2:
448*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0: ## %entry
449*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
450*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastss (%eax), %xmm0
451*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
452*9880d681SAndroid Build Coastguard Worker;
453*9880d681SAndroid Build Coastguard Worker; X64-LABEL: _RR2:
454*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0: ## %entry
455*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastss (%rdi), %xmm0
456*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
457*9880d681SAndroid Build Coastguard Workerentry:
458*9880d681SAndroid Build Coastguard Worker  %q = load float, float* %ptr, align 4
459*9880d681SAndroid Build Coastguard Worker  %v = insertelement <4 x float> undef, float %q, i32 0
460*9880d681SAndroid Build Coastguard Worker  %t = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> zeroinitializer
461*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %t
462*9880d681SAndroid Build Coastguard Worker}
463*9880d681SAndroid Build Coastguard Worker
464*9880d681SAndroid Build Coastguard Worker; These tests check that a vbroadcast instruction is used when we have a splat
465*9880d681SAndroid Build Coastguard Worker; formed from a concat_vectors (via the shufflevector) of two BUILD_VECTORs
466*9880d681SAndroid Build Coastguard Worker; (via the insertelements).
467*9880d681SAndroid Build Coastguard Worker
468*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @splat_concat1(float* %p) {
469*9880d681SAndroid Build Coastguard Worker; X32-LABEL: splat_concat1:
470*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0:
471*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
472*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastss (%eax), %ymm0
473*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
474*9880d681SAndroid Build Coastguard Worker;
475*9880d681SAndroid Build Coastguard Worker; X64-LABEL: splat_concat1:
476*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0:
477*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastss (%rdi), %ymm0
478*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
479*9880d681SAndroid Build Coastguard Worker  %1 = load float, float* %p, align 4
480*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <4 x float> undef, float %1, i32 0
481*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x float> %2, float %1, i32 1
482*9880d681SAndroid Build Coastguard Worker  %4 = insertelement <4 x float> %3, float %1, i32 2
483*9880d681SAndroid Build Coastguard Worker  %5 = insertelement <4 x float> %4, float %1, i32 3
484*9880d681SAndroid Build Coastguard Worker  %6 = shufflevector <4 x float> %5, <4 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
485*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %6
486*9880d681SAndroid Build Coastguard Worker}
487*9880d681SAndroid Build Coastguard Worker
488*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @splat_concat2(float* %p) {
489*9880d681SAndroid Build Coastguard Worker; X32-LABEL: splat_concat2:
490*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0:
491*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
492*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastss (%eax), %ymm0
493*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
494*9880d681SAndroid Build Coastguard Worker;
495*9880d681SAndroid Build Coastguard Worker; X64-LABEL: splat_concat2:
496*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0:
497*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastss (%rdi), %ymm0
498*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
499*9880d681SAndroid Build Coastguard Worker  %1 = load float, float* %p, align 4
500*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <4 x float> undef, float %1, i32 0
501*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x float> %2, float %1, i32 1
502*9880d681SAndroid Build Coastguard Worker  %4 = insertelement <4 x float> %3, float %1, i32 2
503*9880d681SAndroid Build Coastguard Worker  %5 = insertelement <4 x float> %4, float %1, i32 3
504*9880d681SAndroid Build Coastguard Worker  %6 = insertelement <4 x float> undef, float %1, i32 0
505*9880d681SAndroid Build Coastguard Worker  %7 = insertelement <4 x float> %6, float %1, i32 1
506*9880d681SAndroid Build Coastguard Worker  %8 = insertelement <4 x float> %7, float %1, i32 2
507*9880d681SAndroid Build Coastguard Worker  %9 = insertelement <4 x float> %8, float %1, i32 3
508*9880d681SAndroid Build Coastguard Worker  %10 = shufflevector <4 x float> %5, <4 x float> %9, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
509*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %10
510*9880d681SAndroid Build Coastguard Worker}
511*9880d681SAndroid Build Coastguard Worker
512*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @splat_concat3(double* %p) {
513*9880d681SAndroid Build Coastguard Worker; X32-LABEL: splat_concat3:
514*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0:
515*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
516*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastsd (%eax), %ymm0
517*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
518*9880d681SAndroid Build Coastguard Worker;
519*9880d681SAndroid Build Coastguard Worker; X64-LABEL: splat_concat3:
520*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0:
521*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastsd (%rdi), %ymm0
522*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
523*9880d681SAndroid Build Coastguard Worker  %1 = load double, double* %p, align 8
524*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <2 x double> undef, double %1, i32 0
525*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <2 x double> %2, double %1, i32 1
526*9880d681SAndroid Build Coastguard Worker  %4 = shufflevector <2 x double> %3, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
527*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %4
528*9880d681SAndroid Build Coastguard Worker}
529*9880d681SAndroid Build Coastguard Worker
530*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @splat_concat4(double* %p) {
531*9880d681SAndroid Build Coastguard Worker; X32-LABEL: splat_concat4:
532*9880d681SAndroid Build Coastguard Worker; X32:       ## BB#0:
533*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
534*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    vbroadcastsd (%eax), %ymm0
535*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
536*9880d681SAndroid Build Coastguard Worker;
537*9880d681SAndroid Build Coastguard Worker; X64-LABEL: splat_concat4:
538*9880d681SAndroid Build Coastguard Worker; X64:       ## BB#0:
539*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    vbroadcastsd (%rdi), %ymm0
540*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
541*9880d681SAndroid Build Coastguard Worker  %1 = load double, double* %p, align 8
542*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <2 x double> undef, double %1, i32 0
543*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <2 x double> %2, double %1, i32 1
544*9880d681SAndroid Build Coastguard Worker  %4 = insertelement <2 x double> undef, double %1, i32 0
545*9880d681SAndroid Build Coastguard Worker  %5 = insertelement <2 x double> %2, double %1, i32 1
546*9880d681SAndroid Build Coastguard Worker  %6 = shufflevector <2 x double> %3, <2 x double> %5, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
547*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %6
548*9880d681SAndroid Build Coastguard Worker}
549