Improved the operands commute transformation for X86-FMA3 instructions.
[oota-llvm.git] / test / CodeGen / X86 / fma-commute-x86.ll
1 ; RUN: llc < %s -mtriple=x86_64-pc-win32 -mcpu=core-avx2 | FileCheck %s
2 ; RUN: llc < %s -mtriple=x86_64-pc-win32 -mattr=+fma,+fma4 | FileCheck %s
3 ; RUN: llc < %s -mcpu=bdver2 -mtriple=x86_64-pc-win32 -mattr=-fma4 | FileCheck %s
4
5 attributes #0 = { nounwind }
6
7 declare <4 x float> @llvm.x86.fma.vfmadd.ps(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
8 define <4 x float> @test_x86_fmadd_baa_ps(<4 x float> %a, <4 x float> %b) #0 {
9 ; CHECK-LABEL: test_x86_fmadd_baa_ps:
10 ; CHECK:       # BB#0:
11 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
12 ; CHECK-NEXT: vfmadd132ps (%rdx), %xmm0, %xmm0
13 ; CHECK-NEXT: retq
14   %res = call <4 x float> @llvm.x86.fma.vfmadd.ps(<4 x float> %b, <4 x float> %a, <4 x float> %a) nounwind
15   ret <4 x float> %res
16 }
17
18 define <4 x float> @test_x86_fmadd_aba_ps(<4 x float> %a, <4 x float> %b) #0 {
19 ; CHECK-LABEL: test_x86_fmadd_aba_ps:
20 ; CHECK:       # BB#0:
21 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
22 ; CHECK-NEXT: vfmadd231ps (%rdx), %xmm0, %xmm0
23 ; CHECK-NEXT: retq
24   %res = call <4 x float> @llvm.x86.fma.vfmadd.ps(<4 x float> %a, <4 x float> %b, <4 x float> %a) nounwind
25   ret <4 x float> %res
26 }
27
28 define <4 x float> @test_x86_fmadd_bba_ps(<4 x float> %a, <4 x float> %b) #0 {
29 ; CHECK-LABEL: test_x86_fmadd_bba_ps:
30 ; CHECK:       # BB#0:
31 ; CHECK-NEXT: vmovaps   (%rdx), %xmm0
32 ; CHECK-NEXT: vfmadd213ps (%rcx), %xmm0, %xmm0
33 ; CHECK-NEXT: retq
34   %res = call <4 x float> @llvm.x86.fma.vfmadd.ps(<4 x float> %b, <4 x float> %b, <4 x float> %a) nounwind
35   ret <4 x float> %res
36 }
37
38 declare <8 x float> @llvm.x86.fma.vfmadd.ps.256(<8 x float>, <8 x float>, <8 x float>) nounwind readnone
39 define <8 x float> @test_x86_fmadd_baa_ps_y(<8 x float> %a, <8 x float> %b) #0 {
40 ; CHECK-LABEL: test_x86_fmadd_baa_ps_y:
41 ; CHECK:       # BB#0:
42 ; CHECK-NEXT: vmovaps   (%rcx), %ymm0
43 ; CHECK-NEXT: vfmadd132ps (%rdx), %ymm0, %ymm0
44 ; CHECK-NEXT: retq
45   %res = call <8 x float> @llvm.x86.fma.vfmadd.ps.256(<8 x float> %b, <8 x float> %a, <8 x float> %a) nounwind
46   ret <8 x float> %res
47 }
48
49 define <8 x float> @test_x86_fmadd_aba_ps_y(<8 x float> %a, <8 x float> %b) #0 {
50 ; CHECK-LABEL: test_x86_fmadd_aba_ps_y:
51 ; CHECK:       # BB#0:
52 ; CHECK-NEXT: vmovaps   (%rcx), %ymm0
53 ; CHECK-NEXT: vfmadd231ps (%rdx), %ymm0, %ymm0
54 ; CHECK-NEXT: retq
55   %res = call <8 x float> @llvm.x86.fma.vfmadd.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %a) nounwind
56   ret <8 x float> %res
57 }
58
59 define <8 x float> @test_x86_fmadd_bba_ps_y(<8 x float> %a, <8 x float> %b) #0 {
60 ; CHECK-LABEL: test_x86_fmadd_bba_ps_y:
61 ; CHECK:       # BB#0:
62 ; CHECK-NEXT: vmovaps   (%rdx), %ymm0
63 ; CHECK-NEXT: vfmadd213ps (%rcx), %ymm0, %ymm0
64 ; CHECK-NEXT: retq
65   %res = call <8 x float> @llvm.x86.fma.vfmadd.ps.256(<8 x float> %b, <8 x float> %b, <8 x float> %a) nounwind
66   ret <8 x float> %res
67 }
68
69 declare <2 x double> @llvm.x86.fma.vfmadd.pd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
70 define <2 x double> @test_x86_fmadd_baa_pd(<2 x double> %a, <2 x double> %b) #0 {
71 ; CHECK-LABEL: test_x86_fmadd_baa_pd:
72 ; CHECK:       # BB#0:
73 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
74 ; CHECK-NEXT: vfmadd132pd (%rdx), %xmm0, %xmm0
75 ; CHECK-NEXT: retq
76   %res = call <2 x double> @llvm.x86.fma.vfmadd.pd(<2 x double> %b, <2 x double> %a, <2 x double> %a) nounwind
77   ret <2 x double> %res
78 }
79
80 define <2 x double> @test_x86_fmadd_aba_pd(<2 x double> %a, <2 x double> %b) #0 {
81 ; CHECK-LABEL: test_x86_fmadd_aba_pd:
82 ; CHECK:       # BB#0:
83 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
84 ; CHECK-NEXT: vfmadd231pd (%rdx), %xmm0, %xmm0
85 ; CHECK-NEXT: retq
86   %res = call <2 x double> @llvm.x86.fma.vfmadd.pd(<2 x double> %a, <2 x double> %b, <2 x double> %a) nounwind
87   ret <2 x double> %res
88 }
89
90 define <2 x double> @test_x86_fmadd_bba_pd(<2 x double> %a, <2 x double> %b) #0 {
91 ; CHECK-LABEL: test_x86_fmadd_bba_pd:
92 ; CHECK:       # BB#0:
93 ; CHECK-NEXT: vmovapd   (%rdx), %xmm0
94 ; CHECK-NEXT: vfmadd213pd (%rcx), %xmm0, %xmm0
95 ; CHECK-NEXT: retq
96   %res = call <2 x double> @llvm.x86.fma.vfmadd.pd(<2 x double> %b, <2 x double> %b, <2 x double> %a) nounwind
97   ret <2 x double> %res
98 }
99
100 declare <4 x double> @llvm.x86.fma.vfmadd.pd.256(<4 x double>, <4 x double>, <4 x double>) nounwind readnone
101 define <4 x double> @test_x86_fmadd_baa_pd_y(<4 x double> %a, <4 x double> %b) #0 {
102 ; CHECK-LABEL: test_x86_fmadd_baa_pd_y:
103 ; CHECK:       # BB#0:
104 ; CHECK-NEXT: vmovapd   (%rcx), %ymm0
105 ; CHECK-NEXT: vfmadd132pd (%rdx), %ymm0, %ymm0
106 ; CHECK-NEXT: retq
107   %res = call <4 x double> @llvm.x86.fma.vfmadd.pd.256(<4 x double> %b, <4 x double> %a, <4 x double> %a) nounwind
108   ret <4 x double> %res
109 }
110
111 define <4 x double> @test_x86_fmadd_aba_pd_y(<4 x double> %a, <4 x double> %b) #0 {
112 ; CHECK-LABEL: test_x86_fmadd_aba_pd_y:
113 ; CHECK:       # BB#0:
114 ; CHECK-NEXT: vmovapd   (%rcx), %ymm0
115 ; CHECK-NEXT: vfmadd231pd (%rdx), %ymm0, %ymm0
116 ; CHECK-NEXT: retq
117   %res = call <4 x double> @llvm.x86.fma.vfmadd.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %a) nounwind
118   ret <4 x double> %res
119 }
120
121 define <4 x double> @test_x86_fmadd_bba_pd_y(<4 x double> %a, <4 x double> %b) #0 {
122 ; CHECK-LABEL: test_x86_fmadd_bba_pd_y:
123 ; CHECK:       # BB#0:
124 ; CHECK-NEXT: vmovapd   (%rdx), %ymm0
125 ; CHECK-NEXT: vfmadd213pd (%rcx), %ymm0, %ymm0
126 ; CHECK-NEXT: retq
127   %res = call <4 x double> @llvm.x86.fma.vfmadd.pd.256(<4 x double> %b, <4 x double> %b, <4 x double> %a) nounwind
128   ret <4 x double> %res
129 }
130
131
132
133 declare <4 x float> @llvm.x86.fma.vfnmadd.ps(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
134 define <4 x float> @test_x86_fnmadd_baa_ps(<4 x float> %a, <4 x float> %b) #0 {
135 ; CHECK-LABEL: test_x86_fnmadd_baa_ps:
136 ; CHECK:       # BB#0:
137 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
138 ; CHECK-NEXT: vfnmadd132ps (%rdx), %xmm0, %xmm0
139 ; CHECK-NEXT: retq
140   %res = call <4 x float> @llvm.x86.fma.vfnmadd.ps(<4 x float> %b, <4 x float> %a, <4 x float> %a) nounwind
141   ret <4 x float> %res
142 }
143
144 define <4 x float> @test_x86_fnmadd_aba_ps(<4 x float> %a, <4 x float> %b) #0 {
145 ; CHECK-LABEL: test_x86_fnmadd_aba_ps:
146 ; CHECK:       # BB#0:
147 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
148 ; CHECK-NEXT: vfnmadd231ps (%rdx), %xmm0, %xmm0
149 ; CHECK-NEXT: retq
150   %res = call <4 x float> @llvm.x86.fma.vfnmadd.ps(<4 x float> %a, <4 x float> %b, <4 x float> %a) nounwind
151   ret <4 x float> %res
152 }
153
154 define <4 x float> @test_x86_fnmadd_bba_ps(<4 x float> %a, <4 x float> %b) #0 {
155 ; CHECK-LABEL: test_x86_fnmadd_bba_ps:
156 ; CHECK:       # BB#0:
157 ; CHECK-NEXT: vmovaps   (%rdx), %xmm0
158 ; CHECK-NEXT: vfnmadd213ps (%rcx), %xmm0, %xmm0
159 ; CHECK-NEXT: retq
160   %res = call <4 x float> @llvm.x86.fma.vfnmadd.ps(<4 x float> %b, <4 x float> %b, <4 x float> %a) nounwind
161   ret <4 x float> %res
162 }
163
164 declare <8 x float> @llvm.x86.fma.vfnmadd.ps.256(<8 x float>, <8 x float>, <8 x float>) nounwind readnone
165 define <8 x float> @test_x86_fnmadd_baa_ps_y(<8 x float> %a, <8 x float> %b) #0 {
166 ; CHECK-LABEL: test_x86_fnmadd_baa_ps_y:
167 ; CHECK:       # BB#0:
168 ; CHECK-NEXT: vmovaps   (%rcx), %ymm0
169 ; CHECK-NEXT: vfnmadd132ps (%rdx), %ymm0, %ymm0
170 ; CHECK-NEXT: retq
171   %res = call <8 x float> @llvm.x86.fma.vfnmadd.ps.256(<8 x float> %b, <8 x float> %a, <8 x float> %a) nounwind
172   ret <8 x float> %res
173 }
174
175 define <8 x float> @test_x86_fnmadd_aba_ps_y(<8 x float> %a, <8 x float> %b) #0 {
176 ; CHECK-LABEL: test_x86_fnmadd_aba_ps_y:
177 ; CHECK:       # BB#0:
178 ; CHECK-NEXT: vmovaps   (%rcx), %ymm0
179 ; CHECK-NEXT: vfnmadd231ps (%rdx), %ymm0, %ymm0
180 ; CHECK-NEXT: retq
181   %res = call <8 x float> @llvm.x86.fma.vfnmadd.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %a) nounwind
182   ret <8 x float> %res
183 }
184
185 define <8 x float> @test_x86_fnmadd_bba_ps_y(<8 x float> %a, <8 x float> %b) #0 {
186 ; CHECK-LABEL: test_x86_fnmadd_bba_ps_y:
187 ; CHECK:       # BB#0:
188 ; CHECK-NEXT: vmovaps   (%rdx), %ymm0
189 ; CHECK-NEXT: vfnmadd213ps (%rcx), %ymm0, %ymm0
190 ; CHECK-NEXT: retq
191   %res = call <8 x float> @llvm.x86.fma.vfnmadd.ps.256(<8 x float> %b, <8 x float> %b, <8 x float> %a) nounwind
192   ret <8 x float> %res
193 }
194
195 declare <2 x double> @llvm.x86.fma.vfnmadd.pd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
196 define <2 x double> @test_x86_fnmadd_baa_pd(<2 x double> %a, <2 x double> %b) #0 {
197 ; CHECK-LABEL: test_x86_fnmadd_baa_pd:
198 ; CHECK:       # BB#0:
199 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
200 ; CHECK-NEXT: vfnmadd132pd (%rdx), %xmm0, %xmm0
201 ; CHECK-NEXT: retq
202   %res = call <2 x double> @llvm.x86.fma.vfnmadd.pd(<2 x double> %b, <2 x double> %a, <2 x double> %a) nounwind
203   ret <2 x double> %res
204 }
205
206 define <2 x double> @test_x86_fnmadd_aba_pd(<2 x double> %a, <2 x double> %b) #0 {
207 ; CHECK-LABEL: test_x86_fnmadd_aba_pd:
208 ; CHECK:       # BB#0:
209 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
210 ; CHECK-NEXT: vfnmadd231pd (%rdx), %xmm0, %xmm0
211 ; CHECK-NEXT: retq
212   %res = call <2 x double> @llvm.x86.fma.vfnmadd.pd(<2 x double> %a, <2 x double> %b, <2 x double> %a) nounwind
213   ret <2 x double> %res
214 }
215
216 define <2 x double> @test_x86_fnmadd_bba_pd(<2 x double> %a, <2 x double> %b) #0 {
217 ; CHECK-LABEL: test_x86_fnmadd_bba_pd:
218 ; CHECK:       # BB#0:
219 ; CHECK-NEXT: vmovapd   (%rdx), %xmm0
220 ; CHECK-NEXT: vfnmadd213pd (%rcx), %xmm0, %xmm0
221 ; CHECK-NEXT: retq
222   %res = call <2 x double> @llvm.x86.fma.vfnmadd.pd(<2 x double> %b, <2 x double> %b, <2 x double> %a) nounwind
223   ret <2 x double> %res
224 }
225
226 declare <4 x double> @llvm.x86.fma.vfnmadd.pd.256(<4 x double>, <4 x double>, <4 x double>) nounwind readnone
227 define <4 x double> @test_x86_fnmadd_baa_pd_y(<4 x double> %a, <4 x double> %b) #0 {
228 ; CHECK-LABEL: test_x86_fnmadd_baa_pd_y:
229 ; CHECK:       # BB#0:
230 ; CHECK-NEXT: vmovapd   (%rcx), %ymm0
231 ; CHECK-NEXT: vfnmadd132pd (%rdx), %ymm0, %ymm0
232 ; CHECK-NEXT: retq
233   %res = call <4 x double> @llvm.x86.fma.vfnmadd.pd.256(<4 x double> %b, <4 x double> %a, <4 x double> %a) nounwind
234   ret <4 x double> %res
235 }
236
237 define <4 x double> @test_x86_fnmadd_aba_pd_y(<4 x double> %a, <4 x double> %b) #0 {
238 ; CHECK-LABEL: test_x86_fnmadd_aba_pd_y:
239 ; CHECK:       # BB#0:
240 ; CHECK-NEXT: vmovapd   (%rcx), %ymm0
241 ; CHECK-NEXT: vfnmadd231pd (%rdx), %ymm0, %ymm0
242 ; CHECK-NEXT: retq
243   %res = call <4 x double> @llvm.x86.fma.vfnmadd.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %a) nounwind
244   ret <4 x double> %res
245 }
246
247 define <4 x double> @test_x86_fnmadd_bba_pd_y(<4 x double> %a, <4 x double> %b) #0 {
248 ; CHECK-LABEL: test_x86_fnmadd_bba_pd_y:
249 ; CHECK:       # BB#0:
250 ; CHECK-NEXT: vmovapd   (%rdx), %ymm0
251 ; CHECK-NEXT: vfnmadd213pd (%rcx), %ymm0, %ymm0
252 ; CHECK-NEXT: retq
253   %res = call <4 x double> @llvm.x86.fma.vfnmadd.pd.256(<4 x double> %b, <4 x double> %b, <4 x double> %a) nounwind
254   ret <4 x double> %res
255 }
256
257
258 declare <4 x float> @llvm.x86.fma.vfmsub.ps(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
259 define <4 x float> @test_x86_fmsub_baa_ps(<4 x float> %a, <4 x float> %b) #0 {
260 ; CHECK-LABEL: test_x86_fmsub_baa_ps:
261 ; CHECK:       # BB#0:
262 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
263 ; CHECK-NEXT: vfmsub132ps (%rdx), %xmm0, %xmm0
264 ; CHECK-NEXT: retq
265   %res = call <4 x float> @llvm.x86.fma.vfmsub.ps(<4 x float> %b, <4 x float> %a, <4 x float> %a) nounwind
266   ret <4 x float> %res
267 }
268
269 define <4 x float> @test_x86_fmsub_aba_ps(<4 x float> %a, <4 x float> %b) #0 {
270 ; CHECK-LABEL: test_x86_fmsub_aba_ps:
271 ; CHECK:       # BB#0:
272 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
273 ; CHECK-NEXT: vfmsub231ps (%rdx), %xmm0, %xmm0
274 ; CHECK-NEXT: retq
275   %res = call <4 x float> @llvm.x86.fma.vfmsub.ps(<4 x float> %a, <4 x float> %b, <4 x float> %a) nounwind
276   ret <4 x float> %res
277 }
278
279 define <4 x float> @test_x86_fmsub_bba_ps(<4 x float> %a, <4 x float> %b) #0 {
280 ; CHECK-LABEL: test_x86_fmsub_bba_ps:
281 ; CHECK:       # BB#0:
282 ; CHECK-NEXT: vmovaps   (%rdx), %xmm0
283 ; CHECK-NEXT: vfmsub213ps (%rcx), %xmm0, %xmm0
284 ; CHECK-NEXT: retq
285   %res = call <4 x float> @llvm.x86.fma.vfmsub.ps(<4 x float> %b, <4 x float> %b, <4 x float> %a) nounwind
286   ret <4 x float> %res
287 }
288
289 declare <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float>, <8 x float>, <8 x float>) nounwind readnone
290 define <8 x float> @test_x86_fmsub_baa_ps_y(<8 x float> %a, <8 x float> %b) #0 {
291 ; CHECK-LABEL: test_x86_fmsub_baa_ps_y:
292 ; CHECK:       # BB#0:
293 ; CHECK-NEXT: vmovaps   (%rcx), %ymm0
294 ; CHECK-NEXT: vfmsub132ps (%rdx), %ymm0, %ymm0
295 ; CHECK-NEXT: retq
296   %res = call <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float> %b, <8 x float> %a, <8 x float> %a) nounwind
297   ret <8 x float> %res
298 }
299
300 define <8 x float> @test_x86_fmsub_aba_ps_y(<8 x float> %a, <8 x float> %b) #0 {
301 ; CHECK-LABEL: test_x86_fmsub_aba_ps_y:
302 ; CHECK:       # BB#0:
303 ; CHECK-NEXT: vmovaps   (%rcx), %ymm0
304 ; CHECK-NEXT: vfmsub231ps (%rdx), %ymm0, %ymm0
305 ; CHECK-NEXT: retq
306   %res = call <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %a) nounwind
307   ret <8 x float> %res
308 }
309
310 define <8 x float> @test_x86_fmsub_bba_ps_y(<8 x float> %a, <8 x float> %b) #0 {
311 ; CHECK-LABEL: test_x86_fmsub_bba_ps_y:
312 ; CHECK:       # BB#0:
313 ; CHECK-NEXT: vmovaps   (%rdx), %ymm0
314 ; CHECK-NEXT: vfmsub213ps (%rcx), %ymm0, %ymm0
315 ; CHECK-NEXT: retq
316   %res = call <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float> %b, <8 x float> %b, <8 x float> %a) nounwind
317   ret <8 x float> %res
318 }
319
320 declare <2 x double> @llvm.x86.fma.vfmsub.pd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
321 define <2 x double> @test_x86_fmsub_baa_pd(<2 x double> %a, <2 x double> %b) #0 {
322 ; CHECK-LABEL: test_x86_fmsub_baa_pd:
323 ; CHECK:       # BB#0:
324 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
325 ; CHECK-NEXT: vfmsub132pd (%rdx), %xmm0, %xmm0
326 ; CHECK-NEXT: retq
327   %res = call <2 x double> @llvm.x86.fma.vfmsub.pd(<2 x double> %b, <2 x double> %a, <2 x double> %a) nounwind
328   ret <2 x double> %res
329 }
330
331 define <2 x double> @test_x86_fmsub_aba_pd(<2 x double> %a, <2 x double> %b) #0 {
332 ; CHECK-LABEL: test_x86_fmsub_aba_pd:
333 ; CHECK:       # BB#0:
334 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
335 ; CHECK-NEXT: vfmsub231pd (%rdx), %xmm0, %xmm0
336 ; CHECK-NEXT: retq
337   %res = call <2 x double> @llvm.x86.fma.vfmsub.pd(<2 x double> %a, <2 x double> %b, <2 x double> %a) nounwind
338   ret <2 x double> %res
339 }
340
341 define <2 x double> @test_x86_fmsub_bba_pd(<2 x double> %a, <2 x double> %b) #0 {
342 ; CHECK-LABEL: test_x86_fmsub_bba_pd:
343 ; CHECK:       # BB#0:
344 ; CHECK-NEXT: vmovapd   (%rdx), %xmm0
345 ; CHECK-NEXT: vfmsub213pd (%rcx), %xmm0, %xmm0
346 ; CHECK-NEXT: retq
347   %res = call <2 x double> @llvm.x86.fma.vfmsub.pd(<2 x double> %b, <2 x double> %b, <2 x double> %a) nounwind
348   ret <2 x double> %res
349 }
350
351 declare <4 x double> @llvm.x86.fma.vfmsub.pd.256(<4 x double>, <4 x double>, <4 x double>) nounwind readnone
352 define <4 x double> @test_x86_fmsub_baa_pd_y(<4 x double> %a, <4 x double> %b) #0 {
353 ; CHECK-LABEL: test_x86_fmsub_baa_pd_y:
354 ; CHECK:       # BB#0:
355 ; CHECK-NEXT: vmovapd   (%rcx), %ymm0
356 ; CHECK-NEXT: vfmsub132pd (%rdx), %ymm0, %ymm0
357 ; CHECK-NEXT: retq
358   %res = call <4 x double> @llvm.x86.fma.vfmsub.pd.256(<4 x double> %b, <4 x double> %a, <4 x double> %a) nounwind
359   ret <4 x double> %res
360 }
361
362 define <4 x double> @test_x86_fmsub_aba_pd_y(<4 x double> %a, <4 x double> %b) #0 {
363 ; CHECK-LABEL: test_x86_fmsub_aba_pd_y:
364 ; CHECK:       # BB#0:
365 ; CHECK-NEXT: vmovapd   (%rcx), %ymm0
366 ; CHECK-NEXT: vfmsub231pd (%rdx), %ymm0, %ymm0
367 ; CHECK-NEXT: retq
368   %res = call <4 x double> @llvm.x86.fma.vfmsub.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %a) nounwind
369   ret <4 x double> %res
370 }
371
372 define <4 x double> @test_x86_fmsub_bba_pd_y(<4 x double> %a, <4 x double> %b) #0 {
373 ; CHECK-LABEL: test_x86_fmsub_bba_pd_y:
374 ; CHECK:       # BB#0:
375 ; CHECK-NEXT: vmovapd   (%rdx), %ymm0
376 ; CHECK-NEXT: vfmsub213pd (%rcx), %ymm0, %ymm0
377 ; CHECK-NEXT: retq
378   %res = call <4 x double> @llvm.x86.fma.vfmsub.pd.256(<4 x double> %b, <4 x double> %b, <4 x double> %a) nounwind
379   ret <4 x double> %res
380 }
381
382
383 declare <4 x float> @llvm.x86.fma.vfnmsub.ps(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
384 define <4 x float> @test_x86_fnmsub_baa_ps(<4 x float> %a, <4 x float> %b) #0 {
385 ; CHECK-LABEL: test_x86_fnmsub_baa_ps:
386 ; CHECK:       # BB#0:
387 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
388 ; CHECK-NEXT: vfnmsub132ps (%rdx), %xmm0, %xmm0
389 ; CHECK-NEXT: retq
390   %res = call <4 x float> @llvm.x86.fma.vfnmsub.ps(<4 x float> %b, <4 x float> %a, <4 x float> %a) nounwind
391   ret <4 x float> %res
392 }
393
394 define <4 x float> @test_x86_fnmsub_aba_ps(<4 x float> %a, <4 x float> %b) #0 {
395 ; CHECK-LABEL: test_x86_fnmsub_aba_ps:
396 ; CHECK:       # BB#0:
397 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
398 ; CHECK-NEXT: vfnmsub231ps (%rdx), %xmm0, %xmm0
399 ; CHECK-NEXT: retq
400   %res = call <4 x float> @llvm.x86.fma.vfnmsub.ps(<4 x float> %a, <4 x float> %b, <4 x float> %a) nounwind
401   ret <4 x float> %res
402 }
403
404 define <4 x float> @test_x86_fnmsub_bba_ps(<4 x float> %a, <4 x float> %b) #0 {
405 ; CHECK-LABEL: test_x86_fnmsub_bba_ps:
406 ; CHECK:       # BB#0:
407 ; CHECK-NEXT: vmovaps   (%rdx), %xmm0
408 ; CHECK-NEXT: vfnmsub213ps (%rcx), %xmm0, %xmm0
409 ; CHECK-NEXT: retq
410   %res = call <4 x float> @llvm.x86.fma.vfnmsub.ps(<4 x float> %b, <4 x float> %b, <4 x float> %a) nounwind
411   ret <4 x float> %res
412 }
413
414 declare <8 x float> @llvm.x86.fma.vfnmsub.ps.256(<8 x float>, <8 x float>, <8 x float>) nounwind readnone
415 define <8 x float> @test_x86_fnmsub_baa_ps_y(<8 x float> %a, <8 x float> %b) #0 {
416 ; CHECK-LABEL: test_x86_fnmsub_baa_ps_y:
417 ; CHECK:       # BB#0:
418 ; CHECK-NEXT: vmovaps   (%rcx), %ymm0
419 ; CHECK-NEXT: vfnmsub132ps (%rdx), %ymm0, %ymm0
420 ; CHECK-NEXT: retq
421   %res = call <8 x float> @llvm.x86.fma.vfnmsub.ps.256(<8 x float> %b, <8 x float> %a, <8 x float> %a) nounwind
422   ret <8 x float> %res
423 }
424
425 define <8 x float> @test_x86_fnmsub_aba_ps_y(<8 x float> %a, <8 x float> %b) #0 {
426 ; CHECK-LABEL: test_x86_fnmsub_aba_ps_y:
427 ; CHECK:       # BB#0:
428 ; CHECK-NEXT: vmovaps   (%rcx), %ymm0
429 ; CHECK-NEXT: vfnmsub231ps (%rdx), %ymm0, %ymm0
430 ; CHECK-NEXT: retq
431   %res = call <8 x float> @llvm.x86.fma.vfnmsub.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %a) nounwind
432   ret <8 x float> %res
433 }
434
435 define <8 x float> @test_x86_fnmsub_bba_ps_y(<8 x float> %a, <8 x float> %b) #0 {
436 ; CHECK-LABEL: test_x86_fnmsub_bba_ps_y:
437 ; CHECK:       # BB#0:
438 ; CHECK-NEXT: vmovaps   (%rdx), %ymm0
439 ; CHECK-NEXT: vfnmsub213ps (%rcx), %ymm0, %ymm0
440 ; CHECK-NEXT: retq
441   %res = call <8 x float> @llvm.x86.fma.vfnmsub.ps.256(<8 x float> %b, <8 x float> %b, <8 x float> %a) nounwind
442   ret <8 x float> %res
443 }
444
445 declare <2 x double> @llvm.x86.fma.vfnmsub.pd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
446 define <2 x double> @test_x86_fnmsub_baa_pd(<2 x double> %a, <2 x double> %b) #0 {
447 ; CHECK-LABEL: test_x86_fnmsub_baa_pd:
448 ; CHECK:       # BB#0:
449 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
450 ; CHECK-NEXT: vfnmsub132pd (%rdx), %xmm0, %xmm0
451 ; CHECK-NEXT: retq
452   %res = call <2 x double> @llvm.x86.fma.vfnmsub.pd(<2 x double> %b, <2 x double> %a, <2 x double> %a) nounwind
453   ret <2 x double> %res
454 }
455
456 define <2 x double> @test_x86_fnmsub_aba_pd(<2 x double> %a, <2 x double> %b) #0 {
457 ; CHECK-LABEL: test_x86_fnmsub_aba_pd:
458 ; CHECK:       # BB#0:
459 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
460 ; CHECK-NEXT: vfnmsub231pd (%rdx), %xmm0, %xmm0
461 ; CHECK-NEXT: retq
462   %res = call <2 x double> @llvm.x86.fma.vfnmsub.pd(<2 x double> %a, <2 x double> %b, <2 x double> %a) nounwind
463   ret <2 x double> %res
464 }
465
466 define <2 x double> @test_x86_fnmsub_bba_pd(<2 x double> %a, <2 x double> %b) #0 {
467 ; CHECK-LABEL: test_x86_fnmsub_bba_pd:
468 ; CHECK:       # BB#0:
469 ; CHECK-NEXT: vmovapd   (%rdx), %xmm0
470 ; CHECK-NEXT: vfnmsub213pd (%rcx), %xmm0, %xmm0
471 ; CHECK-NEXT: retq
472   %res = call <2 x double> @llvm.x86.fma.vfnmsub.pd(<2 x double> %b, <2 x double> %b, <2 x double> %a) nounwind
473   ret <2 x double> %res
474 }
475
476 declare <4 x double> @llvm.x86.fma.vfnmsub.pd.256(<4 x double>, <4 x double>, <4 x double>) nounwind readnone
477 define <4 x double> @test_x86_fnmsub_baa_pd_y(<4 x double> %a, <4 x double> %b) #0 {
478 ; CHECK-LABEL: test_x86_fnmsub_baa_pd_y:
479 ; CHECK:       # BB#0:
480 ; CHECK-NEXT: vmovapd   (%rcx), %ymm0
481 ; CHECK-NEXT: vfnmsub132pd (%rdx), %ymm0, %ymm0
482 ; CHECK-NEXT: retq
483   %res = call <4 x double> @llvm.x86.fma.vfnmsub.pd.256(<4 x double> %b, <4 x double> %a, <4 x double> %a) nounwind
484   ret <4 x double> %res
485 }
486
487 define <4 x double> @test_x86_fnmsub_aba_pd_y(<4 x double> %a, <4 x double> %b) #0 {
488 ; CHECK-LABEL: test_x86_fnmsub_aba_pd_y:
489 ; CHECK:       # BB#0:
490 ; CHECK-NEXT: vmovapd   (%rcx), %ymm0
491 ; CHECK-NEXT: vfnmsub231pd (%rdx), %ymm0, %ymm0
492 ; CHECK-NEXT: retq
493   %res = call <4 x double> @llvm.x86.fma.vfnmsub.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %a) nounwind
494   ret <4 x double> %res
495 }
496
497 define <4 x double> @test_x86_fnmsub_bba_pd_y(<4 x double> %a, <4 x double> %b) #0 {
498 ; CHECK-LABEL: test_x86_fnmsub_bba_pd_y:
499 ; CHECK:       # BB#0:
500 ; CHECK-NEXT: vmovapd   (%rdx), %ymm0
501 ; CHECK-NEXT: vfnmsub213pd (%rcx), %ymm0, %ymm0
502 ; CHECK-NEXT: retq
503   %res = call <4 x double> @llvm.x86.fma.vfnmsub.pd.256(<4 x double> %b, <4 x double> %b, <4 x double> %a) nounwind
504   ret <4 x double> %res
505 }
506