]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/fma-fneg-combine.ll
Vendor import of llvm trunk r321414:
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / fma-fneg-combine.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512bw -mattr=+avx512vl -mattr=+avx512dq  | FileCheck %s  --check-prefix=CHECK --check-prefix=SKX
3 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f -mattr=+fma | FileCheck %s --check-prefix=CHECK --check-prefix=KNL
4
5 ; This test checks combinations of FNEG and FMA intrinsics on AVX-512 target
6 ; PR28892
7
8 define <16 x float> @test1(<16 x float> %a, <16 x float> %b, <16 x float> %c)  {
9 ; CHECK-LABEL: test1:
10 ; CHECK:       # %bb.0: # %entry
11 ; CHECK-NEXT:    vfmsub213ps %zmm2, %zmm1, %zmm0
12 ; CHECK-NEXT:    retq
13 entry:
14   %sub.i = fsub <16 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, 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>, %c
15   %0 = tail call <16 x float> @llvm.x86.avx512.mask.vfmadd.ps.512(<16 x float> %a, <16 x float> %b, <16 x float> %sub.i, i16 -1, i32 4) #2
16   ret <16 x float> %0
17 }
18
19 declare <16 x float> @llvm.x86.avx512.mask.vfmadd.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
20 declare <16 x float> @llvm.x86.avx512.mask.vfnmadd.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
21 declare <16 x float> @llvm.x86.avx512.mask.vfnmsub.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
22
23
24 define <16 x float> @test2(<16 x float> %a, <16 x float> %b, <16 x float> %c) {
25 ; CHECK-LABEL: test2:
26 ; CHECK:       # %bb.0: # %entry
27 ; CHECK-NEXT:    vfnmsub213ps %zmm2, %zmm1, %zmm0
28 ; CHECK-NEXT:    retq
29 entry:
30   %0 = tail call <16 x float> @llvm.x86.avx512.mask.vfmadd.ps.512(<16 x float> %a, <16 x float> %b, <16 x float> %c, i16 -1, i32 4) #2
31   %sub.i = fsub <16 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, 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>, %0
32   ret <16 x float> %sub.i
33 }
34
35 define <16 x float> @test3(<16 x float> %a, <16 x float> %b, <16 x float> %c)  {
36 ; CHECK-LABEL: test3:
37 ; CHECK:       # %bb.0: # %entry
38 ; CHECK-NEXT:    vfmsub213ps %zmm2, %zmm1, %zmm0
39 ; CHECK-NEXT:    retq
40 entry:
41   %0 = tail call <16 x float> @llvm.x86.avx512.mask.vfnmadd.ps.512(<16 x float> %a, <16 x float> %b, <16 x float> %c, i16 -1, i32 4) #2
42   %sub.i = fsub <16 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, 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>, %0
43   ret <16 x float> %sub.i
44 }
45
46 define <16 x float> @test4(<16 x float> %a, <16 x float> %b, <16 x float> %c) {
47 ; CHECK-LABEL: test4:
48 ; CHECK:       # %bb.0: # %entry
49 ; CHECK-NEXT:    vfmadd213ps %zmm2, %zmm1, %zmm0
50 ; CHECK-NEXT:    retq
51 entry:
52   %0 = tail call <16 x float> @llvm.x86.avx512.mask.vfnmsub.ps.512(<16 x float> %a, <16 x float> %b, <16 x float> %c, i16 -1, i32 4) #2
53   %sub.i = fsub <16 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, 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>, %0
54   ret <16 x float> %sub.i
55 }
56
57 define <16 x float> @test5(<16 x float> %a, <16 x float> %b, <16 x float> %c) {
58 ; CHECK-LABEL: test5:
59 ; CHECK:       # %bb.0: # %entry
60 ; CHECK-NEXT:    vfmsub213ps {ru-sae}, %zmm2, %zmm1, %zmm0
61 ; CHECK-NEXT:    retq
62 entry:
63   %sub.i = fsub <16 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, 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>, %c
64   %0 = tail call <16 x float> @llvm.x86.avx512.mask.vfmadd.ps.512(<16 x float> %a, <16 x float> %b, <16 x float> %sub.i, i16 -1, i32 2) #2
65   ret <16 x float> %0
66 }
67
68 define <16 x float> @test6(<16 x float> %a, <16 x float> %b, <16 x float> %c) {
69 ; CHECK-LABEL: test6:
70 ; CHECK:       # %bb.0: # %entry
71 ; CHECK-NEXT:    vfmadd213ps {ru-sae}, %zmm2, %zmm1, %zmm0
72 ; CHECK-NEXT:    retq
73 entry:
74   %0 = tail call <16 x float> @llvm.x86.avx512.mask.vfnmsub.ps.512(<16 x float> %a, <16 x float> %b, <16 x float> %c, i16 -1, i32 2) #2
75   %sub.i = fsub <16 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, 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>, %0
76   ret <16 x float> %sub.i
77 }
78
79
80 define <8 x float> @test7(<8 x float> %a, <8 x float> %b, <8 x float> %c) {
81 ; CHECK-LABEL: test7:
82 ; CHECK:       # %bb.0: # %entry
83 ; CHECK-NEXT:    vfnmadd213ps %ymm2, %ymm1, %ymm0
84 ; CHECK-NEXT:    retq
85 entry:
86   %0 = tail call <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %c) #2
87   %sub.i = 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>, %0
88   ret <8 x float> %sub.i
89 }
90
91 define <8 x float> @test8(<8 x float> %a, <8 x float> %b, <8 x float> %c) {
92 ; SKX-LABEL: test8:
93 ; SKX:       # %bb.0: # %entry
94 ; SKX-NEXT:    vxorps {{.*}}(%rip){1to8}, %ymm2, %ymm2
95 ; SKX-NEXT:    vfmsub213ps %ymm2, %ymm1, %ymm0
96 ; SKX-NEXT:    retq
97 ;
98 ; KNL-LABEL: test8:
99 ; KNL:       # %bb.0: # %entry
100 ; KNL-NEXT:    vbroadcastss {{.*#+}} ymm3 = [-0,-0,-0,-0,-0,-0,-0,-0]
101 ; KNL-NEXT:    vxorps %ymm3, %ymm2, %ymm2
102 ; KNL-NEXT:    vfmsub213ps %ymm2, %ymm1, %ymm0
103 ; KNL-NEXT:    retq
104 entry:
105   %sub.c = 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>, %c
106   %0 = tail call <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %sub.c) #2
107   ret <8 x float> %0
108 }
109
110 declare <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float>, <8 x float>, <8 x float>)
111
112
113 define <8 x double> @test9(<8 x double> %a, <8 x double> %b, <8 x double> %c) {
114 ; CHECK-LABEL: test9:
115 ; CHECK:       # %bb.0: # %entry
116 ; CHECK-NEXT:    vfnmsub213pd %zmm2, %zmm1, %zmm0
117 ; CHECK-NEXT:    retq
118 entry:
119   %0 = tail call <8 x double> @llvm.x86.avx512.mask.vfmadd.pd.512(<8 x double> %a, <8 x double> %b, <8 x double> %c, i8 -1, i32 4) #2
120   %sub.i = fsub <8 x double> <double -0.000000e+00, double -0.000000e+00, double -0.000000e+00, double -0.000000e+00, double -0.000000e+00, double -0.000000e+00, double -0.000000e+00, double -0.000000e+00>, %0
121   ret <8 x double> %sub.i
122 }
123
124 declare <8 x double> @llvm.x86.avx512.mask.vfmadd.pd.512(<8 x double> %a, <8 x double> %b, <8 x double> %c, i8, i32)
125
126 define <2 x double> @test10(<2 x double> %a, <2 x double> %b, <2 x double> %c) {
127 ; CHECK-LABEL: test10:
128 ; CHECK:       # %bb.0: # %entry
129 ; CHECK-NEXT:    vfmadd213sd %xmm2, %xmm1, %xmm0
130 ; CHECK-NEXT:    vxorpd {{.*}}(%rip), %xmm0, %xmm0
131 ; CHECK-NEXT:    retq
132 entry:
133   %0 = tail call <2 x double> @llvm.x86.avx512.mask.vfmadd.sd(<2 x double> %a, <2 x double> %b, <2 x double> %c, i8 -1, i32 4) #2
134   %sub.i = fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, %0
135   ret <2 x double> %sub.i
136 }
137
138 declare <2 x double> @llvm.x86.avx512.mask.vfmadd.sd(<2 x double> %a, <2 x double> %b, <2 x double> %c, i8, i32)
139
140 define <4 x float> @test11(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {
141 ; SKX-LABEL: test11:
142 ; SKX:       # %bb.0: # %entry
143 ; SKX-NEXT:    vxorps {{.*}}(%rip){1to4}, %xmm2, %xmm2
144 ; SKX-NEXT:    kmovd %edi, %k1
145 ; SKX-NEXT:    vfmadd231ss %xmm1, %xmm0, %xmm2 {%k1}
146 ; SKX-NEXT:    vmovaps %xmm2, %xmm0
147 ; SKX-NEXT:    retq
148 ;
149 ; KNL-LABEL: test11:
150 ; KNL:       # %bb.0: # %entry
151 ; KNL-NEXT:    vbroadcastss {{.*#+}} xmm3 = [-0,-0,-0,-0]
152 ; KNL-NEXT:    vxorps %xmm3, %xmm2, %xmm2
153 ; KNL-NEXT:    kmovw %edi, %k1
154 ; KNL-NEXT:    vfmadd231ss %xmm1, %xmm0, %xmm2 {%k1}
155 ; KNL-NEXT:    vmovaps %xmm2, %xmm0
156 ; KNL-NEXT:    retq
157 entry:
158   %sub.i = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %c
159   %0 = tail call <4 x float> @llvm.x86.avx512.mask3.vfmadd.ss(<4 x float> %a, <4 x float> %b, <4 x float> %sub.i, i8 %mask, i32 4) #10
160   ret <4 x float> %0
161 }
162
163 declare <4 x float> @llvm.x86.avx512.mask3.vfmadd.ss(<4 x float>, <4 x float>, <4 x float>, i8, i32)
164
165 define <4 x float> @test11b(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {
166 ; SKX-LABEL: test11b:
167 ; SKX:       # %bb.0: # %entry
168 ; SKX-NEXT:    kmovd %edi, %k1
169 ; SKX-NEXT:    vfmsub213ss %xmm2, %xmm1, %xmm0 {%k1}
170 ; SKX-NEXT:    retq
171 ;
172 ; KNL-LABEL: test11b:
173 ; KNL:       # %bb.0: # %entry
174 ; KNL-NEXT:    kmovw %edi, %k1
175 ; KNL-NEXT:    vfmsub213ss %xmm2, %xmm1, %xmm0 {%k1}
176 ; KNL-NEXT:    retq
177 entry:
178   %sub.i = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %c
179   %0 = tail call <4 x float> @llvm.x86.avx512.mask.vfmadd.ss(<4 x float> %a, <4 x float> %b, <4 x float> %sub.i, i8 %mask, i32 4) #10
180   ret <4 x float> %0
181 }
182
183 declare <4 x float> @llvm.x86.avx512.mask.vfmadd.ss(<4 x float>, <4 x float>, <4 x float>, i8, i32)
184
185 define <8 x double> @test12(<8 x double> %a, <8 x double> %b, <8 x double> %c, i8 %mask) {
186 ; SKX-LABEL: test12:
187 ; SKX:       # %bb.0: # %entry
188 ; SKX-NEXT:    kmovd %edi, %k1
189 ; SKX-NEXT:    vfmadd132pd %zmm1, %zmm2, %zmm0 {%k1}
190 ; SKX-NEXT:    vxorpd {{.*}}(%rip){1to8}, %zmm0, %zmm0
191 ; SKX-NEXT:    retq
192 ;
193 ; KNL-LABEL: test12:
194 ; KNL:       # %bb.0: # %entry
195 ; KNL-NEXT:    kmovw %edi, %k1
196 ; KNL-NEXT:    vfmadd132pd %zmm1, %zmm2, %zmm0 {%k1}
197 ; KNL-NEXT:    vpxorq {{.*}}(%rip){1to8}, %zmm0, %zmm0
198 ; KNL-NEXT:    retq
199 entry:
200   %0 = tail call <8 x double> @llvm.x86.avx512.mask.vfmadd.pd.512(<8 x double> %a, <8 x double> %b, <8 x double> %c, i8 %mask, i32 4) #2
201   %sub.i = fsub <8 x double> <double -0.000000e+00, double -0.000000e+00, double -0.000000e+00, double -0.000000e+00, double -0.000000e+00, double -0.000000e+00, double -0.000000e+00, double -0.000000e+00>, %0
202   ret <8 x double> %sub.i
203 }
204
205 define <2 x double> @test13(<2 x double> %a, <2 x double> %b, <2 x double> %c, i8 %mask) {
206 ; SKX-LABEL: test13:
207 ; SKX:       # %bb.0: # %entry
208 ; SKX-NEXT:    vxorpd {{.*}}(%rip), %xmm0, %xmm0
209 ; SKX-NEXT:    kmovd %edi, %k1
210 ; SKX-NEXT:    vfmadd213sd %xmm2, %xmm1, %xmm0 {%k1}
211 ; SKX-NEXT:    retq
212 ;
213 ; KNL-LABEL: test13:
214 ; KNL:       # %bb.0: # %entry
215 ; KNL-NEXT:    vxorpd {{.*}}(%rip), %xmm0, %xmm0
216 ; KNL-NEXT:    kmovw %edi, %k1
217 ; KNL-NEXT:    vfmadd213sd %xmm2, %xmm1, %xmm0 {%k1}
218 ; KNL-NEXT:    retq
219
220 entry:
221   %sub.i = fsub <2 x double> <double -0.000000e+00, double -0.000000e+00>, %a
222   %0 = tail call <2 x double> @llvm.x86.avx512.mask.vfmadd.sd(<2 x double> %sub.i, <2 x double> %b, <2 x double> %c, i8 %mask, i32 4)
223   ret <2 x double> %0
224 }
225
226 define <16 x float> @test14(<16 x float> %a, <16 x float> %b, <16 x float> %c, i16 %mask) {
227 ; SKX-LABEL: test14:
228 ; SKX:       # %bb.0: # %entry
229 ; SKX-NEXT:    kmovd %edi, %k1
230 ; SKX-NEXT:    vfnmsub132ps {ru-sae}, %zmm1, %zmm2, %zmm0 {%k1}
231 ; SKX-NEXT:    vxorps {{.*}}(%rip){1to16}, %zmm0, %zmm0
232 ; SKX-NEXT:    retq
233 ;
234 ; KNL-LABEL: test14:
235 ; KNL:       # %bb.0: # %entry
236 ; KNL-NEXT:    kmovw %edi, %k1
237 ; KNL-NEXT:    vfnmsub132ps {ru-sae}, %zmm1, %zmm2, %zmm0 {%k1}
238 ; KNL-NEXT:    vpxord {{.*}}(%rip){1to16}, %zmm0, %zmm0
239 ; KNL-NEXT:    retq
240 entry:
241   %0 = tail call <16 x float> @llvm.x86.avx512.mask.vfnmsub.ps.512(<16 x float> %a, <16 x float> %b, <16 x float> %c, i16 %mask, i32 2) #2
242   %sub.i = fsub <16 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, 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>, %0
243   ret <16 x float> %sub.i
244 }
245
246 define <16 x float> @test15(<16 x float> %a, <16 x float> %b, <16 x float> %c, i16 %mask)  {
247 ; SKX-LABEL: test15:
248 ; SKX:       # %bb.0: # %entry
249 ; SKX-NEXT:    kmovd %edi, %k1
250 ; SKX-NEXT:    vxorps {{.*}}(%rip){1to16}, %zmm0, %zmm3
251 ; SKX-NEXT:    vfnmadd213ps {ru-sae}, %zmm2, %zmm0, %zmm1
252 ; SKX-NEXT:    vmovaps %zmm1, %zmm3 {%k1}
253 ; SKX-NEXT:    vfnmadd132ps {rd-sae}, %zmm0, %zmm2, %zmm3 {%k1}
254 ; SKX-NEXT:    vmovaps %zmm3, %zmm0
255 ; SKX-NEXT:    retq
256 ;
257 ; KNL-LABEL: test15:
258 ; KNL:       # %bb.0: # %entry
259 ; KNL-NEXT:    kmovw %edi, %k1
260 ; KNL-NEXT:    vpxord {{.*}}(%rip){1to16}, %zmm0, %zmm3
261 ; KNL-NEXT:    vfnmadd213ps {ru-sae}, %zmm2, %zmm0, %zmm1
262 ; KNL-NEXT:    vmovaps %zmm1, %zmm3 {%k1}
263 ; KNL-NEXT:    vfnmadd132ps {rd-sae}, %zmm0, %zmm2, %zmm3 {%k1}
264 ; KNL-NEXT:    vmovaps %zmm3, %zmm0
265 ; KNL-NEXT:    retq
266 entry:
267   %sub.i = fsub <16 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, 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>, %a
268   %0 = tail call <16 x float> @llvm.x86.avx512.mask.vfmadd.ps.512(<16 x float> %sub.i, <16 x float> %b, <16 x float> %c, i16 %mask, i32 2)
269   %1 = tail call <16 x float> @llvm.x86.avx512.mask.vfmadd.ps.512(<16 x float> %0, <16 x float> %sub.i, <16 x float> %c, i16 %mask, i32 1)
270   ret <16 x float> %1
271 }
272
273 define <16 x float> @test16(<16 x float> %a, <16 x float> %b, <16 x float> %c, i16 %mask) {
274 ; SKX-LABEL: test16:
275 ; SKX:       # %bb.0:
276 ; SKX-NEXT:    kmovd %edi, %k1
277 ; SKX-NEXT:    vfmsubadd132ps {rd-sae}, %zmm1, %zmm2, %zmm0 {%k1}
278 ; SKX-NEXT:    retq
279 ;
280 ; KNL-LABEL: test16:
281 ; KNL:       # %bb.0:
282 ; KNL-NEXT:    kmovw %edi, %k1
283 ; KNL-NEXT:    vfmsubadd132ps {rd-sae}, %zmm1, %zmm2, %zmm0 {%k1}
284 ; KNL-NEXT:    retq
285   %sub.i = fsub <16 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, 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>, %c
286   %res = call <16 x float> @llvm.x86.avx512.mask.vfmaddsub.ps.512(<16 x float> %a, <16 x float> %b, <16 x float> %sub.i, i16 %mask, i32 1)
287   ret <16 x float> %res
288 }
289 declare <16 x float> @llvm.x86.avx512.mask.vfmaddsub.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
290
291 define <8 x double> @test17(<8 x double> %a, <8 x double> %b, <8 x double> %c, i8 %mask) {
292 ; SKX-LABEL: test17:
293 ; SKX:       # %bb.0:
294 ; SKX-NEXT:    kmovd %edi, %k1
295 ; SKX-NEXT:    vfmsubadd132pd %zmm1, %zmm2, %zmm0 {%k1}
296 ; SKX-NEXT:    retq
297 ;
298 ; KNL-LABEL: test17:
299 ; KNL:       # %bb.0:
300 ; KNL-NEXT:    kmovw %edi, %k1
301 ; KNL-NEXT:    vfmsubadd132pd %zmm1, %zmm2, %zmm0 {%k1}
302 ; KNL-NEXT:    retq
303   %sub.i = fsub <8 x double> <double -0.000000e+00, double -0.000000e+00, double -0.000000e+00, double -0.000000e+00, double -0.000000e+00, double -0.000000e+00, double -0.000000e+00, double -0.000000e+00>, %c
304   %res = call <8 x double> @llvm.x86.avx512.mask.vfmaddsub.pd.512(<8 x double> %a, <8 x double> %b, <8 x double> %sub.i, i8 %mask, i32 4)
305   ret <8 x double> %res
306 }
307 declare <8 x double> @llvm.x86.avx512.mask.vfmaddsub.pd.512(<8 x double>, <8 x double>, <8 x double>, i8, i32)
308
309 define <4 x float> @test18(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {
310 ; SKX-LABEL: test18:
311 ; SKX:       # %bb.0: # %entry
312 ; SKX-NEXT:    kmovd %edi, %k1
313 ; SKX-NEXT:    vfnmadd213ss %xmm2, %xmm1, %xmm0 {%k1}
314 ; SKX-NEXT:    retq
315 ;
316 ; KNL-LABEL: test18:
317 ; KNL:       # %bb.0: # %entry
318 ; KNL-NEXT:    kmovw %edi, %k1
319 ; KNL-NEXT:    vfnmadd213ss %xmm2, %xmm1, %xmm0 {%k1}
320 ; KNL-NEXT:    retq
321 entry:
322   %sub.i = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %b
323   %0 = tail call <4 x float> @llvm.x86.avx512.mask.vfmadd.ss(<4 x float> %a, <4 x float> %sub.i, <4 x float> %c, i8 %mask, i32 4) #10
324   ret <4 x float> %0
325 }
326
327 define <4 x float> @test19(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {
328 ; SKX-LABEL: test19:
329 ; SKX:       # %bb.0: # %entry
330 ; SKX-NEXT:    kmovd %edi, %k1
331 ; SKX-NEXT:    vfnmsub213ss %xmm2, %xmm1, %xmm0 {%k1}
332 ; SKX-NEXT:    retq
333 ;
334 ; KNL-LABEL: test19:
335 ; KNL:       # %bb.0: # %entry
336 ; KNL-NEXT:    kmovw %edi, %k1
337 ; KNL-NEXT:    vfnmsub213ss %xmm2, %xmm1, %xmm0 {%k1}
338 ; KNL-NEXT:    retq
339 entry:
340   %sub.i = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %b
341   %sub.i.2 = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %c
342   %0 = tail call <4 x float> @llvm.x86.avx512.mask.vfmadd.ss(<4 x float> %a, <4 x float> %sub.i, <4 x float> %sub.i.2, i8 %mask, i32 4) #10
343   ret <4 x float> %0
344 }
345
346 define <4 x float> @test20(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {
347 ; SKX-LABEL: test20:
348 ; SKX:       # %bb.0: # %entry
349 ; SKX-NEXT:    kmovd %edi, %k1
350 ; SKX-NEXT:    vfnmadd231ss %xmm1, %xmm0, %xmm2 {%k1}
351 ; SKX-NEXT:    vmovaps %xmm2, %xmm0
352 ; SKX-NEXT:    retq
353 ;
354 ; KNL-LABEL: test20:
355 ; KNL:       # %bb.0: # %entry
356 ; KNL-NEXT:    kmovw %edi, %k1
357 ; KNL-NEXT:    vfnmadd231ss %xmm1, %xmm0, %xmm2 {%k1}
358 ; KNL-NEXT:    vmovaps %xmm2, %xmm0
359 ; KNL-NEXT:    retq
360 entry:
361   %sub.i = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %b
362   %0 = tail call <4 x float> @llvm.x86.avx512.mask3.vfmadd.ss(<4 x float> %a, <4 x float> %sub.i, <4 x float> %c, i8 %mask, i32 4) #10
363   ret <4 x float> %0
364 }
365
366 define <4 x float> @test21(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {
367 ; SKX-LABEL: test21:
368 ; SKX:       # %bb.0: # %entry
369 ; SKX-NEXT:    kmovd %edi, %k1
370 ; SKX-NEXT:    vfnmadd213ss {rn-sae}, %xmm2, %xmm1, %xmm0 {%k1}
371 ; SKX-NEXT:    retq
372 ;
373 ; KNL-LABEL: test21:
374 ; KNL:       # %bb.0: # %entry
375 ; KNL-NEXT:    kmovw %edi, %k1
376 ; KNL-NEXT:    vfnmadd213ss {rn-sae}, %xmm2, %xmm1, %xmm0 {%k1}
377 ; KNL-NEXT:    retq
378 entry:
379   %sub.i = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %b
380   %0 = tail call <4 x float> @llvm.x86.avx512.mask.vfmadd.ss(<4 x float> %a, <4 x float> %sub.i, <4 x float> %c, i8 %mask, i32 8) #10
381   ret <4 x float> %0
382 }
383
384 define <4 x float> @test22(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {
385 ; SKX-LABEL: test22:
386 ; SKX:       # %bb.0: # %entry
387 ; SKX-NEXT:    kmovd %edi, %k1
388 ; SKX-NEXT:    vfnmsub213ss {rn-sae}, %xmm2, %xmm1, %xmm0 {%k1}
389 ; SKX-NEXT:    retq
390 ;
391 ; KNL-LABEL: test22:
392 ; KNL:       # %bb.0: # %entry
393 ; KNL-NEXT:    kmovw %edi, %k1
394 ; KNL-NEXT:    vfnmsub213ss {rn-sae}, %xmm2, %xmm1, %xmm0 {%k1}
395 ; KNL-NEXT:    retq
396 entry:
397   %sub.i = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %b
398   %sub.i.2 = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %c
399   %0 = tail call <4 x float> @llvm.x86.avx512.mask.vfmadd.ss(<4 x float> %a, <4 x float> %sub.i, <4 x float> %sub.i.2, i8 %mask, i32 8) #10
400   ret <4 x float> %0
401 }
402
403 define <4 x float> @test23(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {
404 ; SKX-LABEL: test23:
405 ; SKX:       # %bb.0: # %entry
406 ; SKX-NEXT:    kmovd %edi, %k1
407 ; SKX-NEXT:    vfnmadd231ss {rn-sae}, %xmm1, %xmm0, %xmm2 {%k1}
408 ; SKX-NEXT:    vmovaps %xmm2, %xmm0
409 ; SKX-NEXT:    retq
410 ;
411 ; KNL-LABEL: test23:
412 ; KNL:       # %bb.0: # %entry
413 ; KNL-NEXT:    kmovw %edi, %k1
414 ; KNL-NEXT:    vfnmadd231ss {rn-sae}, %xmm1, %xmm0, %xmm2 {%k1}
415 ; KNL-NEXT:    vmovaps %xmm2, %xmm0
416 ; KNL-NEXT:    retq
417 entry:
418   %sub.i = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %b
419   %0 = tail call <4 x float> @llvm.x86.avx512.mask3.vfmadd.ss(<4 x float> %a, <4 x float> %sub.i, <4 x float> %c, i8 %mask, i32 8) #10
420   ret <4 x float> %0
421 }
422
423 define <4 x float> @test24(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {
424 ; SKX-LABEL: test24:
425 ; SKX:       # %bb.0: # %entry
426 ; SKX-NEXT:    kmovd %edi, %k1
427 ; SKX-NEXT:    vfmsub213ss {rn-sae}, %xmm2, %xmm1, %xmm0 {%k1}
428 ; SKX-NEXT:    retq
429 ;
430 ; KNL-LABEL: test24:
431 ; KNL:       # %bb.0: # %entry
432 ; KNL-NEXT:    kmovw %edi, %k1
433 ; KNL-NEXT:    vfmsub213ss {rn-sae}, %xmm2, %xmm1, %xmm0 {%k1}
434 ; KNL-NEXT:    retq
435 entry:
436   %sub.i = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %c
437   %0 = tail call <4 x float> @llvm.x86.avx512.mask.vfmadd.ss(<4 x float> %a, <4 x float> %b, <4 x float> %sub.i, i8 %mask, i32 8) #10
438   ret <4 x float> %0
439 }
440
441 define <16 x float> @test25(<16 x float> %a, <16 x float> %b, <16 x float> %c)  {
442 ; CHECK-LABEL: test25:
443 ; CHECK:       # %bb.0: # %entry
444 ; CHECK-NEXT:    vfnmsub213ps {rn-sae}, %zmm2, %zmm1, %zmm0
445 ; CHECK-NEXT:    retq
446 entry:
447   %sub.i = fsub <16 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, 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>, %b
448   %sub.i.2 = fsub <16 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, 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>, %c
449   %0 = tail call <16 x float> @llvm.x86.avx512.mask.vfmadd.ps.512(<16 x float> %a, <16 x float> %sub.i, <16 x float> %sub.i.2, i16 -1, i32 8) #2
450   ret <16 x float> %0
451 }