]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/fma-scalar-memfold.ll
Vendor import of llvm trunk r338150:
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / fma-scalar-memfold.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -disable-peephole -mcpu=core-avx2 | FileCheck %s --check-prefix=CHECK --check-prefix=AVX2
3 ; RUN: llc < %s -disable-peephole -mcpu=skx | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512
4
5 target triple = "x86_64-unknown-unknown"
6
7 declare <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float>, <4 x float>, <4 x float>)
8 declare <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float>, <4 x float>, <4 x float>)
9 declare <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float>, <4 x float>, <4 x float>)
10 declare <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float>, <4 x float>, <4 x float>)
11
12 declare <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double>, <2 x double>, <2 x double>)
13 declare <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double>, <2 x double>, <2 x double>)
14 declare <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double>, <2 x double>, <2 x double>)
15 declare <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double>, <2 x double>, <2 x double>)
16
17 define void @fmadd_aab_ss(float* %a, float* %b) {
18 ; CHECK-LABEL: fmadd_aab_ss:
19 ; CHECK:       # %bb.0:
20 ; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
21 ; CHECK-NEXT:    vfmadd213ss (%rsi), %xmm0, %xmm0
22 ; CHECK-NEXT:    vmovss %xmm0, (%rdi)
23 ; CHECK-NEXT:    retq
24   %a.val = load float, float* %a
25   %av0 = insertelement <4 x float> undef, float %a.val, i32 0
26   %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1
27   %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2
28   %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3
29
30   %b.val = load float, float* %b
31   %bv0 = insertelement <4 x float> undef, float %b.val, i32 0
32   %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1
33   %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2
34   %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3
35
36   %vr = call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %av, <4 x float> %av, <4 x float> %bv)
37
38   %sr = extractelement <4 x float> %vr, i32 0
39   store float %sr, float* %a
40   ret void
41 }
42
43 define void @fmadd_aba_ss(float* %a, float* %b) {
44 ; CHECK-LABEL: fmadd_aba_ss:
45 ; CHECK:       # %bb.0:
46 ; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
47 ; CHECK-NEXT:    vfmadd231ss {{.*#+}} xmm0 = (xmm0 * mem) + xmm0
48 ; CHECK-NEXT:    vmovss %xmm0, (%rdi)
49 ; CHECK-NEXT:    retq
50   %a.val = load float, float* %a
51   %av0 = insertelement <4 x float> undef, float %a.val, i32 0
52   %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1
53   %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2
54   %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3
55
56   %b.val = load float, float* %b
57   %bv0 = insertelement <4 x float> undef, float %b.val, i32 0
58   %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1
59   %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2
60   %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3
61
62   %vr = call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %av, <4 x float> %bv, <4 x float> %av)
63
64   %sr = extractelement <4 x float> %vr, i32 0
65   store float %sr, float* %a
66   ret void
67 }
68
69 define void @fmsub_aab_ss(float* %a, float* %b) {
70 ; CHECK-LABEL: fmsub_aab_ss:
71 ; CHECK:       # %bb.0:
72 ; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
73 ; CHECK-NEXT:    vfmsub213ss (%rsi), %xmm0, %xmm0
74 ; CHECK-NEXT:    vmovss %xmm0, (%rdi)
75 ; CHECK-NEXT:    retq
76   %a.val = load float, float* %a
77   %av0 = insertelement <4 x float> undef, float %a.val, i32 0
78   %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1
79   %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2
80   %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3
81
82   %b.val = load float, float* %b
83   %bv0 = insertelement <4 x float> undef, float %b.val, i32 0
84   %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1
85   %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2
86   %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3
87
88   %vr = call <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float> %av, <4 x float> %av, <4 x float> %bv)
89
90   %sr = extractelement <4 x float> %vr, i32 0
91   store float %sr, float* %a
92   ret void
93 }
94
95 define void @fmsub_aba_ss(float* %a, float* %b) {
96 ; CHECK-LABEL: fmsub_aba_ss:
97 ; CHECK:       # %bb.0:
98 ; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
99 ; CHECK-NEXT:    vfmsub231ss {{.*#+}} xmm0 = (xmm0 * mem) - xmm0
100 ; CHECK-NEXT:    vmovss %xmm0, (%rdi)
101 ; CHECK-NEXT:    retq
102   %a.val = load float, float* %a
103   %av0 = insertelement <4 x float> undef, float %a.val, i32 0
104   %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1
105   %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2
106   %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3
107
108   %b.val = load float, float* %b
109   %bv0 = insertelement <4 x float> undef, float %b.val, i32 0
110   %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1
111   %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2
112   %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3
113
114   %vr = call <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float> %av, <4 x float> %bv, <4 x float> %av)
115
116   %sr = extractelement <4 x float> %vr, i32 0
117   store float %sr, float* %a
118   ret void
119 }
120
121 define void @fnmadd_aab_ss(float* %a, float* %b) {
122 ; CHECK-LABEL: fnmadd_aab_ss:
123 ; CHECK:       # %bb.0:
124 ; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
125 ; CHECK-NEXT:    vfnmadd213ss (%rsi), %xmm0, %xmm0
126 ; CHECK-NEXT:    vmovss %xmm0, (%rdi)
127 ; CHECK-NEXT:    retq
128   %a.val = load float, float* %a
129   %av0 = insertelement <4 x float> undef, float %a.val, i32 0
130   %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1
131   %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2
132   %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3
133
134   %b.val = load float, float* %b
135   %bv0 = insertelement <4 x float> undef, float %b.val, i32 0
136   %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1
137   %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2
138   %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3
139
140   %vr = call <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float> %av, <4 x float> %av, <4 x float> %bv)
141
142   %sr = extractelement <4 x float> %vr, i32 0
143   store float %sr, float* %a
144   ret void
145 }
146
147 define void @fnmadd_aba_ss(float* %a, float* %b) {
148 ; CHECK-LABEL: fnmadd_aba_ss:
149 ; CHECK:       # %bb.0:
150 ; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
151 ; CHECK-NEXT:    vfnmadd231ss {{.*#+}} xmm0 = -(xmm0 * mem) + xmm0
152 ; CHECK-NEXT:    vmovss %xmm0, (%rdi)
153 ; CHECK-NEXT:    retq
154   %a.val = load float, float* %a
155   %av0 = insertelement <4 x float> undef, float %a.val, i32 0
156   %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1
157   %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2
158   %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3
159
160   %b.val = load float, float* %b
161   %bv0 = insertelement <4 x float> undef, float %b.val, i32 0
162   %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1
163   %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2
164   %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3
165
166   %vr = call <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float> %av, <4 x float> %bv, <4 x float> %av)
167
168   %sr = extractelement <4 x float> %vr, i32 0
169   store float %sr, float* %a
170   ret void
171 }
172
173 define void @fnmsub_aab_ss(float* %a, float* %b) {
174 ; CHECK-LABEL: fnmsub_aab_ss:
175 ; CHECK:       # %bb.0:
176 ; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
177 ; CHECK-NEXT:    vfnmsub213ss (%rsi), %xmm0, %xmm0
178 ; CHECK-NEXT:    vmovss %xmm0, (%rdi)
179 ; CHECK-NEXT:    retq
180   %a.val = load float, float* %a
181   %av0 = insertelement <4 x float> undef, float %a.val, i32 0
182   %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1
183   %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2
184   %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3
185
186   %b.val = load float, float* %b
187   %bv0 = insertelement <4 x float> undef, float %b.val, i32 0
188   %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1
189   %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2
190   %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3
191
192   %vr = call <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float> %av, <4 x float> %av, <4 x float> %bv)
193
194   %sr = extractelement <4 x float> %vr, i32 0
195   store float %sr, float* %a
196   ret void
197 }
198
199 define void @fnmsub_aba_ss(float* %a, float* %b) {
200 ; CHECK-LABEL: fnmsub_aba_ss:
201 ; CHECK:       # %bb.0:
202 ; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
203 ; CHECK-NEXT:    vfnmsub231ss {{.*#+}} xmm0 = -(xmm0 * mem) - xmm0
204 ; CHECK-NEXT:    vmovss %xmm0, (%rdi)
205 ; CHECK-NEXT:    retq
206   %a.val = load float, float* %a
207   %av0 = insertelement <4 x float> undef, float %a.val, i32 0
208   %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1
209   %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2
210   %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3
211
212   %b.val = load float, float* %b
213   %bv0 = insertelement <4 x float> undef, float %b.val, i32 0
214   %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1
215   %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2
216   %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3
217
218   %vr = call <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float> %av, <4 x float> %bv, <4 x float> %av)
219
220   %sr = extractelement <4 x float> %vr, i32 0
221   store float %sr, float* %a
222   ret void
223 }
224
225 define void @fmadd_aab_sd(double* %a, double* %b) {
226 ; CHECK-LABEL: fmadd_aab_sd:
227 ; CHECK:       # %bb.0:
228 ; CHECK-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
229 ; CHECK-NEXT:    vfmadd213sd {{.*#+}} xmm0 = (xmm0 * xmm0) + mem
230 ; CHECK-NEXT:    vmovsd %xmm0, (%rdi)
231 ; CHECK-NEXT:    retq
232   %a.val = load double, double* %a
233   %av0 = insertelement <2 x double> undef, double %a.val, i32 0
234   %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1
235
236   %b.val = load double, double* %b
237   %bv0 = insertelement <2 x double> undef, double %b.val, i32 0
238   %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1
239
240   %vr = call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %av, <2 x double> %av, <2 x double> %bv)
241
242   %sr = extractelement <2 x double> %vr, i32 0
243   store double %sr, double* %a
244   ret void
245 }
246
247 define void @fmadd_aba_sd(double* %a, double* %b) {
248 ; CHECK-LABEL: fmadd_aba_sd:
249 ; CHECK:       # %bb.0:
250 ; CHECK-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
251 ; CHECK-NEXT:    vfmadd231sd {{.*#+}} xmm0 = (xmm0 * mem) + xmm0
252 ; CHECK-NEXT:    vmovsd %xmm0, (%rdi)
253 ; CHECK-NEXT:    retq
254   %a.val = load double, double* %a
255   %av0 = insertelement <2 x double> undef, double %a.val, i32 0
256   %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1
257
258   %b.val = load double, double* %b
259   %bv0 = insertelement <2 x double> undef, double %b.val, i32 0
260   %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1
261
262   %vr = call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %av, <2 x double> %bv, <2 x double> %av)
263
264   %sr = extractelement <2 x double> %vr, i32 0
265   store double %sr, double* %a
266   ret void
267 }
268
269 define void @fmsub_aab_sd(double* %a, double* %b) {
270 ; CHECK-LABEL: fmsub_aab_sd:
271 ; CHECK:       # %bb.0:
272 ; CHECK-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
273 ; CHECK-NEXT:    vfmsub213sd {{.*#+}} xmm0 = (xmm0 * xmm0) - mem
274 ; CHECK-NEXT:    vmovsd %xmm0, (%rdi)
275 ; CHECK-NEXT:    retq
276   %a.val = load double, double* %a
277   %av0 = insertelement <2 x double> undef, double %a.val, i32 0
278   %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1
279
280   %b.val = load double, double* %b
281   %bv0 = insertelement <2 x double> undef, double %b.val, i32 0
282   %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1
283
284   %vr = call <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double> %av, <2 x double> %av, <2 x double> %bv)
285
286   %sr = extractelement <2 x double> %vr, i32 0
287   store double %sr, double* %a
288   ret void
289 }
290
291 define void @fmsub_aba_sd(double* %a, double* %b) {
292 ; CHECK-LABEL: fmsub_aba_sd:
293 ; CHECK:       # %bb.0:
294 ; CHECK-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
295 ; CHECK-NEXT:    vfmsub231sd {{.*#+}} xmm0 = (xmm0 * mem) - xmm0
296 ; CHECK-NEXT:    vmovsd %xmm0, (%rdi)
297 ; CHECK-NEXT:    retq
298   %a.val = load double, double* %a
299   %av0 = insertelement <2 x double> undef, double %a.val, i32 0
300   %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1
301
302   %b.val = load double, double* %b
303   %bv0 = insertelement <2 x double> undef, double %b.val, i32 0
304   %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1
305
306   %vr = call <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double> %av, <2 x double> %bv, <2 x double> %av)
307
308   %sr = extractelement <2 x double> %vr, i32 0
309   store double %sr, double* %a
310   ret void
311 }
312
313 define void @fnmadd_aab_sd(double* %a, double* %b) {
314 ; CHECK-LABEL: fnmadd_aab_sd:
315 ; CHECK:       # %bb.0:
316 ; CHECK-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
317 ; CHECK-NEXT:    vfnmadd213sd {{.*#+}} xmm0 = -(xmm0 * xmm0) + mem
318 ; CHECK-NEXT:    vmovsd %xmm0, (%rdi)
319 ; CHECK-NEXT:    retq
320   %a.val = load double, double* %a
321   %av0 = insertelement <2 x double> undef, double %a.val, i32 0
322   %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1
323
324   %b.val = load double, double* %b
325   %bv0 = insertelement <2 x double> undef, double %b.val, i32 0
326   %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1
327
328   %vr = call <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double> %av, <2 x double> %av, <2 x double> %bv)
329
330   %sr = extractelement <2 x double> %vr, i32 0
331   store double %sr, double* %a
332   ret void
333 }
334
335 define void @fnmadd_aba_sd(double* %a, double* %b) {
336 ; CHECK-LABEL: fnmadd_aba_sd:
337 ; CHECK:       # %bb.0:
338 ; CHECK-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
339 ; CHECK-NEXT:    vfnmadd231sd {{.*#+}} xmm0 = -(xmm0 * mem) + xmm0
340 ; CHECK-NEXT:    vmovsd %xmm0, (%rdi)
341 ; CHECK-NEXT:    retq
342   %a.val = load double, double* %a
343   %av0 = insertelement <2 x double> undef, double %a.val, i32 0
344   %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1
345
346   %b.val = load double, double* %b
347   %bv0 = insertelement <2 x double> undef, double %b.val, i32 0
348   %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1
349
350   %vr = call <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double> %av, <2 x double> %bv, <2 x double> %av)
351
352   %sr = extractelement <2 x double> %vr, i32 0
353   store double %sr, double* %a
354   ret void
355 }
356
357 define void @fnmsub_aab_sd(double* %a, double* %b) {
358 ; CHECK-LABEL: fnmsub_aab_sd:
359 ; CHECK:       # %bb.0:
360 ; CHECK-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
361 ; CHECK-NEXT:    vfnmsub213sd {{.*#+}} xmm0 = -(xmm0 * xmm0) - mem
362 ; CHECK-NEXT:    vmovsd %xmm0, (%rdi)
363 ; CHECK-NEXT:    retq
364   %a.val = load double, double* %a
365   %av0 = insertelement <2 x double> undef, double %a.val, i32 0
366   %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1
367
368   %b.val = load double, double* %b
369   %bv0 = insertelement <2 x double> undef, double %b.val, i32 0
370   %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1
371
372   %vr = call <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double> %av, <2 x double> %av, <2 x double> %bv)
373
374   %sr = extractelement <2 x double> %vr, i32 0
375   store double %sr, double* %a
376   ret void
377 }
378
379 define void @fnmsub_aba_sd(double* %a, double* %b) {
380 ; CHECK-LABEL: fnmsub_aba_sd:
381 ; CHECK:       # %bb.0:
382 ; CHECK-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
383 ; CHECK-NEXT:    vfnmsub231sd {{.*#+}} xmm0 = -(xmm0 * mem) - xmm0
384 ; CHECK-NEXT:    vmovsd %xmm0, (%rdi)
385 ; CHECK-NEXT:    retq
386   %a.val = load double, double* %a
387   %av0 = insertelement <2 x double> undef, double %a.val, i32 0
388   %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1
389
390   %b.val = load double, double* %b
391   %bv0 = insertelement <2 x double> undef, double %b.val, i32 0
392   %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1
393
394   %vr = call <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double> %av, <2 x double> %bv, <2 x double> %av)
395
396   %sr = extractelement <2 x double> %vr, i32 0
397   store double %sr, double* %a
398   ret void
399 }
400
401