OSDN Git Service

[X86][SSE] Add extra scalar fop + blend tests for commuted inputs
[android-x86/external-llvm.git] / test / CodeGen / X86 / sse-scalar-fp-arith.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK,X86,SSE,X86-SSE,SSE2,X86-SSE2
3 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=CHECK,X86,SSE,X86-SSE,SSE41,X86-SSE41
4 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=CHECK,X86,AVX,X86-AVX,AVX1,X86-AVX1
5 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=CHECK,X86,AVX,X86-AVX,AVX512,X86-AVX512
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK,X64,SSE,X64-SSE,SSE2,X64-SSE2
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=CHECK,X64,SSE,X64-SSE,SSE41,X64-SSE41
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=CHECK,X64,AVX,X64-AVX,AVX1,X64-AVX1
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=CHECK,X64,AVX,X64-AVX,AVX512,X64-AVX512
10
11 ; Ensure that the backend no longer emits unnecessary vector insert
12 ; instructions immediately after SSE scalar fp instructions
13 ; like addss or mulss.
14
15 define <4 x float> @test_add_ss(<4 x float> %a, <4 x float> %b) {
16 ; SSE-LABEL: test_add_ss:
17 ; SSE:       # %bb.0:
18 ; SSE-NEXT:    addss %xmm1, %xmm0
19 ; SSE-NEXT:    ret{{[l|q]}}
20 ;
21 ; AVX-LABEL: test_add_ss:
22 ; AVX:       # %bb.0:
23 ; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
24 ; AVX-NEXT:    ret{{[l|q]}}
25   %1 = extractelement <4 x float> %b, i32 0
26   %2 = extractelement <4 x float> %a, i32 0
27   %add = fadd float %2, %1
28   %3 = insertelement <4 x float> %a, float %add, i32 0
29   ret <4 x float> %3
30 }
31
32 define <4 x float> @test_sub_ss(<4 x float> %a, <4 x float> %b) {
33 ; SSE-LABEL: test_sub_ss:
34 ; SSE:       # %bb.0:
35 ; SSE-NEXT:    subss %xmm1, %xmm0
36 ; SSE-NEXT:    ret{{[l|q]}}
37 ;
38 ; AVX-LABEL: test_sub_ss:
39 ; AVX:       # %bb.0:
40 ; AVX-NEXT:    vsubss %xmm1, %xmm0, %xmm0
41 ; AVX-NEXT:    ret{{[l|q]}}
42   %1 = extractelement <4 x float> %b, i32 0
43   %2 = extractelement <4 x float> %a, i32 0
44   %sub = fsub float %2, %1
45   %3 = insertelement <4 x float> %a, float %sub, i32 0
46   ret <4 x float> %3
47 }
48
49 define <4 x float> @test_mul_ss(<4 x float> %a, <4 x float> %b) {
50 ; SSE-LABEL: test_mul_ss:
51 ; SSE:       # %bb.0:
52 ; SSE-NEXT:    mulss %xmm1, %xmm0
53 ; SSE-NEXT:    ret{{[l|q]}}
54 ;
55 ; AVX-LABEL: test_mul_ss:
56 ; AVX:       # %bb.0:
57 ; AVX-NEXT:    vmulss %xmm1, %xmm0, %xmm0
58 ; AVX-NEXT:    ret{{[l|q]}}
59   %1 = extractelement <4 x float> %b, i32 0
60   %2 = extractelement <4 x float> %a, i32 0
61   %mul = fmul float %2, %1
62   %3 = insertelement <4 x float> %a, float %mul, i32 0
63   ret <4 x float> %3
64 }
65
66 define <4 x float> @test_div_ss(<4 x float> %a, <4 x float> %b) {
67 ; SSE-LABEL: test_div_ss:
68 ; SSE:       # %bb.0:
69 ; SSE-NEXT:    divss %xmm1, %xmm0
70 ; SSE-NEXT:    ret{{[l|q]}}
71 ;
72 ; AVX-LABEL: test_div_ss:
73 ; AVX:       # %bb.0:
74 ; AVX-NEXT:    vdivss %xmm1, %xmm0, %xmm0
75 ; AVX-NEXT:    ret{{[l|q]}}
76   %1 = extractelement <4 x float> %b, i32 0
77   %2 = extractelement <4 x float> %a, i32 0
78   %div = fdiv float %2, %1
79   %3 = insertelement <4 x float> %a, float %div, i32 0
80   ret <4 x float> %3
81 }
82
83 define <4 x float> @test_sqrt_ss(<4 x float> %a) {
84 ; SSE-LABEL: test_sqrt_ss:
85 ; SSE:       # %bb.0:
86 ; SSE-NEXT:    sqrtss %xmm0, %xmm0
87 ; SSE-NEXT:    ret{{[l|q]}}
88 ;
89 ; AVX-LABEL: test_sqrt_ss:
90 ; AVX:       # %bb.0:
91 ; AVX-NEXT:    vsqrtss %xmm0, %xmm0, %xmm0
92 ; AVX-NEXT:    ret{{[l|q]}}
93   %1 = extractelement <4 x float> %a, i32 0
94   %2 = call float @llvm.sqrt.f32(float %1)
95   %3 = insertelement <4 x float> %a, float %2, i32 0
96   ret <4 x float> %3
97 }
98 declare float @llvm.sqrt.f32(float)
99
100 define <2 x double> @test_add_sd(<2 x double> %a, <2 x double> %b) {
101 ; SSE-LABEL: test_add_sd:
102 ; SSE:       # %bb.0:
103 ; SSE-NEXT:    addsd %xmm1, %xmm0
104 ; SSE-NEXT:    ret{{[l|q]}}
105 ;
106 ; AVX-LABEL: test_add_sd:
107 ; AVX:       # %bb.0:
108 ; AVX-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
109 ; AVX-NEXT:    ret{{[l|q]}}
110   %1 = extractelement <2 x double> %b, i32 0
111   %2 = extractelement <2 x double> %a, i32 0
112   %add = fadd double %2, %1
113   %3 = insertelement <2 x double> %a, double %add, i32 0
114   ret <2 x double> %3
115 }
116
117 define <2 x double> @test_sub_sd(<2 x double> %a, <2 x double> %b) {
118 ; SSE-LABEL: test_sub_sd:
119 ; SSE:       # %bb.0:
120 ; SSE-NEXT:    subsd %xmm1, %xmm0
121 ; SSE-NEXT:    ret{{[l|q]}}
122 ;
123 ; AVX-LABEL: test_sub_sd:
124 ; AVX:       # %bb.0:
125 ; AVX-NEXT:    vsubsd %xmm1, %xmm0, %xmm0
126 ; AVX-NEXT:    ret{{[l|q]}}
127   %1 = extractelement <2 x double> %b, i32 0
128   %2 = extractelement <2 x double> %a, i32 0
129   %sub = fsub double %2, %1
130   %3 = insertelement <2 x double> %a, double %sub, i32 0
131   ret <2 x double> %3
132 }
133
134 define <2 x double> @test_mul_sd(<2 x double> %a, <2 x double> %b) {
135 ; SSE-LABEL: test_mul_sd:
136 ; SSE:       # %bb.0:
137 ; SSE-NEXT:    mulsd %xmm1, %xmm0
138 ; SSE-NEXT:    ret{{[l|q]}}
139 ;
140 ; AVX-LABEL: test_mul_sd:
141 ; AVX:       # %bb.0:
142 ; AVX-NEXT:    vmulsd %xmm1, %xmm0, %xmm0
143 ; AVX-NEXT:    ret{{[l|q]}}
144   %1 = extractelement <2 x double> %b, i32 0
145   %2 = extractelement <2 x double> %a, i32 0
146   %mul = fmul double %2, %1
147   %3 = insertelement <2 x double> %a, double %mul, i32 0
148   ret <2 x double> %3
149 }
150
151 define <2 x double> @test_div_sd(<2 x double> %a, <2 x double> %b) {
152 ; SSE-LABEL: test_div_sd:
153 ; SSE:       # %bb.0:
154 ; SSE-NEXT:    divsd %xmm1, %xmm0
155 ; SSE-NEXT:    ret{{[l|q]}}
156 ;
157 ; AVX-LABEL: test_div_sd:
158 ; AVX:       # %bb.0:
159 ; AVX-NEXT:    vdivsd %xmm1, %xmm0, %xmm0
160 ; AVX-NEXT:    ret{{[l|q]}}
161   %1 = extractelement <2 x double> %b, i32 0
162   %2 = extractelement <2 x double> %a, i32 0
163   %div = fdiv double %2, %1
164   %3 = insertelement <2 x double> %a, double %div, i32 0
165   ret <2 x double> %3
166 }
167
168 define <2 x double> @test_sqrt_sd(<2 x double> %a) {
169 ; SSE-LABEL: test_sqrt_sd:
170 ; SSE:       # %bb.0:
171 ; SSE-NEXT:    sqrtsd %xmm0, %xmm0
172 ; SSE-NEXT:    ret{{[l|q]}}
173 ;
174 ; AVX-LABEL: test_sqrt_sd:
175 ; AVX:       # %bb.0:
176 ; AVX-NEXT:    vsqrtsd %xmm0, %xmm0, %xmm0
177 ; AVX-NEXT:    ret{{[l|q]}}
178   %1 = extractelement <2 x double> %a, i32 0
179   %2 = call double @llvm.sqrt.f64(double %1)
180   %3 = insertelement <2 x double> %a, double %2, i32 0
181   ret <2 x double> %3
182 }
183 declare double @llvm.sqrt.f64(double)
184
185 define <4 x float> @test2_add_ss(<4 x float> %a, <4 x float> %b) {
186 ; SSE-LABEL: test2_add_ss:
187 ; SSE:       # %bb.0:
188 ; SSE-NEXT:    addss %xmm0, %xmm1
189 ; SSE-NEXT:    movaps %xmm1, %xmm0
190 ; SSE-NEXT:    ret{{[l|q]}}
191 ;
192 ; AVX-LABEL: test2_add_ss:
193 ; AVX:       # %bb.0:
194 ; AVX-NEXT:    vaddss %xmm0, %xmm1, %xmm0
195 ; AVX-NEXT:    ret{{[l|q]}}
196   %1 = extractelement <4 x float> %a, i32 0
197   %2 = extractelement <4 x float> %b, i32 0
198   %add = fadd float %1, %2
199   %3 = insertelement <4 x float> %b, float %add, i32 0
200   ret <4 x float> %3
201 }
202
203 define <4 x float> @test2_sub_ss(<4 x float> %a, <4 x float> %b) {
204 ; SSE-LABEL: test2_sub_ss:
205 ; SSE:       # %bb.0:
206 ; SSE-NEXT:    subss %xmm0, %xmm1
207 ; SSE-NEXT:    movaps %xmm1, %xmm0
208 ; SSE-NEXT:    ret{{[l|q]}}
209 ;
210 ; AVX-LABEL: test2_sub_ss:
211 ; AVX:       # %bb.0:
212 ; AVX-NEXT:    vsubss %xmm0, %xmm1, %xmm0
213 ; AVX-NEXT:    ret{{[l|q]}}
214   %1 = extractelement <4 x float> %a, i32 0
215   %2 = extractelement <4 x float> %b, i32 0
216   %sub = fsub float %2, %1
217   %3 = insertelement <4 x float> %b, float %sub, i32 0
218   ret <4 x float> %3
219 }
220
221 define <4 x float> @test2_mul_ss(<4 x float> %a, <4 x float> %b) {
222 ; SSE-LABEL: test2_mul_ss:
223 ; SSE:       # %bb.0:
224 ; SSE-NEXT:    mulss %xmm0, %xmm1
225 ; SSE-NEXT:    movaps %xmm1, %xmm0
226 ; SSE-NEXT:    ret{{[l|q]}}
227 ;
228 ; AVX-LABEL: test2_mul_ss:
229 ; AVX:       # %bb.0:
230 ; AVX-NEXT:    vmulss %xmm0, %xmm1, %xmm0
231 ; AVX-NEXT:    ret{{[l|q]}}
232   %1 = extractelement <4 x float> %a, i32 0
233   %2 = extractelement <4 x float> %b, i32 0
234   %mul = fmul float %1, %2
235   %3 = insertelement <4 x float> %b, float %mul, i32 0
236   ret <4 x float> %3
237 }
238
239 define <4 x float> @test2_div_ss(<4 x float> %a, <4 x float> %b) {
240 ; SSE-LABEL: test2_div_ss:
241 ; SSE:       # %bb.0:
242 ; SSE-NEXT:    divss %xmm0, %xmm1
243 ; SSE-NEXT:    movaps %xmm1, %xmm0
244 ; SSE-NEXT:    ret{{[l|q]}}
245 ;
246 ; AVX-LABEL: test2_div_ss:
247 ; AVX:       # %bb.0:
248 ; AVX-NEXT:    vdivss %xmm0, %xmm1, %xmm0
249 ; AVX-NEXT:    ret{{[l|q]}}
250   %1 = extractelement <4 x float> %a, i32 0
251   %2 = extractelement <4 x float> %b, i32 0
252   %div = fdiv float %2, %1
253   %3 = insertelement <4 x float> %b, float %div, i32 0
254   ret <4 x float> %3
255 }
256
257 define <2 x double> @test2_add_sd(<2 x double> %a, <2 x double> %b) {
258 ; SSE-LABEL: test2_add_sd:
259 ; SSE:       # %bb.0:
260 ; SSE-NEXT:    addsd %xmm0, %xmm1
261 ; SSE-NEXT:    movapd %xmm1, %xmm0
262 ; SSE-NEXT:    ret{{[l|q]}}
263 ;
264 ; AVX-LABEL: test2_add_sd:
265 ; AVX:       # %bb.0:
266 ; AVX-NEXT:    vaddsd %xmm0, %xmm1, %xmm0
267 ; AVX-NEXT:    ret{{[l|q]}}
268   %1 = extractelement <2 x double> %a, i32 0
269   %2 = extractelement <2 x double> %b, i32 0
270   %add = fadd double %1, %2
271   %3 = insertelement <2 x double> %b, double %add, i32 0
272   ret <2 x double> %3
273 }
274
275 define <2 x double> @test2_sub_sd(<2 x double> %a, <2 x double> %b) {
276 ; SSE-LABEL: test2_sub_sd:
277 ; SSE:       # %bb.0:
278 ; SSE-NEXT:    subsd %xmm0, %xmm1
279 ; SSE-NEXT:    movapd %xmm1, %xmm0
280 ; SSE-NEXT:    ret{{[l|q]}}
281 ;
282 ; AVX-LABEL: test2_sub_sd:
283 ; AVX:       # %bb.0:
284 ; AVX-NEXT:    vsubsd %xmm0, %xmm1, %xmm0
285 ; AVX-NEXT:    ret{{[l|q]}}
286   %1 = extractelement <2 x double> %a, i32 0
287   %2 = extractelement <2 x double> %b, i32 0
288   %sub = fsub double %2, %1
289   %3 = insertelement <2 x double> %b, double %sub, i32 0
290   ret <2 x double> %3
291 }
292
293 define <2 x double> @test2_mul_sd(<2 x double> %a, <2 x double> %b) {
294 ; SSE-LABEL: test2_mul_sd:
295 ; SSE:       # %bb.0:
296 ; SSE-NEXT:    mulsd %xmm0, %xmm1
297 ; SSE-NEXT:    movapd %xmm1, %xmm0
298 ; SSE-NEXT:    ret{{[l|q]}}
299 ;
300 ; AVX-LABEL: test2_mul_sd:
301 ; AVX:       # %bb.0:
302 ; AVX-NEXT:    vmulsd %xmm0, %xmm1, %xmm0
303 ; AVX-NEXT:    ret{{[l|q]}}
304   %1 = extractelement <2 x double> %a, i32 0
305   %2 = extractelement <2 x double> %b, i32 0
306   %mul = fmul double %1, %2
307   %3 = insertelement <2 x double> %b, double %mul, i32 0
308   ret <2 x double> %3
309 }
310
311 define <2 x double> @test2_div_sd(<2 x double> %a, <2 x double> %b) {
312 ; SSE-LABEL: test2_div_sd:
313 ; SSE:       # %bb.0:
314 ; SSE-NEXT:    divsd %xmm0, %xmm1
315 ; SSE-NEXT:    movapd %xmm1, %xmm0
316 ; SSE-NEXT:    ret{{[l|q]}}
317 ;
318 ; AVX-LABEL: test2_div_sd:
319 ; AVX:       # %bb.0:
320 ; AVX-NEXT:    vdivsd %xmm0, %xmm1, %xmm0
321 ; AVX-NEXT:    ret{{[l|q]}}
322   %1 = extractelement <2 x double> %a, i32 0
323   %2 = extractelement <2 x double> %b, i32 0
324   %div = fdiv double %2, %1
325   %3 = insertelement <2 x double> %b, double %div, i32 0
326   ret <2 x double> %3
327 }
328
329 define <4 x float> @test_multiple_add_ss(<4 x float> %a, <4 x float> %b) {
330 ; SSE-LABEL: test_multiple_add_ss:
331 ; SSE:       # %bb.0:
332 ; SSE-NEXT:    addss %xmm0, %xmm1
333 ; SSE-NEXT:    addss %xmm1, %xmm0
334 ; SSE-NEXT:    ret{{[l|q]}}
335 ;
336 ; AVX-LABEL: test_multiple_add_ss:
337 ; AVX:       # %bb.0:
338 ; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm1
339 ; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
340 ; AVX-NEXT:    ret{{[l|q]}}
341   %1 = extractelement <4 x float> %b, i32 0
342   %2 = extractelement <4 x float> %a, i32 0
343   %add = fadd float %2, %1
344   %add2 = fadd float %2, %add
345   %3 = insertelement <4 x float> %a, float %add2, i32 0
346   ret <4 x float> %3
347 }
348
349 define <4 x float> @test_multiple_sub_ss(<4 x float> %a, <4 x float> %b) {
350 ; SSE-LABEL: test_multiple_sub_ss:
351 ; SSE:       # %bb.0:
352 ; SSE-NEXT:    movaps %xmm0, %xmm2
353 ; SSE-NEXT:    subss %xmm1, %xmm2
354 ; SSE-NEXT:    subss %xmm2, %xmm0
355 ; SSE-NEXT:    ret{{[l|q]}}
356 ;
357 ; AVX-LABEL: test_multiple_sub_ss:
358 ; AVX:       # %bb.0:
359 ; AVX-NEXT:    vsubss %xmm1, %xmm0, %xmm1
360 ; AVX-NEXT:    vsubss %xmm1, %xmm0, %xmm0
361 ; AVX-NEXT:    ret{{[l|q]}}
362   %1 = extractelement <4 x float> %b, i32 0
363   %2 = extractelement <4 x float> %a, i32 0
364   %sub = fsub float %2, %1
365   %sub2 = fsub float %2, %sub
366   %3 = insertelement <4 x float> %a, float %sub2, i32 0
367   ret <4 x float> %3
368 }
369
370 define <4 x float> @test_multiple_mul_ss(<4 x float> %a, <4 x float> %b) {
371 ; SSE-LABEL: test_multiple_mul_ss:
372 ; SSE:       # %bb.0:
373 ; SSE-NEXT:    mulss %xmm0, %xmm1
374 ; SSE-NEXT:    mulss %xmm1, %xmm0
375 ; SSE-NEXT:    ret{{[l|q]}}
376 ;
377 ; AVX-LABEL: test_multiple_mul_ss:
378 ; AVX:       # %bb.0:
379 ; AVX-NEXT:    vmulss %xmm1, %xmm0, %xmm1
380 ; AVX-NEXT:    vmulss %xmm1, %xmm0, %xmm0
381 ; AVX-NEXT:    ret{{[l|q]}}
382   %1 = extractelement <4 x float> %b, i32 0
383   %2 = extractelement <4 x float> %a, i32 0
384   %mul = fmul float %2, %1
385   %mul2 = fmul float %2, %mul
386   %3 = insertelement <4 x float> %a, float %mul2, i32 0
387   ret <4 x float> %3
388 }
389
390 define <4 x float> @test_multiple_div_ss(<4 x float> %a, <4 x float> %b) {
391 ; SSE-LABEL: test_multiple_div_ss:
392 ; SSE:       # %bb.0:
393 ; SSE-NEXT:    movaps %xmm0, %xmm2
394 ; SSE-NEXT:    divss %xmm1, %xmm2
395 ; SSE-NEXT:    divss %xmm2, %xmm0
396 ; SSE-NEXT:    ret{{[l|q]}}
397 ;
398 ; AVX-LABEL: test_multiple_div_ss:
399 ; AVX:       # %bb.0:
400 ; AVX-NEXT:    vdivss %xmm1, %xmm0, %xmm1
401 ; AVX-NEXT:    vdivss %xmm1, %xmm0, %xmm0
402 ; AVX-NEXT:    ret{{[l|q]}}
403   %1 = extractelement <4 x float> %b, i32 0
404   %2 = extractelement <4 x float> %a, i32 0
405   %div = fdiv float %2, %1
406   %div2 = fdiv float %2, %div
407   %3 = insertelement <4 x float> %a, float %div2, i32 0
408   ret <4 x float> %3
409 }
410
411 ; With SSE4.1 or greater, the shuffles in the following tests may
412 ; be lowered to X86Blendi nodes.
413
414 define <4 x float> @blend_add_ss(<4 x float> %a, float %b) {
415 ; X86-SSE-LABEL: blend_add_ss:
416 ; X86-SSE:       # %bb.0:
417 ; X86-SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
418 ; X86-SSE-NEXT:    addss %xmm1, %xmm0
419 ; X86-SSE-NEXT:    retl
420 ;
421 ; X86-AVX-LABEL: blend_add_ss:
422 ; X86-AVX:       # %bb.0:
423 ; X86-AVX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
424 ; X86-AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
425 ; X86-AVX-NEXT:    retl
426 ;
427 ; X64-SSE-LABEL: blend_add_ss:
428 ; X64-SSE:       # %bb.0:
429 ; X64-SSE-NEXT:    addss %xmm1, %xmm0
430 ; X64-SSE-NEXT:    retq
431 ;
432 ; X64-AVX-LABEL: blend_add_ss:
433 ; X64-AVX:       # %bb.0:
434 ; X64-AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
435 ; X64-AVX-NEXT:    retq
436
437   %ext = extractelement <4 x float> %a, i32 0
438   %op = fadd float %b, %ext
439   %ins = insertelement <4 x float> undef, float %op, i32 0
440   %shuf = shufflevector <4 x float> %ins, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
441   ret <4 x float> %shuf
442 }
443
444 define <4 x float> @blend_sub_ss(<4 x float> %a, float %b) {
445 ; X86-SSE-LABEL: blend_sub_ss:
446 ; X86-SSE:       # %bb.0:
447 ; X86-SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
448 ; X86-SSE-NEXT:    subss %xmm1, %xmm0
449 ; X86-SSE-NEXT:    retl
450 ;
451 ; X86-AVX-LABEL: blend_sub_ss:
452 ; X86-AVX:       # %bb.0:
453 ; X86-AVX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
454 ; X86-AVX-NEXT:    vsubss %xmm1, %xmm0, %xmm0
455 ; X86-AVX-NEXT:    retl
456 ;
457 ; X64-SSE-LABEL: blend_sub_ss:
458 ; X64-SSE:       # %bb.0:
459 ; X64-SSE-NEXT:    subss %xmm1, %xmm0
460 ; X64-SSE-NEXT:    retq
461 ;
462 ; X64-AVX-LABEL: blend_sub_ss:
463 ; X64-AVX:       # %bb.0:
464 ; X64-AVX-NEXT:    vsubss %xmm1, %xmm0, %xmm0
465 ; X64-AVX-NEXT:    retq
466
467   %ext = extractelement <4 x float> %a, i32 0
468   %op = fsub float %ext, %b
469   %ins = insertelement <4 x float> undef, float %op, i32 0
470   %shuf = shufflevector <4 x float> %ins, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
471   ret <4 x float> %shuf
472 }
473
474 define <4 x float> @blend_mul_ss(<4 x float> %a, float %b) {
475 ; X86-SSE-LABEL: blend_mul_ss:
476 ; X86-SSE:       # %bb.0:
477 ; X86-SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
478 ; X86-SSE-NEXT:    mulss %xmm1, %xmm0
479 ; X86-SSE-NEXT:    retl
480 ;
481 ; X86-AVX-LABEL: blend_mul_ss:
482 ; X86-AVX:       # %bb.0:
483 ; X86-AVX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
484 ; X86-AVX-NEXT:    vmulss %xmm1, %xmm0, %xmm0
485 ; X86-AVX-NEXT:    retl
486 ;
487 ; X64-SSE-LABEL: blend_mul_ss:
488 ; X64-SSE:       # %bb.0:
489 ; X64-SSE-NEXT:    mulss %xmm1, %xmm0
490 ; X64-SSE-NEXT:    retq
491 ;
492 ; X64-AVX-LABEL: blend_mul_ss:
493 ; X64-AVX:       # %bb.0:
494 ; X64-AVX-NEXT:    vmulss %xmm1, %xmm0, %xmm0
495 ; X64-AVX-NEXT:    retq
496
497   %ext = extractelement <4 x float> %a, i32 0
498   %op = fmul float %b, %ext
499   %ins = insertelement <4 x float> undef, float %op, i32 0
500   %shuf = shufflevector <4 x float> %ins, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
501   ret <4 x float> %shuf
502 }
503
504 define <4 x float> @blend_div_ss(<4 x float> %a, float %b) {
505 ; X86-SSE-LABEL: blend_div_ss:
506 ; X86-SSE:       # %bb.0:
507 ; X86-SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
508 ; X86-SSE-NEXT:    divss %xmm1, %xmm0
509 ; X86-SSE-NEXT:    retl
510 ;
511 ; X86-AVX-LABEL: blend_div_ss:
512 ; X86-AVX:       # %bb.0:
513 ; X86-AVX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
514 ; X86-AVX-NEXT:    vdivss %xmm1, %xmm0, %xmm0
515 ; X86-AVX-NEXT:    retl
516 ;
517 ; X64-SSE-LABEL: blend_div_ss:
518 ; X64-SSE:       # %bb.0:
519 ; X64-SSE-NEXT:    divss %xmm1, %xmm0
520 ; X64-SSE-NEXT:    retq
521 ;
522 ; X64-AVX-LABEL: blend_div_ss:
523 ; X64-AVX:       # %bb.0:
524 ; X64-AVX-NEXT:    vdivss %xmm1, %xmm0, %xmm0
525 ; X64-AVX-NEXT:    retq
526
527   %ext = extractelement <4 x float> %a, i32 0
528   %op = fdiv float %ext, %b
529   %ins = insertelement <4 x float> undef, float %op, i32 0
530   %shuf = shufflevector <4 x float> %ins, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
531   ret <4 x float> %shuf
532 }
533
534 define <2 x double> @blend_add_sd(<2 x double> %a, double %b) {
535 ; X86-SSE-LABEL: blend_add_sd:
536 ; X86-SSE:       # %bb.0:
537 ; X86-SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
538 ; X86-SSE-NEXT:    addsd %xmm1, %xmm0
539 ; X86-SSE-NEXT:    retl
540 ;
541 ; X86-AVX-LABEL: blend_add_sd:
542 ; X86-AVX:       # %bb.0:
543 ; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
544 ; X86-AVX-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
545 ; X86-AVX-NEXT:    retl
546 ;
547 ; X64-SSE-LABEL: blend_add_sd:
548 ; X64-SSE:       # %bb.0:
549 ; X64-SSE-NEXT:    addsd %xmm1, %xmm0
550 ; X64-SSE-NEXT:    retq
551 ;
552 ; X64-AVX-LABEL: blend_add_sd:
553 ; X64-AVX:       # %bb.0:
554 ; X64-AVX-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
555 ; X64-AVX-NEXT:    retq
556
557   %ext = extractelement <2 x double> %a, i32 0
558   %op = fadd double %b, %ext
559   %ins = insertelement <2 x double> undef, double %op, i32 0
560   %shuf = shufflevector <2 x double> %ins, <2 x double> %a, <2 x i32> <i32 0, i32 3>
561   ret <2 x double> %shuf
562 }
563
564 define <2 x double> @blend_sub_sd(<2 x double> %a, double %b) {
565 ; X86-SSE-LABEL: blend_sub_sd:
566 ; X86-SSE:       # %bb.0:
567 ; X86-SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
568 ; X86-SSE-NEXT:    subsd %xmm1, %xmm0
569 ; X86-SSE-NEXT:    retl
570 ;
571 ; X86-AVX-LABEL: blend_sub_sd:
572 ; X86-AVX:       # %bb.0:
573 ; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
574 ; X86-AVX-NEXT:    vsubsd %xmm1, %xmm0, %xmm0
575 ; X86-AVX-NEXT:    retl
576 ;
577 ; X64-SSE-LABEL: blend_sub_sd:
578 ; X64-SSE:       # %bb.0:
579 ; X64-SSE-NEXT:    subsd %xmm1, %xmm0
580 ; X64-SSE-NEXT:    retq
581 ;
582 ; X64-AVX-LABEL: blend_sub_sd:
583 ; X64-AVX:       # %bb.0:
584 ; X64-AVX-NEXT:    vsubsd %xmm1, %xmm0, %xmm0
585 ; X64-AVX-NEXT:    retq
586
587   %ext = extractelement <2 x double> %a, i32 0
588   %op = fsub double %ext, %b
589   %ins = insertelement <2 x double> undef, double %op, i32 0
590   %shuf = shufflevector <2 x double> %ins, <2 x double> %a, <2 x i32> <i32 0, i32 3>
591   ret <2 x double> %shuf
592 }
593
594 define <2 x double> @blend_mul_sd(<2 x double> %a, double %b) {
595 ; X86-SSE-LABEL: blend_mul_sd:
596 ; X86-SSE:       # %bb.0:
597 ; X86-SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
598 ; X86-SSE-NEXT:    mulsd %xmm1, %xmm0
599 ; X86-SSE-NEXT:    retl
600 ;
601 ; X86-AVX-LABEL: blend_mul_sd:
602 ; X86-AVX:       # %bb.0:
603 ; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
604 ; X86-AVX-NEXT:    vmulsd %xmm1, %xmm0, %xmm0
605 ; X86-AVX-NEXT:    retl
606 ;
607 ; X64-SSE-LABEL: blend_mul_sd:
608 ; X64-SSE:       # %bb.0:
609 ; X64-SSE-NEXT:    mulsd %xmm1, %xmm0
610 ; X64-SSE-NEXT:    retq
611 ;
612 ; X64-AVX-LABEL: blend_mul_sd:
613 ; X64-AVX:       # %bb.0:
614 ; X64-AVX-NEXT:    vmulsd %xmm1, %xmm0, %xmm0
615 ; X64-AVX-NEXT:    retq
616
617   %ext = extractelement <2 x double> %a, i32 0
618   %op = fmul double %b, %ext
619   %ins = insertelement <2 x double> undef, double %op, i32 0
620   %shuf = shufflevector <2 x double> %ins, <2 x double> %a, <2 x i32> <i32 0, i32 3>
621   ret <2 x double> %shuf
622 }
623
624 define <2 x double> @blend_div_sd(<2 x double> %a, double %b) {
625 ; X86-SSE-LABEL: blend_div_sd:
626 ; X86-SSE:       # %bb.0:
627 ; X86-SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
628 ; X86-SSE-NEXT:    divsd %xmm1, %xmm0
629 ; X86-SSE-NEXT:    retl
630 ;
631 ; X86-AVX-LABEL: blend_div_sd:
632 ; X86-AVX:       # %bb.0:
633 ; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
634 ; X86-AVX-NEXT:    vdivsd %xmm1, %xmm0, %xmm0
635 ; X86-AVX-NEXT:    retl
636 ;
637 ; X64-SSE-LABEL: blend_div_sd:
638 ; X64-SSE:       # %bb.0:
639 ; X64-SSE-NEXT:    divsd %xmm1, %xmm0
640 ; X64-SSE-NEXT:    retq
641 ;
642 ; X64-AVX-LABEL: blend_div_sd:
643 ; X64-AVX:       # %bb.0:
644 ; X64-AVX-NEXT:    vdivsd %xmm1, %xmm0, %xmm0
645 ; X64-AVX-NEXT:    retq
646
647   %ext = extractelement <2 x double> %a, i32 0
648   %op = fdiv double %ext, %b
649   %ins = insertelement <2 x double> undef, double %op, i32 0
650   %shuf = shufflevector <2 x double> %ins, <2 x double> %a, <2 x i32> <i32 0, i32 3>
651   ret <2 x double> %shuf
652 }
653
654 ; Ensure that the backend selects SSE/AVX scalar fp instructions
655 ; from a packed fp instruction plus a vector insert.
656
657 define <4 x float> @insert_test_add_ss(<4 x float> %a, <4 x float> %b) {
658 ; SSE2-LABEL: insert_test_add_ss:
659 ; SSE2:       # %bb.0:
660 ; SSE2-NEXT:    addps %xmm0, %xmm1
661 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
662 ; SSE2-NEXT:    ret{{[l|q]}}
663 ;
664 ; SSE41-LABEL: insert_test_add_ss:
665 ; SSE41:       # %bb.0:
666 ; SSE41-NEXT:    addps %xmm0, %xmm1
667 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
668 ; SSE41-NEXT:    ret{{[l|q]}}
669 ;
670 ; AVX-LABEL: insert_test_add_ss:
671 ; AVX:       # %bb.0:
672 ; AVX-NEXT:    vaddps %xmm1, %xmm0, %xmm1
673 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
674 ; AVX-NEXT:    ret{{[l|q]}}
675   %1 = fadd <4 x float> %a, %b
676   %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
677   ret <4 x float> %2
678 }
679
680 define <4 x float> @insert_test_sub_ss(<4 x float> %a, <4 x float> %b) {
681 ; SSE2-LABEL: insert_test_sub_ss:
682 ; SSE2:       # %bb.0:
683 ; SSE2-NEXT:    movaps %xmm0, %xmm2
684 ; SSE2-NEXT:    subps %xmm1, %xmm2
685 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3]
686 ; SSE2-NEXT:    ret{{[l|q]}}
687 ;
688 ; SSE41-LABEL: insert_test_sub_ss:
689 ; SSE41:       # %bb.0:
690 ; SSE41-NEXT:    movaps %xmm0, %xmm2
691 ; SSE41-NEXT:    subps %xmm1, %xmm2
692 ; SSE41-NEXT:    blendps {{.*#+}} xmm2 = xmm2[0],xmm0[1,2,3]
693 ; SSE41-NEXT:    movaps %xmm2, %xmm0
694 ; SSE41-NEXT:    ret{{[l|q]}}
695 ;
696 ; AVX-LABEL: insert_test_sub_ss:
697 ; AVX:       # %bb.0:
698 ; AVX-NEXT:    vsubps %xmm1, %xmm0, %xmm1
699 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
700 ; AVX-NEXT:    ret{{[l|q]}}
701   %1 = fsub <4 x float> %a, %b
702   %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
703   ret <4 x float> %2
704 }
705
706 define <4 x float> @insert_test_mul_ss(<4 x float> %a, <4 x float> %b) {
707 ; SSE2-LABEL: insert_test_mul_ss:
708 ; SSE2:       # %bb.0:
709 ; SSE2-NEXT:    mulps %xmm0, %xmm1
710 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
711 ; SSE2-NEXT:    ret{{[l|q]}}
712 ;
713 ; SSE41-LABEL: insert_test_mul_ss:
714 ; SSE41:       # %bb.0:
715 ; SSE41-NEXT:    mulps %xmm0, %xmm1
716 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
717 ; SSE41-NEXT:    ret{{[l|q]}}
718 ;
719 ; AVX-LABEL: insert_test_mul_ss:
720 ; AVX:       # %bb.0:
721 ; AVX-NEXT:    vmulps %xmm1, %xmm0, %xmm1
722 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
723 ; AVX-NEXT:    ret{{[l|q]}}
724   %1 = fmul <4 x float> %a, %b
725   %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
726   ret <4 x float> %2
727 }
728
729 define <4 x float> @insert_test_div_ss(<4 x float> %a, <4 x float> %b) {
730 ; SSE2-LABEL: insert_test_div_ss:
731 ; SSE2:       # %bb.0:
732 ; SSE2-NEXT:    movaps %xmm0, %xmm2
733 ; SSE2-NEXT:    divps %xmm1, %xmm2
734 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3]
735 ; SSE2-NEXT:    ret{{[l|q]}}
736 ;
737 ; SSE41-LABEL: insert_test_div_ss:
738 ; SSE41:       # %bb.0:
739 ; SSE41-NEXT:    movaps %xmm0, %xmm2
740 ; SSE41-NEXT:    divps %xmm1, %xmm2
741 ; SSE41-NEXT:    blendps {{.*#+}} xmm2 = xmm2[0],xmm0[1,2,3]
742 ; SSE41-NEXT:    movaps %xmm2, %xmm0
743 ; SSE41-NEXT:    ret{{[l|q]}}
744 ;
745 ; AVX-LABEL: insert_test_div_ss:
746 ; AVX:       # %bb.0:
747 ; AVX-NEXT:    vdivps %xmm1, %xmm0, %xmm1
748 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
749 ; AVX-NEXT:    ret{{[l|q]}}
750   %1 = fdiv <4 x float> %a, %b
751   %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
752   ret <4 x float> %2
753 }
754
755 define <2 x double> @insert_test_add_sd(<2 x double> %a, <2 x double> %b) {
756 ; SSE2-LABEL: insert_test_add_sd:
757 ; SSE2:       # %bb.0:
758 ; SSE2-NEXT:    addpd %xmm0, %xmm1
759 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
760 ; SSE2-NEXT:    ret{{[l|q]}}
761 ;
762 ; SSE41-LABEL: insert_test_add_sd:
763 ; SSE41:       # %bb.0:
764 ; SSE41-NEXT:    addpd %xmm0, %xmm1
765 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
766 ; SSE41-NEXT:    ret{{[l|q]}}
767 ;
768 ; AVX-LABEL: insert_test_add_sd:
769 ; AVX:       # %bb.0:
770 ; AVX-NEXT:    vaddpd %xmm1, %xmm0, %xmm1
771 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
772 ; AVX-NEXT:    ret{{[l|q]}}
773   %1 = fadd <2 x double> %a, %b
774   %2 = shufflevector <2 x double> %1, <2 x double> %a, <2 x i32> <i32 0, i32 3>
775   ret <2 x double> %2
776 }
777
778 define <2 x double> @insert_test_sub_sd(<2 x double> %a, <2 x double> %b) {
779 ; SSE2-LABEL: insert_test_sub_sd:
780 ; SSE2:       # %bb.0:
781 ; SSE2-NEXT:    movapd %xmm0, %xmm2
782 ; SSE2-NEXT:    subpd %xmm1, %xmm2
783 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
784 ; SSE2-NEXT:    ret{{[l|q]}}
785 ;
786 ; SSE41-LABEL: insert_test_sub_sd:
787 ; SSE41:       # %bb.0:
788 ; SSE41-NEXT:    movapd %xmm0, %xmm2
789 ; SSE41-NEXT:    subpd %xmm1, %xmm2
790 ; SSE41-NEXT:    blendpd {{.*#+}} xmm2 = xmm2[0],xmm0[1]
791 ; SSE41-NEXT:    movapd %xmm2, %xmm0
792 ; SSE41-NEXT:    ret{{[l|q]}}
793 ;
794 ; AVX-LABEL: insert_test_sub_sd:
795 ; AVX:       # %bb.0:
796 ; AVX-NEXT:    vsubpd %xmm1, %xmm0, %xmm1
797 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
798 ; AVX-NEXT:    ret{{[l|q]}}
799   %1 = fsub <2 x double> %a, %b
800   %2 = shufflevector <2 x double> %1, <2 x double> %a, <2 x i32> <i32 0, i32 3>
801   ret <2 x double> %2
802 }
803
804 define <2 x double> @insert_test_mul_sd(<2 x double> %a, <2 x double> %b) {
805 ; SSE2-LABEL: insert_test_mul_sd:
806 ; SSE2:       # %bb.0:
807 ; SSE2-NEXT:    mulpd %xmm0, %xmm1
808 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
809 ; SSE2-NEXT:    ret{{[l|q]}}
810 ;
811 ; SSE41-LABEL: insert_test_mul_sd:
812 ; SSE41:       # %bb.0:
813 ; SSE41-NEXT:    mulpd %xmm0, %xmm1
814 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
815 ; SSE41-NEXT:    ret{{[l|q]}}
816 ;
817 ; AVX-LABEL: insert_test_mul_sd:
818 ; AVX:       # %bb.0:
819 ; AVX-NEXT:    vmulpd %xmm1, %xmm0, %xmm1
820 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
821 ; AVX-NEXT:    ret{{[l|q]}}
822   %1 = fmul <2 x double> %a, %b
823   %2 = shufflevector <2 x double> %1, <2 x double> %a, <2 x i32> <i32 0, i32 3>
824   ret <2 x double> %2
825 }
826
827 define <2 x double> @insert_test_div_sd(<2 x double> %a, <2 x double> %b) {
828 ; SSE2-LABEL: insert_test_div_sd:
829 ; SSE2:       # %bb.0:
830 ; SSE2-NEXT:    movapd %xmm0, %xmm2
831 ; SSE2-NEXT:    divpd %xmm1, %xmm2
832 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
833 ; SSE2-NEXT:    ret{{[l|q]}}
834 ;
835 ; SSE41-LABEL: insert_test_div_sd:
836 ; SSE41:       # %bb.0:
837 ; SSE41-NEXT:    movapd %xmm0, %xmm2
838 ; SSE41-NEXT:    divpd %xmm1, %xmm2
839 ; SSE41-NEXT:    blendpd {{.*#+}} xmm2 = xmm2[0],xmm0[1]
840 ; SSE41-NEXT:    movapd %xmm2, %xmm0
841 ; SSE41-NEXT:    ret{{[l|q]}}
842 ;
843 ; AVX-LABEL: insert_test_div_sd:
844 ; AVX:       # %bb.0:
845 ; AVX-NEXT:    vdivpd %xmm1, %xmm0, %xmm1
846 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
847 ; AVX-NEXT:    ret{{[l|q]}}
848   %1 = fdiv <2 x double> %a, %b
849   %2 = shufflevector <2 x double> %1, <2 x double> %a, <2 x i32> <i32 0, i32 3>
850   ret <2 x double> %2
851 }
852
853 define <4 x float> @insert_test2_add_ss(<4 x float> %a, <4 x float> %b) {
854 ; SSE2-LABEL: insert_test2_add_ss:
855 ; SSE2:       # %bb.0:
856 ; SSE2-NEXT:    addps %xmm1, %xmm0
857 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
858 ; SSE2-NEXT:    movaps %xmm1, %xmm0
859 ; SSE2-NEXT:    ret{{[l|q]}}
860 ;
861 ; SSE41-LABEL: insert_test2_add_ss:
862 ; SSE41:       # %bb.0:
863 ; SSE41-NEXT:    addps %xmm1, %xmm0
864 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
865 ; SSE41-NEXT:    ret{{[l|q]}}
866 ;
867 ; AVX-LABEL: insert_test2_add_ss:
868 ; AVX:       # %bb.0:
869 ; AVX-NEXT:    vaddps %xmm0, %xmm1, %xmm0
870 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
871 ; AVX-NEXT:    ret{{[l|q]}}
872   %1 = fadd <4 x float> %b, %a
873   %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
874   ret <4 x float> %2
875 }
876
877 define <4 x float> @insert_test2_sub_ss(<4 x float> %a, <4 x float> %b) {
878 ; SSE2-LABEL: insert_test2_sub_ss:
879 ; SSE2:       # %bb.0:
880 ; SSE2-NEXT:    movaps %xmm1, %xmm2
881 ; SSE2-NEXT:    subps %xmm0, %xmm2
882 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3]
883 ; SSE2-NEXT:    movaps %xmm1, %xmm0
884 ; SSE2-NEXT:    ret{{[l|q]}}
885 ;
886 ; SSE41-LABEL: insert_test2_sub_ss:
887 ; SSE41:       # %bb.0:
888 ; SSE41-NEXT:    movaps %xmm1, %xmm2
889 ; SSE41-NEXT:    subps %xmm0, %xmm2
890 ; SSE41-NEXT:    blendps {{.*#+}} xmm2 = xmm2[0],xmm1[1,2,3]
891 ; SSE41-NEXT:    movaps %xmm2, %xmm0
892 ; SSE41-NEXT:    ret{{[l|q]}}
893 ;
894 ; AVX-LABEL: insert_test2_sub_ss:
895 ; AVX:       # %bb.0:
896 ; AVX-NEXT:    vsubps %xmm0, %xmm1, %xmm0
897 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
898 ; AVX-NEXT:    ret{{[l|q]}}
899   %1 = fsub <4 x float> %b, %a
900   %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
901   ret <4 x float> %2
902 }
903
904 define <4 x float> @insert_test2_mul_ss(<4 x float> %a, <4 x float> %b) {
905 ; SSE2-LABEL: insert_test2_mul_ss:
906 ; SSE2:       # %bb.0:
907 ; SSE2-NEXT:    mulps %xmm1, %xmm0
908 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
909 ; SSE2-NEXT:    movaps %xmm1, %xmm0
910 ; SSE2-NEXT:    ret{{[l|q]}}
911 ;
912 ; SSE41-LABEL: insert_test2_mul_ss:
913 ; SSE41:       # %bb.0:
914 ; SSE41-NEXT:    mulps %xmm1, %xmm0
915 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
916 ; SSE41-NEXT:    ret{{[l|q]}}
917 ;
918 ; AVX-LABEL: insert_test2_mul_ss:
919 ; AVX:       # %bb.0:
920 ; AVX-NEXT:    vmulps %xmm0, %xmm1, %xmm0
921 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
922 ; AVX-NEXT:    ret{{[l|q]}}
923   %1 = fmul <4 x float> %b, %a
924   %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
925   ret <4 x float> %2
926 }
927
928 define <4 x float> @insert_test2_div_ss(<4 x float> %a, <4 x float> %b) {
929 ; SSE2-LABEL: insert_test2_div_ss:
930 ; SSE2:       # %bb.0:
931 ; SSE2-NEXT:    movaps %xmm1, %xmm2
932 ; SSE2-NEXT:    divps %xmm0, %xmm2
933 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3]
934 ; SSE2-NEXT:    movaps %xmm1, %xmm0
935 ; SSE2-NEXT:    ret{{[l|q]}}
936 ;
937 ; SSE41-LABEL: insert_test2_div_ss:
938 ; SSE41:       # %bb.0:
939 ; SSE41-NEXT:    movaps %xmm1, %xmm2
940 ; SSE41-NEXT:    divps %xmm0, %xmm2
941 ; SSE41-NEXT:    blendps {{.*#+}} xmm2 = xmm2[0],xmm1[1,2,3]
942 ; SSE41-NEXT:    movaps %xmm2, %xmm0
943 ; SSE41-NEXT:    ret{{[l|q]}}
944 ;
945 ; AVX-LABEL: insert_test2_div_ss:
946 ; AVX:       # %bb.0:
947 ; AVX-NEXT:    vdivps %xmm0, %xmm1, %xmm0
948 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
949 ; AVX-NEXT:    ret{{[l|q]}}
950   %1 = fdiv <4 x float> %b, %a
951   %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
952   ret <4 x float> %2
953 }
954
955 define <2 x double> @insert_test2_add_sd(<2 x double> %a, <2 x double> %b) {
956 ; SSE2-LABEL: insert_test2_add_sd:
957 ; SSE2:       # %bb.0:
958 ; SSE2-NEXT:    addpd %xmm1, %xmm0
959 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
960 ; SSE2-NEXT:    movapd %xmm1, %xmm0
961 ; SSE2-NEXT:    ret{{[l|q]}}
962 ;
963 ; SSE41-LABEL: insert_test2_add_sd:
964 ; SSE41:       # %bb.0:
965 ; SSE41-NEXT:    addpd %xmm1, %xmm0
966 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
967 ; SSE41-NEXT:    ret{{[l|q]}}
968 ;
969 ; AVX-LABEL: insert_test2_add_sd:
970 ; AVX:       # %bb.0:
971 ; AVX-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
972 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
973 ; AVX-NEXT:    ret{{[l|q]}}
974   %1 = fadd <2 x double> %b, %a
975   %2 = shufflevector <2 x double> %1, <2 x double> %b, <2 x i32> <i32 0, i32 3>
976   ret <2 x double> %2
977 }
978
979 define <2 x double> @insert_test2_sub_sd(<2 x double> %a, <2 x double> %b) {
980 ; SSE2-LABEL: insert_test2_sub_sd:
981 ; SSE2:       # %bb.0:
982 ; SSE2-NEXT:    movapd %xmm1, %xmm2
983 ; SSE2-NEXT:    subpd %xmm0, %xmm2
984 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
985 ; SSE2-NEXT:    movapd %xmm1, %xmm0
986 ; SSE2-NEXT:    ret{{[l|q]}}
987 ;
988 ; SSE41-LABEL: insert_test2_sub_sd:
989 ; SSE41:       # %bb.0:
990 ; SSE41-NEXT:    movapd %xmm1, %xmm2
991 ; SSE41-NEXT:    subpd %xmm0, %xmm2
992 ; SSE41-NEXT:    blendpd {{.*#+}} xmm2 = xmm2[0],xmm1[1]
993 ; SSE41-NEXT:    movapd %xmm2, %xmm0
994 ; SSE41-NEXT:    ret{{[l|q]}}
995 ;
996 ; AVX-LABEL: insert_test2_sub_sd:
997 ; AVX:       # %bb.0:
998 ; AVX-NEXT:    vsubpd %xmm0, %xmm1, %xmm0
999 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
1000 ; AVX-NEXT:    ret{{[l|q]}}
1001   %1 = fsub <2 x double> %b, %a
1002   %2 = shufflevector <2 x double> %1, <2 x double> %b, <2 x i32> <i32 0, i32 3>
1003   ret <2 x double> %2
1004 }
1005
1006 define <2 x double> @insert_test2_mul_sd(<2 x double> %a, <2 x double> %b) {
1007 ; SSE2-LABEL: insert_test2_mul_sd:
1008 ; SSE2:       # %bb.0:
1009 ; SSE2-NEXT:    mulpd %xmm1, %xmm0
1010 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
1011 ; SSE2-NEXT:    movapd %xmm1, %xmm0
1012 ; SSE2-NEXT:    ret{{[l|q]}}
1013 ;
1014 ; SSE41-LABEL: insert_test2_mul_sd:
1015 ; SSE41:       # %bb.0:
1016 ; SSE41-NEXT:    mulpd %xmm1, %xmm0
1017 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
1018 ; SSE41-NEXT:    ret{{[l|q]}}
1019 ;
1020 ; AVX-LABEL: insert_test2_mul_sd:
1021 ; AVX:       # %bb.0:
1022 ; AVX-NEXT:    vmulpd %xmm0, %xmm1, %xmm0
1023 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
1024 ; AVX-NEXT:    ret{{[l|q]}}
1025   %1 = fmul <2 x double> %b, %a
1026   %2 = shufflevector <2 x double> %1, <2 x double> %b, <2 x i32> <i32 0, i32 3>
1027   ret <2 x double> %2
1028 }
1029
1030 define <2 x double> @insert_test2_div_sd(<2 x double> %a, <2 x double> %b) {
1031 ; SSE2-LABEL: insert_test2_div_sd:
1032 ; SSE2:       # %bb.0:
1033 ; SSE2-NEXT:    movapd %xmm1, %xmm2
1034 ; SSE2-NEXT:    divpd %xmm0, %xmm2
1035 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
1036 ; SSE2-NEXT:    movapd %xmm1, %xmm0
1037 ; SSE2-NEXT:    ret{{[l|q]}}
1038 ;
1039 ; SSE41-LABEL: insert_test2_div_sd:
1040 ; SSE41:       # %bb.0:
1041 ; SSE41-NEXT:    movapd %xmm1, %xmm2
1042 ; SSE41-NEXT:    divpd %xmm0, %xmm2
1043 ; SSE41-NEXT:    blendpd {{.*#+}} xmm2 = xmm2[0],xmm1[1]
1044 ; SSE41-NEXT:    movapd %xmm2, %xmm0
1045 ; SSE41-NEXT:    ret{{[l|q]}}
1046 ;
1047 ; AVX-LABEL: insert_test2_div_sd:
1048 ; AVX:       # %bb.0:
1049 ; AVX-NEXT:    vdivpd %xmm0, %xmm1, %xmm0
1050 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
1051 ; AVX-NEXT:    ret{{[l|q]}}
1052   %1 = fdiv <2 x double> %b, %a
1053   %2 = shufflevector <2 x double> %1, <2 x double> %b, <2 x i32> <i32 0, i32 3>
1054   ret <2 x double> %2
1055 }
1056
1057 define <4 x float> @insert_test3_add_ss(<4 x float> %a, <4 x float> %b) {
1058 ; SSE2-LABEL: insert_test3_add_ss:
1059 ; SSE2:       # %bb.0:
1060 ; SSE2-NEXT:    addps %xmm0, %xmm1
1061 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1062 ; SSE2-NEXT:    ret{{[l|q]}}
1063 ;
1064 ; SSE41-LABEL: insert_test3_add_ss:
1065 ; SSE41:       # %bb.0:
1066 ; SSE41-NEXT:    addps %xmm0, %xmm1
1067 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1068 ; SSE41-NEXT:    ret{{[l|q]}}
1069 ;
1070 ; AVX-LABEL: insert_test3_add_ss:
1071 ; AVX:       # %bb.0:
1072 ; AVX-NEXT:    vaddps %xmm1, %xmm0, %xmm1
1073 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1074 ; AVX-NEXT:    ret{{[l|q]}}
1075   %1 = fadd <4 x float> %a, %b
1076   %2 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x float> %a, <4 x float> %1
1077   ret <4 x float> %2
1078 }
1079
1080 define <4 x float> @insert_test3_sub_ss(<4 x float> %a, <4 x float> %b) {
1081 ; SSE2-LABEL: insert_test3_sub_ss:
1082 ; SSE2:       # %bb.0:
1083 ; SSE2-NEXT:    movaps %xmm0, %xmm2
1084 ; SSE2-NEXT:    subps %xmm1, %xmm2
1085 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3]
1086 ; SSE2-NEXT:    ret{{[l|q]}}
1087 ;
1088 ; SSE41-LABEL: insert_test3_sub_ss:
1089 ; SSE41:       # %bb.0:
1090 ; SSE41-NEXT:    movaps %xmm0, %xmm2
1091 ; SSE41-NEXT:    subps %xmm1, %xmm2
1092 ; SSE41-NEXT:    blendps {{.*#+}} xmm2 = xmm2[0],xmm0[1,2,3]
1093 ; SSE41-NEXT:    movaps %xmm2, %xmm0
1094 ; SSE41-NEXT:    ret{{[l|q]}}
1095 ;
1096 ; AVX-LABEL: insert_test3_sub_ss:
1097 ; AVX:       # %bb.0:
1098 ; AVX-NEXT:    vsubps %xmm1, %xmm0, %xmm1
1099 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1100 ; AVX-NEXT:    ret{{[l|q]}}
1101   %1 = fsub <4 x float> %a, %b
1102   %2 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x float> %a, <4 x float> %1
1103   ret <4 x float> %2
1104 }
1105
1106 define <4 x float> @insert_test3_mul_ss(<4 x float> %a, <4 x float> %b) {
1107 ; SSE2-LABEL: insert_test3_mul_ss:
1108 ; SSE2:       # %bb.0:
1109 ; SSE2-NEXT:    mulps %xmm0, %xmm1
1110 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1111 ; SSE2-NEXT:    ret{{[l|q]}}
1112 ;
1113 ; SSE41-LABEL: insert_test3_mul_ss:
1114 ; SSE41:       # %bb.0:
1115 ; SSE41-NEXT:    mulps %xmm0, %xmm1
1116 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1117 ; SSE41-NEXT:    ret{{[l|q]}}
1118 ;
1119 ; AVX-LABEL: insert_test3_mul_ss:
1120 ; AVX:       # %bb.0:
1121 ; AVX-NEXT:    vmulps %xmm1, %xmm0, %xmm1
1122 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1123 ; AVX-NEXT:    ret{{[l|q]}}
1124   %1 = fmul <4 x float> %a, %b
1125   %2 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x float> %a, <4 x float> %1
1126   ret <4 x float> %2
1127 }
1128
1129 define <4 x float> @insert_test3_div_ss(<4 x float> %a, <4 x float> %b) {
1130 ; SSE2-LABEL: insert_test3_div_ss:
1131 ; SSE2:       # %bb.0:
1132 ; SSE2-NEXT:    movaps %xmm0, %xmm2
1133 ; SSE2-NEXT:    divps %xmm1, %xmm2
1134 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3]
1135 ; SSE2-NEXT:    ret{{[l|q]}}
1136 ;
1137 ; SSE41-LABEL: insert_test3_div_ss:
1138 ; SSE41:       # %bb.0:
1139 ; SSE41-NEXT:    movaps %xmm0, %xmm2
1140 ; SSE41-NEXT:    divps %xmm1, %xmm2
1141 ; SSE41-NEXT:    blendps {{.*#+}} xmm2 = xmm2[0],xmm0[1,2,3]
1142 ; SSE41-NEXT:    movaps %xmm2, %xmm0
1143 ; SSE41-NEXT:    ret{{[l|q]}}
1144 ;
1145 ; AVX-LABEL: insert_test3_div_ss:
1146 ; AVX:       # %bb.0:
1147 ; AVX-NEXT:    vdivps %xmm1, %xmm0, %xmm1
1148 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1149 ; AVX-NEXT:    ret{{[l|q]}}
1150   %1 = fdiv <4 x float> %a, %b
1151   %2 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x float> %a, <4 x float> %1
1152   ret <4 x float> %2
1153 }
1154
1155 define <2 x double> @insert_test3_add_sd(<2 x double> %a, <2 x double> %b) {
1156 ; SSE2-LABEL: insert_test3_add_sd:
1157 ; SSE2:       # %bb.0:
1158 ; SSE2-NEXT:    addpd %xmm0, %xmm1
1159 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1160 ; SSE2-NEXT:    ret{{[l|q]}}
1161 ;
1162 ; SSE41-LABEL: insert_test3_add_sd:
1163 ; SSE41:       # %bb.0:
1164 ; SSE41-NEXT:    addpd %xmm0, %xmm1
1165 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1166 ; SSE41-NEXT:    ret{{[l|q]}}
1167 ;
1168 ; AVX-LABEL: insert_test3_add_sd:
1169 ; AVX:       # %bb.0:
1170 ; AVX-NEXT:    vaddpd %xmm1, %xmm0, %xmm1
1171 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1172 ; AVX-NEXT:    ret{{[l|q]}}
1173   %1 = fadd <2 x double> %a, %b
1174   %2 = select <2 x i1> <i1 false, i1 true>, <2 x double> %a, <2 x double> %1
1175   ret <2 x double> %2
1176 }
1177
1178 define <2 x double> @insert_test3_sub_sd(<2 x double> %a, <2 x double> %b) {
1179 ; SSE2-LABEL: insert_test3_sub_sd:
1180 ; SSE2:       # %bb.0:
1181 ; SSE2-NEXT:    movapd %xmm0, %xmm2
1182 ; SSE2-NEXT:    subpd %xmm1, %xmm2
1183 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
1184 ; SSE2-NEXT:    ret{{[l|q]}}
1185 ;
1186 ; SSE41-LABEL: insert_test3_sub_sd:
1187 ; SSE41:       # %bb.0:
1188 ; SSE41-NEXT:    movapd %xmm0, %xmm2
1189 ; SSE41-NEXT:    subpd %xmm1, %xmm2
1190 ; SSE41-NEXT:    blendpd {{.*#+}} xmm2 = xmm2[0],xmm0[1]
1191 ; SSE41-NEXT:    movapd %xmm2, %xmm0
1192 ; SSE41-NEXT:    ret{{[l|q]}}
1193 ;
1194 ; AVX-LABEL: insert_test3_sub_sd:
1195 ; AVX:       # %bb.0:
1196 ; AVX-NEXT:    vsubpd %xmm1, %xmm0, %xmm1
1197 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1198 ; AVX-NEXT:    ret{{[l|q]}}
1199   %1 = fsub <2 x double> %a, %b
1200   %2 = select <2 x i1> <i1 false, i1 true>, <2 x double> %a, <2 x double> %1
1201   ret <2 x double> %2
1202 }
1203
1204 define <2 x double> @insert_test3_mul_sd(<2 x double> %a, <2 x double> %b) {
1205 ; SSE2-LABEL: insert_test3_mul_sd:
1206 ; SSE2:       # %bb.0:
1207 ; SSE2-NEXT:    mulpd %xmm0, %xmm1
1208 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1209 ; SSE2-NEXT:    ret{{[l|q]}}
1210 ;
1211 ; SSE41-LABEL: insert_test3_mul_sd:
1212 ; SSE41:       # %bb.0:
1213 ; SSE41-NEXT:    mulpd %xmm0, %xmm1
1214 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1215 ; SSE41-NEXT:    ret{{[l|q]}}
1216 ;
1217 ; AVX-LABEL: insert_test3_mul_sd:
1218 ; AVX:       # %bb.0:
1219 ; AVX-NEXT:    vmulpd %xmm1, %xmm0, %xmm1
1220 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1221 ; AVX-NEXT:    ret{{[l|q]}}
1222   %1 = fmul <2 x double> %a, %b
1223   %2 = select <2 x i1> <i1 false, i1 true>, <2 x double> %a, <2 x double> %1
1224   ret <2 x double> %2
1225 }
1226
1227 define <2 x double> @insert_test3_div_sd(<2 x double> %a, <2 x double> %b) {
1228 ; SSE2-LABEL: insert_test3_div_sd:
1229 ; SSE2:       # %bb.0:
1230 ; SSE2-NEXT:    movapd %xmm0, %xmm2
1231 ; SSE2-NEXT:    divpd %xmm1, %xmm2
1232 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
1233 ; SSE2-NEXT:    ret{{[l|q]}}
1234 ;
1235 ; SSE41-LABEL: insert_test3_div_sd:
1236 ; SSE41:       # %bb.0:
1237 ; SSE41-NEXT:    movapd %xmm0, %xmm2
1238 ; SSE41-NEXT:    divpd %xmm1, %xmm2
1239 ; SSE41-NEXT:    blendpd {{.*#+}} xmm2 = xmm2[0],xmm0[1]
1240 ; SSE41-NEXT:    movapd %xmm2, %xmm0
1241 ; SSE41-NEXT:    ret{{[l|q]}}
1242 ;
1243 ; AVX-LABEL: insert_test3_div_sd:
1244 ; AVX:       # %bb.0:
1245 ; AVX-NEXT:    vdivpd %xmm1, %xmm0, %xmm1
1246 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1247 ; AVX-NEXT:    ret{{[l|q]}}
1248   %1 = fdiv <2 x double> %a, %b
1249   %2 = select <2 x i1> <i1 false, i1 true>, <2 x double> %a, <2 x double> %1
1250   ret <2 x double> %2
1251 }
1252
1253 define <4 x float> @insert_test4_add_ss(<4 x float> %a, <4 x float> %b) {
1254 ; SSE2-LABEL: insert_test4_add_ss:
1255 ; SSE2:       # %bb.0:
1256 ; SSE2-NEXT:    addps %xmm1, %xmm0
1257 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1258 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1259 ; SSE2-NEXT:    ret{{[l|q]}}
1260 ;
1261 ; SSE41-LABEL: insert_test4_add_ss:
1262 ; SSE41:       # %bb.0:
1263 ; SSE41-NEXT:    addps %xmm1, %xmm0
1264 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1265 ; SSE41-NEXT:    ret{{[l|q]}}
1266 ;
1267 ; AVX-LABEL: insert_test4_add_ss:
1268 ; AVX:       # %bb.0:
1269 ; AVX-NEXT:    vaddps %xmm0, %xmm1, %xmm0
1270 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1271 ; AVX-NEXT:    ret{{[l|q]}}
1272   %1 = fadd <4 x float> %b, %a
1273   %2 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x float> %b, <4 x float> %1
1274   ret <4 x float> %2
1275 }
1276
1277 define <4 x float> @insert_test4_sub_ss(<4 x float> %a, <4 x float> %b) {
1278 ; SSE2-LABEL: insert_test4_sub_ss:
1279 ; SSE2:       # %bb.0:
1280 ; SSE2-NEXT:    movaps %xmm1, %xmm2
1281 ; SSE2-NEXT:    subps %xmm0, %xmm2
1282 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3]
1283 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1284 ; SSE2-NEXT:    ret{{[l|q]}}
1285 ;
1286 ; SSE41-LABEL: insert_test4_sub_ss:
1287 ; SSE41:       # %bb.0:
1288 ; SSE41-NEXT:    movaps %xmm1, %xmm2
1289 ; SSE41-NEXT:    subps %xmm0, %xmm2
1290 ; SSE41-NEXT:    blendps {{.*#+}} xmm2 = xmm2[0],xmm1[1,2,3]
1291 ; SSE41-NEXT:    movaps %xmm2, %xmm0
1292 ; SSE41-NEXT:    ret{{[l|q]}}
1293 ;
1294 ; AVX-LABEL: insert_test4_sub_ss:
1295 ; AVX:       # %bb.0:
1296 ; AVX-NEXT:    vsubps %xmm0, %xmm1, %xmm0
1297 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1298 ; AVX-NEXT:    ret{{[l|q]}}
1299   %1 = fsub <4 x float> %b, %a
1300   %2 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x float> %b, <4 x float> %1
1301   ret <4 x float> %2
1302 }
1303
1304 define <4 x float> @insert_test4_mul_ss(<4 x float> %a, <4 x float> %b) {
1305 ; SSE2-LABEL: insert_test4_mul_ss:
1306 ; SSE2:       # %bb.0:
1307 ; SSE2-NEXT:    mulps %xmm1, %xmm0
1308 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1309 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1310 ; SSE2-NEXT:    ret{{[l|q]}}
1311 ;
1312 ; SSE41-LABEL: insert_test4_mul_ss:
1313 ; SSE41:       # %bb.0:
1314 ; SSE41-NEXT:    mulps %xmm1, %xmm0
1315 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1316 ; SSE41-NEXT:    ret{{[l|q]}}
1317 ;
1318 ; AVX-LABEL: insert_test4_mul_ss:
1319 ; AVX:       # %bb.0:
1320 ; AVX-NEXT:    vmulps %xmm0, %xmm1, %xmm0
1321 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1322 ; AVX-NEXT:    ret{{[l|q]}}
1323   %1 = fmul <4 x float> %b, %a
1324   %2 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x float> %b, <4 x float> %1
1325   ret <4 x float> %2
1326 }
1327
1328 define <4 x float> @insert_test4_div_ss(<4 x float> %a, <4 x float> %b) {
1329 ; SSE2-LABEL: insert_test4_div_ss:
1330 ; SSE2:       # %bb.0:
1331 ; SSE2-NEXT:    movaps %xmm1, %xmm2
1332 ; SSE2-NEXT:    divps %xmm0, %xmm2
1333 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3]
1334 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1335 ; SSE2-NEXT:    ret{{[l|q]}}
1336 ;
1337 ; SSE41-LABEL: insert_test4_div_ss:
1338 ; SSE41:       # %bb.0:
1339 ; SSE41-NEXT:    movaps %xmm1, %xmm2
1340 ; SSE41-NEXT:    divps %xmm0, %xmm2
1341 ; SSE41-NEXT:    blendps {{.*#+}} xmm2 = xmm2[0],xmm1[1,2,3]
1342 ; SSE41-NEXT:    movaps %xmm2, %xmm0
1343 ; SSE41-NEXT:    ret{{[l|q]}}
1344 ;
1345 ; AVX-LABEL: insert_test4_div_ss:
1346 ; AVX:       # %bb.0:
1347 ; AVX-NEXT:    vdivps %xmm0, %xmm1, %xmm0
1348 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1349 ; AVX-NEXT:    ret{{[l|q]}}
1350   %1 = fdiv <4 x float> %b, %a
1351   %2 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x float> %b, <4 x float> %1
1352   ret <4 x float> %2
1353 }
1354
1355 define <2 x double> @insert_test4_add_sd(<2 x double> %a, <2 x double> %b) {
1356 ; SSE2-LABEL: insert_test4_add_sd:
1357 ; SSE2:       # %bb.0:
1358 ; SSE2-NEXT:    addpd %xmm1, %xmm0
1359 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
1360 ; SSE2-NEXT:    movapd %xmm1, %xmm0
1361 ; SSE2-NEXT:    ret{{[l|q]}}
1362 ;
1363 ; SSE41-LABEL: insert_test4_add_sd:
1364 ; SSE41:       # %bb.0:
1365 ; SSE41-NEXT:    addpd %xmm1, %xmm0
1366 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
1367 ; SSE41-NEXT:    ret{{[l|q]}}
1368 ;
1369 ; AVX-LABEL: insert_test4_add_sd:
1370 ; AVX:       # %bb.0:
1371 ; AVX-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
1372 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
1373 ; AVX-NEXT:    ret{{[l|q]}}
1374   %1 = fadd <2 x double> %b, %a
1375   %2 = select <2 x i1> <i1 false, i1 true>, <2 x double> %b, <2 x double> %1
1376   ret <2 x double> %2
1377 }
1378
1379 define <2 x double> @insert_test4_sub_sd(<2 x double> %a, <2 x double> %b) {
1380 ; SSE2-LABEL: insert_test4_sub_sd:
1381 ; SSE2:       # %bb.0:
1382 ; SSE2-NEXT:    movapd %xmm1, %xmm2
1383 ; SSE2-NEXT:    subpd %xmm0, %xmm2
1384 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
1385 ; SSE2-NEXT:    movapd %xmm1, %xmm0
1386 ; SSE2-NEXT:    ret{{[l|q]}}
1387 ;
1388 ; SSE41-LABEL: insert_test4_sub_sd:
1389 ; SSE41:       # %bb.0:
1390 ; SSE41-NEXT:    movapd %xmm1, %xmm2
1391 ; SSE41-NEXT:    subpd %xmm0, %xmm2
1392 ; SSE41-NEXT:    blendpd {{.*#+}} xmm2 = xmm2[0],xmm1[1]
1393 ; SSE41-NEXT:    movapd %xmm2, %xmm0
1394 ; SSE41-NEXT:    ret{{[l|q]}}
1395 ;
1396 ; AVX-LABEL: insert_test4_sub_sd:
1397 ; AVX:       # %bb.0:
1398 ; AVX-NEXT:    vsubpd %xmm0, %xmm1, %xmm0
1399 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
1400 ; AVX-NEXT:    ret{{[l|q]}}
1401   %1 = fsub <2 x double> %b, %a
1402   %2 = select <2 x i1> <i1 false, i1 true>, <2 x double> %b, <2 x double> %1
1403   ret <2 x double> %2
1404 }
1405
1406 define <2 x double> @insert_test4_mul_sd(<2 x double> %a, <2 x double> %b) {
1407 ; SSE2-LABEL: insert_test4_mul_sd:
1408 ; SSE2:       # %bb.0:
1409 ; SSE2-NEXT:    mulpd %xmm1, %xmm0
1410 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
1411 ; SSE2-NEXT:    movapd %xmm1, %xmm0
1412 ; SSE2-NEXT:    ret{{[l|q]}}
1413 ;
1414 ; SSE41-LABEL: insert_test4_mul_sd:
1415 ; SSE41:       # %bb.0:
1416 ; SSE41-NEXT:    mulpd %xmm1, %xmm0
1417 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
1418 ; SSE41-NEXT:    ret{{[l|q]}}
1419 ;
1420 ; AVX-LABEL: insert_test4_mul_sd:
1421 ; AVX:       # %bb.0:
1422 ; AVX-NEXT:    vmulpd %xmm0, %xmm1, %xmm0
1423 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
1424 ; AVX-NEXT:    ret{{[l|q]}}
1425   %1 = fmul <2 x double> %b, %a
1426   %2 = select <2 x i1> <i1 false, i1 true>, <2 x double> %b, <2 x double> %1
1427   ret <2 x double> %2
1428 }
1429
1430 define <2 x double> @insert_test4_div_sd(<2 x double> %a, <2 x double> %b) {
1431 ; SSE2-LABEL: insert_test4_div_sd:
1432 ; SSE2:       # %bb.0:
1433 ; SSE2-NEXT:    movapd %xmm1, %xmm2
1434 ; SSE2-NEXT:    divpd %xmm0, %xmm2
1435 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
1436 ; SSE2-NEXT:    movapd %xmm1, %xmm0
1437 ; SSE2-NEXT:    ret{{[l|q]}}
1438 ;
1439 ; SSE41-LABEL: insert_test4_div_sd:
1440 ; SSE41:       # %bb.0:
1441 ; SSE41-NEXT:    movapd %xmm1, %xmm2
1442 ; SSE41-NEXT:    divpd %xmm0, %xmm2
1443 ; SSE41-NEXT:    blendpd {{.*#+}} xmm2 = xmm2[0],xmm1[1]
1444 ; SSE41-NEXT:    movapd %xmm2, %xmm0
1445 ; SSE41-NEXT:    ret{{[l|q]}}
1446 ;
1447 ; AVX-LABEL: insert_test4_div_sd:
1448 ; AVX:       # %bb.0:
1449 ; AVX-NEXT:    vdivpd %xmm0, %xmm1, %xmm0
1450 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
1451 ; AVX-NEXT:    ret{{[l|q]}}
1452   %1 = fdiv <2 x double> %b, %a
1453   %2 = select <2 x i1> <i1 false, i1 true>, <2 x double> %b, <2 x double> %1
1454   ret <2 x double> %2
1455 }
1456
1457 define <4 x float> @insert_test5_add_ss(<4 x float> %a, <4 x float> %b) {
1458 ; SSE2-LABEL: insert_test5_add_ss:
1459 ; SSE2:       # %bb.0:
1460 ; SSE2-NEXT:    addps %xmm0, %xmm1
1461 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1462 ; SSE2-NEXT:    ret{{[l|q]}}
1463 ;
1464 ; SSE41-LABEL: insert_test5_add_ss:
1465 ; SSE41:       # %bb.0:
1466 ; SSE41-NEXT:    addps %xmm0, %xmm1
1467 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1468 ; SSE41-NEXT:    ret{{[l|q]}}
1469 ;
1470 ; AVX-LABEL: insert_test5_add_ss:
1471 ; AVX:       # %bb.0:
1472 ; AVX-NEXT:    vaddps %xmm0, %xmm1, %xmm1
1473 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1474 ; AVX-NEXT:    ret{{[l|q]}}
1475   %1 = fadd <4 x float> %b, %a
1476   %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1477   ret <4 x float> %2
1478 }
1479
1480 define <4 x float> @insert_test5_sub_ss(<4 x float> %a, <4 x float> %b) {
1481 ; SSE2-LABEL: insert_test5_sub_ss:
1482 ; SSE2:       # %bb.0:
1483 ; SSE2-NEXT:    subps %xmm0, %xmm1
1484 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1485 ; SSE2-NEXT:    ret{{[l|q]}}
1486 ;
1487 ; SSE41-LABEL: insert_test5_sub_ss:
1488 ; SSE41:       # %bb.0:
1489 ; SSE41-NEXT:    subps %xmm0, %xmm1
1490 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1491 ; SSE41-NEXT:    ret{{[l|q]}}
1492 ;
1493 ; AVX-LABEL: insert_test5_sub_ss:
1494 ; AVX:       # %bb.0:
1495 ; AVX-NEXT:    vsubps %xmm0, %xmm1, %xmm1
1496 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1497 ; AVX-NEXT:    ret{{[l|q]}}
1498   %1 = fsub <4 x float> %b, %a
1499   %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1500   ret <4 x float> %2
1501 }
1502
1503 define <4 x float> @insert_test5_mul_ss(<4 x float> %a, <4 x float> %b) {
1504 ; SSE2-LABEL: insert_test5_mul_ss:
1505 ; SSE2:       # %bb.0:
1506 ; SSE2-NEXT:    mulps %xmm0, %xmm1
1507 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1508 ; SSE2-NEXT:    ret{{[l|q]}}
1509 ;
1510 ; SSE41-LABEL: insert_test5_mul_ss:
1511 ; SSE41:       # %bb.0:
1512 ; SSE41-NEXT:    mulps %xmm0, %xmm1
1513 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1514 ; SSE41-NEXT:    ret{{[l|q]}}
1515 ;
1516 ; AVX-LABEL: insert_test5_mul_ss:
1517 ; AVX:       # %bb.0:
1518 ; AVX-NEXT:    vmulps %xmm0, %xmm1, %xmm1
1519 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1520 ; AVX-NEXT:    ret{{[l|q]}}
1521   %1 = fmul <4 x float> %b, %a
1522   %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1523   ret <4 x float> %2
1524 }
1525
1526 define <4 x float> @insert_test5_div_ss(<4 x float> %a, <4 x float> %b) {
1527 ; SSE2-LABEL: insert_test5_div_ss:
1528 ; SSE2:       # %bb.0:
1529 ; SSE2-NEXT:    divps %xmm0, %xmm1
1530 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1531 ; SSE2-NEXT:    ret{{[l|q]}}
1532 ;
1533 ; SSE41-LABEL: insert_test5_div_ss:
1534 ; SSE41:       # %bb.0:
1535 ; SSE41-NEXT:    divps %xmm0, %xmm1
1536 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1537 ; SSE41-NEXT:    ret{{[l|q]}}
1538 ;
1539 ; AVX-LABEL: insert_test5_div_ss:
1540 ; AVX:       # %bb.0:
1541 ; AVX-NEXT:    vdivps %xmm0, %xmm1, %xmm1
1542 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1543 ; AVX-NEXT:    ret{{[l|q]}}
1544   %1 = fdiv <4 x float> %b, %a
1545   %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1546   ret <4 x float> %2
1547 }
1548
1549 define <2 x double> @insert_test5_add_sd(<2 x double> %a, <2 x double> %b) {
1550 ; SSE2-LABEL: insert_test5_add_sd:
1551 ; SSE2:       # %bb.0:
1552 ; SSE2-NEXT:    addpd %xmm0, %xmm1
1553 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1554 ; SSE2-NEXT:    ret{{[l|q]}}
1555 ;
1556 ; SSE41-LABEL: insert_test5_add_sd:
1557 ; SSE41:       # %bb.0:
1558 ; SSE41-NEXT:    addpd %xmm0, %xmm1
1559 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1560 ; SSE41-NEXT:    ret{{[l|q]}}
1561 ;
1562 ; AVX-LABEL: insert_test5_add_sd:
1563 ; AVX:       # %bb.0:
1564 ; AVX-NEXT:    vaddpd %xmm0, %xmm1, %xmm1
1565 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1566 ; AVX-NEXT:    ret{{[l|q]}}
1567   %1 = fadd <2 x double> %b, %a
1568   %2 = shufflevector <2 x double> %1, <2 x double> %a, <2 x i32> <i32 0, i32 3>
1569   ret <2 x double> %2
1570 }
1571
1572 define <2 x double> @insert_test5_sub_sd(<2 x double> %a, <2 x double> %b) {
1573 ; SSE2-LABEL: insert_test5_sub_sd:
1574 ; SSE2:       # %bb.0:
1575 ; SSE2-NEXT:    subpd %xmm0, %xmm1
1576 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1577 ; SSE2-NEXT:    ret{{[l|q]}}
1578 ;
1579 ; SSE41-LABEL: insert_test5_sub_sd:
1580 ; SSE41:       # %bb.0:
1581 ; SSE41-NEXT:    subpd %xmm0, %xmm1
1582 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1583 ; SSE41-NEXT:    ret{{[l|q]}}
1584 ;
1585 ; AVX-LABEL: insert_test5_sub_sd:
1586 ; AVX:       # %bb.0:
1587 ; AVX-NEXT:    vsubpd %xmm0, %xmm1, %xmm1
1588 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1589 ; AVX-NEXT:    ret{{[l|q]}}
1590   %1 = fsub <2 x double> %b, %a
1591   %2 = shufflevector <2 x double> %1, <2 x double> %a, <2 x i32> <i32 0, i32 3>
1592   ret <2 x double> %2
1593 }
1594
1595 define <2 x double> @insert_test5_mul_sd(<2 x double> %a, <2 x double> %b) {
1596 ; SSE2-LABEL: insert_test5_mul_sd:
1597 ; SSE2:       # %bb.0:
1598 ; SSE2-NEXT:    mulpd %xmm0, %xmm1
1599 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1600 ; SSE2-NEXT:    ret{{[l|q]}}
1601 ;
1602 ; SSE41-LABEL: insert_test5_mul_sd:
1603 ; SSE41:       # %bb.0:
1604 ; SSE41-NEXT:    mulpd %xmm0, %xmm1
1605 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1606 ; SSE41-NEXT:    ret{{[l|q]}}
1607 ;
1608 ; AVX-LABEL: insert_test5_mul_sd:
1609 ; AVX:       # %bb.0:
1610 ; AVX-NEXT:    vmulpd %xmm0, %xmm1, %xmm1
1611 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1612 ; AVX-NEXT:    ret{{[l|q]}}
1613   %1 = fmul <2 x double> %b, %a
1614   %2 = shufflevector <2 x double> %1, <2 x double> %a, <2 x i32> <i32 0, i32 3>
1615   ret <2 x double> %2
1616 }
1617
1618 define <2 x double> @insert_test5_div_sd(<2 x double> %a, <2 x double> %b) {
1619 ; SSE2-LABEL: insert_test5_div_sd:
1620 ; SSE2:       # %bb.0:
1621 ; SSE2-NEXT:    divpd %xmm0, %xmm1
1622 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1623 ; SSE2-NEXT:    ret{{[l|q]}}
1624 ;
1625 ; SSE41-LABEL: insert_test5_div_sd:
1626 ; SSE41:       # %bb.0:
1627 ; SSE41-NEXT:    divpd %xmm0, %xmm1
1628 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1629 ; SSE41-NEXT:    ret{{[l|q]}}
1630 ;
1631 ; AVX-LABEL: insert_test5_div_sd:
1632 ; AVX:       # %bb.0:
1633 ; AVX-NEXT:    vdivpd %xmm0, %xmm1, %xmm1
1634 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1635 ; AVX-NEXT:    ret{{[l|q]}}
1636   %1 = fdiv <2 x double> %b, %a
1637   %2 = shufflevector <2 x double> %1, <2 x double> %a, <2 x i32> <i32 0, i32 3>
1638   ret <2 x double> %2
1639 }
1640
1641 define <4 x float> @add_ss_mask(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 %mask) {
1642 ; X86-SSE2-LABEL: add_ss_mask:
1643 ; X86-SSE2:       # %bb.0:
1644 ; X86-SSE2-NEXT:    testb $1, {{[0-9]+}}(%esp)
1645 ; X86-SSE2-NEXT:    jne .LBB70_1
1646 ; X86-SSE2-NEXT:  # %bb.2:
1647 ; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3]
1648 ; X86-SSE2-NEXT:    retl
1649 ; X86-SSE2-NEXT:  .LBB70_1:
1650 ; X86-SSE2-NEXT:    addss %xmm0, %xmm1
1651 ; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1652 ; X86-SSE2-NEXT:    retl
1653 ;
1654 ; X86-SSE41-LABEL: add_ss_mask:
1655 ; X86-SSE41:       # %bb.0:
1656 ; X86-SSE41-NEXT:    testb $1, {{[0-9]+}}(%esp)
1657 ; X86-SSE41-NEXT:    jne .LBB70_1
1658 ; X86-SSE41-NEXT:  # %bb.2:
1659 ; X86-SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3]
1660 ; X86-SSE41-NEXT:    retl
1661 ; X86-SSE41-NEXT:  .LBB70_1:
1662 ; X86-SSE41-NEXT:    addss %xmm0, %xmm1
1663 ; X86-SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1664 ; X86-SSE41-NEXT:    retl
1665 ;
1666 ; X86-AVX1-LABEL: add_ss_mask:
1667 ; X86-AVX1:       # %bb.0:
1668 ; X86-AVX1-NEXT:    testb $1, {{[0-9]+}}(%esp)
1669 ; X86-AVX1-NEXT:    je .LBB70_2
1670 ; X86-AVX1-NEXT:  # %bb.1:
1671 ; X86-AVX1-NEXT:    vaddss %xmm1, %xmm0, %xmm2
1672 ; X86-AVX1-NEXT:  .LBB70_2:
1673 ; X86-AVX1-NEXT:    vblendps {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3]
1674 ; X86-AVX1-NEXT:    retl
1675 ;
1676 ; X86-AVX512-LABEL: add_ss_mask:
1677 ; X86-AVX512:       # %bb.0:
1678 ; X86-AVX512-NEXT:    movb {{[0-9]+}}(%esp), %al
1679 ; X86-AVX512-NEXT:    kmovw %eax, %k1
1680 ; X86-AVX512-NEXT:    vaddss %xmm1, %xmm0, %xmm2 {%k1}
1681 ; X86-AVX512-NEXT:    vmovaps %xmm2, %xmm0
1682 ; X86-AVX512-NEXT:    retl
1683 ;
1684 ; X64-SSE2-LABEL: add_ss_mask:
1685 ; X64-SSE2:       # %bb.0:
1686 ; X64-SSE2-NEXT:    testb $1, %dil
1687 ; X64-SSE2-NEXT:    jne .LBB70_1
1688 ; X64-SSE2-NEXT:  # %bb.2:
1689 ; X64-SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3]
1690 ; X64-SSE2-NEXT:    retq
1691 ; X64-SSE2-NEXT:  .LBB70_1:
1692 ; X64-SSE2-NEXT:    addss %xmm0, %xmm1
1693 ; X64-SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1694 ; X64-SSE2-NEXT:    retq
1695 ;
1696 ; X64-SSE41-LABEL: add_ss_mask:
1697 ; X64-SSE41:       # %bb.0:
1698 ; X64-SSE41-NEXT:    testb $1, %dil
1699 ; X64-SSE41-NEXT:    jne .LBB70_1
1700 ; X64-SSE41-NEXT:  # %bb.2:
1701 ; X64-SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3]
1702 ; X64-SSE41-NEXT:    retq
1703 ; X64-SSE41-NEXT:  .LBB70_1:
1704 ; X64-SSE41-NEXT:    addss %xmm0, %xmm1
1705 ; X64-SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1706 ; X64-SSE41-NEXT:    retq
1707 ;
1708 ; X64-AVX1-LABEL: add_ss_mask:
1709 ; X64-AVX1:       # %bb.0:
1710 ; X64-AVX1-NEXT:    testb $1, %dil
1711 ; X64-AVX1-NEXT:    je .LBB70_2
1712 ; X64-AVX1-NEXT:  # %bb.1:
1713 ; X64-AVX1-NEXT:    vaddss %xmm1, %xmm0, %xmm2
1714 ; X64-AVX1-NEXT:  .LBB70_2:
1715 ; X64-AVX1-NEXT:    vblendps {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3]
1716 ; X64-AVX1-NEXT:    retq
1717 ;
1718 ; X64-AVX512-LABEL: add_ss_mask:
1719 ; X64-AVX512:       # %bb.0:
1720 ; X64-AVX512-NEXT:    kmovw %edi, %k1
1721 ; X64-AVX512-NEXT:    vaddss %xmm1, %xmm0, %xmm2 {%k1}
1722 ; X64-AVX512-NEXT:    vmovaps %xmm2, %xmm0
1723 ; X64-AVX512-NEXT:    retq
1724   %1 = extractelement <4 x float> %a, i64 0
1725   %2 = extractelement <4 x float> %b, i64 0
1726   %3 = fadd float %1, %2
1727   %4 = extractelement <4 x float> %c, i32 0
1728   %5 = bitcast i8 %mask to <8 x i1>
1729   %6 = extractelement <8 x i1> %5, i64 0
1730   %7 = select i1 %6, float %3, float %4
1731   %8 = insertelement <4 x float> %a, float %7, i64 0
1732   ret <4 x float> %8
1733 }
1734
1735 define <2 x double> @add_sd_mask(<2 x double> %a, <2 x double> %b, <2 x double> %c, i8 %mask) {
1736 ; X86-SSE2-LABEL: add_sd_mask:
1737 ; X86-SSE2:       # %bb.0:
1738 ; X86-SSE2-NEXT:    testb $1, {{[0-9]+}}(%esp)
1739 ; X86-SSE2-NEXT:    jne .LBB71_1
1740 ; X86-SSE2-NEXT:  # %bb.2:
1741 ; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
1742 ; X86-SSE2-NEXT:    retl
1743 ; X86-SSE2-NEXT:  .LBB71_1:
1744 ; X86-SSE2-NEXT:    addsd %xmm0, %xmm1
1745 ; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1746 ; X86-SSE2-NEXT:    retl
1747 ;
1748 ; X86-SSE41-LABEL: add_sd_mask:
1749 ; X86-SSE41:       # %bb.0:
1750 ; X86-SSE41-NEXT:    testb $1, {{[0-9]+}}(%esp)
1751 ; X86-SSE41-NEXT:    jne .LBB71_1
1752 ; X86-SSE41-NEXT:  # %bb.2:
1753 ; X86-SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3]
1754 ; X86-SSE41-NEXT:    retl
1755 ; X86-SSE41-NEXT:  .LBB71_1:
1756 ; X86-SSE41-NEXT:    addsd %xmm0, %xmm1
1757 ; X86-SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1758 ; X86-SSE41-NEXT:    retl
1759 ;
1760 ; X86-AVX1-LABEL: add_sd_mask:
1761 ; X86-AVX1:       # %bb.0:
1762 ; X86-AVX1-NEXT:    testb $1, {{[0-9]+}}(%esp)
1763 ; X86-AVX1-NEXT:    je .LBB71_2
1764 ; X86-AVX1-NEXT:  # %bb.1:
1765 ; X86-AVX1-NEXT:    vaddsd %xmm1, %xmm0, %xmm2
1766 ; X86-AVX1-NEXT:  .LBB71_2:
1767 ; X86-AVX1-NEXT:    vblendpd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
1768 ; X86-AVX1-NEXT:    retl
1769 ;
1770 ; X86-AVX512-LABEL: add_sd_mask:
1771 ; X86-AVX512:       # %bb.0:
1772 ; X86-AVX512-NEXT:    movb {{[0-9]+}}(%esp), %al
1773 ; X86-AVX512-NEXT:    kmovw %eax, %k1
1774 ; X86-AVX512-NEXT:    vaddsd %xmm1, %xmm0, %xmm2 {%k1}
1775 ; X86-AVX512-NEXT:    vmovapd %xmm2, %xmm0
1776 ; X86-AVX512-NEXT:    retl
1777 ;
1778 ; X64-SSE2-LABEL: add_sd_mask:
1779 ; X64-SSE2:       # %bb.0:
1780 ; X64-SSE2-NEXT:    testb $1, %dil
1781 ; X64-SSE2-NEXT:    jne .LBB71_1
1782 ; X64-SSE2-NEXT:  # %bb.2:
1783 ; X64-SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
1784 ; X64-SSE2-NEXT:    retq
1785 ; X64-SSE2-NEXT:  .LBB71_1:
1786 ; X64-SSE2-NEXT:    addsd %xmm0, %xmm1
1787 ; X64-SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1788 ; X64-SSE2-NEXT:    retq
1789 ;
1790 ; X64-SSE41-LABEL: add_sd_mask:
1791 ; X64-SSE41:       # %bb.0:
1792 ; X64-SSE41-NEXT:    testb $1, %dil
1793 ; X64-SSE41-NEXT:    jne .LBB71_1
1794 ; X64-SSE41-NEXT:  # %bb.2:
1795 ; X64-SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3]
1796 ; X64-SSE41-NEXT:    retq
1797 ; X64-SSE41-NEXT:  .LBB71_1:
1798 ; X64-SSE41-NEXT:    addsd %xmm0, %xmm1
1799 ; X64-SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1800 ; X64-SSE41-NEXT:    retq
1801 ;
1802 ; X64-AVX1-LABEL: add_sd_mask:
1803 ; X64-AVX1:       # %bb.0:
1804 ; X64-AVX1-NEXT:    testb $1, %dil
1805 ; X64-AVX1-NEXT:    je .LBB71_2
1806 ; X64-AVX1-NEXT:  # %bb.1:
1807 ; X64-AVX1-NEXT:    vaddsd %xmm1, %xmm0, %xmm2
1808 ; X64-AVX1-NEXT:  .LBB71_2:
1809 ; X64-AVX1-NEXT:    vblendpd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
1810 ; X64-AVX1-NEXT:    retq
1811 ;
1812 ; X64-AVX512-LABEL: add_sd_mask:
1813 ; X64-AVX512:       # %bb.0:
1814 ; X64-AVX512-NEXT:    kmovw %edi, %k1
1815 ; X64-AVX512-NEXT:    vaddsd %xmm1, %xmm0, %xmm2 {%k1}
1816 ; X64-AVX512-NEXT:    vmovapd %xmm2, %xmm0
1817 ; X64-AVX512-NEXT:    retq
1818   %1 = extractelement <2 x double> %a, i64 0
1819   %2 = extractelement <2 x double> %b, i64 0
1820   %3 = fadd double %1, %2
1821   %4 = extractelement <2 x double> %c, i32 0
1822   %5 = bitcast i8 %mask to <8 x i1>
1823   %6 = extractelement <8 x i1> %5, i64 0
1824   %7 = select i1 %6, double %3, double %4
1825   %8 = insertelement <2 x double> %a, double %7, i64 0
1826   ret <2 x double> %8
1827 }