xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/sse-scalar-fp-arith.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mcpu=x86-64 -mattr=+sse2 < %s | FileCheck --check-prefix=SSE --check-prefix=SSE2 %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mcpu=x86-64 -mattr=+sse4.1 < %s | FileCheck --check-prefix=SSE --check-prefix=SSE41 %s
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -mcpu=x86-64 -mattr=+avx < %s | FileCheck --check-prefix=AVX %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-unknown"
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; Ensure that the backend no longer emits unnecessary vector insert
8*9880d681SAndroid Build Coastguard Worker; instructions immediately after SSE scalar fp instructions
9*9880d681SAndroid Build Coastguard Worker; like addss or mulss.
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_add_ss(<4 x float> %a, <4 x float> %b) {
12*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test_add_ss:
13*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
14*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm1, %xmm0
15*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
16*9880d681SAndroid Build Coastguard Worker;
17*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test_add_ss:
18*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
19*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
20*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
21*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <4 x float> %b, i32 0
22*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <4 x float> %a, i32 0
23*9880d681SAndroid Build Coastguard Worker  %add = fadd float %2, %1
24*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x float> %a, float %add, i32 0
25*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %3
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_sub_ss(<4 x float> %a, <4 x float> %b) {
29*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test_sub_ss:
30*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
31*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    subss %xmm1, %xmm0
32*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
33*9880d681SAndroid Build Coastguard Worker;
34*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test_sub_ss:
35*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
36*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsubss %xmm1, %xmm0, %xmm0
37*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
38*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <4 x float> %b, i32 0
39*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <4 x float> %a, i32 0
40*9880d681SAndroid Build Coastguard Worker  %sub = fsub float %2, %1
41*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x float> %a, float %sub, i32 0
42*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %3
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_mul_ss(<4 x float> %a, <4 x float> %b) {
46*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test_mul_ss:
47*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
48*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulss %xmm1, %xmm0
49*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
50*9880d681SAndroid Build Coastguard Worker;
51*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test_mul_ss:
52*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
53*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulss %xmm1, %xmm0, %xmm0
54*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
55*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <4 x float> %b, i32 0
56*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <4 x float> %a, i32 0
57*9880d681SAndroid Build Coastguard Worker  %mul = fmul float %2, %1
58*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x float> %a, float %mul, i32 0
59*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %3
60*9880d681SAndroid Build Coastguard Worker}
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_div_ss(<4 x float> %a, <4 x float> %b) {
63*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test_div_ss:
64*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
65*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divss %xmm1, %xmm0
66*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
67*9880d681SAndroid Build Coastguard Worker;
68*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test_div_ss:
69*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
70*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivss %xmm1, %xmm0, %xmm0
71*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
72*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <4 x float> %b, i32 0
73*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <4 x float> %a, i32 0
74*9880d681SAndroid Build Coastguard Worker  %div = fdiv float %2, %1
75*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x float> %a, float %div, i32 0
76*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %3
77*9880d681SAndroid Build Coastguard Worker}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_sqrt_ss(<4 x float> %a) {
80*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: test_sqrt_ss:
81*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
82*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:   sqrtss %xmm0, %xmm1
83*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:   movss %xmm1, %xmm0
84*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:   retq
85*9880d681SAndroid Build Coastguard Worker;
86*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: test_sqrt_ss:
87*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
88*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:  sqrtss %xmm0, %xmm1
89*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:  blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
90*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:  retq
91*9880d681SAndroid Build Coastguard Worker;
92*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test_sqrt_ss:
93*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
94*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsqrtss %xmm0, %xmm0, %xmm1
95*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
96*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
97*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <4 x float> %a, i32 0
98*9880d681SAndroid Build Coastguard Worker  %2 = call float @llvm.sqrt.f32(float %1)
99*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x float> %a, float %2, i32 0
100*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %3
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.sqrt.f32(float)
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_add_sd(<2 x double> %a, <2 x double> %b) {
105*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test_add_sd:
106*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
107*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsd %xmm1, %xmm0
108*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
109*9880d681SAndroid Build Coastguard Worker;
110*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test_add_sd:
111*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
112*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
113*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
114*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <2 x double> %b, i32 0
115*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <2 x double> %a, i32 0
116*9880d681SAndroid Build Coastguard Worker  %add = fadd double %2, %1
117*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <2 x double> %a, double %add, i32 0
118*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %3
119*9880d681SAndroid Build Coastguard Worker}
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_sub_sd(<2 x double> %a, <2 x double> %b) {
122*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test_sub_sd:
123*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
124*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    subsd %xmm1, %xmm0
125*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
126*9880d681SAndroid Build Coastguard Worker;
127*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test_sub_sd:
128*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
129*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsubsd %xmm1, %xmm0, %xmm0
130*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
131*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <2 x double> %b, i32 0
132*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <2 x double> %a, i32 0
133*9880d681SAndroid Build Coastguard Worker  %sub = fsub double %2, %1
134*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <2 x double> %a, double %sub, i32 0
135*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %3
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_mul_sd(<2 x double> %a, <2 x double> %b) {
139*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test_mul_sd:
140*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
141*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulsd %xmm1, %xmm0
142*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
143*9880d681SAndroid Build Coastguard Worker;
144*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test_mul_sd:
145*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
146*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulsd %xmm1, %xmm0, %xmm0
147*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
148*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <2 x double> %b, i32 0
149*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <2 x double> %a, i32 0
150*9880d681SAndroid Build Coastguard Worker  %mul = fmul double %2, %1
151*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <2 x double> %a, double %mul, i32 0
152*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %3
153*9880d681SAndroid Build Coastguard Worker}
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_div_sd(<2 x double> %a, <2 x double> %b) {
156*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test_div_sd:
157*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
158*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divsd %xmm1, %xmm0
159*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
160*9880d681SAndroid Build Coastguard Worker;
161*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test_div_sd:
162*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
163*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivsd %xmm1, %xmm0, %xmm0
164*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
165*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <2 x double> %b, i32 0
166*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <2 x double> %a, i32 0
167*9880d681SAndroid Build Coastguard Worker  %div = fdiv double %2, %1
168*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <2 x double> %a, double %div, i32 0
169*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %3
170*9880d681SAndroid Build Coastguard Worker}
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_sqrt_sd(<2 x double> %a) {
173*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test_sqrt_sd:
174*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
175*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    sqrtsd %xmm0, %xmm1
176*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movsd %xmm1, %xmm0
177*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
178*9880d681SAndroid Build Coastguard Worker;
179*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test_sqrt_sd:
180*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
181*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsqrtsd %xmm0, %xmm0, %xmm1
182*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovsd %xmm1, %xmm0, %xmm0
183*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
184*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <2 x double> %a, i32 0
185*9880d681SAndroid Build Coastguard Worker  %2 = call double @llvm.sqrt.f64(double %1)
186*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <2 x double> %a, double %2, i32 0
187*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %3
188*9880d681SAndroid Build Coastguard Worker}
189*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.sqrt.f64(double)
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test2_add_ss(<4 x float> %a, <4 x float> %b) {
192*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test2_add_ss:
193*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
194*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm0, %xmm1
195*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm1, %xmm0
196*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
197*9880d681SAndroid Build Coastguard Worker;
198*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test2_add_ss:
199*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
200*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm0, %xmm1, %xmm0
201*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
202*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <4 x float> %a, i32 0
203*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <4 x float> %b, i32 0
204*9880d681SAndroid Build Coastguard Worker  %add = fadd float %1, %2
205*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x float> %b, float %add, i32 0
206*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %3
207*9880d681SAndroid Build Coastguard Worker}
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test2_sub_ss(<4 x float> %a, <4 x float> %b) {
210*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test2_sub_ss:
211*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
212*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    subss %xmm0, %xmm1
213*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm1, %xmm0
214*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
215*9880d681SAndroid Build Coastguard Worker;
216*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test2_sub_ss:
217*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
218*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsubss %xmm0, %xmm1, %xmm0
219*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
220*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <4 x float> %a, i32 0
221*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <4 x float> %b, i32 0
222*9880d681SAndroid Build Coastguard Worker  %sub = fsub float %2, %1
223*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x float> %b, float %sub, i32 0
224*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %3
225*9880d681SAndroid Build Coastguard Worker}
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test2_mul_ss(<4 x float> %a, <4 x float> %b) {
228*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test2_mul_ss:
229*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
230*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulss %xmm0, %xmm1
231*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm1, %xmm0
232*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
233*9880d681SAndroid Build Coastguard Worker;
234*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test2_mul_ss:
235*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
236*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulss %xmm0, %xmm1, %xmm0
237*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
238*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <4 x float> %a, i32 0
239*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <4 x float> %b, i32 0
240*9880d681SAndroid Build Coastguard Worker  %mul = fmul float %1, %2
241*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x float> %b, float %mul, i32 0
242*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %3
243*9880d681SAndroid Build Coastguard Worker}
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test2_div_ss(<4 x float> %a, <4 x float> %b) {
246*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test2_div_ss:
247*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
248*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divss %xmm0, %xmm1
249*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm1, %xmm0
250*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
251*9880d681SAndroid Build Coastguard Worker;
252*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test2_div_ss:
253*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
254*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivss %xmm0, %xmm1, %xmm0
255*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
256*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <4 x float> %a, i32 0
257*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <4 x float> %b, i32 0
258*9880d681SAndroid Build Coastguard Worker  %div = fdiv float %2, %1
259*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x float> %b, float %div, i32 0
260*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %3
261*9880d681SAndroid Build Coastguard Worker}
262*9880d681SAndroid Build Coastguard Worker
263*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test2_add_sd(<2 x double> %a, <2 x double> %b) {
264*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test2_add_sd:
265*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
266*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsd %xmm0, %xmm1
267*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movapd %xmm1, %xmm0
268*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
269*9880d681SAndroid Build Coastguard Worker;
270*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test2_add_sd:
271*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
272*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsd %xmm0, %xmm1, %xmm0
273*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
274*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <2 x double> %a, i32 0
275*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <2 x double> %b, i32 0
276*9880d681SAndroid Build Coastguard Worker  %add = fadd double %1, %2
277*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <2 x double> %b, double %add, i32 0
278*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %3
279*9880d681SAndroid Build Coastguard Worker}
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test2_sub_sd(<2 x double> %a, <2 x double> %b) {
282*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test2_sub_sd:
283*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
284*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    subsd %xmm0, %xmm1
285*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movapd %xmm1, %xmm0
286*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
287*9880d681SAndroid Build Coastguard Worker;
288*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test2_sub_sd:
289*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
290*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsubsd %xmm0, %xmm1, %xmm0
291*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
292*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <2 x double> %a, i32 0
293*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <2 x double> %b, i32 0
294*9880d681SAndroid Build Coastguard Worker  %sub = fsub double %2, %1
295*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <2 x double> %b, double %sub, i32 0
296*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %3
297*9880d681SAndroid Build Coastguard Worker}
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test2_mul_sd(<2 x double> %a, <2 x double> %b) {
300*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test2_mul_sd:
301*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
302*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulsd %xmm0, %xmm1
303*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movapd %xmm1, %xmm0
304*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
305*9880d681SAndroid Build Coastguard Worker;
306*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test2_mul_sd:
307*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
308*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulsd %xmm0, %xmm1, %xmm0
309*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
310*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <2 x double> %a, i32 0
311*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <2 x double> %b, i32 0
312*9880d681SAndroid Build Coastguard Worker  %mul = fmul double %1, %2
313*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <2 x double> %b, double %mul, i32 0
314*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %3
315*9880d681SAndroid Build Coastguard Worker}
316*9880d681SAndroid Build Coastguard Worker
317*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test2_div_sd(<2 x double> %a, <2 x double> %b) {
318*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test2_div_sd:
319*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
320*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divsd %xmm0, %xmm1
321*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movapd %xmm1, %xmm0
322*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
323*9880d681SAndroid Build Coastguard Worker;
324*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test2_div_sd:
325*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
326*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivsd %xmm0, %xmm1, %xmm0
327*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
328*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <2 x double> %a, i32 0
329*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <2 x double> %b, i32 0
330*9880d681SAndroid Build Coastguard Worker  %div = fdiv double %2, %1
331*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <2 x double> %b, double %div, i32 0
332*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %3
333*9880d681SAndroid Build Coastguard Worker}
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_multiple_add_ss(<4 x float> %a, <4 x float> %b) {
336*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test_multiple_add_ss:
337*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
338*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm0, %xmm1
339*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm1, %xmm0
340*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
341*9880d681SAndroid Build Coastguard Worker;
342*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test_multiple_add_ss:
343*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
344*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm1
345*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
346*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
347*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <4 x float> %b, i32 0
348*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <4 x float> %a, i32 0
349*9880d681SAndroid Build Coastguard Worker  %add = fadd float %2, %1
350*9880d681SAndroid Build Coastguard Worker  %add2 = fadd float %2, %add
351*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x float> %a, float %add2, i32 0
352*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %3
353*9880d681SAndroid Build Coastguard Worker}
354*9880d681SAndroid Build Coastguard Worker
355*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_multiple_sub_ss(<4 x float> %a, <4 x float> %b) {
356*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test_multiple_sub_ss:
357*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
358*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm0, %xmm2
359*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    subss %xmm1, %xmm2
360*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    subss %xmm2, %xmm0
361*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
362*9880d681SAndroid Build Coastguard Worker;
363*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test_multiple_sub_ss:
364*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
365*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsubss %xmm1, %xmm0, %xmm1
366*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsubss %xmm1, %xmm0, %xmm0
367*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
368*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <4 x float> %b, i32 0
369*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <4 x float> %a, i32 0
370*9880d681SAndroid Build Coastguard Worker  %sub = fsub float %2, %1
371*9880d681SAndroid Build Coastguard Worker  %sub2 = fsub float %2, %sub
372*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x float> %a, float %sub2, i32 0
373*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %3
374*9880d681SAndroid Build Coastguard Worker}
375*9880d681SAndroid Build Coastguard Worker
376*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_multiple_mul_ss(<4 x float> %a, <4 x float> %b) {
377*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test_multiple_mul_ss:
378*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
379*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulss %xmm0, %xmm1
380*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulss %xmm1, %xmm0
381*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
382*9880d681SAndroid Build Coastguard Worker;
383*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test_multiple_mul_ss:
384*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
385*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulss %xmm1, %xmm0, %xmm1
386*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulss %xmm1, %xmm0, %xmm0
387*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
388*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <4 x float> %b, i32 0
389*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <4 x float> %a, i32 0
390*9880d681SAndroid Build Coastguard Worker  %mul = fmul float %2, %1
391*9880d681SAndroid Build Coastguard Worker  %mul2 = fmul float %2, %mul
392*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x float> %a, float %mul2, i32 0
393*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %3
394*9880d681SAndroid Build Coastguard Worker}
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_multiple_div_ss(<4 x float> %a, <4 x float> %b) {
397*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test_multiple_div_ss:
398*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
399*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm0, %xmm2
400*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divss %xmm1, %xmm2
401*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divss %xmm2, %xmm0
402*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
403*9880d681SAndroid Build Coastguard Worker;
404*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test_multiple_div_ss:
405*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
406*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivss %xmm1, %xmm0, %xmm1
407*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivss %xmm1, %xmm0, %xmm0
408*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
409*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <4 x float> %b, i32 0
410*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <4 x float> %a, i32 0
411*9880d681SAndroid Build Coastguard Worker  %div = fdiv float %2, %1
412*9880d681SAndroid Build Coastguard Worker  %div2 = fdiv float %2, %div
413*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x float> %a, float %div2, i32 0
414*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %3
415*9880d681SAndroid Build Coastguard Worker}
416*9880d681SAndroid Build Coastguard Worker
417*9880d681SAndroid Build Coastguard Worker; With SSE4.1 or greater, the shuffles in the following tests may
418*9880d681SAndroid Build Coastguard Worker; be lowered to X86Blendi nodes.
419*9880d681SAndroid Build Coastguard Worker
420*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @blend_add_ss(<4 x float> %a, float %b) {
421*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: blend_add_ss:
422*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
423*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm1, %xmm0
424*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
425*9880d681SAndroid Build Coastguard Worker;
426*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: blend_add_ss:
427*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
428*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
429*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
430*9880d681SAndroid Build Coastguard Worker
431*9880d681SAndroid Build Coastguard Worker  %ext = extractelement <4 x float> %a, i32 0
432*9880d681SAndroid Build Coastguard Worker  %op = fadd float %b, %ext
433*9880d681SAndroid Build Coastguard Worker  %ins = insertelement <4 x float> undef, float %op, i32 0
434*9880d681SAndroid Build Coastguard Worker  %shuf = shufflevector <4 x float> %ins, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
435*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %shuf
436*9880d681SAndroid Build Coastguard Worker}
437*9880d681SAndroid Build Coastguard Worker
438*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @blend_sub_ss(<4 x float> %a, float %b) {
439*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: blend_sub_ss:
440*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
441*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    subss %xmm1, %xmm0
442*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
443*9880d681SAndroid Build Coastguard Worker;
444*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: blend_sub_ss:
445*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
446*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsubss %xmm1, %xmm0, %xmm0
447*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Worker  %ext = extractelement <4 x float> %a, i32 0
450*9880d681SAndroid Build Coastguard Worker  %op = fsub float %ext, %b
451*9880d681SAndroid Build Coastguard Worker  %ins = insertelement <4 x float> undef, float %op, i32 0
452*9880d681SAndroid Build Coastguard Worker  %shuf = shufflevector <4 x float> %ins, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
453*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %shuf
454*9880d681SAndroid Build Coastguard Worker}
455*9880d681SAndroid Build Coastguard Worker
456*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @blend_mul_ss(<4 x float> %a, float %b) {
457*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: blend_mul_ss:
458*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
459*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulss %xmm1, %xmm0
460*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
461*9880d681SAndroid Build Coastguard Worker;
462*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: blend_mul_ss:
463*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
464*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulss %xmm1, %xmm0, %xmm0
465*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
466*9880d681SAndroid Build Coastguard Worker
467*9880d681SAndroid Build Coastguard Worker  %ext = extractelement <4 x float> %a, i32 0
468*9880d681SAndroid Build Coastguard Worker  %op = fmul float %b, %ext
469*9880d681SAndroid Build Coastguard Worker  %ins = insertelement <4 x float> undef, float %op, i32 0
470*9880d681SAndroid Build Coastguard Worker  %shuf = shufflevector <4 x float> %ins, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
471*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %shuf
472*9880d681SAndroid Build Coastguard Worker}
473*9880d681SAndroid Build Coastguard Worker
474*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @blend_div_ss(<4 x float> %a, float %b) {
475*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: blend_div_ss:
476*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
477*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divss %xmm1, %xmm0
478*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
479*9880d681SAndroid Build Coastguard Worker;
480*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: blend_div_ss:
481*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
482*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivss %xmm1, %xmm0, %xmm0
483*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
484*9880d681SAndroid Build Coastguard Worker
485*9880d681SAndroid Build Coastguard Worker  %ext = extractelement <4 x float> %a, i32 0
486*9880d681SAndroid Build Coastguard Worker  %op = fdiv float %ext, %b
487*9880d681SAndroid Build Coastguard Worker  %ins = insertelement <4 x float> undef, float %op, i32 0
488*9880d681SAndroid Build Coastguard Worker  %shuf = shufflevector <4 x float> %ins, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
489*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %shuf
490*9880d681SAndroid Build Coastguard Worker}
491*9880d681SAndroid Build Coastguard Worker
492*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @blend_add_sd(<2 x double> %a, double %b) {
493*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: blend_add_sd:
494*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
495*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsd %xmm1, %xmm0
496*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
497*9880d681SAndroid Build Coastguard Worker;
498*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: blend_add_sd:
499*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
500*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
501*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
502*9880d681SAndroid Build Coastguard Worker
503*9880d681SAndroid Build Coastguard Worker  %ext = extractelement <2 x double> %a, i32 0
504*9880d681SAndroid Build Coastguard Worker  %op = fadd double %b, %ext
505*9880d681SAndroid Build Coastguard Worker  %ins = insertelement <2 x double> undef, double %op, i32 0
506*9880d681SAndroid Build Coastguard Worker  %shuf = shufflevector <2 x double> %ins, <2 x double> %a, <2 x i32> <i32 0, i32 3>
507*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %shuf
508*9880d681SAndroid Build Coastguard Worker}
509*9880d681SAndroid Build Coastguard Worker
510*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @blend_sub_sd(<2 x double> %a, double %b) {
511*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: blend_sub_sd:
512*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
513*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    subsd %xmm1, %xmm0
514*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
515*9880d681SAndroid Build Coastguard Worker;
516*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: blend_sub_sd:
517*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
518*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsubsd %xmm1, %xmm0, %xmm0
519*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
520*9880d681SAndroid Build Coastguard Worker
521*9880d681SAndroid Build Coastguard Worker  %ext = extractelement <2 x double> %a, i32 0
522*9880d681SAndroid Build Coastguard Worker  %op = fsub double %ext, %b
523*9880d681SAndroid Build Coastguard Worker  %ins = insertelement <2 x double> undef, double %op, i32 0
524*9880d681SAndroid Build Coastguard Worker  %shuf = shufflevector <2 x double> %ins, <2 x double> %a, <2 x i32> <i32 0, i32 3>
525*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %shuf
526*9880d681SAndroid Build Coastguard Worker}
527*9880d681SAndroid Build Coastguard Worker
528*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @blend_mul_sd(<2 x double> %a, double %b) {
529*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: blend_mul_sd:
530*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
531*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulsd %xmm1, %xmm0
532*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
533*9880d681SAndroid Build Coastguard Worker;
534*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: blend_mul_sd:
535*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
536*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulsd %xmm1, %xmm0, %xmm0
537*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
538*9880d681SAndroid Build Coastguard Worker
539*9880d681SAndroid Build Coastguard Worker  %ext = extractelement <2 x double> %a, i32 0
540*9880d681SAndroid Build Coastguard Worker  %op = fmul double %b, %ext
541*9880d681SAndroid Build Coastguard Worker  %ins = insertelement <2 x double> undef, double %op, i32 0
542*9880d681SAndroid Build Coastguard Worker  %shuf = shufflevector <2 x double> %ins, <2 x double> %a, <2 x i32> <i32 0, i32 3>
543*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %shuf
544*9880d681SAndroid Build Coastguard Worker}
545*9880d681SAndroid Build Coastguard Worker
546*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @blend_div_sd(<2 x double> %a, double %b) {
547*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: blend_div_sd:
548*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
549*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divsd %xmm1, %xmm0
550*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
551*9880d681SAndroid Build Coastguard Worker;
552*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: blend_div_sd:
553*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
554*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivsd %xmm1, %xmm0, %xmm0
555*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
556*9880d681SAndroid Build Coastguard Worker
557*9880d681SAndroid Build Coastguard Worker  %ext = extractelement <2 x double> %a, i32 0
558*9880d681SAndroid Build Coastguard Worker  %op = fdiv double %ext, %b
559*9880d681SAndroid Build Coastguard Worker  %ins = insertelement <2 x double> undef, double %op, i32 0
560*9880d681SAndroid Build Coastguard Worker  %shuf = shufflevector <2 x double> %ins, <2 x double> %a, <2 x i32> <i32 0, i32 3>
561*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %shuf
562*9880d681SAndroid Build Coastguard Worker}
563*9880d681SAndroid Build Coastguard Worker
564*9880d681SAndroid Build Coastguard Worker; Ensure that the backend selects SSE/AVX scalar fp instructions
565*9880d681SAndroid Build Coastguard Worker; from a packed fp instruction plus a vector insert.
566*9880d681SAndroid Build Coastguard Worker
567*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @insert_test_add_ss(<4 x float> %a, <4 x float> %b) {
568*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test_add_ss:
569*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
570*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm1, %xmm0
571*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
572*9880d681SAndroid Build Coastguard Worker;
573*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test_add_ss:
574*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
575*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
576*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
577*9880d681SAndroid Build Coastguard Worker  %1 = fadd <4 x float> %a, %b
578*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
579*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
580*9880d681SAndroid Build Coastguard Worker}
581*9880d681SAndroid Build Coastguard Worker
582*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @insert_test_sub_ss(<4 x float> %a, <4 x float> %b) {
583*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test_sub_ss:
584*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
585*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    subss %xmm1, %xmm0
586*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
587*9880d681SAndroid Build Coastguard Worker;
588*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test_sub_ss:
589*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
590*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsubss %xmm1, %xmm0, %xmm0
591*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
592*9880d681SAndroid Build Coastguard Worker  %1 = fsub <4 x float> %a, %b
593*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
594*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
595*9880d681SAndroid Build Coastguard Worker}
596*9880d681SAndroid Build Coastguard Worker
597*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @insert_test_mul_ss(<4 x float> %a, <4 x float> %b) {
598*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test_mul_ss:
599*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
600*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulss %xmm1, %xmm0
601*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
602*9880d681SAndroid Build Coastguard Worker;
603*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test_mul_ss:
604*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
605*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulss %xmm1, %xmm0, %xmm0
606*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
607*9880d681SAndroid Build Coastguard Worker  %1 = fmul <4 x float> %a, %b
608*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
609*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
610*9880d681SAndroid Build Coastguard Worker}
611*9880d681SAndroid Build Coastguard Worker
612*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @insert_test_div_ss(<4 x float> %a, <4 x float> %b) {
613*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test_div_ss:
614*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
615*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divss %xmm1, %xmm0
616*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
617*9880d681SAndroid Build Coastguard Worker;
618*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test_div_ss:
619*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
620*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivss %xmm1, %xmm0, %xmm0
621*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
622*9880d681SAndroid Build Coastguard Worker  %1 = fdiv <4 x float> %a, %b
623*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
624*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
625*9880d681SAndroid Build Coastguard Worker}
626*9880d681SAndroid Build Coastguard Worker
627*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @insert_test_add_sd(<2 x double> %a, <2 x double> %b) {
628*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test_add_sd:
629*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
630*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsd %xmm1, %xmm0
631*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
632*9880d681SAndroid Build Coastguard Worker;
633*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test_add_sd:
634*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
635*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
636*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
637*9880d681SAndroid Build Coastguard Worker  %1 = fadd <2 x double> %a, %b
638*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <2 x double> %1, <2 x double> %a, <2 x i32> <i32 0, i32 3>
639*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %2
640*9880d681SAndroid Build Coastguard Worker}
641*9880d681SAndroid Build Coastguard Worker
642*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @insert_test_sub_sd(<2 x double> %a, <2 x double> %b) {
643*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test_sub_sd:
644*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
645*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    subsd %xmm1, %xmm0
646*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
647*9880d681SAndroid Build Coastguard Worker;
648*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test_sub_sd:
649*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
650*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsubsd %xmm1, %xmm0, %xmm0
651*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
652*9880d681SAndroid Build Coastguard Worker  %1 = fsub <2 x double> %a, %b
653*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <2 x double> %1, <2 x double> %a, <2 x i32> <i32 0, i32 3>
654*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %2
655*9880d681SAndroid Build Coastguard Worker}
656*9880d681SAndroid Build Coastguard Worker
657*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @insert_test_mul_sd(<2 x double> %a, <2 x double> %b) {
658*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test_mul_sd:
659*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
660*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulsd %xmm1, %xmm0
661*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
662*9880d681SAndroid Build Coastguard Worker;
663*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test_mul_sd:
664*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
665*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulsd %xmm1, %xmm0, %xmm0
666*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
667*9880d681SAndroid Build Coastguard Worker  %1 = fmul <2 x double> %a, %b
668*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <2 x double> %1, <2 x double> %a, <2 x i32> <i32 0, i32 3>
669*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %2
670*9880d681SAndroid Build Coastguard Worker}
671*9880d681SAndroid Build Coastguard Worker
672*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @insert_test_div_sd(<2 x double> %a, <2 x double> %b) {
673*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test_div_sd:
674*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
675*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divsd %xmm1, %xmm0
676*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
677*9880d681SAndroid Build Coastguard Worker;
678*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test_div_sd:
679*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
680*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivsd %xmm1, %xmm0, %xmm0
681*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
682*9880d681SAndroid Build Coastguard Worker  %1 = fdiv <2 x double> %a, %b
683*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <2 x double> %1, <2 x double> %a, <2 x i32> <i32 0, i32 3>
684*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %2
685*9880d681SAndroid Build Coastguard Worker}
686*9880d681SAndroid Build Coastguard Worker
687*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @insert_test2_add_ss(<4 x float> %a, <4 x float> %b) {
688*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test2_add_ss:
689*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
690*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm0, %xmm1
691*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm1, %xmm0
692*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
693*9880d681SAndroid Build Coastguard Worker;
694*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test2_add_ss:
695*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
696*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm0, %xmm1, %xmm0
697*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
698*9880d681SAndroid Build Coastguard Worker  %1 = fadd <4 x float> %b, %a
699*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
700*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
701*9880d681SAndroid Build Coastguard Worker}
702*9880d681SAndroid Build Coastguard Worker
703*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @insert_test2_sub_ss(<4 x float> %a, <4 x float> %b) {
704*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test2_sub_ss:
705*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
706*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    subss %xmm0, %xmm1
707*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm1, %xmm0
708*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
709*9880d681SAndroid Build Coastguard Worker;
710*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test2_sub_ss:
711*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
712*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsubss %xmm0, %xmm1, %xmm0
713*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
714*9880d681SAndroid Build Coastguard Worker  %1 = fsub <4 x float> %b, %a
715*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
716*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
717*9880d681SAndroid Build Coastguard Worker}
718*9880d681SAndroid Build Coastguard Worker
719*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @insert_test2_mul_ss(<4 x float> %a, <4 x float> %b) {
720*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test2_mul_ss:
721*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
722*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulss %xmm0, %xmm1
723*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm1, %xmm0
724*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
725*9880d681SAndroid Build Coastguard Worker;
726*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test2_mul_ss:
727*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
728*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulss %xmm0, %xmm1, %xmm0
729*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
730*9880d681SAndroid Build Coastguard Worker  %1 = fmul <4 x float> %b, %a
731*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
732*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
733*9880d681SAndroid Build Coastguard Worker}
734*9880d681SAndroid Build Coastguard Worker
735*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @insert_test2_div_ss(<4 x float> %a, <4 x float> %b) {
736*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test2_div_ss:
737*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
738*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divss %xmm0, %xmm1
739*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm1, %xmm0
740*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
741*9880d681SAndroid Build Coastguard Worker;
742*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test2_div_ss:
743*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
744*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivss %xmm0, %xmm1, %xmm0
745*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
746*9880d681SAndroid Build Coastguard Worker  %1 = fdiv <4 x float> %b, %a
747*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
748*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
749*9880d681SAndroid Build Coastguard Worker}
750*9880d681SAndroid Build Coastguard Worker
751*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @insert_test2_add_sd(<2 x double> %a, <2 x double> %b) {
752*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test2_add_sd:
753*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
754*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsd %xmm0, %xmm1
755*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movapd %xmm1, %xmm0
756*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
757*9880d681SAndroid Build Coastguard Worker;
758*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test2_add_sd:
759*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
760*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsd %xmm0, %xmm1, %xmm0
761*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
762*9880d681SAndroid Build Coastguard Worker  %1 = fadd <2 x double> %b, %a
763*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <2 x double> %1, <2 x double> %b, <2 x i32> <i32 0, i32 3>
764*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %2
765*9880d681SAndroid Build Coastguard Worker}
766*9880d681SAndroid Build Coastguard Worker
767*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @insert_test2_sub_sd(<2 x double> %a, <2 x double> %b) {
768*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test2_sub_sd:
769*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
770*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    subsd %xmm0, %xmm1
771*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movapd %xmm1, %xmm0
772*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
773*9880d681SAndroid Build Coastguard Worker;
774*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test2_sub_sd:
775*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
776*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsubsd %xmm0, %xmm1, %xmm0
777*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
778*9880d681SAndroid Build Coastguard Worker  %1 = fsub <2 x double> %b, %a
779*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <2 x double> %1, <2 x double> %b, <2 x i32> <i32 0, i32 3>
780*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %2
781*9880d681SAndroid Build Coastguard Worker}
782*9880d681SAndroid Build Coastguard Worker
783*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @insert_test2_mul_sd(<2 x double> %a, <2 x double> %b) {
784*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test2_mul_sd:
785*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
786*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulsd %xmm0, %xmm1
787*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movapd %xmm1, %xmm0
788*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
789*9880d681SAndroid Build Coastguard Worker;
790*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test2_mul_sd:
791*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
792*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulsd %xmm0, %xmm1, %xmm0
793*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
794*9880d681SAndroid Build Coastguard Worker  %1 = fmul <2 x double> %b, %a
795*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <2 x double> %1, <2 x double> %b, <2 x i32> <i32 0, i32 3>
796*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %2
797*9880d681SAndroid Build Coastguard Worker}
798*9880d681SAndroid Build Coastguard Worker
799*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @insert_test2_div_sd(<2 x double> %a, <2 x double> %b) {
800*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test2_div_sd:
801*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
802*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divsd %xmm0, %xmm1
803*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movapd %xmm1, %xmm0
804*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
805*9880d681SAndroid Build Coastguard Worker;
806*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test2_div_sd:
807*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
808*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivsd %xmm0, %xmm1, %xmm0
809*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
810*9880d681SAndroid Build Coastguard Worker  %1 = fdiv <2 x double> %b, %a
811*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <2 x double> %1, <2 x double> %b, <2 x i32> <i32 0, i32 3>
812*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %2
813*9880d681SAndroid Build Coastguard Worker}
814*9880d681SAndroid Build Coastguard Worker
815*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @insert_test3_add_ss(<4 x float> %a, <4 x float> %b) {
816*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test3_add_ss:
817*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
818*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm1, %xmm0
819*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
820*9880d681SAndroid Build Coastguard Worker;
821*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test3_add_ss:
822*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
823*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
824*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
825*9880d681SAndroid Build Coastguard Worker  %1 = fadd <4 x float> %a, %b
826*9880d681SAndroid Build Coastguard Worker  %2 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x float> %a, <4 x float> %1
827*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
828*9880d681SAndroid Build Coastguard Worker}
829*9880d681SAndroid Build Coastguard Worker
830*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @insert_test3_sub_ss(<4 x float> %a, <4 x float> %b) {
831*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test3_sub_ss:
832*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
833*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    subss %xmm1, %xmm0
834*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
835*9880d681SAndroid Build Coastguard Worker;
836*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test3_sub_ss:
837*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
838*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsubss %xmm1, %xmm0, %xmm0
839*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
840*9880d681SAndroid Build Coastguard Worker  %1 = fsub <4 x float> %a, %b
841*9880d681SAndroid Build Coastguard Worker  %2 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x float> %a, <4 x float> %1
842*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
843*9880d681SAndroid Build Coastguard Worker}
844*9880d681SAndroid Build Coastguard Worker
845*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @insert_test3_mul_ss(<4 x float> %a, <4 x float> %b) {
846*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test3_mul_ss:
847*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
848*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulss %xmm1, %xmm0
849*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
850*9880d681SAndroid Build Coastguard Worker;
851*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test3_mul_ss:
852*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
853*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulss %xmm1, %xmm0, %xmm0
854*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
855*9880d681SAndroid Build Coastguard Worker  %1 = fmul <4 x float> %a, %b
856*9880d681SAndroid Build Coastguard Worker  %2 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x float> %a, <4 x float> %1
857*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
858*9880d681SAndroid Build Coastguard Worker}
859*9880d681SAndroid Build Coastguard Worker
860*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @insert_test3_div_ss(<4 x float> %a, <4 x float> %b) {
861*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test3_div_ss:
862*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
863*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divss %xmm1, %xmm0
864*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
865*9880d681SAndroid Build Coastguard Worker;
866*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test3_div_ss:
867*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
868*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivss %xmm1, %xmm0, %xmm0
869*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
870*9880d681SAndroid Build Coastguard Worker  %1 = fdiv <4 x float> %a, %b
871*9880d681SAndroid Build Coastguard Worker  %2 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x float> %a, <4 x float> %1
872*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
873*9880d681SAndroid Build Coastguard Worker}
874*9880d681SAndroid Build Coastguard Worker
875*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @insert_test3_add_sd(<2 x double> %a, <2 x double> %b) {
876*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test3_add_sd:
877*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
878*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsd %xmm1, %xmm0
879*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
880*9880d681SAndroid Build Coastguard Worker;
881*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test3_add_sd:
882*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
883*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
884*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
885*9880d681SAndroid Build Coastguard Worker  %1 = fadd <2 x double> %a, %b
886*9880d681SAndroid Build Coastguard Worker  %2 = select <2 x i1> <i1 false, i1 true>, <2 x double> %a, <2 x double> %1
887*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %2
888*9880d681SAndroid Build Coastguard Worker}
889*9880d681SAndroid Build Coastguard Worker
890*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @insert_test3_sub_sd(<2 x double> %a, <2 x double> %b) {
891*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test3_sub_sd:
892*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
893*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    subsd %xmm1, %xmm0
894*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
895*9880d681SAndroid Build Coastguard Worker;
896*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test3_sub_sd:
897*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
898*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsubsd %xmm1, %xmm0, %xmm0
899*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
900*9880d681SAndroid Build Coastguard Worker  %1 = fsub <2 x double> %a, %b
901*9880d681SAndroid Build Coastguard Worker  %2 = select <2 x i1> <i1 false, i1 true>, <2 x double> %a, <2 x double> %1
902*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %2
903*9880d681SAndroid Build Coastguard Worker}
904*9880d681SAndroid Build Coastguard Worker
905*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @insert_test3_mul_sd(<2 x double> %a, <2 x double> %b) {
906*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test3_mul_sd:
907*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
908*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulsd %xmm1, %xmm0
909*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
910*9880d681SAndroid Build Coastguard Worker;
911*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test3_mul_sd:
912*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
913*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulsd %xmm1, %xmm0, %xmm0
914*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
915*9880d681SAndroid Build Coastguard Worker  %1 = fmul <2 x double> %a, %b
916*9880d681SAndroid Build Coastguard Worker  %2 = select <2 x i1> <i1 false, i1 true>, <2 x double> %a, <2 x double> %1
917*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %2
918*9880d681SAndroid Build Coastguard Worker}
919*9880d681SAndroid Build Coastguard Worker
920*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @insert_test3_div_sd(<2 x double> %a, <2 x double> %b) {
921*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test3_div_sd:
922*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
923*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divsd %xmm1, %xmm0
924*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
925*9880d681SAndroid Build Coastguard Worker;
926*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test3_div_sd:
927*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
928*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivsd %xmm1, %xmm0, %xmm0
929*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
930*9880d681SAndroid Build Coastguard Worker  %1 = fdiv <2 x double> %a, %b
931*9880d681SAndroid Build Coastguard Worker  %2 = select <2 x i1> <i1 false, i1 true>, <2 x double> %a, <2 x double> %1
932*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %2
933*9880d681SAndroid Build Coastguard Worker}
934*9880d681SAndroid Build Coastguard Worker
935*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @insert_test4_add_ss(<4 x float> %a, <4 x float> %b) {
936*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test4_add_ss:
937*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
938*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addss %xmm0, %xmm1
939*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm1, %xmm0
940*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
941*9880d681SAndroid Build Coastguard Worker;
942*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test4_add_ss:
943*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
944*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddss %xmm0, %xmm1, %xmm0
945*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
946*9880d681SAndroid Build Coastguard Worker  %1 = fadd <4 x float> %b, %a
947*9880d681SAndroid Build Coastguard Worker  %2 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x float> %b, <4 x float> %1
948*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
949*9880d681SAndroid Build Coastguard Worker}
950*9880d681SAndroid Build Coastguard Worker
951*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @insert_test4_sub_ss(<4 x float> %a, <4 x float> %b) {
952*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test4_sub_ss:
953*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
954*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    subss %xmm0, %xmm1
955*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm1, %xmm0
956*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
957*9880d681SAndroid Build Coastguard Worker;
958*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test4_sub_ss:
959*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
960*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsubss %xmm0, %xmm1, %xmm0
961*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
962*9880d681SAndroid Build Coastguard Worker  %1 = fsub <4 x float> %b, %a
963*9880d681SAndroid Build Coastguard Worker  %2 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x float> %b, <4 x float> %1
964*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
965*9880d681SAndroid Build Coastguard Worker}
966*9880d681SAndroid Build Coastguard Worker
967*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @insert_test4_mul_ss(<4 x float> %a, <4 x float> %b) {
968*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test4_mul_ss:
969*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
970*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulss %xmm0, %xmm1
971*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm1, %xmm0
972*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
973*9880d681SAndroid Build Coastguard Worker;
974*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test4_mul_ss:
975*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
976*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulss %xmm0, %xmm1, %xmm0
977*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
978*9880d681SAndroid Build Coastguard Worker  %1 = fmul <4 x float> %b, %a
979*9880d681SAndroid Build Coastguard Worker  %2 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x float> %b, <4 x float> %1
980*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
981*9880d681SAndroid Build Coastguard Worker}
982*9880d681SAndroid Build Coastguard Worker
983*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @insert_test4_div_ss(<4 x float> %a, <4 x float> %b) {
984*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test4_div_ss:
985*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
986*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divss %xmm0, %xmm1
987*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm1, %xmm0
988*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
989*9880d681SAndroid Build Coastguard Worker;
990*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test4_div_ss:
991*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
992*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivss %xmm0, %xmm1, %xmm0
993*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
994*9880d681SAndroid Build Coastguard Worker  %1 = fdiv <4 x float> %b, %a
995*9880d681SAndroid Build Coastguard Worker  %2 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x float> %b, <4 x float> %1
996*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
997*9880d681SAndroid Build Coastguard Worker}
998*9880d681SAndroid Build Coastguard Worker
999*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @insert_test4_add_sd(<2 x double> %a, <2 x double> %b) {
1000*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test4_add_sd:
1001*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1002*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addsd %xmm0, %xmm1
1003*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movapd %xmm1, %xmm0
1004*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1005*9880d681SAndroid Build Coastguard Worker;
1006*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test4_add_sd:
1007*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1008*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddsd %xmm0, %xmm1, %xmm0
1009*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1010*9880d681SAndroid Build Coastguard Worker  %1 = fadd <2 x double> %b, %a
1011*9880d681SAndroid Build Coastguard Worker  %2 = select <2 x i1> <i1 false, i1 true>, <2 x double> %b, <2 x double> %1
1012*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %2
1013*9880d681SAndroid Build Coastguard Worker}
1014*9880d681SAndroid Build Coastguard Worker
1015*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @insert_test4_sub_sd(<2 x double> %a, <2 x double> %b) {
1016*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test4_sub_sd:
1017*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1018*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    subsd %xmm0, %xmm1
1019*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movapd %xmm1, %xmm0
1020*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1021*9880d681SAndroid Build Coastguard Worker;
1022*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test4_sub_sd:
1023*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1024*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vsubsd %xmm0, %xmm1, %xmm0
1025*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1026*9880d681SAndroid Build Coastguard Worker  %1 = fsub <2 x double> %b, %a
1027*9880d681SAndroid Build Coastguard Worker  %2 = select <2 x i1> <i1 false, i1 true>, <2 x double> %b, <2 x double> %1
1028*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %2
1029*9880d681SAndroid Build Coastguard Worker}
1030*9880d681SAndroid Build Coastguard Worker
1031*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @insert_test4_mul_sd(<2 x double> %a, <2 x double> %b) {
1032*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test4_mul_sd:
1033*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1034*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    mulsd %xmm0, %xmm1
1035*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movapd %xmm1, %xmm0
1036*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1037*9880d681SAndroid Build Coastguard Worker;
1038*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test4_mul_sd:
1039*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1040*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmulsd %xmm0, %xmm1, %xmm0
1041*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1042*9880d681SAndroid Build Coastguard Worker  %1 = fmul <2 x double> %b, %a
1043*9880d681SAndroid Build Coastguard Worker  %2 = select <2 x i1> <i1 false, i1 true>, <2 x double> %b, <2 x double> %1
1044*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %2
1045*9880d681SAndroid Build Coastguard Worker}
1046*9880d681SAndroid Build Coastguard Worker
1047*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @insert_test4_div_sd(<2 x double> %a, <2 x double> %b) {
1048*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: insert_test4_div_sd:
1049*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1050*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    divsd %xmm0, %xmm1
1051*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movapd %xmm1, %xmm0
1052*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1053*9880d681SAndroid Build Coastguard Worker;
1054*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: insert_test4_div_sd:
1055*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1056*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vdivsd %xmm0, %xmm1, %xmm0
1057*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1058*9880d681SAndroid Build Coastguard Worker  %1 = fdiv <2 x double> %b, %a
1059*9880d681SAndroid Build Coastguard Worker  %2 = select <2 x i1> <i1 false, i1 true>, <2 x double> %b, <2 x double> %1
1060*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %2
1061*9880d681SAndroid Build Coastguard Worker}
1062