xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/fma-scalar-memfold.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-win32 -mcpu=core-avx2 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind }
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float>, <4 x float>, <4 x float>)
6*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float>, <4 x float>, <4 x float>)
7*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float>, <4 x float>, <4 x float>)
8*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float>, <4 x float>, <4 x float>)
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerdeclare <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double>, <2 x double>, <2 x double>)
11*9880d681SAndroid Build Coastguard Workerdeclare <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double>, <2 x double>, <2 x double>)
12*9880d681SAndroid Build Coastguard Workerdeclare <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double>, <2 x double>, <2 x double>)
13*9880d681SAndroid Build Coastguard Workerdeclare <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double>, <2 x double>, <2 x double>)
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerdefine void @fmadd_aab_ss(float* %a, float* %b) #0 {
16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmadd_aab_ss:
17*9880d681SAndroid Build Coastguard Worker; CHECK:      vmovss (%rcx), %[[XMM:xmm[0-9]+]]
18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfmadd213ss (%rdx), %[[XMM]], %[[XMM]]
19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovss %[[XMM]], (%rcx)
20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
21*9880d681SAndroid Build Coastguard Worker  %a.val = load float, float* %a
22*9880d681SAndroid Build Coastguard Worker  %av0 = insertelement <4 x float> undef, float %a.val, i32 0
23*9880d681SAndroid Build Coastguard Worker  %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1
24*9880d681SAndroid Build Coastguard Worker  %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2
25*9880d681SAndroid Build Coastguard Worker  %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker  %b.val = load float, float* %b
28*9880d681SAndroid Build Coastguard Worker  %bv0 = insertelement <4 x float> undef, float %b.val, i32 0
29*9880d681SAndroid Build Coastguard Worker  %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1
30*9880d681SAndroid Build Coastguard Worker  %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2
31*9880d681SAndroid Build Coastguard Worker  %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker  %vr = call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %av, <4 x float> %av, <4 x float> %bv)
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker  %sr = extractelement <4 x float> %vr, i32 0
36*9880d681SAndroid Build Coastguard Worker  store float %sr, float* %a
37*9880d681SAndroid Build Coastguard Worker  ret void
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerdefine void @fmadd_aba_ss(float* %a, float* %b) #0 {
41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmadd_aba_ss:
42*9880d681SAndroid Build Coastguard Worker; CHECK:      vmovss (%rcx), %[[XMM:xmm[0-9]+]]
43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfmadd132ss (%rdx), %[[XMM]], %[[XMM]]
44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovss %[[XMM]], (%rcx)
45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
46*9880d681SAndroid Build Coastguard Worker  %a.val = load float, float* %a
47*9880d681SAndroid Build Coastguard Worker  %av0 = insertelement <4 x float> undef, float %a.val, i32 0
48*9880d681SAndroid Build Coastguard Worker  %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1
49*9880d681SAndroid Build Coastguard Worker  %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2
50*9880d681SAndroid Build Coastguard Worker  %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker  %b.val = load float, float* %b
53*9880d681SAndroid Build Coastguard Worker  %bv0 = insertelement <4 x float> undef, float %b.val, i32 0
54*9880d681SAndroid Build Coastguard Worker  %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1
55*9880d681SAndroid Build Coastguard Worker  %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2
56*9880d681SAndroid Build Coastguard Worker  %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker  %vr = call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %av, <4 x float> %bv, <4 x float> %av)
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker  %sr = extractelement <4 x float> %vr, i32 0
61*9880d681SAndroid Build Coastguard Worker  store float %sr, float* %a
62*9880d681SAndroid Build Coastguard Worker  ret void
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerdefine void @fmsub_aab_ss(float* %a, float* %b) #0 {
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmsub_aab_ss:
67*9880d681SAndroid Build Coastguard Worker; CHECK:      vmovss (%rcx), %[[XMM:xmm[0-9]+]]
68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfmsub213ss (%rdx), %[[XMM]], %[[XMM]]
69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovss %[[XMM]], (%rcx)
70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
71*9880d681SAndroid Build Coastguard Worker  %a.val = load float, float* %a
72*9880d681SAndroid Build Coastguard Worker  %av0 = insertelement <4 x float> undef, float %a.val, i32 0
73*9880d681SAndroid Build Coastguard Worker  %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1
74*9880d681SAndroid Build Coastguard Worker  %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2
75*9880d681SAndroid Build Coastguard Worker  %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker  %b.val = load float, float* %b
78*9880d681SAndroid Build Coastguard Worker  %bv0 = insertelement <4 x float> undef, float %b.val, i32 0
79*9880d681SAndroid Build Coastguard Worker  %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1
80*9880d681SAndroid Build Coastguard Worker  %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2
81*9880d681SAndroid Build Coastguard Worker  %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker  %vr = call <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float> %av, <4 x float> %av, <4 x float> %bv)
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker  %sr = extractelement <4 x float> %vr, i32 0
86*9880d681SAndroid Build Coastguard Worker  store float %sr, float* %a
87*9880d681SAndroid Build Coastguard Worker  ret void
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workerdefine void @fmsub_aba_ss(float* %a, float* %b) #0 {
91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmsub_aba_ss:
92*9880d681SAndroid Build Coastguard Worker; CHECK:      vmovss (%rcx), %[[XMM:xmm[0-9]+]]
93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfmsub132ss (%rdx), %[[XMM]], %[[XMM]]
94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovss %[[XMM]], (%rcx)
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
96*9880d681SAndroid Build Coastguard Worker  %a.val = load float, float* %a
97*9880d681SAndroid Build Coastguard Worker  %av0 = insertelement <4 x float> undef, float %a.val, i32 0
98*9880d681SAndroid Build Coastguard Worker  %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1
99*9880d681SAndroid Build Coastguard Worker  %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2
100*9880d681SAndroid Build Coastguard Worker  %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker  %b.val = load float, float* %b
103*9880d681SAndroid Build Coastguard Worker  %bv0 = insertelement <4 x float> undef, float %b.val, i32 0
104*9880d681SAndroid Build Coastguard Worker  %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1
105*9880d681SAndroid Build Coastguard Worker  %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2
106*9880d681SAndroid Build Coastguard Worker  %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker  %vr = call <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float> %av, <4 x float> %bv, <4 x float> %av)
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker  %sr = extractelement <4 x float> %vr, i32 0
111*9880d681SAndroid Build Coastguard Worker  store float %sr, float* %a
112*9880d681SAndroid Build Coastguard Worker  ret void
113*9880d681SAndroid Build Coastguard Worker}
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerdefine void @fnmadd_aab_ss(float* %a, float* %b) #0 {
116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fnmadd_aab_ss:
117*9880d681SAndroid Build Coastguard Worker; CHECK:      vmovss (%rcx), %[[XMM:xmm[0-9]+]]
118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfnmadd213ss (%rdx), %[[XMM]], %[[XMM]]
119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovss %[[XMM]], (%rcx)
120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
121*9880d681SAndroid Build Coastguard Worker  %a.val = load float, float* %a
122*9880d681SAndroid Build Coastguard Worker  %av0 = insertelement <4 x float> undef, float %a.val, i32 0
123*9880d681SAndroid Build Coastguard Worker  %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1
124*9880d681SAndroid Build Coastguard Worker  %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2
125*9880d681SAndroid Build Coastguard Worker  %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker  %b.val = load float, float* %b
128*9880d681SAndroid Build Coastguard Worker  %bv0 = insertelement <4 x float> undef, float %b.val, i32 0
129*9880d681SAndroid Build Coastguard Worker  %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1
130*9880d681SAndroid Build Coastguard Worker  %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2
131*9880d681SAndroid Build Coastguard Worker  %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker  %vr = call <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float> %av, <4 x float> %av, <4 x float> %bv)
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker  %sr = extractelement <4 x float> %vr, i32 0
136*9880d681SAndroid Build Coastguard Worker  store float %sr, float* %a
137*9880d681SAndroid Build Coastguard Worker  ret void
138*9880d681SAndroid Build Coastguard Worker}
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workerdefine void @fnmadd_aba_ss(float* %a, float* %b) #0 {
141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fnmadd_aba_ss:
142*9880d681SAndroid Build Coastguard Worker; CHECK:      vmovss (%rcx), %[[XMM:xmm[0-9]+]]
143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfnmadd132ss (%rdx), %[[XMM]], %[[XMM]]
144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovss %[[XMM]], (%rcx)
145*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
146*9880d681SAndroid Build Coastguard Worker  %a.val = load float, float* %a
147*9880d681SAndroid Build Coastguard Worker  %av0 = insertelement <4 x float> undef, float %a.val, i32 0
148*9880d681SAndroid Build Coastguard Worker  %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1
149*9880d681SAndroid Build Coastguard Worker  %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2
150*9880d681SAndroid Build Coastguard Worker  %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Worker  %b.val = load float, float* %b
153*9880d681SAndroid Build Coastguard Worker  %bv0 = insertelement <4 x float> undef, float %b.val, i32 0
154*9880d681SAndroid Build Coastguard Worker  %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1
155*9880d681SAndroid Build Coastguard Worker  %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2
156*9880d681SAndroid Build Coastguard Worker  %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Worker  %vr = call <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float> %av, <4 x float> %bv, <4 x float> %av)
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Worker  %sr = extractelement <4 x float> %vr, i32 0
161*9880d681SAndroid Build Coastguard Worker  store float %sr, float* %a
162*9880d681SAndroid Build Coastguard Worker  ret void
163*9880d681SAndroid Build Coastguard Worker}
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Workerdefine void @fnmsub_aab_ss(float* %a, float* %b) #0 {
166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fnmsub_aab_ss:
167*9880d681SAndroid Build Coastguard Worker; CHECK:      vmovss (%rcx), %[[XMM:xmm[0-9]+]]
168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfnmsub213ss (%rdx), %[[XMM]], %[[XMM]]
169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovss %[[XMM]], (%rcx)
170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
171*9880d681SAndroid Build Coastguard Worker  %a.val = load float, float* %a
172*9880d681SAndroid Build Coastguard Worker  %av0 = insertelement <4 x float> undef, float %a.val, i32 0
173*9880d681SAndroid Build Coastguard Worker  %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1
174*9880d681SAndroid Build Coastguard Worker  %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2
175*9880d681SAndroid Build Coastguard Worker  %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker  %b.val = load float, float* %b
178*9880d681SAndroid Build Coastguard Worker  %bv0 = insertelement <4 x float> undef, float %b.val, i32 0
179*9880d681SAndroid Build Coastguard Worker  %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1
180*9880d681SAndroid Build Coastguard Worker  %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2
181*9880d681SAndroid Build Coastguard Worker  %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker  %vr = call <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float> %av, <4 x float> %av, <4 x float> %bv)
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Worker  %sr = extractelement <4 x float> %vr, i32 0
186*9880d681SAndroid Build Coastguard Worker  store float %sr, float* %a
187*9880d681SAndroid Build Coastguard Worker  ret void
188*9880d681SAndroid Build Coastguard Worker}
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Workerdefine void @fnmsub_aba_ss(float* %a, float* %b) #0 {
191*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fnmsub_aba_ss:
192*9880d681SAndroid Build Coastguard Worker; CHECK:      vmovss (%rcx), %[[XMM:xmm[0-9]+]]
193*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfnmsub132ss (%rdx), %[[XMM]], %[[XMM]]
194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovss %[[XMM]], (%rcx)
195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
196*9880d681SAndroid Build Coastguard Worker  %a.val = load float, float* %a
197*9880d681SAndroid Build Coastguard Worker  %av0 = insertelement <4 x float> undef, float %a.val, i32 0
198*9880d681SAndroid Build Coastguard Worker  %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1
199*9880d681SAndroid Build Coastguard Worker  %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2
200*9880d681SAndroid Build Coastguard Worker  %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker  %b.val = load float, float* %b
203*9880d681SAndroid Build Coastguard Worker  %bv0 = insertelement <4 x float> undef, float %b.val, i32 0
204*9880d681SAndroid Build Coastguard Worker  %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1
205*9880d681SAndroid Build Coastguard Worker  %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2
206*9880d681SAndroid Build Coastguard Worker  %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker  %vr = call <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float> %av, <4 x float> %bv, <4 x float> %av)
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Worker  %sr = extractelement <4 x float> %vr, i32 0
211*9880d681SAndroid Build Coastguard Worker  store float %sr, float* %a
212*9880d681SAndroid Build Coastguard Worker  ret void
213*9880d681SAndroid Build Coastguard Worker}
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Workerdefine void @fmadd_aab_sd(double* %a, double* %b) #0 {
216*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmadd_aab_sd:
217*9880d681SAndroid Build Coastguard Worker; CHECK:      vmovsd (%rcx), %[[XMM:xmm[0-9]+]]
218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfmadd213sd (%rdx), %[[XMM]], %[[XMM]]
219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovlpd %[[XMM]], (%rcx)
220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
221*9880d681SAndroid Build Coastguard Worker  %a.val = load double, double* %a
222*9880d681SAndroid Build Coastguard Worker  %av0 = insertelement <2 x double> undef, double %a.val, i32 0
223*9880d681SAndroid Build Coastguard Worker  %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Worker  %b.val = load double, double* %b
226*9880d681SAndroid Build Coastguard Worker  %bv0 = insertelement <2 x double> undef, double %b.val, i32 0
227*9880d681SAndroid Build Coastguard Worker  %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1
228*9880d681SAndroid Build Coastguard Worker
229*9880d681SAndroid Build Coastguard Worker  %vr = call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %av, <2 x double> %av, <2 x double> %bv)
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Worker  %sr = extractelement <2 x double> %vr, i32 0
232*9880d681SAndroid Build Coastguard Worker  store double %sr, double* %a
233*9880d681SAndroid Build Coastguard Worker  ret void
234*9880d681SAndroid Build Coastguard Worker}
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Workerdefine void @fmadd_aba_sd(double* %a, double* %b) #0 {
237*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmadd_aba_sd:
238*9880d681SAndroid Build Coastguard Worker; CHECK:      vmovsd (%rcx), %[[XMM:xmm[0-9]+]]
239*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfmadd132sd (%rdx), %[[XMM]], %[[XMM]]
240*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovlpd %[[XMM]], (%rcx)
241*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
242*9880d681SAndroid Build Coastguard Worker  %a.val = load double, double* %a
243*9880d681SAndroid Build Coastguard Worker  %av0 = insertelement <2 x double> undef, double %a.val, i32 0
244*9880d681SAndroid Build Coastguard Worker  %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1
245*9880d681SAndroid Build Coastguard Worker
246*9880d681SAndroid Build Coastguard Worker  %b.val = load double, double* %b
247*9880d681SAndroid Build Coastguard Worker  %bv0 = insertelement <2 x double> undef, double %b.val, i32 0
248*9880d681SAndroid Build Coastguard Worker  %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker  %vr = call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %av, <2 x double> %bv, <2 x double> %av)
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Worker  %sr = extractelement <2 x double> %vr, i32 0
253*9880d681SAndroid Build Coastguard Worker  store double %sr, double* %a
254*9880d681SAndroid Build Coastguard Worker  ret void
255*9880d681SAndroid Build Coastguard Worker}
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Workerdefine void @fmsub_aab_sd(double* %a, double* %b) #0 {
258*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmsub_aab_sd:
259*9880d681SAndroid Build Coastguard Worker; CHECK:      vmovsd (%rcx), %[[XMM:xmm[0-9]+]]
260*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfmsub213sd (%rdx), %[[XMM]], %[[XMM]]
261*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovlpd %[[XMM]], (%rcx)
262*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
263*9880d681SAndroid Build Coastguard Worker  %a.val = load double, double* %a
264*9880d681SAndroid Build Coastguard Worker  %av0 = insertelement <2 x double> undef, double %a.val, i32 0
265*9880d681SAndroid Build Coastguard Worker  %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1
266*9880d681SAndroid Build Coastguard Worker
267*9880d681SAndroid Build Coastguard Worker  %b.val = load double, double* %b
268*9880d681SAndroid Build Coastguard Worker  %bv0 = insertelement <2 x double> undef, double %b.val, i32 0
269*9880d681SAndroid Build Coastguard Worker  %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Worker  %vr = call <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double> %av, <2 x double> %av, <2 x double> %bv)
272*9880d681SAndroid Build Coastguard Worker
273*9880d681SAndroid Build Coastguard Worker  %sr = extractelement <2 x double> %vr, i32 0
274*9880d681SAndroid Build Coastguard Worker  store double %sr, double* %a
275*9880d681SAndroid Build Coastguard Worker  ret void
276*9880d681SAndroid Build Coastguard Worker}
277*9880d681SAndroid Build Coastguard Worker
278*9880d681SAndroid Build Coastguard Workerdefine void @fmsub_aba_sd(double* %a, double* %b) #0 {
279*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmsub_aba_sd:
280*9880d681SAndroid Build Coastguard Worker; CHECK:      vmovsd (%rcx), %[[XMM:xmm[0-9]+]]
281*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfmsub132sd (%rdx), %[[XMM]], %[[XMM]]
282*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovlpd %[[XMM]], (%rcx)
283*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
284*9880d681SAndroid Build Coastguard Worker  %a.val = load double, double* %a
285*9880d681SAndroid Build Coastguard Worker  %av0 = insertelement <2 x double> undef, double %a.val, i32 0
286*9880d681SAndroid Build Coastguard Worker  %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1
287*9880d681SAndroid Build Coastguard Worker
288*9880d681SAndroid Build Coastguard Worker  %b.val = load double, double* %b
289*9880d681SAndroid Build Coastguard Worker  %bv0 = insertelement <2 x double> undef, double %b.val, i32 0
290*9880d681SAndroid Build Coastguard Worker  %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1
291*9880d681SAndroid Build Coastguard Worker
292*9880d681SAndroid Build Coastguard Worker  %vr = call <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double> %av, <2 x double> %bv, <2 x double> %av)
293*9880d681SAndroid Build Coastguard Worker
294*9880d681SAndroid Build Coastguard Worker  %sr = extractelement <2 x double> %vr, i32 0
295*9880d681SAndroid Build Coastguard Worker  store double %sr, double* %a
296*9880d681SAndroid Build Coastguard Worker  ret void
297*9880d681SAndroid Build Coastguard Worker}
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Workerdefine void @fnmadd_aab_sd(double* %a, double* %b) #0 {
300*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fnmadd_aab_sd:
301*9880d681SAndroid Build Coastguard Worker; CHECK:      vmovsd (%rcx), %[[XMM:xmm[0-9]+]]
302*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfnmadd213sd (%rdx), %[[XMM]], %[[XMM]]
303*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovlpd %[[XMM]], (%rcx)
304*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
305*9880d681SAndroid Build Coastguard Worker  %a.val = load double, double* %a
306*9880d681SAndroid Build Coastguard Worker  %av0 = insertelement <2 x double> undef, double %a.val, i32 0
307*9880d681SAndroid Build Coastguard Worker  %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1
308*9880d681SAndroid Build Coastguard Worker
309*9880d681SAndroid Build Coastguard Worker  %b.val = load double, double* %b
310*9880d681SAndroid Build Coastguard Worker  %bv0 = insertelement <2 x double> undef, double %b.val, i32 0
311*9880d681SAndroid Build Coastguard Worker  %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Worker  %vr = call <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double> %av, <2 x double> %av, <2 x double> %bv)
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Worker  %sr = extractelement <2 x double> %vr, i32 0
316*9880d681SAndroid Build Coastguard Worker  store double %sr, double* %a
317*9880d681SAndroid Build Coastguard Worker  ret void
318*9880d681SAndroid Build Coastguard Worker}
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Workerdefine void @fnmadd_aba_sd(double* %a, double* %b) #0 {
321*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fnmadd_aba_sd:
322*9880d681SAndroid Build Coastguard Worker; CHECK:      vmovsd (%rcx), %[[XMM:xmm[0-9]+]]
323*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfnmadd132sd (%rdx), %[[XMM]], %[[XMM]]
324*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovlpd %[[XMM]], (%rcx)
325*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
326*9880d681SAndroid Build Coastguard Worker  %a.val = load double, double* %a
327*9880d681SAndroid Build Coastguard Worker  %av0 = insertelement <2 x double> undef, double %a.val, i32 0
328*9880d681SAndroid Build Coastguard Worker  %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Worker  %b.val = load double, double* %b
331*9880d681SAndroid Build Coastguard Worker  %bv0 = insertelement <2 x double> undef, double %b.val, i32 0
332*9880d681SAndroid Build Coastguard Worker  %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Worker  %vr = call <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double> %av, <2 x double> %bv, <2 x double> %av)
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Worker  %sr = extractelement <2 x double> %vr, i32 0
337*9880d681SAndroid Build Coastguard Worker  store double %sr, double* %a
338*9880d681SAndroid Build Coastguard Worker  ret void
339*9880d681SAndroid Build Coastguard Worker}
340*9880d681SAndroid Build Coastguard Worker
341*9880d681SAndroid Build Coastguard Workerdefine void @fnmsub_aab_sd(double* %a, double* %b) #0 {
342*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fnmsub_aab_sd:
343*9880d681SAndroid Build Coastguard Worker; CHECK:      vmovsd (%rcx), %[[XMM:xmm[0-9]+]]
344*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfnmsub213sd (%rdx), %[[XMM]], %[[XMM]]
345*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovlpd %[[XMM]], (%rcx)
346*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
347*9880d681SAndroid Build Coastguard Worker  %a.val = load double, double* %a
348*9880d681SAndroid Build Coastguard Worker  %av0 = insertelement <2 x double> undef, double %a.val, i32 0
349*9880d681SAndroid Build Coastguard Worker  %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1
350*9880d681SAndroid Build Coastguard Worker
351*9880d681SAndroid Build Coastguard Worker  %b.val = load double, double* %b
352*9880d681SAndroid Build Coastguard Worker  %bv0 = insertelement <2 x double> undef, double %b.val, i32 0
353*9880d681SAndroid Build Coastguard Worker  %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1
354*9880d681SAndroid Build Coastguard Worker
355*9880d681SAndroid Build Coastguard Worker  %vr = call <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double> %av, <2 x double> %av, <2 x double> %bv)
356*9880d681SAndroid Build Coastguard Worker
357*9880d681SAndroid Build Coastguard Worker  %sr = extractelement <2 x double> %vr, i32 0
358*9880d681SAndroid Build Coastguard Worker  store double %sr, double* %a
359*9880d681SAndroid Build Coastguard Worker  ret void
360*9880d681SAndroid Build Coastguard Worker}
361*9880d681SAndroid Build Coastguard Worker
362*9880d681SAndroid Build Coastguard Workerdefine void @fnmsub_aba_sd(double* %a, double* %b) #0 {
363*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fnmsub_aba_sd:
364*9880d681SAndroid Build Coastguard Worker; CHECK:      vmovsd (%rcx), %[[XMM:xmm[0-9]+]]
365*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfnmsub132sd (%rdx), %[[XMM]], %[[XMM]]
366*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovlpd %[[XMM]], (%rcx)
367*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
368*9880d681SAndroid Build Coastguard Worker  %a.val = load double, double* %a
369*9880d681SAndroid Build Coastguard Worker  %av0 = insertelement <2 x double> undef, double %a.val, i32 0
370*9880d681SAndroid Build Coastguard Worker  %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1
371*9880d681SAndroid Build Coastguard Worker
372*9880d681SAndroid Build Coastguard Worker  %b.val = load double, double* %b
373*9880d681SAndroid Build Coastguard Worker  %bv0 = insertelement <2 x double> undef, double %b.val, i32 0
374*9880d681SAndroid Build Coastguard Worker  %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1
375*9880d681SAndroid Build Coastguard Worker
376*9880d681SAndroid Build Coastguard Worker  %vr = call <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double> %av, <2 x double> %bv, <2 x double> %av)
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Worker  %sr = extractelement <2 x double> %vr, i32 0
379*9880d681SAndroid Build Coastguard Worker  store double %sr, double* %a
380*9880d681SAndroid Build Coastguard Worker  ret void
381*9880d681SAndroid Build Coastguard Worker}
382*9880d681SAndroid Build Coastguard Worker
383*9880d681SAndroid Build Coastguard Worker
384