Disambiguate function names in some CodeGen tests. (Some tests were using function...
[oota-llvm.git] / test / CodeGen / X86 / fma_patterns.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=core-avx2 -mattr=avx2,+fma -fp-contract=fast | FileCheck %s
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=bdver2 -mattr=-fma4 -fp-contract=fast | FileCheck %s
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=bdver1 -fp-contract=fast | FileCheck %s --check-prefix=CHECK_FMA4
4
5 ; CHECK: test_x86_fmadd_ps
6 ; CHECK: vfmadd213ps     %xmm2, %xmm1, %xmm0
7 ; CHECK: ret
8 ; CHECK_FMA4: test_x86_fmadd_ps
9 ; CHECK_FMA4: vfmaddps     %xmm2, %xmm1, %xmm0, %xmm0
10 ; CHECK_FMA4: ret
11 define <4 x float> @test_x86_fmadd_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
12   %x = fmul <4 x float> %a0, %a1
13   %res = fadd <4 x float> %x, %a2
14   ret <4 x float> %res
15 }
16
17 ; CHECK: test_x86_fmsub_ps
18 ; CHECK: fmsub213ps     %xmm2, %xmm1, %xmm0
19 ; CHECK: ret
20 ; CHECK_FMA4: test_x86_fmsub_ps
21 ; CHECK_FMA4: vfmsubps     %xmm2, %xmm1, %xmm0, %xmm0
22 ; CHECK_FMA4: ret
23 define <4 x float> @test_x86_fmsub_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
24   %x = fmul <4 x float> %a0, %a1
25   %res = fsub <4 x float> %x, %a2
26   ret <4 x float> %res
27 }
28
29 ; CHECK: test_x86_fnmadd_ps
30 ; CHECK: fnmadd213ps     %xmm2, %xmm1, %xmm0
31 ; CHECK: ret
32 ; CHECK_FMA4: test_x86_fnmadd_ps
33 ; CHECK_FMA4: vfnmaddps     %xmm2, %xmm1, %xmm0, %xmm0
34 ; CHECK_FMA4: ret
35 define <4 x float> @test_x86_fnmadd_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
36   %x = fmul <4 x float> %a0, %a1
37   %res = fsub <4 x float> %a2, %x
38   ret <4 x float> %res
39 }
40
41 ; CHECK: test_x86_fnmsub_ps
42 ; CHECK: fnmsub213ps     %xmm2, %xmm1, %xmm0
43 ; CHECK: ret
44 ; CHECK_FMA4: test_x86_fnmsub_ps
45 ; CHECK_FMA4: fnmsubps     %xmm2, %xmm1, %xmm0, %xmm0
46 ; CHECK_FMA4: ret
47 define <4 x float> @test_x86_fnmsub_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
48   %x = fmul <4 x float> %a0, %a1
49   %y = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %x
50   %res = fsub <4 x float> %y, %a2
51   ret <4 x float> %res
52 }
53
54 ; CHECK: test_x86_fmadd_ps_y
55 ; CHECK: vfmadd213ps     %ymm2, %ymm1, %ymm0
56 ; CHECK: ret
57 ; CHECK_FMA4: test_x86_fmadd_ps_y
58 ; CHECK_FMA4: vfmaddps     %ymm2, %ymm1, %ymm0, %ymm0
59 ; CHECK_FMA4: ret
60 define <8 x float> @test_x86_fmadd_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
61   %x = fmul <8 x float> %a0, %a1
62   %res = fadd <8 x float> %x, %a2
63   ret <8 x float> %res
64 }
65
66 ; CHECK: test_x86_fmsub_ps_y
67 ; CHECK: vfmsub213ps     %ymm2, %ymm1, %ymm0
68 ; CHECK: ret
69 ; CHECK_FMA4: test_x86_fmsub_ps_y
70 ; CHECK_FMA4: vfmsubps     %ymm2, %ymm1, %ymm0, %ymm0
71 ; CHECK_FMA4: ret
72 define <8 x float> @test_x86_fmsub_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
73   %x = fmul <8 x float> %a0, %a1
74   %res = fsub <8 x float> %x, %a2
75   ret <8 x float> %res
76 }
77
78 ; CHECK: test_x86_fnmadd_ps_y
79 ; CHECK: vfnmadd213ps     %ymm2, %ymm1, %ymm0
80 ; CHECK: ret
81 ; CHECK_FMA4: test_x86_fnmadd_ps_y
82 ; CHECK_FMA4: vfnmaddps     %ymm2, %ymm1, %ymm0, %ymm0
83 ; CHECK_FMA4: ret
84 define <8 x float> @test_x86_fnmadd_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
85   %x = fmul <8 x float> %a0, %a1
86   %res = fsub <8 x float> %a2, %x
87   ret <8 x float> %res
88 }
89
90 ; CHECK: test_x86_fnmsub_ps_y
91 ; CHECK: vfnmsub213ps     %ymm2, %ymm1, %ymm0
92 ; CHECK: ret
93 define <8 x float> @test_x86_fnmsub_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
94   %x = fmul <8 x float> %a0, %a1
95   %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
96   %res = fsub <8 x float> %y, %a2
97   ret <8 x float> %res
98 }
99
100 ; CHECK: test_x86_fmadd_pd_y
101 ; CHECK: vfmadd213pd     %ymm2, %ymm1, %ymm0
102 ; CHECK: ret
103 ; CHECK_FMA4: test_x86_fmadd_pd_y
104 ; CHECK_FMA4: vfmaddpd     %ymm2, %ymm1, %ymm0, %ymm0
105 ; CHECK_FMA4: ret
106 define <4 x double> @test_x86_fmadd_pd_y(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2) {
107   %x = fmul <4 x double> %a0, %a1
108   %res = fadd <4 x double> %x, %a2
109   ret <4 x double> %res
110 }
111
112 ; CHECK: test_x86_fmsub_pd_y
113 ; CHECK: vfmsub213pd     %ymm2, %ymm1, %ymm0
114 ; CHECK: ret
115 ; CHECK_FMA4: test_x86_fmsub_pd_y
116 ; CHECK_FMA4: vfmsubpd     %ymm2, %ymm1, %ymm0, %ymm0
117 ; CHECK_FMA4: ret
118 define <4 x double> @test_x86_fmsub_pd_y(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2) {
119   %x = fmul <4 x double> %a0, %a1
120   %res = fsub <4 x double> %x, %a2
121   ret <4 x double> %res
122 }
123
124 ; CHECK: test_x86_fmsub_pd
125 ; CHECK: vfmsub213pd     %xmm2, %xmm1, %xmm0
126 ; CHECK: ret
127 ; CHECK_FMA4: test_x86_fmsub_pd
128 ; CHECK_FMA4: vfmsubpd     %xmm2, %xmm1, %xmm0, %xmm0
129 ; CHECK_FMA4: ret
130 define <2 x double> @test_x86_fmsub_pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) {
131   %x = fmul <2 x double> %a0, %a1
132   %res = fsub <2 x double> %x, %a2
133   ret <2 x double> %res
134 }
135
136 ; CHECK: test_x86_fnmadd_ss
137 ; CHECK: vfnmadd213ss    %xmm2, %xmm1, %xmm0
138 ; CHECK: ret
139 ; CHECK_FMA4: test_x86_fnmadd_ss
140 ; CHECK_FMA4: vfnmaddss    %xmm2, %xmm1, %xmm0, %xmm0
141 ; CHECK_FMA4: ret
142 define float @test_x86_fnmadd_ss(float %a0, float %a1, float %a2) {
143   %x = fmul float %a0, %a1
144   %res = fsub float %a2, %x
145   ret float %res
146 }
147
148 ; CHECK: test_x86_fnmadd_sd
149 ; CHECK: vfnmadd213sd     %xmm2, %xmm1, %xmm0
150 ; CHECK: ret
151 ; CHECK_FMA4: test_x86_fnmadd_sd
152 ; CHECK_FMA4: vfnmaddsd     %xmm2, %xmm1, %xmm0, %xmm0
153 ; CHECK_FMA4: ret
154 define double @test_x86_fnmadd_sd(double %a0, double %a1, double %a2) {
155   %x = fmul double %a0, %a1
156   %res = fsub double %a2, %x
157   ret double %res
158 }
159
160 ; CHECK: test_x86_fmsub_sd
161 ; CHECK: vfmsub213sd     %xmm2, %xmm1, %xmm0
162 ; CHECK: ret
163 ; CHECK_FMA4: test_x86_fmsub_sd
164 ; CHECK_FMA4: vfmsubsd     %xmm2, %xmm1, %xmm0, %xmm0
165 ; CHECK_FMA4: ret
166 define double @test_x86_fmsub_sd(double %a0, double %a1, double %a2) {
167   %x = fmul double %a0, %a1
168   %res = fsub double %x, %a2
169   ret double %res
170 }
171
172 ; CHECK: test_x86_fnmsub_ss
173 ; CHECK: vfnmsub213ss     %xmm2, %xmm1, %xmm0
174 ; CHECK: ret
175 ; CHECK_FMA4: test_x86_fnmsub_ss
176 ; CHECK_FMA4: vfnmsubss     %xmm2, %xmm1, %xmm0, %xmm0
177 ; CHECK_FMA4: ret
178 define float @test_x86_fnmsub_ss(float %a0, float %a1, float %a2) {
179   %x = fsub float -0.000000e+00, %a0
180   %y = fmul float %x, %a1
181   %res = fsub float %y, %a2
182   ret float %res
183 }
184
185 ; CHECK: test_x86_fmadd_ps_load
186 ; CHECK: vmovaps         (%rdi), %xmm2
187 ; CHECK: vfmadd213ps     %xmm1, %xmm0, %xmm2
188 ; CHECK: ret
189 ; CHECK_FMA4: test_x86_fmadd_ps_load
190 ; CHECK_FMA4: vfmaddps     %xmm1, (%rdi), %xmm0, %xmm0
191 ; CHECK_FMA4: ret
192 define <4 x float> @test_x86_fmadd_ps_load(<4 x float>* %a0, <4 x float> %a1, <4 x float> %a2) {
193   %x = load <4 x float>* %a0
194   %y = fmul <4 x float> %x, %a1
195   %res = fadd <4 x float> %y, %a2
196   ret <4 x float> %res
197 }
198
199 ; CHECK: test_x86_fmsub_ps_load
200 ; CHECK: vmovaps         (%rdi), %xmm2
201 ; CHECK: fmsub213ps     %xmm1, %xmm0, %xmm2
202 ; CHECK: ret
203 ; CHECK_FMA4: test_x86_fmsub_ps_load
204 ; CHECK_FMA4: vfmsubps     %xmm1, (%rdi), %xmm0, %xmm0
205 ; CHECK_FMA4: ret
206 define <4 x float> @test_x86_fmsub_ps_load(<4 x float>* %a0, <4 x float> %a1, <4 x float> %a2) {
207   %x = load <4 x float>* %a0
208   %y = fmul <4 x float> %x, %a1
209   %res = fsub <4 x float> %y, %a2
210   ret <4 x float> %res
211 }
212