1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+avx | FileCheck %s --check-prefix=X32 --check-prefix=X32-AVX --check-prefix=X32-AVX1
3; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+avx2 | FileCheck %s --check-prefix=X32 --check-prefix=X32-AVX --check-prefix=X32-AVX2
4; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+avx512vl | FileCheck %s --check-prefix=X32 --check-prefix=X32-AVX512 --check-prefix=X32-AVX512F
5; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefix=X32 --check-prefix=X32-AVX512 --check-prefix=X32-AVX512BW
6; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefix=X32 --check-prefix=X32-AVX512 --check-prefix=X32-AVX512DQ
7; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx | FileCheck %s --check-prefix=X64 --check-prefix=X64-AVX --check-prefix=X64-AVX1
8; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx2 | FileCheck %s --check-prefix=X64 --check-prefix=X64-AVX --check-prefix=X64-AVX2
9; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512vl | FileCheck %s --check-prefix=X64 --check-prefix=X64-AVX512 --check-prefix=X64-AVX512F
10; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefix=X64 --check-prefix=X64-AVX512 --check-prefix=X64-AVX512BW
11; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefix=X64 --check-prefix=X64-AVX512 --check-prefix=X64-AVX512DQ
12
13;
14; Subvector Load + Broadcast
15;
16
17define <4 x double> @test_broadcast_2f64_4f64(<2 x double> *%p) nounwind {
18; X32-AVX-LABEL: test_broadcast_2f64_4f64:
19; X32-AVX:       ## BB#0:
20; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
21; X32-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
22; X32-AVX-NEXT:    retl
23;
24; X32-AVX512F-LABEL: test_broadcast_2f64_4f64:
25; X32-AVX512F:       ## BB#0:
26; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
27; X32-AVX512F-NEXT:    vbroadcastf32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
28; X32-AVX512F-NEXT:    retl
29;
30; X32-AVX512BW-LABEL: test_broadcast_2f64_4f64:
31; X32-AVX512BW:       ## BB#0:
32; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %eax
33; X32-AVX512BW-NEXT:    vbroadcastf32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
34; X32-AVX512BW-NEXT:    retl
35;
36; X32-AVX512DQ-LABEL: test_broadcast_2f64_4f64:
37; X32-AVX512DQ:       ## BB#0:
38; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %eax
39; X32-AVX512DQ-NEXT:    vbroadcastf64x2 {{.*#+}} ymm0 = mem[0,1,0,1]
40; X32-AVX512DQ-NEXT:    retl
41;
42; X64-AVX-LABEL: test_broadcast_2f64_4f64:
43; X64-AVX:       ## BB#0:
44; X64-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
45; X64-AVX-NEXT:    retq
46;
47; X64-AVX512F-LABEL: test_broadcast_2f64_4f64:
48; X64-AVX512F:       ## BB#0:
49; X64-AVX512F-NEXT:    vbroadcastf32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
50; X64-AVX512F-NEXT:    retq
51;
52; X64-AVX512BW-LABEL: test_broadcast_2f64_4f64:
53; X64-AVX512BW:       ## BB#0:
54; X64-AVX512BW-NEXT:    vbroadcastf32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
55; X64-AVX512BW-NEXT:    retq
56;
57; X64-AVX512DQ-LABEL: test_broadcast_2f64_4f64:
58; X64-AVX512DQ:       ## BB#0:
59; X64-AVX512DQ-NEXT:    vbroadcastf64x2 {{.*#+}} ymm0 = mem[0,1,0,1]
60; X64-AVX512DQ-NEXT:    retq
61 %1 = load <2 x double>, <2 x double> *%p
62 %2 = shufflevector <2 x double> %1, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
63 ret <4 x double> %2
64}
65
66define <8 x double> @test_broadcast_2f64_8f64(<2 x double> *%p) nounwind {
67; X32-AVX-LABEL: test_broadcast_2f64_8f64:
68; X32-AVX:       ## BB#0:
69; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
70; X32-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
71; X32-AVX-NEXT:    vmovdqa %ymm0, %ymm1
72; X32-AVX-NEXT:    retl
73;
74; X32-AVX512F-LABEL: test_broadcast_2f64_8f64:
75; X32-AVX512F:       ## BB#0:
76; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
77; X32-AVX512F-NEXT:    vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
78; X32-AVX512F-NEXT:    retl
79;
80; X32-AVX512BW-LABEL: test_broadcast_2f64_8f64:
81; X32-AVX512BW:       ## BB#0:
82; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %eax
83; X32-AVX512BW-NEXT:    vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
84; X32-AVX512BW-NEXT:    retl
85;
86; X32-AVX512DQ-LABEL: test_broadcast_2f64_8f64:
87; X32-AVX512DQ:       ## BB#0:
88; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %eax
89; X32-AVX512DQ-NEXT:    vbroadcastf64x2 {{.*#+}} zmm0 = mem[0,1,0,1,0,1,0,1]
90; X32-AVX512DQ-NEXT:    retl
91;
92; X64-AVX-LABEL: test_broadcast_2f64_8f64:
93; X64-AVX:       ## BB#0:
94; X64-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
95; X64-AVX-NEXT:    vmovdqa %ymm0, %ymm1
96; X64-AVX-NEXT:    retq
97;
98; X64-AVX512F-LABEL: test_broadcast_2f64_8f64:
99; X64-AVX512F:       ## BB#0:
100; X64-AVX512F-NEXT:    vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
101; X64-AVX512F-NEXT:    retq
102;
103; X64-AVX512BW-LABEL: test_broadcast_2f64_8f64:
104; X64-AVX512BW:       ## BB#0:
105; X64-AVX512BW-NEXT:    vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
106; X64-AVX512BW-NEXT:    retq
107;
108; X64-AVX512DQ-LABEL: test_broadcast_2f64_8f64:
109; X64-AVX512DQ:       ## BB#0:
110; X64-AVX512DQ-NEXT:    vbroadcastf64x2 {{.*#+}} zmm0 = mem[0,1,0,1,0,1,0,1]
111; X64-AVX512DQ-NEXT:    retq
112 %1 = load <2 x double>, <2 x double> *%p
113 %2 = shufflevector <2 x double> %1, <2 x double> undef, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>
114 ret <8 x double> %2
115}
116
117define <8 x double> @test_broadcast_4f64_8f64(<4 x double> *%p) nounwind {
118; X32-AVX-LABEL: test_broadcast_4f64_8f64:
119; X32-AVX:       ## BB#0:
120; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
121; X32-AVX-NEXT:    vmovaps (%eax), %ymm0
122; X32-AVX-NEXT:    vmovaps %ymm0, %ymm1
123; X32-AVX-NEXT:    retl
124;
125; X32-AVX512-LABEL: test_broadcast_4f64_8f64:
126; X32-AVX512:       ## BB#0:
127; X32-AVX512-NEXT:    movl {{[0-9]+}}(%esp), %eax
128; X32-AVX512-NEXT:    vbroadcastf64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]
129; X32-AVX512-NEXT:    retl
130;
131; X64-AVX-LABEL: test_broadcast_4f64_8f64:
132; X64-AVX:       ## BB#0:
133; X64-AVX-NEXT:    vmovaps (%rdi), %ymm0
134; X64-AVX-NEXT:    vmovaps %ymm0, %ymm1
135; X64-AVX-NEXT:    retq
136;
137; X64-AVX512-LABEL: test_broadcast_4f64_8f64:
138; X64-AVX512:       ## BB#0:
139; X64-AVX512-NEXT:    vbroadcastf64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]
140; X64-AVX512-NEXT:    retq
141 %1 = load <4 x double>, <4 x double> *%p
142 %2 = shufflevector <4 x double> %1, <4 x double> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
143 ret <8 x double> %2
144}
145
146define <4 x i64> @test_broadcast_2i64_4i64(<2 x i64> *%p) nounwind {
147; X32-AVX-LABEL: test_broadcast_2i64_4i64:
148; X32-AVX:       ## BB#0:
149; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
150; X32-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
151; X32-AVX-NEXT:    retl
152;
153; X32-AVX512F-LABEL: test_broadcast_2i64_4i64:
154; X32-AVX512F:       ## BB#0:
155; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
156; X32-AVX512F-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
157; X32-AVX512F-NEXT:    retl
158;
159; X32-AVX512BW-LABEL: test_broadcast_2i64_4i64:
160; X32-AVX512BW:       ## BB#0:
161; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %eax
162; X32-AVX512BW-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
163; X32-AVX512BW-NEXT:    retl
164;
165; X32-AVX512DQ-LABEL: test_broadcast_2i64_4i64:
166; X32-AVX512DQ:       ## BB#0:
167; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %eax
168; X32-AVX512DQ-NEXT:    vbroadcasti64x2 {{.*#+}} ymm0 = mem[0,1,0,1]
169; X32-AVX512DQ-NEXT:    retl
170;
171; X64-AVX-LABEL: test_broadcast_2i64_4i64:
172; X64-AVX:       ## BB#0:
173; X64-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
174; X64-AVX-NEXT:    retq
175;
176; X64-AVX512F-LABEL: test_broadcast_2i64_4i64:
177; X64-AVX512F:       ## BB#0:
178; X64-AVX512F-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
179; X64-AVX512F-NEXT:    retq
180;
181; X64-AVX512BW-LABEL: test_broadcast_2i64_4i64:
182; X64-AVX512BW:       ## BB#0:
183; X64-AVX512BW-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
184; X64-AVX512BW-NEXT:    retq
185;
186; X64-AVX512DQ-LABEL: test_broadcast_2i64_4i64:
187; X64-AVX512DQ:       ## BB#0:
188; X64-AVX512DQ-NEXT:    vbroadcasti64x2 {{.*#+}} ymm0 = mem[0,1,0,1]
189; X64-AVX512DQ-NEXT:    retq
190 %1 = load <2 x i64>, <2 x i64> *%p
191 %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
192 ret <4 x i64> %2
193}
194
195define <8 x i64> @test_broadcast_2i64_8i64(<2 x i64> *%p) nounwind {
196; X32-AVX1-LABEL: test_broadcast_2i64_8i64:
197; X32-AVX1:       ## BB#0:
198; X32-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %eax
199; X32-AVX1-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
200; X32-AVX1-NEXT:    vmovdqa %ymm0, %ymm1
201; X32-AVX1-NEXT:    retl
202;
203; X32-AVX2-LABEL: test_broadcast_2i64_8i64:
204; X32-AVX2:       ## BB#0:
205; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
206; X32-AVX2-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
207; X32-AVX2-NEXT:    vmovaps %ymm0, %ymm1
208; X32-AVX2-NEXT:    retl
209;
210; X32-AVX512F-LABEL: test_broadcast_2i64_8i64:
211; X32-AVX512F:       ## BB#0:
212; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
213; X32-AVX512F-NEXT:    vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
214; X32-AVX512F-NEXT:    retl
215;
216; X32-AVX512BW-LABEL: test_broadcast_2i64_8i64:
217; X32-AVX512BW:       ## BB#0:
218; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %eax
219; X32-AVX512BW-NEXT:    vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
220; X32-AVX512BW-NEXT:    retl
221;
222; X32-AVX512DQ-LABEL: test_broadcast_2i64_8i64:
223; X32-AVX512DQ:       ## BB#0:
224; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %eax
225; X32-AVX512DQ-NEXT:    vbroadcasti64x2 {{.*#+}} zmm0 = mem[0,1,0,1,0,1,0,1]
226; X32-AVX512DQ-NEXT:    retl
227;
228; X64-AVX1-LABEL: test_broadcast_2i64_8i64:
229; X64-AVX1:       ## BB#0:
230; X64-AVX1-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
231; X64-AVX1-NEXT:    vmovdqa %ymm0, %ymm1
232; X64-AVX1-NEXT:    retq
233;
234; X64-AVX2-LABEL: test_broadcast_2i64_8i64:
235; X64-AVX2:       ## BB#0:
236; X64-AVX2-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
237; X64-AVX2-NEXT:    vmovaps %ymm0, %ymm1
238; X64-AVX2-NEXT:    retq
239;
240; X64-AVX512F-LABEL: test_broadcast_2i64_8i64:
241; X64-AVX512F:       ## BB#0:
242; X64-AVX512F-NEXT:    vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
243; X64-AVX512F-NEXT:    retq
244;
245; X64-AVX512BW-LABEL: test_broadcast_2i64_8i64:
246; X64-AVX512BW:       ## BB#0:
247; X64-AVX512BW-NEXT:    vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
248; X64-AVX512BW-NEXT:    retq
249;
250; X64-AVX512DQ-LABEL: test_broadcast_2i64_8i64:
251; X64-AVX512DQ:       ## BB#0:
252; X64-AVX512DQ-NEXT:    vbroadcasti64x2 {{.*#+}} zmm0 = mem[0,1,0,1,0,1,0,1]
253; X64-AVX512DQ-NEXT:    retq
254 %1 = load <2 x i64>, <2 x i64> *%p
255 %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>
256 ret <8 x i64> %2
257}
258
259define <8 x i64> @test_broadcast_4i64_8i64(<4 x i64> *%p) nounwind {
260; X32-AVX-LABEL: test_broadcast_4i64_8i64:
261; X32-AVX:       ## BB#0:
262; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
263; X32-AVX-NEXT:    vmovaps (%eax), %ymm0
264; X32-AVX-NEXT:    vmovaps %ymm0, %ymm1
265; X32-AVX-NEXT:    retl
266;
267; X32-AVX512-LABEL: test_broadcast_4i64_8i64:
268; X32-AVX512:       ## BB#0:
269; X32-AVX512-NEXT:    movl {{[0-9]+}}(%esp), %eax
270; X32-AVX512-NEXT:    vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]
271; X32-AVX512-NEXT:    retl
272;
273; X64-AVX-LABEL: test_broadcast_4i64_8i64:
274; X64-AVX:       ## BB#0:
275; X64-AVX-NEXT:    vmovaps (%rdi), %ymm0
276; X64-AVX-NEXT:    vmovaps %ymm0, %ymm1
277; X64-AVX-NEXT:    retq
278;
279; X64-AVX512-LABEL: test_broadcast_4i64_8i64:
280; X64-AVX512:       ## BB#0:
281; X64-AVX512-NEXT:    vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]
282; X64-AVX512-NEXT:    retq
283 %1 = load <4 x i64>, <4 x i64> *%p
284 %2 = shufflevector <4 x i64> %1, <4 x i64> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
285 ret <8 x i64> %2
286}
287
288define <8 x float> @test_broadcast_4f32_8f32(<4 x float> *%p) nounwind {
289; X32-AVX-LABEL: test_broadcast_4f32_8f32:
290; X32-AVX:       ## BB#0:
291; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
292; X32-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
293; X32-AVX-NEXT:    retl
294;
295; X32-AVX512-LABEL: test_broadcast_4f32_8f32:
296; X32-AVX512:       ## BB#0:
297; X32-AVX512-NEXT:    movl {{[0-9]+}}(%esp), %eax
298; X32-AVX512-NEXT:    vbroadcastf32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
299; X32-AVX512-NEXT:    retl
300;
301; X64-AVX-LABEL: test_broadcast_4f32_8f32:
302; X64-AVX:       ## BB#0:
303; X64-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
304; X64-AVX-NEXT:    retq
305;
306; X64-AVX512-LABEL: test_broadcast_4f32_8f32:
307; X64-AVX512:       ## BB#0:
308; X64-AVX512-NEXT:    vbroadcastf32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
309; X64-AVX512-NEXT:    retq
310 %1 = load <4 x float>, <4 x float> *%p
311 %2 = shufflevector <4 x float> %1, <4 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
312 ret <8 x float> %2
313}
314
315define <16 x float> @test_broadcast_4f32_16f32(<4 x float> *%p) nounwind {
316; X32-AVX-LABEL: test_broadcast_4f32_16f32:
317; X32-AVX:       ## BB#0:
318; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
319; X32-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
320; X32-AVX-NEXT:    vmovdqa %ymm0, %ymm1
321; X32-AVX-NEXT:    retl
322;
323; X32-AVX512-LABEL: test_broadcast_4f32_16f32:
324; X32-AVX512:       ## BB#0:
325; X32-AVX512-NEXT:    movl {{[0-9]+}}(%esp), %eax
326; X32-AVX512-NEXT:    vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
327; X32-AVX512-NEXT:    retl
328;
329; X64-AVX-LABEL: test_broadcast_4f32_16f32:
330; X64-AVX:       ## BB#0:
331; X64-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
332; X64-AVX-NEXT:    vmovdqa %ymm0, %ymm1
333; X64-AVX-NEXT:    retq
334;
335; X64-AVX512-LABEL: test_broadcast_4f32_16f32:
336; X64-AVX512:       ## BB#0:
337; X64-AVX512-NEXT:    vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
338; X64-AVX512-NEXT:    retq
339 %1 = load <4 x float>, <4 x float> *%p
340 %2 = shufflevector <4 x float> %1, <4 x float> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
341 ret <16 x float> %2
342}
343
344define <16 x float> @test_broadcast_8f32_16f32(<8 x float> *%p) nounwind {
345; X32-AVX-LABEL: test_broadcast_8f32_16f32:
346; X32-AVX:       ## BB#0:
347; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
348; X32-AVX-NEXT:    vmovaps (%eax), %ymm0
349; X32-AVX-NEXT:    vmovaps %ymm0, %ymm1
350; X32-AVX-NEXT:    retl
351;
352; X32-AVX512F-LABEL: test_broadcast_8f32_16f32:
353; X32-AVX512F:       ## BB#0:
354; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
355; X32-AVX512F-NEXT:    vbroadcastf64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]
356; X32-AVX512F-NEXT:    retl
357;
358; X32-AVX512BW-LABEL: test_broadcast_8f32_16f32:
359; X32-AVX512BW:       ## BB#0:
360; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %eax
361; X32-AVX512BW-NEXT:    vbroadcastf64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]
362; X32-AVX512BW-NEXT:    retl
363;
364; X32-AVX512DQ-LABEL: test_broadcast_8f32_16f32:
365; X32-AVX512DQ:       ## BB#0:
366; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %eax
367; X32-AVX512DQ-NEXT:    vbroadcastf32x8 {{.*#+}} zmm0 = mem[0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7]
368; X32-AVX512DQ-NEXT:    retl
369;
370; X64-AVX-LABEL: test_broadcast_8f32_16f32:
371; X64-AVX:       ## BB#0:
372; X64-AVX-NEXT:    vmovaps (%rdi), %ymm0
373; X64-AVX-NEXT:    vmovaps %ymm0, %ymm1
374; X64-AVX-NEXT:    retq
375;
376; X64-AVX512F-LABEL: test_broadcast_8f32_16f32:
377; X64-AVX512F:       ## BB#0:
378; X64-AVX512F-NEXT:    vbroadcastf64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]
379; X64-AVX512F-NEXT:    retq
380;
381; X64-AVX512BW-LABEL: test_broadcast_8f32_16f32:
382; X64-AVX512BW:       ## BB#0:
383; X64-AVX512BW-NEXT:    vbroadcastf64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]
384; X64-AVX512BW-NEXT:    retq
385;
386; X64-AVX512DQ-LABEL: test_broadcast_8f32_16f32:
387; X64-AVX512DQ:       ## BB#0:
388; X64-AVX512DQ-NEXT:    vbroadcastf32x8 {{.*#+}} zmm0 = mem[0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7]
389; X64-AVX512DQ-NEXT:    retq
390 %1 = load <8 x float>, <8 x float> *%p
391 %2 = shufflevector <8 x float> %1, <8 x float> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
392 ret <16 x float> %2
393}
394
395define <8 x i32> @test_broadcast_4i32_8i32(<4 x i32> *%p) nounwind {
396; X32-AVX-LABEL: test_broadcast_4i32_8i32:
397; X32-AVX:       ## BB#0:
398; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
399; X32-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
400; X32-AVX-NEXT:    retl
401;
402; X32-AVX512-LABEL: test_broadcast_4i32_8i32:
403; X32-AVX512:       ## BB#0:
404; X32-AVX512-NEXT:    movl {{[0-9]+}}(%esp), %eax
405; X32-AVX512-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
406; X32-AVX512-NEXT:    retl
407;
408; X64-AVX-LABEL: test_broadcast_4i32_8i32:
409; X64-AVX:       ## BB#0:
410; X64-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
411; X64-AVX-NEXT:    retq
412;
413; X64-AVX512-LABEL: test_broadcast_4i32_8i32:
414; X64-AVX512:       ## BB#0:
415; X64-AVX512-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
416; X64-AVX512-NEXT:    retq
417 %1 = load <4 x i32>, <4 x i32> *%p
418 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
419 ret <8 x i32> %2
420}
421
422define <16 x i32> @test_broadcast_4i32_16i32(<4 x i32> *%p) nounwind {
423; X32-AVX1-LABEL: test_broadcast_4i32_16i32:
424; X32-AVX1:       ## BB#0:
425; X32-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %eax
426; X32-AVX1-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
427; X32-AVX1-NEXT:    vmovdqa %ymm0, %ymm1
428; X32-AVX1-NEXT:    retl
429;
430; X32-AVX2-LABEL: test_broadcast_4i32_16i32:
431; X32-AVX2:       ## BB#0:
432; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
433; X32-AVX2-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
434; X32-AVX2-NEXT:    vmovaps %ymm0, %ymm1
435; X32-AVX2-NEXT:    retl
436;
437; X32-AVX512-LABEL: test_broadcast_4i32_16i32:
438; X32-AVX512:       ## BB#0:
439; X32-AVX512-NEXT:    movl {{[0-9]+}}(%esp), %eax
440; X32-AVX512-NEXT:    vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
441; X32-AVX512-NEXT:    retl
442;
443; X64-AVX1-LABEL: test_broadcast_4i32_16i32:
444; X64-AVX1:       ## BB#0:
445; X64-AVX1-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
446; X64-AVX1-NEXT:    vmovdqa %ymm0, %ymm1
447; X64-AVX1-NEXT:    retq
448;
449; X64-AVX2-LABEL: test_broadcast_4i32_16i32:
450; X64-AVX2:       ## BB#0:
451; X64-AVX2-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
452; X64-AVX2-NEXT:    vmovaps %ymm0, %ymm1
453; X64-AVX2-NEXT:    retq
454;
455; X64-AVX512-LABEL: test_broadcast_4i32_16i32:
456; X64-AVX512:       ## BB#0:
457; X64-AVX512-NEXT:    vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
458; X64-AVX512-NEXT:    retq
459 %1 = load <4 x i32>, <4 x i32> *%p
460 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
461 ret <16 x i32> %2
462}
463
464define <16 x i32> @test_broadcast_8i32_16i32(<8 x i32> *%p) nounwind {
465; X32-AVX-LABEL: test_broadcast_8i32_16i32:
466; X32-AVX:       ## BB#0:
467; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
468; X32-AVX-NEXT:    vmovaps (%eax), %ymm0
469; X32-AVX-NEXT:    vmovaps %ymm0, %ymm1
470; X32-AVX-NEXT:    retl
471;
472; X32-AVX512F-LABEL: test_broadcast_8i32_16i32:
473; X32-AVX512F:       ## BB#0:
474; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
475; X32-AVX512F-NEXT:    vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]
476; X32-AVX512F-NEXT:    retl
477;
478; X32-AVX512BW-LABEL: test_broadcast_8i32_16i32:
479; X32-AVX512BW:       ## BB#0:
480; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %eax
481; X32-AVX512BW-NEXT:    vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]
482; X32-AVX512BW-NEXT:    retl
483;
484; X32-AVX512DQ-LABEL: test_broadcast_8i32_16i32:
485; X32-AVX512DQ:       ## BB#0:
486; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %eax
487; X32-AVX512DQ-NEXT:    vbroadcasti32x8 {{.*#+}} zmm0 = mem[0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7]
488; X32-AVX512DQ-NEXT:    retl
489;
490; X64-AVX-LABEL: test_broadcast_8i32_16i32:
491; X64-AVX:       ## BB#0:
492; X64-AVX-NEXT:    vmovaps (%rdi), %ymm0
493; X64-AVX-NEXT:    vmovaps %ymm0, %ymm1
494; X64-AVX-NEXT:    retq
495;
496; X64-AVX512F-LABEL: test_broadcast_8i32_16i32:
497; X64-AVX512F:       ## BB#0:
498; X64-AVX512F-NEXT:    vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]
499; X64-AVX512F-NEXT:    retq
500;
501; X64-AVX512BW-LABEL: test_broadcast_8i32_16i32:
502; X64-AVX512BW:       ## BB#0:
503; X64-AVX512BW-NEXT:    vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]
504; X64-AVX512BW-NEXT:    retq
505;
506; X64-AVX512DQ-LABEL: test_broadcast_8i32_16i32:
507; X64-AVX512DQ:       ## BB#0:
508; X64-AVX512DQ-NEXT:    vbroadcasti32x8 {{.*#+}} zmm0 = mem[0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7]
509; X64-AVX512DQ-NEXT:    retq
510 %1 = load <8 x i32>, <8 x i32> *%p
511 %2 = shufflevector <8 x i32> %1, <8 x i32> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
512 ret <16 x i32> %2
513}
514
515define <16 x i16> @test_broadcast_8i16_16i16(<8 x i16> *%p) nounwind {
516; X32-AVX-LABEL: test_broadcast_8i16_16i16:
517; X32-AVX:       ## BB#0:
518; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
519; X32-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
520; X32-AVX-NEXT:    retl
521;
522; X32-AVX512-LABEL: test_broadcast_8i16_16i16:
523; X32-AVX512:       ## BB#0:
524; X32-AVX512-NEXT:    movl {{[0-9]+}}(%esp), %eax
525; X32-AVX512-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
526; X32-AVX512-NEXT:    retl
527;
528; X64-AVX-LABEL: test_broadcast_8i16_16i16:
529; X64-AVX:       ## BB#0:
530; X64-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
531; X64-AVX-NEXT:    retq
532;
533; X64-AVX512-LABEL: test_broadcast_8i16_16i16:
534; X64-AVX512:       ## BB#0:
535; X64-AVX512-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
536; X64-AVX512-NEXT:    retq
537 %1 = load <8 x i16>, <8 x i16> *%p
538 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
539 ret <16 x i16> %2
540}
541
542define <32 x i16> @test_broadcast_8i16_32i16(<8 x i16> *%p) nounwind {
543; X32-AVX1-LABEL: test_broadcast_8i16_32i16:
544; X32-AVX1:       ## BB#0:
545; X32-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %eax
546; X32-AVX1-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
547; X32-AVX1-NEXT:    vmovdqa %ymm0, %ymm1
548; X32-AVX1-NEXT:    retl
549;
550; X32-AVX2-LABEL: test_broadcast_8i16_32i16:
551; X32-AVX2:       ## BB#0:
552; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
553; X32-AVX2-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
554; X32-AVX2-NEXT:    vmovaps %ymm0, %ymm1
555; X32-AVX2-NEXT:    retl
556;
557; X32-AVX512F-LABEL: test_broadcast_8i16_32i16:
558; X32-AVX512F:       ## BB#0:
559; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
560; X32-AVX512F-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
561; X32-AVX512F-NEXT:    vmovdqa64 %ymm0, %ymm1
562; X32-AVX512F-NEXT:    retl
563;
564; X32-AVX512BW-LABEL: test_broadcast_8i16_32i16:
565; X32-AVX512BW:       ## BB#0:
566; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %eax
567; X32-AVX512BW-NEXT:    vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
568; X32-AVX512BW-NEXT:    retl
569;
570; X32-AVX512DQ-LABEL: test_broadcast_8i16_32i16:
571; X32-AVX512DQ:       ## BB#0:
572; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %eax
573; X32-AVX512DQ-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
574; X32-AVX512DQ-NEXT:    vmovdqa64 %ymm0, %ymm1
575; X32-AVX512DQ-NEXT:    retl
576;
577; X64-AVX1-LABEL: test_broadcast_8i16_32i16:
578; X64-AVX1:       ## BB#0:
579; X64-AVX1-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
580; X64-AVX1-NEXT:    vmovdqa %ymm0, %ymm1
581; X64-AVX1-NEXT:    retq
582;
583; X64-AVX2-LABEL: test_broadcast_8i16_32i16:
584; X64-AVX2:       ## BB#0:
585; X64-AVX2-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
586; X64-AVX2-NEXT:    vmovaps %ymm0, %ymm1
587; X64-AVX2-NEXT:    retq
588;
589; X64-AVX512F-LABEL: test_broadcast_8i16_32i16:
590; X64-AVX512F:       ## BB#0:
591; X64-AVX512F-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
592; X64-AVX512F-NEXT:    vmovdqa64 %ymm0, %ymm1
593; X64-AVX512F-NEXT:    retq
594;
595; X64-AVX512BW-LABEL: test_broadcast_8i16_32i16:
596; X64-AVX512BW:       ## BB#0:
597; X64-AVX512BW-NEXT:    vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
598; X64-AVX512BW-NEXT:    retq
599;
600; X64-AVX512DQ-LABEL: test_broadcast_8i16_32i16:
601; X64-AVX512DQ:       ## BB#0:
602; X64-AVX512DQ-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
603; X64-AVX512DQ-NEXT:    vmovdqa64 %ymm0, %ymm1
604; X64-AVX512DQ-NEXT:    retq
605 %1 = load <8 x i16>, <8 x i16> *%p
606 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
607 ret <32 x i16> %2
608}
609
610define <32 x i16> @test_broadcast_16i16_32i16(<16 x i16> *%p) nounwind {
611; X32-AVX-LABEL: test_broadcast_16i16_32i16:
612; X32-AVX:       ## BB#0:
613; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
614; X32-AVX-NEXT:    vmovaps (%eax), %ymm0
615; X32-AVX-NEXT:    vmovaps %ymm0, %ymm1
616; X32-AVX-NEXT:    retl
617;
618; X32-AVX512F-LABEL: test_broadcast_16i16_32i16:
619; X32-AVX512F:       ## BB#0:
620; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
621; X32-AVX512F-NEXT:    vmovaps (%eax), %ymm0
622; X32-AVX512F-NEXT:    vmovaps %ymm0, %ymm1
623; X32-AVX512F-NEXT:    retl
624;
625; X32-AVX512BW-LABEL: test_broadcast_16i16_32i16:
626; X32-AVX512BW:       ## BB#0:
627; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %eax
628; X32-AVX512BW-NEXT:    vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]
629; X32-AVX512BW-NEXT:    retl
630;
631; X32-AVX512DQ-LABEL: test_broadcast_16i16_32i16:
632; X32-AVX512DQ:       ## BB#0:
633; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %eax
634; X32-AVX512DQ-NEXT:    vmovaps (%eax), %ymm0
635; X32-AVX512DQ-NEXT:    vmovaps %ymm0, %ymm1
636; X32-AVX512DQ-NEXT:    retl
637;
638; X64-AVX-LABEL: test_broadcast_16i16_32i16:
639; X64-AVX:       ## BB#0:
640; X64-AVX-NEXT:    vmovaps (%rdi), %ymm0
641; X64-AVX-NEXT:    vmovaps %ymm0, %ymm1
642; X64-AVX-NEXT:    retq
643;
644; X64-AVX512F-LABEL: test_broadcast_16i16_32i16:
645; X64-AVX512F:       ## BB#0:
646; X64-AVX512F-NEXT:    vmovaps (%rdi), %ymm0
647; X64-AVX512F-NEXT:    vmovaps %ymm0, %ymm1
648; X64-AVX512F-NEXT:    retq
649;
650; X64-AVX512BW-LABEL: test_broadcast_16i16_32i16:
651; X64-AVX512BW:       ## BB#0:
652; X64-AVX512BW-NEXT:    vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]
653; X64-AVX512BW-NEXT:    retq
654;
655; X64-AVX512DQ-LABEL: test_broadcast_16i16_32i16:
656; X64-AVX512DQ:       ## BB#0:
657; X64-AVX512DQ-NEXT:    vmovaps (%rdi), %ymm0
658; X64-AVX512DQ-NEXT:    vmovaps %ymm0, %ymm1
659; X64-AVX512DQ-NEXT:    retq
660 %1 = load <16 x i16>, <16 x i16> *%p
661 %2 = shufflevector <16 x i16> %1, <16 x i16> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
662 ret <32 x i16> %2
663}
664
665define <32 x i8> @test_broadcast_16i8_32i8(<16 x i8> *%p) nounwind {
666; X32-AVX-LABEL: test_broadcast_16i8_32i8:
667; X32-AVX:       ## BB#0:
668; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
669; X32-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
670; X32-AVX-NEXT:    retl
671;
672; X32-AVX512-LABEL: test_broadcast_16i8_32i8:
673; X32-AVX512:       ## BB#0:
674; X32-AVX512-NEXT:    movl {{[0-9]+}}(%esp), %eax
675; X32-AVX512-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
676; X32-AVX512-NEXT:    retl
677;
678; X64-AVX-LABEL: test_broadcast_16i8_32i8:
679; X64-AVX:       ## BB#0:
680; X64-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
681; X64-AVX-NEXT:    retq
682;
683; X64-AVX512-LABEL: test_broadcast_16i8_32i8:
684; X64-AVX512:       ## BB#0:
685; X64-AVX512-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
686; X64-AVX512-NEXT:    retq
687 %1 = load <16 x i8>, <16 x i8> *%p
688 %2 = shufflevector <16 x i8> %1, <16 x i8> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
689 ret <32 x i8> %2
690}
691
692define <64 x i8> @test_broadcast_16i8_64i8(<16 x i8> *%p) nounwind {
693; X32-AVX1-LABEL: test_broadcast_16i8_64i8:
694; X32-AVX1:       ## BB#0:
695; X32-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %eax
696; X32-AVX1-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
697; X32-AVX1-NEXT:    vmovdqa %ymm0, %ymm1
698; X32-AVX1-NEXT:    retl
699;
700; X32-AVX2-LABEL: test_broadcast_16i8_64i8:
701; X32-AVX2:       ## BB#0:
702; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
703; X32-AVX2-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
704; X32-AVX2-NEXT:    vmovaps %ymm0, %ymm1
705; X32-AVX2-NEXT:    retl
706;
707; X32-AVX512F-LABEL: test_broadcast_16i8_64i8:
708; X32-AVX512F:       ## BB#0:
709; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
710; X32-AVX512F-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
711; X32-AVX512F-NEXT:    vmovdqa64 %ymm0, %ymm1
712; X32-AVX512F-NEXT:    retl
713;
714; X32-AVX512BW-LABEL: test_broadcast_16i8_64i8:
715; X32-AVX512BW:       ## BB#0:
716; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %eax
717; X32-AVX512BW-NEXT:    vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
718; X32-AVX512BW-NEXT:    retl
719;
720; X32-AVX512DQ-LABEL: test_broadcast_16i8_64i8:
721; X32-AVX512DQ:       ## BB#0:
722; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %eax
723; X32-AVX512DQ-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
724; X32-AVX512DQ-NEXT:    vmovdqa64 %ymm0, %ymm1
725; X32-AVX512DQ-NEXT:    retl
726;
727; X64-AVX1-LABEL: test_broadcast_16i8_64i8:
728; X64-AVX1:       ## BB#0:
729; X64-AVX1-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
730; X64-AVX1-NEXT:    vmovdqa %ymm0, %ymm1
731; X64-AVX1-NEXT:    retq
732;
733; X64-AVX2-LABEL: test_broadcast_16i8_64i8:
734; X64-AVX2:       ## BB#0:
735; X64-AVX2-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]
736; X64-AVX2-NEXT:    vmovaps %ymm0, %ymm1
737; X64-AVX2-NEXT:    retq
738;
739; X64-AVX512F-LABEL: test_broadcast_16i8_64i8:
740; X64-AVX512F:       ## BB#0:
741; X64-AVX512F-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
742; X64-AVX512F-NEXT:    vmovdqa64 %ymm0, %ymm1
743; X64-AVX512F-NEXT:    retq
744;
745; X64-AVX512BW-LABEL: test_broadcast_16i8_64i8:
746; X64-AVX512BW:       ## BB#0:
747; X64-AVX512BW-NEXT:    vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
748; X64-AVX512BW-NEXT:    retq
749;
750; X64-AVX512DQ-LABEL: test_broadcast_16i8_64i8:
751; X64-AVX512DQ:       ## BB#0:
752; X64-AVX512DQ-NEXT:    vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3]
753; X64-AVX512DQ-NEXT:    vmovdqa64 %ymm0, %ymm1
754; X64-AVX512DQ-NEXT:    retq
755 %1 = load <16 x i8>, <16 x i8> *%p
756 %2 = shufflevector <16 x i8> %1, <16 x i8> undef, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
757 ret <64 x i8> %2
758}
759
760define <64 x i8> @test_broadcast_32i8_64i8(<32 x i8> *%p) nounwind {
761; X32-AVX-LABEL: test_broadcast_32i8_64i8:
762; X32-AVX:       ## BB#0:
763; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
764; X32-AVX-NEXT:    vmovaps (%eax), %ymm0
765; X32-AVX-NEXT:    vmovaps %ymm0, %ymm1
766; X32-AVX-NEXT:    retl
767;
768; X32-AVX512F-LABEL: test_broadcast_32i8_64i8:
769; X32-AVX512F:       ## BB#0:
770; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
771; X32-AVX512F-NEXT:    vmovaps (%eax), %ymm0
772; X32-AVX512F-NEXT:    vmovaps %ymm0, %ymm1
773; X32-AVX512F-NEXT:    retl
774;
775; X32-AVX512BW-LABEL: test_broadcast_32i8_64i8:
776; X32-AVX512BW:       ## BB#0:
777; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %eax
778; X32-AVX512BW-NEXT:    vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]
779; X32-AVX512BW-NEXT:    retl
780;
781; X32-AVX512DQ-LABEL: test_broadcast_32i8_64i8:
782; X32-AVX512DQ:       ## BB#0:
783; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %eax
784; X32-AVX512DQ-NEXT:    vmovaps (%eax), %ymm0
785; X32-AVX512DQ-NEXT:    vmovaps %ymm0, %ymm1
786; X32-AVX512DQ-NEXT:    retl
787;
788; X64-AVX-LABEL: test_broadcast_32i8_64i8:
789; X64-AVX:       ## BB#0:
790; X64-AVX-NEXT:    vmovaps (%rdi), %ymm0
791; X64-AVX-NEXT:    vmovaps %ymm0, %ymm1
792; X64-AVX-NEXT:    retq
793;
794; X64-AVX512F-LABEL: test_broadcast_32i8_64i8:
795; X64-AVX512F:       ## BB#0:
796; X64-AVX512F-NEXT:    vmovaps (%rdi), %ymm0
797; X64-AVX512F-NEXT:    vmovaps %ymm0, %ymm1
798; X64-AVX512F-NEXT:    retq
799;
800; X64-AVX512BW-LABEL: test_broadcast_32i8_64i8:
801; X64-AVX512BW:       ## BB#0:
802; X64-AVX512BW-NEXT:    vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]
803; X64-AVX512BW-NEXT:    retq
804;
805; X64-AVX512DQ-LABEL: test_broadcast_32i8_64i8:
806; X64-AVX512DQ:       ## BB#0:
807; X64-AVX512DQ-NEXT:    vmovaps (%rdi), %ymm0
808; X64-AVX512DQ-NEXT:    vmovaps %ymm0, %ymm1
809; X64-AVX512DQ-NEXT:    retq
810 %1 = load <32 x i8>, <32 x i8> *%p
811 %2 = shufflevector <32 x i8> %1, <32 x i8> undef, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
812 ret <64 x i8> %2
813}
814
815;
816; Subvector Load + Broadcast + Store
817;
818
819define <4 x double> @test_broadcast_2f64_4f64_reuse(<2 x double>* %p0, <2 x double>* %p1) {
820; X32-AVX-LABEL: test_broadcast_2f64_4f64_reuse:
821; X32-AVX:       ## BB#0:
822; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
823; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
824; X32-AVX-NEXT:    vmovaps (%ecx), %xmm0
825; X32-AVX-NEXT:    vmovaps %xmm0, (%eax)
826; X32-AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
827; X32-AVX-NEXT:    retl
828;
829; X32-AVX512F-LABEL: test_broadcast_2f64_4f64_reuse:
830; X32-AVX512F:       ## BB#0:
831; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
832; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %ecx
833; X32-AVX512F-NEXT:    vmovaps (%ecx), %xmm0
834; X32-AVX512F-NEXT:    vmovaps %xmm0, (%eax)
835; X32-AVX512F-NEXT:    vinsertf32x4 $1, %xmm0, %ymm0, %ymm0
836; X32-AVX512F-NEXT:    retl
837;
838; X32-AVX512BW-LABEL: test_broadcast_2f64_4f64_reuse:
839; X32-AVX512BW:       ## BB#0:
840; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %eax
841; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %ecx
842; X32-AVX512BW-NEXT:    vmovaps (%ecx), %xmm0
843; X32-AVX512BW-NEXT:    vmovaps %xmm0, (%eax)
844; X32-AVX512BW-NEXT:    vinsertf32x4 $1, %xmm0, %ymm0, %ymm0
845; X32-AVX512BW-NEXT:    retl
846;
847; X32-AVX512DQ-LABEL: test_broadcast_2f64_4f64_reuse:
848; X32-AVX512DQ:       ## BB#0:
849; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %eax
850; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %ecx
851; X32-AVX512DQ-NEXT:    vmovapd (%ecx), %xmm0
852; X32-AVX512DQ-NEXT:    vmovapd %xmm0, (%eax)
853; X32-AVX512DQ-NEXT:    vinsertf64x2 $1, %xmm0, %ymm0, %ymm0
854; X32-AVX512DQ-NEXT:    retl
855;
856; X64-AVX-LABEL: test_broadcast_2f64_4f64_reuse:
857; X64-AVX:       ## BB#0:
858; X64-AVX-NEXT:    vmovaps (%rdi), %xmm0
859; X64-AVX-NEXT:    vmovaps %xmm0, (%rsi)
860; X64-AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
861; X64-AVX-NEXT:    retq
862;
863; X64-AVX512F-LABEL: test_broadcast_2f64_4f64_reuse:
864; X64-AVX512F:       ## BB#0:
865; X64-AVX512F-NEXT:    vmovaps (%rdi), %xmm0
866; X64-AVX512F-NEXT:    vmovaps %xmm0, (%rsi)
867; X64-AVX512F-NEXT:    vinsertf32x4 $1, %xmm0, %ymm0, %ymm0
868; X64-AVX512F-NEXT:    retq
869;
870; X64-AVX512BW-LABEL: test_broadcast_2f64_4f64_reuse:
871; X64-AVX512BW:       ## BB#0:
872; X64-AVX512BW-NEXT:    vmovaps (%rdi), %xmm0
873; X64-AVX512BW-NEXT:    vmovaps %xmm0, (%rsi)
874; X64-AVX512BW-NEXT:    vinsertf32x4 $1, %xmm0, %ymm0, %ymm0
875; X64-AVX512BW-NEXT:    retq
876;
877; X64-AVX512DQ-LABEL: test_broadcast_2f64_4f64_reuse:
878; X64-AVX512DQ:       ## BB#0:
879; X64-AVX512DQ-NEXT:    vmovapd (%rdi), %xmm0
880; X64-AVX512DQ-NEXT:    vmovapd %xmm0, (%rsi)
881; X64-AVX512DQ-NEXT:    vinsertf64x2 $1, %xmm0, %ymm0, %ymm0
882; X64-AVX512DQ-NEXT:    retq
883 %1 = load <2 x double>, <2 x double>* %p0
884 store <2 x double> %1, <2 x double>* %p1
885 %2 = shufflevector <2 x double> %1, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
886 ret <4 x double> %2
887}
888
889define <4 x i64> @test_broadcast_2i64_4i64_reuse(<2 x i64>* %p0, <2 x i64>* %p1) {
890; X32-AVX-LABEL: test_broadcast_2i64_4i64_reuse:
891; X32-AVX:       ## BB#0:
892; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
893; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
894; X32-AVX-NEXT:    vmovaps (%ecx), %xmm0
895; X32-AVX-NEXT:    vmovaps %xmm0, (%eax)
896; X32-AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
897; X32-AVX-NEXT:    retl
898;
899; X32-AVX512F-LABEL: test_broadcast_2i64_4i64_reuse:
900; X32-AVX512F:       ## BB#0:
901; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
902; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %ecx
903; X32-AVX512F-NEXT:    vmovdqa64 (%ecx), %xmm0
904; X32-AVX512F-NEXT:    vmovdqa64 %xmm0, (%eax)
905; X32-AVX512F-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
906; X32-AVX512F-NEXT:    retl
907;
908; X32-AVX512BW-LABEL: test_broadcast_2i64_4i64_reuse:
909; X32-AVX512BW:       ## BB#0:
910; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %eax
911; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %ecx
912; X32-AVX512BW-NEXT:    vmovdqa64 (%ecx), %xmm0
913; X32-AVX512BW-NEXT:    vmovdqa64 %xmm0, (%eax)
914; X32-AVX512BW-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
915; X32-AVX512BW-NEXT:    retl
916;
917; X32-AVX512DQ-LABEL: test_broadcast_2i64_4i64_reuse:
918; X32-AVX512DQ:       ## BB#0:
919; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %eax
920; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %ecx
921; X32-AVX512DQ-NEXT:    vmovdqa64 (%ecx), %xmm0
922; X32-AVX512DQ-NEXT:    vmovdqa64 %xmm0, (%eax)
923; X32-AVX512DQ-NEXT:    vinserti64x2 $1, %xmm0, %ymm0, %ymm0
924; X32-AVX512DQ-NEXT:    retl
925;
926; X64-AVX-LABEL: test_broadcast_2i64_4i64_reuse:
927; X64-AVX:       ## BB#0:
928; X64-AVX-NEXT:    vmovaps (%rdi), %xmm0
929; X64-AVX-NEXT:    vmovaps %xmm0, (%rsi)
930; X64-AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
931; X64-AVX-NEXT:    retq
932;
933; X64-AVX512F-LABEL: test_broadcast_2i64_4i64_reuse:
934; X64-AVX512F:       ## BB#0:
935; X64-AVX512F-NEXT:    vmovdqa64 (%rdi), %xmm0
936; X64-AVX512F-NEXT:    vmovdqa64 %xmm0, (%rsi)
937; X64-AVX512F-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
938; X64-AVX512F-NEXT:    retq
939;
940; X64-AVX512BW-LABEL: test_broadcast_2i64_4i64_reuse:
941; X64-AVX512BW:       ## BB#0:
942; X64-AVX512BW-NEXT:    vmovdqa64 (%rdi), %xmm0
943; X64-AVX512BW-NEXT:    vmovdqa64 %xmm0, (%rsi)
944; X64-AVX512BW-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
945; X64-AVX512BW-NEXT:    retq
946;
947; X64-AVX512DQ-LABEL: test_broadcast_2i64_4i64_reuse:
948; X64-AVX512DQ:       ## BB#0:
949; X64-AVX512DQ-NEXT:    vmovdqa64 (%rdi), %xmm0
950; X64-AVX512DQ-NEXT:    vmovdqa64 %xmm0, (%rsi)
951; X64-AVX512DQ-NEXT:    vinserti64x2 $1, %xmm0, %ymm0, %ymm0
952; X64-AVX512DQ-NEXT:    retq
953 %1 = load <2 x i64>, <2 x i64>* %p0
954 store <2 x i64> %1, <2 x i64>* %p1
955 %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
956 ret <4 x i64> %2
957}
958
959define <8 x float> @test_broadcast_4f32_8f32_reuse(<4 x float>* %p0, <4 x float>* %p1) {
960; X32-AVX-LABEL: test_broadcast_4f32_8f32_reuse:
961; X32-AVX:       ## BB#0:
962; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
963; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
964; X32-AVX-NEXT:    vmovaps (%ecx), %xmm0
965; X32-AVX-NEXT:    vmovaps %xmm0, (%eax)
966; X32-AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
967; X32-AVX-NEXT:    retl
968;
969; X32-AVX512-LABEL: test_broadcast_4f32_8f32_reuse:
970; X32-AVX512:       ## BB#0:
971; X32-AVX512-NEXT:    movl {{[0-9]+}}(%esp), %eax
972; X32-AVX512-NEXT:    movl {{[0-9]+}}(%esp), %ecx
973; X32-AVX512-NEXT:    vmovaps (%ecx), %xmm0
974; X32-AVX512-NEXT:    vmovaps %xmm0, (%eax)
975; X32-AVX512-NEXT:    vinsertf32x4 $1, %xmm0, %ymm0, %ymm0
976; X32-AVX512-NEXT:    retl
977;
978; X64-AVX-LABEL: test_broadcast_4f32_8f32_reuse:
979; X64-AVX:       ## BB#0:
980; X64-AVX-NEXT:    vmovaps (%rdi), %xmm0
981; X64-AVX-NEXT:    vmovaps %xmm0, (%rsi)
982; X64-AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
983; X64-AVX-NEXT:    retq
984;
985; X64-AVX512-LABEL: test_broadcast_4f32_8f32_reuse:
986; X64-AVX512:       ## BB#0:
987; X64-AVX512-NEXT:    vmovaps (%rdi), %xmm0
988; X64-AVX512-NEXT:    vmovaps %xmm0, (%rsi)
989; X64-AVX512-NEXT:    vinsertf32x4 $1, %xmm0, %ymm0, %ymm0
990; X64-AVX512-NEXT:    retq
991 %1 = load <4 x float>, <4 x float>* %p0
992 store <4 x float> %1, <4 x float>* %p1
993 %2 = shufflevector <4 x float> %1, <4 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
994 ret <8 x float> %2
995}
996
997define <8 x i32> @test_broadcast_4i32_8i32_reuse(<4 x i32>* %p0, <4 x i32>* %p1) {
998; X32-AVX-LABEL: test_broadcast_4i32_8i32_reuse:
999; X32-AVX:       ## BB#0:
1000; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
1001; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1002; X32-AVX-NEXT:    vmovaps (%ecx), %xmm0
1003; X32-AVX-NEXT:    vmovaps %xmm0, (%eax)
1004; X32-AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1005; X32-AVX-NEXT:    retl
1006;
1007; X32-AVX512-LABEL: test_broadcast_4i32_8i32_reuse:
1008; X32-AVX512:       ## BB#0:
1009; X32-AVX512-NEXT:    movl {{[0-9]+}}(%esp), %eax
1010; X32-AVX512-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1011; X32-AVX512-NEXT:    vmovdqa32 (%ecx), %xmm0
1012; X32-AVX512-NEXT:    vmovdqa32 %xmm0, (%eax)
1013; X32-AVX512-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1014; X32-AVX512-NEXT:    retl
1015;
1016; X64-AVX-LABEL: test_broadcast_4i32_8i32_reuse:
1017; X64-AVX:       ## BB#0:
1018; X64-AVX-NEXT:    vmovaps (%rdi), %xmm0
1019; X64-AVX-NEXT:    vmovaps %xmm0, (%rsi)
1020; X64-AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1021; X64-AVX-NEXT:    retq
1022;
1023; X64-AVX512-LABEL: test_broadcast_4i32_8i32_reuse:
1024; X64-AVX512:       ## BB#0:
1025; X64-AVX512-NEXT:    vmovdqa32 (%rdi), %xmm0
1026; X64-AVX512-NEXT:    vmovdqa32 %xmm0, (%rsi)
1027; X64-AVX512-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1028; X64-AVX512-NEXT:    retq
1029 %1 = load <4 x i32>, <4 x i32>* %p0
1030 store <4 x i32> %1, <4 x i32>* %p1
1031 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
1032 ret <8 x i32> %2
1033}
1034
1035define <16 x i16> @test_broadcast_8i16_16i16_reuse(<8 x i16> *%p0, <8 x i16> *%p1) nounwind {
1036; X32-AVX-LABEL: test_broadcast_8i16_16i16_reuse:
1037; X32-AVX:       ## BB#0:
1038; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
1039; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1040; X32-AVX-NEXT:    vmovaps (%ecx), %xmm0
1041; X32-AVX-NEXT:    vmovaps %xmm0, (%eax)
1042; X32-AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1043; X32-AVX-NEXT:    retl
1044;
1045; X32-AVX512F-LABEL: test_broadcast_8i16_16i16_reuse:
1046; X32-AVX512F:       ## BB#0:
1047; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
1048; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1049; X32-AVX512F-NEXT:    vmovdqa64 (%ecx), %xmm0
1050; X32-AVX512F-NEXT:    vmovdqa32 %xmm0, (%eax)
1051; X32-AVX512F-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1052; X32-AVX512F-NEXT:    retl
1053;
1054; X32-AVX512BW-LABEL: test_broadcast_8i16_16i16_reuse:
1055; X32-AVX512BW:       ## BB#0:
1056; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %eax
1057; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1058; X32-AVX512BW-NEXT:    vmovdqu16 (%ecx), %xmm0
1059; X32-AVX512BW-NEXT:    vmovdqu16 %xmm0, (%eax)
1060; X32-AVX512BW-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1061; X32-AVX512BW-NEXT:    retl
1062;
1063; X32-AVX512DQ-LABEL: test_broadcast_8i16_16i16_reuse:
1064; X32-AVX512DQ:       ## BB#0:
1065; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %eax
1066; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1067; X32-AVX512DQ-NEXT:    vmovdqa64 (%ecx), %xmm0
1068; X32-AVX512DQ-NEXT:    vmovdqa32 %xmm0, (%eax)
1069; X32-AVX512DQ-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1070; X32-AVX512DQ-NEXT:    retl
1071;
1072; X64-AVX-LABEL: test_broadcast_8i16_16i16_reuse:
1073; X64-AVX:       ## BB#0:
1074; X64-AVX-NEXT:    vmovaps (%rdi), %xmm0
1075; X64-AVX-NEXT:    vmovaps %xmm0, (%rsi)
1076; X64-AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1077; X64-AVX-NEXT:    retq
1078;
1079; X64-AVX512F-LABEL: test_broadcast_8i16_16i16_reuse:
1080; X64-AVX512F:       ## BB#0:
1081; X64-AVX512F-NEXT:    vmovdqa64 (%rdi), %xmm0
1082; X64-AVX512F-NEXT:    vmovdqa32 %xmm0, (%rsi)
1083; X64-AVX512F-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1084; X64-AVX512F-NEXT:    retq
1085;
1086; X64-AVX512BW-LABEL: test_broadcast_8i16_16i16_reuse:
1087; X64-AVX512BW:       ## BB#0:
1088; X64-AVX512BW-NEXT:    vmovdqu16 (%rdi), %xmm0
1089; X64-AVX512BW-NEXT:    vmovdqu16 %xmm0, (%rsi)
1090; X64-AVX512BW-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1091; X64-AVX512BW-NEXT:    retq
1092;
1093; X64-AVX512DQ-LABEL: test_broadcast_8i16_16i16_reuse:
1094; X64-AVX512DQ:       ## BB#0:
1095; X64-AVX512DQ-NEXT:    vmovdqa64 (%rdi), %xmm0
1096; X64-AVX512DQ-NEXT:    vmovdqa32 %xmm0, (%rsi)
1097; X64-AVX512DQ-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1098; X64-AVX512DQ-NEXT:    retq
1099 %1 = load <8 x i16>, <8 x i16> *%p0
1100 store <8 x i16> %1, <8 x i16>* %p1
1101 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1102 ret <16 x i16> %2
1103}
1104
1105define <32 x i8> @test_broadcast_16i8_32i8_reuse(<16 x i8> *%p0, <16 x i8> *%p1) nounwind {
1106; X32-AVX-LABEL: test_broadcast_16i8_32i8_reuse:
1107; X32-AVX:       ## BB#0:
1108; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
1109; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1110; X32-AVX-NEXT:    vmovaps (%ecx), %xmm0
1111; X32-AVX-NEXT:    vmovaps %xmm0, (%eax)
1112; X32-AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1113; X32-AVX-NEXT:    retl
1114;
1115; X32-AVX512F-LABEL: test_broadcast_16i8_32i8_reuse:
1116; X32-AVX512F:       ## BB#0:
1117; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
1118; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1119; X32-AVX512F-NEXT:    vmovdqa64 (%ecx), %xmm0
1120; X32-AVX512F-NEXT:    vmovdqa32 %xmm0, (%eax)
1121; X32-AVX512F-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1122; X32-AVX512F-NEXT:    retl
1123;
1124; X32-AVX512BW-LABEL: test_broadcast_16i8_32i8_reuse:
1125; X32-AVX512BW:       ## BB#0:
1126; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %eax
1127; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1128; X32-AVX512BW-NEXT:    vmovdqu8 (%ecx), %xmm0
1129; X32-AVX512BW-NEXT:    vmovdqu8 %xmm0, (%eax)
1130; X32-AVX512BW-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1131; X32-AVX512BW-NEXT:    retl
1132;
1133; X32-AVX512DQ-LABEL: test_broadcast_16i8_32i8_reuse:
1134; X32-AVX512DQ:       ## BB#0:
1135; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %eax
1136; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1137; X32-AVX512DQ-NEXT:    vmovdqa64 (%ecx), %xmm0
1138; X32-AVX512DQ-NEXT:    vmovdqa32 %xmm0, (%eax)
1139; X32-AVX512DQ-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1140; X32-AVX512DQ-NEXT:    retl
1141;
1142; X64-AVX-LABEL: test_broadcast_16i8_32i8_reuse:
1143; X64-AVX:       ## BB#0:
1144; X64-AVX-NEXT:    vmovaps (%rdi), %xmm0
1145; X64-AVX-NEXT:    vmovaps %xmm0, (%rsi)
1146; X64-AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1147; X64-AVX-NEXT:    retq
1148;
1149; X64-AVX512F-LABEL: test_broadcast_16i8_32i8_reuse:
1150; X64-AVX512F:       ## BB#0:
1151; X64-AVX512F-NEXT:    vmovdqa64 (%rdi), %xmm0
1152; X64-AVX512F-NEXT:    vmovdqa32 %xmm0, (%rsi)
1153; X64-AVX512F-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1154; X64-AVX512F-NEXT:    retq
1155;
1156; X64-AVX512BW-LABEL: test_broadcast_16i8_32i8_reuse:
1157; X64-AVX512BW:       ## BB#0:
1158; X64-AVX512BW-NEXT:    vmovdqu8 (%rdi), %xmm0
1159; X64-AVX512BW-NEXT:    vmovdqu8 %xmm0, (%rsi)
1160; X64-AVX512BW-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1161; X64-AVX512BW-NEXT:    retq
1162;
1163; X64-AVX512DQ-LABEL: test_broadcast_16i8_32i8_reuse:
1164; X64-AVX512DQ:       ## BB#0:
1165; X64-AVX512DQ-NEXT:    vmovdqa64 (%rdi), %xmm0
1166; X64-AVX512DQ-NEXT:    vmovdqa32 %xmm0, (%rsi)
1167; X64-AVX512DQ-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1168; X64-AVX512DQ-NEXT:    retq
1169 %1 = load <16 x i8>, <16 x i8> *%p0
1170 store <16 x i8> %1, <16 x i8>* %p1
1171 %2 = shufflevector <16 x i8> %1, <16 x i8> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1172 ret <32 x i8> %2
1173}
1174
1175;
1176; Subvector Load + Broadcast with Separate Store
1177;
1178
1179define <8 x i32> @test_broadcast_4i32_8i32_chain(<4 x i32>* %p0, <4 x float>* %p1) {
1180; X32-AVX-LABEL: test_broadcast_4i32_8i32_chain:
1181; X32-AVX:       ## BB#0:
1182; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
1183; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1184; X32-AVX-NEXT:    vmovaps (%ecx), %xmm0
1185; X32-AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1186; X32-AVX-NEXT:    vmovaps %xmm1, (%eax)
1187; X32-AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1188; X32-AVX-NEXT:    retl
1189;
1190; X32-AVX512F-LABEL: test_broadcast_4i32_8i32_chain:
1191; X32-AVX512F:       ## BB#0:
1192; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
1193; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1194; X32-AVX512F-NEXT:    vmovdqa64 (%ecx), %xmm0
1195; X32-AVX512F-NEXT:    vpxord %xmm1, %xmm1, %xmm1
1196; X32-AVX512F-NEXT:    vmovdqa32 %xmm1, (%eax)
1197; X32-AVX512F-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1198; X32-AVX512F-NEXT:    retl
1199;
1200; X32-AVX512BW-LABEL: test_broadcast_4i32_8i32_chain:
1201; X32-AVX512BW:       ## BB#0:
1202; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %eax
1203; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1204; X32-AVX512BW-NEXT:    vmovdqa64 (%ecx), %xmm0
1205; X32-AVX512BW-NEXT:    vpxord %xmm1, %xmm1, %xmm1
1206; X32-AVX512BW-NEXT:    vmovdqa32 %xmm1, (%eax)
1207; X32-AVX512BW-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1208; X32-AVX512BW-NEXT:    retl
1209;
1210; X32-AVX512DQ-LABEL: test_broadcast_4i32_8i32_chain:
1211; X32-AVX512DQ:       ## BB#0:
1212; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %eax
1213; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1214; X32-AVX512DQ-NEXT:    vmovdqa64 (%ecx), %xmm0
1215; X32-AVX512DQ-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1216; X32-AVX512DQ-NEXT:    vmovaps %xmm1, (%eax)
1217; X32-AVX512DQ-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1218; X32-AVX512DQ-NEXT:    retl
1219;
1220; X64-AVX-LABEL: test_broadcast_4i32_8i32_chain:
1221; X64-AVX:       ## BB#0:
1222; X64-AVX-NEXT:    vmovaps (%rdi), %xmm0
1223; X64-AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1224; X64-AVX-NEXT:    vmovaps %xmm1, (%rsi)
1225; X64-AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1226; X64-AVX-NEXT:    retq
1227;
1228; X64-AVX512F-LABEL: test_broadcast_4i32_8i32_chain:
1229; X64-AVX512F:       ## BB#0:
1230; X64-AVX512F-NEXT:    vmovdqa64 (%rdi), %xmm0
1231; X64-AVX512F-NEXT:    vpxord %xmm1, %xmm1, %xmm1
1232; X64-AVX512F-NEXT:    vmovdqa32 %xmm1, (%rsi)
1233; X64-AVX512F-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1234; X64-AVX512F-NEXT:    retq
1235;
1236; X64-AVX512BW-LABEL: test_broadcast_4i32_8i32_chain:
1237; X64-AVX512BW:       ## BB#0:
1238; X64-AVX512BW-NEXT:    vmovdqa64 (%rdi), %xmm0
1239; X64-AVX512BW-NEXT:    vpxord %xmm1, %xmm1, %xmm1
1240; X64-AVX512BW-NEXT:    vmovdqa32 %xmm1, (%rsi)
1241; X64-AVX512BW-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1242; X64-AVX512BW-NEXT:    retq
1243;
1244; X64-AVX512DQ-LABEL: test_broadcast_4i32_8i32_chain:
1245; X64-AVX512DQ:       ## BB#0:
1246; X64-AVX512DQ-NEXT:    vmovdqa64 (%rdi), %xmm0
1247; X64-AVX512DQ-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1248; X64-AVX512DQ-NEXT:    vmovaps %xmm1, (%rsi)
1249; X64-AVX512DQ-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1250; X64-AVX512DQ-NEXT:    retq
1251  %1 = load <4 x i32>, <4 x i32>* %p0
1252  store <4 x float> zeroinitializer, <4 x float>* %p1
1253  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
1254  ret <8 x i32> %2
1255}
1256
1257define <16 x i32> @test_broadcast_4i32_16i32_chain(<4 x i32>* %p0, <4 x float>* %p1) {
1258; X32-AVX-LABEL: test_broadcast_4i32_16i32_chain:
1259; X32-AVX:       ## BB#0:
1260; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
1261; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1262; X32-AVX-NEXT:    vmovaps (%ecx), %xmm0
1263; X32-AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1264; X32-AVX-NEXT:    vmovaps %xmm1, (%eax)
1265; X32-AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1266; X32-AVX-NEXT:    vmovaps %ymm0, %ymm1
1267; X32-AVX-NEXT:    retl
1268;
1269; X32-AVX512F-LABEL: test_broadcast_4i32_16i32_chain:
1270; X32-AVX512F:       ## BB#0:
1271; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
1272; X32-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1273; X32-AVX512F-NEXT:    vmovdqa64 (%ecx), %xmm0
1274; X32-AVX512F-NEXT:    vpxord %xmm1, %xmm1, %xmm1
1275; X32-AVX512F-NEXT:    vmovdqa32 %xmm1, (%eax)
1276; X32-AVX512F-NEXT:    vinserti32x4 $1, %xmm0, %zmm0, %zmm0
1277; X32-AVX512F-NEXT:    vinserti64x4 $1, %ymm0, %zmm0, %zmm0
1278; X32-AVX512F-NEXT:    retl
1279;
1280; X32-AVX512BW-LABEL: test_broadcast_4i32_16i32_chain:
1281; X32-AVX512BW:       ## BB#0:
1282; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %eax
1283; X32-AVX512BW-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1284; X32-AVX512BW-NEXT:    vmovdqa64 (%ecx), %xmm0
1285; X32-AVX512BW-NEXT:    vpxord %xmm1, %xmm1, %xmm1
1286; X32-AVX512BW-NEXT:    vmovdqa32 %xmm1, (%eax)
1287; X32-AVX512BW-NEXT:    vinserti32x4 $1, %xmm0, %zmm0, %zmm0
1288; X32-AVX512BW-NEXT:    vinserti64x4 $1, %ymm0, %zmm0, %zmm0
1289; X32-AVX512BW-NEXT:    retl
1290;
1291; X32-AVX512DQ-LABEL: test_broadcast_4i32_16i32_chain:
1292; X32-AVX512DQ:       ## BB#0:
1293; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %eax
1294; X32-AVX512DQ-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1295; X32-AVX512DQ-NEXT:    vmovdqa64 (%ecx), %xmm0
1296; X32-AVX512DQ-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1297; X32-AVX512DQ-NEXT:    vmovaps %xmm1, (%eax)
1298; X32-AVX512DQ-NEXT:    vinserti32x4 $1, %xmm0, %zmm0, %zmm0
1299; X32-AVX512DQ-NEXT:    vinserti32x8 $1, %ymm0, %zmm0, %zmm0
1300; X32-AVX512DQ-NEXT:    retl
1301;
1302; X64-AVX-LABEL: test_broadcast_4i32_16i32_chain:
1303; X64-AVX:       ## BB#0:
1304; X64-AVX-NEXT:    vmovaps (%rdi), %xmm0
1305; X64-AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1306; X64-AVX-NEXT:    vmovaps %xmm1, (%rsi)
1307; X64-AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1308; X64-AVX-NEXT:    vmovaps %ymm0, %ymm1
1309; X64-AVX-NEXT:    retq
1310;
1311; X64-AVX512F-LABEL: test_broadcast_4i32_16i32_chain:
1312; X64-AVX512F:       ## BB#0:
1313; X64-AVX512F-NEXT:    vmovdqa64 (%rdi), %xmm0
1314; X64-AVX512F-NEXT:    vpxord %xmm1, %xmm1, %xmm1
1315; X64-AVX512F-NEXT:    vmovdqa32 %xmm1, (%rsi)
1316; X64-AVX512F-NEXT:    vinserti32x4 $1, %xmm0, %zmm0, %zmm0
1317; X64-AVX512F-NEXT:    vinserti64x4 $1, %ymm0, %zmm0, %zmm0
1318; X64-AVX512F-NEXT:    retq
1319;
1320; X64-AVX512BW-LABEL: test_broadcast_4i32_16i32_chain:
1321; X64-AVX512BW:       ## BB#0:
1322; X64-AVX512BW-NEXT:    vmovdqa64 (%rdi), %xmm0
1323; X64-AVX512BW-NEXT:    vpxord %xmm1, %xmm1, %xmm1
1324; X64-AVX512BW-NEXT:    vmovdqa32 %xmm1, (%rsi)
1325; X64-AVX512BW-NEXT:    vinserti32x4 $1, %xmm0, %zmm0, %zmm0
1326; X64-AVX512BW-NEXT:    vinserti64x4 $1, %ymm0, %zmm0, %zmm0
1327; X64-AVX512BW-NEXT:    retq
1328;
1329; X64-AVX512DQ-LABEL: test_broadcast_4i32_16i32_chain:
1330; X64-AVX512DQ:       ## BB#0:
1331; X64-AVX512DQ-NEXT:    vmovdqa64 (%rdi), %xmm0
1332; X64-AVX512DQ-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1333; X64-AVX512DQ-NEXT:    vmovaps %xmm1, (%rsi)
1334; X64-AVX512DQ-NEXT:    vinserti32x4 $1, %xmm0, %zmm0, %zmm0
1335; X64-AVX512DQ-NEXT:    vinserti32x8 $1, %ymm0, %zmm0, %zmm0
1336; X64-AVX512DQ-NEXT:    retq
1337  %1 = load <4 x i32>, <4 x i32>* %p0
1338  store <4 x float> zeroinitializer, <4 x float>* %p1
1339  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
1340  ret <16 x i32> %2
1341}
1342
1343;
1344; subvector Load with multiple uses + broadcast
1345; Fallback to the broadcast should be done
1346;
1347
1348@ga4 = global <4 x i64> zeroinitializer, align 8
1349@gb4 = global <8 x i64> zeroinitializer, align 8
1350
1351define void @fallback_broadcast_v4i64_to_v8i64(<4 x i64> %a, <8 x i64> %b) {
1352; X32-AVX512-LABEL: fallback_broadcast_v4i64_to_v8i64:
1353; X32-AVX512:       ## BB#0: ## %entry
1354; X32-AVX512-NEXT:    vpaddq LCPI26_0, %ymm0, %ymm0
1355; X32-AVX512-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [1,0,2,0,3,0,4,0,1,0,2,0,3,0,4,0]
1356; X32-AVX512-NEXT:    vpaddq %zmm2, %zmm1, %zmm1
1357; X32-AVX512-NEXT:    vpandq %zmm2, %zmm1, %zmm1
1358; X32-AVX512-NEXT:    vmovdqu64 %ymm0, _ga4
1359; X32-AVX512-NEXT:    vmovdqu64 %zmm1, _gb4
1360; X32-AVX512-NEXT:    retl
1361;
1362; X64-AVX512-LABEL: fallback_broadcast_v4i64_to_v8i64:
1363; X64-AVX512:       ## BB#0: ## %entry
1364; X64-AVX512-NEXT:    vmovdqa64 {{.*#+}} ymm2 = [1,2,3,4]
1365; X64-AVX512-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
1366; X64-AVX512-NEXT:    vinserti64x4 $1, %ymm2, %zmm2, %zmm2
1367; X64-AVX512-NEXT:    vpaddq %zmm2, %zmm1, %zmm1
1368; X64-AVX512-NEXT:    vpandq %zmm2, %zmm1, %zmm1
1369; X64-AVX512-NEXT:    vmovdqu64 %ymm0, {{.*}}(%rip)
1370; X64-AVX512-NEXT:    vmovdqu64 %zmm1, {{.*}}(%rip)
1371; X64-AVX512-NEXT:    retq
1372entry:
1373  %0 = add <4 x i64> %a, <i64 1, i64 2, i64 3, i64 4>
1374  %1 = add <8 x i64> %b, <i64 1, i64 2, i64 3, i64 4, i64 1, i64 2, i64 3, i64 4>
1375  %2 = and <8 x i64> %1, <i64 1, i64 2, i64 3, i64 4, i64 1, i64 2, i64 3, i64 4>
1376  store <4 x i64> %0, <4 x i64>* @ga4, align 8
1377  store <8 x i64> %2, <8 x i64>* @gb4, align 8
1378  ret void
1379}
1380
1381
1382@ga2 = global <4 x double> zeroinitializer, align 8
1383@gb2 = global <8 x double> zeroinitializer, align 8
1384
1385define void @fallback_broadcast_v4f64_to_v8f64(<4 x double> %a, <8 x double> %b) {
1386; X32-AVX512-LABEL: fallback_broadcast_v4f64_to_v8f64:
1387; X32-AVX512:       ## BB#0: ## %entry
1388; X32-AVX512-NEXT:    vmovapd {{.*#+}} ymm2 = [1.000000e+00,2.000000e+00,3.000000e+00,4.000000e+00]
1389; X32-AVX512-NEXT:    vaddpd %ymm2, %ymm0, %ymm0
1390; X32-AVX512-NEXT:    vinsertf64x4 $1, %ymm2, %zmm2, %zmm2
1391; X32-AVX512-NEXT:    vaddpd %zmm2, %zmm1, %zmm1
1392; X32-AVX512-NEXT:    vdivpd %zmm2, %zmm1, %zmm1
1393; X32-AVX512-NEXT:    vmovupd %ymm0, _ga2
1394; X32-AVX512-NEXT:    vmovupd %zmm1, _gb2
1395; X32-AVX512-NEXT:    retl
1396;
1397; X64-AVX512-LABEL: fallback_broadcast_v4f64_to_v8f64:
1398; X64-AVX512:       ## BB#0: ## %entry
1399; X64-AVX512-NEXT:    vmovapd {{.*#+}} ymm2 = [1.000000e+00,2.000000e+00,3.000000e+00,4.000000e+00]
1400; X64-AVX512-NEXT:    vaddpd %ymm2, %ymm0, %ymm0
1401; X64-AVX512-NEXT:    vinsertf64x4 $1, %ymm2, %zmm2, %zmm2
1402; X64-AVX512-NEXT:    vaddpd %zmm2, %zmm1, %zmm1
1403; X64-AVX512-NEXT:    vdivpd %zmm2, %zmm1, %zmm1
1404; X64-AVX512-NEXT:    vmovupd %ymm0, {{.*}}(%rip)
1405; X64-AVX512-NEXT:    vmovupd %zmm1, {{.*}}(%rip)
1406; X64-AVX512-NEXT:    retq
1407entry:
1408  %0 = fadd <4 x double> %a, <double 1.0, double 2.0, double 3.0, double 4.0>
1409  %1 = fadd <8 x double> %b, <double 1.0, double 2.0, double 3.0, double 4.0, double 1.0, double 2.0, double 3.0, double 4.0>
1410  %2 = fdiv <8 x double> %1, <double 1.0, double 2.0, double 3.0, double 4.0, double 1.0, double 2.0, double 3.0, double 4.0>
1411  store <4 x double> %0, <4 x double>* @ga2, align 8
1412  store <8 x double> %2, <8 x double>* @gb2, align 8
1413  ret void
1414}
1415