1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -mtriple=x86_64-unknown -basicaa -slp-vectorizer -S | FileCheck %s --check-prefix=CHECK --check-prefix=SSE
3; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=corei7-avx -basicaa -slp-vectorizer -S | FileCheck %s --check-prefix=CHECK --check-prefix=AVX
4; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=core-avx2 -basicaa -slp-vectorizer -S | FileCheck %s --check-prefix=CHECK --check-prefix=AVX
5; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=skx -basicaa -slp-vectorizer -S | FileCheck %s --check-prefix=CHECK --check-prefix=AVX
6
7;
8; 128-bit Vectors
9;
10
11define <2 x double> @buildvector_add_2f64(<2 x double> %a, <2 x double> %b) {
12; CHECK-LABEL: @buildvector_add_2f64(
13; CHECK-NEXT:    [[TMP1:%.*]] = fadd <2 x double> %a, %b
14; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x double> [[TMP1]], i32 0
15; CHECK-NEXT:    [[R0:%.*]] = insertelement <2 x double> undef, double [[TMP2]], i32 0
16; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <2 x double> [[TMP1]], i32 1
17; CHECK-NEXT:    [[R1:%.*]] = insertelement <2 x double> [[R0]], double [[TMP3]], i32 1
18; CHECK-NEXT:    ret <2 x double> [[R1]]
19;
20  %a0 = extractelement <2 x double> %a, i32 0
21  %a1 = extractelement <2 x double> %a, i32 1
22  %b0 = extractelement <2 x double> %b, i32 0
23  %b1 = extractelement <2 x double> %b, i32 1
24  %c0 = fadd double %a0, %b0
25  %c1 = fadd double %a1, %b1
26  %r0 = insertelement <2 x double> undef, double %c0, i32 0
27  %r1 = insertelement <2 x double> %r0,   double %c1, i32 1
28  ret <2 x double> %r1
29}
30
31define <2 x double> @buildvector_sub_2f64(<2 x double> %a, <2 x double> %b) {
32; CHECK-LABEL: @buildvector_sub_2f64(
33; CHECK-NEXT:    [[TMP1:%.*]] = fsub <2 x double> %a, %b
34; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x double> [[TMP1]], i32 0
35; CHECK-NEXT:    [[R0:%.*]] = insertelement <2 x double> undef, double [[TMP2]], i32 0
36; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <2 x double> [[TMP1]], i32 1
37; CHECK-NEXT:    [[R1:%.*]] = insertelement <2 x double> [[R0]], double [[TMP3]], i32 1
38; CHECK-NEXT:    ret <2 x double> [[R1]]
39;
40  %a0 = extractelement <2 x double> %a, i32 0
41  %a1 = extractelement <2 x double> %a, i32 1
42  %b0 = extractelement <2 x double> %b, i32 0
43  %b1 = extractelement <2 x double> %b, i32 1
44  %c0 = fsub double %a0, %b0
45  %c1 = fsub double %a1, %b1
46  %r0 = insertelement <2 x double> undef, double %c0, i32 0
47  %r1 = insertelement <2 x double> %r0,   double %c1, i32 1
48  ret <2 x double> %r1
49}
50
51define <2 x double> @buildvector_mul_2f64(<2 x double> %a, <2 x double> %b) {
52; CHECK-LABEL: @buildvector_mul_2f64(
53; CHECK-NEXT:    [[TMP1:%.*]] = fmul <2 x double> %a, %b
54; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x double> [[TMP1]], i32 0
55; CHECK-NEXT:    [[R0:%.*]] = insertelement <2 x double> undef, double [[TMP2]], i32 0
56; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <2 x double> [[TMP1]], i32 1
57; CHECK-NEXT:    [[R1:%.*]] = insertelement <2 x double> [[R0]], double [[TMP3]], i32 1
58; CHECK-NEXT:    ret <2 x double> [[R1]]
59;
60  %a0 = extractelement <2 x double> %a, i32 0
61  %a1 = extractelement <2 x double> %a, i32 1
62  %b0 = extractelement <2 x double> %b, i32 0
63  %b1 = extractelement <2 x double> %b, i32 1
64  %c0 = fmul double %a0, %b0
65  %c1 = fmul double %a1, %b1
66  %r0 = insertelement <2 x double> undef, double %c0, i32 0
67  %r1 = insertelement <2 x double> %r0,   double %c1, i32 1
68  ret <2 x double> %r1
69}
70
71define <2 x double> @buildvector_div_2f64(<2 x double> %a, <2 x double> %b) {
72; CHECK-LABEL: @buildvector_div_2f64(
73; CHECK-NEXT:    [[TMP1:%.*]] = fdiv <2 x double> %a, %b
74; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x double> [[TMP1]], i32 0
75; CHECK-NEXT:    [[R0:%.*]] = insertelement <2 x double> undef, double [[TMP2]], i32 0
76; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <2 x double> [[TMP1]], i32 1
77; CHECK-NEXT:    [[R1:%.*]] = insertelement <2 x double> [[R0]], double [[TMP3]], i32 1
78; CHECK-NEXT:    ret <2 x double> [[R1]]
79;
80  %a0 = extractelement <2 x double> %a, i32 0
81  %a1 = extractelement <2 x double> %a, i32 1
82  %b0 = extractelement <2 x double> %b, i32 0
83  %b1 = extractelement <2 x double> %b, i32 1
84  %c0 = fdiv double %a0, %b0
85  %c1 = fdiv double %a1, %b1
86  %r0 = insertelement <2 x double> undef, double %c0, i32 0
87  %r1 = insertelement <2 x double> %r0,   double %c1, i32 1
88  ret <2 x double> %r1
89}
90
91define <4 x float> @buildvector_add_4f32(<4 x float> %a, <4 x float> %b) {
92; CHECK-LABEL: @buildvector_add_4f32(
93; CHECK-NEXT:    [[TMP1:%.*]] = fadd <4 x float> %a, %b
94; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x float> [[TMP1]], i32 0
95; CHECK-NEXT:    [[R0:%.*]] = insertelement <4 x float> undef, float [[TMP2]], i32 0
96; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <4 x float> [[TMP1]], i32 1
97; CHECK-NEXT:    [[R1:%.*]] = insertelement <4 x float> [[R0]], float [[TMP3]], i32 1
98; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <4 x float> [[TMP1]], i32 2
99; CHECK-NEXT:    [[R2:%.*]] = insertelement <4 x float> [[R1]], float [[TMP4]], i32 2
100; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <4 x float> [[TMP1]], i32 3
101; CHECK-NEXT:    [[R3:%.*]] = insertelement <4 x float> [[R2]], float [[TMP5]], i32 3
102; CHECK-NEXT:    ret <4 x float> [[R3]]
103;
104  %a0 = extractelement <4 x float> %a, i32 0
105  %a1 = extractelement <4 x float> %a, i32 1
106  %a2 = extractelement <4 x float> %a, i32 2
107  %a3 = extractelement <4 x float> %a, i32 3
108  %b0 = extractelement <4 x float> %b, i32 0
109  %b1 = extractelement <4 x float> %b, i32 1
110  %b2 = extractelement <4 x float> %b, i32 2
111  %b3 = extractelement <4 x float> %b, i32 3
112  %c0 = fadd float %a0, %b0
113  %c1 = fadd float %a1, %b1
114  %c2 = fadd float %a2, %b2
115  %c3 = fadd float %a3, %b3
116  %r0 = insertelement <4 x float> undef, float %c0, i32 0
117  %r1 = insertelement <4 x float> %r0,   float %c1, i32 1
118  %r2 = insertelement <4 x float> %r1,   float %c2, i32 2
119  %r3 = insertelement <4 x float> %r2,   float %c3, i32 3
120  ret <4 x float> %r3
121}
122
123define <4 x float> @buildvector_sub_4f32(<4 x float> %a, <4 x float> %b) {
124; CHECK-LABEL: @buildvector_sub_4f32(
125; CHECK-NEXT:    [[TMP1:%.*]] = fsub <4 x float> %a, %b
126; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x float> [[TMP1]], i32 0
127; CHECK-NEXT:    [[R0:%.*]] = insertelement <4 x float> undef, float [[TMP2]], i32 0
128; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <4 x float> [[TMP1]], i32 1
129; CHECK-NEXT:    [[R1:%.*]] = insertelement <4 x float> [[R0]], float [[TMP3]], i32 1
130; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <4 x float> [[TMP1]], i32 2
131; CHECK-NEXT:    [[R2:%.*]] = insertelement <4 x float> [[R1]], float [[TMP4]], i32 2
132; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <4 x float> [[TMP1]], i32 3
133; CHECK-NEXT:    [[R3:%.*]] = insertelement <4 x float> [[R2]], float [[TMP5]], i32 3
134; CHECK-NEXT:    ret <4 x float> [[R3]]
135;
136  %a0 = extractelement <4 x float> %a, i32 0
137  %a1 = extractelement <4 x float> %a, i32 1
138  %a2 = extractelement <4 x float> %a, i32 2
139  %a3 = extractelement <4 x float> %a, i32 3
140  %b0 = extractelement <4 x float> %b, i32 0
141  %b1 = extractelement <4 x float> %b, i32 1
142  %b2 = extractelement <4 x float> %b, i32 2
143  %b3 = extractelement <4 x float> %b, i32 3
144  %c0 = fsub float %a0, %b0
145  %c1 = fsub float %a1, %b1
146  %c2 = fsub float %a2, %b2
147  %c3 = fsub float %a3, %b3
148  %r0 = insertelement <4 x float> undef, float %c0, i32 0
149  %r1 = insertelement <4 x float> %r0,   float %c1, i32 1
150  %r2 = insertelement <4 x float> %r1,   float %c2, i32 2
151  %r3 = insertelement <4 x float> %r2,   float %c3, i32 3
152  ret <4 x float> %r3
153}
154
155define <4 x float> @buildvector_mul_4f32(<4 x float> %a, <4 x float> %b) {
156; CHECK-LABEL: @buildvector_mul_4f32(
157; CHECK-NEXT:    [[TMP1:%.*]] = fmul <4 x float> %a, %b
158; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x float> [[TMP1]], i32 0
159; CHECK-NEXT:    [[R0:%.*]] = insertelement <4 x float> undef, float [[TMP2]], i32 0
160; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <4 x float> [[TMP1]], i32 1
161; CHECK-NEXT:    [[R1:%.*]] = insertelement <4 x float> [[R0]], float [[TMP3]], i32 1
162; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <4 x float> [[TMP1]], i32 2
163; CHECK-NEXT:    [[R2:%.*]] = insertelement <4 x float> [[R1]], float [[TMP4]], i32 2
164; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <4 x float> [[TMP1]], i32 3
165; CHECK-NEXT:    [[R3:%.*]] = insertelement <4 x float> [[R2]], float [[TMP5]], i32 3
166; CHECK-NEXT:    ret <4 x float> [[R3]]
167;
168  %a0 = extractelement <4 x float> %a, i32 0
169  %a1 = extractelement <4 x float> %a, i32 1
170  %a2 = extractelement <4 x float> %a, i32 2
171  %a3 = extractelement <4 x float> %a, i32 3
172  %b0 = extractelement <4 x float> %b, i32 0
173  %b1 = extractelement <4 x float> %b, i32 1
174  %b2 = extractelement <4 x float> %b, i32 2
175  %b3 = extractelement <4 x float> %b, i32 3
176  %c0 = fmul float %a0, %b0
177  %c1 = fmul float %a1, %b1
178  %c2 = fmul float %a2, %b2
179  %c3 = fmul float %a3, %b3
180  %r0 = insertelement <4 x float> undef, float %c0, i32 0
181  %r1 = insertelement <4 x float> %r0,   float %c1, i32 1
182  %r2 = insertelement <4 x float> %r1,   float %c2, i32 2
183  %r3 = insertelement <4 x float> %r2,   float %c3, i32 3
184  ret <4 x float> %r3
185}
186
187define <4 x float> @buildvector_div_4f32(<4 x float> %a, <4 x float> %b) {
188; CHECK-LABEL: @buildvector_div_4f32(
189; CHECK-NEXT:    [[TMP1:%.*]] = fdiv <4 x float> %a, %b
190; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x float> [[TMP1]], i32 0
191; CHECK-NEXT:    [[R0:%.*]] = insertelement <4 x float> undef, float [[TMP2]], i32 0
192; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <4 x float> [[TMP1]], i32 1
193; CHECK-NEXT:    [[R1:%.*]] = insertelement <4 x float> [[R0]], float [[TMP3]], i32 1
194; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <4 x float> [[TMP1]], i32 2
195; CHECK-NEXT:    [[R2:%.*]] = insertelement <4 x float> [[R1]], float [[TMP4]], i32 2
196; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <4 x float> [[TMP1]], i32 3
197; CHECK-NEXT:    [[R3:%.*]] = insertelement <4 x float> [[R2]], float [[TMP5]], i32 3
198; CHECK-NEXT:    ret <4 x float> [[R3]]
199;
200  %a0 = extractelement <4 x float> %a, i32 0
201  %a1 = extractelement <4 x float> %a, i32 1
202  %a2 = extractelement <4 x float> %a, i32 2
203  %a3 = extractelement <4 x float> %a, i32 3
204  %b0 = extractelement <4 x float> %b, i32 0
205  %b1 = extractelement <4 x float> %b, i32 1
206  %b2 = extractelement <4 x float> %b, i32 2
207  %b3 = extractelement <4 x float> %b, i32 3
208  %c0 = fdiv float %a0, %b0
209  %c1 = fdiv float %a1, %b1
210  %c2 = fdiv float %a2, %b2
211  %c3 = fdiv float %a3, %b3
212  %r0 = insertelement <4 x float> undef, float %c0, i32 0
213  %r1 = insertelement <4 x float> %r0,   float %c1, i32 1
214  %r2 = insertelement <4 x float> %r1,   float %c2, i32 2
215  %r3 = insertelement <4 x float> %r2,   float %c3, i32 3
216  ret <4 x float> %r3
217}
218
219;
220; 256-bit Vectors
221;
222
223define <4 x double> @buildvector_add_4f64(<4 x double> %a, <4 x double> %b) {
224; CHECK-LABEL: @buildvector_add_4f64(
225; CHECK-NEXT:    [[TMP1:%.*]] = fadd <4 x double> %a, %b
226; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x double> [[TMP1]], i32 0
227; CHECK-NEXT:    [[R0:%.*]] = insertelement <4 x double> undef, double [[TMP2]], i32 0
228; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <4 x double> [[TMP1]], i32 1
229; CHECK-NEXT:    [[R1:%.*]] = insertelement <4 x double> [[R0]], double [[TMP3]], i32 1
230; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <4 x double> [[TMP1]], i32 2
231; CHECK-NEXT:    [[R2:%.*]] = insertelement <4 x double> [[R1]], double [[TMP4]], i32 2
232; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <4 x double> [[TMP1]], i32 3
233; CHECK-NEXT:    [[R3:%.*]] = insertelement <4 x double> [[R2]], double [[TMP5]], i32 3
234; CHECK-NEXT:    ret <4 x double> [[R3]]
235;
236  %a0 = extractelement <4 x double> %a, i32 0
237  %a1 = extractelement <4 x double> %a, i32 1
238  %a2 = extractelement <4 x double> %a, i32 2
239  %a3 = extractelement <4 x double> %a, i32 3
240  %b0 = extractelement <4 x double> %b, i32 0
241  %b1 = extractelement <4 x double> %b, i32 1
242  %b2 = extractelement <4 x double> %b, i32 2
243  %b3 = extractelement <4 x double> %b, i32 3
244  %c0 = fadd double %a0, %b0
245  %c1 = fadd double %a1, %b1
246  %c2 = fadd double %a2, %b2
247  %c3 = fadd double %a3, %b3
248  %r0 = insertelement <4 x double> undef, double %c0, i32 0
249  %r1 = insertelement <4 x double> %r0,   double %c1, i32 1
250  %r2 = insertelement <4 x double> %r1,   double %c2, i32 2
251  %r3 = insertelement <4 x double> %r2,   double %c3, i32 3
252  ret <4 x double> %r3
253}
254
255define <4 x double> @buildvector_sub_4f64(<4 x double> %a, <4 x double> %b) {
256; CHECK-LABEL: @buildvector_sub_4f64(
257; CHECK-NEXT:    [[TMP1:%.*]] = fsub <4 x double> %a, %b
258; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x double> [[TMP1]], i32 0
259; CHECK-NEXT:    [[R0:%.*]] = insertelement <4 x double> undef, double [[TMP2]], i32 0
260; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <4 x double> [[TMP1]], i32 1
261; CHECK-NEXT:    [[R1:%.*]] = insertelement <4 x double> [[R0]], double [[TMP3]], i32 1
262; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <4 x double> [[TMP1]], i32 2
263; CHECK-NEXT:    [[R2:%.*]] = insertelement <4 x double> [[R1]], double [[TMP4]], i32 2
264; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <4 x double> [[TMP1]], i32 3
265; CHECK-NEXT:    [[R3:%.*]] = insertelement <4 x double> [[R2]], double [[TMP5]], i32 3
266; CHECK-NEXT:    ret <4 x double> [[R3]]
267;
268  %a0 = extractelement <4 x double> %a, i32 0
269  %a1 = extractelement <4 x double> %a, i32 1
270  %a2 = extractelement <4 x double> %a, i32 2
271  %a3 = extractelement <4 x double> %a, i32 3
272  %b0 = extractelement <4 x double> %b, i32 0
273  %b1 = extractelement <4 x double> %b, i32 1
274  %b2 = extractelement <4 x double> %b, i32 2
275  %b3 = extractelement <4 x double> %b, i32 3
276  %c0 = fsub double %a0, %b0
277  %c1 = fsub double %a1, %b1
278  %c2 = fsub double %a2, %b2
279  %c3 = fsub double %a3, %b3
280  %r0 = insertelement <4 x double> undef, double %c0, i32 0
281  %r1 = insertelement <4 x double> %r0,   double %c1, i32 1
282  %r2 = insertelement <4 x double> %r1,   double %c2, i32 2
283  %r3 = insertelement <4 x double> %r2,   double %c3, i32 3
284  ret <4 x double> %r3
285}
286
287define <4 x double> @buildvector_mul_4f64(<4 x double> %a, <4 x double> %b) {
288; CHECK-LABEL: @buildvector_mul_4f64(
289; CHECK-NEXT:    [[TMP1:%.*]] = fmul <4 x double> %a, %b
290; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x double> [[TMP1]], i32 0
291; CHECK-NEXT:    [[R0:%.*]] = insertelement <4 x double> undef, double [[TMP2]], i32 0
292; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <4 x double> [[TMP1]], i32 1
293; CHECK-NEXT:    [[R1:%.*]] = insertelement <4 x double> [[R0]], double [[TMP3]], i32 1
294; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <4 x double> [[TMP1]], i32 2
295; CHECK-NEXT:    [[R2:%.*]] = insertelement <4 x double> [[R1]], double [[TMP4]], i32 2
296; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <4 x double> [[TMP1]], i32 3
297; CHECK-NEXT:    [[R3:%.*]] = insertelement <4 x double> [[R2]], double [[TMP5]], i32 3
298; CHECK-NEXT:    ret <4 x double> [[R3]]
299;
300  %a0 = extractelement <4 x double> %a, i32 0
301  %a1 = extractelement <4 x double> %a, i32 1
302  %a2 = extractelement <4 x double> %a, i32 2
303  %a3 = extractelement <4 x double> %a, i32 3
304  %b0 = extractelement <4 x double> %b, i32 0
305  %b1 = extractelement <4 x double> %b, i32 1
306  %b2 = extractelement <4 x double> %b, i32 2
307  %b3 = extractelement <4 x double> %b, i32 3
308  %c0 = fmul double %a0, %b0
309  %c1 = fmul double %a1, %b1
310  %c2 = fmul double %a2, %b2
311  %c3 = fmul double %a3, %b3
312  %r0 = insertelement <4 x double> undef, double %c0, i32 0
313  %r1 = insertelement <4 x double> %r0,   double %c1, i32 1
314  %r2 = insertelement <4 x double> %r1,   double %c2, i32 2
315  %r3 = insertelement <4 x double> %r2,   double %c3, i32 3
316  ret <4 x double> %r3
317}
318
319define <4 x double> @buildvector_div_4f64(<4 x double> %a, <4 x double> %b) {
320; CHECK-LABEL: @buildvector_div_4f64(
321; CHECK-NEXT:    [[TMP1:%.*]] = fdiv <4 x double> %a, %b
322; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x double> [[TMP1]], i32 0
323; CHECK-NEXT:    [[R0:%.*]] = insertelement <4 x double> undef, double [[TMP2]], i32 0
324; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <4 x double> [[TMP1]], i32 1
325; CHECK-NEXT:    [[R1:%.*]] = insertelement <4 x double> [[R0]], double [[TMP3]], i32 1
326; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <4 x double> [[TMP1]], i32 2
327; CHECK-NEXT:    [[R2:%.*]] = insertelement <4 x double> [[R1]], double [[TMP4]], i32 2
328; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <4 x double> [[TMP1]], i32 3
329; CHECK-NEXT:    [[R3:%.*]] = insertelement <4 x double> [[R2]], double [[TMP5]], i32 3
330; CHECK-NEXT:    ret <4 x double> [[R3]]
331;
332  %a0 = extractelement <4 x double> %a, i32 0
333  %a1 = extractelement <4 x double> %a, i32 1
334  %a2 = extractelement <4 x double> %a, i32 2
335  %a3 = extractelement <4 x double> %a, i32 3
336  %b0 = extractelement <4 x double> %b, i32 0
337  %b1 = extractelement <4 x double> %b, i32 1
338  %b2 = extractelement <4 x double> %b, i32 2
339  %b3 = extractelement <4 x double> %b, i32 3
340  %c0 = fdiv double %a0, %b0
341  %c1 = fdiv double %a1, %b1
342  %c2 = fdiv double %a2, %b2
343  %c3 = fdiv double %a3, %b3
344  %r0 = insertelement <4 x double> undef, double %c0, i32 0
345  %r1 = insertelement <4 x double> %r0,   double %c1, i32 1
346  %r2 = insertelement <4 x double> %r1,   double %c2, i32 2
347  %r3 = insertelement <4 x double> %r2,   double %c3, i32 3
348  ret <4 x double> %r3
349}
350
351define <8 x float> @buildvector_add_8f32(<8 x float> %a, <8 x float> %b) {
352; CHECK-LABEL: @buildvector_add_8f32(
353; CHECK-NEXT:    [[TMP1:%.*]] = fadd <8 x float> %a, %b
354; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <8 x float> [[TMP1]], i32 0
355; CHECK-NEXT:    [[R0:%.*]] = insertelement <8 x float> undef, float [[TMP2]], i32 0
356; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <8 x float> [[TMP1]], i32 1
357; CHECK-NEXT:    [[R1:%.*]] = insertelement <8 x float> [[R0]], float [[TMP3]], i32 1
358; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <8 x float> [[TMP1]], i32 2
359; CHECK-NEXT:    [[R2:%.*]] = insertelement <8 x float> [[R1]], float [[TMP4]], i32 2
360; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <8 x float> [[TMP1]], i32 3
361; CHECK-NEXT:    [[R3:%.*]] = insertelement <8 x float> [[R2]], float [[TMP5]], i32 3
362; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <8 x float> [[TMP1]], i32 4
363; CHECK-NEXT:    [[R4:%.*]] = insertelement <8 x float> [[R3]], float [[TMP6]], i32 4
364; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <8 x float> [[TMP1]], i32 5
365; CHECK-NEXT:    [[R5:%.*]] = insertelement <8 x float> [[R4]], float [[TMP7]], i32 5
366; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <8 x float> [[TMP1]], i32 6
367; CHECK-NEXT:    [[R6:%.*]] = insertelement <8 x float> [[R5]], float [[TMP8]], i32 6
368; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <8 x float> [[TMP1]], i32 7
369; CHECK-NEXT:    [[R7:%.*]] = insertelement <8 x float> [[R6]], float [[TMP9]], i32 7
370; CHECK-NEXT:    ret <8 x float> [[R7]]
371;
372  %a0 = extractelement <8 x float> %a, i32 0
373  %a1 = extractelement <8 x float> %a, i32 1
374  %a2 = extractelement <8 x float> %a, i32 2
375  %a3 = extractelement <8 x float> %a, i32 3
376  %a4 = extractelement <8 x float> %a, i32 4
377  %a5 = extractelement <8 x float> %a, i32 5
378  %a6 = extractelement <8 x float> %a, i32 6
379  %a7 = extractelement <8 x float> %a, i32 7
380  %b0 = extractelement <8 x float> %b, i32 0
381  %b1 = extractelement <8 x float> %b, i32 1
382  %b2 = extractelement <8 x float> %b, i32 2
383  %b3 = extractelement <8 x float> %b, i32 3
384  %b4 = extractelement <8 x float> %b, i32 4
385  %b5 = extractelement <8 x float> %b, i32 5
386  %b6 = extractelement <8 x float> %b, i32 6
387  %b7 = extractelement <8 x float> %b, i32 7
388  %c0 = fadd float %a0, %b0
389  %c1 = fadd float %a1, %b1
390  %c2 = fadd float %a2, %b2
391  %c3 = fadd float %a3, %b3
392  %c4 = fadd float %a4, %b4
393  %c5 = fadd float %a5, %b5
394  %c6 = fadd float %a6, %b6
395  %c7 = fadd float %a7, %b7
396  %r0 = insertelement <8 x float> undef, float %c0, i32 0
397  %r1 = insertelement <8 x float> %r0,   float %c1, i32 1
398  %r2 = insertelement <8 x float> %r1,   float %c2, i32 2
399  %r3 = insertelement <8 x float> %r2,   float %c3, i32 3
400  %r4 = insertelement <8 x float> %r3,   float %c4, i32 4
401  %r5 = insertelement <8 x float> %r4,   float %c5, i32 5
402  %r6 = insertelement <8 x float> %r5,   float %c6, i32 6
403  %r7 = insertelement <8 x float> %r6,   float %c7, i32 7
404  ret <8 x float> %r7
405}
406
407define <8 x float> @buildvector_sub_8f32(<8 x float> %a, <8 x float> %b) {
408; CHECK-LABEL: @buildvector_sub_8f32(
409; CHECK-NEXT:    [[TMP1:%.*]] = fsub <8 x float> %a, %b
410; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <8 x float> [[TMP1]], i32 0
411; CHECK-NEXT:    [[R0:%.*]] = insertelement <8 x float> undef, float [[TMP2]], i32 0
412; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <8 x float> [[TMP1]], i32 1
413; CHECK-NEXT:    [[R1:%.*]] = insertelement <8 x float> [[R0]], float [[TMP3]], i32 1
414; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <8 x float> [[TMP1]], i32 2
415; CHECK-NEXT:    [[R2:%.*]] = insertelement <8 x float> [[R1]], float [[TMP4]], i32 2
416; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <8 x float> [[TMP1]], i32 3
417; CHECK-NEXT:    [[R3:%.*]] = insertelement <8 x float> [[R2]], float [[TMP5]], i32 3
418; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <8 x float> [[TMP1]], i32 4
419; CHECK-NEXT:    [[R4:%.*]] = insertelement <8 x float> [[R3]], float [[TMP6]], i32 4
420; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <8 x float> [[TMP1]], i32 5
421; CHECK-NEXT:    [[R5:%.*]] = insertelement <8 x float> [[R4]], float [[TMP7]], i32 5
422; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <8 x float> [[TMP1]], i32 6
423; CHECK-NEXT:    [[R6:%.*]] = insertelement <8 x float> [[R5]], float [[TMP8]], i32 6
424; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <8 x float> [[TMP1]], i32 7
425; CHECK-NEXT:    [[R7:%.*]] = insertelement <8 x float> [[R6]], float [[TMP9]], i32 7
426; CHECK-NEXT:    ret <8 x float> [[R7]]
427;
428  %a0 = extractelement <8 x float> %a, i32 0
429  %a1 = extractelement <8 x float> %a, i32 1
430  %a2 = extractelement <8 x float> %a, i32 2
431  %a3 = extractelement <8 x float> %a, i32 3
432  %a4 = extractelement <8 x float> %a, i32 4
433  %a5 = extractelement <8 x float> %a, i32 5
434  %a6 = extractelement <8 x float> %a, i32 6
435  %a7 = extractelement <8 x float> %a, i32 7
436  %b0 = extractelement <8 x float> %b, i32 0
437  %b1 = extractelement <8 x float> %b, i32 1
438  %b2 = extractelement <8 x float> %b, i32 2
439  %b3 = extractelement <8 x float> %b, i32 3
440  %b4 = extractelement <8 x float> %b, i32 4
441  %b5 = extractelement <8 x float> %b, i32 5
442  %b6 = extractelement <8 x float> %b, i32 6
443  %b7 = extractelement <8 x float> %b, i32 7
444  %c0 = fsub float %a0, %b0
445  %c1 = fsub float %a1, %b1
446  %c2 = fsub float %a2, %b2
447  %c3 = fsub float %a3, %b3
448  %c4 = fsub float %a4, %b4
449  %c5 = fsub float %a5, %b5
450  %c6 = fsub float %a6, %b6
451  %c7 = fsub float %a7, %b7
452  %r0 = insertelement <8 x float> undef, float %c0, i32 0
453  %r1 = insertelement <8 x float> %r0,   float %c1, i32 1
454  %r2 = insertelement <8 x float> %r1,   float %c2, i32 2
455  %r3 = insertelement <8 x float> %r2,   float %c3, i32 3
456  %r4 = insertelement <8 x float> %r3,   float %c4, i32 4
457  %r5 = insertelement <8 x float> %r4,   float %c5, i32 5
458  %r6 = insertelement <8 x float> %r5,   float %c6, i32 6
459  %r7 = insertelement <8 x float> %r6,   float %c7, i32 7
460  ret <8 x float> %r7
461}
462
463define <8 x float> @buildvector_mul_8f32(<8 x float> %a, <8 x float> %b) {
464; CHECK-LABEL: @buildvector_mul_8f32(
465; CHECK-NEXT:    [[TMP1:%.*]] = fmul <8 x float> %a, %b
466; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <8 x float> [[TMP1]], i32 0
467; CHECK-NEXT:    [[R0:%.*]] = insertelement <8 x float> undef, float [[TMP2]], i32 0
468; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <8 x float> [[TMP1]], i32 1
469; CHECK-NEXT:    [[R1:%.*]] = insertelement <8 x float> [[R0]], float [[TMP3]], i32 1
470; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <8 x float> [[TMP1]], i32 2
471; CHECK-NEXT:    [[R2:%.*]] = insertelement <8 x float> [[R1]], float [[TMP4]], i32 2
472; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <8 x float> [[TMP1]], i32 3
473; CHECK-NEXT:    [[R3:%.*]] = insertelement <8 x float> [[R2]], float [[TMP5]], i32 3
474; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <8 x float> [[TMP1]], i32 4
475; CHECK-NEXT:    [[R4:%.*]] = insertelement <8 x float> [[R3]], float [[TMP6]], i32 4
476; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <8 x float> [[TMP1]], i32 5
477; CHECK-NEXT:    [[R5:%.*]] = insertelement <8 x float> [[R4]], float [[TMP7]], i32 5
478; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <8 x float> [[TMP1]], i32 6
479; CHECK-NEXT:    [[R6:%.*]] = insertelement <8 x float> [[R5]], float [[TMP8]], i32 6
480; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <8 x float> [[TMP1]], i32 7
481; CHECK-NEXT:    [[R7:%.*]] = insertelement <8 x float> [[R6]], float [[TMP9]], i32 7
482; CHECK-NEXT:    ret <8 x float> [[R7]]
483;
484  %a0 = extractelement <8 x float> %a, i32 0
485  %a1 = extractelement <8 x float> %a, i32 1
486  %a2 = extractelement <8 x float> %a, i32 2
487  %a3 = extractelement <8 x float> %a, i32 3
488  %a4 = extractelement <8 x float> %a, i32 4
489  %a5 = extractelement <8 x float> %a, i32 5
490  %a6 = extractelement <8 x float> %a, i32 6
491  %a7 = extractelement <8 x float> %a, i32 7
492  %b0 = extractelement <8 x float> %b, i32 0
493  %b1 = extractelement <8 x float> %b, i32 1
494  %b2 = extractelement <8 x float> %b, i32 2
495  %b3 = extractelement <8 x float> %b, i32 3
496  %b4 = extractelement <8 x float> %b, i32 4
497  %b5 = extractelement <8 x float> %b, i32 5
498  %b6 = extractelement <8 x float> %b, i32 6
499  %b7 = extractelement <8 x float> %b, i32 7
500  %c0 = fmul float %a0, %b0
501  %c1 = fmul float %a1, %b1
502  %c2 = fmul float %a2, %b2
503  %c3 = fmul float %a3, %b3
504  %c4 = fmul float %a4, %b4
505  %c5 = fmul float %a5, %b5
506  %c6 = fmul float %a6, %b6
507  %c7 = fmul float %a7, %b7
508  %r0 = insertelement <8 x float> undef, float %c0, i32 0
509  %r1 = insertelement <8 x float> %r0,   float %c1, i32 1
510  %r2 = insertelement <8 x float> %r1,   float %c2, i32 2
511  %r3 = insertelement <8 x float> %r2,   float %c3, i32 3
512  %r4 = insertelement <8 x float> %r3,   float %c4, i32 4
513  %r5 = insertelement <8 x float> %r4,   float %c5, i32 5
514  %r6 = insertelement <8 x float> %r5,   float %c6, i32 6
515  %r7 = insertelement <8 x float> %r6,   float %c7, i32 7
516  ret <8 x float> %r7
517}
518
519define <8 x float> @buildvector_div_8f32(<8 x float> %a, <8 x float> %b) {
520; CHECK-LABEL: @buildvector_div_8f32(
521; CHECK-NEXT:    [[TMP1:%.*]] = fdiv <8 x float> %a, %b
522; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <8 x float> [[TMP1]], i32 0
523; CHECK-NEXT:    [[R0:%.*]] = insertelement <8 x float> undef, float [[TMP2]], i32 0
524; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <8 x float> [[TMP1]], i32 1
525; CHECK-NEXT:    [[R1:%.*]] = insertelement <8 x float> [[R0]], float [[TMP3]], i32 1
526; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <8 x float> [[TMP1]], i32 2
527; CHECK-NEXT:    [[R2:%.*]] = insertelement <8 x float> [[R1]], float [[TMP4]], i32 2
528; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <8 x float> [[TMP1]], i32 3
529; CHECK-NEXT:    [[R3:%.*]] = insertelement <8 x float> [[R2]], float [[TMP5]], i32 3
530; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <8 x float> [[TMP1]], i32 4
531; CHECK-NEXT:    [[R4:%.*]] = insertelement <8 x float> [[R3]], float [[TMP6]], i32 4
532; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <8 x float> [[TMP1]], i32 5
533; CHECK-NEXT:    [[R5:%.*]] = insertelement <8 x float> [[R4]], float [[TMP7]], i32 5
534; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <8 x float> [[TMP1]], i32 6
535; CHECK-NEXT:    [[R6:%.*]] = insertelement <8 x float> [[R5]], float [[TMP8]], i32 6
536; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <8 x float> [[TMP1]], i32 7
537; CHECK-NEXT:    [[R7:%.*]] = insertelement <8 x float> [[R6]], float [[TMP9]], i32 7
538; CHECK-NEXT:    ret <8 x float> [[R7]]
539;
540  %a0 = extractelement <8 x float> %a, i32 0
541  %a1 = extractelement <8 x float> %a, i32 1
542  %a2 = extractelement <8 x float> %a, i32 2
543  %a3 = extractelement <8 x float> %a, i32 3
544  %a4 = extractelement <8 x float> %a, i32 4
545  %a5 = extractelement <8 x float> %a, i32 5
546  %a6 = extractelement <8 x float> %a, i32 6
547  %a7 = extractelement <8 x float> %a, i32 7
548  %b0 = extractelement <8 x float> %b, i32 0
549  %b1 = extractelement <8 x float> %b, i32 1
550  %b2 = extractelement <8 x float> %b, i32 2
551  %b3 = extractelement <8 x float> %b, i32 3
552  %b4 = extractelement <8 x float> %b, i32 4
553  %b5 = extractelement <8 x float> %b, i32 5
554  %b6 = extractelement <8 x float> %b, i32 6
555  %b7 = extractelement <8 x float> %b, i32 7
556  %c0 = fdiv float %a0, %b0
557  %c1 = fdiv float %a1, %b1
558  %c2 = fdiv float %a2, %b2
559  %c3 = fdiv float %a3, %b3
560  %c4 = fdiv float %a4, %b4
561  %c5 = fdiv float %a5, %b5
562  %c6 = fdiv float %a6, %b6
563  %c7 = fdiv float %a7, %b7
564  %r0 = insertelement <8 x float> undef, float %c0, i32 0
565  %r1 = insertelement <8 x float> %r0,   float %c1, i32 1
566  %r2 = insertelement <8 x float> %r1,   float %c2, i32 2
567  %r3 = insertelement <8 x float> %r2,   float %c3, i32 3
568  %r4 = insertelement <8 x float> %r3,   float %c4, i32 4
569  %r5 = insertelement <8 x float> %r4,   float %c5, i32 5
570  %r6 = insertelement <8 x float> %r5,   float %c6, i32 6
571  %r7 = insertelement <8 x float> %r6,   float %c7, i32 7
572  ret <8 x float> %r7
573}
574
575;
576; 512-bit Vectors
577;
578
579define <8 x double> @buildvector_add_8f64(<8 x double> %a, <8 x double> %b) {
580; CHECK-LABEL: @buildvector_add_8f64(
581; CHECK-NEXT:    [[TMP1:%.*]] = fadd <8 x double> %a, %b
582; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <8 x double> [[TMP1]], i32 0
583; CHECK-NEXT:    [[R0:%.*]] = insertelement <8 x double> undef, double [[TMP2]], i32 0
584; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <8 x double> [[TMP1]], i32 1
585; CHECK-NEXT:    [[R1:%.*]] = insertelement <8 x double> [[R0]], double [[TMP3]], i32 1
586; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <8 x double> [[TMP1]], i32 2
587; CHECK-NEXT:    [[R2:%.*]] = insertelement <8 x double> [[R1]], double [[TMP4]], i32 2
588; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <8 x double> [[TMP1]], i32 3
589; CHECK-NEXT:    [[R3:%.*]] = insertelement <8 x double> [[R2]], double [[TMP5]], i32 3
590; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <8 x double> [[TMP1]], i32 4
591; CHECK-NEXT:    [[R4:%.*]] = insertelement <8 x double> [[R3]], double [[TMP6]], i32 4
592; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <8 x double> [[TMP1]], i32 5
593; CHECK-NEXT:    [[R5:%.*]] = insertelement <8 x double> [[R4]], double [[TMP7]], i32 5
594; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <8 x double> [[TMP1]], i32 6
595; CHECK-NEXT:    [[R6:%.*]] = insertelement <8 x double> [[R5]], double [[TMP8]], i32 6
596; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <8 x double> [[TMP1]], i32 7
597; CHECK-NEXT:    [[R7:%.*]] = insertelement <8 x double> [[R6]], double [[TMP9]], i32 7
598; CHECK-NEXT:    ret <8 x double> [[R7]]
599;
600  %a0 = extractelement <8 x double> %a, i32 0
601  %a1 = extractelement <8 x double> %a, i32 1
602  %a2 = extractelement <8 x double> %a, i32 2
603  %a3 = extractelement <8 x double> %a, i32 3
604  %a4 = extractelement <8 x double> %a, i32 4
605  %a5 = extractelement <8 x double> %a, i32 5
606  %a6 = extractelement <8 x double> %a, i32 6
607  %a7 = extractelement <8 x double> %a, i32 7
608  %b0 = extractelement <8 x double> %b, i32 0
609  %b1 = extractelement <8 x double> %b, i32 1
610  %b2 = extractelement <8 x double> %b, i32 2
611  %b3 = extractelement <8 x double> %b, i32 3
612  %b4 = extractelement <8 x double> %b, i32 4
613  %b5 = extractelement <8 x double> %b, i32 5
614  %b6 = extractelement <8 x double> %b, i32 6
615  %b7 = extractelement <8 x double> %b, i32 7
616  %c0 = fadd double %a0, %b0
617  %c1 = fadd double %a1, %b1
618  %c2 = fadd double %a2, %b2
619  %c3 = fadd double %a3, %b3
620  %c4 = fadd double %a4, %b4
621  %c5 = fadd double %a5, %b5
622  %c6 = fadd double %a6, %b6
623  %c7 = fadd double %a7, %b7
624  %r0 = insertelement <8 x double> undef, double %c0, i32 0
625  %r1 = insertelement <8 x double> %r0,   double %c1, i32 1
626  %r2 = insertelement <8 x double> %r1,   double %c2, i32 2
627  %r3 = insertelement <8 x double> %r2,   double %c3, i32 3
628  %r4 = insertelement <8 x double> %r3,   double %c4, i32 4
629  %r5 = insertelement <8 x double> %r4,   double %c5, i32 5
630  %r6 = insertelement <8 x double> %r5,   double %c6, i32 6
631  %r7 = insertelement <8 x double> %r6,   double %c7, i32 7
632  ret <8 x double> %r7
633}
634
635define <8 x double> @buildvector_sub_8f64(<8 x double> %a, <8 x double> %b) {
636; CHECK-LABEL: @buildvector_sub_8f64(
637; CHECK-NEXT:    [[TMP1:%.*]] = fsub <8 x double> %a, %b
638; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <8 x double> [[TMP1]], i32 0
639; CHECK-NEXT:    [[R0:%.*]] = insertelement <8 x double> undef, double [[TMP2]], i32 0
640; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <8 x double> [[TMP1]], i32 1
641; CHECK-NEXT:    [[R1:%.*]] = insertelement <8 x double> [[R0]], double [[TMP3]], i32 1
642; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <8 x double> [[TMP1]], i32 2
643; CHECK-NEXT:    [[R2:%.*]] = insertelement <8 x double> [[R1]], double [[TMP4]], i32 2
644; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <8 x double> [[TMP1]], i32 3
645; CHECK-NEXT:    [[R3:%.*]] = insertelement <8 x double> [[R2]], double [[TMP5]], i32 3
646; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <8 x double> [[TMP1]], i32 4
647; CHECK-NEXT:    [[R4:%.*]] = insertelement <8 x double> [[R3]], double [[TMP6]], i32 4
648; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <8 x double> [[TMP1]], i32 5
649; CHECK-NEXT:    [[R5:%.*]] = insertelement <8 x double> [[R4]], double [[TMP7]], i32 5
650; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <8 x double> [[TMP1]], i32 6
651; CHECK-NEXT:    [[R6:%.*]] = insertelement <8 x double> [[R5]], double [[TMP8]], i32 6
652; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <8 x double> [[TMP1]], i32 7
653; CHECK-NEXT:    [[R7:%.*]] = insertelement <8 x double> [[R6]], double [[TMP9]], i32 7
654; CHECK-NEXT:    ret <8 x double> [[R7]]
655;
656  %a0 = extractelement <8 x double> %a, i32 0
657  %a1 = extractelement <8 x double> %a, i32 1
658  %a2 = extractelement <8 x double> %a, i32 2
659  %a3 = extractelement <8 x double> %a, i32 3
660  %a4 = extractelement <8 x double> %a, i32 4
661  %a5 = extractelement <8 x double> %a, i32 5
662  %a6 = extractelement <8 x double> %a, i32 6
663  %a7 = extractelement <8 x double> %a, i32 7
664  %b0 = extractelement <8 x double> %b, i32 0
665  %b1 = extractelement <8 x double> %b, i32 1
666  %b2 = extractelement <8 x double> %b, i32 2
667  %b3 = extractelement <8 x double> %b, i32 3
668  %b4 = extractelement <8 x double> %b, i32 4
669  %b5 = extractelement <8 x double> %b, i32 5
670  %b6 = extractelement <8 x double> %b, i32 6
671  %b7 = extractelement <8 x double> %b, i32 7
672  %c0 = fsub double %a0, %b0
673  %c1 = fsub double %a1, %b1
674  %c2 = fsub double %a2, %b2
675  %c3 = fsub double %a3, %b3
676  %c4 = fsub double %a4, %b4
677  %c5 = fsub double %a5, %b5
678  %c6 = fsub double %a6, %b6
679  %c7 = fsub double %a7, %b7
680  %r0 = insertelement <8 x double> undef, double %c0, i32 0
681  %r1 = insertelement <8 x double> %r0,   double %c1, i32 1
682  %r2 = insertelement <8 x double> %r1,   double %c2, i32 2
683  %r3 = insertelement <8 x double> %r2,   double %c3, i32 3
684  %r4 = insertelement <8 x double> %r3,   double %c4, i32 4
685  %r5 = insertelement <8 x double> %r4,   double %c5, i32 5
686  %r6 = insertelement <8 x double> %r5,   double %c6, i32 6
687  %r7 = insertelement <8 x double> %r6,   double %c7, i32 7
688  ret <8 x double> %r7
689}
690
691define <8 x double> @buildvector_mul_8f64(<8 x double> %a, <8 x double> %b) {
692; CHECK-LABEL: @buildvector_mul_8f64(
693; CHECK-NEXT:    [[TMP1:%.*]] = fmul <8 x double> %a, %b
694; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <8 x double> [[TMP1]], i32 0
695; CHECK-NEXT:    [[R0:%.*]] = insertelement <8 x double> undef, double [[TMP2]], i32 0
696; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <8 x double> [[TMP1]], i32 1
697; CHECK-NEXT:    [[R1:%.*]] = insertelement <8 x double> [[R0]], double [[TMP3]], i32 1
698; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <8 x double> [[TMP1]], i32 2
699; CHECK-NEXT:    [[R2:%.*]] = insertelement <8 x double> [[R1]], double [[TMP4]], i32 2
700; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <8 x double> [[TMP1]], i32 3
701; CHECK-NEXT:    [[R3:%.*]] = insertelement <8 x double> [[R2]], double [[TMP5]], i32 3
702; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <8 x double> [[TMP1]], i32 4
703; CHECK-NEXT:    [[R4:%.*]] = insertelement <8 x double> [[R3]], double [[TMP6]], i32 4
704; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <8 x double> [[TMP1]], i32 5
705; CHECK-NEXT:    [[R5:%.*]] = insertelement <8 x double> [[R4]], double [[TMP7]], i32 5
706; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <8 x double> [[TMP1]], i32 6
707; CHECK-NEXT:    [[R6:%.*]] = insertelement <8 x double> [[R5]], double [[TMP8]], i32 6
708; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <8 x double> [[TMP1]], i32 7
709; CHECK-NEXT:    [[R7:%.*]] = insertelement <8 x double> [[R6]], double [[TMP9]], i32 7
710; CHECK-NEXT:    ret <8 x double> [[R7]]
711;
712  %a0 = extractelement <8 x double> %a, i32 0
713  %a1 = extractelement <8 x double> %a, i32 1
714  %a2 = extractelement <8 x double> %a, i32 2
715  %a3 = extractelement <8 x double> %a, i32 3
716  %a4 = extractelement <8 x double> %a, i32 4
717  %a5 = extractelement <8 x double> %a, i32 5
718  %a6 = extractelement <8 x double> %a, i32 6
719  %a7 = extractelement <8 x double> %a, i32 7
720  %b0 = extractelement <8 x double> %b, i32 0
721  %b1 = extractelement <8 x double> %b, i32 1
722  %b2 = extractelement <8 x double> %b, i32 2
723  %b3 = extractelement <8 x double> %b, i32 3
724  %b4 = extractelement <8 x double> %b, i32 4
725  %b5 = extractelement <8 x double> %b, i32 5
726  %b6 = extractelement <8 x double> %b, i32 6
727  %b7 = extractelement <8 x double> %b, i32 7
728  %c0 = fmul double %a0, %b0
729  %c1 = fmul double %a1, %b1
730  %c2 = fmul double %a2, %b2
731  %c3 = fmul double %a3, %b3
732  %c4 = fmul double %a4, %b4
733  %c5 = fmul double %a5, %b5
734  %c6 = fmul double %a6, %b6
735  %c7 = fmul double %a7, %b7
736  %r0 = insertelement <8 x double> undef, double %c0, i32 0
737  %r1 = insertelement <8 x double> %r0,   double %c1, i32 1
738  %r2 = insertelement <8 x double> %r1,   double %c2, i32 2
739  %r3 = insertelement <8 x double> %r2,   double %c3, i32 3
740  %r4 = insertelement <8 x double> %r3,   double %c4, i32 4
741  %r5 = insertelement <8 x double> %r4,   double %c5, i32 5
742  %r6 = insertelement <8 x double> %r5,   double %c6, i32 6
743  %r7 = insertelement <8 x double> %r6,   double %c7, i32 7
744  ret <8 x double> %r7
745}
746
747define <8 x double> @buildvector_div_8f64(<8 x double> %a, <8 x double> %b) {
748; CHECK-LABEL: @buildvector_div_8f64(
749; CHECK-NEXT:    [[TMP1:%.*]] = fdiv <8 x double> %a, %b
750; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <8 x double> [[TMP1]], i32 0
751; CHECK-NEXT:    [[R0:%.*]] = insertelement <8 x double> undef, double [[TMP2]], i32 0
752; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <8 x double> [[TMP1]], i32 1
753; CHECK-NEXT:    [[R1:%.*]] = insertelement <8 x double> [[R0]], double [[TMP3]], i32 1
754; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <8 x double> [[TMP1]], i32 2
755; CHECK-NEXT:    [[R2:%.*]] = insertelement <8 x double> [[R1]], double [[TMP4]], i32 2
756; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <8 x double> [[TMP1]], i32 3
757; CHECK-NEXT:    [[R3:%.*]] = insertelement <8 x double> [[R2]], double [[TMP5]], i32 3
758; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <8 x double> [[TMP1]], i32 4
759; CHECK-NEXT:    [[R4:%.*]] = insertelement <8 x double> [[R3]], double [[TMP6]], i32 4
760; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <8 x double> [[TMP1]], i32 5
761; CHECK-NEXT:    [[R5:%.*]] = insertelement <8 x double> [[R4]], double [[TMP7]], i32 5
762; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <8 x double> [[TMP1]], i32 6
763; CHECK-NEXT:    [[R6:%.*]] = insertelement <8 x double> [[R5]], double [[TMP8]], i32 6
764; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <8 x double> [[TMP1]], i32 7
765; CHECK-NEXT:    [[R7:%.*]] = insertelement <8 x double> [[R6]], double [[TMP9]], i32 7
766; CHECK-NEXT:    ret <8 x double> [[R7]]
767;
768  %a0 = extractelement <8 x double> %a, i32 0
769  %a1 = extractelement <8 x double> %a, i32 1
770  %a2 = extractelement <8 x double> %a, i32 2
771  %a3 = extractelement <8 x double> %a, i32 3
772  %a4 = extractelement <8 x double> %a, i32 4
773  %a5 = extractelement <8 x double> %a, i32 5
774  %a6 = extractelement <8 x double> %a, i32 6
775  %a7 = extractelement <8 x double> %a, i32 7
776  %b0 = extractelement <8 x double> %b, i32 0
777  %b1 = extractelement <8 x double> %b, i32 1
778  %b2 = extractelement <8 x double> %b, i32 2
779  %b3 = extractelement <8 x double> %b, i32 3
780  %b4 = extractelement <8 x double> %b, i32 4
781  %b5 = extractelement <8 x double> %b, i32 5
782  %b6 = extractelement <8 x double> %b, i32 6
783  %b7 = extractelement <8 x double> %b, i32 7
784  %c0 = fdiv double %a0, %b0
785  %c1 = fdiv double %a1, %b1
786  %c2 = fdiv double %a2, %b2
787  %c3 = fdiv double %a3, %b3
788  %c4 = fdiv double %a4, %b4
789  %c5 = fdiv double %a5, %b5
790  %c6 = fdiv double %a6, %b6
791  %c7 = fdiv double %a7, %b7
792  %r0 = insertelement <8 x double> undef, double %c0, i32 0
793  %r1 = insertelement <8 x double> %r0,   double %c1, i32 1
794  %r2 = insertelement <8 x double> %r1,   double %c2, i32 2
795  %r3 = insertelement <8 x double> %r2,   double %c3, i32 3
796  %r4 = insertelement <8 x double> %r3,   double %c4, i32 4
797  %r5 = insertelement <8 x double> %r4,   double %c5, i32 5
798  %r6 = insertelement <8 x double> %r5,   double %c6, i32 6
799  %r7 = insertelement <8 x double> %r6,   double %c7, i32 7
800  ret <8 x double> %r7
801}
802
803define <16 x float> @buildvector_add_16f32(<16 x float> %a, <16 x float> %b) {
804; CHECK-LABEL: @buildvector_add_16f32(
805; CHECK-NEXT:    [[TMP1:%.*]] = fadd <16 x float> %a, %b
806; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <16 x float> [[TMP1]], i32 0
807; CHECK-NEXT:    [[R0:%.*]] = insertelement <16 x float> undef, float [[TMP2]], i32 0
808; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <16 x float> [[TMP1]], i32 1
809; CHECK-NEXT:    [[R1:%.*]] = insertelement <16 x float> [[R0]], float [[TMP3]], i32 1
810; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <16 x float> [[TMP1]], i32 2
811; CHECK-NEXT:    [[R2:%.*]] = insertelement <16 x float> [[R1]], float [[TMP4]], i32 2
812; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <16 x float> [[TMP1]], i32 3
813; CHECK-NEXT:    [[R3:%.*]] = insertelement <16 x float> [[R2]], float [[TMP5]], i32 3
814; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <16 x float> [[TMP1]], i32 4
815; CHECK-NEXT:    [[R4:%.*]] = insertelement <16 x float> [[R3]], float [[TMP6]], i32 4
816; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <16 x float> [[TMP1]], i32 5
817; CHECK-NEXT:    [[R5:%.*]] = insertelement <16 x float> [[R4]], float [[TMP7]], i32 5
818; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <16 x float> [[TMP1]], i32 6
819; CHECK-NEXT:    [[R6:%.*]] = insertelement <16 x float> [[R5]], float [[TMP8]], i32 6
820; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <16 x float> [[TMP1]], i32 7
821; CHECK-NEXT:    [[R7:%.*]] = insertelement <16 x float> [[R6]], float [[TMP9]], i32 7
822; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <16 x float> [[TMP1]], i32 8
823; CHECK-NEXT:    [[R8:%.*]] = insertelement <16 x float> [[R7]], float [[TMP10]], i32 8
824; CHECK-NEXT:    [[TMP11:%.*]] = extractelement <16 x float> [[TMP1]], i32 9
825; CHECK-NEXT:    [[R9:%.*]] = insertelement <16 x float> [[R8]], float [[TMP11]], i32 9
826; CHECK-NEXT:    [[TMP12:%.*]] = extractelement <16 x float> [[TMP1]], i32 10
827; CHECK-NEXT:    [[R10:%.*]] = insertelement <16 x float> [[R9]], float [[TMP12]], i32 10
828; CHECK-NEXT:    [[TMP13:%.*]] = extractelement <16 x float> [[TMP1]], i32 11
829; CHECK-NEXT:    [[R11:%.*]] = insertelement <16 x float> [[R10]], float [[TMP13]], i32 11
830; CHECK-NEXT:    [[TMP14:%.*]] = extractelement <16 x float> [[TMP1]], i32 12
831; CHECK-NEXT:    [[R12:%.*]] = insertelement <16 x float> [[R11]], float [[TMP14]], i32 12
832; CHECK-NEXT:    [[TMP15:%.*]] = extractelement <16 x float> [[TMP1]], i32 13
833; CHECK-NEXT:    [[R13:%.*]] = insertelement <16 x float> [[R12]], float [[TMP15]], i32 13
834; CHECK-NEXT:    [[TMP16:%.*]] = extractelement <16 x float> [[TMP1]], i32 14
835; CHECK-NEXT:    [[R14:%.*]] = insertelement <16 x float> [[R13]], float [[TMP16]], i32 14
836; CHECK-NEXT:    [[TMP17:%.*]] = extractelement <16 x float> [[TMP1]], i32 15
837; CHECK-NEXT:    [[R15:%.*]] = insertelement <16 x float> [[R14]], float [[TMP17]], i32 15
838; CHECK-NEXT:    ret <16 x float> [[R15]]
839;
840  %a0  = extractelement <16 x float> %a, i32 0
841  %a1  = extractelement <16 x float> %a, i32 1
842  %a2  = extractelement <16 x float> %a, i32 2
843  %a3  = extractelement <16 x float> %a, i32 3
844  %a4  = extractelement <16 x float> %a, i32 4
845  %a5  = extractelement <16 x float> %a, i32 5
846  %a6  = extractelement <16 x float> %a, i32 6
847  %a7  = extractelement <16 x float> %a, i32 7
848  %a8  = extractelement <16 x float> %a, i32 8
849  %a9  = extractelement <16 x float> %a, i32 9
850  %a10 = extractelement <16 x float> %a, i32 10
851  %a11 = extractelement <16 x float> %a, i32 11
852  %a12 = extractelement <16 x float> %a, i32 12
853  %a13 = extractelement <16 x float> %a, i32 13
854  %a14 = extractelement <16 x float> %a, i32 14
855  %a15 = extractelement <16 x float> %a, i32 15
856  %b0  = extractelement <16 x float> %b, i32 0
857  %b1  = extractelement <16 x float> %b, i32 1
858  %b2  = extractelement <16 x float> %b, i32 2
859  %b3  = extractelement <16 x float> %b, i32 3
860  %b4  = extractelement <16 x float> %b, i32 4
861  %b5  = extractelement <16 x float> %b, i32 5
862  %b6  = extractelement <16 x float> %b, i32 6
863  %b7  = extractelement <16 x float> %b, i32 7
864  %b8  = extractelement <16 x float> %b, i32 8
865  %b9  = extractelement <16 x float> %b, i32 9
866  %b10 = extractelement <16 x float> %b, i32 10
867  %b11 = extractelement <16 x float> %b, i32 11
868  %b12 = extractelement <16 x float> %b, i32 12
869  %b13 = extractelement <16 x float> %b, i32 13
870  %b14 = extractelement <16 x float> %b, i32 14
871  %b15 = extractelement <16 x float> %b, i32 15
872  %c0  = fadd float %a0 , %b0
873  %c1  = fadd float %a1 , %b1
874  %c2  = fadd float %a2 , %b2
875  %c3  = fadd float %a3 , %b3
876  %c4  = fadd float %a4 , %b4
877  %c5  = fadd float %a5 , %b5
878  %c6  = fadd float %a6 , %b6
879  %c7  = fadd float %a7 , %b7
880  %c8  = fadd float %a8 , %b8
881  %c9  = fadd float %a9 , %b9
882  %c10 = fadd float %a10, %b10
883  %c11 = fadd float %a11, %b11
884  %c12 = fadd float %a12, %b12
885  %c13 = fadd float %a13, %b13
886  %c14 = fadd float %a14, %b14
887  %c15 = fadd float %a15, %b15
888  %r0  = insertelement <16 x float> undef, float %c0 , i32 0
889  %r1  = insertelement <16 x float> %r0 ,  float %c1 , i32 1
890  %r2  = insertelement <16 x float> %r1 ,  float %c2 , i32 2
891  %r3  = insertelement <16 x float> %r2 ,  float %c3 , i32 3
892  %r4  = insertelement <16 x float> %r3 ,  float %c4 , i32 4
893  %r5  = insertelement <16 x float> %r4 ,  float %c5 , i32 5
894  %r6  = insertelement <16 x float> %r5 ,  float %c6 , i32 6
895  %r7  = insertelement <16 x float> %r6 ,  float %c7 , i32 7
896  %r8  = insertelement <16 x float> %r7 ,  float %c8 , i32 8
897  %r9  = insertelement <16 x float> %r8 ,  float %c9 , i32 9
898  %r10 = insertelement <16 x float> %r9 ,  float %c10, i32 10
899  %r11 = insertelement <16 x float> %r10,  float %c11, i32 11
900  %r12 = insertelement <16 x float> %r11,  float %c12, i32 12
901  %r13 = insertelement <16 x float> %r12,  float %c13, i32 13
902  %r14 = insertelement <16 x float> %r13,  float %c14, i32 14
903  %r15 = insertelement <16 x float> %r14,  float %c15, i32 15
904  ret <16 x float> %r15
905}
906
907define <16 x float> @buildvector_sub_16f32(<16 x float> %a, <16 x float> %b) {
908; CHECK-LABEL: @buildvector_sub_16f32(
909; CHECK-NEXT:    [[TMP1:%.*]] = fsub <16 x float> %a, %b
910; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <16 x float> [[TMP1]], i32 0
911; CHECK-NEXT:    [[R0:%.*]] = insertelement <16 x float> undef, float [[TMP2]], i32 0
912; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <16 x float> [[TMP1]], i32 1
913; CHECK-NEXT:    [[R1:%.*]] = insertelement <16 x float> [[R0]], float [[TMP3]], i32 1
914; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <16 x float> [[TMP1]], i32 2
915; CHECK-NEXT:    [[R2:%.*]] = insertelement <16 x float> [[R1]], float [[TMP4]], i32 2
916; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <16 x float> [[TMP1]], i32 3
917; CHECK-NEXT:    [[R3:%.*]] = insertelement <16 x float> [[R2]], float [[TMP5]], i32 3
918; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <16 x float> [[TMP1]], i32 4
919; CHECK-NEXT:    [[R4:%.*]] = insertelement <16 x float> [[R3]], float [[TMP6]], i32 4
920; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <16 x float> [[TMP1]], i32 5
921; CHECK-NEXT:    [[R5:%.*]] = insertelement <16 x float> [[R4]], float [[TMP7]], i32 5
922; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <16 x float> [[TMP1]], i32 6
923; CHECK-NEXT:    [[R6:%.*]] = insertelement <16 x float> [[R5]], float [[TMP8]], i32 6
924; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <16 x float> [[TMP1]], i32 7
925; CHECK-NEXT:    [[R7:%.*]] = insertelement <16 x float> [[R6]], float [[TMP9]], i32 7
926; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <16 x float> [[TMP1]], i32 8
927; CHECK-NEXT:    [[R8:%.*]] = insertelement <16 x float> [[R7]], float [[TMP10]], i32 8
928; CHECK-NEXT:    [[TMP11:%.*]] = extractelement <16 x float> [[TMP1]], i32 9
929; CHECK-NEXT:    [[R9:%.*]] = insertelement <16 x float> [[R8]], float [[TMP11]], i32 9
930; CHECK-NEXT:    [[TMP12:%.*]] = extractelement <16 x float> [[TMP1]], i32 10
931; CHECK-NEXT:    [[R10:%.*]] = insertelement <16 x float> [[R9]], float [[TMP12]], i32 10
932; CHECK-NEXT:    [[TMP13:%.*]] = extractelement <16 x float> [[TMP1]], i32 11
933; CHECK-NEXT:    [[R11:%.*]] = insertelement <16 x float> [[R10]], float [[TMP13]], i32 11
934; CHECK-NEXT:    [[TMP14:%.*]] = extractelement <16 x float> [[TMP1]], i32 12
935; CHECK-NEXT:    [[R12:%.*]] = insertelement <16 x float> [[R11]], float [[TMP14]], i32 12
936; CHECK-NEXT:    [[TMP15:%.*]] = extractelement <16 x float> [[TMP1]], i32 13
937; CHECK-NEXT:    [[R13:%.*]] = insertelement <16 x float> [[R12]], float [[TMP15]], i32 13
938; CHECK-NEXT:    [[TMP16:%.*]] = extractelement <16 x float> [[TMP1]], i32 14
939; CHECK-NEXT:    [[R14:%.*]] = insertelement <16 x float> [[R13]], float [[TMP16]], i32 14
940; CHECK-NEXT:    [[TMP17:%.*]] = extractelement <16 x float> [[TMP1]], i32 15
941; CHECK-NEXT:    [[R15:%.*]] = insertelement <16 x float> [[R14]], float [[TMP17]], i32 15
942; CHECK-NEXT:    ret <16 x float> [[R15]]
943;
944  %a0  = extractelement <16 x float> %a, i32 0
945  %a1  = extractelement <16 x float> %a, i32 1
946  %a2  = extractelement <16 x float> %a, i32 2
947  %a3  = extractelement <16 x float> %a, i32 3
948  %a4  = extractelement <16 x float> %a, i32 4
949  %a5  = extractelement <16 x float> %a, i32 5
950  %a6  = extractelement <16 x float> %a, i32 6
951  %a7  = extractelement <16 x float> %a, i32 7
952  %a8  = extractelement <16 x float> %a, i32 8
953  %a9  = extractelement <16 x float> %a, i32 9
954  %a10 = extractelement <16 x float> %a, i32 10
955  %a11 = extractelement <16 x float> %a, i32 11
956  %a12 = extractelement <16 x float> %a, i32 12
957  %a13 = extractelement <16 x float> %a, i32 13
958  %a14 = extractelement <16 x float> %a, i32 14
959  %a15 = extractelement <16 x float> %a, i32 15
960  %b0  = extractelement <16 x float> %b, i32 0
961  %b1  = extractelement <16 x float> %b, i32 1
962  %b2  = extractelement <16 x float> %b, i32 2
963  %b3  = extractelement <16 x float> %b, i32 3
964  %b4  = extractelement <16 x float> %b, i32 4
965  %b5  = extractelement <16 x float> %b, i32 5
966  %b6  = extractelement <16 x float> %b, i32 6
967  %b7  = extractelement <16 x float> %b, i32 7
968  %b8  = extractelement <16 x float> %b, i32 8
969  %b9  = extractelement <16 x float> %b, i32 9
970  %b10 = extractelement <16 x float> %b, i32 10
971  %b11 = extractelement <16 x float> %b, i32 11
972  %b12 = extractelement <16 x float> %b, i32 12
973  %b13 = extractelement <16 x float> %b, i32 13
974  %b14 = extractelement <16 x float> %b, i32 14
975  %b15 = extractelement <16 x float> %b, i32 15
976  %c0  = fsub float %a0 , %b0
977  %c1  = fsub float %a1 , %b1
978  %c2  = fsub float %a2 , %b2
979  %c3  = fsub float %a3 , %b3
980  %c4  = fsub float %a4 , %b4
981  %c5  = fsub float %a5 , %b5
982  %c6  = fsub float %a6 , %b6
983  %c7  = fsub float %a7 , %b7
984  %c8  = fsub float %a8 , %b8
985  %c9  = fsub float %a9 , %b9
986  %c10 = fsub float %a10, %b10
987  %c11 = fsub float %a11, %b11
988  %c12 = fsub float %a12, %b12
989  %c13 = fsub float %a13, %b13
990  %c14 = fsub float %a14, %b14
991  %c15 = fsub float %a15, %b15
992  %r0  = insertelement <16 x float> undef, float %c0 , i32 0
993  %r1  = insertelement <16 x float> %r0 ,  float %c1 , i32 1
994  %r2  = insertelement <16 x float> %r1 ,  float %c2 , i32 2
995  %r3  = insertelement <16 x float> %r2 ,  float %c3 , i32 3
996  %r4  = insertelement <16 x float> %r3 ,  float %c4 , i32 4
997  %r5  = insertelement <16 x float> %r4 ,  float %c5 , i32 5
998  %r6  = insertelement <16 x float> %r5 ,  float %c6 , i32 6
999  %r7  = insertelement <16 x float> %r6 ,  float %c7 , i32 7
1000  %r8  = insertelement <16 x float> %r7 ,  float %c8 , i32 8
1001  %r9  = insertelement <16 x float> %r8 ,  float %c9 , i32 9
1002  %r10 = insertelement <16 x float> %r9 ,  float %c10, i32 10
1003  %r11 = insertelement <16 x float> %r10,  float %c11, i32 11
1004  %r12 = insertelement <16 x float> %r11,  float %c12, i32 12
1005  %r13 = insertelement <16 x float> %r12,  float %c13, i32 13
1006  %r14 = insertelement <16 x float> %r13,  float %c14, i32 14
1007  %r15 = insertelement <16 x float> %r14,  float %c15, i32 15
1008  ret <16 x float> %r15
1009}
1010
1011define <16 x float> @buildvector_mul_16f32(<16 x float> %a, <16 x float> %b) {
1012; CHECK-LABEL: @buildvector_mul_16f32(
1013; CHECK-NEXT:    [[TMP1:%.*]] = fmul <16 x float> %a, %b
1014; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <16 x float> [[TMP1]], i32 0
1015; CHECK-NEXT:    [[R0:%.*]] = insertelement <16 x float> undef, float [[TMP2]], i32 0
1016; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <16 x float> [[TMP1]], i32 1
1017; CHECK-NEXT:    [[R1:%.*]] = insertelement <16 x float> [[R0]], float [[TMP3]], i32 1
1018; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <16 x float> [[TMP1]], i32 2
1019; CHECK-NEXT:    [[R2:%.*]] = insertelement <16 x float> [[R1]], float [[TMP4]], i32 2
1020; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <16 x float> [[TMP1]], i32 3
1021; CHECK-NEXT:    [[R3:%.*]] = insertelement <16 x float> [[R2]], float [[TMP5]], i32 3
1022; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <16 x float> [[TMP1]], i32 4
1023; CHECK-NEXT:    [[R4:%.*]] = insertelement <16 x float> [[R3]], float [[TMP6]], i32 4
1024; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <16 x float> [[TMP1]], i32 5
1025; CHECK-NEXT:    [[R5:%.*]] = insertelement <16 x float> [[R4]], float [[TMP7]], i32 5
1026; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <16 x float> [[TMP1]], i32 6
1027; CHECK-NEXT:    [[R6:%.*]] = insertelement <16 x float> [[R5]], float [[TMP8]], i32 6
1028; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <16 x float> [[TMP1]], i32 7
1029; CHECK-NEXT:    [[R7:%.*]] = insertelement <16 x float> [[R6]], float [[TMP9]], i32 7
1030; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <16 x float> [[TMP1]], i32 8
1031; CHECK-NEXT:    [[R8:%.*]] = insertelement <16 x float> [[R7]], float [[TMP10]], i32 8
1032; CHECK-NEXT:    [[TMP11:%.*]] = extractelement <16 x float> [[TMP1]], i32 9
1033; CHECK-NEXT:    [[R9:%.*]] = insertelement <16 x float> [[R8]], float [[TMP11]], i32 9
1034; CHECK-NEXT:    [[TMP12:%.*]] = extractelement <16 x float> [[TMP1]], i32 10
1035; CHECK-NEXT:    [[R10:%.*]] = insertelement <16 x float> [[R9]], float [[TMP12]], i32 10
1036; CHECK-NEXT:    [[TMP13:%.*]] = extractelement <16 x float> [[TMP1]], i32 11
1037; CHECK-NEXT:    [[R11:%.*]] = insertelement <16 x float> [[R10]], float [[TMP13]], i32 11
1038; CHECK-NEXT:    [[TMP14:%.*]] = extractelement <16 x float> [[TMP1]], i32 12
1039; CHECK-NEXT:    [[R12:%.*]] = insertelement <16 x float> [[R11]], float [[TMP14]], i32 12
1040; CHECK-NEXT:    [[TMP15:%.*]] = extractelement <16 x float> [[TMP1]], i32 13
1041; CHECK-NEXT:    [[R13:%.*]] = insertelement <16 x float> [[R12]], float [[TMP15]], i32 13
1042; CHECK-NEXT:    [[TMP16:%.*]] = extractelement <16 x float> [[TMP1]], i32 14
1043; CHECK-NEXT:    [[R14:%.*]] = insertelement <16 x float> [[R13]], float [[TMP16]], i32 14
1044; CHECK-NEXT:    [[TMP17:%.*]] = extractelement <16 x float> [[TMP1]], i32 15
1045; CHECK-NEXT:    [[R15:%.*]] = insertelement <16 x float> [[R14]], float [[TMP17]], i32 15
1046; CHECK-NEXT:    ret <16 x float> [[R15]]
1047;
1048  %a0  = extractelement <16 x float> %a, i32 0
1049  %a1  = extractelement <16 x float> %a, i32 1
1050  %a2  = extractelement <16 x float> %a, i32 2
1051  %a3  = extractelement <16 x float> %a, i32 3
1052  %a4  = extractelement <16 x float> %a, i32 4
1053  %a5  = extractelement <16 x float> %a, i32 5
1054  %a6  = extractelement <16 x float> %a, i32 6
1055  %a7  = extractelement <16 x float> %a, i32 7
1056  %a8  = extractelement <16 x float> %a, i32 8
1057  %a9  = extractelement <16 x float> %a, i32 9
1058  %a10 = extractelement <16 x float> %a, i32 10
1059  %a11 = extractelement <16 x float> %a, i32 11
1060  %a12 = extractelement <16 x float> %a, i32 12
1061  %a13 = extractelement <16 x float> %a, i32 13
1062  %a14 = extractelement <16 x float> %a, i32 14
1063  %a15 = extractelement <16 x float> %a, i32 15
1064  %b0  = extractelement <16 x float> %b, i32 0
1065  %b1  = extractelement <16 x float> %b, i32 1
1066  %b2  = extractelement <16 x float> %b, i32 2
1067  %b3  = extractelement <16 x float> %b, i32 3
1068  %b4  = extractelement <16 x float> %b, i32 4
1069  %b5  = extractelement <16 x float> %b, i32 5
1070  %b6  = extractelement <16 x float> %b, i32 6
1071  %b7  = extractelement <16 x float> %b, i32 7
1072  %b8  = extractelement <16 x float> %b, i32 8
1073  %b9  = extractelement <16 x float> %b, i32 9
1074  %b10 = extractelement <16 x float> %b, i32 10
1075  %b11 = extractelement <16 x float> %b, i32 11
1076  %b12 = extractelement <16 x float> %b, i32 12
1077  %b13 = extractelement <16 x float> %b, i32 13
1078  %b14 = extractelement <16 x float> %b, i32 14
1079  %b15 = extractelement <16 x float> %b, i32 15
1080  %c0  = fmul float %a0 , %b0
1081  %c1  = fmul float %a1 , %b1
1082  %c2  = fmul float %a2 , %b2
1083  %c3  = fmul float %a3 , %b3
1084  %c4  = fmul float %a4 , %b4
1085  %c5  = fmul float %a5 , %b5
1086  %c6  = fmul float %a6 , %b6
1087  %c7  = fmul float %a7 , %b7
1088  %c8  = fmul float %a8 , %b8
1089  %c9  = fmul float %a9 , %b9
1090  %c10 = fmul float %a10, %b10
1091  %c11 = fmul float %a11, %b11
1092  %c12 = fmul float %a12, %b12
1093  %c13 = fmul float %a13, %b13
1094  %c14 = fmul float %a14, %b14
1095  %c15 = fmul float %a15, %b15
1096  %r0  = insertelement <16 x float> undef, float %c0 , i32 0
1097  %r1  = insertelement <16 x float> %r0 ,  float %c1 , i32 1
1098  %r2  = insertelement <16 x float> %r1 ,  float %c2 , i32 2
1099  %r3  = insertelement <16 x float> %r2 ,  float %c3 , i32 3
1100  %r4  = insertelement <16 x float> %r3 ,  float %c4 , i32 4
1101  %r5  = insertelement <16 x float> %r4 ,  float %c5 , i32 5
1102  %r6  = insertelement <16 x float> %r5 ,  float %c6 , i32 6
1103  %r7  = insertelement <16 x float> %r6 ,  float %c7 , i32 7
1104  %r8  = insertelement <16 x float> %r7 ,  float %c8 , i32 8
1105  %r9  = insertelement <16 x float> %r8 ,  float %c9 , i32 9
1106  %r10 = insertelement <16 x float> %r9 ,  float %c10, i32 10
1107  %r11 = insertelement <16 x float> %r10,  float %c11, i32 11
1108  %r12 = insertelement <16 x float> %r11,  float %c12, i32 12
1109  %r13 = insertelement <16 x float> %r12,  float %c13, i32 13
1110  %r14 = insertelement <16 x float> %r13,  float %c14, i32 14
1111  %r15 = insertelement <16 x float> %r14,  float %c15, i32 15
1112  ret <16 x float> %r15
1113}
1114
1115define <16 x float> @buildvector_div_16f32(<16 x float> %a, <16 x float> %b) {
1116; CHECK-LABEL: @buildvector_div_16f32(
1117; CHECK-NEXT:    [[TMP1:%.*]] = fdiv <16 x float> %a, %b
1118; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <16 x float> [[TMP1]], i32 0
1119; CHECK-NEXT:    [[R0:%.*]] = insertelement <16 x float> undef, float [[TMP2]], i32 0
1120; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <16 x float> [[TMP1]], i32 1
1121; CHECK-NEXT:    [[R1:%.*]] = insertelement <16 x float> [[R0]], float [[TMP3]], i32 1
1122; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <16 x float> [[TMP1]], i32 2
1123; CHECK-NEXT:    [[R2:%.*]] = insertelement <16 x float> [[R1]], float [[TMP4]], i32 2
1124; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <16 x float> [[TMP1]], i32 3
1125; CHECK-NEXT:    [[R3:%.*]] = insertelement <16 x float> [[R2]], float [[TMP5]], i32 3
1126; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <16 x float> [[TMP1]], i32 4
1127; CHECK-NEXT:    [[R4:%.*]] = insertelement <16 x float> [[R3]], float [[TMP6]], i32 4
1128; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <16 x float> [[TMP1]], i32 5
1129; CHECK-NEXT:    [[R5:%.*]] = insertelement <16 x float> [[R4]], float [[TMP7]], i32 5
1130; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <16 x float> [[TMP1]], i32 6
1131; CHECK-NEXT:    [[R6:%.*]] = insertelement <16 x float> [[R5]], float [[TMP8]], i32 6
1132; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <16 x float> [[TMP1]], i32 7
1133; CHECK-NEXT:    [[R7:%.*]] = insertelement <16 x float> [[R6]], float [[TMP9]], i32 7
1134; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <16 x float> [[TMP1]], i32 8
1135; CHECK-NEXT:    [[R8:%.*]] = insertelement <16 x float> [[R7]], float [[TMP10]], i32 8
1136; CHECK-NEXT:    [[TMP11:%.*]] = extractelement <16 x float> [[TMP1]], i32 9
1137; CHECK-NEXT:    [[R9:%.*]] = insertelement <16 x float> [[R8]], float [[TMP11]], i32 9
1138; CHECK-NEXT:    [[TMP12:%.*]] = extractelement <16 x float> [[TMP1]], i32 10
1139; CHECK-NEXT:    [[R10:%.*]] = insertelement <16 x float> [[R9]], float [[TMP12]], i32 10
1140; CHECK-NEXT:    [[TMP13:%.*]] = extractelement <16 x float> [[TMP1]], i32 11
1141; CHECK-NEXT:    [[R11:%.*]] = insertelement <16 x float> [[R10]], float [[TMP13]], i32 11
1142; CHECK-NEXT:    [[TMP14:%.*]] = extractelement <16 x float> [[TMP1]], i32 12
1143; CHECK-NEXT:    [[R12:%.*]] = insertelement <16 x float> [[R11]], float [[TMP14]], i32 12
1144; CHECK-NEXT:    [[TMP15:%.*]] = extractelement <16 x float> [[TMP1]], i32 13
1145; CHECK-NEXT:    [[R13:%.*]] = insertelement <16 x float> [[R12]], float [[TMP15]], i32 13
1146; CHECK-NEXT:    [[TMP16:%.*]] = extractelement <16 x float> [[TMP1]], i32 14
1147; CHECK-NEXT:    [[R14:%.*]] = insertelement <16 x float> [[R13]], float [[TMP16]], i32 14
1148; CHECK-NEXT:    [[TMP17:%.*]] = extractelement <16 x float> [[TMP1]], i32 15
1149; CHECK-NEXT:    [[R15:%.*]] = insertelement <16 x float> [[R14]], float [[TMP17]], i32 15
1150; CHECK-NEXT:    ret <16 x float> [[R15]]
1151;
1152  %a0  = extractelement <16 x float> %a, i32 0
1153  %a1  = extractelement <16 x float> %a, i32 1
1154  %a2  = extractelement <16 x float> %a, i32 2
1155  %a3  = extractelement <16 x float> %a, i32 3
1156  %a4  = extractelement <16 x float> %a, i32 4
1157  %a5  = extractelement <16 x float> %a, i32 5
1158  %a6  = extractelement <16 x float> %a, i32 6
1159  %a7  = extractelement <16 x float> %a, i32 7
1160  %a8  = extractelement <16 x float> %a, i32 8
1161  %a9  = extractelement <16 x float> %a, i32 9
1162  %a10 = extractelement <16 x float> %a, i32 10
1163  %a11 = extractelement <16 x float> %a, i32 11
1164  %a12 = extractelement <16 x float> %a, i32 12
1165  %a13 = extractelement <16 x float> %a, i32 13
1166  %a14 = extractelement <16 x float> %a, i32 14
1167  %a15 = extractelement <16 x float> %a, i32 15
1168  %b0  = extractelement <16 x float> %b, i32 0
1169  %b1  = extractelement <16 x float> %b, i32 1
1170  %b2  = extractelement <16 x float> %b, i32 2
1171  %b3  = extractelement <16 x float> %b, i32 3
1172  %b4  = extractelement <16 x float> %b, i32 4
1173  %b5  = extractelement <16 x float> %b, i32 5
1174  %b6  = extractelement <16 x float> %b, i32 6
1175  %b7  = extractelement <16 x float> %b, i32 7
1176  %b8  = extractelement <16 x float> %b, i32 8
1177  %b9  = extractelement <16 x float> %b, i32 9
1178  %b10 = extractelement <16 x float> %b, i32 10
1179  %b11 = extractelement <16 x float> %b, i32 11
1180  %b12 = extractelement <16 x float> %b, i32 12
1181  %b13 = extractelement <16 x float> %b, i32 13
1182  %b14 = extractelement <16 x float> %b, i32 14
1183  %b15 = extractelement <16 x float> %b, i32 15
1184  %c0  = fdiv float %a0 , %b0
1185  %c1  = fdiv float %a1 , %b1
1186  %c2  = fdiv float %a2 , %b2
1187  %c3  = fdiv float %a3 , %b3
1188  %c4  = fdiv float %a4 , %b4
1189  %c5  = fdiv float %a5 , %b5
1190  %c6  = fdiv float %a6 , %b6
1191  %c7  = fdiv float %a7 , %b7
1192  %c8  = fdiv float %a8 , %b8
1193  %c9  = fdiv float %a9 , %b9
1194  %c10 = fdiv float %a10, %b10
1195  %c11 = fdiv float %a11, %b11
1196  %c12 = fdiv float %a12, %b12
1197  %c13 = fdiv float %a13, %b13
1198  %c14 = fdiv float %a14, %b14
1199  %c15 = fdiv float %a15, %b15
1200  %r0  = insertelement <16 x float> undef, float %c0 , i32 0
1201  %r1  = insertelement <16 x float> %r0 ,  float %c1 , i32 1
1202  %r2  = insertelement <16 x float> %r1 ,  float %c2 , i32 2
1203  %r3  = insertelement <16 x float> %r2 ,  float %c3 , i32 3
1204  %r4  = insertelement <16 x float> %r3 ,  float %c4 , i32 4
1205  %r5  = insertelement <16 x float> %r4 ,  float %c5 , i32 5
1206  %r6  = insertelement <16 x float> %r5 ,  float %c6 , i32 6
1207  %r7  = insertelement <16 x float> %r6 ,  float %c7 , i32 7
1208  %r8  = insertelement <16 x float> %r7 ,  float %c8 , i32 8
1209  %r9  = insertelement <16 x float> %r8 ,  float %c9 , i32 9
1210  %r10 = insertelement <16 x float> %r9 ,  float %c10, i32 10
1211  %r11 = insertelement <16 x float> %r10,  float %c11, i32 11
1212  %r12 = insertelement <16 x float> %r11,  float %c12, i32 12
1213  %r13 = insertelement <16 x float> %r12,  float %c13, i32 13
1214  %r14 = insertelement <16 x float> %r13,  float %c14, i32 14
1215  %r15 = insertelement <16 x float> %r14,  float %c15, i32 15
1216  ret <16 x float> %r15
1217}
1218