[X86][FMA] Refreshed fma tests
[oota-llvm.git] / test / CodeGen / X86 / fma_patterns.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+fma -fp-contract=fast | FileCheck %s
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+fma4,+fma -fp-contract=fast | FileCheck %s
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+fma4 -fp-contract=fast | FileCheck %s --check-prefix=CHECK_FMA4
4
5 define <4 x float> @test_x86_fmadd_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
6 ; CHECK-LABEL: test_x86_fmadd_ps:
7 ; CHECK:       # BB#0:
8 ; CHECK-NEXT:    vfmadd213ps %xmm2, %xmm1, %xmm0
9 ; CHECK-NEXT:    retq
10 ;
11 ; CHECK_FMA4-LABEL: test_x86_fmadd_ps:
12 ; CHECK_FMA4:       # BB#0:
13 ; CHECK_FMA4-NEXT:    vfmaddps %xmm2, %xmm1, %xmm0, %xmm0
14 ; CHECK_FMA4-NEXT:    retq
15   %x = fmul <4 x float> %a0, %a1
16   %res = fadd <4 x float> %x, %a2
17   ret <4 x float> %res
18 }
19
20 define <4 x float> @test_x86_fmsub_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
21 ; CHECK-LABEL: test_x86_fmsub_ps:
22 ; CHECK:       # BB#0:
23 ; CHECK-NEXT:    vfmsub213ps %xmm2, %xmm1, %xmm0
24 ; CHECK-NEXT:    retq
25 ;
26 ; CHECK_FMA4-LABEL: test_x86_fmsub_ps:
27 ; CHECK_FMA4:       # BB#0:
28 ; CHECK_FMA4-NEXT:    vfmsubps %xmm2, %xmm1, %xmm0, %xmm0
29 ; CHECK_FMA4-NEXT:    retq
30   %x = fmul <4 x float> %a0, %a1
31   %res = fsub <4 x float> %x, %a2
32   ret <4 x float> %res
33 }
34
35 define <4 x float> @test_x86_fnmadd_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
36 ; CHECK-LABEL: test_x86_fnmadd_ps:
37 ; CHECK:       # BB#0:
38 ; CHECK-NEXT:    vfnmadd213ps %xmm2, %xmm1, %xmm0
39 ; CHECK-NEXT:    retq
40 ;
41 ; CHECK_FMA4-LABEL: test_x86_fnmadd_ps:
42 ; CHECK_FMA4:       # BB#0:
43 ; CHECK_FMA4-NEXT:    vfnmaddps %xmm2, %xmm1, %xmm0, %xmm0
44 ; CHECK_FMA4-NEXT:    retq
45   %x = fmul <4 x float> %a0, %a1
46   %res = fsub <4 x float> %a2, %x
47   ret <4 x float> %res
48 }
49
50 define <4 x float> @test_x86_fnmsub_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
51 ; CHECK-LABEL: test_x86_fnmsub_ps:
52 ; CHECK:       # BB#0:
53 ; CHECK-NEXT:    vfnmsub213ps %xmm2, %xmm1, %xmm0
54 ; CHECK-NEXT:    retq
55 ;
56 ; CHECK_FMA4-LABEL: test_x86_fnmsub_ps:
57 ; CHECK_FMA4:       # BB#0:
58 ; CHECK_FMA4-NEXT:    vfnmsubps %xmm2, %xmm1, %xmm0, %xmm0
59 ; CHECK_FMA4-NEXT:    retq
60   %x = fmul <4 x float> %a0, %a1
61   %y = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %x
62   %res = fsub <4 x float> %y, %a2
63   ret <4 x float> %res
64 }
65
66 define <8 x float> @test_x86_fmadd_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
67 ; CHECK-LABEL: test_x86_fmadd_ps_y:
68 ; CHECK:       # BB#0:
69 ; CHECK-NEXT:    vfmadd213ps %ymm2, %ymm1, %ymm0
70 ; CHECK-NEXT:    retq
71 ;
72 ; CHECK_FMA4-LABEL: test_x86_fmadd_ps_y:
73 ; CHECK_FMA4:       # BB#0:
74 ; CHECK_FMA4-NEXT:    vfmaddps %ymm2, %ymm1, %ymm0, %ymm0
75 ; CHECK_FMA4-NEXT:    retq
76   %x = fmul <8 x float> %a0, %a1
77   %res = fadd <8 x float> %x, %a2
78   ret <8 x float> %res
79 }
80
81 define <8 x float> @test_x86_fmsub_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
82 ; CHECK-LABEL: test_x86_fmsub_ps_y:
83 ; CHECK:       # BB#0:
84 ; CHECK-NEXT:    vfmsub213ps %ymm2, %ymm1, %ymm0
85 ; CHECK-NEXT:    retq
86 ;
87 ; CHECK_FMA4-LABEL: test_x86_fmsub_ps_y:
88 ; CHECK_FMA4:       # BB#0:
89 ; CHECK_FMA4-NEXT:    vfmsubps %ymm2, %ymm1, %ymm0, %ymm0
90 ; CHECK_FMA4-NEXT:    retq
91   %x = fmul <8 x float> %a0, %a1
92   %res = fsub <8 x float> %x, %a2
93   ret <8 x float> %res
94 }
95
96 define <8 x float> @test_x86_fnmadd_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
97 ; CHECK-LABEL: test_x86_fnmadd_ps_y:
98 ; CHECK:       # BB#0:
99 ; CHECK-NEXT:    vfnmadd213ps %ymm2, %ymm1, %ymm0
100 ; CHECK-NEXT:    retq
101 ;
102 ; CHECK_FMA4-LABEL: test_x86_fnmadd_ps_y:
103 ; CHECK_FMA4:       # BB#0:
104 ; CHECK_FMA4-NEXT:    vfnmaddps %ymm2, %ymm1, %ymm0, %ymm0
105 ; CHECK_FMA4-NEXT:    retq
106   %x = fmul <8 x float> %a0, %a1
107   %res = fsub <8 x float> %a2, %x
108   ret <8 x float> %res
109 }
110
111 define <8 x float> @test_x86_fnmsub_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
112 ; CHECK-LABEL: test_x86_fnmsub_ps_y:
113 ; CHECK:       # BB#0:
114 ; CHECK-NEXT:    vfnmsub213ps %ymm2, %ymm1, %ymm0
115 ; CHECK-NEXT:    retq
116 ;
117 ; CHECK_FMA4-LABEL: test_x86_fnmsub_ps_y:
118 ; CHECK_FMA4:       # BB#0:
119 ; CHECK_FMA4-NEXT:    vfnmsubps %ymm2, %ymm1, %ymm0, %ymm0
120 ; CHECK_FMA4-NEXT:    retq
121   %x = fmul <8 x float> %a0, %a1
122   %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
123   %res = fsub <8 x float> %y, %a2
124   ret <8 x float> %res
125 }
126
127 define <4 x double> @test_x86_fmadd_pd_y(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2) {
128 ; CHECK-LABEL: test_x86_fmadd_pd_y:
129 ; CHECK:       # BB#0:
130 ; CHECK-NEXT:    vfmadd213pd %ymm2, %ymm1, %ymm0
131 ; CHECK-NEXT:    retq
132 ;
133 ; CHECK_FMA4-LABEL: test_x86_fmadd_pd_y:
134 ; CHECK_FMA4:       # BB#0:
135 ; CHECK_FMA4-NEXT:    vfmaddpd %ymm2, %ymm1, %ymm0, %ymm0
136 ; CHECK_FMA4-NEXT:    retq
137   %x = fmul <4 x double> %a0, %a1
138   %res = fadd <4 x double> %x, %a2
139   ret <4 x double> %res
140 }
141
142 define <4 x double> @test_x86_fmsub_pd_y(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2) {
143 ; CHECK-LABEL: test_x86_fmsub_pd_y:
144 ; CHECK:       # BB#0:
145 ; CHECK-NEXT:    vfmsub213pd %ymm2, %ymm1, %ymm0
146 ; CHECK-NEXT:    retq
147 ;
148 ; CHECK_FMA4-LABEL: test_x86_fmsub_pd_y:
149 ; CHECK_FMA4:       # BB#0:
150 ; CHECK_FMA4-NEXT:    vfmsubpd %ymm2, %ymm1, %ymm0, %ymm0
151 ; CHECK_FMA4-NEXT:    retq
152   %x = fmul <4 x double> %a0, %a1
153   %res = fsub <4 x double> %x, %a2
154   ret <4 x double> %res
155 }
156
157 define <2 x double> @test_x86_fmsub_pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) {
158 ; CHECK-LABEL: test_x86_fmsub_pd:
159 ; CHECK:       # BB#0:
160 ; CHECK-NEXT:    vfmsub213pd %xmm2, %xmm1, %xmm0
161 ; CHECK-NEXT:    retq
162 ;
163 ; CHECK_FMA4-LABEL: test_x86_fmsub_pd:
164 ; CHECK_FMA4:       # BB#0:
165 ; CHECK_FMA4-NEXT:    vfmsubpd %xmm2, %xmm1, %xmm0, %xmm0
166 ; CHECK_FMA4-NEXT:    retq
167   %x = fmul <2 x double> %a0, %a1
168   %res = fsub <2 x double> %x, %a2
169   ret <2 x double> %res
170 }
171
172 define float @test_x86_fnmadd_ss(float %a0, float %a1, float %a2) {
173 ; CHECK-LABEL: test_x86_fnmadd_ss:
174 ; CHECK:       # BB#0:
175 ; CHECK-NEXT:    vfnmadd213ss %xmm2, %xmm1, %xmm0
176 ; CHECK-NEXT:    retq
177 ;
178 ; CHECK_FMA4-LABEL: test_x86_fnmadd_ss:
179 ; CHECK_FMA4:       # BB#0:
180 ; CHECK_FMA4-NEXT:    vfnmaddss %xmm2, %xmm1, %xmm0, %xmm0
181 ; CHECK_FMA4-NEXT:    retq
182   %x = fmul float %a0, %a1
183   %res = fsub float %a2, %x
184   ret float %res
185 }
186
187 define double @test_x86_fnmadd_sd(double %a0, double %a1, double %a2) {
188 ; CHECK-LABEL: test_x86_fnmadd_sd:
189 ; CHECK:       # BB#0:
190 ; CHECK-NEXT:    vfnmadd213sd %xmm2, %xmm1, %xmm0
191 ; CHECK-NEXT:    retq
192 ;
193 ; CHECK_FMA4-LABEL: test_x86_fnmadd_sd:
194 ; CHECK_FMA4:       # BB#0:
195 ; CHECK_FMA4-NEXT:    vfnmaddsd %xmm2, %xmm1, %xmm0, %xmm0
196 ; CHECK_FMA4-NEXT:    retq
197   %x = fmul double %a0, %a1
198   %res = fsub double %a2, %x
199   ret double %res
200 }
201
202 define double @test_x86_fmsub_sd(double %a0, double %a1, double %a2) {
203 ; CHECK-LABEL: test_x86_fmsub_sd:
204 ; CHECK:       # BB#0:
205 ; CHECK-NEXT:    vfmsub213sd %xmm2, %xmm1, %xmm0
206 ; CHECK-NEXT:    retq
207 ;
208 ; CHECK_FMA4-LABEL: test_x86_fmsub_sd:
209 ; CHECK_FMA4:       # BB#0:
210 ; CHECK_FMA4-NEXT:    vfmsubsd %xmm2, %xmm1, %xmm0, %xmm0
211 ; CHECK_FMA4-NEXT:    retq
212   %x = fmul double %a0, %a1
213   %res = fsub double %x, %a2
214   ret double %res
215 }
216
217 define float @test_x86_fnmsub_ss(float %a0, float %a1, float %a2) {
218 ; CHECK-LABEL: test_x86_fnmsub_ss:
219 ; CHECK:       # BB#0:
220 ; CHECK-NEXT:    vfnmsub213ss %xmm2, %xmm1, %xmm0
221 ; CHECK-NEXT:    retq
222 ;
223 ; CHECK_FMA4-LABEL: test_x86_fnmsub_ss:
224 ; CHECK_FMA4:       # BB#0:
225 ; CHECK_FMA4-NEXT:    vfnmsubss %xmm2, %xmm1, %xmm0, %xmm0
226 ; CHECK_FMA4-NEXT:    retq
227   %x = fsub float -0.000000e+00, %a0
228   %y = fmul float %x, %a1
229   %res = fsub float %y, %a2
230   ret float %res
231 }
232
233 define <4 x float> @test_x86_fmadd_ps_load(<4 x float>* %a0, <4 x float> %a1, <4 x float> %a2) {
234 ; CHECK-LABEL: test_x86_fmadd_ps_load:
235 ; CHECK:       # BB#0:
236 ; CHECK-NEXT:    vmovaps (%rdi), %xmm2
237 ; CHECK-NEXT:    vfmadd213ps %xmm1, %xmm2, %xmm0
238 ; CHECK-NEXT:    retq
239 ;
240 ; CHECK_FMA4-LABEL: test_x86_fmadd_ps_load:
241 ; CHECK_FMA4:       # BB#0:
242 ; CHECK_FMA4-NEXT:    vfmaddps %xmm1, (%rdi), %xmm0, %xmm0
243 ; CHECK_FMA4-NEXT:    retq
244   %x = load <4 x float>, <4 x float>* %a0
245   %y = fmul <4 x float> %x, %a1
246   %res = fadd <4 x float> %y, %a2
247   ret <4 x float> %res
248 }
249
250 define <4 x float> @test_x86_fmsub_ps_load(<4 x float>* %a0, <4 x float> %a1, <4 x float> %a2) {
251 ; CHECK-LABEL: test_x86_fmsub_ps_load:
252 ; CHECK:       # BB#0:
253 ; CHECK-NEXT:    vmovaps (%rdi), %xmm2
254 ; CHECK-NEXT:    vfmsub213ps %xmm1, %xmm2, %xmm0
255 ; CHECK-NEXT:    retq
256 ;
257 ; CHECK_FMA4-LABEL: test_x86_fmsub_ps_load:
258 ; CHECK_FMA4:       # BB#0:
259 ; CHECK_FMA4-NEXT:    vfmsubps %xmm1, (%rdi), %xmm0, %xmm0
260 ; CHECK_FMA4-NEXT:    retq
261   %x = load <4 x float>, <4 x float>* %a0
262   %y = fmul <4 x float> %x, %a1
263   %res = fsub <4 x float> %y, %a2
264   ret <4 x float> %res
265 }
266