[X86][FMA] Begun adding AVX512 FMA tests
[oota-llvm.git] / test / CodeGen / X86 / fma_patterns.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+fma -fp-contract=fast | FileCheck %s --check-prefix=ALL --check-prefix=FMA
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+fma4,+fma -fp-contract=fast | FileCheck %s --check-prefix=ALL --check-prefix=FMA
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+fma4 -fp-contract=fast | FileCheck %s --check-prefix=ALL --check-prefix=FMA4
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl -fp-contract=fast | FileCheck %s --check-prefix=ALL --check-prefix=AVX512
6
7 ;
8 ; Patterns (+ fneg variants): add(mul(x,y),z), sub(mul(x,y),z)
9 ;
10
11 define <4 x float> @test_x86_fmadd_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
12 ; FMA-LABEL: test_x86_fmadd_ps:
13 ; FMA:       # BB#0:
14 ; FMA-NEXT:    vfmadd213ps %xmm2, %xmm1, %xmm0
15 ; FMA-NEXT:    retq
16 ;
17 ; FMA4-LABEL: test_x86_fmadd_ps:
18 ; FMA4:       # BB#0:
19 ; FMA4-NEXT:    vfmaddps %xmm2, %xmm1, %xmm0, %xmm0
20 ; FMA4-NEXT:    retq
21 ;
22 ; AVX512-LABEL: test_x86_fmadd_ps:
23 ; AVX512:       # BB#0:
24 ; AVX512-NEXT:    vfmadd213ps %xmm2, %xmm1, %xmm0
25 ; AVX512-NEXT:    retq
26   %x = fmul <4 x float> %a0, %a1
27   %res = fadd <4 x float> %x, %a2
28   ret <4 x float> %res
29 }
30
31 define <4 x float> @test_x86_fmsub_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
32 ; FMA-LABEL: test_x86_fmsub_ps:
33 ; FMA:       # BB#0:
34 ; FMA-NEXT:    vfmsub213ps %xmm2, %xmm1, %xmm0
35 ; FMA-NEXT:    retq
36 ;
37 ; FMA4-LABEL: test_x86_fmsub_ps:
38 ; FMA4:       # BB#0:
39 ; FMA4-NEXT:    vfmsubps %xmm2, %xmm1, %xmm0, %xmm0
40 ; FMA4-NEXT:    retq
41 ;
42 ; AVX512-LABEL: test_x86_fmsub_ps:
43 ; AVX512:       # BB#0:
44 ; AVX512-NEXT:    vfmsub213ps %xmm2, %xmm1, %xmm0
45 ; AVX512-NEXT:    retq
46   %x = fmul <4 x float> %a0, %a1
47   %res = fsub <4 x float> %x, %a2
48   ret <4 x float> %res
49 }
50
51 define <4 x float> @test_x86_fnmadd_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
52 ; FMA-LABEL: test_x86_fnmadd_ps:
53 ; FMA:       # BB#0:
54 ; FMA-NEXT:    vfnmadd213ps %xmm2, %xmm1, %xmm0
55 ; FMA-NEXT:    retq
56 ;
57 ; FMA4-LABEL: test_x86_fnmadd_ps:
58 ; FMA4:       # BB#0:
59 ; FMA4-NEXT:    vfnmaddps %xmm2, %xmm1, %xmm0, %xmm0
60 ; FMA4-NEXT:    retq
61 ;
62 ; AVX512-LABEL: test_x86_fnmadd_ps:
63 ; AVX512:       # BB#0:
64 ; AVX512-NEXT:    vfnmadd213ps %xmm2, %xmm1, %xmm0
65 ; AVX512-NEXT:    retq
66   %x = fmul <4 x float> %a0, %a1
67   %res = fsub <4 x float> %a2, %x
68   ret <4 x float> %res
69 }
70
71 define <4 x float> @test_x86_fnmsub_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
72 ; FMA-LABEL: test_x86_fnmsub_ps:
73 ; FMA:       # BB#0:
74 ; FMA-NEXT:    vfnmsub213ps %xmm2, %xmm1, %xmm0
75 ; FMA-NEXT:    retq
76 ;
77 ; FMA4-LABEL: test_x86_fnmsub_ps:
78 ; FMA4:       # BB#0:
79 ; FMA4-NEXT:    vfnmsubps %xmm2, %xmm1, %xmm0, %xmm0
80 ; FMA4-NEXT:    retq
81 ;
82 ; AVX512-LABEL: test_x86_fnmsub_ps:
83 ; AVX512:       # BB#0:
84 ; AVX512-NEXT:    vfnmsub213ps %xmm2, %xmm1, %xmm0
85 ; AVX512-NEXT:    retq
86   %x = fmul <4 x float> %a0, %a1
87   %y = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %x
88   %res = fsub <4 x float> %y, %a2
89   ret <4 x float> %res
90 }
91
92 define <8 x float> @test_x86_fmadd_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
93 ; FMA-LABEL: test_x86_fmadd_ps_y:
94 ; FMA:       # BB#0:
95 ; FMA-NEXT:    vfmadd213ps %ymm2, %ymm1, %ymm0
96 ; FMA-NEXT:    retq
97 ;
98 ; FMA4-LABEL: test_x86_fmadd_ps_y:
99 ; FMA4:       # BB#0:
100 ; FMA4-NEXT:    vfmaddps %ymm2, %ymm1, %ymm0, %ymm0
101 ; FMA4-NEXT:    retq
102 ;
103 ; AVX512-LABEL: test_x86_fmadd_ps_y:
104 ; AVX512:       # BB#0:
105 ; AVX512-NEXT:    vfmadd213ps %ymm2, %ymm1, %ymm0
106 ; AVX512-NEXT:    retq
107   %x = fmul <8 x float> %a0, %a1
108   %res = fadd <8 x float> %x, %a2
109   ret <8 x float> %res
110 }
111
112 define <8 x float> @test_x86_fmsub_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
113 ; FMA-LABEL: test_x86_fmsub_ps_y:
114 ; FMA:       # BB#0:
115 ; FMA-NEXT:    vfmsub213ps %ymm2, %ymm1, %ymm0
116 ; FMA-NEXT:    retq
117 ;
118 ; FMA4-LABEL: test_x86_fmsub_ps_y:
119 ; FMA4:       # BB#0:
120 ; FMA4-NEXT:    vfmsubps %ymm2, %ymm1, %ymm0, %ymm0
121 ; FMA4-NEXT:    retq
122 ;
123 ; AVX512-LABEL: test_x86_fmsub_ps_y:
124 ; AVX512:       # BB#0:
125 ; AVX512-NEXT:    vfmsub213ps %ymm2, %ymm1, %ymm0
126 ; AVX512-NEXT:    retq
127   %x = fmul <8 x float> %a0, %a1
128   %res = fsub <8 x float> %x, %a2
129   ret <8 x float> %res
130 }
131
132 define <8 x float> @test_x86_fnmadd_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
133 ; FMA-LABEL: test_x86_fnmadd_ps_y:
134 ; FMA:       # BB#0:
135 ; FMA-NEXT:    vfnmadd213ps %ymm2, %ymm1, %ymm0
136 ; FMA-NEXT:    retq
137 ;
138 ; FMA4-LABEL: test_x86_fnmadd_ps_y:
139 ; FMA4:       # BB#0:
140 ; FMA4-NEXT:    vfnmaddps %ymm2, %ymm1, %ymm0, %ymm0
141 ; FMA4-NEXT:    retq
142 ;
143 ; AVX512-LABEL: test_x86_fnmadd_ps_y:
144 ; AVX512:       # BB#0:
145 ; AVX512-NEXT:    vfnmadd213ps %ymm2, %ymm1, %ymm0
146 ; AVX512-NEXT:    retq
147   %x = fmul <8 x float> %a0, %a1
148   %res = fsub <8 x float> %a2, %x
149   ret <8 x float> %res
150 }
151
152 define <8 x float> @test_x86_fnmsub_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
153 ; FMA-LABEL: test_x86_fnmsub_ps_y:
154 ; FMA:       # BB#0:
155 ; FMA-NEXT:    vfnmsub213ps %ymm2, %ymm1, %ymm0
156 ; FMA-NEXT:    retq
157 ;
158 ; FMA4-LABEL: test_x86_fnmsub_ps_y:
159 ; FMA4:       # BB#0:
160 ; FMA4-NEXT:    vfnmsubps %ymm2, %ymm1, %ymm0, %ymm0
161 ; FMA4-NEXT:    retq
162 ;
163 ; AVX512-LABEL: test_x86_fnmsub_ps_y:
164 ; AVX512:       # BB#0:
165 ; AVX512-NEXT:    vfnmsub213ps %ymm2, %ymm1, %ymm0
166 ; AVX512-NEXT:    retq
167   %x = fmul <8 x float> %a0, %a1
168   %y = fsub <8 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %x
169   %res = fsub <8 x float> %y, %a2
170   ret <8 x float> %res
171 }
172
173 define <4 x double> @test_x86_fmadd_pd_y(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2) {
174 ; FMA-LABEL: test_x86_fmadd_pd_y:
175 ; FMA:       # BB#0:
176 ; FMA-NEXT:    vfmadd213pd %ymm2, %ymm1, %ymm0
177 ; FMA-NEXT:    retq
178 ;
179 ; FMA4-LABEL: test_x86_fmadd_pd_y:
180 ; FMA4:       # BB#0:
181 ; FMA4-NEXT:    vfmaddpd %ymm2, %ymm1, %ymm0, %ymm0
182 ; FMA4-NEXT:    retq
183 ;
184 ; AVX512-LABEL: test_x86_fmadd_pd_y:
185 ; AVX512:       # BB#0:
186 ; AVX512-NEXT:    vfmadd213pd %ymm2, %ymm1, %ymm0
187 ; AVX512-NEXT:    retq
188   %x = fmul <4 x double> %a0, %a1
189   %res = fadd <4 x double> %x, %a2
190   ret <4 x double> %res
191 }
192
193 define <4 x double> @test_x86_fmsub_pd_y(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2) {
194 ; FMA-LABEL: test_x86_fmsub_pd_y:
195 ; FMA:       # BB#0:
196 ; FMA-NEXT:    vfmsub213pd %ymm2, %ymm1, %ymm0
197 ; FMA-NEXT:    retq
198 ;
199 ; FMA4-LABEL: test_x86_fmsub_pd_y:
200 ; FMA4:       # BB#0:
201 ; FMA4-NEXT:    vfmsubpd %ymm2, %ymm1, %ymm0, %ymm0
202 ; FMA4-NEXT:    retq
203 ;
204 ; AVX512-LABEL: test_x86_fmsub_pd_y:
205 ; AVX512:       # BB#0:
206 ; AVX512-NEXT:    vfmsub213pd %ymm2, %ymm1, %ymm0
207 ; AVX512-NEXT:    retq
208   %x = fmul <4 x double> %a0, %a1
209   %res = fsub <4 x double> %x, %a2
210   ret <4 x double> %res
211 }
212
213 define <2 x double> @test_x86_fmsub_pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) {
214 ; FMA-LABEL: test_x86_fmsub_pd:
215 ; FMA:       # BB#0:
216 ; FMA-NEXT:    vfmsub213pd %xmm2, %xmm1, %xmm0
217 ; FMA-NEXT:    retq
218 ;
219 ; FMA4-LABEL: test_x86_fmsub_pd:
220 ; FMA4:       # BB#0:
221 ; FMA4-NEXT:    vfmsubpd %xmm2, %xmm1, %xmm0, %xmm0
222 ; FMA4-NEXT:    retq
223 ;
224 ; AVX512-LABEL: test_x86_fmsub_pd:
225 ; AVX512:       # BB#0:
226 ; AVX512-NEXT:    vfmsub213pd %xmm2, %xmm1, %xmm0
227 ; AVX512-NEXT:    retq
228   %x = fmul <2 x double> %a0, %a1
229   %res = fsub <2 x double> %x, %a2
230   ret <2 x double> %res
231 }
232
233 define float @test_x86_fnmadd_ss(float %a0, float %a1, float %a2) {
234 ; FMA-LABEL: test_x86_fnmadd_ss:
235 ; FMA:       # BB#0:
236 ; FMA-NEXT:    vfnmadd213ss %xmm2, %xmm1, %xmm0
237 ; FMA-NEXT:    retq
238 ;
239 ; FMA4-LABEL: test_x86_fnmadd_ss:
240 ; FMA4:       # BB#0:
241 ; FMA4-NEXT:    vfnmaddss %xmm2, %xmm1, %xmm0, %xmm0
242 ; FMA4-NEXT:    retq
243 ;
244 ; AVX512-LABEL: test_x86_fnmadd_ss:
245 ; AVX512:       # BB#0:
246 ; AVX512-NEXT:    vfnmadd213ss %xmm2, %xmm0, %xmm1
247 ; AVX512-NEXT:    vmovaps %zmm1, %zmm0
248 ; AVX512-NEXT:    retq
249   %x = fmul float %a0, %a1
250   %res = fsub float %a2, %x
251   ret float %res
252 }
253
254 define double @test_x86_fnmadd_sd(double %a0, double %a1, double %a2) {
255 ; FMA-LABEL: test_x86_fnmadd_sd:
256 ; FMA:       # BB#0:
257 ; FMA-NEXT:    vfnmadd213sd %xmm2, %xmm1, %xmm0
258 ; FMA-NEXT:    retq
259 ;
260 ; FMA4-LABEL: test_x86_fnmadd_sd:
261 ; FMA4:       # BB#0:
262 ; FMA4-NEXT:    vfnmaddsd %xmm2, %xmm1, %xmm0, %xmm0
263 ; FMA4-NEXT:    retq
264 ;
265 ; AVX512-LABEL: test_x86_fnmadd_sd:
266 ; AVX512:       # BB#0:
267 ; AVX512-NEXT:    vfnmadd213sd %xmm2, %xmm0, %xmm1
268 ; AVX512-NEXT:    vmovaps %zmm1, %zmm0
269 ; AVX512-NEXT:    retq
270   %x = fmul double %a0, %a1
271   %res = fsub double %a2, %x
272   ret double %res
273 }
274
275 define double @test_x86_fmsub_sd(double %a0, double %a1, double %a2) {
276 ; FMA-LABEL: test_x86_fmsub_sd:
277 ; FMA:       # BB#0:
278 ; FMA-NEXT:    vfmsub213sd %xmm2, %xmm1, %xmm0
279 ; FMA-NEXT:    retq
280 ;
281 ; FMA4-LABEL: test_x86_fmsub_sd:
282 ; FMA4:       # BB#0:
283 ; FMA4-NEXT:    vfmsubsd %xmm2, %xmm1, %xmm0, %xmm0
284 ; FMA4-NEXT:    retq
285 ;
286 ; AVX512-LABEL: test_x86_fmsub_sd:
287 ; AVX512:       # BB#0:
288 ; AVX512-NEXT:    vfmsub213sd %xmm2, %xmm0, %xmm1
289 ; AVX512-NEXT:    vmovaps %zmm1, %zmm0
290 ; AVX512-NEXT:    retq
291   %x = fmul double %a0, %a1
292   %res = fsub double %x, %a2
293   ret double %res
294 }
295
296 define float @test_x86_fnmsub_ss(float %a0, float %a1, float %a2) {
297 ; FMA-LABEL: test_x86_fnmsub_ss:
298 ; FMA:       # BB#0:
299 ; FMA-NEXT:    vfnmsub213ss %xmm2, %xmm1, %xmm0
300 ; FMA-NEXT:    retq
301 ;
302 ; FMA4-LABEL: test_x86_fnmsub_ss:
303 ; FMA4:       # BB#0:
304 ; FMA4-NEXT:    vfnmsubss %xmm2, %xmm1, %xmm0, %xmm0
305 ; FMA4-NEXT:    retq
306 ;
307 ; AVX512-LABEL: test_x86_fnmsub_ss:
308 ; AVX512:       # BB#0:
309 ; AVX512-NEXT:    vfnmsub213ss %xmm2, %xmm0, %xmm1
310 ; AVX512-NEXT:    vmovaps %zmm1, %zmm0
311 ; AVX512-NEXT:    retq
312   %x = fsub float -0.000000e+00, %a0
313   %y = fmul float %x, %a1
314   %res = fsub float %y, %a2
315   ret float %res
316 }
317
318 define <4 x float> @test_x86_fmadd_ps_load(<4 x float>* %a0, <4 x float> %a1, <4 x float> %a2) {
319 ; FMA-LABEL: test_x86_fmadd_ps_load:
320 ; FMA:       # BB#0:
321 ; FMA-NEXT:    vfmadd132ps (%rdi), %xmm1, %xmm0
322 ; FMA-NEXT:    retq
323 ;
324 ; FMA4-LABEL: test_x86_fmadd_ps_load:
325 ; FMA4:       # BB#0:
326 ; FMA4-NEXT:    vfmaddps %xmm1, (%rdi), %xmm0, %xmm0
327 ; FMA4-NEXT:    retq
328 ;
329 ; AVX512-LABEL: test_x86_fmadd_ps_load:
330 ; AVX512:       # BB#0:
331 ; AVX512-NEXT:    vmovaps (%rdi), %xmm2
332 ; AVX512-NEXT:    vfmadd213ps %xmm1, %xmm0, %xmm2
333 ; AVX512-NEXT:    vmovaps %zmm2, %zmm0
334 ; AVX512-NEXT:    retq
335   %x = load <4 x float>, <4 x float>* %a0
336   %y = fmul <4 x float> %x, %a1
337   %res = fadd <4 x float> %y, %a2
338   ret <4 x float> %res
339 }
340
341 define <4 x float> @test_x86_fmsub_ps_load(<4 x float>* %a0, <4 x float> %a1, <4 x float> %a2) {
342 ; FMA-LABEL: test_x86_fmsub_ps_load:
343 ; FMA:       # BB#0:
344 ; FMA-NEXT:    vfmsub132ps (%rdi), %xmm1, %xmm0
345 ; FMA-NEXT:    retq
346 ;
347 ; FMA4-LABEL: test_x86_fmsub_ps_load:
348 ; FMA4:       # BB#0:
349 ; FMA4-NEXT:    vfmsubps %xmm1, (%rdi), %xmm0, %xmm0
350 ; FMA4-NEXT:    retq
351 ;
352 ; AVX512-LABEL: test_x86_fmsub_ps_load:
353 ; AVX512:       # BB#0:
354 ; AVX512-NEXT:    vmovaps (%rdi), %xmm2
355 ; AVX512-NEXT:    vfmsub213ps %xmm1, %xmm0, %xmm2
356 ; AVX512-NEXT:    vmovaps %zmm2, %zmm0
357 ; AVX512-NEXT:    retq
358   %x = load <4 x float>, <4 x float>* %a0
359   %y = fmul <4 x float> %x, %a1
360   %res = fsub <4 x float> %y, %a2
361   ret <4 x float> %res
362 }
363
364 ;
365 ; Patterns (+ fneg variants): mul(add(1.0,x),y), mul(sub(1.0,x),y), mul(sub(x,1.0),y)
366 ;
367
368 define <4 x float> @test_v4f32_mul_add_x_one_y(<4 x float> %x, <4 x float> %y) {
369 ; FMA-LABEL: test_v4f32_mul_add_x_one_y:
370 ; FMA:       # BB#0:
371 ; FMA-NEXT:    vfmadd213ps %xmm1, %xmm1, %xmm0
372 ; FMA-NEXT:    retq
373 ;
374 ; FMA4-LABEL: test_v4f32_mul_add_x_one_y:
375 ; FMA4:       # BB#0:
376 ; FMA4-NEXT:    vfmaddps %xmm1, %xmm1, %xmm0, %xmm0
377 ; FMA4-NEXT:    retq
378 ;
379 ; AVX512-LABEL: test_v4f32_mul_add_x_one_y:
380 ; AVX512:       # BB#0:
381 ; AVX512-NEXT:    vfmadd213ps %xmm1, %xmm1, %xmm0
382 ; AVX512-NEXT:    retq
383   %a = fadd <4 x float> %x, <float 1.0, float 1.0, float 1.0, float 1.0>
384   %m = fmul <4 x float> %a, %y
385   ret <4 x float> %m
386 }
387
388 define <4 x float> @test_v4f32_mul_y_add_x_one(<4 x float> %x, <4 x float> %y) {
389 ; FMA-LABEL: test_v4f32_mul_y_add_x_one:
390 ; FMA:       # BB#0:
391 ; FMA-NEXT:    vfmadd213ps %xmm1, %xmm1, %xmm0
392 ; FMA-NEXT:    retq
393 ;
394 ; FMA4-LABEL: test_v4f32_mul_y_add_x_one:
395 ; FMA4:       # BB#0:
396 ; FMA4-NEXT:    vfmaddps %xmm1, %xmm1, %xmm0, %xmm0
397 ; FMA4-NEXT:    retq
398 ;
399 ; AVX512-LABEL: test_v4f32_mul_y_add_x_one:
400 ; AVX512:       # BB#0:
401 ; AVX512-NEXT:    vfmadd213ps %xmm1, %xmm1, %xmm0
402 ; AVX512-NEXT:    retq
403   %a = fadd <4 x float> %x, <float 1.0, float 1.0, float 1.0, float 1.0>
404   %m = fmul <4 x float> %y, %a
405   ret <4 x float> %m
406 }
407
408 define <4 x float> @test_v4f32_mul_add_x_negone_y(<4 x float> %x, <4 x float> %y) {
409 ; FMA-LABEL: test_v4f32_mul_add_x_negone_y:
410 ; FMA:       # BB#0:
411 ; FMA-NEXT:    vfmsub213ps %xmm1, %xmm1, %xmm0
412 ; FMA-NEXT:    retq
413 ;
414 ; FMA4-LABEL: test_v4f32_mul_add_x_negone_y:
415 ; FMA4:       # BB#0:
416 ; FMA4-NEXT:    vfmsubps %xmm1, %xmm1, %xmm0, %xmm0
417 ; FMA4-NEXT:    retq
418 ;
419 ; AVX512-LABEL: test_v4f32_mul_add_x_negone_y:
420 ; AVX512:       # BB#0:
421 ; AVX512-NEXT:    vfmsub213ps %xmm1, %xmm1, %xmm0
422 ; AVX512-NEXT:    retq
423   %a = fadd <4 x float> %x, <float -1.0, float -1.0, float -1.0, float -1.0>
424   %m = fmul <4 x float> %a, %y
425   ret <4 x float> %m
426 }
427
428 define <4 x float> @test_v4f32_mul_y_add_x_negone(<4 x float> %x, <4 x float> %y) {
429 ; FMA-LABEL: test_v4f32_mul_y_add_x_negone:
430 ; FMA:       # BB#0:
431 ; FMA-NEXT:    vfmsub213ps %xmm1, %xmm1, %xmm0
432 ; FMA-NEXT:    retq
433 ;
434 ; FMA4-LABEL: test_v4f32_mul_y_add_x_negone:
435 ; FMA4:       # BB#0:
436 ; FMA4-NEXT:    vfmsubps %xmm1, %xmm1, %xmm0, %xmm0
437 ; FMA4-NEXT:    retq
438 ;
439 ; AVX512-LABEL: test_v4f32_mul_y_add_x_negone:
440 ; AVX512:       # BB#0:
441 ; AVX512-NEXT:    vfmsub213ps %xmm1, %xmm1, %xmm0
442 ; AVX512-NEXT:    retq
443   %a = fadd <4 x float> %x, <float -1.0, float -1.0, float -1.0, float -1.0>
444   %m = fmul <4 x float> %y, %a
445   ret <4 x float> %m
446 }
447
448 define <4 x float> @test_v4f32_mul_sub_one_x_y(<4 x float> %x, <4 x float> %y) {
449 ; FMA-LABEL: test_v4f32_mul_sub_one_x_y:
450 ; FMA:       # BB#0:
451 ; FMA-NEXT:    vfnmadd213ps %xmm1, %xmm1, %xmm0
452 ; FMA-NEXT:    retq
453 ;
454 ; FMA4-LABEL: test_v4f32_mul_sub_one_x_y:
455 ; FMA4:       # BB#0:
456 ; FMA4-NEXT:    vfnmaddps %xmm1, %xmm1, %xmm0, %xmm0
457 ; FMA4-NEXT:    retq
458 ;
459 ; AVX512-LABEL: test_v4f32_mul_sub_one_x_y:
460 ; AVX512:       # BB#0:
461 ; AVX512-NEXT:    vfnmadd213ps %xmm1, %xmm1, %xmm0
462 ; AVX512-NEXT:    retq
463   %s = fsub <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>, %x
464   %m = fmul <4 x float> %s, %y
465   ret <4 x float> %m
466 }
467
468 define <4 x float> @test_v4f32_mul_y_sub_one_x(<4 x float> %x, <4 x float> %y) {
469 ; FMA-LABEL: test_v4f32_mul_y_sub_one_x:
470 ; FMA:       # BB#0:
471 ; FMA-NEXT:    vfnmadd213ps %xmm1, %xmm1, %xmm0
472 ; FMA-NEXT:    retq
473 ;
474 ; FMA4-LABEL: test_v4f32_mul_y_sub_one_x:
475 ; FMA4:       # BB#0:
476 ; FMA4-NEXT:    vfnmaddps %xmm1, %xmm1, %xmm0, %xmm0
477 ; FMA4-NEXT:    retq
478 ;
479 ; AVX512-LABEL: test_v4f32_mul_y_sub_one_x:
480 ; AVX512:       # BB#0:
481 ; AVX512-NEXT:    vfnmadd213ps %xmm1, %xmm1, %xmm0
482 ; AVX512-NEXT:    retq
483   %s = fsub <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>, %x
484   %m = fmul <4 x float> %y, %s
485   ret <4 x float> %m
486 }
487
488 define <4 x float> @test_v4f32_mul_sub_negone_x_y(<4 x float> %x, <4 x float> %y) {
489 ; FMA-LABEL: test_v4f32_mul_sub_negone_x_y:
490 ; FMA:       # BB#0:
491 ; FMA-NEXT:    vfnmsub213ps %xmm1, %xmm1, %xmm0
492 ; FMA-NEXT:    retq
493 ;
494 ; FMA4-LABEL: test_v4f32_mul_sub_negone_x_y:
495 ; FMA4:       # BB#0:
496 ; FMA4-NEXT:    vfnmsubps %xmm1, %xmm1, %xmm0, %xmm0
497 ; FMA4-NEXT:    retq
498 ;
499 ; AVX512-LABEL: test_v4f32_mul_sub_negone_x_y:
500 ; AVX512:       # BB#0:
501 ; AVX512-NEXT:    vfnmsub213ps %xmm1, %xmm1, %xmm0
502 ; AVX512-NEXT:    retq
503   %s = fsub <4 x float> <float -1.0, float -1.0, float -1.0, float -1.0>, %x
504   %m = fmul <4 x float> %s, %y
505   ret <4 x float> %m
506 }
507
508 define <4 x float> @test_v4f32_mul_y_sub_negone_x(<4 x float> %x, <4 x float> %y) {
509 ; FMA-LABEL: test_v4f32_mul_y_sub_negone_x:
510 ; FMA:       # BB#0:
511 ; FMA-NEXT:    vfnmsub213ps %xmm1, %xmm1, %xmm0
512 ; FMA-NEXT:    retq
513 ;
514 ; FMA4-LABEL: test_v4f32_mul_y_sub_negone_x:
515 ; FMA4:       # BB#0:
516 ; FMA4-NEXT:    vfnmsubps %xmm1, %xmm1, %xmm0, %xmm0
517 ; FMA4-NEXT:    retq
518 ;
519 ; AVX512-LABEL: test_v4f32_mul_y_sub_negone_x:
520 ; AVX512:       # BB#0:
521 ; AVX512-NEXT:    vfnmsub213ps %xmm1, %xmm1, %xmm0
522 ; AVX512-NEXT:    retq
523   %s = fsub <4 x float> <float -1.0, float -1.0, float -1.0, float -1.0>, %x
524   %m = fmul <4 x float> %y, %s
525   ret <4 x float> %m
526 }
527
528 define <4 x float> @test_v4f32_mul_sub_x_one_y(<4 x float> %x, <4 x float> %y) {
529 ; FMA-LABEL: test_v4f32_mul_sub_x_one_y:
530 ; FMA:       # BB#0:
531 ; FMA-NEXT:    vfmsub213ps %xmm1, %xmm1, %xmm0
532 ; FMA-NEXT:    retq
533 ;
534 ; FMA4-LABEL: test_v4f32_mul_sub_x_one_y:
535 ; FMA4:       # BB#0:
536 ; FMA4-NEXT:    vfmsubps %xmm1, %xmm1, %xmm0, %xmm0
537 ; FMA4-NEXT:    retq
538 ;
539 ; AVX512-LABEL: test_v4f32_mul_sub_x_one_y:
540 ; AVX512:       # BB#0:
541 ; AVX512-NEXT:    vfmsub213ps %xmm1, %xmm1, %xmm0
542 ; AVX512-NEXT:    retq
543   %s = fsub <4 x float> %x, <float 1.0, float 1.0, float 1.0, float 1.0>
544   %m = fmul <4 x float> %s, %y
545   ret <4 x float> %m
546 }
547
548 define <4 x float> @test_v4f32_mul_y_sub_x_one(<4 x float> %x, <4 x float> %y) {
549 ; FMA-LABEL: test_v4f32_mul_y_sub_x_one:
550 ; FMA:       # BB#0:
551 ; FMA-NEXT:    vfmsub213ps %xmm1, %xmm1, %xmm0
552 ; FMA-NEXT:    retq
553 ;
554 ; FMA4-LABEL: test_v4f32_mul_y_sub_x_one:
555 ; FMA4:       # BB#0:
556 ; FMA4-NEXT:    vfmsubps %xmm1, %xmm1, %xmm0, %xmm0
557 ; FMA4-NEXT:    retq
558 ;
559 ; AVX512-LABEL: test_v4f32_mul_y_sub_x_one:
560 ; AVX512:       # BB#0:
561 ; AVX512-NEXT:    vfmsub213ps %xmm1, %xmm1, %xmm0
562 ; AVX512-NEXT:    retq
563   %s = fsub <4 x float> %x, <float 1.0, float 1.0, float 1.0, float 1.0>
564   %m = fmul <4 x float> %y, %s
565   ret <4 x float> %m
566 }
567
568 define <4 x float> @test_v4f32_mul_sub_x_negone_y(<4 x float> %x, <4 x float> %y) {
569 ; FMA-LABEL: test_v4f32_mul_sub_x_negone_y:
570 ; FMA:       # BB#0:
571 ; FMA-NEXT:    vfmadd213ps %xmm1, %xmm1, %xmm0
572 ; FMA-NEXT:    retq
573 ;
574 ; FMA4-LABEL: test_v4f32_mul_sub_x_negone_y:
575 ; FMA4:       # BB#0:
576 ; FMA4-NEXT:    vfmaddps %xmm1, %xmm1, %xmm0, %xmm0
577 ; FMA4-NEXT:    retq
578 ;
579 ; AVX512-LABEL: test_v4f32_mul_sub_x_negone_y:
580 ; AVX512:       # BB#0:
581 ; AVX512-NEXT:    vfmadd213ps %xmm1, %xmm1, %xmm0
582 ; AVX512-NEXT:    retq
583   %s = fsub <4 x float> %x, <float -1.0, float -1.0, float -1.0, float -1.0>
584   %m = fmul <4 x float> %s, %y
585   ret <4 x float> %m
586 }
587
588 define <4 x float> @test_v4f32_mul_y_sub_x_negone(<4 x float> %x, <4 x float> %y) {
589 ; FMA-LABEL: test_v4f32_mul_y_sub_x_negone:
590 ; FMA:       # BB#0:
591 ; FMA-NEXT:    vfmadd213ps %xmm1, %xmm1, %xmm0
592 ; FMA-NEXT:    retq
593 ;
594 ; FMA4-LABEL: test_v4f32_mul_y_sub_x_negone:
595 ; FMA4:       # BB#0:
596 ; FMA4-NEXT:    vfmaddps %xmm1, %xmm1, %xmm0, %xmm0
597 ; FMA4-NEXT:    retq
598 ;
599 ; AVX512-LABEL: test_v4f32_mul_y_sub_x_negone:
600 ; AVX512:       # BB#0:
601 ; AVX512-NEXT:    vfmadd213ps %xmm1, %xmm1, %xmm0
602 ; AVX512-NEXT:    retq
603   %s = fsub <4 x float> %x, <float -1.0, float -1.0, float -1.0, float -1.0>
604   %m = fmul <4 x float> %y, %s
605   ret <4 x float> %m
606 }
607
608 ;
609 ; Interpolation Patterns: add(mul(x,t),mul(sub(1.0,t),y))
610 ;
611
612 define float @test_f32_interp(float %x, float %y, float %t) {
613 ; FMA-LABEL: test_f32_interp:
614 ; FMA:       # BB#0:
615 ; FMA-NEXT:    vfnmadd213ss %xmm1, %xmm2, %xmm1
616 ; FMA-NEXT:    vfmadd213ss %xmm1, %xmm2, %xmm0
617 ; FMA-NEXT:    retq
618 ;
619 ; FMA4-LABEL: test_f32_interp:
620 ; FMA4:       # BB#0:
621 ; FMA4-NEXT:    vfnmaddss %xmm1, %xmm1, %xmm2, %xmm1
622 ; FMA4-NEXT:    vfmaddss %xmm1, %xmm2, %xmm0, %xmm0
623 ; FMA4-NEXT:    retq
624 ;
625 ; AVX512-LABEL: test_f32_interp:
626 ; AVX512:       # BB#0:
627 ; AVX512-NEXT:    vfnmadd213ss %xmm1, %xmm2, %xmm1
628 ; AVX512-NEXT:    vfmadd213ss %xmm1, %xmm0, %xmm2
629 ; AVX512-NEXT:    vmovaps %zmm2, %zmm0
630 ; AVX512-NEXT:    retq
631   %t1 = fsub float 1.0, %t
632   %tx = fmul float %x, %t
633   %ty = fmul float %y, %t1
634   %r = fadd float %tx, %ty
635   ret float %r
636 }
637
638 define <4 x float> @test_v4f32_interp(<4 x float> %x, <4 x float> %y, <4 x float> %t) {
639 ; FMA-LABEL: test_v4f32_interp:
640 ; FMA:       # BB#0:
641 ; FMA-NEXT:    vfnmadd213ps %xmm1, %xmm2, %xmm1
642 ; FMA-NEXT:    vfmadd213ps %xmm1, %xmm2, %xmm0
643 ; FMA-NEXT:    retq
644 ;
645 ; FMA4-LABEL: test_v4f32_interp:
646 ; FMA4:       # BB#0:
647 ; FMA4-NEXT:    vfnmaddps %xmm1, %xmm1, %xmm2, %xmm1
648 ; FMA4-NEXT:    vfmaddps %xmm1, %xmm2, %xmm0, %xmm0
649 ; FMA4-NEXT:    retq
650 ;
651 ; AVX512-LABEL: test_v4f32_interp:
652 ; AVX512:       # BB#0:
653 ; AVX512-NEXT:    vmovaps %zmm2, %zmm3
654 ; AVX512-NEXT:    vfnmadd213ps %xmm1, %xmm1, %xmm3
655 ; AVX512-NEXT:    vfmadd213ps %xmm3, %xmm2, %xmm0
656 ; AVX512-NEXT:    retq
657   %t1 = fsub <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>, %t
658   %tx = fmul <4 x float> %x, %t
659   %ty = fmul <4 x float> %y, %t1
660   %r = fadd <4 x float> %tx, %ty
661   ret <4 x float> %r
662 }
663
664 define <8 x float> @test_v8f32_interp(<8 x float> %x, <8 x float> %y, <8 x float> %t) {
665 ; FMA-LABEL: test_v8f32_interp:
666 ; FMA:       # BB#0:
667 ; FMA-NEXT:    vfnmadd213ps %ymm1, %ymm2, %ymm1
668 ; FMA-NEXT:    vfmadd213ps %ymm1, %ymm2, %ymm0
669 ; FMA-NEXT:    retq
670 ;
671 ; FMA4-LABEL: test_v8f32_interp:
672 ; FMA4:       # BB#0:
673 ; FMA4-NEXT:    vfnmaddps %ymm1, %ymm1, %ymm2, %ymm1
674 ; FMA4-NEXT:    vfmaddps %ymm1, %ymm2, %ymm0, %ymm0
675 ; FMA4-NEXT:    retq
676 ;
677 ; AVX512-LABEL: test_v8f32_interp:
678 ; AVX512:       # BB#0:
679 ; AVX512-NEXT:    vmovaps %zmm2, %zmm3
680 ; AVX512-NEXT:    vfnmadd213ps %ymm1, %ymm1, %ymm3
681 ; AVX512-NEXT:    vfmadd213ps %ymm3, %ymm2, %ymm0
682 ; AVX512-NEXT:    retq
683   %t1 = fsub <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>, %t
684   %tx = fmul <8 x float> %x, %t
685   %ty = fmul <8 x float> %y, %t1
686   %r = fadd <8 x float> %tx, %ty
687   ret <8 x float> %r
688 }
689
690 define double @test_f64_interp(double %x, double %y, double %t) {
691 ; FMA-LABEL: test_f64_interp:
692 ; FMA:       # BB#0:
693 ; FMA-NEXT:    vfnmadd213sd %xmm1, %xmm2, %xmm1
694 ; FMA-NEXT:    vfmadd213sd %xmm1, %xmm2, %xmm0
695 ; FMA-NEXT:    retq
696 ;
697 ; FMA4-LABEL: test_f64_interp:
698 ; FMA4:       # BB#0:
699 ; FMA4-NEXT:    vfnmaddsd %xmm1, %xmm1, %xmm2, %xmm1
700 ; FMA4-NEXT:    vfmaddsd %xmm1, %xmm2, %xmm0, %xmm0
701 ; FMA4-NEXT:    retq
702 ;
703 ; AVX512-LABEL: test_f64_interp:
704 ; AVX512:       # BB#0:
705 ; AVX512-NEXT:    vfnmadd213sd %xmm1, %xmm2, %xmm1
706 ; AVX512-NEXT:    vfmadd213sd %xmm1, %xmm0, %xmm2
707 ; AVX512-NEXT:    vmovaps %zmm2, %zmm0
708 ; AVX512-NEXT:    retq
709   %t1 = fsub double 1.0, %t
710   %tx = fmul double %x, %t
711   %ty = fmul double %y, %t1
712   %r = fadd double %tx, %ty
713   ret double %r
714 }
715
716 define <2 x double> @test_v2f64_interp(<2 x double> %x, <2 x double> %y, <2 x double> %t) {
717 ; FMA-LABEL: test_v2f64_interp:
718 ; FMA:       # BB#0:
719 ; FMA-NEXT:    vfnmadd213pd %xmm1, %xmm2, %xmm1
720 ; FMA-NEXT:    vfmadd213pd %xmm1, %xmm2, %xmm0
721 ; FMA-NEXT:    retq
722 ;
723 ; FMA4-LABEL: test_v2f64_interp:
724 ; FMA4:       # BB#0:
725 ; FMA4-NEXT:    vfnmaddpd %xmm1, %xmm1, %xmm2, %xmm1
726 ; FMA4-NEXT:    vfmaddpd %xmm1, %xmm2, %xmm0, %xmm0
727 ; FMA4-NEXT:    retq
728 ;
729 ; AVX512-LABEL: test_v2f64_interp:
730 ; AVX512:       # BB#0:
731 ; AVX512-NEXT:    vmovaps %zmm2, %zmm3
732 ; AVX512-NEXT:    vfnmadd213pd %xmm1, %xmm1, %xmm3
733 ; AVX512-NEXT:    vfmadd213pd %xmm3, %xmm2, %xmm0
734 ; AVX512-NEXT:    retq
735   %t1 = fsub <2 x double> <double 1.0, double 1.0>, %t
736   %tx = fmul <2 x double> %x, %t
737   %ty = fmul <2 x double> %y, %t1
738   %r = fadd <2 x double> %tx, %ty
739   ret <2 x double> %r
740 }
741
742 define <4 x double> @test_v4f64_interp(<4 x double> %x, <4 x double> %y, <4 x double> %t) {
743 ; FMA-LABEL: test_v4f64_interp:
744 ; FMA:       # BB#0:
745 ; FMA-NEXT:    vfnmadd213pd %ymm1, %ymm2, %ymm1
746 ; FMA-NEXT:    vfmadd213pd %ymm1, %ymm2, %ymm0
747 ; FMA-NEXT:    retq
748 ;
749 ; FMA4-LABEL: test_v4f64_interp:
750 ; FMA4:       # BB#0:
751 ; FMA4-NEXT:    vfnmaddpd %ymm1, %ymm1, %ymm2, %ymm1
752 ; FMA4-NEXT:    vfmaddpd %ymm1, %ymm2, %ymm0, %ymm0
753 ; FMA4-NEXT:    retq
754 ;
755 ; AVX512-LABEL: test_v4f64_interp:
756 ; AVX512:       # BB#0:
757 ; AVX512-NEXT:    vmovaps %zmm2, %zmm3
758 ; AVX512-NEXT:    vfnmadd213pd %ymm1, %ymm1, %ymm3
759 ; AVX512-NEXT:    vfmadd213pd %ymm3, %ymm2, %ymm0
760 ; AVX512-NEXT:    retq
761   %t1 = fsub <4 x double> <double 1.0, double 1.0, double 1.0, double 1.0>, %t
762   %tx = fmul <4 x double> %x, %t
763   %ty = fmul <4 x double> %y, %t1
764   %r = fadd <4 x double> %tx, %ty
765   ret <4 x double> %r
766 }
767
768 ; (fneg (fma x, y, z)) -> (fma x, -y, -z)
769
770 define <4 x float> @test_v4f32_fneg_fmadd(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) #0 {
771 ; FMA-LABEL: test_v4f32_fneg_fmadd:
772 ; FMA:       # BB#0:
773 ; FMA-NEXT:    vfnmsub213ps %xmm2, %xmm1, %xmm0
774 ; FMA-NEXT:    retq
775 ;
776 ; FMA4-LABEL: test_v4f32_fneg_fmadd:
777 ; FMA4:       # BB#0:
778 ; FMA4-NEXT:    vfnmsubps %xmm2, %xmm1, %xmm0, %xmm0
779 ; FMA4-NEXT:    retq
780 ;
781 ; AVX512-LABEL: test_v4f32_fneg_fmadd:
782 ; AVX512:       # BB#0:
783 ; AVX512-NEXT:    vfnmsub213ps %xmm2, %xmm1, %xmm0
784 ; AVX512-NEXT:    retq
785   %mul = fmul <4 x float> %a0, %a1
786   %add = fadd <4 x float> %mul, %a2
787   %neg = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %add
788   ret <4 x float> %neg
789 }
790
791 define <4 x double> @test_v4f64_fneg_fmsub(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2) #0 {
792 ; FMA-LABEL: test_v4f64_fneg_fmsub:
793 ; FMA:       # BB#0:
794 ; FMA-NEXT:    vfnmadd213pd %ymm2, %ymm1, %ymm0
795 ; FMA-NEXT:    retq
796 ;
797 ; FMA4-LABEL: test_v4f64_fneg_fmsub:
798 ; FMA4:       # BB#0:
799 ; FMA4-NEXT:    vfnmaddpd %ymm2, %ymm1, %ymm0, %ymm0
800 ; FMA4-NEXT:    retq
801 ;
802 ; AVX512-LABEL: test_v4f64_fneg_fmsub:
803 ; AVX512:       # BB#0:
804 ; AVX512-NEXT:    vfnmadd213pd %ymm2, %ymm1, %ymm0
805 ; AVX512-NEXT:    retq
806   %mul = fmul <4 x double> %a0, %a1
807   %sub = fsub <4 x double> %mul, %a2
808   %neg = fsub <4 x double> <double -0.0, double -0.0, double -0.0, double -0.0>, %sub
809   ret <4 x double> %neg
810 }
811
812 define <4 x float> @test_v4f32_fneg_fnmadd(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) #0 {
813 ; FMA-LABEL: test_v4f32_fneg_fnmadd:
814 ; FMA:       # BB#0:
815 ; FMA-NEXT:    vfmsub213ps %xmm2, %xmm1, %xmm0
816 ; FMA-NEXT:    retq
817 ;
818 ; FMA4-LABEL: test_v4f32_fneg_fnmadd:
819 ; FMA4:       # BB#0:
820 ; FMA4-NEXT:    vfmsubps %xmm2, %xmm1, %xmm0, %xmm0
821 ; FMA4-NEXT:    retq
822 ;
823 ; AVX512-LABEL: test_v4f32_fneg_fnmadd:
824 ; AVX512:       # BB#0:
825 ; AVX512-NEXT:    vfmsub213ps %xmm2, %xmm1, %xmm0
826 ; AVX512-NEXT:    retq
827   %mul = fmul <4 x float> %a0, %a1
828   %neg0 = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %mul
829   %add = fadd <4 x float> %neg0, %a2
830   %neg1 = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %add
831   ret <4 x float> %neg1
832 }
833
834 define <4 x double> @test_v4f64_fneg_fnmsub(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2) #0 {
835 ; FMA-LABEL: test_v4f64_fneg_fnmsub:
836 ; FMA:       # BB#0:
837 ; FMA-NEXT:    vfmadd213pd %ymm2, %ymm1, %ymm0
838 ; FMA-NEXT:    retq
839 ;
840 ; FMA4-LABEL: test_v4f64_fneg_fnmsub:
841 ; FMA4:       # BB#0:
842 ; FMA4-NEXT:    vfmaddpd %ymm2, %ymm1, %ymm0, %ymm0
843 ; FMA4-NEXT:    retq
844 ;
845 ; AVX512-LABEL: test_v4f64_fneg_fnmsub:
846 ; AVX512:       # BB#0:
847 ; AVX512-NEXT:    vfmadd213pd %ymm2, %ymm1, %ymm0
848 ; AVX512-NEXT:    retq
849   %mul = fmul <4 x double> %a0, %a1
850   %neg0 = fsub <4 x double> <double -0.0, double -0.0, double -0.0, double -0.0>, %mul
851   %sub = fsub <4 x double> %neg0, %a2
852   %neg1 = fsub <4 x double> <double -0.0, double -0.0, double -0.0, double -0.0>, %sub
853   ret <4 x double> %neg1
854 }
855
856 ; (fma x, c1, (fmul x, c2)) -> (fmul x, c1+c2)
857
858 define <4 x float> @test_v4f32_fma_x_c1_fmul_x_c2(<4 x float> %x) #0 {
859 ; FMA-LABEL: test_v4f32_fma_x_c1_fmul_x_c2:
860 ; FMA:       # BB#0:
861 ; FMA-NEXT:    vmulps {{.*}}(%rip), %xmm0, %xmm0
862 ; FMA-NEXT:    retq
863 ;
864 ; FMA4-LABEL: test_v4f32_fma_x_c1_fmul_x_c2:
865 ; FMA4:       # BB#0:
866 ; FMA4-NEXT:    vmulps {{.*}}(%rip), %xmm0, %xmm0
867 ; FMA4-NEXT:    retq
868 ;
869 ; AVX512-LABEL: test_v4f32_fma_x_c1_fmul_x_c2:
870 ; AVX512:       # BB#0:
871 ; AVX512-NEXT:    vmulps {{.*}}(%rip){1to4}, %xmm0, %xmm0
872 ; AVX512-NEXT:    retq
873   %m0 = fmul <4 x float> %x, <float 1.0, float 2.0, float 3.0, float 4.0>
874   %m1 = fmul <4 x float> %x, <float 4.0, float 3.0, float 2.0, float 1.0>
875   %a  = fadd <4 x float> %m0, %m1
876   ret <4 x float> %a
877 }
878
879 ; (fma (fmul x, c1), c2, y) -> (fma x, c1*c2, y)
880
881 define <4 x float> @test_v4f32_fma_fmul_x_c1_c2_y(<4 x float> %x, <4 x float> %y) #0 {
882 ; FMA-LABEL: test_v4f32_fma_fmul_x_c1_c2_y:
883 ; FMA:       # BB#0:
884 ; FMA-NEXT:    vfmadd132ps {{.*}}(%rip), %xmm1, %xmm0
885 ; FMA-NEXT:    retq
886 ;
887 ; FMA4-LABEL: test_v4f32_fma_fmul_x_c1_c2_y:
888 ; FMA4:       # BB#0:
889 ; FMA4-NEXT:    vfmaddps %xmm1, {{.*}}(%rip), %xmm0, %xmm0
890 ; FMA4-NEXT:    retq
891 ;
892 ; AVX512-LABEL: test_v4f32_fma_fmul_x_c1_c2_y:
893 ; AVX512:       # BB#0:
894 ; AVX512-NEXT:    vfmadd231ps {{.*}}(%rip), %xmm0, %xmm1
895 ; AVX512-NEXT:    vmovaps %zmm1, %zmm0
896 ; AVX512-NEXT:    retq
897   %m0 = fmul <4 x float> %x,  <float 1.0, float 2.0, float 3.0, float 4.0>
898   %m1 = fmul <4 x float> %m0, <float 4.0, float 3.0, float 2.0, float 1.0>
899   %a  = fadd <4 x float> %m1, %y
900   ret <4 x float> %a
901 }
902
903 attributes #0 = { "unsafe-fp-math"="true" }