Taints the non-acquire RMW's store address with the load part
[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 | 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.ss(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
8 define <4 x float> @test_x86_fmadd_baa_ss(<4 x float> %a, <4 x float> %b) #0 {
9 ; CHECK-LABEL: test_x86_fmadd_baa_ss:
10 ; CHECK:       # BB#0:
11 ; CHECK-NEXT: vmovaps {{\(%rdx\), %xmm0|\(%rcx\), %xmm1}}
12 ; CHECK-NEXT: vmovaps {{\(%rdx\), %xmm0|\(%rcx\), %xmm1}}
13 ; CHECK-NEXT: vfmadd213ss %xmm1, %xmm1, %xmm0
14 ; CHECK-NEXT: retq
15   %res = call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %b, <4 x float> %a, <4 x float> %a) nounwind
16   ret <4 x float> %res
17 }
18
19 define <4 x float> @test_x86_fmadd_aba_ss(<4 x float> %a, <4 x float> %b) #0 {
20 ; CHECK-LABEL: test_x86_fmadd_aba_ss:
21 ; CHECK:       # BB#0:
22 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
23 ; CHECK-NEXT: vfmadd132ss (%rdx), %xmm0, %xmm0
24 ; CHECK-NEXT: retq
25   %res = call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %a, <4 x float> %b, <4 x float> %a) nounwind
26   ret <4 x float> %res
27 }
28
29 define <4 x float> @test_x86_fmadd_bba_ss(<4 x float> %a, <4 x float> %b) #0 {
30 ; CHECK-LABEL: test_x86_fmadd_bba_ss:
31 ; CHECK:       # BB#0:
32 ; CHECK-NEXT: vmovaps   (%rdx), %xmm0
33 ; CHECK-NEXT: vfmadd213ss (%rcx), %xmm0, %xmm0
34 ; CHECK-NEXT: retq
35   %res = call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %b, <4 x float> %b, <4 x float> %a) nounwind
36   ret <4 x float> %res
37 }
38
39 declare <4 x float> @llvm.x86.fma.vfmadd.ps(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
40 define <4 x float> @test_x86_fmadd_baa_ps(<4 x float> %a, <4 x float> %b) #0 {
41 ; CHECK-LABEL: test_x86_fmadd_baa_ps:
42 ; CHECK:       # BB#0:
43 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
44 ; CHECK-NEXT: vfmadd132ps (%rdx), %xmm0, %xmm0
45 ; CHECK-NEXT: retq
46   %res = call <4 x float> @llvm.x86.fma.vfmadd.ps(<4 x float> %b, <4 x float> %a, <4 x float> %a) nounwind
47   ret <4 x float> %res
48 }
49
50 define <4 x float> @test_x86_fmadd_aba_ps(<4 x float> %a, <4 x float> %b) #0 {
51 ; CHECK-LABEL: test_x86_fmadd_aba_ps:
52 ; CHECK:       # BB#0:
53 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
54 ; CHECK-NEXT: vfmadd231ps (%rdx), %xmm0, %xmm0
55 ; CHECK-NEXT: retq
56   %res = call <4 x float> @llvm.x86.fma.vfmadd.ps(<4 x float> %a, <4 x float> %b, <4 x float> %a) nounwind
57   ret <4 x float> %res
58 }
59
60 define <4 x float> @test_x86_fmadd_bba_ps(<4 x float> %a, <4 x float> %b) #0 {
61 ; CHECK-LABEL: test_x86_fmadd_bba_ps:
62 ; CHECK:       # BB#0:
63 ; CHECK-NEXT: vmovaps   (%rdx), %xmm0
64 ; CHECK-NEXT: vfmadd213ps (%rcx), %xmm0, %xmm0
65 ; CHECK-NEXT: retq
66   %res = call <4 x float> @llvm.x86.fma.vfmadd.ps(<4 x float> %b, <4 x float> %b, <4 x float> %a) nounwind
67   ret <4 x float> %res
68 }
69
70 declare <8 x float> @llvm.x86.fma.vfmadd.ps.256(<8 x float>, <8 x float>, <8 x float>) nounwind readnone
71 define <8 x float> @test_x86_fmadd_baa_ps_y(<8 x float> %a, <8 x float> %b) #0 {
72 ; CHECK-LABEL: test_x86_fmadd_baa_ps_y:
73 ; CHECK:       # BB#0:
74 ; CHECK-NEXT: vmovaps   (%rcx), %ymm0
75 ; CHECK-NEXT: vfmadd132ps (%rdx), %ymm0, %ymm0
76 ; CHECK-NEXT: retq
77   %res = call <8 x float> @llvm.x86.fma.vfmadd.ps.256(<8 x float> %b, <8 x float> %a, <8 x float> %a) nounwind
78   ret <8 x float> %res
79 }
80
81 define <8 x float> @test_x86_fmadd_aba_ps_y(<8 x float> %a, <8 x float> %b) #0 {
82 ; CHECK-LABEL: test_x86_fmadd_aba_ps_y:
83 ; CHECK:       # BB#0:
84 ; CHECK-NEXT: vmovaps   (%rcx), %ymm0
85 ; CHECK-NEXT: vfmadd231ps (%rdx), %ymm0, %ymm0
86 ; CHECK-NEXT: retq
87   %res = call <8 x float> @llvm.x86.fma.vfmadd.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %a) nounwind
88   ret <8 x float> %res
89 }
90
91 define <8 x float> @test_x86_fmadd_bba_ps_y(<8 x float> %a, <8 x float> %b) #0 {
92 ; CHECK-LABEL: test_x86_fmadd_bba_ps_y:
93 ; CHECK:       # BB#0:
94 ; CHECK-NEXT: vmovaps   (%rdx), %ymm0
95 ; CHECK-NEXT: vfmadd213ps (%rcx), %ymm0, %ymm0
96 ; CHECK-NEXT: retq
97   %res = call <8 x float> @llvm.x86.fma.vfmadd.ps.256(<8 x float> %b, <8 x float> %b, <8 x float> %a) nounwind
98   ret <8 x float> %res
99 }
100
101 declare <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
102 define <2 x double> @test_x86_fmadd_baa_sd(<2 x double> %a, <2 x double> %b) #0 {
103 ; CHECK-LABEL: test_x86_fmadd_baa_sd:
104 ; CHECK:       # BB#0:
105 ; CHECK-NEXT: vmovapd {{\(%rdx\), %xmm0|\(%rcx\), %xmm1}}
106 ; CHECK-NEXT: vmovapd {{\(%rdx\), %xmm0|\(%rcx\), %xmm1}}
107 ; CHECK-NEXT: vfmadd213sd %xmm1, %xmm1, %xmm0
108 ; CHECK-NEXT: retq
109   %res = call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %b, <2 x double> %a, <2 x double> %a) nounwind
110   ret <2 x double> %res
111 }
112
113 define <2 x double> @test_x86_fmadd_aba_sd(<2 x double> %a, <2 x double> %b) #0 {
114 ; CHECK-LABEL: test_x86_fmadd_aba_sd:
115 ; CHECK:       # BB#0:
116 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
117 ; CHECK-NEXT: vfmadd132sd (%rdx), %xmm0, %xmm0
118 ; CHECK-NEXT: retq
119   %res = call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %a, <2 x double> %b, <2 x double> %a) nounwind
120   ret <2 x double> %res
121 }
122
123 define <2 x double> @test_x86_fmadd_bba_sd(<2 x double> %a, <2 x double> %b) #0 {
124 ; CHECK-LABEL: test_x86_fmadd_bba_sd:
125 ; CHECK:       # BB#0:
126 ; CHECK-NEXT: vmovapd   (%rdx), %xmm0
127 ; CHECK-NEXT: vfmadd213sd (%rcx), %xmm0, %xmm0
128 ; CHECK-NEXT: retq
129   %res = call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %b, <2 x double> %b, <2 x double> %a) nounwind
130   ret <2 x double> %res
131 }
132
133 declare <2 x double> @llvm.x86.fma.vfmadd.pd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
134 define <2 x double> @test_x86_fmadd_baa_pd(<2 x double> %a, <2 x double> %b) #0 {
135 ; CHECK-LABEL: test_x86_fmadd_baa_pd:
136 ; CHECK:       # BB#0:
137 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
138 ; CHECK-NEXT: vfmadd132pd (%rdx), %xmm0, %xmm0
139 ; CHECK-NEXT: retq
140   %res = call <2 x double> @llvm.x86.fma.vfmadd.pd(<2 x double> %b, <2 x double> %a, <2 x double> %a) nounwind
141   ret <2 x double> %res
142 }
143
144 define <2 x double> @test_x86_fmadd_aba_pd(<2 x double> %a, <2 x double> %b) #0 {
145 ; CHECK-LABEL: test_x86_fmadd_aba_pd:
146 ; CHECK:       # BB#0:
147 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
148 ; CHECK-NEXT: vfmadd231pd (%rdx), %xmm0, %xmm0
149 ; CHECK-NEXT: retq
150   %res = call <2 x double> @llvm.x86.fma.vfmadd.pd(<2 x double> %a, <2 x double> %b, <2 x double> %a) nounwind
151   ret <2 x double> %res
152 }
153
154 define <2 x double> @test_x86_fmadd_bba_pd(<2 x double> %a, <2 x double> %b) #0 {
155 ; CHECK-LABEL: test_x86_fmadd_bba_pd:
156 ; CHECK:       # BB#0:
157 ; CHECK-NEXT: vmovapd   (%rdx), %xmm0
158 ; CHECK-NEXT: vfmadd213pd (%rcx), %xmm0, %xmm0
159 ; CHECK-NEXT: retq
160   %res = call <2 x double> @llvm.x86.fma.vfmadd.pd(<2 x double> %b, <2 x double> %b, <2 x double> %a) nounwind
161   ret <2 x double> %res
162 }
163
164 declare <4 x double> @llvm.x86.fma.vfmadd.pd.256(<4 x double>, <4 x double>, <4 x double>) nounwind readnone
165 define <4 x double> @test_x86_fmadd_baa_pd_y(<4 x double> %a, <4 x double> %b) #0 {
166 ; CHECK-LABEL: test_x86_fmadd_baa_pd_y:
167 ; CHECK:       # BB#0:
168 ; CHECK-NEXT: vmovapd   (%rcx), %ymm0
169 ; CHECK-NEXT: vfmadd132pd (%rdx), %ymm0, %ymm0
170 ; CHECK-NEXT: retq
171   %res = call <4 x double> @llvm.x86.fma.vfmadd.pd.256(<4 x double> %b, <4 x double> %a, <4 x double> %a) nounwind
172   ret <4 x double> %res
173 }
174
175 define <4 x double> @test_x86_fmadd_aba_pd_y(<4 x double> %a, <4 x double> %b) #0 {
176 ; CHECK-LABEL: test_x86_fmadd_aba_pd_y:
177 ; CHECK:       # BB#0:
178 ; CHECK-NEXT: vmovapd   (%rcx), %ymm0
179 ; CHECK-NEXT: vfmadd231pd (%rdx), %ymm0, %ymm0
180 ; CHECK-NEXT: retq
181   %res = call <4 x double> @llvm.x86.fma.vfmadd.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %a) nounwind
182   ret <4 x double> %res
183 }
184
185 define <4 x double> @test_x86_fmadd_bba_pd_y(<4 x double> %a, <4 x double> %b) #0 {
186 ; CHECK-LABEL: test_x86_fmadd_bba_pd_y:
187 ; CHECK:       # BB#0:
188 ; CHECK-NEXT: vmovapd   (%rdx), %ymm0
189 ; CHECK-NEXT: vfmadd213pd (%rcx), %ymm0, %ymm0
190 ; CHECK-NEXT: retq
191   %res = call <4 x double> @llvm.x86.fma.vfmadd.pd.256(<4 x double> %b, <4 x double> %b, <4 x double> %a) nounwind
192   ret <4 x double> %res
193 }
194
195
196 declare <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
197 define <4 x float> @test_x86_fnmadd_baa_ss(<4 x float> %a, <4 x float> %b) #0 {
198 ; CHECK-LABEL: test_x86_fnmadd_baa_ss:
199 ; CHECK:       # BB#0:
200 ; CHECK-NEXT: vmovaps {{\(%rdx\), %xmm0|\(%rcx\), %xmm1}}
201 ; CHECK-NEXT: vmovaps {{\(%rdx\), %xmm0|\(%rcx\), %xmm1}}
202 ; CHECK-NEXT: vfnmadd213ss %xmm1, %xmm1, %xmm0
203 ; CHECK-NEXT: retq
204   %res = call <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float> %b, <4 x float> %a, <4 x float> %a) nounwind
205   ret <4 x float> %res
206 }
207
208 define <4 x float> @test_x86_fnmadd_aba_ss(<4 x float> %a, <4 x float> %b) #0 {
209 ; CHECK-LABEL: test_x86_fnmadd_aba_ss:
210 ; CHECK:       # BB#0:
211 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
212 ; CHECK-NEXT: vfnmadd132ss (%rdx), %xmm0, %xmm0
213 ; CHECK-NEXT: retq
214   %res = call <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float> %a, <4 x float> %b, <4 x float> %a) nounwind
215   ret <4 x float> %res
216 }
217
218 define <4 x float> @test_x86_fnmadd_bba_ss(<4 x float> %a, <4 x float> %b) #0 {
219 ; CHECK-LABEL: test_x86_fnmadd_bba_ss:
220 ; CHECK:       # BB#0:
221 ; CHECK-NEXT: vmovaps   (%rdx), %xmm0
222 ; CHECK-NEXT: vfnmadd213ss (%rcx), %xmm0, %xmm0
223 ; CHECK-NEXT: retq
224   %res = call <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float> %b, <4 x float> %b, <4 x float> %a) nounwind
225   ret <4 x float> %res
226 }
227
228 declare <4 x float> @llvm.x86.fma.vfnmadd.ps(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
229 define <4 x float> @test_x86_fnmadd_baa_ps(<4 x float> %a, <4 x float> %b) #0 {
230 ; CHECK-LABEL: test_x86_fnmadd_baa_ps:
231 ; CHECK:       # BB#0:
232 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
233 ; CHECK-NEXT: vfnmadd132ps (%rdx), %xmm0, %xmm0
234 ; CHECK-NEXT: retq
235   %res = call <4 x float> @llvm.x86.fma.vfnmadd.ps(<4 x float> %b, <4 x float> %a, <4 x float> %a) nounwind
236   ret <4 x float> %res
237 }
238
239 define <4 x float> @test_x86_fnmadd_aba_ps(<4 x float> %a, <4 x float> %b) #0 {
240 ; CHECK-LABEL: test_x86_fnmadd_aba_ps:
241 ; CHECK:       # BB#0:
242 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
243 ; CHECK-NEXT: vfnmadd231ps (%rdx), %xmm0, %xmm0
244 ; CHECK-NEXT: retq
245   %res = call <4 x float> @llvm.x86.fma.vfnmadd.ps(<4 x float> %a, <4 x float> %b, <4 x float> %a) nounwind
246   ret <4 x float> %res
247 }
248
249 define <4 x float> @test_x86_fnmadd_bba_ps(<4 x float> %a, <4 x float> %b) #0 {
250 ; CHECK-LABEL: test_x86_fnmadd_bba_ps:
251 ; CHECK:       # BB#0:
252 ; CHECK-NEXT: vmovaps   (%rdx), %xmm0
253 ; CHECK-NEXT: vfnmadd213ps (%rcx), %xmm0, %xmm0
254 ; CHECK-NEXT: retq
255   %res = call <4 x float> @llvm.x86.fma.vfnmadd.ps(<4 x float> %b, <4 x float> %b, <4 x float> %a) nounwind
256   ret <4 x float> %res
257 }
258
259 declare <8 x float> @llvm.x86.fma.vfnmadd.ps.256(<8 x float>, <8 x float>, <8 x float>) nounwind readnone
260 define <8 x float> @test_x86_fnmadd_baa_ps_y(<8 x float> %a, <8 x float> %b) #0 {
261 ; CHECK-LABEL: test_x86_fnmadd_baa_ps_y:
262 ; CHECK:       # BB#0:
263 ; CHECK-NEXT: vmovaps   (%rcx), %ymm0
264 ; CHECK-NEXT: vfnmadd132ps (%rdx), %ymm0, %ymm0
265 ; CHECK-NEXT: retq
266   %res = call <8 x float> @llvm.x86.fma.vfnmadd.ps.256(<8 x float> %b, <8 x float> %a, <8 x float> %a) nounwind
267   ret <8 x float> %res
268 }
269
270 define <8 x float> @test_x86_fnmadd_aba_ps_y(<8 x float> %a, <8 x float> %b) #0 {
271 ; CHECK-LABEL: test_x86_fnmadd_aba_ps_y:
272 ; CHECK:       # BB#0:
273 ; CHECK-NEXT: vmovaps   (%rcx), %ymm0
274 ; CHECK-NEXT: vfnmadd231ps (%rdx), %ymm0, %ymm0
275 ; CHECK-NEXT: retq
276   %res = call <8 x float> @llvm.x86.fma.vfnmadd.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %a) nounwind
277   ret <8 x float> %res
278 }
279
280 define <8 x float> @test_x86_fnmadd_bba_ps_y(<8 x float> %a, <8 x float> %b) #0 {
281 ; CHECK-LABEL: test_x86_fnmadd_bba_ps_y:
282 ; CHECK:       # BB#0:
283 ; CHECK-NEXT: vmovaps   (%rdx), %ymm0
284 ; CHECK-NEXT: vfnmadd213ps (%rcx), %ymm0, %ymm0
285 ; CHECK-NEXT: retq
286   %res = call <8 x float> @llvm.x86.fma.vfnmadd.ps.256(<8 x float> %b, <8 x float> %b, <8 x float> %a) nounwind
287   ret <8 x float> %res
288 }
289
290 declare <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
291 define <2 x double> @test_x86_fnmadd_baa_sd(<2 x double> %a, <2 x double> %b) #0 {
292 ; CHECK-LABEL: test_x86_fnmadd_baa_sd:
293 ; CHECK:       # BB#0:
294 ; CHECK-NEXT: vmovapd {{\(%rdx\), %xmm0|\(%rcx\), %xmm1}}
295 ; CHECK-NEXT: vmovapd {{\(%rdx\), %xmm0|\(%rcx\), %xmm1}}
296 ; CHECK-NEXT: vfnmadd213sd %xmm1, %xmm1, %xmm0
297 ; CHECK-NEXT: retq
298   %res = call <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double> %b, <2 x double> %a, <2 x double> %a) nounwind
299   ret <2 x double> %res
300 }
301
302 define <2 x double> @test_x86_fnmadd_aba_sd(<2 x double> %a, <2 x double> %b) #0 {
303 ; CHECK-LABEL: test_x86_fnmadd_aba_sd:
304 ; CHECK:       # BB#0:
305 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
306 ; CHECK-NEXT: vfnmadd132sd (%rdx), %xmm0, %xmm0
307 ; CHECK-NEXT: retq
308   %res = call <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double> %a, <2 x double> %b, <2 x double> %a) nounwind
309   ret <2 x double> %res
310 }
311
312 define <2 x double> @test_x86_fnmadd_bba_sd(<2 x double> %a, <2 x double> %b) #0 {
313 ; CHECK-LABEL: test_x86_fnmadd_bba_sd:
314 ; CHECK:       # BB#0:
315 ; CHECK-NEXT: vmovapd   (%rdx), %xmm0
316 ; CHECK-NEXT: vfnmadd213sd (%rcx), %xmm0, %xmm0
317 ; CHECK-NEXT: retq
318   %res = call <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double> %b, <2 x double> %b, <2 x double> %a) nounwind
319   ret <2 x double> %res
320 }
321
322 declare <2 x double> @llvm.x86.fma.vfnmadd.pd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
323 define <2 x double> @test_x86_fnmadd_baa_pd(<2 x double> %a, <2 x double> %b) #0 {
324 ; CHECK-LABEL: test_x86_fnmadd_baa_pd:
325 ; CHECK:       # BB#0:
326 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
327 ; CHECK-NEXT: vfnmadd132pd (%rdx), %xmm0, %xmm0
328 ; CHECK-NEXT: retq
329   %res = call <2 x double> @llvm.x86.fma.vfnmadd.pd(<2 x double> %b, <2 x double> %a, <2 x double> %a) nounwind
330   ret <2 x double> %res
331 }
332
333 define <2 x double> @test_x86_fnmadd_aba_pd(<2 x double> %a, <2 x double> %b) #0 {
334 ; CHECK-LABEL: test_x86_fnmadd_aba_pd:
335 ; CHECK:       # BB#0:
336 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
337 ; CHECK-NEXT: vfnmadd231pd (%rdx), %xmm0, %xmm0
338 ; CHECK-NEXT: retq
339   %res = call <2 x double> @llvm.x86.fma.vfnmadd.pd(<2 x double> %a, <2 x double> %b, <2 x double> %a) nounwind
340   ret <2 x double> %res
341 }
342
343 define <2 x double> @test_x86_fnmadd_bba_pd(<2 x double> %a, <2 x double> %b) #0 {
344 ; CHECK-LABEL: test_x86_fnmadd_bba_pd:
345 ; CHECK:       # BB#0:
346 ; CHECK-NEXT: vmovapd   (%rdx), %xmm0
347 ; CHECK-NEXT: vfnmadd213pd (%rcx), %xmm0, %xmm0
348 ; CHECK-NEXT: retq
349   %res = call <2 x double> @llvm.x86.fma.vfnmadd.pd(<2 x double> %b, <2 x double> %b, <2 x double> %a) nounwind
350   ret <2 x double> %res
351 }
352
353 declare <4 x double> @llvm.x86.fma.vfnmadd.pd.256(<4 x double>, <4 x double>, <4 x double>) nounwind readnone
354 define <4 x double> @test_x86_fnmadd_baa_pd_y(<4 x double> %a, <4 x double> %b) #0 {
355 ; CHECK-LABEL: test_x86_fnmadd_baa_pd_y:
356 ; CHECK:       # BB#0:
357 ; CHECK-NEXT: vmovapd   (%rcx), %ymm0
358 ; CHECK-NEXT: vfnmadd132pd (%rdx), %ymm0, %ymm0
359 ; CHECK-NEXT: retq
360   %res = call <4 x double> @llvm.x86.fma.vfnmadd.pd.256(<4 x double> %b, <4 x double> %a, <4 x double> %a) nounwind
361   ret <4 x double> %res
362 }
363
364 define <4 x double> @test_x86_fnmadd_aba_pd_y(<4 x double> %a, <4 x double> %b) #0 {
365 ; CHECK-LABEL: test_x86_fnmadd_aba_pd_y:
366 ; CHECK:       # BB#0:
367 ; CHECK-NEXT: vmovapd   (%rcx), %ymm0
368 ; CHECK-NEXT: vfnmadd231pd (%rdx), %ymm0, %ymm0
369 ; CHECK-NEXT: retq
370   %res = call <4 x double> @llvm.x86.fma.vfnmadd.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %a) nounwind
371   ret <4 x double> %res
372 }
373
374 define <4 x double> @test_x86_fnmadd_bba_pd_y(<4 x double> %a, <4 x double> %b) #0 {
375 ; CHECK-LABEL: test_x86_fnmadd_bba_pd_y:
376 ; CHECK:       # BB#0:
377 ; CHECK-NEXT: vmovapd   (%rdx), %ymm0
378 ; CHECK-NEXT: vfnmadd213pd (%rcx), %ymm0, %ymm0
379 ; CHECK-NEXT: retq
380   %res = call <4 x double> @llvm.x86.fma.vfnmadd.pd.256(<4 x double> %b, <4 x double> %b, <4 x double> %a) nounwind
381   ret <4 x double> %res
382 }
383
384
385 declare <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
386 define <4 x float> @test_x86_fmsub_baa_ss(<4 x float> %a, <4 x float> %b) #0 {
387 ; CHECK-LABEL: test_x86_fmsub_baa_ss:
388 ; CHECK:       # BB#0:
389 ; CHECK-NEXT: vmovaps {{\(%rdx\), %xmm0|\(%rcx\), %xmm1}}
390 ; CHECK-NEXT: vmovaps {{\(%rdx\), %xmm0|\(%rcx\), %xmm1}}
391 ; CHECK-NEXT: vfmsub213ss %xmm1, %xmm1, %xmm0
392 ; CHECK-NEXT: retq
393   %res = call <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float> %b, <4 x float> %a, <4 x float> %a) nounwind
394   ret <4 x float> %res
395 }
396
397 define <4 x float> @test_x86_fmsub_aba_ss(<4 x float> %a, <4 x float> %b) #0 {
398 ; CHECK-LABEL: test_x86_fmsub_aba_ss:
399 ; CHECK:       # BB#0:
400 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
401 ; CHECK-NEXT: vfmsub132ss (%rdx), %xmm0, %xmm0
402 ; CHECK-NEXT: retq
403   %res = call <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float> %a, <4 x float> %b, <4 x float> %a) nounwind
404   ret <4 x float> %res
405 }
406
407 define <4 x float> @test_x86_fmsub_bba_ss(<4 x float> %a, <4 x float> %b) #0 {
408 ; CHECK-LABEL: test_x86_fmsub_bba_ss:
409 ; CHECK:       # BB#0:
410 ; CHECK-NEXT: vmovaps   (%rdx), %xmm0
411 ; CHECK-NEXT: vfmsub213ss (%rcx), %xmm0, %xmm0
412 ; CHECK-NEXT: retq
413   %res = call <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float> %b, <4 x float> %b, <4 x float> %a) nounwind
414   ret <4 x float> %res
415 }
416
417 declare <4 x float> @llvm.x86.fma.vfmsub.ps(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
418 define <4 x float> @test_x86_fmsub_baa_ps(<4 x float> %a, <4 x float> %b) #0 {
419 ; CHECK-LABEL: test_x86_fmsub_baa_ps:
420 ; CHECK:       # BB#0:
421 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
422 ; CHECK-NEXT: vfmsub132ps (%rdx), %xmm0, %xmm0
423 ; CHECK-NEXT: retq
424   %res = call <4 x float> @llvm.x86.fma.vfmsub.ps(<4 x float> %b, <4 x float> %a, <4 x float> %a) nounwind
425   ret <4 x float> %res
426 }
427
428 define <4 x float> @test_x86_fmsub_aba_ps(<4 x float> %a, <4 x float> %b) #0 {
429 ; CHECK-LABEL: test_x86_fmsub_aba_ps:
430 ; CHECK:       # BB#0:
431 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
432 ; CHECK-NEXT: vfmsub231ps (%rdx), %xmm0, %xmm0
433 ; CHECK-NEXT: retq
434   %res = call <4 x float> @llvm.x86.fma.vfmsub.ps(<4 x float> %a, <4 x float> %b, <4 x float> %a) nounwind
435   ret <4 x float> %res
436 }
437
438 define <4 x float> @test_x86_fmsub_bba_ps(<4 x float> %a, <4 x float> %b) #0 {
439 ; CHECK-LABEL: test_x86_fmsub_bba_ps:
440 ; CHECK:       # BB#0:
441 ; CHECK-NEXT: vmovaps   (%rdx), %xmm0
442 ; CHECK-NEXT: vfmsub213ps (%rcx), %xmm0, %xmm0
443 ; CHECK-NEXT: retq
444   %res = call <4 x float> @llvm.x86.fma.vfmsub.ps(<4 x float> %b, <4 x float> %b, <4 x float> %a) nounwind
445   ret <4 x float> %res
446 }
447
448 declare <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float>, <8 x float>, <8 x float>) nounwind readnone
449 define <8 x float> @test_x86_fmsub_baa_ps_y(<8 x float> %a, <8 x float> %b) #0 {
450 ; CHECK-LABEL: test_x86_fmsub_baa_ps_y:
451 ; CHECK:       # BB#0:
452 ; CHECK-NEXT: vmovaps   (%rcx), %ymm0
453 ; CHECK-NEXT: vfmsub132ps (%rdx), %ymm0, %ymm0
454 ; CHECK-NEXT: retq
455   %res = call <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float> %b, <8 x float> %a, <8 x float> %a) nounwind
456   ret <8 x float> %res
457 }
458
459 define <8 x float> @test_x86_fmsub_aba_ps_y(<8 x float> %a, <8 x float> %b) #0 {
460 ; CHECK-LABEL: test_x86_fmsub_aba_ps_y:
461 ; CHECK:       # BB#0:
462 ; CHECK-NEXT: vmovaps   (%rcx), %ymm0
463 ; CHECK-NEXT: vfmsub231ps (%rdx), %ymm0, %ymm0
464 ; CHECK-NEXT: retq
465   %res = call <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %a) nounwind
466   ret <8 x float> %res
467 }
468
469 define <8 x float> @test_x86_fmsub_bba_ps_y(<8 x float> %a, <8 x float> %b) #0 {
470 ; CHECK-LABEL: test_x86_fmsub_bba_ps_y:
471 ; CHECK:       # BB#0:
472 ; CHECK-NEXT: vmovaps   (%rdx), %ymm0
473 ; CHECK-NEXT: vfmsub213ps (%rcx), %ymm0, %ymm0
474 ; CHECK-NEXT: retq
475   %res = call <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float> %b, <8 x float> %b, <8 x float> %a) nounwind
476   ret <8 x float> %res
477 }
478
479 declare <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
480 define <2 x double> @test_x86_fmsub_baa_sd(<2 x double> %a, <2 x double> %b) #0 {
481 ; CHECK-LABEL: test_x86_fmsub_baa_sd:
482 ; CHECK:       # BB#0:
483 ; CHECK-NEXT: vmovapd {{\(%rdx\), %xmm0|\(%rcx\), %xmm1}}
484 ; CHECK-NEXT: vmovapd {{\(%rdx\), %xmm0|\(%rcx\), %xmm1}}
485 ; CHECK-NEXT: vfmsub213sd %xmm1, %xmm1, %xmm0
486 ; CHECK-NEXT: retq
487   %res = call <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double> %b, <2 x double> %a, <2 x double> %a) nounwind
488   ret <2 x double> %res
489 }
490
491 define <2 x double> @test_x86_fmsub_aba_sd(<2 x double> %a, <2 x double> %b) #0 {
492 ; CHECK-LABEL: test_x86_fmsub_aba_sd:
493 ; CHECK:       # BB#0:
494 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
495 ; CHECK-NEXT: vfmsub132sd (%rdx), %xmm0, %xmm0
496 ; CHECK-NEXT: retq
497   %res = call <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double> %a, <2 x double> %b, <2 x double> %a) nounwind
498   ret <2 x double> %res
499 }
500
501 define <2 x double> @test_x86_fmsub_bba_sd(<2 x double> %a, <2 x double> %b) #0 {
502 ; CHECK-LABEL: test_x86_fmsub_bba_sd:
503 ; CHECK:       # BB#0:
504 ; CHECK-NEXT: vmovapd   (%rdx), %xmm0
505 ; CHECK-NEXT: vfmsub213sd (%rcx), %xmm0, %xmm0
506 ; CHECK-NEXT: retq
507   %res = call <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double> %b, <2 x double> %b, <2 x double> %a) nounwind
508   ret <2 x double> %res
509 }
510
511 declare <2 x double> @llvm.x86.fma.vfmsub.pd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
512 define <2 x double> @test_x86_fmsub_baa_pd(<2 x double> %a, <2 x double> %b) #0 {
513 ; CHECK-LABEL: test_x86_fmsub_baa_pd:
514 ; CHECK:       # BB#0:
515 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
516 ; CHECK-NEXT: vfmsub132pd (%rdx), %xmm0, %xmm0
517 ; CHECK-NEXT: retq
518   %res = call <2 x double> @llvm.x86.fma.vfmsub.pd(<2 x double> %b, <2 x double> %a, <2 x double> %a) nounwind
519   ret <2 x double> %res
520 }
521
522 define <2 x double> @test_x86_fmsub_aba_pd(<2 x double> %a, <2 x double> %b) #0 {
523 ; CHECK-LABEL: test_x86_fmsub_aba_pd:
524 ; CHECK:       # BB#0:
525 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
526 ; CHECK-NEXT: vfmsub231pd (%rdx), %xmm0, %xmm0
527 ; CHECK-NEXT: retq
528   %res = call <2 x double> @llvm.x86.fma.vfmsub.pd(<2 x double> %a, <2 x double> %b, <2 x double> %a) nounwind
529   ret <2 x double> %res
530 }
531
532 define <2 x double> @test_x86_fmsub_bba_pd(<2 x double> %a, <2 x double> %b) #0 {
533 ; CHECK-LABEL: test_x86_fmsub_bba_pd:
534 ; CHECK:       # BB#0:
535 ; CHECK-NEXT: vmovapd   (%rdx), %xmm0
536 ; CHECK-NEXT: vfmsub213pd (%rcx), %xmm0, %xmm0
537 ; CHECK-NEXT: retq
538   %res = call <2 x double> @llvm.x86.fma.vfmsub.pd(<2 x double> %b, <2 x double> %b, <2 x double> %a) nounwind
539   ret <2 x double> %res
540 }
541
542 declare <4 x double> @llvm.x86.fma.vfmsub.pd.256(<4 x double>, <4 x double>, <4 x double>) nounwind readnone
543 define <4 x double> @test_x86_fmsub_baa_pd_y(<4 x double> %a, <4 x double> %b) #0 {
544 ; CHECK-LABEL: test_x86_fmsub_baa_pd_y:
545 ; CHECK:       # BB#0:
546 ; CHECK-NEXT: vmovapd   (%rcx), %ymm0
547 ; CHECK-NEXT: vfmsub132pd (%rdx), %ymm0, %ymm0
548 ; CHECK-NEXT: retq
549   %res = call <4 x double> @llvm.x86.fma.vfmsub.pd.256(<4 x double> %b, <4 x double> %a, <4 x double> %a) nounwind
550   ret <4 x double> %res
551 }
552
553 define <4 x double> @test_x86_fmsub_aba_pd_y(<4 x double> %a, <4 x double> %b) #0 {
554 ; CHECK-LABEL: test_x86_fmsub_aba_pd_y:
555 ; CHECK:       # BB#0:
556 ; CHECK-NEXT: vmovapd   (%rcx), %ymm0
557 ; CHECK-NEXT: vfmsub231pd (%rdx), %ymm0, %ymm0
558 ; CHECK-NEXT: retq
559   %res = call <4 x double> @llvm.x86.fma.vfmsub.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %a) nounwind
560   ret <4 x double> %res
561 }
562
563 define <4 x double> @test_x86_fmsub_bba_pd_y(<4 x double> %a, <4 x double> %b) #0 {
564 ; CHECK-LABEL: test_x86_fmsub_bba_pd_y:
565 ; CHECK:       # BB#0:
566 ; CHECK-NEXT: vmovapd   (%rdx), %ymm0
567 ; CHECK-NEXT: vfmsub213pd (%rcx), %ymm0, %ymm0
568 ; CHECK-NEXT: retq
569   %res = call <4 x double> @llvm.x86.fma.vfmsub.pd.256(<4 x double> %b, <4 x double> %b, <4 x double> %a) nounwind
570   ret <4 x double> %res
571 }
572
573
574 declare <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
575 define <4 x float> @test_x86_fnmsub_baa_ss(<4 x float> %a, <4 x float> %b) #0 {
576 ; CHECK-LABEL: test_x86_fnmsub_baa_ss:
577 ; CHECK:       # BB#0:
578 ; CHECK-NEXT: vmovaps {{\(%rdx\), %xmm0|\(%rcx\), %xmm1}}
579 ; CHECK-NEXT: vmovaps {{\(%rdx\), %xmm0|\(%rcx\), %xmm1}}
580 ; CHECK-NEXT: vfnmsub213ss %xmm1, %xmm1, %xmm0
581 ; CHECK-NEXT: retq
582   %res = call <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float> %b, <4 x float> %a, <4 x float> %a) nounwind
583   ret <4 x float> %res
584 }
585
586 define <4 x float> @test_x86_fnmsub_aba_ss(<4 x float> %a, <4 x float> %b) #0 {
587 ; CHECK-LABEL: test_x86_fnmsub_aba_ss:
588 ; CHECK:       # BB#0:
589 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
590 ; CHECK-NEXT: vfnmsub132ss (%rdx), %xmm0, %xmm0
591 ; CHECK-NEXT: retq
592   %res = call <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float> %a, <4 x float> %b, <4 x float> %a) nounwind
593   ret <4 x float> %res
594 }
595
596 define <4 x float> @test_x86_fnmsub_bba_ss(<4 x float> %a, <4 x float> %b) #0 {
597 ; CHECK-LABEL: test_x86_fnmsub_bba_ss:
598 ; CHECK:       # BB#0:
599 ; CHECK-NEXT: vmovaps   (%rdx), %xmm0
600 ; CHECK-NEXT: vfnmsub213ss (%rcx), %xmm0, %xmm0
601 ; CHECK-NEXT: retq
602   %res = call <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float> %b, <4 x float> %b, <4 x float> %a) nounwind
603   ret <4 x float> %res
604 }
605
606 declare <4 x float> @llvm.x86.fma.vfnmsub.ps(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
607 define <4 x float> @test_x86_fnmsub_baa_ps(<4 x float> %a, <4 x float> %b) #0 {
608 ; CHECK-LABEL: test_x86_fnmsub_baa_ps:
609 ; CHECK:       # BB#0:
610 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
611 ; CHECK-NEXT: vfnmsub132ps (%rdx), %xmm0, %xmm0
612 ; CHECK-NEXT: retq
613   %res = call <4 x float> @llvm.x86.fma.vfnmsub.ps(<4 x float> %b, <4 x float> %a, <4 x float> %a) nounwind
614   ret <4 x float> %res
615 }
616
617 define <4 x float> @test_x86_fnmsub_aba_ps(<4 x float> %a, <4 x float> %b) #0 {
618 ; CHECK-LABEL: test_x86_fnmsub_aba_ps:
619 ; CHECK:       # BB#0:
620 ; CHECK-NEXT: vmovaps   (%rcx), %xmm0
621 ; CHECK-NEXT: vfnmsub231ps (%rdx), %xmm0, %xmm0
622 ; CHECK-NEXT: retq
623   %res = call <4 x float> @llvm.x86.fma.vfnmsub.ps(<4 x float> %a, <4 x float> %b, <4 x float> %a) nounwind
624   ret <4 x float> %res
625 }
626
627 define <4 x float> @test_x86_fnmsub_bba_ps(<4 x float> %a, <4 x float> %b) #0 {
628 ; CHECK-LABEL: test_x86_fnmsub_bba_ps:
629 ; CHECK:       # BB#0:
630 ; CHECK-NEXT: vmovaps   (%rdx), %xmm0
631 ; CHECK-NEXT: vfnmsub213ps (%rcx), %xmm0, %xmm0
632 ; CHECK-NEXT: retq
633   %res = call <4 x float> @llvm.x86.fma.vfnmsub.ps(<4 x float> %b, <4 x float> %b, <4 x float> %a) nounwind
634   ret <4 x float> %res
635 }
636
637 declare <8 x float> @llvm.x86.fma.vfnmsub.ps.256(<8 x float>, <8 x float>, <8 x float>) nounwind readnone
638 define <8 x float> @test_x86_fnmsub_baa_ps_y(<8 x float> %a, <8 x float> %b) #0 {
639 ; CHECK-LABEL: test_x86_fnmsub_baa_ps_y:
640 ; CHECK:       # BB#0:
641 ; CHECK-NEXT: vmovaps   (%rcx), %ymm0
642 ; CHECK-NEXT: vfnmsub132ps (%rdx), %ymm0, %ymm0
643 ; CHECK-NEXT: retq
644   %res = call <8 x float> @llvm.x86.fma.vfnmsub.ps.256(<8 x float> %b, <8 x float> %a, <8 x float> %a) nounwind
645   ret <8 x float> %res
646 }
647
648 define <8 x float> @test_x86_fnmsub_aba_ps_y(<8 x float> %a, <8 x float> %b) #0 {
649 ; CHECK-LABEL: test_x86_fnmsub_aba_ps_y:
650 ; CHECK:       # BB#0:
651 ; CHECK-NEXT: vmovaps   (%rcx), %ymm0
652 ; CHECK-NEXT: vfnmsub231ps (%rdx), %ymm0, %ymm0
653 ; CHECK-NEXT: retq
654   %res = call <8 x float> @llvm.x86.fma.vfnmsub.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %a) nounwind
655   ret <8 x float> %res
656 }
657
658 define <8 x float> @test_x86_fnmsub_bba_ps_y(<8 x float> %a, <8 x float> %b) #0 {
659 ; CHECK-LABEL: test_x86_fnmsub_bba_ps_y:
660 ; CHECK:       # BB#0:
661 ; CHECK-NEXT: vmovaps   (%rdx), %ymm0
662 ; CHECK-NEXT: vfnmsub213ps (%rcx), %ymm0, %ymm0
663 ; CHECK-NEXT: retq
664   %res = call <8 x float> @llvm.x86.fma.vfnmsub.ps.256(<8 x float> %b, <8 x float> %b, <8 x float> %a) nounwind
665   ret <8 x float> %res
666 }
667
668 declare <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
669 define <2 x double> @test_x86_fnmsub_baa_sd(<2 x double> %a, <2 x double> %b) #0 {
670 ; CHECK-LABEL: test_x86_fnmsub_baa_sd:
671 ; CHECK:       # BB#0:
672 ; CHECK-NEXT: vmovapd {{\(%rdx\), %xmm0|\(%rcx\), %xmm1}}
673 ; CHECK-NEXT: vmovapd {{\(%rdx\), %xmm0|\(%rcx\), %xmm1}}
674 ; CHECK-NEXT: vfnmsub213sd %xmm1, %xmm1, %xmm0
675 ; CHECK-NEXT: retq
676   %res = call <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double> %b, <2 x double> %a, <2 x double> %a) nounwind
677   ret <2 x double> %res
678 }
679
680 define <2 x double> @test_x86_fnmsub_aba_sd(<2 x double> %a, <2 x double> %b) #0 {
681 ; CHECK-LABEL: test_x86_fnmsub_aba_sd:
682 ; CHECK:       # BB#0:
683 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
684 ; CHECK-NEXT: vfnmsub132sd (%rdx), %xmm0, %xmm0
685 ; CHECK-NEXT: retq
686   %res = call <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double> %a, <2 x double> %b, <2 x double> %a) nounwind
687   ret <2 x double> %res
688 }
689
690 define <2 x double> @test_x86_fnmsub_bba_sd(<2 x double> %a, <2 x double> %b) #0 {
691 ; CHECK-LABEL: test_x86_fnmsub_bba_sd:
692 ; CHECK:       # BB#0:
693 ; CHECK-NEXT: vmovapd   (%rdx), %xmm0
694 ; CHECK-NEXT: vfnmsub213sd (%rcx), %xmm0, %xmm0
695 ; CHECK-NEXT: retq
696   %res = call <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double> %b, <2 x double> %b, <2 x double> %a) nounwind
697   ret <2 x double> %res
698 }
699
700 declare <2 x double> @llvm.x86.fma.vfnmsub.pd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
701 define <2 x double> @test_x86_fnmsub_baa_pd(<2 x double> %a, <2 x double> %b) #0 {
702 ; CHECK-LABEL: test_x86_fnmsub_baa_pd:
703 ; CHECK:       # BB#0:
704 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
705 ; CHECK-NEXT: vfnmsub132pd (%rdx), %xmm0, %xmm0
706 ; CHECK-NEXT: retq
707   %res = call <2 x double> @llvm.x86.fma.vfnmsub.pd(<2 x double> %b, <2 x double> %a, <2 x double> %a) nounwind
708   ret <2 x double> %res
709 }
710
711 define <2 x double> @test_x86_fnmsub_aba_pd(<2 x double> %a, <2 x double> %b) #0 {
712 ; CHECK-LABEL: test_x86_fnmsub_aba_pd:
713 ; CHECK:       # BB#0:
714 ; CHECK-NEXT: vmovapd   (%rcx), %xmm0
715 ; CHECK-NEXT: vfnmsub231pd (%rdx), %xmm0, %xmm0
716 ; CHECK-NEXT: retq
717   %res = call <2 x double> @llvm.x86.fma.vfnmsub.pd(<2 x double> %a, <2 x double> %b, <2 x double> %a) nounwind
718   ret <2 x double> %res
719 }
720
721 define <2 x double> @test_x86_fnmsub_bba_pd(<2 x double> %a, <2 x double> %b) #0 {
722 ; CHECK-LABEL: test_x86_fnmsub_bba_pd:
723 ; CHECK:       # BB#0:
724 ; CHECK-NEXT: vmovapd   (%rdx), %xmm0
725 ; CHECK-NEXT: vfnmsub213pd (%rcx), %xmm0, %xmm0
726 ; CHECK-NEXT: retq
727   %res = call <2 x double> @llvm.x86.fma.vfnmsub.pd(<2 x double> %b, <2 x double> %b, <2 x double> %a) nounwind
728   ret <2 x double> %res
729 }
730
731 declare <4 x double> @llvm.x86.fma.vfnmsub.pd.256(<4 x double>, <4 x double>, <4 x double>) nounwind readnone
732 define <4 x double> @test_x86_fnmsub_baa_pd_y(<4 x double> %a, <4 x double> %b) #0 {
733 ; CHECK-LABEL: test_x86_fnmsub_baa_pd_y:
734 ; CHECK:       # BB#0:
735 ; CHECK-NEXT: vmovapd   (%rcx), %ymm0
736 ; CHECK-NEXT: vfnmsub132pd (%rdx), %ymm0, %ymm0
737 ; CHECK-NEXT: retq
738   %res = call <4 x double> @llvm.x86.fma.vfnmsub.pd.256(<4 x double> %b, <4 x double> %a, <4 x double> %a) nounwind
739   ret <4 x double> %res
740 }
741
742 define <4 x double> @test_x86_fnmsub_aba_pd_y(<4 x double> %a, <4 x double> %b) #0 {
743 ; CHECK-LABEL: test_x86_fnmsub_aba_pd_y:
744 ; CHECK:       # BB#0:
745 ; CHECK-NEXT: vmovapd   (%rcx), %ymm0
746 ; CHECK-NEXT: vfnmsub231pd (%rdx), %ymm0, %ymm0
747 ; CHECK-NEXT: retq
748   %res = call <4 x double> @llvm.x86.fma.vfnmsub.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %a) nounwind
749   ret <4 x double> %res
750 }
751
752 define <4 x double> @test_x86_fnmsub_bba_pd_y(<4 x double> %a, <4 x double> %b) #0 {
753 ; CHECK-LABEL: test_x86_fnmsub_bba_pd_y:
754 ; CHECK:       # BB#0:
755 ; CHECK-NEXT: vmovapd   (%rdx), %ymm0
756 ; CHECK-NEXT: vfnmsub213pd (%rcx), %ymm0, %ymm0
757 ; CHECK-NEXT: retq
758   %res = call <4 x double> @llvm.x86.fma.vfnmsub.pd.256(<4 x double> %b, <4 x double> %b, <4 x double> %a) nounwind
759   ret <4 x double> %res
760 }
761