Branch data Line data Source code
1 : : ;; GCC machine description for SSE instructions
2 : : ;; Copyright (C) 2005-2024 Free Software Foundation, Inc.
3 : : ;;
4 : : ;; This file is part of GCC.
5 : : ;;
6 : : ;; GCC is free software; you can redistribute it and/or modify
7 : : ;; it under the terms of the GNU General Public License as published by
8 : : ;; the Free Software Foundation; either version 3, or (at your option)
9 : : ;; any later version.
10 : : ;;
11 : : ;; GCC is distributed in the hope that it will be useful,
12 : : ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : : ;; GNU General Public License for more details.
15 : : ;;
16 : : ;; You should have received a copy of the GNU General Public License
17 : : ;; along with GCC; see the file COPYING3. If not see
18 : : ;; <http://www.gnu.org/licenses/>.
19 : :
20 : : (define_c_enum "unspec" [
21 : : ;; SSE
22 : : UNSPEC_MOVNT
23 : :
24 : : ;; SSE2
25 : : UNSPEC_MOVDI_TO_SSE
26 : :
27 : : ;; SSE3
28 : : UNSPEC_LDDQU
29 : :
30 : : ;; SSSE3
31 : : UNSPEC_PSIGN
32 : : UNSPEC_PALIGNR
33 : :
34 : : ;; For SSE4A support
35 : : UNSPEC_EXTRQI
36 : : UNSPEC_EXTRQ
37 : : UNSPEC_INSERTQI
38 : : UNSPEC_INSERTQ
39 : :
40 : : ;; For SSE4.1 support
41 : : UNSPEC_DP
42 : : UNSPEC_MOVNTDQA
43 : : UNSPEC_MPSADBW
44 : : UNSPEC_PHMINPOSUW
45 : : UNSPEC_PTEST
46 : :
47 : : ;; For SSE4.2 support
48 : : UNSPEC_PCMPESTR
49 : : UNSPEC_PCMPISTR
50 : :
51 : : ;; For FMA4 support
52 : : UNSPEC_FMADDSUB
53 : : UNSPEC_XOP_UNSIGNED_CMP
54 : : UNSPEC_XOP_TRUEFALSE
55 : : UNSPEC_FRCZ
56 : :
57 : : ;; For AES support
58 : : UNSPEC_AESENC
59 : : UNSPEC_AESENCLAST
60 : : UNSPEC_AESDEC
61 : : UNSPEC_AESDECLAST
62 : : UNSPEC_AESIMC
63 : : UNSPEC_AESKEYGENASSIST
64 : :
65 : : ;; For PCLMUL support
66 : : UNSPEC_PCLMUL
67 : :
68 : : ;; For AVX support
69 : : UNSPEC_VPERMIL
70 : : UNSPEC_VPERMIL2
71 : : UNSPEC_VPERMIL2F128
72 : : UNSPEC_CAST
73 : : UNSPEC_VTESTP
74 : : UNSPEC_VCVTPH2PS
75 : : UNSPEC_VCVTPS2PH
76 : :
77 : : ;; For AVX2 support
78 : : UNSPEC_VPERMVAR
79 : : UNSPEC_VPERMTI
80 : : UNSPEC_GATHER
81 : : UNSPEC_VSIBADDR
82 : :
83 : : ;; For AVX512F support
84 : : UNSPEC_VPERMT2
85 : : UNSPEC_UNSIGNED_FIX_NOTRUNC
86 : : UNSPEC_UNSIGNED_PCMP
87 : : UNSPEC_TESTM
88 : : UNSPEC_TESTNM
89 : : UNSPEC_SCATTER
90 : : UNSPEC_RCP14
91 : : UNSPEC_RSQRT14
92 : : UNSPEC_FIXUPIMM
93 : : UNSPEC_VTERNLOG
94 : : UNSPEC_GETEXP
95 : : UNSPEC_GETMANT
96 : : UNSPEC_ALIGN
97 : : UNSPEC_CONFLICT
98 : : UNSPEC_COMPRESS
99 : : UNSPEC_COMPRESS_STORE
100 : : UNSPEC_EXPAND
101 : : UNSPEC_VCVTT
102 : : UNSPEC_VCVTTU
103 : :
104 : : ;; Mask operations
105 : : UNSPEC_MASKOP
106 : : UNSPEC_KORTEST
107 : : UNSPEC_KTEST
108 : : ;; Mask load
109 : : UNSPEC_MASKLOAD
110 : :
111 : : ;; For embed. rounding feature
112 : : UNSPEC_EMBEDDED_ROUNDING
113 : :
114 : : ;; For SHA support
115 : : UNSPEC_SHA1MSG1
116 : : UNSPEC_SHA1MSG2
117 : : UNSPEC_SHA1NEXTE
118 : : UNSPEC_SHA1RNDS4
119 : : UNSPEC_SHA256MSG1
120 : : UNSPEC_SHA256MSG2
121 : : UNSPEC_SHA256RNDS2
122 : :
123 : : ;; For AVX512BW support
124 : : UNSPEC_DBPSADBW
125 : : UNSPEC_PMADDUBSW512
126 : : UNSPEC_PMADDWD512
127 : : UNSPEC_PSHUFHW
128 : : UNSPEC_PSHUFLW
129 : : UNSPEC_CVTINT2MASK
130 : :
131 : : ;; For AVX512DQ support
132 : : UNSPEC_REDUCE
133 : : UNSPEC_FPCLASS
134 : : UNSPEC_RANGE
135 : :
136 : : ;; For AVX512IFMA support
137 : : UNSPEC_VPMADD52LUQ
138 : : UNSPEC_VPMADD52HUQ
139 : :
140 : : ;; For AVX512VBMI support
141 : : UNSPEC_VPMULTISHIFT
142 : :
143 : : ;; For GFNI support
144 : : UNSPEC_GF2P8AFFINEINV
145 : : UNSPEC_GF2P8AFFINE
146 : : UNSPEC_GF2P8MUL
147 : :
148 : : ;; For AVX512VBMI2 support
149 : : UNSPEC_VPSHLD
150 : : UNSPEC_VPSHRD
151 : : UNSPEC_VPSHRDV
152 : : UNSPEC_VPSHLDV
153 : :
154 : : ;; For AVX512VNNI support
155 : : UNSPEC_VPDPBUSD
156 : : UNSPEC_VPDPBUSDS
157 : : UNSPEC_VPDPWSSD
158 : : UNSPEC_VPDPWSSDS
159 : :
160 : : ;; For VAES support
161 : : UNSPEC_VAESDEC
162 : : UNSPEC_VAESDECLAST
163 : : UNSPEC_VAESENC
164 : : UNSPEC_VAESENCLAST
165 : :
166 : : ;; For VPCLMULQDQ support
167 : : UNSPEC_VPCLMULQDQ
168 : :
169 : : ;; For AVX512BITALG support
170 : : UNSPEC_VPSHUFBIT
171 : :
172 : : ;; For VP2INTERSECT support
173 : : UNSPEC_VP2INTERSECT
174 : :
175 : : ;; For AVX512BF16 support
176 : : UNSPEC_VDPBF16PS
177 : :
178 : : ;; For AVX512FP16 suppport
179 : : UNSPEC_COMPLEX_FMA
180 : : UNSPEC_COMPLEX_FMA_PAIR
181 : : UNSPEC_COMPLEX_FCMA
182 : : UNSPEC_COMPLEX_FCMA_PAIR
183 : : UNSPEC_COMPLEX_FMUL
184 : : UNSPEC_COMPLEX_FCMUL
185 : : UNSPEC_COMPLEX_MASK
186 : :
187 : : ;; For SM3 support
188 : : UNSPEC_SM3MSG1
189 : : UNSPEC_SM3MSG2
190 : : UNSPEC_SM3RNDS2
191 : :
192 : : ;; For AVX-VNNI-INT8 support
193 : : UNSPEC_VPDPBSSD
194 : : UNSPEC_VPDPBSSDS
195 : : UNSPEC_VPDPBSUD
196 : : UNSPEC_VPDPBSUDS
197 : : UNSPEC_VPDPBUUD
198 : : UNSPEC_VPDPBUUDS
199 : :
200 : : ;; For AVX-VNNI-INT16 support
201 : : UNSPEC_VPDPWUSD
202 : : UNSPEC_VPDPWUSDS
203 : : UNSPEC_VPDPWSUD
204 : : UNSPEC_VPDPWSUDS
205 : : UNSPEC_VPDPWUUD
206 : : UNSPEC_VPDPWUUDS
207 : :
208 : : ;; For SHA512 support
209 : : UNSPEC_SHA512MSG1
210 : : UNSPEC_SHA512MSG2
211 : : UNSPEC_SHA512RNDS2
212 : :
213 : : ;; For SM4 support
214 : : UNSPEC_SM4KEY4
215 : : UNSPEC_SM4RNDS4
216 : :
217 : : ;; For AVX10.2 suppport
218 : : UNSPEC_VDPPHPS
219 : : UNSPEC_VCVTBIASPH2BF8
220 : : UNSPEC_VCVTBIASPH2BF8S
221 : : UNSPEC_VCVTBIASPH2HF8
222 : : UNSPEC_VCVTBIASPH2HF8S
223 : : UNSPEC_VCVTNE2PH2BF8
224 : : UNSPEC_VCVTNE2PH2BF8S
225 : : UNSPEC_VCVTNE2PH2HF8
226 : : UNSPEC_VCVTNE2PH2HF8S
227 : : UNSPEC_VCVTNEPH2BF8
228 : : UNSPEC_VCVTNEPH2BF8S
229 : : UNSPEC_VCVTNEPH2HF8
230 : : UNSPEC_VCVTNEPH2HF8S
231 : : UNSPEC_VCVTHF82PH
232 : : UNSPEC_VSCALEFPBF16
233 : : UNSPEC_VRNDSCALENEPBF16
234 : : UNSPEC_VREDUCENEPBF16
235 : : UNSPEC_VGETMANTPBF16
236 : : UNSPEC_VFPCLASSPBF16
237 : : UNSPEC_VCOMSBF16
238 : : UNSPEC_VCVTNEBF162IBS
239 : : UNSPEC_VCVTNEBF162IUBS
240 : : UNSPEC_VCVTPH2IBS
241 : : UNSPEC_VCVTPH2IUBS
242 : : UNSPEC_VCVTPS2IBS
243 : : UNSPEC_VCVTPS2IUBS
244 : : UNSPEC_VCVTTNEBF162IBS
245 : : UNSPEC_VCVTTNEBF162IUBS
246 : : UNSPEC_VCVTTPH2IBS
247 : : UNSPEC_VCVTTPH2IUBS
248 : : UNSPEC_VCVTTPS2IBS
249 : : UNSPEC_VCVTTPS2IUBS
250 : : UNSPEC_SFIX_SATURATION
251 : : UNSPEC_UFIX_SATURATION
252 : : UNSPEC_MINMAXNEPBF16
253 : : UNSPEC_MINMAX
254 : :
255 : : ;; For MOVRS suppport
256 : : UNSPEC_VMOVRS
257 : : ])
258 : :
259 : : (define_c_enum "unspecv" [
260 : : UNSPECV_LDMXCSR
261 : : UNSPECV_STMXCSR
262 : : UNSPECV_CLFLUSH
263 : : UNSPECV_MONITOR
264 : : UNSPECV_MWAIT
265 : : UNSPECV_VZEROALL
266 : :
267 : : ;; For KEYLOCKER
268 : : UNSPECV_LOADIWKEY
269 : : UNSPECV_AESDEC128KLU8
270 : : UNSPECV_AESENC128KLU8
271 : : UNSPECV_AESDEC256KLU8
272 : : UNSPECV_AESENC256KLU8
273 : : UNSPECV_AESDECWIDE128KLU8
274 : : UNSPECV_AESENCWIDE128KLU8
275 : : UNSPECV_AESDECWIDE256KLU8
276 : : UNSPECV_AESENCWIDE256KLU8
277 : : UNSPECV_ENCODEKEY128U32
278 : : UNSPECV_ENCODEKEY256U32
279 : : ])
280 : :
281 : : ;; All vector modes including V?TImode, used in move patterns.
282 : : (define_mode_iterator VMOVE
283 : 255922 : [(V64QI "TARGET_AVX512F && TARGET_EVEX512") (V32QI "TARGET_AVX") V16QI
284 : 216883 : (V32HI "TARGET_AVX512F && TARGET_EVEX512") (V16HI "TARGET_AVX") V8HI
285 : 497539 : (V16SI "TARGET_AVX512F && TARGET_EVEX512") (V8SI "TARGET_AVX") V4SI
286 : 838680 : (V8DI "TARGET_AVX512F && TARGET_EVEX512") (V4DI "TARGET_AVX") V2DI
287 : 1256573 : (V4TI "TARGET_AVX512F && TARGET_EVEX512") (V2TI "TARGET_AVX") V1TI
288 : 1584187 : (V32HF "TARGET_AVX512F && TARGET_EVEX512") (V16HF "TARGET_AVX") V8HF
289 : 1334624 : (V32BF "TARGET_AVX512F && TARGET_EVEX512") (V16BF "TARGET_AVX") V8BF
290 : 697151 : (V16SF "TARGET_AVX512F && TARGET_EVEX512") (V8SF "TARGET_AVX") V4SF
291 : 859865 : (V8DF "TARGET_AVX512F && TARGET_EVEX512") (V4DF "TARGET_AVX") V2DF])
292 : 17509002 :
293 : 20247090 : ;; All AVX-512{F,VL} vector modes without HF. Supposed TARGET_AVX512F baseline.
294 : 37427775 : (define_mode_iterator V48_AVX512VL
295 : 25269486 : [(V16SI "TARGET_EVEX512") (V8SI "TARGET_AVX512VL") (V4SI "TARGET_AVX512VL")
296 : 26857260 : (V8DI "TARGET_EVEX512") (V4DI "TARGET_AVX512VL") (V2DI "TARGET_AVX512VL")
297 : 25610548 : (V16SF "TARGET_EVEX512") (V8SF "TARGET_AVX512VL") (V4SF "TARGET_AVX512VL")
298 : 15679907 : (V8DF "TARGET_EVEX512") (V4DF "TARGET_AVX512VL") (V2DF "TARGET_AVX512VL")])
299 : 827209 :
300 : 11386 : (define_mode_iterator V48_256_512_AVX512VL
301 : 18826 : [(V16SI "TARGET_EVEX512") (V8SI "TARGET_AVX512VL")
302 : 18918 : (V8DI "TARGET_EVEX512") (V4DI "TARGET_AVX512VL")
303 : 20732 : (V16SF "TARGET_EVEX512") (V8SF "TARGET_AVX512VL")
304 : 16603 : (V8DF "TARGET_EVEX512") (V4DF "TARGET_AVX512VL")])
305 : 7814 :
306 : 13191 : ;; All AVX-512{F,VL} vector modes. Supposed TARGET_AVX512F baseline.
307 : 18470 : (define_mode_iterator V48H_AVX512VL
308 : 16771 : [(V16SI "TARGET_EVEX512") (V8SI "TARGET_AVX512VL") (V4SI "TARGET_AVX512VL")
309 : 117770 : (V8DI "TARGET_EVEX512") (V4DI "TARGET_AVX512VL") (V2DI "TARGET_AVX512VL")
310 : 107595 : (V32HF "TARGET_AVX512FP16 && TARGET_EVEX512")
311 : 57799 : (V16HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
312 : 113931 : (V8HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
313 : 23345 : (V16SF "TARGET_EVEX512") (V8SF "TARGET_AVX512VL") (V4SF "TARGET_AVX512VL")
314 : 30050 : (V8DF "TARGET_EVEX512") (V4DF "TARGET_AVX512VL") (V2DF "TARGET_AVX512VL")])
315 : 30138 :
316 : 48118 : ;; 1,2 byte AVX-512{BW,VL} vector modes. Supposed TARGET_AVX512BW baseline.
317 : 42364 : (define_mode_iterator VI12_AVX512VL
318 : 27342 : [(V64QI "TARGET_EVEX512") (V16QI "TARGET_AVX512VL") (V32QI "TARGET_AVX512VL")
319 : 33919 : (V32HI "TARGET_EVEX512") (V16HI "TARGET_AVX512VL") (V8HI "TARGET_AVX512VL")])
320 : 35110 :
321 : 35918 : (define_mode_iterator VI12HFBF_AVX512VL
322 : 30265 : [(V64QI "TARGET_EVEX512") (V16QI "TARGET_AVX512VL") (V32QI "TARGET_AVX512VL")
323 : 49988 : (V32HI "TARGET_EVEX512") (V16HI "TARGET_AVX512VL") (V8HI "TARGET_AVX512VL")
324 : 53809 : (V32HF "TARGET_EVEX512") (V16HF "TARGET_AVX512VL") (V8HF "TARGET_AVX512VL")
325 : 77479 : (V32BF "TARGET_EVEX512") (V16BF "TARGET_AVX512VL") (V8BF "TARGET_AVX512VL")])
326 : 75202 :
327 : 367690 : (define_mode_iterator VI1_AVX512VL
328 : 48767 : [(V64QI "TARGET_EVEX512") (V16QI "TARGET_AVX512VL") (V32QI "TARGET_AVX512VL")])
329 : 69338 :
330 : 63833 : ;; All vector modes
331 : 62264 : (define_mode_iterator V
332 : 93154 : [(V64QI "TARGET_AVX512F && TARGET_EVEX512") (V32QI "TARGET_AVX") V16QI
333 : 4457896 : (V32HI "TARGET_AVX512F && TARGET_EVEX512") (V16HI "TARGET_AVX") V8HI
334 : 203905 : (V16SI "TARGET_AVX512F && TARGET_EVEX512") (V8SI "TARGET_AVX") V4SI
335 : 604290 : (V8DI "TARGET_AVX512F && TARGET_EVEX512") (V4DI "TARGET_AVX") V2DI
336 : 300048 : (V32HF "TARGET_AVX512F && TARGET_EVEX512") (V16HF "TARGET_AVX") V8HF
337 : 7987758 : (V32BF "TARGET_AVX512F && TARGET_EVEX512") (V16BF "TARGET_AVX") V8BF
338 : 14045303 : (V16SF "TARGET_AVX512F && TARGET_EVEX512") (V8SF "TARGET_AVX") V4SF
339 : 25190735 : (V8DF "TARGET_AVX512F && TARGET_EVEX512") (V4DF "TARGET_AVX") (V2DF "TARGET_SSE2")])
340 : 37651305 :
341 : 35765019 : ;; All 128bit vector modes
342 : 20408435 : (define_mode_iterator V_128
343 : 20359 : [V16QI V8HI V8HF V8BF V4SI V2DI V4SF (V2DF "TARGET_SSE2")])
344 : 1566225 :
345 : 7602 : ;; All 256bit vector modes
346 : 4222212 : (define_mode_iterator V_256
347 : 16647 : [V32QI V16HI V8SI V4DI V8SF V4DF V16HF V16BF])
348 : 86217 :
349 : 2045983 : ;; All 128bit and 256bit vector modes
350 : 9160 : (define_mode_iterator V_128_256
351 : 6578 : [V32QI V16QI V16HI V8HI V8SI V4SI V4DI V2DI V2TI V1TI
352 : 2307863 : V16HF V8HF V8SF V4SF V4DF V2DF])
353 : 2043549 :
354 : 1736 : ;; All 512bit vector modes
355 : 253392 : (define_mode_iterator V_512
356 : 47214 : [(V64QI "TARGET_EVEX512") (V32HI "TARGET_EVEX512")
357 : 164754 : (V16SI "TARGET_EVEX512") (V8DI "TARGET_EVEX512")
358 : 275716 : (V16SF "TARGET_EVEX512") (V8DF "TARGET_EVEX512")
359 : 262350 : (V32HF "TARGET_EVEX512") (V32BF "TARGET_EVEX512")])
360 : 6398280 :
361 : 88243 : ;; All 256bit and 512bit vector modes
362 : 248097 : (define_mode_iterator V_256_512
363 : 152432 : [V32QI V16HI V16HF V16BF V8SI V4DI V8SF V4DF
364 : 809 : (V64QI "TARGET_AVX512F && TARGET_EVEX512")
365 : 594 : (V32HI "TARGET_AVX512F && TARGET_EVEX512")
366 : 144260 : (V32HF "TARGET_AVX512F && TARGET_EVEX512")
367 : 148293 : (V32BF "TARGET_AVX512F && TARGET_EVEX512")
368 : 2919 : (V16SI "TARGET_AVX512F && TARGET_EVEX512")
369 : 6472823 : (V8DI "TARGET_AVX512F && TARGET_EVEX512")
370 : 123610 : (V16SF "TARGET_AVX512F && TARGET_EVEX512")
371 : 44278 : (V8DF "TARGET_AVX512F && TARGET_EVEX512")])
372 : 141522 :
373 : 765753 : ;; All vector float modes
374 : 98278 : (define_mode_iterator VF
375 : 80508 : [(V16SF "TARGET_AVX512F && TARGET_EVEX512") (V8SF "TARGET_AVX") V4SF
376 : 97825 : (V8DF "TARGET_AVX512F && TARGET_EVEX512") (V4DF "TARGET_AVX")
377 : 83846 : (V2DF "TARGET_SSE2")])
378 : 855842 :
379 : 691402 : (define_mode_iterator VF1_VF2_AVX512DQ
380 : 12800 : [(V16SF "TARGET_AVX512F && TARGET_EVEX512") (V8SF "TARGET_AVX") V4SF
381 : 23941 : (V8DF "TARGET_AVX512DQ && TARGET_EVEX512")
382 : 31202 : (V4DF "TARGET_AVX512DQ && TARGET_AVX512VL")
383 : 1659 : (V2DF "TARGET_AVX512DQ && TARGET_AVX512VL")])
384 : 16703 :
385 : 20484 : (define_mode_iterator VF1_VF2_AVX10_2
386 : 2502 : [(V16SF "TARGET_AVX10_2_512") V8SF V4SF
387 : 3649 : (V8DF "TARGET_AVX10_2_512") V4DF V2DF])
388 : 2122 :
389 : 6605 : (define_mode_iterator VFH
390 : 1256 : [(V32HF "TARGET_AVX512FP16 && TARGET_EVEX512")
391 : 3683 : (V16HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
392 : 29951 : (V8HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
393 : 10501 : (V16SF "TARGET_AVX512F && TARGET_EVEX512") (V8SF "TARGET_AVX") V4SF
394 : 12166 : (V8DF "TARGET_AVX512F && TARGET_EVEX512") (V4DF "TARGET_AVX")
395 : 23846 : (V2DF "TARGET_SSE2")])
396 : 18885 :
397 : 8571 : (define_mode_iterator VF_BHSD
398 : 412099 : [(V32HF "TARGET_AVX512FP16 && TARGET_EVEX512")
399 : 565749 : (V16HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
400 : 179024 : (V8HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
401 : 5134 : (V16SF "TARGET_AVX512F && TARGET_EVEX512")
402 : 1589 : (V8SF "TARGET_AVX") V4SF
403 : 10988 : (V8DF "TARGET_AVX512F && TARGET_EVEX512")
404 : 129975 : (V4DF "TARGET_AVX") (V2DF "TARGET_SSE2")
405 : 0 : (V32BF "TARGET_AVX10_2_512")
406 : 2576 : (V16BF "TARGET_AVX10_2_256")
407 : 1043 : (V8BF "TARGET_AVX10_2_256")
408 : 3083 : ])
409 : 523 :
410 : 2827 : ;; 128-, 256- and 512-bit float vector modes for bitwise operations
411 : 2261 : (define_mode_iterator VFB
412 : 2495 : [(V32BF "TARGET_AVX512F && TARGET_EVEX512")
413 : 548 : (V16BF "TARGET_AVX") (V8BF "TARGET_SSE2")
414 : 75 : (V32HF "TARGET_AVX512F && TARGET_EVEX512")
415 : 2676 : (V16HF "TARGET_AVX") (V8HF "TARGET_SSE2")
416 : 813 : (V16SF "TARGET_AVX512F && TARGET_EVEX512") (V8SF "TARGET_AVX") V4SF
417 : 678 : (V8DF "TARGET_AVX512F && TARGET_EVEX512")
418 : 712 : (V4DF "TARGET_AVX") (V2DF "TARGET_SSE2")])
419 : 6747 :
420 : 2598 : ;; 128- and 256-bit float vector modes
421 : 117232 : (define_mode_iterator VF_128_256
422 : 15016 : [(V8SF "TARGET_AVX") V4SF
423 : 242249 : (V4DF "TARGET_AVX") (V2DF "TARGET_SSE2")])
424 : 118940 :
425 : 238326 : ;; 128- and 256-bit float vector modes for bitwise operations
426 : 229303 : (define_mode_iterator VFB_128_256
427 : 134268 : [(V16BF "TARGET_AVX") (V8BF "TARGET_SSE2")
428 : 194250 : (V16HF "TARGET_AVX") (V8HF "TARGET_SSE2")
429 : 113878 : (V8SF "TARGET_AVX") V4SF
430 : 2614 : (V4DF "TARGET_AVX") (V2DF "TARGET_SSE2")])
431 : 3417 :
432 : 62968 : ;; All SFmode vector float modes
433 : 461952 : (define_mode_iterator VF1
434 : 123794 : [(V16SF "TARGET_AVX512F && TARGET_EVEX512") (V8SF "TARGET_AVX") V4SF])
435 : 720643 :
436 : 2692121 : (define_mode_iterator VF1_AVX2
437 : 38259 : [(V16SF "TARGET_AVX512F && TARGET_EVEX512") (V8SF "TARGET_AVX2") V4SF])
438 : 474998 :
439 : 125955 : ;; 128- and 256-bit SF vector modes
440 : 5403 : (define_mode_iterator VF1_128_256
441 : 471347 : [(V8SF "TARGET_AVX") V4SF])
442 : 5756990 :
443 : 35875 : (define_mode_iterator VF1_128_256VL
444 : 401118 : [(V8SF "TARGET_EVEX512") (V4SF "TARGET_AVX512VL")])
445 : 5354 :
446 : 6276 : ;; All DFmode vector float modes
447 : 26518 : (define_mode_iterator VF2
448 : 4896471 : [(V8DF "TARGET_AVX512F && TARGET_EVEX512") (V4DF "TARGET_AVX") V2DF])
449 : 1526 :
450 : 24379 : (define_mode_iterator VF2_AVX10_2
451 : 17283 : [(V8DF "TARGET_AVX10_2_512") V4DF V2DF])
452 : 173 :
453 : 4867182 : ;; All DFmode & HFmode & BFmode vector float modes
454 : 1330 : (define_mode_iterator VF2HB
455 : 5773 : [(V32BF "TARGET_AVX10_2_512")
456 : 4684 : (V16BF "TARGET_AVX10_2_256")
457 : 1089 : (V8BF "TARGET_AVX10_2_256")
458 : 1089 : (V32HF "TARGET_AVX512FP16 && TARGET_EVEX512")
459 : 0 : (V16HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
460 : 0 : (V8HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
461 : 0 : (V8DF "TARGET_AVX512F && TARGET_EVEX512") (V4DF "TARGET_AVX") V2DF])
462 : 1089 :
463 : 1089 : ;; 128- and 256-bit DF vector modes
464 : 1089 : (define_mode_iterator VF2_128_256
465 : 1089 : [(V4DF "TARGET_AVX") V2DF])
466 : 1089 :
467 : : (define_mode_iterator VF2_512_256
468 : 1372 : [(V8DF "TARGET_AVX512F && TARGET_EVEX512") V4DF])
469 : 133 :
470 : : (define_mode_iterator VF2_512_256VL
471 : 863 : [(V8DF "TARGET_EVEX512") (V4DF "TARGET_AVX512VL")])
472 : 2 :
473 : 162 : ;; All 128bit vector SF/DF modes
474 : 81 : (define_mode_iterator VF_128
475 : : [V4SF (V2DF "TARGET_SSE2")])
476 : 719 :
477 : 719 : ;; All 128bit vector HF/SF/DF modes
478 : 684 : (define_mode_iterator VFH_128
479 : 120 : [(V8HF "TARGET_AVX512FP16")
480 : 9291 : V4SF (V2DF "TARGET_SSE2")])
481 : 513 :
482 : 6840 : ;; All 256bit vector float modes
483 : 2738 : (define_mode_iterator VF_256
484 : 31831 : [V8SF V4DF])
485 : 18869 :
486 : 10432 : ;; All 512bit vector float modes
487 : 16652 : (define_mode_iterator VF_512
488 : 2721 : [(V16SF "TARGET_EVEX512") (V8DF "TARGET_EVEX512")])
489 : 223950 :
490 : 160761 : ;; All 512bit vector float modes for bitwise operations
491 : 3972 : (define_mode_iterator VFB_512
492 : 133952 : [(V32BF "TARGET_EVEX512")
493 : 230886 : (V32HF "TARGET_EVEX512")
494 : 584832 : (V16SF "TARGET_EVEX512")
495 : 10817 : (V8DF "TARGET_EVEX512")])
496 : 142462 :
497 : 40889 : (define_mode_iterator V24F_128
498 : 36783 : [V4SF V8HF V8BF])
499 : 135388 :
500 : 21501 : (define_mode_iterator VI48_AVX512VL
501 : 24273 : [(V16SI "TARGET_EVEX512") (V8SI "TARGET_AVX512VL") (V4SI "TARGET_AVX512VL")
502 : 184339 : (V8DI "TARGET_EVEX512") (V4DI "TARGET_AVX512VL") (V2DI "TARGET_AVX512VL")])
503 : 21926 :
504 : 3834798 : (define_mode_iterator VI1248_AVX512VLBW
505 : 17172 : [(V64QI "TARGET_AVX512BW && TARGET_EVEX512")
506 : 44688 : (V32QI "TARGET_AVX512VL && TARGET_AVX512BW")
507 : 46130 : (V16QI "TARGET_AVX512VL && TARGET_AVX512BW")
508 : 21423 : (V32HI "TARGET_AVX512BW && TARGET_EVEX512")
509 : 16777 : (V16HI "TARGET_AVX512VL && TARGET_AVX512BW")
510 : 2071035 : (V8HI "TARGET_AVX512VL && TARGET_AVX512BW")
511 : 1960653 : (V16SI "TARGET_EVEX512") (V8SI "TARGET_AVX512VL") (V4SI "TARGET_AVX512VL")
512 : 2386758 : (V8DI "TARGET_EVEX512") (V4DI "TARGET_AVX512VL") (V2DI "TARGET_AVX512VL")])
513 : 38822 :
514 : 1552663 : (define_mode_iterator VI1248_AVX10_2
515 : 1941126 : [(V64QI "TARGET_AVX10_2_512") V32QI V16QI
516 : 74519 : (V32HI "TARGET_AVX10_2_512") V16HI V8HI
517 : 11740 : (V16SI "TARGET_AVX10_2_512") V8SI V4SI
518 : 303252 : (V8DI "TARGET_AVX10_2_512") V4DI V2DI])
519 : 35415 :
520 : 78601 : (define_mode_iterator VF_AVX512VL
521 : 11826 : [(V16SF "TARGET_EVEX512") (V8SF "TARGET_AVX512VL") (V4SF "TARGET_AVX512VL")
522 : 9113 : (V8DF "TARGET_EVEX512") (V4DF "TARGET_AVX512VL") (V2DF "TARGET_AVX512VL")])
523 : 14654 :
524 : 2347881 : (define_mode_iterator VFH_AVX512VL
525 : 2072677 : [(V32HF "TARGET_AVX512FP16 && TARGET_EVEX512")
526 : 265295 : (V16HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
527 : 14310 : (V8HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
528 : 10006 : (V16SF "TARGET_EVEX512") (V8SF "TARGET_AVX512VL") (V4SF "TARGET_AVX512VL")
529 : 14546 : (V8DF "TARGET_EVEX512") (V4DF "TARGET_AVX512VL") (V2DF "TARGET_AVX512VL")])
530 : 15575 :
531 : 1907368 : (define_mode_iterator VFH_AVX10_2
532 : 23651 : [(V32HF "TARGET_AVX10_2_512") V16HF V8HF
533 : 262837 : (V16SF "TARGET_AVX10_2_512") V8SF V4SF
534 : 5733367 : (V8DF "TARGET_AVX10_2_512") V4DF V2DF])
535 : 78478 :
536 : 22939 : (define_mode_iterator VF2_AVX512VL
537 : 22186 : [(V8DF "TARGET_EVEX512") (V4DF "TARGET_AVX512VL") (V2DF "TARGET_AVX512VL")])
538 : 20215 :
539 : 1393672 : (define_mode_iterator VF1_AVX512VL
540 : 157869 : [(V16SF "TARGET_EVEX512") (V8SF "TARGET_AVX512VL") (V4SF "TARGET_AVX512VL")])
541 : 4209 :
542 : 35613 : (define_mode_iterator VF1_AVX512BW
543 : 211985 : [(V16SF "TARGET_EVEX512 && TARGET_EVEX512") (V8SF "TARGET_AVX2") V4SF])
544 : 1691 :
545 : 43704 : (define_mode_iterator VF1_AVX10_2
546 : 5802729 : [(V16SF "TARGET_AVX10_2_512") V8SF V4SF])
547 : 12783 :
548 : 27703 : (define_mode_iterator VHFBF
549 : 9857 : [(V32HF "TARGET_EVEX512") V16HF V8HF
550 : 6226 : (V32BF "TARGET_EVEX512") V16BF V8BF])
551 : 38946 : (define_mode_iterator VHFBF_256 [V16HF V16BF])
552 : 6459 : (define_mode_iterator VHFBF_128 [V8HF V8BF])
553 : 35362 :
554 : 132397 : (define_mode_iterator VHF_AVX512VL
555 : 46729 : [(V32HF "TARGET_EVEX512") (V16HF "TARGET_AVX512VL") (V8HF "TARGET_AVX512VL")])
556 : 5042273 :
557 : 9490 : (define_mode_iterator VHFBF_AVX512VL
558 : 2057 : [(V32HF "TARGET_EVEX512") (V16HF "TARGET_AVX512VL") (V8HF "TARGET_AVX512VL")
559 : 271071 : (V32BF "TARGET_EVEX512") (V16BF "TARGET_AVX512VL") (V8BF "TARGET_AVX512VL")])
560 : 273396 :
561 : 265914 : (define_mode_iterator VHF_AVX10_2
562 : 531990 : [(V32HF "TARGET_AVX10_2_512") V16HF V8HF])
563 : 2147 :
564 : 98353 : (define_mode_iterator VBF_AVX10_2
565 : 906069 : [(V32BF "TARGET_AVX10_2_512") V16BF V8BF])
566 : 1311 :
567 : 8040 : ;; All vector integer modes
568 : 48849 : (define_mode_iterator VI
569 : 98172 : [(V16SI "TARGET_AVX512F && TARGET_EVEX512")
570 : 11691 : (V8DI "TARGET_AVX512F && TARGET_EVEX512")
571 : 3570 : (V64QI "TARGET_AVX512BW && TARGET_EVEX512") (V32QI "TARGET_AVX") V16QI
572 : 46422 : (V32HI "TARGET_AVX512BW && TARGET_EVEX512") (V16HI "TARGET_AVX") V8HI
573 : 9580 : (V8SI "TARGET_AVX") V4SI
574 : 30016 : (V4DI "TARGET_AVX") V2DI])
575 : 3450 :
576 : 47532 : ;; All vector integer and HF modes
577 : 12264 : (define_mode_iterator VIHFBF
578 : 39034 : [(V16SI "TARGET_AVX512F && TARGET_EVEX512")
579 : 82180 : (V8DI "TARGET_AVX512F && TARGET_EVEX512")
580 : 38279 : (V64QI "TARGET_AVX512BW && TARGET_EVEX512") (V32QI "TARGET_AVX") V16QI
581 : 32523 : (V32HI "TARGET_AVX512BW && TARGET_EVEX512") (V16HI "TARGET_AVX") V8HI
582 : 2403 : (V8SI "TARGET_AVX") V4SI
583 : 137 : (V4DI "TARGET_AVX") V2DI
584 : 0 : (V32HF "TARGET_AVX512BW && TARGET_EVEX512") (V16HF "TARGET_AVX") V8HF
585 : 0 : (V32BF "TARGET_AVX512BW && TARGET_EVEX512") (V16BF "TARGET_AVX") V8BF])
586 : 10718 :
587 : 22146 : (define_mode_iterator VI_AVX2
588 : 12212 : [(V64QI "TARGET_AVX512BW && TARGET_EVEX512") (V32QI "TARGET_AVX2") V16QI
589 : 26856 : (V32HI "TARGET_AVX512BW && TARGET_EVEX512") (V16HI "TARGET_AVX2") V8HI
590 : 12433 : (V16SI "TARGET_AVX512F && TARGET_EVEX512") (V8SI "TARGET_AVX2") V4SI
591 : 6374 : (V8DI "TARGET_AVX512F && TARGET_EVEX512") (V4DI "TARGET_AVX2") V2DI])
592 : 1893 :
593 : 57882 : (define_mode_iterator VI_AVX_AVX512F
594 : 627647 : [(V64QI "TARGET_AVX512F && TARGET_EVEX512") (V32QI "TARGET_AVX") V16QI
595 : 541973 : (V32HI "TARGET_AVX512F && TARGET_EVEX512") (V16HI "TARGET_AVX") V8HI
596 : 171097 : (V16SI "TARGET_AVX512F && TARGET_EVEX512") (V8SI "TARGET_AVX") V4SI
597 : 4008 : (V8DI "TARGET_AVX512F && TARGET_EVEX512") (V4DI "TARGET_AVX") V2DI])
598 : 1603 :
599 : 137 : ;; All QImode vector integer modes
600 : 133 : (define_mode_iterator VI1
601 : 133 : [(V32QI "TARGET_AVX") V16QI])
602 : 1600 :
603 : 4140 : ;; All DImode vector integer modes
604 : 270 : (define_mode_iterator V_AVX
605 : 64 : [V16QI V8HI V4SI V2DI V1TI V4SF V2DF
606 : 1828 : (V32QI "TARGET_AVX") (V16HI "TARGET_AVX")
607 : 1840 : (V8SI "TARGET_AVX") (V4DI "TARGET_AVX") (V2TI "TARGET_AVX")
608 : 4090 : (V8SF "TARGET_AVX") (V4DF"TARGET_AVX")])
609 : 124 :
610 : 0 : (define_mode_iterator VI48_AVX
611 : 127 : [V4SI V2DI
612 : 20363 : (V8SI "TARGET_AVX") (V4DI "TARGET_AVX")])
613 : 16410 :
614 : 36806 : (define_mode_iterator VI8
615 : 64 : [(V8DI "TARGET_AVX512F && TARGET_EVEX512") (V4DI "TARGET_AVX") V2DI])
616 : 19 :
617 : 121 : (define_mode_iterator VI8_AVX10_2
618 : 121 : [(V8DI "TARGET_AVX10_2_512") V4DI V2DI])
619 : 1403 :
620 : 129 : (define_mode_iterator VI8_FVL
621 : 247 : [(V8DI "TARGET_AVX512F && TARGET_EVEX512") V4DI (V2DI "TARGET_AVX512VL")])
622 : 1817655 :
623 : 688 : (define_mode_iterator VI8_AVX512VL
624 : 3380438 : [(V8DI "TARGET_EVEX512") (V4DI "TARGET_AVX512VL") (V2DI "TARGET_AVX512VL")])
625 : 2630 :
626 : 100 : (define_mode_iterator VI8_256_512
627 : 1578693 : [(V8DI "TARGET_EVEX512") (V4DI "TARGET_AVX512VL")])
628 : 1817057 :
629 : 8785 : (define_mode_iterator VI1_AVX2
630 : 12485 : [(V32QI "TARGET_AVX2") V16QI])
631 : 8052 :
632 : 5763 : (define_mode_iterator VI1_AVX512
633 : 87688 : [(V64QI "TARGET_AVX512BW && TARGET_EVEX512") (V32QI "TARGET_AVX2") V16QI])
634 : 3648 :
635 : 12789 : (define_mode_iterator VI1_AVX512F
636 : 60408 : [(V64QI "TARGET_AVX512F && TARGET_EVEX512") (V32QI "TARGET_AVX") V16QI])
637 : 31173 :
638 : 108271 : (define_mode_iterator VI1_AVX512VNNI
639 : 121802 : [(V64QI "TARGET_AVX512VNNI && TARGET_EVEX512") (V32QI "TARGET_AVX2") V16QI])
640 : 11424 :
641 : 17741 : (define_mode_iterator VI1_AVX512VNNIBW
642 : 28430 : [(V64QI "(TARGET_AVX512BW || TARGET_AVX512VNNI) && TARGET_EVEX512")
643 : 27005 : (V32QI "TARGET_AVX2") V16QI])
644 : 4742 :
645 : 183 : (define_mode_iterator VI12_256_512_AVX512VL
646 : 4095 : [(V64QI "TARGET_EVEX512") (V32QI "TARGET_AVX512VL")
647 : 162 : (V32HI "TARGET_EVEX512") (V16HI "TARGET_AVX512VL")])
648 : 24 :
649 : 778 : (define_mode_iterator VI2_AVX2
650 : : [(V16HI "TARGET_AVX2") V8HI])
651 : 240 :
652 : 240 : (define_mode_iterator VI2_AVX2_AVX512BW
653 : 2422 : [(V32HI "TARGET_AVX512BW && TARGET_EVEX512") (V16HI "TARGET_AVX2") V8HI])
654 : :
655 : : (define_mode_iterator VI2_AVX512F
656 : : [(V32HI "TARGET_AVX512F && TARGET_EVEX512") (V16HI "TARGET_AVX2") V8HI])
657 : 119584 :
658 : 115514 : (define_mode_iterator VI2_AVX512VNNIBW
659 : 132137 : [(V32HI "(TARGET_AVX512BW || TARGET_AVX512VNNI) && TARGET_EVEX512")
660 : : (V16HI "TARGET_AVX2") V8HI])
661 : :
662 : : (define_mode_iterator VI2_AVX10_2
663 : : [(V32HI "TARGET_AVX10_2_512") V16HI V8HI])
664 : :
665 : : (define_mode_iterator VI4_AVX
666 : 122 : [(V8SI "TARGET_AVX") V4SI])
667 : :
668 : : (define_mode_iterator VI4_AVX2
669 : 583 : [(V8SI "TARGET_AVX2") V4SI])
670 : 2007 :
671 : 1951 : (define_mode_iterator VI4_AVX512F
672 : 4631 : [(V16SI "TARGET_AVX512F && TARGET_EVEX512") (V8SI "TARGET_AVX2") V4SI])
673 : 2042 :
674 : 942 : (define_mode_iterator VI4_AVX512VL
675 : 62 : [(V16SI "TARGET_EVEX512") (V8SI "TARGET_AVX512VL") (V4SI "TARGET_AVX512VL")])
676 : 32639 :
677 : 32639 : (define_mode_iterator VI4_AVX10_2
678 : 61079 : [(V16SI "TARGET_AVX10_2_512") V8SI V4SI])
679 : 3199 :
680 : 3199 : (define_mode_iterator VI48_AVX512F_AVX512VL
681 : 1562 : [V4SI V8SI (V16SI "TARGET_AVX512F && TARGET_EVEX512")
682 : 1685 : (V2DI "TARGET_AVX512VL") (V4DI "TARGET_AVX512VL")
683 : 370 : (V8DI "TARGET_AVX512F && TARGET_EVEX512")])
684 : 4969 :
685 : 270523 : (define_mode_iterator VI2_AVX512VL
686 : 1110 : [(V8HI "TARGET_AVX512VL") (V16HI "TARGET_AVX512VL") (V32HI "TARGET_EVEX512")])
687 : 7083 :
688 : 4993 : (define_mode_iterator VI2HFBF_AVX512VL
689 : 3948 : [(V8HI "TARGET_AVX512VL") (V16HI "TARGET_AVX512VL") (V32HI "TARGET_EVEX512")
690 : 6261 : (V8HF "TARGET_AVX512VL") (V16HF "TARGET_AVX512VL") (V32HF "TARGET_EVEX512")
691 : 104038 : (V8BF "TARGET_AVX512VL") (V16BF "TARGET_AVX512VL") (V32BF "TARGET_EVEX512")])
692 : 93602 :
693 : 91382 : (define_mode_iterator VI2H_AVX512VL
694 : 13855 : [(V8HI "TARGET_AVX512VL") (V16HI "TARGET_AVX512VL") (V32HI "TARGET_EVEX512")
695 : 74931 : (V8SI "TARGET_AVX512VL") (V16SI "TARGET_EVEX512")
696 : 10268 : (V8DI "TARGET_EVEX512")])
697 : 269413 :
698 : 2604 : (define_mode_iterator VI1_AVX512VL_F
699 : 11165 : [V32QI (V16QI "TARGET_AVX512VL") (V64QI "TARGET_AVX512F && TARGET_EVEX512")])
700 : 6340 :
701 : 6455 : (define_mode_iterator VI8_AVX2_AVX512BW
702 : 3424 : [(V8DI "TARGET_AVX512BW && TARGET_EVEX512") (V4DI "TARGET_AVX2") V2DI])
703 : 8011 :
704 : 2558 : (define_mode_iterator VI8_AVX2
705 : 3659 : [(V4DI "TARGET_AVX2") V2DI])
706 : 1239 :
707 : 40315 : (define_mode_iterator VI8_AVX2_AVX512F
708 : 62423 : [(V8DI "TARGET_AVX512F && TARGET_EVEX512") (V4DI "TARGET_AVX2") V2DI])
709 : 22 :
710 : 4086 : (define_mode_iterator VI8_AVX_AVX512F
711 : 395 : [(V8DI "TARGET_AVX512F && TARGET_EVEX512") (V4DI "TARGET_AVX")])
712 : 8934 :
713 : 6434 : (define_mode_iterator VI4_128_8_256
714 : 290 : [V4SI V4DI])
715 : 639 :
716 : 270 : ;; All V8D* modes
717 : 715 : (define_mode_iterator V8FI
718 : 150 : [(V8DF "TARGET_EVEX512") (V8DI "TARGET_EVEX512")])
719 : 3058 :
720 : 8726 : ;; All V16S* modes
721 : 1087 : (define_mode_iterator V16FI
722 : 2146 : [(V16SF "TARGET_EVEX512") (V16SI "TARGET_EVEX512")])
723 : 157302 :
724 : 388996 : ;; ??? We should probably use TImode instead.
725 : 344997 : (define_mode_iterator VIMAX_AVX2_AVX512BW
726 : 275663 : [(V4TI "TARGET_AVX512BW && TARGET_EVEX512") (V2TI "TARGET_AVX2") V1TI])
727 : 605345 :
728 : 183671 : ;; Suppose TARGET_AVX512BW as baseline
729 : 295903 : (define_mode_iterator VIMAX_AVX512VL
730 : 421713 : [(V4TI "TARGET_EVEX512") (V2TI "TARGET_AVX512VL") (V1TI "TARGET_AVX512VL")])
731 : 323939 :
732 : 433468 : (define_mode_iterator VIMAX_AVX2
733 : 447371 : [(V2TI "TARGET_AVX2") V1TI])
734 : 14620 :
735 : 62653 : (define_mode_iterator VI12_AVX2
736 : 699 : [(V32QI "TARGET_AVX2") V16QI
737 : 7220 : (V16HI "TARGET_AVX2") V8HI])
738 : 22239 :
739 : 9346 : (define_mode_iterator VI12_AVX2_AVX512BW
740 : 10731 : [(V64QI "TARGET_AVX512BW && TARGET_EVEX512") (V32QI "TARGET_AVX2") V16QI
741 : 13503 : (V32HI "TARGET_AVX512BW && TARGET_EVEX512") (V16HI "TARGET_AVX2") V8HI])
742 : 189065 :
743 : 15378886 : (define_mode_iterator VI24_AVX2
744 : 2485 : [(V16HI "TARGET_AVX2") V8HI
745 : 190153 : (V8SI "TARGET_AVX2") V4SI])
746 : 10280 :
747 : 4753 : (define_mode_iterator VI124_AVX2_24_AVX512F_1_AVX512BW
748 : 3906 : [(V64QI "TARGET_AVX512BW && TARGET_EVEX512") (V32QI "TARGET_AVX2") V16QI
749 : 1548018 : (V32HI "TARGET_AVX512F && TARGET_EVEX512") (V16HI "TARGET_AVX2") V8HI
750 : 230862 : (V16SI "TARGET_AVX512F && TARGET_EVEX512") (V8SI "TARGET_AVX2") V4SI])
751 : 35660 :
752 : 1292 : (define_mode_iterator VI124_AVX2
753 : 101146 : [(V32QI "TARGET_AVX2") V16QI
754 : 1013 : (V16HI "TARGET_AVX2") V8HI
755 : 13918162 : (V8SI "TARGET_AVX2") V4SI])
756 : 5269 :
757 : 66726 : (define_mode_iterator VI248_AVX512VL
758 : 61118 : [(V32HI "TARGET_EVEX512") (V16SI "TARGET_EVEX512") (V8DI "TARGET_EVEX512")
759 : 61148 : (V16HI "TARGET_AVX512VL") (V8SI "TARGET_AVX512VL")
760 : 417 : (V4DI "TARGET_AVX512VL") (V8HI "TARGET_AVX512VL")
761 : 2962 : (V4SI "TARGET_AVX512VL") (V2DI "TARGET_AVX512VL")])
762 : 0 :
763 : 12166 : (define_mode_iterator VI248_AVX512VLBW
764 : 7258 : [(V32HI "TARGET_AVX512BW && TARGET_EVEX512")
765 : 8922 : (V16HI "TARGET_AVX512VL && TARGET_AVX512BW")
766 : 5027 : (V8HI "TARGET_AVX512VL && TARGET_AVX512BW")
767 : 2205 : (V16SI "TARGET_EVEX512") (V8SI "TARGET_AVX512VL") (V4SI "TARGET_AVX512VL")
768 : 2348 : (V8DI "TARGET_EVEX512") (V4DI "TARGET_AVX512VL") (V2DI "TARGET_AVX512VL")])
769 : 1481 :
770 : 799 : (define_mode_iterator VI48_AVX2
771 : 60982 : [(V8SI "TARGET_AVX2") V4SI
772 : 735 : (V4DI "TARGET_AVX2") V2DI])
773 : 628 :
774 : 1131 : (define_mode_iterator VI248_AVX2
775 : 195 : [(V16HI "TARGET_AVX2") V8HI
776 : 612 : (V8SI "TARGET_AVX2") V4SI
777 : 2590 : (V4DI "TARGET_AVX2") V2DI])
778 : 1939 :
779 : 10513 : (define_mode_iterator VI248_AVX2_8_AVX512F_24_AVX512BW
780 : 55989 : [(V32HI "TARGET_AVX512BW && TARGET_EVEX512") (V16HI "TARGET_AVX2") V8HI
781 : 361 : (V16SI "TARGET_AVX512BW && TARGET_EVEX512") (V8SI "TARGET_AVX2") V4SI
782 : 652 : (V8DI "TARGET_AVX512F && TARGET_EVEX512") (V4DI "TARGET_AVX2") V2DI])
783 : 0 :
784 : 305 : (define_mode_iterator VI248_AVX512BW
785 : 4804 : [(V32HI "TARGET_AVX512BW && TARGET_EVEX512") (V16SI "TARGET_EVEX512")
786 : 2506 : (V8DI "TARGET_EVEX512")])
787 : 3760 :
788 : 3849 : (define_mode_iterator VI248_AVX512BW_AVX512VL
789 : 8171 : [(V32HI "TARGET_AVX512BW && TARGET_EVEX512")
790 : 2379 : (V4DI "TARGET_AVX512VL") (V16SI "TARGET_EVEX512") (V8DI "TARGET_EVEX512")])
791 : 477 :
792 : 4738 : ;; Suppose TARGET_AVX512VL as baseline
793 : 3496 : (define_mode_iterator VI248_AVX512BW_1
794 : 6224 : [(V16HI "TARGET_AVX512BW") (V8HI "TARGET_AVX512BW")
795 : 53936 : V8SI V4SI
796 : 61397 : V2DI])
797 : 53184 :
798 : 6396 : (define_mode_iterator VI248_AVX512BW_2
799 : 5660 : [(V16HI "TARGET_AVX512BW") (V8HI "TARGET_AVX512BW")
800 : 52858 : V8SI V4SI
801 : 57095 : V4DI V2DI])
802 : 800 :
803 : 51248 : (define_mode_iterator VI48_AVX512F
804 : 50699 : [(V16SI "TARGET_AVX512F && TARGET_EVEX512") V8SI V4SI
805 : 1587 : (V8DI "TARGET_AVX512F && TARGET_EVEX512") V4DI V2DI])
806 : 1046 :
807 : 1 : (define_mode_iterator VI48_AVX_AVX512F
808 : 18032 : [(V16SI "TARGET_AVX512F && TARGET_EVEX512") (V8SI "TARGET_AVX") V4SI
809 : 16219 : (V8DI "TARGET_AVX512F && TARGET_EVEX512") (V4DI "TARGET_AVX") V2DI])
810 : 396029 :
811 : 342097 : (define_mode_iterator VI12_AVX_AVX512F
812 : 388668 : [(V64QI "TARGET_AVX512F && TARGET_EVEX512") (V32QI "TARGET_AVX") V16QI
813 : 254233 : (V32HI "TARGET_AVX512F && TARGET_EVEX512") (V16HI "TARGET_AVX") V8HI])
814 : 628465 :
815 : 290074 : (define_mode_iterator V48_128_256
816 : 288500 : [V4SF V2DF
817 : 288500 : V4DI V2DI
818 : 400082 : V8SF V4DF
819 : 95034 : V8SI V4SI])
820 : 9631 :
821 : 9631 :
822 : 9631 : (define_mode_iterator VF4_128_8_256
823 : 7714 : [V4DF V4SF])
824 : 1917 :
825 : 2665 : (define_mode_attr avx512
826 : 2665 : [(V16QI "avx512vl") (V32QI "avx512vl") (V64QI "avx512bw")
827 : 701 : (V8HI "avx512vl") (V16HI "avx512vl") (V32HI "avx512bw")
828 : 1249 : (V4SI "avx512vl") (V8SI "avx512vl") (V16SI "avx512f")
829 : 829 : (V2DI "avx512vl") (V4DI "avx512vl") (V8DI "avx512f")
830 : 829 : (V8HF "avx512fp16") (V16HF "avx512vl") (V32HF "avx512bw")
831 : 829 : (V8BF "avx512vl") (V16BF "avx512vl") (V32BF "avx512bw")
832 : 829 : (V4SF "avx512vl") (V8SF "avx512vl") (V16SF "avx512f")
833 : 829 : (V2DF "avx512vl") (V4DF "avx512vl") (V8DF "avx512f")])
834 : 829 :
835 : 829 : (define_mode_attr v_Yw
836 : 829 : [(V16QI "Yw") (V32QI "Yw") (V64QI "v")
837 : : (V8HI "Yw") (V16HI "Yw") (V32HI "v")
838 : 202 : (V4SI "v") (V8SI "v") (V16SI "v")
839 : 202 : (V2DI "v") (V4DI "v") (V8DI "v")
840 : : (V4SF "v") (V8SF "v") (V16SF "v")
841 : 139 : (V2DF "v") (V4DF "v") (V8DF "v")
842 : : (TI "Yw") (V1TI "Yw") (V2TI "Yw") (V4TI "v")])
843 : 77 :
844 : 77 : (define_mode_attr sse2_avx_avx512f
845 : 77 : [(V16QI "sse2") (V32QI "avx") (V64QI "avx512f")
846 : : (V8HI "avx512vl") (V16HI "avx512vl") (V32HI "avx512bw")
847 : : (V4SI "sse2") (V8SI "avx") (V16SI "avx512f")
848 : : (V2DI "avx512vl") (V4DI "avx512vl") (V8DI "avx512f")
849 : : (V16SF "avx512f") (V8SF "avx") (V4SF "avx")
850 : : (V8DF "avx512f") (V4DF "avx") (V2DF "avx")])
851 : :
852 : : (define_mode_attr sse2_avx2
853 : : [(V16QI "sse2") (V32QI "avx2") (V64QI "avx512bw")
854 : : (V8HI "sse2") (V16HI "avx2") (V32HI "avx512bw")
855 : : (V4SI "sse2") (V8SI "avx2") (V16SI "avx512f")
856 : : (V2DI "sse2") (V4DI "avx2") (V8DI "avx512f")
857 : : (V1TI "sse2") (V2TI "avx2") (V4TI "avx512bw")])
858 : :
859 : : (define_mode_attr ssse3_avx2
860 : : [(V16QI "ssse3") (V32QI "avx2") (V64QI "avx512bw")
861 : : (V4HI "ssse3") (V8HI "ssse3") (V16HI "avx2") (V32HI "avx512bw")
862 : : (V4SI "ssse3") (V8SI "avx2")
863 : : (V2DI "ssse3") (V4DI "avx2")
864 : : (V1TI "ssse3") (V2TI "avx2") (V4TI "avx512bw")])
865 : :
866 : : (define_mode_attr sse4_1_avx2
867 : : [(V16QI "sse4_1") (V32QI "avx2") (V64QI "avx512bw")
868 : : (V8HI "sse4_1") (V16HI "avx2") (V32HI "avx512bw")
869 : : (V4SI "sse4_1") (V8SI "avx2") (V16SI "avx512f")
870 : : (V2DI "sse4_1") (V4DI "avx2") (V8DI "avx512dq")])
871 : :
872 : : (define_mode_attr avx_avx2
873 : : [(V4SF "avx") (V2DF "avx")
874 : : (V8SF "avx") (V4DF "avx")
875 : : (V4SI "avx2") (V2DI "avx2")
876 : : (V8SI "avx2") (V4DI "avx2")])
877 : :
878 : : (define_mode_attr vec_avx2
879 : : [(V16QI "vec") (V32QI "avx2")
880 : : (V8HI "vec") (V16HI "avx2")
881 : : (V4SI "vec") (V8SI "avx2")
882 : : (V2DI "vec") (V4DI "avx2")])
883 : :
884 : : (define_mode_attr avx2_avx512
885 : : [(V4SI "avx2") (V8SI "avx2") (V16SI "avx512f")
886 : : (V2DI "avx2") (V4DI "avx2") (V8DI "avx512f")
887 : : (V4SF "avx2") (V8SF "avx2") (V16SF "avx512f")
888 : : (V2DF "avx2") (V4DF "avx2") (V8DF "avx512f")
889 : : (V8HI "avx512vl") (V16HI "avx512vl") (V32HI "avx512bw")])
890 : :
891 : : (define_mode_attr shuffletype
892 : : [(V32HF "i") (V16HF "i") (V8HF "i")
893 : : (V32BF "i") (V16BF "i") (V8BF "i")
894 : : (V16SF "f") (V16SI "i") (V8DF "f") (V8DI "i")
895 : : (V8SF "f") (V8SI "i") (V4DF "f") (V4DI "i")
896 : : (V4SF "f") (V4SI "i") (V2DF "f") (V2DI "i")
897 : : (V32HI "i") (V16HI "i") (V8HI "i")
898 : : (V64QI "i") (V32QI "i") (V16QI "i")
899 : : (V4TI "i") (V2TI "i") (V1TI "i")])
900 : :
901 : : (define_mode_attr ssequartermode
902 : : [(V16SF "V4SF") (V8DF "V2DF") (V16SI "V4SI") (V8DI "V2DI")])
903 : :
904 : : (define_mode_attr ssequarterinsnmode
905 : : [(V16SF "V4SF") (V8DF "V2DF") (V16SI "TI") (V8DI "TI")])
906 : :
907 : : (define_mode_attr vecmemsuffix
908 : : [(V32HF "{z}") (V16HF "{y}") (V8HF "{x}")
909 : : (V32BF "{z}") (V16BF "{y}") (V8BF "{x}")
910 : : (V16SF "{z}") (V8SF "{y}") (V4SF "{x}")
911 : : (V8DF "{z}") (V4DF "{y}") (V2DF "{x}")])
912 : :
913 : : (define_mode_attr ssedoublemodelower
914 : : [(V16QI "v16hi") (V32QI "v32hi") (V64QI "v64hi")
915 : : (V8HI "v8si") (V16HI "v16si") (V32HI "v32si")
916 : : (V4SI "v4di") (V8SI "v8di") (V16SI "v16di")])
917 : :
918 : : ;; Map vector mode to the same number of double sized elements.
919 : : (define_mode_attr ssedoublemode
920 : : [(V4SF "V4DF") (V8SF "V8DF") (V16SF "V16DF")
921 : : (V16QI "V16HI") (V32QI "V32HI") (V64QI "V64HI")
922 : : (V8HI "V8SI") (V16HI "V16SI") (V32HI "V32SI")
923 : : (V4SI "V4DI") (V8SI "V8DI") (V16SI "V16DI")])
924 : :
925 : : (define_mode_attr ssebytemode
926 : : [(V8DI "V64QI") (V4DI "V32QI") (V2DI "V16QI")
927 : : (V16SI "V64QI") (V8SI "V32QI") (V4SI "V16QI")
928 : : (V8HI "V16QI")])
929 : :
930 : : (define_mode_attr sseintconvert
931 : : [(V32HI "w") (V16HI "w") (V8HI "w")
932 : : (V16SI "dq") (V8SI "dq") (V4SI "dq")
933 : : (V8DI "qq") (V4DI "qq") (V2DI "qq")])
934 : :
935 : : ;; All 128bit vector integer modes
936 : : (define_mode_iterator VI_128 [V16QI V8HI V4SI V2DI])
937 : :
938 : : ;; All 256bit vector integer modes
939 : : (define_mode_iterator VI_256 [V32QI V16HI V8SI V4DI])
940 : :
941 : : ;; All 128 and 256bit vector integer modes
942 : : (define_mode_iterator VI_128_256 [V16QI V8HI V4SI V2DI V32QI V16HI V8SI V4DI])
943 : : ;; All 256bit vector integer and HF modes
944 : : (define_mode_iterator VIHFBF_256 [V32QI V16HI V8SI V4DI V16HF V16BF])
945 : :
946 : : ;; Various 128bit vector integer mode combinations
947 : : (define_mode_iterator VI12_128 [V16QI V8HI])
948 : : (define_mode_iterator VI14_128 [V16QI V4SI])
949 : : (define_mode_iterator VI124_128 [V16QI V8HI V4SI])
950 : : (define_mode_iterator VI24_128 [V8HI V4SI])
951 : : (define_mode_iterator VI248_128 [V8HI V4SI V2DI])
952 : : (define_mode_iterator VI248_256 [V16HI V8SI V4DI])
953 : : (define_mode_iterator VI248_512
954 : 2 : [(V32HI "TARGET_EVEX512") (V16SI "TARGET_EVEX512") (V8DI "TARGET_EVEX512")])
955 : : (define_mode_iterator VI48_128 [V4SI V2DI])
956 : : (define_mode_iterator VI148_512
957 : 12 : [(V64QI "TARGET_EVEX512") (V16SI "TARGET_EVEX512") (V8DI "TARGET_EVEX512")])
958 : 2 : (define_mode_iterator VI148_256 [V32QI V8SI V4DI])
959 : 2 : (define_mode_iterator VI148_128 [V16QI V4SI V2DI])
960 : :
961 : 4 : ;; Various 256bit and 512 vector integer mode combinations
962 : 4 : (define_mode_iterator VI124_256 [V32QI V16HI V8SI])
963 : : (define_mode_iterator VI124_256_AVX512F_AVX512BW
964 : : [V32QI V16HI V8SI
965 : : (V64QI "TARGET_AVX512BW && TARGET_EVEX512")
966 : : (V32HI "TARGET_AVX512BW && TARGET_EVEX512")
967 : : (V16SI "TARGET_AVX512F && TARGET_EVEX512")])
968 : : (define_mode_iterator VI48_256 [V8SI V4DI])
969 : : (define_mode_iterator VI48_512
970 : : [(V16SI "TARGET_EVEX512") (V8DI "TARGET_EVEX512")])
971 : : (define_mode_iterator VI4_256_8_512 [V8SI V8DI])
972 : : (define_mode_iterator VI_AVX512BW
973 : : [(V16SI "TARGET_EVEX512") (V8DI "TARGET_EVEX512")
974 : : (V32HI "TARGET_AVX512BW && TARGET_EVEX512")
975 : : (V64QI "TARGET_AVX512BW && TARGET_EVEX512")])
976 : : (define_mode_iterator VIHFBF_AVX512BW
977 : 0 : [(V16SI "TARGET_EVEX512") (V8DI "TARGET_EVEX512")
978 : 0 : (V32HI "TARGET_AVX512BW && TARGET_EVEX512")
979 : 0 : (V64QI "TARGET_AVX512BW && TARGET_EVEX512")
980 : 0 : (V32HF "TARGET_AVX512BW && TARGET_EVEX512")
981 : 0 : (V32BF "TARGET_AVX512BW && TARGET_EVEX512")])
982 : :
983 : : ;; Int-float size matches
984 : : (define_mode_iterator VI2F_256_512
985 : 119 : [V16HI (V32HI "TARGET_EVEX512")
986 : 119 : V16HF (V32HF "TARGET_EVEX512")
987 : 350 : V16BF (V32BF "TARGET_EVEX512")])
988 : 652 : (define_mode_iterator VI4F_128 [V4SI V4SF])
989 : 661 : (define_mode_iterator VI8F_128 [V2DI V2DF])
990 : 539 : (define_mode_iterator VI4F_256 [V8SI V8SF])
991 : 295 : (define_mode_iterator VI8F_256 [V4DI V4DF])
992 : 195 : (define_mode_iterator VI4F_256_512
993 : 120 : [V8SI V8SF
994 : 303 : (V16SI "TARGET_AVX512F && TARGET_EVEX512")
995 : 341 : (V16SF "TARGET_AVX512F && TARGET_EVEX512")])
996 : 0 : (define_mode_iterator VI48F_256_512
997 : 0 : [V8SI V8SF
998 : 852 : (V16SI "TARGET_AVX512F && TARGET_EVEX512")
999 : 690 : (V16SF "TARGET_AVX512F && TARGET_EVEX512")
1000 : 1079 : (V8DI "TARGET_AVX512F && TARGET_EVEX512")
1001 : 980 : (V8DF "TARGET_AVX512F && TARGET_EVEX512")
1002 : 464 : (V4DI "TARGET_AVX512VL") (V4DF "TARGET_AVX512VL")])
1003 : 464 : (define_mode_iterator VF48H_AVX512VL
1004 : 994 : [(V8DF "TARGET_EVEX512") (V16SF "TARGET_EVEX512") (V8SF "TARGET_AVX512VL")])
1005 : 1380 :
1006 : 1514 : (define_mode_iterator VF48_128
1007 : 1211 : [V2DF V4SF])
1008 : 867 :
1009 : 4904 : (define_mode_iterator VI48F
1010 : 9954 : [(V16SI "TARGET_EVEX512") (V16SF "TARGET_EVEX512")
1011 : 5371 : (V8DI "TARGET_EVEX512") (V8DF "TARGET_EVEX512")
1012 : 3423 : (V8SI "TARGET_AVX512VL") (V8SF "TARGET_AVX512VL")
1013 : 2346 : (V4DI "TARGET_AVX512VL") (V4DF "TARGET_AVX512VL")
1014 : 2763 : (V4SI "TARGET_AVX512VL") (V4SF "TARGET_AVX512VL")
1015 : 3908 : (V2DI "TARGET_AVX512VL") (V2DF "TARGET_AVX512VL")])
1016 : 5866 : (define_mode_iterator VI12_VI48F_AVX512VL
1017 : 4472 : [(V16SI "TARGET_AVX512F && TARGET_EVEX512")
1018 : 3946 : (V16SF "TARGET_AVX512F && TARGET_EVEX512")
1019 : 5574 : (V8DI "TARGET_AVX512F && TARGET_EVEX512")
1020 : 6415 : (V8DF "TARGET_AVX512F && TARGET_EVEX512")
1021 : 3904 : (V8SI "TARGET_AVX512VL") (V8SF "TARGET_AVX512VL")
1022 : 1731 : (V4DI "TARGET_AVX512VL") (V4DF "TARGET_AVX512VL")
1023 : 2829 : (V4SI "TARGET_AVX512VL") (V4SF "TARGET_AVX512VL")
1024 : 2709 : (V2DI "TARGET_AVX512VL") (V2DF "TARGET_AVX512VL")
1025 : 1497 : (V64QI "TARGET_EVEX512") (V16QI "TARGET_AVX512VL") (V32QI "TARGET_AVX512VL")
1026 : 1293 : (V32HI "TARGET_EVEX512") (V16HI "TARGET_AVX512VL") (V8HI "TARGET_AVX512VL")])
1027 : 621 :
1028 : 186 : (define_mode_iterator VI48F_256 [V8SI V8SF V4DI V4DF])
1029 : 264 :
1030 : 537 : (define_mode_iterator V8_128 [V8HI V8HF V8BF])
1031 : 358 : (define_mode_iterator V16_256 [V16HI V16HF V16BF])
1032 : 0 : (define_mode_iterator V32_512
1033 : 0 : [(V32HI "TARGET_EVEX512") (V32HF "TARGET_EVEX512") (V32BF "TARGET_EVEX512")])
1034 : 4 :
1035 : 42800 : ;; Mapping from float mode to required SSE level
1036 : 42800 : (define_mode_attr sse
1037 : 299260 : [(SF "sse") (DF "sse2") (HF "avx512fp16")
1038 : 6488 : (V4SF "sse") (V2DF "sse2")
1039 : 48977 : (V32BF "avx512bf16") (V16BF "avx512bf16")
1040 : 6177 : (V8BF "avx512bf16")
1041 : 6323 : (V32HF "avx512fp16") (V16HF "avx512fp16")
1042 : 244323 : (V8HF "avx512fp16")
1043 : 42790 : (V16SF "avx512f") (V8SF "avx")
1044 : 69038 : (V8DF "avx512f") (V4DF "avx")])
1045 : 4 :
1046 : 42790 : (define_mode_attr sse2
1047 : 288 : [(V16QI "sse2") (V32QI "avx") (V64QI "avx512f")
1048 : 26250 : (V2DI "sse2") (V4DI "avx") (V8DI "avx512f")])
1049 : 6 :
1050 : 290 : (define_mode_attr sse3
1051 : 26248 : [(V16QI "sse3") (V32QI "avx")])
1052 : 1848616 :
1053 : 292 : (define_mode_attr sse4_1
1054 : 85 : [(V4SF "sse4_1") (V2DF "sse4_1")
1055 : 1849768 : (V8SF "avx") (V4DF "avx")
1056 : 288 : (V8DF "avx512f")
1057 : 1848325 : (V2TI "avx") (V1TI "sse4_1")
1058 : 4 : (V4DI "avx") (V2DI "sse4_1")
1059 : 292 : (V8SI "avx") (V4SI "sse4_1")
1060 : 1685466 : (V16QI "sse4_1") (V32QI "avx")
1061 : 1685754 : (V8HI "sse4_1") (V16HI "avx")])
1062 : 1440 :
1063 : 1684314 : (define_mode_attr avxsizesuffix
1064 : 1440 : [(V64QI "512") (V32HI "512") (V16SI "512") (V8DI "512") (V4TI "512")
1065 : 1152 : (V32QI "256") (V16HI "256") (V8SI "256") (V4DI "256") (V2TI "256")
1066 : 957529 : (V16QI "") (V8HI "") (V4SI "") (V2DI "") (V1TI "")
1067 : 957241 : (V32HF "512") (V16SF "512") (V8DF "512")
1068 : 1440 : (V16HF "256") (V8SF "256") (V4DF "256")
1069 : 1440 : (V8HF "") (V4SF "") (V2DF "")])
1070 : :
1071 : 379381 : ;; SSE instruction mode
1072 : 378229 : (define_mode_attr sseinsnmode
1073 : 377941 : [(V64QI "XI") (V32HI "XI") (V16SI "XI") (V8DI "XI") (V4TI "XI")
1074 : 1440 : (V32QI "OI") (V16HI "OI") (V8SI "OI") (V4DI "OI") (V2TI "OI")
1075 : 1440 : (V16QI "TI") (V8HI "TI") (V4SI "TI") (V2DI "TI") (V1TI "TI")
1076 : : (V16SF "V16SF") (V8DF "V8DF")
1077 : 1007 : (V8SF "V8SF") (V4DF "V4DF")
1078 : 146234 : (V4SF "V4SF") (V2DF "V2DF")
1079 : 145946 : (V8HF "TI") (V16HF "OI") (V32HF "XI")
1080 : 602 : (V8BF "TI") (V16BF "OI") (V32BF "XI")
1081 : 890 : (TI "TI")])
1082 : :
1083 : 185920 : (define_mode_attr sseintvecinsnmode
1084 : 185920 : [(V64QI "XI") (V32HI "XI") (V16SI "XI") (V8DI "XI") (V4TI "XI")
1085 : 185632 : (V32QI "OI") (V16HI "OI") (V8SI "OI") (V4DI "OI") (V2TI "OI")
1086 : 288 : (V16QI "TI") (V8HI "TI") (V4SI "TI") (V2DI "TI") (V1TI "TI")
1087 : 288 : (V16SF "XI") (V8DF "XI")
1088 : : (V8SF "OI") (V4DF "OI")
1089 : 1646 : (V4SF "TI") (V2DF "TI")
1090 : 1358 : (TI "TI")])
1091 : 1646 :
1092 : : ;; SSE constant -1 constraint
1093 : 288 : (define_mode_attr sseconstm1
1094 : : [(V64QI "BC") (V32HI "BC") (V16SI "BC") (V8DI "BC") (V4TI "BC")
1095 : 16484 : (V32QI "BC") (V16HI "BC") (V8SI "BC") (V4DI "BC") (V2TI "BC")
1096 : 16484 : (V16QI "BC") (V8HI "BC") (V4SI "BC") (V2DI "BC") (V1TI "BC")
1097 : 16548 : (V32HF "BF") (V32BF "BF") (V16SF "BF") (V8DF "BF")
1098 : : (V16HF "BF") (V16BF "BF") (V8SF "BF") (V4DF "BF")
1099 : : (V8HF "BF") (V8BF "BF") (V4SF "BF") (V2DF "BF")])
1100 : :
1101 : : ;; SSE integer instruction suffix for various modes
1102 : : (define_mode_attr sseintmodesuffix
1103 : : [(V16QI "b") (V8HI "w") (V4SI "d") (V2DI "q")
1104 : 598481 : (V32QI "b") (V16HI "w") (V8SI "d") (V4DI "q")
1105 : 598481 : (V64QI "b") (V32HI "w") (V16SI "d") (V8DI "q")
1106 : : (V8HF "w") (V16HF "w") (V32HF "w")
1107 : 598481 : (V8BF "w") (V16BF "w") (V32BF "w")])
1108 : 598481 :
1109 : 598481 : ;; Mapping of vector modes to corresponding mask size
1110 : 598481 : (define_mode_attr avx512fmaskmode
1111 : : [(V64QI "DI") (V32QI "SI") (V16QI "HI")
1112 : 598481 : (V32HI "SI") (V16HI "HI") (V8HI "QI") (V4HI "QI")
1113 : : (V16SI "HI") (V8SI "QI") (V4SI "QI")
1114 : 5020 : (V8DI "QI") (V4DI "QI") (V2DI "QI")
1115 : 5020 : (V32HF "SI") (V16HF "HI") (V8HF "QI")
1116 : 9942 : (V32BF "SI") (V16BF "HI") (V8BF "QI")
1117 : : (V16SF "HI") (V8SF "QI") (V4SF "QI")
1118 : : (V8DF "QI") (V4DF "QI") (V2DF "QI")])
1119 : :
1120 : : ;; Mapping of vector modes to corresponding complex mask size
1121 : : (define_mode_attr avx512fmaskcmode
1122 : : [(V32HF "HI") (V16HF "QI") (V8HF "QI")])
1123 : :
1124 : : ;; Mapping of vector modes to corresponding mask size
1125 : : (define_mode_attr avx512fmaskmodelower
1126 : : [(V64QI "di") (V32QI "si") (V16QI "hi")
1127 : : (V32HI "si") (V16HI "hi") (V8HI "qi") (V4HI "qi")
1128 : : (V16SI "hi") (V8SI "qi") (V4SI "qi")
1129 : : (V8DI "qi") (V4DI "qi") (V2DI "qi")
1130 : : (V32HF "si") (V16HF "hi") (V8HF "qi")
1131 : : (V32BF "si") (V16BF "hi") (V8BF "qi")
1132 : : (V16SF "hi") (V8SF "qi") (V4SF "qi")
1133 : : (V8DF "qi") (V4DF "qi") (V2DF "qi")])
1134 : :
1135 : : ;; Mapping of vector modes to corresponding mask half size
1136 : : (define_mode_attr avx512fmaskhalfmode
1137 : : [(V64QI "SI") (V32QI "HI") (V16QI "QI")
1138 : : (V32HI "HI") (V16HI "QI") (V8HI "QI") (V4HI "QI")
1139 : : (V16SI "QI") (V8SI "QI") (V4SI "QI")
1140 : : (V8DI "QI") (V4DI "QI") (V2DI "QI")
1141 : : (V32HF "HI") (V16HF "QI") (V8HF "QI")
1142 : : (V32BF "HI") (V16BF "QI") (V8BF "QI")
1143 : : (V16SF "QI") (V8SF "QI") (V4SF "QI")
1144 : : (V8DF "QI") (V4DF "QI") (V2DF "QI")])
1145 : :
1146 : : ;; Mapping of vector float modes to an integer mode of the same size
1147 : : (define_mode_attr sseintvecmode
1148 : : [(V32HF "V32HI") (V32BF "V32HI") (V16SF "V16SI") (V8DF "V8DI")
1149 : : (V16HF "V16HI") (V16BF "V16HI") (V8SF "V8SI") (V4DF "V4DI")
1150 : : (V8HF "V8HI") (V8BF "V8HI") (V4SF "V4SI") (V2DF "V2DI")
1151 : : (V16SI "V16SI") (V8DI "V8DI")
1152 : : (V8SI "V8SI") (V4DI "V4DI")
1153 : : (V4SI "V4SI") (V2DI "V2DI")
1154 : : (V16HI "V16HI") (V8HI "V8HI")
1155 : : (V32HI "V32HI") (V64QI "V64QI")
1156 : : (V32QI "V32QI") (V16QI "V16QI")])
1157 : :
1158 : : ;; Mapping of vector modes to an V*HImode of the same size
1159 : : (define_mode_attr ssewvecmode
1160 : : [(V8DI "V32HI") (V4DI "V16HI") (V2DI "V8HI")
1161 : : (V16SI "V32HI") (V8SI "V16HI") (V4SI "V8HI")])
1162 : :
1163 : : (define_mode_attr ssewvecmodelower
1164 : : [(V8DI "v32hi") (V4DI "v16hi") (V2DI "v8hi")
1165 : : (V16SI "v32hi") (V8SI "v16hi") (V4SI "v8hi")])
1166 : :
1167 : : (define_mode_attr sseintvecmode2
1168 : : [(V8DF "XI") (V4DF "OI") (V2DF "TI")
1169 : : (V8SF "OI") (V4SF "TI")
1170 : : (V16HF "OI") (V8HF "TI")
1171 : : (V16BF "OI") (V8BF "TI")])
1172 : :
1173 : : (define_mode_attr sseintvecmodelower
1174 : : [(V32HF "v32hi") (V32BF "v32hi") (V16SF "v16si") (V8DF "v8di")
1175 : : (V16HF "v16hi") (V16BF "v16hi") (V8SF "v8si") (V4DF "v4di")
1176 : : (V8HF "v8hi") (V8BF "v8hi") (V4SF "v4si") (V2DF "v2di")
1177 : : (V8SI "v8si") (V4DI "v4di")
1178 : : (V4SI "v4si") (V2DI "v2di")
1179 : : (V16HI "v16hi") (V8HI "v8hi")
1180 : : (V32QI "v32qi") (V16QI "v16qi")])
1181 : :
1182 : : ;; Mapping of vector modes to an V*SImode of the same size
1183 : : (define_mode_attr ssedvecmode
1184 : : [(V64QI "V16SI") (V32QI "V8SI") (V16QI "V4SI")])
1185 : :
1186 : : (define_mode_attr ssedvecmodelower
1187 : : [(V64QI "v16si") (V32QI "v8si") (V16QI "v4si")])
1188 : :
1189 : : ;; Mapping of vector modes to a vector mode of double size
1190 : : (define_mode_attr ssedoublevecmode
1191 : : [(V64QI "V128QI") (V32HI "V64HI") (V16SI "V32SI") (V8DI "V16DI")
1192 : : (V32QI "V64QI") (V16HI "V32HI") (V8SI "V16SI") (V4DI "V8DI")
1193 : : (V16QI "V32QI") (V8HI "V16HI") (V4SI "V8SI") (V2DI "V4DI")
1194 : : (V16SF "V32SF") (V8DF "V16DF")
1195 : : (V8SF "V16SF") (V4DF "V8DF")
1196 : : (V4SF "V8SF") (V2DF "V4DF")
1197 : : (V32HF "V64HF") (V16HF "V32HF") (V8HF "V16HF")
1198 : : (V32BF "V64BF") (V16BF "V32BF") (V8BF "V16BF")])
1199 : :
1200 : : ;; Mapping of vector modes to a vector mode of half size
1201 : : ;; instead of V1DI/V1DF, DI/DF are used for V2DI/V2DF although they are scalar.
1202 : : (define_mode_attr ssehalfvecmode
1203 : : [(V64QI "V32QI") (V32HI "V16HI") (V16SI "V8SI") (V8DI "V4DI") (V4TI "V2TI")
1204 : : (V32QI "V16QI") (V16HI "V8HI") (V8SI "V4SI") (V4DI "V2DI")
1205 : : (V16QI "V8QI") (V8HI "V4HI") (V4SI "V2SI") (V2DI "DI")
1206 : : (V16SF "V8SF") (V8DF "V4DF")
1207 : : (V8SF "V4SF") (V4DF "V2DF")
1208 : : (V4SF "V2SF") (V2DF "DF")
1209 : : (V32HF "V16HF") (V16HF "V8HF") (V8HF "V4HF")
1210 : : (V32BF "V16BF") (V16BF "V8BF") (V8BF "V4BF")])
1211 : :
1212 : : (define_mode_attr ssehalfvecmodelower
1213 : : [(V64QI "v32qi") (V32HI "v16hi") (V16SI "v8si") (V8DI "v4di") (V4TI "v2ti")
1214 : : (V32QI "v16qi") (V16HI "v8hi") (V8SI "v4si") (V4DI "v2di")
1215 : : (V16QI "v8qi") (V8HI "v4hi") (V4SI "v2si")
1216 : : (V16SF "v8sf") (V8DF "v4df")
1217 : : (V8SF "v4sf") (V4DF "v2df")
1218 : : (V4SF "v2sf")
1219 : : (V32HF "v16hf") (V16HF "v8hf") (V8HF "v4hf")
1220 : : (V32BF "v16bf") (V16BF "v8bf") (V8BF "v4bf")])
1221 : :
1222 : : ;; Mapping of vector modes to vector hf modes of conversion.
1223 : : (define_mode_attr ssePHmode
1224 : : [(V32HI "V32HF") (V16HI "V16HF") (V8HI "V8HF")
1225 : : (V16SI "V16HF") (V8SI "V8HF") (V4SI "V8HF")
1226 : : (V8DI "V8HF") (V4DI "V8HF") (V2DI "V8HF")
1227 : : (V8DF "V8HF") (V16SF "V16HF") (V8SF "V8HF")])
1228 : :
1229 : : ;; Mapping of vector modes to vector hf modes of same element.
1230 : : (define_mode_attr ssePHmodelower
1231 : : [(V32HI "v32hf") (V16HI "v16hf") (V8HI "v8hf")
1232 : : (V16SI "v16hf") (V8SI "v8hf") (V4SI "v4hf")
1233 : : (V8DI "v8hf") (V4DI "v4hf") (V2DI "v2hf")
1234 : : (V8DF "v8hf") (V16SF "v16hf") (V8SF "v8hf")])
1235 : :
1236 : :
1237 : : ;; Mapping of vector modes to packed vector hf modes of same sized.
1238 : : (define_mode_attr ssepackPHmode
1239 : : [(V16SI "V32HF") (V8SI "V16HF") (V4SI "V8HF")
1240 : : (V16SF "V32HF") (V8SF "V16HF") (V4SF "V8HF")])
1241 : :
1242 : : ;; Mapping of vector modes to packed single mode of the same size
1243 : : (define_mode_attr ssePSmode
1244 : : [(V16SI "V16SF") (V8DF "V16SF")
1245 : : (V16SF "V16SF") (V8DI "V16SF")
1246 : : (V64QI "V16SF") (V32QI "V8SF") (V16QI "V4SF")
1247 : : (V32HI "V16SF") (V16HI "V8SF") (V8HI "V4SF")
1248 : : (V8SI "V8SF") (V4SI "V4SF")
1249 : : (V4DI "V8SF") (V2DI "V4SF")
1250 : : (V4TI "V16SF") (V2TI "V8SF") (V1TI "V4SF")
1251 : : (V8SF "V8SF") (V4SF "V4SF")
1252 : : (V4DF "V8SF") (V2DF "V4SF")
1253 : : (V32HF "V16SF") (V16HF "V8SF") (V8HF "V4SF")])
1254 : :
1255 : : (define_mode_attr ssePSmodelower
1256 : : [(V16SI "v16sf") (V8DF "v16sf")
1257 : : (V16SF "v16sf") (V8DI "v16sf")
1258 : : (V64QI "v16sf") (V32QI "v8sf") (V16QI "v4sf")
1259 : : (V32HI "v16sf") (V16HI "v8sf") (V8HI "v4sf")
1260 : : (V8SI "v8sf") (V4SI "v4sf")
1261 : : (V4DI "v8sf") (V2DI "v4sf")
1262 : : (V4TI "v16sf") (V2TI "v8sf") (V1TI "v4sf")
1263 : : (V8SF "v8sf") (V4SF "v4sf")
1264 : : (V4DF "v8sf") (V2DF "v4sf")
1265 : : (V32HF "v16sf") (V16HF "v8sf") (V8HF "v4sf")])
1266 : :
1267 : : (define_mode_attr ssePSmode2
1268 : : [(V8DI "V8SF") (V4DI "V4SF")])
1269 : :
1270 : : (define_mode_attr ssePSmode2lower
1271 : : [(V8DI "v8sf") (V4DI "v4sf")])
1272 : :
1273 : : ;; Mapping of vector modes back to the scalar modes
1274 : : (define_mode_attr ssescalarmode
1275 : : [(V64QI "QI") (V32QI "QI") (V16QI "QI")
1276 : : (V32HI "HI") (V16HI "HI") (V8HI "HI")
1277 : : (V16SI "SI") (V8SI "SI") (V4SI "SI")
1278 : : (V8DI "DI") (V4DI "DI") (V2DI "DI")
1279 : : (V32HF "HF") (V16HF "HF") (V8HF "HF")
1280 : : (V32BF "BF") (V16BF "BF") (V8BF "BF")
1281 : : (V16SF "SF") (V8SF "SF") (V4SF "SF")
1282 : : (V8DF "DF") (V4DF "DF") (V2DF "DF")
1283 : : (V4TI "TI") (V2TI "TI")])
1284 : :
1285 : : ;; Mapping of vector modes back to the scalar modes
1286 : : (define_mode_attr ssescalarmodelower
1287 : : [(V64QI "qi") (V32QI "qi") (V16QI "qi")
1288 : : (V32HI "hi") (V16HI "hi") (V8HI "hi")
1289 : : (V16SI "si") (V8SI "si") (V4SI "si")
1290 : : (V8DI "di") (V4DI "di") (V2DI "di")
1291 : : (V32HF "hf") (V16HF "hf") (V8HF "hf")
1292 : : (V32BF "bf") (V16BF "bf") (V8BF "bf")
1293 : : (V16SF "sf") (V8SF "sf") (V4SF "sf")
1294 : : (V8DF "df") (V4DF "df") (V2DF "df")
1295 : : (V4TI "ti") (V2TI "ti")])
1296 : :
1297 : : ;; Mapping of vector modes to the 128bit modes
1298 : : (define_mode_attr ssexmmmode
1299 : : [(V64QI "V16QI") (V32QI "V16QI") (V16QI "V16QI")
1300 : : (V32HI "V8HI") (V16HI "V8HI") (V8HI "V8HI")
1301 : : (V16SI "V4SI") (V8SI "V4SI") (V4SI "V4SI")
1302 : : (V8DI "V2DI") (V4DI "V2DI") (V2DI "V2DI")
1303 : : (V32HF "V8HF") (V16HF "V8HF") (V8HF "V8HF")
1304 : : (V32BF "V8BF") (V16BF "V8BF") (V8BF "V8BF")
1305 : : (V16SF "V4SF") (V8SF "V4SF") (V4SF "V4SF")
1306 : : (V8DF "V2DF") (V4DF "V2DF") (V2DF "V2DF")])
1307 : :
1308 : : ;; Pointer size override for scalar modes (Intel asm dialect)
1309 : : (define_mode_attr iptr
1310 : : [(V64QI "b") (V32HI "w") (V16SI "k") (V8DI "q")
1311 : : (V32QI "b") (V16HI "w") (V8SI "k") (V4DI "q")
1312 : : (V16QI "b") (V8HI "w") (V4SI "k") (V2DI "q")
1313 : : (V32HF "w") (V32BF "w") (V16SF "k") (V8DF "q")
1314 : : (V16HF "w") (V16BF "w") (V8SF "k") (V4DF "q")
1315 : : (V8HF "w") (V8BF "w") (V4SF "k") (V2DF "q")
1316 : : (HF "w") (BF "w") (SF "k") (DF "q")])
1317 : :
1318 : : ;; Pointer size override for 16-bit upper-convert modes (Intel asm dialect)
1319 : : (define_mode_attr iptrh
1320 : : [(V32HI "") (V16SI "") (V8DI "")
1321 : : (V16HI "") (V8SI "") (V4DI "q")
1322 : : (V8HI "") (V4SI "q") (V2DI "k")])
1323 : :
1324 : : ;; Mapping of vector modes to VPTERNLOG suffix
1325 : : (define_mode_attr ternlogsuffix
1326 : : [(V8DI "q") (V4DI "q") (V2DI "q")
1327 : : (V8DF "q") (V4DF "q") (V2DF "q")
1328 : : (V16SI "d") (V8SI "d") (V4SI "d")
1329 : : (V16SF "d") (V8SF "d") (V4SF "d")
1330 : : (V32HI "d") (V16HI "d") (V8HI "d")
1331 : : (V32HF "d") (V16HF "d") (V8HF "d")
1332 : : (V32BF "d") (V16BF "d") (V8BF "d")
1333 : : (V64QI "d") (V32QI "d") (V16QI "d")])
1334 : :
1335 : : ;; Number of scalar elements in each vector type
1336 : : (define_mode_attr ssescalarnum
1337 : : [(V64QI "64") (V16SI "16") (V8DI "8")
1338 : : (V32QI "32") (V16HI "16") (V8SI "8") (V4DI "4")
1339 : : (V16QI "16") (V8HI "8") (V4SI "4") (V2DI "2")
1340 : : (V16SF "16") (V8DF "8")
1341 : : (V8SF "8") (V4DF "4")
1342 : : (V4SF "4") (V2DF "2")])
1343 : :
1344 : : ;; Mask of scalar elements in each vector type
1345 : : (define_mode_attr ssescalarnummask
1346 : : [(V32QI "31") (V16HI "15") (V8SI "7") (V4DI "3")
1347 : : (V16QI "15") (V8HI "7") (V4SI "3") (V2DI "1")
1348 : : (V8SF "7") (V4DF "3")
1349 : : (V4SF "3") (V2DF "1")])
1350 : :
1351 : : (define_mode_attr ssescalarsize
1352 : : [(V4TI "64") (V2TI "64") (V1TI "64")
1353 : : (V8DI "64") (V4DI "64") (V2DI "64")
1354 : : (V64QI "8") (V32QI "8") (V16QI "8")
1355 : : (V32HI "16") (V16HI "16") (V8HI "16")
1356 : : (V16SI "32") (V8SI "32") (V4SI "32")
1357 : : (V32HF "16") (V16HF "16") (V8HF "16")
1358 : : (V32BF "16") (V16BF "16") (V8BF "16")
1359 : : (V16SF "32") (V8SF "32") (V4SF "32")
1360 : : (V8DF "64") (V4DF "64") (V2DF "64")])
1361 : :
1362 : : ;; SSE prefix for integer and HF vector modes
1363 : : (define_mode_attr sseintprefix
1364 : : [(V2DI "p") (V2DF "")
1365 : : (V4DI "p") (V4DF "")
1366 : : (V8DI "p") (V8DF "")
1367 : : (V4SI "p") (V4SF "")
1368 : : (V8SI "p") (V8SF "")
1369 : : (V16SI "p") (V16SF "")
1370 : : (V16QI "p") (V8HI "p") (V8HF "p") (V8BF "p")
1371 : : (V32QI "p") (V16HI "p") (V16HF "p") (V16BF "p")
1372 : : (V64QI "p") (V32HI "p") (V32HF "p") (V32BF "p")])
1373 : :
1374 : : ;; SSE prefix for integer and HF vector comparison.
1375 : : (define_mode_attr ssecmpintprefix
1376 : : [(V2DI "p") (V2DF "")
1377 : : (V4DI "p") (V4DF "")
1378 : : (V8DI "p") (V8DF "")
1379 : : (V4SI "p") (V4SF "")
1380 : : (V8SI "p") (V8SF "")
1381 : : (V16SI "p") (V16SF "")
1382 : : (V16QI "p") (V8HI "p") (V8HF "")
1383 : : (V32QI "p") (V16HI "p") (V16HF "")
1384 : : (V64QI "p") (V32HI "p") (V32HF "")])
1385 : :
1386 : : ;; SSE scalar suffix for vector modes
1387 : : (define_mode_attr ssescalarmodesuffix
1388 : : [(HF "sh") (SF "ss") (DF "sd")
1389 : : (V32HF "sh") (V16SF "ss") (V8DF "sd")
1390 : : (V16HF "sh") (V8SF "ss") (V4DF "sd")
1391 : : (V8HF "sh") (V4SF "ss") (V2DF "sd")
1392 : : (V16SI "d") (V8DI "q")
1393 : : (V8SI "d") (V4DI "q")
1394 : : (V4SI "d") (V2DI "q")])
1395 : :
1396 : : ;; Pack/unpack vector modes
1397 : : (define_mode_attr sseunpackmode
1398 : : [(V16QI "V8HI") (V8HI "V4SI") (V4SI "V2DI")
1399 : : (V32QI "V16HI") (V16HI "V8SI") (V8SI "V4DI")
1400 : : (V32HI "V16SI") (V64QI "V32HI") (V16SI "V8DI")])
1401 : :
1402 : : (define_mode_attr sseunpackmodelower
1403 : : [(V16QI "v8hi") (V8HI "v4si") (V4SI "v2di")
1404 : : (V32QI "v16hi") (V16HI "v8si") (V8SI "v4di")
1405 : : (V32HI "v16si") (V64QI "v32hi") (V16SI "v8di")])
1406 : :
1407 : : (define_mode_attr ssepackmode
1408 : : [(V8HI "V16QI") (V4SI "V8HI") (V2DI "V4SI")
1409 : : (V16HI "V32QI") (V8SI "V16HI") (V4DI "V8SI")
1410 : : (V32HI "V64QI") (V16SI "V32HI") (V8DI "V16SI")])
1411 : :
1412 : : (define_mode_attr ssepackmodelower
1413 : : [(V8HI "v16qi") (V4SI "v8hi") (V2DI "v4si")
1414 : : (V16HI "v32qi") (V8SI "v16hi") (V4DI "v8si")
1415 : : (V32HI "v64qi") (V16SI "v32hi") (V8DI "v16si")])
1416 : :
1417 : : ;; Mapping of the max integer size for xop rotate immediate constraint
1418 : : (define_mode_attr sserotatemax
1419 : : [(V16QI "7") (V8HI "15") (V4SI "31") (V2DI "63")])
1420 : :
1421 : : ;; Mapping of mode to cast intrinsic name
1422 : : (define_mode_attr castmode
1423 : : [(V4SF "ps") (V2DF "pd")
1424 : : (V8SI "si") (V8SF "ps") (V4DF "pd")
1425 : : (V16SI "si") (V16SF "ps") (V8DF "pd")])
1426 : :
1427 : : ;; i128 for integer vectors and TARGET_AVX2, f128 otherwise.
1428 : : ;; i64x4 or f64x4 for 512bit modes.
1429 : : (define_mode_attr i128
1430 : : [(V16HF "%~128") (V32HF "i64x4") (V16BF "%~128") (V32BF "i64x4")
1431 : : (V16SF "f64x4") (V8SF "f128")
1432 : : (V8DF "f64x4") (V4DF "f128")
1433 : : (V64QI "i64x4") (V32QI "%~128") (V32HI "i64x4") (V16HI "%~128")
1434 : : (V16SI "i64x4") (V8SI "%~128") (V8DI "i64x4") (V4DI "%~128")])
1435 : :
1436 : : ;; For 256-bit modes for TARGET_AVX512VL && TARGET_AVX512DQ
1437 : : ;; i32x4, f32x4, i64x2 or f64x2 suffixes.
1438 : : (define_mode_attr i128vldq
1439 : : [(V16HF "i32x4") (V16BF "i32x4") (V8SF "f32x4") (V4DF "f64x2")
1440 : : (V32QI "i32x4") (V16HI "i32x4") (V8SI "i32x4") (V4DI "i64x2")])
1441 : :
1442 : : ;; Mix-n-match
1443 : : (define_mode_iterator AVX256MODE2P [V8SI V8SF V4DF])
1444 : : (define_mode_iterator AVX512MODE2P
1445 : 583 : [(V16SI "TARGET_EVEX512") (V16SF "TARGET_EVEX512") (V8DF "TARGET_EVEX512")])
1446 : :
1447 : : ;; Mapping for dbpsabbw modes
1448 : : (define_mode_attr dbpsadbwmode
1449 : 317 : [(V32HI "V64QI") (V16HI "V32QI") (V8HI "V16QI")])
1450 : 317 :
1451 : 473 : ;; Mapping suffixes for broadcast
1452 : : (define_mode_attr bcstscalarsuff
1453 : : [(V64QI "b") (V32QI "b") (V16QI "b")
1454 : : (V32HI "w") (V16HI "w") (V8HI "w")
1455 : : (V16SI "d") (V8SI "d") (V4SI "d")
1456 : : (V8DI "q") (V4DI "q") (V2DI "q")
1457 : 56998 : (V32HF "w") (V16HF "w") (V8HF "w")
1458 : 56998 : (V32BF "w") (V16BF "w") (V8BF "w")
1459 : 1255557 : (V16SF "ss") (V8SF "ss") (V4SF "ss")
1460 : 1255557 : (V8DF "sd") (V4DF "sd") (V2DF "sd")])
1461 : 94 :
1462 : 6624 : ;; Tie mode of assembler operand to mode iterator
1463 : 6530 : (define_mode_attr xtg_mode
1464 : 94 : [(V16QI "x") (V8HI "x") (V4SI "x") (V2DI "x")
1465 : 94 : (V8HF "x") (V8BF "x") (V4SF "x") (V2DF "x")
1466 : 94 : (V32QI "t") (V16HI "t") (V8SI "t") (V4DI "t")
1467 : 1 : (V16HF "t") (V16BF "t") (V8SF "t") (V4DF "t")
1468 : 1 : (V64QI "g") (V32HI "g") (V16SI "g") (V8DI "g")
1469 : : (V32HF "g") (V32BF "g") (V16SF "g") (V8DF "g")])
1470 : 1 :
1471 : 1 : ;; Half mask mode for unpacks
1472 : 1 : (define_mode_attr HALFMASKMODE
1473 : 1 : [(DI "SI") (SI "HI")])
1474 : :
1475 : : ;; Double mask mode for packs
1476 : : (define_mode_attr DOUBLEMASKMODE
1477 : : [(HI "SI") (SI "DI")])
1478 : :
1479 : :
1480 : : ;; Include define_subst patterns for instructions with mask
1481 : : (include "subst.md")
1482 : :
1483 : : ;; Patterns whose name begins with "sse{,2,3}_" are invoked by intrinsics.
1484 : :
1485 : : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1486 : : ;;
1487 : : ;; Move patterns
1488 : : ;;
1489 : : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1490 : :
1491 : : ;; All of these patterns are enabled for SSE1 as well as SSE2.
1492 : : ;; This is essential for maintaining stable calling conventions.
1493 : :
1494 : : (define_expand "mov<mode>"
1495 : : [(set (match_operand:VMOVE 0 "nonimmediate_operand")
1496 : : (match_operand:VMOVE 1 "nonimmediate_or_sse_const_operand"))]
1497 : : "TARGET_SSE"
1498 : 3324672 : {
1499 : 2015188 : ix86_expand_vector_move (<MODE>mode, operands);
1500 : 3324672 : DONE;
1501 : : })
1502 : :
1503 : : (define_insn "mov<mode>_internal"
1504 : : [(set (match_operand:VMOVE 0 "nonimmediate_operand"
1505 : : "=v,v ,x,v ,m")
1506 : : (match_operand:VMOVE 1 "nonimmediate_or_sse_const_operand"
1507 : : " C,<sseconstm1>,BH,vm,v"))]
1508 : 67785925 : "TARGET_SSE
1509 : 70323582 : && (register_operand (operands[0], <MODE>mode)
1510 : 20533039 : || register_operand (operands[1], <MODE>mode))
1511 : 66621566 : && ix86_hardreg_mov_ok (operands[0], operands[1])"
1512 : 9924040 : {
1513 : 17153252 : switch (get_attr_type (insn))
1514 : 10876957 : {
1515 : 13991263 : case TYPE_SSELOG1:
1516 : 1666152 : return standard_sse_constant_opcode (insn, operands);
1517 : 1350581 :
1518 : 8127701 : case TYPE_SSEMOV:
1519 : 3171287 : return ix86_output_ssemov (insn, operands);
1520 : :
1521 : 1517989 : default:
1522 : 1309484 : gcc_unreachable ();
1523 : 1310200 : }
1524 : 1310200 : }
1525 : 208505 : [(set_attr "type" "sselog1,sselog1,sselog1,ssemov,ssemov")
1526 : 1517273 : (set_attr "prefix" "maybe_vex")
1527 : 208505 : (set (attr "mode")
1528 : 3681466 : (cond [(match_test "TARGET_AVX")
1529 : 207789 : (const_string "<sseinsnmode>")
1530 : 207789 : (ior (not (match_test "TARGET_SSE2"))
1531 : 207789 : (match_test "optimize_function_for_size_p (cfun)"))
1532 : 207789 : (const_string "V4SF")
1533 : 207789 : (and (match_test "<MODE>mode == V2DFmode")
1534 : 207789 : (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL"))
1535 : : (const_string "V4SF")
1536 : 135216 : (and (eq_attr "alternative" "4")
1537 : 36965085 : (match_test "TARGET_SSE_TYPELESS_STORES"))
1538 : 135216 : (const_string "V4SF")
1539 : 23567653 : (and (eq_attr "alternative" "0")
1540 : 5478659 : (match_test "TARGET_SSE_LOAD0_BY_PXOR"))
1541 : 15482130 : (const_string "TI")
1542 : 46225 : ]
1543 : 46225 : (const_string "<sseinsnmode>")))
1544 : 46225 : (set (attr "enabled")
1545 : 43773070 : (cond [(and (match_test "<MODE_SIZE> == 16")
1546 : 286653317 : (eq_attr "alternative" "1"))
1547 : 295352461 : (symbol_ref "TARGET_SSE2")
1548 : 287822938 : (and (match_test "<MODE_SIZE> == 32")
1549 : 33449105 : (eq_attr "alternative" "1"))
1550 : 29300687 : (symbol_ref "TARGET_AVX2")
1551 : 32667691 : ]
1552 : 154316939 : (symbol_ref "true")))])
1553 : 28395 :
1554 : 141628 : ; False dependency happens on destination register which is not really
1555 : 8510 : ; used when moving all ones to vector register
1556 : 8510 : (define_split
1557 : 7702 : [(set (match_operand:VMOVE 0 "register_operand")
1558 : 15653 : (match_operand:VMOVE 1 "int_float_vector_all_ones_operand"))]
1559 : 5494 : "TARGET_AVX512F && reload_completed
1560 : 9931 : && (<MODE_SIZE> == 64 || EXT_REX_SSE_REG_P (operands[0]))
1561 : 7708 : && optimize_insn_for_speed_p ()"
1562 : 3348194 : [(set (match_dup 0) (match_dup 2))
1563 : 5961300 : (parallel
1564 : 5954406 : [(set (match_dup 0) (match_dup 1))
1565 : 113611 : (unspec [(match_dup 0)] UNSPEC_INSN_FALSE_DEP)])]
1566 : 114327 : "operands[2] = CONST0_RTX (<MODE>mode);")
1567 : 81488 :
1568 : 113611 : (define_insn "*vmov<mode>_constm1_pternlog_false_dep"
1569 : 716 : [(set (match_operand:VMOVE 0 "register_operand" "=v")
1570 : 716 : (match_operand:VMOVE 1 "int_float_vector_all_ones_operand" "<sseconstm1>"))
1571 : 716 : (unspec [(match_operand:VMOVE 2 "register_operand" "0")] UNSPEC_INSN_FALSE_DEP)]
1572 : 722 : "TARGET_AVX512VL || <MODE_SIZE> == 64"
1573 : 716 : "vpternlogd\t{$0xFF, %0, %0, %0|%0, %0, %0, 0xFF}"
1574 : 716 : [(set_attr "type" "sselog1")
1575 : 716 : (set_attr "prefix" "evex")])
1576 : 759 :
1577 : 1475 : ;; If mem_addr points to a memory region with less than whole vector size bytes
1578 : 759 : ;; of accessible memory and k is a mask that would prevent reading the inaccessible
1579 : 764 : ;; bytes from mem_addr, add UNSPEC_MASKLOAD to prevent it to be transformed to vpblendd
1580 : 1445 : ;; See pr97642.
1581 : 75 : (define_expand "<avx512>_load<mode>_mask"
1582 : 75 : [(set (match_operand:V48_AVX512VL 0 "register_operand")
1583 : 75 : (vec_merge:V48_AVX512VL
1584 : 75 : (match_operand:V48_AVX512VL 1 "nonimmediate_operand")
1585 : 791 : (match_operand:V48_AVX512VL 2 "nonimm_or_0_operand")
1586 : 791 : (match_operand:<avx512fmaskmode> 3 "register_or_constm1_operand")))]
1587 : 3379 : "TARGET_AVX512F"
1588 : 4129 : {
1589 : 4129 : if (CONST_INT_P (operands[3]))
1590 : : {
1591 : 35 : emit_insn (gen_rtx_SET (operands[0], operands[1]));
1592 : 35 : DONE;
1593 : 2658 : }
1594 : 1466 : else if (MEM_P (operands[1]))
1595 : 743 : operands[1] = gen_rtx_UNSPEC (<MODE>mode,
1596 : 0 : gen_rtvec(1, operands[1]),
1597 : 1309 : UNSPEC_MASKLOAD);
1598 : 1309 : })
1599 : 0 :
1600 : 0 : (define_insn "*<avx512>_load<mode>_mask"
1601 : 0 : [(set (match_operand:V48_AVX512VL 0 "register_operand" "=v")
1602 : 2775 : (vec_merge:V48_AVX512VL
1603 : 2775 : (unspec:V48_AVX512VL
1604 : 1309 : [(match_operand:V48_AVX512VL 1 "memory_operand" "m")]
1605 : 1466 : UNSPEC_MASKLOAD)
1606 : 1466 : (match_operand:V48_AVX512VL 2 "nonimm_or_0_operand" "0C")
1607 : 1466 : (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk")))]
1608 : 3339 : "TARGET_AVX512F"
1609 : 1000 : {
1610 : 1576 : if (FLOAT_MODE_P (GET_MODE_INNER (<MODE>mode)))
1611 : : {
1612 : 395 : if (misaligned_operand (operands[1], <MODE>mode))
1613 : 1994 : return "vmovu<ssemodesuffix>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}";
1614 : 1994 : else
1615 : 3706 : return "vmova<ssemodesuffix>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}";
1616 : 1466 : }
1617 : 1466 : else
1618 : : {
1619 : 605 : if (misaligned_operand (operands[1], <MODE>mode))
1620 : : return "vmovdqu<ssescalarsize>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}";
1621 : : else
1622 : 376 : return "vmovdqa<ssescalarsize>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}";
1623 : 6 : }
1624 : 851 : }
1625 : 857 : [(set_attr "type" "ssemov")
1626 : 857 : (set_attr "prefix" "evex")
1627 : 1014 : (set_attr "mode" "<sseinsnmode>")])
1628 : 2347 :
1629 : 851 : (define_insn_and_split "*<avx512>_load<mode>"
1630 : 857 : [(set (match_operand:V48_AVX512VL 0 "register_operand")
1631 : 163 : (unspec:V48_AVX512VL
1632 : 163 : [(match_operand:V48_AVX512VL 1 "memory_operand")]
1633 : 163 : UNSPEC_MASKLOAD))]
1634 : 196 : "TARGET_AVX512F"
1635 : 6 : "#"
1636 : : "&& 1"
1637 : 6 : [(set (match_dup 0) (match_dup 1))])
1638 : 14 :
1639 : 6 : (define_expand "<avx512>_load<mode>_mask"
1640 : 6 : [(set (match_operand:VI12_AVX512VL 0 "register_operand")
1641 : 6 : (vec_merge:VI12_AVX512VL
1642 : : (match_operand:VI12_AVX512VL 1 "nonimmediate_operand")
1643 : : (match_operand:VI12_AVX512VL 2 "nonimm_or_0_operand")
1644 : 624 : (match_operand:<avx512fmaskmode> 3 "register_or_constm1_operand")))]
1645 : 2 : "TARGET_AVX512BW"
1646 : 784 : {
1647 : 786 : if (CONST_INT_P (operands[3]))
1648 : 2 : {
1649 : 2 : emit_insn (gen_rtx_SET (operands[0], operands[1]));
1650 : 626 : DONE;
1651 : 624 : }
1652 : 786 : else if (MEM_P (operands[1]))
1653 : 152 : operands[1] = gen_rtx_UNSPEC (<MODE>mode,
1654 : 626 : gen_rtvec(1, operands[1]),
1655 : 626 : UNSPEC_MASKLOAD);
1656 : 626 :
1657 : 2 : })
1658 : :
1659 : 2 : (define_insn "*<avx512>_load<mode>_mask"
1660 : 626 : [(set (match_operand:VI12HFBF_AVX512VL 0 "register_operand" "=v")
1661 : 868 : (vec_merge:VI12HFBF_AVX512VL
1662 : 866 : (unspec:VI12HFBF_AVX512VL
1663 : 866 : [(match_operand:VI12HFBF_AVX512VL 1 "memory_operand" "m")]
1664 : 866 : UNSPEC_MASKLOAD)
1665 : 784 : (match_operand:VI12HFBF_AVX512VL 2 "nonimm_or_0_operand" "0C")
1666 : 944 : (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk")))]
1667 : 1613 : "TARGET_AVX512BW"
1668 : 21 : "vmovdqu<ssescalarsize>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
1669 : 784 : [(set_attr "type" "ssemov")
1670 : 0 : (set_attr "prefix" "evex")
1671 : 160 : (set_attr "mode" "<sseinsnmode>")])
1672 : 160 :
1673 : 160 : (define_insn_and_split "*<avx512>_load<mode>"
1674 : 784 : [(set (match_operand:VI12HFBF_AVX512VL 0 "register_operand" "=v")
1675 : 944 : (unspec:VI12HFBF_AVX512VL
1676 : 784 : [(match_operand:VI12HFBF_AVX512VL 1 "memory_operand" "m")]
1677 : 177 : UNSPEC_MASKLOAD))]
1678 : 177 : "TARGET_AVX512BW"
1679 : 17 : "#"
1680 : 17 : "&& 1"
1681 : 54 : [(set (match_dup 0) (match_dup 1))])
1682 : 0 :
1683 : 0 : (define_insn "avx512f_mov<ssescalarmodelower>_mask"
1684 : 15 : [(set (match_operand:VFH_128 0 "register_operand" "=v")
1685 : 0 : (vec_merge:VFH_128
1686 : 54 : (vec_merge:VFH_128
1687 : 54 : (match_operand:VFH_128 2 "register_operand" "v")
1688 : 82820 : (match_operand:VFH_128 3 "nonimm_or_0_operand" "0C")
1689 : 91120 : (match_operand:QI 4 "register_operand" "Yk"))
1690 : 54 : (match_operand:VFH_128 1 "register_operand" "v")
1691 : 18825 : (const_int 1)))]
1692 : 9055 : "TARGET_AVX512F"
1693 : 206112 : "vmov<ssescalarmodesuffix>\t{%2, %1, %0%{%4%}%N3|%0%{%4%}%N3, %1, %2}"
1694 : 195671 : [(set_attr "type" "ssemov")
1695 : 196340 : (set_attr "prefix" "evex")
1696 : 1082 : (set_attr "mode" "<ssescalarmode>")])
1697 : 8689 :
1698 : 1082 : (define_expand "avx512f_load<mode>_mask"
1699 : 36953 : [(set (match_operand:<ssevecmode> 0 "register_operand")
1700 : 76 : (vec_merge:<ssevecmode>
1701 : 76 : (vec_merge:<ssevecmode>
1702 : : (vec_duplicate:<ssevecmode>
1703 : 1009 : (match_operand:MODEFH 1 "memory_operand"))
1704 : 12565 : (match_operand:<ssevecmode> 2 "nonimm_or_0_operand")
1705 : 0 : (match_operand:QI 3 "register_operand"))
1706 : 13574 : (match_dup 4)
1707 : 13574 : (const_int 1)))]
1708 : 13574 : "TARGET_AVX512F"
1709 : 13658 : "operands[4] = CONST0_RTX (<ssevecmode>mode);")
1710 : 13590 :
1711 : 1009 : (define_insn "*avx512f_load<mode>_mask"
1712 : 217984 : [(set (match_operand:<ssevecmode> 0 "register_operand" "=v")
1713 : 205435 : (vec_merge:<ssevecmode>
1714 : 205419 : (vec_merge:<ssevecmode>
1715 : 205419 : (vec_duplicate:<ssevecmode>
1716 : 84 : (match_operand:MODEFH 1 "memory_operand" "m"))
1717 : 84 : (match_operand:<ssevecmode> 2 "nonimm_or_0_operand" "0C")
1718 : 84 : (match_operand:QI 3 "register_operand" "Yk"))
1719 : 84 : (match_operand:<ssevecmode> 4 "const0_operand")
1720 : 84 : (const_int 1)))]
1721 : 299 : "TARGET_AVX512F"
1722 : : "vmov<ssescalarmodesuffix>\t{%1, %0%{%3%}%N2|%0%{3%}%N2, %1}"
1723 : 84 : [(set_attr "type" "ssemov")
1724 : : (set_attr "prefix" "evex")
1725 : 10911 : (set_attr "memory" "load")
1726 : 244 : (set_attr "mode" "<MODE>")])
1727 : 244 :
1728 : 2420115 : (define_insn "avx512f_store<mode>_mask"
1729 : 2420115 : [(set (match_operand:MODEFH 0 "memory_operand" "=m")
1730 : 2420115 : (if_then_else:MODEFH
1731 : 2420115 : (and:QI (match_operand:QI 2 "register_operand" "Yk")
1732 : 10751 : (const_int 1))
1733 : 10751 : (vec_select:MODEFH
1734 : 84 : (match_operand:<ssevecmode> 1 "register_operand" "v")
1735 : 1700806 : (parallel [(const_int 0)]))
1736 : 0 : (match_dup 0)))]
1737 : 206 : "TARGET_AVX512F"
1738 : 0 : "vmov<ssescalarmodesuffix>\t{%1, %0%{%2%}|%0%{%2%}, %1}"
1739 : 7129 : [(set_attr "type" "ssemov")
1740 : : (set_attr "prefix" "evex")
1741 : 130 : (set_attr "memory" "store")
1742 : 7259 : (set_attr "mode" "<MODE>")])
1743 : 7259 :
1744 : 7129 : (define_insn "<avx512>_blendm<mode>"
1745 : 7129 : [(set (match_operand:V48_AVX512VL 0 "register_operand" "=v,v")
1746 : 7129 : (vec_merge:V48_AVX512VL
1747 : 7129 : (match_operand:V48_AVX512VL 2 "nonimmediate_operand" "vm,vm")
1748 : 41924 : (match_operand:V48_AVX512VL 1 "nonimm_or_0_operand" "0C,v")
1749 : 41924 : (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk,Yk")))]
1750 : 64037 : "TARGET_AVX512F"
1751 : 53454409 : {
1752 : 1662 : if (REG_P (operands[1])
1753 : 1334 : && REGNO (operands[1]) != REGNO (operands[0]))
1754 : : return "v<sseintprefix>blendm<ssemodesuffix>\t{%2, %1, %0%{%3%}|%0%{%3%}, %1, %2}";
1755 : 53411257 :
1756 : 53412153 : if (FLOAT_MODE_P (GET_MODE_INNER (<MODE>mode)))
1757 : 53410823 : {
1758 : 53411368 : if (misaligned_operand (operands[2], <MODE>mode))
1759 : 53410823 : return "vmovu<ssemodesuffix>\t{%2, %0%{%3%}%N1|%0%{%3%}%N1, %2}";
1760 : 53410823 : else
1761 : 53411368 : return "vmova<ssemodesuffix>\t{%2, %0%{%3%}%N1|%0%{%3%}%N1, %2}";
1762 : : }
1763 : 10147731 : else
1764 : 10203970 : {
1765 : 57024 : if (misaligned_operand (operands[2], <MODE>mode))
1766 : 10108798 : return "vmovdqu<ssescalarsize>\t{%2, %0%{%3%}%N1|%0%{%3%}%N1, %2}";
1767 : 56239 : else
1768 : 5279610 : return "vmovdqa<ssescalarsize>\t{%2, %0%{%3%}%N1|%0%{%3%}%N1, %2}";
1769 : : }
1770 : : }
1771 : 414 : [(set_attr "type" "ssemov")
1772 : : (set_attr "prefix" "evex")
1773 : : (set_attr "mode" "<sseinsnmode>")])
1774 : 1219 :
1775 : : (define_insn "<avx512>_blendm<mode>"
1776 : : [(set (match_operand:VI12HFBF_AVX512VL 0 "register_operand" "=v,v")
1777 : : (vec_merge:VI12HFBF_AVX512VL
1778 : : (match_operand:VI12HFBF_AVX512VL 2 "nonimmediate_operand" "vm,vm")
1779 : : (match_operand:VI12HFBF_AVX512VL 1 "nonimm_or_0_operand" "0C,v")
1780 : 0 : (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk,Yk")))]
1781 : 13505 : "TARGET_AVX512BW"
1782 : 0 : "@
1783 : : vmovdqu<ssescalarsize>\t{%2, %0%{%3%}%N1|%0%{%3%}%N1, %2}
1784 : : vpblendm<sseintmodesuffix>\t{%2, %1, %0%{%3%}|%0%{%3%}, %1, %2}"
1785 : : [(set_attr "type" "ssemov")
1786 : : (set_attr "prefix" "evex")
1787 : : (set_attr "mode" "<sseinsnmode>")])
1788 : :
1789 : : (define_insn "*<avx512>_store<mode>_mask"
1790 : : [(set (match_operand:V48_AVX512VL 0 "memory_operand" "=m")
1791 : 646819 : (vec_merge:V48_AVX512VL
1792 : 646819 : (match_operand:V48_AVX512VL 1 "register_operand" "v")
1793 : 646819 : (match_dup 0)
1794 : : (match_operand:<avx512fmaskmode> 2 "register_operand" "Yk")))]
1795 : 41 : "TARGET_AVX512F"
1796 : 45 : {
1797 : 644673 : if (FLOAT_MODE_P (GET_MODE_INNER (<MODE>mode)))
1798 : : {
1799 : 0 : if (misaligned_operand (operands[0], <MODE>mode))
1800 : : return "vmovu<ssemodesuffix>\t{%1, %0%{%2%}|%0%{%2%}, %1}";
1801 : : else
1802 : 0 : return "vmova<ssemodesuffix>\t{%1, %0%{%2%}|%0%{%2%}, %1}";
1803 : : }
1804 : : else
1805 : : {
1806 : 45 : if (misaligned_operand (operands[0], <MODE>mode))
1807 : 0 : return "vmovdqu<ssescalarsize>\t{%1, %0%{%2%}|%0%{%2%}, %1}";
1808 : 0 : else
1809 : 0 : return "vmovdqa<ssescalarsize>\t{%1, %0%{%2%}|%0%{%2%}, %1}";
1810 : 0 : }
1811 : : }
1812 : : [(set_attr "type" "ssemov")
1813 : : (set_attr "prefix" "evex")
1814 : : (set_attr "memory" "store")
1815 : 259 : (set_attr "mode" "<sseinsnmode>")])
1816 : :
1817 : : (define_insn "*<avx512>_store<mode>_mask"
1818 : : [(set (match_operand:VI12HFBF_AVX512VL 0 "memory_operand" "=m")
1819 : 0 : (vec_merge:VI12HFBF_AVX512VL
1820 : 0 : (match_operand:VI12HFBF_AVX512VL 1 "register_operand" "v")
1821 : 0 : (match_dup 0)
1822 : 0 : (match_operand:<avx512fmaskmode> 2 "register_operand" "Yk")))]
1823 : 36 : "TARGET_AVX512BW"
1824 : : "vmovdqu<ssescalarsize>\t{%1, %0%{%2%}|%0%{%2%}, %1}"
1825 : : [(set_attr "type" "ssemov")
1826 : : (set_attr "prefix" "evex")
1827 : : (set_attr "memory" "store")
1828 : : (set_attr "mode" "<sseinsnmode>")])
1829 : :
1830 : : (define_expand "sse2_movq128"
1831 : : [(set (match_operand:V2DI 0 "register_operand")
1832 : 0 : (vec_concat:V2DI
1833 : 0 : (vec_select:DI
1834 : 7 : (match_operand:V2DI 1 "nonimmediate_operand")
1835 : : (parallel [(const_int 0)]))
1836 : : (const_int 0)))]
1837 : : "TARGET_SSE2")
1838 : 0 :
1839 : : (define_insn "*sse2_movq128_<mode>"
1840 : : [(set (match_operand:VI8F_128 0 "register_operand" "=v")
1841 : : (vec_concat:VI8F_128
1842 : 0 : (vec_select:<ssescalarmode>
1843 : : (match_operand:VI8F_128 1 "nonimmediate_operand" "vm")
1844 : : (parallel [(const_int 0)]))
1845 : : (match_operand:<ssescalarmode> 2 "const0_operand")))]
1846 : 278 : "TARGET_SSE2"
1847 : : "%vmovq\t{%1, %0|%0, %q1}"
1848 : : [(set_attr "type" "ssemov")
1849 : : (set_attr "prefix" "maybe_vex")
1850 : 288 : (set_attr "mode" "TI")])
1851 : 43813 :
1852 : 43813 : (define_insn "*sse2_movq128_<mode>_1"
1853 : 43525 : [(set (match_operand:VI8F_128 0 "register_operand" "=v")
1854 : 47495 : (vec_merge:VI8F_128
1855 : 3970 : (match_operand:VI8F_128 1 "nonimmediate_operand" "vm")
1856 : 3970 : (match_operand:VI8F_128 2 "const0_operand")
1857 : 3970 : (const_int 1)))]
1858 : 2141 : "TARGET_SSE2"
1859 : 3970 : "%vmovq\t{%1, %0|%0, %q1}"
1860 : : [(set_attr "type" "ssemov")
1861 : 10118 : (set_attr "prefix" "maybe_vex")
1862 : 10118 : (set_attr "mode" "TI")])
1863 : :
1864 : 10100 : ;; Move a DI from a 32-bit register pair (e.g. %edx:%eax) to an xmm.
1865 : 10100 : ;; We'd rather avoid this entirely; if the 32-bit reg pair was loaded
1866 : 10100 : ;; from memory, we'd prefer to load the memory directly into the %xmm
1867 : : ;; register. To facilitate this happy circumstance, this pattern won't
1868 : : ;; split until after register allocation. If the 64-bit value didn't
1869 : : ;; come from memory, this is the best we can do. This is much better
1870 : : ;; than storing %edx:%eax into a stack temporary and loading an %xmm
1871 : : ;; from there.
1872 : :
1873 : : (define_insn_and_split "movdi_to_sse"
1874 : : [(set (match_operand:V4SI 0 "register_operand" "=x,x,?x")
1875 : : (unspec:V4SI [(match_operand:DI 1 "nonimmediate_operand" "r,m,r")]
1876 : : UNSPEC_MOVDI_TO_SSE))
1877 : : (clobber (match_scratch:V4SI 2 "=X,X,&x"))]
1878 : 0 : "!TARGET_64BIT && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_TO_VEC"
1879 : : "#"
1880 : 0 : "&& reload_completed"
1881 : 0 : [(const_int 0)]
1882 : 0 : {
1883 : 2752 : if (register_operand (operands[1], DImode))
1884 : 2578 : {
1885 : 0 : /* The DImode arrived in a pair of integral registers (e.g. %edx:%eax).
1886 : 174 : Assemble the 64-bit DImode value in an xmm register. */
1887 : 2578 : emit_insn (gen_sse2_loadld (operands[0], CONST0_RTX (V4SImode),
1888 : 36183 : gen_lowpart (SImode, operands[1])));
1889 : 60 : if (TARGET_SSE4_1)
1890 : 114 : emit_insn (gen_sse4_1_pinsrd (operands[0], operands[0],
1891 : 114 : gen_highpart (SImode, operands[1]),
1892 : 36550 : GEN_INT (2)));
1893 : 287 : else
1894 : : {
1895 : 287 : emit_insn (gen_sse2_loadld (operands[2], CONST0_RTX (V4SImode),
1896 : 287 : gen_highpart (SImode, operands[1])));
1897 : 0 : emit_insn (gen_vec_interleave_lowv4si (operands[0], operands[0],
1898 : 277 : operands[2]));
1899 : 277 : }
1900 : 277 : }
1901 : 0 : else if (memory_operand (operands[1], DImode))
1902 : 277 : emit_insn (gen_vec_concatv2di (gen_lowpart (V2DImode, operands[0]),
1903 : 277 : operands[1], const0_rtx));
1904 : 277 : else
1905 : 0 : gcc_unreachable ();
1906 : 194 : DONE;
1907 : 194 : }
1908 : 194 : [(set_attr "isa" "sse4,*,*")])
1909 : 194 :
1910 : : (define_split
1911 : : [(set (match_operand:V4SF 0 "register_operand")
1912 : : (match_operand:V4SF 1 "zero_extended_scalar_load_operand"))]
1913 : 18094 : "TARGET_SSE && reload_completed"
1914 : : [(set (match_dup 0)
1915 : 8330 : (vec_merge:V4SF
1916 : : (vec_duplicate:V4SF (match_dup 1))
1917 : 46618 : (match_dup 2)
1918 : 46618 : (const_int 1)))]
1919 : 46993 : {
1920 : 54948 : operands[1] = gen_lowpart (SFmode, operands[1]);
1921 : 8330 : operands[2] = CONST0_RTX (V4SFmode);
1922 : 0 : })
1923 : 0 :
1924 : 0 : (define_split
1925 : 8330 : [(set (match_operand:V2DF 0 "register_operand")
1926 : 8330 : (match_operand:V2DF 1 "zero_extended_scalar_load_operand"))]
1927 : 34871 : "TARGET_SSE2 && reload_completed"
1928 : 8330 : [(set (match_dup 0) (vec_concat:V2DF (match_dup 1) (match_dup 2)))]
1929 : 33460 : {
1930 : 20895 : operands[1] = gen_lowpart (DFmode, operands[1]);
1931 : 20895 : operands[2] = CONST0_RTX (DFmode);
1932 : : })
1933 : :
1934 : : (define_expand "movmisalign<mode>"
1935 : 12565 : [(set (match_operand:VMOVE 0 "nonimmediate_operand")
1936 : 12565 : (match_operand:VMOVE 1 "nonimmediate_operand"))]
1937 : 323706 : "TARGET_SSE"
1938 : 124350 : {
1939 : 553089 : ix86_expand_vector_move_misalign (<MODE>mode, operands);
1940 : 616361 : DONE;
1941 : 315376 : })
1942 : 302811 :
1943 : 302811 : ;; Merge movsd/movhpd to movupd for TARGET_SSE_UNALIGNED_LOAD_OPTIMAL targets.
1944 : 512321 : (define_peephole2
1945 : 12565 : [(set (match_operand:V2DF 0 "sse_reg_operand")
1946 : 12571 : (vec_concat:V2DF (match_operand:DF 1 "memory_operand")
1947 : 222081 : (match_operand:DF 4 "const0_operand")))
1948 : 209516 : (set (match_operand:V2DF 2 "sse_reg_operand")
1949 : 209516 : (vec_concat:V2DF (vec_select:DF (match_dup 2)
1950 : 209510 : (parallel [(const_int 0)]))
1951 : 209511 : (match_operand:DF 3 "memory_operand")))]
1952 : 209982 : "TARGET_SSE2 && TARGET_SSE_UNALIGNED_LOAD_OPTIMAL
1953 : 1 : && ix86_operands_ok_for_move_multiple (operands, true, DFmode)"
1954 : 0 : [(set (match_dup 2) (match_dup 5))]
1955 : 471 : "operands[5] = adjust_address (operands[1], V2DFmode, 0);")
1956 : 471 :
1957 : 471 : (define_peephole2
1958 : 85296 : [(set (match_operand:DF 0 "sse_reg_operand")
1959 : 627 : (match_operand:DF 1 "memory_operand"))
1960 : 471 : (set (match_operand:V2DF 2 "sse_reg_operand")
1961 : 84981 : (vec_concat:V2DF (match_operand:DF 4 "sse_reg_operand")
1962 : 84764 : (match_operand:DF 3 "memory_operand")))]
1963 : 86965 : "TARGET_SSE2 && TARGET_SSE_UNALIGNED_LOAD_OPTIMAL
1964 : 86965 : && REGNO (operands[4]) == REGNO (operands[2])
1965 : 86441 : && ix86_operands_ok_for_move_multiple (operands, true, DFmode)"
1966 : 86753 : [(set (match_dup 2) (match_dup 5))]
1967 : 310 : "operands[5] = adjust_address (operands[1], V2DFmode, 0);")
1968 : 308 :
1969 : 88496 : ;; Merge movlpd/movhpd to movupd for TARGET_SSE_UNALIGNED_STORE_OPTIMAL targets.
1970 : 88692 : (define_peephole2
1971 : 88648 : [(set (match_operand:DF 0 "memory_operand")
1972 : 89943 : (vec_select:DF (match_operand:V2DF 1 "sse_reg_operand")
1973 : 88692 : (parallel [(const_int 0)])))
1974 : 88648 : (set (match_operand:DF 2 "memory_operand")
1975 : 88648 : (vec_select:DF (match_operand:V2DF 3 "sse_reg_operand")
1976 : 1449 : (parallel [(const_int 1)])))]
1977 : 457 : "TARGET_SSE2 && TARGET_SSE_UNALIGNED_STORE_OPTIMAL
1978 : 456 : && ix86_operands_ok_for_move_multiple (operands, false, DFmode)"
1979 : 455 : [(set (match_dup 4) (match_dup 1))]
1980 : 7734 : "operands[4] = adjust_address (operands[0], V2DFmode, 0);")
1981 : 156 :
1982 : 9027 : (define_insn "<sse3>_lddqu<avxsizesuffix>"
1983 : 8875 : [(set (match_operand:VI1 0 "register_operand" "=x,x")
1984 : 156 : (unspec:VI1 [(match_operand:VI1 1 "memory_operand" "m,jm")]
1985 : 9029 : UNSPEC_LDDQU))]
1986 : 255 : "TARGET_SSE3"
1987 : 1312 : "%vlddqu\t{%1, %0|%0, %1}"
1988 : 2 : [(set_attr "isa" "noavx,avx")
1989 : 2 : (set_attr "type" "ssemov")
1990 : 1297 : (set_attr "addr" "*,gpr16")
1991 : 1297 : (set_attr "movu" "1")
1992 : 1297 : (set (attr "prefix_data16")
1993 : 1297 : (if_then_else
1994 : 5963147 : (match_test "TARGET_AVX")
1995 : 5963045 : (const_string "*")
1996 : 8563623 : (const_string "0")))
1997 : 1051 : (set (attr "prefix_rep")
1998 : 945 : (if_then_else
1999 : 1295 : (match_test "TARGET_AVX")
2000 : 392 : (const_string "*")
2001 : 412 : (const_string "1")))
2002 : 1295 : (set_attr "prefix" "maybe_vex")
2003 : 1315 : (set_attr "mode" "<sseinsnmode>")])
2004 : 1372 :
2005 : 1315 : (define_insn "sse2_movnti<mode>"
2006 : 20 : [(set (match_operand:SWI48 0 "memory_operand" "=m")
2007 : 1315 : (unspec:SWI48 [(match_operand:SWI48 1 "register_operand" "r")]
2008 : 1295 : UNSPEC_MOVNT))]
2009 : 311 : "TARGET_SSE2"
2010 : 1315 : "movnti\t{%1, %0|%0, %1}"
2011 : 1315 : [(set_attr "type" "ssemov")
2012 : 1315 : (set_attr "prefix_data16" "0")
2013 : 2612 : (set_attr "mode" "<MODE>")])
2014 : 66 :
2015 : 1317 : (define_insn "<sse>_movnt<mode>"
2016 : 1317 : [(set (match_operand:VF 0 "memory_operand" "=m")
2017 : 1297 : (unspec:VF
2018 : 1297 : [(match_operand:VF 1 "register_operand" "v")]
2019 : 1297 : UNSPEC_MOVNT))]
2020 : 58 : "TARGET_SSE"
2021 : 14 : "%vmovnt<ssemodesuffix>\t{%1, %0|%0, %1}"
2022 : 1297 : [(set_attr "type" "ssemov")
2023 : 1297 : (set_attr "prefix" "maybe_vex")
2024 : 1297 : (set_attr "mode" "<MODE>")])
2025 : 328 :
2026 : 1137 : (define_insn "<sse2>_movnt<mode>"
2027 : 1139 : [(set (match_operand:VI8 0 "memory_operand" "=m")
2028 : 161 : (unspec:VI8 [(match_operand:VI8 1 "register_operand" "v")]
2029 : 50 : UNSPEC_MOVNT))]
2030 : 122 : "TARGET_SSE2"
2031 : 14 : "%vmovntdq\t{%1, %0|%0, %1}"
2032 : 48 : [(set_attr "type" "ssecvt")
2033 : 2 : (set (attr "prefix_data16")
2034 : 52 : (if_then_else
2035 : 50 : (match_test "TARGET_AVX")
2036 : 59 : (const_string "*")
2037 : 519 : (const_string "1")))
2038 : 13 : (set_attr "prefix" "maybe_vex")
2039 : 387 : (set_attr "mode" "<sseinsnmode>")])
2040 : 1498 :
2041 : 381 : ; Expand patterns for non-temporal stores. At the moment, only those
2042 : 449 : ; that directly map to insns are defined; it would be possible to
2043 : 442 : ; define patterns for other modes that would expand to several insns.
2044 : 1120 :
2045 : 1494 : ;; Modes handled by storent patterns.
2046 : 1528 : (define_mode_iterator STORENT_MODE
2047 : 1428 : [(DI "TARGET_SSE2 && TARGET_64BIT") (SI "TARGET_SSE2")
2048 : 1528 : (SF "TARGET_SSE4A") (DF "TARGET_SSE4A")
2049 : 1528 : (V8DI "TARGET_AVX512F && TARGET_EVEX512")
2050 : 1528 : (V4DI "TARGET_AVX") (V2DI "TARGET_SSE2")
2051 : 483 : (V16SF "TARGET_AVX512F && TARGET_EVEX512") (V8SF "TARGET_AVX") V4SF
2052 : 499 : (V8DF "TARGET_AVX512F && TARGET_EVEX512")
2053 : 157 : (V4DF "TARGET_AVX") (V2DF "TARGET_SSE2")])
2054 : 154 :
2055 : 154 : (define_expand "storent<mode>"
2056 : 144 : [(set (match_operand:STORENT_MODE 0 "memory_operand")
2057 : 34 : (unspec:STORENT_MODE
2058 : 35 : [(match_operand:STORENT_MODE 1 "register_operand")]
2059 : 2 : UNSPEC_MOVNT))]
2060 : 3 : "TARGET_SSE")
2061 : 10 :
2062 : 382 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2063 : 382 : ;;
2064 : 374 : ;; Mask operations
2065 : 67 : ;;
2066 : 67 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2067 : 101 :
2068 : 35 : ;; All integer modes with AVX512BW/DQ.
2069 : 35 : (define_mode_iterator SWI1248_AVX512BWDQ
2070 : 4 : [(QI "TARGET_AVX512DQ") HI (SI "TARGET_AVX512BW") (DI "TARGET_AVX512BW")])
2071 : 0 :
2072 : 3 : ;; All integer modes with AVX512BW, where HImode operation
2073 : 3 : ;; can be used instead of QImode.
2074 : 23505 : (define_mode_iterator SWI1248_AVX512BW
2075 : 20447 : [QI HI (SI "TARGET_AVX512BW") (DI "TARGET_AVX512BW")])
2076 : 121731 :
2077 : 127763 : ;; All integer modes with AVX512BW/DQ, even HImode requires DQ.
2078 : 3 : (define_mode_iterator SWI1248_AVX512BWDQ2
2079 : 4859807 : [(QI "TARGET_AVX512DQ") (HI "TARGET_AVX512DQ")
2080 : 4502998 : (SI "TARGET_AVX512BW") (DI "TARGET_AVX512BW")])
2081 : 1268073 :
2082 : 5387 : (define_expand "kmov<mskmodesuffix>"
2083 : 4774789 : [(set (match_operand:SWI1248_AVX512BWDQ 0 "nonimmediate_operand")
2084 : 4600652 : (match_operand:SWI1248_AVX512BWDQ 1 "nonimmediate_operand"))]
2085 : 3426248 : "TARGET_AVX512F
2086 : 6023561 : && !(MEM_P (operands[0]) && MEM_P (operands[1]))")
2087 : 2421956 :
2088 : 5974576 : (define_insn "k<code><mode>"
2089 : 6672775 : [(set (match_operand:SWI1248_AVX512BW 0 "register_operand" "=k")
2090 : 9332074 : (any_logic:SWI1248_AVX512BW
2091 : 5804 : (match_operand:SWI1248_AVX512BW 1 "register_operand" "k")
2092 : 6056 : (match_operand:SWI1248_AVX512BW 2 "register_operand" "k")))
2093 : 264 : (unspec [(const_int 0)] UNSPEC_MASKOP)]
2094 : 3865 : "TARGET_AVX512F"
2095 : 1048 : {
2096 : 6931985 : if (get_attr_mode (insn) == MODE_HI)
2097 : 350 : return "k<logic>w\t{%2, %1, %0|%0, %1, %2}";
2098 : 591 : else
2099 : 546107 : return "k<logic><mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}";
2100 : 24 : }
2101 : 68 : [(set_attr "type" "msklog")
2102 : 5023272 : (set_attr "prefix" "vex")
2103 : 526 : (set (attr "mode")
2104 : 385826 : (cond [(and (match_test "<MODE>mode == QImode")
2105 : 4892395 : (not (match_test "TARGET_AVX512DQ")))
2106 : 26743 : (const_string "HI")
2107 : 26670 : ]
2108 : 1477659 : (const_string "<MODE>")))])
2109 : 1450804 :
2110 : 3240000 : (define_split
2111 : 676428 : [(set (match_operand:SWI1248_AVX512BW 0 "mask_reg_operand")
2112 : 1443718 : (any_logic:SWI1248_AVX512BW
2113 : 3098443 : (match_operand:SWI1248_AVX512BW 1 "mask_reg_operand")
2114 : 5 : (match_operand:SWI1248_AVX512BW 2 "mask_reg_operand")))]
2115 : 7 : "TARGET_AVX512F && reload_completed"
2116 : 161469 : [(parallel
2117 : 161464 : [(set (match_dup 0)
2118 : 322925 : (any_logic:SWI1248_AVX512BW (match_dup 1) (match_dup 2)))
2119 : 86 : (unspec [(const_int 0)] UNSPEC_MASKOP)])])
2120 : 161390 :
2121 : 7 : (define_split
2122 : 27 : [(set (match_operand:SWI1248_AVX512BW 0 "mask_reg_operand")
2123 : 27 : (any_logic:SWI1248_AVX512BW
2124 : 29 : (match_operand:SWI1248_AVX512BW 1 "mask_reg_operand")
2125 : 16 : (match_operand:SWI1248_AVX512BW 2 "mask_reg_operand")))
2126 : 16 : (clobber (reg:CC FLAGS_REG))]
2127 : 78 : "TARGET_AVX512F && reload_completed"
2128 : 13 : [(parallel
2129 : 574 : [(set (match_dup 0)
2130 : 7 : (any_logic:SWI1248_AVX512BW (match_dup 1) (match_dup 2)))
2131 : 641 : (unspec [(const_int 0)] UNSPEC_MASKOP)])])
2132 : 520 :
2133 : 8 : (define_insn "kandn<mode>"
2134 : 234 : [(set (match_operand:SWI1248_AVX512BW 0 "register_operand" "=k")
2135 : 8 : (and:SWI1248_AVX512BW
2136 : 2 : (not:SWI1248_AVX512BW
2137 : 1 : (match_operand:SWI1248_AVX512BW 1 "register_operand" "k"))
2138 : 8 : (match_operand:SWI1248_AVX512BW 2 "register_operand" "k")))
2139 : 9 : (unspec [(const_int 0)] UNSPEC_MASKOP)]
2140 : 91 : "TARGET_AVX512F"
2141 : 71 : {
2142 : 45 : if (get_attr_mode (insn) == MODE_HI)
2143 : 6 : return "kandnw\t{%2, %1, %0|%0, %1, %2}";
2144 : 217 : else
2145 : 250 : return "kandn<mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}";
2146 : 265 : }
2147 : 17 : [(set_attr "type" "msklog")
2148 : 44 : (set_attr "prefix" "vex")
2149 : 51 : (set (attr "mode")
2150 : 61 : (cond [(and (match_test "<MODE>mode == QImode")
2151 : 44 : (not (match_test "TARGET_AVX512DQ")))
2152 : 2 : (const_string "HI")
2153 : 28 : ]
2154 : 1 : (const_string "<MODE>")))])
2155 : 28 :
2156 : 27 : (define_split
2157 : 0 : [(set (match_operand:SWI1248_AVX512BW 0 "mask_reg_operand")
2158 : 27 : (and:SWI1248_AVX512BW
2159 : : (not:SWI1248_AVX512BW
2160 : : (match_operand:SWI1248_AVX512BW 1 "mask_reg_operand"))
2161 : 1 : (match_operand:SWI1248_AVX512BW 2 "mask_reg_operand")))
2162 : 3 : (clobber (reg:CC FLAGS_REG))]
2163 : 3 : "TARGET_AVX512F && reload_completed"
2164 : 2 : [(parallel
2165 : 1 : [(set (match_dup 0)
2166 : 1 : (and:SWI1248_AVX512BW
2167 : 2439 : (not:SWI1248_AVX512BW (match_dup 1))
2168 : 2544 : (match_dup 2)))
2169 : 2438 : (unspec [(const_int 0)] UNSPEC_MASKOP)])])
2170 : 4 :
2171 : 106 : (define_insn "kxnor<mode>"
2172 : 4 : [(set (match_operand:SWI1248_AVX512BW 0 "register_operand" "=k")
2173 : 8 : (not:SWI1248_AVX512BW
2174 : 0 : (xor:SWI1248_AVX512BW
2175 : 8 : (match_operand:SWI1248_AVX512BW 1 "register_operand" "k")
2176 : 4 : (match_operand:SWI1248_AVX512BW 2 "register_operand" "k"))))
2177 : 0 : (unspec [(const_int 0)] UNSPEC_MASKOP)]
2178 : 70 : "TARGET_AVX512F"
2179 : 59 : {
2180 : 36 : if (get_attr_mode (insn) == MODE_HI)
2181 : 0 : return "kxnorw\t{%2, %1, %0|%0, %1, %2}";
2182 : 197 : else
2183 : 232 : return "kxnor<mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}";
2184 : 197 : }
2185 : 0 : [(set_attr "type" "msklog")
2186 : 0 : (set_attr "prefix" "vex")
2187 : 0 : (set (attr "mode")
2188 : 92 : (cond [(and (match_test "<MODE>mode == QImode")
2189 : 0 : (not (match_test "TARGET_AVX512DQ")))
2190 : 0 : (const_string "HI")
2191 : 0 : ]
2192 : 0 : (const_string "<MODE>")))])
2193 : 0 :
2194 : 0 : (define_insn "knot<mode>"
2195 : : [(set (match_operand:SWI1248_AVX512BW 0 "register_operand" "=k")
2196 : : (not:SWI1248_AVX512BW
2197 : : (match_operand:SWI1248_AVX512BW 1 "register_operand" "k")))
2198 : : (unspec [(const_int 0)] UNSPEC_MASKOP)]
2199 : 86 : "TARGET_AVX512F"
2200 : 90 : {
2201 : 67 : if (get_attr_mode (insn) == MODE_HI)
2202 : : return "knotw\t{%1, %0|%0, %1}";
2203 : 158 : else
2204 : 203 : return "knot<mskmodesuffix>\t{%1, %0|%0, %1}";
2205 : : }
2206 : : [(set_attr "type" "msklog")
2207 : : (set_attr "prefix" "vex")
2208 : : (set (attr "mode")
2209 : 45 : (cond [(and (match_test "<MODE>mode == QImode")
2210 : : (not (match_test "TARGET_AVX512DQ")))
2211 : : (const_string "HI")
2212 : : ]
2213 : : (const_string "<MODE>")))])
2214 : :
2215 : : (define_split
2216 : : [(set (match_operand:SWI1248_AVX512BW 0 "mask_reg_operand")
2217 : : (not:SWI1248_AVX512BW
2218 : : (match_operand:SWI1248_AVX512BW 1 "mask_reg_operand")))]
2219 : 35 : "TARGET_AVX512F && reload_completed"
2220 : 35 : [(parallel
2221 : 213773 : [(set (match_dup 0)
2222 : 1 : (not:SWI1248_AVX512BW (match_dup 1)))
2223 : 1 : (unspec [(const_int 0)] UNSPEC_MASKOP)])])
2224 : 213774 :
2225 : : (define_insn "*knotsi_1_zext"
2226 : : [(set (match_operand:DI 0 "register_operand" "=k")
2227 : : (zero_extend:DI
2228 : : (not:SI (match_operand:SI 1 "register_operand" "k"))))
2229 : : (unspec [(const_int 0)] UNSPEC_MASKOP)]
2230 : 0 : "TARGET_AVX512BW"
2231 : : "knotd\t{%1, %0|%0, %1}";
2232 : : [(set_attr "type" "msklog")
2233 : : (set_attr "prefix" "vex")
2234 : 579 : (set_attr "mode" "SI")])
2235 : 579 :
2236 : : (define_split
2237 : : [(set (match_operand:DI 0 "mask_reg_operand")
2238 : : (zero_extend:DI
2239 : : (not:SI (match_operand:SI 1 "mask_reg_operand"))))]
2240 : 0 : "TARGET_AVX512BW && reload_completed"
2241 : 290 : [(parallel
2242 : 0 : [(set (match_dup 0)
2243 : 40 : (zero_extend:DI
2244 : 34 : (not:SI (match_dup 1))))
2245 : 34 : (unspec [(const_int 0)] UNSPEC_MASKOP)])])
2246 : 34 :
2247 : 40 : (define_insn "kadd<mode>"
2248 : 52 : [(set (match_operand:SWI1248_AVX512BWDQ2 0 "register_operand" "=k")
2249 : 52 : (plus:SWI1248_AVX512BWDQ2
2250 : 41 : (match_operand:SWI1248_AVX512BWDQ2 1 "register_operand" "k")
2251 : 1 : (match_operand:SWI1248_AVX512BWDQ2 2 "register_operand" "k")))
2252 : 1 : (unspec [(const_int 0)] UNSPEC_MASKOP)]
2253 : 257 : "TARGET_AVX512F"
2254 : 41 : "kadd<mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
2255 : 13 : [(set_attr "type" "msklog")
2256 : 11 : (set_attr "prefix" "vex")
2257 : 0 : (set_attr "mode" "<MODE>")])
2258 : 1 :
2259 : 1 : ;; Mask variant shift mnemonics
2260 : 1 : (define_code_attr mshift [(ashift "shiftl") (lshiftrt "shiftr")])
2261 : 0 :
2262 : : (define_insn "k<code><mode>"
2263 : 0 : [(set (match_operand:SWI1248_AVX512BWDQ 0 "register_operand" "=k")
2264 : 0 : (any_lshift:SWI1248_AVX512BWDQ
2265 : 0 : (match_operand:SWI1248_AVX512BWDQ 1 "register_operand" "k")
2266 : 0 : (match_operand 2 "const_0_to_255_operand")))
2267 : 0 : (unspec [(const_int 0)] UNSPEC_MASKOP)]
2268 : 3872 : "TARGET_AVX512F"
2269 : 0 : "k<mshift><mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
2270 : 0 : [(set_attr "type" "msklog")
2271 : 0 : (set_attr "prefix" "vex")
2272 : 0 : (set_attr "mode" "<MODE>")])
2273 : 1187 :
2274 : : (define_split
2275 : : [(set (match_operand:SWI1248_AVX512BW 0 "mask_reg_operand")
2276 : : (any_lshift:SWI1248_AVX512BW
2277 : : (match_operand:SWI1248_AVX512BW 1 "mask_reg_operand")
2278 : : (match_operand 2 "const_int_operand")))]
2279 : 0 : "TARGET_AVX512F && reload_completed"
2280 : 0 : [(parallel
2281 : : [(set (match_dup 0)
2282 : : (any_lshift:SWI1248_AVX512BW
2283 : 0 : (match_dup 1)
2284 : 0 : (match_dup 2)))
2285 : : (unspec [(const_int 0)] UNSPEC_MASKOP)])])
2286 : :
2287 : : (define_split
2288 : : [(set (match_operand:SWI1248_AVX512BW 0 "mask_reg_operand")
2289 : : (any_lshift:SWI1248_AVX512BW
2290 : : (match_operand:SWI1248_AVX512BW 1 "mask_reg_operand")
2291 : : (match_operand 2 "const_int_operand")))
2292 : : (clobber (reg:CC FLAGS_REG))]
2293 : 26 : "TARGET_AVX512F && reload_completed"
2294 : : [(parallel
2295 : 23 : [(set (match_dup 0)
2296 : : (any_lshift:SWI1248_AVX512BW
2297 : 617092 : (match_dup 1)
2298 : 617092 : (match_dup 2)))
2299 : 617094 : (unspec [(const_int 0)] UNSPEC_MASKOP)])])
2300 : :
2301 : : (define_insn "*klshrsi3_1_zext"
2302 : : [(set (match_operand:DI 0 "register_operand" "=k")
2303 : : (zero_extend:DI
2304 : : (lshiftrt:SI (match_operand:SI 1 "register_operand" "k")
2305 : : (match_operand 2 "const_0_to_31_operand" "I"))))
2306 : : (unspec [(const_int 0)] UNSPEC_MASKOP)]
2307 : 1 : "TARGET_AVX512BW"
2308 : 5 : "kshiftrd\t{%2, %1, %0|%0, %1, %2}"
2309 : : [(set_attr "type" "msklog")
2310 : : (set_attr "prefix" "vex")
2311 : : (set_attr "mode" "SI")])
2312 : :
2313 : : (define_split
2314 : : [(set (match_operand:DI 0 "mask_reg_operand")
2315 : 5 : (zero_extend:DI
2316 : 5 : (lshiftrt:SI
2317 : : (match_operand:SI 1 "mask_reg_operand")
2318 : 0 : (match_operand 2 "const_0_to_31_operand"))))
2319 : 0 : (clobber (reg:CC FLAGS_REG))]
2320 : 1 : "TARGET_AVX512BW && reload_completed"
2321 : : [(parallel
2322 : 1 : [(set (match_dup 0)
2323 : : (zero_extend:DI
2324 : 202 : (lshiftrt:SI
2325 : 202 : (match_dup 1)
2326 : : (match_dup 2))))
2327 : 151 : (unspec [(const_int 0)] UNSPEC_MASKOP)])])
2328 : :
2329 : 0 : (define_insn "ktest<mode>"
2330 : 0 : [(set (reg:CC FLAGS_REG)
2331 : : (unspec:CC
2332 : : [(match_operand:SWI1248_AVX512BWDQ2 0 "register_operand" "k")
2333 : : (match_operand:SWI1248_AVX512BWDQ2 1 "register_operand" "k")]
2334 : : UNSPEC_KTEST))]
2335 : : "TARGET_AVX512F"
2336 : : "ktest<mskmodesuffix>\t{%1, %0|%0, %1}"
2337 : : [(set_attr "mode" "<MODE>")
2338 : : (set_attr "type" "msklog")
2339 : : (set_attr "prefix" "vex")])
2340 : :
2341 : : (define_insn "*kortest<mode>"
2342 : : [(set (reg FLAGS_REG)
2343 : : (unspec
2344 : : [(match_operand:SWI1248_AVX512BWDQ 0 "register_operand" "k")
2345 : : (match_operand:SWI1248_AVX512BWDQ 1 "register_operand" "k")]
2346 : : UNSPEC_KORTEST))]
2347 : 15498 : "TARGET_AVX512F"
2348 : : "kortest<mskmodesuffix>\t{%1, %0|%0, %1}"
2349 : : [(set_attr "mode" "<MODE>")
2350 : : (set_attr "type" "msklog")
2351 : 699 : (set_attr "prefix" "vex")])
2352 : 699 :
2353 : 590 : (define_insn "kortest<mode>_ccc"
2354 : 1208 : [(set (reg:CCC FLAGS_REG)
2355 : : (unspec:CCC
2356 : : [(match_operand:SWI1248_AVX512BWDQ 0 "register_operand")
2357 : : (match_operand:SWI1248_AVX512BWDQ 1 "register_operand")]
2358 : : UNSPEC_KORTEST))]
2359 : 0 : "TARGET_AVX512F")
2360 : :
2361 : : (define_insn "kortest<mode>_ccz"
2362 : : [(set (reg:CCZ FLAGS_REG)
2363 : 0 : (unspec:CCZ
2364 : 0 : [(match_operand:SWI1248_AVX512BWDQ 0 "register_operand")
2365 : : (match_operand:SWI1248_AVX512BWDQ 1 "register_operand")]
2366 : : UNSPEC_KORTEST))]
2367 : 0 : "TARGET_AVX512F")
2368 : :
2369 : : (define_expand "kortest<mode>"
2370 : : [(set (reg:CC FLAGS_REG)
2371 : 0 : (unspec:CC
2372 : 0 : [(match_operand:SWI1248_AVX512BWDQ 0 "register_operand")
2373 : : (match_operand:SWI1248_AVX512BWDQ 1 "register_operand")]
2374 : : UNSPEC_KORTEST))]
2375 : : "TARGET_AVX512F")
2376 : :
2377 : : ;; Optimize cmp + setcc with mask register by kortest + setcc.
2378 : : (define_insn_and_split "*kortest_cmp<mode>_setcc"
2379 : : [(set (match_operand:QI 0 "nonimmediate_operand" "=qm, qm")
2380 : : (match_operator:QI 1 "bt_comparison_operator"
2381 : : [(match_operand:SWI1248_AVX512BWDQ_64 2 "register_operand" "?k, <r>")
2382 : : (const_int -1)]))
2383 : : (clobber (reg:CC FLAGS_REG))]
2384 : 153 : "TARGET_AVX512BW"
2385 : : "#"
2386 : 8 : "&& reload_completed"
2387 : 32 : [(const_int 0)]
2388 : 32 : {
2389 : 16 : if (MASK_REGNO_P (REGNO (operands[2])))
2390 : 18048 : {
2391 : 18080 : emit_insn (gen_kortest<mode>_ccc (operands[2], operands[2]));
2392 : 8 : operands[4] = gen_rtx_REG (CCCmode, FLAGS_REG);
2393 : : }
2394 : 692340 : else
2395 : 692340 : {
2396 : 692348 : operands[4] = gen_rtx_REG (CCZmode, FLAGS_REG);
2397 : 8 : emit_insn (gen_rtx_SET (operands[4],
2398 : 400874 : gen_rtx_COMPARE (CCZmode,
2399 : 400874 : operands[2],
2400 : : constm1_rtx)));
2401 : 7754 : }
2402 : 7770 : ix86_expand_setcc (operands[0],
2403 : 16 : GET_CODE (operands[1]),
2404 : 169 : operands[4],
2405 : : const0_rtx);
2406 : 24 : DONE;
2407 : 16 : })
2408 : :
2409 : : ;; Optimize cmp + jcc with mask register by kortest + jcc.
2410 : : (define_insn_and_split "*kortest_cmp<mode>_jcc"
2411 : : [(set (pc)
2412 : : (if_then_else
2413 : : (match_operator 0 "bt_comparison_operator"
2414 : : [(match_operand:SWI1248_AVX512BWDQ_64 1 "register_operand" "?k, <r>")
2415 : : (const_int -1)])
2416 : : (label_ref (match_operand 2))
2417 : : (pc)))
2418 : : (clobber (reg:CC FLAGS_REG))]
2419 : 3934 : "TARGET_AVX512BW"
2420 : : "#"
2421 : 14 : "&& reload_completed"
2422 : 69 : [(const_int 0)]
2423 : 146 : {
2424 : 88 : if (MASK_REGNO_P (REGNO (operands[1])))
2425 : 85491 : {
2426 : 85643 : emit_insn (gen_kortest<mode>_ccc (operands[1], operands[1]));
2427 : 26 : operands[4] = gen_rtx_REG (CCCmode, FLAGS_REG);
2428 : 6 : }
2429 : 0 : else
2430 : 6 : {
2431 : 50 : operands[4] = gen_rtx_REG (CCZmode, FLAGS_REG);
2432 : 50 : emit_insn (gen_rtx_SET (operands[4],
2433 : : gen_rtx_COMPARE (CCZmode,
2434 : : operands[1],
2435 : : constm1_rtx)));
2436 : : }
2437 : 70 : ix86_expand_branch (GET_CODE (operands[0]),
2438 : : operands[4],
2439 : : const0_rtx,
2440 : : operands[2]);
2441 : 70 : DONE;
2442 : : })
2443 : :
2444 : : ;; Optimize cmp + movcc with mask register by kortest + movcc.
2445 : : (define_insn_and_split "*kortest_cmp<SWI1248_AVX512BWDQ_64:mode>_movqicc"
2446 : : [(set (match_operand:QI 0 "register_operand" "=r,r,r,r,r,r")
2447 : : (if_then_else:QI
2448 : : (match_operator 1 "bt_comparison_operator"
2449 : : [(match_operand:SWI1248_AVX512BWDQ_64 4 "register_operand"
2450 : : "?k,<SWI1248_AVX512BWDQ_64:r>,?k, <SWI1248_AVX512BWDQ_64:r>,?k,r")
2451 : : (const_int -1)])
2452 : : (match_operand:QI 2 "register_operand" "r,r,0,0,r,r")
2453 : : (match_operand:QI 3 "register_operand" " 0,0,r,r,r,r")))
2454 : 4 : (clobber (reg:CC FLAGS_REG))]
2455 : 180 : "TARGET_AVX512BW && TARGET_CMOVE && !TARGET_PARTIAL_REG_STALL"
2456 : 4 : "#"
2457 : 4 : "&& reload_completed"
2458 : 4 : [(set (match_dup 0)
2459 : 6 : (if_then_else:SI
2460 : 4 : (match_dup 5)
2461 : 740 : (match_dup 2)
2462 : 12 : (match_dup 3)))]
2463 : 6 : {
2464 : 2 : rtx flag_reg;
2465 : 6 : if (MASK_REGNO_P (REGNO (operands[4])))
2466 : : {
2467 : 2 : emit_insn (gen_kortest<SWI1248_AVX512BWDQ_64:mode>_ccc (operands[4], operands[4]));
2468 : 2 : flag_reg = gen_rtx_REG (CCCmode, FLAGS_REG);
2469 : : }
2470 : : else
2471 : : {
2472 : 0 : flag_reg = gen_rtx_REG (CCZmode, FLAGS_REG);
2473 : 0 : emit_insn (gen_rtx_SET (flag_reg,
2474 : : gen_rtx_COMPARE (CCZmode,
2475 : : operands[4],
2476 : : constm1_rtx)));
2477 : : }
2478 : 2 : operands[5] = gen_rtx_fmt_ee (GET_CODE (operands[1]), VOIDmode,
2479 : : flag_reg,const0_rtx);
2480 : 2 : operands[0] = gen_lowpart (SImode, operands[0]);
2481 : 2 : operands[2] = gen_lowpart (SImode, operands[2]);
2482 : 2 : operands[3] = gen_lowpart (SImode, operands[3]);
2483 : : }
2484 : : [(set_attr "isa" "*,*,*,*,apx_ndd,apx_ndd")
2485 : : (set_attr "type" "icmov")
2486 : 2 : (set_attr "mode" "QI")])
2487 : 2 :
2488 : 2 : (define_insn_and_split "*kortest_cmp<SWI1248_AVX512BWDQ_64:mode>_mov<SWI248:mode>cc"
2489 : 2 : [(set (match_operand:SWI248 0 "register_operand" "=r,r,r,r,r,r,r,r")
2490 : 2 : (if_then_else:SWI248
2491 : 2 : (match_operator 1 "bt_comparison_operator"
2492 : 2 : [(match_operand:SWI1248_AVX512BWDQ_64 4 "register_operand"
2493 : 2 : "?k,<SWI1248_AVX512BWDQ_64:r>,?k, <SWI1248_AVX512BWDQ_64:r>,?k,r,?k, r")
2494 : 2 : (const_int -1)])
2495 : 2 : (match_operand:SWI248 2 "nonimmediate_operand" "rm,rm, 0, 0,rm,rm, r, r")
2496 : 2 : (match_operand:SWI248 3 "nonimmediate_operand" " 0, 0,rm,rm, r, r,rm,rm")))
2497 : 2 : (clobber (reg:CC FLAGS_REG))]
2498 : 3989 : "TARGET_AVX512BW && TARGET_CMOVE
2499 : 60 : && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
2500 : : "#"
2501 : 4 : "&& reload_completed"
2502 : 3 : [(set (match_dup 0)
2503 : 14 : (if_then_else:SWI248
2504 : 5 : (match_dup 5)
2505 : 543 : (match_dup 2)
2506 : 40 : (match_dup 3)))]
2507 : 12 : {
2508 : 12 : rtx flag_reg;
2509 : 39414 : if (MASK_REGNO_P (REGNO (operands[4])))
2510 : 39404 : {
2511 : 39414 : emit_insn (gen_kortest<SWI1248_AVX512BWDQ_64:mode>_ccc (operands[4], operands[4]));
2512 : 12 : flag_reg = gen_rtx_REG (CCCmode, FLAGS_REG);
2513 : 4 : }
2514 : 4 : else
2515 : 4 : {
2516 : 2 : flag_reg = gen_rtx_REG (CCZmode, FLAGS_REG);
2517 : 2 : emit_insn (gen_rtx_SET (flag_reg,
2518 : 4 : gen_rtx_COMPARE (CCZmode,
2519 : 2 : operands[4],
2520 : 2 : constm1_rtx)));
2521 : 0 : }
2522 : 14 : operands[5] = gen_rtx_fmt_ee (GET_CODE (operands[1]), VOIDmode,
2523 : : flag_reg,const0_rtx);
2524 : : }
2525 : : [(set_attr "isa" "*,*,*,*,apx_ndd,apx_ndd,apx_ndd,apx_ndd")
2526 : : (set_attr "type" "icmov")
2527 : 12 : (set_attr "mode" "<SWI248:MODE>")])
2528 : 12 :
2529 : 12 : (define_insn "kunpckhi"
2530 : 12 : [(set (match_operand:HI 0 "register_operand" "=k")
2531 : 12 : (ior:HI
2532 : 12 : (ashift:HI
2533 : 12 : (zero_extend:HI (match_operand:QI 1 "register_operand" "k"))
2534 : 12 : (const_int 8))
2535 : 12 : (zero_extend:HI (match_operand:QI 2 "register_operand" "k"))))
2536 : 12 : (unspec [(const_int 0)] UNSPEC_MASKOP)]
2537 : 862 : "TARGET_AVX512F"
2538 : 12 : "kunpckbw\t{%2, %1, %0|%0, %1, %2}"
2539 : 12 : [(set_attr "mode" "HI")
2540 : : (set_attr "type" "msklog")
2541 : 492 : (set_attr "prefix" "vex")])
2542 : 492 :
2543 : 492 : (define_insn "kunpcksi"
2544 : 12 : [(set (match_operand:SI 0 "register_operand" "=k")
2545 : 12 : (ior:SI
2546 : 12 : (ashift:SI
2547 : : (zero_extend:SI (match_operand:HI 1 "register_operand" "k"))
2548 : : (const_int 16))
2549 : : (zero_extend:SI (match_operand:HI 2 "register_operand" "k"))))
2550 : : (unspec [(const_int 0)] UNSPEC_MASKOP)]
2551 : 899 : "TARGET_AVX512BW"
2552 : 2 : "kunpckwd\t{%2, %1, %0|%0, %1, %2}"
2553 : : [(set_attr "mode" "SI")])
2554 : 431 :
2555 : 695 : (define_insn "kunpckdi"
2556 : 697 : [(set (match_operand:DI 0 "register_operand" "=k")
2557 : 697 : (ior:DI
2558 : 431 : (ashift:DI
2559 : 431 : (zero_extend:DI (match_operand:SI 1 "register_operand" "k"))
2560 : 2 : (const_int 32))
2561 : 2 : (zero_extend:DI (match_operand:SI 2 "register_operand" "k"))))
2562 : 0 : (unspec [(const_int 0)] UNSPEC_MASKOP)]
2563 : 268 : "TARGET_AVX512BW"
2564 : : "kunpckdq\t{%2, %1, %0|%0, %1, %2}"
2565 : : [(set_attr "mode" "DI")])
2566 : :
2567 : :
2568 : : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2569 : : ;;
2570 : : ;; Parallel floating point arithmetic
2571 : : ;;
2572 : : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2573 : :
2574 : : (define_expand "<code><mode>2"
2575 : 240901 : [(set (match_operand:VFB 0 "register_operand")
2576 : 240901 : (absneg:VFB
2577 : 240901 : (match_operand:VFB 1 "register_operand")))]
2578 : 240901 : "TARGET_SSE"
2579 : 243159 : "ix86_expand_fp_absneg_operator (<CODE>, <MODE>mode, operands); DONE;")
2580 : :
2581 : 229496 : (define_insn_and_split "*<code><mode>2"
2582 : : [(set (match_operand:VFB 0 "register_operand" "=x,x,v,v")
2583 : 4590 : (absneg:VFB
2584 : 4590 : (match_operand:VFB 1 "vector_operand" "0,xBm,v,m")))
2585 : 4590 : (use (match_operand:VFB 2 "vector_operand" "xBm,0,vm,v"))]
2586 : 3170 : "TARGET_SSE"
2587 : 4590 : "#"
2588 : 4 : "&& reload_completed"
2589 : 4590 : [(set (match_dup 0)
2590 : 1544 : (<absneg_op>:VFB (match_dup 1) (match_dup 2)))]
2591 : 1811 : {
2592 : 9219 : if (TARGET_AVX)
2593 : 3207 : {
2594 : 5860 : if (MEM_P (operands[1]))
2595 : 170 : std::swap (operands[1], operands[2]);
2596 : 759395 : }
2597 : 761222 : else
2598 : 755009 : {
2599 : 4678 : if (operands_match_p (operands[0], operands[2]))
2600 : 4467 : std::swap (operands[1], operands[2]);
2601 : 677244 : }
2602 : 677260 : }
2603 : 12073 : [(set_attr "isa" "noavx,noavx,avx,avx")])
2604 : 665205 :
2605 : 677222 : (define_insn_and_split "*nabs<mode>2"
2606 : 665205 : [(set (match_operand:VF 0 "register_operand" "=x,x,v,v")
2607 : 11752 : (neg:VF
2608 : 1622 : (abs:VF
2609 : 1622 : (match_operand:VF 1 "vector_operand" "0,xBm,v,m"))))
2610 : 11829 : (use (match_operand:VF 2 "vector_operand" "xBm,0,vm,v"))]
2611 : 1544 : "TARGET_SSE"
2612 : 10207 : "#"
2613 : 0 : "&& reload_completed"
2614 : 10207 : [(set (match_dup 0)
2615 : 25473 : (ior:VF (match_dup 1) (match_dup 2)))]
2616 : 1544 : {
2617 : 908 : if (TARGET_AVX)
2618 : 0 : {
2619 : 0 : if (MEM_P (operands[1]))
2620 : 0 : std::swap (operands[1], operands[2]);
2621 : : }
2622 : 6 : else
2623 : 1526 : {
2624 : 0 : if (operands_match_p (operands[0], operands[2]))
2625 : 904 : std::swap (operands[1], operands[2]);
2626 : 1526 : }
2627 : 44441 : }
2628 : 1532 : [(set_attr "isa" "noavx,noavx,avx,avx")])
2629 : 44447 :
2630 : 42915 : (define_expand "cond_<insn><mode>"
2631 : 44441 : [(set (match_operand:VFH 0 "register_operand")
2632 : 42921 : (vec_merge:VFH
2633 : 42921 : (plusminus:VFH
2634 : 42921 : (match_operand:VFH 2 "vector_operand")
2635 : 42921 : (match_operand:VFH 3 "vector_operand"))
2636 : 42921 : (match_operand:VFH 4 "nonimm_or_0_operand")
2637 : : (match_operand:<avx512fmaskmode> 1 "register_operand")))]
2638 : 162 : "<MODE_SIZE> == 64 || TARGET_AVX512VL"
2639 : 269 : {
2640 : 269 : emit_insn (gen_<insn><mode>3_mask (operands[0],
2641 : 162 : operands[2],
2642 : 0 : operands[3],
2643 : 10 : operands[4],
2644 : 10 : operands[1]));
2645 : 117 : DONE;
2646 : : })
2647 : 56 :
2648 : : (define_expand "<insn><mode>3<mask_name><round_name>"
2649 : 6 : [(set (match_operand:VF_BHSD 0 "register_operand")
2650 : 6 : (plusminus:VF_BHSD
2651 : 6 : (match_operand:VF_BHSD 1 "<round_nimm_predicate>")
2652 : 6 : (match_operand:VF_BHSD 2 "<round_nimm_predicate>")))]
2653 : 62 : "TARGET_SSE && <mask_mode512bit_condition> && <round_mode_condition>"
2654 : 19496 : "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
2655 : 46 :
2656 : 46 : (define_insn "*<insn><mode>3<mask_name><round_name>"
2657 : 42226 : [(set (match_operand:VFH 0 "register_operand" "=x,v")
2658 : 42226 : (plusminus:VFH
2659 : 42226 : (match_operand:VFH 1 "<bcst_round_nimm_predicate>" "<comm>0,v")
2660 : 42226 : (match_operand:VFH 2 "<bcst_round_nimm_predicate>" "xBm,<bcst_round_constraint>")))]
2661 : 539686 : "TARGET_SSE && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)
2662 : 325669 : && <mask_mode512bit_condition> && <round_mode_condition>"
2663 : 1922 : "@
2664 : 41374 : <plusminus_mnemonic><ssemodesuffix>\t{%2, %0|%0, %2}
2665 : 1194 : v<plusminus_mnemonic><ssemodesuffix>\t{<round_mask_op3>%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2<round_mask_op3>}"
2666 : 4796 : [(set_attr "isa" "noavx,avx")
2667 : 6514 : (set_attr "type" "sseadd")
2668 : 43019 : (set_attr "prefix" "<bcst_mask_prefix3>")
2669 : 40986 : (set_attr "mode" "<MODE>")])
2670 : 21650 :
2671 : : ;; Standard scalar operation patterns which preserve the rest of the
2672 : : ;; vector for combiner.
2673 : : (define_insn "*<sse>_vm<insn><mode>3"
2674 : 4177 : [(set (match_operand:VFH_128 0 "register_operand" "=x,v")
2675 : 16455 : (vec_merge:VFH_128
2676 : 455 : (vec_duplicate:VFH_128
2677 : 455 : (plusminus:<ssescalarmode>
2678 : 911 : (vec_select:<ssescalarmode>
2679 : 16479 : (match_operand:VFH_128 1 "register_operand" "0,v")
2680 : 15854 : (parallel [(const_int 0)]))
2681 : 3619 : (match_operand:<ssescalarmode> 2 "nonimmediate_operand" "xm,vm")))
2682 : 17537 : (match_dup 1)
2683 : 3670 : (const_int 1)))]
2684 : 15978 : "TARGET_SSE"
2685 : 17233 : "@
2686 : 20529 : <plusminus_mnemonic><ssescalarmodesuffix>\t{%2, %0|%0, %2}
2687 : 16629 : v<plusminus_mnemonic><ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
2688 : 5127 : [(set_attr "isa" "noavx,avx")
2689 : 1953 : (set_attr "type" "sseadd")
2690 : 20970 : (set (attr "prefix")
2691 : 20946 : (cond [(eq_attr "alternative" "0")
2692 : 21683 : (const_string "orig")
2693 : 5200 : (eq_attr "alternative" "1")
2694 : 5038 : (if_then_else
2695 : 4974 : (match_test "<MODE>mode == V8HFmode")
2696 : 5008 : (const_string "evex")
2697 : 5227 : (const_string "vex"))
2698 : 4891 : ]
2699 : 174 : (const_string "*")))
2700 : 174 : (set_attr "mode" "<ssescalarmode>")])
2701 : 174 :
2702 : 174 : (define_insn "<sse>_vm<insn><mode>3<mask_scalar_name><round_scalar_name>"
2703 : : [(set (match_operand:VFH_128 0 "register_operand" "=x,v")
2704 : : (vec_merge:VFH_128
2705 : : (plusminus:VFH_128
2706 : : (match_operand:VFH_128 1 "register_operand" "0,v")
2707 : : (match_operand:VFH_128 2 "nonimmediate_operand" "xm,<round_scalar_constraint>"))
2708 : : (match_dup 1)
2709 : : (const_int 1)))]
2710 : 1229 : "TARGET_SSE"
2711 : : "@
2712 : : <plusminus_mnemonic><ssescalarmodesuffix>\t{%2, %0|%0, %<iptr>2}
2713 : : v<plusminus_mnemonic><ssescalarmodesuffix>\t{<round_scalar_mask_op3>%2, %1, %0<mask_scalar_operand3>|%0<mask_scalar_operand3>, %1, %<iptr>2<round_scalar_mask_op3>}"
2714 : 3134 : [(set_attr "isa" "noavx,avx")
2715 : 3134 : (set_attr "type" "sseadd")
2716 : : (set_attr "prefix" "<round_scalar_prefix>")
2717 : : (set_attr "mode" "<ssescalarmode>")])
2718 : :
2719 : : (define_expand "cond_mul<mode>"
2720 : : [(set (match_operand:VFH 0 "register_operand")
2721 : : (vec_merge:VFH
2722 : : (mult:VFH
2723 : : (match_operand:VFH 2 "vector_operand")
2724 : : (match_operand:VFH 3 "vector_operand"))
2725 : : (match_operand:VFH 4 "nonimm_or_0_operand")
2726 : : (match_operand:<avx512fmaskmode> 1 "register_operand")))]
2727 : : "<MODE_SIZE> == 64 || TARGET_AVX512VL"
2728 : 36 : {
2729 : 36 : emit_insn (gen_mul<mode>3_mask (operands[0],
2730 : : operands[2],
2731 : : operands[3],
2732 : : operands[4],
2733 : : operands[1]));
2734 : 36 : DONE;
2735 : : })
2736 : :
2737 : : (define_expand "mul<mode>3<mask_name><round_name>"
2738 : : [(set (match_operand:VF_BHSD 0 "register_operand")
2739 : : (mult:VF_BHSD
2740 : : (match_operand:VF_BHSD 1 "<round_nimm_predicate>")
2741 : : (match_operand:VF_BHSD 2 "<round_nimm_predicate>")))]
2742 : : "TARGET_SSE && <mask_mode512bit_condition> && <round_mode_condition>"
2743 : 13528 : "ix86_fixup_binary_operands_no_copy (MULT, <MODE>mode, operands);")
2744 : :
2745 : : (define_insn "*mul<mode>3<mask_name><round_name>"
2746 : 13578 : [(set (match_operand:VFH 0 "register_operand" "=x,v")
2747 : 13578 : (mult:VFH
2748 : 13578 : (match_operand:VFH 1 "<bcst_round_nimm_predicate>" "%0,v")
2749 : 13578 : (match_operand:VFH 2 "<bcst_round_nimm_predicate>" "xBm,<bcst_round_constraint>")))]
2750 : 201627 : "TARGET_SSE && ix86_binary_operator_ok (MULT, <MODE>mode, operands)
2751 : 123682 : && <mask_mode512bit_condition> && <round_mode_condition>"
2752 : 12692 : "@
2753 : 13330 : mul<ssemodesuffix>\t{%2, %0|%0, %2}
2754 : 441 : vmul<ssemodesuffix>\t{<round_mask_op3>%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2<round_mask_op3>}"
2755 : 1040 : [(set_attr "isa" "noavx,avx")
2756 : 949 : (set_attr "type" "ssemul")
2757 : 15313 : (set_attr "prefix" "<bcst_mask_prefix3>")
2758 : 13137 : (set_attr "btver2_decode" "direct,double")
2759 : 5666 : (set_attr "mode" "<MODE>")])
2760 : :
2761 : : ;; Standard scalar operation patterns which preserve the rest of the
2762 : : ;; vector for combiner.
2763 : 2198 : (define_insn "*<sse>_vm<multdiv_mnemonic><mode>3"
2764 : 9858 : [(set (match_operand:VFH_128 0 "register_operand" "=x,v")
2765 : 208 : (vec_merge:VFH_128
2766 : 208 : (vec_duplicate:VFH_128
2767 : 687 : (multdiv:<ssescalarmode>
2768 : 4958 : (vec_select:<ssescalarmode>
2769 : 9424 : (match_operand:VFH_128 1 "register_operand" "0,v")
2770 : 308 : (parallel [(const_int 0)]))
2771 : 6542 : (match_operand:<ssescalarmode> 2 "nonimmediate_operand" "xm,vm")))
2772 : 9852 : (match_dup 1)
2773 : 4368 : (const_int 1)))]
2774 : 11135 : "TARGET_SSE"
2775 : 1905 : "@
2776 : 2633 : <multdiv_mnemonic><ssescalarmodesuffix>\t{%2, %0|%0, %2}
2777 : 3955 : v<multdiv_mnemonic><ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
2778 : 967 : [(set_attr "isa" "noavx,avx")
2779 : 2637 : (set_attr "type" "sse<multdiv_mnemonic>")
2780 : 2670 : (set (attr "prefix")
2781 : 2782 : (cond [(eq_attr "alternative" "0")
2782 : 2101 : (const_string "orig")
2783 : 2163 : (eq_attr "alternative" "1")
2784 : 2162 : (if_then_else
2785 : 2147 : (match_test "<MODE>mode == V8HFmode")
2786 : 2113 : (const_string "evex")
2787 : 2021 : (const_string "vex"))
2788 : 53 : ]
2789 : 25 : (const_string "*")))
2790 : 53 : (set_attr "btver2_decode" "direct,double")
2791 : 53 : (set_attr "mode" "<ssescalarmode>")])
2792 : 28 :
2793 : 28 : (define_insn "<sse>_vm<multdiv_mnemonic><mode>3<mask_scalar_name><round_scalar_name>"
2794 : : [(set (match_operand:VFH_128 0 "register_operand" "=x,v")
2795 : : (vec_merge:VFH_128
2796 : : (multdiv:VFH_128
2797 : : (match_operand:VFH_128 1 "register_operand" "0,v")
2798 : : (match_operand:VFH_128 2 "nonimmediate_operand" "xm,<round_scalar_constraint>"))
2799 : : (match_dup 1)
2800 : : (const_int 1)))]
2801 : 1158 : "TARGET_SSE"
2802 : : "@
2803 : : <multdiv_mnemonic><ssescalarmodesuffix>\t{%2, %0|%0, %<iptr>2}
2804 : : v<multdiv_mnemonic><ssescalarmodesuffix>\t{<round_scalar_mask_op3>%2, %1, %0<mask_scalar_operand3>|%0<mask_scalar_operand3>, %1, %<iptr>2<round_scalar_mask_op3>}"
2805 : 1176 : [(set_attr "isa" "noavx,avx")
2806 : 1176 : (set_attr "type" "sse<multdiv_mnemonic>")
2807 : : (set_attr "prefix" "<round_scalar_prefix>")
2808 : : (set_attr "btver2_decode" "direct,double")
2809 : : (set_attr "mode" "<ssescalarmode>")])
2810 : :
2811 : : (define_expand "div<mode>3"
2812 : : [(set (match_operand:VF2 0 "register_operand")
2813 : : (div:VF2 (match_operand:VF2 1 "register_operand")
2814 : : (match_operand:VF2 2 "vector_operand")))]
2815 : : "TARGET_SSE2")
2816 : :
2817 : : (define_expand "div<mode>3"
2818 : : [(set (match_operand:VHF_AVX512VL 0 "register_operand")
2819 : : (div:VHF_AVX512VL
2820 : : (match_operand:VHF_AVX512VL 1 "register_operand")
2821 : : (match_operand:VHF_AVX512VL 2 "vector_operand")))]
2822 : : "TARGET_AVX512FP16"
2823 : 107 : {
2824 : : /* Transform HF vector div to vector mul/rcp. */
2825 : 107 : if (GET_MODE_INNER (<MODE>mode) == HFmode
2826 : 107 : && TARGET_RECIP_VEC_DIV
2827 : 107 : && optimize_insn_for_speed_p ()
2828 : 107 : && flag_finite_math_only && !flag_trapping_math
2829 : 4 : && flag_unsafe_math_optimizations)
2830 : : {
2831 : 4 : rtx op = gen_reg_rtx (<MODE>mode);
2832 : 4 : operands[2] = force_reg (<MODE>mode, operands[2]);
2833 : 4 : emit_insn (gen_avx512fp16_rcp<mode>2 (op, operands[2]));
2834 : 4 : emit_insn (gen_mul<mode>3 (operands[0], operands[1], op));
2835 : 4 : DONE;
2836 : : }
2837 : : })
2838 : :
2839 : : (define_expand "div<mode>3"
2840 : 103 : [(set (match_operand:VF1 0 "register_operand")
2841 : 103 : (div:VF1 (match_operand:VF1 1 "register_operand")
2842 : 103 : (match_operand:VF1 2 "vector_operand")))]
2843 : 103 : "TARGET_SSE"
2844 : 801 : {
2845 : 801 : if (TARGET_SSE_MATH
2846 : 698 : && TARGET_RECIP_VEC_DIV
2847 : 800 : && !optimize_insn_for_size_p ()
2848 : 692 : && flag_finite_math_only && !flag_trapping_math
2849 : 728 : && flag_unsafe_math_optimizations)
2850 : : {
2851 : 133 : ix86_emit_swdivsf (operands[0], operands[1], operands[2], <MODE>mode);
2852 : 133 : DONE;
2853 : 103 : }
2854 : : })
2855 : :
2856 : : (define_expand "div<mode>3"
2857 : 668 : [(set (match_operand:VBF_AVX10_2 0 "register_operand")
2858 : 683 : (div:VBF_AVX10_2
2859 : 668 : (match_operand:VBF_AVX10_2 1 "register_operand")
2860 : 668 : (match_operand:VBF_AVX10_2 2 "vector_operand")))]
2861 : 668 : "TARGET_AVX10_2_256"
2862 : 678 : {
2863 : 10 : if (TARGET_RECIP_VEC_DIV
2864 : 693 : && optimize_insn_for_speed_p ()
2865 : 25 : && flag_finite_math_only
2866 : 30 : && flag_unsafe_math_optimizations)
2867 : 15 : {
2868 : 688 : rtx op = gen_reg_rtx (<MODE>mode);
2869 : 688 : operands[2] = force_reg (<MODE>mode, operands[2]);
2870 : 688 : emit_insn (gen_avx10_2_rcppbf16_<mode> (op, operands[2]));
2871 : 20 : emit_insn (gen_avx10_2_mulnepbf16_<mode> (operands[0], operands[1], op));
2872 : 20 : DONE;
2873 : : }
2874 : : })
2875 : 19 :
2876 : : (define_expand "cond_div<mode>"
2877 : 5 : [(set (match_operand:VFH 0 "register_operand")
2878 : 5 : (vec_merge:VFH
2879 : 5 : (div:VFH
2880 : 5 : (match_operand:VFH 2 "register_operand")
2881 : 24 : (match_operand:VFH 3 "vector_operand"))
2882 : 24 : (match_operand:VFH 4 "nonimm_or_0_operand")
2883 : 19 : (match_operand:<avx512fmaskmode> 1 "register_operand")))]
2884 : 24 : "<MODE_SIZE> == 64 || TARGET_AVX512VL"
2885 : 37 : {
2886 : 37 : emit_insn (gen_<sse>_div<mode>3_mask (operands[0],
2887 : 19 : operands[2],
2888 : 24 : operands[3],
2889 : 24 : operands[4],
2890 : 5 : operands[1]));
2891 : 37 : DONE;
2892 : : })
2893 : :
2894 : : (define_insn "<sse>_div<mode>3<mask_name><round_name>"
2895 : 3 : [(set (match_operand:VFH 0 "register_operand" "=x,v")
2896 : : (div:VFH
2897 : : (match_operand:VFH 1 "register_operand" "0,v")
2898 : 0 : (match_operand:VFH 2 "<bcst_round_nimm_predicate>" "xBm,<bcst_round_constraint>")))]
2899 : 9073 : "TARGET_SSE && <mask_mode512bit_condition> && <round_mode_condition>"
2900 : : "@
2901 : 3 : div<ssemodesuffix>\t{%2, %0|%0, %2}
2902 : 3 : vdiv<ssemodesuffix>\t{<round_mask_op3>%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2<round_mask_op3>}"
2903 : 453 : [(set_attr "isa" "noavx,avx")
2904 : 453 : (set_attr "type" "ssediv")
2905 : 1249 : (set_attr "prefix" "<bcst_mask_prefix3>")
2906 : 3 : (set_attr "mode" "<MODE>")])
2907 : 3 :
2908 : 3 : (define_insn "<sse>_rcp<mode>2"
2909 : 3 : [(set (match_operand:VF1_128_256 0 "register_operand" "=x,x")
2910 : : (unspec:VF1_128_256
2911 : 1094 : [(match_operand:VF1_128_256 1 "vector_operand" "xBm,xja")] UNSPEC_RCP))]
2912 : 339 : "TARGET_SSE"
2913 : 59 : "%vrcpps\t{%1, %0|%0, %1}"
2914 : : [(set_attr "isa" "noavx,avx")
2915 : 2 : (set_attr "type" "sse")
2916 : 88 : (set_attr "addr" "*,gpr16")
2917 : 88 : (set_attr "atom_sse_attr" "rcp")
2918 : 82 : (set_attr "btver2_sse_attr" "rcp")
2919 : 80 : (set_attr "prefix" "maybe_vex")
2920 : 246 : (set_attr "mode" "<MODE>")])
2921 : :
2922 : : (define_insn "sse_vmrcpv4sf2"
2923 : 79 : [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2924 : 73 : (vec_merge:V4SF
2925 : 90 : (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm,xjm")]
2926 : 73 : UNSPEC_RCP)
2927 : 73 : (match_operand:V4SF 2 "register_operand" "0,x")
2928 : 90 : (const_int 1)))]
2929 : 99 : "TARGET_SSE"
2930 : 8 : "@
2931 : 0 : rcpss\t{%1, %0|%0, %k1}
2932 : 0 : vrcpss\t{%1, %2, %0|%0, %2, %k1}"
2933 : 91 : [(set_attr "isa" "noavx,avx")
2934 : 87 : (set_attr "type" "sse")
2935 : 6 : (set_attr "addr" "*,gpr16")
2936 : 4 : (set_attr "atom_sse_attr" "rcp")
2937 : 4 : (set_attr "btver2_sse_attr" "rcp")
2938 : 6 : (set_attr "prefix" "orig,vex")
2939 : : (set_attr "mode" "SF")])
2940 : 54 :
2941 : : (define_insn "*sse_vmrcpv4sf2"
2942 : 0 : [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2943 : 54 : (vec_merge:V4SF
2944 : : (vec_duplicate:V4SF
2945 : : (unspec:SF [(match_operand:SF 1 "nonimmediate_operand" "xm,xjm")]
2946 : : UNSPEC_RCP))
2947 : 3 : (match_operand:V4SF 2 "register_operand" "0,x")
2948 : 0 : (const_int 1)))]
2949 : 0 : "TARGET_SSE"
2950 : 0 : "@
2951 : 0 : rcpss\t{%1, %0|%0, %1}
2952 : 0 : vrcpss\t{%1, %2, %0|%0, %2, %1}"
2953 : 35 : [(set_attr "isa" "noavx,avx")
2954 : 35 : (set_attr "type" "sse")
2955 : 35 : (set_attr "addr" "*,gpr16")
2956 : 3 : (set_attr "atom_sse_attr" "rcp")
2957 : 3 : (set_attr "btver2_sse_attr" "rcp")
2958 : 3 : (set_attr "prefix" "orig,vex")
2959 : 3 : (set_attr "mode" "SF")])
2960 : 3 :
2961 : 3 : (define_insn "avx512fp16_rcp<mode>2<mask_name>"
2962 : 3 : [(set (match_operand:VHF_AVX512VL 0 "register_operand" "=v")
2963 : : (unspec:VHF_AVX512VL
2964 : : [(match_operand:VHF_AVX512VL 1 "nonimmediate_operand" "vm")]
2965 : : UNSPEC_RCP))]
2966 : 598 : "TARGET_AVX512FP16"
2967 : : "vrcpph\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
2968 : 3 : [(set_attr "type" "sse")
2969 : 3 : (set_attr "prefix" "evex")
2970 : 3 : (set_attr "mode" "<MODE>")])
2971 : 3 :
2972 : 3 : (define_insn "avx512fp16_vmrcpv8hf2<mask_scalar_name>"
2973 : 3 : [(set (match_operand:V8HF 0 "register_operand" "=v")
2974 : 3 : (vec_merge:V8HF
2975 : 3 : (unspec:V8HF [(match_operand:V8HF 1 "nonimmediate_operand" "vm")]
2976 : 3 : UNSPEC_RCP)
2977 : : (match_operand:V8HF 2 "register_operand" "v")
2978 : : (const_int 1)))]
2979 : 313 : "TARGET_AVX512FP16"
2980 : : "vrcpsh\t{%1, %2, %0<mask_scalar_operand3>|%0<mask_scalar_operand3>, %2, %w1}"
2981 : : [(set_attr "type" "sse")
2982 : : (set_attr "prefix" "evex")
2983 : 445 : (set_attr "mode" "HF")])
2984 : 445 :
2985 : : (define_insn "*avx512fp16_vmrcpv8hf2"
2986 : 233 : [(set (match_operand:V8HF 0 "register_operand" "=v")
2987 : 233 : (vec_merge:V8HF
2988 : 233 : (vec_duplicate:V8HF
2989 : 1380 : (unspec:HF [(match_operand:HF 1 "nonimmediate_operand" "vm")]
2990 : 1380 : UNSPEC_RCP))
2991 : : (match_operand:V8HF 2 "register_operand" "v")
2992 : 241 : (const_int 1)))]
2993 : 271 : "TARGET_AVX512FP16"
2994 : 241 : "vrcpsh\t{%1, %2, %0|%0, %2, %w1}"
2995 : : [(set_attr "type" "sse")
2996 : : (set_attr "prefix" "evex")
2997 : : (set_attr "mode" "HF")])
2998 : :
2999 : : (define_insn "<mask_codefor>rcp14<mode><mask_name>"
3000 : : [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
3001 : 32 : (unspec:VF_AVX512VL
3002 : 32 : [(match_operand:VF_AVX512VL 1 "nonimmediate_operand" "vm")]
3003 : : UNSPEC_RCP14))]
3004 : 588 : "TARGET_AVX512F"
3005 : 0 : "vrcp14<ssemodesuffix>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
3006 : 0 : [(set_attr "type" "sse")
3007 : : (set_attr "prefix" "evex")
3008 : : (set_attr "mode" "<MODE>")])
3009 : :
3010 : : (define_insn "srcp14<mode>"
3011 : : [(set (match_operand:VF_128 0 "register_operand" "=v")
3012 : : (vec_merge:VF_128
3013 : : (unspec:VF_128
3014 : : [(match_operand:VF_128 1 "nonimmediate_operand" "vm")]
3015 : : UNSPEC_RCP14)
3016 : : (match_operand:VF_128 2 "register_operand" "v")
3017 : : (const_int 1)))]
3018 : 81 : "TARGET_AVX512F"
3019 : : "vrcp14<ssescalarmodesuffix>\t{%1, %2, %0|%0, %2, %<iptr>1}"
3020 : : [(set_attr "type" "sse")
3021 : : (set_attr "prefix" "evex")
3022 : 91 : (set_attr "mode" "<MODE>")])
3023 : 91 :
3024 : : (define_insn "srcp14<mode>_mask"
3025 : : [(set (match_operand:VF_128 0 "register_operand" "=v")
3026 : : (vec_merge:VF_128
3027 : : (vec_merge:VF_128
3028 : : (unspec:VF_128
3029 : : [(match_operand:VF_128 1 "nonimmediate_operand" "vm")]
3030 : : UNSPEC_RCP14)
3031 : : (match_operand:VF_128 3 "nonimm_or_0_operand" "0C")
3032 : : (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk"))
3033 : : (match_operand:VF_128 2 "register_operand" "v")
3034 : : (const_int 1)))]
3035 : 209 : "TARGET_AVX512F"
3036 : : "vrcp14<ssescalarmodesuffix>\t{%1, %2, %0%{%4%}%N3|%0%{%4%}%N3, %2, %<iptr>1}"
3037 : : [(set_attr "type" "sse")
3038 : : (set_attr "prefix" "evex")
3039 : 212 : (set_attr "mode" "<MODE>")])
3040 : 212 :
3041 : 212 : (define_expand "sqrt<mode>2"
3042 : : [(set (match_operand:VF2HB 0 "register_operand")
3043 : : (sqrt:VF2HB (match_operand:VF2HB 1 "vector_operand")))]
3044 : : "TARGET_SSE2")
3045 : :
3046 : : (define_expand "sqrt<mode>2"
3047 : : [(set (match_operand:VF1 0 "register_operand")
3048 : : (sqrt:VF1 (match_operand:VF1 1 "vector_operand")))]
3049 : : "TARGET_SSE"
3050 : 64 : {
3051 : 64 : if (TARGET_SSE_MATH
3052 : 64 : && TARGET_RECIP_VEC_SQRT
3053 : 63 : && !optimize_insn_for_size_p ()
3054 : 63 : && flag_finite_math_only && !flag_trapping_math
3055 : 117 : && flag_unsafe_math_optimizations)
3056 : : {
3057 : 53 : ix86_emit_swsqrtsf (operands[0], operands[1], <MODE>mode, false);
3058 : 53 : DONE;
3059 : : }
3060 : : })
3061 : :
3062 : : (define_insn "<sse>_sqrt<mode>2<mask_name><round_name>"
3063 : 11 : [(set (match_operand:VFH 0 "register_operand" "=x,v")
3064 : 11 : (sqrt:VFH (match_operand:VFH 1 "<round_nimm_predicate>" "xBm,<round_constraint>")))]
3065 : 1011 : "TARGET_SSE && <mask_mode512bit_condition> && <round_mode_condition>"
3066 : 56 : "@
3067 : : sqrt<ssemodesuffix>\t{%1, %0|%0, %1}
3068 : 11 : vsqrt<ssemodesuffix>\t{<round_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_mask_op2>}"
3069 : 115 : [(set_attr "isa" "noavx,avx")
3070 : 115 : (set_attr "type" "sse")
3071 : 831 : (set_attr "atom_sse_attr" "sqrt")
3072 : 32 : (set_attr "btver2_sse_attr" "sqrt")
3073 : 56 : (set_attr "prefix" "maybe_vex")
3074 : : (set_attr "mode" "<MODE>")])
3075 : :
3076 : : (define_insn "<sse>_vmsqrt<mode>2<mask_scalar_name><round_scalar_name>"
3077 : 1179 : [(set (match_operand:VFH_128 0 "register_operand" "=x,v")
3078 : 4 : (vec_merge:VFH_128
3079 : : (sqrt:VFH_128
3080 : : (match_operand:VFH_128 1 "nonimmediate_operand" "xm,<round_scalar_constraint>"))
3081 : : (match_operand:VFH_128 2 "register_operand" "0,v")
3082 : : (const_int 1)))]
3083 : 704 : "TARGET_SSE"
3084 : 4 : "@
3085 : 4 : sqrt<ssescalarmodesuffix>\t{%1, %0|%0, %<iptr>1}
3086 : 4 : vsqrt<ssescalarmodesuffix>\t{<round_scalar_mask_op3>%1, %2, %0<mask_scalar_operand3>|%0<mask_scalar_operand3>, %2, %<iptr>1<round_scalar_mask_op3>}"
3087 : 636 : [(set_attr "isa" "noavx,avx")
3088 : 636 : (set_attr "type" "sse")
3089 : 636 : (set_attr "atom_sse_attr" "sqrt")
3090 : 4 : (set_attr "prefix" "<round_scalar_prefix>")
3091 : 4 : (set_attr "btver2_sse_attr" "sqrt")
3092 : 4 : (set_attr "mode" "<ssescalarmode>")])
3093 : :
3094 : : (define_insn "*<sse>_vmsqrt<mode>2<mask_scalar_name><round_scalar_name>"
3095 : : [(set (match_operand:VFH_128 0 "register_operand" "=x,v")
3096 : : (vec_merge:VFH_128
3097 : : (vec_duplicate:VFH_128
3098 : : (sqrt:<ssescalarmode>
3099 : : (match_operand:<ssescalarmode> 1 "nonimmediate_operand" "xm,<round_scalar_constraint>")))
3100 : : (match_operand:VFH_128 2 "register_operand" "0,v")
3101 : : (const_int 1)))]
3102 : 15 : "TARGET_SSE"
3103 : : "@
3104 : : sqrt<ssescalarmodesuffix>\t{%1, %0|%0, %1}
3105 : : vsqrt<ssescalarmodesuffix>\t{<round_scalar_mask_op3>%1, %2, %0<mask_scalar_operand3>|%0<mask_scalar_operand3>, %2, %1<round_scalar_mask_op3>}"
3106 : 2 : [(set_attr "isa" "noavx,avx")
3107 : 2 : (set_attr "type" "sse")
3108 : 2 : (set_attr "atom_sse_attr" "sqrt")
3109 : : (set_attr "prefix" "<round_scalar_prefix>")
3110 : : (set_attr "btver2_sse_attr" "sqrt")
3111 : : (set_attr "mode" "<ssescalarmode>")])
3112 : :
3113 : : (define_expand "rsqrt<mode>2"
3114 : : [(set (match_operand:VF1_128_256 0 "register_operand")
3115 : : (unspec:VF1_128_256
3116 : : [(match_operand:VF1_128_256 1 "vector_operand")]
3117 : : UNSPEC_RSQRT))]
3118 : : "TARGET_SSE && TARGET_SSE_MATH"
3119 : 13 : {
3120 : 13 : ix86_emit_swsqrtsf (operands[0], operands[1], <MODE>mode, true);
3121 : 13 : DONE;
3122 : : })
3123 : :
3124 : : (define_expand "rsqrt<mode>2"
3125 : : [(set (match_operand:VHF_AVX512VL 0 "register_operand")
3126 : : (unspec:VHF_AVX512VL
3127 : : [(match_operand:VHF_AVX512VL 1 "vector_operand")]
3128 : : UNSPEC_RSQRT))]
3129 : : "TARGET_AVX512FP16")
3130 : :
3131 : : (define_insn "<sse>_rsqrt<mode>2"
3132 : : [(set (match_operand:VF1_128_256 0 "register_operand" "=x,x")
3133 : : (unspec:VF1_128_256
3134 : : [(match_operand:VF1_128_256 1 "vector_operand" "xBm,xja")] UNSPEC_RSQRT))]
3135 : 432 : "TARGET_SSE"
3136 : 37 : "%vrsqrtps\t{%1, %0|%0, %1}"
3137 : : [(set_attr "isa" "noavx,avx")
3138 : : (set_attr "type" "sse")
3139 : 88 : (set_attr "addr" "*,gpr16")
3140 : 88 : (set_attr "prefix" "maybe_vex")
3141 : 80 : (set_attr "mode" "<MODE>")])
3142 : 80 :
3143 : 167 : (define_insn "<sse>_rsqrt<mode>2<mask_name>"
3144 : : [(set (match_operand:VHF_AVX512VL 0 "register_operand" "=v")
3145 : : (unspec:VHF_AVX512VL
3146 : : [(match_operand:VHF_AVX512VL 1 "vector_operand" "vBm")] UNSPEC_RSQRT))]
3147 : 827 : "TARGET_AVX512FP16"
3148 : 0 : "vrsqrtph\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
3149 : 0 : [(set_attr "type" "sse")
3150 : 0 : (set_attr "prefix" "evex")
3151 : 0 : (set_attr "mode" "<MODE>")])
3152 : 0 :
3153 : 0 : (define_insn "<mask_codefor>rsqrt14<mode><mask_name>"
3154 : 0 : [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
3155 : 0 : (unspec:VF_AVX512VL
3156 : 0 : [(match_operand:VF_AVX512VL 1 "nonimmediate_operand" "vm")]
3157 : : UNSPEC_RSQRT14))]
3158 : 596 : "TARGET_AVX512F"
3159 : : "vrsqrt14<ssemodesuffix>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
3160 : : [(set_attr "type" "sse")
3161 : : (set_attr "prefix" "evex")
3162 : : (set_attr "mode" "<MODE>")])
3163 : :
3164 : : (define_insn "rsqrt14<mode>"
3165 : : [(set (match_operand:VF_128 0 "register_operand" "=v")
3166 : : (vec_merge:VF_128
3167 : : (unspec:VF_128
3168 : : [(match_operand:VF_128 1 "nonimmediate_operand" "vm")]
3169 : : UNSPEC_RSQRT14)
3170 : : (match_operand:VF_128 2 "register_operand" "v")
3171 : : (const_int 1)))]
3172 : 81 : "TARGET_AVX512F"
3173 : : "vrsqrt14<ssescalarmodesuffix>\t{%1, %2, %0|%0, %2, %<iptr>1}"
3174 : : [(set_attr "type" "sse")
3175 : : (set_attr "prefix" "evex")
3176 : 81 : (set_attr "mode" "<MODE>")])
3177 : 81 :
3178 : : (define_insn "rsqrt14_<mode>_mask"
3179 : : [(set (match_operand:VF_128 0 "register_operand" "=v")
3180 : : (vec_merge:VF_128
3181 : : (vec_merge:VF_128
3182 : : (unspec:VF_128
3183 : : [(match_operand:VF_128 1 "nonimmediate_operand" "vm")]
3184 : : UNSPEC_RSQRT14)
3185 : : (match_operand:VF_128 3 "nonimm_or_0_operand" "0C")
3186 : : (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk"))
3187 : : (match_operand:VF_128 2 "register_operand" "v")
3188 : : (const_int 1)))]
3189 : 209 : "TARGET_AVX512F"
3190 : : "vrsqrt14<ssescalarmodesuffix>\t{%1, %2, %0%{%4%}%N3|%0%{%4%}%N3, %2, %<iptr>1}"
3191 : : [(set_attr "type" "sse")
3192 : : (set_attr "prefix" "evex")
3193 : 233 : (set_attr "mode" "<MODE>")])
3194 : 233 :
3195 : 233 : (define_insn "sse_vmrsqrtv4sf2"
3196 : : [(set (match_operand:V4SF 0 "register_operand" "=x,x")
3197 : : (vec_merge:V4SF
3198 : : (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm,xjm")]
3199 : : UNSPEC_RSQRT)
3200 : : (match_operand:V4SF 2 "register_operand" "0,x")
3201 : : (const_int 1)))]
3202 : 99 : "TARGET_SSE"
3203 : : "@
3204 : : rsqrtss\t{%1, %0|%0, %k1}
3205 : : vrsqrtss\t{%1, %2, %0|%0, %2, %k1}"
3206 : 83 : [(set_attr "isa" "noavx,avx")
3207 : 83 : (set_attr "type" "sse")
3208 : : (set_attr "addr" "*,gpr16")
3209 : : (set_attr "prefix" "orig,vex")
3210 : : (set_attr "mode" "SF")])
3211 : :
3212 : : (define_insn "*sse_vmrsqrtv4sf2"
3213 : : [(set (match_operand:V4SF 0 "register_operand" "=x,x")
3214 : : (vec_merge:V4SF
3215 : : (vec_duplicate:V4SF
3216 : : (unspec:SF [(match_operand:SF 1 "nonimmediate_operand" "xm,xjm")]
3217 : : UNSPEC_RSQRT))
3218 : : (match_operand:V4SF 2 "register_operand" "0,x")
3219 : : (const_int 1)))]
3220 : 0 : "TARGET_SSE"
3221 : : "@
3222 : : rsqrtss\t{%1, %0|%0, %1}
3223 : : vrsqrtss\t{%1, %2, %0|%0, %2, %1}"
3224 : 32 : [(set_attr "isa" "noavx,avx")
3225 : 32 : (set_attr "type" "sse")
3226 : 32 : (set_attr "addr" "*,gpr16")
3227 : : (set_attr "prefix" "orig,vex")
3228 : : (set_attr "mode" "SF")])
3229 : :
3230 : : (define_insn "avx512fp16_vmrsqrtv8hf2<mask_scalar_name>"
3231 : : [(set (match_operand:V8HF 0 "register_operand" "=v")
3232 : : (vec_merge:V8HF
3233 : : (unspec:V8HF [(match_operand:V8HF 1 "nonimmediate_operand" "vm")]
3234 : : UNSPEC_RSQRT)
3235 : : (match_operand:V8HF 2 "register_operand" "v")
3236 : : (const_int 1)))]
3237 : 313 : "TARGET_AVX512FP16"
3238 : : "vrsqrtsh\t{%1, %2, %0<mask_scalar_operand3>|%0<mask_scalar_operand3>, %2, %w1}"
3239 : : [(set_attr "type" "sse")
3240 : : (set_attr "prefix" "evex")
3241 : : (set_attr "mode" "HF")])
3242 : :
3243 : : (define_insn "*avx512fp16_vmrsqrtv8hf2"
3244 : : [(set (match_operand:V8HF 0 "register_operand" "=v")
3245 : 4118 : (vec_merge:V8HF
3246 : 4118 : (vec_duplicate:V8HF
3247 : 4118 : (unspec:HF [(match_operand:HF 1 "nonimmediate_operand" "vm")]
3248 : : UNSPEC_RSQRT))
3249 : 4118 : (match_operand:V8HF 2 "register_operand" "v")
3250 : 1991 : (const_int 1)))]
3251 : 30 : "TARGET_AVX512FP16"
3252 : 866 : "vrsqrtsh\t{%1, %2, %0<mask_scalar_operand3>|%0<mask_scalar_operand3>, %2, %w1}"
3253 : 239 : [(set_attr "type" "sse")
3254 : 186 : (set_attr "prefix" "evex")
3255 : 186 : (set_attr "mode" "HF")])
3256 : 156 :
3257 : 156 : (define_expand "cond_<code><mode>"
3258 : : [(set (match_operand:VFH 0 "register_operand")
3259 : 156 : (vec_merge:VFH
3260 : 156 : (smaxmin:VFH
3261 : 156 : (match_operand:VFH 2 "vector_operand")
3262 : 156 : (match_operand:VFH 3 "vector_operand"))
3263 : 156 : (match_operand:VFH 4 "nonimm_or_0_operand")
3264 : 123 : (match_operand:<avx512fmaskmode> 1 "register_operand")))]
3265 : 144 : "<MODE_SIZE> == 64 || TARGET_AVX512VL"
3266 : 237 : {
3267 : 93 : emit_insn (gen_<code><mode>3_mask (operands[0],
3268 : 144 : operands[2],
3269 : 16 : operands[3],
3270 : 16 : operands[4],
3271 : 142 : operands[1]));
3272 : 20 : DONE;
3273 : 142 : })
3274 : 142 :
3275 : 142 : (define_expand "<code><mode>3<mask_name><round_saeonly_name>"
3276 : : [(set (match_operand:VFH 0 "register_operand")
3277 : 142 : (smaxmin:VFH
3278 : 142 : (match_operand:VFH 1 "<round_saeonly_nimm_predicate>")
3279 : : (match_operand:VFH 2 "<round_saeonly_nimm_predicate>")))]
3280 : 142 : "TARGET_SSE && <mask_mode512bit_condition>
3281 : 142 : && <round_saeonly_mode_condition>"
3282 : 1944 : {
3283 : 208 : if (!flag_finite_math_only || flag_signed_zeros)
3284 : 142 : {
3285 : 1600 : operands[1] = force_reg (<MODE>mode, operands[1]);
3286 : 1659 : emit_insn (gen_ieee_<maxmin_float><mode>3<mask_name><round_saeonly_name>
3287 : 59 : (operands[0], operands[1], operands[2]
3288 : 59 : <mask_operand_arg34>
3289 : : <round_saeonly_mask_arg3>));
3290 : 1600 : DONE;
3291 : : }
3292 : : else
3293 : 202 : ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);
3294 : : })
3295 : :
3296 : : ;; These versions of the min/max patterns are intentionally ignorant of
3297 : 202 : ;; their behavior wrt -0.0 and NaN (via the commutative operand mark).
3298 : 202 : ;; Since both the tree-level MAX_EXPR and the rtl-level SMAX operator
3299 : 202 : ;; are undefined in this condition, we're certain this is correct.
3300 : 202 :
3301 : 388 : (define_insn "*<code><mode>3<mask_name><round_saeonly_name>"
3302 : 202 : [(set (match_operand:VFH 0 "register_operand" "=x,v")
3303 : 16 : (smaxmin:VFH
3304 : 194 : (match_operand:VFH 1 "<round_saeonly_nimm_predicate>" "%0,v")
3305 : 26 : (match_operand:VFH 2 "<round_saeonly_nimm_predicate>" "xBm,<round_saeonly_constraint>")))]
3306 : 2192 : "TARGET_SSE
3307 : 2527 : && !(MEM_P (operands[1]) && MEM_P (operands[2]))
3308 : 312 : && <mask_mode512bit_condition>
3309 : 487 : && <round_saeonly_mode_condition>"
3310 : 186 : "@
3311 : 184 : <maxmin_float><ssemodesuffix>\t{%2, %0|%0, %2}
3312 : 176 : v<maxmin_float><ssemodesuffix>\t{<round_saeonly_mask_op3>%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2<round_saeonly_mask_op3>}"
3313 : 188 : [(set_attr "isa" "noavx,avx")
3314 : 62 : (set_attr "type" "sseadd")
3315 : 496 : (set_attr "btver2_sse_attr" "maxmin")
3316 : 57 : (set_attr "prefix" "<mask_prefix3>")
3317 : 82 : (set_attr "mode" "<MODE>")])
3318 : 98 :
3319 : 102 : (define_insn_and_split "*minmax<mode>3_1"
3320 : 370 : [(set (match_operand:VFH 0 "register_operand")
3321 : 156 : (vec_merge:VFH
3322 : 284 : (match_operand:VFH 1 "nonimmediate_operand")
3323 : 434 : (match_operand:VFH 2 "nonimmediate_operand")
3324 : 450 : (unspec:<avx512fmaskmode>
3325 : 784 : [(match_operand:VFH 3 "nonimmediate_operand")
3326 : 636 : (match_operand:VFH 4 "nonimmediate_operand")
3327 : 171 : (match_operand:SI 5 "const_0_to_31_operand")]
3328 : 1000 : UNSPEC_PCMP)))]
3329 : 3253 : "TARGET_SSE && ix86_pre_reload_split ()
3330 : 3613 : && ((rtx_equal_p (operands[1], operands[3])
3331 : 2655 : && rtx_equal_p (operands[2], operands[4]))
3332 : 1517 : || (rtx_equal_p (operands[1], operands[4])
3333 : 1025 : && rtx_equal_p (operands[2], operands[3])))
3334 : 5014 : && (INTVAL (operands[5]) == 1 || INTVAL (operands[5]) == 14)"
3335 : 276 : "#"
3336 : 496 : "&& 1"
3337 : 766 : [(const_int 0)]
3338 : 614 : {
3339 : 730 : int u = UNSPEC_IEEE_MIN;
3340 : 717 : if ((INTVAL (operands[5]) == 1 && rtx_equal_p (operands[1], operands[4]))
3341 : 1066 : || (INTVAL (operands[5]) == 14 && rtx_equal_p (operands[1], operands[3])))
3342 : 69 : u = UNSPEC_IEEE_MAX;
3343 : 216 :
3344 : 646 : if (MEM_P (operands[1]))
3345 : 36 : operands[1] = force_reg (<MODE>mode, operands[1]);
3346 : 430 : rtvec v = gen_rtvec (2, operands[1], operands[2]);
3347 : 430 : rtx tmp = gen_rtx_UNSPEC (<MODE>mode, v, u);
3348 : 430 : emit_move_insn (operands[0], tmp);
3349 : 430 : DONE;
3350 : : })
3351 : :
3352 : : (define_insn_and_split "*minmax<mode>3_2"
3353 : : [(set (match_operand:VF_128_256 0 "register_operand")
3354 : : (unspec:VF_128_256
3355 : : [(match_operand:VF_128_256 1 "nonimmediate_operand")
3356 : : (match_operand:VF_128_256 2 "nonimmediate_operand")
3357 : : (lt:VF_128_256
3358 : : (match_operand:VF_128_256 3 "nonimmediate_operand")
3359 : : (match_operand:VF_128_256 4 "nonimmediate_operand"))]
3360 : : UNSPEC_BLENDV))]
3361 : 1358 : "TARGET_SSE && ix86_pre_reload_split ()
3362 : 2089 : && ((rtx_equal_p (operands[1], operands[3])
3363 : 600 : && rtx_equal_p (operands[2], operands[4]))
3364 : 968 : || (rtx_equal_p (operands[1], operands[4])
3365 : 1191 : && rtx_equal_p (operands[2], operands[3])))"
3366 : 473 : "#"
3367 : 278 : "&& 1"
3368 : 325 : [(const_int 0)]
3369 : 444 : {
3370 : 444 : int u = UNSPEC_IEEE_MIN;
3371 : 657 : if (rtx_equal_p (operands[1], operands[3]))
3372 : 508 : u = UNSPEC_IEEE_MAX;
3373 : 57 :
3374 : 325 : if (MEM_P (operands[2]))
3375 : 60 : operands[2] = force_reg (<MODE>mode, operands[2]);
3376 : 301 : rtvec v = gen_rtvec (2, operands[2], operands[1]);
3377 : 301 : rtx tmp = gen_rtx_UNSPEC (<MODE>mode, v, u);
3378 : 268 : emit_move_insn (operands[0], tmp);
3379 : 268 : DONE;
3380 : : })
3381 : :
3382 : : ;; These versions of the min/max patterns implement exactly the operations
3383 : : ;; min = (op1 < op2 ? op1 : op2)
3384 : : ;; max = (!(op1 < op2) ? op1 : op2)
3385 : : ;; Their operands are not commutative, and thus they may be used in the
3386 : : ;; presence of -0.0 and NaN.
3387 : :
3388 : : (define_insn "ieee_<ieee_maxmin><mode>3<mask_name><round_saeonly_name>"
3389 : : [(set (match_operand:VFH 0 "register_operand" "=x,v")
3390 : : (unspec:VFH
3391 : 68 : [(match_operand:VFH 1 "register_operand" "0,v")
3392 : : (match_operand:VFH 2 "<round_saeonly_nimm_predicate>" "xBm,<round_saeonly_constraint>")]
3393 : : IEEE_MAXMIN))]
3394 : 3283 : "TARGET_SSE
3395 : 2227 : && <mask_mode512bit_condition>
3396 : 1337 : && <round_saeonly_mode_condition>"
3397 : 35 : "@
3398 : 68 : <ieee_maxmin><ssemodesuffix>\t{%2, %0|%0, %2}
3399 : 68 : v<ieee_maxmin><ssemodesuffix>\t{<round_saeonly_mask_op3>%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2<round_saeonly_mask_op3>}"
3400 : 188 : [(set_attr "isa" "noavx,avx")
3401 : 188 : (set_attr "type" "sseadd")
3402 : 1635 : (set_attr "btver2_sse_attr" "maxmin")
3403 : 57 : (set_attr "prefix" "<mask_prefix3>")
3404 : 57 : (set_attr "mode" "<MODE>")])
3405 : 57 :
3406 : 33 : ;; Standard scalar operation patterns which preserve the rest of the
3407 : 33 : ;; vector for combiner.
3408 : 2172 : (define_insn "*ieee_<ieee_maxmin><mode>3"
3409 : : [(set (match_operand:VFH_128 0 "register_operand" "=x,v")
3410 : : (vec_merge:VFH_128
3411 : : (vec_duplicate:VFH_128
3412 : : (unspec:<ssescalarmode>
3413 : : [(vec_select:<ssescalarmode>
3414 : : (match_operand:VFH_128 1 "register_operand" "0,v")
3415 : : (parallel [(const_int 0)]))
3416 : : (match_operand:<ssescalarmode> 2 "nonimmediate_operand" "xm,vm")]
3417 : : IEEE_MAXMIN))
3418 : : (match_dup 1)
3419 : : (const_int 1)))]
3420 : 16 : "TARGET_SSE"
3421 : : "@
3422 : : <ieee_maxmin><ssescalarmodesuffix>\t{%2, %0|%0, %2}
3423 : : v<ieee_maxmin><ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
3424 : 2 : [(set_attr "isa" "noavx,avx")
3425 : 2 : (set_attr "type" "sseadd")
3426 : : (set_attr "btver2_sse_attr" "maxmin")
3427 : : (set (attr "prefix")
3428 : : (cond [(eq_attr "alternative" "0")
3429 : : (const_string "orig")
3430 : : (eq_attr "alternative" "1")
3431 : : (if_then_else
3432 : : (match_test "<MODE>mode == V8HFmode")
3433 : : (const_string "evex")
3434 : : (const_string "vex"))
3435 : : ]
3436 : : (const_string "*")))
3437 : : (set_attr "mode" "<ssescalarmode>")])
3438 : :
3439 : : (define_expand "<sse>_vm<code><mode>3<mask_scalar_name><round_saeonly_scalar_name>"
3440 : : [(set (match_operand:VFH_128 0 "register_operand")
3441 : : (vec_merge:VFH_128
3442 : : (smaxmin:VFH_128
3443 : : (match_operand:VFH_128 1 "register_operand")
3444 : : (match_operand:VFH_128 2 "nonimmediate_operand"))
3445 : : (match_dup 1)
3446 : 7467 : (const_int 1)))]
3447 : 7364 : "TARGET_SSE"
3448 : 7740 : {
3449 : 228 : if (!flag_finite_math_only || flag_signed_zeros)
3450 : 103 : {
3451 : 479 : emit_insn (gen_<sse>_ieee_vm<maxmin_float><mode>3<mask_scalar_name><round_saeonly_scalar_name>
3452 : 7448 : (operands[0], operands[1], operands[2]
3453 : 103 : <mask_scalar_operand_arg34>
3454 : : <round_saeonly_scalar_mask_arg3>));
3455 : 376 : DONE;
3456 : 6691 : }
3457 : 97 : })
3458 : :
3459 : : (define_insn "*<sse>_vm<code><mode>3<mask_scalar_name><round_saeonly_scalar_name>"
3460 : 0 : [(set (match_operand:VFH_128 0 "register_operand" "=x,v")
3461 : 0 : (vec_merge:VFH_128
3462 : 0 : (smaxmin:VFH_128
3463 : 0 : (match_operand:VFH_128 1 "register_operand" "0,v")
3464 : 0 : (match_operand:VFH_128 2 "nonimmediate_operand" "xm,<round_saeonly_scalar_constraint>"))
3465 : 8 : (match_dup 1)
3466 : 8 : (const_int 1)))]
3467 : 8 : "TARGET_SSE"
3468 : 8 : "@
3469 : 0 : <maxmin_float><ssescalarmodesuffix>\t{%2, %0|%0, %<iptr>2}
3470 : 0 : v<maxmin_float><ssescalarmodesuffix>\t{<round_saeonly_scalar_mask_op3>%2, %1, %0<mask_scalar_operand3>|%0<mask_scalar_operand3>, %1, %<iptr>2<round_saeonly_scalar_mask_op3>}"
3471 : 0 : [(set_attr "isa" "noavx,avx")
3472 : 8 : (set_attr "type" "sse")
3473 : 0 : (set_attr "btver2_sse_attr" "maxmin")
3474 : 0 : (set_attr "prefix" "<round_saeonly_scalar_prefix>")
3475 : 0 : (set_attr "mode" "<ssescalarmode>")])
3476 : 4 :
3477 : : (define_insn "<sse>_ieee_vm<ieee_maxmin><mode>3<mask_scalar_name><round_saeonly_scalar_name>"
3478 : : [(set (match_operand:VFH_128 0 "register_operand" "=x,v")
3479 : : (vec_merge:VFH_128
3480 : 4 : (unspec:VFH_128
3481 : 16 : [(match_operand:VFH_128 1 "register_operand" "0,v")
3482 : 0 : (match_operand:VFH_128 2 "nonimmediate_operand" "xm,<round_saeonly_scalar_constraint>")]
3483 : 0 : IEEE_MAXMIN)
3484 : 78 : (match_dup 1)
3485 : 78 : (const_int 1)))]
3486 : 1453 : "TARGET_SSE"
3487 : 16 : "@
3488 : 372 : <ieee_maxmin><ssescalarmodesuffix>\t{%2, %0|%0, %<iptr>2}
3489 : 2236 : v<ieee_maxmin><ssescalarmodesuffix>\t{<round_saeonly_scalar_mask_op3>%2, %1, %0<mask_scalar_operand3>|%0<mask_scalar_operand3>, %1, %<iptr>2<round_saeonly_scalar_mask_op3>}"
3490 : 3607 : [(set_attr "isa" "noavx,avx")
3491 : 3995 : (set_attr "type" "sse")
3492 : 651 : (set_attr "btver2_sse_attr" "maxmin")
3493 : 518 : (set_attr "prefix" "<round_saeonly_scalar_prefix>")
3494 : 829 : (set_attr "mode" "<ssescalarmode>")])
3495 : 2922 :
3496 : 867 : (define_mode_attr addsub_cst [(V4DF "5") (V2DF "1")
3497 : 849 : (V4SF "5") (V8SF "85")])
3498 : 715 :
3499 : 462 : (define_insn "vec_addsub<mode>3"
3500 : 858 : [(set (match_operand:VF_128_256 0 "register_operand" "=x,x")
3501 : 454 : (vec_merge:VF_128_256
3502 : 831 : (minus:VF_128_256
3503 : 767 : (match_operand:VF_128_256 1 "register_operand" "0,x")
3504 : 6154 : (match_operand:VF_128_256 2 "vector_operand" "xBm, xjm"))
3505 : 6028 : (plus:VF_128_256 (match_dup 1) (match_dup 2))
3506 : 6108 : (const_int <addsub_cst>)))]
3507 : 7566 : "TARGET_SSE3"
3508 : 198 : "@
3509 : 575 : addsub<ssemodesuffix>\t{%2, %0|%0, %2}
3510 : 575 : vaddsub<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
3511 : 6780 : [(set_attr "isa" "noavx,avx")
3512 : 1365 : (set_attr "type" "sseadd")
3513 : 1215 : (set_attr "addr" "*,gpr16")
3514 : 48 : (set (attr "atom_unit")
3515 : 126 : (if_then_else
3516 : 3008409 : (match_test "<MODE>mode == V2DFmode")
3517 : 126 : (const_string "complex")
3518 : 48 : (const_string "*")))
3519 : 48 : (set_attr "prefix" "orig,vex")
3520 : 676252 : (set (attr "prefix_rep")
3521 : 676402 : (if_then_else
3522 : 527 : (and (match_test "<MODE>mode == V4SFmode")
3523 : 676779 : (eq_attr "alternative" "0"))
3524 : 676629 : (const_string "1")
3525 : 676252 : (const_string "*")))
3526 : 676252 : (set_attr "mode" "<MODE>")])
3527 : 0 :
3528 : 278 : (define_split
3529 : 676300 : [(set (match_operand:VF_128_256 0 "register_operand")
3530 : 676300 : (match_operator:VF_128_256 6 "addsub_vm_operator"
3531 : 680864 : [(minus:VF_128_256
3532 : 32 : (match_operand:VF_128_256 1 "register_operand")
3533 : 32 : (match_operand:VF_128_256 2 "vector_operand"))
3534 : 680832 : (plus:VF_128_256
3535 : 680832 : (match_operand:VF_128_256 3 "vector_operand")
3536 : 680832 : (match_operand:VF_128_256 4 "vector_operand"))
3537 : 4580 : (match_operand 5 "const_int_operand")]))]
3538 : 6153 : "TARGET_SSE3
3539 : 678195 : && can_create_pseudo_p ()
3540 : 676905 : && ((rtx_equal_p (operands[1], operands[3])
3541 : 676905 : && rtx_equal_p (operands[2], operands[4]))
3542 : 676252 : || (rtx_equal_p (operands[1], operands[4])
3543 : 676252 : && rtx_equal_p (operands[2], operands[3])))"
3544 : 676548 : [(set (match_dup 0)
3545 : 676402 : (vec_merge:VF_128_256
3546 : 676252 : (minus:VF_128_256 (match_dup 1) (match_dup 2))
3547 : 676482 : (plus:VF_128_256 (match_dup 1) (match_dup 2))
3548 : 676482 : (match_dup 5)))])
3549 : 676560 :
3550 : 676252 : (define_split
3551 : 676252 : [(set (match_operand:VF_128_256 0 "register_operand")
3552 : 676252 : (match_operator:VF_128_256 6 "addsub_vm_operator"
3553 : 0 : [(plus:VF_128_256
3554 : 676252 : (match_operand:VF_128_256 1 "vector_operand")
3555 : 676252 : (match_operand:VF_128_256 2 "vector_operand"))
3556 : 676252 : (minus:VF_128_256
3557 : 676252 : (match_operand:VF_128_256 3 "register_operand")
3558 : 676252 : (match_operand:VF_128_256 4 "vector_operand"))
3559 : 676252 : (match_operand 5 "const_int_operand")]))]
3560 : 676559 : "TARGET_SSE3
3561 : 676319 : && can_create_pseudo_p ()
3562 : 676319 : && ((rtx_equal_p (operands[1], operands[3])
3563 : 676315 : && rtx_equal_p (operands[2], operands[4]))
3564 : 676256 : || (rtx_equal_p (operands[1], operands[4])
3565 : 676256 : && rtx_equal_p (operands[2], operands[3])))"
3566 : 676694 : [(set (match_dup 0)
3567 : 676268 : (vec_merge:VF_128_256
3568 : 676252 : (minus:VF_128_256 (match_dup 3) (match_dup 4))
3569 : 676509 : (plus:VF_128_256 (match_dup 3) (match_dup 4))
3570 : 676509 : (match_dup 5)))]
3571 : 676592 : {
3572 : 676255 : /* Negate mask bits to compensate for swapped PLUS and MINUS RTXes. */
3573 : 676322 : operands[5]
3574 : 70 : = GEN_INT (~INTVAL (operands[5])
3575 : 676255 : & ((HOST_WIDE_INT_1U << GET_MODE_NUNITS (<MODE>mode)) - 1));
3576 : 676255 : })
3577 : 676255 :
3578 : 3 : (define_split
3579 : 70 : [(set (match_operand:VF_128_256 0 "register_operand")
3580 : 676322 : (match_operator:VF_128_256 7 "addsub_vs_operator"
3581 : 676322 : [(vec_concat:<ssedoublevecmode>
3582 : 676319 : (minus:VF_128_256
3583 : 676319 : (match_operand:VF_128_256 1 "register_operand")
3584 : 676319 : (match_operand:VF_128_256 2 "vector_operand"))
3585 : 676319 : (plus:VF_128_256
3586 : 676319 : (match_operand:VF_128_256 3 "vector_operand")
3587 : 676319 : (match_operand:VF_128_256 4 "vector_operand")))
3588 : 690037 : (match_parallel 5 "addsub_vs_parallel"
3589 : 676319 : [(match_operand 6 "const_int_operand")])]))]
3590 : 690162 : "TARGET_SSE3
3591 : 676444 : && can_create_pseudo_p ()
3592 : 125 : && ((rtx_equal_p (operands[1], operands[3])
3593 : 125 : && rtx_equal_p (operands[2], operands[4]))
3594 : 125 : || (rtx_equal_p (operands[1], operands[4])
3595 : 125 : && rtx_equal_p (operands[2], operands[3])))"
3596 : 125 : [(set (match_dup 0)
3597 : 129 : (vec_merge:VF_128_256
3598 : 129 : (minus:VF_128_256 (match_dup 1) (match_dup 2))
3599 : 129 : (plus:VF_128_256 (match_dup 1) (match_dup 2))
3600 : 176407 : (match_dup 5)))]
3601 : 176407 : {
3602 : 176407 : int i, nelt = XVECLEN (operands[5], 0);
3603 : 176343 : HOST_WIDE_INT ival = 0;
3604 : 176343 :
3605 : 176340 : for (i = 0; i < nelt; i++)
3606 : 176340 : if (INTVAL (XVECEXP (operands[5], 0, i)) < GET_MODE_NUNITS (<MODE>mode))
3607 : 3324 : ival |= HOST_WIDE_INT_1 << i;
3608 : 132 :
3609 : 129 : operands[5] = GEN_INT (ival);
3610 : 3309 : })
3611 : 3321 :
3612 : 3312 : (define_split
3613 : 3309 : [(set (match_operand:VF_128_256 0 "register_operand")
3614 : 3309 : (match_operator:VF_128_256 7 "addsub_vs_operator"
3615 : 2292015 : [(vec_concat:<ssedoublevecmode>
3616 : 2288835 : (plus:VF_128_256
3617 : 2288835 : (match_operand:VF_128_256 1 "vector_operand")
3618 : 2288835 : (match_operand:VF_128_256 2 "vector_operand"))
3619 : 2288835 : (minus:VF_128_256
3620 : 2288835 : (match_operand:VF_128_256 3 "register_operand")
3621 : 2288835 : (match_operand:VF_128_256 4 "vector_operand")))
3622 : 2288835 : (match_parallel 5 "addsub_vs_parallel"
3623 : 2288835 : [(match_operand 6 "const_int_operand")])]))]
3624 : 129 : "TARGET_SSE3
3625 : 132 : && can_create_pseudo_p ()
3626 : 132 : && ((rtx_equal_p (operands[1], operands[3])
3627 : 132 : && rtx_equal_p (operands[2], operands[4]))
3628 : 132 : || (rtx_equal_p (operands[1], operands[4])
3629 : 129 : && rtx_equal_p (operands[2], operands[3])))"
3630 : 129 : [(set (match_dup 0)
3631 : 132 : (vec_merge:VF_128_256
3632 : 374 : (minus:VF_128_256 (match_dup 3) (match_dup 4))
3633 : 374 : (plus:VF_128_256 (match_dup 3) (match_dup 4))
3634 : 374 : (match_dup 5)))]
3635 : 371 : {
3636 : 371 : int i, nelt = XVECLEN (operands[5], 0);
3637 : 129 : HOST_WIDE_INT ival = 0;
3638 : 129 :
3639 : 990 : for (i = 0; i < nelt; i++)
3640 : 129 : if (INTVAL (XVECEXP (operands[5], 0, i)) >= GET_MODE_NUNITS (<MODE>mode))
3641 : 7844 : ival |= HOST_WIDE_INT_1 << i;
3642 : 990 :
3643 : 990 : operands[5] = GEN_INT (ival);
3644 : 8705 : })
3645 : 231781 :
3646 : 231781 : (define_insn "avx_h<insn>v4df3"
3647 : 231781 : [(set (match_operand:V4DF 0 "register_operand" "=x")
3648 : 230920 : (vec_concat:V4DF
3649 : 7844 : (vec_concat:V2DF
3650 : 129 : (plusminus:DF
3651 : 129 : (vec_select:DF
3652 : 129 : (match_operand:V4DF 1 "register_operand" "x")
3653 : 129 : (parallel [(const_int 0)]))
3654 : 129 : (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
3655 : 129 : (plusminus:DF
3656 : 129 : (vec_select:DF
3657 : 620264 : (match_operand:V4DF 2 "nonimmediate_operand" "xjm")
3658 : 620264 : (parallel [(const_int 0)]))
3659 : 620264 : (vec_select:DF (match_dup 2) (parallel [(const_int 1)]))))
3660 : 129 : (vec_concat:V2DF
3661 : 129 : (plusminus:DF
3662 : 132 : (vec_select:DF (match_dup 1) (parallel [(const_int 2)]))
3663 : 132 : (vec_select:DF (match_dup 1) (parallel [(const_int 3)])))
3664 : 132 : (plusminus:DF
3665 : 132 : (vec_select:DF (match_dup 2) (parallel [(const_int 2)]))
3666 : 132 : (vec_select:DF (match_dup 2) (parallel [(const_int 3)]))))))]
3667 : 288 : "TARGET_AVX"
3668 : 5388376 : "vh<plusminus_mnemonic>pd\t{%2, %1, %0|%0, %1, %2}"
3669 : 5388376 : [(set_attr "type" "sseadd")
3670 : 5388379 : (set_attr "addr" "gpr16")
3671 : 330 : (set_attr "prefix" "vex")
3672 : 330 : (set_attr "mode" "V4DF")])
3673 : 129 :
3674 : 132 : (define_expand "sse3_haddv2df3"
3675 : 6219 : [(set (match_operand:V2DF 0 "register_operand")
3676 : 132 : (vec_concat:V2DF
3677 : 132 : (plus:DF
3678 : 6219 : (vec_select:DF
3679 : 4993750 : (match_operand:V2DF 1 "register_operand")
3680 : 4993753 : (parallel [(const_int 0)]))
3681 : 4993753 : (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
3682 : 6219 : (plus:DF
3683 : 6219 : (vec_select:DF
3684 : 132 : (match_operand:V2DF 2 "vector_operand")
3685 : 132 : (parallel [(const_int 0)]))
3686 : 132 : (vec_select:DF (match_dup 2) (parallel [(const_int 1)])))))]
3687 : 132 : "TARGET_SSE3")
3688 : 129 :
3689 : 129 : (define_insn "*sse3_haddv2df3"
3690 : 1226696 : [(set (match_operand:V2DF 0 "register_operand" "=x,x")
3691 : 1226696 : (vec_concat:V2DF
3692 : 1226696 : (plus:DF
3693 : 129 : (vec_select:DF
3694 : 129 : (match_operand:V2DF 1 "register_operand" "0,x")
3695 : 129 : (parallel [(match_operand:SI 3 "const_0_to_1_operand")]))
3696 : 129 : (vec_select:DF
3697 : 129 : (match_dup 1)
3698 : 129 : (parallel [(match_operand:SI 4 "const_0_to_1_operand")])))
3699 : 129 : (plus:DF
3700 : 130 : (vec_select:DF
3701 : 57426058 : (match_operand:V2DF 2 "vector_operand" "xBm,xjm")
3702 : 57426058 : (parallel [(match_operand:SI 5 "const_0_to_1_operand")]))
3703 : 57426058 : (vec_select:DF
3704 : 130 : (match_dup 2)
3705 : 130 : (parallel [(match_operand:SI 6 "const_0_to_1_operand")])))))]
3706 : 224 : "TARGET_SSE3
3707 : 224 : && INTVAL (operands[3]) != INTVAL (operands[4])
3708 : 223 : && INTVAL (operands[5]) != INTVAL (operands[6])"
3709 : 129 : "@
3710 : 129 : haddpd\t{%2, %0|%0, %2}
3711 : 129 : vhaddpd\t{%2, %1, %0|%0, %1, %2}"
3712 : 152621845 : [(set_attr "isa" "noavx,avx")
3713 : 152621845 : (set_attr "addr" "*,gpr16")
3714 : 152619025 : (set_attr "type" "sseadd")
3715 : 240 : (set_attr "prefix" "orig,vex")
3716 : 243 : (set_attr "mode" "V2DF")])
3717 : 240 :
3718 : 242 : (define_insn "sse3_hsubv2df3"
3719 : 242 : [(set (match_operand:V2DF 0 "register_operand" "=x,x")
3720 : 353 : (vec_concat:V2DF
3721 : 133 : (minus:DF
3722 : 242 : (vec_select:DF
3723 : 1511077 : (match_operand:V2DF 1 "register_operand" "0,x")
3724 : 1511077 : (parallel [(const_int 0)]))
3725 : 1511077 : (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
3726 : 129 : (minus:DF
3727 : 229 : (vec_select:DF
3728 : 232 : (match_operand:V2DF 2 "vector_operand" "xBm,xjm")
3729 : 232 : (parallel [(const_int 0)]))
3730 : 232 : (vec_select:DF (match_dup 2) (parallel [(const_int 1)])))))]
3731 : 232 : "TARGET_SSE3"
3732 : 232 : "@
3733 : 232 : hsubpd\t{%2, %0|%0, %2}
3734 : 2074994 : vhsubpd\t{%2, %1, %0|%0, %1, %2}"
3735 : 2076200 : [(set_attr "isa" "noavx,avx")
3736 : 2076270 : (set_attr "type" "sseadd")
3737 : 2075064 : (set_attr "addr" "*,gpr16")
3738 : 2075064 : (set_attr "prefix" "orig,vex")
3739 : 2075064 : (set_attr "mode" "V2DF")])
3740 : 2074964 :
3741 : 2074964 : (define_insn "*sse3_haddv2df3_low"
3742 : 2074964 : [(set (match_operand:DF 0 "register_operand" "=x,x")
3743 : 2074964 : (plus:DF
3744 : 2074964 : (vec_select:DF
3745 : 2074964 : (match_operand:V2DF 1 "register_operand" "0,x")
3746 : 2074964 : (parallel [(match_operand:SI 2 "const_0_to_1_operand")]))
3747 : 2074964 : (vec_select:DF
3748 : 2074964 : (match_dup 1)
3749 : 2074964 : (parallel [(match_operand:SI 3 "const_0_to_1_operand")]))))]
3750 : 2075054 : "TARGET_SSE3 && TARGET_V2DF_REDUCTION_PREFER_HADDPD
3751 : 2074984 : && INTVAL (operands[2]) != INTVAL (operands[3])"
3752 : 2074964 : "@
3753 : 2074964 : haddpd\t{%0, %0|%0, %0}
3754 : 2074964 : vhaddpd\t{%1, %1, %0|%0, %1, %1}"
3755 : 2074964 : [(set_attr "isa" "noavx,avx")
3756 : 2074964 : (set_attr "type" "sseadd1")
3757 : 2074964 : (set_attr "prefix" "orig,vex")
3758 : 2074964 : (set_attr "mode" "V2DF")])
3759 : 2076499 :
3760 : 2076499 : (define_insn "*sse3_hsubv2df3_low"
3761 : 2074964 : [(set (match_operand:DF 0 "register_operand" "=x,x")
3762 : 2075079 : (minus:DF
3763 : 2075079 : (vec_select:DF
3764 : 2074960 : (match_operand:V2DF 1 "register_operand" "0,x")
3765 : 2074960 : (parallel [(const_int 0)]))
3766 : 2074839 : (vec_select:DF
3767 : 2074839 : (match_dup 1)
3768 : 2074839 : (parallel [(const_int 1)]))))]
3769 : 2074848 : "TARGET_SSE3 && TARGET_V2DF_REDUCTION_PREFER_HADDPD"
3770 : 2074839 : "@
3771 : 2074839 : hsubpd\t{%0, %0|%0, %0}
3772 : 2074839 : vhsubpd\t{%1, %1, %0|%0, %1, %1}"
3773 : 2074835 : [(set_attr "isa" "noavx,avx")
3774 : 2074961 : (set_attr "type" "sseadd1")
3775 : 2074961 : (set_attr "prefix" "orig,vex")
3776 : 2074961 : (set_attr "mode" "V2DF")])
3777 : 2075695 :
3778 : 2075695 : (define_insn "avx_h<insn>v8sf3"
3779 : 2074961 : [(set (match_operand:V8SF 0 "register_operand" "=x")
3780 : 2075076 : (vec_concat:V8SF
3781 : 2075080 : (vec_concat:V4SF
3782 : 2074965 : (vec_concat:V2SF
3783 : 2074965 : (plusminus:SF
3784 : 2074965 : (vec_select:SF
3785 : 2074965 : (match_operand:V8SF 1 "register_operand" "x")
3786 : 2074965 : (parallel [(const_int 0)]))
3787 : 2074965 : (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))
3788 : 2074965 : (plusminus:SF
3789 : 2074965 : (vec_select:SF (match_dup 1) (parallel [(const_int 2)]))
3790 : 2074965 : (vec_select:SF (match_dup 1) (parallel [(const_int 3)]))))
3791 : 2074965 : (vec_concat:V2SF
3792 : 2074965 : (plusminus:SF
3793 : 2074965 : (vec_select:SF
3794 : 2074965 : (match_operand:V8SF 2 "nonimmediate_operand" "xjm")
3795 : 2074965 : (parallel [(const_int 0)]))
3796 : 2074965 : (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))
3797 : 2074965 : (plusminus:SF
3798 : 2074965 : (vec_select:SF (match_dup 2) (parallel [(const_int 2)]))
3799 : 2074965 : (vec_select:SF (match_dup 2) (parallel [(const_int 3)])))))
3800 : 2074965 : (vec_concat:V4SF
3801 : 2074965 : (vec_concat:V2SF
3802 : 2074965 : (plusminus:SF
3803 : 2074965 : (vec_select:SF (match_dup 1) (parallel [(const_int 4)]))
3804 : 2074965 : (vec_select:SF (match_dup 1) (parallel [(const_int 5)])))
3805 : 2074965 : (plusminus:SF
3806 : 2074965 : (vec_select:SF (match_dup 1) (parallel [(const_int 6)]))
3807 : 2074965 : (vec_select:SF (match_dup 1) (parallel [(const_int 7)]))))
3808 : 2074965 : (vec_concat:V2SF
3809 : 2074965 : (plusminus:SF
3810 : 2074965 : (vec_select:SF (match_dup 2) (parallel [(const_int 4)]))
3811 : 2074965 : (vec_select:SF (match_dup 2) (parallel [(const_int 5)])))
3812 : 2074965 : (plusminus:SF
3813 : 2074965 : (vec_select:SF (match_dup 2) (parallel [(const_int 6)]))
3814 : 2074965 : (vec_select:SF (match_dup 2) (parallel [(const_int 7)])))))))]
3815 : 2075121 : "TARGET_AVX"
3816 : 2074965 : "vh<plusminus_mnemonic>ps\t{%2, %1, %0|%0, %1, %2}"
3817 : 2074965 : [(set_attr "type" "sseadd")
3818 : 2074965 : (set_attr "addr" "gpr16")
3819 : 2075067 : (set_attr "prefix" "vex")
3820 : 2075067 : (set_attr "mode" "V8SF")])
3821 : 2075067 :
3822 : 2074965 : (define_insn "sse3_h<insn>v4sf3"
3823 : 2134533 : [(set (match_operand:V4SF 0 "register_operand" "=x,x")
3824 : 2134533 : (vec_concat:V4SF
3825 : 2134533 : (vec_concat:V2SF
3826 : 2134533 : (plusminus:SF
3827 : 2134533 : (vec_select:SF
3828 : 2074965 : (match_operand:V4SF 1 "register_operand" "0,x")
3829 : 2075197 : (parallel [(const_int 0)]))
3830 : 2074965 : (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))
3831 : 2075037 : (plusminus:SF
3832 : 2075037 : (vec_select:SF (match_dup 1) (parallel [(const_int 2)]))
3833 : 2075107 : (vec_select:SF (match_dup 1) (parallel [(const_int 3)]))))
3834 : 2074965 : (vec_concat:V2SF
3835 : 2074965 : (plusminus:SF
3836 : 2074965 : (vec_select:SF
3837 : 2074965 : (match_operand:V4SF 2 "vector_operand" "xBm,xjm")
3838 : 2074965 : (parallel [(const_int 0)]))
3839 : 2074965 : (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))
3840 : 2074965 : (plusminus:SF
3841 : 2074965 : (vec_select:SF (match_dup 2) (parallel [(const_int 2)]))
3842 : 2074965 : (vec_select:SF (match_dup 2) (parallel [(const_int 3)]))))))]
3843 : 2075163 : "TARGET_SSE3"
3844 : 2074965 : "@
3845 : 2074965 : h<plusminus_mnemonic>ps\t{%2, %0|%0, %2}
3846 : 2074965 : vh<plusminus_mnemonic>ps\t{%2, %1, %0|%0, %1, %2}"
3847 : 2074965 : [(set_attr "isa" "noavx,avx")
3848 : 2074965 : (set_attr "type" "sseadd")
3849 : 2074965 : (set_attr "addr" "*,gpr16")
3850 : 2074965 : (set_attr "atom_unit" "complex")
3851 : 2075913 : (set_attr "prefix" "orig,vex")
3852 : 2075913 : (set_attr "prefix_rep" "1,*")
3853 : 2074965 : (set_attr "mode" "V4SF")])
3854 : 2075382 :
3855 : 2075043 : (define_mode_iterator REDUC_SSE_PLUS_MODE
3856 : 2075304 : [(V2DF "TARGET_SSE") (V4SF "TARGET_SSE")
3857 : 2074965 : (V8HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
3858 : 2075175 : (V8HI "TARGET_SSE2") (V4SI "TARGET_SSE2")
3859 : 413 : (V2DI "TARGET_SSE2")])
3860 : 413 :
3861 : 413 : (define_expand "reduc_plus_scal_<mode>"
3862 : 413 : [(plus:REDUC_SSE_PLUS_MODE
3863 : 409 : (match_operand:<ssescalarmode> 0 "register_operand")
3864 : 409 : (match_operand:REDUC_SSE_PLUS_MODE 1 "register_operand"))]
3865 : 619 : ""
3866 : 14337 : {
3867 : 2378926 : rtx tmp = gen_reg_rtx (<MODE>mode);
3868 : 2378926 : ix86_expand_reduc (gen_add<mode>3, tmp, operands[1]);
3869 : 2378720 : emit_insn (gen_vec_extract<mode><ssescalarmodelower> (operands[0], tmp,
3870 : 305 : const0_rtx));
3871 : 14365 : DONE;
3872 : 235 : })
3873 : 2300163 :
3874 : 200 : (define_expand "reduc_plus_scal_v16qi"
3875 : 200 : [(plus:V16QI
3876 : 200 : (match_operand:QI 0 "register_operand")
3877 : 200 : (match_operand:V16QI 1 "register_operand"))]
3878 : 200 : "TARGET_SSE2"
3879 : 1061 : {
3880 : 1061 : rtx tmp = gen_reg_rtx (V1TImode);
3881 : 1064 : emit_insn (gen_sse2_lshrv1ti3 (tmp, gen_lowpart (V1TImode, operands[1]),
3882 : 10668938 : GEN_INT (64)));
3883 : 10669799 : rtx tmp2 = gen_reg_rtx (V16QImode);
3884 : 10669799 : emit_insn (gen_addv16qi3 (tmp2, operands[1], gen_lowpart (V16QImode, tmp)));
3885 : 1064 : rtx tmp3 = gen_reg_rtx (V16QImode);
3886 : 1064 : emit_move_insn (tmp3, CONST0_RTX (V16QImode));
3887 : 1064 : rtx tmp4 = gen_reg_rtx (V2DImode);
3888 : 1064 : emit_insn (gen_sse2_psadbw (tmp4, tmp2, tmp3));
3889 : 1064 : tmp4 = gen_lowpart (V16QImode, tmp4);
3890 : 2740 : emit_insn (gen_vec_extractv16qiqi (operands[0], tmp4, const0_rtx));
3891 : 1061 : DONE;
3892 : 200 : })
3893 : 209037 :
3894 : 209037 : (define_mode_iterator REDUC_PLUS_MODE
3895 : 209037 : [(V4DF "TARGET_AVX") (V8SF "TARGET_AVX")
3896 : 209037 : (V16HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
3897 : 1809 : (V8DF "TARGET_AVX512F && TARGET_EVEX512")
3898 : 1809 : (V16SF "TARGET_AVX512F && TARGET_EVEX512")
3899 : 133 : (V32HF "TARGET_AVX512FP16 && TARGET_AVX512VL && TARGET_EVEX512")
3900 : 133 : (V32QI "TARGET_AVX") (V16HI "TARGET_AVX")
3901 : 209 : (V8SI "TARGET_AVX") (V4DI "TARGET_AVX")
3902 : 209 : (V64QI "TARGET_AVX512F && TARGET_EVEX512")
3903 : 209 : (V32HI "TARGET_AVX512F && TARGET_EVEX512")
3904 : 209 : (V16SI "TARGET_AVX512F && TARGET_EVEX512")
3905 : 495528 : (V8DI "TARGET_AVX512F && TARGET_EVEX512")])
3906 : 495528 :
3907 : 209 : (define_expand "reduc_plus_scal_<mode>"
3908 : 209 : [(plus:REDUC_PLUS_MODE
3909 : 209 : (match_operand:<ssescalarmode> 0 "register_operand")
3910 : 210 : (match_operand:REDUC_PLUS_MODE 1 "register_operand"))]
3911 : 209 : ""
3912 : 5450 : {
3913 : 4740 : rtx tmp = gen_reg_rtx (<ssehalfvecmode>mode);
3914 : 5451 : rtx tmp2 = gen_reg_rtx (<ssehalfvecmode>mode);
3915 : 5666 : rtx tmp3 = gen_reg_rtx (<ssehalfvecmode>mode);
3916 : 5666 : emit_insn (gen_vec_extract_hi_<mode> (tmp, operands[1]));
3917 : 5666 : emit_insn (gen_vec_extract_lo_<mode> (tmp2, operands[1]));
3918 : 5451 : emit_insn (gen_add<ssehalfvecmodelower>3 (tmp3, tmp, tmp2));
3919 : 5450 : emit_insn (gen_reduc_plus_scal_<ssehalfvecmodelower> (operands[0], tmp3));
3920 : 5450 : DONE;
3921 : 412 : })
3922 : 209 :
3923 : 209 : ;; Modes handled by reduc_sm{in,ax}* patterns.
3924 : 209 : (define_mode_iterator REDUC_SSE_SMINMAX_MODE
3925 : 412 : [(V8HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
3926 : 209 : (V4SF "TARGET_SSE") (V2DF "TARGET_SSE")
3927 : 209 : (V4SI "TARGET_SSE2") (V8HI "TARGET_SSE2") (V16QI "TARGET_SSE2")
3928 : 209 : (V2DI "TARGET_SSE4_2")])
3929 : 209 :
3930 : 209 : (define_expand "reduc_<code>_scal_<mode>"
3931 : 209 : [(smaxmin:REDUC_SSE_SMINMAX_MODE
3932 : 209 : (match_operand:<ssescalarmode> 0 "register_operand")
3933 : 209 : (match_operand:REDUC_SSE_SMINMAX_MODE 1 "register_operand"))]
3934 : 66621 : ""
3935 : 66956 : {
3936 : 67291 : rtx tmp = gen_reg_rtx (<MODE>mode);
3937 : 66956 : ix86_expand_reduc (gen_<code><mode>3, tmp, operands[1]);
3938 : 544 : emit_insn (gen_vec_extract<mode><ssescalarmodelower> (operands[0], tmp,
3939 : 1159 : const0_rtx));
3940 : 544 : DONE;
3941 : 209 : })
3942 : 1159 :
3943 : 1159 : (define_mode_iterator REDUC_SMINMAX_MODE
3944 : 1159 : [(V32QI "TARGET_AVX2") (V16HI "TARGET_AVX2")
3945 : 1159 : (V16HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
3946 : 154924 : (V8SI "TARGET_AVX2") (V4DI "TARGET_AVX2")
3947 : 154924 : (V8SF "TARGET_AVX") (V4DF "TARGET_AVX")
3948 : 153974 : (V64QI "TARGET_AVX512BW && TARGET_EVEX512")
3949 : 209 : (V32HF "TARGET_AVX512FP16 && TARGET_AVX512VL && TARGET_EVEX512")
3950 : 209 : (V32HI "TARGET_AVX512BW && TARGET_EVEX512")
3951 : 209 : (V16SI "TARGET_AVX512F && TARGET_EVEX512")
3952 : 209 : (V8DI "TARGET_AVX512F && TARGET_EVEX512")
3953 : 209 : (V16SF "TARGET_AVX512F && TARGET_EVEX512")
3954 : 209 : (V8DF "TARGET_AVX512F && TARGET_EVEX512")])
3955 : 209 :
3956 : 209 : (define_expand "reduc_<code>_scal_<mode>"
3957 : 210 : [(smaxmin:REDUC_SMINMAX_MODE
3958 : 210 : (match_operand:<ssescalarmode> 0 "register_operand")
3959 : 316 : (match_operand:REDUC_SMINMAX_MODE 1 "register_operand"))]
3960 : 210 : ""
3961 : 231 : {
3962 : 359 : rtx tmp = gen_reg_rtx (<ssehalfvecmode>mode);
3963 : 337 : rtx tmp2 = gen_reg_rtx (<ssehalfvecmode>mode);
3964 : 232 : rtx tmp3 = gen_reg_rtx (<ssehalfvecmode>mode);
3965 : 231 : emit_insn (gen_vec_extract_hi_<mode> (tmp, operands[1]));
3966 : 231 : emit_insn (gen_vec_extract_lo_<mode> (tmp2, operands[1]));
3967 : 337 : emit_insn (gen_<code><ssehalfvecmodelower>3 (tmp3, tmp, tmp2));
3968 : 232 : emit_insn (gen_reduc_<code>_scal_<ssehalfvecmodelower> (operands[0], tmp3));
3969 : 231 : DONE;
3970 : 209 : })
3971 : 209 :
3972 : 210 : (define_expand "reduc_<code>_scal_<mode>"
3973 : 209 : [(umaxmin:VI_AVX512BW
3974 : 209 : (match_operand:<ssescalarmode> 0 "register_operand")
3975 : 209 : (match_operand:VI_AVX512BW 1 "register_operand"))]
3976 : 209 : "TARGET_AVX512F"
3977 : 209 : {
3978 : 209 : rtx tmp = gen_reg_rtx (<ssehalfvecmode>mode);
3979 : 209 : rtx tmp2 = gen_reg_rtx (<ssehalfvecmode>mode);
3980 : 209 : rtx tmp3 = gen_reg_rtx (<ssehalfvecmode>mode);
3981 : 230 : emit_insn (gen_vec_extract_hi_<mode> (tmp, operands[1]));
3982 : 230 : emit_insn (gen_vec_extract_lo_<mode> (tmp2, operands[1]));
3983 : 230 : emit_insn (gen_<code><ssehalfvecmodelower>3 (tmp3, tmp, tmp2));
3984 : 230 : emit_insn (gen_reduc_<code>_scal_<ssehalfvecmodelower> (operands[0], tmp3));
3985 : 230 : DONE;
3986 : 209 : })
3987 : 209 :
3988 : 222 : (define_expand "reduc_<code>_scal_<mode>"
3989 : 230 : [(umaxmin:VI_256
3990 : 209 : (match_operand:<ssescalarmode> 0 "register_operand")
3991 : 222 : (match_operand:VI_256 1 "register_operand"))]
3992 : 222 : "TARGET_AVX2"
3993 : 236 : {
3994 : 236 : rtx tmp = gen_reg_rtx (<ssehalfvecmode>mode);
3995 : 217 : rtx tmp2 = gen_reg_rtx (<ssehalfvecmode>mode);
3996 : 229 : rtx tmp3 = gen_reg_rtx (<ssehalfvecmode>mode);
3997 : 216 : emit_insn (gen_vec_extract_hi_<mode> (tmp, operands[1]));
3998 : 216 : emit_insn (gen_vec_extract_lo_<mode> (tmp2, operands[1]));
3999 : 216 : emit_insn (gen_<code><ssehalfvecmodelower>3 (tmp3, tmp, tmp2));
4000 : 216 : rtx tmp4 = gen_reg_rtx (<ssehalfvecmode>mode);
4001 : 216 : ix86_expand_reduc (gen_<code><ssehalfvecmodelower>3, tmp4, tmp3);
4002 : 10364 : emit_insn (gen_vec_extract<ssehalfvecmodelower><ssescalarmodelower>
4003 : 10357 : (operands[0], tmp4, const0_rtx));
4004 : 10370 : DONE;
4005 : 209 : })
4006 : 209 :
4007 : 222 : (define_expand "reduc_umin_scal_v8hi"
4008 : 325 : [(umin:V8HI
4009 : 222 : (match_operand:HI 0 "register_operand")
4010 : 222 : (match_operand:V8HI 1 "register_operand"))]
4011 : 222 : "TARGET_SSE4_1"
4012 : 222 : {
4013 : 213 : rtx tmp = gen_reg_rtx (V8HImode);
4014 : 213 : ix86_expand_reduc (gen_uminv8hi3, tmp, operands[1]);
4015 : 213 : emit_insn (gen_vec_extractv8hihi (operands[0], tmp, const0_rtx));
4016 : 213 : DONE;
4017 : 11484 : })
4018 : 11484 :
4019 : 11484 : (define_insn "<mask_codefor>reducep<mode><mask_name><round_saeonly_name>"
4020 : 11484 : [(set (match_operand:VFH_AVX512VL 0 "register_operand" "=v")
4021 : 11484 : (unspec:VFH_AVX512VL
4022 : 209 : [(match_operand:VFH_AVX512VL 1 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")
4023 : 4079 : (match_operand:SI 2 "const_0_to_255_operand")]
4024 : 209 : UNSPEC_REDUCE))]
4025 : 6568 : "(TARGET_AVX512DQ || (VALID_AVX512FP16_REG_MODE (<MODE>mode))) && <round_saeonly_mode_condition>"
4026 : 4079 : "vreduce<ssemodesuffix>\t{%2, <round_saeonly_mask_op3>%1, %0<mask_operand3>|%0<mask_operand3>, %1<round_saeonly_mask_op3>, %2}"
4027 : 4079 : [(set_attr "type" "sse")
4028 : 4079 : (set_attr "prefix" "evex")
4029 : 5793 : (set_attr "mode" "<MODE>")])
4030 : 4079 :
4031 : 4834 : (define_insn "reduces<mode><mask_scalar_name><round_saeonly_scalar_name>"
4032 : 209 : [(set (match_operand:VFH_128 0 "register_operand" "=v")
4033 : 209 : (vec_merge:VFH_128
4034 : 209 : (unspec:VFH_128
4035 : 380 : [(match_operand:VFH_128 1 "register_operand" "v")
4036 : 209 : (match_operand:VFH_128 2 "<round_saeonly_scalar_nimm_predicate>" "<round_saeonly_scalar_constraint>")
4037 : 1974 : (match_operand:SI 3 "const_0_to_255_operand")]
4038 : 1529 : UNSPEC_REDUCE)
4039 : 1529 : (match_dup 1)
4040 : 1529 : (const_int 1)))]
4041 : 2644 : "TARGET_AVX512DQ || (VALID_AVX512FP16_REG_MODE (<MODE>mode))"
4042 : 1529 : "vreduce<ssescalarmodesuffix>\t{%3, <round_saeonly_scalar_mask_op4>%2, %1, %0<mask_scalar_operand4>|%0<mask_scalar_operand4>, %1, %<iptr>2<round_saeonly_scalar_mask_op4>, %3}"
4043 : 380 : [(set_attr "type" "sse")
4044 : 209 : (set_attr "prefix" "evex")
4045 : 758 : (set_attr "mode" "<MODE>")])
4046 : 1724 :
4047 : 209 : (define_expand "reduc_<code>_scal_<mode>"
4048 : 209 : [(any_logic:VI_128
4049 : 209 : (match_operand:<ssescalarmode> 0 "register_operand")
4050 : 209 : (match_operand:VI_128 1 "register_operand"))]
4051 : 209 : "TARGET_SSE2"
4052 : 5238 : {
4053 : 4248 : rtx tmp = gen_reg_rtx (<MODE>mode);
4054 : 5234 : ix86_expand_reduc (gen_<code><mode>3, tmp, operands[1]);
4055 : 105361 : emit_insn (gen_vec_extract<mode><ssescalarmodelower> (operands[0],
4056 : 100332 : tmp, const0_rtx));
4057 : 105361 : DONE;
4058 : 100332 : })
4059 : 100332 :
4060 : 100332 : (define_mode_iterator REDUC_ANY_LOGIC_MODE
4061 : 100332 : [(V32QI "TARGET_AVX") (V16HI "TARGET_AVX")
4062 : 100328 : (V8SI "TARGET_AVX") (V4DI "TARGET_AVX")
4063 : 79 : (V64QI "TARGET_AVX512F && TARGET_EVEX512")
4064 : 79 : (V32HI "TARGET_AVX512F && TARGET_EVEX512")
4065 : 79 : (V16SI "TARGET_AVX512F && TARGET_EVEX512")
4066 : 74653 : (V8DI "TARGET_AVX512F && TARGET_EVEX512")])
4067 : 79 :
4068 : 79 : (define_expand "reduc_<code>_scal_<mode>"
4069 : 79 : [(any_logic:REDUC_ANY_LOGIC_MODE
4070 : 20718 : (match_operand:<ssescalarmode> 0 "register_operand")
4071 : 79 : (match_operand:REDUC_ANY_LOGIC_MODE 1 "register_operand"))]
4072 : 79 : ""
4073 : 309 : {
4074 : 13918 : rtx tmp = gen_reg_rtx (<ssehalfvecmode>mode);
4075 : 309 : rtx tmp2 = gen_reg_rtx (<ssehalfvecmode>mode);
4076 : 1295 : rtx tmp3 = gen_reg_rtx (<ssehalfvecmode>mode);
4077 : 309 : emit_insn (gen_vec_extract_hi_<mode> (tmp, operands[1]));
4078 : 309 : emit_insn (gen_vec_extract_lo_<mode> (tmp2, operands[1]));
4079 : 309 : emit_insn (gen_<code><ssehalfvecmodelower>3 (tmp3, tmp, tmp2));
4080 : 1515 : emit_insn (gen_reduc_<code>_scal_<ssehalfvecmodelower> (operands[0], tmp3));
4081 : 309 : DONE;
4082 : 1286 : })
4083 : 15697 :
4084 : 15697 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4085 : 14491 : ;;
4086 : 14491 : ;; Parallel floating point comparisons
4087 : 80 : ;;
4088 : 80 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4089 : 80 :
4090 : 14310 : (define_insn "avx_cmp<mode>3"
4091 : 80 : [(set (match_operand:VF_128_256 0 "register_operand" "=x,x")
4092 : 80 : (unspec:VF_128_256
4093 : 80 : [(match_operand:VF_128_256 1 "register_operand" "0,x")
4094 : 80 : (match_operand:VF_128_256 2 "nonimmediate_operand" "xm,xjm")
4095 : 80 : (match_operand:SI 3 "cmpps_imm_operand")]
4096 : 80 : UNSPEC_PCMP))]
4097 : 546 : "TARGET_SSE"
4098 : 80 : "@
4099 : 66887 : cmp<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}
4100 : 66897 : vcmp<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4101 : 67819 : [(set_attr "isa" "noavx,avx")
4102 : 979 : (set_attr "type" "ssecmp")
4103 : 1022 : (set_attr "addr" "*,gpr16")
4104 : 89 : (set_attr "length_immediate" "1")
4105 : 54637 : (set_attr "prefix" "orig,vex")
4106 : 122 : (set_attr "mode" "<MODE>")])
4107 : 122 :
4108 : 89 : (define_insn_and_split "*avx_cmp<mode>3_1"
4109 : 54627 : [(set (match_operand:<sseintvecmode> 0 "register_operand")
4110 : 112 : (vec_merge:<sseintvecmode>
4111 : 106 : (match_operand:<sseintvecmode> 1 "vector_all_ones_operand")
4112 : 112 : (match_operand:<sseintvecmode> 2 "const0_operand")
4113 : 85 : (unspec:<avx512fmaskmode>
4114 : 112 : [(match_operand:VF_128_256 3 "register_operand")
4115 : 85 : (match_operand:VF_128_256 4 "nonimmediate_operand")
4116 : 85 : (match_operand:SI 5 "const_0_to_31_operand")]
4117 : 85 : UNSPEC_PCMP)))]
4118 : 865674 : "TARGET_AVX512VL && ix86_pre_reload_split ()"
4119 : 865566 : "#"
4120 : 865566 : "&& 1"
4121 : 865593 : [(set (match_dup 6)
4122 : 865584 : (unspec:VF_128_256
4123 : 865586 : [(match_dup 3)
4124 : 865589 : (match_dup 4)
4125 : 865589 : (match_dup 5)]
4126 : 865562 : UNSPEC_PCMP))
4127 : 865562 : (set (match_dup 0) (match_dup 7))]
4128 : 865589 : {
4129 : 865675 : operands[6] = gen_reg_rtx (<MODE>mode);
4130 : 865675 : operands[7]
4131 : 865675 : = lowpart_subreg (GET_MODE (operands[0]), operands[6], <MODE>mode);
4132 : 865654 : })
4133 : 865654 :
4134 : 865654 : (define_insn_and_split "*avx_cmp<mode>3_2"
4135 : 865673 : [(set (match_operand:<sseintvecmode> 0 "register_operand")
4136 : 865587 : (vec_merge:<sseintvecmode>
4137 : 865587 : (match_operand:<sseintvecmode> 1 "vector_all_ones_operand")
4138 : 865587 : (match_operand:<sseintvecmode> 2 "const0_operand")
4139 : 865587 : (not:<avx512fmaskmode>
4140 : 865587 : (unspec:<avx512fmaskmode>
4141 : 106 : [(match_operand:VF_128_256 3 "register_operand")
4142 : 106 : (match_operand:VF_128_256 4 "nonimmediate_operand")
4143 : 122 : (match_operand:SI 5 "const_0_to_31_operand")]
4144 : 122 : UNSPEC_PCMP))))]
4145 : 122 : "TARGET_AVX512VL && ix86_pre_reload_split ()"
4146 : 122 : "#"
4147 : 106 : "&& 1"
4148 : 106 : [(set (match_dup 6)
4149 : 185 : (unspec:VF_128_256
4150 : 185 : [(match_dup 3)
4151 : 185 : (match_dup 4)
4152 : 158 : (match_dup 5)]
4153 : 158 : UNSPEC_PCMP))
4154 : 158 : (set (match_dup 0) (match_dup 7))]
4155 : 79 : {
4156 : 79 : operands[5] = GEN_INT (INTVAL (operands[5]) ^ 4);
4157 : 79 : operands[6] = gen_reg_rtx (<MODE>mode);
4158 : 168 : operands[7]
4159 : 79 : = lowpart_subreg (GET_MODE (operands[0]), operands[6], <MODE>mode);
4160 : 30 : })
4161 : 30 :
4162 : 103 : (define_insn_and_split "*avx_cmp<mode>3_3"
4163 : 76 : [(set (match_operand:VF_128_256 0 "register_operand")
4164 : 76 : (vec_merge:VF_128_256
4165 : 76 : (match_operand:VF_128_256 1 "float_vector_all_ones_operand")
4166 : 76 : (match_operand:VF_128_256 2 "const0_operand")
4167 : 10739 : (unspec:<avx512fmaskmode>
4168 : 10745 : [(match_operand:VF_128_256 3 "register_operand")
4169 : 10739 : (match_operand:VF_128_256 4 "nonimmediate_operand")
4170 : 10745 : (match_operand:SI 5 "const_0_to_31_operand")]
4171 : 10745 : UNSPEC_PCMP)))]
4172 : 10769 : "TARGET_AVX512VL && ix86_pre_reload_split ()"
4173 : 10745 : "#"
4174 : 10745 : "&& 1"
4175 : 10745 : [(set (match_dup 0)
4176 : 10757 : (unspec:VF_128_256
4177 : 10751 : [(match_dup 3)
4178 : 85 : (match_dup 4)
4179 : 100 : (match_dup 5)]
4180 : 82 : UNSPEC_PCMP))])
4181 : 82 :
4182 : 6 : (define_insn_and_split "*avx_cmp<mode>3_4"
4183 : 6 : [(set (match_operand:VF_128_256 0 "register_operand")
4184 : 6 : (vec_merge:VF_128_256
4185 : 6 : (match_operand:VF_128_256 1 "float_vector_all_ones_operand")
4186 : 528141 : (match_operand:VF_128_256 2 "const0_operand")
4187 : 528141 : (not:<avx512fmaskmode>
4188 : 528141 : (unspec:<avx512fmaskmode>
4189 : 6 : [(match_operand:VF_128_256 3 "register_operand")
4190 : 6 : (match_operand:VF_128_256 4 "nonimmediate_operand")
4191 : 6 : (match_operand:SI 5 "const_0_to_31_operand")]
4192 : 525532 : UNSPEC_PCMP))))]
4193 : 0 : "TARGET_AVX512VL && ix86_pre_reload_split ()"
4194 : 0 : "#"
4195 : : "&& 1"
4196 : 525562 : [(set (match_dup 0)
4197 : 0 : (unspec:VF_128_256
4198 : 42 : [(match_dup 3)
4199 : 48 : (match_dup 4)
4200 : 48 : (match_dup 5)]
4201 : 48 : UNSPEC_PCMP))]
4202 : 42 : "operands[5] = GEN_INT (INTVAL (operands[5]) ^ 4);")
4203 : 310757 :
4204 : 310757 : (define_insn_and_split "*avx_cmp<mode>3_lt"
4205 : 311349 : [(set (match_operand:VF_128_256 0 "register_operand")
4206 : 676 : (vec_merge:VF_128_256
4207 : 2167 : (match_operand:VF_128_256 1 "vector_operand")
4208 : 2157 : (match_operand:VF_128_256 2 "vector_operand")
4209 : 2167 : (unspec:<avx512fmaskmode>
4210 : 2167 : [(match_operand:<sseintvecmode> 3 "register_operand")
4211 : 644 : (match_operand:<sseintvecmode> 4 "const0_operand")
4212 : 1801 : (match_operand:SI 5 "const_0_to_7_operand")]
4213 : 1801 : UNSPEC_PCMP)))]
4214 : 728 : "TARGET_AVX512VL && ix86_pre_reload_split ()
4215 : 1791 : /* LT or GE 0 */
4216 : 1896 : && ((INTVAL (operands[5]) == 1) || (INTVAL (operands[5]) == 5))"
4217 : 644 : "#"
4218 : 646 : "&& 1"
4219 : 676 : [(set (match_dup 0)
4220 : 18 : (unspec:VF_128_256
4221 : 18 : [(match_dup 2)
4222 : 36 : (match_dup 1)
4223 : 32 : (lt:VF_128_256
4224 : 0 : (match_dup 3)
4225 : 14 : (match_dup 4))]
4226 : 14 : UNSPEC_BLENDV))]
4227 : 56 : {
4228 : 1470844 : if (INTVAL (operands[5]) == 5)
4229 : 1470812 : std::swap (operands[1], operands[2]);
4230 : 1470844 : operands[2] = force_reg (<MODE>mode, operands[2]);
4231 : 1470802 : })
4232 : 1470824 :
4233 : 1470802 : (define_insn_and_split "*avx_cmp<mode>3_ltint"
4234 : 1470866 : [(set (match_operand:VI48_AVX 0 "register_operand")
4235 : 1470866 : (vec_merge:VI48_AVX
4236 : 1470866 : (match_operand:VI48_AVX 1 "vector_operand")
4237 : 1470866 : (match_operand:VI48_AVX 2 "vector_operand")
4238 : 1470866 : (unspec:<avx512fmaskmode>
4239 : 1470866 : [(match_operand:VI48_AVX 3 "register_operand")
4240 : 1470866 : (match_operand:VI48_AVX 4 "const0_operand")
4241 : 1470844 : (match_operand:SI 5 "const_0_to_7_operand")]
4242 : 1470866 : UNSPEC_PCMP)))]
4243 : 1470903 : "TARGET_AVX512VL && ix86_pre_reload_split ()
4244 : 1470830 : /* LT or GE 0 */
4245 : 1470899 : && ((INTVAL (operands[5]) == 1) || (INTVAL (operands[5]) == 5))"
4246 : 1470788 : "#"
4247 : 1470788 : "&& 1"
4248 : 1470808 : [(set (match_dup 0)
4249 : 1470807 : (unspec:<ssebytemode>
4250 : 1470807 : [(match_dup 2)
4251 : 1470876 : (match_dup 1)
4252 : 1470867 : (subreg:<ssebytemode>
4253 : 1470893 : (lt:VI48_AVX
4254 : 1470893 : (match_dup 3)
4255 : 1470830 : (match_dup 4)) 0)]
4256 : 1470788 : UNSPEC_BLENDV))]
4257 : 1470808 : {
4258 : 1470808 : if (INTVAL (operands[5]) == 5)
4259 : 1470800 : std::swap (operands[1], operands[2]);
4260 : 1470808 : operands[0] = gen_lowpart (<ssebytemode>mode, operands[0]);
4261 : 1470810 : operands[1] = gen_lowpart (<ssebytemode>mode, operands[1]);
4262 : 1470808 : operands[2] = force_reg (<ssebytemode>mode,
4263 : 1470810 : gen_lowpart (<ssebytemode>mode, operands[2]));
4264 : 1470790 : })
4265 : 1470790 :
4266 : 1470790 : (define_insn_and_split "*avx_cmp<mode>3_ltint_not"
4267 : 1470810 : [(set (match_operand:VI48_AVX 0 "register_operand")
4268 : 1470810 : (vec_merge:VI48_AVX
4269 : 1470810 : (match_operand:VI48_AVX 1 "vector_operand")
4270 : 1470810 : (match_operand:VI48_AVX 2 "vector_operand")
4271 : 1470808 : (unspec:<avx512fmaskmode>
4272 : 1470810 : [(subreg:VI48_AVX
4273 : 1470808 : (not:<ssebytemode>
4274 : 1470808 : (match_operand:<ssebytemode> 3 "vector_operand")) 0)
4275 : 1470808 : (match_operand:VI48_AVX 4 "const0_operand")
4276 : 1470808 : (match_operand:SI 5 "const_0_to_7_operand")]
4277 : 1470808 : UNSPEC_PCMP)))]
4278 : 1470812 : "TARGET_AVX512VL && ix86_pre_reload_split ()
4279 : 1470788 : /* not LT or GE 0 */
4280 : 1470800 : && ((INTVAL (operands[5]) == 1) || (INTVAL (operands[5]) == 5))"
4281 : 1470788 : "#"
4282 : 1470788 : "&& 1"
4283 : 1470788 : [(set (match_dup 0)
4284 : 1470800 : (unspec:<ssebytemode>
4285 : 1470788 : [(match_dup 1)
4286 : 1470791 : (match_dup 2)
4287 : 1470791 : (subreg:<ssebytemode>
4288 : 1470808 : (lt:VI48_AVX
4289 : 1470808 : (match_dup 3)
4290 : 1470808 : (match_dup 4)) 0)]
4291 : 1470788 : UNSPEC_BLENDV))]
4292 : 1470800 : {
4293 : 1470800 : if (INTVAL (operands[5]) == 5)
4294 : 1470794 : std::swap (operands[1], operands[2]);
4295 : 1470800 : operands[0] = gen_lowpart (<ssebytemode>mode, operands[0]);
4296 : 1470808 : operands[1] = force_reg (<ssebytemode>mode,
4297 : 1470800 : gen_lowpart (<ssebytemode>mode, operands[1]));
4298 : 1470808 : operands[2] = gen_lowpart (<ssebytemode>mode, operands[2]);
4299 : 1470796 :
4300 : 1470808 : operands[3] = force_reg (<ssebytemode>mode, operands[3]);
4301 : 1470808 : operands[3] = lowpart_subreg (<MODE>mode, operands[3], <ssebytemode>mode);
4302 : 1470796 : })
4303 : 1470796 :
4304 : 1470796 : (define_insn "avx_vmcmp<mode>3"
4305 : 1470808 : [(set (match_operand:VF_128 0 "register_operand" "=x,x")
4306 : 1470800 : (vec_merge:VF_128
4307 : 1470808 : (unspec:VF_128
4308 : 1470800 : [(match_operand:VF_128 1 "register_operand" "0,x")
4309 : 1470800 : (match_operand:VF_128 2 "nonimmediate_operand" "xm,xjm")
4310 : 1470800 : (match_operand:SI 3 "cmpps_imm_operand")]
4311 : 1470800 : UNSPEC_PCMP)
4312 : 1470800 : (match_dup 1)
4313 : 1470800 : (const_int 1)))]
4314 : 1471308 : "TARGET_SSE"
4315 : 1470800 : "@
4316 : 1470788 : cmp<ssescalarmodesuffix>\t{%3, %2, %0|%0, %<iptr>2, %3}
4317 : 1470788 : vcmp<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %<iptr>2, %3}"
4318 : 1471304 : [(set_attr "isa" "noavx,avx")
4319 : 1471304 : (set_attr "type" "ssecmp")
4320 : 1470788 : (set_attr "addr" "*,gpr16")
4321 : 1470788 : (set_attr "length_immediate" "1")
4322 : 1470788 : (set_attr "prefix" "orig,vex")
4323 : 1470788 : (set_attr "mode" "<ssescalarmode>")])
4324 : 1470788 :
4325 : 1470788 : (define_insn "*<sse>_maskcmp<mode>3_comm"
4326 : 1470800 : [(set (match_operand:VF_128_256 0 "register_operand" "=x,x")
4327 : 1470800 : (match_operator:VF_128_256 3 "sse_comparison_operator"
4328 : 1470800 : [(match_operand:VF_128_256 1 "register_operand" "%0,x")
4329 : 1470788 : (match_operand:VF_128_256 2 "vector_operand" "xBm,xjm")]))]
4330 : 1530735 : "TARGET_SSE
4331 : 1541100 : && GET_RTX_CLASS (GET_CODE (operands[3])) == RTX_COMM_COMPARE"
4332 : 1470788 : "@
4333 : 1480289 : cmp%D3<ssemodesuffix>\t{%2, %0|%0, %2}
4334 : 1470794 : vcmp%D3<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
4335 : 1470788 : [(set_attr "isa" "noavx,avx")
4336 : 1470794 : (set_attr "addr" "*,gpr16")
4337 : 1470794 : (set_attr "type" "ssecmp")
4338 : 1470795 : (set_attr "length_immediate" "1")
4339 : 1470795 : (set_attr "prefix" "orig,vex")
4340 : 1470795 : (set_attr "mode" "<MODE>")])
4341 : 1470795 :
4342 : 1470795 : (define_insn "<sse>_maskcmp<mode>3"
4343 : 1470795 : [(set (match_operand:VF_128_256 0 "register_operand" "=x,x")
4344 : 1470788 : (match_operator:VF_128_256 3 "sse_comparison_operator"
4345 : 1470794 : [(match_operand:VF_128_256 1 "register_operand" "0,x")
4346 : 1470789 : (match_operand:VF_128_256 2 "vector_operand" "xBm,xjm")]))]
4347 : 1470789 : "TARGET_SSE"
4348 : 1470789 : "@
4349 : 1470788 : cmp%D3<ssemodesuffix>\t{%2, %0|%0, %2}
4350 : 1470789 : vcmp%D3<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
4351 : 1470789 : [(set_attr "isa" "noavx,avx")
4352 : 1473178 : (set_attr "addr" "*,gpr16")
4353 : 1473178 : (set_attr "type" "ssecmp")
4354 : 1470789 : (set_attr "length_immediate" "1")
4355 : 1472333 : (set_attr "prefix" "orig,vex")
4356 : 1470788 : (set_attr "mode" "<MODE>")])
4357 : 1470788 :
4358 : 1470801 : (define_insn "<sse>_vmmaskcmp<mode>3"
4359 : 1470788 : [(set (match_operand:VF_128 0 "register_operand" "=x,x")
4360 : 1470801 : (vec_merge:VF_128
4361 : 1470801 : (match_operator:VF_128 3 "sse_comparison_operator"
4362 : 1470801 : [(match_operand:VF_128 1 "register_operand" "0,x")
4363 : 1470801 : (match_operand:VF_128 2 "nonimmediate_operand" "xm,xjm")])
4364 : 1470801 : (match_dup 1)
4365 : 1470788 : (const_int 1)))]
4366 : 1471867 : "TARGET_SSE"
4367 : 1470801 : "@
4368 : 1470801 : cmp%D3<ssescalarmodesuffix>\t{%2, %0|%0, %<iptr>2}
4369 : 1470788 : vcmp%D3<ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %<iptr>2}"
4370 : 1472021 : [(set_attr "isa" "noavx,avx")
4371 : 1472034 : (set_attr "addr" "*,gpr16")
4372 : 1472034 : (set_attr "type" "ssecmp")
4373 : 1470801 : (set_attr "length_immediate" "1,*")
4374 : 1470801 : (set_attr "prefix" "orig,vex")
4375 : 1470801 : (set_attr "mode" "<ssescalarmode>")])
4376 : 1470788 :
4377 : 1470788 : (define_mode_attr cmp_imm_predicate
4378 : 1470788 : [(V32HF "const_0_to_31_operand") (V16SF "const_0_to_31_operand") (V8DF "const_0_to_31_operand")
4379 : 1470788 : (V16SI "const_0_to_7_operand") (V8DI "const_0_to_7_operand")
4380 : 1470788 : (V16HF "const_0_to_31_operand") (V8SF "const_0_to_31_operand") (V4DF "const_0_to_31_operand")
4381 : 1470788 : (V8SI "const_0_to_7_operand") (V4DI "const_0_to_7_operand")
4382 : 1470788 : (V8HF "const_0_to_31_operand") (V4SF "const_0_to_31_operand") (V2DF "const_0_to_31_operand")
4383 : 1470789 : (V4SI "const_0_to_7_operand") (V2DI "const_0_to_7_operand")
4384 : 1470789 : (V32HI "const_0_to_7_operand") (V64QI "const_0_to_7_operand")
4385 : 1470788 : (V16HI "const_0_to_7_operand") (V32QI "const_0_to_7_operand")
4386 : 1470789 : (V8HI "const_0_to_7_operand") (V16QI "const_0_to_7_operand")])
4387 : 1470789 :
4388 : 1470872 : (define_insn "<avx512>_cmp<mode>3<mask_scalar_merge_name><round_saeonly_name>"
4389 : 1470872 : [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=k")
4390 : 1470872 : (unspec:<avx512fmaskmode>
4391 : 1470872 : [(match_operand:V48H_AVX512VL 1 "register_operand" "v")
4392 : 1470872 : (match_operand:V48H_AVX512VL 2 "nonimmediate_operand" "<round_saeonly_constraint>")
4393 : 1470789 : (match_operand:SI 3 "<cmp_imm_predicate>" "n")]
4394 : 1470789 : UNSPEC_PCMP))]
4395 : 1530278 : "TARGET_AVX512F && <round_saeonly_mode_condition>"
4396 : 1470871 : "v<ssecmpintprefix>cmp<ssemodesuffix>\t{%3, <round_saeonly_mask_scalar_merge_op4>%2, %1, %0<mask_scalar_merge_operand4>|%0<mask_scalar_merge_operand4>, %1, %2<round_saeonly_mask_scalar_merge_op4>, %3}"
4397 : 1470871 : [(set_attr "type" "ssecmp")
4398 : 1470788 : (set_attr "length_immediate" "1")
4399 : 1470871 : (set_attr "prefix" "evex")
4400 : 1470871 : (set_attr "mode" "<sseinsnmode>")])
4401 : 1471401 :
4402 : 1470871 : ;; Since vpcmpd implicitly clear the upper bits of dest, transform
4403 : 1470871 : ;; vpcmpd + zero_extend to vpcmpd since the instruction
4404 : 1470788 : (define_insn "*<avx512>_cmp<V48H_AVX512VL:mode>3_zero_extend<SWI248x:mode>"
4405 : 1470871 : [(set (match_operand:SWI248x 0 "register_operand" "=k")
4406 : 1470871 : (zero_extend:SWI248x
4407 : 1474423 : (unspec:<V48H_AVX512VL:avx512fmaskmode>
4408 : 1470884 : [(match_operand:V48H_AVX512VL 1 "nonimmediate_operand" "v")
4409 : 1470884 : (match_operand:V48H_AVX512VL 2 "nonimmediate_operand" "vm")
4410 : 1470884 : (match_operand:SI 3 "const_0_to_7_operand" "n")]
4411 : 1470884 : UNSPEC_PCMP)))]
4412 : 1470908 : "TARGET_AVX512F
4413 : 1471183 : && (!VALID_MASK_AVX512BW_MODE (<SWI248x:MODE>mode) || TARGET_AVX512BW)
4414 : 1471204 : && (GET_MODE_NUNITS (<V48H_AVX512VL:MODE>mode)
4415 : 1471204 : < GET_MODE_PRECISION (<SWI248x:MODE>mode))"
4416 : 1470884 : "v<ssecmpintprefix>cmp<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4417 : 1470884 : [(set_attr "type" "ssecmp")
4418 : 1470884 : (set_attr "length_immediate" "1")
4419 : 1470884 : (set_attr "prefix" "evex")
4420 : 1470884 : (set_attr "mode" "<V48H_AVX512VL:sseinsnmode>")])
4421 : 1470884 :
4422 : 1470884 : (define_insn_and_split "*<avx512>_cmp<V48H_AVX512VL:mode>3_zero_extend<SWI248x:mode>_2"
4423 : 1470884 : [(set (match_operand:SWI248x 0 "register_operand")
4424 : 1470884 : (zero_extend:SWI248x
4425 : 1470884 : (unspec:<V48H_AVX512VL:avx512fmaskmode>
4426 : 1470884 : [(match_operand:V48H_AVX512VL 1 "nonimmediate_operand")
4427 : 1470884 : (match_operand:V48H_AVX512VL 2 "nonimmediate_operand")
4428 : 1470884 : (match_operand:SI 3 "const_0_to_7_operand")]
4429 : 1470884 : UNSPEC_PCMP)))
4430 : 1470884 : (set (match_operand:<V48H_AVX512VL:avx512fmaskmode> 4 "register_operand")
4431 : 1470884 : (unspec:<V48H_AVX512VL:avx512fmaskmode>
4432 : 1470884 : [(match_dup 1)
4433 : 1470884 : (match_dup 2)
4434 : 1470884 : (match_dup 3)]
4435 : 1470884 : UNSPEC_PCMP))]
4436 : 96 : "TARGET_AVX512F
4437 : 253 : && (!VALID_MASK_AVX512BW_MODE (<SWI248x:MODE>mode) || TARGET_AVX512BW)
4438 : 333 : && (GET_MODE_NUNITS (<V48H_AVX512VL:MODE>mode)
4439 : 333 : < GET_MODE_PRECISION (<SWI248x:MODE>mode))
4440 : 333 : && ix86_pre_reload_split ()"
4441 : 96 : "#"
4442 : 96 : "&& 1"
4443 : 96 : [(set (match_dup 0)
4444 : 304428 : (zero_extend:SWI248x
4445 : 304348 : (unspec:<V48H_AVX512VL:avx512fmaskmode>
4446 : 304428 : [(match_dup 1)
4447 : 304496 : (match_dup 2)
4448 : 304348 : (match_dup 3)]
4449 : 304348 : UNSPEC_PCMP)))
4450 : 304348 : (set (match_dup 4) (match_dup 5))]
4451 : 304428 : {
4452 : 304428 : operands[5] = lowpart_subreg (<V48H_AVX512VL:avx512fmaskmode>mode,
4453 : 304348 : operands[0], <SWI248x:MODE>mode);
4454 : 304428 : if (SUBREG_P (operands[5]))
4455 : 304348 : {
4456 : 304428 : SUBREG_PROMOTED_VAR_P (operands[5]) = 1;
4457 : 304428 : SUBREG_PROMOTED_SET (operands[5], 1);
4458 : 304348 : }
4459 : 304348 : })
4460 : 304348 :
4461 : 304348 : (define_insn_and_split "*<avx512>_cmp<mode>3"
4462 : 304428 : [(set (match_operand:<avx512fmaskmode> 0 "register_operand")
4463 : 304428 : (not:<avx512fmaskmode>
4464 : 304428 : (unspec:<avx512fmaskmode>
4465 : 304428 : [(match_operand:V48H_AVX512VL 1 "register_operand")
4466 : 304428 : (match_operand:V48H_AVX512VL 2 "nonimmediate_operand")
4467 : 304428 : (match_operand:SI 3 "<cmp_imm_predicate>" "n")]
4468 : 304428 : UNSPEC_PCMP)))]
4469 : 304644 : "TARGET_AVX512F && ix86_pre_reload_split ()"
4470 : 304428 : "#"
4471 : 304428 : "&& 1"
4472 : 304428 : [(set (match_dup 0)
4473 : 304452 : (unspec:<avx512fmaskmode>
4474 : 304428 : [(match_dup 1)
4475 : 304369 : (match_dup 2)
4476 : 304387 : (match_dup 4)]
4477 : 304348 : UNSPEC_PCMP))]
4478 : 304372 : "operands[4] = GEN_INT (INTVAL (operands[3]) ^ 4);")
4479 : 304348 :
4480 : 304348 : (define_insn "<avx512>_cmp<mode>3<mask_scalar_merge_name>"
4481 : 304372 : [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=k")
4482 : 304428 : (unspec:<avx512fmaskmode>
4483 : 304372 : [(match_operand:VI12_AVX512VL 1 "register_operand" "v")
4484 : 304428 : (match_operand:VI12_AVX512VL 2 "nonimmediate_operand" "vm")
4485 : 304428 : (match_operand:SI 3 "<cmp_imm_predicate>" "n")]
4486 : 304452 : UNSPEC_PCMP))]
4487 : 318077 : "TARGET_AVX512BW"
4488 : 304372 : "vpcmp<ssemodesuffix>\t{%3, %2, %1, %0<mask_scalar_merge_operand4>|%0<mask_scalar_merge_operand4>, %1, %2, %3}"
4489 : 304372 : [(set_attr "type" "ssecmp")
4490 : 304372 : (set_attr "length_immediate" "1")
4491 : 120 : (set_attr "prefix" "evex")
4492 : 176 : (set_attr "mode" "<sseinsnmode>")])
4493 : 96 :
4494 : 30276 : (define_insn "*<avx512>_cmp<VI12_AVX512VL:mode>3_zero_extend<SWI248x:mode>"
4495 : 176 : [(set (match_operand:SWI248x 0 "register_operand" "=k")
4496 : 176 : (zero_extend:SWI248x
4497 : 176 : (unspec:<VI12_AVX512VL:avx512fmaskmode>
4498 : 120 : [(match_operand:VI12_AVX512VL 1 "nonimmediate_operand" "v")
4499 : 120 : (match_operand:VI12_AVX512VL 2 "nonimmediate_operand" "vm")
4500 : 112 : (match_operand:SI 3 "const_0_to_7_operand" "n")]
4501 : 160 : UNSPEC_PCMP)))]
4502 : 178 : "TARGET_AVX512BW
4503 : 581646 : && (GET_MODE_NUNITS (<VI12_AVX512VL:MODE>mode)
4504 : 581582 : < GET_MODE_PRECISION (<SWI248x:MODE>mode))"
4505 : 581516 : "vpcmp<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4506 : 581530 : [(set_attr "type" "ssecmp")
4507 : 581516 : (set_attr "length_immediate" "1")
4508 : 581530 : (set_attr "prefix" "evex")
4509 : 581530 : (set_attr "mode" "<VI12_AVX512VL:sseinsnmode>")])
4510 : 581530 :
4511 : 581530 : (define_insn_and_split "*<avx512>_cmp<VI12_AVX512VL:mode>3_zero_extend<SWI248x:mode>_2"
4512 : 581530 : [(set (match_operand:SWI248x 0 "register_operand")
4513 : 581530 : (zero_extend:SWI248x
4514 : 581524 : (unspec:<VI12_AVX512VL:avx512fmaskmode>
4515 : 581522 : [(match_operand:VI12_AVX512VL 1 "nonimmediate_operand")
4516 : 581524 : (match_operand:VI12_AVX512VL 2 "nonimmediate_operand")
4517 : 581522 : (match_operand:SI 3 "const_0_to_7_operand")]
4518 : 581516 : UNSPEC_PCMP)))
4519 : 581516 : (set (match_operand:<VI12_AVX512VL:avx512fmaskmode> 4 "register_operand")
4520 : 581516 : (unspec:<VI12_AVX512VL:avx512fmaskmode>
4521 : 581516 : [(match_dup 1)
4522 : 581516 : (match_dup 2)
4523 : 581516 : (match_dup 3)]
4524 : 581516 : UNSPEC_PCMP))]
4525 : 581558 : "TARGET_AVX512BW
4526 : 581564 : && (GET_MODE_NUNITS (<VI12_AVX512VL:MODE>mode)
4527 : 581564 : < GET_MODE_PRECISION (<SWI248x:MODE>mode))
4528 : 581564 : && ix86_pre_reload_split ()"
4529 : 581516 : "#"
4530 : 581516 : "&& 1"
4531 : 581516 : [(set (match_dup 0)
4532 : 581534 : (zero_extend:SWI248x
4533 : 581516 : (unspec:<VI12_AVX512VL:avx512fmaskmode>
4534 : 581534 : [(match_dup 1)
4535 : 581552 : (match_dup 2)
4536 : 581516 : (match_dup 3)]
4537 : 581516 : UNSPEC_PCMP)))
4538 : 581516 : (set (match_dup 4) (match_dup 5))]
4539 : 581534 : {
4540 : 581534 : operands[5] = lowpart_subreg (<VI12_AVX512VL:avx512fmaskmode>mode,
4541 : 581516 : operands[0], <SWI248x:MODE>mode);
4542 : 581534 : if (SUBREG_P (operands[5]))
4543 : 581516 : {
4544 : 581534 : SUBREG_PROMOTED_VAR_P (operands[5]) = 1;
4545 : 581534 : SUBREG_PROMOTED_SET (operands[5], 1);
4546 : 581516 : }
4547 : 581516 : }
4548 : 581516 : [(set_attr "type" "ssecmp")
4549 : 581516 : (set_attr "length_immediate" "1")
4550 : 581534 : (set_attr "prefix" "evex")
4551 : 581534 : (set_attr "mode" "<VI12_AVX512VL:sseinsnmode>")])
4552 : 581534 :
4553 : 581534 : (define_int_iterator UNSPEC_PCMP_ITER
4554 : 581534 : [UNSPEC_PCMP UNSPEC_UNSIGNED_PCMP])
4555 : 581534 :
4556 : 581534 : (define_insn_and_split "*<avx512>_cmp<mode>3"
4557 : 581534 : [(set (match_operand:<avx512fmaskmode> 0 "register_operand")
4558 : 581534 : (not:<avx512fmaskmode>
4559 : 581534 : (unspec:<avx512fmaskmode>
4560 : 581534 : [(match_operand:VI12_AVX512VL 1 "register_operand")
4561 : 581534 : (match_operand:VI12_AVX512VL 2 "nonimmediate_operand")
4562 : 581534 : (match_operand:SI 3 "<cmp_imm_predicate>")]
4563 : 581516 : UNSPEC_PCMP_ITER)))]
4564 : 581586 : "TARGET_AVX512BW && ix86_pre_reload_split ()"
4565 : 581516 : "#"
4566 : 581516 : "&& 1"
4567 : 581516 : [(set (match_dup 0)
4568 : 581530 : (unspec:<avx512fmaskmode>
4569 : 581516 : [(match_dup 1)
4570 : 581540 : (match_dup 2)
4571 : 581528 : (match_dup 4)]
4572 : 581534 : UNSPEC_PCMP_ITER))]
4573 : 581548 : "operands[4] = GEN_INT (INTVAL (operands[3]) ^ 4);")
4574 : 581534 :
4575 : 581546 : (define_insn "*<avx512>_eq<mode>3<mask_scalar_merge_name>_1"
4576 : 581540 : [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=k,k")
4577 : 581530 : (unspec:<avx512fmaskmode>
4578 : 112 : [(match_operand:VI12_AVX512VL 1 "nonimm_or_0_operand" "%v,v")
4579 : 110 : (match_operand:VI12_AVX512VL 2 "nonimm_or_0_operand" "vm,C")
4580 : 135 : (const_int 0)]
4581 : 57315 : UNSPEC_PCMP_ITER))]
4582 : 1397 : "TARGET_AVX512BW && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
4583 : 135 : "@
4584 : 135 : vpcmpeq<ssemodesuffix>\t{%2, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %2}
4585 : 135 : vptestnm<ssemodesuffix>\t{%1, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %1}"
4586 : 110 : [(set_attr "type" "ssecmp")
4587 : 121 : (set_attr "prefix" "evex")
4588 : 109 : (set_attr "mode" "<sseinsnmode>")])
4589 : 108 :
4590 : 62348 : (define_insn "<avx512>_ucmp<mode>3<mask_scalar_merge_name>"
4591 : 62347 : [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=k")
4592 : 62335 : (unspec:<avx512fmaskmode>
4593 : 110 : [(match_operand:VI12_AVX512VL 1 "register_operand" "v")
4594 : 110 : (match_operand:VI12_AVX512VL 2 "nonimmediate_operand" "vm")
4595 : 110 : (match_operand:SI 3 "const_0_to_7_operand")]
4596 : 61561 : UNSPEC_UNSIGNED_PCMP))]
4597 : 3700 : "TARGET_AVX512BW"
4598 : 96 : "vpcmpu<ssemodesuffix>\t{%3, %2, %1, %0<mask_scalar_merge_operand4>|%0<mask_scalar_merge_operand4>, %1, %2, %3}"
4599 : 96 : [(set_attr "type" "ssecmp")
4600 : 61558 : (set_attr "length_immediate" "1")
4601 : 103 : (set_attr "prefix" "evex")
4602 : 96 : (set_attr "mode" "<sseinsnmode>")])
4603 : 103 :
4604 : 103 : (define_insn "*<avx512>_ucmp<VI12_AVX512VL:mode>3_zero_extend<SWI248x:mode>"
4605 : 103 : [(set (match_operand:SWI248x 0 "register_operand" "=k")
4606 : 103 : (zero_extend:SWI248x
4607 : 103 : (unspec:<VI12_AVX512VL:avx512fmaskmode>
4608 : 103 : [(match_operand:VI12_AVX512VL 1 "nonimmediate_operand" "v")
4609 : 367853 : (match_operand:VI12_AVX512VL 2 "nonimmediate_operand" "vm")
4610 : 367854 : (match_operand:SI 3 "const_0_to_7_operand" "n")]
4611 : 367849 : UNSPEC_UNSIGNED_PCMP)))]
4612 : 169 : "TARGET_AVX512BW
4613 : 163 : && (GET_MODE_NUNITS (<VI12_AVX512VL:MODE>mode)
4614 : 163 : < GET_MODE_PRECISION (<SWI248x:MODE>mode))"
4615 : 366471 : "vpcmpu<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4616 : 96 : [(set_attr "type" "ssecmp")
4617 : 96 : (set_attr "length_immediate" "1")
4618 : 96 : (set_attr "prefix" "evex")
4619 : 366468 : (set_attr "mode" "<VI12_AVX512VL:sseinsnmode>")])
4620 : 96 :
4621 : 96 : (define_insn_and_split "*<avx512>_ucmp<VI12_AVX512VL:mode>3_zero_extend<SWI248x:mode>_2"
4622 : 96 : [(set (match_operand:SWI248x 0 "register_operand")
4623 : 100 : (zero_extend:SWI248x
4624 : 96 : (unspec:<VI12_AVX512VL:avx512fmaskmode>
4625 : 96 : [(match_operand:VI12_AVX512VL 1 "nonimmediate_operand")
4626 : 96 : (match_operand:VI12_AVX512VL 2 "nonimmediate_operand")
4627 : 96 : (match_operand:SI 3 "const_0_to_7_operand")]
4628 : 96 : UNSPEC_UNSIGNED_PCMP)))
4629 : 96 : (set (match_operand:<VI12_AVX512VL:avx512fmaskmode> 4 "register_operand")
4630 : 96 : (unspec:<VI12_AVX512VL:avx512fmaskmode>
4631 : 96 : [(match_dup 1)
4632 : 423951 : (match_dup 2)
4633 : 423951 : (match_dup 3)]
4634 : 423951 : UNSPEC_UNSIGNED_PCMP))]
4635 : 127 : "TARGET_AVX512BW
4636 : 146 : && ix86_pre_reload_split ()
4637 : 146 : && (GET_MODE_NUNITS (<VI12_AVX512VL:MODE>mode)
4638 : 7381 : < GET_MODE_PRECISION (<SWI248x:MODE>mode))
4639 : 146 : && ix86_pre_reload_split ()"
4640 : 96 : "#"
4641 : 96 : "&& 1"
4642 : 1093 : [(set (match_dup 0)
4643 : 115 : (zero_extend:SWI248x
4644 : 96 : (unspec:<VI12_AVX512VL:avx512fmaskmode>
4645 : 123 : [(match_dup 1)
4646 : 1128 : (match_dup 2)
4647 : 96 : (match_dup 3)]
4648 : 96 : UNSPEC_UNSIGNED_PCMP)))
4649 : 96 : (set (match_dup 4) (match_dup 5))]
4650 : 115 : {
4651 : 115 : operands[5] = lowpart_subreg (<VI12_AVX512VL:avx512fmaskmode>mode,
4652 : 96 : operands[0], <SWI248x:MODE>mode);
4653 : 115 : if (SUBREG_P (operands[5]))
4654 : 96 : {
4655 : 2039388 : SUBREG_PROMOTED_VAR_P (operands[5]) = 1;
4656 : 2039388 : SUBREG_PROMOTED_SET (operands[5], 1);
4657 : 2039369 : }
4658 : 2039369 : }
4659 : 2039369 : [(set_attr "type" "ssecmp")
4660 : 2039369 : (set_attr "length_immediate" "1")
4661 : 2039388 : (set_attr "prefix" "evex")
4662 : 2039388 : (set_attr "mode" "<VI12_AVX512VL:sseinsnmode>")])
4663 : 2039388 :
4664 : 2039388 : (define_insn "*<avx512>_eq<mode>3<mask_scalar_merge_name>_1"
4665 : 2039388 : [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=k,k")
4666 : 2039388 : (unspec:<avx512fmaskmode>
4667 : 2039388 : [(match_operand:VI48_AVX512VL 1 "nonimm_or_0_operand" "%v,v")
4668 : 2039388 : (match_operand:VI48_AVX512VL 2 "nonimm_or_0_operand" "vm,C")
4669 : 2039388 : (const_int 0)]
4670 : 2039388 : UNSPEC_PCMP_ITER))]
4671 : 2051859 : "TARGET_AVX512F && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
4672 : 2039388 : "@
4673 : 2039388 : vpcmpeq<ssemodesuffix>\t{%2, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %2}
4674 : 2039369 : vptestnm<ssemodesuffix>\t{%1, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %1}"
4675 : 2039369 : [(set_attr "type" "ssecmp")
4676 : 2039369 : (set_attr "prefix" "evex")
4677 : 2039369 : (set_attr "mode" "<sseinsnmode>")])
4678 : 2039369 :
4679 : 2039369 : (define_insn "<avx512>_ucmp<mode>3<mask_scalar_merge_name>"
4680 : 2039369 : [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=k")
4681 : 2039388 : (unspec:<avx512fmaskmode>
4682 : 2039369 : [(match_operand:VI48_AVX512VL 1 "register_operand" "v")
4683 : 2039388 : (match_operand:VI48_AVX512VL 2 "nonimmediate_operand" "vm")
4684 : 2039388 : (match_operand:SI 3 "const_0_to_7_operand")]
4685 : 2039388 : UNSPEC_UNSIGNED_PCMP))]
4686 : 2043120 : "TARGET_AVX512F"
4687 : 2039369 : "vpcmpu<ssemodesuffix>\t{%3, %2, %1, %0<mask_scalar_merge_operand4>|%0<mask_scalar_merge_operand4>, %1, %2, %3}"
4688 : 2039369 : [(set_attr "type" "ssecmp")
4689 : 2039369 : (set_attr "length_immediate" "1")
4690 : 2039369 : (set_attr "prefix" "evex")
4691 : 2039396 : (set_attr "mode" "<sseinsnmode>")])
4692 : 2039369 :
4693 : 2039396 : (define_insn "*<avx512>_ucmp<VI48_AVX512VL:mode>3_zero_extend<SWI248x:mode>"
4694 : 2039396 : [(set (match_operand:SWI248x 0 "register_operand" "=k")
4695 : 2039396 : (zero_extend:SWI248x
4696 : 2039396 : (unspec:<VI48_AVX512VL:avx512fmaskmode>
4697 : 2039396 : [(match_operand:VI48_AVX512VL 1 "nonimmediate_operand" "v")
4698 : 2039396 : (match_operand:VI48_AVX512VL 2 "nonimmediate_operand" "vm")
4699 : 2039396 : (match_operand:SI 3 "const_0_to_7_operand" "n")]
4700 : 2039396 : UNSPEC_UNSIGNED_PCMP)))]
4701 : 2039369 : "TARGET_AVX512F
4702 : 2039498 : && (!VALID_MASK_AVX512BW_MODE (<SWI248x:MODE>mode) || TARGET_AVX512BW)
4703 : 2039471 : && (GET_MODE_NUNITS (<VI48_AVX512VL:MODE>mode)
4704 : 2039471 : < GET_MODE_PRECISION (<SWI248x:MODE>mode))"
4705 : 2039369 : "vpcmpu<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4706 : 2039369 : [(set_attr "type" "ssecmp")
4707 : 2039369 : (set_attr "length_immediate" "1")
4708 : 2039369 : (set_attr "prefix" "evex")
4709 : 2039369 : (set_attr "mode" "<VI48_AVX512VL:sseinsnmode>")])
4710 : 2039369 :
4711 : 2039369 : (define_insn_and_split "*<avx512>_ucmp<VI48_AVX512VL:mode>3_zero_extend<SWI248x:mode>_2"
4712 : 2039369 : [(set (match_operand:SWI248x 0 "register_operand")
4713 : 2039369 : (zero_extend:SWI248x
4714 : 2039369 : (unspec:<VI48_AVX512VL:avx512fmaskmode>
4715 : 2039369 : [(match_operand:VI48_AVX512VL 1 "nonimmediate_operand")
4716 : 2039369 : (match_operand:VI48_AVX512VL 2 "nonimmediate_operand")
4717 : 2039369 : (match_operand:SI 3 "const_0_to_7_operand")]
4718 : 2039369 : UNSPEC_UNSIGNED_PCMP)))
4719 : 2039369 : (set (match_operand:<VI48_AVX512VL:avx512fmaskmode> 4 "register_operand")
4720 : 2039369 : (unspec:<VI48_AVX512VL:avx512fmaskmode>
4721 : 2039369 : [(match_dup 1)
4722 : 2039369 : (match_dup 2)
4723 : 2039369 : (match_dup 3)]
4724 : 2039369 : UNSPEC_UNSIGNED_PCMP))]
4725 : 2039369 : "TARGET_AVX512F
4726 : 2039447 : && (!VALID_MASK_AVX512BW_MODE (<SWI248x:MODE>mode) || TARGET_AVX512BW)
4727 : 2039471 : && (GET_MODE_NUNITS (<VI48_AVX512VL:MODE>mode)
4728 : 2039471 : < GET_MODE_PRECISION (<SWI248x:MODE>mode))
4729 : 2039471 : && ix86_pre_reload_split ()"
4730 : 2039369 : "#"
4731 : 2039369 : "&& 1"
4732 : 2039369 : [(set (match_dup 0)
4733 : 2039403 : (zero_extend:SWI248x
4734 : 2039369 : (unspec:<VI48_AVX512VL:avx512fmaskmode>
4735 : 2039395 : [(match_dup 1)
4736 : 2039421 : (match_dup 2)
4737 : 2039369 : (match_dup 3)]
4738 : 2039369 : UNSPEC_UNSIGNED_PCMP)))
4739 : 2039369 : (set (match_dup 4) (match_dup 5))]
4740 : 2039403 : {
4741 : 2039403 : operands[5] = lowpart_subreg (<VI48_AVX512VL:avx512fmaskmode>mode,
4742 : 2039369 : operands[0], <SWI248x:MODE>mode);
4743 : 2039403 : if (SUBREG_P (operands[5]))
4744 : 2039369 : {
4745 : 2193703 : SUBREG_PROMOTED_VAR_P (operands[5]) = 1;
4746 : 2039403 : SUBREG_PROMOTED_SET (operands[5], 1);
4747 : 2193669 : }
4748 : 2193669 : }
4749 : 2193669 : [(set_attr "type" "ssecmp")
4750 : 2193669 : (set_attr "length_immediate" "1")
4751 : 2193703 : (set_attr "prefix" "evex")
4752 : 2193703 : (set_attr "mode" "<VI48_AVX512VL:sseinsnmode>")])
4753 : 2193703 :
4754 : 2193703 : (define_insn_and_split "*<avx512>_ucmp<mode>3"
4755 : 2193703 : [(set (match_operand:<avx512fmaskmode> 0 "register_operand")
4756 : 2039403 : (not:<avx512fmaskmode>
4757 : 2162776 : (unspec:<avx512fmaskmode>
4758 : 2162776 : [(match_operand:VI48_AVX512VL 1 "register_operand")
4759 : 2162776 : (match_operand:VI48_AVX512VL 2 "nonimmediate_operand")
4760 : 2162776 : (match_operand:SI 3 "const_0_to_7_operand")]
4761 : 2162776 : UNSPEC_UNSIGNED_PCMP)))]
4762 : 2162778 : "TARGET_AVX512F && ix86_pre_reload_split ()"
4763 : 2039403 : "#"
4764 : 2159267 : "&& 1"
4765 : 2039369 : [(set (match_dup 0)
4766 : 2039369 : (unspec:<avx512fmaskmode>
4767 : 2159267 : [(match_dup 1)
4768 : 2278103 : (match_dup 2)
4769 : 2039369 : (match_dup 4)]
4770 : 2158205 : UNSPEC_UNSIGNED_PCMP))]
4771 : 2157261 : "operands[4] = GEN_INT (INTVAL (operands[3]) ^ 4);")
4772 : 2275787 :
4773 : 2039403 : (define_int_attr pcmp_signed_mask
4774 : 2039403 : [(UNSPEC_PCMP "3") (UNSPEC_UNSIGNED_PCMP "1")])
4775 : 2039403 :
4776 : 2039369 : ;; PR96906 - optimize vpsubusw compared to 0 into vpcmpleuw or vpcmpnltuw.
4777 : 2039369 : ;; For signed comparison, handle EQ 0: NEQ 4,
4778 : 2039369 : ;; for unsigned comparison extra handle LE:2, NLE:6, equivalent to EQ and NEQ.
4779 : 2039369 :
4780 : 2039369 : (define_insn_and_split "*<avx512>_ucmp<mode>3_1"
4781 : 2039401 : [(set (match_operand:<avx512fmaskmode> 0 "register_operand")
4782 : 2039369 : (unspec:<avx512fmaskmode>
4783 : 2039401 : [(us_minus:VI12_AVX512VL
4784 : 2039381 : (match_operand:VI12_AVX512VL 1 "vector_operand")
4785 : 2039381 : (match_operand:VI12_AVX512VL 2 "vector_operand"))
4786 : 91106735 : (match_operand:VI12_AVX512VL 3 "const0_operand")
4787 : 2039389 : (match_operand:SI 4 "const_0_to_7_operand")]
4788 : 91106731 : UNSPEC_PCMP_ITER))]
4789 : 2039461 : "TARGET_AVX512BW && ix86_pre_reload_split ()
4790 : 2039473 : && ix86_binary_operator_ok (US_MINUS, <MODE>mode, operands)
4791 : 2039453 : && (INTVAL (operands[4]) & <pcmp_signed_mask>) == 0"
4792 : 91106731 : "#"
4793 : 91106711 : "&& 1"
4794 : 2039369 : [(const_int 0)]
4795 : 91106783 : {
4796 : 2039369 : /* LE: 2, NLT: 5, NLE: 6, LT: 1 */
4797 : 2068236 : int cmp_predicate = 2; /* LE */
4798 : 2068266 : if (MEM_P (operands[1]))
4799 : 2057531 : {
4800 : 2079436 : std::swap (operands[1], operands[2]);
4801 : 2052781 : cmp_predicate = 5; /* NLT (GE) */
4802 : 2052799 : }
4803 : 2049455 : if ((INTVAL (operands[4]) & 4) != 0)
4804 : 2039409 : cmp_predicate ^= 4; /* Invert the comparison to NLE (GT) or LT. */
4805 : 2039413 : emit_insn (gen_<avx512>_ucmp<mode>3 (operands[0], operands[1],operands[2],
4806 : 2039369 : GEN_INT (cmp_predicate)));
4807 : 2039405 : DONE;
4808 : 2039369 : })
4809 : 2039369 :
4810 : 2039369 : (define_insn "avx512f_vmcmp<mode>3<round_saeonly_name>"
4811 : 2039369 : [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=k")
4812 : 2039369 : (and:<avx512fmaskmode>
4813 : 2039369 : (unspec:<avx512fmaskmode>
4814 : 2039369 : [(match_operand:VFH_128 1 "register_operand" "v")
4815 : 2039369 : (match_operand:VFH_128 2 "<round_saeonly_nimm_scalar_predicate>" "<round_saeonly_constraint>")
4816 : 2039369 : (match_operand:SI 3 "const_0_to_31_operand")]
4817 : 2039369 : UNSPEC_PCMP)
4818 : 2039369 : (const_int 1)))]
4819 : 2043835 : "TARGET_AVX512F"
4820 : 2039375 : "vcmp<ssescalarmodesuffix>\t{%3, <round_saeonly_op4>%2, %1, %0|%0, %1, %<iptr>2<round_saeonly_op4>, %3}"
4821 : 2039369 : [(set_attr "type" "ssecmp")
4822 : 2039375 : (set_attr "length_immediate" "1")
4823 : 2040199 : (set_attr "prefix" "evex")
4824 : 2042252 : (set_attr "mode" "<ssescalarmode>")])
4825 : 2041842 :
4826 : 2041836 : (define_insn "avx512f_vmcmp<mode>3_mask<round_saeonly_name>"
4827 : 2041836 : [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=k")
4828 : 2041836 : (and:<avx512fmaskmode>
4829 : 2041836 : (unspec:<avx512fmaskmode>
4830 : 2041836 : [(match_operand:VFH_128 1 "register_operand" "v")
4831 : 2041836 : (match_operand:VFH_128 2 "<round_saeonly_nimm_scalar_predicate>" "<round_saeonly_constraint>")
4832 : 2039369 : (match_operand:SI 3 "const_0_to_31_operand")]
4833 : 2039369 : UNSPEC_PCMP)
4834 : 2039369 : (and:<avx512fmaskmode>
4835 : 2039369 : (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")
4836 : 2039369 : (const_int 1))))]
4837 : 2040361 : "TARGET_AVX512F"
4838 : 2039369 : "vcmp<ssescalarmodesuffix>\t{%3, <round_saeonly_op5>%2, %1, %0%{%4%}|%0%{%4%}, %1, %<iptr>2<round_saeonly_op5>, %3}"
4839 : 2039369 : [(set_attr "type" "ssecmp")
4840 : 2039369 : (set_attr "length_immediate" "1")
4841 : 2039595 : (set_attr "prefix" "evex")
4842 : 2039595 : (set_attr "mode" "<ssescalarmode>")])
4843 : 2039369 :
4844 : 2039369 : (define_insn "avx10_2_<unord>comx<mode><round_saeonly_name>"
4845 : 2039369 : [(set (reg:CCFP FLAGS_REG)
4846 : 2039369 : (unspec:CCFP
4847 : 2039369 : [(vec_select:MODEFH
4848 : 2039369 : (match_operand:<ssevecmode> 0 "register_operand" "v")
4849 : 2039369 : (parallel [(const_int 0)]))
4850 : 2039369 : (vec_select:MODEFH
4851 : 2039369 : (match_operand:<ssevecmode> 1 "<round_saeonly_nimm_scalar_predicate>" "<round_saeonly_constraint>")
4852 : 2039369 : (parallel [(const_int 0)]))]
4853 : 2039369 : UNSPEC_COMX))]
4854 : 2039543 : "TARGET_AVX10_2_256"
4855 : 2039373 : "v<unord>comx<ssemodesuffix>\t{<round_saeonly_op2>%1, %0|%0, %<iptr>1<round_saeonly_op2>}"
4856 : 2039369 : [(set_attr "type" "ssecomi")
4857 : 2039369 : (set_attr "prefix" "evex")
4858 : 2039545 : (set_attr "mode" "<MODE>")])
4859 : 2039545 :
4860 : 2039543 : (define_insn "<sse>_<unord>comi<round_saeonly_name>"
4861 : 270 : [(set (reg:CCFP FLAGS_REG)
4862 : 446 : (compare:CCFP
4863 : 989 : (vec_select:MODEFH
4864 : 822 : (match_operand:<ssevecmode> 0 "register_operand" "v")
4865 : 8573 : (parallel [(const_int 0)]))
4866 : 164 : (vec_select:MODEFH
4867 : 415 : (match_operand:<ssevecmode> 1 "<round_saeonly_nimm_scalar_predicate>" "<round_saeonly_constraint>")
4868 : 784 : (parallel [(const_int 0)]))))]
4869 : 38800 : "SSE_FLOAT_MODE_P (<MODE>mode) || <MODE>mode == E_HFmode"
4870 : 37787 : "%v<unord>comi<ssemodesuffix>\t{<round_saeonly_op2>%1, %0|%0, %<iptr>1<round_saeonly_op2>}"
4871 : 38288 : [(set_attr "type" "ssecomi")
4872 : 40543 : (set_attr "prefix" "maybe_vex")
4873 : 39548 : (set_attr "prefix_rep" "0")
4874 : 39548 : (set (attr "prefix_data16")
4875 : 39169 : (if_then_else (eq_attr "mode" "DF")
4876 : 39157 : (const_string "1")
4877 : 41033 : (const_string "0")))
4878 : 37893 : (set_attr "mode" "<MODE>")])
4879 : 39604 :
4880 : 40836 : (define_expand "vec_cmp<mode><avx512fmaskmodelower>"
4881 : 40836 : [(set (match_operand:<avx512fmaskmode> 0 "register_operand")
4882 : 38874 : (match_operator:<avx512fmaskmode> 1 ""
4883 : 3145983 : [(match_operand:V48H_AVX512VL 2 "register_operand")
4884 : 41433 : (match_operand:V48H_AVX512VL 3 "nonimmediate_operand")]))]
4885 : 40651 : "TARGET_AVX512F"
4886 : 41694 : {
4887 : 40348 : bool ok = ix86_expand_mask_vec_cmp (operands[0], GET_CODE (operands[1]),
4888 : 40555 : operands[2], operands[3]);
4889 : 41008 : gcc_assert (ok);
4890 : 43855 : DONE;
4891 : 3142771 : })
4892 : 37612 :
4893 : 37600 : (define_expand "vec_cmp<mode><avx512fmaskmodelower>"
4894 : 38101 : [(set (match_operand:<avx512fmaskmode> 0 "register_operand")
4895 : 3112063 : (match_operator:<avx512fmaskmode> 1 ""
4896 : 38101 : [(match_operand:VI12_AVX512VL 2 "register_operand")
4897 : 3260509 : (match_operand:VI12_AVX512VL 3 "nonimmediate_operand")]))]
4898 : 37632 : "TARGET_AVX512BW"
4899 : 38358 : {
4900 : 53550 : bool ok = ix86_expand_mask_vec_cmp (operands[0], GET_CODE (operands[1]),
4901 : 3111707 : operands[2], operands[3]);
4902 : 43561 : gcc_assert (ok);
4903 : 2790291 : DONE;
4904 : 42835 : })
4905 : 42424 :
4906 : 42424 : (define_expand "vec_cmp<mode><avx512fmaskmodelower>"
4907 : 37600 : [(set (match_operand:<avx512fmaskmode> 0 "register_operand")
4908 : 2784330 : (match_operator:<avx512fmaskmode> 1 ""
4909 : 37600 : [(match_operand:VBF_AVX10_2 2 "register_operand")
4910 : 37600 : (match_operand:VBF_AVX10_2 3 "nonimmediate_operand")]))]
4911 : 676426 : "TARGET_AVX10_2_256"
4912 : 676451 : {
4913 : 1204848 : bool ok = ix86_expand_mask_vec_cmp (operands[0], GET_CODE (operands[1]),
4914 : 44105 : operands[2], operands[3]);
4915 : 42449 : gcc_assert (ok);
4916 : 42449 : DONE;
4917 : 42424 : })
4918 : 37600 :
4919 : 44105 : (define_expand "vec_cmp<mode><sseintvecmodelower>"
4920 : 44105 : [(set (match_operand:<sseintvecmode> 0 "register_operand")
4921 : 39281 : (match_operator:<sseintvecmode> 1 ""
4922 : 4184 : [(match_operand:VI_256 2 "register_operand")
4923 : 4184 : (match_operand:VI_256 3 "nonimmediate_or_const_vector_operand")]))]
4924 : 4184 : "TARGET_AVX2"
4925 : 4827 : {
4926 : 4184 : bool ok = ix86_expand_int_vec_cmp (operands);
4927 : 2081 : gcc_assert (ok);
4928 : 1933 : DONE;
4929 : 1205 : })
4930 : 96 :
4931 : 1203 : (define_expand "vec_cmp<mode><sseintvecmodelower>"
4932 : 1996 : [(set (match_operand:<sseintvecmode> 0 "register_operand")
4933 : 1996 : (match_operator:<sseintvecmode> 1 ""
4934 : 1996 : [(match_operand:VI124_128 2 "register_operand")
4935 : 1996 : (match_operand:VI124_128 3 "vector_or_const_vector_operand")]))]
4936 : 1996 : "TARGET_SSE2"
4937 : 5137 : {
4938 : 9193 : bool ok = ix86_expand_int_vec_cmp (operands);
4939 : 5137 : gcc_assert (ok);
4940 : 6579 : DONE;
4941 : 96 : })
4942 : 96 :
4943 : 96 : (define_expand "vec_cmpv2div2di"
4944 : 96 : [(set (match_operand:V2DI 0 "register_operand")
4945 : 2523 : (match_operator:V2DI 1 ""
4946 : 2523 : [(match_operand:V2DI 2 "register_operand")
4947 : 2523 : (match_operand:V2DI 3 "vector_or_const_vector_operand")]))]
4948 : 2523 : "TARGET_SSE4_2"
4949 : 2865 : {
4950 : 2865 : bool ok = ix86_expand_int_vec_cmp (operands);
4951 : 2865 : gcc_assert (ok);
4952 : 10300 : DONE;
4953 : 96 : })
4954 : 96 :
4955 : 96 : (define_expand "vec_cmp<mode><sseintvecmodelower>"
4956 : 96 : [(set (match_operand:<sseintvecmode> 0 "register_operand")
4957 : 7531 : (match_operator:<sseintvecmode> 1 ""
4958 : 7531 : [(match_operand:VF_256 2 "register_operand")
4959 : 7531 : (match_operand:VF_256 3 "nonimmediate_operand")]))]
4960 : 7531 : "TARGET_AVX"
4961 : 8647 : {
4962 : 8647 : bool ok = ix86_expand_fp_vec_cmp (operands);
4963 : 8647 : gcc_assert (ok);
4964 : 8749 : DONE;
4965 : 96 : })
4966 : 96 :
4967 : 96 : (define_expand "vec_cmp<mode><sseintvecmodelower>"
4968 : 96 : [(set (match_operand:<sseintvecmode> 0 "register_operand")
4969 : 260 : (match_operator:<sseintvecmode> 1 ""
4970 : 260 : [(match_operand:VF_128 2 "register_operand")
4971 : 260 : (match_operand:VF_128 3 "vector_operand")]))]
4972 : 260 : "TARGET_SSE"
4973 : 5648 : {
4974 : 5648 : bool ok = ix86_expand_fp_vec_cmp (operands);
4975 : 5648 : gcc_assert (ok);
4976 : 5664 : DONE;
4977 : 96 : })
4978 : 96 :
4979 : 96 : (define_expand "vec_cmpu<mode><avx512fmaskmodelower>"
4980 : 96 : [(set (match_operand:<avx512fmaskmode> 0 "register_operand")
4981 : 112 : (match_operator:<avx512fmaskmode> 1 ""
4982 : 112 : [(match_operand:VI48_AVX512VL 2 "register_operand")
4983 : 112 : (match_operand:VI48_AVX512VL 3 "nonimmediate_operand")]))]
4984 : 112 : "TARGET_AVX512F"
4985 : 493 : {
4986 : 509 : bool ok = ix86_expand_mask_vec_cmp (operands[0], GET_CODE (operands[1]),
4987 : 112 : operands[2], operands[3]);
4988 : 538 : gcc_assert (ok);
4989 : 493 : DONE;
4990 : 96 : })
4991 : 96 :
4992 : 96 : (define_expand "vec_cmpu<mode><avx512fmaskmodelower>"
4993 : 141 : [(set (match_operand:<avx512fmaskmode> 0 "register_operand")
4994 : 141 : (match_operator:<avx512fmaskmode> 1 ""
4995 : 141 : [(match_operand:VI12_AVX512VL 2 "register_operand")
4996 : 141 : (match_operand:VI12_AVX512VL 3 "nonimmediate_operand")]))]
4997 : 141 : "TARGET_AVX512BW"
4998 : 318 : {
4999 : 540 : bool ok = ix86_expand_mask_vec_cmp (operands[0], GET_CODE (operands[1]),
5000 : 224 : operands[2], operands[3]);
5001 : 318 : gcc_assert (ok);
5002 : 318 : DONE;
5003 : 96 : })
5004 : 96 :
5005 : 179 : (define_expand "vec_cmpu<mode><sseintvecmodelower>"
5006 : 179 : [(set (match_operand:<sseintvecmode> 0 "register_operand")
5007 : 179 : (match_operator:<sseintvecmode> 1 ""
5008 : 179 : [(match_operand:VI_256 2 "register_operand")
5009 : 179 : (match_operand:VI_256 3 "nonimmediate_or_const_vector_operand")]))]
5010 : 179 : "TARGET_AVX2"
5011 : 459 : {
5012 : 739 : bool ok = ix86_expand_int_vec_cmp (operands);
5013 : 470 : gcc_assert (ok);
5014 : 376 : DONE;
5015 : 96 : })
5016 : 96 :
5017 : 96 : (define_expand "vec_cmpu<mode><sseintvecmodelower>"
5018 : 470 : [(set (match_operand:<sseintvecmode> 0 "register_operand")
5019 : 470 : (match_operator:<sseintvecmode> 1 ""
5020 : 470 : [(match_operand:VI124_128 2 "register_operand")
5021 : 470 : (match_operand:VI124_128 3 "vector_or_const_vector_operand")]))]
5022 : 470 : "TARGET_SSE2"
5023 : 1676 : {
5024 : 2882 : bool ok = ix86_expand_int_vec_cmp (operands);
5025 : 1676 : gcc_assert (ok);
5026 : 1551 : DONE;
5027 : 96 : })
5028 : 96 :
5029 : 96 : (define_expand "vec_cmpuv2div2di"
5030 : 96 : [(set (match_operand:V2DI 0 "register_operand")
5031 : 1551 : (match_operator:V2DI 1 ""
5032 : 1551 : [(match_operand:V2DI 2 "register_operand")
5033 : 1551 : (match_operand:V2DI 3 "vector_or_const_vector_operand")]))]
5034 : 1551 : "TARGET_SSE4_2"
5035 : 1551 : {
5036 : 1621 : bool ok = ix86_expand_int_vec_cmp (operands);
5037 : 1551 : gcc_assert (ok);
5038 : 2915 : DONE;
5039 : 96 : })
5040 : 96 :
5041 : 96 : (define_expand "vec_cmpeqv2div2di"
5042 : 96 : [(set (match_operand:V2DI 0 "register_operand")
5043 : 1390 : (match_operator:V2DI 1 ""
5044 : 96 : [(match_operand:V2DI 2 "register_operand")
5045 : 96 : (match_operand:V2DI 3 "vector_operand")]))]
5046 : 96 : "TARGET_SSE2"
5047 : 261 : {
5048 : 261 : bool ok;
5049 : 261 : if (!TARGET_SSE4_1)
5050 : 441 : {
5051 : 182 : rtx ops[4];
5052 : 413 : ops[0] = gen_reg_rtx (V4SImode);
5053 : 182 : ops[2] = gen_lowpart (V4SImode, force_reg (V2DImode, operands[2]));
5054 : 182 : ops[3] = gen_lowpart (V4SImode, force_reg (V2DImode, operands[3]));
5055 : 527 : ops[1] = gen_rtx_fmt_ee (GET_CODE (operands[1]), V4SImode,
5056 : 96 : ops[2], ops[3]);
5057 : 413 : ok = ix86_expand_int_vec_cmp (ops);
5058 : 96 :
5059 : 182 : rtx tmp1 = gen_reg_rtx (V4SImode);
5060 : 182 : emit_insn (gen_sse2_pshufd (tmp1, ops[0], GEN_INT (0xb1)));
5061 : 96 :
5062 : 246 : rtx tmp2 = gen_reg_rtx (V4SImode);
5063 : 182 : if (GET_CODE (operands[1]) == EQ)
5064 : 308 : emit_insn (gen_andv4si3 (tmp2, tmp1, ops[0]));
5065 : 96 : else
5066 : 678 : emit_insn (gen_iorv4si3 (tmp2, tmp1, ops[0]));
5067 : 160 :
5068 : 182 : emit_move_insn (operands[0], gen_lowpart (V2DImode, tmp2));
5069 : 284 : }
5070 : 96 : else
5071 : 695 : ok = ix86_expand_int_vec_cmp (operands);
5072 : 261 : gcc_assert (ok);
5073 : 261 : DONE;
5074 : 96 : })
5075 : 96 :
5076 : 236 : (define_expand "vec_cmpeqv1tiv1ti"
5077 : 96 : [(set (match_operand:V1TI 0 "register_operand")
5078 : 319 : (match_operator:V1TI 1 ""
5079 : 96 : [(match_operand:V1TI 2 "register_operand")
5080 : 276 : (match_operand:V1TI 3 "vector_operand")]))]
5081 : 236 : "TARGET_SSE2"
5082 : 110 : {
5083 : 333 : rtx dst = gen_reg_rtx (V2DImode);
5084 : 110 : rtx op1 = gen_lowpart (V2DImode, force_reg (V1TImode, operands[2]));
5085 : 290 : rtx op2 = gen_lowpart (V2DImode, force_reg (V1TImode, operands[3]));
5086 : 290 : rtx cmp = gen_rtx_fmt_ee (GET_CODE (operands[1]), V2DImode, op1, op2);
5087 : 290 : emit_insn (gen_vec_cmpeqv2div2di (dst, cmp, op1, op2));
5088 : 276 :
5089 : 290 : rtx tmp1 = gen_reg_rtx (V4SImode);
5090 : 293 : rtx tmp2 = gen_lowpart (V4SImode, dst);
5091 : 290 : emit_insn (gen_sse2_pshufd (tmp1, tmp2, GEN_INT (0x4e)));
5092 : 1903 :
5093 : 110 : rtx tmp3 = gen_reg_rtx (V4SImode);
5094 : 110 : if (GET_CODE (operands[1]) == EQ)
5095 : 102 : emit_insn (gen_andv4si3 (tmp3, tmp2, tmp1));
5096 : 96 : else
5097 : 1814 : emit_insn (gen_iorv4si3 (tmp3, tmp2, tmp1));
5098 : 1710 :
5099 : 1654 : emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp3));
5100 : 1654 : DONE;
5101 : 1640 : })
5102 : 1720 :
5103 : 1720 : (define_expand "vcond_mask_<mode><avx512fmaskmodelower>"
5104 : 1899 : [(set (match_operand:V48_AVX512VL 0 "register_operand")
5105 : 93 : (vec_merge:V48_AVX512VL
5106 : 93 : (match_operand:V48_AVX512VL 1 "nonimmediate_operand")
5107 : 138 : (match_operand:V48_AVX512VL 2 "nonimm_or_0_operand")
5108 : 138 : (match_operand:<avx512fmaskmode> 3 "register_operand")))]
5109 : 317 : "TARGET_AVX512F")
5110 : 237 :
5111 : 237 : (define_expand "vcond_mask_<mode><avx512fmaskmodelower>"
5112 : 237 : [(set (match_operand:VI12HFBF_AVX512VL 0 "register_operand")
5113 : 237 : (vec_merge:VI12HFBF_AVX512VL
5114 : 237 : (match_operand:VI12HFBF_AVX512VL 1 "nonimmediate_operand")
5115 : 237 : (match_operand:VI12HFBF_AVX512VL 2 "nonimm_or_0_operand")
5116 : 237 : (match_operand:<avx512fmaskmode> 3 "register_operand")))]
5117 : 58 : "TARGET_AVX512BW")
5118 : 58 :
5119 : 58 : ;; As vcondv4div4df and vcondv8siv8sf are enabled already with TARGET_AVX,
5120 : 58 : ;; and their condition can be folded late into a constant, we need to
5121 : 58 : ;; support vcond_mask_v4div4di and vcond_mask_v8siv8si for TARGET_AVX.
5122 : 58 : (define_mode_iterator VI_256_AVX2 [(V32QI "TARGET_AVX2") (V16HI "TARGET_AVX2")
5123 : 58 : V8SI V4DI])
5124 : 61 :
5125 : 58 : (define_expand "vcond_mask_<mode><sseintvecmodelower>"
5126 : 58 : [(set (match_operand:VI_256_AVX2 0 "register_operand")
5127 : 13 : (vec_merge:VI_256_AVX2
5128 : 45 : (match_operand:VI_256_AVX2 1 "nonimmediate_operand")
5129 : 48 : (match_operand:VI_256_AVX2 2 "nonimm_or_0_operand")
5130 : 48 : (match_operand:<sseintvecmode> 3 "register_operand")))]
5131 : 48 : "TARGET_AVX"
5132 : 228 : {
5133 : 228 : ix86_expand_sse_movcc (operands[0], operands[3],
5134 : 48 : operands[1], operands[2]);
5135 : 228 : DONE;
5136 : 48 : })
5137 : 45 :
5138 : 45 : (define_expand "vcond_mask_<mode><sseintvecmodelower>"
5139 : 45 : [(set (match_operand:VI_128 0 "register_operand")
5140 : 45 : (vec_merge:VI_128
5141 : 45 : (match_operand:VI_128 1 "vector_operand")
5142 : 45 : (match_operand:VI_128 2 "nonimm_or_0_operand")
5143 : 45 : (match_operand:<sseintvecmode> 3 "register_operand")))]
5144 : 45 : "TARGET_SSE2"
5145 : 1851 : {
5146 : 1851 : ix86_expand_sse_movcc (operands[0], operands[3],
5147 : 45 : operands[1], operands[2]);
5148 : 1851 : DONE;
5149 : 45 : })
5150 : 45 :
5151 : 45 : (define_expand "vcond_mask_v1tiv1ti"
5152 : 45 : [(set (match_operand:V1TI 0 "register_operand")
5153 : 45 : (vec_merge:V1TI
5154 : 45 : (match_operand:V1TI 1 "vector_operand")
5155 : 45 : (match_operand:V1TI 2 "nonimm_or_0_operand")
5156 : 45 : (match_operand:V1TI 3 "register_operand")))]
5157 : 45 : "TARGET_SSE2"
5158 : 48 : {
5159 : 48 : ix86_expand_sse_movcc (operands[0], operands[3],
5160 : 855 : operands[1], operands[2]);
5161 : 48 : DONE;
5162 : 45 : })
5163 : 45 :
5164 : 45 : (define_expand "vcond_mask_<mode><sseintvecmodelower>"
5165 : 855 : [(set (match_operand:VF_256 0 "register_operand")
5166 : 855 : (vec_merge:VF_256
5167 : 855 : (match_operand:VF_256 1 "nonimmediate_operand")
5168 : 855 : (match_operand:VF_256 2 "nonimm_or_0_operand")
5169 : 855 : (match_operand:<sseintvecmode> 3 "register_operand")))]
5170 : 855 : "TARGET_AVX"
5171 : 935 : {
5172 : 935 : ix86_expand_sse_movcc (operands[0], operands[3],
5173 : 45 : operands[1], operands[2]);
5174 : 237 : DONE;
5175 : 45 : })
5176 : 45 :
5177 : 45 : (define_expand "vcond_mask_<mode><sseintvecmodelower>"
5178 : 45 : [(set (match_operand:VF_128 0 "register_operand")
5179 : 45 : (vec_merge:VF_128
5180 : 45 : (match_operand:VF_128 1 "vector_operand")
5181 : 45 : (match_operand:VF_128 2 "nonimm_or_0_operand")
5182 : 45 : (match_operand:<sseintvecmode> 3 "register_operand")))]
5183 : 45 : "TARGET_SSE"
5184 : 743 : {
5185 : 743 : ix86_expand_sse_movcc (operands[0], operands[3],
5186 : 45 : operands[1], operands[2]);
5187 : 743 : DONE;
5188 : 45 : })
5189 : 45 :
5190 : 45 : (define_expand "vcond_mask_<mode><mode>"
5191 : 45 : [(match_operand:SWI1248_AVX512BW 0 "register_operand")
5192 : 45 : (match_operand:SWI1248_AVX512BW 1 "register_operand")
5193 : 45 : (match_operand:SWI1248_AVX512BW 2 "register_operand")
5194 : 45 : (match_operand:SWI1248_AVX512BW 3 "register_operand")]
5195 : 45 : "TARGET_AVX512F"
5196 : 45 : {
5197 : 45 : /* (operand[1] & operand[3]) | (operand[2] & ~operand[3]) */
5198 : 45 : rtx op1 = gen_reg_rtx (<MODE>mode);
5199 : 45 : rtx op2 = gen_reg_rtx (<MODE>mode);
5200 : 45 : rtx op3 = gen_reg_rtx (<MODE>mode);
5201 : 45 :
5202 : 45 : emit_insn (gen_and<mode>3 (op1, operands[1], operands[3]));
5203 : 45 : emit_insn (gen_one_cmpl<mode>2 (op3, operands[3]));
5204 : 45 : emit_insn (gen_and<mode>3 (op2, operands[2], op3));
5205 : 45 : emit_insn (gen_ior<mode>3 (operands[0], op1, op2));
5206 : 45 :
5207 : 45 : DONE;
5208 : 45 : })
5209 : 45 :
5210 : 45 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5211 : 45 : ;;
5212 : 45 : ;; Parallel floating point logical operations
5213 : 45 : ;;
5214 : 45 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5215 : 45 :
5216 : 45 : (define_insn "<sse>_andnot<mode>3<mask_name>"
5217 : 45 : [(set (match_operand:VFB_128_256 0 "register_operand" "=x,x,v,v")
5218 : 45 : (and:VFB_128_256
5219 : 45 : (not:VFB_128_256
5220 : 45 : (match_operand:VFB_128_256 1 "register_operand" "0,x,v,v"))
5221 : 45 : (match_operand:VFB_128_256 2 "vector_operand" "xBm,xjm,vm,vm")))]
5222 : 23174 : "TARGET_SSE && <mask_avx512vl_condition>
5223 : 45 : && (!<mask_applied> || <ssescalarsize> != 16)"
5224 : 5313 : {
5225 : 5313 : char buf[128];
5226 : 5313 : const char *ops;
5227 : 5753 : const char *suffix;
5228 : 485 :
5229 : 485 : switch (which_alternative)
5230 : 45 : {
5231 : 70 : case 0:
5232 : 45 : ops = "andn%s\t{%%2, %%0|%%0, %%2}";
5233 : 45 : break;
5234 : 197 : case 1:
5235 : 222 : case 2:
5236 : 222 : case 3:
5237 : 222 : ops = "vandn%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}";
5238 : 222 : break;
5239 : 70 : default:
5240 : 70 : gcc_unreachable ();
5241 : 70 : }
5242 : 45 :
5243 : 5313 : switch (get_attr_mode (insn))
5244 : 45 : {
5245 : 45 : case MODE_V16BF:
5246 : 45 : case MODE_V8BF:
5247 : 45 : case MODE_V16HF:
5248 : 45 : case MODE_V8HF:
5249 : 45 : case MODE_V8SF:
5250 : 45 : case MODE_V4SF:
5251 : 45 : suffix = "ps";
5252 : 45 : break;
5253 : 49 : case MODE_OI:
5254 : 49 : case MODE_TI:
5255 : 45 : /* There is no vandnp[sd] in avx512f. Use vpandn[qd]. */
5256 : 49 : suffix = GET_MODE_INNER (<MODE>mode) == DFmode ? "q" : "d";
5257 : 49 : ops = "vpandn%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}";
5258 : 49 : break;
5259 : 2670 : default:
5260 : 2670 : suffix = "<ssemodesuffix>";
5261 : 45 : }
5262 : 45 :
5263 : 5313 : snprintf (buf, sizeof (buf), ops, suffix);
5264 : 5313 : output_asm_insn (buf, operands);
5265 : 5313 : return "";
5266 : 45 : }
5267 : 45 : [(set_attr "isa" "noavx,avx_noavx512f,avx512dq,avx512f")
5268 : 45 : (set_attr "addr" "*,gpr16,*,*")
5269 : 45 : (set_attr "type" "sselog")
5270 : 5313 : (set_attr "prefix" "orig,maybe_vex,evex,evex")
5271 : 45 : (set (attr "mode")
5272 : 45 : (cond [(and (match_test "<mask_applied>")
5273 : 45 : (and (eq_attr "alternative" "1")
5274 : 45 : (match_test "!TARGET_AVX512DQ")))
5275 : 45 : (const_string "<sseintvecmode2>")
5276 : 45 : (and (not (match_test "<mask_applied>"))
5277 : 45 : (eq_attr "alternative" "3")
5278 : 45 : (match_test "!x86_evex_reg_mentioned_p (operands, 3)"))
5279 : 45 : (const_string "<MODE>")
5280 : 45 : (eq_attr "alternative" "3")
5281 : 45 : (const_string "<sseintvecmode2>")
5282 : 45 : (match_test "TARGET_AVX")
5283 : 45 : (const_string "<MODE>")
5284 : 45 : (match_test "optimize_function_for_size_p (cfun)")
5285 : 45 : (const_string "V4SF")
5286 : 45 : (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL")
5287 : 45 : (const_string "V4SF")
5288 : 45 : ]
5289 : 45 : (const_string "<MODE>")))])
5290 : 45 :
5291 : 45 : (define_insn "<sse>_andnot<mode>3<mask_name>"
5292 : 45 : [(set (match_operand:VFB_512 0 "register_operand" "=v")
5293 : 45 : (and:VFB_512
5294 : 45 : (not:VFB_512
5295 : 45 : (match_operand:VFB_512 1 "register_operand" "v"))
5296 : 45 : (match_operand:VFB_512 2 "nonimmediate_operand" "vm")))]
5297 : 672 : "TARGET_AVX512F && (!<mask_applied> || <ssescalarsize> != 16)"
5298 : 117 : {
5299 : 117 : char buf[128];
5300 : 117 : const char *ops;
5301 : 117 : const char *suffix;
5302 : 45 :
5303 : 117 : suffix = "<ssemodesuffix>";
5304 : 117 : ops = "";
5305 : 45 :
5306 : 45 : /* Since there are no vandnp[sd] without AVX512DQ nor vandnph,
5307 : 45 : use vp<logic>[dq]. */
5308 : 117 : if (!TARGET_AVX512DQ || <MODE>mode == V32HFmode || <MODE>mode == V32BFmode)
5309 : 45 : {
5310 : 45 : suffix = GET_MODE_INNER (<MODE>mode) == DFmode ? "q" : "d";
5311 : 0 : ops = "p";
5312 : 0 : }
5313 : 0 :
5314 : 72 : snprintf (buf, sizeof (buf),
5315 : 0 : "v%sandn%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}",
5316 : 0 : ops, suffix);
5317 : 72 : output_asm_insn (buf, operands);
5318 : 72 : return "";
5319 : 0 : }
5320 : 0 : [(set_attr "type" "sselog")
5321 : 0 : (set_attr "prefix" "evex")
5322 : 0 : (set (attr "mode")
5323 : 73 : (if_then_else (match_test "TARGET_AVX512DQ")
5324 : 0 : (const_string "<sseinsnmode>")
5325 : 0 : (const_string "XI")))])
5326 : 0 :
5327 : 0 : (define_expand "<code><mode>3<mask_name>"
5328 : 16 : [(set (match_operand:VFB_128_256 0 "register_operand")
5329 : 16 : (any_logic:VFB_128_256
5330 : 16 : (match_operand:VFB_128_256 1 "vector_operand")
5331 : 16 : (match_operand:VFB_128_256 2 "vector_operand")))]
5332 : 16 : "TARGET_SSE && <mask_avx512vl_condition>
5333 : 16 : && (!<mask_applied> || <ssescalarsize> != 16)"
5334 : 41 : "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
5335 : 16 :
5336 : 16 : (define_expand "<code><mode>3<mask_name>"
5337 : 1239 : [(set (match_operand:VFB_512 0 "register_operand")
5338 : 1239 : (any_logic:VFB_512
5339 : 1223 : (match_operand:VFB_512 1 "nonimmediate_operand")
5340 : 1239 : (match_operand:VFB_512 2 "nonimmediate_operand")))]
5341 : 1239 : "TARGET_AVX512F && (!<mask_applied> || <ssescalarsize> != 16)"
5342 : 1455 : "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
5343 : 304 :
5344 : 951 : (define_insn "*<code><mode>3<mask_name>"
5345 : 520 : [(set (match_operand:VFB_128_256 0 "register_operand" "=x,x,v,v")
5346 : 520 : (any_logic:VFB_128_256
5347 : 232 : (match_operand:VFB_128_256 1 "vector_operand" "%0,x,v,v")
5348 : 1239 : (match_operand:VFB_128_256 2 "vector_operand" "xBm,xm,vm,vm")))]
5349 : 395413 : "TARGET_SSE && <mask_avx512vl_condition>
5350 : 1167 : && (!<mask_applied> || <ssescalarsize> != 16)
5351 : 398624 : && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
5352 : 74961 : {
5353 : 81296 : char buf[128];
5354 : 81296 : const char *ops;
5355 : 81507 : const char *suffix;
5356 : 8449 :
5357 : 2680 : switch (which_alternative)
5358 : 34 : {
5359 : 349 : case 0:
5360 : 349 : ops = "<logic>%s\t{%%2, %%0|%%0, %%2}";
5361 : 625 : break;
5362 : 2715 : case 1:
5363 : 2554 : case 2:
5364 : 2555 : case 3:
5365 : 2665 : ops = "v<logic>%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}";
5366 : 3114 : break;
5367 : 629 : default:
5368 : 288 : gcc_unreachable ();
5369 : 431 : }
5370 : 252 :
5371 : 75129 : switch (get_attr_mode (insn))
5372 : 665 : {
5373 : 217 : case MODE_V16BF:
5374 : 265 : case MODE_V8BF:
5375 : 265 : case MODE_V16HF:
5376 : 157 : case MODE_V8HF:
5377 : 178 : case MODE_V8SF:
5378 : 37 : case MODE_V4SF:
5379 : 34 : suffix = "ps";
5380 : 34 : break;
5381 : 50 : case MODE_OI:
5382 : 50 : case MODE_TI:
5383 : 34 : /* There is no v<logic>p[sd] in avx512f. Use vp<logic>[qd]. */
5384 : 50 : suffix = GET_MODE_INNER (<MODE>mode) == DFmode ? "q" : "d";
5385 : 50 : ops = "vp<logic>%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}";
5386 : 50 : break;
5387 : 37259 : default:
5388 : 37259 : suffix = "<ssemodesuffix>";
5389 : 34 : }
5390 : 34 :
5391 : 74907 : snprintf (buf, sizeof (buf), ops, suffix);
5392 : 74907 : output_asm_insn (buf, operands);
5393 : 74907 : return "";
5394 : 34 : }
5395 : 34 : [(set_attr "isa" "noavx,avx,avx512dq,avx512f")
5396 : 34 : (set_attr "type" "sselog")
5397 : 34 : (set_attr "prefix" "orig,maybe_evex,evex,evex")
5398 : 74907 : (set (attr "mode")
5399 : 34 : (cond [(and (match_test "<mask_applied>")
5400 : 34 : (and (eq_attr "alternative" "1")
5401 : 34 : (match_test "!TARGET_AVX512DQ")))
5402 : 34 : (const_string "<sseintvecmode2>")
5403 : 34 : (eq_attr "alternative" "3")
5404 : 34 : (const_string "<sseintvecmode2>")
5405 : 34 : (match_test "TARGET_AVX")
5406 : 34 : (const_string "<MODE>")
5407 : 34 : (match_test "optimize_function_for_size_p (cfun)")
5408 : 34 : (const_string "V4SF")
5409 : 34 : (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL")
5410 : 34 : (const_string "V4SF")
5411 : 34 : ]
5412 : 34 : (const_string "<MODE>")))])
5413 : 34 :
5414 : 34 : (define_insn "*<code><mode>3<mask_name>"
5415 : 34 : [(set (match_operand:VFB_512 0 "register_operand" "=v")
5416 : 34 : (any_logic:VFB_512
5417 : 34 : (match_operand:VFB_512 1 "nonimmediate_operand" "%v")
5418 : 34 : (match_operand:VFB_512 2 "nonimmediate_operand" "vm")))]
5419 : 2264 : "TARGET_AVX512F && !(MEM_P (operands[1]) && MEM_P (operands[2]))
5420 : 1856 : && (!<mask_applied> || <ssescalarsize> != 16)"
5421 : 325 : {
5422 : 325 : char buf[128];
5423 : 325 : const char *ops;
5424 : 325 : const char *suffix;
5425 : 34 :
5426 : 325 : suffix = "<ssemodesuffix>";
5427 : 325 : ops = "";
5428 : 34 :
5429 : 34 : /* Since there are no v<logic>p[sd] without AVX512DQ nor v<logic>ph,
5430 : 34 : use vp<logic>[dq]. */
5431 : 325 : if (!TARGET_AVX512DQ || <MODE>mode == V32HFmode || <MODE>mode == V32BFmode)
5432 : 34 : {
5433 : 43 : suffix = GET_MODE_INNER (<MODE>mode) == DFmode ? "q" : "d";
5434 : 42 : ops = "p";
5435 : 34 : }
5436 : 34 :
5437 : 325 : snprintf (buf, sizeof (buf),
5438 : 34 : "v%s<logic>%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}",
5439 : 34 : ops, suffix);
5440 : 325 : output_asm_insn (buf, operands);
5441 : 325 : return "";
5442 : 34 : }
5443 : 34 : [(set_attr "type" "sselog")
5444 : 34 : (set_attr "prefix" "evex")
5445 : 34 : (set (attr "mode")
5446 : 324 : (if_then_else (match_test "TARGET_AVX512DQ")
5447 : 34 : (const_string "<sseinsnmode>")
5448 : 34 : (const_string "XI")))])
5449 : 34 :
5450 : 34 : ;; Generic part doesn't support the simpliciation of logic operation with
5451 : 34 : ;; float_vector_all_ones_operand since it's not valid rtl. Add combine spiltter
5452 : 34 : ;; for them, it should be safe since there's no SIMD Floating-Point Exceptions.
5453 : 34 : (define_insn_and_split "*bit_and_float_vector_all_ones"
5454 : 34 : [(set (match_operand:VFB 0 "nonimmediate_operand")
5455 : 34 : (and:VFB (match_operand:VFB 1 "nonimmediate_operand")
5456 : 34 : (match_operand:VFB 2 "float_vector_all_ones_operand")))]
5457 : 86 : "TARGET_SSE && ix86_pre_reload_split ()"
5458 : 6215 : "#"
5459 : 34 : "&& 1"
5460 : 100350 : [(set (match_dup 0) (match_dup 1))]
5461 : 48 : "operands[1] = force_reg (<MODE>mode, operands[1]);")
5462 : 736 :
5463 : 100355 : (define_expand "copysign<mode>3"
5464 : 101064 : [(set (match_dup 4)
5465 : 101022 : (and:VFB
5466 : 680 : (not:VFB (match_dup 3))
5467 : 1278 : (match_operand:VFB 1 "vector_operand")))
5468 : 12962 : (set (match_dup 5)
5469 : 12955 : (and:VFB (match_dup 3)
5470 : 41 : (match_operand:VFB 2 "vector_operand")))
5471 : 3141 : (set (match_operand:VFB 0 "register_operand")
5472 : 3141 : (ior:VFB (match_dup 4) (match_dup 5)))]
5473 : 3134 : "TARGET_SSE"
5474 : 3230 : {
5475 : 3312 : operands[3] = ix86_build_signbit_mask (<MODE>mode, 1, 0);
5476 : 34 :
5477 : 130 : operands[4] = gen_reg_rtx (<MODE>mode);
5478 : 130 : operands[5] = gen_reg_rtx (<MODE>mode);
5479 : 34 : })
5480 : 37 :
5481 : 102 : (define_expand "xorsign<mode>3"
5482 : 198 : [(set (match_dup 4)
5483 : 102 : (and:VFB (match_dup 3)
5484 : 99 : (match_operand:VFB 2 "vector_operand")))
5485 : 109 : (set (match_operand:VFB 0 "register_operand")
5486 : 195 : (xor:VFB (match_dup 4)
5487 : 195 : (match_operand:VFB 1 "vector_operand")))]
5488 : 195 : "TARGET_SSE"
5489 : 214 : {
5490 : 108 : operands[3] = ix86_build_signbit_mask (<MODE>mode, 1, 0);
5491 : 130 :
5492 : 77 : operands[4] = gen_reg_rtx (<MODE>mode);
5493 : 130 : })
5494 : 34 :
5495 : 130 : (define_expand "signbit<mode>2"
5496 : 53 : [(set (match_operand:<sseintvecmode> 0 "register_operand")
5497 : 53 : (lshiftrt:<sseintvecmode>
5498 : 53 : (subreg:<sseintvecmode>
5499 : 53 : (match_operand:VF1_AVX2 1 "register_operand") 0)
5500 : 130 : (match_dup 2)))]
5501 : 53 : "TARGET_SSE2"
5502 : 57 : {
5503 : 61 : operands[1] = force_reg (<MODE>mode, operands[1]);
5504 : 134 : operands[2] = GEN_INT (GET_MODE_UNIT_BITSIZE (<MODE>mode)-1);
5505 : 53 : })
5506 : 34 :
5507 : 53 : ;; Also define scalar versions. These are used for abs, neg, and
5508 : 130 : ;; conditional move. Using subregs into vector modes causes register
5509 : 130 : ;; allocation lossage. These patterns do not allow memory operands
5510 : 134 : ;; because the native instructions read the full 128-bits.
5511 : 53 :
5512 : 38 : (define_insn "*andnot<mode>3"
5513 : 38 : [(set (match_operand:MODEF248 0 "register_operand" "=x,x,v,v")
5514 : 34 : (and:MODEF248
5515 : 88 : (not:MODEF248
5516 : 53 : (match_operand:MODEF248 1 "register_operand" "0,x,v,v"))
5517 : 53 : (match_operand:MODEF248 2 "register_operand" "x,x,v,v")))]
5518 : 34 : "TARGET_SSE"
5519 : 1586 : {
5520 : 1562 : char buf[128];
5521 : 1561 : const char *ops;
5522 : 17792 : const char *suffix
5523 : 11856 : = (get_attr_mode (insn) == MODE_V4SF) ? "ps" : "<ssevecmodesuffix>";
5524 : 10948 :
5525 : 1590 : switch (which_alternative)
5526 : 88 : {
5527 : 5913 : case 0:
5528 : 4243 : ops = "andn%s\t{%%2, %%0|%%0, %%2}";
5529 : 43 : break;
5530 : 43 : case 1:
5531 : 43 : ops = "vandn%s\t{%%2, %%1, %%0|%%0, %%1, %%2}";
5532 : 39 : break;
5533 : 5857 : case 2:
5534 : 39 : if (TARGET_AVX512DQ)
5535 : 34 : ops = "vandn%s\t{%%2, %%1, %%0|%%0, %%1, %%2}";
5536 : 2144 : else
5537 : 34 : {
5538 : 1541 : suffix = <MODE>mode == DFmode ? "q" : "d";
5539 : 1541 : ops = "vpandn%s\t{%%2, %%1, %%0|%%0, %%1, %%2}";
5540 : 34 : }
5541 : 2144 : break;
5542 : 135 : case 3:
5543 : 34 : if (TARGET_AVX512DQ)
5544 : 34 : ops = "vandn%s\t{%%g2, %%g1, %%g0|%%g0, %%g1, %%g2}";
5545 : 34 : else
5546 : 34 : {
5547 : 135 : suffix = <MODE>mode == DFmode ? "q" : "d";
5548 : 34 : ops = "vpandn%s\t{%%g2, %%g1, %%g0|%%g0, %%g1, %%g2}";
5549 : 34 : }
5550 : 128 : break;
5551 : 60 : default:
5552 : 34 : gcc_unreachable ();
5553 : 34 : }
5554 : 34 :
5555 : 1635 : snprintf (buf, sizeof (buf), ops, suffix);
5556 : 1967 : output_asm_insn (buf, operands);
5557 : 1541 : return "";
5558 : 34 : }
5559 : 34 : [(set_attr "isa" "noavx,avx,avx512vl,avx512f_512")
5560 : 34 : (set_attr "type" "sselog")
5561 : 434 : (set_attr "prefix" "orig,vex,evex,evex")
5562 : 1606 : (set (attr "mode")
5563 : 34 : (cond [(eq_attr "alternative" "2")
5564 : 34 : (if_then_else (match_test "TARGET_AVX512DQ")
5565 : 416 : (const_string "<ssevecmode>")
5566 : 328 : (const_string "TI"))
5567 : 34 : (eq_attr "alternative" "3")
5568 : 34 : (if_then_else (match_test "TARGET_AVX512DQ")
5569 : 34 : (const_string "<avx512fvecmode>")
5570 : 416 : (const_string "XI"))
5571 : 1499 : (match_test "TARGET_AVX")
5572 : 16 : (const_string "<ssevecmode>")
5573 : 18 : (match_test "optimize_function_for_size_p (cfun)")
5574 : 18 : (const_string "V4SF")
5575 : 18 : (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL")
5576 : 1189 : (const_string "V4SF")
5577 : 18 : ]
5578 : 18 : (const_string "<ssevecmode>")))])
5579 : 18 :
5580 : 133 : ;; Modes for andnot3 not covered by VI and MODEF.
5581 : 572 : (define_mode_iterator ANDNOT_MODE [TF V1TI])
5582 : 0 :
5583 : 0 : (define_insn "*andnot<mode>3"
5584 : 18 : [(set (match_operand:ANDNOT_MODE 0 "register_operand" "=x,x,v,v")
5585 : 133 : (and:ANDNOT_MODE
5586 : 602 : (not:ANDNOT_MODE (match_operand:ANDNOT_MODE 1 "register_operand" "0,x,v,v"))
5587 : 0 : (match_operand:ANDNOT_MODE 2 "vector_operand" "xBm,xjm,vm,v")))]
5588 : 982 : "TARGET_SSE"
5589 : 86 : {
5590 : 86 : char buf[128];
5591 : 116 : const char *ops;
5592 : 498 : const char *tmp
5593 : 477 : = (which_alternative >= 2 ? "pandnq"
5594 : 881 : : get_attr_mode (insn) == MODE_V4SF ? "andnps" : "pandn");
5595 : 47 :
5596 : 86 : switch (which_alternative)
5597 : 26 : {
5598 : 30449 : case 0:
5599 : 18 : ops = "%s\t{%%2, %%0|%%0, %%2}";
5600 : 47 : break;
5601 : 167 : case 1:
5602 : 30477 : case 2:
5603 : 30451 : ops = "v%s\t{%%2, %%1, %%0|%%0, %%1, %%2}";
5604 : 30451 : break;
5605 : 30449 : case 3:
5606 : 30596 : ops = "v%s\t{%%g2, %%g1, %%g0|%%g0, %%g1, %%g2}";
5607 : 30449 : break;
5608 : 0 : default:
5609 : 19925 : gcc_unreachable ();
5610 : 19925 : }
5611 : 19992 :
5612 : 68 : snprintf (buf, sizeof (buf), ops, tmp);
5613 : 5807 : output_asm_insn (buf, operands);
5614 : 5759 : return "";
5615 : 12 : }
5616 : 2600 : [(set_attr "isa" "noavx,avx_noavx512vl,avx512vl,avx512f_512")
5617 : 2547 : (set_attr "addr" "*,gpr16,*,*")
5618 : 2509 : (set_attr "type" "sselog")
5619 : 1932 : (set (attr "prefix_data16")
5620 : 4462 : (if_then_else
5621 : 12 : (and (eq_attr "alternative" "0")
5622 : 2 : (eq_attr "mode" "TI"))
5623 : 12 : (const_string "1")
5624 : 12 : (const_string "*")))
5625 : 25 : (set_attr "prefix" "orig,vex,evex,evex")
5626 : 0 : (set (attr "mode")
5627 : 0 : (cond [(and (eq_attr "alternative" "3")
5628 : 20 : (match_test "!x86_evex_reg_mentioned_p (operands, 3)"))
5629 : 12 : (const_string "TI")
5630 : 25 : (eq_attr "alternative" "2")
5631 : 0 : (const_string "TI")
5632 : 14979 : (eq_attr "alternative" "3")
5633 : 24 : (const_string "XI")
5634 : 12 : (match_test "TARGET_AVX")
5635 : 0 : (const_string "TI")
5636 : 9003 : (ior (not (match_test "TARGET_SSE2"))
5637 : 12 : (match_test "optimize_function_for_size_p (cfun)"))
5638 : 12 : (const_string "V4SF")
5639 : : (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL")
5640 : 282 : (const_string "V4SF")
5641 : 77351 : ]
5642 : 77364 : (const_string "TI")))])
5643 : 77351 :
5644 : 8 : (define_insn "<code><mode>3"
5645 : 8 : [(set (match_operand:MODEF248 0 "register_operand" "=x,x,v,v")
5646 : 21 : (any_logic:MODEF248
5647 : 21 : (match_operand:MODEF248 1 "register_operand" "%0,x,v,v")
5648 : 32 : (match_operand:MODEF248 2 "register_operand" "x,x,v,v")))]
5649 : 8 : "TARGET_SSE"
5650 : 3754 : {
5651 : 3767 : char buf[128];
5652 : 3754 : const char *ops;
5653 : 33514 : const char *suffix
5654 : 12556 : = (get_attr_mode (insn) == MODE_V4SF) ? "ps" : "<ssevecmodesuffix>";
5655 : 19451 :
5656 : 23186 : switch (which_alternative)
5657 : 8 : {
5658 : 30 : case 0:
5659 : 8 : ops = "<logic>%s\t{%%2, %%0|%%0, %%2}";
5660 : 8 : break;
5661 : 33 : case 2:
5662 : 31 : if (!TARGET_AVX512DQ)
5663 : 43 : {
5664 : 43 : suffix = <MODE>mode == DFmode ? "q" : "d";
5665 : 53 : ops = "vp<logic>%s\t{%%2, %%1, %%0|%%0, %%1, %%2}";
5666 : 66 : break;
5667 : 45 : }
5668 : 57 : /* FALLTHRU */
5669 : 47 : case 1:
5670 : 47 : ops = "v<logic>%s\t{%%2, %%1, %%0|%%0, %%1, %%2}";
5671 : 47 : break;
5672 : 22 : case 3:
5673 : 10 : if (TARGET_AVX512DQ)
5674 : 10 : ops = "v<logic>%s\t{%%g2, %%g1, %%g0|%%g0, %%g1, %%g2}";
5675 : : else
5676 : : {
5677 : 0 : suffix = <MODE>mode == DFmode ? "q" : "d";
5678 : 0 : ops = "vp<logic>%s\t{%%g2, %%g1, %%g0|%%g0, %%g1, %%g2}";
5679 : 36 : }
5680 : 0 : break;
5681 : 0 : default:
5682 : 0 : gcc_unreachable ();
5683 : 0 : }
5684 : 0 :
5685 : 3759 : snprintf (buf, sizeof (buf), ops, suffix);
5686 : 3782 : output_asm_insn (buf, operands);
5687 : 3782 : return "";
5688 : 36 : }
5689 : 36 : [(set_attr "isa" "noavx,avx,avx512vl,avx512f_512")
5690 : 36 : (set_attr "type" "sselog")
5691 : 36 : (set_attr "prefix" "orig,vex,evex,evex")
5692 : 5350 : (set (attr "mode")
5693 : 36 : (cond [(eq_attr "alternative" "2")
5694 : 23 : (if_then_else (match_test "TARGET_AVX512DQ")
5695 : 23 : (const_string "<ssevecmode>")
5696 : : (const_string "TI"))
5697 : : (eq_attr "alternative" "3")
5698 : : (if_then_else (match_test "TARGET_AVX512DQ")
5699 : : (const_string "<avx512fvecmode>")
5700 : : (const_string "XI"))
5701 : : (match_test "TARGET_AVX")
5702 : : (const_string "<ssevecmode>")
5703 : : (match_test "optimize_function_for_size_p (cfun)")
5704 : : (const_string "V4SF")
5705 : : (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL")
5706 : : (const_string "V4SF")
5707 : : ]
5708 : : (const_string "<ssevecmode>")))])
5709 : :
5710 : : (define_expand "<code>tf3"
5711 : : [(set (match_operand:TF 0 "register_operand")
5712 : : (any_logic:TF
5713 : : (match_operand:TF 1 "vector_operand")
5714 : : (match_operand:TF 2 "vector_operand")))]
5715 : : "TARGET_SSE"
5716 : 0 : "ix86_fixup_binary_operands_no_copy (<CODE>, TFmode, operands);")
5717 : :
5718 : : (define_insn "*<code>tf3"
5719 : 0 : [(set (match_operand:TF 0 "register_operand" "=x,x,v,v")
5720 : 0 : (any_logic:TF
5721 : 0 : (match_operand:TF 1 "vector_operand" "%0,x,v,v")
5722 : 0 : (match_operand:TF 2 "vector_operand" "xBm,xm,vm,v")))]
5723 : 5018 : "TARGET_SSE && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
5724 : 2253 : {
5725 : 2253 : char buf[128];
5726 : 2253 : const char *ops;
5727 : 2253 : const char *tmp
5728 : 1568 : = (which_alternative >= 2 ? "p<logic>q"
5729 : 2249 : : get_attr_mode (insn) == MODE_V4SF ? "<logic>ps" : "p<logic>");
5730 : 1346941 :
5731 : 1349194 : switch (which_alternative)
5732 : 16 : {
5733 : 296 : case 0:
5734 : 296 : ops = "%s\t{%%2, %%0|%%0, %%2}";
5735 : 296 : break;
5736 : 306 : case 1:
5737 : 15 : case 2:
5738 : 15 : ops = "v%s\t{%%2, %%1, %%0|%%0, %%1, %%2}";
5739 : 15 : break;
5740 : 0 : case 3:
5741 : 0 : ops = "v%s\t{%%g2, %%g1, %%g0|%%g0, %%g1, %%g2}";
5742 : 5 : break;
5743 : 0 : default:
5744 : 0 : gcc_unreachable ();
5745 : : }
5746 : :
5747 : 2253 : snprintf (buf, sizeof (buf), ops, tmp);
5748 : 2253 : output_asm_insn (buf, operands);
5749 : 2253 : return "";
5750 : 0 : }
5751 : 30 : [(set_attr "isa" "noavx,avx,avx512vl,avx512f_512")
5752 : 0 : (set_attr "type" "sselog")
5753 : : (set (attr "prefix_data16")
5754 : 685 : (if_then_else
5755 : : (and (eq_attr "alternative" "0")
5756 : 30 : (eq_attr "mode" "TI"))
5757 : : (const_string "1")
5758 : : (const_string "*")))
5759 : : (set_attr "prefix" "orig,vex,evex,evex")
5760 : : (set (attr "mode")
5761 : : (cond [(eq_attr "alternative" "2")
5762 : 0 : (const_string "TI")
5763 : : (eq_attr "alternative" "3")
5764 : : (const_string "QI")
5765 : : (match_test "TARGET_AVX")
5766 : 1402 : (const_string "TI")
5767 : : (ior (not (match_test "TARGET_SSE2"))
5768 : : (match_test "optimize_function_for_size_p (cfun)"))
5769 : : (const_string "V4SF")
5770 : : (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL")
5771 : 1402 : (const_string "V4SF")
5772 : : ]
5773 : : (const_string "TI")))])
5774 : :
5775 : : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5776 : : ;;
5777 : : ;; FMA floating point multiply/accumulate instructions. These include
5778 : 0 : ;; scalar versions of the instructions as well as vector versions.
5779 : 0 : ;;
5780 : 0 : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5781 : 5 :
5782 : : ;; The standard names for scalar FMA are only available with SSE math enabled.
5783 : : ;; CPUID bit AVX512F enables evex encoded scalar and 512-bit fma. It doesn't
5784 : : ;; care about FMA bit, so we enable fma for TARGET_AVX512F even when TARGET_FMA
5785 : 0 : ;; and TARGET_FMA4 are both false.
5786 : 5 : ;; TODO: In theory AVX512F does not automatically imply FMA, and without FMA
5787 : : ;; one must force the EVEX encoding of the fma insns. Ideally we'd improve
5788 : : ;; GAS to allow proper prefix selection. However, for the moment all hardware
5789 : : ;; that supports AVX512F also supports FMA so we can ignore this for now.
5790 : : (define_mode_iterator FMAMODEM
5791 : 0 : [(SF "TARGET_SSE_MATH && (TARGET_FMA || TARGET_FMA4 || TARGET_AVX512F)")
5792 : : (DF "TARGET_SSE_MATH && (TARGET_FMA || TARGET_FMA4 || TARGET_AVX512F)")
5793 : : (V4SF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL")
5794 : : (V2DF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL")
5795 : : (V8SF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL")
5796 : 20 : (V4DF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL")
5797 : : (V16SF "TARGET_AVX512F && TARGET_EVEX512")
5798 : : (V8DF "TARGET_AVX512F && TARGET_EVEX512")
5799 : : (HF "TARGET_AVX512FP16")
5800 : : (V8HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
5801 : 20 : (V16HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
5802 : : (V32HF "TARGET_AVX512FP16 && TARGET_EVEX512")
5803 : : (V8BF "TARGET_AVX10_2_256")
5804 : 0 : (V16BF "TARGET_AVX10_2_256")
5805 : 0 : (V32BF "TARGET_AVX10_2_512")])
5806 : 0 :
5807 : 0 : (define_expand "fma<mode>4"
5808 : 0 : [(set (match_operand:FMAMODEM 0 "register_operand")
5809 : 0 : (fma:FMAMODEM
5810 : 0 : (match_operand:FMAMODEM 1 "nonimmediate_operand")
5811 : 0 : (match_operand:FMAMODEM 2 "nonimmediate_operand")
5812 : 99 : (match_operand:FMAMODEM 3 "nonimmediate_operand")))])
5813 : :
5814 : : (define_expand "fms<mode>4"
5815 : : [(set (match_operand:FMAMODEM 0 "register_operand")
5816 : : (fma:FMAMODEM
5817 : 99 : (match_operand:FMAMODEM 1 "nonimmediate_operand")
5818 : : (match_operand:FMAMODEM 2 "nonimmediate_operand")
5819 : : (neg:FMAMODEM (match_operand:FMAMODEM 3 "nonimmediate_operand"))))])
5820 : :
5821 : : (define_expand "fnma<mode>4"
5822 : : [(set (match_operand:FMAMODEM 0 "register_operand")
5823 : : (fma:FMAMODEM
5824 : : (neg:FMAMODEM (match_operand:FMAMODEM 1 "nonimmediate_operand"))
5825 : : (match_operand:FMAMODEM 2 "nonimmediate_operand")
5826 : 25 : (match_operand:FMAMODEM 3 "nonimmediate_operand")))])
5827 : :
5828 : : (define_expand "fnms<mode>4"
5829 : : [(set (match_operand:FMAMODEM 0 "register_operand")
5830 : : (fma:FMAMODEM
5831 : 25 : (neg:FMAMODEM (match_operand:FMAMODEM 1 "nonimmediate_operand"))
5832 : : (match_operand:FMAMODEM 2 "nonimmediate_operand")
5833 : 0 : (neg:FMAMODEM (match_operand:FMAMODEM 3 "nonimmediate_operand"))))])
5834 : 0 :
5835 : 0 : ;; The builtins for intrinsics are not constrained by SSE math enabled.
5836 : 0 : (define_mode_iterator FMAMODE_AVX512
5837 : 0 : [(SF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512F")
5838 : 0 : (DF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512F")
5839 : 0 : (V4SF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL")
5840 : 0 : (V2DF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL")
5841 : 13 : (V8SF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL")
5842 : : (V4DF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL")
5843 : : (V16SF "TARGET_AVX512F && TARGET_EVEX512")
5844 : : (V8DF "TARGET_AVX512F && TARGET_EVEX512")])
5845 : :
5846 : 13 : (define_mode_iterator FMAMODE
5847 : : [SF DF V4SF V2DF V8SF V4DF])
5848 : :
5849 : : (define_expand "fma4i_fmadd_<mode>"
5850 : : [(set (match_operand:FMAMODE_AVX512 0 "register_operand")
5851 : : (fma:FMAMODE_AVX512
5852 : : (match_operand:FMAMODE_AVX512 1 "nonimmediate_operand")
5853 : : (match_operand:FMAMODE_AVX512 2 "nonimmediate_operand")
5854 : : (match_operand:FMAMODE_AVX512 3 "nonimmediate_operand")))])
5855 : :
5856 : 0 : (define_expand "fma4i_fmsub_<mode>"
5857 : 12 : [(set (match_operand:FMAMODE_AVX512 0 "register_operand")
5858 : : (fma:FMAMODE_AVX512
5859 : : (match_operand:FMAMODE_AVX512 1 "nonimmediate_operand")
5860 : : (match_operand:FMAMODE_AVX512 2 "nonimmediate_operand")
5861 : 0 : (neg:FMAMODE_AVX512
5862 : 0 : (match_operand:FMAMODE_AVX512 3 "nonimmediate_operand"))))])
5863 : 12 :
5864 : 12 : (define_expand "fma4i_fnmadd_<mode>"
5865 : 12 : [(set (match_operand:FMAMODE_AVX512 0 "register_operand")
5866 : 12 : (fma:FMAMODE_AVX512
5867 : 12 : (neg:FMAMODE_AVX512
5868 : 12 : (match_operand:FMAMODE_AVX512 1 "nonimmediate_operand"))
5869 : 12 : (match_operand:FMAMODE_AVX512 2 "nonimmediate_operand")
5870 : 12 : (match_operand:FMAMODE_AVX512 3 "nonimmediate_operand")))])
5871 : 12 :
5872 : 10 : (define_expand "fma4i_fnmsub_<mode>"
5873 : : [(set (match_operand:FMAMODE_AVX512 0 "register_operand")
5874 : : (fma:FMAMODE_AVX512
5875 : : (neg:FMAMODE_AVX512
5876 : : (match_operand:FMAMODE_AVX512 1 "nonimmediate_operand"))
5877 : : (match_operand:FMAMODE_AVX512 2 "nonimmediate_operand")
5878 : : (neg:FMAMODE_AVX512
5879 : 10 : (match_operand:FMAMODE_AVX512 3 "nonimmediate_operand"))))])
5880 : 10 :
5881 : 10 : (define_expand "<avx512>_fmadd_<mode>_maskz<round_expand_name>"
5882 : 10 : [(match_operand:VFH_AVX512VL 0 "register_operand")
5883 : 10 : (match_operand:VFH_AVX512VL 1 "<round_expand_nimm_predicate>")
5884 : 10 : (match_operand:VFH_AVX512VL 2 "<round_expand_nimm_predicate>")
5885 : 10 : (match_operand:VFH_AVX512VL 3 "<round_expand_nimm_predicate>")
5886 : 10 : (match_operand:<avx512fmaskmode> 4 "register_operand")]
5887 : 10 : "TARGET_AVX512F && <round_mode_condition>"
5888 : 175 : {
5889 : 175 : emit_insn (gen_fma_fmadd_<mode>_maskz_1<round_expand_name> (
5890 : : operands[0], operands[1], operands[2], operands[3],
5891 : : CONST0_RTX (<MODE>mode), operands[4]<round_expand_operand>));
5892 : 175 : DONE;
5893 : : })
5894 : :
5895 : : (define_insn "*fma_fmadd_<mode>"
5896 : : [(set (match_operand:FMAMODE 0 "register_operand" "=v,v,v,x,x")
5897 : : (fma:FMAMODE
5898 : : (match_operand:FMAMODE 1 "nonimmediate_operand" "%0,0,v,x,x")
5899 : : (match_operand:FMAMODE 2 "nonimmediate_operand" "vm,v,vm,x,m")
5900 : : (match_operand:FMAMODE 3 "nonimmediate_operand" "v,vm,0,xm,x")))]
5901 : 153919 : "TARGET_FMA || TARGET_FMA4"
5902 : : "@
5903 : 25746 : vfmadd132<ssemodesuffix>\t{%2, %3, %0|%0, %3, %2}
5904 : 23903 : vfmadd213<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}
5905 : 21472 : vfmadd231<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}
5906 : 26148 : vfmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}
5907 : : vfmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
5908 : : [(set_attr "isa" "fma,fma,fma,fma4,fma4")
5909 : : (set_attr "type" "ssemuladd")
5910 : : (set_attr "mode" "<MODE>")])
5911 : :
5912 : : ;; Suppose AVX-512F as baseline
5913 : : (define_mode_iterator VFH_SF_AVX512VL
5914 : 27 : [(V32HF "TARGET_AVX512FP16 && TARGET_EVEX512")
5915 : 1470 : (V16HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
5916 : 383 : (V8HF "TARGET_AVX512FP16 && TARGET_AVX512VL")
5917 : 787 : (HF "TARGET_AVX512FP16")
5918 : 16431 : SF (V16SF "TARGET_EVEX512")
5919 : 2629 : (V8SF "TARGET_AVX512VL") (V4SF "TARGET_AVX512VL")
5920 : 8409 : DF (V8DF "TARGET_EVEX512")
5921 : 16728 : (V4DF "TARGET_AVX512VL") (V2DF "TARGET_AVX512VL")])
5922 : 28272 :
5923 : 13503 : (define_insn "<sd_mask_codefor>fma_fmadd_<mode><sd_maskz_name><round_name>"
5924 : 74573 : [(set (match_operand:VFH_SF_AVX512VL 0 "register_operand" "=v,v,v")
5925 : 49170 : (fma:VFH_SF_AVX512VL
5926 : 45802 : (match_operand:VFH_SF_AVX512VL 1 "<bcst_round_nimm_predicate>" "%0,0,v")
5927 : 51612 : (match_operand:VFH_SF_AVX512VL 2 "<bcst_round_nimm_predicate>" "<bcst_round_constraint>,v,<bcst_round_constraint>")
5928 : 94118 : (match_operand:VFH_SF_AVX512VL 3 "<bcst_round_nimm_predicate>" "v,<bcst_round_constraint>,0")))]
5929 : 98263 : "TARGET_AVX512F && <sd_mask_mode512bit_condition> && <round_mode_condition>"
5930 : 96728 : "@
5931 : 44528 : vfmadd132<ssemodesuffix>\t{<round_sd_mask_op4>%2, %3, %0<sd_mask_op4>|%0<sd_mask_op4>, %3, %2<round_sd_mask_op4>}
5932 : 37627 : vfmadd213<ssemodesuffix>\t{<round_sd_mask_op4>%3, %2, %0<sd_mask_op4>|%0<sd_mask_op4>, %2, %3<round_sd_mask_op4>}
5933 : 105012 : vfmadd231<ssemodesuffix>\t{<round_sd_mask_op4>%2, %1, %0<sd_mask_op4>|%0<sd_mask_op4>, %1, %2<round_sd_mask_op4>}"
5934 : 39044 : [(set_attr "type" "ssemuladd")
5935 : 49643 : (set_attr "prefix" "evex")
5936 : 14498 : (set_attr "mode" "<MODE>")])
5937 : 44292 :
5938 : 42854 : (define_expand "cond_fma<mode>"
5939 : 32186 : [(set (match_operand:VFH_AVX512VL 0 "register_operand")
5940 : 113300 : (vec_merge:VFH_AVX512VL
5941 : 1104 : (fma:VFH_AVX512VL
5942 : 501 : (match_operand:VFH_AVX512VL 2 "vector_operand")
5943 : 14450 : (match_operand:VFH_AVX512VL 3 "vector_operand")
5944 : 13920 : (match_operand:VFH_AVX512VL 4 "vector_operand"))
5945 : 28495 : (match_operand:VFH_AVX512VL 5 "nonimm_or_0_operand")
5946 : 125 : (match_operand:<avx512fmaskmode> 1 "register_operand")))]
5947 : 12189370 : "TARGET_AVX512F"
5948 : 15165 : {
5949 : 13816 : rtx tmp = gen_reg_rtx (<MODE>mode);
5950 : 13999 : emit_insn (gen_fma<mode>4 (tmp,
5951 : 6423307 : operands[2],
5952 : 1302 : operands[3],
5953 : 6422005 : operands[4]));
5954 : 6423128 : emit_move_insn (operands[0], gen_rtx_VEC_MERGE (<MODE>mode,
5955 : 6423049 : tmp,
5956 : : operands[5],
5957 : 2878261 : operands[1]));
5958 : 2878340 : DONE;
5959 : 2845481 : })
5960 : 5551152 :
5961 : 834 : (define_insn "<avx512>_fmadd_<mode>_mask<round_name>"
5962 : 834 : [(set (match_operand:VFH_AVX512VL 0 "register_operand" "=v,v")
5963 : 834 : (vec_merge:VFH_AVX512VL
5964 : : (fma:VFH_AVX512VL
5965 : 834 : (match_operand:VFH_AVX512VL 1 "nonimmediate_operand" "0,0")
5966 : 834 : (match_operand:VFH_AVX512VL 2 "<round_nimm_predicate>" "<round_constraint>,v")
5967 : : (match_operand:VFH_AVX512VL 3 "<round_nimm_predicate>" "v,<round_constraint>"))
5968 : 834 : (match_dup 1)
5969 : 834 : (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk,Yk")))]
5970 : 993 : "TARGET_AVX512F && <round_mode_condition>"
5971 : 834 : "@
5972 : 834 : vfmadd132<ssemodesuffix>\t{<round_op5>%2, %3, %0%{%4%}|%0%{%4%}, %3, %2<round_op5>}
5973 : : vfmadd213<ssemodesuffix>\t{<round_op5>%3, %2, %0%{%4%}|%0%{%4%}, %2, %3<round_op5>}"
5974 : 834 : [(set_attr "type" "ssemuladd")
5975 : 834 : (set_attr "prefix" "evex")
5976 : 1212 : (set_attr "mode" "<MODE>")])
5977 : 816 :
5978 : 1650 : (define_insn "<avx512>_fmadd_<mode>_mask3<round_name>"
5979 : 18 : [(set (match_operand:VFH_AVX512VL 0 "register_operand" "=v")
5980 : 816 : (vec_merge:VFH_AVX512VL
5981 : 816 : (fma:VFH_AVX512VL
5982 : 1051 : (match_operand:VFH_AVX512VL 1 "<round_nimm_predicate>" "%v")
5983 : 816 : (match_operand:VFH_AVX512VL 2 "<round_nimm_predicate>" "<round_constraint>")
5984 : 816 : (match_operand:VFH_AVX512VL 3 "nonimmediate_operand" "0"))
5985 : 816 : (match_dup 3)
5986 : : (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
5987 : 383 : "TARGET_AVX512F && <round_mode_condition>"
5988 : 813 : "vfmadd231<ssemodesuffix>\t{<round_op5>%2, %1, %0%{%4%}|%0%{%4%}, %1, %2<round_op5>}"
5989 : 813 : [(set_attr "type" "ssemuladd")
5990 : 103 : (set_attr "prefix" "evex")
5991 : 774 : (set_attr "mode" "<MODE>")])
5992 : 774 :
5993 : 1080 : (define_insn "*fma_fmsub_<mode>"
5994 : : [(set (match_operand:FMAMODE 0 "register_operand" "=v,v,v,x,x")
5995 : 774 : (fma:FMAMODE
5996 : 811 : (match_operand:FMAMODE 1 "nonimmediate_operand" "%0,0,v,x,x")
5997 : 103 : (match_operand:FMAMODE 2 "nonimmediate_operand" "vm,v,vm,x,m")
5998 : 361 : (neg:FMAMODE
5999 : 995 : (match_operand:FMAMODE 3 "nonimmediate_operand" "v,vm,0,xm,x"))))]
6000 : 14595 : "TARGET_FMA || TARGET_FMA4"
6001 : 361 : "@
6002 : 953 : vfmsub132<ssemodesuffix>\t{%2, %3, %0|%0, %3, %2}
6003 : 686 : vfmsub213<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}
6004 : 663 : vfmsub231<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}
6005 : 874 : vfmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}
6006 : 66 : vfmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
6007 : : [(set_attr "isa" "fma,fma,fma,fma4,fma4")
6008 : : (set_attr "type" "ssemuladd")
6009 : : (set_attr "mode" "<MODE>")])
6010 : :
6011 : : (define_expand "<avx512>_fmsub_<mode>_maskz<round_expand_name>"
6012 : : [(match_operand:VFH_AVX512VL 0 "register_operand")
6013 : : (match_operand:VFH_AVX512VL 1 "<round_expand_nimm_predicate>")
6014 : : (match_operand:VFH_AVX512VL 2 "<round_expand_nimm_predicate>")
6015 : : (match_operand:VFH_AVX512VL 3 "<round_expand_nimm_predicate>")
6016 : : (match_operand:<avx512fmaskmode> 4 "register_operand")]
6017 : : "TARGET_AVX512F && <round_mode_condition>"
6018 : 175 : {
6019 : 175 : emit_insn (gen_fma_fmsub_<mode>_maskz_1<round_expand_name> (
6020 : : operands[0], operands[1], operands[2], operands[3],
6021 : : CONST0_RTX (<MODE>mode), operands[4]<round_expand_operand>));
6022 : 175 : DONE;
6023 : : })
6024 : :
6025 : : (define_insn "<sd_mask_codefor>fma_fmsub_<mode><sd_maskz_name><round_name>"
6026 : : [(set (match_operand:VFH_SF_AVX512VL 0 "register_operand" "=v,v,v")
6027 : : (fma:VFH_SF_AVX512VL
6028 : : (match_operand:VFH_SF_AVX512VL 1 "<bcst_round_nimm_predicate>" "%0,0,v")
6029 : : (match_operand:VFH_SF_AVX512VL 2 "<bcst_round_nimm_predicate>" "<bcst_round_constraint>,v,<bcst_round_constraint>")
6030 : : (neg:VFH_SF_AVX512VL
6031 : : (match_operand:VFH_SF_AVX512VL 3 "<bcst_round_nimm_predicate>" "v,<bcst_round_constraint>,0"))))]
6032 : 1525 : "TARGET_AVX512F && <sd_mask_mode512bit_condition> && <round_mode_condition>"
6033 : 22 : "@
6034 : : vfmsub132<ssemodesuffix>\t{<round_sd_mask_op4>%2, %3, %0<sd_mask_op4>|%0<sd_mask_op4>, %3, %2<round_sd_mask_op4>}
6035 : : vfmsub213<ssemodesuffix>\t{<round_sd_mask_op4>%3, %2, %0<sd_mask_op4>|%0<sd_mask_op4>, %2, %3<round_sd_mask_op4>}
6036 : 6152 : vfmsub231<ssemodesuffix>\t{<round_sd_mask_op4>%2, %1, %0<sd_mask_op4>|%0<sd_mask_op4>, %1, %2<round_sd_mask_op4>}"
6037 : 6152 : [(set_attr "type" "ssemuladd")
6038 : 5940 : (set_attr "prefix" "evex")
6039 : 11496 : (set_attr "mode" "<MODE>")])
6040 : :
6041 : 5430 : (define_expand "cond_fms<mode>"
6042 : 5430 : [(set (match_operand:VFH_AVX512VL 0 "register_operand")
6043 : 5416 : (vec_merge:VFH_AVX512VL
6044 : 11897 : (fma:VFH_AVX512VL
6045 : : (match_operand:VFH_AVX512VL 2 "vector_operand")
6046 : : (match_operand:VFH_AVX512VL 3 "vector_operand")
6047 : : (neg:VFH_AVX512VL
6048 : : (match_operand:VFH_AVX512VL 4 "vector_operand")))
6049 : 85 : (match_operand:VFH_AVX512VL 5 "nonimm_or_0_operand")
6050 : : (match_operand:<avx512fmaskmode> 1 "register_operand")))]
6051 : : "TARGET_AVX512F"
6052 : 68 : {
6053 : 136 : rtx tmp = gen_reg_rtx (<MODE>mode);
6054 : 68 : emit_insn (gen_fms<mode>4 (tmp,
6055 : 81 : operands[2],
6056 : 83 : operands[3],
6057 : 59 : operands[4]));
6058 : 68 : emit_move_insn (operands[0], gen_rtx_VEC_MERGE (<MODE>mode,
6059 : 85 : tmp,
6060 : 85 : operands[5],
6061 : 98 : operands[1]));
6062 : 81 : DONE;
6063 : 105 : })
6064 : 114 :
6065 : 83 : (define_insn "<avx512>_fmsub_<mode>_mask<round_name>"
6066 : 55 : [(set (match_operand:VFH_AVX512VL 0 "register_operand" "=v,v")
6067 : 55 : (vec_merge:VFH_AVX512VL
6068 : 55 : (fma:VFH_AVX512VL
6069 : 55 : (match_operand:VFH_AVX512VL 1 "nonimmediate_operand" "0,0")
6070 : 42 : (match_operand:VFH_AVX512VL 2 "<round_nimm_predicate>" "<round_constraint>,v")
6071 : 42 : (neg:VFH_AVX512VL
6072 : : (match_operand:VFH_AVX512VL 3 "<round_nimm_predicate>" "v,<round_constraint>")))
6073 : : (match_dup 1)
6074 : : (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk,Yk")))]
6075 : 975 : "TARGET_AVX512F && <round_mode_condition>"
6076 : : "@
6077 : : vfmsub132<ssemodesuffix>\t{<round_op5>%2, %3, %0%{%4%}|%0%{%4%}, %3, %2<round_op5>}
6078 : : vfmsub213<ssemodesuffix>\t{<round_op5>%3, %2, %0%{%4%}|%0%{%4%}, %2, %3<round_op5>}"
6079 : : [(set_attr "type" "ssemuladd")
6080 : : (set_attr "prefix" "evex")
6081 : 376 : (set_attr "mode" "<MODE>")])
6082 : :
6083 : : (define_insn "<avx512>_fmsub_<mode>_mask3<round_name>"
6084 : : [(set (match_operand:VFH_AVX512VL 0 "register_operand" "=v")
6085 : : (vec_merge:VFH_AVX512VL
6086 : : (fma:VFH_AVX512VL
6087 : 1049 : (match_operand:VFH_AVX512VL 1 "<round_nimm_predicate>" "%v")
6088 : : (match_operand:VFH_AVX512VL 2 "<round_nimm_predicate>" "<round_constraint>")
6089 : : (neg:VFH_AVX512VL
6090 : : (match_operand:VFH_AVX512VL 3 "nonimmediate_operand" "0")))
6091 : : (match_dup 3)
6092 : : (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
6093 : 370 : "TARGET_AVX512F && <round_mode_condition>"
6094 : : "vfmsub231<ssemodesuffix>\t{<round_op5>%2, %1, %0%{%4%}|%0%{%4%}, %1, %2<round_op5>}"
6095 : 106 : [(set_attr "type" "ssemuladd")
6096 : : (set_attr "prefix" "evex")
6097 : : (set_attr "mode" "<MODE>")])
6098 : :
6099 : 304 : (define_insn "*fma_fnmadd_<mode>"
6100 : : [(set (match_operand:FMAMODE 0 "register_operand" "=v,v,v,x,x")
6101 : 50 : (fma:FMAMODE
6102 : 106 : (neg:FMAMODE
6103 : 106 : (match_operand:FMAMODE 1 "nonimmediate_operand" "%0,0,v,x,x"))
6104 : 106 : (match_operand:FMAMODE 2 "nonimmediate_operand" "vm,v,vm,x,m")
6105 : 969 : (match_operand:FMAMODE 3 "nonimmediate_operand" "v,vm,0,xm,x")))]
6106 : 31693 : "TARGET_FMA || TARGET_FMA4"
6107 : 106 : "@
6108 : 8487 : vfnmadd132<ssemodesuffix>\t{%2, %3, %0|%0, %3, %2}
6109 : 6030 : vfnmadd213<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}
6110 : 5685 : vfnmadd231<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}
6111 : 8706 : vfnmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}
6112 : : vfnmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
6113 : : [(set_attr "isa" "fma,fma,fma,fma4,fma4")
6114 : : (set_attr "type" "ssemuladd")
6115 : : (set_attr "mode" "<MODE>")])
6116 : :
6117 : : (define_expand "<avx512>_fnmadd_<mode>_maskz<round_expand_name>"
6118 : : [(match_operand:VFH_AVX512VL 0 "register_operand")
6119 : : (match_operand:VFH_AVX512VL 1 "<round_expand_nimm_predicate>")
6120 : : (match_operand:VFH_AVX512VL 2 "<round_expand_nimm_predicate>")
6121 : : (match_operand:VFH_AVX512VL 3 "<round_expand_nimm_predicate>")
6122 : : (match_operand:<avx512fmaskmode> 4 "register_operand")]
6123 : : "TARGET_AVX512F && <round_mode_condition>"
6124 : 175 : {
6125 : 175 : emit_insn (gen_fma_fnmadd_<mode>_maskz_1<round_expand_name> (
6126 : : operands[0], operands[1], operands[2], operands[3],
6127 : : CONST0_RTX (<MODE>mode), operands[4]<round_expand_operand>));
6128 : 175 : DONE;
6129 : : })
6130 : :
6131 : : (define_insn "<sd_mask_codefor>fma_fnmadd_<mode><sd_maskz_name><round_name>"
6132 : : [(set (match_operand:VFH_SF_AVX512VL 0 "register_operand" "=v,v,v")
6133 : : (fma:VFH_SF_AVX512VL
6134 : : (neg:VFH_SF_AVX512VL
6135 : : (match_operand:VFH_SF_AVX512VL 1 "<bcst_round_nimm_predicate>" "%0,0,v"))
6136 : : (match_operand:VFH_SF_AVX512VL 2 "<bcst_round_nimm_predicate>" "<bcst_round_constraint>,v,<bcst_round_constraint>")
6137 : : (match_operand:VFH_SF_AVX512VL 3 "<bcst_round_nimm_predicate>" "v,<bcst_round_constraint>,0")))]
6138 : 9792 : "TARGET_AVX512F && <sd_mask_mode512bit_condition> && <round_mode_condition>"
6139 : 229 : "@
6140 : : vfnmadd132<ssemodesuffix>\t{<round_sd_mask_op4>%2, %3, %0<sd_mask_op4>|%0<sd_mask_op4>, %3, %2<round_sd_mask_op4>}
6141 : : vfnmadd213<ssemodesuffix>\t{<round_sd_mask_op4>%3, %2, %0<sd_mask_op4>|%0<sd_mask_op4>, %2, %3<round_sd_mask_op4>}
6142 : 8082 : vfnmadd231<ssemodesuffix>\t{<round_sd_mask_op4>%2, %1, %0<sd_mask_op4>|%0<sd_mask_op4>, %1, %2<round_sd_mask_op4>}"
6143 : 8082 : [(set_attr "type" "ssemuladd")
6144 : 8127 : (set_attr "prefix" "evex")
6145 : 15595 : (set_attr "mode" "<MODE>")])
6146 : :
6147 : 7608 : (define_expand "cond_fnma<mode>"
6148 : 7571 : [(set (match_operand:VFH_AVX512VL 0 "register_operand")
6149 : 7571 : (vec_merge:VFH_AVX512VL
6150 : 16234 : (fma:VFH_AVX512VL
6151 : : (neg:VFH_AVX512VL
6152 : : (match_operand:VFH_AVX512VL 2 "vector_operand"))
6153 : : (match_operand:VFH_AVX512VL 3 "vector_operand")
6154 : : (match_operand:VFH_AVX512VL 4 "vector_operand"))
6155 : 35 : (match_operand:VFH_AVX512VL 5 "nonimm_or_0_operand")
6156 : : (match_operand:<avx512fmaskmode> 1 "register_operand")))]
6157 : : "TARGET_AVX512F"
6158 : 56 : {
6159 : 112 : rtx tmp = gen_reg_rtx (<MODE>mode);
6160 : 56 : emit_insn (gen_fnma<mode>4 (tmp,
6161 : 103 : operands[2],
6162 : 23 : operands[3],
6163 : 22 : operands[4]));
6164 : 56 : emit_move_insn (operands[0], gen_rtx_VEC_MERGE (<MODE>mode,
6165 : 35 : tmp,
6166 : 35 : operands[5],
6167 : 48 : operands[1]));
6168 : 69 : DONE;
6169 : 103 : })
6170 : 112 :
6171 : 90 : (define_insn "<avx512>_fnmadd_<mode>_mask<round_name>"
6172 : 90 : [(set (match_operand:VFH_AVX512VL 0 "register_operand" "=v,v")
6173 : 90 : (vec_merge:VFH_AVX512VL
6174 : 90 : (fma:VFH_AVX512VL
6175 : 90 : (neg:VFH_AVX512VL
6176 : 77 : (match_operand:VFH_AVX512VL 1 "nonimmediate_operand" "0,0"))
6177 : 77 : (match_operand:VFH_AVX512VL 2 "<round_nimm_predicate>" "<round_constraint>,v")
6178 : : (match_operand:VFH_AVX512VL 3 "<round_nimm_predicate>" "v,<round_constraint>"))
6179 : : (match_dup 1)
6180 : : (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk,Yk")))]
6181 : 975 : "TARGET_AVX512F && <round_mode_condition>"
6182 : : "@
6183 : : vfnmadd132<ssemodesuffix>\t{<round_op5>%2, %3, %0%{%4%}|%0%{%4%}, %3, %2<round_op5>}
6184 : : vfnmadd213<ssemodesuffix>\t{<round_op5>%3, %2, %0%{%4%}|%0%{%4%}, %2, %3<round_op5>}"
6185 : : [(set_attr "type" "ssemuladd")
6186 : : (set_attr "prefix" "evex")
6187 : 376 : (set_attr "mode" "<MODE>")])
6188 : :
6189 : : (define_insn "<avx512>_fnmadd_<mode>_mask3<round_name>"
6190 : : [(set (match_operand:VFH_AVX512VL 0 "register_operand" "=v")
6191 : : (vec_merge:VFH_AVX512VL
6192 : : (fma:VFH_AVX512VL
6193 : 1049 : (neg:VFH_AVX512VL
6194 : : (match_operand:VFH_AVX512VL 1 "<round_nimm_predicate>" "%v"))
6195 : : (match_operand:VFH_AVX512VL 2 "<round_nimm_predicate>" "<round_constraint>")
6196 : : (match_operand:VFH_AVX512VL 3 "nonimmediate_operand" "0"))
6197 : : (match_dup 3)
6198 : : (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
6199 : 368 : "TARGET_AVX512F && <round_mode_condition>"
6200 : : "vfnmadd231<ssemodesuffix>\t{<round_op5>%2, %1, %0%{%4%}|%0%{%4%}, %1, %2<round_op5>}"
6201 : 103 : [(set_attr "type" "ssemuladd")
6202 : : (set_attr "prefix" "evex")
6203 : : (set_attr "mode" "<MODE>")])
6204 : :
6205 : 304 : (define_insn "*fma_fnmsub_<mode>"
6206 : : [(set (match_operand:FMAMODE 0 "register_operand" "=v,v,v,x,x")
6207 : 37 : (fma:FMAMODE
6208 : 103 : (neg:FMAMODE
6209 : 103 : (match_operand:FMAMODE 1 "nonimmediate_operand" "%0,0,v,x,x"))
6210 : 103 : (match_operand:FMAMODE 2 "nonimmediate_operand" "vm,v,vm,x,m")
6211 : 966 : (neg:FMAMODE
6212 : 103 : (match_operand:FMAMODE 3 "nonimmediate_operand" "v,vm,0,xm,x"))))]
6213 : 6500 : "TARGET_FMA || TARGET_FMA4"
6214 : 103 : "@
6215 : 734 : vfnmsub132<ssemodesuffix>\t{<round_sd_mask_op4>%2, %3, %0<sd_mask_op4>|%0<sd_mask_op4>, %3, %2<round_sd_mask_op4>}
6216 : 673 : vfnmsub213<ssemodesuffix>\t{<round_sd_mask_op4>%3, %2, %0<sd_mask_op4>|%0<sd_mask_op4>, %2, %3<round_sd_mask_op4>}
6217 : 673 : vfnmsub231<ssemodesuffix>\t{<round_sd_mask_op4>%2, %1, %0<sd_mask_op4>|%0<sd_mask_op4>, %1, %2<round_sd_mask_op4>}
6218 : 1276 : vfnmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}
6219 : 0 : vfnmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
6220 : 143 : [(set_attr "isa" "fma,fma,fma,fma4,fma4")
6221 : 142 : (set_attr "type" "ssemuladd")
6222 : 142 : (set_attr "mode" "<MODE>")])
6223 : 285 :
6224 : : (define_expand "<avx512>_fnmsub_<mode>_maskz<round_expand_name>"
6225 : : [(match_operand:VFH_AVX512VL 0 "register_operand")
6226 : : (match_operand:VFH_AVX512VL 1 "<round_expand_nimm_predicate>")
6227 : 42846 : (match_operand:VFH_AVX512VL 2 "<round_expand_nimm_predicate>")
6228 : : (match_operand:VFH_AVX512VL 3 "<round_expand_nimm_predicate>")
6229 : : (match_operand:<avx512fmaskmode> 4 "register_operand")]
6230 : : "TARGET_AVX512F && <round_mode_condition>"
6231 : 43021 : {
6232 : 43021 : emit_insn (gen_fma_fnmsub_<mode>_maskz_1<round_expand_name> (
6233 : 42846 : operands[0], operands[1], operands[2], operands[3],
6234 : 42846 : CONST0_RTX (<MODE>mode), operands[4]<round_expand_operand>));
6235 : 43021 : DONE;
6236 : 42846 : })
6237 : :
6238 : 42836 : (define_insn "<sd_mask_codefor>fma_fnmsub_<mode><sd_maskz_name><round_name>"
6239 : 42836 : [(set (match_operand:VFH_SF_AVX512VL 0 "register_operand" "=v,v,v")
6240 : 42836 : (fma:VFH_SF_AVX512VL
6241 : : (neg:VFH_SF_AVX512VL
6242 : 41527 : (match_operand:VFH_SF_AVX512VL 1 "<bcst_round_nimm_predicate>" "%0,0,v"))
6243 : 41527 : (match_operand:VFH_SF_AVX512VL 2 "<bcst_round_nimm_predicate>" "<bcst_round_constraint>,v,<bcst_round_constraint>")
6244 : 41527 : (neg:VFH_SF_AVX512VL
6245 : 41527 : (match_operand:VFH_SF_AVX512VL 3 "<bcst_round_nimm_predicate>" "v,<bcst_round_constraint>,0"))))]
6246 : 1198 : "TARGET_AVX512F && <sd_mask_mode512bit_condition> && <round_mode_condition>"
6247 : 41570 : "@
6248 : : vfnmsub132<ssemodesuffix>\t{<round_sd_mask_op4>%2, %3, %0<sd_mask_op4>|%0<sd_mask_op4>, %3, %2<round_sd_mask_op4>}
6249 : 23 : vfnmsub213<ssemodesuffix>\t{<round_sd_mask_op4>%3, %2, %0<sd_mask_op4>|%0<sd_mask_op4>, %2, %3<round_sd_mask_op4>}
6250 : 2202 : vfnmsub231<ssemodesuffix>\t{<round_sd_mask_op4>%2, %1, %0<sd_mask_op4>|%0<sd_mask_op4>, %1, %2<round_sd_mask_op4>}"
6251 : 2202 : [(set_attr "type" "ssemuladd")
6252 : 297 : (set_attr "prefix" "evex")
6253 : 2121 : (set_attr "mode" "<MODE>")])
6254 : 2115 :
6255 : 2115 : (define_expand "cond_fnms<mode>"
6256 : 4232 : [(set (match_operand:VFH_AVX512VL 0 "register_operand")
6257 : : (vec_merge:VFH_AVX512VL
6258 : 983 : (fma:VFH_AVX512VL
6259 : : (neg:VFH_AVX512VL
6260 : : (match_operand:VFH_AVX512VL 2 "vector_operand"))
6261 : : (match_operand:VFH_AVX512VL 3 "vector_operand")
6262 : 91 : (neg:VFH_AVX512VL
6263 : : (match_operand:VFH_AVX512VL 4 "vector_operand")))
6264 : : (match_operand:VFH_AVX512VL 5 "nonimm_or_0_operand")
6265 : : (match_operand:<avx512fmaskmode> 1 "register_operand")))]
6266 : : "TARGET_AVX512F"
6267 : 54 : {
6268 : 157 : rtx tmp = gen_reg_rtx (<MODE>mode);
6269 : 67 : emit_insn (gen_fnms<mode>4 (tmp,
6270 : 78 : operands[2],
6271 : 91 : operands[3],
6272 : 91 : operands[4]));
6273 : 55 : emit_move_insn (operands[0], gen_rtx_VEC_MERGE (<MODE>mode,
6274 : 117 : tmp,
6275 : 105 : operands[5],
6276 : 69 : operands[1]));
6277 : 54 : DONE;
6278 : 78 : })
6279 : 35 :
6280 : 35 : (define_insn "<avx512>_fnmsub_<mode>_mask<round_name>"
6281 : 35 : [(set (match_operand:VFH_AVX512VL 0 "register_operand" "=v,v")
6282 : 35 : (vec_merge:VFH_AVX512VL
6283 : 9 : (fma:VFH_AVX512VL
6284 : 9 : (neg:VFH_AVX512VL
6285 : : (match_operand:VFH_AVX512VL 1 "nonimmediate_operand" "0,0"))
6286 : : (match_operand:VFH_AVX512VL 2 "<round_nimm_predicate>" "<round_constraint>,v")
6287 : : (neg:VFH_AVX512VL
6288 : : (match_operand:VFH_AVX512VL 3 "<round_nimm_predicate>" "v,<round_constraint>")))
6289 : 1 : (match_dup 1)
6290 : : (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk,Yk")))]
6291 : 971 : "TARGET_AVX512F && <round_mode_condition>"
6292 : : "@
6293 : : vfnmsub132<ssemodesuffix>\t{<round_op5>%2, %3, %0%{%4%}|%0%{%4%}, %3, %2<round_op5>}
6294 : : vfnmsub213<ssemodesuffix>\t{<round_op5>%3, %2, %0%{%4%}|%0%{%4%}, %2, %3<round_op5>}"
6295 : : [(set_attr "type" "ssemuladd")
6296 : : (set_attr "prefix" "evex")
6297 : 376 : (set_attr "mode" "<MODE>")])
6298 : :
6299 : : (define_insn "<avx512>_fnmsub_<mode>_mask3<round_name>"
6300 : 1 : [(set (match_operand:VFH_AVX512VL 0 "register_operand" "=v")
6301 : : (vec_merge:VFH_AVX512VL
6302 : : (fma:VFH_AVX512VL
6303 : 1049 : (neg:VFH_AVX512VL
6304 : : (match_operand:VFH_AVX512VL 1 "<round_nimm_predicate>" "%v"))
6305 : 1 : (match_operand:VFH_AVX512VL 2 "<round_nimm_predicate>" "<round_constraint>")
6306 : : (neg:VFH_AVX512VL
6307 : : (match_operand:VFH_AVX512VL 3 "nonimmediate_operand" "0")))
6308 : : (match_dup 3)
6309 : : (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
6310 : 368 : "TARGET_AVX512F && <round_mode_condition>"
6311 : 52 : "vfnmsub231<ssemodesuffix>\t{<round_op5>%2, %1, %0%{%4%}|%0%{%4%}, %1, %2<round_op5>}"
6312 : : [(set_attr "type" "ssemuladd")
6313 : : (set_attr "prefix" "evex")
6314 : : (set_attr "mode" "<MODE>")])
6315 : :
6316 : 357 : ;; FMA parallel floating point multiply addsub and subadd operations.
6317 : :
6318 : : ;; It would be possible to represent these without the UNSPEC as
6319 : : ;;
6320 : : ;; (vec_merge
6321 : 1 : ;; (fma op1 op2 op3)
6322 : 863 : ;; (fma op1 op2 (neg op3))
6323 : : ;; (merge-const))
6324 : : ;;
6325 : : ;; But this doesn't seem useful in practice.
6326 : :
6327 : 4 : (define_expand "vec_fmaddsub<mode>4"
6328 : 115 : [(set (match_operand:VFH 0 "register_operand")
6329 : : (unspec:VFH
6330 : : [(match_operand:VFH 1 "nonimmediate_operand")
6331 : : (match_operand:VFH 2 "nonimmediate_operand")
6332 : 4 : (match_operand:VFH 3 "nonimmediate_operand")]
6333 : 80 : UNSPEC_FMADDSUB))]
6334 : 12 : "TARGET_FMA || TARGET_FMA4 || (<MODE_SIZE> == 64 || TARGET_AVX512VL)")
6335 : 35 :
6336 : 35 : (define_expand "vec_fmsubadd<mode>4"
6337 : 35 : [(set (match_operand:VFH 0 "register_operand")
6338 : 35 : (unspec:VFH
6339 : 35 : [(match_operand:VFH 1 "nonimmediate_operand")
6340 : 35 : (match_operand:VFH 2 "nonimmediate_operand")
6341 : 35 : (neg:VFH
6342 : 35 : (match_operand:VFH 3 "nonimmediate_operand"))]
6343 : 25 : UNSPEC_FMADDSUB))]
6344 : 33 : "TARGET_FMA || TARGET_FMA4 || (<MODE_SIZE> == 64 || TARGET_AVX512VL)")
6345 : :
6346 : : (define_expand "fmaddsub_<mode>"
6347 : : [(set (match_operand:VF 0 "register_operand")
6348 : 2 : (unspec:VF
6349 : 10 : [(match_operand:VF 1 "nonimmediate_operand")
6350 : 0 : (match_operand:VF 2 "nonimmediate_operand")
6351 : 10 : (match_operand:VF 3 "nonimmediate_operand")]
6352 : 10 : UNSPEC_FMADDSUB))]
6353 : 10 : "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512F")
6354 : 10 :
6355 : 10 : (define_expand "<avx512>_fmaddsub_<mode>_maskz<round_expand_name>"
6356 : 20 : [(match_operand:VFH_AVX512VL 0 "register_operand")
6357 : 20 : (match_operand:VFH_AVX512VL 1 "<round_expand_nimm_predicate>")
6358 : 20 : (match_operand:VFH_AVX512VL 2 "<round_expand_nimm_predicate>")
6359 : 21 : (match_operand:VFH_AVX512VL 3 "<round_expand_nimm_predicate>")
6360 : 76 : (match_operand:<avx512fmaskmode> 4 "register_operand")]
6361 : 10 : "TARGET_AVX512F"
6362 : 261 : {
6363 : 261 : emit_insn (gen_fma_fmaddsub_<mode>_maskz_1<round_expand_name> (
6364 : 11 : operands[0], operands[1], operands[2], operands[3],
6365 : 10 : CONST0_RTX (<MODE>mode), operands[4]<round_expand_operand>));
6366 : 261 : DONE;
6367 : 56 : })
6368 : 56 :
6369 : 56 : (define_expand "<avx512>_fmsubadd_<mode>_maskz<round_expand_name>"
6370 : 56 : [(match_operand:VFH_AVX512VL 0 "register_operand")
6371 : 56 : (match_operand:VFH_AVX512VL 1 "<round_expand_nimm_predicate>")
6372 : 56 : (match_operand:VFH_AVX512VL 2 "<round_expand_nimm_predicate>")
6373 : 56 : (match_operand:VFH_AVX512VL 3 "<round_expand_nimm_predicate>")
6374 : 56 : (match_operand:<avx512fmaskmode> 4 "register_operand")]
6375 : 44 : "TARGET_AVX512F"
6376 : 161 : {
6377 : 77 : emit_insn (gen_fma_fmsubadd_<mode>_maskz_1<round_expand_name> (
6378 : : operands[0], operands[1], operands[2], operands[3],
6379 : : CONST0_RTX (<MODE>mode), operands[4]<round_expand_operand>));
6380 : 77 : DONE;
6381 : 40 : })
6382 : :
6383 : : (define_insn "*fma_fmaddsub_<mode>"
6384 : : [(set (match_operand:VF_128_256 0 "register_operand" "=v,v,v,x,x")
6385 : : (unspec:VF_128_256
6386 : : [(match_operand:VF_128_256 1 "nonimmediate_operand" "%0,0,v,x,x")
6387 : : (match_operand:VF_128_256 2 "nonimmediate_operand" "vm,v,vm,x,m")
6388 : : (match_operand:VF_128_256 3 "nonimmediate_operand" "v,vm,0,xm,x")]
6389 : : UNSPEC_FMADDSUB))]
6390 : 1221 : "TARGET_FMA || TARGET_FMA4"
6391 : : "@
6392 : 24 : vfmaddsub132<ssemodesuffix>\t{%2, %3, %0|%0, %3, %2}
6393 : 126 : vfmaddsub213<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}
6394 : 0 : vfmaddsub231<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}
6395 : 0 : vfmaddsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}
6396 : : vfmaddsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
6397 : : [(set_attr "isa" "fma,fma,fma,fma4,fma4")
6398 : 24 : (set_attr "type" "ssemuladd")
6399 : 127 : (set_attr "mode" "<MODE>")])
6400 : 116 :
6401 : 150 : (define_insn "<sd_mask_codefor>fma_fmaddsub_<mode><sd_maskz_name><round_name>"
6402 : 150 : [(set (match_operand:VFH_AVX512VL 0 "register_operand" "=v,v,v")
6403 : 150 : (unspec:VFH_AVX512VL
6404 : 150 : [(match_operand:VFH_AVX512VL 1 "<round_nimm_predicate>" "%0,0,v")
6405 : 174 : (match_operand:VFH_AVX512VL 2 "<round_nimm_predicate>" "<round_constraint>,v,<round_constraint>")
6406 : 181 : (match_operand:VFH_AVX512VL 3 "<round_nimm_predicate>" "v,<round_constraint>,0")]
6407 : 139 : UNSPEC_FMADDSUB))]
6408 : 720 : "TARGET_AVX512F && <sd_mask_mode512bit_condition> && <round_mode_condition>"
6409 : 121 : "@
6410 : 67 : vfmaddsub132<ssemodesuffix>\t{<round_sd_mask_op4>%2, %3, %0<sd_mask_op4>|%0<sd_mask_op4>, %3, %2<round_sd_mask_op4>}
6411 : 67 : vfmaddsub213<ssemodesuffix>\t{<round_sd_mask_op4>%3, %2, %0<sd_mask_op4>|%0<sd_mask_op4>, %2, %3<round_sd_mask_op4>}
6412 : 91 : vfmaddsub231<ssemodesuffix>\t{<round_sd_mask_op4>%2, %1, %0<sd_mask_op4>|%0<sd_mask_op4>, %1, %2<round_sd_mask_op4>}"
6413 : 153 : [(set_attr "type" "ssemuladd")
6414 : 467 : (set_attr "prefix" "evex")
6415 : 43 : (set_attr "mode" "<MODE>")])
6416 : 0 :
6417 : 0 : (define_insn "<avx512>_fmaddsub_<mode>_mask<round_name>"
6418 : 36 : [(set (match_operand:VFH_AVX512VL 0 "register_operand" "=v,v")
6419 : 40 : (vec_merge:VFH_AVX512VL
6420 : 1503 : (unspec:VFH_AVX512VL
6421 : 10 : [(match_operand:VFH_AVX512VL 1 "register_operand" "0,0")
6422 : 10 : (match_operand:VFH_AVX512VL 2 "<round_nimm_predicate>" "<round_constraint>,v")
6423 : 10 : (match_operand:VFH_AVX512VL 3 "<round_nimm_predicate>" "v,<round_constraint>")]
6424 : 22 : UNSPEC_FMADDSUB)
6425 : 10 : (match_dup 1)
6426 : 10 : (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk,Yk")))]
6427 : 1195 : "TARGET_AVX512F && <round_mode_condition>"
6428 : 10 : "@
6429 : 22 : vfmaddsub132<ssemodesuffix>\t{<round_op5>%2, %3, %0%{%4%}|%0%{%4%}, %3, %2<round_op5>}
6430 : 0 : vfmaddsub213<ssemodesuffix>\t{<round_op5>%3, %2, %0%{%4%}|%0%{%4%}, %2, %3<round_op5>}"
6431 : 69 : [(set_attr "type" "ssemuladd")
6432 : 23 : (set_attr "prefix" "evex")
6433 : 338 : (set_attr "mode" "<MODE>")])
6434 : :
6435 : 40 : (define_insn "<avx512>_fmaddsub_<mode>_mask3<round_name>"
6436 : 0 : [(set (match_operand:VFH_AVX512VL 0 "register_operand" "=v")
6437 : 0 : (vec_merge:VFH_AVX512VL
6438 : 69 : (unspec:VFH_AVX512VL
6439 : 1435 : [(match_operand:VFH_AVX512VL 1 "nonimmediate_operand" "v")
6440 : 92 : (match_operand:VFH_AVX512VL 2 "<round_nimm_predicate>" "<round_constraint>")
6441 : 132 : (match_operand:VFH_AVX512VL 3 "nonimmediate_operand" "0")]
6442 : 92 : UNSPEC_FMADDSUB)
6443 : 92 : (match_dup 3)
6444 : 92 : (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
6445 : 437 : "TARGET_AVX512F && <round_mode_condition>"
6446 : 92 : "vfmaddsub231<ssemodesuffix>\t{<round_op5>%2, %1, %0%{%4%}|%0%{%4%}, %1, %2<round_op5>}"
6447 : 92 : [(set_attr "type" "ssemuladd")
6448 : 35 : (set_attr "prefix" "evex")
6449 : 0 : (set_attr "mode" "<MODE>")])
6450 : 0 :
6451 : 322 : (define_insn "*fma_fmsubadd_<mode>"
6452 : : [(set (match_operand:VF_128_256 0 "register_operand" "=v,v,v,x,x")
6453 : 12 : (unspec:VF_128_256
6454 : : [(match_operand:VF_128_256 1 "nonimmediate_operand" "%0,0,v,x,x")
6455 : : (match_operand:VF_128_256 2 "nonimmediate_operand" "vm,v,vm,x,m")
6456 : 0 : (neg:VF_128_256
6457 |