[docs] Add LICENSE.txt to the root of the mono-repo
[llvm-project.git] / llvm / test / CodeGen / X86 / recip-fastmath.ll
blob2279212ac8771fa457fdcbdef705ebe6895ab381
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2     | FileCheck %s --check-prefix=SSE
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx      | FileCheck %s --check-prefixes=AVX,AVX-RECIP
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+fma | FileCheck %s --check-prefixes=AVX,FMA-RECIP
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=bdver2 | FileCheck %s --check-prefixes=AVX,BDVER2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=btver2 | FileCheck %s --check-prefixes=AVX,BTVER2
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=sandybridge | FileCheck %s --check-prefixes=AVX,SANDY
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=haswell | FileCheck %s --check-prefixes=AVX,HASWELL
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=haswell -mattr=-fma | FileCheck %s --check-prefixes=AVX,HASWELL-NO-FMA
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=knl | FileCheck %s --check-prefixes=AVX,AVX512,KNL
11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=skx | FileCheck %s --check-prefixes=AVX,AVX512,SKX
13 ; If the target's divss/divps instructions are substantially
14 ; slower than rcpss/rcpps with a Newton-Raphson refinement,
15 ; we should generate the estimate sequence.
17 ; See PR21385 ( http://llvm.org/bugs/show_bug.cgi?id=21385 )
18 ; for details about the accuracy, speed, and implementation
19 ; differences of x86 reciprocal estimates.
21 define float @f32_no_estimate(float %x) #0 {
22 ; SSE-LABEL: f32_no_estimate:
23 ; SSE:       # %bb.0:
24 ; SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
25 ; SSE-NEXT:    divss %xmm0, %xmm1
26 ; SSE-NEXT:    movaps %xmm1, %xmm0
27 ; SSE-NEXT:    retq
29 ; AVX-LABEL: f32_no_estimate:
30 ; AVX:       # %bb.0:
31 ; AVX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
32 ; AVX-NEXT:    vdivss %xmm0, %xmm1, %xmm0
33 ; AVX-NEXT:    retq
34   %div = fdiv fast float 1.0, %x
35   ret float %div
38 define float @f32_one_step(float %x) #1 {
39 ; SSE-LABEL: f32_one_step:
40 ; SSE:       # %bb.0:
41 ; SSE-NEXT:    rcpss %xmm0, %xmm2
42 ; SSE-NEXT:    mulss %xmm2, %xmm0
43 ; SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
44 ; SSE-NEXT:    subss %xmm0, %xmm1
45 ; SSE-NEXT:    mulss %xmm2, %xmm1
46 ; SSE-NEXT:    addss %xmm2, %xmm1
47 ; SSE-NEXT:    movaps %xmm1, %xmm0
48 ; SSE-NEXT:    retq
50 ; AVX-RECIP-LABEL: f32_one_step:
51 ; AVX-RECIP:       # %bb.0:
52 ; AVX-RECIP-NEXT:    vrcpss %xmm0, %xmm0, %xmm1
53 ; AVX-RECIP-NEXT:    vmulss %xmm1, %xmm0, %xmm0
54 ; AVX-RECIP-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
55 ; AVX-RECIP-NEXT:    vsubss %xmm0, %xmm2, %xmm0
56 ; AVX-RECIP-NEXT:    vmulss %xmm0, %xmm1, %xmm0
57 ; AVX-RECIP-NEXT:    vaddss %xmm0, %xmm1, %xmm0
58 ; AVX-RECIP-NEXT:    retq
60 ; FMA-RECIP-LABEL: f32_one_step:
61 ; FMA-RECIP:       # %bb.0:
62 ; FMA-RECIP-NEXT:    vrcpss %xmm0, %xmm0, %xmm1
63 ; FMA-RECIP-NEXT:    vfmsub213ss {{.*#+}} xmm0 = (xmm1 * xmm0) - mem
64 ; FMA-RECIP-NEXT:    vfnmadd132ss {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm1
65 ; FMA-RECIP-NEXT:    retq
67 ; BDVER2-LABEL: f32_one_step:
68 ; BDVER2:       # %bb.0:
69 ; BDVER2-NEXT:    vrcpss %xmm0, %xmm0, %xmm1
70 ; BDVER2-NEXT:    vfmsubss {{.*#+}} xmm0 = (xmm0 * xmm1) - mem
71 ; BDVER2-NEXT:    vfnmaddss {{.*#+}} xmm0 = -(xmm1 * xmm0) + xmm1
72 ; BDVER2-NEXT:    retq
74 ; BTVER2-LABEL: f32_one_step:
75 ; BTVER2:       # %bb.0:
76 ; BTVER2-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
77 ; BTVER2-NEXT:    vrcpss %xmm0, %xmm0, %xmm1
78 ; BTVER2-NEXT:    vmulss %xmm1, %xmm0, %xmm0
79 ; BTVER2-NEXT:    vsubss %xmm0, %xmm2, %xmm0
80 ; BTVER2-NEXT:    vmulss %xmm0, %xmm1, %xmm0
81 ; BTVER2-NEXT:    vaddss %xmm0, %xmm1, %xmm0
82 ; BTVER2-NEXT:    retq
84 ; SANDY-LABEL: f32_one_step:
85 ; SANDY:       # %bb.0:
86 ; SANDY-NEXT:    vrcpss %xmm0, %xmm0, %xmm1
87 ; SANDY-NEXT:    vmulss %xmm1, %xmm0, %xmm0
88 ; SANDY-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
89 ; SANDY-NEXT:    vsubss %xmm0, %xmm2, %xmm0
90 ; SANDY-NEXT:    vmulss %xmm0, %xmm1, %xmm0
91 ; SANDY-NEXT:    vaddss %xmm0, %xmm1, %xmm0
92 ; SANDY-NEXT:    retq
94 ; HASWELL-LABEL: f32_one_step:
95 ; HASWELL:       # %bb.0:
96 ; HASWELL-NEXT:    vrcpss %xmm0, %xmm0, %xmm1
97 ; HASWELL-NEXT:    vfmsub213ss {{.*#+}} xmm0 = (xmm1 * xmm0) - mem
98 ; HASWELL-NEXT:    vfnmadd132ss {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm1
99 ; HASWELL-NEXT:    retq
101 ; HASWELL-NO-FMA-LABEL: f32_one_step:
102 ; HASWELL-NO-FMA:       # %bb.0:
103 ; HASWELL-NO-FMA-NEXT:    vrcpss %xmm0, %xmm0, %xmm1
104 ; HASWELL-NO-FMA-NEXT:    vmulss %xmm1, %xmm0, %xmm0
105 ; HASWELL-NO-FMA-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
106 ; HASWELL-NO-FMA-NEXT:    vsubss %xmm0, %xmm2, %xmm0
107 ; HASWELL-NO-FMA-NEXT:    vmulss %xmm0, %xmm1, %xmm0
108 ; HASWELL-NO-FMA-NEXT:    vaddss %xmm0, %xmm1, %xmm0
109 ; HASWELL-NO-FMA-NEXT:    retq
111 ; AVX512-LABEL: f32_one_step:
112 ; AVX512:       # %bb.0:
113 ; AVX512-NEXT:    vrcpss %xmm0, %xmm0, %xmm1
114 ; AVX512-NEXT:    vfmsub213ss {{.*#+}} xmm0 = (xmm1 * xmm0) - mem
115 ; AVX512-NEXT:    vfnmadd132ss {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm1
116 ; AVX512-NEXT:    retq
117   %div = fdiv fast float 1.0, %x
118   ret float %div
121 define float @f32_one_step_variables(float %x, float %y) #1 {
122 ; SSE-LABEL: f32_one_step_variables:
123 ; SSE:       # %bb.0:
124 ; SSE-NEXT:    rcpss %xmm1, %xmm2
125 ; SSE-NEXT:    movaps %xmm0, %xmm3
126 ; SSE-NEXT:    mulss %xmm2, %xmm3
127 ; SSE-NEXT:    mulss %xmm3, %xmm1
128 ; SSE-NEXT:    subss %xmm1, %xmm0
129 ; SSE-NEXT:    mulss %xmm2, %xmm0
130 ; SSE-NEXT:    addss %xmm3, %xmm0
131 ; SSE-NEXT:    retq
133 ; AVX-RECIP-LABEL: f32_one_step_variables:
134 ; AVX-RECIP:       # %bb.0:
135 ; AVX-RECIP-NEXT:    vrcpss %xmm1, %xmm1, %xmm2
136 ; AVX-RECIP-NEXT:    vmulss %xmm2, %xmm0, %xmm3
137 ; AVX-RECIP-NEXT:    vmulss %xmm3, %xmm1, %xmm1
138 ; AVX-RECIP-NEXT:    vsubss %xmm1, %xmm0, %xmm0
139 ; AVX-RECIP-NEXT:    vmulss %xmm0, %xmm2, %xmm0
140 ; AVX-RECIP-NEXT:    vaddss %xmm0, %xmm3, %xmm0
141 ; AVX-RECIP-NEXT:    retq
143 ; FMA-RECIP-LABEL: f32_one_step_variables:
144 ; FMA-RECIP:       # %bb.0:
145 ; FMA-RECIP-NEXT:    vrcpss %xmm1, %xmm1, %xmm2
146 ; FMA-RECIP-NEXT:    vmulss %xmm2, %xmm0, %xmm3
147 ; FMA-RECIP-NEXT:    vfmsub231ss {{.*#+}} xmm0 = (xmm3 * xmm1) - xmm0
148 ; FMA-RECIP-NEXT:    vfnmadd213ss {{.*#+}} xmm0 = -(xmm2 * xmm0) + xmm3
149 ; FMA-RECIP-NEXT:    retq
151 ; BDVER2-LABEL: f32_one_step_variables:
152 ; BDVER2:       # %bb.0:
153 ; BDVER2-NEXT:    vrcpss %xmm1, %xmm1, %xmm2
154 ; BDVER2-NEXT:    vmulss %xmm2, %xmm0, %xmm3
155 ; BDVER2-NEXT:    vfmsubss {{.*#+}} xmm0 = (xmm1 * xmm3) - xmm0
156 ; BDVER2-NEXT:    vfnmaddss {{.*#+}} xmm0 = -(xmm2 * xmm0) + xmm3
157 ; BDVER2-NEXT:    retq
159 ; BTVER2-LABEL: f32_one_step_variables:
160 ; BTVER2:       # %bb.0:
161 ; BTVER2-NEXT:    vrcpss %xmm1, %xmm1, %xmm2
162 ; BTVER2-NEXT:    vmulss %xmm2, %xmm0, %xmm3
163 ; BTVER2-NEXT:    vmulss %xmm3, %xmm1, %xmm1
164 ; BTVER2-NEXT:    vsubss %xmm1, %xmm0, %xmm0
165 ; BTVER2-NEXT:    vmulss %xmm0, %xmm2, %xmm0
166 ; BTVER2-NEXT:    vaddss %xmm0, %xmm3, %xmm0
167 ; BTVER2-NEXT:    retq
169 ; SANDY-LABEL: f32_one_step_variables:
170 ; SANDY:       # %bb.0:
171 ; SANDY-NEXT:    vrcpss %xmm1, %xmm1, %xmm2
172 ; SANDY-NEXT:    vmulss %xmm2, %xmm0, %xmm3
173 ; SANDY-NEXT:    vmulss %xmm3, %xmm1, %xmm1
174 ; SANDY-NEXT:    vsubss %xmm1, %xmm0, %xmm0
175 ; SANDY-NEXT:    vmulss %xmm0, %xmm2, %xmm0
176 ; SANDY-NEXT:    vaddss %xmm0, %xmm3, %xmm0
177 ; SANDY-NEXT:    retq
179 ; HASWELL-LABEL: f32_one_step_variables:
180 ; HASWELL:       # %bb.0:
181 ; HASWELL-NEXT:    vrcpss %xmm1, %xmm1, %xmm2
182 ; HASWELL-NEXT:    vmulss %xmm2, %xmm0, %xmm3
183 ; HASWELL-NEXT:    vfmsub231ss {{.*#+}} xmm0 = (xmm3 * xmm1) - xmm0
184 ; HASWELL-NEXT:    vfnmadd213ss {{.*#+}} xmm0 = -(xmm2 * xmm0) + xmm3
185 ; HASWELL-NEXT:    retq
187 ; HASWELL-NO-FMA-LABEL: f32_one_step_variables:
188 ; HASWELL-NO-FMA:       # %bb.0:
189 ; HASWELL-NO-FMA-NEXT:    vrcpss %xmm1, %xmm1, %xmm2
190 ; HASWELL-NO-FMA-NEXT:    vmulss %xmm2, %xmm0, %xmm3
191 ; HASWELL-NO-FMA-NEXT:    vmulss %xmm3, %xmm1, %xmm1
192 ; HASWELL-NO-FMA-NEXT:    vsubss %xmm1, %xmm0, %xmm0
193 ; HASWELL-NO-FMA-NEXT:    vmulss %xmm0, %xmm2, %xmm0
194 ; HASWELL-NO-FMA-NEXT:    vaddss %xmm0, %xmm3, %xmm0
195 ; HASWELL-NO-FMA-NEXT:    retq
197 ; AVX512-LABEL: f32_one_step_variables:
198 ; AVX512:       # %bb.0:
199 ; AVX512-NEXT:    vrcpss %xmm1, %xmm1, %xmm2
200 ; AVX512-NEXT:    vmulss %xmm2, %xmm0, %xmm3
201 ; AVX512-NEXT:    vfmsub231ss {{.*#+}} xmm0 = (xmm3 * xmm1) - xmm0
202 ; AVX512-NEXT:    vfnmadd213ss {{.*#+}} xmm0 = -(xmm2 * xmm0) + xmm3
203 ; AVX512-NEXT:    retq
204   %div = fdiv fast float %x, %y
205   ret float %div
208 define float @f32_two_step(float %x) #2 {
209 ; SSE-LABEL: f32_two_step:
210 ; SSE:       # %bb.0:
211 ; SSE-NEXT:    rcpss %xmm0, %xmm2
212 ; SSE-NEXT:    movaps %xmm0, %xmm3
213 ; SSE-NEXT:    mulss %xmm2, %xmm3
214 ; SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
215 ; SSE-NEXT:    movaps %xmm1, %xmm4
216 ; SSE-NEXT:    subss %xmm3, %xmm4
217 ; SSE-NEXT:    mulss %xmm2, %xmm4
218 ; SSE-NEXT:    addss %xmm2, %xmm4
219 ; SSE-NEXT:    mulss %xmm4, %xmm0
220 ; SSE-NEXT:    subss %xmm0, %xmm1
221 ; SSE-NEXT:    mulss %xmm4, %xmm1
222 ; SSE-NEXT:    addss %xmm4, %xmm1
223 ; SSE-NEXT:    movaps %xmm1, %xmm0
224 ; SSE-NEXT:    retq
226 ; AVX-RECIP-LABEL: f32_two_step:
227 ; AVX-RECIP:       # %bb.0:
228 ; AVX-RECIP-NEXT:    vrcpss %xmm0, %xmm0, %xmm1
229 ; AVX-RECIP-NEXT:    vmulss %xmm1, %xmm0, %xmm2
230 ; AVX-RECIP-NEXT:    vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero
231 ; AVX-RECIP-NEXT:    vsubss %xmm2, %xmm3, %xmm2
232 ; AVX-RECIP-NEXT:    vmulss %xmm2, %xmm1, %xmm2
233 ; AVX-RECIP-NEXT:    vaddss %xmm2, %xmm1, %xmm1
234 ; AVX-RECIP-NEXT:    vmulss %xmm1, %xmm0, %xmm0
235 ; AVX-RECIP-NEXT:    vsubss %xmm0, %xmm3, %xmm0
236 ; AVX-RECIP-NEXT:    vmulss %xmm0, %xmm1, %xmm0
237 ; AVX-RECIP-NEXT:    vaddss %xmm0, %xmm1, %xmm0
238 ; AVX-RECIP-NEXT:    retq
240 ; FMA-RECIP-LABEL: f32_two_step:
241 ; FMA-RECIP:       # %bb.0:
242 ; FMA-RECIP-NEXT:    vrcpss %xmm0, %xmm0, %xmm1
243 ; FMA-RECIP-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
244 ; FMA-RECIP-NEXT:    vmovaps %xmm1, %xmm3
245 ; FMA-RECIP-NEXT:    vfmsub213ss {{.*#+}} xmm3 = (xmm0 * xmm3) - xmm2
246 ; FMA-RECIP-NEXT:    vfnmadd132ss {{.*#+}} xmm3 = -(xmm3 * xmm1) + xmm1
247 ; FMA-RECIP-NEXT:    vfmsub213ss {{.*#+}} xmm0 = (xmm3 * xmm0) - xmm2
248 ; FMA-RECIP-NEXT:    vfnmadd132ss {{.*#+}} xmm0 = -(xmm0 * xmm3) + xmm3
249 ; FMA-RECIP-NEXT:    retq
251 ; BDVER2-LABEL: f32_two_step:
252 ; BDVER2:       # %bb.0:
253 ; BDVER2-NEXT:    vrcpss %xmm0, %xmm0, %xmm1
254 ; BDVER2-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
255 ; BDVER2-NEXT:    vfmsubss {{.*#+}} xmm3 = (xmm0 * xmm1) - xmm2
256 ; BDVER2-NEXT:    vfnmaddss {{.*#+}} xmm1 = -(xmm1 * xmm3) + xmm1
257 ; BDVER2-NEXT:    vfmsubss {{.*#+}} xmm0 = (xmm0 * xmm1) - xmm2
258 ; BDVER2-NEXT:    vfnmaddss {{.*#+}} xmm0 = -(xmm1 * xmm0) + xmm1
259 ; BDVER2-NEXT:    retq
261 ; BTVER2-LABEL: f32_two_step:
262 ; BTVER2:       # %bb.0:
263 ; BTVER2-NEXT:    vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero
264 ; BTVER2-NEXT:    vrcpss %xmm0, %xmm0, %xmm1
265 ; BTVER2-NEXT:    vmulss %xmm1, %xmm0, %xmm2
266 ; BTVER2-NEXT:    vsubss %xmm2, %xmm3, %xmm2
267 ; BTVER2-NEXT:    vmulss %xmm2, %xmm1, %xmm2
268 ; BTVER2-NEXT:    vaddss %xmm2, %xmm1, %xmm1
269 ; BTVER2-NEXT:    vmulss %xmm1, %xmm0, %xmm0
270 ; BTVER2-NEXT:    vsubss %xmm0, %xmm3, %xmm0
271 ; BTVER2-NEXT:    vmulss %xmm0, %xmm1, %xmm0
272 ; BTVER2-NEXT:    vaddss %xmm0, %xmm1, %xmm0
273 ; BTVER2-NEXT:    retq
275 ; SANDY-LABEL: f32_two_step:
276 ; SANDY:       # %bb.0:
277 ; SANDY-NEXT:    vrcpss %xmm0, %xmm0, %xmm1
278 ; SANDY-NEXT:    vmulss %xmm1, %xmm0, %xmm2
279 ; SANDY-NEXT:    vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero
280 ; SANDY-NEXT:    vsubss %xmm2, %xmm3, %xmm2
281 ; SANDY-NEXT:    vmulss %xmm2, %xmm1, %xmm2
282 ; SANDY-NEXT:    vaddss %xmm2, %xmm1, %xmm1
283 ; SANDY-NEXT:    vmulss %xmm1, %xmm0, %xmm0
284 ; SANDY-NEXT:    vsubss %xmm0, %xmm3, %xmm0
285 ; SANDY-NEXT:    vmulss %xmm0, %xmm1, %xmm0
286 ; SANDY-NEXT:    vaddss %xmm0, %xmm1, %xmm0
287 ; SANDY-NEXT:    retq
289 ; HASWELL-LABEL: f32_two_step:
290 ; HASWELL:       # %bb.0:
291 ; HASWELL-NEXT:    vrcpss %xmm0, %xmm0, %xmm1
292 ; HASWELL-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
293 ; HASWELL-NEXT:    vmovaps %xmm1, %xmm3
294 ; HASWELL-NEXT:    vfmsub213ss {{.*#+}} xmm3 = (xmm0 * xmm3) - xmm2
295 ; HASWELL-NEXT:    vfnmadd132ss {{.*#+}} xmm3 = -(xmm3 * xmm1) + xmm1
296 ; HASWELL-NEXT:    vfmsub213ss {{.*#+}} xmm0 = (xmm3 * xmm0) - xmm2
297 ; HASWELL-NEXT:    vfnmadd132ss {{.*#+}} xmm0 = -(xmm0 * xmm3) + xmm3
298 ; HASWELL-NEXT:    retq
300 ; HASWELL-NO-FMA-LABEL: f32_two_step:
301 ; HASWELL-NO-FMA:       # %bb.0:
302 ; HASWELL-NO-FMA-NEXT:    vrcpss %xmm0, %xmm0, %xmm1
303 ; HASWELL-NO-FMA-NEXT:    vmulss %xmm1, %xmm0, %xmm2
304 ; HASWELL-NO-FMA-NEXT:    vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero
305 ; HASWELL-NO-FMA-NEXT:    vsubss %xmm2, %xmm3, %xmm2
306 ; HASWELL-NO-FMA-NEXT:    vmulss %xmm2, %xmm1, %xmm2
307 ; HASWELL-NO-FMA-NEXT:    vaddss %xmm2, %xmm1, %xmm1
308 ; HASWELL-NO-FMA-NEXT:    vmulss %xmm1, %xmm0, %xmm0
309 ; HASWELL-NO-FMA-NEXT:    vsubss %xmm0, %xmm3, %xmm0
310 ; HASWELL-NO-FMA-NEXT:    vmulss %xmm0, %xmm1, %xmm0
311 ; HASWELL-NO-FMA-NEXT:    vaddss %xmm0, %xmm1, %xmm0
312 ; HASWELL-NO-FMA-NEXT:    retq
314 ; AVX512-LABEL: f32_two_step:
315 ; AVX512:       # %bb.0:
316 ; AVX512-NEXT:    vrcpss %xmm0, %xmm0, %xmm1
317 ; AVX512-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
318 ; AVX512-NEXT:    vmovaps %xmm1, %xmm3
319 ; AVX512-NEXT:    vfmsub213ss {{.*#+}} xmm3 = (xmm0 * xmm3) - xmm2
320 ; AVX512-NEXT:    vfnmadd132ss {{.*#+}} xmm3 = -(xmm3 * xmm1) + xmm1
321 ; AVX512-NEXT:    vfmsub213ss {{.*#+}} xmm0 = (xmm3 * xmm0) - xmm2
322 ; AVX512-NEXT:    vfnmadd132ss {{.*#+}} xmm0 = -(xmm0 * xmm3) + xmm3
323 ; AVX512-NEXT:    retq
324   %div = fdiv fast float 1.0, %x
325   ret float %div
328 define <4 x float> @v4f32_no_estimate(<4 x float> %x) #0 {
329 ; SSE-LABEL: v4f32_no_estimate:
330 ; SSE:       # %bb.0:
331 ; SSE-NEXT:    movaps {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
332 ; SSE-NEXT:    divps %xmm0, %xmm1
333 ; SSE-NEXT:    movaps %xmm1, %xmm0
334 ; SSE-NEXT:    retq
336 ; AVX-RECIP-LABEL: v4f32_no_estimate:
337 ; AVX-RECIP:       # %bb.0:
338 ; AVX-RECIP-NEXT:    vmovaps {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
339 ; AVX-RECIP-NEXT:    vdivps %xmm0, %xmm1, %xmm0
340 ; AVX-RECIP-NEXT:    retq
342 ; FMA-RECIP-LABEL: v4f32_no_estimate:
343 ; FMA-RECIP:       # %bb.0:
344 ; FMA-RECIP-NEXT:    vmovaps {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
345 ; FMA-RECIP-NEXT:    vdivps %xmm0, %xmm1, %xmm0
346 ; FMA-RECIP-NEXT:    retq
348 ; BDVER2-LABEL: v4f32_no_estimate:
349 ; BDVER2:       # %bb.0:
350 ; BDVER2-NEXT:    vmovaps {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
351 ; BDVER2-NEXT:    vdivps %xmm0, %xmm1, %xmm0
352 ; BDVER2-NEXT:    retq
354 ; BTVER2-LABEL: v4f32_no_estimate:
355 ; BTVER2:       # %bb.0:
356 ; BTVER2-NEXT:    vmovaps {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
357 ; BTVER2-NEXT:    vdivps %xmm0, %xmm1, %xmm0
358 ; BTVER2-NEXT:    retq
360 ; SANDY-LABEL: v4f32_no_estimate:
361 ; SANDY:       # %bb.0:
362 ; SANDY-NEXT:    vmovaps {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
363 ; SANDY-NEXT:    vdivps %xmm0, %xmm1, %xmm0
364 ; SANDY-NEXT:    retq
366 ; HASWELL-LABEL: v4f32_no_estimate:
367 ; HASWELL:       # %bb.0:
368 ; HASWELL-NEXT:    vbroadcastss {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
369 ; HASWELL-NEXT:    vdivps %xmm0, %xmm1, %xmm0
370 ; HASWELL-NEXT:    retq
372 ; HASWELL-NO-FMA-LABEL: v4f32_no_estimate:
373 ; HASWELL-NO-FMA:       # %bb.0:
374 ; HASWELL-NO-FMA-NEXT:    vbroadcastss {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
375 ; HASWELL-NO-FMA-NEXT:    vdivps %xmm0, %xmm1, %xmm0
376 ; HASWELL-NO-FMA-NEXT:    retq
378 ; AVX512-LABEL: v4f32_no_estimate:
379 ; AVX512:       # %bb.0:
380 ; AVX512-NEXT:    vbroadcastss {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
381 ; AVX512-NEXT:    vdivps %xmm0, %xmm1, %xmm0
382 ; AVX512-NEXT:    retq
383   %div = fdiv fast <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>, %x
384   ret <4 x float> %div
387 define <4 x float> @v4f32_one_step(<4 x float> %x) #1 {
388 ; SSE-LABEL: v4f32_one_step:
389 ; SSE:       # %bb.0:
390 ; SSE-NEXT:    rcpps %xmm0, %xmm2
391 ; SSE-NEXT:    mulps %xmm2, %xmm0
392 ; SSE-NEXT:    movaps {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
393 ; SSE-NEXT:    subps %xmm0, %xmm1
394 ; SSE-NEXT:    mulps %xmm2, %xmm1
395 ; SSE-NEXT:    addps %xmm2, %xmm1
396 ; SSE-NEXT:    movaps %xmm1, %xmm0
397 ; SSE-NEXT:    retq
399 ; AVX-RECIP-LABEL: v4f32_one_step:
400 ; AVX-RECIP:       # %bb.0:
401 ; AVX-RECIP-NEXT:    vrcpps %xmm0, %xmm1
402 ; AVX-RECIP-NEXT:    vmulps %xmm1, %xmm0, %xmm0
403 ; AVX-RECIP-NEXT:    vmovaps {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
404 ; AVX-RECIP-NEXT:    vsubps %xmm0, %xmm2, %xmm0
405 ; AVX-RECIP-NEXT:    vmulps %xmm0, %xmm1, %xmm0
406 ; AVX-RECIP-NEXT:    vaddps %xmm0, %xmm1, %xmm0
407 ; AVX-RECIP-NEXT:    retq
409 ; FMA-RECIP-LABEL: v4f32_one_step:
410 ; FMA-RECIP:       # %bb.0:
411 ; FMA-RECIP-NEXT:    vrcpps %xmm0, %xmm1
412 ; FMA-RECIP-NEXT:    vfmsub213ps {{.*#+}} xmm0 = (xmm1 * xmm0) - mem
413 ; FMA-RECIP-NEXT:    vfnmadd132ps {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm1
414 ; FMA-RECIP-NEXT:    retq
416 ; BDVER2-LABEL: v4f32_one_step:
417 ; BDVER2:       # %bb.0:
418 ; BDVER2-NEXT:    vrcpps %xmm0, %xmm1
419 ; BDVER2-NEXT:    vfmsubps {{.*#+}} xmm0 = (xmm0 * xmm1) - mem
420 ; BDVER2-NEXT:    vfnmaddps {{.*#+}} xmm0 = -(xmm1 * xmm0) + xmm1
421 ; BDVER2-NEXT:    retq
423 ; BTVER2-LABEL: v4f32_one_step:
424 ; BTVER2:       # %bb.0:
425 ; BTVER2-NEXT:    vmovaps {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
426 ; BTVER2-NEXT:    vrcpps %xmm0, %xmm1
427 ; BTVER2-NEXT:    vmulps %xmm1, %xmm0, %xmm0
428 ; BTVER2-NEXT:    vsubps %xmm0, %xmm2, %xmm0
429 ; BTVER2-NEXT:    vmulps %xmm0, %xmm1, %xmm0
430 ; BTVER2-NEXT:    vaddps %xmm0, %xmm1, %xmm0
431 ; BTVER2-NEXT:    retq
433 ; SANDY-LABEL: v4f32_one_step:
434 ; SANDY:       # %bb.0:
435 ; SANDY-NEXT:    vrcpps %xmm0, %xmm1
436 ; SANDY-NEXT:    vmulps %xmm1, %xmm0, %xmm0
437 ; SANDY-NEXT:    vmovaps {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
438 ; SANDY-NEXT:    vsubps %xmm0, %xmm2, %xmm0
439 ; SANDY-NEXT:    vmulps %xmm0, %xmm1, %xmm0
440 ; SANDY-NEXT:    vaddps %xmm0, %xmm1, %xmm0
441 ; SANDY-NEXT:    retq
443 ; HASWELL-LABEL: v4f32_one_step:
444 ; HASWELL:       # %bb.0:
445 ; HASWELL-NEXT:    vrcpps %xmm0, %xmm1
446 ; HASWELL-NEXT:    vbroadcastss {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
447 ; HASWELL-NEXT:    vfmsub213ps {{.*#+}} xmm0 = (xmm1 * xmm0) - xmm2
448 ; HASWELL-NEXT:    vfnmadd132ps {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm1
449 ; HASWELL-NEXT:    retq
451 ; HASWELL-NO-FMA-LABEL: v4f32_one_step:
452 ; HASWELL-NO-FMA:       # %bb.0:
453 ; HASWELL-NO-FMA-NEXT:    vrcpps %xmm0, %xmm1
454 ; HASWELL-NO-FMA-NEXT:    vmulps %xmm1, %xmm0, %xmm0
455 ; HASWELL-NO-FMA-NEXT:    vbroadcastss {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
456 ; HASWELL-NO-FMA-NEXT:    vsubps %xmm0, %xmm2, %xmm0
457 ; HASWELL-NO-FMA-NEXT:    vmulps %xmm0, %xmm1, %xmm0
458 ; HASWELL-NO-FMA-NEXT:    vaddps %xmm0, %xmm1, %xmm0
459 ; HASWELL-NO-FMA-NEXT:    retq
461 ; KNL-LABEL: v4f32_one_step:
462 ; KNL:       # %bb.0:
463 ; KNL-NEXT:    vrcpps %xmm0, %xmm1
464 ; KNL-NEXT:    vbroadcastss {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
465 ; KNL-NEXT:    vfmsub213ps {{.*#+}} xmm0 = (xmm1 * xmm0) - xmm2
466 ; KNL-NEXT:    vfnmadd132ps {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm1
467 ; KNL-NEXT:    retq
469 ; SKX-LABEL: v4f32_one_step:
470 ; SKX:       # %bb.0:
471 ; SKX-NEXT:    vrcpps %xmm0, %xmm1
472 ; SKX-NEXT:    vfmsub213ps {{.*#+}} xmm0 = (xmm1 * xmm0) - mem
473 ; SKX-NEXT:    vfnmadd132ps {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm1
474 ; SKX-NEXT:    retq
475   %div = fdiv fast <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>, %x
476   ret <4 x float> %div
479 define <4 x float> @v4f32_one_step_variables(<4 x float> %x, <4 x float> %y) #1 {
480 ; SSE-LABEL: v4f32_one_step_variables:
481 ; SSE:       # %bb.0:
482 ; SSE-NEXT:    rcpps %xmm1, %xmm2
483 ; SSE-NEXT:    movaps %xmm0, %xmm3
484 ; SSE-NEXT:    mulps %xmm2, %xmm3
485 ; SSE-NEXT:    mulps %xmm3, %xmm1
486 ; SSE-NEXT:    subps %xmm1, %xmm0
487 ; SSE-NEXT:    mulps %xmm2, %xmm0
488 ; SSE-NEXT:    addps %xmm3, %xmm0
489 ; SSE-NEXT:    retq
491 ; AVX-RECIP-LABEL: v4f32_one_step_variables:
492 ; AVX-RECIP:       # %bb.0:
493 ; AVX-RECIP-NEXT:    vrcpps %xmm1, %xmm2
494 ; AVX-RECIP-NEXT:    vmulps %xmm2, %xmm0, %xmm3
495 ; AVX-RECIP-NEXT:    vmulps %xmm3, %xmm1, %xmm1
496 ; AVX-RECIP-NEXT:    vsubps %xmm1, %xmm0, %xmm0
497 ; AVX-RECIP-NEXT:    vmulps %xmm0, %xmm2, %xmm0
498 ; AVX-RECIP-NEXT:    vaddps %xmm0, %xmm3, %xmm0
499 ; AVX-RECIP-NEXT:    retq
501 ; FMA-RECIP-LABEL: v4f32_one_step_variables:
502 ; FMA-RECIP:       # %bb.0:
503 ; FMA-RECIP-NEXT:    vrcpps %xmm1, %xmm2
504 ; FMA-RECIP-NEXT:    vmulps %xmm2, %xmm0, %xmm3
505 ; FMA-RECIP-NEXT:    vfmsub231ps {{.*#+}} xmm0 = (xmm3 * xmm1) - xmm0
506 ; FMA-RECIP-NEXT:    vfnmadd213ps {{.*#+}} xmm0 = -(xmm2 * xmm0) + xmm3
507 ; FMA-RECIP-NEXT:    retq
509 ; BDVER2-LABEL: v4f32_one_step_variables:
510 ; BDVER2:       # %bb.0:
511 ; BDVER2-NEXT:    vrcpps %xmm1, %xmm2
512 ; BDVER2-NEXT:    vmulps %xmm2, %xmm0, %xmm3
513 ; BDVER2-NEXT:    vfmsubps {{.*#+}} xmm0 = (xmm1 * xmm3) - xmm0
514 ; BDVER2-NEXT:    vfnmaddps {{.*#+}} xmm0 = -(xmm2 * xmm0) + xmm3
515 ; BDVER2-NEXT:    retq
517 ; BTVER2-LABEL: v4f32_one_step_variables:
518 ; BTVER2:       # %bb.0:
519 ; BTVER2-NEXT:    vrcpps %xmm1, %xmm2
520 ; BTVER2-NEXT:    vmulps %xmm2, %xmm0, %xmm3
521 ; BTVER2-NEXT:    vmulps %xmm3, %xmm1, %xmm1
522 ; BTVER2-NEXT:    vsubps %xmm1, %xmm0, %xmm0
523 ; BTVER2-NEXT:    vmulps %xmm0, %xmm2, %xmm0
524 ; BTVER2-NEXT:    vaddps %xmm0, %xmm3, %xmm0
525 ; BTVER2-NEXT:    retq
527 ; SANDY-LABEL: v4f32_one_step_variables:
528 ; SANDY:       # %bb.0:
529 ; SANDY-NEXT:    vrcpps %xmm1, %xmm2
530 ; SANDY-NEXT:    vmulps %xmm2, %xmm0, %xmm3
531 ; SANDY-NEXT:    vmulps %xmm3, %xmm1, %xmm1
532 ; SANDY-NEXT:    vsubps %xmm1, %xmm0, %xmm0
533 ; SANDY-NEXT:    vmulps %xmm0, %xmm2, %xmm0
534 ; SANDY-NEXT:    vaddps %xmm0, %xmm3, %xmm0
535 ; SANDY-NEXT:    retq
537 ; HASWELL-LABEL: v4f32_one_step_variables:
538 ; HASWELL:       # %bb.0:
539 ; HASWELL-NEXT:    vrcpps %xmm1, %xmm2
540 ; HASWELL-NEXT:    vmulps %xmm2, %xmm0, %xmm3
541 ; HASWELL-NEXT:    vfmsub231ps {{.*#+}} xmm0 = (xmm3 * xmm1) - xmm0
542 ; HASWELL-NEXT:    vfnmadd213ps {{.*#+}} xmm0 = -(xmm2 * xmm0) + xmm3
543 ; HASWELL-NEXT:    retq
545 ; HASWELL-NO-FMA-LABEL: v4f32_one_step_variables:
546 ; HASWELL-NO-FMA:       # %bb.0:
547 ; HASWELL-NO-FMA-NEXT:    vrcpps %xmm1, %xmm2
548 ; HASWELL-NO-FMA-NEXT:    vmulps %xmm2, %xmm0, %xmm3
549 ; HASWELL-NO-FMA-NEXT:    vmulps %xmm3, %xmm1, %xmm1
550 ; HASWELL-NO-FMA-NEXT:    vsubps %xmm1, %xmm0, %xmm0
551 ; HASWELL-NO-FMA-NEXT:    vmulps %xmm0, %xmm2, %xmm0
552 ; HASWELL-NO-FMA-NEXT:    vaddps %xmm0, %xmm3, %xmm0
553 ; HASWELL-NO-FMA-NEXT:    retq
555 ; AVX512-LABEL: v4f32_one_step_variables:
556 ; AVX512:       # %bb.0:
557 ; AVX512-NEXT:    vrcpps %xmm1, %xmm2
558 ; AVX512-NEXT:    vmulps %xmm2, %xmm0, %xmm3
559 ; AVX512-NEXT:    vfmsub231ps {{.*#+}} xmm0 = (xmm3 * xmm1) - xmm0
560 ; AVX512-NEXT:    vfnmadd213ps {{.*#+}} xmm0 = -(xmm2 * xmm0) + xmm3
561 ; AVX512-NEXT:    retq
562   %div = fdiv fast <4 x float> %x, %y
563   ret <4 x float> %div
566 define <4 x float> @v4f32_two_step(<4 x float> %x) #2 {
567 ; SSE-LABEL: v4f32_two_step:
568 ; SSE:       # %bb.0:
569 ; SSE-NEXT:    rcpps %xmm0, %xmm2
570 ; SSE-NEXT:    movaps %xmm0, %xmm3
571 ; SSE-NEXT:    mulps %xmm2, %xmm3
572 ; SSE-NEXT:    movaps {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
573 ; SSE-NEXT:    movaps %xmm1, %xmm4
574 ; SSE-NEXT:    subps %xmm3, %xmm4
575 ; SSE-NEXT:    mulps %xmm2, %xmm4
576 ; SSE-NEXT:    addps %xmm2, %xmm4
577 ; SSE-NEXT:    mulps %xmm4, %xmm0
578 ; SSE-NEXT:    subps %xmm0, %xmm1
579 ; SSE-NEXT:    mulps %xmm4, %xmm1
580 ; SSE-NEXT:    addps %xmm4, %xmm1
581 ; SSE-NEXT:    movaps %xmm1, %xmm0
582 ; SSE-NEXT:    retq
584 ; AVX-RECIP-LABEL: v4f32_two_step:
585 ; AVX-RECIP:       # %bb.0:
586 ; AVX-RECIP-NEXT:    vrcpps %xmm0, %xmm1
587 ; AVX-RECIP-NEXT:    vmulps %xmm1, %xmm0, %xmm2
588 ; AVX-RECIP-NEXT:    vmovaps {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
589 ; AVX-RECIP-NEXT:    vsubps %xmm2, %xmm3, %xmm2
590 ; AVX-RECIP-NEXT:    vmulps %xmm2, %xmm1, %xmm2
591 ; AVX-RECIP-NEXT:    vaddps %xmm2, %xmm1, %xmm1
592 ; AVX-RECIP-NEXT:    vmulps %xmm1, %xmm0, %xmm0
593 ; AVX-RECIP-NEXT:    vsubps %xmm0, %xmm3, %xmm0
594 ; AVX-RECIP-NEXT:    vmulps %xmm0, %xmm1, %xmm0
595 ; AVX-RECIP-NEXT:    vaddps %xmm0, %xmm1, %xmm0
596 ; AVX-RECIP-NEXT:    retq
598 ; FMA-RECIP-LABEL: v4f32_two_step:
599 ; FMA-RECIP:       # %bb.0:
600 ; FMA-RECIP-NEXT:    vrcpps %xmm0, %xmm1
601 ; FMA-RECIP-NEXT:    vmovaps {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
602 ; FMA-RECIP-NEXT:    vmovaps %xmm1, %xmm3
603 ; FMA-RECIP-NEXT:    vfmsub213ps {{.*#+}} xmm3 = (xmm0 * xmm3) - xmm2
604 ; FMA-RECIP-NEXT:    vfnmadd132ps {{.*#+}} xmm3 = -(xmm3 * xmm1) + xmm1
605 ; FMA-RECIP-NEXT:    vfmsub213ps {{.*#+}} xmm0 = (xmm3 * xmm0) - xmm2
606 ; FMA-RECIP-NEXT:    vfnmadd132ps {{.*#+}} xmm0 = -(xmm0 * xmm3) + xmm3
607 ; FMA-RECIP-NEXT:    retq
609 ; BDVER2-LABEL: v4f32_two_step:
610 ; BDVER2:       # %bb.0:
611 ; BDVER2-NEXT:    vrcpps %xmm0, %xmm1
612 ; BDVER2-NEXT:    vmovaps {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
613 ; BDVER2-NEXT:    vfmsubps {{.*#+}} xmm3 = (xmm0 * xmm1) - xmm2
614 ; BDVER2-NEXT:    vfnmaddps {{.*#+}} xmm1 = -(xmm1 * xmm3) + xmm1
615 ; BDVER2-NEXT:    vfmsubps {{.*#+}} xmm0 = (xmm0 * xmm1) - xmm2
616 ; BDVER2-NEXT:    vfnmaddps {{.*#+}} xmm0 = -(xmm1 * xmm0) + xmm1
617 ; BDVER2-NEXT:    retq
619 ; BTVER2-LABEL: v4f32_two_step:
620 ; BTVER2:       # %bb.0:
621 ; BTVER2-NEXT:    vmovaps {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
622 ; BTVER2-NEXT:    vrcpps %xmm0, %xmm1
623 ; BTVER2-NEXT:    vmulps %xmm1, %xmm0, %xmm2
624 ; BTVER2-NEXT:    vsubps %xmm2, %xmm3, %xmm2
625 ; BTVER2-NEXT:    vmulps %xmm2, %xmm1, %xmm2
626 ; BTVER2-NEXT:    vaddps %xmm2, %xmm1, %xmm1
627 ; BTVER2-NEXT:    vmulps %xmm1, %xmm0, %xmm0
628 ; BTVER2-NEXT:    vsubps %xmm0, %xmm3, %xmm0
629 ; BTVER2-NEXT:    vmulps %xmm0, %xmm1, %xmm0
630 ; BTVER2-NEXT:    vaddps %xmm0, %xmm1, %xmm0
631 ; BTVER2-NEXT:    retq
633 ; SANDY-LABEL: v4f32_two_step:
634 ; SANDY:       # %bb.0:
635 ; SANDY-NEXT:    vrcpps %xmm0, %xmm1
636 ; SANDY-NEXT:    vmulps %xmm1, %xmm0, %xmm2
637 ; SANDY-NEXT:    vmovaps {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
638 ; SANDY-NEXT:    vsubps %xmm2, %xmm3, %xmm2
639 ; SANDY-NEXT:    vmulps %xmm2, %xmm1, %xmm2
640 ; SANDY-NEXT:    vaddps %xmm2, %xmm1, %xmm1
641 ; SANDY-NEXT:    vmulps %xmm1, %xmm0, %xmm0
642 ; SANDY-NEXT:    vsubps %xmm0, %xmm3, %xmm0
643 ; SANDY-NEXT:    vmulps %xmm0, %xmm1, %xmm0
644 ; SANDY-NEXT:    vaddps %xmm0, %xmm1, %xmm0
645 ; SANDY-NEXT:    retq
647 ; HASWELL-LABEL: v4f32_two_step:
648 ; HASWELL:       # %bb.0:
649 ; HASWELL-NEXT:    vrcpps %xmm0, %xmm1
650 ; HASWELL-NEXT:    vbroadcastss {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
651 ; HASWELL-NEXT:    vmovaps %xmm1, %xmm3
652 ; HASWELL-NEXT:    vfmsub213ps {{.*#+}} xmm3 = (xmm0 * xmm3) - xmm2
653 ; HASWELL-NEXT:    vfnmadd132ps {{.*#+}} xmm3 = -(xmm3 * xmm1) + xmm1
654 ; HASWELL-NEXT:    vfmsub213ps {{.*#+}} xmm0 = (xmm3 * xmm0) - xmm2
655 ; HASWELL-NEXT:    vfnmadd132ps {{.*#+}} xmm0 = -(xmm0 * xmm3) + xmm3
656 ; HASWELL-NEXT:    retq
658 ; HASWELL-NO-FMA-LABEL: v4f32_two_step:
659 ; HASWELL-NO-FMA:       # %bb.0:
660 ; HASWELL-NO-FMA-NEXT:    vrcpps %xmm0, %xmm1
661 ; HASWELL-NO-FMA-NEXT:    vmulps %xmm1, %xmm0, %xmm2
662 ; HASWELL-NO-FMA-NEXT:    vbroadcastss {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
663 ; HASWELL-NO-FMA-NEXT:    vsubps %xmm2, %xmm3, %xmm2
664 ; HASWELL-NO-FMA-NEXT:    vmulps %xmm2, %xmm1, %xmm2
665 ; HASWELL-NO-FMA-NEXT:    vaddps %xmm2, %xmm1, %xmm1
666 ; HASWELL-NO-FMA-NEXT:    vmulps %xmm1, %xmm0, %xmm0
667 ; HASWELL-NO-FMA-NEXT:    vsubps %xmm0, %xmm3, %xmm0
668 ; HASWELL-NO-FMA-NEXT:    vmulps %xmm0, %xmm1, %xmm0
669 ; HASWELL-NO-FMA-NEXT:    vaddps %xmm0, %xmm1, %xmm0
670 ; HASWELL-NO-FMA-NEXT:    retq
672 ; AVX512-LABEL: v4f32_two_step:
673 ; AVX512:       # %bb.0:
674 ; AVX512-NEXT:    vrcpps %xmm0, %xmm1
675 ; AVX512-NEXT:    vbroadcastss {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
676 ; AVX512-NEXT:    vmovaps %xmm1, %xmm3
677 ; AVX512-NEXT:    vfmsub213ps {{.*#+}} xmm3 = (xmm0 * xmm3) - xmm2
678 ; AVX512-NEXT:    vfnmadd132ps {{.*#+}} xmm3 = -(xmm3 * xmm1) + xmm1
679 ; AVX512-NEXT:    vfmsub213ps {{.*#+}} xmm0 = (xmm3 * xmm0) - xmm2
680 ; AVX512-NEXT:    vfnmadd132ps {{.*#+}} xmm0 = -(xmm0 * xmm3) + xmm3
681 ; AVX512-NEXT:    retq
682   %div = fdiv fast <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>, %x
683   ret <4 x float> %div
686 define <8 x float> @v8f32_no_estimate(<8 x float> %x) #0 {
687 ; SSE-LABEL: v8f32_no_estimate:
688 ; SSE:       # %bb.0:
689 ; SSE-NEXT:    movaps {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
690 ; SSE-NEXT:    movaps %xmm2, %xmm3
691 ; SSE-NEXT:    divps %xmm0, %xmm3
692 ; SSE-NEXT:    divps %xmm1, %xmm2
693 ; SSE-NEXT:    movaps %xmm3, %xmm0
694 ; SSE-NEXT:    movaps %xmm2, %xmm1
695 ; SSE-NEXT:    retq
697 ; AVX-RECIP-LABEL: v8f32_no_estimate:
698 ; AVX-RECIP:       # %bb.0:
699 ; AVX-RECIP-NEXT:    vmovaps {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
700 ; AVX-RECIP-NEXT:    vdivps %ymm0, %ymm1, %ymm0
701 ; AVX-RECIP-NEXT:    retq
703 ; FMA-RECIP-LABEL: v8f32_no_estimate:
704 ; FMA-RECIP:       # %bb.0:
705 ; FMA-RECIP-NEXT:    vmovaps {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
706 ; FMA-RECIP-NEXT:    vdivps %ymm0, %ymm1, %ymm0
707 ; FMA-RECIP-NEXT:    retq
709 ; BDVER2-LABEL: v8f32_no_estimate:
710 ; BDVER2:       # %bb.0:
711 ; BDVER2-NEXT:    vmovaps {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
712 ; BDVER2-NEXT:    vdivps %ymm0, %ymm1, %ymm0
713 ; BDVER2-NEXT:    retq
715 ; BTVER2-LABEL: v8f32_no_estimate:
716 ; BTVER2:       # %bb.0:
717 ; BTVER2-NEXT:    vmovaps {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
718 ; BTVER2-NEXT:    vdivps %ymm0, %ymm1, %ymm0
719 ; BTVER2-NEXT:    retq
721 ; SANDY-LABEL: v8f32_no_estimate:
722 ; SANDY:       # %bb.0:
723 ; SANDY-NEXT:    vmovaps {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
724 ; SANDY-NEXT:    vdivps %ymm0, %ymm1, %ymm0
725 ; SANDY-NEXT:    retq
727 ; HASWELL-LABEL: v8f32_no_estimate:
728 ; HASWELL:       # %bb.0:
729 ; HASWELL-NEXT:    vbroadcastss {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
730 ; HASWELL-NEXT:    vdivps %ymm0, %ymm1, %ymm0
731 ; HASWELL-NEXT:    retq
733 ; HASWELL-NO-FMA-LABEL: v8f32_no_estimate:
734 ; HASWELL-NO-FMA:       # %bb.0:
735 ; HASWELL-NO-FMA-NEXT:    vbroadcastss {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
736 ; HASWELL-NO-FMA-NEXT:    vdivps %ymm0, %ymm1, %ymm0
737 ; HASWELL-NO-FMA-NEXT:    retq
739 ; AVX512-LABEL: v8f32_no_estimate:
740 ; AVX512:       # %bb.0:
741 ; AVX512-NEXT:    vbroadcastss {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
742 ; AVX512-NEXT:    vdivps %ymm0, %ymm1, %ymm0
743 ; AVX512-NEXT:    retq
744   %div = fdiv fast <8 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, %x
745   ret <8 x float> %div
748 define <8 x float> @v8f32_one_step(<8 x float> %x) #1 {
749 ; SSE-LABEL: v8f32_one_step:
750 ; SSE:       # %bb.0:
751 ; SSE-NEXT:    rcpps %xmm0, %xmm4
752 ; SSE-NEXT:    mulps %xmm4, %xmm0
753 ; SSE-NEXT:    movaps {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
754 ; SSE-NEXT:    movaps %xmm2, %xmm3
755 ; SSE-NEXT:    subps %xmm0, %xmm3
756 ; SSE-NEXT:    mulps %xmm4, %xmm3
757 ; SSE-NEXT:    addps %xmm4, %xmm3
758 ; SSE-NEXT:    rcpps %xmm1, %xmm0
759 ; SSE-NEXT:    mulps %xmm0, %xmm1
760 ; SSE-NEXT:    subps %xmm1, %xmm2
761 ; SSE-NEXT:    mulps %xmm0, %xmm2
762 ; SSE-NEXT:    addps %xmm0, %xmm2
763 ; SSE-NEXT:    movaps %xmm3, %xmm0
764 ; SSE-NEXT:    movaps %xmm2, %xmm1
765 ; SSE-NEXT:    retq
767 ; AVX-RECIP-LABEL: v8f32_one_step:
768 ; AVX-RECIP:       # %bb.0:
769 ; AVX-RECIP-NEXT:    vrcpps %ymm0, %ymm1
770 ; AVX-RECIP-NEXT:    vmulps %ymm1, %ymm0, %ymm0
771 ; AVX-RECIP-NEXT:    vmovaps {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
772 ; AVX-RECIP-NEXT:    vsubps %ymm0, %ymm2, %ymm0
773 ; AVX-RECIP-NEXT:    vmulps %ymm0, %ymm1, %ymm0
774 ; AVX-RECIP-NEXT:    vaddps %ymm0, %ymm1, %ymm0
775 ; AVX-RECIP-NEXT:    retq
777 ; FMA-RECIP-LABEL: v8f32_one_step:
778 ; FMA-RECIP:       # %bb.0:
779 ; FMA-RECIP-NEXT:    vrcpps %ymm0, %ymm1
780 ; FMA-RECIP-NEXT:    vfmsub213ps {{.*#+}} ymm0 = (ymm1 * ymm0) - mem
781 ; FMA-RECIP-NEXT:    vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm1) + ymm1
782 ; FMA-RECIP-NEXT:    retq
784 ; BDVER2-LABEL: v8f32_one_step:
785 ; BDVER2:       # %bb.0:
786 ; BDVER2-NEXT:    vrcpps %ymm0, %ymm1
787 ; BDVER2-NEXT:    vfmsubps {{.*#+}} ymm0 = (ymm0 * ymm1) - mem
788 ; BDVER2-NEXT:    vfnmaddps {{.*#+}} ymm0 = -(ymm1 * ymm0) + ymm1
789 ; BDVER2-NEXT:    retq
791 ; BTVER2-LABEL: v8f32_one_step:
792 ; BTVER2:       # %bb.0:
793 ; BTVER2-NEXT:    vmovaps {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
794 ; BTVER2-NEXT:    vrcpps %ymm0, %ymm1
795 ; BTVER2-NEXT:    vmulps %ymm1, %ymm0, %ymm0
796 ; BTVER2-NEXT:    vsubps %ymm0, %ymm2, %ymm0
797 ; BTVER2-NEXT:    vmulps %ymm0, %ymm1, %ymm0
798 ; BTVER2-NEXT:    vaddps %ymm0, %ymm1, %ymm0
799 ; BTVER2-NEXT:    retq
801 ; SANDY-LABEL: v8f32_one_step:
802 ; SANDY:       # %bb.0:
803 ; SANDY-NEXT:    vrcpps %ymm0, %ymm1
804 ; SANDY-NEXT:    vmulps %ymm1, %ymm0, %ymm0
805 ; SANDY-NEXT:    vmovaps {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
806 ; SANDY-NEXT:    vsubps %ymm0, %ymm2, %ymm0
807 ; SANDY-NEXT:    vmulps %ymm0, %ymm1, %ymm0
808 ; SANDY-NEXT:    vaddps %ymm0, %ymm1, %ymm0
809 ; SANDY-NEXT:    retq
811 ; HASWELL-LABEL: v8f32_one_step:
812 ; HASWELL:       # %bb.0:
813 ; HASWELL-NEXT:    vrcpps %ymm0, %ymm1
814 ; HASWELL-NEXT:    vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
815 ; HASWELL-NEXT:    vfmsub213ps {{.*#+}} ymm0 = (ymm1 * ymm0) - ymm2
816 ; HASWELL-NEXT:    vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm1) + ymm1
817 ; HASWELL-NEXT:    retq
819 ; HASWELL-NO-FMA-LABEL: v8f32_one_step:
820 ; HASWELL-NO-FMA:       # %bb.0:
821 ; HASWELL-NO-FMA-NEXT:    vrcpps %ymm0, %ymm1
822 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm1, %ymm0, %ymm0
823 ; HASWELL-NO-FMA-NEXT:    vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
824 ; HASWELL-NO-FMA-NEXT:    vsubps %ymm0, %ymm2, %ymm0
825 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm0, %ymm1, %ymm0
826 ; HASWELL-NO-FMA-NEXT:    vaddps %ymm0, %ymm1, %ymm0
827 ; HASWELL-NO-FMA-NEXT:    retq
829 ; KNL-LABEL: v8f32_one_step:
830 ; KNL:       # %bb.0:
831 ; KNL-NEXT:    vrcpps %ymm0, %ymm1
832 ; KNL-NEXT:    vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
833 ; KNL-NEXT:    vfmsub213ps {{.*#+}} ymm0 = (ymm1 * ymm0) - ymm2
834 ; KNL-NEXT:    vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm1) + ymm1
835 ; KNL-NEXT:    retq
837 ; SKX-LABEL: v8f32_one_step:
838 ; SKX:       # %bb.0:
839 ; SKX-NEXT:    vrcpps %ymm0, %ymm1
840 ; SKX-NEXT:    vfmsub213ps {{.*#+}} ymm0 = (ymm1 * ymm0) - mem
841 ; SKX-NEXT:    vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm1) + ymm1
842 ; SKX-NEXT:    retq
843   %div = fdiv fast <8 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, %x
844   ret <8 x float> %div
847 define <8 x float> @v8f32_two_step(<8 x float> %x) #2 {
848 ; SSE-LABEL: v8f32_two_step:
849 ; SSE:       # %bb.0:
850 ; SSE-NEXT:    movaps %xmm1, %xmm2
851 ; SSE-NEXT:    rcpps %xmm0, %xmm3
852 ; SSE-NEXT:    movaps %xmm0, %xmm4
853 ; SSE-NEXT:    mulps %xmm3, %xmm4
854 ; SSE-NEXT:    movaps {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
855 ; SSE-NEXT:    movaps %xmm1, %xmm5
856 ; SSE-NEXT:    subps %xmm4, %xmm5
857 ; SSE-NEXT:    mulps %xmm3, %xmm5
858 ; SSE-NEXT:    addps %xmm3, %xmm5
859 ; SSE-NEXT:    mulps %xmm5, %xmm0
860 ; SSE-NEXT:    movaps %xmm1, %xmm3
861 ; SSE-NEXT:    subps %xmm0, %xmm3
862 ; SSE-NEXT:    mulps %xmm5, %xmm3
863 ; SSE-NEXT:    addps %xmm5, %xmm3
864 ; SSE-NEXT:    rcpps %xmm2, %xmm0
865 ; SSE-NEXT:    movaps %xmm2, %xmm4
866 ; SSE-NEXT:    mulps %xmm0, %xmm4
867 ; SSE-NEXT:    movaps %xmm1, %xmm5
868 ; SSE-NEXT:    subps %xmm4, %xmm5
869 ; SSE-NEXT:    mulps %xmm0, %xmm5
870 ; SSE-NEXT:    addps %xmm0, %xmm5
871 ; SSE-NEXT:    mulps %xmm5, %xmm2
872 ; SSE-NEXT:    subps %xmm2, %xmm1
873 ; SSE-NEXT:    mulps %xmm5, %xmm1
874 ; SSE-NEXT:    addps %xmm5, %xmm1
875 ; SSE-NEXT:    movaps %xmm3, %xmm0
876 ; SSE-NEXT:    retq
878 ; AVX-RECIP-LABEL: v8f32_two_step:
879 ; AVX-RECIP:       # %bb.0:
880 ; AVX-RECIP-NEXT:    vrcpps %ymm0, %ymm1
881 ; AVX-RECIP-NEXT:    vmulps %ymm1, %ymm0, %ymm2
882 ; AVX-RECIP-NEXT:    vmovaps {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
883 ; AVX-RECIP-NEXT:    vsubps %ymm2, %ymm3, %ymm2
884 ; AVX-RECIP-NEXT:    vmulps %ymm2, %ymm1, %ymm2
885 ; AVX-RECIP-NEXT:    vaddps %ymm2, %ymm1, %ymm1
886 ; AVX-RECIP-NEXT:    vmulps %ymm1, %ymm0, %ymm0
887 ; AVX-RECIP-NEXT:    vsubps %ymm0, %ymm3, %ymm0
888 ; AVX-RECIP-NEXT:    vmulps %ymm0, %ymm1, %ymm0
889 ; AVX-RECIP-NEXT:    vaddps %ymm0, %ymm1, %ymm0
890 ; AVX-RECIP-NEXT:    retq
892 ; FMA-RECIP-LABEL: v8f32_two_step:
893 ; FMA-RECIP:       # %bb.0:
894 ; FMA-RECIP-NEXT:    vrcpps %ymm0, %ymm1
895 ; FMA-RECIP-NEXT:    vmovaps {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
896 ; FMA-RECIP-NEXT:    vmovaps %ymm1, %ymm3
897 ; FMA-RECIP-NEXT:    vfmsub213ps {{.*#+}} ymm3 = (ymm0 * ymm3) - ymm2
898 ; FMA-RECIP-NEXT:    vfnmadd132ps {{.*#+}} ymm3 = -(ymm3 * ymm1) + ymm1
899 ; FMA-RECIP-NEXT:    vfmsub213ps {{.*#+}} ymm0 = (ymm3 * ymm0) - ymm2
900 ; FMA-RECIP-NEXT:    vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm3) + ymm3
901 ; FMA-RECIP-NEXT:    retq
903 ; BDVER2-LABEL: v8f32_two_step:
904 ; BDVER2:       # %bb.0:
905 ; BDVER2-NEXT:    vrcpps %ymm0, %ymm1
906 ; BDVER2-NEXT:    vmovaps {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
907 ; BDVER2-NEXT:    vfmsubps {{.*#+}} ymm3 = (ymm0 * ymm1) - ymm2
908 ; BDVER2-NEXT:    vfnmaddps {{.*#+}} ymm1 = -(ymm1 * ymm3) + ymm1
909 ; BDVER2-NEXT:    vfmsubps {{.*#+}} ymm0 = (ymm0 * ymm1) - ymm2
910 ; BDVER2-NEXT:    vfnmaddps {{.*#+}} ymm0 = -(ymm1 * ymm0) + ymm1
911 ; BDVER2-NEXT:    retq
913 ; BTVER2-LABEL: v8f32_two_step:
914 ; BTVER2:       # %bb.0:
915 ; BTVER2-NEXT:    vmovaps {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
916 ; BTVER2-NEXT:    vrcpps %ymm0, %ymm1
917 ; BTVER2-NEXT:    vmulps %ymm1, %ymm0, %ymm2
918 ; BTVER2-NEXT:    vsubps %ymm2, %ymm3, %ymm2
919 ; BTVER2-NEXT:    vmulps %ymm2, %ymm1, %ymm2
920 ; BTVER2-NEXT:    vaddps %ymm2, %ymm1, %ymm1
921 ; BTVER2-NEXT:    vmulps %ymm1, %ymm0, %ymm0
922 ; BTVER2-NEXT:    vsubps %ymm0, %ymm3, %ymm0
923 ; BTVER2-NEXT:    vmulps %ymm0, %ymm1, %ymm0
924 ; BTVER2-NEXT:    vaddps %ymm0, %ymm1, %ymm0
925 ; BTVER2-NEXT:    retq
927 ; SANDY-LABEL: v8f32_two_step:
928 ; SANDY:       # %bb.0:
929 ; SANDY-NEXT:    vrcpps %ymm0, %ymm1
930 ; SANDY-NEXT:    vmulps %ymm1, %ymm0, %ymm2
931 ; SANDY-NEXT:    vmovaps {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
932 ; SANDY-NEXT:    vsubps %ymm2, %ymm3, %ymm2
933 ; SANDY-NEXT:    vmulps %ymm2, %ymm1, %ymm2
934 ; SANDY-NEXT:    vaddps %ymm2, %ymm1, %ymm1
935 ; SANDY-NEXT:    vmulps %ymm1, %ymm0, %ymm0
936 ; SANDY-NEXT:    vsubps %ymm0, %ymm3, %ymm0
937 ; SANDY-NEXT:    vmulps %ymm0, %ymm1, %ymm0
938 ; SANDY-NEXT:    vaddps %ymm0, %ymm1, %ymm0
939 ; SANDY-NEXT:    retq
941 ; HASWELL-LABEL: v8f32_two_step:
942 ; HASWELL:       # %bb.0:
943 ; HASWELL-NEXT:    vrcpps %ymm0, %ymm1
944 ; HASWELL-NEXT:    vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
945 ; HASWELL-NEXT:    vmovaps %ymm1, %ymm3
946 ; HASWELL-NEXT:    vfmsub213ps {{.*#+}} ymm3 = (ymm0 * ymm3) - ymm2
947 ; HASWELL-NEXT:    vfnmadd132ps {{.*#+}} ymm3 = -(ymm3 * ymm1) + ymm1
948 ; HASWELL-NEXT:    vfmsub213ps {{.*#+}} ymm0 = (ymm3 * ymm0) - ymm2
949 ; HASWELL-NEXT:    vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm3) + ymm3
950 ; HASWELL-NEXT:    retq
952 ; HASWELL-NO-FMA-LABEL: v8f32_two_step:
953 ; HASWELL-NO-FMA:       # %bb.0:
954 ; HASWELL-NO-FMA-NEXT:    vrcpps %ymm0, %ymm1
955 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm1, %ymm0, %ymm2
956 ; HASWELL-NO-FMA-NEXT:    vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
957 ; HASWELL-NO-FMA-NEXT:    vsubps %ymm2, %ymm3, %ymm2
958 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm2, %ymm1, %ymm2
959 ; HASWELL-NO-FMA-NEXT:    vaddps %ymm2, %ymm1, %ymm1
960 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm1, %ymm0, %ymm0
961 ; HASWELL-NO-FMA-NEXT:    vsubps %ymm0, %ymm3, %ymm0
962 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm0, %ymm1, %ymm0
963 ; HASWELL-NO-FMA-NEXT:    vaddps %ymm0, %ymm1, %ymm0
964 ; HASWELL-NO-FMA-NEXT:    retq
966 ; AVX512-LABEL: v8f32_two_step:
967 ; AVX512:       # %bb.0:
968 ; AVX512-NEXT:    vrcpps %ymm0, %ymm1
969 ; AVX512-NEXT:    vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
970 ; AVX512-NEXT:    vmovaps %ymm1, %ymm3
971 ; AVX512-NEXT:    vfmsub213ps {{.*#+}} ymm3 = (ymm0 * ymm3) - ymm2
972 ; AVX512-NEXT:    vfnmadd132ps {{.*#+}} ymm3 = -(ymm3 * ymm1) + ymm1
973 ; AVX512-NEXT:    vfmsub213ps {{.*#+}} ymm0 = (ymm3 * ymm0) - ymm2
974 ; AVX512-NEXT:    vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm3) + ymm3
975 ; AVX512-NEXT:    retq
976   %div = fdiv fast <8 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, %x
977   ret <8 x float> %div
980 define <16 x float> @v16f32_no_estimate(<16 x float> %x) #0 {
981 ; SSE-LABEL: v16f32_no_estimate:
982 ; SSE:       # %bb.0:
983 ; SSE-NEXT:    movaps {{.*#+}} xmm4 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
984 ; SSE-NEXT:    movaps %xmm4, %xmm5
985 ; SSE-NEXT:    divps %xmm0, %xmm5
986 ; SSE-NEXT:    movaps %xmm4, %xmm6
987 ; SSE-NEXT:    divps %xmm1, %xmm6
988 ; SSE-NEXT:    movaps %xmm4, %xmm7
989 ; SSE-NEXT:    divps %xmm2, %xmm7
990 ; SSE-NEXT:    divps %xmm3, %xmm4
991 ; SSE-NEXT:    movaps %xmm5, %xmm0
992 ; SSE-NEXT:    movaps %xmm6, %xmm1
993 ; SSE-NEXT:    movaps %xmm7, %xmm2
994 ; SSE-NEXT:    movaps %xmm4, %xmm3
995 ; SSE-NEXT:    retq
997 ; AVX-RECIP-LABEL: v16f32_no_estimate:
998 ; AVX-RECIP:       # %bb.0:
999 ; AVX-RECIP-NEXT:    vmovaps {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1000 ; AVX-RECIP-NEXT:    vdivps %ymm0, %ymm2, %ymm0
1001 ; AVX-RECIP-NEXT:    vdivps %ymm1, %ymm2, %ymm1
1002 ; AVX-RECIP-NEXT:    retq
1004 ; FMA-RECIP-LABEL: v16f32_no_estimate:
1005 ; FMA-RECIP:       # %bb.0:
1006 ; FMA-RECIP-NEXT:    vmovaps {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1007 ; FMA-RECIP-NEXT:    vdivps %ymm0, %ymm2, %ymm0
1008 ; FMA-RECIP-NEXT:    vdivps %ymm1, %ymm2, %ymm1
1009 ; FMA-RECIP-NEXT:    retq
1011 ; BDVER2-LABEL: v16f32_no_estimate:
1012 ; BDVER2:       # %bb.0:
1013 ; BDVER2-NEXT:    vmovaps {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1014 ; BDVER2-NEXT:    vdivps %ymm0, %ymm2, %ymm0
1015 ; BDVER2-NEXT:    vdivps %ymm1, %ymm2, %ymm1
1016 ; BDVER2-NEXT:    retq
1018 ; BTVER2-LABEL: v16f32_no_estimate:
1019 ; BTVER2:       # %bb.0:
1020 ; BTVER2-NEXT:    vmovaps {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1021 ; BTVER2-NEXT:    vdivps %ymm0, %ymm2, %ymm0
1022 ; BTVER2-NEXT:    vdivps %ymm1, %ymm2, %ymm1
1023 ; BTVER2-NEXT:    retq
1025 ; SANDY-LABEL: v16f32_no_estimate:
1026 ; SANDY:       # %bb.0:
1027 ; SANDY-NEXT:    vmovaps {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1028 ; SANDY-NEXT:    vdivps %ymm0, %ymm2, %ymm0
1029 ; SANDY-NEXT:    vdivps %ymm1, %ymm2, %ymm1
1030 ; SANDY-NEXT:    retq
1032 ; HASWELL-LABEL: v16f32_no_estimate:
1033 ; HASWELL:       # %bb.0:
1034 ; HASWELL-NEXT:    vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1035 ; HASWELL-NEXT:    vdivps %ymm0, %ymm2, %ymm0
1036 ; HASWELL-NEXT:    vdivps %ymm1, %ymm2, %ymm1
1037 ; HASWELL-NEXT:    retq
1039 ; HASWELL-NO-FMA-LABEL: v16f32_no_estimate:
1040 ; HASWELL-NO-FMA:       # %bb.0:
1041 ; HASWELL-NO-FMA-NEXT:    vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1042 ; HASWELL-NO-FMA-NEXT:    vdivps %ymm0, %ymm2, %ymm0
1043 ; HASWELL-NO-FMA-NEXT:    vdivps %ymm1, %ymm2, %ymm1
1044 ; HASWELL-NO-FMA-NEXT:    retq
1046 ; AVX512-LABEL: v16f32_no_estimate:
1047 ; AVX512:       # %bb.0:
1048 ; AVX512-NEXT:    vbroadcastss {{.*#+}} zmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1049 ; AVX512-NEXT:    vdivps %zmm0, %zmm1, %zmm0
1050 ; AVX512-NEXT:    retq
1051   %div = fdiv fast <16 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, %x
1052   ret <16 x float> %div
1055 define <16 x float> @v16f32_one_step(<16 x float> %x) #1 {
1056 ; SSE-LABEL: v16f32_one_step:
1057 ; SSE:       # %bb.0:
1058 ; SSE-NEXT:    movaps %xmm3, %xmm4
1059 ; SSE-NEXT:    movaps %xmm0, %xmm5
1060 ; SSE-NEXT:    rcpps %xmm0, %xmm6
1061 ; SSE-NEXT:    mulps %xmm6, %xmm5
1062 ; SSE-NEXT:    movaps {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1063 ; SSE-NEXT:    movaps %xmm3, %xmm0
1064 ; SSE-NEXT:    subps %xmm5, %xmm0
1065 ; SSE-NEXT:    mulps %xmm6, %xmm0
1066 ; SSE-NEXT:    addps %xmm6, %xmm0
1067 ; SSE-NEXT:    rcpps %xmm1, %xmm6
1068 ; SSE-NEXT:    mulps %xmm6, %xmm1
1069 ; SSE-NEXT:    movaps %xmm3, %xmm5
1070 ; SSE-NEXT:    subps %xmm1, %xmm5
1071 ; SSE-NEXT:    mulps %xmm6, %xmm5
1072 ; SSE-NEXT:    addps %xmm6, %xmm5
1073 ; SSE-NEXT:    rcpps %xmm2, %xmm1
1074 ; SSE-NEXT:    mulps %xmm1, %xmm2
1075 ; SSE-NEXT:    movaps %xmm3, %xmm6
1076 ; SSE-NEXT:    subps %xmm2, %xmm6
1077 ; SSE-NEXT:    mulps %xmm1, %xmm6
1078 ; SSE-NEXT:    addps %xmm1, %xmm6
1079 ; SSE-NEXT:    rcpps %xmm4, %xmm1
1080 ; SSE-NEXT:    mulps %xmm1, %xmm4
1081 ; SSE-NEXT:    subps %xmm4, %xmm3
1082 ; SSE-NEXT:    mulps %xmm1, %xmm3
1083 ; SSE-NEXT:    addps %xmm1, %xmm3
1084 ; SSE-NEXT:    movaps %xmm5, %xmm1
1085 ; SSE-NEXT:    movaps %xmm6, %xmm2
1086 ; SSE-NEXT:    retq
1088 ; AVX-RECIP-LABEL: v16f32_one_step:
1089 ; AVX-RECIP:       # %bb.0:
1090 ; AVX-RECIP-NEXT:    vrcpps %ymm0, %ymm2
1091 ; AVX-RECIP-NEXT:    vmulps %ymm2, %ymm0, %ymm0
1092 ; AVX-RECIP-NEXT:    vmovaps {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1093 ; AVX-RECIP-NEXT:    vsubps %ymm0, %ymm3, %ymm0
1094 ; AVX-RECIP-NEXT:    vmulps %ymm0, %ymm2, %ymm0
1095 ; AVX-RECIP-NEXT:    vaddps %ymm0, %ymm2, %ymm0
1096 ; AVX-RECIP-NEXT:    vrcpps %ymm1, %ymm2
1097 ; AVX-RECIP-NEXT:    vmulps %ymm2, %ymm1, %ymm1
1098 ; AVX-RECIP-NEXT:    vsubps %ymm1, %ymm3, %ymm1
1099 ; AVX-RECIP-NEXT:    vmulps %ymm1, %ymm2, %ymm1
1100 ; AVX-RECIP-NEXT:    vaddps %ymm1, %ymm2, %ymm1
1101 ; AVX-RECIP-NEXT:    retq
1103 ; FMA-RECIP-LABEL: v16f32_one_step:
1104 ; FMA-RECIP:       # %bb.0:
1105 ; FMA-RECIP-NEXT:    vrcpps %ymm0, %ymm2
1106 ; FMA-RECIP-NEXT:    vmovaps {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1107 ; FMA-RECIP-NEXT:    vfmsub213ps {{.*#+}} ymm0 = (ymm2 * ymm0) - ymm3
1108 ; FMA-RECIP-NEXT:    vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm2) + ymm2
1109 ; FMA-RECIP-NEXT:    vrcpps %ymm1, %ymm2
1110 ; FMA-RECIP-NEXT:    vfmsub213ps {{.*#+}} ymm1 = (ymm2 * ymm1) - ymm3
1111 ; FMA-RECIP-NEXT:    vfnmadd132ps {{.*#+}} ymm1 = -(ymm1 * ymm2) + ymm2
1112 ; FMA-RECIP-NEXT:    retq
1114 ; BDVER2-LABEL: v16f32_one_step:
1115 ; BDVER2:       # %bb.0:
1116 ; BDVER2-NEXT:    vrcpps %ymm0, %ymm2
1117 ; BDVER2-NEXT:    vmovaps {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1118 ; BDVER2-NEXT:    vrcpps %ymm1, %ymm4
1119 ; BDVER2-NEXT:    vfmsubps {{.*#+}} ymm0 = (ymm0 * ymm2) - ymm3
1120 ; BDVER2-NEXT:    vfmsubps {{.*#+}} ymm1 = (ymm1 * ymm4) - ymm3
1121 ; BDVER2-NEXT:    vfnmaddps {{.*#+}} ymm0 = -(ymm2 * ymm0) + ymm2
1122 ; BDVER2-NEXT:    vfnmaddps {{.*#+}} ymm1 = -(ymm4 * ymm1) + ymm4
1123 ; BDVER2-NEXT:    retq
1125 ; BTVER2-LABEL: v16f32_one_step:
1126 ; BTVER2:       # %bb.0:
1127 ; BTVER2-NEXT:    vmovaps {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1128 ; BTVER2-NEXT:    vrcpps %ymm0, %ymm2
1129 ; BTVER2-NEXT:    vrcpps %ymm1, %ymm4
1130 ; BTVER2-NEXT:    vmulps %ymm2, %ymm0, %ymm0
1131 ; BTVER2-NEXT:    vmulps %ymm4, %ymm1, %ymm1
1132 ; BTVER2-NEXT:    vsubps %ymm0, %ymm3, %ymm0
1133 ; BTVER2-NEXT:    vsubps %ymm1, %ymm3, %ymm1
1134 ; BTVER2-NEXT:    vmulps %ymm0, %ymm2, %ymm0
1135 ; BTVER2-NEXT:    vmulps %ymm1, %ymm4, %ymm1
1136 ; BTVER2-NEXT:    vaddps %ymm0, %ymm2, %ymm0
1137 ; BTVER2-NEXT:    vaddps %ymm1, %ymm4, %ymm1
1138 ; BTVER2-NEXT:    retq
1140 ; SANDY-LABEL: v16f32_one_step:
1141 ; SANDY:       # %bb.0:
1142 ; SANDY-NEXT:    vrcpps %ymm0, %ymm2
1143 ; SANDY-NEXT:    vmulps %ymm2, %ymm0, %ymm0
1144 ; SANDY-NEXT:    vmovaps {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1145 ; SANDY-NEXT:    vsubps %ymm0, %ymm3, %ymm0
1146 ; SANDY-NEXT:    vrcpps %ymm1, %ymm4
1147 ; SANDY-NEXT:    vmulps %ymm0, %ymm2, %ymm0
1148 ; SANDY-NEXT:    vaddps %ymm0, %ymm2, %ymm0
1149 ; SANDY-NEXT:    vmulps %ymm4, %ymm1, %ymm1
1150 ; SANDY-NEXT:    vsubps %ymm1, %ymm3, %ymm1
1151 ; SANDY-NEXT:    vmulps %ymm1, %ymm4, %ymm1
1152 ; SANDY-NEXT:    vaddps %ymm1, %ymm4, %ymm1
1153 ; SANDY-NEXT:    retq
1155 ; HASWELL-LABEL: v16f32_one_step:
1156 ; HASWELL:       # %bb.0:
1157 ; HASWELL-NEXT:    vrcpps %ymm0, %ymm2
1158 ; HASWELL-NEXT:    vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1159 ; HASWELL-NEXT:    vrcpps %ymm1, %ymm4
1160 ; HASWELL-NEXT:    vfmsub213ps {{.*#+}} ymm0 = (ymm2 * ymm0) - ymm3
1161 ; HASWELL-NEXT:    vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm2) + ymm2
1162 ; HASWELL-NEXT:    vfmsub213ps {{.*#+}} ymm1 = (ymm4 * ymm1) - ymm3
1163 ; HASWELL-NEXT:    vfnmadd132ps {{.*#+}} ymm1 = -(ymm1 * ymm4) + ymm4
1164 ; HASWELL-NEXT:    retq
1166 ; HASWELL-NO-FMA-LABEL: v16f32_one_step:
1167 ; HASWELL-NO-FMA:       # %bb.0:
1168 ; HASWELL-NO-FMA-NEXT:    vrcpps %ymm0, %ymm2
1169 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm2, %ymm0, %ymm0
1170 ; HASWELL-NO-FMA-NEXT:    vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1171 ; HASWELL-NO-FMA-NEXT:    vsubps %ymm0, %ymm3, %ymm0
1172 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm0, %ymm2, %ymm0
1173 ; HASWELL-NO-FMA-NEXT:    vaddps %ymm0, %ymm2, %ymm0
1174 ; HASWELL-NO-FMA-NEXT:    vrcpps %ymm1, %ymm2
1175 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm2, %ymm1, %ymm1
1176 ; HASWELL-NO-FMA-NEXT:    vsubps %ymm1, %ymm3, %ymm1
1177 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm1, %ymm2, %ymm1
1178 ; HASWELL-NO-FMA-NEXT:    vaddps %ymm1, %ymm2, %ymm1
1179 ; HASWELL-NO-FMA-NEXT:    retq
1181 ; AVX512-LABEL: v16f32_one_step:
1182 ; AVX512:       # %bb.0:
1183 ; AVX512-NEXT:    vrcp14ps %zmm0, %zmm1
1184 ; AVX512-NEXT:    vfmsub213ps {{.*#+}} zmm0 = (zmm1 * zmm0) - mem
1185 ; AVX512-NEXT:    vfnmadd132ps {{.*#+}} zmm0 = -(zmm0 * zmm1) + zmm1
1186 ; AVX512-NEXT:    retq
1187   %div = fdiv fast <16 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, %x
1188   ret <16 x float> %div
1191 define <16 x float> @v16f32_two_step(<16 x float> %x) #2 {
1192 ; SSE-LABEL: v16f32_two_step:
1193 ; SSE:       # %bb.0:
1194 ; SSE-NEXT:    movaps %xmm3, %xmm4
1195 ; SSE-NEXT:    movaps %xmm1, %xmm5
1196 ; SSE-NEXT:    movaps %xmm0, %xmm1
1197 ; SSE-NEXT:    rcpps %xmm0, %xmm0
1198 ; SSE-NEXT:    movaps %xmm1, %xmm6
1199 ; SSE-NEXT:    mulps %xmm0, %xmm6
1200 ; SSE-NEXT:    movaps {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1201 ; SSE-NEXT:    movaps %xmm3, %xmm7
1202 ; SSE-NEXT:    subps %xmm6, %xmm7
1203 ; SSE-NEXT:    mulps %xmm0, %xmm7
1204 ; SSE-NEXT:    addps %xmm0, %xmm7
1205 ; SSE-NEXT:    mulps %xmm7, %xmm1
1206 ; SSE-NEXT:    movaps %xmm3, %xmm0
1207 ; SSE-NEXT:    subps %xmm1, %xmm0
1208 ; SSE-NEXT:    mulps %xmm7, %xmm0
1209 ; SSE-NEXT:    addps %xmm7, %xmm0
1210 ; SSE-NEXT:    rcpps %xmm5, %xmm1
1211 ; SSE-NEXT:    movaps %xmm5, %xmm6
1212 ; SSE-NEXT:    mulps %xmm1, %xmm6
1213 ; SSE-NEXT:    movaps %xmm3, %xmm7
1214 ; SSE-NEXT:    subps %xmm6, %xmm7
1215 ; SSE-NEXT:    mulps %xmm1, %xmm7
1216 ; SSE-NEXT:    addps %xmm1, %xmm7
1217 ; SSE-NEXT:    mulps %xmm7, %xmm5
1218 ; SSE-NEXT:    movaps %xmm3, %xmm1
1219 ; SSE-NEXT:    subps %xmm5, %xmm1
1220 ; SSE-NEXT:    mulps %xmm7, %xmm1
1221 ; SSE-NEXT:    addps %xmm7, %xmm1
1222 ; SSE-NEXT:    rcpps %xmm2, %xmm5
1223 ; SSE-NEXT:    movaps %xmm2, %xmm6
1224 ; SSE-NEXT:    mulps %xmm5, %xmm6
1225 ; SSE-NEXT:    movaps %xmm3, %xmm7
1226 ; SSE-NEXT:    subps %xmm6, %xmm7
1227 ; SSE-NEXT:    mulps %xmm5, %xmm7
1228 ; SSE-NEXT:    addps %xmm5, %xmm7
1229 ; SSE-NEXT:    mulps %xmm7, %xmm2
1230 ; SSE-NEXT:    movaps %xmm3, %xmm5
1231 ; SSE-NEXT:    subps %xmm2, %xmm5
1232 ; SSE-NEXT:    mulps %xmm7, %xmm5
1233 ; SSE-NEXT:    addps %xmm7, %xmm5
1234 ; SSE-NEXT:    rcpps %xmm4, %xmm2
1235 ; SSE-NEXT:    movaps %xmm4, %xmm6
1236 ; SSE-NEXT:    mulps %xmm2, %xmm6
1237 ; SSE-NEXT:    movaps %xmm3, %xmm7
1238 ; SSE-NEXT:    subps %xmm6, %xmm7
1239 ; SSE-NEXT:    mulps %xmm2, %xmm7
1240 ; SSE-NEXT:    addps %xmm2, %xmm7
1241 ; SSE-NEXT:    mulps %xmm7, %xmm4
1242 ; SSE-NEXT:    subps %xmm4, %xmm3
1243 ; SSE-NEXT:    mulps %xmm7, %xmm3
1244 ; SSE-NEXT:    addps %xmm7, %xmm3
1245 ; SSE-NEXT:    movaps %xmm5, %xmm2
1246 ; SSE-NEXT:    retq
1248 ; AVX-RECIP-LABEL: v16f32_two_step:
1249 ; AVX-RECIP:       # %bb.0:
1250 ; AVX-RECIP-NEXT:    vrcpps %ymm0, %ymm2
1251 ; AVX-RECIP-NEXT:    vmulps %ymm2, %ymm0, %ymm3
1252 ; AVX-RECIP-NEXT:    vmovaps {{.*#+}} ymm4 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1253 ; AVX-RECIP-NEXT:    vsubps %ymm3, %ymm4, %ymm3
1254 ; AVX-RECIP-NEXT:    vmulps %ymm3, %ymm2, %ymm3
1255 ; AVX-RECIP-NEXT:    vaddps %ymm3, %ymm2, %ymm2
1256 ; AVX-RECIP-NEXT:    vmulps %ymm2, %ymm0, %ymm0
1257 ; AVX-RECIP-NEXT:    vsubps %ymm0, %ymm4, %ymm0
1258 ; AVX-RECIP-NEXT:    vmulps %ymm0, %ymm2, %ymm0
1259 ; AVX-RECIP-NEXT:    vaddps %ymm0, %ymm2, %ymm0
1260 ; AVX-RECIP-NEXT:    vrcpps %ymm1, %ymm2
1261 ; AVX-RECIP-NEXT:    vmulps %ymm2, %ymm1, %ymm3
1262 ; AVX-RECIP-NEXT:    vsubps %ymm3, %ymm4, %ymm3
1263 ; AVX-RECIP-NEXT:    vmulps %ymm3, %ymm2, %ymm3
1264 ; AVX-RECIP-NEXT:    vaddps %ymm3, %ymm2, %ymm2
1265 ; AVX-RECIP-NEXT:    vmulps %ymm2, %ymm1, %ymm1
1266 ; AVX-RECIP-NEXT:    vsubps %ymm1, %ymm4, %ymm1
1267 ; AVX-RECIP-NEXT:    vmulps %ymm1, %ymm2, %ymm1
1268 ; AVX-RECIP-NEXT:    vaddps %ymm1, %ymm2, %ymm1
1269 ; AVX-RECIP-NEXT:    retq
1271 ; FMA-RECIP-LABEL: v16f32_two_step:
1272 ; FMA-RECIP:       # %bb.0:
1273 ; FMA-RECIP-NEXT:    vrcpps %ymm0, %ymm2
1274 ; FMA-RECIP-NEXT:    vmovaps {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1275 ; FMA-RECIP-NEXT:    vmovaps %ymm2, %ymm4
1276 ; FMA-RECIP-NEXT:    vfmsub213ps {{.*#+}} ymm4 = (ymm0 * ymm4) - ymm3
1277 ; FMA-RECIP-NEXT:    vfnmadd132ps {{.*#+}} ymm4 = -(ymm4 * ymm2) + ymm2
1278 ; FMA-RECIP-NEXT:    vfmsub213ps {{.*#+}} ymm0 = (ymm4 * ymm0) - ymm3
1279 ; FMA-RECIP-NEXT:    vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm4) + ymm4
1280 ; FMA-RECIP-NEXT:    vrcpps %ymm1, %ymm2
1281 ; FMA-RECIP-NEXT:    vmovaps %ymm2, %ymm4
1282 ; FMA-RECIP-NEXT:    vfmsub213ps {{.*#+}} ymm4 = (ymm1 * ymm4) - ymm3
1283 ; FMA-RECIP-NEXT:    vfnmadd132ps {{.*#+}} ymm4 = -(ymm4 * ymm2) + ymm2
1284 ; FMA-RECIP-NEXT:    vfmsub213ps {{.*#+}} ymm1 = (ymm4 * ymm1) - ymm3
1285 ; FMA-RECIP-NEXT:    vfnmadd132ps {{.*#+}} ymm1 = -(ymm1 * ymm4) + ymm4
1286 ; FMA-RECIP-NEXT:    retq
1288 ; BDVER2-LABEL: v16f32_two_step:
1289 ; BDVER2:       # %bb.0:
1290 ; BDVER2-NEXT:    vrcpps %ymm0, %ymm2
1291 ; BDVER2-NEXT:    vmovaps {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1292 ; BDVER2-NEXT:    vfmsubps {{.*#+}} ymm4 = (ymm0 * ymm2) - ymm3
1293 ; BDVER2-NEXT:    vfnmaddps {{.*#+}} ymm2 = -(ymm2 * ymm4) + ymm2
1294 ; BDVER2-NEXT:    vfmsubps {{.*#+}} ymm0 = (ymm0 * ymm2) - ymm3
1295 ; BDVER2-NEXT:    vfnmaddps {{.*#+}} ymm0 = -(ymm2 * ymm0) + ymm2
1296 ; BDVER2-NEXT:    vrcpps %ymm1, %ymm2
1297 ; BDVER2-NEXT:    vfmsubps {{.*#+}} ymm4 = (ymm1 * ymm2) - ymm3
1298 ; BDVER2-NEXT:    vfnmaddps {{.*#+}} ymm2 = -(ymm2 * ymm4) + ymm2
1299 ; BDVER2-NEXT:    vfmsubps {{.*#+}} ymm1 = (ymm1 * ymm2) - ymm3
1300 ; BDVER2-NEXT:    vfnmaddps {{.*#+}} ymm1 = -(ymm2 * ymm1) + ymm2
1301 ; BDVER2-NEXT:    retq
1303 ; BTVER2-LABEL: v16f32_two_step:
1304 ; BTVER2:       # %bb.0:
1305 ; BTVER2-NEXT:    vmovaps {{.*#+}} ymm4 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1306 ; BTVER2-NEXT:    vrcpps %ymm0, %ymm2
1307 ; BTVER2-NEXT:    vmulps %ymm2, %ymm0, %ymm3
1308 ; BTVER2-NEXT:    vsubps %ymm3, %ymm4, %ymm3
1309 ; BTVER2-NEXT:    vmulps %ymm3, %ymm2, %ymm3
1310 ; BTVER2-NEXT:    vaddps %ymm3, %ymm2, %ymm2
1311 ; BTVER2-NEXT:    vmulps %ymm2, %ymm0, %ymm0
1312 ; BTVER2-NEXT:    vsubps %ymm0, %ymm4, %ymm0
1313 ; BTVER2-NEXT:    vmulps %ymm0, %ymm2, %ymm0
1314 ; BTVER2-NEXT:    vaddps %ymm0, %ymm2, %ymm0
1315 ; BTVER2-NEXT:    vrcpps %ymm1, %ymm2
1316 ; BTVER2-NEXT:    vmulps %ymm2, %ymm1, %ymm3
1317 ; BTVER2-NEXT:    vsubps %ymm3, %ymm4, %ymm3
1318 ; BTVER2-NEXT:    vmulps %ymm3, %ymm2, %ymm3
1319 ; BTVER2-NEXT:    vaddps %ymm3, %ymm2, %ymm2
1320 ; BTVER2-NEXT:    vmulps %ymm2, %ymm1, %ymm1
1321 ; BTVER2-NEXT:    vsubps %ymm1, %ymm4, %ymm1
1322 ; BTVER2-NEXT:    vmulps %ymm1, %ymm2, %ymm1
1323 ; BTVER2-NEXT:    vaddps %ymm1, %ymm2, %ymm1
1324 ; BTVER2-NEXT:    retq
1326 ; SANDY-LABEL: v16f32_two_step:
1327 ; SANDY:       # %bb.0:
1328 ; SANDY-NEXT:    vrcpps %ymm0, %ymm2
1329 ; SANDY-NEXT:    vmulps %ymm2, %ymm0, %ymm3
1330 ; SANDY-NEXT:    vmovaps {{.*#+}} ymm4 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1331 ; SANDY-NEXT:    vsubps %ymm3, %ymm4, %ymm3
1332 ; SANDY-NEXT:    vmulps %ymm3, %ymm2, %ymm3
1333 ; SANDY-NEXT:    vaddps %ymm3, %ymm2, %ymm2
1334 ; SANDY-NEXT:    vmulps %ymm2, %ymm0, %ymm0
1335 ; SANDY-NEXT:    vsubps %ymm0, %ymm4, %ymm0
1336 ; SANDY-NEXT:    vrcpps %ymm1, %ymm3
1337 ; SANDY-NEXT:    vmulps %ymm0, %ymm2, %ymm0
1338 ; SANDY-NEXT:    vaddps %ymm0, %ymm2, %ymm0
1339 ; SANDY-NEXT:    vmulps %ymm3, %ymm1, %ymm2
1340 ; SANDY-NEXT:    vsubps %ymm2, %ymm4, %ymm2
1341 ; SANDY-NEXT:    vmulps %ymm2, %ymm3, %ymm2
1342 ; SANDY-NEXT:    vaddps %ymm2, %ymm3, %ymm2
1343 ; SANDY-NEXT:    vmulps %ymm2, %ymm1, %ymm1
1344 ; SANDY-NEXT:    vsubps %ymm1, %ymm4, %ymm1
1345 ; SANDY-NEXT:    vmulps %ymm1, %ymm2, %ymm1
1346 ; SANDY-NEXT:    vaddps %ymm1, %ymm2, %ymm1
1347 ; SANDY-NEXT:    retq
1349 ; HASWELL-LABEL: v16f32_two_step:
1350 ; HASWELL:       # %bb.0:
1351 ; HASWELL-NEXT:    vrcpps %ymm0, %ymm2
1352 ; HASWELL-NEXT:    vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1353 ; HASWELL-NEXT:    vmovaps %ymm2, %ymm4
1354 ; HASWELL-NEXT:    vfmsub213ps {{.*#+}} ymm4 = (ymm0 * ymm4) - ymm3
1355 ; HASWELL-NEXT:    vfnmadd132ps {{.*#+}} ymm4 = -(ymm4 * ymm2) + ymm2
1356 ; HASWELL-NEXT:    vfmsub213ps {{.*#+}} ymm0 = (ymm4 * ymm0) - ymm3
1357 ; HASWELL-NEXT:    vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm4) + ymm4
1358 ; HASWELL-NEXT:    vrcpps %ymm1, %ymm2
1359 ; HASWELL-NEXT:    vmovaps %ymm2, %ymm4
1360 ; HASWELL-NEXT:    vfmsub213ps {{.*#+}} ymm4 = (ymm1 * ymm4) - ymm3
1361 ; HASWELL-NEXT:    vfnmadd132ps {{.*#+}} ymm4 = -(ymm4 * ymm2) + ymm2
1362 ; HASWELL-NEXT:    vfmsub213ps {{.*#+}} ymm1 = (ymm4 * ymm1) - ymm3
1363 ; HASWELL-NEXT:    vfnmadd132ps {{.*#+}} ymm1 = -(ymm1 * ymm4) + ymm4
1364 ; HASWELL-NEXT:    retq
1366 ; HASWELL-NO-FMA-LABEL: v16f32_two_step:
1367 ; HASWELL-NO-FMA:       # %bb.0:
1368 ; HASWELL-NO-FMA-NEXT:    vrcpps %ymm0, %ymm2
1369 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm2, %ymm0, %ymm3
1370 ; HASWELL-NO-FMA-NEXT:    vbroadcastss {{.*#+}} ymm4 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1371 ; HASWELL-NO-FMA-NEXT:    vsubps %ymm3, %ymm4, %ymm3
1372 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm3, %ymm2, %ymm3
1373 ; HASWELL-NO-FMA-NEXT:    vaddps %ymm3, %ymm2, %ymm2
1374 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm2, %ymm0, %ymm0
1375 ; HASWELL-NO-FMA-NEXT:    vsubps %ymm0, %ymm4, %ymm0
1376 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm0, %ymm2, %ymm0
1377 ; HASWELL-NO-FMA-NEXT:    vaddps %ymm0, %ymm2, %ymm0
1378 ; HASWELL-NO-FMA-NEXT:    vrcpps %ymm1, %ymm2
1379 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm2, %ymm1, %ymm3
1380 ; HASWELL-NO-FMA-NEXT:    vsubps %ymm3, %ymm4, %ymm3
1381 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm3, %ymm2, %ymm3
1382 ; HASWELL-NO-FMA-NEXT:    vaddps %ymm3, %ymm2, %ymm2
1383 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm2, %ymm1, %ymm1
1384 ; HASWELL-NO-FMA-NEXT:    vsubps %ymm1, %ymm4, %ymm1
1385 ; HASWELL-NO-FMA-NEXT:    vmulps %ymm1, %ymm2, %ymm1
1386 ; HASWELL-NO-FMA-NEXT:    vaddps %ymm1, %ymm2, %ymm1
1387 ; HASWELL-NO-FMA-NEXT:    retq
1389 ; AVX512-LABEL: v16f32_two_step:
1390 ; AVX512:       # %bb.0:
1391 ; AVX512-NEXT:    vrcp14ps %zmm0, %zmm1
1392 ; AVX512-NEXT:    vbroadcastss {{.*#+}} zmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
1393 ; AVX512-NEXT:    vmovaps %zmm1, %zmm3
1394 ; AVX512-NEXT:    vfmsub213ps {{.*#+}} zmm3 = (zmm0 * zmm3) - zmm2
1395 ; AVX512-NEXT:    vfnmadd132ps {{.*#+}} zmm3 = -(zmm3 * zmm1) + zmm1
1396 ; AVX512-NEXT:    vfmsub213ps {{.*#+}} zmm0 = (zmm3 * zmm0) - zmm2
1397 ; AVX512-NEXT:    vfnmadd132ps {{.*#+}} zmm0 = -(zmm0 * zmm3) + zmm3
1398 ; AVX512-NEXT:    retq
1399   %div = fdiv fast <16 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, %x
1400   ret <16 x float> %div
1403 attributes #0 = { "unsafe-fp-math"="true" "reciprocal-estimates"="!divf,!vec-divf" }
1404 attributes #1 = { "unsafe-fp-math"="true" "reciprocal-estimates"="divf,vec-divf" }
1405 attributes #2 = { "unsafe-fp-math"="true" "reciprocal-estimates"="divf:2,vec-divf:2" }