d5cab80f60f48f81047e7e69a6de9061b8d33a0a
[dragonfly.git] / contrib / gcc-8.0 / gcc / config / i386 / sse.md
1 ;; GCC machine description for SSE instructions
2 ;; Copyright (C) 2005-2018 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_PSHUFB
32   UNSPEC_PSIGN
33   UNSPEC_PALIGNR
34
35   ;; For SSE4A support
36   UNSPEC_EXTRQI
37   UNSPEC_EXTRQ
38   UNSPEC_INSERTQI
39   UNSPEC_INSERTQ
40
41   ;; For SSE4.1 support
42   UNSPEC_BLENDV
43   UNSPEC_INSERTPS
44   UNSPEC_DP
45   UNSPEC_MOVNTDQA
46   UNSPEC_MPSADBW
47   UNSPEC_PHMINPOSUW
48   UNSPEC_PTEST
49
50   ;; For SSE4.2 support
51   UNSPEC_PCMPESTR
52   UNSPEC_PCMPISTR
53
54   ;; For FMA4 support
55   UNSPEC_FMADDSUB
56   UNSPEC_XOP_UNSIGNED_CMP
57   UNSPEC_XOP_TRUEFALSE
58   UNSPEC_XOP_PERMUTE
59   UNSPEC_FRCZ
60
61   ;; For AES support
62   UNSPEC_AESENC
63   UNSPEC_AESENCLAST
64   UNSPEC_AESDEC
65   UNSPEC_AESDECLAST
66   UNSPEC_AESIMC
67   UNSPEC_AESKEYGENASSIST
68
69   ;; For PCLMUL support
70   UNSPEC_PCLMUL
71
72   ;; For AVX support
73   UNSPEC_PCMP
74   UNSPEC_VPERMIL
75   UNSPEC_VPERMIL2
76   UNSPEC_VPERMIL2F128
77   UNSPEC_CAST
78   UNSPEC_VTESTP
79   UNSPEC_VCVTPH2PS
80   UNSPEC_VCVTPS2PH
81
82   ;; For AVX2 support
83   UNSPEC_VPERMVAR
84   UNSPEC_VPERMTI
85   UNSPEC_GATHER
86   UNSPEC_VSIBADDR
87
88   ;; For AVX512F support
89   UNSPEC_VPERMT2
90   UNSPEC_UNSIGNED_FIX_NOTRUNC
91   UNSPEC_UNSIGNED_PCMP
92   UNSPEC_TESTM
93   UNSPEC_TESTNM
94   UNSPEC_SCATTER
95   UNSPEC_RCP14
96   UNSPEC_RSQRT14
97   UNSPEC_FIXUPIMM
98   UNSPEC_SCALEF
99   UNSPEC_VTERNLOG
100   UNSPEC_GETEXP
101   UNSPEC_GETMANT
102   UNSPEC_ALIGN
103   UNSPEC_CONFLICT
104   UNSPEC_COMPRESS
105   UNSPEC_COMPRESS_STORE
106   UNSPEC_EXPAND
107   UNSPEC_MASKED_EQ
108   UNSPEC_MASKED_GT
109
110   ;; Mask operations
111   UNSPEC_MASKOP
112   UNSPEC_KORTEST
113   UNSPEC_KTEST
114
115   ;; For embed. rounding feature
116   UNSPEC_EMBEDDED_ROUNDING
117
118   ;; For AVX512PF support
119   UNSPEC_GATHER_PREFETCH
120   UNSPEC_SCATTER_PREFETCH
121
122   ;; For AVX512ER support
123   UNSPEC_EXP2
124   UNSPEC_RCP28
125   UNSPEC_RSQRT28
126
127   ;; For SHA support
128   UNSPEC_SHA1MSG1
129   UNSPEC_SHA1MSG2
130   UNSPEC_SHA1NEXTE
131   UNSPEC_SHA1RNDS4
132   UNSPEC_SHA256MSG1
133   UNSPEC_SHA256MSG2
134   UNSPEC_SHA256RNDS2
135
136   ;; For AVX512BW support
137   UNSPEC_DBPSADBW
138   UNSPEC_PMADDUBSW512
139   UNSPEC_PMADDWD512
140   UNSPEC_PSHUFHW
141   UNSPEC_PSHUFLW
142   UNSPEC_CVTINT2MASK
143
144   ;; For AVX512DQ support
145   UNSPEC_REDUCE
146   UNSPEC_FPCLASS
147   UNSPEC_RANGE
148
149   ;; For AVX512IFMA support
150   UNSPEC_VPMADD52LUQ
151   UNSPEC_VPMADD52HUQ
152
153   ;; For AVX512VBMI support
154   UNSPEC_VPMULTISHIFT
155
156   ;; For AVX5124FMAPS/AVX5124VNNIW support
157   UNSPEC_VP4FMADD
158   UNSPEC_VP4FNMADD
159   UNSPEC_VP4DPWSSD
160   UNSPEC_VP4DPWSSDS
161
162   ;; For GFNI support
163   UNSPEC_GF2P8AFFINEINV
164   UNSPEC_GF2P8AFFINE
165   UNSPEC_GF2P8MUL
166
167   ;; For AVX512VBMI2 support
168   UNSPEC_VPSHLD
169   UNSPEC_VPSHRD
170   UNSPEC_VPSHRDV
171   UNSPEC_VPSHLDV
172
173   ;; For AVX512VNNI support
174   UNSPEC_VPMADDUBSWACCD
175   UNSPEC_VPMADDUBSWACCSSD
176   UNSPEC_VPMADDWDACCD
177   UNSPEC_VPMADDWDACCSSD
178
179   ;; For VAES support
180   UNSPEC_VAESDEC
181   UNSPEC_VAESDECLAST
182   UNSPEC_VAESENC
183   UNSPEC_VAESENCLAST
184
185   ;; For VPCLMULQDQ support
186   UNSPEC_VPCLMULQDQ
187
188   ;; For AVX512BITALG support
189   UNSPEC_VPSHUFBIT
190 ])
191
192 (define_c_enum "unspecv" [
193   UNSPECV_LDMXCSR
194   UNSPECV_STMXCSR
195   UNSPECV_CLFLUSH
196   UNSPECV_MONITOR
197   UNSPECV_MWAIT
198   UNSPECV_VZEROALL
199   UNSPECV_VZEROUPPER
200 ])
201
202 ;; All vector modes including V?TImode, used in move patterns.
203 (define_mode_iterator VMOVE
204   [(V64QI "TARGET_AVX512F") (V32QI "TARGET_AVX") V16QI
205    (V32HI "TARGET_AVX512F") (V16HI "TARGET_AVX") V8HI
206    (V16SI "TARGET_AVX512F") (V8SI "TARGET_AVX") V4SI
207    (V8DI "TARGET_AVX512F")  (V4DI "TARGET_AVX") V2DI
208    (V4TI "TARGET_AVX512F") (V2TI "TARGET_AVX") V1TI
209    (V16SF "TARGET_AVX512F") (V8SF "TARGET_AVX") V4SF
210    (V8DF "TARGET_AVX512F")  (V4DF "TARGET_AVX") V2DF])
211
212 ;; All AVX-512{F,VL} vector modes. Supposed TARGET_AVX512F baseline.
213 (define_mode_iterator V48_AVX512VL
214   [V16SI (V8SI "TARGET_AVX512VL") (V4SI "TARGET_AVX512VL")
215    V8DI  (V4DI "TARGET_AVX512VL") (V2DI "TARGET_AVX512VL")
216    V16SF (V8SF "TARGET_AVX512VL") (V4SF "TARGET_AVX512VL")
217    V8DF  (V4DF "TARGET_AVX512VL") (V2DF "TARGET_AVX512VL")])
218
219 ;; 1,2 byte AVX-512{BW,VL} vector modes. Supposed TARGET_AVX512BW baseline.
220 (define_mode_iterator VI12_AVX512VL
221   [V64QI (V16QI "TARGET_AVX512VL") (V32QI "TARGET_AVX512VL")
222    V32HI (V16HI "TARGET_AVX512VL") (V8HI "TARGET_AVX512VL")])
223
224 ;; Same iterator, but without supposed TARGET_AVX512BW
225 (define_mode_iterator VI12_AVX512VLBW
226   [(V64QI "TARGET_AVX512BW") (V16QI "TARGET_AVX512VL")
227    (V32QI "TARGET_AVX512VL && TARGET_AVX512BW") (V32HI "TARGET_AVX512BW")
228    (V16HI "TARGET_AVX512VL") (V8HI "TARGET_AVX512VL")])
229
230 (define_mode_iterator VI1_AVX512VL
231   [V64QI (V16QI "TARGET_AVX512VL") (V32QI "TARGET_AVX512VL")])
232
233 ;; All vector modes
234 (define_mode_iterator V
235   [(V64QI "TARGET_AVX512F") (V32QI "TARGET_AVX") V16QI
236    (V32HI "TARGET_AVX512F") (V16HI "TARGET_AVX") V8HI
237    (V16SI "TARGET_AVX512F") (V8SI "TARGET_AVX") V4SI
238    (V8DI "TARGET_AVX512F")  (V4DI "TARGET_AVX") V2DI
239    (V16SF "TARGET_AVX512F") (V8SF "TARGET_AVX") V4SF
240    (V8DF "TARGET_AVX512F")  (V4DF "TARGET_AVX") (V2DF "TARGET_SSE2")])
241
242 ;; All 128bit vector modes
243 (define_mode_iterator V_128
244   [V16QI V8HI V4SI V2DI V4SF (V2DF "TARGET_SSE2")])
245
246 ;; All 256bit vector modes
247 (define_mode_iterator V_256
248   [V32QI V16HI V8SI V4DI V8SF V4DF])
249
250 ;; All 128bit and 256bit vector modes
251 (define_mode_iterator V_128_256
252   [V32QI V16QI V16HI V8HI V8SI V4SI V4DI V2DI V8SF V4SF V4DF V2DF])
253
254 ;; All 512bit vector modes
255 (define_mode_iterator V_512 [V64QI V32HI V16SI V8DI V16SF V8DF])
256
257 ;; All 256bit and 512bit vector modes
258 (define_mode_iterator V_256_512
259   [V32QI V16HI V8SI V4DI V8SF V4DF
260    (V64QI "TARGET_AVX512F") (V32HI "TARGET_AVX512F") (V16SI "TARGET_AVX512F")
261    (V8DI "TARGET_AVX512F") (V16SF "TARGET_AVX512F") (V8DF "TARGET_AVX512F")])
262
263 ;; All vector float modes
264 (define_mode_iterator VF
265   [(V16SF "TARGET_AVX512F") (V8SF "TARGET_AVX") V4SF
266    (V8DF "TARGET_AVX512F") (V4DF "TARGET_AVX") (V2DF "TARGET_SSE2")])
267
268 ;; 128- and 256-bit float vector modes
269 (define_mode_iterator VF_128_256
270   [(V8SF "TARGET_AVX") V4SF
271    (V4DF "TARGET_AVX") (V2DF "TARGET_SSE2")])
272
273 ;; All SFmode vector float modes
274 (define_mode_iterator VF1
275   [(V16SF "TARGET_AVX512F") (V8SF "TARGET_AVX") V4SF])
276
277 ;; 128- and 256-bit SF vector modes
278 (define_mode_iterator VF1_128_256
279   [(V8SF "TARGET_AVX") V4SF])
280
281 (define_mode_iterator VF1_128_256VL
282   [V8SF (V4SF "TARGET_AVX512VL")])
283
284 ;; All DFmode vector float modes
285 (define_mode_iterator VF2
286   [(V8DF "TARGET_AVX512F") (V4DF "TARGET_AVX") V2DF])
287
288 ;; 128- and 256-bit DF vector modes
289 (define_mode_iterator VF2_128_256
290   [(V4DF "TARGET_AVX") V2DF])
291
292 (define_mode_iterator VF2_512_256
293   [(V8DF "TARGET_AVX512F") V4DF])
294
295 (define_mode_iterator VF2_512_256VL
296   [V8DF (V4DF "TARGET_AVX512VL")])
297
298 ;; All 128bit vector float modes
299 (define_mode_iterator VF_128
300   [V4SF (V2DF "TARGET_SSE2")])
301
302 ;; All 256bit vector float modes
303 (define_mode_iterator VF_256
304   [V8SF V4DF])
305
306 ;; All 512bit vector float modes
307 (define_mode_iterator VF_512
308   [V16SF V8DF])
309
310 (define_mode_iterator VI48_AVX512VL
311   [V16SI (V8SI  "TARGET_AVX512VL") (V4SI  "TARGET_AVX512VL")
312    V8DI  (V4DI  "TARGET_AVX512VL") (V2DI  "TARGET_AVX512VL")])
313
314 (define_mode_iterator VF_AVX512VL
315   [V16SF (V8SF "TARGET_AVX512VL") (V4SF "TARGET_AVX512VL")
316    V8DF (V4DF "TARGET_AVX512VL") (V2DF "TARGET_AVX512VL")])
317
318 (define_mode_iterator VF2_AVX512VL
319   [V8DF (V4DF "TARGET_AVX512VL") (V2DF "TARGET_AVX512VL")])
320
321 (define_mode_iterator VF1_AVX512VL
322   [V16SF (V8SF "TARGET_AVX512VL") (V4SF "TARGET_AVX512VL")])
323
324 ;; All vector integer modes
325 (define_mode_iterator VI
326   [(V16SI "TARGET_AVX512F") (V8DI "TARGET_AVX512F")
327    (V64QI "TARGET_AVX512BW") (V32QI "TARGET_AVX") V16QI
328    (V32HI "TARGET_AVX512BW") (V16HI "TARGET_AVX") V8HI
329    (V8SI "TARGET_AVX") V4SI
330    (V4DI "TARGET_AVX") V2DI])
331
332 (define_mode_iterator VI_AVX2
333   [(V64QI "TARGET_AVX512BW") (V32QI "TARGET_AVX2") V16QI
334    (V32HI "TARGET_AVX512BW") (V16HI "TARGET_AVX2") V8HI
335    (V16SI "TARGET_AVX512F") (V8SI "TARGET_AVX2") V4SI
336    (V8DI "TARGET_AVX512F") (V4DI "TARGET_AVX2") V2DI])
337
338 ;; All QImode vector integer modes
339 (define_mode_iterator VI1
340   [(V32QI "TARGET_AVX") V16QI])
341
342 ;; All DImode vector integer modes
343 (define_mode_iterator V_AVX
344   [V16QI V8HI V4SI V2DI V4SF V2DF
345    (V32QI "TARGET_AVX") (V16HI "TARGET_AVX")
346    (V8SI "TARGET_AVX") (V4DI "TARGET_AVX")
347    (V8SF "TARGET_AVX") (V4DF"TARGET_AVX")])
348
349 (define_mode_iterator VI48_AVX
350  [V4SI V2DI
351   (V8SI "TARGET_AVX") (V4DI "TARGET_AVX")])
352
353 (define_mode_iterator VI8
354   [(V8DI "TARGET_AVX512F") (V4DI "TARGET_AVX") V2DI])
355
356 (define_mode_iterator VI8_FVL
357   [(V8DI "TARGET_AVX512F") V4DI (V2DI "TARGET_AVX512VL")])
358
359 (define_mode_iterator VI8_AVX512VL
360   [V8DI (V4DI "TARGET_AVX512VL") (V2DI "TARGET_AVX512VL")])
361
362 (define_mode_iterator VI8_256_512
363   [V8DI (V4DI "TARGET_AVX512VL")])
364
365 (define_mode_iterator VI1_AVX2
366   [(V32QI "TARGET_AVX2") V16QI])
367
368 (define_mode_iterator VI1_AVX512
369   [(V64QI "TARGET_AVX512BW") (V32QI "TARGET_AVX2") V16QI])
370
371 (define_mode_iterator VI1_AVX512F
372   [(V64QI "TARGET_AVX512F") (V32QI "TARGET_AVX") V16QI])
373
374 (define_mode_iterator VI2_AVX2
375   [(V32HI "TARGET_AVX512BW") (V16HI "TARGET_AVX2") V8HI])
376
377 (define_mode_iterator VI2_AVX512F
378   [(V32HI "TARGET_AVX512F") (V16HI "TARGET_AVX2") V8HI])
379
380 (define_mode_iterator VI4_AVX
381   [(V8SI "TARGET_AVX") V4SI])
382
383 (define_mode_iterator VI4_AVX2
384   [(V8SI "TARGET_AVX2") V4SI])
385
386 (define_mode_iterator VI4_AVX512F
387   [(V16SI "TARGET_AVX512F") (V8SI "TARGET_AVX2") V4SI])
388
389 (define_mode_iterator VI4_AVX512VL
390   [V16SI (V8SI "TARGET_AVX512VL") (V4SI "TARGET_AVX512VL")])
391
392 (define_mode_iterator VI48_AVX512F_AVX512VL
393   [V4SI V8SI (V16SI "TARGET_AVX512F")
394    (V2DI "TARGET_AVX512VL") (V4DI "TARGET_AVX512VL") (V8DI "TARGET_AVX512F")])
395
396 (define_mode_iterator VI2_AVX512VL
397   [(V8HI "TARGET_AVX512VL") (V16HI "TARGET_AVX512VL") V32HI])
398
399 (define_mode_iterator VI1_AVX512VL_F
400   [V32QI (V16QI "TARGET_AVX512VL") (V64QI "TARGET_AVX512F")])
401
402 (define_mode_iterator VI8_AVX2_AVX512BW
403   [(V8DI "TARGET_AVX512BW") (V4DI "TARGET_AVX2") V2DI])
404
405 (define_mode_iterator VI8_AVX2
406   [(V4DI "TARGET_AVX2") V2DI])
407
408 (define_mode_iterator VI8_AVX2_AVX512F
409   [(V8DI "TARGET_AVX512F") (V4DI "TARGET_AVX2") V2DI])
410
411 (define_mode_iterator VI8_AVX_AVX512F
412   [(V8DI "TARGET_AVX512F") (V4DI "TARGET_AVX")])
413
414 (define_mode_iterator VI4_128_8_256
415   [V4SI V4DI])
416
417 ;; All V8D* modes
418 (define_mode_iterator V8FI
419   [V8DF V8DI])
420
421 ;; All V16S* modes
422 (define_mode_iterator V16FI
423   [V16SF V16SI])
424
425 ;; ??? We should probably use TImode instead.
426 (define_mode_iterator VIMAX_AVX2_AVX512BW
427   [(V4TI "TARGET_AVX512BW") (V2TI "TARGET_AVX2") V1TI])
428
429 ;; Suppose TARGET_AVX512BW as baseline
430 (define_mode_iterator VIMAX_AVX512VL
431   [V4TI (V2TI "TARGET_AVX512VL") (V1TI "TARGET_AVX512VL")])
432
433 (define_mode_iterator VIMAX_AVX2
434   [(V2TI "TARGET_AVX2") V1TI])
435
436 ;; ??? This should probably be dropped in favor of VIMAX_AVX2_AVX512BW.
437 (define_mode_iterator SSESCALARMODE
438   [(V4TI "TARGET_AVX512BW") (V2TI "TARGET_AVX2") TI])
439
440 (define_mode_iterator VI12_AVX2
441   [(V64QI "TARGET_AVX512BW") (V32QI "TARGET_AVX2") V16QI
442    (V32HI "TARGET_AVX512BW") (V16HI "TARGET_AVX2") V8HI])
443
444 (define_mode_iterator VI24_AVX2
445   [(V16HI "TARGET_AVX2") V8HI
446    (V8SI "TARGET_AVX2") V4SI])
447
448 (define_mode_iterator VI124_AVX2_24_AVX512F_1_AVX512BW
449   [(V64QI "TARGET_AVX512BW") (V32QI "TARGET_AVX2") V16QI
450    (V32HI "TARGET_AVX512F") (V16HI "TARGET_AVX2") V8HI
451    (V16SI "TARGET_AVX512F") (V8SI "TARGET_AVX2") V4SI])
452
453 (define_mode_iterator VI124_AVX2
454   [(V32QI "TARGET_AVX2") V16QI
455    (V16HI "TARGET_AVX2") V8HI
456    (V8SI "TARGET_AVX2") V4SI])
457
458 (define_mode_iterator VI2_AVX2_AVX512BW
459   [(V32HI "TARGET_AVX512BW") (V16HI "TARGET_AVX2") V8HI])
460
461 (define_mode_iterator VI248_AVX512VL
462   [V32HI V16SI V8DI
463    (V16HI "TARGET_AVX512VL") (V8SI "TARGET_AVX512VL")
464    (V4DI "TARGET_AVX512VL") (V8HI "TARGET_AVX512VL")
465    (V4SI "TARGET_AVX512VL") (V2DI "TARGET_AVX512VL")])
466
467 (define_mode_iterator VI48_AVX2
468   [(V8SI "TARGET_AVX2") V4SI
469    (V4DI "TARGET_AVX2") V2DI])
470
471 (define_mode_iterator VI248_AVX2
472   [(V16HI "TARGET_AVX2") V8HI
473    (V8SI "TARGET_AVX2") V4SI
474    (V4DI "TARGET_AVX2") V2DI])
475
476 (define_mode_iterator VI248_AVX2_8_AVX512F_24_AVX512BW
477   [(V32HI "TARGET_AVX512BW") (V16HI "TARGET_AVX2") V8HI
478    (V16SI "TARGET_AVX512BW") (V8SI "TARGET_AVX2") V4SI
479    (V8DI "TARGET_AVX512F") (V4DI "TARGET_AVX2") V2DI])
480
481 (define_mode_iterator VI248_AVX512BW
482   [(V32HI "TARGET_AVX512BW") V16SI V8DI])
483
484 (define_mode_iterator VI248_AVX512BW_AVX512VL
485   [(V32HI "TARGET_AVX512BW") 
486    (V4DI "TARGET_AVX512VL") V16SI V8DI])
487
488 ;; Suppose TARGET_AVX512VL as baseline
489 (define_mode_iterator VI248_AVX512BW_1
490  [(V16HI "TARGET_AVX512BW") (V8HI "TARGET_AVX512BW")
491   V8SI V4SI
492   V2DI])
493    
494 (define_mode_iterator VI248_AVX512BW_2
495  [(V16HI "TARGET_AVX512BW") (V8HI "TARGET_AVX512BW")
496   V8SI V4SI
497   V4DI V2DI])
498    
499 (define_mode_iterator VI48_AVX512F
500   [(V16SI "TARGET_AVX512F") V8SI V4SI
501    (V8DI "TARGET_AVX512F") V4DI V2DI])
502
503 (define_mode_iterator VI48_AVX_AVX512F
504   [(V16SI "TARGET_AVX512F") (V8SI "TARGET_AVX") V4SI
505    (V8DI "TARGET_AVX512F") (V4DI "TARGET_AVX") V2DI])
506
507 (define_mode_iterator VI12_AVX_AVX512F
508   [ (V64QI "TARGET_AVX512F") (V32QI "TARGET_AVX") V16QI
509     (V32HI "TARGET_AVX512F") (V16HI "TARGET_AVX") V8HI])
510
511 (define_mode_iterator V48_AVX2
512   [V4SF V2DF
513    V8SF V4DF
514    (V4SI "TARGET_AVX2") (V2DI "TARGET_AVX2")
515    (V8SI "TARGET_AVX2") (V4DI "TARGET_AVX2")])
516
517 (define_mode_iterator VI1_AVX512VLBW
518   [(V64QI "TARGET_AVX512BW") (V32QI  "TARGET_AVX512VL")
519         (V16QI  "TARGET_AVX512VL")])
520
521 (define_mode_attr avx512
522   [(V16QI "avx512vl") (V32QI "avx512vl") (V64QI "avx512bw")
523    (V8HI  "avx512vl") (V16HI  "avx512vl") (V32HI "avx512bw")
524    (V4SI  "avx512vl") (V8SI  "avx512vl") (V16SI "avx512f")
525    (V2DI  "avx512vl") (V4DI  "avx512vl") (V8DI "avx512f")
526    (V4SF "avx512vl") (V8SF "avx512vl") (V16SF "avx512f")
527    (V2DF "avx512vl") (V4DF "avx512vl") (V8DF "avx512f")])
528
529 (define_mode_attr sse2_avx_avx512f
530   [(V16QI "sse2") (V32QI "avx") (V64QI "avx512f")
531    (V8HI  "avx512vl") (V16HI  "avx512vl") (V32HI "avx512bw")
532    (V4SI  "sse2") (V8SI  "avx") (V16SI "avx512f")
533    (V2DI  "avx512vl") (V4DI  "avx512vl") (V8DI "avx512f")
534    (V16SF "avx512f") (V8SF "avx") (V4SF "avx")
535    (V8DF "avx512f") (V4DF "avx") (V2DF "avx")])
536
537 (define_mode_attr sse2_avx2
538   [(V16QI "sse2") (V32QI "avx2") (V64QI "avx512bw")
539    (V8HI "sse2") (V16HI "avx2") (V32HI "avx512bw")
540    (V4SI "sse2") (V8SI "avx2") (V16SI "avx512f")
541    (V2DI "sse2") (V4DI "avx2") (V8DI "avx512f")
542    (V1TI "sse2") (V2TI "avx2") (V4TI "avx512bw")])
543
544 (define_mode_attr ssse3_avx2
545    [(V16QI "ssse3") (V32QI "avx2") (V64QI "avx512bw")
546     (V4HI "ssse3") (V8HI "ssse3") (V16HI "avx2") (V32HI "avx512bw")
547     (V4SI "ssse3") (V8SI "avx2")
548     (V2DI "ssse3") (V4DI "avx2")
549     (TI "ssse3") (V2TI "avx2") (V4TI "avx512bw")])
550
551 (define_mode_attr sse4_1_avx2
552    [(V16QI "sse4_1") (V32QI "avx2") (V64QI "avx512bw")
553     (V8HI "sse4_1") (V16HI "avx2") (V32HI "avx512bw")
554     (V4SI "sse4_1") (V8SI "avx2") (V16SI "avx512f")
555     (V2DI "sse4_1") (V4DI "avx2") (V8DI "avx512dq")])
556
557 (define_mode_attr avx_avx2
558   [(V4SF "avx") (V2DF "avx")
559    (V8SF "avx") (V4DF "avx")
560    (V4SI "avx2") (V2DI "avx2")
561    (V8SI "avx2") (V4DI "avx2")])
562
563 (define_mode_attr vec_avx2
564   [(V16QI "vec") (V32QI "avx2")
565    (V8HI "vec") (V16HI "avx2")
566    (V4SI "vec") (V8SI "avx2")
567    (V2DI "vec") (V4DI "avx2")])
568
569 (define_mode_attr avx2_avx512
570   [(V4SI "avx2") (V8SI "avx2") (V16SI "avx512f")
571    (V2DI "avx2") (V4DI "avx2") (V8DI "avx512f")
572    (V4SF "avx2") (V8SF "avx2") (V16SF "avx512f")
573    (V2DF "avx2") (V4DF "avx2") (V8DF "avx512f")
574    (V8HI "avx512vl") (V16HI "avx512vl") (V32HI "avx512bw")])
575
576 (define_mode_attr shuffletype
577   [(V16SF "f") (V16SI "i") (V8DF "f") (V8DI "i")
578   (V8SF "f") (V8SI "i") (V4DF "f") (V4DI "i")
579   (V4SF "f") (V4SI "i") (V2DF "f") (V2DI "i")
580   (V32HI "i") (V16HI "i") (V8HI "i")
581   (V64QI "i") (V32QI "i") (V16QI "i")
582   (V4TI "i") (V2TI "i") (V1TI "i")])
583
584 (define_mode_attr ssequartermode
585   [(V16SF "V4SF") (V8DF "V2DF") (V16SI "V4SI") (V8DI "V2DI")])
586
587 (define_mode_attr ssedoublemodelower
588   [(V16QI "v16hi") (V32QI "v32hi") (V64QI "v64hi")
589    (V8HI "v8si")   (V16HI "v16si") (V32HI "v32si")
590    (V4SI "v4di")   (V8SI "v8di")   (V16SI "v16di")])
591
592 (define_mode_attr ssedoublemode
593   [(V4SF "V8SF") (V8SF "V16SF") (V16SF "V32SF")
594    (V2DF "V4DF") (V4DF "V8DF") (V8DF "V16DF")
595    (V16QI "V16HI") (V32QI "V32HI") (V64QI "V64HI")
596    (V4HI "V4SI") (V8HI "V8SI") (V16HI "V16SI") (V32HI "V32SI")
597    (V4SI "V4DI") (V8SI "V16SI") (V16SI "V32SI")
598    (V4DI "V8DI") (V8DI "V16DI")])
599
600 (define_mode_attr ssebytemode
601   [(V8DI "V64QI") (V4DI "V32QI") (V2DI "V16QI")])
602
603 ;; All 128bit vector integer modes
604 (define_mode_iterator VI_128 [V16QI V8HI V4SI V2DI])
605
606 ;; All 256bit vector integer modes
607 (define_mode_iterator VI_256 [V32QI V16HI V8SI V4DI])
608
609 ;; Various 128bit vector integer mode combinations
610 (define_mode_iterator VI12_128 [V16QI V8HI])
611 (define_mode_iterator VI14_128 [V16QI V4SI])
612 (define_mode_iterator VI124_128 [V16QI V8HI V4SI])
613 (define_mode_iterator VI24_128 [V8HI V4SI])
614 (define_mode_iterator VI248_128 [V8HI V4SI V2DI])
615 (define_mode_iterator VI48_128 [V4SI V2DI])
616
617 ;; Various 256bit and 512 vector integer mode combinations
618 (define_mode_iterator VI124_256 [V32QI V16HI V8SI])
619 (define_mode_iterator VI124_256_AVX512F_AVX512BW
620   [V32QI V16HI V8SI
621    (V64QI "TARGET_AVX512BW")
622    (V32HI "TARGET_AVX512BW")
623    (V16SI "TARGET_AVX512F")])
624 (define_mode_iterator VI48_256 [V8SI V4DI])
625 (define_mode_iterator VI48_512 [V16SI V8DI])
626 (define_mode_iterator VI4_256_8_512 [V8SI V8DI])
627 (define_mode_iterator VI_AVX512BW
628   [V16SI V8DI (V32HI "TARGET_AVX512BW") (V64QI "TARGET_AVX512BW")])
629
630 ;; Int-float size matches
631 (define_mode_iterator VI4F_128 [V4SI V4SF])
632 (define_mode_iterator VI8F_128 [V2DI V2DF])
633 (define_mode_iterator VI4F_256 [V8SI V8SF])
634 (define_mode_iterator VI8F_256 [V4DI V4DF])
635 (define_mode_iterator VI4F_256_512
636   [V8SI V8SF
637    (V16SI "TARGET_AVX512F") (V16SF "TARGET_AVX512F")])
638 (define_mode_iterator VI48F_256_512
639   [V8SI V8SF
640   (V16SI "TARGET_AVX512F") (V16SF "TARGET_AVX512F")
641   (V8DI  "TARGET_AVX512F") (V8DF  "TARGET_AVX512F")
642   (V4DI  "TARGET_AVX512VL") (V4DF  "TARGET_AVX512VL")])
643 (define_mode_iterator VF48_I1248
644   [V16SI V16SF V8DI V8DF V32HI V64QI])
645 (define_mode_iterator VI48F
646   [V16SI V16SF V8DI V8DF
647    (V8SI "TARGET_AVX512VL") (V8SF "TARGET_AVX512VL")
648    (V4DI "TARGET_AVX512VL") (V4DF "TARGET_AVX512VL")
649    (V4SI "TARGET_AVX512VL") (V4SF "TARGET_AVX512VL")
650    (V2DI "TARGET_AVX512VL") (V2DF "TARGET_AVX512VL")])
651 (define_mode_iterator VI48F_256 [V8SI V8SF V4DI V4DF])
652
653 ;; Mapping from float mode to required SSE level
654 (define_mode_attr sse
655   [(SF "sse") (DF "sse2")
656    (V4SF "sse") (V2DF "sse2")
657    (V16SF "avx512f") (V8SF "avx")
658    (V8DF "avx512f") (V4DF "avx")])
659
660 (define_mode_attr sse2
661   [(V16QI "sse2") (V32QI "avx") (V64QI "avx512f")
662    (V2DI "sse2") (V4DI "avx") (V8DI "avx512f")])
663
664 (define_mode_attr sse3
665   [(V16QI "sse3") (V32QI "avx")])
666
667 (define_mode_attr sse4_1
668   [(V4SF "sse4_1") (V2DF "sse4_1")
669    (V8SF "avx") (V4DF "avx")
670    (V8DF "avx512f")
671    (V4DI "avx") (V2DI "sse4_1")
672    (V8SI "avx") (V4SI "sse4_1")
673    (V16QI "sse4_1") (V32QI "avx")
674    (V8HI "sse4_1") (V16HI "avx")])
675
676 (define_mode_attr avxsizesuffix
677   [(V64QI "512") (V32HI "512") (V16SI "512") (V8DI "512")
678    (V32QI "256") (V16HI "256") (V8SI "256") (V4DI "256")
679    (V16QI "") (V8HI "") (V4SI "") (V2DI "")
680    (V16SF "512") (V8DF "512")
681    (V8SF "256") (V4DF "256")
682    (V4SF "") (V2DF "")])
683
684 ;; SSE instruction mode
685 (define_mode_attr sseinsnmode
686   [(V64QI "XI") (V32HI "XI") (V16SI "XI") (V8DI "XI") (V4TI "XI")
687    (V32QI "OI") (V16HI "OI") (V8SI "OI") (V4DI "OI") (V2TI "OI")
688    (V16QI "TI") (V8HI "TI") (V4SI "TI") (V2DI "TI") (V1TI "TI")
689    (V16SF "V16SF") (V8DF "V8DF")
690    (V8SF "V8SF") (V4DF "V4DF")
691    (V4SF "V4SF") (V2DF "V2DF")
692    (TI "TI")])
693
694 ;; Mapping of vector modes to corresponding mask size
695 (define_mode_attr avx512fmaskmode
696   [(V64QI "DI") (V32QI "SI") (V16QI "HI")
697    (V32HI "SI") (V16HI "HI") (V8HI  "QI") (V4HI "QI")
698    (V16SI "HI") (V8SI  "QI") (V4SI  "QI")
699    (V8DI  "QI") (V4DI  "QI") (V2DI  "QI")
700    (V16SF "HI") (V8SF  "QI") (V4SF  "QI")
701    (V8DF  "QI") (V4DF  "QI") (V2DF  "QI")])
702
703 ;; Mapping of vector modes to corresponding mask size
704 (define_mode_attr avx512fmaskmodelower
705   [(V64QI "di") (V32QI "si") (V16QI "hi")
706    (V32HI "si") (V16HI "hi") (V8HI  "qi") (V4HI "qi")
707    (V16SI "hi") (V8SI  "qi") (V4SI  "qi")
708    (V8DI  "qi") (V4DI  "qi") (V2DI  "qi")
709    (V16SF "hi") (V8SF  "qi") (V4SF  "qi")
710    (V8DF  "qi") (V4DF  "qi") (V2DF  "qi")])
711
712 ;; Mapping of vector float modes to an integer mode of the same size
713 (define_mode_attr sseintvecmode
714   [(V16SF "V16SI") (V8DF  "V8DI")
715    (V8SF  "V8SI")  (V4DF  "V4DI")
716    (V4SF  "V4SI")  (V2DF  "V2DI")
717    (V16SI "V16SI") (V8DI  "V8DI")
718    (V8SI  "V8SI")  (V4DI  "V4DI")
719    (V4SI  "V4SI")  (V2DI  "V2DI")
720    (V16HI "V16HI") (V8HI  "V8HI")
721    (V32HI "V32HI") (V64QI "V64QI")
722    (V32QI "V32QI") (V16QI "V16QI")])
723
724 (define_mode_attr sseintvecmode2
725   [(V8DF "XI") (V4DF "OI") (V2DF "TI")
726    (V8SF "OI") (V4SF "TI")])
727
728 (define_mode_attr sseintvecmodelower
729   [(V16SF "v16si") (V8DF "v8di")
730    (V8SF "v8si") (V4DF "v4di")
731    (V4SF "v4si") (V2DF "v2di")
732    (V8SI "v8si") (V4DI "v4di")
733    (V4SI "v4si") (V2DI "v2di")
734    (V16HI "v16hi") (V8HI "v8hi")
735    (V32QI "v32qi") (V16QI "v16qi")])
736
737 ;; Mapping of vector modes to a vector mode of double size
738 (define_mode_attr ssedoublevecmode
739   [(V32QI "V64QI") (V16HI "V32HI") (V8SI "V16SI") (V4DI "V8DI")
740    (V16QI "V32QI") (V8HI "V16HI") (V4SI "V8SI") (V2DI "V4DI")
741    (V8SF "V16SF") (V4DF "V8DF")
742    (V4SF "V8SF") (V2DF "V4DF")])
743
744 ;; Mapping of vector modes to a vector mode of half size
745 (define_mode_attr ssehalfvecmode
746   [(V64QI "V32QI") (V32HI "V16HI") (V16SI "V8SI") (V8DI "V4DI") (V4TI "V2TI")
747    (V32QI "V16QI") (V16HI  "V8HI") (V8SI  "V4SI") (V4DI "V2DI")
748    (V16QI  "V8QI") (V8HI   "V4HI") (V4SI  "V2SI")
749    (V16SF "V8SF") (V8DF "V4DF")
750    (V8SF  "V4SF") (V4DF "V2DF")
751    (V4SF  "V2SF")])
752
753 (define_mode_attr ssehalfvecmodelower
754   [(V64QI "v32qi") (V32HI "v16hi") (V16SI "v8si") (V8DI "v4di") (V4TI "v2ti")
755    (V32QI "v16qi") (V16HI  "v8hi") (V8SI  "v4si") (V4DI "v2di")
756    (V16QI  "v8qi") (V8HI   "v4hi") (V4SI  "v2si")
757    (V16SF "v8sf") (V8DF "v4df")
758    (V8SF  "v4sf") (V4DF "v2df")
759    (V4SF  "v2sf")])
760
761 ;; Mapping of vector modes ti packed single mode of the same size
762 (define_mode_attr ssePSmode
763   [(V16SI "V16SF") (V8DF "V16SF")
764    (V16SF "V16SF") (V8DI "V16SF")
765    (V64QI "V16SF") (V32QI "V8SF") (V16QI "V4SF")
766    (V32HI "V16SF") (V16HI "V8SF") (V8HI "V4SF")
767    (V8SI "V8SF") (V4SI "V4SF")
768    (V4DI "V8SF") (V2DI "V4SF")
769    (V4TI "V16SF") (V2TI "V8SF") (V1TI "V4SF")
770    (V8SF "V8SF") (V4SF "V4SF")
771    (V4DF "V8SF") (V2DF "V4SF")])
772
773 (define_mode_attr ssePSmode2
774   [(V8DI "V8SF") (V4DI "V4SF")])
775
776 ;; Mapping of vector modes back to the scalar modes
777 (define_mode_attr ssescalarmode
778   [(V64QI "QI") (V32QI "QI") (V16QI "QI")
779    (V32HI "HI") (V16HI "HI") (V8HI "HI")
780    (V16SI "SI") (V8SI "SI")  (V4SI "SI")
781    (V8DI "DI")  (V4DI "DI")  (V2DI "DI")
782    (V16SF "SF") (V8SF "SF")  (V4SF "SF")
783    (V8DF "DF")  (V4DF "DF")  (V2DF "DF")
784    (V4TI "TI")  (V2TI "TI")])
785
786 ;; Mapping of vector modes back to the scalar modes
787 (define_mode_attr ssescalarmodelower
788   [(V64QI "qi") (V32QI "qi") (V16QI "qi")
789    (V32HI "hi") (V16HI "hi") (V8HI "hi")
790    (V16SI "si") (V8SI "si")  (V4SI "si")
791    (V8DI "di")  (V4DI "di")  (V2DI "di")
792    (V16SF "sf") (V8SF "sf")  (V4SF "sf")
793    (V8DF "df")  (V4DF "df")  (V2DF "df")
794    (V4TI "ti")  (V2TI "ti")])
795
796 ;; Mapping of vector modes to the 128bit modes
797 (define_mode_attr ssexmmmode
798   [(V64QI "V16QI") (V32QI "V16QI") (V16QI "V16QI")
799    (V32HI "V8HI")  (V16HI "V8HI") (V8HI "V8HI")
800    (V16SI "V4SI")  (V8SI "V4SI")  (V4SI "V4SI")
801    (V8DI "V2DI")   (V4DI "V2DI")  (V2DI "V2DI")
802    (V16SF "V4SF")  (V8SF "V4SF")  (V4SF "V4SF")
803    (V8DF "V2DF")   (V4DF "V2DF")  (V2DF "V2DF")])
804
805 ;; Pointer size override for scalar modes (Intel asm dialect)
806 (define_mode_attr iptr
807   [(V64QI "b") (V32HI "w") (V16SI "k") (V8DI "q")
808    (V32QI "b") (V16HI "w") (V8SI "k") (V4DI "q")
809    (V16QI "b") (V8HI "w") (V4SI "k") (V2DI "q")
810    (V16SF "k") (V8DF "q")
811    (V8SF "k") (V4DF "q")
812    (V4SF "k") (V2DF "q")
813    (SF "k") (DF "q")])
814
815 ;; Number of scalar elements in each vector type
816 (define_mode_attr ssescalarnum
817   [(V64QI "64") (V16SI "16") (V8DI "8")
818    (V32QI "32") (V16HI "16") (V8SI "8") (V4DI "4")
819    (V16QI "16") (V8HI "8") (V4SI "4") (V2DI "2")
820    (V16SF "16") (V8DF "8")
821    (V8SF "8") (V4DF "4")
822    (V4SF "4") (V2DF "2")])
823
824 ;; Mask of scalar elements in each vector type
825 (define_mode_attr ssescalarnummask
826   [(V32QI "31") (V16HI "15") (V8SI "7") (V4DI "3")
827    (V16QI "15") (V8HI "7") (V4SI "3") (V2DI "1")
828    (V8SF "7") (V4DF "3")
829    (V4SF "3") (V2DF "1")])
830
831 (define_mode_attr ssescalarsize
832   [(V4TI  "64") (V2TI  "64") (V1TI  "64")
833    (V8DI  "64") (V4DI  "64") (V2DI  "64")
834    (V64QI "8") (V32QI "8") (V16QI "8")
835    (V32HI "16") (V16HI "16") (V8HI "16")
836    (V16SI "32") (V8SI "32") (V4SI "32")
837    (V16SF "32") (V8SF "32") (V4SF "32")
838    (V8DF "64") (V4DF "64") (V2DF "64")])
839
840 ;; SSE prefix for integer vector modes
841 (define_mode_attr sseintprefix
842   [(V2DI  "p") (V2DF  "")
843    (V4DI  "p") (V4DF  "")
844    (V8DI  "p") (V8DF  "")
845    (V4SI  "p") (V4SF  "")
846    (V8SI  "p") (V8SF  "")
847    (V16SI "p") (V16SF "")
848    (V16QI "p") (V8HI "p")
849    (V32QI "p") (V16HI "p")
850    (V64QI "p") (V32HI "p")])
851
852 ;; SSE scalar suffix for vector modes
853 (define_mode_attr ssescalarmodesuffix
854   [(SF "ss") (DF "sd")
855    (V16SF "ss") (V8DF "sd")
856    (V8SF "ss") (V4DF "sd")
857    (V4SF "ss") (V2DF "sd")
858    (V16SI "d") (V8DI "q")
859    (V8SI "d") (V4DI "q")
860    (V4SI "d") (V2DI "q")])
861
862 ;; Pack/unpack vector modes
863 (define_mode_attr sseunpackmode
864   [(V16QI "V8HI") (V8HI "V4SI") (V4SI "V2DI")
865    (V32QI "V16HI") (V16HI "V8SI") (V8SI "V4DI")
866    (V32HI "V16SI") (V64QI "V32HI") (V16SI "V8DI")])
867
868 (define_mode_attr ssepackmode
869   [(V8HI "V16QI") (V4SI "V8HI") (V2DI "V4SI")
870    (V16HI "V32QI") (V8SI "V16HI") (V4DI "V8SI")
871    (V32HI "V64QI") (V16SI "V32HI") (V8DI "V16SI")])
872
873 ;; Mapping of the max integer size for xop rotate immediate constraint
874 (define_mode_attr sserotatemax
875   [(V16QI "7") (V8HI "15") (V4SI "31") (V2DI "63")])
876
877 ;; Mapping of mode to cast intrinsic name
878 (define_mode_attr castmode
879  [(V8SI "si") (V8SF "ps") (V4DF "pd")
880   (V16SI "si") (V16SF "ps") (V8DF "pd")])
881
882 ;; Instruction suffix for sign and zero extensions.
883 (define_code_attr extsuffix [(sign_extend "sx") (zero_extend "zx")])
884
885 ;; i128 for integer vectors and TARGET_AVX2, f128 otherwise.
886 ;; i64x4 or f64x4 for 512bit modes.
887 (define_mode_attr i128
888   [(V16SF "f64x4") (V8SF "f128") (V8DF "f64x4") (V4DF "f128")
889    (V64QI "i64x4") (V32QI "%~128") (V32HI "i64x4") (V16HI "%~128")
890    (V16SI "i64x4") (V8SI "%~128") (V8DI "i64x4") (V4DI "%~128")])
891
892 ;; For 256-bit modes for TARGET_AVX512VL && TARGET_AVX512DQ
893 ;; i32x4, f32x4, i64x2 or f64x2 suffixes.
894 (define_mode_attr i128vldq
895   [(V8SF "f32x4") (V4DF "f64x2")
896    (V32QI "i32x4") (V16HI "i32x4") (V8SI "i32x4") (V4DI "i64x2")])
897
898 ;; Mix-n-match
899 (define_mode_iterator AVX256MODE2P [V8SI V8SF V4DF])
900 (define_mode_iterator AVX512MODE2P [V16SI V16SF V8DF])
901
902 ;; Mapping for dbpsabbw modes
903 (define_mode_attr dbpsadbwmode
904   [(V32HI "V64QI") (V16HI "V32QI") (V8HI "V16QI")])
905
906 ;; Mapping suffixes for broadcast
907 (define_mode_attr bcstscalarsuff
908   [(V64QI "b")  (V32QI "b") (V16QI "b")
909    (V32HI "w")  (V16HI "w") (V8HI "w")
910    (V16SI "d")  (V8SI "d")  (V4SI "d")
911    (V8DI "q")   (V4DI "q")  (V2DI "q")
912    (V16SF "ss") (V8SF "ss") (V4SF "ss")
913    (V8DF "sd")  (V4DF "sd") (V2DF "sd")])
914
915 ;; Tie mode of assembler operand to mode iterator
916 (define_mode_attr concat_tg_mode
917   [(V32QI "t") (V16HI "t") (V8SI "t") (V4DI "t") (V8SF "t") (V4DF "t")
918    (V64QI "g") (V32HI "g") (V16SI "g") (V8DI "g") (V16SF "g") (V8DF "g")])
919
920 ;; Tie mode of assembler operand to mode iterator
921 (define_mode_attr xtg_mode
922   [(V16QI "x") (V8HI "x") (V4SI "x") (V2DI "x") (V4SF "x") (V2DF "x")
923    (V32QI "t") (V16HI "t") (V8SI "t") (V4DI "t") (V8SF "t") (V4DF "t")
924    (V64QI "g") (V32HI "g") (V16SI "g") (V8DI "g") (V16SF "g") (V8DF "g")])
925
926 ;; Half mask mode for unpacks
927 (define_mode_attr HALFMASKMODE
928   [(DI "SI") (SI "HI")])
929
930 ;; Double mask mode for packs
931 (define_mode_attr DOUBLEMASKMODE
932   [(HI "SI") (SI "DI")])
933
934
935 ;; Include define_subst patterns for instructions with mask
936 (include "subst.md")
937
938 ;; Patterns whose name begins with "sse{,2,3}_" are invoked by intrinsics.
939
940 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
941 ;;
942 ;; Move patterns
943 ;;
944 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
945
946 ;; All of these patterns are enabled for SSE1 as well as SSE2.
947 ;; This is essential for maintaining stable calling conventions.
948
949 (define_expand "mov<mode>"
950   [(set (match_operand:VMOVE 0 "nonimmediate_operand")
951         (match_operand:VMOVE 1 "nonimmediate_operand"))]
952   "TARGET_SSE"
953 {
954   ix86_expand_vector_move (<MODE>mode, operands);
955   DONE;
956 })
957
958 (define_insn "mov<mode>_internal"
959   [(set (match_operand:VMOVE 0 "nonimmediate_operand"
960          "=v,v ,v ,m")
961         (match_operand:VMOVE 1 "nonimmediate_or_sse_const_operand"
962          " C,BC,vm,v"))]
963   "TARGET_SSE
964    && (register_operand (operands[0], <MODE>mode)
965        || register_operand (operands[1], <MODE>mode))"
966 {
967   switch (get_attr_type (insn))
968     {
969     case TYPE_SSELOG1:
970       return standard_sse_constant_opcode (insn, operands);
971
972     case TYPE_SSEMOV:
973       /* There is no evex-encoded vmov* for sizes smaller than 64-bytes
974          in avx512f, so we need to use workarounds, to access sse registers
975          16-31, which are evex-only. In avx512vl we don't need workarounds.  */
976       if (TARGET_AVX512F && <MODE_SIZE> < 64 && !TARGET_AVX512VL
977           && (EXT_REX_SSE_REG_P (operands[0])
978               || EXT_REX_SSE_REG_P (operands[1])))
979         {
980           if (memory_operand (operands[0], <MODE>mode))
981             {
982               if (<MODE_SIZE> == 32)
983                 return "vextract<shuffletype>64x4\t{$0x0, %g1, %0|%0, %g1, 0x0}";
984               else if (<MODE_SIZE> == 16)
985                 return "vextract<shuffletype>32x4\t{$0x0, %g1, %0|%0, %g1, 0x0}";
986               else
987                 gcc_unreachable ();
988             }
989           else if (memory_operand (operands[1], <MODE>mode))
990             {
991               if (<MODE_SIZE> == 32)
992                 return "vbroadcast<shuffletype>64x4\t{%1, %g0|%g0, %1}";
993               else if (<MODE_SIZE> == 16)
994                 return "vbroadcast<shuffletype>32x4\t{%1, %g0|%g0, %1}";
995               else
996                 gcc_unreachable ();
997             }
998           else
999             /* Reg -> reg move is always aligned.  Just use wider move.  */
1000             switch (get_attr_mode (insn))
1001               {
1002               case MODE_V8SF:
1003               case MODE_V4SF:
1004                 return "vmovaps\t{%g1, %g0|%g0, %g1}";
1005               case MODE_V4DF:
1006               case MODE_V2DF:
1007                 return "vmovapd\t{%g1, %g0|%g0, %g1}";
1008               case MODE_OI:
1009               case MODE_TI:
1010                 return "vmovdqa64\t{%g1, %g0|%g0, %g1}";
1011               default:
1012                 gcc_unreachable ();
1013               }
1014         }
1015
1016       switch (get_attr_mode (insn))
1017         {
1018         case MODE_V16SF:
1019         case MODE_V8SF:
1020         case MODE_V4SF:
1021           if (misaligned_operand (operands[0], <MODE>mode)
1022               || misaligned_operand (operands[1], <MODE>mode))
1023             return "%vmovups\t{%1, %0|%0, %1}";
1024           else
1025             return "%vmovaps\t{%1, %0|%0, %1}";
1026
1027         case MODE_V8DF:
1028         case MODE_V4DF:
1029         case MODE_V2DF:
1030           if (misaligned_operand (operands[0], <MODE>mode)
1031               || misaligned_operand (operands[1], <MODE>mode))
1032             return "%vmovupd\t{%1, %0|%0, %1}";
1033           else
1034             return "%vmovapd\t{%1, %0|%0, %1}";
1035
1036         case MODE_OI:
1037         case MODE_TI:
1038           if (misaligned_operand (operands[0], <MODE>mode)
1039               || misaligned_operand (operands[1], <MODE>mode))
1040             return TARGET_AVX512VL
1041                    && (<MODE>mode == V4SImode
1042                        || <MODE>mode == V2DImode
1043                        || <MODE>mode == V8SImode
1044                        || <MODE>mode == V4DImode
1045                        || TARGET_AVX512BW)
1046                    ? "vmovdqu<ssescalarsize>\t{%1, %0|%0, %1}"
1047                    : "%vmovdqu\t{%1, %0|%0, %1}";
1048           else
1049             return TARGET_AVX512VL ? "vmovdqa64\t{%1, %0|%0, %1}"
1050                                    : "%vmovdqa\t{%1, %0|%0, %1}";
1051         case MODE_XI:
1052           if (misaligned_operand (operands[0], <MODE>mode)
1053               || misaligned_operand (operands[1], <MODE>mode))
1054             return (<MODE>mode == V16SImode
1055                     || <MODE>mode == V8DImode
1056                     || TARGET_AVX512BW)
1057                    ? "vmovdqu<ssescalarsize>\t{%1, %0|%0, %1}"
1058                    : "vmovdqu64\t{%1, %0|%0, %1}";
1059           else
1060             return "vmovdqa64\t{%1, %0|%0, %1}";
1061
1062         default:
1063           gcc_unreachable ();
1064         }
1065
1066     default:
1067       gcc_unreachable ();
1068     }
1069 }
1070   [(set_attr "type" "sselog1,sselog1,ssemov,ssemov")
1071    (set_attr "prefix" "maybe_vex")
1072    (set (attr "mode")
1073         (cond [(and (eq_attr "alternative" "1")
1074                     (match_test "TARGET_AVX512VL"))
1075                  (const_string "<sseinsnmode>")
1076                (and (match_test "<MODE_SIZE> == 16")
1077                     (ior (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL")
1078                          (and (eq_attr "alternative" "3")
1079                               (match_test "TARGET_SSE_TYPELESS_STORES"))))
1080                  (const_string "<ssePSmode>")
1081                (match_test "TARGET_AVX")
1082                  (const_string "<sseinsnmode>")
1083                (ior (not (match_test "TARGET_SSE2"))
1084                     (match_test "optimize_function_for_size_p (cfun)"))
1085                  (const_string "V4SF")
1086                (and (eq_attr "alternative" "0")
1087                     (match_test "TARGET_SSE_LOAD0_BY_PXOR"))
1088                  (const_string "TI")
1089               ]
1090               (const_string "<sseinsnmode>")))
1091    (set (attr "enabled")
1092         (cond [(and (match_test "<MODE_SIZE> == 16")
1093                     (eq_attr "alternative" "1"))
1094                  (symbol_ref "TARGET_SSE2")
1095                (and (match_test "<MODE_SIZE> == 32")
1096                     (eq_attr "alternative" "1"))
1097                  (symbol_ref "TARGET_AVX2")
1098               ]
1099               (symbol_ref "true")))])
1100
1101 (define_insn "<avx512>_load<mode>_mask"
1102   [(set (match_operand:V48_AVX512VL 0 "register_operand" "=v,v")
1103         (vec_merge:V48_AVX512VL
1104           (match_operand:V48_AVX512VL 1 "nonimmediate_operand" "v,m")
1105           (match_operand:V48_AVX512VL 2 "vector_move_operand" "0C,0C")
1106           (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk,Yk")))]
1107   "TARGET_AVX512F"
1108 {
1109   if (FLOAT_MODE_P (GET_MODE_INNER (<MODE>mode)))
1110     {
1111       if (misaligned_operand (operands[1], <MODE>mode))
1112         return "vmovu<ssemodesuffix>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}";
1113       else
1114         return "vmova<ssemodesuffix>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}";
1115     }
1116   else
1117     {
1118       if (misaligned_operand (operands[1], <MODE>mode))
1119         return "vmovdqu<ssescalarsize>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}";
1120       else
1121         return "vmovdqa<ssescalarsize>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}";
1122     }
1123 }
1124   [(set_attr "type" "ssemov")
1125    (set_attr "prefix" "evex")
1126    (set_attr "memory" "none,load")
1127    (set_attr "mode" "<sseinsnmode>")])
1128
1129 (define_insn "<avx512>_load<mode>_mask"
1130   [(set (match_operand:VI12_AVX512VL 0 "register_operand" "=v,v")
1131         (vec_merge:VI12_AVX512VL
1132           (match_operand:VI12_AVX512VL 1 "nonimmediate_operand" "v,m")
1133           (match_operand:VI12_AVX512VL 2 "vector_move_operand" "0C,0C")
1134           (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk,Yk")))]
1135   "TARGET_AVX512BW"
1136   "vmovdqu<ssescalarsize>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
1137   [(set_attr "type" "ssemov")
1138    (set_attr "prefix" "evex")
1139    (set_attr "memory" "none,load")
1140    (set_attr "mode" "<sseinsnmode>")])
1141
1142 (define_insn "<avx512>_blendm<mode>"
1143   [(set (match_operand:V48_AVX512VL 0 "register_operand" "=v")
1144         (vec_merge:V48_AVX512VL
1145           (match_operand:V48_AVX512VL 2 "nonimmediate_operand" "vm")
1146           (match_operand:V48_AVX512VL 1 "register_operand" "v")
1147           (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk")))]
1148   "TARGET_AVX512F"
1149   "v<sseintprefix>blendm<ssemodesuffix>\t{%2, %1, %0%{%3%}|%0%{%3%}, %1, %2}"
1150   [(set_attr "type" "ssemov")
1151    (set_attr "prefix" "evex")
1152    (set_attr "mode" "<sseinsnmode>")])
1153
1154 (define_insn "<avx512>_blendm<mode>"
1155   [(set (match_operand:VI12_AVX512VL 0 "register_operand" "=v")
1156         (vec_merge:VI12_AVX512VL
1157           (match_operand:VI12_AVX512VL 2 "nonimmediate_operand" "vm")
1158           (match_operand:VI12_AVX512VL 1 "register_operand" "v")
1159           (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk")))]
1160   "TARGET_AVX512BW"
1161   "vpblendm<ssemodesuffix>\t{%2, %1, %0%{%3%}|%0%{%3%}, %1, %2}"
1162   [(set_attr "type" "ssemov")
1163    (set_attr "prefix" "evex")
1164    (set_attr "mode" "<sseinsnmode>")])
1165
1166 (define_insn "<avx512>_store<mode>_mask"
1167   [(set (match_operand:V48_AVX512VL 0 "memory_operand" "=m")
1168         (vec_merge:V48_AVX512VL
1169           (match_operand:V48_AVX512VL 1 "register_operand" "v")
1170           (match_dup 0)
1171           (match_operand:<avx512fmaskmode> 2 "register_operand" "Yk")))]
1172   "TARGET_AVX512F"
1173 {
1174   if (FLOAT_MODE_P (GET_MODE_INNER (<MODE>mode)))
1175     {
1176       if (misaligned_operand (operands[0], <MODE>mode))
1177         return "vmovu<ssemodesuffix>\t{%1, %0%{%2%}|%0%{%2%}, %1}";
1178       else
1179         return "vmova<ssemodesuffix>\t{%1, %0%{%2%}|%0%{%2%}, %1}";
1180     }
1181   else
1182     {
1183       if (misaligned_operand (operands[0], <MODE>mode))
1184         return "vmovdqu<ssescalarsize>\t{%1, %0%{%2%}|%0%{%2%}, %1}";
1185       else
1186         return "vmovdqa<ssescalarsize>\t{%1, %0%{%2%}|%0%{%2%}, %1}";
1187     }
1188 }
1189   [(set_attr "type" "ssemov")
1190    (set_attr "prefix" "evex")
1191    (set_attr "memory" "store")
1192    (set_attr "mode" "<sseinsnmode>")])
1193
1194 (define_insn "<avx512>_store<mode>_mask"
1195   [(set (match_operand:VI12_AVX512VL 0 "memory_operand" "=m")
1196         (vec_merge:VI12_AVX512VL
1197           (match_operand:VI12_AVX512VL 1 "register_operand" "v")
1198           (match_dup 0)
1199           (match_operand:<avx512fmaskmode> 2 "register_operand" "Yk")))]
1200   "TARGET_AVX512BW"
1201   "vmovdqu<ssescalarsize>\t{%1, %0%{%2%}|%0%{%2%}, %1}"
1202   [(set_attr "type" "ssemov")
1203    (set_attr "prefix" "evex")
1204    (set_attr "memory" "store")
1205    (set_attr "mode" "<sseinsnmode>")])
1206
1207 (define_insn "sse2_movq128"
1208   [(set (match_operand:V2DI 0 "register_operand" "=v")
1209         (vec_concat:V2DI
1210           (vec_select:DI
1211             (match_operand:V2DI 1 "nonimmediate_operand" "vm")
1212             (parallel [(const_int 0)]))
1213           (const_int 0)))]
1214   "TARGET_SSE2"
1215   "%vmovq\t{%1, %0|%0, %q1}"
1216   [(set_attr "type" "ssemov")
1217    (set_attr "prefix" "maybe_vex")
1218    (set_attr "mode" "TI")])
1219
1220 ;; Move a DI from a 32-bit register pair (e.g. %edx:%eax) to an xmm.
1221 ;; We'd rather avoid this entirely; if the 32-bit reg pair was loaded
1222 ;; from memory, we'd prefer to load the memory directly into the %xmm
1223 ;; register.  To facilitate this happy circumstance, this pattern won't
1224 ;; split until after register allocation.  If the 64-bit value didn't
1225 ;; come from memory, this is the best we can do.  This is much better
1226 ;; than storing %edx:%eax into a stack temporary and loading an %xmm
1227 ;; from there.
1228
1229 (define_insn_and_split "movdi_to_sse"
1230   [(set (match_operand:V4SI 0 "register_operand" "=?x,x")
1231         (unspec:V4SI [(match_operand:DI 1 "nonimmediate_operand" "r,m")]
1232                      UNSPEC_MOVDI_TO_SSE))
1233      (clobber (match_scratch:V4SI 2 "=&x,X"))]
1234   "!TARGET_64BIT && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_TO_VEC"
1235   "#"
1236   "&& reload_completed"
1237   [(const_int 0)]
1238 {
1239  if (register_operand (operands[1], DImode))
1240    {
1241       /* The DImode arrived in a pair of integral registers (e.g. %edx:%eax).
1242          Assemble the 64-bit DImode value in an xmm register.  */
1243       emit_insn (gen_sse2_loadld (operands[0], CONST0_RTX (V4SImode),
1244                                   gen_lowpart (SImode, operands[1])));
1245       emit_insn (gen_sse2_loadld (operands[2], CONST0_RTX (V4SImode),
1246                                   gen_highpart (SImode, operands[1])));
1247       emit_insn (gen_vec_interleave_lowv4si (operands[0], operands[0],
1248                                              operands[2]));
1249    }
1250  else if (memory_operand (operands[1], DImode))
1251    emit_insn (gen_vec_concatv2di (gen_lowpart (V2DImode, operands[0]),
1252                                   operands[1], const0_rtx));
1253  else
1254    gcc_unreachable ();
1255  DONE;
1256 })
1257
1258 (define_split
1259   [(set (match_operand:V4SF 0 "register_operand")
1260         (match_operand:V4SF 1 "zero_extended_scalar_load_operand"))]
1261   "TARGET_SSE && reload_completed"
1262   [(set (match_dup 0)
1263         (vec_merge:V4SF
1264           (vec_duplicate:V4SF (match_dup 1))
1265           (match_dup 2)
1266           (const_int 1)))]
1267 {
1268   operands[1] = gen_lowpart (SFmode, operands[1]);
1269   operands[2] = CONST0_RTX (V4SFmode);
1270 })
1271
1272 (define_split
1273   [(set (match_operand:V2DF 0 "register_operand")
1274         (match_operand:V2DF 1 "zero_extended_scalar_load_operand"))]
1275   "TARGET_SSE2 && reload_completed"
1276   [(set (match_dup 0) (vec_concat:V2DF (match_dup 1) (match_dup 2)))]
1277 {
1278   operands[1] = gen_lowpart (DFmode, operands[1]);
1279   operands[2] = CONST0_RTX (DFmode);
1280 })
1281
1282 (define_expand "movmisalign<mode>"
1283   [(set (match_operand:VMOVE 0 "nonimmediate_operand")
1284         (match_operand:VMOVE 1 "nonimmediate_operand"))]
1285   "TARGET_SSE"
1286 {
1287   ix86_expand_vector_move_misalign (<MODE>mode, operands);
1288   DONE;
1289 })
1290
1291 ;; Merge movsd/movhpd to movupd for TARGET_SSE_UNALIGNED_LOAD_OPTIMAL targets.
1292 (define_peephole2
1293   [(set (match_operand:V2DF 0 "sse_reg_operand")
1294         (vec_concat:V2DF (match_operand:DF 1 "memory_operand")
1295                          (match_operand:DF 4 "const0_operand")))
1296    (set (match_operand:V2DF 2 "sse_reg_operand")
1297         (vec_concat:V2DF (vec_select:DF (match_dup 2)
1298                                         (parallel [(const_int 0)]))
1299                          (match_operand:DF 3 "memory_operand")))]
1300   "TARGET_SSE2 && TARGET_SSE_UNALIGNED_LOAD_OPTIMAL
1301    && ix86_operands_ok_for_move_multiple (operands, true, DFmode)"
1302   [(set (match_dup 2) (match_dup 5))]
1303   "operands[5] = adjust_address (operands[1], V2DFmode, 0);")
1304
1305 (define_peephole2
1306   [(set (match_operand:DF 0 "sse_reg_operand")
1307         (match_operand:DF 1 "memory_operand"))
1308    (set (match_operand:V2DF 2 "sse_reg_operand")
1309         (vec_concat:V2DF (match_operand:DF 4 "sse_reg_operand")
1310                          (match_operand:DF 3 "memory_operand")))]
1311   "TARGET_SSE2 && TARGET_SSE_UNALIGNED_LOAD_OPTIMAL
1312    && REGNO (operands[4]) == REGNO (operands[2])
1313    && ix86_operands_ok_for_move_multiple (operands, true, DFmode)"
1314   [(set (match_dup 2) (match_dup 5))]
1315   "operands[5] = adjust_address (operands[1], V2DFmode, 0);")
1316
1317 ;; Merge movlpd/movhpd to movupd for TARGET_SSE_UNALIGNED_STORE_OPTIMAL targets.
1318 (define_peephole2
1319   [(set (match_operand:DF 0 "memory_operand")
1320         (vec_select:DF (match_operand:V2DF 1 "sse_reg_operand")
1321                        (parallel [(const_int 0)])))
1322    (set (match_operand:DF 2 "memory_operand")
1323         (vec_select:DF (match_operand:V2DF 3 "sse_reg_operand")
1324                        (parallel [(const_int 1)])))]
1325   "TARGET_SSE2 && TARGET_SSE_UNALIGNED_STORE_OPTIMAL
1326    && ix86_operands_ok_for_move_multiple (operands, false, DFmode)"
1327   [(set (match_dup 4) (match_dup 1))]
1328   "operands[4] = adjust_address (operands[0], V2DFmode, 0);")
1329
1330 (define_insn "<sse3>_lddqu<avxsizesuffix>"
1331   [(set (match_operand:VI1 0 "register_operand" "=x")
1332         (unspec:VI1 [(match_operand:VI1 1 "memory_operand" "m")]
1333                     UNSPEC_LDDQU))]
1334   "TARGET_SSE3"
1335   "%vlddqu\t{%1, %0|%0, %1}"
1336   [(set_attr "type" "ssemov")
1337    (set_attr "movu" "1")
1338    (set (attr "prefix_data16")
1339      (if_then_else
1340        (match_test "TARGET_AVX")
1341      (const_string "*")
1342      (const_string "0")))
1343    (set (attr "prefix_rep")
1344      (if_then_else
1345        (match_test "TARGET_AVX")
1346      (const_string "*")
1347      (const_string "1")))
1348    (set_attr "prefix" "maybe_vex")
1349    (set_attr "mode" "<sseinsnmode>")])
1350
1351 (define_insn "sse2_movnti<mode>"
1352   [(set (match_operand:SWI48 0 "memory_operand" "=m")
1353         (unspec:SWI48 [(match_operand:SWI48 1 "register_operand" "r")]
1354                       UNSPEC_MOVNT))]
1355   "TARGET_SSE2"
1356   "movnti\t{%1, %0|%0, %1}"
1357   [(set_attr "type" "ssemov")
1358    (set_attr "prefix_data16" "0")
1359    (set_attr "mode" "<MODE>")])
1360
1361 (define_insn "<sse>_movnt<mode>"
1362   [(set (match_operand:VF 0 "memory_operand" "=m")
1363         (unspec:VF
1364           [(match_operand:VF 1 "register_operand" "v")]
1365           UNSPEC_MOVNT))]
1366   "TARGET_SSE"
1367   "%vmovnt<ssemodesuffix>\t{%1, %0|%0, %1}"
1368   [(set_attr "type" "ssemov")
1369    (set_attr "prefix" "maybe_vex")
1370    (set_attr "mode" "<MODE>")])
1371
1372 (define_insn "<sse2>_movnt<mode>"
1373   [(set (match_operand:VI8 0 "memory_operand" "=m")
1374         (unspec:VI8 [(match_operand:VI8 1 "register_operand" "v")]
1375                     UNSPEC_MOVNT))]
1376   "TARGET_SSE2"
1377   "%vmovntdq\t{%1, %0|%0, %1}"
1378   [(set_attr "type" "ssecvt")
1379    (set (attr "prefix_data16")
1380      (if_then_else
1381        (match_test "TARGET_AVX")
1382      (const_string "*")
1383      (const_string "1")))
1384    (set_attr "prefix" "maybe_vex")
1385    (set_attr "mode" "<sseinsnmode>")])
1386
1387 ; Expand patterns for non-temporal stores.  At the moment, only those
1388 ; that directly map to insns are defined; it would be possible to
1389 ; define patterns for other modes that would expand to several insns.
1390
1391 ;; Modes handled by storent patterns.
1392 (define_mode_iterator STORENT_MODE
1393   [(DI "TARGET_SSE2 && TARGET_64BIT") (SI "TARGET_SSE2")
1394    (SF "TARGET_SSE4A") (DF "TARGET_SSE4A")
1395    (V8DI "TARGET_AVX512F") (V4DI "TARGET_AVX") (V2DI "TARGET_SSE2")
1396    (V16SF "TARGET_AVX512F") (V8SF "TARGET_AVX") V4SF
1397    (V8DF "TARGET_AVX512F") (V4DF "TARGET_AVX") (V2DF "TARGET_SSE2")])
1398
1399 (define_expand "storent<mode>"
1400   [(set (match_operand:STORENT_MODE 0 "memory_operand")
1401         (unspec:STORENT_MODE
1402           [(match_operand:STORENT_MODE 1 "register_operand")]
1403           UNSPEC_MOVNT))]
1404   "TARGET_SSE")
1405
1406 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1407 ;;
1408 ;; Mask operations
1409 ;;
1410 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1411
1412 ;; All integer modes with AVX512BW/DQ.
1413 (define_mode_iterator SWI1248_AVX512BWDQ
1414   [(QI "TARGET_AVX512DQ") HI (SI "TARGET_AVX512BW") (DI "TARGET_AVX512BW")])
1415
1416 ;; All integer modes with AVX512BW, where HImode operation
1417 ;; can be used instead of QImode.
1418 (define_mode_iterator SWI1248_AVX512BW
1419   [QI HI (SI "TARGET_AVX512BW") (DI "TARGET_AVX512BW")])
1420
1421 ;; All integer modes with AVX512BW/DQ, even HImode requires DQ.
1422 (define_mode_iterator SWI1248_AVX512BWDQ2
1423   [(QI "TARGET_AVX512DQ") (HI "TARGET_AVX512DQ")
1424    (SI "TARGET_AVX512BW") (DI "TARGET_AVX512BW")])
1425
1426 (define_expand "kmov<mskmodesuffix>"
1427   [(set (match_operand:SWI1248_AVX512BWDQ 0 "nonimmediate_operand")
1428         (match_operand:SWI1248_AVX512BWDQ 1 "nonimmediate_operand"))]
1429   "TARGET_AVX512F
1430    && !(MEM_P (operands[0]) && MEM_P (operands[1]))")
1431
1432 (define_insn "k<code><mode>"
1433   [(set (match_operand:SWI1248_AVX512BW 0 "register_operand" "=k")
1434         (any_logic:SWI1248_AVX512BW
1435           (match_operand:SWI1248_AVX512BW 1 "register_operand" "k")
1436           (match_operand:SWI1248_AVX512BW 2 "register_operand" "k")))
1437    (unspec [(const_int 0)] UNSPEC_MASKOP)]
1438   "TARGET_AVX512F"
1439 {
1440   if (get_attr_mode (insn) == MODE_HI)
1441     return "k<logic>w\t{%2, %1, %0|%0, %1, %2}";
1442   else
1443     return "k<logic><mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}";
1444 }
1445   [(set_attr "type" "msklog")
1446    (set_attr "prefix" "vex")
1447    (set (attr "mode")
1448      (cond [(and (match_test "<MODE>mode == QImode")
1449                  (not (match_test "TARGET_AVX512DQ")))
1450                (const_string "HI")
1451            ]
1452            (const_string "<MODE>")))])
1453
1454 (define_insn "kandn<mode>"
1455   [(set (match_operand:SWI1248_AVX512BW 0 "register_operand" "=k")
1456         (and:SWI1248_AVX512BW
1457           (not:SWI1248_AVX512BW
1458             (match_operand:SWI1248_AVX512BW 1 "register_operand" "k"))
1459           (match_operand:SWI1248_AVX512BW 2 "register_operand" "k")))
1460    (unspec [(const_int 0)] UNSPEC_MASKOP)]
1461   "TARGET_AVX512F"
1462 {
1463   if (get_attr_mode (insn) == MODE_HI)
1464     return "kandnw\t{%2, %1, %0|%0, %1, %2}";
1465   else
1466     return "kandn<mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}";
1467 }
1468   [(set_attr "type" "msklog")
1469    (set_attr "prefix" "vex")
1470    (set (attr "mode")
1471      (cond [(and (match_test "<MODE>mode == QImode")
1472                  (not (match_test "TARGET_AVX512DQ")))
1473               (const_string "HI")
1474            ]
1475            (const_string "<MODE>")))])
1476
1477 (define_insn "kxnor<mode>"
1478   [(set (match_operand:SWI1248_AVX512BW 0 "register_operand" "=k")
1479         (not:SWI1248_AVX512BW
1480           (xor:SWI1248_AVX512BW
1481             (match_operand:SWI1248_AVX512BW 1 "register_operand" "k")
1482             (match_operand:SWI1248_AVX512BW 2 "register_operand" "k"))))
1483    (unspec [(const_int 0)] UNSPEC_MASKOP)]
1484   "TARGET_AVX512F"
1485 {
1486   if (get_attr_mode (insn) == MODE_HI)
1487     return "kxnorw\t{%2, %1, %0|%0, %1, %2}";
1488   else
1489     return "kxnor<mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}";
1490 }
1491   [(set_attr "type" "msklog")
1492    (set_attr "prefix" "vex")
1493    (set (attr "mode")
1494      (cond [(and (match_test "<MODE>mode == QImode")
1495                  (not (match_test "TARGET_AVX512DQ")))
1496               (const_string "HI")
1497            ]
1498            (const_string "<MODE>")))])
1499
1500 (define_insn "knot<mode>"
1501   [(set (match_operand:SWI1248_AVX512BW 0 "register_operand" "=k")
1502         (not:SWI1248_AVX512BW
1503           (match_operand:SWI1248_AVX512BW 1 "register_operand" "k")))
1504    (unspec [(const_int 0)] UNSPEC_MASKOP)]
1505   "TARGET_AVX512F"
1506 {
1507   if (get_attr_mode (insn) == MODE_HI)
1508     return "knotw\t{%1, %0|%0, %1}";
1509   else
1510     return "knot<mskmodesuffix>\t{%1, %0|%0, %1}";
1511 }
1512   [(set_attr "type" "msklog")
1513    (set_attr "prefix" "vex")
1514    (set (attr "mode")
1515      (cond [(and (match_test "<MODE>mode == QImode")
1516                  (not (match_test "TARGET_AVX512DQ")))
1517                (const_string "HI")
1518            ]
1519            (const_string "<MODE>")))])
1520
1521 (define_insn "kadd<mode>"
1522   [(set (match_operand:SWI1248_AVX512BWDQ2 0 "register_operand" "=k")
1523         (plus:SWI1248_AVX512BWDQ2
1524           (match_operand:SWI1248_AVX512BWDQ2 1 "register_operand" "k")
1525           (match_operand:SWI1248_AVX512BWDQ2 2 "register_operand" "k")))
1526    (unspec [(const_int 0)] UNSPEC_MASKOP)]
1527   "TARGET_AVX512F"
1528   "kadd<mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
1529   [(set_attr "type" "msklog")
1530    (set_attr "prefix" "vex")
1531    (set_attr "mode" "<MODE>")])
1532
1533 ;; Mask variant shift mnemonics
1534 (define_code_attr mshift [(ashift "shiftl") (lshiftrt "shiftr")])
1535
1536 (define_insn "k<code><mode>"
1537   [(set (match_operand:SWI1248_AVX512BWDQ 0 "register_operand" "=k")
1538         (any_lshift:SWI1248_AVX512BWDQ
1539           (match_operand:SWI1248_AVX512BWDQ 1 "register_operand" "k")
1540           (match_operand:QI 2 "immediate_operand" "n")))
1541    (unspec [(const_int 0)] UNSPEC_MASKOP)]
1542   "TARGET_AVX512F"
1543   "k<mshift><mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
1544   [(set_attr "type" "msklog")
1545    (set_attr "prefix" "vex")
1546    (set_attr "mode" "<MODE>")])
1547
1548 (define_insn "ktest<mode>"
1549   [(set (reg:CC FLAGS_REG)
1550         (unspec:CC
1551           [(match_operand:SWI1248_AVX512BWDQ2 0 "register_operand" "k")
1552            (match_operand:SWI1248_AVX512BWDQ2 1 "register_operand" "k")]
1553           UNSPEC_KTEST))]
1554   "TARGET_AVX512F"
1555   "ktest<mskmodesuffix>\t{%1, %0|%0, %1}"
1556   [(set_attr "mode" "<MODE>")
1557    (set_attr "type" "msklog")
1558    (set_attr "prefix" "vex")])
1559
1560 (define_insn "kortest<mode>"
1561   [(set (reg:CC FLAGS_REG)
1562         (unspec:CC
1563           [(match_operand:SWI1248_AVX512BWDQ 0 "register_operand" "k")
1564            (match_operand:SWI1248_AVX512BWDQ 1 "register_operand" "k")]
1565           UNSPEC_KORTEST))]
1566   "TARGET_AVX512F"
1567   "kortest<mskmodesuffix>\t{%1, %0|%0, %1}"
1568   [(set_attr "mode" "<MODE>")
1569    (set_attr "type" "msklog")
1570    (set_attr "prefix" "vex")])
1571
1572 (define_insn "kunpckhi"
1573   [(set (match_operand:HI 0 "register_operand" "=k")
1574         (ior:HI
1575           (ashift:HI
1576             (zero_extend:HI (match_operand:QI 1 "register_operand" "k"))
1577             (const_int 8))
1578           (zero_extend:HI (match_operand:QI 2 "register_operand" "k"))))]
1579   "TARGET_AVX512F"
1580   "kunpckbw\t{%2, %1, %0|%0, %1, %2}"
1581   [(set_attr "mode" "HI")
1582    (set_attr "type" "msklog")
1583    (set_attr "prefix" "vex")])
1584
1585 (define_insn "kunpcksi"
1586   [(set (match_operand:SI 0 "register_operand" "=k")
1587         (ior:SI
1588           (ashift:SI
1589             (zero_extend:SI (match_operand:HI 1 "register_operand" "k"))
1590             (const_int 16))
1591           (zero_extend:SI (match_operand:HI 2 "register_operand" "k"))))]
1592   "TARGET_AVX512BW"
1593   "kunpckwd\t{%2, %1, %0|%0, %1, %2}"
1594   [(set_attr "mode" "SI")])
1595
1596 (define_insn "kunpckdi"
1597   [(set (match_operand:DI 0 "register_operand" "=k")
1598         (ior:DI
1599           (ashift:DI
1600             (zero_extend:DI (match_operand:SI 1 "register_operand" "k"))
1601             (const_int 32))
1602           (zero_extend:DI (match_operand:SI 2 "register_operand" "k"))))]
1603   "TARGET_AVX512BW"
1604   "kunpckdq\t{%2, %1, %0|%0, %1, %2}"
1605   [(set_attr "mode" "DI")])
1606
1607
1608 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1609 ;;
1610 ;; Parallel floating point arithmetic
1611 ;;
1612 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1613
1614 (define_expand "<code><mode>2"
1615   [(set (match_operand:VF 0 "register_operand")
1616         (absneg:VF
1617           (match_operand:VF 1 "register_operand")))]
1618   "TARGET_SSE"
1619   "ix86_expand_fp_absneg_operator (<CODE>, <MODE>mode, operands); DONE;")
1620
1621 (define_insn_and_split "*absneg<mode>2"
1622   [(set (match_operand:VF 0 "register_operand" "=x,x,v,v")
1623         (match_operator:VF 3 "absneg_operator"
1624           [(match_operand:VF 1 "vector_operand" "0,  xBm,v, m")]))
1625    (use (match_operand:VF 2 "vector_operand"    "xBm,0,  vm,v"))]
1626   "TARGET_SSE"
1627   "#"
1628   "&& reload_completed"
1629   [(const_int 0)]
1630 {
1631   enum rtx_code absneg_op;
1632   rtx op1, op2;
1633   rtx t;
1634
1635   if (TARGET_AVX)
1636     {
1637       if (MEM_P (operands[1]))
1638         op1 = operands[2], op2 = operands[1];
1639       else
1640         op1 = operands[1], op2 = operands[2];
1641     }
1642   else
1643     {
1644       op1 = operands[0];
1645       if (rtx_equal_p (operands[0], operands[1]))
1646         op2 = operands[2];
1647       else
1648         op2 = operands[1];
1649     }
1650
1651   absneg_op = GET_CODE (operands[3]) == NEG ? XOR : AND;
1652   t = gen_rtx_fmt_ee (absneg_op, <MODE>mode, op1, op2);
1653   t = gen_rtx_SET (operands[0], t);
1654   emit_insn (t);
1655   DONE;
1656 }
1657   [(set_attr "isa" "noavx,noavx,avx,avx")])
1658
1659 (define_expand "<plusminus_insn><mode>3<mask_name><round_name>"
1660   [(set (match_operand:VF 0 "register_operand")
1661         (plusminus:VF
1662           (match_operand:VF 1 "<round_nimm_predicate>")
1663           (match_operand:VF 2 "<round_nimm_predicate>")))]
1664   "TARGET_SSE && <mask_mode512bit_condition> && <round_mode512bit_condition>"
1665   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
1666
1667 (define_insn "*<plusminus_insn><mode>3<mask_name><round_name>"
1668   [(set (match_operand:VF 0 "register_operand" "=x,v")
1669         (plusminus:VF
1670           (match_operand:VF 1 "<round_nimm_predicate>" "<comm>0,v")
1671           (match_operand:VF 2 "<round_nimm_predicate>" "xBm,<round_constraint>")))]
1672   "TARGET_SSE && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)
1673    && <mask_mode512bit_condition> && <round_mode512bit_condition>"
1674   "@
1675    <plusminus_mnemonic><ssemodesuffix>\t{%2, %0|%0, %2}
1676    v<plusminus_mnemonic><ssemodesuffix>\t{<round_mask_op3>%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2<round_mask_op3>}"
1677   [(set_attr "isa" "noavx,avx")
1678    (set_attr "type" "sseadd")
1679    (set_attr "prefix" "<mask_prefix3>")
1680    (set_attr "mode" "<MODE>")])
1681
1682 (define_insn "<sse>_vm<plusminus_insn><mode>3<mask_scalar_name><round_scalar_name>"
1683   [(set (match_operand:VF_128 0 "register_operand" "=x,v")
1684         (vec_merge:VF_128
1685           (plusminus:VF_128
1686             (match_operand:VF_128 1 "register_operand" "0,v")
1687             (match_operand:VF_128 2 "vector_operand" "xBm,<round_scalar_constraint>"))
1688           (match_dup 1)
1689           (const_int 1)))]
1690   "TARGET_SSE"
1691   "@
1692    <plusminus_mnemonic><ssescalarmodesuffix>\t{%2, %0|%0, %<iptr>2}
1693    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>}"
1694   [(set_attr "isa" "noavx,avx")
1695    (set_attr "type" "sseadd")
1696    (set_attr "prefix" "<round_scalar_prefix>")
1697    (set_attr "mode" "<ssescalarmode>")])
1698
1699 (define_expand "mul<mode>3<mask_name><round_name>"
1700   [(set (match_operand:VF 0 "register_operand")
1701         (mult:VF
1702           (match_operand:VF 1 "<round_nimm_predicate>")
1703           (match_operand:VF 2 "<round_nimm_predicate>")))]
1704   "TARGET_SSE && <mask_mode512bit_condition> && <round_mode512bit_condition>"
1705   "ix86_fixup_binary_operands_no_copy (MULT, <MODE>mode, operands);")
1706
1707 (define_insn "*mul<mode>3<mask_name><round_name>"
1708   [(set (match_operand:VF 0 "register_operand" "=x,v")
1709         (mult:VF
1710           (match_operand:VF 1 "<round_nimm_predicate>" "%0,v")
1711           (match_operand:VF 2 "<round_nimm_predicate>" "xBm,<round_constraint>")))]
1712   "TARGET_SSE
1713    && !(MEM_P (operands[1]) && MEM_P (operands[2]))
1714    && <mask_mode512bit_condition> && <round_mode512bit_condition>"
1715   "@
1716    mul<ssemodesuffix>\t{%2, %0|%0, %2}
1717    vmul<ssemodesuffix>\t{<round_mask_op3>%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2<round_mask_op3>}"
1718   [(set_attr "isa" "noavx,avx")
1719    (set_attr "type" "ssemul")
1720    (set_attr "prefix" "<mask_prefix3>")
1721    (set_attr "btver2_decode" "direct,double")
1722    (set_attr "mode" "<MODE>")])
1723
1724 (define_insn "<sse>_vm<multdiv_mnemonic><mode>3<mask_scalar_name><round_scalar_name>"
1725   [(set (match_operand:VF_128 0 "register_operand" "=x,v")
1726         (vec_merge:VF_128
1727           (multdiv:VF_128
1728             (match_operand:VF_128 1 "register_operand" "0,v")
1729             (match_operand:VF_128 2 "vector_operand" "xBm,<round_scalar_constraint>"))
1730           (match_dup 1)
1731           (const_int 1)))]
1732   "TARGET_SSE"
1733   "@
1734    <multdiv_mnemonic><ssescalarmodesuffix>\t{%2, %0|%0, %<iptr>2}
1735    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>}"
1736   [(set_attr "isa" "noavx,avx")
1737    (set_attr "type" "sse<multdiv_mnemonic>")
1738    (set_attr "prefix" "<round_scalar_prefix>")
1739    (set_attr "btver2_decode" "direct,double")
1740    (set_attr "mode" "<ssescalarmode>")])
1741
1742 (define_expand "div<mode>3"
1743   [(set (match_operand:VF2 0 "register_operand")
1744         (div:VF2 (match_operand:VF2 1 "register_operand")
1745                  (match_operand:VF2 2 "vector_operand")))]
1746   "TARGET_SSE2"
1747   "ix86_fixup_binary_operands_no_copy (DIV, <MODE>mode, operands);")
1748
1749 (define_expand "div<mode>3"
1750   [(set (match_operand:VF1 0 "register_operand")
1751         (div:VF1 (match_operand:VF1 1 "register_operand")
1752                  (match_operand:VF1 2 "vector_operand")))]
1753   "TARGET_SSE"
1754 {
1755   ix86_fixup_binary_operands_no_copy (DIV, <MODE>mode, operands);
1756
1757   if (TARGET_SSE_MATH
1758       && TARGET_RECIP_VEC_DIV
1759       && !optimize_insn_for_size_p ()
1760       && flag_finite_math_only && !flag_trapping_math
1761       && flag_unsafe_math_optimizations)
1762     {
1763       ix86_emit_swdivsf (operands[0], operands[1], operands[2], <MODE>mode);
1764       DONE;
1765     }
1766 })
1767
1768 (define_insn "<sse>_div<mode>3<mask_name><round_name>"
1769   [(set (match_operand:VF 0 "register_operand" "=x,v")
1770         (div:VF
1771           (match_operand:VF 1 "register_operand" "0,v")
1772           (match_operand:VF 2 "<round_nimm_predicate>" "xBm,<round_constraint>")))]
1773   "TARGET_SSE && <mask_mode512bit_condition> && <round_mode512bit_condition>"
1774   "@
1775    div<ssemodesuffix>\t{%2, %0|%0, %2}
1776    vdiv<ssemodesuffix>\t{<round_mask_op3>%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2<round_mask_op3>}"
1777   [(set_attr "isa" "noavx,avx")
1778    (set_attr "type" "ssediv")
1779    (set_attr "prefix" "<mask_prefix3>")
1780    (set_attr "mode" "<MODE>")])
1781
1782 (define_insn "<sse>_rcp<mode>2"
1783   [(set (match_operand:VF1_128_256 0 "register_operand" "=x")
1784         (unspec:VF1_128_256
1785           [(match_operand:VF1_128_256 1 "vector_operand" "xBm")] UNSPEC_RCP))]
1786   "TARGET_SSE"
1787   "%vrcpps\t{%1, %0|%0, %1}"
1788   [(set_attr "type" "sse")
1789    (set_attr "atom_sse_attr" "rcp")
1790    (set_attr "btver2_sse_attr" "rcp")
1791    (set_attr "prefix" "maybe_vex")
1792    (set_attr "mode" "<MODE>")])
1793
1794 (define_insn "sse_vmrcpv4sf2"
1795   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
1796         (vec_merge:V4SF
1797           (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm,xm")]
1798                        UNSPEC_RCP)
1799           (match_operand:V4SF 2 "register_operand" "0,x")
1800           (const_int 1)))]
1801   "TARGET_SSE"
1802   "@
1803    rcpss\t{%1, %0|%0, %k1}
1804    vrcpss\t{%1, %2, %0|%0, %2, %k1}"
1805   [(set_attr "isa" "noavx,avx")
1806    (set_attr "type" "sse")
1807    (set_attr "atom_sse_attr" "rcp")
1808    (set_attr "btver2_sse_attr" "rcp")
1809    (set_attr "prefix" "orig,vex")
1810    (set_attr "mode" "SF")])
1811
1812 (define_insn "<mask_codefor>rcp14<mode><mask_name>"
1813   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
1814         (unspec:VF_AVX512VL
1815           [(match_operand:VF_AVX512VL 1 "nonimmediate_operand" "vm")]
1816           UNSPEC_RCP14))]
1817   "TARGET_AVX512F"
1818   "vrcp14<ssemodesuffix>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
1819   [(set_attr "type" "sse")
1820    (set_attr "prefix" "evex")
1821    (set_attr "mode" "<MODE>")])
1822
1823 (define_insn "srcp14<mode>"
1824   [(set (match_operand:VF_128 0 "register_operand" "=v")
1825         (vec_merge:VF_128
1826           (unspec:VF_128
1827             [(match_operand:VF_128 1 "nonimmediate_operand" "vm")]
1828             UNSPEC_RCP14)
1829           (match_operand:VF_128 2 "register_operand" "v")
1830           (const_int 1)))]
1831   "TARGET_AVX512F"
1832   "vrcp14<ssescalarmodesuffix>\t{%1, %2, %0|%0, %2, %<iptr>1}"
1833   [(set_attr "type" "sse")
1834    (set_attr "prefix" "evex")
1835    (set_attr "mode" "<MODE>")])
1836
1837 (define_insn "srcp14<mode>_mask"
1838   [(set (match_operand:VF_128 0 "register_operand" "=v")
1839         (vec_merge:VF_128
1840           (vec_merge:VF_128
1841             (unspec:VF_128
1842               [(match_operand:VF_128 1 "nonimmediate_operand" "vm")]
1843             UNSPEC_RCP14)
1844               (match_operand:VF_128 3 "vector_move_operand" "0C")
1845             (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk"))
1846           (match_operand:VF_128 2 "register_operand" "v")
1847           (const_int 1)))]
1848   "TARGET_AVX512F"
1849   "vrcp14<ssescalarmodesuffix>\t{%1, %2, %0%{%4%}%N3|%0%{%4%}%N3, %2, %<iptr>1}"
1850   [(set_attr "type" "sse")
1851    (set_attr "prefix" "evex")
1852    (set_attr "mode" "<MODE>")])
1853
1854 (define_expand "sqrt<mode>2"
1855   [(set (match_operand:VF2 0 "register_operand")
1856         (sqrt:VF2 (match_operand:VF2 1 "vector_operand")))]
1857   "TARGET_SSE2")
1858
1859 (define_expand "sqrt<mode>2"
1860   [(set (match_operand:VF1 0 "register_operand")
1861         (sqrt:VF1 (match_operand:VF1 1 "vector_operand")))]
1862   "TARGET_SSE"
1863 {
1864   if (TARGET_SSE_MATH
1865       && TARGET_RECIP_VEC_SQRT
1866       && !optimize_insn_for_size_p ()
1867       && flag_finite_math_only && !flag_trapping_math
1868       && flag_unsafe_math_optimizations)
1869     {
1870       ix86_emit_swsqrtsf (operands[0], operands[1], <MODE>mode, false);
1871       DONE;
1872     }
1873 })
1874
1875 (define_insn "<sse>_sqrt<mode>2<mask_name><round_name>"
1876   [(set (match_operand:VF 0 "register_operand" "=x,v")
1877         (sqrt:VF (match_operand:VF 1 "<round_nimm_predicate>" "xBm,<round_constraint>")))]
1878   "TARGET_SSE && <mask_mode512bit_condition> && <round_mode512bit_condition>"
1879   "@
1880    sqrt<ssemodesuffix>\t{%1, %0|%0, %1}
1881    vsqrt<ssemodesuffix>\t{<round_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_mask_op2>}"
1882   [(set_attr "isa" "noavx,avx")
1883    (set_attr "type" "sse")
1884    (set_attr "atom_sse_attr" "sqrt")
1885    (set_attr "btver2_sse_attr" "sqrt")
1886    (set_attr "prefix" "maybe_vex")
1887    (set_attr "mode" "<MODE>")])
1888
1889 (define_insn "<sse>_vmsqrt<mode>2<mask_scalar_name><round_scalar_name>"
1890   [(set (match_operand:VF_128 0 "register_operand" "=x,v")
1891         (vec_merge:VF_128
1892           (sqrt:VF_128
1893             (match_operand:VF_128 1 "vector_operand" "xBm,<round_scalar_constraint>"))
1894           (match_operand:VF_128 2 "register_operand" "0,v")
1895           (const_int 1)))]
1896   "TARGET_SSE"
1897   "@
1898    sqrt<ssescalarmodesuffix>\t{%1, %0|%0, %<iptr>1}
1899    vsqrt<ssescalarmodesuffix>\t{<round_scalar_mask_op3>%1, %2, %0<mask_scalar_operand3>|%0<mask_scalar_operand3>, %2, %<iptr>1<round_scalar_mask_op3>}"
1900   [(set_attr "isa" "noavx,avx")
1901    (set_attr "type" "sse")
1902    (set_attr "atom_sse_attr" "sqrt")
1903    (set_attr "prefix" "<round_scalar_prefix>")
1904    (set_attr "btver2_sse_attr" "sqrt")
1905    (set_attr "mode" "<ssescalarmode>")])
1906
1907 (define_expand "rsqrt<mode>2"
1908   [(set (match_operand:VF1_128_256 0 "register_operand")
1909         (unspec:VF1_128_256
1910           [(match_operand:VF1_128_256 1 "vector_operand")] UNSPEC_RSQRT))]
1911   "TARGET_SSE_MATH"
1912 {
1913   ix86_emit_swsqrtsf (operands[0], operands[1], <MODE>mode, true);
1914   DONE;
1915 })
1916
1917 (define_expand "rsqrtv16sf2"
1918   [(set (match_operand:V16SF 0 "register_operand")
1919         (unspec:V16SF
1920           [(match_operand:V16SF 1 "vector_operand")]
1921           UNSPEC_RSQRT28))]
1922   "TARGET_SSE_MATH && TARGET_AVX512ER"
1923 {
1924   ix86_emit_swsqrtsf (operands[0], operands[1], V16SFmode, true);
1925   DONE;
1926 })
1927
1928 (define_insn "<sse>_rsqrt<mode>2"
1929   [(set (match_operand:VF1_128_256 0 "register_operand" "=x")
1930         (unspec:VF1_128_256
1931           [(match_operand:VF1_128_256 1 "vector_operand" "xBm")] UNSPEC_RSQRT))]
1932   "TARGET_SSE"
1933   "%vrsqrtps\t{%1, %0|%0, %1}"
1934   [(set_attr "type" "sse")
1935    (set_attr "prefix" "maybe_vex")
1936    (set_attr "mode" "<MODE>")])
1937
1938 (define_insn "<mask_codefor>rsqrt14<mode><mask_name>"
1939   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
1940         (unspec:VF_AVX512VL
1941           [(match_operand:VF_AVX512VL 1 "nonimmediate_operand" "vm")]
1942           UNSPEC_RSQRT14))]
1943   "TARGET_AVX512F"
1944   "vrsqrt14<ssemodesuffix>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
1945   [(set_attr "type" "sse")
1946    (set_attr "prefix" "evex")
1947    (set_attr "mode" "<MODE>")])
1948
1949 (define_insn "rsqrt14<mode>"
1950   [(set (match_operand:VF_128 0 "register_operand" "=v")
1951         (vec_merge:VF_128
1952           (unspec:VF_128
1953             [(match_operand:VF_128 1 "nonimmediate_operand" "vm")]
1954             UNSPEC_RSQRT14)
1955           (match_operand:VF_128 2 "register_operand" "v")
1956           (const_int 1)))]
1957   "TARGET_AVX512F"
1958   "vrsqrt14<ssescalarmodesuffix>\t{%1, %2, %0|%0, %2, %<iptr>1}"
1959   [(set_attr "type" "sse")
1960    (set_attr "prefix" "evex")
1961    (set_attr "mode" "<MODE>")])
1962
1963 (define_insn "rsqrt14_<mode>_mask"
1964   [(set (match_operand:VF_128 0 "register_operand" "=v")
1965         (vec_merge:VF_128
1966           (vec_merge:VF_128
1967             (unspec:VF_128
1968               [(match_operand:VF_128 1 "nonimmediate_operand" "vm")]
1969               UNSPEC_RSQRT14)
1970               (match_operand:VF_128 3 "vector_move_operand" "0C")
1971               (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk"))
1972           (match_operand:VF_128 2 "register_operand" "v")
1973           (const_int 1)))]
1974   "TARGET_AVX512F"
1975   "vrsqrt14<ssescalarmodesuffix>\t{%1, %2, %0%{%4%}%N3|%0%{%4%}%N3, %2, %<iptr>1}"
1976   [(set_attr "type" "sse")
1977    (set_attr "prefix" "evex")
1978    (set_attr "mode" "<MODE>")])
1979
1980 (define_insn "sse_vmrsqrtv4sf2"
1981   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
1982         (vec_merge:V4SF
1983           (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm,xm")]
1984                        UNSPEC_RSQRT)
1985           (match_operand:V4SF 2 "register_operand" "0,x")
1986           (const_int 1)))]
1987   "TARGET_SSE"
1988   "@
1989    rsqrtss\t{%1, %0|%0, %k1}
1990    vrsqrtss\t{%1, %2, %0|%0, %2, %k1}"
1991   [(set_attr "isa" "noavx,avx")
1992    (set_attr "type" "sse")
1993    (set_attr "prefix" "orig,vex")
1994    (set_attr "mode" "SF")])
1995
1996 (define_expand "<code><mode>3<mask_name><round_saeonly_name>"
1997   [(set (match_operand:VF 0 "register_operand")
1998         (smaxmin:VF
1999           (match_operand:VF 1 "<round_saeonly_nimm_predicate>")
2000           (match_operand:VF 2 "<round_saeonly_nimm_predicate>")))]
2001   "TARGET_SSE && <mask_mode512bit_condition> && <round_saeonly_mode512bit_condition>"
2002 {
2003   if (!flag_finite_math_only || flag_signed_zeros)
2004     {
2005       operands[1] = force_reg (<MODE>mode, operands[1]);
2006       emit_insn (gen_ieee_<maxmin_float><mode>3<mask_name><round_saeonly_name>
2007                  (operands[0], operands[1], operands[2]
2008                   <mask_operand_arg34>
2009                   <round_saeonly_mask_arg3>));
2010       DONE;
2011     }
2012   else
2013     ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);
2014 })
2015
2016 ;; These versions of the min/max patterns are intentionally ignorant of
2017 ;; their behavior wrt -0.0 and NaN (via the commutative operand mark).
2018 ;; Since both the tree-level MAX_EXPR and the rtl-level SMAX operator
2019 ;; are undefined in this condition, we're certain this is correct.
2020
2021 (define_insn "*<code><mode>3<mask_name><round_saeonly_name>"
2022   [(set (match_operand:VF 0 "register_operand" "=x,v")
2023         (smaxmin:VF
2024           (match_operand:VF 1 "<round_saeonly_nimm_predicate>" "%0,v")
2025           (match_operand:VF 2 "<round_saeonly_nimm_predicate>" "xBm,<round_saeonly_constraint>")))]
2026   "TARGET_SSE
2027    && !(MEM_P (operands[1]) && MEM_P (operands[2]))
2028    && <mask_mode512bit_condition> && <round_saeonly_mode512bit_condition>"
2029   "@
2030    <maxmin_float><ssemodesuffix>\t{%2, %0|%0, %2}
2031    v<maxmin_float><ssemodesuffix>\t{<round_saeonly_mask_op3>%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2<round_saeonly_mask_op3>}"
2032   [(set_attr "isa" "noavx,avx")
2033    (set_attr "type" "sseadd")
2034    (set_attr "btver2_sse_attr" "maxmin")
2035    (set_attr "prefix" "<mask_prefix3>")
2036    (set_attr "mode" "<MODE>")])
2037
2038 ;; These versions of the min/max patterns implement exactly the operations
2039 ;;   min = (op1 < op2 ? op1 : op2)
2040 ;;   max = (!(op1 < op2) ? op1 : op2)
2041 ;; Their operands are not commutative, and thus they may be used in the
2042 ;; presence of -0.0 and NaN.
2043
2044 (define_insn "ieee_<ieee_maxmin><mode>3<mask_name><round_saeonly_name>"
2045   [(set (match_operand:VF 0 "register_operand" "=x,v")
2046         (unspec:VF
2047           [(match_operand:VF 1 "register_operand" "0,v")
2048            (match_operand:VF 2 "<round_saeonly_nimm_predicate>" "xBm,<round_saeonly_constraint>")]
2049           IEEE_MAXMIN))]
2050   "TARGET_SSE
2051    && <mask_mode512bit_condition> && <round_saeonly_mode512bit_condition>"
2052   "@
2053    <ieee_maxmin><ssemodesuffix>\t{%2, %0|%0, %2}
2054    v<ieee_maxmin><ssemodesuffix>\t{<round_saeonly_mask_op3>%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2<round_saeonly_mask_op3>}"
2055   [(set_attr "isa" "noavx,avx")
2056    (set_attr "type" "sseadd")
2057    (set_attr "btver2_sse_attr" "maxmin")
2058    (set_attr "prefix" "<mask_prefix3>")
2059    (set_attr "mode" "<MODE>")])
2060
2061 (define_insn "<sse>_vm<code><mode>3<mask_scalar_name><round_saeonly_scalar_name>"
2062   [(set (match_operand:VF_128 0 "register_operand" "=x,v")
2063         (vec_merge:VF_128
2064           (smaxmin:VF_128
2065             (match_operand:VF_128 1 "register_operand" "0,v")
2066             (match_operand:VF_128 2 "vector_operand" "xBm,<round_saeonly_scalar_constraint>"))
2067          (match_dup 1)
2068          (const_int 1)))]
2069   "TARGET_SSE"
2070   "@
2071    <maxmin_float><ssescalarmodesuffix>\t{%2, %0|%0, %<iptr>2}
2072    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>}"
2073   [(set_attr "isa" "noavx,avx")
2074    (set_attr "type" "sse")
2075    (set_attr "btver2_sse_attr" "maxmin")
2076    (set_attr "prefix" "<round_saeonly_scalar_prefix>")
2077    (set_attr "mode" "<ssescalarmode>")])
2078
2079 (define_insn "avx_addsubv4df3"
2080   [(set (match_operand:V4DF 0 "register_operand" "=x")
2081         (vec_merge:V4DF
2082           (minus:V4DF
2083             (match_operand:V4DF 1 "register_operand" "x")
2084             (match_operand:V4DF 2 "nonimmediate_operand" "xm"))
2085           (plus:V4DF (match_dup 1) (match_dup 2))
2086           (const_int 5)))]
2087   "TARGET_AVX"
2088   "vaddsubpd\t{%2, %1, %0|%0, %1, %2}"
2089   [(set_attr "type" "sseadd")
2090    (set_attr "prefix" "vex")
2091    (set_attr "mode" "V4DF")])
2092
2093 (define_insn "sse3_addsubv2df3"
2094   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2095         (vec_merge:V2DF
2096           (minus:V2DF
2097             (match_operand:V2DF 1 "register_operand" "0,x")
2098             (match_operand:V2DF 2 "vector_operand" "xBm,xm"))
2099           (plus:V2DF (match_dup 1) (match_dup 2))
2100           (const_int 1)))]
2101   "TARGET_SSE3"
2102   "@
2103    addsubpd\t{%2, %0|%0, %2}
2104    vaddsubpd\t{%2, %1, %0|%0, %1, %2}"
2105   [(set_attr "isa" "noavx,avx")
2106    (set_attr "type" "sseadd")
2107    (set_attr "atom_unit" "complex")
2108    (set_attr "prefix" "orig,vex")
2109    (set_attr "mode" "V2DF")])
2110
2111 (define_insn "avx_addsubv8sf3"
2112   [(set (match_operand:V8SF 0 "register_operand" "=x")
2113         (vec_merge:V8SF
2114           (minus:V8SF
2115             (match_operand:V8SF 1 "register_operand" "x")
2116             (match_operand:V8SF 2 "nonimmediate_operand" "xm"))
2117           (plus:V8SF (match_dup 1) (match_dup 2))
2118           (const_int 85)))]
2119   "TARGET_AVX"
2120   "vaddsubps\t{%2, %1, %0|%0, %1, %2}"
2121   [(set_attr "type" "sseadd")
2122    (set_attr "prefix" "vex")
2123    (set_attr "mode" "V8SF")])
2124
2125 (define_insn "sse3_addsubv4sf3"
2126   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2127         (vec_merge:V4SF
2128           (minus:V4SF
2129             (match_operand:V4SF 1 "register_operand" "0,x")
2130             (match_operand:V4SF 2 "vector_operand" "xBm,xm"))
2131           (plus:V4SF (match_dup 1) (match_dup 2))
2132           (const_int 5)))]
2133   "TARGET_SSE3"
2134   "@
2135    addsubps\t{%2, %0|%0, %2}
2136    vaddsubps\t{%2, %1, %0|%0, %1, %2}"
2137   [(set_attr "isa" "noavx,avx")
2138    (set_attr "type" "sseadd")
2139    (set_attr "prefix" "orig,vex")
2140    (set_attr "prefix_rep" "1,*")
2141    (set_attr "mode" "V4SF")])
2142
2143 (define_split
2144   [(set (match_operand:VF_128_256 0 "register_operand")
2145         (match_operator:VF_128_256 6 "addsub_vm_operator"
2146           [(minus:VF_128_256
2147              (match_operand:VF_128_256 1 "register_operand")
2148              (match_operand:VF_128_256 2 "vector_operand"))
2149            (plus:VF_128_256
2150              (match_operand:VF_128_256 3 "vector_operand")
2151              (match_operand:VF_128_256 4 "vector_operand"))
2152            (match_operand 5 "const_int_operand")]))]
2153   "TARGET_SSE3
2154    && can_create_pseudo_p ()
2155    && ((rtx_equal_p (operands[1], operands[3])
2156         && rtx_equal_p (operands[2], operands[4]))
2157        || (rtx_equal_p (operands[1], operands[4])
2158            && rtx_equal_p (operands[2], operands[3])))"
2159   [(set (match_dup 0)
2160         (vec_merge:VF_128_256
2161           (minus:VF_128_256 (match_dup 1) (match_dup 2))
2162           (plus:VF_128_256 (match_dup 1) (match_dup 2))
2163           (match_dup 5)))])
2164
2165 (define_split
2166   [(set (match_operand:VF_128_256 0 "register_operand")
2167         (match_operator:VF_128_256 6 "addsub_vm_operator"
2168           [(plus:VF_128_256
2169              (match_operand:VF_128_256 1 "vector_operand")
2170              (match_operand:VF_128_256 2 "vector_operand"))
2171            (minus:VF_128_256
2172              (match_operand:VF_128_256 3 "register_operand")
2173              (match_operand:VF_128_256 4 "vector_operand"))
2174            (match_operand 5 "const_int_operand")]))]
2175   "TARGET_SSE3
2176    && can_create_pseudo_p ()
2177    && ((rtx_equal_p (operands[1], operands[3])
2178         && rtx_equal_p (operands[2], operands[4]))
2179        || (rtx_equal_p (operands[1], operands[4])
2180            && rtx_equal_p (operands[2], operands[3])))"
2181   [(set (match_dup 0)
2182         (vec_merge:VF_128_256
2183           (minus:VF_128_256 (match_dup 3) (match_dup 4))
2184           (plus:VF_128_256 (match_dup 3) (match_dup 4))
2185           (match_dup 5)))]
2186 {
2187   /* Negate mask bits to compensate for swapped PLUS and MINUS RTXes.  */
2188   operands[5]
2189     = GEN_INT (~INTVAL (operands[5])
2190                & ((HOST_WIDE_INT_1U << GET_MODE_NUNITS (<MODE>mode)) - 1));
2191 })
2192
2193 (define_split
2194   [(set (match_operand:VF_128_256 0 "register_operand")
2195         (match_operator:VF_128_256 7 "addsub_vs_operator"
2196           [(vec_concat:<ssedoublemode>
2197              (minus:VF_128_256
2198                (match_operand:VF_128_256 1 "register_operand")
2199                (match_operand:VF_128_256 2 "vector_operand"))
2200              (plus:VF_128_256
2201                (match_operand:VF_128_256 3 "vector_operand")
2202                (match_operand:VF_128_256 4 "vector_operand")))
2203            (match_parallel 5 "addsub_vs_parallel"
2204              [(match_operand 6 "const_int_operand")])]))]
2205   "TARGET_SSE3
2206    && can_create_pseudo_p ()
2207    && ((rtx_equal_p (operands[1], operands[3])
2208         && rtx_equal_p (operands[2], operands[4]))
2209        || (rtx_equal_p (operands[1], operands[4])
2210            && rtx_equal_p (operands[2], operands[3])))"
2211   [(set (match_dup 0)
2212         (vec_merge:VF_128_256
2213           (minus:VF_128_256 (match_dup 1) (match_dup 2))
2214           (plus:VF_128_256 (match_dup 1) (match_dup 2))
2215           (match_dup 5)))]
2216 {
2217   int i, nelt = XVECLEN (operands[5], 0);
2218   HOST_WIDE_INT ival = 0;
2219
2220   for (i = 0; i < nelt; i++)
2221     if (INTVAL (XVECEXP (operands[5], 0, i)) < GET_MODE_NUNITS (<MODE>mode))
2222       ival |= HOST_WIDE_INT_1 << i;
2223
2224   operands[5] = GEN_INT (ival);
2225 })
2226
2227 (define_split
2228   [(set (match_operand:VF_128_256 0 "register_operand")
2229         (match_operator:VF_128_256 7 "addsub_vs_operator"
2230           [(vec_concat:<ssedoublemode>
2231              (plus:VF_128_256
2232                (match_operand:VF_128_256 1 "vector_operand")
2233                (match_operand:VF_128_256 2 "vector_operand"))
2234              (minus:VF_128_256
2235                (match_operand:VF_128_256 3 "register_operand")
2236                (match_operand:VF_128_256 4 "vector_operand")))
2237            (match_parallel 5 "addsub_vs_parallel"
2238              [(match_operand 6 "const_int_operand")])]))]
2239   "TARGET_SSE3
2240    && can_create_pseudo_p ()
2241    && ((rtx_equal_p (operands[1], operands[3])
2242         && rtx_equal_p (operands[2], operands[4]))
2243        || (rtx_equal_p (operands[1], operands[4])
2244            && rtx_equal_p (operands[2], operands[3])))"
2245   [(set (match_dup 0)
2246         (vec_merge:VF_128_256
2247           (minus:VF_128_256 (match_dup 3) (match_dup 4))
2248           (plus:VF_128_256 (match_dup 3) (match_dup 4))
2249           (match_dup 5)))]
2250 {
2251   int i, nelt = XVECLEN (operands[5], 0);
2252   HOST_WIDE_INT ival = 0;
2253
2254   for (i = 0; i < nelt; i++)
2255     if (INTVAL (XVECEXP (operands[5], 0, i)) >= GET_MODE_NUNITS (<MODE>mode))
2256       ival |= HOST_WIDE_INT_1 << i;
2257
2258   operands[5] = GEN_INT (ival);
2259 })
2260
2261 (define_insn "avx_h<plusminus_insn>v4df3"
2262   [(set (match_operand:V4DF 0 "register_operand" "=x")
2263         (vec_concat:V4DF
2264           (vec_concat:V2DF
2265             (plusminus:DF
2266               (vec_select:DF
2267                 (match_operand:V4DF 1 "register_operand" "x")
2268                 (parallel [(const_int 0)]))
2269               (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
2270             (plusminus:DF
2271               (vec_select:DF
2272                 (match_operand:V4DF 2 "nonimmediate_operand" "xm")
2273                 (parallel [(const_int 0)]))
2274               (vec_select:DF (match_dup 2) (parallel [(const_int 1)]))))
2275           (vec_concat:V2DF
2276             (plusminus:DF
2277               (vec_select:DF (match_dup 1) (parallel [(const_int 2)]))
2278               (vec_select:DF (match_dup 1) (parallel [(const_int 3)])))
2279             (plusminus:DF
2280               (vec_select:DF (match_dup 2) (parallel [(const_int 2)]))
2281               (vec_select:DF (match_dup 2) (parallel [(const_int 3)]))))))]
2282   "TARGET_AVX"
2283   "vh<plusminus_mnemonic>pd\t{%2, %1, %0|%0, %1, %2}"
2284   [(set_attr "type" "sseadd")
2285    (set_attr "prefix" "vex")
2286    (set_attr "mode" "V4DF")])
2287
2288 (define_expand "sse3_haddv2df3"
2289   [(set (match_operand:V2DF 0 "register_operand")
2290         (vec_concat:V2DF
2291           (plus:DF
2292             (vec_select:DF
2293               (match_operand:V2DF 1 "register_operand")
2294               (parallel [(const_int 0)]))
2295             (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
2296           (plus:DF
2297             (vec_select:DF
2298               (match_operand:V2DF 2 "vector_operand")
2299               (parallel [(const_int 0)]))
2300             (vec_select:DF (match_dup 2) (parallel [(const_int 1)])))))]
2301   "TARGET_SSE3")
2302
2303 (define_insn "*sse3_haddv2df3"
2304   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2305         (vec_concat:V2DF
2306           (plus:DF
2307             (vec_select:DF
2308               (match_operand:V2DF 1 "register_operand" "0,x")
2309               (parallel [(match_operand:SI 3 "const_0_to_1_operand")]))
2310             (vec_select:DF
2311               (match_dup 1)
2312               (parallel [(match_operand:SI 4 "const_0_to_1_operand")])))
2313           (plus:DF
2314             (vec_select:DF
2315               (match_operand:V2DF 2 "vector_operand" "xBm,xm")
2316               (parallel [(match_operand:SI 5 "const_0_to_1_operand")]))
2317             (vec_select:DF
2318               (match_dup 2)
2319               (parallel [(match_operand:SI 6 "const_0_to_1_operand")])))))]
2320   "TARGET_SSE3
2321    && INTVAL (operands[3]) != INTVAL (operands[4])
2322    && INTVAL (operands[5]) != INTVAL (operands[6])"
2323   "@
2324    haddpd\t{%2, %0|%0, %2}
2325    vhaddpd\t{%2, %1, %0|%0, %1, %2}"
2326   [(set_attr "isa" "noavx,avx")
2327    (set_attr "type" "sseadd")
2328    (set_attr "prefix" "orig,vex")
2329    (set_attr "mode" "V2DF")])
2330
2331 (define_insn "sse3_hsubv2df3"
2332   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2333         (vec_concat:V2DF
2334           (minus:DF
2335             (vec_select:DF
2336               (match_operand:V2DF 1 "register_operand" "0,x")
2337               (parallel [(const_int 0)]))
2338             (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
2339           (minus:DF
2340             (vec_select:DF
2341               (match_operand:V2DF 2 "vector_operand" "xBm,xm")
2342               (parallel [(const_int 0)]))
2343             (vec_select:DF (match_dup 2) (parallel [(const_int 1)])))))]
2344   "TARGET_SSE3"
2345   "@
2346    hsubpd\t{%2, %0|%0, %2}
2347    vhsubpd\t{%2, %1, %0|%0, %1, %2}"
2348   [(set_attr "isa" "noavx,avx")
2349    (set_attr "type" "sseadd")
2350    (set_attr "prefix" "orig,vex")
2351    (set_attr "mode" "V2DF")])
2352
2353 (define_insn "*sse3_haddv2df3_low"
2354   [(set (match_operand:DF 0 "register_operand" "=x,x")
2355         (plus:DF
2356           (vec_select:DF
2357             (match_operand:V2DF 1 "register_operand" "0,x")
2358             (parallel [(match_operand:SI 2 "const_0_to_1_operand")]))
2359           (vec_select:DF
2360             (match_dup 1)
2361             (parallel [(match_operand:SI 3 "const_0_to_1_operand")]))))]
2362   "TARGET_SSE3
2363    && INTVAL (operands[2]) != INTVAL (operands[3])"
2364   "@
2365    haddpd\t{%0, %0|%0, %0}
2366    vhaddpd\t{%1, %1, %0|%0, %1, %1}"
2367   [(set_attr "isa" "noavx,avx")
2368    (set_attr "type" "sseadd1")
2369    (set_attr "prefix" "orig,vex")
2370    (set_attr "mode" "V2DF")])
2371
2372 (define_insn "*sse3_hsubv2df3_low"
2373   [(set (match_operand:DF 0 "register_operand" "=x,x")
2374         (minus:DF
2375           (vec_select:DF
2376             (match_operand:V2DF 1 "register_operand" "0,x")
2377             (parallel [(const_int 0)]))
2378           (vec_select:DF
2379             (match_dup 1)
2380             (parallel [(const_int 1)]))))]
2381   "TARGET_SSE3"
2382   "@
2383    hsubpd\t{%0, %0|%0, %0}
2384    vhsubpd\t{%1, %1, %0|%0, %1, %1}"
2385   [(set_attr "isa" "noavx,avx")
2386    (set_attr "type" "sseadd1")
2387    (set_attr "prefix" "orig,vex")
2388    (set_attr "mode" "V2DF")])
2389
2390 (define_insn "avx_h<plusminus_insn>v8sf3"
2391   [(set (match_operand:V8SF 0 "register_operand" "=x")
2392         (vec_concat:V8SF
2393           (vec_concat:V4SF
2394             (vec_concat:V2SF
2395               (plusminus:SF
2396                 (vec_select:SF
2397                   (match_operand:V8SF 1 "register_operand" "x")
2398                   (parallel [(const_int 0)]))
2399                 (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))
2400               (plusminus:SF
2401                 (vec_select:SF (match_dup 1) (parallel [(const_int 2)]))
2402                 (vec_select:SF (match_dup 1) (parallel [(const_int 3)]))))
2403             (vec_concat:V2SF
2404               (plusminus:SF
2405                 (vec_select:SF
2406                   (match_operand:V8SF 2 "nonimmediate_operand" "xm")
2407                   (parallel [(const_int 0)]))
2408                 (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))
2409               (plusminus:SF
2410                 (vec_select:SF (match_dup 2) (parallel [(const_int 2)]))
2411                 (vec_select:SF (match_dup 2) (parallel [(const_int 3)])))))
2412           (vec_concat:V4SF
2413             (vec_concat:V2SF
2414               (plusminus:SF
2415                 (vec_select:SF (match_dup 1) (parallel [(const_int 4)]))
2416                 (vec_select:SF (match_dup 1) (parallel [(const_int 5)])))
2417               (plusminus:SF
2418                 (vec_select:SF (match_dup 1) (parallel [(const_int 6)]))
2419                 (vec_select:SF (match_dup 1) (parallel [(const_int 7)]))))
2420             (vec_concat:V2SF
2421               (plusminus:SF
2422                 (vec_select:SF (match_dup 2) (parallel [(const_int 4)]))
2423                 (vec_select:SF (match_dup 2) (parallel [(const_int 5)])))
2424               (plusminus:SF
2425                 (vec_select:SF (match_dup 2) (parallel [(const_int 6)]))
2426                 (vec_select:SF (match_dup 2) (parallel [(const_int 7)])))))))]
2427   "TARGET_AVX"
2428   "vh<plusminus_mnemonic>ps\t{%2, %1, %0|%0, %1, %2}"
2429   [(set_attr "type" "sseadd")
2430    (set_attr "prefix" "vex")
2431    (set_attr "mode" "V8SF")])
2432
2433 (define_insn "sse3_h<plusminus_insn>v4sf3"
2434   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2435         (vec_concat:V4SF
2436           (vec_concat:V2SF
2437             (plusminus:SF
2438               (vec_select:SF
2439                 (match_operand:V4SF 1 "register_operand" "0,x")
2440                 (parallel [(const_int 0)]))
2441               (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))
2442             (plusminus:SF
2443               (vec_select:SF (match_dup 1) (parallel [(const_int 2)]))
2444               (vec_select:SF (match_dup 1) (parallel [(const_int 3)]))))
2445           (vec_concat:V2SF
2446             (plusminus:SF
2447               (vec_select:SF
2448                 (match_operand:V4SF 2 "vector_operand" "xBm,xm")
2449                 (parallel [(const_int 0)]))
2450               (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))
2451             (plusminus:SF
2452               (vec_select:SF (match_dup 2) (parallel [(const_int 2)]))
2453               (vec_select:SF (match_dup 2) (parallel [(const_int 3)]))))))]
2454   "TARGET_SSE3"
2455   "@
2456    h<plusminus_mnemonic>ps\t{%2, %0|%0, %2}
2457    vh<plusminus_mnemonic>ps\t{%2, %1, %0|%0, %1, %2}"
2458   [(set_attr "isa" "noavx,avx")
2459    (set_attr "type" "sseadd")
2460    (set_attr "atom_unit" "complex")
2461    (set_attr "prefix" "orig,vex")
2462    (set_attr "prefix_rep" "1,*")
2463    (set_attr "mode" "V4SF")])
2464
2465 (define_expand "reduc_plus_scal_v8df"
2466   [(match_operand:DF 0 "register_operand")
2467    (match_operand:V8DF 1 "register_operand")]
2468   "TARGET_AVX512F"
2469 {
2470   rtx tmp = gen_reg_rtx (V8DFmode);
2471   ix86_expand_reduc (gen_addv8df3, tmp, operands[1]);
2472   emit_insn (gen_vec_extractv8dfdf (operands[0], tmp, const0_rtx));
2473   DONE;
2474 })
2475
2476 (define_expand "reduc_plus_scal_v4df"
2477   [(match_operand:DF 0 "register_operand")
2478    (match_operand:V4DF 1 "register_operand")]
2479   "TARGET_AVX"
2480 {
2481   rtx tmp = gen_reg_rtx (V4DFmode);
2482   rtx tmp2 = gen_reg_rtx (V4DFmode);
2483   rtx vec_res = gen_reg_rtx (V4DFmode);
2484   emit_insn (gen_avx_haddv4df3 (tmp, operands[1], operands[1]));
2485   emit_insn (gen_avx_vperm2f128v4df3 (tmp2, tmp, tmp, GEN_INT (1)));
2486   emit_insn (gen_addv4df3 (vec_res, tmp, tmp2));
2487   emit_insn (gen_vec_extractv4dfdf (operands[0], vec_res, const0_rtx));
2488   DONE;
2489 })
2490
2491 (define_expand "reduc_plus_scal_v2df"
2492   [(match_operand:DF 0 "register_operand")
2493    (match_operand:V2DF 1 "register_operand")]
2494   "TARGET_SSE3"
2495 {
2496   rtx tmp = gen_reg_rtx (V2DFmode);
2497   emit_insn (gen_sse3_haddv2df3 (tmp, operands[1], operands[1]));
2498   emit_insn (gen_vec_extractv2dfdf (operands[0], tmp, const0_rtx));
2499   DONE;
2500 })
2501
2502 (define_expand "reduc_plus_scal_v16sf"
2503   [(match_operand:SF 0 "register_operand")
2504    (match_operand:V16SF 1 "register_operand")]
2505   "TARGET_AVX512F"
2506 {
2507   rtx tmp = gen_reg_rtx (V16SFmode);
2508   ix86_expand_reduc (gen_addv16sf3, tmp, operands[1]);
2509   emit_insn (gen_vec_extractv16sfsf (operands[0], tmp, const0_rtx));
2510   DONE;
2511 })
2512
2513 (define_expand "reduc_plus_scal_v8sf"
2514   [(match_operand:SF 0 "register_operand")
2515    (match_operand:V8SF 1 "register_operand")]
2516   "TARGET_AVX"
2517 {
2518   rtx tmp = gen_reg_rtx (V8SFmode);
2519   rtx tmp2 = gen_reg_rtx (V8SFmode);
2520   rtx vec_res = gen_reg_rtx (V8SFmode);
2521   emit_insn (gen_avx_haddv8sf3 (tmp, operands[1], operands[1]));
2522   emit_insn (gen_avx_haddv8sf3 (tmp2, tmp, tmp));
2523   emit_insn (gen_avx_vperm2f128v8sf3 (tmp, tmp2, tmp2, GEN_INT (1)));
2524   emit_insn (gen_addv8sf3 (vec_res, tmp, tmp2));
2525   emit_insn (gen_vec_extractv8sfsf (operands[0], vec_res, const0_rtx));
2526   DONE;
2527 })
2528
2529 (define_expand "reduc_plus_scal_v4sf"
2530   [(match_operand:SF 0 "register_operand")
2531    (match_operand:V4SF 1 "register_operand")]
2532   "TARGET_SSE"
2533 {
2534   rtx vec_res = gen_reg_rtx (V4SFmode);
2535   if (TARGET_SSE3)
2536     {
2537       rtx tmp = gen_reg_rtx (V4SFmode);
2538       emit_insn (gen_sse3_haddv4sf3 (tmp, operands[1], operands[1]));
2539       emit_insn (gen_sse3_haddv4sf3 (vec_res, tmp, tmp));
2540     }
2541   else
2542     ix86_expand_reduc (gen_addv4sf3, vec_res, operands[1]);
2543   emit_insn (gen_vec_extractv4sfsf (operands[0], vec_res, const0_rtx));
2544   DONE;
2545 })
2546
2547 ;; Modes handled by reduc_sm{in,ax}* patterns.
2548 (define_mode_iterator REDUC_SMINMAX_MODE
2549   [(V32QI "TARGET_AVX2") (V16HI "TARGET_AVX2")
2550    (V8SI "TARGET_AVX2") (V4DI "TARGET_AVX2")
2551    (V8SF "TARGET_AVX") (V4DF "TARGET_AVX")
2552    (V4SF "TARGET_SSE") (V64QI "TARGET_AVX512BW")
2553    (V32HI "TARGET_AVX512BW") (V16SI "TARGET_AVX512F")
2554    (V8DI "TARGET_AVX512F") (V16SF "TARGET_AVX512F")
2555    (V8DF "TARGET_AVX512F")])
2556
2557 (define_expand "reduc_<code>_scal_<mode>"
2558   [(smaxmin:REDUC_SMINMAX_MODE
2559      (match_operand:<ssescalarmode> 0 "register_operand")
2560      (match_operand:REDUC_SMINMAX_MODE 1 "register_operand"))]
2561   ""
2562 {
2563   rtx tmp = gen_reg_rtx (<MODE>mode);
2564   ix86_expand_reduc (gen_<code><mode>3, tmp, operands[1]);
2565   emit_insn (gen_vec_extract<mode><ssescalarmodelower> (operands[0], tmp,
2566                                                         const0_rtx));
2567   DONE;
2568 })
2569
2570 (define_expand "reduc_<code>_scal_<mode>"
2571   [(umaxmin:VI_AVX512BW
2572      (match_operand:<ssescalarmode> 0 "register_operand")
2573      (match_operand:VI_AVX512BW 1 "register_operand"))]
2574   "TARGET_AVX512F"
2575 {
2576   rtx tmp = gen_reg_rtx (<MODE>mode);
2577   ix86_expand_reduc (gen_<code><mode>3, tmp, operands[1]);
2578   emit_insn (gen_vec_extract<mode><ssescalarmodelower> (operands[0], tmp,
2579                                                         const0_rtx));
2580   DONE;
2581 })
2582
2583 (define_expand "reduc_<code>_scal_<mode>"
2584   [(umaxmin:VI_256
2585      (match_operand:<ssescalarmode> 0 "register_operand")
2586      (match_operand:VI_256 1 "register_operand"))]
2587   "TARGET_AVX2"
2588 {
2589   rtx tmp = gen_reg_rtx (<MODE>mode);
2590   ix86_expand_reduc (gen_<code><mode>3, tmp, operands[1]);
2591   emit_insn (gen_vec_extract<mode><ssescalarmodelower> (operands[0], tmp,
2592                                                         const0_rtx));
2593   DONE;
2594 })
2595
2596 (define_expand "reduc_umin_scal_v8hi"
2597   [(umin:V8HI
2598      (match_operand:HI 0 "register_operand")
2599      (match_operand:V8HI 1 "register_operand"))]
2600   "TARGET_SSE4_1"
2601 {
2602   rtx tmp = gen_reg_rtx (V8HImode);
2603   ix86_expand_reduc (gen_uminv8hi3, tmp, operands[1]);
2604   emit_insn (gen_vec_extractv8hihi (operands[0], tmp, const0_rtx));
2605   DONE;
2606 })
2607
2608 (define_insn "<mask_codefor>reducep<mode><mask_name>"
2609   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
2610         (unspec:VF_AVX512VL
2611           [(match_operand:VF_AVX512VL 1 "nonimmediate_operand" "vm")
2612            (match_operand:SI 2 "const_0_to_255_operand")]
2613           UNSPEC_REDUCE))]
2614   "TARGET_AVX512DQ"
2615   "vreduce<ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
2616   [(set_attr "type" "sse")
2617    (set_attr "prefix" "evex")
2618    (set_attr "mode" "<MODE>")])
2619
2620 (define_insn "reduces<mode><mask_scalar_name>"
2621   [(set (match_operand:VF_128 0 "register_operand" "=v")
2622         (vec_merge:VF_128
2623           (unspec:VF_128
2624             [(match_operand:VF_128 1 "register_operand" "v")
2625              (match_operand:VF_128 2 "nonimmediate_operand" "vm")
2626              (match_operand:SI 3 "const_0_to_255_operand")]
2627             UNSPEC_REDUCE)
2628           (match_dup 1)
2629           (const_int 1)))]
2630   "TARGET_AVX512DQ"
2631   "vreduce<ssescalarmodesuffix>\t{%3, %2, %1, %0<mask_scalar_operand4>|%0<mask_scalar_operand4>, %1, %<iptr>2, %3}"
2632   [(set_attr "type" "sse")
2633    (set_attr "prefix" "evex")
2634    (set_attr "mode" "<MODE>")])
2635
2636 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2637 ;;
2638 ;; Parallel floating point comparisons
2639 ;;
2640 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2641
2642 (define_insn "avx_cmp<mode>3"
2643   [(set (match_operand:VF_128_256 0 "register_operand" "=x")
2644         (unspec:VF_128_256
2645           [(match_operand:VF_128_256 1 "register_operand" "x")
2646            (match_operand:VF_128_256 2 "nonimmediate_operand" "xm")
2647            (match_operand:SI 3 "const_0_to_31_operand" "n")]
2648           UNSPEC_PCMP))]
2649   "TARGET_AVX"
2650   "vcmp<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2651   [(set_attr "type" "ssecmp")
2652    (set_attr "length_immediate" "1")
2653    (set_attr "prefix" "vex")
2654    (set_attr "mode" "<MODE>")])
2655
2656 (define_insn "avx_vmcmp<mode>3"
2657   [(set (match_operand:VF_128 0 "register_operand" "=x")
2658         (vec_merge:VF_128
2659           (unspec:VF_128
2660             [(match_operand:VF_128 1 "register_operand" "x")
2661              (match_operand:VF_128 2 "nonimmediate_operand" "xm")
2662              (match_operand:SI 3 "const_0_to_31_operand" "n")]
2663             UNSPEC_PCMP)
2664          (match_dup 1)
2665          (const_int 1)))]
2666   "TARGET_AVX"
2667   "vcmp<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %<iptr>2, %3}"
2668   [(set_attr "type" "ssecmp")
2669    (set_attr "length_immediate" "1")
2670    (set_attr "prefix" "vex")
2671    (set_attr "mode" "<ssescalarmode>")])
2672
2673 (define_insn "*<sse>_maskcmp<mode>3_comm"
2674   [(set (match_operand:VF_128_256 0 "register_operand" "=x,x")
2675         (match_operator:VF_128_256 3 "sse_comparison_operator"
2676           [(match_operand:VF_128_256 1 "register_operand" "%0,x")
2677            (match_operand:VF_128_256 2 "vector_operand" "xBm,xm")]))]
2678   "TARGET_SSE
2679    && GET_RTX_CLASS (GET_CODE (operands[3])) == RTX_COMM_COMPARE"
2680   "@
2681    cmp%D3<ssemodesuffix>\t{%2, %0|%0, %2}
2682    vcmp%D3<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
2683   [(set_attr "isa" "noavx,avx")
2684    (set_attr "type" "ssecmp")
2685    (set_attr "length_immediate" "1")
2686    (set_attr "prefix" "orig,vex")
2687    (set_attr "mode" "<MODE>")])
2688
2689 (define_insn "<sse>_maskcmp<mode>3"
2690   [(set (match_operand:VF_128_256 0 "register_operand" "=x,x")
2691         (match_operator:VF_128_256 3 "sse_comparison_operator"
2692           [(match_operand:VF_128_256 1 "register_operand" "0,x")
2693            (match_operand:VF_128_256 2 "vector_operand" "xBm,xm")]))]
2694   "TARGET_SSE"
2695   "@
2696    cmp%D3<ssemodesuffix>\t{%2, %0|%0, %2}
2697    vcmp%D3<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
2698   [(set_attr "isa" "noavx,avx")
2699    (set_attr "type" "ssecmp")
2700    (set_attr "length_immediate" "1")
2701    (set_attr "prefix" "orig,vex")
2702    (set_attr "mode" "<MODE>")])
2703
2704 (define_insn "<sse>_vmmaskcmp<mode>3"
2705   [(set (match_operand:VF_128 0 "register_operand" "=x,x")
2706         (vec_merge:VF_128
2707          (match_operator:VF_128 3 "sse_comparison_operator"
2708            [(match_operand:VF_128 1 "register_operand" "0,x")
2709             (match_operand:VF_128 2 "vector_operand" "xBm,xm")])
2710          (match_dup 1)
2711          (const_int 1)))]
2712   "TARGET_SSE"
2713   "@
2714    cmp%D3<ssescalarmodesuffix>\t{%2, %0|%0, %<iptr>2}
2715    vcmp%D3<ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %<iptr>2}"
2716   [(set_attr "isa" "noavx,avx")
2717    (set_attr "type" "ssecmp")
2718    (set_attr "length_immediate" "1,*")
2719    (set_attr "prefix" "orig,vex")
2720    (set_attr "mode" "<ssescalarmode>")])
2721
2722 (define_mode_attr cmp_imm_predicate
2723   [(V16SF "const_0_to_31_operand")  (V8DF "const_0_to_31_operand")
2724    (V16SI "const_0_to_7_operand")   (V8DI "const_0_to_7_operand")
2725    (V8SF "const_0_to_31_operand")   (V4DF "const_0_to_31_operand")
2726    (V8SI "const_0_to_7_operand")    (V4DI "const_0_to_7_operand")
2727    (V4SF "const_0_to_31_operand")   (V2DF "const_0_to_31_operand")
2728    (V4SI "const_0_to_7_operand")    (V2DI "const_0_to_7_operand")
2729    (V32HI "const_0_to_7_operand")   (V64QI "const_0_to_7_operand")
2730    (V16HI "const_0_to_7_operand")   (V32QI "const_0_to_7_operand")
2731    (V8HI "const_0_to_7_operand")    (V16QI "const_0_to_7_operand")])
2732
2733 (define_insn "<avx512>_cmp<mode>3<mask_scalar_merge_name><round_saeonly_name>"
2734   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
2735         (unspec:<avx512fmaskmode>
2736           [(match_operand:V48_AVX512VL 1 "register_operand" "v")
2737            (match_operand:V48_AVX512VL 2 "nonimmediate_operand" "<round_saeonly_constraint>")
2738            (match_operand:SI 3 "<cmp_imm_predicate>" "n")]
2739           UNSPEC_PCMP))]
2740   "TARGET_AVX512F && <round_saeonly_mode512bit_condition>"
2741   "v<sseintprefix>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}"
2742   [(set_attr "type" "ssecmp")
2743    (set_attr "length_immediate" "1")
2744    (set_attr "prefix" "evex")
2745    (set_attr "mode" "<sseinsnmode>")])
2746
2747 (define_insn "<avx512>_cmp<mode>3<mask_scalar_merge_name>"
2748   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
2749         (unspec:<avx512fmaskmode>
2750           [(match_operand:VI12_AVX512VL 1 "register_operand" "v")
2751            (match_operand:VI12_AVX512VL 2 "nonimmediate_operand" "vm")
2752            (match_operand:SI 3 "<cmp_imm_predicate>" "n")]
2753           UNSPEC_PCMP))]
2754   "TARGET_AVX512BW"
2755   "vpcmp<ssemodesuffix>\t{%3, %2, %1, %0<mask_scalar_merge_operand4>|%0<mask_scalar_merge_operand4>, %1, %2, %3}"
2756   [(set_attr "type" "ssecmp")
2757    (set_attr "length_immediate" "1")
2758    (set_attr "prefix" "evex")
2759    (set_attr "mode" "<sseinsnmode>")])
2760
2761 (define_insn "<avx512>_ucmp<mode>3<mask_scalar_merge_name>"
2762   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
2763         (unspec:<avx512fmaskmode>
2764           [(match_operand:VI12_AVX512VL 1 "register_operand" "v")
2765            (match_operand:VI12_AVX512VL 2 "nonimmediate_operand" "vm")
2766            (match_operand:SI 3 "const_0_to_7_operand" "n")]
2767           UNSPEC_UNSIGNED_PCMP))]
2768   "TARGET_AVX512BW"
2769   "vpcmpu<ssemodesuffix>\t{%3, %2, %1, %0<mask_scalar_merge_operand4>|%0<mask_scalar_merge_operand4>, %1, %2, %3}"
2770   [(set_attr "type" "ssecmp")
2771    (set_attr "length_immediate" "1")
2772    (set_attr "prefix" "evex")
2773    (set_attr "mode" "<sseinsnmode>")])
2774
2775 (define_insn "<avx512>_ucmp<mode>3<mask_scalar_merge_name>"
2776   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
2777         (unspec:<avx512fmaskmode>
2778           [(match_operand:VI48_AVX512VL 1 "register_operand" "v")
2779            (match_operand:VI48_AVX512VL 2 "nonimmediate_operand" "vm")
2780            (match_operand:SI 3 "const_0_to_7_operand" "n")]
2781           UNSPEC_UNSIGNED_PCMP))]
2782   "TARGET_AVX512F"
2783   "vpcmpu<ssemodesuffix>\t{%3, %2, %1, %0<mask_scalar_merge_operand4>|%0<mask_scalar_merge_operand4>, %1, %2, %3}"
2784   [(set_attr "type" "ssecmp")
2785    (set_attr "length_immediate" "1")
2786    (set_attr "prefix" "evex")
2787    (set_attr "mode" "<sseinsnmode>")])
2788
2789 (define_insn "avx512f_vmcmp<mode>3<round_saeonly_name>"
2790   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
2791         (and:<avx512fmaskmode>
2792           (unspec:<avx512fmaskmode>
2793             [(match_operand:VF_128 1 "register_operand" "v")
2794              (match_operand:VF_128 2 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")
2795              (match_operand:SI 3 "const_0_to_31_operand" "n")]
2796             UNSPEC_PCMP)
2797           (const_int 1)))]
2798   "TARGET_AVX512F"
2799   "vcmp<ssescalarmodesuffix>\t{%3, <round_saeonly_op4>%2, %1, %0|%0, %1, %<iptr>2<round_saeonly_op4>, %3}"
2800   [(set_attr "type" "ssecmp")
2801    (set_attr "length_immediate" "1")
2802    (set_attr "prefix" "evex")
2803    (set_attr "mode" "<ssescalarmode>")])
2804
2805 (define_insn "avx512f_vmcmp<mode>3_mask<round_saeonly_name>"
2806   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
2807         (and:<avx512fmaskmode>
2808           (unspec:<avx512fmaskmode>
2809             [(match_operand:VF_128 1 "register_operand" "v")
2810              (match_operand:VF_128 2 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")
2811              (match_operand:SI 3 "const_0_to_31_operand" "n")]
2812             UNSPEC_PCMP)
2813           (and:<avx512fmaskmode>
2814             (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")
2815             (const_int 1))))]
2816   "TARGET_AVX512F"
2817   "vcmp<ssescalarmodesuffix>\t{%3, <round_saeonly_op5>%2, %1, %0%{%4%}|%0%{%4%}, %1, %<iptr>2<round_saeonly_op5>, %3}"
2818   [(set_attr "type" "ssecmp")
2819    (set_attr "length_immediate" "1")
2820    (set_attr "prefix" "evex")
2821    (set_attr "mode" "<ssescalarmode>")])
2822
2823 (define_insn "avx512f_maskcmp<mode>3"
2824   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
2825         (match_operator:<avx512fmaskmode> 3 "sse_comparison_operator"
2826           [(match_operand:VF 1 "register_operand" "v")
2827            (match_operand:VF 2 "nonimmediate_operand" "vm")]))]
2828   "TARGET_AVX512F"
2829   "vcmp%D3<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
2830   [(set_attr "type" "ssecmp")
2831    (set_attr "length_immediate" "1")
2832    (set_attr "prefix" "evex")
2833    (set_attr "mode" "<sseinsnmode>")])
2834
2835 (define_insn "<sse>_<unord>comi<round_saeonly_name>"
2836   [(set (reg:CCFP FLAGS_REG)
2837         (compare:CCFP
2838           (vec_select:MODEF
2839             (match_operand:<ssevecmode> 0 "register_operand" "v")
2840             (parallel [(const_int 0)]))
2841           (vec_select:MODEF
2842             (match_operand:<ssevecmode> 1 "<round_saeonly_nimm_scalar_predicate>" "<round_saeonly_constraint>")
2843             (parallel [(const_int 0)]))))]
2844   "SSE_FLOAT_MODE_P (<MODE>mode)"
2845   "%v<unord>comi<ssemodesuffix>\t{<round_saeonly_op2>%1, %0|%0, %<iptr>1<round_saeonly_op2>}"
2846   [(set_attr "type" "ssecomi")
2847    (set_attr "prefix" "maybe_vex")
2848    (set_attr "prefix_rep" "0")
2849    (set (attr "prefix_data16")
2850         (if_then_else (eq_attr "mode" "DF")
2851                       (const_string "1")
2852                       (const_string "0")))
2853    (set_attr "mode" "<MODE>")])
2854
2855 (define_expand "vec_cmp<mode><avx512fmaskmodelower>"
2856   [(set (match_operand:<avx512fmaskmode> 0 "register_operand")
2857         (match_operator:<avx512fmaskmode> 1 ""
2858           [(match_operand:V48_AVX512VL 2 "register_operand")
2859            (match_operand:V48_AVX512VL 3 "nonimmediate_operand")]))]
2860   "TARGET_AVX512F"
2861 {
2862   bool ok = ix86_expand_mask_vec_cmp (operands);
2863   gcc_assert (ok);
2864   DONE;
2865 })
2866
2867 (define_expand "vec_cmp<mode><avx512fmaskmodelower>"
2868   [(set (match_operand:<avx512fmaskmode> 0 "register_operand")
2869         (match_operator:<avx512fmaskmode> 1 ""
2870           [(match_operand:VI12_AVX512VL 2 "register_operand")
2871            (match_operand:VI12_AVX512VL 3 "nonimmediate_operand")]))]
2872   "TARGET_AVX512BW"
2873 {
2874   bool ok = ix86_expand_mask_vec_cmp (operands);
2875   gcc_assert (ok);
2876   DONE;
2877 })
2878
2879 (define_expand "vec_cmp<mode><sseintvecmodelower>"
2880   [(set (match_operand:<sseintvecmode> 0 "register_operand")
2881         (match_operator:<sseintvecmode> 1 ""
2882           [(match_operand:VI_256 2 "register_operand")
2883            (match_operand:VI_256 3 "nonimmediate_operand")]))]
2884   "TARGET_AVX2"
2885 {
2886   bool ok = ix86_expand_int_vec_cmp (operands);
2887   gcc_assert (ok);
2888   DONE;
2889 })
2890
2891 (define_expand "vec_cmp<mode><sseintvecmodelower>"
2892   [(set (match_operand:<sseintvecmode> 0 "register_operand")
2893         (match_operator:<sseintvecmode> 1 ""
2894           [(match_operand:VI124_128 2 "register_operand")
2895            (match_operand:VI124_128 3 "vector_operand")]))]
2896   "TARGET_SSE2"
2897 {
2898   bool ok = ix86_expand_int_vec_cmp (operands);
2899   gcc_assert (ok);
2900   DONE;
2901 })
2902
2903 (define_expand "vec_cmpv2div2di"
2904   [(set (match_operand:V2DI 0 "register_operand")
2905         (match_operator:V2DI 1 ""
2906           [(match_operand:V2DI 2 "register_operand")
2907            (match_operand:V2DI 3 "vector_operand")]))]
2908   "TARGET_SSE4_2"
2909 {
2910   bool ok = ix86_expand_int_vec_cmp (operands);
2911   gcc_assert (ok);
2912   DONE;
2913 })
2914
2915 (define_expand "vec_cmp<mode><sseintvecmodelower>"
2916   [(set (match_operand:<sseintvecmode> 0 "register_operand")
2917         (match_operator:<sseintvecmode> 1 ""
2918           [(match_operand:VF_256 2 "register_operand")
2919            (match_operand:VF_256 3 "nonimmediate_operand")]))]
2920   "TARGET_AVX"
2921 {
2922   bool ok = ix86_expand_fp_vec_cmp (operands);
2923   gcc_assert (ok);
2924   DONE;
2925 })
2926
2927 (define_expand "vec_cmp<mode><sseintvecmodelower>"
2928   [(set (match_operand:<sseintvecmode> 0 "register_operand")
2929         (match_operator:<sseintvecmode> 1 ""
2930           [(match_operand:VF_128 2 "register_operand")
2931            (match_operand:VF_128 3 "vector_operand")]))]
2932   "TARGET_SSE"
2933 {
2934   bool ok = ix86_expand_fp_vec_cmp (operands);
2935   gcc_assert (ok);
2936   DONE;
2937 })
2938
2939 (define_expand "vec_cmpu<mode><avx512fmaskmodelower>"
2940   [(set (match_operand:<avx512fmaskmode> 0 "register_operand")
2941         (match_operator:<avx512fmaskmode> 1 ""
2942           [(match_operand:VI48_AVX512VL 2 "register_operand")
2943            (match_operand:VI48_AVX512VL 3 "nonimmediate_operand")]))]
2944   "TARGET_AVX512F"
2945 {
2946   bool ok = ix86_expand_mask_vec_cmp (operands);
2947   gcc_assert (ok);
2948   DONE;
2949 })
2950
2951 (define_expand "vec_cmpu<mode><avx512fmaskmodelower>"
2952   [(set (match_operand:<avx512fmaskmode> 0 "register_operand")
2953         (match_operator:<avx512fmaskmode> 1 ""
2954           [(match_operand:VI12_AVX512VL 2 "register_operand")
2955            (match_operand:VI12_AVX512VL 3 "nonimmediate_operand")]))]
2956   "TARGET_AVX512BW"
2957 {
2958   bool ok = ix86_expand_mask_vec_cmp (operands);
2959   gcc_assert (ok);
2960   DONE;
2961 })
2962
2963 (define_expand "vec_cmpu<mode><sseintvecmodelower>"
2964   [(set (match_operand:<sseintvecmode> 0 "register_operand")
2965         (match_operator:<sseintvecmode> 1 ""
2966           [(match_operand:VI_256 2 "register_operand")
2967            (match_operand:VI_256 3 "nonimmediate_operand")]))]
2968   "TARGET_AVX2"
2969 {
2970   bool ok = ix86_expand_int_vec_cmp (operands);
2971   gcc_assert (ok);
2972   DONE;
2973 })
2974
2975 (define_expand "vec_cmpu<mode><sseintvecmodelower>"
2976   [(set (match_operand:<sseintvecmode> 0 "register_operand")
2977         (match_operator:<sseintvecmode> 1 ""
2978           [(match_operand:VI124_128 2 "register_operand")
2979            (match_operand:VI124_128 3 "vector_operand")]))]
2980   "TARGET_SSE2"
2981 {
2982   bool ok = ix86_expand_int_vec_cmp (operands);
2983   gcc_assert (ok);
2984   DONE;
2985 })
2986
2987 (define_expand "vec_cmpuv2div2di"
2988   [(set (match_operand:V2DI 0 "register_operand")
2989         (match_operator:V2DI 1 ""
2990           [(match_operand:V2DI 2 "register_operand")
2991            (match_operand:V2DI 3 "vector_operand")]))]
2992   "TARGET_SSE4_2"
2993 {
2994   bool ok = ix86_expand_int_vec_cmp (operands);
2995   gcc_assert (ok);
2996   DONE;
2997 })
2998
2999 (define_expand "vec_cmpeqv2div2di"
3000   [(set (match_operand:V2DI 0 "register_operand")
3001         (match_operator:V2DI 1 ""
3002           [(match_operand:V2DI 2 "register_operand")
3003            (match_operand:V2DI 3 "vector_operand")]))]
3004   "TARGET_SSE4_1"
3005 {
3006   bool ok = ix86_expand_int_vec_cmp (operands);
3007   gcc_assert (ok);
3008   DONE;
3009 })
3010
3011 (define_expand "vcond<V_512:mode><VF_512:mode>"
3012   [(set (match_operand:V_512 0 "register_operand")
3013         (if_then_else:V_512
3014           (match_operator 3 ""
3015             [(match_operand:VF_512 4 "nonimmediate_operand")
3016              (match_operand:VF_512 5 "nonimmediate_operand")])
3017           (match_operand:V_512 1 "general_operand")
3018           (match_operand:V_512 2 "general_operand")))]
3019   "TARGET_AVX512F
3020    && (GET_MODE_NUNITS (<V_512:MODE>mode)
3021        == GET_MODE_NUNITS (<VF_512:MODE>mode))"
3022 {
3023   bool ok = ix86_expand_fp_vcond (operands);
3024   gcc_assert (ok);
3025   DONE;
3026 })
3027
3028 (define_expand "vcond<V_256:mode><VF_256:mode>"
3029   [(set (match_operand:V_256 0 "register_operand")
3030         (if_then_else:V_256
3031           (match_operator 3 ""
3032             [(match_operand:VF_256 4 "nonimmediate_operand")
3033              (match_operand:VF_256 5 "nonimmediate_operand")])
3034           (match_operand:V_256 1 "general_operand")
3035           (match_operand:V_256 2 "general_operand")))]
3036   "TARGET_AVX
3037    && (GET_MODE_NUNITS (<V_256:MODE>mode)
3038        == GET_MODE_NUNITS (<VF_256:MODE>mode))"
3039 {
3040   bool ok = ix86_expand_fp_vcond (operands);
3041   gcc_assert (ok);
3042   DONE;
3043 })
3044
3045 (define_expand "vcond<V_128:mode><VF_128:mode>"
3046   [(set (match_operand:V_128 0 "register_operand")
3047         (if_then_else:V_128
3048           (match_operator 3 ""
3049             [(match_operand:VF_128 4 "vector_operand")
3050              (match_operand:VF_128 5 "vector_operand")])
3051           (match_operand:V_128 1 "general_operand")
3052           (match_operand:V_128 2 "general_operand")))]
3053   "TARGET_SSE
3054    && (GET_MODE_NUNITS (<V_128:MODE>mode)
3055        == GET_MODE_NUNITS (<VF_128:MODE>mode))"
3056 {
3057   bool ok = ix86_expand_fp_vcond (operands);
3058   gcc_assert (ok);
3059   DONE;
3060 })
3061
3062 (define_expand "vcond_mask_<mode><avx512fmaskmodelower>"
3063   [(set (match_operand:V48_AVX512VL 0 "register_operand")
3064         (vec_merge:V48_AVX512VL
3065           (match_operand:V48_AVX512VL 1 "nonimmediate_operand")
3066           (match_operand:V48_AVX512VL 2 "vector_move_operand")
3067           (match_operand:<avx512fmaskmode> 3 "register_operand")))]
3068   "TARGET_AVX512F")
3069
3070 (define_expand "vcond_mask_<mode><avx512fmaskmodelower>"
3071   [(set (match_operand:VI12_AVX512VL 0 "register_operand")
3072         (vec_merge:VI12_AVX512VL
3073           (match_operand:VI12_AVX512VL 1 "nonimmediate_operand")
3074           (match_operand:VI12_AVX512VL 2 "vector_move_operand")
3075           (match_operand:<avx512fmaskmode> 3 "register_operand")))]
3076   "TARGET_AVX512BW")
3077
3078 (define_expand "vcond_mask_<mode><sseintvecmodelower>"
3079   [(set (match_operand:VI_256 0 "register_operand")
3080         (vec_merge:VI_256
3081           (match_operand:VI_256 1 "nonimmediate_operand")
3082           (match_operand:VI_256 2 "vector_move_operand")
3083           (match_operand:<sseintvecmode> 3 "register_operand")))]
3084   "TARGET_AVX2"
3085 {
3086   ix86_expand_sse_movcc (operands[0], operands[3],
3087                          operands[1], operands[2]);
3088   DONE;
3089 })
3090
3091 (define_expand "vcond_mask_<mode><sseintvecmodelower>"
3092   [(set (match_operand:VI124_128 0 "register_operand")
3093         (vec_merge:VI124_128
3094           (match_operand:VI124_128 1 "vector_operand")
3095           (match_operand:VI124_128 2 "vector_move_operand")
3096           (match_operand:<sseintvecmode> 3 "register_operand")))]
3097   "TARGET_SSE2"
3098 {
3099   ix86_expand_sse_movcc (operands[0], operands[3],
3100                          operands[1], operands[2]);
3101   DONE;
3102 })
3103
3104 (define_expand "vcond_mask_v2div2di"
3105   [(set (match_operand:V2DI 0 "register_operand")
3106         (vec_merge:V2DI
3107           (match_operand:V2DI 1 "vector_operand")
3108           (match_operand:V2DI 2 "vector_move_operand")
3109           (match_operand:V2DI 3 "register_operand")))]
3110   "TARGET_SSE4_2"
3111 {
3112   ix86_expand_sse_movcc (operands[0], operands[3],
3113                          operands[1], operands[2]);
3114   DONE;
3115 })
3116
3117 (define_expand "vcond_mask_<mode><sseintvecmodelower>"
3118   [(set (match_operand:VF_256 0 "register_operand")
3119         (vec_merge:VF_256
3120           (match_operand:VF_256 1 "nonimmediate_operand")
3121           (match_operand:VF_256 2 "vector_move_operand")
3122           (match_operand:<sseintvecmode> 3 "register_operand")))]
3123   "TARGET_AVX"
3124 {
3125   ix86_expand_sse_movcc (operands[0], operands[3],
3126                          operands[1], operands[2]);
3127   DONE;
3128 })
3129
3130 (define_expand "vcond_mask_<mode><sseintvecmodelower>"
3131   [(set (match_operand:VF_128 0 "register_operand")
3132         (vec_merge:VF_128
3133           (match_operand:VF_128 1 "vector_operand")
3134           (match_operand:VF_128 2 "vector_move_operand")
3135           (match_operand:<sseintvecmode> 3 "register_operand")))]
3136   "TARGET_SSE"
3137 {
3138   ix86_expand_sse_movcc (operands[0], operands[3],
3139                          operands[1], operands[2]);
3140   DONE;
3141 })
3142
3143 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3144 ;;
3145 ;; Parallel floating point logical operations
3146 ;;
3147 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3148
3149 (define_insn "<sse>_andnot<mode>3<mask_name>"
3150   [(set (match_operand:VF_128_256 0 "register_operand" "=x,x,v,v")
3151         (and:VF_128_256
3152           (not:VF_128_256
3153             (match_operand:VF_128_256 1 "register_operand" "0,x,v,v"))
3154           (match_operand:VF_128_256 2 "vector_operand" "xBm,xm,vm,vm")))]
3155   "TARGET_SSE && <mask_avx512vl_condition>"
3156 {
3157   static char buf[128];
3158   const char *ops;
3159   const char *suffix;
3160
3161   switch (which_alternative)
3162     {
3163     case 0:
3164       ops = "andn%s\t{%%2, %%0|%%0, %%2}";
3165       break;
3166     case 1:
3167     case 2:
3168     case 3:
3169       ops = "vandn%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}";
3170       break;
3171     default:
3172       gcc_unreachable ();
3173     }
3174
3175   switch (get_attr_mode (insn))
3176     {
3177     case MODE_V8SF:
3178     case MODE_V4SF:
3179       suffix = "ps";
3180       break;
3181     case MODE_OI:
3182     case MODE_TI:
3183       /* There is no vandnp[sd] in avx512f.  Use vpandn[qd].  */
3184       suffix = GET_MODE_INNER (<MODE>mode) == DFmode ? "q" : "d";
3185       ops = "vpandn%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}";
3186       break;
3187     default:
3188       suffix = "<ssemodesuffix>";
3189     }
3190
3191   snprintf (buf, sizeof (buf), ops, suffix);
3192   return buf;
3193 }
3194   [(set_attr "isa" "noavx,avx,avx512dq,avx512f")
3195    (set_attr "type" "sselog")
3196    (set_attr "prefix" "orig,maybe_vex,evex,evex")
3197    (set (attr "mode")
3198         (cond [(and (match_test "<mask_applied>")
3199                     (and (eq_attr "alternative" "1")
3200                          (match_test "!TARGET_AVX512DQ")))
3201                  (const_string "<sseintvecmode2>")
3202                (eq_attr "alternative" "3")
3203                  (const_string "<sseintvecmode2>")
3204                (and (match_test "<MODE_SIZE> == 16")
3205                     (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL"))
3206                  (const_string "<ssePSmode>")
3207                (match_test "TARGET_AVX")
3208                  (const_string "<MODE>")
3209                (match_test "optimize_function_for_size_p (cfun)")
3210                  (const_string "V4SF")
3211                ]
3212                (const_string "<MODE>")))])
3213
3214
3215 (define_insn "<sse>_andnot<mode>3<mask_name>"
3216   [(set (match_operand:VF_512 0 "register_operand" "=v")
3217         (and:VF_512
3218           (not:VF_512
3219             (match_operand:VF_512 1 "register_operand" "v"))
3220           (match_operand:VF_512 2 "nonimmediate_operand" "vm")))]
3221   "TARGET_AVX512F"
3222 {
3223   static char buf[128];
3224   const char *ops;
3225   const char *suffix;
3226
3227   suffix = "<ssemodesuffix>";
3228   ops = "";
3229
3230   /* There is no vandnp[sd] in avx512f.  Use vpandn[qd].  */
3231   if (!TARGET_AVX512DQ)
3232     {
3233       suffix = GET_MODE_INNER (<MODE>mode) == DFmode ? "q" : "d";
3234       ops = "p";
3235     }
3236
3237   snprintf (buf, sizeof (buf),
3238             "v%sandn%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}",
3239             ops, suffix);
3240   return buf;
3241 }
3242   [(set_attr "type" "sselog")
3243    (set_attr "prefix" "evex")
3244    (set (attr "mode")
3245         (if_then_else (match_test "TARGET_AVX512DQ")
3246                       (const_string "<sseinsnmode>")
3247                       (const_string "XI")))])
3248
3249 (define_expand "<code><mode>3<mask_name>"
3250   [(set (match_operand:VF_128_256 0 "register_operand")
3251        (any_logic:VF_128_256
3252          (match_operand:VF_128_256 1 "vector_operand")
3253          (match_operand:VF_128_256 2 "vector_operand")))]
3254   "TARGET_SSE && <mask_avx512vl_condition>"
3255   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
3256
3257 (define_expand "<code><mode>3<mask_name>"
3258   [(set (match_operand:VF_512 0 "register_operand")
3259        (any_logic:VF_512
3260          (match_operand:VF_512 1 "nonimmediate_operand")
3261          (match_operand:VF_512 2 "nonimmediate_operand")))]
3262   "TARGET_AVX512F"
3263   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
3264
3265 (define_insn "*<code><mode>3<mask_name>"
3266   [(set (match_operand:VF_128_256 0 "register_operand" "=x,x,v,v")
3267         (any_logic:VF_128_256
3268           (match_operand:VF_128_256 1 "vector_operand" "%0,x,v,v")
3269           (match_operand:VF_128_256 2 "vector_operand" "xBm,xm,vm,vm")))]
3270   "TARGET_SSE && <mask_avx512vl_condition>
3271    && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
3272 {
3273   static char buf[128];
3274   const char *ops;
3275   const char *suffix;
3276
3277   switch (which_alternative)
3278     {
3279     case 0:
3280       ops = "<logic>%s\t{%%2, %%0|%%0, %%2}";
3281       break;
3282     case 1:
3283     case 2:
3284     case 3:
3285       ops = "v<logic>%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}";
3286       break;
3287     default:
3288       gcc_unreachable ();
3289     }
3290
3291   switch (get_attr_mode (insn))
3292     {
3293     case MODE_V8SF:
3294     case MODE_V4SF:
3295       suffix = "ps";
3296       break;
3297     case MODE_OI:
3298     case MODE_TI:
3299       /* There is no v<logic>p[sd] in avx512f.  Use vp<logic>[qd].  */
3300       suffix = GET_MODE_INNER (<MODE>mode) == DFmode ? "q" : "d";
3301       ops = "vp<logic>%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}";
3302       break;
3303     default:
3304       suffix = "<ssemodesuffix>";
3305     }
3306
3307   snprintf (buf, sizeof (buf), ops, suffix);
3308   return buf;
3309 }
3310   [(set_attr "isa" "noavx,avx,avx512dq,avx512f")
3311    (set_attr "type" "sselog")
3312    (set_attr "prefix" "orig,maybe_evex,evex,evex")
3313    (set (attr "mode")
3314         (cond [(and (match_test "<mask_applied>")
3315                     (and (eq_attr "alternative" "1")
3316                          (match_test "!TARGET_AVX512DQ")))
3317                  (const_string "<sseintvecmode2>")
3318                (eq_attr "alternative" "3")
3319                  (const_string "<sseintvecmode2>")
3320                (and (match_test "<MODE_SIZE> == 16")
3321                     (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL"))
3322                  (const_string "<ssePSmode>")
3323                (match_test "TARGET_AVX")
3324                  (const_string "<MODE>")
3325                (match_test "optimize_function_for_size_p (cfun)")
3326                  (const_string "V4SF")
3327                ]
3328                (const_string "<MODE>")))])
3329
3330 (define_insn "*<code><mode>3<mask_name>"
3331   [(set (match_operand:VF_512 0 "register_operand" "=v")
3332         (any_logic:VF_512
3333           (match_operand:VF_512 1 "nonimmediate_operand" "%v")
3334           (match_operand:VF_512 2 "nonimmediate_operand" "vm")))]
3335   "TARGET_AVX512F && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
3336 {
3337   static char buf[128];
3338   const char *ops;
3339   const char *suffix;
3340
3341   suffix = "<ssemodesuffix>";
3342   ops = "";
3343
3344   /* There is no v<logic>p[sd] in avx512f.  Use vp<logic>[dq].  */
3345   if (!TARGET_AVX512DQ)
3346     {
3347       suffix = GET_MODE_INNER (<MODE>mode) == DFmode ? "q" : "d";
3348       ops = "p";
3349     }
3350
3351   snprintf (buf, sizeof (buf),
3352            "v%s<logic>%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}",
3353            ops, suffix);
3354   return buf;
3355 }
3356   [(set_attr "type" "sselog")
3357    (set_attr "prefix" "evex")
3358    (set (attr "mode")
3359         (if_then_else (match_test "TARGET_AVX512DQ")
3360                       (const_string "<sseinsnmode>")
3361                       (const_string "XI")))])
3362
3363 (define_expand "copysign<mode>3"
3364   [(set (match_dup 4)
3365         (and:VF
3366           (not:VF (match_dup 3))
3367           (match_operand:VF 1 "vector_operand")))
3368    (set (match_dup 5)
3369         (and:VF (match_dup 3)
3370                 (match_operand:VF 2 "vector_operand")))
3371    (set (match_operand:VF 0 "register_operand")
3372         (ior:VF (match_dup 4) (match_dup 5)))]
3373   "TARGET_SSE"
3374 {
3375   operands[3] = ix86_build_signbit_mask (<MODE>mode, 1, 0);
3376
3377   operands[4] = gen_reg_rtx (<MODE>mode);
3378   operands[5] = gen_reg_rtx (<MODE>mode);
3379 })
3380
3381 ;; Also define scalar versions.  These are used for abs, neg, and
3382 ;; conditional move.  Using subregs into vector modes causes register
3383 ;; allocation lossage.  These patterns do not allow memory operands
3384 ;; because the native instructions read the full 128-bits.
3385
3386 (define_insn "*andnot<mode>3"
3387   [(set (match_operand:MODEF 0 "register_operand" "=x,x,v,v")
3388         (and:MODEF
3389           (not:MODEF
3390             (match_operand:MODEF 1 "register_operand" "0,x,v,v"))
3391             (match_operand:MODEF 2 "register_operand" "x,x,v,v")))]
3392   "SSE_FLOAT_MODE_P (<MODE>mode)"
3393 {
3394   static char buf[128];
3395   const char *ops;
3396   const char *suffix
3397     = (get_attr_mode (insn) == MODE_V4SF) ? "ps" : "<ssevecmodesuffix>";
3398
3399   switch (which_alternative)
3400     {
3401     case 0:
3402       ops = "andn%s\t{%%2, %%0|%%0, %%2}";
3403       break;
3404     case 1:
3405       ops = "vandn%s\t{%%2, %%1, %%0|%%0, %%1, %%2}";
3406       break;
3407     case 2:
3408       if (TARGET_AVX512DQ)
3409         ops = "vandn%s\t{%%2, %%1, %%0|%%0, %%1, %%2}";
3410       else
3411         {
3412           suffix = <MODE>mode == DFmode ? "q" : "d";
3413           ops = "vpandn%s\t{%%2, %%1, %%0|%%0, %%1, %%2}";
3414         }
3415       break;
3416     case 3:
3417       if (TARGET_AVX512DQ)
3418         ops = "vandn%s\t{%%g2, %%g1, %%g0|%%g0, %%g1, %%g2}";
3419       else
3420         {
3421           suffix = <MODE>mode == DFmode ? "q" : "d";
3422           ops = "vpandn%s\t{%%g2, %%g1, %%g0|%%g0, %%g1, %%g2}";
3423         }
3424       break;
3425     default:
3426       gcc_unreachable ();
3427     }
3428
3429   snprintf (buf, sizeof (buf), ops, suffix);
3430   return buf;
3431 }
3432   [(set_attr "isa" "noavx,avx,avx512vl,avx512f")
3433    (set_attr "type" "sselog")
3434    (set_attr "prefix" "orig,vex,evex,evex")
3435    (set (attr "mode")
3436         (cond [(eq_attr "alternative" "2")
3437                  (if_then_else (match_test "TARGET_AVX512DQ")
3438                                (const_string "<ssevecmode>")
3439                                (const_string "TI"))
3440                (eq_attr "alternative" "3")
3441                  (if_then_else (match_test "TARGET_AVX512DQ")
3442                                (const_string "<avx512fvecmode>")
3443                                (const_string "XI"))
3444                (and (match_test "<MODE_SIZE> == 16")
3445                     (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL"))
3446                  (const_string "V4SF")
3447                (match_test "TARGET_AVX")
3448                  (const_string "<ssevecmode>")
3449                (match_test "optimize_function_for_size_p (cfun)")
3450                  (const_string "V4SF")
3451                ]
3452                (const_string "<ssevecmode>")))])
3453
3454 (define_insn "*andnottf3"
3455   [(set (match_operand:TF 0 "register_operand" "=x,x,v,v")
3456         (and:TF
3457           (not:TF (match_operand:TF 1 "register_operand" "0,x,v,v"))
3458           (match_operand:TF 2 "vector_operand" "xBm,xm,vm,v")))]
3459   "TARGET_SSE"
3460 {
3461   static char buf[128];
3462   const char *ops;
3463   const char *tmp
3464     = (which_alternative >= 2 ? "pandnq"
3465        : get_attr_mode (insn) == MODE_V4SF ? "andnps" : "pandn");
3466
3467   switch (which_alternative)
3468     {
3469     case 0:
3470       ops = "%s\t{%%2, %%0|%%0, %%2}";
3471       break;
3472     case 1:
3473     case 2:
3474       ops = "v%s\t{%%2, %%1, %%0|%%0, %%1, %%2}";
3475       break;
3476     case 3:
3477       ops = "v%s\t{%%g2, %%g1, %%g0|%%g0, %%g1, %%g2}";
3478       break;
3479     default:
3480       gcc_unreachable ();
3481     }
3482
3483   snprintf (buf, sizeof (buf), ops, tmp);
3484   return buf;
3485 }
3486   [(set_attr "isa" "noavx,avx,avx512vl,avx512f")
3487    (set_attr "type" "sselog")
3488    (set (attr "prefix_data16")
3489      (if_then_else
3490        (and (eq_attr "alternative" "0")
3491             (eq_attr "mode" "TI"))
3492        (const_string "1")
3493        (const_string "*")))
3494    (set_attr "prefix" "orig,vex,evex,evex")
3495    (set (attr "mode")
3496         (cond [(eq_attr "alternative" "2")
3497                  (const_string "TI")
3498                (eq_attr "alternative" "3")
3499                  (const_string "XI")
3500                (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL")
3501                  (const_string "V4SF")
3502                (match_test "TARGET_AVX")
3503                  (const_string "TI")
3504                (ior (not (match_test "TARGET_SSE2"))
3505                     (match_test "optimize_function_for_size_p (cfun)"))
3506                  (const_string "V4SF")
3507                ]
3508                (const_string "TI")))])
3509
3510 (define_insn "*<code><mode>3"
3511   [(set (match_operand:MODEF 0 "register_operand" "=x,x,v,v")
3512         (any_logic:MODEF
3513           (match_operand:MODEF 1 "register_operand" "%0,x,v,v")
3514           (match_operand:MODEF 2 "register_operand" "x,x,v,v")))]
3515   "SSE_FLOAT_MODE_P (<MODE>mode)"
3516 {
3517   static char buf[128];
3518   const char *ops;
3519   const char *suffix
3520     = (get_attr_mode (insn) == MODE_V4SF) ? "ps" : "<ssevecmodesuffix>";
3521
3522   switch (which_alternative)
3523     {
3524     case 0:
3525       ops = "<logic>%s\t{%%2, %%0|%%0, %%2}";
3526       break;
3527     case 2:
3528       if (!TARGET_AVX512DQ)
3529         {
3530           suffix = <MODE>mode == DFmode ? "q" : "d";
3531           ops = "vp<logic>%s\t{%%2, %%1, %%0|%%0, %%1, %%2}";
3532           break;
3533         }
3534       /* FALLTHRU */
3535     case 1:
3536       ops = "v<logic>%s\t{%%2, %%1, %%0|%%0, %%1, %%2}";
3537       break;
3538     case 3:
3539       if (TARGET_AVX512DQ)
3540         ops = "v<logic>%s\t{%%g2, %%g1, %%g0|%%g0, %%g1, %%g2}";
3541       else
3542         {
3543           suffix = <MODE>mode == DFmode ? "q" : "d";
3544           ops = "vp<logic>%s\t{%%g2, %%g1, %%g0|%%g0, %%g1, %%g2}";
3545         }
3546       break;
3547     default:
3548       gcc_unreachable ();
3549     }
3550
3551   snprintf (buf, sizeof (buf), ops, suffix);
3552   return buf;
3553 }
3554   [(set_attr "isa" "noavx,avx,avx512vl,avx512f")
3555    (set_attr "type" "sselog")
3556    (set_attr "prefix" "orig,vex,evex,evex")
3557    (set (attr "mode")
3558         (cond [(eq_attr "alternative" "2")
3559                  (if_then_else (match_test "TARGET_AVX512DQ")
3560                                (const_string "<ssevecmode>")
3561                                (const_string "TI"))
3562                (eq_attr "alternative" "3")
3563                  (if_then_else (match_test "TARGET_AVX512DQ")
3564                                (const_string "<avx512fvecmode>")
3565                                (const_string "XI"))
3566                (and (match_test "<MODE_SIZE> == 16")
3567                     (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL"))
3568                  (const_string "V4SF")
3569                (match_test "TARGET_AVX")
3570                  (const_string "<ssevecmode>")
3571                (match_test "optimize_function_for_size_p (cfun)")
3572                  (const_string "V4SF")
3573                ]
3574                (const_string "<ssevecmode>")))])
3575
3576 (define_expand "<code>tf3"
3577   [(set (match_operand:TF 0 "register_operand")
3578         (any_logic:TF
3579           (match_operand:TF 1 "vector_operand")
3580           (match_operand:TF 2 "vector_operand")))]
3581   "TARGET_SSE"
3582   "ix86_fixup_binary_operands_no_copy (<CODE>, TFmode, operands);")
3583
3584 (define_insn "*<code>tf3"
3585   [(set (match_operand:TF 0 "register_operand" "=x,x,v,v")
3586         (any_logic:TF
3587           (match_operand:TF 1 "vector_operand" "%0,x,v,v")
3588           (match_operand:TF 2 "vector_operand" "xBm,xm,vm,v")))]
3589   "TARGET_SSE && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
3590 {
3591   static char buf[128];
3592   const char *ops;
3593   const char *tmp
3594     = (which_alternative >= 2 ? "p<logic>q"
3595        : get_attr_mode (insn) == MODE_V4SF ? "<logic>ps" : "p<logic>");
3596
3597   switch (which_alternative)
3598     {
3599     case 0:
3600       ops = "%s\t{%%2, %%0|%%0, %%2}";
3601       break;
3602     case 1:
3603     case 2:
3604       ops = "v%s\t{%%2, %%1, %%0|%%0, %%1, %%2}";
3605       break;
3606     case 3:
3607       ops = "v%s\t{%%g2, %%g1, %%g0|%%g0, %%g1, %%g2}";
3608       break;
3609     default:
3610       gcc_unreachable ();
3611     }
3612
3613   snprintf (buf, sizeof (buf), ops, tmp);
3614   return buf;
3615 }
3616   [(set_attr "isa" "noavx,avx,avx512vl,avx512f")
3617    (set_attr "type" "sselog")
3618    (set (attr "prefix_data16")
3619      (if_then_else
3620        (and (eq_attr "alternative" "0")
3621             (eq_attr "mode" "TI"))
3622        (const_string "1")
3623        (const_string "*")))
3624    (set_attr "prefix" "orig,vex,evex,evex")
3625    (set (attr "mode")
3626         (cond [(eq_attr "alternative" "2")
3627                  (const_string "TI")
3628                (eq_attr "alternative" "3")
3629                  (const_string "QI")
3630                (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL")
3631                  (const_string "V4SF")
3632                (match_test "TARGET_AVX")
3633                  (const_string "TI")
3634                (ior (not (match_test "TARGET_SSE2"))
3635                     (match_test "optimize_function_for_size_p (cfun)"))
3636                  (const_string "V4SF")
3637                ]
3638                (const_string "TI")))])
3639
3640 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3641 ;;
3642 ;; FMA floating point multiply/accumulate instructions.  These include
3643 ;; scalar versions of the instructions as well as vector versions.
3644 ;;
3645 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3646
3647 ;; The standard names for scalar FMA are only available with SSE math enabled.
3648 ;; CPUID bit AVX512F enables evex encoded scalar and 512-bit fma.  It doesn't
3649 ;; care about FMA bit, so we enable fma for TARGET_AVX512F even when TARGET_FMA
3650 ;; and TARGET_FMA4 are both false.
3651 ;; TODO: In theory AVX512F does not automatically imply FMA, and without FMA
3652 ;; one must force the EVEX encoding of the fma insns.  Ideally we'd improve
3653 ;; GAS to allow proper prefix selection.  However, for the moment all hardware
3654 ;; that supports AVX512F also supports FMA so we can ignore this for now.
3655 (define_mode_iterator FMAMODEM
3656   [(SF "TARGET_SSE_MATH && (TARGET_FMA || TARGET_FMA4 || TARGET_AVX512F)")
3657    (DF "TARGET_SSE_MATH && (TARGET_FMA || TARGET_FMA4 || TARGET_AVX512F)")
3658    (V4SF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL")
3659    (V2DF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL")
3660    (V8SF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL")
3661    (V4DF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL")
3662    (V16SF "TARGET_AVX512F")
3663    (V8DF "TARGET_AVX512F")])
3664
3665 (define_expand "fma<mode>4"
3666   [(set (match_operand:FMAMODEM 0 "register_operand")
3667         (fma:FMAMODEM
3668           (match_operand:FMAMODEM 1 "nonimmediate_operand")
3669           (match_operand:FMAMODEM 2 "nonimmediate_operand")
3670           (match_operand:FMAMODEM 3 "nonimmediate_operand")))])
3671
3672 (define_expand "fms<mode>4"
3673   [(set (match_operand:FMAMODEM 0 "register_operand")
3674         (fma:FMAMODEM
3675           (match_operand:FMAMODEM 1 "nonimmediate_operand")
3676           (match_operand:FMAMODEM 2 "nonimmediate_operand")
3677           (neg:FMAMODEM (match_operand:FMAMODEM 3 "nonimmediate_operand"))))])
3678
3679 (define_expand "fnma<mode>4"
3680   [(set (match_operand:FMAMODEM 0 "register_operand")
3681         (fma:FMAMODEM
3682           (neg:FMAMODEM (match_operand:FMAMODEM 1 "nonimmediate_operand"))
3683           (match_operand:FMAMODEM 2 "nonimmediate_operand")
3684           (match_operand:FMAMODEM 3 "nonimmediate_operand")))])
3685
3686 (define_expand "fnms<mode>4"
3687   [(set (match_operand:FMAMODEM 0 "register_operand")
3688         (fma:FMAMODEM
3689           (neg:FMAMODEM (match_operand:FMAMODEM 1 "nonimmediate_operand"))
3690           (match_operand:FMAMODEM 2 "nonimmediate_operand")
3691           (neg:FMAMODEM (match_operand:FMAMODEM 3 "nonimmediate_operand"))))])
3692
3693 ;; The builtins for intrinsics are not constrained by SSE math enabled.
3694 (define_mode_iterator FMAMODE_AVX512
3695  [(SF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512F")
3696   (DF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512F")
3697   (V4SF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL")
3698   (V2DF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL")
3699   (V8SF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL")
3700   (V4DF "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512VL")
3701   (V16SF "TARGET_AVX512F")
3702   (V8DF "TARGET_AVX512F")])
3703
3704 (define_mode_iterator FMAMODE
3705   [SF DF V4SF V2DF V8SF V4DF])
3706
3707 (define_expand "fma4i_fmadd_<mode>"
3708   [(set (match_operand:FMAMODE_AVX512 0 "register_operand")
3709         (fma:FMAMODE_AVX512
3710           (match_operand:FMAMODE_AVX512 1 "nonimmediate_operand")
3711           (match_operand:FMAMODE_AVX512 2 "nonimmediate_operand")
3712           (match_operand:FMAMODE_AVX512 3 "nonimmediate_operand")))])
3713
3714 (define_expand "<avx512>_fmadd_<mode>_maskz<round_expand_name>"
3715   [(match_operand:VF_AVX512VL 0 "register_operand")
3716    (match_operand:VF_AVX512VL 1 "<round_expand_nimm_predicate>")
3717    (match_operand:VF_AVX512VL 2 "<round_expand_nimm_predicate>")
3718    (match_operand:VF_AVX512VL 3 "<round_expand_nimm_predicate>")
3719    (match_operand:<avx512fmaskmode> 4 "register_operand")]
3720   "TARGET_AVX512F && <round_mode512bit_condition>"
3721 {
3722   emit_insn (gen_fma_fmadd_<mode>_maskz_1<round_expand_name> (
3723     operands[0], operands[1], operands[2], operands[3],
3724     CONST0_RTX (<MODE>mode), operands[4]<round_expand_operand>));
3725   DONE;
3726 })
3727
3728 (define_insn "*fma_fmadd_<mode>"
3729   [(set (match_operand:FMAMODE 0 "register_operand" "=v,v,v,x,x")
3730         (fma:FMAMODE
3731           (match_operand:FMAMODE 1 "nonimmediate_operand" "%0,0,v,x,x")
3732           (match_operand:FMAMODE 2 "nonimmediate_operand" "vm,v,vm,x,m")
3733           (match_operand:FMAMODE 3 "nonimmediate_operand" "v,vm,0,xm,x")))]
3734   "TARGET_FMA || TARGET_FMA4"
3735   "@
3736    vfmadd132<ssemodesuffix>\t{%2, %3, %0|%0, %3, %2}
3737    vfmadd213<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}
3738    vfmadd231<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}
3739    vfmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}
3740    vfmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
3741   [(set_attr "isa" "fma,fma,fma,fma4,fma4")
3742    (set_attr "type" "ssemuladd")
3743    (set_attr "mode" "<MODE>")])
3744
3745 ;; Suppose AVX-512F as baseline
3746 (define_mode_iterator VF_SF_AVX512VL
3747   [SF V16SF (V8SF "TARGET_AVX512VL") (V4SF "TARGET_AVX512VL")
3748    DF V8DF (V4DF "TARGET_AVX512VL") (V2DF "TARGET_AVX512VL")])
3749
3750 (define_insn "<sd_mask_codefor>fma_fmadd_<mode><sd_maskz_name><round_name>"
3751   [(set (match_operand:VF_SF_AVX512VL 0 "register_operand" "=v,v,v")
3752         (fma:VF_SF_AVX512VL
3753           (match_operand:VF_SF_AVX512VL 1 "<round_nimm_predicate>" "%0,0,v")
3754           (match_operand:VF_SF_AVX512VL 2 "<round_nimm_predicate>" "<round_constraint>,v,<round_constraint>")
3755           (match_operand:VF_SF_AVX512VL 3 "<round_nimm_predicate>" "v,<round_constraint>,0")))]
3756   "TARGET_AVX512F && <sd_mask_mode512bit_condition> && <round_mode512bit_condition>"
3757   "@
3758    vfmadd132<ssemodesuffix>\t{<round_sd_mask_op4>%2, %3, %0<sd_mask_op4>|%0<sd_mask_op4>, %3, %2<round_sd_mask_op4>}
3759    vfmadd213<ssemodesuffix>\t{<round_sd_mask_op4>%3, %2, %0<sd_mask_op4>|%0<sd_mask_op4>, %2, %3<round_sd_mask_op4>}
3760    vfmadd231<ssemodesuffix>\t{<round_sd_mask_op4>%2, %1, %0<sd_mask_op4>|%0<sd_mask_op4>, %1, %2<round_sd_mask_op4>}"
3761   [(set_attr "type" "ssemuladd")
3762    (set_attr "mode" "<MODE>")])
3763
3764 (define_insn "<avx512>_fmadd_<mode>_mask<round_name>"
3765   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v,v")
3766         (vec_merge:VF_AVX512VL
3767           (fma:VF_AVX512VL
3768             (match_operand:VF_AVX512VL 1 "register_operand" "0,0")
3769             (match_operand:VF_AVX512VL 2 "nonimmediate_operand" "<round_constraint>,v")
3770             (match_operand:VF_AVX512VL 3 "nonimmediate_operand" "v,<round_constraint>"))
3771           (match_dup 1)
3772           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk,Yk")))]
3773   "TARGET_AVX512F && <round_mode512bit_condition>"
3774   "@
3775    vfmadd132<ssemodesuffix>\t{<round_op5>%2, %3, %0%{%4%}|%0%{%4%}, %3, %2<round_op5>}
3776    vfmadd213<ssemodesuffix>\t{<round_op5>%3, %2, %0%{%4%}|%0%{%4%}, %2, %3<round_op5>}"
3777   [(set_attr "type" "ssemuladd")
3778    (set_attr "mode" "<MODE>")])
3779
3780 (define_insn "<avx512>_fmadd_<mode>_mask3<round_name>"
3781   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
3782         (vec_merge:VF_AVX512VL
3783           (fma:VF_AVX512VL
3784             (match_operand:VF_AVX512VL 1 "register_operand" "v")
3785             (match_operand:VF_AVX512VL 2 "nonimmediate_operand" "<round_constraint>")
3786             (match_operand:VF_AVX512VL 3 "register_operand" "0"))
3787           (match_dup 3)
3788           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
3789   "TARGET_AVX512F"
3790   "vfmadd231<ssemodesuffix>\t{<round_op5>%2, %1, %0%{%4%}|%0%{%4%}, %1, %2<round_op5>}"
3791   [(set_attr "type" "ssemuladd")
3792    (set_attr "mode" "<MODE>")])
3793
3794 (define_insn "*fma_fmsub_<mode>"
3795   [(set (match_operand:FMAMODE 0 "register_operand" "=v,v,v,x,x")
3796         (fma:FMAMODE
3797           (match_operand:FMAMODE   1 "nonimmediate_operand" "%0,0,v,x,x")
3798           (match_operand:FMAMODE   2 "nonimmediate_operand" "vm,v,vm,x,m")
3799           (neg:FMAMODE
3800             (match_operand:FMAMODE 3 "nonimmediate_operand" "v,vm,0,xm,x"))))]
3801   "TARGET_FMA || TARGET_FMA4"
3802   "@
3803    vfmsub132<ssemodesuffix>\t{%2, %3, %0|%0, %3, %2}
3804    vfmsub213<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}
3805    vfmsub231<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}
3806    vfmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}
3807    vfmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
3808   [(set_attr "isa" "fma,fma,fma,fma4,fma4")
3809    (set_attr "type" "ssemuladd")
3810    (set_attr "mode" "<MODE>")])
3811
3812 (define_insn "<sd_mask_codefor>fma_fmsub_<mode><sd_maskz_name><round_name>"
3813   [(set (match_operand:VF_SF_AVX512VL 0 "register_operand" "=v,v,v")
3814         (fma:VF_SF_AVX512VL
3815           (match_operand:VF_SF_AVX512VL   1 "<round_nimm_predicate>" "%0,0,v")
3816           (match_operand:VF_SF_AVX512VL   2 "<round_nimm_predicate>" "<round_constraint>,v,<round_constraint>")
3817           (neg:VF_SF_AVX512VL
3818             (match_operand:VF_SF_AVX512VL 3 "<round_nimm_predicate>" "v,<round_constraint>,0"))))]
3819   "TARGET_AVX512F && <sd_mask_mode512bit_condition> && <round_mode512bit_condition>"
3820   "@
3821    vfmsub132<ssemodesuffix>\t{<round_sd_mask_op4>%2, %3, %0<sd_mask_op4>|%0<sd_mask_op4>, %3, %2<round_sd_mask_op4>}
3822    vfmsub213<ssemodesuffix>\t{<round_sd_mask_op4>%3, %2, %0<sd_mask_op4>|%0<sd_mask_op4>, %2, %3<round_sd_mask_op4>}
3823    vfmsub231<ssemodesuffix>\t{<round_sd_mask_op4>%2, %1, %0<sd_mask_op4>|%0<sd_mask_op4>, %1, %2<round_sd_mask_op4>}"
3824   [(set_attr "type" "ssemuladd")
3825    (set_attr "mode" "<MODE>")])
3826
3827 (define_insn "<avx512>_fmsub_<mode>_mask<round_name>"
3828   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v,v")
3829         (vec_merge:VF_AVX512VL
3830           (fma:VF_AVX512VL
3831             (match_operand:VF_AVX512VL 1 "register_operand" "0,0")
3832             (match_operand:VF_AVX512VL 2 "nonimmediate_operand" "<round_constraint>,v")
3833             (neg:VF_AVX512VL
3834               (match_operand:VF_AVX512VL 3 "nonimmediate_operand" "v,<round_constraint>")))
3835           (match_dup 1)
3836           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk,Yk")))]
3837   "TARGET_AVX512F"
3838   "@
3839    vfmsub132<ssemodesuffix>\t{<round_op5>%2, %3, %0%{%4%}|%0%{%4%}, %3, %2<round_op5>}
3840    vfmsub213<ssemodesuffix>\t{<round_op5>%3, %2, %0%{%4%}|%0%{%4%}, %2, %3<round_op5>}"
3841   [(set_attr "type" "ssemuladd")
3842    (set_attr "mode" "<MODE>")])
3843
3844 (define_insn "<avx512>_fmsub_<mode>_mask3<round_name>"
3845   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
3846         (vec_merge:VF_AVX512VL
3847           (fma:VF_AVX512VL
3848             (match_operand:VF_AVX512VL 1 "register_operand" "v")
3849             (match_operand:VF_AVX512VL 2 "nonimmediate_operand" "<round_constraint>")
3850             (neg:VF_AVX512VL
3851               (match_operand:VF_AVX512VL 3 "register_operand" "0")))
3852           (match_dup 3)
3853           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
3854   "TARGET_AVX512F && <round_mode512bit_condition>"
3855   "vfmsub231<ssemodesuffix>\t{<round_op5>%2, %1, %0%{%4%}|%0%{%4%}, %1, %2<round_op5>}"
3856   [(set_attr "type" "ssemuladd")
3857    (set_attr "mode" "<MODE>")])
3858
3859 (define_insn "*fma_fnmadd_<mode>"
3860   [(set (match_operand:FMAMODE 0 "register_operand" "=v,v,v,x,x")
3861         (fma:FMAMODE
3862           (neg:FMAMODE
3863             (match_operand:FMAMODE 1 "nonimmediate_operand" "%0,0,v,x,x"))
3864           (match_operand:FMAMODE   2 "nonimmediate_operand" "vm,v,vm,x,m")
3865           (match_operand:FMAMODE   3 "nonimmediate_operand" "v,vm,0,xm,x")))]
3866   "TARGET_FMA || TARGET_FMA4"
3867   "@
3868    vfnmadd132<ssemodesuffix>\t{%2, %3, %0|%0, %3, %2}
3869    vfnmadd213<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}
3870    vfnmadd231<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}
3871    vfnmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}
3872    vfnmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
3873   [(set_attr "isa" "fma,fma,fma,fma4,fma4")
3874    (set_attr "type" "ssemuladd")
3875    (set_attr "mode" "<MODE>")])
3876
3877 (define_insn "<sd_mask_codefor>fma_fnmadd_<mode><sd_maskz_name><round_name>"
3878   [(set (match_operand:VF_SF_AVX512VL 0 "register_operand" "=v,v,v")
3879         (fma:VF_SF_AVX512VL
3880           (neg:VF_SF_AVX512VL
3881             (match_operand:VF_SF_AVX512VL 1 "<round_nimm_predicate>" "%0,0,v"))
3882           (match_operand:VF_SF_AVX512VL   2 "<round_nimm_predicate>" "<round_constraint>,v,<round_constraint>")
3883           (match_operand:VF_SF_AVX512VL   3 "<round_nimm_predicate>" "v,<round_constraint>,0")))]
3884   "TARGET_AVX512F && <sd_mask_mode512bit_condition> && <round_mode512bit_condition>"
3885   "@
3886    vfnmadd132<ssemodesuffix>\t{<round_sd_mask_op4>%2, %3, %0<sd_mask_op4>|%0<sd_mask_op4>, %3, %2<round_sd_mask_op4>}
3887    vfnmadd213<ssemodesuffix>\t{<round_sd_mask_op4>%3, %2, %0<sd_mask_op4>|%0<sd_mask_op4>, %2, %3<round_sd_mask_op4>}
3888    vfnmadd231<ssemodesuffix>\t{<round_sd_mask_op4>%2, %1, %0<sd_mask_op4>|%0<sd_mask_op4>, %1, %2<round_sd_mask_op4>}"
3889   [(set_attr "type" "ssemuladd")
3890    (set_attr "mode" "<MODE>")])
3891
3892 (define_insn "<avx512>_fnmadd_<mode>_mask<round_name>"
3893   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v,v")
3894         (vec_merge:VF_AVX512VL
3895           (fma:VF_AVX512VL
3896             (neg:VF_AVX512VL
3897               (match_operand:VF_AVX512VL 1 "register_operand" "0,0"))
3898             (match_operand:VF_AVX512VL 2 "nonimmediate_operand" "<round_constraint>,v")
3899             (match_operand:VF_AVX512VL 3 "nonimmediate_operand" "v,<round_constraint>"))
3900           (match_dup 1)
3901           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk,Yk")))]
3902   "TARGET_AVX512F && <round_mode512bit_condition>"
3903   "@
3904    vfnmadd132<ssemodesuffix>\t{<round_op5>%2, %3, %0%{%4%}|%0%{%4%}, %3, %2<round_op5>}
3905    vfnmadd213<ssemodesuffix>\t{<round_op5>%3, %2, %0%{%4%}|%0%{%4%}, %2, %3<round_op5>}"
3906   [(set_attr "type" "ssemuladd")
3907    (set_attr "mode" "<MODE>")])
3908
3909 (define_insn "<avx512>_fnmadd_<mode>_mask3<round_name>"
3910   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
3911         (vec_merge:VF_AVX512VL
3912           (fma:VF_AVX512VL
3913             (neg:VF_AVX512VL
3914               (match_operand:VF_AVX512VL 1 "register_operand" "v"))
3915             (match_operand:VF_AVX512VL 2 "nonimmediate_operand" "<round_constraint>")
3916             (match_operand:VF_AVX512VL 3 "register_operand" "0"))
3917           (match_dup 3)
3918           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
3919   "TARGET_AVX512F && <round_mode512bit_condition>"
3920   "vfnmadd231<ssemodesuffix>\t{<round_op5>%2, %1, %0%{%4%}|%0%{%4%}, %1, %2<round_op5>}"
3921   [(set_attr "type" "ssemuladd")
3922    (set_attr "mode" "<MODE>")])
3923
3924 (define_insn "*fma_fnmsub_<mode>"
3925   [(set (match_operand:FMAMODE 0 "register_operand" "=v,v,v,x,x")
3926         (fma:FMAMODE
3927           (neg:FMAMODE
3928             (match_operand:FMAMODE 1 "nonimmediate_operand" "%0,0,v,x,x"))
3929           (match_operand:FMAMODE   2 "nonimmediate_operand" "vm,v,vm,x,m")
3930           (neg:FMAMODE
3931             (match_operand:FMAMODE 3 "nonimmediate_operand" "v,vm,0,xm,x"))))]
3932   "TARGET_FMA || TARGET_FMA4"
3933   "@
3934    vfnmsub132<ssemodesuffix>\t{<round_sd_mask_op4>%2, %3, %0<sd_mask_op4>|%0<sd_mask_op4>, %3, %2<round_sd_mask_op4>}
3935    vfnmsub213<ssemodesuffix>\t{<round_sd_mask_op4>%3, %2, %0<sd_mask_op4>|%0<sd_mask_op4>, %2, %3<round_sd_mask_op4>}
3936    vfnmsub231<ssemodesuffix>\t{<round_sd_mask_op4>%2, %1, %0<sd_mask_op4>|%0<sd_mask_op4>, %1, %2<round_sd_mask_op4>}
3937    vfnmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}
3938    vfnmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
3939   [(set_attr "isa" "fma,fma,fma,fma4,fma4")
3940    (set_attr "type" "ssemuladd")
3941    (set_attr "mode" "<MODE>")])
3942
3943 (define_insn "<sd_mask_codefor>fma_fnmsub_<mode><sd_maskz_name><round_name>"
3944   [(set (match_operand:VF_SF_AVX512VL 0 "register_operand" "=v,v,v")
3945         (fma:VF_SF_AVX512VL
3946           (neg:VF_SF_AVX512VL
3947             (match_operand:VF_SF_AVX512VL 1 "<round_nimm_predicate>" "%0,0,v"))
3948           (match_operand:VF_SF_AVX512VL 2 "<round_nimm_predicate>" "<round_constraint>,v,<round_constraint>")
3949           (neg:VF_SF_AVX512VL
3950             (match_operand:VF_SF_AVX512VL 3 "<round_nimm_predicate>" "v,<round_constraint>,0"))))]
3951   "TARGET_AVX512F && <sd_mask_mode512bit_condition> && <round_mode512bit_condition>"
3952   "@
3953    vfnmsub132<ssemodesuffix>\t{<round_sd_mask_op4>%2, %3, %0<sd_mask_op4>|%0<sd_mask_op4>, %3, %2<round_sd_mask_op4>}
3954    vfnmsub213<ssemodesuffix>\t{<round_sd_mask_op4>%3, %2, %0<sd_mask_op4>|%0<sd_mask_op4>, %2, %3<round_sd_mask_op4>}
3955    vfnmsub231<ssemodesuffix>\t{<round_sd_mask_op4>%2, %1, %0<sd_mask_op4>|%0<sd_mask_op4>, %1, %2<round_sd_mask_op4>}"
3956   [(set_attr "type" "ssemuladd")
3957    (set_attr "mode" "<MODE>")])
3958
3959 (define_insn "<avx512>_fnmsub_<mode>_mask<round_name>"
3960   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v,v")
3961         (vec_merge:VF_AVX512VL
3962           (fma:VF_AVX512VL
3963             (neg:VF_AVX512VL
3964               (match_operand:VF_AVX512VL 1 "register_operand" "0,0"))
3965             (match_operand:VF_AVX512VL 2 "nonimmediate_operand" "<round_constraint>,v")
3966             (neg:VF_AVX512VL
3967               (match_operand:VF_AVX512VL 3 "nonimmediate_operand" "v,<round_constraint>")))
3968           (match_dup 1)
3969           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk,Yk")))]
3970   "TARGET_AVX512F && <round_mode512bit_condition>"
3971   "@
3972    vfnmsub132<ssemodesuffix>\t{<round_op5>%2, %3, %0%{%4%}|%0%{%4%}, %3, %2<round_op5>}
3973    vfnmsub213<ssemodesuffix>\t{<round_op5>%3, %2, %0%{%4%}|%0%{%4%}, %2, %3<round_op5>}"
3974   [(set_attr "type" "ssemuladd")
3975    (set_attr "mode" "<MODE>")])
3976
3977 (define_insn "<avx512>_fnmsub_<mode>_mask3<round_name>"
3978   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
3979         (vec_merge:VF_AVX512VL
3980           (fma:VF_AVX512VL
3981             (neg:VF_AVX512VL
3982               (match_operand:VF_AVX512VL 1 "register_operand" "v"))
3983             (match_operand:VF_AVX512VL 2 "nonimmediate_operand" "<round_constraint>")
3984             (neg:VF_AVX512VL
3985               (match_operand:VF_AVX512VL 3 "register_operand" "0")))
3986           (match_dup 3)
3987           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
3988   "TARGET_AVX512F"
3989   "vfnmsub231<ssemodesuffix>\t{<round_op5>%2, %1, %0%{%4%}|%0%{%4%}, %1, %2<round_op5>}"
3990   [(set_attr "type" "ssemuladd")
3991    (set_attr "mode" "<MODE>")])
3992
3993 ;; FMA parallel floating point multiply addsub and subadd operations.
3994
3995 ;; It would be possible to represent these without the UNSPEC as
3996 ;;
3997 ;; (vec_merge
3998 ;;   (fma op1 op2 op3)
3999 ;;   (fma op1 op2 (neg op3))
4000 ;;   (merge-const))
4001 ;;
4002 ;; But this doesn't seem useful in practice.
4003
4004 (define_expand "fmaddsub_<mode>"
4005   [(set (match_operand:VF 0 "register_operand")
4006         (unspec:VF
4007           [(match_operand:VF 1 "nonimmediate_operand")
4008            (match_operand:VF 2 "nonimmediate_operand")
4009            (match_operand:VF 3 "nonimmediate_operand")]
4010           UNSPEC_FMADDSUB))]
4011   "TARGET_FMA || TARGET_FMA4 || TARGET_AVX512F")
4012
4013 (define_expand "<avx512>_fmaddsub_<mode>_maskz<round_expand_name>"
4014   [(match_operand:VF_AVX512VL 0 "register_operand")
4015    (match_operand:VF_AVX512VL 1 "<round_expand_nimm_predicate>")
4016    (match_operand:VF_AVX512VL 2 "<round_expand_nimm_predicate>")
4017    (match_operand:VF_AVX512VL 3 "<round_expand_nimm_predicate>")
4018    (match_operand:<avx512fmaskmode> 4 "register_operand")]
4019   "TARGET_AVX512F"
4020 {
4021   emit_insn (gen_fma_fmaddsub_<mode>_maskz_1<round_expand_name> (
4022     operands[0], operands[1], operands[2], operands[3],
4023     CONST0_RTX (<MODE>mode), operands[4]<round_expand_operand>));
4024   DONE;
4025 })
4026
4027 (define_insn "*fma_fmaddsub_<mode>"
4028   [(set (match_operand:VF_128_256 0 "register_operand" "=v,v,v,x,x")
4029         (unspec:VF_128_256
4030           [(match_operand:VF_128_256 1 "nonimmediate_operand" "%0,0,v,x,x")
4031            (match_operand:VF_128_256 2 "nonimmediate_operand" "vm,v,vm,x,m")
4032            (match_operand:VF_128_256 3 "nonimmediate_operand" "v,vm,0,xm,x")]
4033           UNSPEC_FMADDSUB))]
4034   "TARGET_FMA || TARGET_FMA4"
4035   "@
4036    vfmaddsub132<ssemodesuffix>\t{%2, %3, %0|%0, %3, %2}
4037    vfmaddsub213<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}
4038    vfmaddsub231<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}
4039    vfmaddsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}
4040    vfmaddsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4041   [(set_attr "isa" "fma,fma,fma,fma4,fma4")
4042    (set_attr "type" "ssemuladd")
4043    (set_attr "mode" "<MODE>")])
4044
4045 (define_insn "<sd_mask_codefor>fma_fmaddsub_<mode><sd_maskz_name><round_name>"
4046   [(set (match_operand:VF_SF_AVX512VL 0 "register_operand" "=v,v,v")
4047         (unspec:VF_SF_AVX512VL
4048           [(match_operand:VF_SF_AVX512VL 1 "<round_nimm_predicate>" "%0,0,v")
4049            (match_operand:VF_SF_AVX512VL 2 "<round_nimm_predicate>" "<round_constraint>,v,<round_constraint>")
4050            (match_operand:VF_SF_AVX512VL 3 "<round_nimm_predicate>" "v,<round_constraint>,0")]
4051           UNSPEC_FMADDSUB))]
4052   "TARGET_AVX512F && <sd_mask_mode512bit_condition> && <round_mode512bit_condition>"
4053   "@
4054    vfmaddsub132<ssemodesuffix>\t{<round_sd_mask_op4>%2, %3, %0<sd_mask_op4>|%0<sd_mask_op4>, %3, %2<round_sd_mask_op4>}
4055    vfmaddsub213<ssemodesuffix>\t{<round_sd_mask_op4>%3, %2, %0<sd_mask_op4>|%0<sd_mask_op4>, %2, %3<round_sd_mask_op4>}
4056    vfmaddsub231<ssemodesuffix>\t{<round_sd_mask_op4>%2, %1, %0<sd_mask_op4>|%0<sd_mask_op4>, %1, %2<round_sd_mask_op4>}"
4057   [(set_attr "type" "ssemuladd")
4058    (set_attr "mode" "<MODE>")])
4059
4060 (define_insn "<avx512>_fmaddsub_<mode>_mask<round_name>"
4061   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v,v")
4062         (vec_merge:VF_AVX512VL
4063           (unspec:VF_AVX512VL
4064             [(match_operand:VF_AVX512VL 1 "register_operand" "0,0")
4065              (match_operand:VF_AVX512VL 2 "nonimmediate_operand" "<round_constraint>,v")
4066              (match_operand:VF_AVX512VL 3 "nonimmediate_operand" "v,<round_constraint>")]
4067             UNSPEC_FMADDSUB)
4068           (match_dup 1)
4069           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk,Yk")))]
4070   "TARGET_AVX512F"
4071   "@
4072    vfmaddsub132<ssemodesuffix>\t{<round_op5>%2, %3, %0%{%4%}|%0%{%4%}, %3, %2<round_op5>}
4073    vfmaddsub213<ssemodesuffix>\t{<round_op5>%3, %2, %0%{%4%}|%0%{%4%}, %2, %3<round_op5>}"
4074   [(set_attr "type" "ssemuladd")
4075    (set_attr "mode" "<MODE>")])
4076
4077 (define_insn "<avx512>_fmaddsub_<mode>_mask3<round_name>"
4078   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
4079         (vec_merge:VF_AVX512VL
4080           (unspec:VF_AVX512VL
4081             [(match_operand:VF_AVX512VL 1 "register_operand" "v")
4082              (match_operand:VF_AVX512VL 2 "nonimmediate_operand" "<round_constraint>")
4083              (match_operand:VF_AVX512VL 3 "register_operand" "0")]
4084             UNSPEC_FMADDSUB)
4085           (match_dup 3)
4086           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
4087   "TARGET_AVX512F"
4088   "vfmaddsub231<ssemodesuffix>\t{<round_op5>%2, %1, %0%{%4%}|%0%{%4%}, %1, %2<round_op5>}"
4089   [(set_attr "type" "ssemuladd")
4090    (set_attr "mode" "<MODE>")])
4091
4092 (define_insn "*fma_fmsubadd_<mode>"
4093   [(set (match_operand:VF_128_256 0 "register_operand" "=v,v,v,x,x")
4094         (unspec:VF_128_256
4095           [(match_operand:VF_128_256   1 "nonimmediate_operand" "%0,0,v,x,x")
4096            (match_operand:VF_128_256   2 "nonimmediate_operand" "vm,v,vm,x,m")
4097            (neg:VF_128_256
4098              (match_operand:VF_128_256 3 "nonimmediate_operand" "v,vm,0,xm,x"))]
4099           UNSPEC_FMADDSUB))]
4100   "TARGET_FMA || TARGET_FMA4"
4101   "@
4102    vfmsubadd132<ssemodesuffix>\t{%2, %3, %0|%0, %3, %2}
4103    vfmsubadd213<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}
4104    vfmsubadd231<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}
4105    vfmsubadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}
4106    vfmsubadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
4107   [(set_attr "isa" "fma,fma,fma,fma4,fma4")
4108    (set_attr "type" "ssemuladd")
4109    (set_attr "mode" "<MODE>")])
4110
4111 (define_insn "<sd_mask_codefor>fma_fmsubadd_<mode><sd_maskz_name><round_name>"
4112   [(set (match_operand:VF_SF_AVX512VL 0 "register_operand" "=v,v,v")
4113         (unspec:VF_SF_AVX512VL
4114           [(match_operand:VF_SF_AVX512VL   1 "<round_nimm_predicate>" "%0,0,v")
4115            (match_operand:VF_SF_AVX512VL   2 "<round_nimm_predicate>" "<round_constraint>,v,<round_constraint>")
4116            (neg:VF_SF_AVX512VL
4117              (match_operand:VF_SF_AVX512VL 3 "<round_nimm_predicate>" "v,<round_constraint>,0"))]
4118           UNSPEC_FMADDSUB))]
4119   "TARGET_AVX512F && <sd_mask_mode512bit_condition> && <round_mode512bit_condition>"
4120   "@
4121    vfmsubadd132<ssemodesuffix>\t{<round_sd_mask_op4>%2, %3, %0<sd_mask_op4>|%0<sd_mask_op4>, %3, %2<round_sd_mask_op4>}
4122    vfmsubadd213<ssemodesuffix>\t{<round_sd_mask_op4>%3, %2, %0<sd_mask_op4>|%0<sd_mask_op4>, %2, %3<round_sd_mask_op4>}
4123    vfmsubadd231<ssemodesuffix>\t{<round_sd_mask_op4>%2, %1, %0<sd_mask_op4>|%0<sd_mask_op4>, %1, %2<round_sd_mask_op4>}"
4124   [(set_attr "type" "ssemuladd")
4125    (set_attr "mode" "<MODE>")])
4126
4127 (define_insn "<avx512>_fmsubadd_<mode>_mask<round_name>"
4128   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v,v")
4129         (vec_merge:VF_AVX512VL
4130           (unspec:VF_AVX512VL
4131             [(match_operand:VF_AVX512VL 1 "register_operand" "0,0")
4132              (match_operand:VF_AVX512VL 2 "nonimmediate_operand" "<round_constraint>,v")
4133              (neg:VF_AVX512VL
4134                (match_operand:VF_AVX512VL 3 "nonimmediate_operand" "v,<round_constraint>"))]
4135             UNSPEC_FMADDSUB)
4136           (match_dup 1)
4137           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk,Yk")))]
4138   "TARGET_AVX512F"
4139   "@
4140    vfmsubadd132<ssemodesuffix>\t{<round_op5>%2, %3, %0%{%4%}|%0%{%4%}, %3, %2<round_op5>}
4141    vfmsubadd213<ssemodesuffix>\t{<round_op5>%3, %2, %0%{%4%}|%0%{%4%}, %2, %3<round_op5>}"
4142   [(set_attr "type" "ssemuladd")
4143    (set_attr "mode" "<MODE>")])
4144
4145 (define_insn "<avx512>_fmsubadd_<mode>_mask3<round_name>"
4146   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
4147         (vec_merge:VF_AVX512VL
4148           (unspec:VF_AVX512VL
4149             [(match_operand:VF_AVX512VL 1 "register_operand" "v")
4150              (match_operand:VF_AVX512VL 2 "nonimmediate_operand" "<round_constraint>")
4151              (neg:VF_AVX512VL
4152                (match_operand:VF_AVX512VL 3 "register_operand" "0"))]
4153             UNSPEC_FMADDSUB)
4154           (match_dup 3)
4155           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
4156   "TARGET_AVX512F"
4157   "vfmsubadd231<ssemodesuffix>\t{<round_op5>%2, %1, %0%{%4%}|%0%{%4%}, %1, %2<round_op5>}"
4158   [(set_attr "type" "ssemuladd")
4159    (set_attr "mode" "<MODE>")])
4160
4161 ;; FMA3 floating point scalar intrinsics. These merge result with
4162 ;; high-order elements from the destination register.
4163
4164 (define_expand "fmai_vmfmadd_<mode><round_name>"
4165   [(set (match_operand:VF_128 0 "register_operand")
4166         (vec_merge:VF_128
4167           (fma:VF_128
4168             (match_operand:VF_128 1 "<round_nimm_predicate>")
4169             (match_operand:VF_128 2 "<round_nimm_predicate>")
4170             (match_operand:VF_128 3 "<round_nimm_predicate>"))
4171           (match_dup 1)
4172           (const_int 1)))]
4173   "TARGET_FMA")
4174
4175 (define_insn "*fmai_fmadd_<mode>"
4176   [(set (match_operand:VF_128 0 "register_operand" "=v,v")
4177         (vec_merge:VF_128
4178           (fma:VF_128
4179             (match_operand:VF_128 1 "<round_nimm_predicate>" " 0, 0")
4180             (match_operand:VF_128 2 "<round_nimm_predicate>" "<round_constraint>, v")
4181             (match_operand:VF_128 3 "<round_nimm_predicate>" " v,<round_constraint>"))
4182           (match_dup 1)
4183           (const_int 1)))]
4184   "TARGET_FMA || TARGET_AVX512F"
4185   "@
4186    vfmadd132<ssescalarmodesuffix>\t{<round_op4>%2, %3, %0|%0, %<iptr>3, %<iptr>2<round_op4>}
4187    vfmadd213<ssescalarmodesuffix>\t{<round_op4>%3, %2, %0|%0, %<iptr>2, %<iptr>3<round_op4>}"
4188   [(set_attr "type" "ssemuladd")
4189    (set_attr "mode" "<MODE>")])
4190
4191 (define_insn "*fmai_fmsub_<mode>"
4192   [(set (match_operand:VF_128 0 "register_operand" "=v,v")
4193         (vec_merge:VF_128
4194           (fma:VF_128
4195             (match_operand:VF_128   1 "<round_nimm_predicate>" "0,0")
4196             (match_operand:VF_128   2 "<round_nimm_predicate>" "<round_constraint>,v")
4197             (neg:VF_128
4198               (match_operand:VF_128 3 "<round_nimm_predicate>" " v,<round_constraint>")))
4199           (match_dup 1)
4200           (const_int 1)))]
4201   "TARGET_FMA || TARGET_AVX512F"
4202   "@
4203    vfmsub132<ssescalarmodesuffix>\t{<round_op4>%2, %3, %0|%0, %<iptr>3, %<iptr>2<round_op4>}
4204    vfmsub213<ssescalarmodesuffix>\t{<round_op4>%3, %2, %0|%0, %<iptr>2, %<iptr>3<round_op4>}"
4205   [(set_attr "type" "ssemuladd")
4206    (set_attr "mode" "<MODE>")])
4207
4208 (define_insn "*fmai_fnmadd_<mode><round_name>"
4209   [(set (match_operand:VF_128 0 "register_operand" "=v,v")
4210         (vec_merge:VF_128
4211           (fma:VF_128
4212             (neg:VF_128
4213               (match_operand:VF_128 2 "<round_nimm_predicate>" "<round_constraint>,v"))
4214             (match_operand:VF_128   1 "<round_nimm_predicate>" "0,0")
4215             (match_operand:VF_128   3 "<round_nimm_predicate>" "v,<round_constraint>"))
4216           (match_dup 1)
4217           (const_int 1)))]
4218   "TARGET_FMA || TARGET_AVX512F"
4219   "@
4220    vfnmadd132<ssescalarmodesuffix>\t{<round_op4>%2, %3, %0|%0, %<iptr>3, %<iptr>2<round_op4>}
4221    vfnmadd213<ssescalarmodesuffix>\t{<round_op4>%3, %2, %0|%0, %<iptr>2, %<iptr>3<round_op4>}"
4222   [(set_attr "type" "ssemuladd")
4223    (set_attr "mode" "<MODE>")])
4224
4225 (define_insn "*fmai_fnmsub_<mode><round_name>"
4226   [(set (match_operand:VF_128 0 "register_operand" "=v,v")
4227         (vec_merge:VF_128
4228           (fma:VF_128
4229             (neg:VF_128
4230               (match_operand:VF_128 2 "<round_nimm_predicate>" "<round_constraint>, v"))
4231             (match_operand:VF_128   1 "<round_nimm_predicate>" " 0, 0")
4232             (neg:VF_128
4233               (match_operand:VF_128 3 "<round_nimm_predicate>" " v,<round_constraint>")))
4234           (match_dup 1)
4235           (const_int 1)))]
4236   "TARGET_FMA || TARGET_AVX512F"
4237   "@
4238    vfnmsub132<ssescalarmodesuffix>\t{<round_op4>%2, %3, %0|%0, %<iptr>3, %<iptr>2<round_op4>}
4239    vfnmsub213<ssescalarmodesuffix>\t{<round_op4>%3, %2, %0|%0, %<iptr>2, %<iptr>3<round_op4>}"
4240   [(set_attr "type" "ssemuladd")
4241    (set_attr "mode" "<MODE>")])
4242
4243 ;; FMA4 floating point scalar intrinsics.  These write the
4244 ;; entire destination register, with the high-order elements zeroed.
4245
4246 (define_expand "fma4i_vmfmadd_<mode>"
4247   [(set (match_operand:VF_128 0 "register_operand")
4248         (vec_merge:VF_128
4249           (fma:VF_128
4250             (match_operand:VF_128 1 "nonimmediate_operand")
4251             (match_operand:VF_128 2 "nonimmediate_operand")
4252             (match_operand:VF_128 3 "nonimmediate_operand"))
4253           (match_dup 4)
4254           (const_int 1)))]
4255   "TARGET_FMA4"
4256   "operands[4] = CONST0_RTX (<MODE>mode);")
4257
4258 (define_insn "*fma4i_vmfmadd_<mode>"
4259   [(set (match_operand:VF_128 0 "register_operand" "=x,x")
4260         (vec_merge:VF_128
4261           (fma:VF_128
4262             (match_operand:VF_128 1 "nonimmediate_operand" "%x,x")
4263             (match_operand:VF_128 2 "nonimmediate_operand" " x,m")
4264             (match_operand:VF_128 3 "nonimmediate_operand" "xm,x"))
4265           (match_operand:VF_128 4 "const0_operand")
4266           (const_int 1)))]
4267   "TARGET_FMA4"
4268   "vfmadd<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %<iptr>2, %<iptr>3}"
4269   [(set_attr "type" "ssemuladd")
4270    (set_attr "mode" "<MODE>")])
4271
4272 (define_insn "*fma4i_vmfmsub_<mode>"
4273   [(set (match_operand:VF_128 0 "register_operand" "=x,x")
4274         (vec_merge:VF_128
4275           (fma:VF_128
4276             (match_operand:VF_128 1 "nonimmediate_operand" "%x,x")
4277             (match_operand:VF_128 2 "nonimmediate_operand" " x,m")
4278             (neg:VF_128
4279               (match_operand:VF_128 3 "nonimmediate_operand" "xm,x")))
4280           (match_operand:VF_128 4 "const0_operand")
4281           (const_int 1)))]
4282   "TARGET_FMA4"
4283   "vfmsub<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %<iptr>2, %<iptr>3}"
4284   [(set_attr "type" "ssemuladd")
4285    (set_attr "mode" "<MODE>")])
4286
4287 (define_insn "*fma4i_vmfnmadd_<mode>"
4288   [(set (match_operand:VF_128 0 "register_operand" "=x,x")
4289         (vec_merge:VF_128
4290           (fma:VF_128
4291             (neg:VF_128
4292               (match_operand:VF_128 1 "nonimmediate_operand" "%x,x"))
4293             (match_operand:VF_128   2 "nonimmediate_operand" " x,m")
4294             (match_operand:VF_128   3 "nonimmediate_operand" "xm,x"))
4295           (match_operand:VF_128 4 "const0_operand")
4296           (const_int 1)))]
4297   "TARGET_FMA4"
4298   "vfnmadd<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %<iptr>2, %<iptr>3}"
4299   [(set_attr "type" "ssemuladd")
4300    (set_attr "mode" "<MODE>")])
4301
4302 (define_insn "*fma4i_vmfnmsub_<mode>"
4303   [(set (match_operand:VF_128 0 "register_operand" "=x,x")
4304         (vec_merge:VF_128
4305           (fma:VF_128
4306             (neg:VF_128
4307               (match_operand:VF_128 1 "nonimmediate_operand" "%x,x"))
4308             (match_operand:VF_128   2 "nonimmediate_operand" " x,m")
4309             (neg:VF_128
4310               (match_operand:VF_128   3 "nonimmediate_operand" "xm,x")))
4311           (match_operand:VF_128 4 "const0_operand")
4312           (const_int 1)))]
4313   "TARGET_FMA4"
4314   "vfnmsub<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %<iptr>2, %<iptr>3}"
4315   [(set_attr "type" "ssemuladd")
4316    (set_attr "mode" "<MODE>")])
4317
4318 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4319 ;;
4320 ;; Parallel single-precision floating point conversion operations
4321 ;;
4322 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4323
4324 (define_insn "sse_cvtpi2ps"
4325   [(set (match_operand:V4SF 0 "register_operand" "=x")
4326         (vec_merge:V4SF
4327           (vec_duplicate:V4SF
4328             (float:V2SF (match_operand:V2SI 2 "nonimmediate_operand" "ym")))
4329           (match_operand:V4SF 1 "register_operand" "0")
4330           (const_int 3)))]
4331   "TARGET_SSE"
4332   "cvtpi2ps\t{%2, %0|%0, %2}"
4333   [(set_attr "type" "ssecvt")
4334    (set_attr "mode" "V4SF")])
4335
4336 (define_insn "sse_cvtps2pi"
4337   [(set (match_operand:V2SI 0 "register_operand" "=y")
4338         (vec_select:V2SI
4339           (unspec:V4SI [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
4340                        UNSPEC_FIX_NOTRUNC)
4341           (parallel [(const_int 0) (const_int 1)])))]
4342   "TARGET_SSE"
4343   "cvtps2pi\t{%1, %0|%0, %q1}"
4344   [(set_attr "type" "ssecvt")
4345    (set_attr "unit" "mmx")
4346    (set_attr "mode" "DI")])
4347
4348 (define_insn "sse_cvttps2pi"
4349   [(set (match_operand:V2SI 0 "register_operand" "=y")
4350         (vec_select:V2SI
4351           (fix:V4SI (match_operand:V4SF 1 "nonimmediate_operand" "xm"))
4352           (parallel [(const_int 0) (const_int 1)])))]
4353   "TARGET_SSE"
4354   "cvttps2pi\t{%1, %0|%0, %q1}"
4355   [(set_attr "type" "ssecvt")
4356    (set_attr "unit" "mmx")
4357    (set_attr "prefix_rep" "0")
4358    (set_attr "mode" "SF")])
4359
4360 (define_insn "sse_cvtsi2ss<round_name>"
4361   [(set (match_operand:V4SF 0 "register_operand" "=x,x,v")
4362         (vec_merge:V4SF
4363           (vec_duplicate:V4SF
4364             (float:SF (match_operand:SI 2 "<round_nimm_scalar_predicate>" "r,m,<round_constraint3>")))
4365           (match_operand:V4SF 1 "register_operand" "0,0,v")
4366           (const_int 1)))]
4367   "TARGET_SSE"
4368   "@
4369    cvtsi2ss\t{%2, %0|%0, %2}
4370    cvtsi2ss\t{%2, %0|%0, %2}
4371    vcvtsi2ss\t{%2, <round_op3>%1, %0|%0, %1<round_op3>, %2}"
4372   [(set_attr "isa" "noavx,noavx,avx")
4373    (set_attr "type" "sseicvt")
4374    (set_attr "athlon_decode" "vector,double,*")
4375    (set_attr "amdfam10_decode" "vector,double,*")
4376    (set_attr "bdver1_decode" "double,direct,*")
4377    (set_attr "btver2_decode" "double,double,double")
4378    (set_attr "znver1_decode" "double,double,double")
4379    (set_attr "prefix" "orig,orig,maybe_evex")
4380    (set_attr "mode" "SF")])
4381
4382 (define_insn "sse_cvtsi2ssq<round_name>"
4383   [(set (match_operand:V4SF 0 "register_operand" "=x,x,v")
4384         (vec_merge:V4SF
4385           (vec_duplicate:V4SF
4386             (float:SF (match_operand:DI 2 "<round_nimm_scalar_predicate>" "r,m,<round_constraint3>")))
4387           (match_operand:V4SF 1 "register_operand" "0,0,v")
4388           (const_int 1)))]
4389   "TARGET_SSE && TARGET_64BIT"
4390   "@
4391    cvtsi2ssq\t{%2, %0|%0, %2}
4392    cvtsi2ssq\t{%2, %0|%0, %2}
4393    vcvtsi2ssq\t{%2, <round_op3>%1, %0|%0, %1<round_op3>, %2}"
4394   [(set_attr "isa" "noavx,noavx,avx")
4395    (set_attr "type" "sseicvt")
4396    (set_attr "athlon_decode" "vector,double,*")
4397    (set_attr "amdfam10_decode" "vector,double,*")
4398    (set_attr "bdver1_decode" "double,direct,*")
4399    (set_attr "btver2_decode" "double,double,double")
4400    (set_attr "length_vex" "*,*,4")
4401    (set_attr "prefix_rex" "1,1,*")
4402    (set_attr "prefix" "orig,orig,maybe_evex")
4403    (set_attr "mode" "SF")])
4404
4405 (define_insn "sse_cvtss2si<round_name>"
4406   [(set (match_operand:SI 0 "register_operand" "=r,r")
4407         (unspec:SI
4408           [(vec_select:SF
4409              (match_operand:V4SF 1 "<round_nimm_scalar_predicate>" "v,<round_constraint2>")
4410              (parallel [(const_int 0)]))]
4411           UNSPEC_FIX_NOTRUNC))]
4412   "TARGET_SSE"
4413   "%vcvtss2si\t{<round_op2>%1, %0|%0, %k1<round_op2>}"
4414   [(set_attr "type" "sseicvt")
4415    (set_attr "athlon_decode" "double,vector")
4416    (set_attr "bdver1_decode" "double,double")
4417    (set_attr "prefix_rep" "1")
4418    (set_attr "prefix" "maybe_vex")
4419    (set_attr "mode" "SI")])
4420
4421 (define_insn "sse_cvtss2si_2"
4422   [(set (match_operand:SI 0 "register_operand" "=r,r")
4423         (unspec:SI [(match_operand:SF 1 "nonimmediate_operand" "v,m")]
4424                    UNSPEC_FIX_NOTRUNC))]
4425   "TARGET_SSE"
4426   "%vcvtss2si\t{%1, %0|%0, %k1}"
4427   [(set_attr "type" "sseicvt")
4428    (set_attr "athlon_decode" "double,vector")
4429    (set_attr "amdfam10_decode" "double,double")
4430    (set_attr "bdver1_decode" "double,double")
4431    (set_attr "prefix_rep" "1")
4432    (set_attr "prefix" "maybe_vex")
4433    (set_attr "mode" "SI")])
4434
4435 (define_insn "sse_cvtss2siq<round_name>"
4436   [(set (match_operand:DI 0 "register_operand" "=r,r")
4437         (unspec:DI
4438           [(vec_select:SF
4439              (match_operand:V4SF 1 "<round_nimm_scalar_predicate>" "v,<round_constraint2>")
4440              (parallel [(const_int 0)]))]
4441           UNSPEC_FIX_NOTRUNC))]
4442   "TARGET_SSE && TARGET_64BIT"
4443   "%vcvtss2si{q}\t{<round_op2>%1, %0|%0, %k1<round_op2>}"
4444   [(set_attr "type" "sseicvt")
4445    (set_attr "athlon_decode" "double,vector")
4446    (set_attr "bdver1_decode" "double,double")
4447    (set_attr "prefix_rep" "1")
4448    (set_attr "prefix" "maybe_vex")
4449    (set_attr "mode" "DI")])
4450
4451 (define_insn "sse_cvtss2siq_2"
4452   [(set (match_operand:DI 0 "register_operand" "=r,r")
4453         (unspec:DI [(match_operand:SF 1 "nonimmediate_operand" "v,m")]
4454                    UNSPEC_FIX_NOTRUNC))]
4455   "TARGET_SSE && TARGET_64BIT"
4456   "%vcvtss2si{q}\t{%1, %0|%0, %k1}"
4457   [(set_attr "type" "sseicvt")
4458    (set_attr "athlon_decode" "double,vector")
4459    (set_attr "amdfam10_decode" "double,double")
4460    (set_attr "bdver1_decode" "double,double")
4461    (set_attr "prefix_rep" "1")
4462    (set_attr "prefix" "maybe_vex")
4463    (set_attr "mode" "DI")])
4464
4465 (define_insn "sse_cvttss2si<round_saeonly_name>"
4466   [(set (match_operand:SI 0 "register_operand" "=r,r")
4467         (fix:SI
4468           (vec_select:SF
4469             (match_operand:V4SF 1 "<round_saeonly_nimm_scalar_predicate>" "v,<round_saeonly_constraint2>")
4470             (parallel [(const_int 0)]))))]
4471   "TARGET_SSE"
4472   "%vcvttss2si\t{<round_saeonly_op2>%1, %0|%0, %k1<round_saeonly_op2>}"
4473   [(set_attr "type" "sseicvt")
4474    (set_attr "athlon_decode" "double,vector")
4475    (set_attr "amdfam10_decode" "double,double")
4476    (set_attr "bdver1_decode" "double,double")
4477    (set_attr "prefix_rep" "1")
4478    (set_attr "prefix" "maybe_vex")
4479    (set_attr "mode" "SI")])
4480
4481 (define_insn "sse_cvttss2siq<round_saeonly_name>"
4482   [(set (match_operand:DI 0 "register_operand" "=r,r")
4483         (fix:DI
4484           (vec_select:SF
4485             (match_operand:V4SF 1 "<round_saeonly_nimm_scalar_predicate>" "v,<round_saeonly_constraint>")
4486             (parallel [(const_int 0)]))))]
4487   "TARGET_SSE && TARGET_64BIT"
4488   "%vcvttss2si{q}\t{<round_saeonly_op2>%1, %0|%0, %k1<round_saeonly_op2>}"
4489   [(set_attr "type" "sseicvt")
4490    (set_attr "athlon_decode" "double,vector")
4491    (set_attr "amdfam10_decode" "double,double")
4492    (set_attr "bdver1_decode" "double,double")
4493    (set_attr "prefix_rep" "1")
4494    (set_attr "prefix" "maybe_vex")
4495    (set_attr "mode" "DI")])
4496
4497 (define_insn "cvtusi2<ssescalarmodesuffix>32<round_name>"
4498   [(set (match_operand:VF_128 0 "register_operand" "=v")
4499         (vec_merge:VF_128
4500           (vec_duplicate:VF_128
4501             (unsigned_float:<ssescalarmode>
4502               (match_operand:SI 2 "<round_nimm_predicate>" "<round_constraint3>")))
4503           (match_operand:VF_128 1 "register_operand" "v")
4504           (const_int 1)))]
4505   "TARGET_AVX512F && <round_modev4sf_condition>"
4506   "vcvtusi2<ssescalarmodesuffix>\t{%2, <round_op3>%1, %0|%0, %1<round_op3>, %2}"
4507   [(set_attr "type" "sseicvt")
4508    (set_attr "prefix" "evex")
4509    (set_attr "mode" "<ssescalarmode>")])
4510
4511 (define_insn "cvtusi2<ssescalarmodesuffix>64<round_name>"
4512   [(set (match_operand:VF_128 0 "register_operand" "=v")
4513         (vec_merge:VF_128
4514           (vec_duplicate:VF_128
4515             (unsigned_float:<ssescalarmode>
4516               (match_operand:DI 2 "<round_nimm_predicate>" "<round_constraint3>")))
4517           (match_operand:VF_128 1 "register_operand" "v")
4518           (const_int 1)))]
4519   "TARGET_AVX512F && TARGET_64BIT"
4520   "vcvtusi2<ssescalarmodesuffix>{q}\t{%2, <round_op3>%1, %0|%0, %1<round_op3>, %2}"
4521   [(set_attr "type" "sseicvt")
4522    (set_attr "prefix" "evex")
4523    (set_attr "mode" "<ssescalarmode>")])
4524
4525 (define_insn "float<sseintvecmodelower><mode>2<mask_name><round_name>"
4526   [(set (match_operand:VF1 0 "register_operand" "=x,v")
4527         (float:VF1
4528           (match_operand:<sseintvecmode> 1 "<round_nimm_predicate>" "xBm,<round_constraint>")))]
4529   "TARGET_SSE2 && <mask_mode512bit_condition> && <round_mode512bit_condition>"
4530   "@
4531    cvtdq2ps\t{%1, %0|%0, %1}
4532    vcvtdq2ps\t{<round_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_mask_op2>}"
4533   [(set_attr "isa" "noavx,avx")
4534    (set_attr "type" "ssecvt")
4535    (set_attr "prefix" "maybe_vex")
4536    (set_attr "mode" "<sseinsnmode>")])
4537
4538 (define_insn "ufloat<sseintvecmodelower><mode>2<mask_name><round_name>"
4539   [(set (match_operand:VF1_AVX512VL 0 "register_operand" "=v")
4540         (unsigned_float:VF1_AVX512VL
4541           (match_operand:<sseintvecmode> 1 "nonimmediate_operand" "<round_constraint>")))]
4542   "TARGET_AVX512F"
4543   "vcvtudq2ps\t{<round_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_mask_op2>}"
4544   [(set_attr "type" "ssecvt")
4545    (set_attr "prefix" "evex")
4546    (set_attr "mode" "<MODE>")])
4547
4548 (define_expand "floatuns<sseintvecmodelower><mode>2"
4549   [(match_operand:VF1 0 "register_operand")
4550    (match_operand:<sseintvecmode> 1 "register_operand")]
4551   "TARGET_SSE2 && (<MODE>mode == V4SFmode || TARGET_AVX2)"
4552 {
4553   if (<MODE>mode == V16SFmode)
4554     emit_insn (gen_ufloatv16siv16sf2 (operands[0], operands[1]));
4555   else
4556     if (TARGET_AVX512VL)
4557       {
4558         if (<MODE>mode == V4SFmode)
4559           emit_insn (gen_ufloatv4siv4sf2 (operands[0], operands[1]));
4560         else
4561           emit_insn (gen_ufloatv8siv8sf2 (operands[0], operands[1]));
4562       }
4563   else
4564     ix86_expand_vector_convert_uns_vsivsf (operands[0], operands[1]);
4565
4566   DONE;
4567 })
4568
4569
4570 ;; For <sse2_avx_avx512f>_fix_notrunc<sf2simodelower><mode> insn pattern
4571 (define_mode_attr sf2simodelower
4572   [(V16SI "v16sf") (V8SI "v8sf") (V4SI "v4sf")])
4573
4574 (define_insn "<sse2_avx_avx512f>_fix_notrunc<sf2simodelower><mode><mask_name>"
4575   [(set (match_operand:VI4_AVX 0 "register_operand" "=v")
4576         (unspec:VI4_AVX
4577           [(match_operand:<ssePSmode> 1 "vector_operand" "vBm")]
4578           UNSPEC_FIX_NOTRUNC))]
4579   "TARGET_SSE2 && <mask_mode512bit_condition>"
4580   "%vcvtps2dq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
4581   [(set_attr "type" "ssecvt")
4582    (set (attr "prefix_data16")
4583      (if_then_else
4584        (match_test "TARGET_AVX")
4585      (const_string "*")
4586      (const_string "1")))
4587    (set_attr "prefix" "maybe_vex")
4588    (set_attr "mode" "<sseinsnmode>")])
4589
4590 (define_insn "avx512f_fix_notruncv16sfv16si<mask_name><round_name>"
4591   [(set (match_operand:V16SI 0 "register_operand" "=v")
4592         (unspec:V16SI
4593           [(match_operand:V16SF 1 "<round_nimm_predicate>" "<round_constraint>")]
4594           UNSPEC_FIX_NOTRUNC))]
4595   "TARGET_AVX512F"
4596   "vcvtps2dq\t{<round_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_mask_op2>}"
4597   [(set_attr "type" "ssecvt")
4598    (set_attr "prefix" "evex")
4599    (set_attr "mode" "XI")])
4600
4601 (define_insn "<mask_codefor><avx512>_ufix_notrunc<sf2simodelower><mode><mask_name><round_name>"
4602   [(set (match_operand:VI4_AVX512VL 0 "register_operand" "=v")
4603         (unspec:VI4_AVX512VL
4604           [(match_operand:<ssePSmode> 1 "nonimmediate_operand" "<round_constraint>")]
4605           UNSPEC_UNSIGNED_FIX_NOTRUNC))]
4606   "TARGET_AVX512F"
4607   "vcvtps2udq\t{<round_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_mask_op2>}"
4608   [(set_attr "type" "ssecvt")
4609    (set_attr "prefix" "evex")
4610    (set_attr "mode" "<sseinsnmode>")])
4611
4612 (define_insn "<mask_codefor>avx512dq_cvtps2qq<mode><mask_name><round_name>"
4613   [(set (match_operand:VI8_256_512 0 "register_operand" "=v")
4614         (unspec:VI8_256_512 [(match_operand:<ssePSmode2> 1 "nonimmediate_operand" "<round_constraint>")]
4615                      UNSPEC_FIX_NOTRUNC))]
4616   "TARGET_AVX512DQ && <round_mode512bit_condition>"
4617   "vcvtps2qq\t{<round_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_mask_op2>}"
4618   [(set_attr "type" "ssecvt")
4619    (set_attr "prefix" "evex")
4620    (set_attr "mode" "<sseinsnmode>")])
4621
4622 (define_insn "<mask_codefor>avx512dq_cvtps2qqv2di<mask_name>"
4623   [(set (match_operand:V2DI 0 "register_operand" "=v")
4624         (unspec:V2DI
4625           [(vec_select:V2SF
4626              (match_operand:V4SF 1 "nonimmediate_operand" "vm")
4627              (parallel [(const_int 0) (const_int 1)]))]
4628           UNSPEC_FIX_NOTRUNC))]
4629   "TARGET_AVX512DQ && TARGET_AVX512VL"
4630   "vcvtps2qq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %q1}"
4631   [(set_attr "type" "ssecvt")
4632    (set_attr "prefix" "evex")
4633    (set_attr "mode" "TI")])
4634
4635 (define_insn "<mask_codefor>avx512dq_cvtps2uqq<mode><mask_name><round_name>"
4636   [(set (match_operand:VI8_256_512 0 "register_operand" "=v")
4637         (unspec:VI8_256_512 [(match_operand:<ssePSmode2> 1 "nonimmediate_operand" "<round_constraint>")]
4638                      UNSPEC_UNSIGNED_FIX_NOTRUNC))]
4639   "TARGET_AVX512DQ && <round_mode512bit_condition>"
4640   "vcvtps2uqq\t{<round_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_mask_op2>}"
4641   [(set_attr "type" "ssecvt")
4642    (set_attr "prefix" "evex")
4643    (set_attr "mode" "<sseinsnmode>")])
4644
4645 (define_insn "<mask_codefor>avx512dq_cvtps2uqqv2di<mask_name>"
4646   [(set (match_operand:V2DI 0 "register_operand" "=v")
4647         (unspec:V2DI
4648           [(vec_select:V2SF
4649              (match_operand:V4SF 1 "nonimmediate_operand" "vm")
4650              (parallel [(const_int 0) (const_int 1)]))]
4651           UNSPEC_UNSIGNED_FIX_NOTRUNC))]
4652   "TARGET_AVX512DQ && TARGET_AVX512VL"
4653   "vcvtps2uqq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %q1}"
4654   [(set_attr "type" "ssecvt")
4655    (set_attr "prefix" "evex")
4656    (set_attr "mode" "TI")])
4657
4658 (define_insn "<fixsuffix>fix_truncv16sfv16si2<mask_name><round_saeonly_name>"
4659   [(set (match_operand:V16SI 0 "register_operand" "=v")
4660         (any_fix:V16SI
4661           (match_operand:V16SF 1 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")))]
4662   "TARGET_AVX512F"
4663   "vcvttps2<fixsuffix>dq\t{<round_saeonly_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_saeonly_mask_op2>}"
4664   [(set_attr "type" "ssecvt")
4665    (set_attr "prefix" "evex")
4666    (set_attr "mode" "XI")])
4667
4668 (define_insn "fix_truncv8sfv8si2<mask_name>"
4669   [(set (match_operand:V8SI 0 "register_operand" "=v")
4670         (fix:V8SI (match_operand:V8SF 1 "nonimmediate_operand" "vm")))]
4671   "TARGET_AVX && <mask_avx512vl_condition>"
4672   "vcvttps2dq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
4673   [(set_attr "type" "ssecvt")
4674    (set_attr "prefix" "<mask_prefix>")
4675    (set_attr "mode" "OI")])
4676
4677 (define_insn "fix_truncv4sfv4si2<mask_name>"
4678   [(set (match_operand:V4SI 0 "register_operand" "=v")
4679         (fix:V4SI (match_operand:V4SF 1 "vector_operand" "vBm")))]
4680   "TARGET_SSE2 && <mask_avx512vl_condition>"
4681   "%vcvttps2dq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
4682   [(set_attr "type" "ssecvt")
4683    (set (attr "prefix_rep")
4684      (if_then_else
4685        (match_test "TARGET_AVX")
4686      (const_string "*")
4687      (const_string "1")))
4688    (set (attr "prefix_data16")
4689      (if_then_else
4690        (match_test "TARGET_AVX")
4691      (const_string "*")
4692      (const_string "0")))
4693    (set_attr "prefix_data16" "0")
4694    (set_attr "prefix" "<mask_prefix2>")
4695    (set_attr "mode" "TI")])
4696
4697 (define_expand "fixuns_trunc<mode><sseintvecmodelower>2"
4698   [(match_operand:<sseintvecmode> 0 "register_operand")
4699    (match_operand:VF1 1 "register_operand")]
4700   "TARGET_SSE2"
4701 {
4702   if (<MODE>mode == V16SFmode)
4703     emit_insn (gen_ufix_truncv16sfv16si2 (operands[0],
4704                                           operands[1]));
4705   else
4706     {
4707       rtx tmp[3];
4708       tmp[0] = ix86_expand_adjust_ufix_to_sfix_si (operands[1], &tmp[2]);
4709       tmp[1] = gen_reg_rtx (<sseintvecmode>mode);
4710       emit_insn (gen_fix_trunc<mode><sseintvecmodelower>2 (tmp[1], tmp[0]));
4711       emit_insn (gen_xor<sseintvecmodelower>3 (operands[0], tmp[1], tmp[2]));
4712     }
4713   DONE;
4714 })
4715
4716 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4717 ;;
4718 ;; Parallel double-precision floating point conversion operations
4719 ;;
4720 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4721
4722 (define_insn "sse2_cvtpi2pd"
4723   [(set (match_operand:V2DF 0 "register_operand" "=v,x")
4724         (float:V2DF (match_operand:V2SI 1 "nonimmediate_operand" "vBm,?!y")))]
4725   "TARGET_SSE2"
4726   "@
4727    %vcvtdq2pd\t{%1, %0|%0, %1}
4728    cvtpi2pd\t{%1, %0|%0, %1}"
4729   [(set_attr "type" "ssecvt")
4730    (set_attr "unit" "*,mmx")
4731    (set_attr "prefix_data16" "*,1")
4732    (set_attr "prefix" "maybe_vex,*")
4733    (set_attr "mode" "V2DF")])
4734
4735 (define_insn "sse2_cvtpd2pi"
4736   [(set (match_operand:V2SI 0 "register_operand" "=v,?!y")
4737         (unspec:V2SI [(match_operand:V2DF 1 "nonimmediate_operand" "vBm,xm")]
4738                      UNSPEC_FIX_NOTRUNC))]
4739   "TARGET_SSE2"
4740   "@
4741    * return TARGET_AVX ? \"vcvtpd2dq{x}\t{%1, %0|%0, %1}\" : \"cvtpd2dq\t{%1, %0|%0, %1}\";
4742    cvtpd2pi\t{%1, %0|%0, %1}"
4743   [(set_attr "type" "ssecvt")
4744    (set_attr "unit" "*,mmx")
4745    (set_attr "amdfam10_decode" "double")
4746    (set_attr "athlon_decode" "vector")
4747    (set_attr "bdver1_decode" "double")
4748    (set_attr "prefix_data16" "*,1")
4749    (set_attr "prefix" "maybe_vex,*")
4750    (set_attr "mode" "TI")])
4751
4752 (define_insn "sse2_cvttpd2pi"
4753   [(set (match_operand:V2SI 0 "register_operand" "=v,?!y")
4754         (fix:V2SI (match_operand:V2DF 1 "nonimmediate_operand" "vBm,xm")))]
4755   "TARGET_SSE2"
4756   "@
4757    * return TARGET_AVX ? \"vcvttpd2dq{x}\t{%1, %0|%0, %1}\" : \"cvttpd2dq\t{%1, %0|%0, %1}\";
4758    cvttpd2pi\t{%1, %0|%0, %1}"
4759   [(set_attr "type" "ssecvt")
4760    (set_attr "unit" "*,mmx")
4761    (set_attr "amdfam10_decode" "double")
4762    (set_attr "athlon_decode" "vector")
4763    (set_attr "bdver1_decode" "double")
4764    (set_attr "prefix_data16" "*,1")
4765    (set_attr "prefix" "maybe_vex,*")
4766    (set_attr "mode" "TI")])
4767
4768 (define_insn "sse2_cvtsi2sd"
4769   [(set (match_operand:V2DF 0 "register_operand" "=x,x,v")
4770         (vec_merge:V2DF
4771           (vec_duplicate:V2DF
4772             (float:DF (match_operand:SI 2 "nonimmediate_operand" "r,m,rm")))
4773           (match_operand:V2DF 1 "register_operand" "0,0,v")
4774           (const_int 1)))]
4775   "TARGET_SSE2"
4776   "@
4777    cvtsi2sd\t{%2, %0|%0, %2}
4778    cvtsi2sd\t{%2, %0|%0, %2}
4779    vcvtsi2sd\t{%2, %1, %0|%0, %1, %2}"
4780   [(set_attr "isa" "noavx,noavx,avx")
4781    (set_attr "type" "sseicvt")
4782    (set_attr "athlon_decode" "double,direct,*")
4783    (set_attr "amdfam10_decode" "vector,double,*")
4784    (set_attr "bdver1_decode" "double,direct,*")
4785    (set_attr "btver2_decode" "double,double,double")
4786    (set_attr "znver1_decode" "double,double,double")
4787    (set_attr "prefix" "orig,orig,maybe_evex")
4788    (set_attr "mode" "DF")])
4789
4790 (define_insn "sse2_cvtsi2sdq<round_name>"
4791   [(set (match_operand:V2DF 0 "register_operand" "=x,x,v")
4792         (vec_merge:V2DF
4793           (vec_duplicate:V2DF
4794             (float:DF (match_operand:DI 2 "<round_nimm_scalar_predicate>" "r,m,<round_constraint3>")))
4795           (match_operand:V2DF 1 "register_operand" "0,0,v")
4796           (const_int 1)))]
4797   "TARGET_SSE2 && TARGET_64BIT"
4798   "@
4799    cvtsi2sdq\t{%2, %0|%0, %2}
4800    cvtsi2sdq\t{%2, %0|%0, %2}
4801    vcvtsi2sdq\t{%2, <round_op3>%1, %0|%0, %1<round_op3>, %2}"
4802   [(set_attr "isa" "noavx,noavx,avx")
4803    (set_attr "type" "sseicvt")
4804    (set_attr "athlon_decode" "double,direct,*")
4805    (set_attr "amdfam10_decode" "vector,double,*")
4806    (set_attr "bdver1_decode" "double,direct,*")
4807    (set_attr "length_vex" "*,*,4")
4808    (set_attr "prefix_rex" "1,1,*")
4809    (set_attr "prefix" "orig,orig,maybe_evex")
4810    (set_attr "mode" "DF")])
4811
4812 (define_insn "avx512f_vcvtss2usi<round_name>"
4813   [(set (match_operand:SI 0 "register_operand" "=r")
4814         (unspec:SI
4815           [(vec_select:SF
4816              (match_operand:V4SF 1 "<round_nimm_predicate>" "<round_constraint>")
4817              (parallel [(const_int 0)]))]
4818           UNSPEC_UNSIGNED_FIX_NOTRUNC))]
4819   "TARGET_AVX512F"
4820   "vcvtss2usi\t{<round_op2>%1, %0|%0, %k1<round_op2>}"
4821   [(set_attr "type" "sseicvt")
4822    (set_attr "prefix" "evex")
4823    (set_attr "mode" "SI")])
4824
4825 (define_insn "avx512f_vcvtss2usiq<round_name>"
4826   [(set (match_operand:DI 0 "register_operand" "=r")
4827         (unspec:DI
4828           [(vec_select:SF
4829              (match_operand:V4SF 1 "<round_nimm_predicate>" "<round_constraint>")
4830              (parallel [(const_int 0)]))]
4831           UNSPEC_UNSIGNED_FIX_NOTRUNC))]
4832   "TARGET_AVX512F && TARGET_64BIT"
4833   "vcvtss2usi\t{<round_op2>%1, %0|%0, %k1<round_op2>}"
4834   [(set_attr "type" "sseicvt")
4835    (set_attr "prefix" "evex")
4836    (set_attr "mode" "DI")])
4837
4838 (define_insn "avx512f_vcvttss2usi<round_saeonly_name>"
4839   [(set (match_operand:SI 0 "register_operand" "=r")
4840         (unsigned_fix:SI
4841           (vec_select:SF
4842             (match_operand:V4SF 1 "<round_saeonly_nimm_scalar_predicate>" "<round_saeonly_constraint>")
4843             (parallel [(const_int 0)]))))]
4844   "TARGET_AVX512F"
4845   "vcvttss2usi\t{<round_saeonly_op2>%1, %0|%0, %k1<round_saeonly_op2>}"
4846   [(set_attr "type" "sseicvt")
4847    (set_attr "prefix" "evex")
4848    (set_attr "mode" "SI")])
4849
4850 (define_insn "avx512f_vcvttss2usiq<round_saeonly_name>"
4851   [(set (match_operand:DI 0 "register_operand" "=r")
4852         (unsigned_fix:DI
4853           (vec_select:SF
4854             (match_operand:V4SF 1 "<round_saeonly_nimm_scalar_predicate>" "<round_saeonly_constraint>")
4855             (parallel [(const_int 0)]))))]
4856   "TARGET_AVX512F && TARGET_64BIT"
4857   "vcvttss2usi\t{<round_saeonly_op2>%1, %0|%0, %k1<round_saeonly_op2>}"
4858   [(set_attr "type" "sseicvt")
4859    (set_attr "prefix" "evex")
4860    (set_attr "mode" "DI")])
4861
4862 (define_insn "avx512f_vcvtsd2usi<round_name>"
4863   [(set (match_operand:SI 0 "register_operand" "=r")
4864         (unspec:SI
4865           [(vec_select:DF
4866              (match_operand:V2DF 1 "<round_nimm_predicate>" "<round_constraint>")
4867              (parallel [(const_int 0)]))]
4868           UNSPEC_UNSIGNED_FIX_NOTRUNC))]
4869   "TARGET_AVX512F"
4870   "vcvtsd2usi\t{<round_op2>%1, %0|%0, %q1<round_op2>}"
4871   [(set_attr "type" "sseicvt")
4872    (set_attr "prefix" "evex")
4873    (set_attr "mode" "SI")])
4874
4875 (define_insn "avx512f_vcvtsd2usiq<round_name>"
4876   [(set (match_operand:DI 0 "register_operand" "=r")
4877         (unspec:DI
4878           [(vec_select:DF
4879              (match_operand:V2DF 1 "<round_nimm_predicate>" "<round_constraint>")
4880              (parallel [(const_int 0)]))]
4881           UNSPEC_UNSIGNED_FIX_NOTRUNC))]
4882   "TARGET_AVX512F && TARGET_64BIT"
4883   "vcvtsd2usi\t{<round_op2>%1, %0|%0, %q1<round_op2>}"
4884   [(set_attr "type" "sseicvt")
4885    (set_attr "prefix" "evex")
4886    (set_attr "mode" "DI")])
4887
4888 (define_insn "avx512f_vcvttsd2usi<round_saeonly_name>"
4889   [(set (match_operand:SI 0 "register_operand" "=r")
4890         (unsigned_fix:SI
4891           (vec_select:DF
4892             (match_operand:V2DF 1 "<round_saeonly_nimm_scalar_predicate>" "<round_saeonly_constraint>")
4893             (parallel [(const_int 0)]))))]
4894   "TARGET_AVX512F"
4895   "vcvttsd2usi\t{<round_saeonly_op2>%1, %0|%0, %q1<round_saeonly_op2>}"
4896   [(set_attr "type" "sseicvt")
4897    (set_attr "prefix" "evex")
4898    (set_attr "mode" "SI")])
4899
4900 (define_insn "avx512f_vcvttsd2usiq<round_saeonly_name>"
4901   [(set (match_operand:DI 0 "register_operand" "=r")
4902         (unsigned_fix:DI
4903           (vec_select:DF
4904             (match_operand:V2DF 1 "<round_saeonly_nimm_scalar_predicate>" "<round_saeonly_constraint>")
4905             (parallel [(const_int 0)]))))]
4906   "TARGET_AVX512F && TARGET_64BIT"
4907   "vcvttsd2usi\t{<round_saeonly_op2>%1, %0|%0, %q1<round_saeonly_op2>}"
4908   [(set_attr "type" "sseicvt")
4909    (set_attr "prefix" "evex")
4910    (set_attr "mode" "DI")])
4911
4912 (define_insn "sse2_cvtsd2si<round_name>"
4913   [(set (match_operand:SI 0 "register_operand" "=r,r")
4914         (unspec:SI
4915           [(vec_select:DF
4916              (match_operand:V2DF 1 "<round_nimm_scalar_predicate>" "v,<round_constraint2>")
4917              (parallel [(const_int 0)]))]
4918           UNSPEC_FIX_NOTRUNC))]
4919   "TARGET_SSE2"
4920   "%vcvtsd2si\t{<round_op2>%1, %0|%0, %q1<round_op2>}"
4921   [(set_attr "type" "sseicvt")
4922    (set_attr "athlon_decode" "double,vector")
4923    (set_attr "bdver1_decode" "double,double")
4924    (set_attr "btver2_decode" "double,double")
4925    (set_attr "prefix_rep" "1")
4926    (set_attr "prefix" "maybe_vex")
4927    (set_attr "mode" "SI")])
4928
4929 (define_insn "sse2_cvtsd2si_2"
4930   [(set (match_operand:SI 0 "register_operand" "=r,r")
4931         (unspec:SI [(match_operand:DF 1 "nonimmediate_operand" "v,m")]
4932                    UNSPEC_FIX_NOTRUNC))]
4933   "TARGET_SSE2"
4934   "%vcvtsd2si\t{%1, %0|%0, %q1}"
4935   [(set_attr "type" "sseicvt")
4936    (set_attr "athlon_decode" "double,vector")
4937    (set_attr "amdfam10_decode" "double,double")
4938    (set_attr "bdver1_decode" "double,double")
4939    (set_attr "prefix_rep" "1")
4940    (set_attr "prefix" "maybe_vex")
4941    (set_attr "mode" "SI")])
4942
4943 (define_insn "sse2_cvtsd2siq<round_name>"
4944   [(set (match_operand:DI 0 "register_operand" "=r,r")
4945         (unspec:DI
4946           [(vec_select:DF
4947              (match_operand:V2DF 1 "<round_nimm_scalar_predicate>" "v,<round_constraint2>")
4948              (parallel [(const_int 0)]))]
4949           UNSPEC_FIX_NOTRUNC))]
4950   "TARGET_SSE2 && TARGET_64BIT"
4951   "%vcvtsd2si{q}\t{<round_op2>%1, %0|%0, %q1<round_op2>}"
4952   [(set_attr "type" "sseicvt")
4953    (set_attr "athlon_decode" "double,vector")
4954    (set_attr "bdver1_decode" "double,double")
4955    (set_attr "prefix_rep" "1")
4956    (set_attr "prefix" "maybe_vex")
4957    (set_attr "mode" "DI")])
4958
4959 (define_insn "sse2_cvtsd2siq_2"
4960   [(set (match_operand:DI 0 "register_operand" "=r,r")
4961         (unspec:DI [(match_operand:DF 1 "nonimmediate_operand" "v,m")]
4962                    UNSPEC_FIX_NOTRUNC))]
4963   "TARGET_SSE2 && TARGET_64BIT"
4964   "%vcvtsd2si{q}\t{%1, %0|%0, %q1}"
4965   [(set_attr "type" "sseicvt")
4966    (set_attr "athlon_decode" "double,vector")
4967    (set_attr "amdfam10_decode" "double,double")
4968    (set_attr "bdver1_decode" "double,double")
4969    (set_attr "prefix_rep" "1")
4970    (set_attr "prefix" "maybe_vex")
4971    (set_attr "mode" "DI")])
4972
4973 (define_insn "sse2_cvttsd2si<round_saeonly_name>"
4974   [(set (match_operand:SI 0 "register_operand" "=r,r")
4975         (fix:SI
4976           (vec_select:DF
4977             (match_operand:V2DF 1 "<round_saeonly_nimm_scalar_predicate>" "v,<round_saeonly_constraint2>")
4978             (parallel [(const_int 0)]))))]
4979   "TARGET_SSE2"
4980   "%vcvttsd2si\t{<round_saeonly_op2>%1, %0|%0, %q1<round_saeonly_op2>}"
4981   [(set_attr "type" "sseicvt")
4982    (set_attr "athlon_decode" "double,vector")
4983    (set_attr "amdfam10_decode" "double,double")
4984    (set_attr "bdver1_decode" "double,double")
4985    (set_attr "btver2_decode" "double,double")
4986    (set_attr "prefix_rep" "1")
4987    (set_attr "prefix" "maybe_vex")
4988    (set_attr "mode" "SI")])
4989
4990 (define_insn "sse2_cvttsd2siq<round_saeonly_name>"
4991   [(set (match_operand:DI 0 "register_operand" "=r,r")
4992         (fix:DI
4993           (vec_select:DF
4994             (match_operand:V2DF 1 "<round_saeonly_nimm_scalar_predicate>" "v,<round_saeonly_constraint2>")
4995             (parallel [(const_int 0)]))))]
4996   "TARGET_SSE2 && TARGET_64BIT"
4997   "%vcvttsd2si{q}\t{<round_saeonly_op2>%1, %0|%0, %q1<round_saeonly_op2>}"
4998   [(set_attr "type" "sseicvt")
4999    (set_attr "athlon_decode" "double,vector")
5000    (set_attr "amdfam10_decode" "double,double")
5001    (set_attr "bdver1_decode" "double,double")
5002    (set_attr "prefix_rep" "1")
5003    (set_attr "prefix" "maybe_vex")
5004    (set_attr "mode" "DI")])
5005
5006 ;; For float<si2dfmode><mode>2 insn pattern
5007 (define_mode_attr si2dfmode
5008   [(V8DF "V8SI") (V4DF "V4SI")])
5009 (define_mode_attr si2dfmodelower
5010   [(V8DF "v8si") (V4DF "v4si")])
5011
5012 (define_insn "float<si2dfmodelower><mode>2<mask_name>"
5013   [(set (match_operand:VF2_512_256 0 "register_operand" "=v")
5014         (float:VF2_512_256 (match_operand:<si2dfmode> 1 "nonimmediate_operand" "vm")))]
5015   "TARGET_AVX && <mask_mode512bit_condition>"
5016   "vcvtdq2pd\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
5017   [(set_attr "type" "ssecvt")
5018    (set_attr "prefix" "maybe_vex")
5019    (set_attr "mode" "<MODE>")])
5020
5021 (define_insn "<floatsuffix>float<sseintvecmodelower><mode>2<mask_name><round_name>"
5022   [(set (match_operand:VF2_AVX512VL 0 "register_operand" "=v")
5023         (any_float:VF2_AVX512VL
5024           (match_operand:<sseintvecmode> 1 "nonimmediate_operand" "<round_constraint>")))]
5025   "TARGET_AVX512DQ"
5026   "vcvt<floatsuffix>qq2pd\t{<round_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_mask_op2>}"
5027   [(set_attr "type" "ssecvt")
5028    (set_attr "prefix" "evex")
5029    (set_attr "mode" "<MODE>")])
5030
5031 ;; For <floatsuffix>float<sselondveclower><mode> insn patterns
5032 (define_mode_attr qq2pssuff
5033   [(V8SF "") (V4SF "{y}")])
5034
5035 (define_mode_attr sselongvecmode
5036   [(V8SF "V8DI") (V4SF  "V4DI")])
5037
5038 (define_mode_attr sselongvecmodelower
5039   [(V8SF "v8di") (V4SF  "v4di")])
5040
5041 (define_mode_attr sseintvecmode3
5042   [(V8SF "XI") (V4SF "OI")
5043    (V8DF "OI") (V4DF "TI")])
5044
5045 (define_insn "<floatsuffix>float<sselongvecmodelower><mode>2<mask_name><round_name>"
5046   [(set (match_operand:VF1_128_256VL 0 "register_operand" "=v")
5047          (any_float:VF1_128_256VL
5048            (match_operand:<sselongvecmode> 1 "nonimmediate_operand" "<round_constraint>")))]
5049   "TARGET_AVX512DQ && <round_modev8sf_condition>"
5050   "vcvt<floatsuffix>qq2ps<qq2pssuff>\t{<round_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_mask_op2>}"
5051   [(set_attr "type" "ssecvt")
5052    (set_attr "prefix" "evex")
5053    (set_attr "mode" "<MODE>")])
5054
5055 (define_insn "*<floatsuffix>floatv2div2sf2"
5056   [(set (match_operand:V4SF 0 "register_operand" "=v")
5057     (vec_concat:V4SF
5058             (any_float:V2SF (match_operand:V2DI 1 "nonimmediate_operand" "vm"))
5059             (const_vector:V2SF [(const_int 0) (const_int 0)])))]
5060   "TARGET_AVX512DQ && TARGET_AVX512VL"
5061   "vcvt<floatsuffix>qq2ps{x}\t{%1, %0|%0, %1}"
5062   [(set_attr "type" "ssecvt")
5063    (set_attr "prefix" "evex")
5064    (set_attr "mode" "V4SF")])
5065
5066 (define_insn "<floatsuffix>floatv2div2sf2_mask"
5067   [(set (match_operand:V4SF 0 "register_operand" "=v")
5068     (vec_concat:V4SF
5069         (vec_merge:V2SF
5070                 (any_float:V2SF (match_operand:V2DI 1 "nonimmediate_operand" "vm"))
5071             (vec_select:V2SF
5072                 (match_operand:V4SF 2 "vector_move_operand" "0C")
5073                 (parallel [(const_int 0) (const_int 1)]))
5074             (match_operand:QI 3 "register_operand" "Yk"))
5075             (const_vector:V2SF [(const_int 0) (const_int 0)])))]
5076   "TARGET_AVX512DQ && TARGET_AVX512VL"
5077   "vcvt<floatsuffix>qq2ps{x}\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
5078   [(set_attr "type" "ssecvt")
5079    (set_attr "prefix" "evex")
5080    (set_attr "mode" "V4SF")])
5081
5082 (define_insn "*<floatsuffix>floatv2div2sf2_mask_1"
5083   [(set (match_operand:V4SF 0 "register_operand" "=v")
5084     (vec_concat:V4SF
5085         (vec_merge:V2SF
5086                 (any_float:V2SF (match_operand:V2DI 1
5087                                   "nonimmediate_operand" "vm"))
5088             (const_vector:V2SF [(const_int 0) (const_int 0)])
5089             (match_operand:QI 2 "register_operand" "Yk"))
5090             (const_vector:V2SF [(const_int 0) (const_int 0)])))]
5091   "TARGET_AVX512DQ && TARGET_AVX512VL"
5092   "vcvt<floatsuffix>qq2ps{x}\t{%1, %0%{%2%}%{z%}|%0%{%2%}%{z%}, %1}"
5093   [(set_attr "type" "ssecvt")
5094    (set_attr "prefix" "evex")
5095    (set_attr "mode" "V4SF")])
5096
5097 (define_insn "ufloat<si2dfmodelower><mode>2<mask_name>"
5098   [(set (match_operand:VF2_512_256VL 0 "register_operand" "=v")
5099         (unsigned_float:VF2_512_256VL
5100           (match_operand:<si2dfmode> 1 "nonimmediate_operand" "vm")))]
5101    "TARGET_AVX512F"
5102    "vcvtudq2pd\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
5103    [(set_attr "type" "ssecvt")
5104     (set_attr "prefix" "evex")
5105     (set_attr "mode" "<MODE>")])
5106
5107 (define_insn "ufloatv2siv2df2<mask_name>"
5108   [(set (match_operand:V2DF 0 "register_operand" "=v")
5109         (unsigned_float:V2DF
5110           (vec_select:V2SI
5111             (match_operand:V4SI 1 "nonimmediate_operand" "vm")
5112             (parallel [(const_int 0) (const_int 1)]))))]
5113   "TARGET_AVX512VL"
5114   "vcvtudq2pd\t{%1, %0<mask_operand2>|%0<mask_operand2>, %q1}"
5115   [(set_attr "type" "ssecvt")
5116    (set_attr "prefix" "evex")
5117    (set_attr "mode" "V2DF")])
5118
5119 (define_insn "avx512f_cvtdq2pd512_2"
5120   [(set (match_operand:V8DF 0 "register_operand" "=v")
5121         (float:V8DF
5122           (vec_select:V8SI
5123             (match_operand:V16SI 1 "nonimmediate_operand" "vm")
5124             (parallel [(const_int 0) (const_int 1)
5125                        (const_int 2) (const_int 3)
5126                        (const_int 4) (const_int 5)
5127                        (const_int 6) (const_int 7)]))))]
5128   "TARGET_AVX512F"
5129   "vcvtdq2pd\t{%t1, %0|%0, %t1}"
5130   [(set_attr "type" "ssecvt")
5131    (set_attr "prefix" "evex")
5132    (set_attr "mode" "V8DF")])
5133
5134 (define_insn "avx_cvtdq2pd256_2"
5135   [(set (match_operand:V4DF 0 "register_operand" "=v")
5136         (float:V4DF
5137           (vec_select:V4SI
5138             (match_operand:V8SI 1 "nonimmediate_operand" "vm")
5139             (parallel [(const_int 0) (const_int 1)
5140                        (const_int 2) (const_int 3)]))))]
5141   "TARGET_AVX"
5142   "vcvtdq2pd\t{%x1, %0|%0, %x1}"
5143   [(set_attr "type" "ssecvt")
5144    (set_attr "prefix" "maybe_evex")
5145    (set_attr "mode" "V4DF")])
5146
5147 (define_insn "sse2_cvtdq2pd<mask_name>"
5148   [(set (match_operand:V2DF 0 "register_operand" "=v")
5149         (float:V2DF
5150           (vec_select:V2SI
5151             (match_operand:V4SI 1 "nonimmediate_operand" "vm")
5152             (parallel [(const_int 0) (const_int 1)]))))]
5153   "TARGET_SSE2 && <mask_avx512vl_condition>"
5154   "%vcvtdq2pd\t{%1, %0<mask_operand2>|%0<mask_operand2>, %q1}"
5155   [(set_attr "type" "ssecvt")
5156    (set_attr "prefix" "maybe_vex")
5157    (set_attr "mode" "V2DF")])
5158
5159 (define_insn "avx512f_cvtpd2dq512<mask_name><round_name>"
5160   [(set (match_operand:V8SI 0 "register_operand" "=v")
5161         (unspec:V8SI
5162           [(match_operand:V8DF 1 "<round_nimm_predicate>" "<round_constraint>")]
5163           UNSPEC_FIX_NOTRUNC))]
5164   "TARGET_AVX512F"
5165   "vcvtpd2dq\t{<round_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_mask_op2>}"
5166   [(set_attr "type" "ssecvt")
5167    (set_attr "prefix" "evex")
5168    (set_attr "mode" "OI")])
5169
5170 (define_insn "avx_cvtpd2dq256<mask_name>"
5171   [(set (match_operand:V4SI 0 "register_operand" "=v")
5172         (unspec:V4SI [(match_operand:V4DF 1 "nonimmediate_operand" "vm")]
5173                      UNSPEC_FIX_NOTRUNC))]
5174   "TARGET_AVX && <mask_avx512vl_condition>"
5175   "vcvtpd2dq{y}\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
5176   [(set_attr "type" "ssecvt")
5177    (set_attr "prefix" "<mask_prefix>")
5178    (set_attr "mode" "OI")])
5179
5180 (define_expand "avx_cvtpd2dq256_2"
5181   [(set (match_operand:V8SI 0 "register_operand")
5182         (vec_concat:V8SI
5183           (unspec:V4SI [(match_operand:V4DF 1 "nonimmediate_operand")]
5184                        UNSPEC_FIX_NOTRUNC)
5185           (match_dup 2)))]
5186   "TARGET_AVX"
5187   "operands[2] = CONST0_RTX (V4SImode);")
5188
5189 (define_insn "*avx_cvtpd2dq256_2"
5190   [(set (match_operand:V8SI 0 "register_operand" "=v")
5191         (vec_concat:V8SI
5192           (unspec:V4SI [(match_operand:V4DF 1 "nonimmediate_operand" "vm")]
5193                        UNSPEC_FIX_NOTRUNC)
5194           (match_operand:V4SI 2 "const0_operand")))]
5195   "TARGET_AVX"
5196   "vcvtpd2dq{y}\t{%1, %x0|%x0, %1}"
5197   [(set_attr "type" "ssecvt")
5198    (set_attr "prefix" "vex")
5199    (set_attr "btver2_decode" "vector")
5200    (set_attr "mode" "OI")])
5201
5202 (define_insn "sse2_cvtpd2dq<mask_name>"
5203   [(set (match_operand:V4SI 0 "register_operand" "=v")
5204         (vec_concat:V4SI
5205           (unspec:V2SI [(match_operand:V2DF 1 "vector_operand" "vBm")]
5206                        UNSPEC_FIX_NOTRUNC)
5207           (const_vector:V2SI [(const_int 0) (const_int 0)])))]
5208   "TARGET_SSE2 && <mask_avx512vl_condition>"
5209 {
5210   if (TARGET_AVX)
5211     return "vcvtpd2dq{x}\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}";
5212   else
5213     return "cvtpd2dq\t{%1, %0|%0, %1}";
5214 }
5215   [(set_attr "type" "ssecvt")
5216    (set_attr "prefix_rep" "1")
5217    (set_attr "prefix_data16" "0")
5218    (set_attr "prefix" "maybe_vex")
5219    (set_attr "mode" "TI")
5220    (set_attr "amdfam10_decode" "double")
5221    (set_attr "athlon_decode" "vector")
5222    (set_attr "bdver1_decode" "double")])
5223
5224 ;; For ufix_notrunc* insn patterns
5225 (define_mode_attr pd2udqsuff
5226   [(V8DF "") (V4DF "{y}")])
5227
5228 (define_insn "ufix_notrunc<mode><si2dfmodelower>2<mask_name><round_name>"
5229   [(set (match_operand:<si2dfmode> 0 "register_operand" "=v")
5230         (unspec:<si2dfmode>
5231           [(match_operand:VF2_512_256VL 1 "nonimmediate_operand" "<round_constraint>")]
5232           UNSPEC_UNSIGNED_FIX_NOTRUNC))]
5233   "TARGET_AVX512F"
5234   "vcvtpd2udq<pd2udqsuff>\t{<round_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_mask_op2>}"
5235   [(set_attr "type" "ssecvt")
5236    (set_attr "prefix" "evex")
5237    (set_attr "mode" "<sseinsnmode>")])
5238
5239 (define_insn "ufix_notruncv2dfv2si2<mask_name>"
5240   [(set (match_operand:V4SI 0 "register_operand" "=v")
5241         (vec_concat:V4SI
5242           (unspec:V2SI
5243             [(match_operand:V2DF 1 "nonimmediate_operand" "vm")]
5244             UNSPEC_UNSIGNED_FIX_NOTRUNC)
5245           (const_vector:V2SI [(const_int 0) (const_int 0)])))]
5246   "TARGET_AVX512VL"
5247   "vcvtpd2udq{x}\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
5248   [(set_attr "type" "ssecvt")
5249    (set_attr "prefix" "evex")
5250    (set_attr "mode" "TI")])
5251
5252 (define_insn "<fixsuffix>fix_truncv8dfv8si2<mask_name><round_saeonly_name>"
5253   [(set (match_operand:V8SI 0 "register_operand" "=v")
5254         (any_fix:V8SI
5255           (match_operand:V8DF 1 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")))]
5256   "TARGET_AVX512F"
5257   "vcvttpd2<fixsuffix>dq\t{<round_saeonly_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_saeonly_mask_op2>}"
5258   [(set_attr "type" "ssecvt")
5259    (set_attr "prefix" "evex")
5260    (set_attr "mode" "OI")])
5261
5262 (define_insn "ufix_truncv2dfv2si2<mask_name>"
5263   [(set (match_operand:V4SI 0 "register_operand" "=v")
5264         (vec_concat:V4SI
5265           (unsigned_fix:V2SI (match_operand:V2DF 1 "nonimmediate_operand" "vm"))
5266           (const_vector:V2SI [(const_int 0) (const_int 0)])))]
5267   "TARGET_AVX512VL"
5268   "vcvttpd2udq{x}\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
5269   [(set_attr "type" "ssecvt")
5270    (set_attr "prefix" "evex")
5271    (set_attr "mode" "TI")])
5272
5273 (define_insn "fix_truncv4dfv4si2<mask_name>"
5274   [(set (match_operand:V4SI 0 "register_operand" "=v")
5275         (fix:V4SI (match_operand:V4DF 1 "nonimmediate_operand" "vm")))]
5276   "TARGET_AVX || (TARGET_AVX512VL && TARGET_AVX512F)"
5277   "vcvttpd2dq{y}\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
5278   [(set_attr "type" "ssecvt")
5279    (set_attr "prefix" "maybe_evex")
5280    (set_attr "mode" "OI")])
5281
5282 (define_insn "ufix_truncv4dfv4si2<mask_name>"
5283   [(set (match_operand:V4SI 0 "register_operand" "=v")
5284         (unsigned_fix:V4SI (match_operand:V4DF 1 "nonimmediate_operand" "vm")))]
5285   "TARGET_AVX512VL && TARGET_AVX512F"
5286   "vcvttpd2udq{y}\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
5287   [(set_attr "type" "ssecvt")
5288    (set_attr "prefix" "maybe_evex")
5289    (set_attr "mode" "OI")])
5290
5291 (define_insn "<fixsuffix>fix_trunc<mode><sseintvecmodelower>2<mask_name><round_saeonly_name>"
5292   [(set (match_operand:<sseintvecmode> 0 "register_operand" "=v")
5293         (any_fix:<sseintvecmode>
5294           (match_operand:VF2_AVX512VL 1 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")))]
5295   "TARGET_AVX512DQ && <round_saeonly_mode512bit_condition>"
5296   "vcvttpd2<fixsuffix>qq\t{<round_saeonly_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_saeonly_mask_op2>}"
5297   [(set_attr "type" "ssecvt")
5298    (set_attr "prefix" "evex")
5299    (set_attr "mode" "<sseintvecmode2>")])
5300
5301 (define_insn "fix_notrunc<mode><sseintvecmodelower>2<mask_name><round_name>"
5302   [(set (match_operand:<sseintvecmode> 0 "register_operand" "=v")
5303         (unspec:<sseintvecmode>
5304           [(match_operand:VF2_AVX512VL 1 "<round_nimm_predicate>" "<round_constraint>")]
5305           UNSPEC_FIX_NOTRUNC))]
5306   "TARGET_AVX512DQ && <round_mode512bit_condition>"
5307   "vcvtpd2qq\t{<round_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_mask_op2>}"
5308   [(set_attr "type" "ssecvt")
5309    (set_attr "prefix" "evex")
5310    (set_attr "mode" "<sseintvecmode2>")])
5311
5312 (define_insn "ufix_notrunc<mode><sseintvecmodelower>2<mask_name><round_name>"
5313   [(set (match_operand:<sseintvecmode> 0 "register_operand" "=v")
5314         (unspec:<sseintvecmode>
5315           [(match_operand:VF2_AVX512VL 1 "nonimmediate_operand" "<round_constraint>")]
5316           UNSPEC_UNSIGNED_FIX_NOTRUNC))]
5317   "TARGET_AVX512DQ && <round_mode512bit_condition>"
5318   "vcvtpd2uqq\t{<round_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_mask_op2>}"
5319   [(set_attr "type" "ssecvt")
5320    (set_attr "prefix" "evex")
5321    (set_attr "mode" "<sseintvecmode2>")])
5322
5323 (define_insn "<fixsuffix>fix_trunc<mode><sselongvecmodelower>2<mask_name><round_saeonly_name>"
5324   [(set (match_operand:<sselongvecmode> 0 "register_operand" "=v")
5325         (any_fix:<sselongvecmode>
5326           (match_operand:VF1_128_256VL 1 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")))]
5327   "TARGET_AVX512DQ && <round_saeonly_modev8sf_condition>"
5328   "vcvttps2<fixsuffix>qq\t{<round_saeonly_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_saeonly_mask_op2>}"
5329   [(set_attr "type" "ssecvt")
5330    (set_attr "prefix" "evex")
5331    (set_attr "mode" "<sseintvecmode3>")])
5332
5333 (define_insn "<fixsuffix>fix_truncv2sfv2di2<mask_name>"
5334   [(set (match_operand:V2DI 0 "register_operand" "=v")
5335         (any_fix:V2DI
5336           (vec_select:V2SF
5337             (match_operand:V4SF 1 "nonimmediate_operand" "vm")
5338             (parallel [(const_int 0) (const_int 1)]))))]
5339   "TARGET_AVX512DQ && TARGET_AVX512VL"
5340   "vcvttps2<fixsuffix>qq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %q1}"
5341   [(set_attr "type" "ssecvt")
5342    (set_attr "prefix" "evex")
5343    (set_attr "mode" "TI")])
5344
5345 (define_insn "ufix_trunc<mode><sseintvecmodelower>2<mask_name>"
5346   [(set (match_operand:<sseintvecmode> 0 "register_operand" "=v")
5347         (unsigned_fix:<sseintvecmode>
5348           (match_operand:VF1_128_256VL 1 "nonimmediate_operand" "vm")))]
5349   "TARGET_AVX512VL"
5350   "vcvttps2udq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
5351   [(set_attr "type" "ssecvt")
5352    (set_attr "prefix" "evex")
5353    (set_attr "mode" "<sseintvecmode2>")])
5354
5355 (define_expand "avx_cvttpd2dq256_2"
5356   [(set (match_operand:V8SI 0 "register_operand")
5357         (vec_concat:V8SI
5358           (fix:V4SI (match_operand:V4DF 1 "nonimmediate_operand"))
5359           (match_dup 2)))]
5360   "TARGET_AVX"
5361   "operands[2] = CONST0_RTX (V4SImode);")
5362
5363 (define_insn "sse2_cvttpd2dq<mask_name>"
5364   [(set (match_operand:V4SI 0 "register_operand" "=v")
5365         (vec_concat:V4SI
5366           (fix:V2SI (match_operand:V2DF 1 "vector_operand" "vBm"))
5367           (const_vector:V2SI [(const_int 0) (const_int 0)])))]
5368   "TARGET_SSE2 && <mask_avx512vl_condition>"
5369 {
5370   if (TARGET_AVX)
5371     return "vcvttpd2dq{x}\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}";
5372   else
5373     return "cvttpd2dq\t{%1, %0|%0, %1}";
5374 }
5375   [(set_attr "type" "ssecvt")
5376    (set_attr "amdfam10_decode" "double")
5377    (set_attr "athlon_decode" "vector")
5378    (set_attr "bdver1_decode" "double")
5379    (set_attr "prefix" "maybe_vex")
5380    (set_attr "mode" "TI")])
5381
5382 (define_insn "sse2_cvtsd2ss<round_name>"
5383   [(set (match_operand:V4SF 0 "register_operand" "=x,x,v")
5384         (vec_merge:V4SF
5385           (vec_duplicate:V4SF
5386             (float_truncate:V2SF
5387               (match_operand:V2DF 2 "nonimmediate_operand" "x,m,<round_constraint>")))
5388           (match_operand:V4SF 1 "register_operand" "0,0,v")
5389           (const_int 1)))]
5390   "TARGET_SSE2"
5391   "@
5392    cvtsd2ss\t{%2, %0|%0, %2}
5393    cvtsd2ss\t{%2, %0|%0, %q2}
5394    vcvtsd2ss\t{<round_op3>%2, %1, %0|%0, %1, %q2<round_op3>}"
5395   [(set_attr "isa" "noavx,noavx,avx")
5396    (set_attr "type" "ssecvt")
5397    (set_attr "athlon_decode" "vector,double,*")
5398    (set_attr "amdfam10_decode" "vector,double,*")
5399    (set_attr "bdver1_decode" "direct,direct,*")
5400    (set_attr "btver2_decode" "double,double,double")
5401    (set_attr "prefix" "orig,orig,<round_prefix>")
5402    (set_attr "mode" "SF")])
5403
5404 (define_insn "*sse2_vd_cvtsd2ss"
5405   [(set (match_operand:V4SF 0 "register_operand" "=x,x,v")
5406         (vec_merge:V4SF
5407           (vec_duplicate:V4SF
5408             (float_truncate:SF (match_operand:DF 2 "nonimmediate_operand" "x,m,vm")))
5409           (match_operand:V4SF 1 "register_operand" "0,0,v")
5410           (const_int 1)))]
5411   "TARGET_SSE2"
5412   "@
5413    cvtsd2ss\t{%2, %0|%0, %2}
5414    cvtsd2ss\t{%2, %0|%0, %2}
5415    vcvtsd2ss\t{%2, %1, %0|%0, %1, %2}"
5416   [(set_attr "isa" "noavx,noavx,avx")
5417    (set_attr "type" "ssecvt")
5418    (set_attr "athlon_decode" "vector,double,*")
5419    (set_attr "amdfam10_decode" "vector,double,*")
5420    (set_attr "bdver1_decode" "direct,direct,*")
5421    (set_attr "btver2_decode" "double,double,double")
5422    (set_attr "prefix" "orig,orig,vex")
5423    (set_attr "mode" "SF")])
5424
5425 (define_insn "sse2_cvtss2sd<round_saeonly_name>"
5426   [(set (match_operand:V2DF 0 "register_operand" "=x,x,v")
5427         (vec_merge:V2DF
5428           (float_extend:V2DF
5429             (vec_select:V2SF
5430               (match_operand:V4SF 2 "<round_saeonly_nimm_scalar_predicate>" "x,m,<round_saeonly_constraint>")
5431               (parallel [(const_int 0) (const_int 1)])))
5432           (match_operand:V2DF 1 "register_operand" "0,0,v")
5433           (const_int 1)))]
5434   "TARGET_SSE2"
5435   "@
5436    cvtss2sd\t{%2, %0|%0, %2}
5437    cvtss2sd\t{%2, %0|%0, %k2}
5438    vcvtss2sd\t{<round_saeonly_op3>%2, %1, %0|%0, %1, %k2<round_saeonly_op3>}"
5439   [(set_attr "isa" "noavx,noavx,avx")
5440    (set_attr "type" "ssecvt")
5441    (set_attr "amdfam10_decode" "vector,double,*")
5442    (set_attr "athlon_decode" "direct,direct,*")
5443    (set_attr "bdver1_decode" "direct,direct,*")
5444    (set_attr "btver2_decode" "double,double,double")
5445    (set_attr "prefix" "orig,orig,<round_saeonly_prefix>")
5446    (set_attr "mode" "DF")])
5447
5448 (define_insn "*sse2_vd_cvtss2sd"
5449   [(set (match_operand:V2DF 0 "register_operand" "=x,x,v")
5450         (vec_merge:V2DF
5451           (vec_duplicate:V2DF
5452             (float_extend:DF (match_operand:SF 2 "nonimmediate_operand" "x,m,vm")))
5453           (match_operand:V2DF 1 "register_operand" "0,0,v")
5454           (const_int 1)))]
5455   "TARGET_SSE2"
5456   "@
5457    cvtss2sd\t{%2, %0|%0, %2}
5458    cvtss2sd\t{%2, %0|%0, %2}
5459    vcvtss2sd\t{%2, %1, %0|%0, %1, %2}"
5460   [(set_attr "isa" "noavx,noavx,avx")
5461    (set_attr "type" "ssecvt")
5462    (set_attr "amdfam10_decode" "vector,double,*")
5463    (set_attr "athlon_decode" "direct,direct,*")
5464    (set_attr "bdver1_decode" "direct,direct,*")
5465    (set_attr "btver2_decode" "double,double,double")
5466    (set_attr "prefix" "orig,orig,vex")
5467    (set_attr "mode" "DF")])
5468
5469 (define_insn "<mask_codefor>avx512f_cvtpd2ps512<mask_name><round_name>"
5470   [(set (match_operand:V8SF 0 "register_operand" "=v")
5471         (float_truncate:V8SF
5472           (match_operand:V8DF 1 "<round_nimm_predicate>" "<round_constraint>")))]
5473   "TARGET_AVX512F"
5474   "vcvtpd2ps\t{<round_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_mask_op2>}"
5475   [(set_attr "type" "ssecvt")
5476    (set_attr "prefix" "evex")
5477    (set_attr "mode" "V8SF")])
5478
5479 (define_insn "avx_cvtpd2ps256<mask_name>"
5480   [(set (match_operand:V4SF 0 "register_operand" "=v")
5481         (float_truncate:V4SF
5482           (match_operand:V4DF 1 "nonimmediate_operand" "vm")))]
5483   "TARGET_AVX && <mask_avx512vl_condition>"
5484   "vcvtpd2ps{y}\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
5485   [(set_attr "type" "ssecvt")
5486    (set_attr "prefix" "maybe_evex")
5487    (set_attr "btver2_decode" "vector")
5488    (set_attr "mode" "V4SF")])
5489
5490 (define_expand "sse2_cvtpd2ps"
5491   [(set (match_operand:V4SF 0 "register_operand")
5492         (vec_concat:V4SF
5493           (float_truncate:V2SF
5494             (match_operand:V2DF 1 "vector_operand"))
5495           (match_dup 2)))]
5496   "TARGET_SSE2"
5497   "operands[2] = CONST0_RTX (V2SFmode);")
5498
5499 (define_expand "sse2_cvtpd2ps_mask"
5500   [(set (match_operand:V4SF 0 "register_operand")
5501         (vec_merge:V4SF
5502           (vec_concat:V4SF
5503             (float_truncate:V2SF
5504               (match_operand:V2DF 1 "vector_operand"))
5505             (match_dup 4))
5506           (match_operand:V4SF 2 "register_operand")
5507           (match_operand:QI 3 "register_operand")))]
5508   "TARGET_SSE2"
5509   "operands[4] = CONST0_RTX (V2SFmode);")
5510
5511 (define_insn "*sse2_cvtpd2ps<mask_name>"
5512   [(set (match_operand:V4SF 0 "register_operand" "=v")
5513         (vec_concat:V4SF
5514           (float_truncate:V2SF
5515             (match_operand:V2DF 1 "vector_operand" "vBm"))
5516           (match_operand:V2SF 2 "const0_operand")))]
5517   "TARGET_SSE2 && <mask_avx512vl_condition>"
5518 {
5519   if (TARGET_AVX)
5520     return "vcvtpd2ps{x}\t{%1, %0<mask_operand3>|%0<mask_operand3>, %1}";
5521   else
5522     return "cvtpd2ps\t{%1, %0|%0, %1}";
5523 }
5524   [(set_attr "type" "ssecvt")
5525    (set_attr "amdfam10_decode" "double")
5526    (set_attr "athlon_decode" "vector")
5527    (set_attr "bdver1_decode" "double")
5528    (set_attr "prefix_data16" "1")
5529    (set_attr "prefix" "maybe_vex")
5530    (set_attr "mode" "V4SF")])
5531
5532 ;; For <sse2_avx_avx512f>_cvtps2pd<avxsizesuffix> insn pattern
5533 (define_mode_attr sf2dfmode
5534   [(V8DF "V8SF") (V4DF "V4SF")])
5535
5536 (define_insn "<sse2_avx_avx512f>_cvtps2pd<avxsizesuffix><mask_name><round_saeonly_name>"
5537   [(set (match_operand:VF2_512_256 0 "register_operand" "=v")
5538         (float_extend:VF2_512_256
5539           (match_operand:<sf2dfmode> 1 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")))]
5540   "TARGET_AVX && <mask_mode512bit_condition> && <round_saeonly_mode512bit_condition>"
5541   "vcvtps2pd\t{<round_saeonly_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_saeonly_mask_op2>}"
5542   [(set_attr "type" "ssecvt")
5543    (set_attr "prefix" "maybe_vex")
5544    (set_attr "mode" "<MODE>")])
5545
5546 (define_insn "*avx_cvtps2pd256_2"
5547   [(set (match_operand:V4DF 0 "register_operand" "=v")
5548         (float_extend:V4DF
5549           (vec_select:V4SF
5550             (match_operand:V8SF 1 "nonimmediate_operand" "vm")
5551             (parallel [(const_int 0) (const_int 1)
5552                        (const_int 2) (const_int 3)]))))]
5553   "TARGET_AVX"
5554   "vcvtps2pd\t{%x1, %0|%0, %x1}"
5555   [(set_attr "type" "ssecvt")
5556    (set_attr "prefix" "vex")
5557    (set_attr "mode" "V4DF")])
5558
5559 (define_insn "vec_unpacks_lo_v16sf"
5560   [(set (match_operand:V8DF 0 "register_operand" "=v")
5561         (float_extend:V8DF
5562           (vec_select:V8SF
5563             (match_operand:V16SF 1 "nonimmediate_operand" "vm")
5564             (parallel [(const_int 0) (const_int 1)
5565                        (const_int 2) (const_int 3)
5566                        (const_int 4) (const_int 5)
5567                        (const_int 6) (const_int 7)]))))]
5568   "TARGET_AVX512F"
5569   "vcvtps2pd\t{%t1, %0|%0, %t1}"
5570   [(set_attr "type" "ssecvt")
5571    (set_attr "prefix" "evex")
5572    (set_attr "mode" "V8DF")])
5573
5574 (define_insn "<avx512>_cvt<ssemodesuffix>2mask<mode>"
5575   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
5576         (unspec:<avx512fmaskmode>
5577          [(match_operand:VI12_AVX512VL 1 "register_operand" "v")]
5578          UNSPEC_CVTINT2MASK))]
5579   "TARGET_AVX512BW"
5580   "vpmov<ssemodesuffix>2m\t{%1, %0|%0, %1}"
5581   [(set_attr "prefix" "evex")
5582    (set_attr "mode" "<sseinsnmode>")])
5583
5584 (define_insn "<avx512>_cvt<ssemodesuffix>2mask<mode>"
5585   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
5586         (unspec:<avx512fmaskmode>
5587          [(match_operand:VI48_AVX512VL 1 "register_operand" "v")]
5588          UNSPEC_CVTINT2MASK))]
5589   "TARGET_AVX512DQ"
5590   "vpmov<ssemodesuffix>2m\t{%1, %0|%0, %1}"
5591   [(set_attr "prefix" "evex")
5592    (set_attr "mode" "<sseinsnmode>")])
5593
5594 (define_expand "<avx512>_cvtmask2<ssemodesuffix><mode>"
5595   [(set (match_operand:VI12_AVX512VL 0 "register_operand")
5596         (vec_merge:VI12_AVX512VL
5597           (match_dup 2)
5598           (match_dup 3)
5599           (match_operand:<avx512fmaskmode> 1 "register_operand")))]
5600   "TARGET_AVX512BW"
5601   {
5602     operands[2] = CONSTM1_RTX (<MODE>mode);
5603     operands[3] = CONST0_RTX (<MODE>mode);
5604   })
5605
5606 (define_insn "*<avx512>_cvtmask2<ssemodesuffix><mode>"
5607   [(set (match_operand:VI12_AVX512VL 0 "register_operand" "=v")
5608         (vec_merge:VI12_AVX512VL
5609           (match_operand:VI12_AVX512VL 2 "vector_all_ones_operand")
5610           (match_operand:VI12_AVX512VL 3 "const0_operand")
5611           (match_operand:<avx512fmaskmode> 1 "register_operand" "Yk")))]
5612   "TARGET_AVX512BW"
5613   "vpmovm2<ssemodesuffix>\t{%1, %0|%0, %1}"
5614   [(set_attr "prefix" "evex")
5615    (set_attr "mode" "<sseinsnmode>")])
5616
5617 (define_expand "<avx512>_cvtmask2<ssemodesuffix><mode>"
5618   [(set (match_operand:VI48_AVX512VL 0 "register_operand")
5619         (vec_merge:VI48_AVX512VL
5620           (match_dup 2)
5621           (match_dup 3)
5622           (match_operand:<avx512fmaskmode> 1 "register_operand")))]
5623   "TARGET_AVX512DQ"
5624   "{
5625     operands[2] = CONSTM1_RTX (<MODE>mode);
5626     operands[3] = CONST0_RTX (<MODE>mode);
5627   }")
5628
5629 (define_insn "*<avx512>_cvtmask2<ssemodesuffix><mode>"
5630   [(set (match_operand:VI48_AVX512VL 0 "register_operand" "=v")
5631         (vec_merge:VI48_AVX512VL
5632           (match_operand:VI48_AVX512VL 2 "vector_all_ones_operand")
5633           (match_operand:VI48_AVX512VL 3 "const0_operand")
5634           (match_operand:<avx512fmaskmode> 1 "register_operand" "Yk")))]
5635   "TARGET_AVX512DQ"
5636   "vpmovm2<ssemodesuffix>\t{%1, %0|%0, %1}"
5637   [(set_attr "prefix" "evex")
5638    (set_attr "mode" "<sseinsnmode>")])
5639
5640 (define_insn "sse2_cvtps2pd<mask_name>"
5641   [(set (match_operand:V2DF 0 "register_operand" "=v")
5642         (float_extend:V2DF
5643           (vec_select:V2SF
5644             (match_operand:V4SF 1 "vector_operand" "vm")
5645             (parallel [(const_int 0) (const_int 1)]))))]
5646   "TARGET_SSE2 && <mask_avx512vl_condition>"
5647   "%vcvtps2pd\t{%1, %0<mask_operand2>|%0<mask_operand2>, %q1}"
5648   [(set_attr "type" "ssecvt")
5649    (set_attr "amdfam10_decode" "direct")
5650    (set_attr "athlon_decode" "double")
5651    (set_attr "bdver1_decode" "double")
5652    (set_attr "prefix_data16" "0")
5653    (set_attr "prefix" "maybe_vex")
5654    (set_attr "mode" "V2DF")])
5655
5656 (define_expand "vec_unpacks_hi_v4sf"
5657   [(set (match_dup 2)
5658    (vec_select:V4SF
5659      (vec_concat:V8SF
5660        (match_dup 2)
5661        (match_operand:V4SF 1 "vector_operand"))
5662      (parallel [(const_int 6) (const_int 7)
5663                 (const_int 2) (const_int 3)])))
5664   (set (match_operand:V2DF 0 "register_operand")
5665    (float_extend:V2DF
5666      (vec_select:V2SF
5667        (match_dup 2)
5668        (parallel [(const_int 0) (const_int 1)]))))]
5669   "TARGET_SSE2"
5670   "operands[2] = gen_reg_rtx (V4SFmode);")
5671
5672 (define_expand "vec_unpacks_hi_v8sf"
5673   [(set (match_dup 2)
5674         (vec_select:V4SF
5675           (match_operand:V8SF 1 "register_operand")
5676           (parallel [(const_int 4) (const_int 5)
5677                      (const_int 6) (const_int 7)])))
5678    (set (match_operand:V4DF 0 "register_operand")
5679         (float_extend:V4DF
5680           (match_dup 2)))]
5681   "TARGET_AVX"
5682   "operands[2] = gen_reg_rtx (V4SFmode);")
5683
5684 (define_expand "vec_unpacks_hi_v16sf"
5685   [(set (match_dup 2)
5686         (vec_select:V8SF
5687           (match_operand:V16SF 1 "register_operand")
5688           (parallel [(const_int 8) (const_int 9)
5689                      (const_int 10) (const_int 11)
5690                      (const_int 12) (const_int 13)
5691                      (const_int 14) (const_int 15)])))
5692    (set (match_operand:V8DF 0 "register_operand")
5693         (float_extend:V8DF
5694           (match_dup 2)))]
5695 "TARGET_AVX512F"
5696 "operands[2] = gen_reg_rtx (V8SFmode);")
5697
5698 (define_expand "vec_unpacks_lo_v4sf"
5699   [(set (match_operand:V2DF 0 "register_operand")
5700         (float_extend:V2DF
5701           (vec_select:V2SF
5702             (match_operand:V4SF 1 "vector_operand")
5703             (parallel [(const_int 0) (const_int 1)]))))]
5704   "TARGET_SSE2")
5705
5706 (define_expand "vec_unpacks_lo_v8sf"
5707   [(set (match_operand:V4DF 0 "register_operand")
5708         (float_extend:V4DF
5709           (vec_select:V4SF
5710             (match_operand:V8SF 1 "nonimmediate_operand")
5711             (parallel [(const_int 0) (const_int 1)
5712                        (const_int 2) (const_int 3)]))))]
5713   "TARGET_AVX")
5714
5715 (define_mode_attr sseunpackfltmode
5716   [(V8HI "V4SF") (V4SI "V2DF") (V16HI "V8SF")
5717   (V8SI "V4DF") (V32HI "V16SF") (V16SI "V8DF")])
5718
5719 (define_expand "vec_unpacks_float_hi_<mode>"
5720   [(match_operand:<sseunpackfltmode> 0 "register_operand")
5721    (match_operand:VI2_AVX512F 1 "register_operand")]
5722   "TARGET_SSE2"
5723 {
5724   rtx tmp = gen_reg_rtx (<sseunpackmode>mode);
5725
5726   emit_insn (gen_vec_unpacks_hi_<mode> (tmp, operands[1]));
5727   emit_insn (gen_rtx_SET (operands[0],
5728                           gen_rtx_FLOAT (<sseunpackfltmode>mode, tmp)));
5729   DONE;
5730 })
5731
5732 (define_expand "vec_unpacks_float_lo_<mode>"
5733   [(match_operand:<sseunpackfltmode> 0 "register_operand")
5734    (match_operand:VI2_AVX512F 1 "register_operand")]
5735   "TARGET_SSE2"
5736 {
5737   rtx tmp = gen_reg_rtx (<sseunpackmode>mode);
5738
5739   emit_insn (gen_vec_unpacks_lo_<mode> (tmp, operands[1]));
5740   emit_insn (gen_rtx_SET (operands[0],
5741                           gen_rtx_FLOAT (<sseunpackfltmode>mode, tmp)));
5742   DONE;
5743 })
5744
5745 (define_expand "vec_unpacku_float_hi_<mode>"
5746   [(match_operand:<sseunpackfltmode> 0 "register_operand")
5747    (match_operand:VI2_AVX512F 1 "register_operand")]
5748   "TARGET_SSE2"
5749 {
5750   rtx tmp = gen_reg_rtx (<sseunpackmode>mode);
5751
5752   emit_insn (gen_vec_unpacku_hi_<mode> (tmp, operands[1]));
5753   emit_insn (gen_rtx_SET (operands[0],
5754                           gen_rtx_FLOAT (<sseunpackfltmode>mode, tmp)));
5755   DONE;
5756 })
5757
5758 (define_expand "vec_unpacku_float_lo_<mode>"
5759   [(match_operand:<sseunpackfltmode> 0 "register_operand")
5760    (match_operand:VI2_AVX512F 1 "register_operand")]
5761   "TARGET_SSE2"
5762 {
5763   rtx tmp = gen_reg_rtx (<sseunpackmode>mode);
5764
5765   emit_insn (gen_vec_unpacku_lo_<mode> (tmp, operands[1]));
5766   emit_insn (gen_rtx_SET (operands[0],
5767                           gen_rtx_FLOAT (<sseunpackfltmode>mode, tmp)));
5768   DONE;
5769 })
5770
5771 (define_expand "vec_unpacks_float_hi_v4si"
5772   [(set (match_dup 2)
5773         (vec_select:V4SI
5774           (match_operand:V4SI 1 "vector_operand")
5775           (parallel [(const_int 2) (const_int 3)
5776                      (const_int 2) (const_int 3)])))
5777    (set (match_operand:V2DF 0 "register_operand")
5778         (float:V2DF
5779           (vec_select:V2SI
5780           (match_dup 2)
5781             (parallel [(const_int 0) (const_int 1)]))))]
5782   "TARGET_SSE2"
5783   "operands[2] = gen_reg_rtx (V4SImode);")
5784
5785 (define_expand "vec_unpacks_float_lo_v4si"
5786   [(set (match_operand:V2DF 0 "register_operand")
5787         (float:V2DF
5788           (vec_select:V2SI
5789             (match_operand:V4SI 1 "vector_operand")
5790             (parallel [(const_int 0) (const_int 1)]))))]
5791   "TARGET_SSE2")
5792
5793 (define_expand "vec_unpacks_float_hi_v8si"
5794   [(set (match_dup 2)
5795         (vec_select:V4SI
5796           (match_operand:V8SI 1 "vector_operand")
5797           (parallel [(const_int 4) (const_int 5)
5798                      (const_int 6) (const_int 7)])))
5799    (set (match_operand:V4DF 0 "register_operand")
5800         (float:V4DF
5801           (match_dup 2)))]
5802   "TARGET_AVX"
5803   "operands[2] = gen_reg_rtx (V4SImode);")
5804
5805 (define_expand "vec_unpacks_float_lo_v8si"
5806   [(set (match_operand:V4DF 0 "register_operand")
5807         (float:V4DF
5808           (vec_select:V4SI
5809             (match_operand:V8SI 1 "nonimmediate_operand")
5810             (parallel [(const_int 0) (const_int 1)
5811                        (const_int 2) (const_int 3)]))))]
5812   "TARGET_AVX")
5813
5814 (define_expand "vec_unpacks_float_hi_v16si"
5815   [(set (match_dup 2)
5816         (vec_select:V8SI
5817           (match_operand:V16SI 1 "nonimmediate_operand")
5818           (parallel [(const_int 8) (const_int 9)
5819                      (const_int 10) (const_int 11)
5820                      (const_int 12) (const_int 13)
5821                      (const_int 14) (const_int 15)])))
5822    (set (match_operand:V8DF 0 "register_operand")
5823         (float:V8DF
5824           (match_dup 2)))]
5825   "TARGET_AVX512F"
5826   "operands[2] = gen_reg_rtx (V8SImode);")
5827
5828 (define_expand "vec_unpacks_float_lo_v16si"
5829   [(set (match_operand:V8DF 0 "register_operand")
5830         (float:V8DF
5831           (vec_select:V8SI
5832             (match_operand:V16SI 1 "nonimmediate_operand")
5833             (parallel [(const_int 0) (const_int 1)
5834                        (const_int 2) (const_int 3)
5835                        (const_int 4) (const_int 5)
5836                        (const_int 6) (const_int 7)]))))]
5837   "TARGET_AVX512F")
5838
5839 (define_expand "vec_unpacku_float_hi_v4si"
5840   [(set (match_dup 5)
5841         (vec_select:V4SI
5842           (match_operand:V4SI 1 "vector_operand")
5843           (parallel [(const_int 2) (const_int 3)
5844                      (const_int 2) (const_int 3)])))
5845    (set (match_dup 6)
5846         (float:V2DF
5847           (vec_select:V2SI
5848           (match_dup 5)
5849             (parallel [(const_int 0) (const_int 1)]))))
5850    (set (match_dup 7)
5851         (lt:V2DF (match_dup 6) (match_dup 3)))
5852    (set (match_dup 8)
5853         (and:V2DF (match_dup 7) (match_dup 4)))
5854    (set (match_operand:V2DF 0 "register_operand")
5855         (plus:V2DF (match_dup 6) (match_dup 8)))]
5856   "TARGET_SSE2"
5857 {
5858   REAL_VALUE_TYPE TWO32r;
5859   rtx x;
5860   int i;
5861
5862   real_ldexp (&TWO32r, &dconst1, 32);
5863   x = const_double_from_real_value (TWO32r, DFmode);
5864
5865   operands[3] = force_reg (V2DFmode, CONST0_RTX (V2DFmode));
5866   operands[4] = force_reg (V2DFmode,
5867                            ix86_build_const_vector (V2DFmode, 1, x));
5868
5869   operands[5] = gen_reg_rtx (V4SImode);
5870
5871   for (i = 6; i < 9; i++)
5872     operands[i] = gen_reg_rtx (V2DFmode);
5873 })
5874
5875 (define_expand "vec_unpacku_float_lo_v4si"
5876   [(set (match_dup 5)
5877         (float:V2DF
5878           (vec_select:V2SI
5879             (match_operand:V4SI 1 "vector_operand")
5880             (parallel [(const_int 0) (const_int 1)]))))
5881    (set (match_dup 6)
5882         (lt:V2DF (match_dup 5) (match_dup 3)))
5883    (set (match_dup 7)
5884         (and:V2DF (match_dup 6) (match_dup 4)))
5885    (set (match_operand:V2DF 0 "register_operand")
5886         (plus:V2DF (match_dup 5) (match_dup 7)))]
5887   "TARGET_SSE2"
5888 {
5889   REAL_VALUE_TYPE TWO32r;
5890   rtx x;
5891   int i;
5892
5893   real_ldexp (&TWO32r, &dconst1, 32);
5894   x = const_double_from_real_value (TWO32r, DFmode);
5895
5896   operands[3] = force_reg (V2DFmode, CONST0_RTX (V2DFmode));
5897   operands[4] = force_reg (V2DFmode,
5898                            ix86_build_const_vector (V2DFmode, 1, x));
5899
5900   for (i = 5; i < 8; i++)
5901     operands[i] = gen_reg_rtx (V2DFmode);
5902 })
5903
5904 (define_expand "vec_unpacku_float_hi_v8si"
5905   [(match_operand:V4DF 0 "register_operand")
5906    (match_operand:V8SI 1 "register_operand")]
5907   "TARGET_AVX"
5908 {
5909   REAL_VALUE_TYPE TWO32r;
5910   rtx x, tmp[6];
5911   int i;
5912
5913   real_ldexp (&TWO32r, &dconst1, 32);
5914   x = const_double_from_real_value (TWO32r, DFmode);
5915
5916   tmp[0] = force_reg (V4DFmode, CONST0_RTX (V4DFmode));
5917   tmp[1] = force_reg (V4DFmode, ix86_build_const_vector (V4DFmode, 1, x));
5918   tmp[5] = gen_reg_rtx (V4SImode);
5919
5920   for (i = 2; i < 5; i++)
5921     tmp[i] = gen_reg_rtx (V4DFmode);
5922   emit_insn (gen_vec_extract_hi_v8si (tmp[5], operands[1]));
5923   emit_insn (gen_floatv4siv4df2 (tmp[2], tmp[5]));
5924   emit_insn (gen_rtx_SET (tmp[3], gen_rtx_LT (V4DFmode, tmp[2], tmp[0])));
5925   emit_insn (gen_andv4df3 (tmp[4], tmp[3], tmp[1]));
5926   emit_insn (gen_addv4df3 (operands[0], tmp[2], tmp[4]));
5927   DONE;
5928 })
5929
5930 (define_expand "vec_unpacku_float_hi_v16si"
5931   [(match_operand:V8DF 0 "register_operand")
5932    (match_operand:V16SI 1 "register_operand")]
5933   "TARGET_AVX512F"
5934 {
5935   REAL_VALUE_TYPE TWO32r;
5936   rtx k, x, tmp[4];
5937
5938   real_ldexp (&TWO32r, &dconst1, 32);
5939   x = const_double_from_real_value (TWO32r, DFmode);
5940
5941   tmp[0] = force_reg (V8DFmode, CONST0_RTX (V8DFmode));
5942   tmp[1] = force_reg (V8DFmode, ix86_build_const_vector (V8DFmode, 1, x));
5943   tmp[2] = gen_reg_rtx (V8DFmode);
5944   tmp[3] = gen_reg_rtx (V8SImode);
5945   k = gen_reg_rtx (QImode);
5946
5947   emit_insn (gen_vec_extract_hi_v16si (tmp[3], operands[1]));
5948   emit_insn (gen_floatv8siv8df2 (tmp[2], tmp[3]));
5949   emit_insn (gen_rtx_SET (k, gen_rtx_LT (QImode, tmp[2], tmp[0])));
5950   emit_insn (gen_addv8df3_mask (tmp[2], tmp[2], tmp[1], tmp[2], k));
5951   emit_move_insn (operands[0], tmp[2]);
5952   DONE;
5953 })
5954
5955 (define_expand "vec_unpacku_float_lo_v8si"
5956   [(match_operand:V4DF 0 "register_operand")
5957    (match_operand:V8SI 1 "nonimmediate_operand")]
5958   "TARGET_AVX"
5959 {
5960   REAL_VALUE_TYPE TWO32r;
5961   rtx x, tmp[5];
5962   int i;
5963
5964   real_ldexp (&TWO32r, &dconst1, 32);
5965   x = const_double_from_real_value (TWO32r, DFmode);
5966
5967   tmp[0] = force_reg (V4DFmode, CONST0_RTX (V4DFmode));
5968   tmp[1] = force_reg (V4DFmode, ix86_build_const_vector (V4DFmode, 1, x));
5969
5970   for (i = 2; i < 5; i++)
5971     tmp[i] = gen_reg_rtx (V4DFmode);
5972   emit_insn (gen_avx_cvtdq2pd256_2 (tmp[2], operands[1]));
5973   emit_insn (gen_rtx_SET (tmp[3], gen_rtx_LT (V4DFmode, tmp[2], tmp[0])));
5974   emit_insn (gen_andv4df3 (tmp[4], tmp[3], tmp[1]));
5975   emit_insn (gen_addv4df3 (operands[0], tmp[2], tmp[4]));
5976   DONE;
5977 })
5978
5979 (define_expand "vec_unpacku_float_lo_v16si"
5980   [(match_operand:V8DF 0 "register_operand")
5981    (match_operand:V16SI 1 "nonimmediate_operand")]
5982   "TARGET_AVX512F"
5983 {
5984   REAL_VALUE_TYPE TWO32r;
5985   rtx k, x, tmp[3];
5986
5987   real_ldexp (&TWO32r, &dconst1, 32);
5988   x = const_double_from_real_value (TWO32r, DFmode);
5989
5990   tmp[0] = force_reg (V8DFmode, CONST0_RTX (V8DFmode));
5991   tmp[1] = force_reg (V8DFmode, ix86_build_const_vector (V8DFmode, 1, x));
5992   tmp[2] = gen_reg_rtx (V8DFmode);
5993   k = gen_reg_rtx (QImode);
5994
5995   emit_insn (gen_avx512f_cvtdq2pd512_2 (tmp[2], operands[1]));
5996   emit_insn (gen_rtx_SET (k, gen_rtx_LT (QImode, tmp[2], tmp[0])));
5997   emit_insn (gen_addv8df3_mask (tmp[2], tmp[2], tmp[1], tmp[2], k));
5998   emit_move_insn (operands[0], tmp[2]);
5999   DONE;
6000 })
6001
6002 (define_expand "vec_pack_trunc_<mode>"
6003   [(set (match_dup 3)
6004         (float_truncate:<sf2dfmode>
6005           (match_operand:VF2_512_256 1 "nonimmediate_operand")))
6006    (set (match_dup 4)
6007         (float_truncate:<sf2dfmode>
6008           (match_operand:VF2_512_256 2 "nonimmediate_operand")))
6009    (set (match_operand:<ssePSmode> 0 "register_operand")
6010         (vec_concat:<ssePSmode>
6011           (match_dup 3)
6012           (match_dup 4)))]
6013   "TARGET_AVX"
6014 {
6015   operands[3] = gen_reg_rtx (<sf2dfmode>mode);
6016   operands[4] = gen_reg_rtx (<sf2dfmode>mode);
6017 })
6018
6019 (define_expand "vec_pack_trunc_v2df"
6020   [(match_operand:V4SF 0 "register_operand")
6021    (match_operand:V2DF 1 "vector_operand")
6022    (match_operand:V2DF 2 "vector_operand")]
6023   "TARGET_SSE2"
6024 {
6025   rtx tmp0, tmp1;
6026
6027   if (TARGET_AVX && !TARGET_PREFER_AVX128 && optimize_insn_for_speed_p ())
6028     {
6029       tmp0 = gen_reg_rtx (V4DFmode);
6030       tmp1 = force_reg (V2DFmode, operands[1]);
6031
6032       emit_insn (gen_avx_vec_concatv4df (tmp0, tmp1, operands[2]));
6033       emit_insn (gen_avx_cvtpd2ps256 (operands[0], tmp0));
6034     }
6035   else
6036     {
6037       tmp0 = gen_reg_rtx (V4SFmode);
6038       tmp1 = gen_reg_rtx (V4SFmode);
6039
6040       emit_insn (gen_sse2_cvtpd2ps (tmp0, operands[1]));
6041       emit_insn (gen_sse2_cvtpd2ps (tmp1, operands[2]));
6042       emit_insn (gen_sse_movlhps (operands[0], tmp0, tmp1));
6043     }
6044   DONE;
6045 })
6046
6047 (define_expand "vec_pack_sfix_trunc_v8df"
6048   [(match_operand:V16SI 0 "register_operand")
6049    (match_operand:V8DF 1 "nonimmediate_operand")
6050    (match_operand:V8DF 2 "nonimmediate_operand")]
6051   "TARGET_AVX512F"
6052 {
6053   rtx r1, r2;
6054
6055   r1 = gen_reg_rtx (V8SImode);
6056   r2 = gen_reg_rtx (V8SImode);
6057
6058   emit_insn (gen_fix_truncv8dfv8si2 (r1, operands[1]));
6059   emit_insn (gen_fix_truncv8dfv8si2 (r2, operands[2]));
6060   emit_insn (gen_avx_vec_concatv16si (operands[0], r1, r2));
6061   DONE;
6062 })
6063
6064 (define_expand "vec_pack_sfix_trunc_v4df"
6065   [(match_operand:V8SI 0 "register_operand")
6066    (match_operand:V4DF 1 "nonimmediate_operand")
6067    (match_operand:V4DF 2 "nonimmediate_operand")]
6068   "TARGET_AVX"
6069 {
6070   rtx r1, r2;
6071
6072   r1 = gen_reg_rtx (V4SImode);
6073   r2 = gen_reg_rtx (V4SImode);
6074
6075   emit_insn (gen_fix_truncv4dfv4si2 (r1, operands[1]));
6076   emit_insn (gen_fix_truncv4dfv4si2 (r2, operands[2]));
6077   emit_insn (gen_avx_vec_concatv8si (operands[0], r1, r2));
6078   DONE;
6079 })
6080
6081 (define_expand "vec_pack_sfix_trunc_v2df"
6082   [(match_operand:V4SI 0 "register_operand")
6083    (match_operand:V2DF 1 "vector_operand")
6084    (match_operand:V2DF 2 "vector_operand")]
6085   "TARGET_SSE2"
6086 {
6087   rtx tmp0, tmp1, tmp2;
6088
6089   if (TARGET_AVX && !TARGET_PREFER_AVX128 && optimize_insn_for_speed_p ())
6090     {
6091       tmp0 = gen_reg_rtx (V4DFmode);
6092       tmp1 = force_reg (V2DFmode, operands[1]);
6093
6094       emit_insn (gen_avx_vec_concatv4df (tmp0, tmp1, operands[2]));
6095       emit_insn (gen_fix_truncv4dfv4si2 (operands[0], tmp0));
6096     }
6097   else
6098     {
6099       tmp0 = gen_reg_rtx (V4SImode);
6100       tmp1 = gen_reg_rtx (V4SImode);
6101       tmp2 = gen_reg_rtx (V2DImode);
6102
6103       emit_insn (gen_sse2_cvttpd2dq (tmp0, operands[1]));
6104       emit_insn (gen_sse2_cvttpd2dq (tmp1, operands[2]));
6105       emit_insn (gen_vec_interleave_lowv2di (tmp2,
6106                                              gen_lowpart (V2DImode, tmp0),
6107                                              gen_lowpart (V2DImode, tmp1)));
6108       emit_move_insn (operands[0], gen_lowpart (V4SImode, tmp2));
6109     }
6110   DONE;
6111 })
6112
6113 (define_mode_attr ssepackfltmode
6114   [(V8DF "V16SI") (V4DF "V8SI") (V2DF "V4SI")])
6115
6116 (define_expand "vec_pack_ufix_trunc_<mode>"
6117   [(match_operand:<ssepackfltmode> 0 "register_operand")
6118    (match_operand:VF2 1 "register_operand")
6119    (match_operand:VF2 2 "register_operand")]
6120   "TARGET_SSE2"
6121 {
6122   if (<MODE>mode == V8DFmode)
6123     {
6124       rtx r1, r2;
6125
6126       r1 = gen_reg_rtx (V8SImode);
6127       r2 = gen_reg_rtx (V8SImode);
6128
6129       emit_insn (gen_ufix_truncv8dfv8si2 (r1, operands[1]));
6130       emit_insn (gen_ufix_truncv8dfv8si2 (r2, operands[2]));
6131       emit_insn (gen_avx_vec_concatv16si (operands[0], r1, r2));
6132     }
6133   else
6134     {
6135       rtx tmp[7];
6136       tmp[0] = ix86_expand_adjust_ufix_to_sfix_si (operands[1], &tmp[2]);
6137       tmp[1] = ix86_expand_adjust_ufix_to_sfix_si (operands[2], &tmp[3]);
6138       tmp[4] = gen_reg_rtx (<ssepackfltmode>mode);
6139       emit_insn (gen_vec_pack_sfix_trunc_<mode> (tmp[4], tmp[0], tmp[1]));
6140       if (<ssepackfltmode>mode == V4SImode || TARGET_AVX2)
6141         {
6142           tmp[5] = gen_reg_rtx (<ssepackfltmode>mode);
6143           ix86_expand_vec_extract_even_odd (tmp[5], tmp[2], tmp[3], 0);
6144         }
6145       else
6146         {
6147           tmp[5] = gen_reg_rtx (V8SFmode);
6148           ix86_expand_vec_extract_even_odd (tmp[5],
6149                                             gen_lowpart (V8SFmode, tmp[2]),
6150                                             gen_lowpart (V8SFmode, tmp[3]), 0);
6151           tmp[5] = gen_lowpart (V8SImode, tmp[5]);
6152         }
6153       tmp[6] = expand_simple_binop (<ssepackfltmode>mode, XOR, tmp[4], tmp[5],
6154                                     operands[0], 0, OPTAB_DIRECT);
6155       if (tmp[6] != operands[0])
6156         emit_move_insn (operands[0], tmp[6]);
6157     }
6158
6159   DONE;
6160 })
6161
6162 (define_expand "avx512f_vec_pack_sfix_v8df"
6163   [(match_operand:V16SI 0 "register_operand")
6164    (match_operand:V8DF 1 "nonimmediate_operand")
6165    (match_operand:V8DF 2 "nonimmediate_operand")]
6166   "TARGET_AVX512F"
6167 {
6168   rtx r1, r2;
6169
6170   r1 = gen_reg_rtx (V8SImode);
6171   r2 = gen_reg_rtx (V8SImode);
6172
6173   emit_insn (gen_avx512f_cvtpd2dq512 (r1, operands[1]));
6174   emit_insn (gen_avx512f_cvtpd2dq512 (r2, operands[2]));
6175   emit_insn (gen_avx_vec_concatv16si (operands[0], r1, r2));
6176   DONE;
6177 })
6178
6179 (define_expand "vec_pack_sfix_v4df"
6180   [(match_operand:V8SI 0 "register_operand")
6181    (match_operand:V4DF 1 "nonimmediate_operand")
6182    (match_operand:V4DF 2 "nonimmediate_operand")]
6183   "TARGET_AVX"
6184 {
6185   rtx r1, r2;
6186
6187   r1 = gen_reg_rtx (V4SImode);
6188   r2 = gen_reg_rtx (V4SImode);
6189
6190   emit_insn (gen_avx_cvtpd2dq256 (r1, operands[1]));
6191   emit_insn (gen_avx_cvtpd2dq256 (r2, operands[2]));
6192   emit_insn (gen_avx_vec_concatv8si (operands[0], r1, r2));
6193   DONE;
6194 })
6195
6196 (define_expand "vec_pack_sfix_v2df"
6197   [(match_operand:V4SI 0 "register_operand")
6198    (match_operand:V2DF 1 "vector_operand")
6199    (match_operand:V2DF 2 "vector_operand")]
6200   "TARGET_SSE2"
6201 {
6202   rtx tmp0, tmp1, tmp2;
6203
6204   if (TARGET_AVX && !TARGET_PREFER_AVX128 && optimize_insn_for_speed_p ())
6205     {
6206       tmp0 = gen_reg_rtx (V4DFmode);
6207       tmp1 = force_reg (V2DFmode, operands[1]);
6208
6209       emit_insn (gen_avx_vec_concatv4df (tmp0, tmp1, operands[2]));
6210       emit_insn (gen_avx_cvtpd2dq256 (operands[0], tmp0));
6211     }
6212   else
6213     {
6214       tmp0 = gen_reg_rtx (V4SImode);
6215       tmp1 = gen_reg_rtx (V4SImode);
6216       tmp2 = gen_reg_rtx (V2DImode);
6217
6218       emit_insn (gen_sse2_cvtpd2dq (tmp0, operands[1]));
6219       emit_insn (gen_sse2_cvtpd2dq (tmp1, operands[2]));
6220       emit_insn (gen_vec_interleave_lowv2di (tmp2,
6221                                              gen_lowpart (V2DImode, tmp0),
6222                                              gen_lowpart (V2DImode, tmp1)));
6223       emit_move_insn (operands[0], gen_lowpart (V4SImode, tmp2));
6224     }
6225   DONE;
6226 })
6227
6228 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6229 ;;
6230 ;; Parallel single-precision floating point element swizzling
6231 ;;
6232 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6233
6234 (define_expand "sse_movhlps_exp"
6235   [(set (match_operand:V4SF 0 "nonimmediate_operand")
6236         (vec_select:V4SF
6237           (vec_concat:V8SF
6238             (match_operand:V4SF 1 "nonimmediate_operand")
6239             (match_operand:V4SF 2 "nonimmediate_operand"))
6240           (parallel [(const_int 6)
6241                      (const_int 7)
6242                      (const_int 2)
6243                      (const_int 3)])))]
6244   "TARGET_SSE"
6245 {
6246   rtx dst = ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);
6247
6248   emit_insn (gen_sse_movhlps (dst, operands[1], operands[2]));
6249
6250   /* Fix up the destination if needed.  */
6251   if (dst != operands[0])
6252     emit_move_insn (operands[0], dst);
6253
6254   DONE;
6255 })
6256
6257 (define_insn "sse_movhlps"
6258   [(set (match_operand:V4SF 0 "nonimmediate_operand"     "=x,v,x,v,m")
6259         (vec_select:V4SF
6260           (vec_concat:V8SF
6261             (match_operand:V4SF 1 "nonimmediate_operand" " 0,v,0,v,0")
6262             (match_operand:V4SF 2 "nonimmediate_operand" " x,v,o,o,v"))
6263           (parallel [(const_int 6)
6264                      (const_int 7)
6265                      (const_int 2)
6266                      (const_int 3)])))]
6267   "TARGET_SSE && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
6268   "@
6269    movhlps\t{%2, %0|%0, %2}
6270    vmovhlps\t{%2, %1, %0|%0, %1, %2}
6271    movlps\t{%H2, %0|%0, %H2}
6272    vmovlps\t{%H2, %1, %0|%0, %1, %H2}
6273    %vmovhps\t{%2, %0|%q0, %2}"
6274   [(set_attr "isa" "noavx,avx,noavx,avx,*")
6275    (set_attr "type" "ssemov")
6276    (set_attr "prefix" "orig,maybe_evex,orig,maybe_evex,maybe_vex")
6277    (set_attr "mode" "V4SF,V4SF,V2SF,V2SF,V2SF")])
6278
6279 (define_expand "sse_movlhps_exp"
6280   [(set (match_operand:V4SF 0 "nonimmediate_operand")
6281         (vec_select:V4SF
6282           (vec_concat:V8SF
6283             (match_operand:V4SF 1 "nonimmediate_operand")
6284             (match_operand:V4SF 2 "nonimmediate_operand"))
6285           (parallel [(const_int 0)
6286                      (const_int 1)
6287                      (const_int 4)
6288                      (const_int 5)])))]
6289   "TARGET_SSE"
6290 {
6291   rtx dst = ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);
6292
6293   emit_insn (gen_sse_movlhps (dst, operands[1], operands[2]));
6294
6295   /* Fix up the destination if needed.  */
6296   if (dst != operands[0])
6297     emit_move_insn (operands[0], dst);
6298
6299   DONE;
6300 })
6301
6302 (define_insn "sse_movlhps"
6303   [(set (match_operand:V4SF 0 "nonimmediate_operand"     "=x,v,x,v,o")
6304         (vec_select:V4SF
6305           (vec_concat:V8SF
6306             (match_operand:V4SF 1 "nonimmediate_operand" " 0,v,0,v,0")
6307             (match_operand:V4SF 2 "nonimmediate_operand" " x,v,m,v,v"))
6308           (parallel [(const_int 0)
6309                      (const_int 1)
6310                      (const_int 4)
6311                      (const_int 5)])))]
6312   "TARGET_SSE && ix86_binary_operator_ok (UNKNOWN, V4SFmode, operands)"
6313   "@
6314    movlhps\t{%2, %0|%0, %2}
6315    vmovlhps\t{%2, %1, %0|%0, %1, %2}
6316    movhps\t{%2, %0|%0, %q2}
6317    vmovhps\t{%2, %1, %0|%0, %1, %q2}
6318    %vmovlps\t{%2, %H0|%H0, %2}"
6319   [(set_attr "isa" "noavx,avx,noavx,avx,*")
6320    (set_attr "type" "ssemov")
6321    (set_attr "prefix" "orig,maybe_evex,orig,maybe_evex,maybe_vex")
6322    (set_attr "mode" "V4SF,V4SF,V2SF,V2SF,V2SF")])
6323
6324 (define_insn "<mask_codefor>avx512f_unpckhps512<mask_name>"
6325   [(set (match_operand:V16SF 0 "register_operand" "=v")
6326         (vec_select:V16SF
6327           (vec_concat:V32SF
6328             (match_operand:V16SF 1 "register_operand" "v")
6329             (match_operand:V16SF 2 "nonimmediate_operand" "vm"))
6330           (parallel [(const_int 2) (const_int 18)
6331                      (const_int 3) (const_int 19)
6332                      (const_int 6) (const_int 22)
6333                      (const_int 7) (const_int 23)
6334                      (const_int 10) (const_int 26)
6335                      (const_int 11) (const_int 27)
6336                      (const_int 14) (const_int 30)
6337                      (const_int 15) (const_int 31)])))]
6338   "TARGET_AVX512F"
6339   "vunpckhps\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
6340   [(set_attr "type" "sselog")
6341    (set_attr "prefix" "evex")
6342    (set_attr "mode" "V16SF")])
6343
6344 ;; Recall that the 256-bit unpck insns only shuffle within their lanes.
6345 (define_insn "avx_unpckhps256<mask_name>"
6346   [(set (match_operand:V8SF 0 "register_operand" "=v")
6347         (vec_select:V8SF
6348           (vec_concat:V16SF
6349             (match_operand:V8SF 1 "register_operand" "v")
6350             (match_operand:V8SF 2 "nonimmediate_operand" "vm"))
6351           (parallel [(const_int 2) (const_int 10)
6352                      (const_int 3) (const_int 11)
6353                      (const_int 6) (const_int 14)
6354                      (const_int 7) (const_int 15)])))]
6355   "TARGET_AVX && <mask_avx512vl_condition>"
6356   "vunpckhps\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
6357   [(set_attr "type" "sselog")
6358    (set_attr "prefix" "vex")
6359    (set_attr "mode" "V8SF")])
6360
6361 (define_expand "vec_interleave_highv8sf"
6362   [(set (match_dup 3)
6363         (vec_select:V8SF
6364           (vec_concat:V16SF
6365             (match_operand:V8SF 1 "register_operand")
6366             (match_operand:V8SF 2 "nonimmediate_operand"))
6367           (parallel [(const_int 0) (const_int 8)
6368                      (const_int 1) (const_int 9)
6369                      (const_int 4) (const_int 12)
6370                      (const_int 5) (const_int 13)])))
6371    (set (match_dup 4)
6372         (vec_select:V8SF
6373           (vec_concat:V16SF
6374             (match_dup 1)
6375             (match_dup 2))
6376           (parallel [(const_int 2) (const_int 10)
6377                      (const_int 3) (const_int 11)
6378                      (const_int 6) (const_int 14)
6379                      (const_int 7) (const_int 15)])))
6380    (set (match_operand:V8SF 0 "register_operand")
6381         (vec_select:V8SF
6382           (vec_concat:V16SF
6383             (match_dup 3)
6384             (match_dup 4))
6385           (parallel [(const_int 4) (const_int 5)
6386                      (const_int 6) (const_int 7)
6387                      (const_int 12) (const_int 13)
6388                      (const_int 14) (const_int 15)])))]
6389  "TARGET_AVX"
6390 {
6391   operands[3] = gen_reg_rtx (V8SFmode);
6392   operands[4] = gen_reg_rtx (V8SFmode);
6393 })
6394
6395 (define_insn "vec_interleave_highv4sf<mask_name>"
6396   [(set (match_operand:V4SF 0 "register_operand" "=x,v")
6397         (vec_select:V4SF
6398           (vec_concat:V8SF
6399             (match_operand:V4SF 1 "register_operand" "0,v")
6400             (match_operand:V4SF 2 "vector_operand" "xBm,vm"))
6401           (parallel [(const_int 2) (const_int 6)
6402                      (const_int 3) (const_int 7)])))]
6403   "TARGET_SSE && <mask_avx512vl_condition>"
6404   "@
6405    unpckhps\t{%2, %0|%0, %2}
6406    vunpckhps\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
6407   [(set_attr "isa" "noavx,avx")
6408    (set_attr "type" "sselog")
6409    (set_attr "prefix" "orig,vex")
6410    (set_attr "mode" "V4SF")])
6411
6412 (define_insn "<mask_codefor>avx512f_unpcklps512<mask_name>"
6413   [(set (match_operand:V16SF 0 "register_operand" "=v")
6414         (vec_select:V16SF
6415           (vec_concat:V32SF
6416             (match_operand:V16SF 1 "register_operand" "v")
6417             (match_operand:V16SF 2 "nonimmediate_operand" "vm"))
6418           (parallel [(const_int 0) (const_int 16)
6419                      (const_int 1) (const_int 17)
6420                      (const_int 4) (const_int 20)
6421                      (const_int 5) (const_int 21)
6422                      (const_int 8) (const_int 24)
6423                      (const_int 9) (const_int 25)
6424                      (const_int 12) (const_int 28)
6425                      (const_int 13) (const_int 29)])))]
6426   "TARGET_AVX512F"
6427   "vunpcklps\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
6428   [(set_attr "type" "sselog")
6429    (set_attr "prefix" "evex")
6430    (set_attr "mode" "V16SF")])
6431
6432 ;; Recall that the 256-bit unpck insns only shuffle within their lanes.
6433 (define_insn "avx_unpcklps256<mask_name>"
6434   [(set (match_operand:V8SF 0 "register_operand" "=v")
6435         (vec_select:V8SF
6436           (vec_concat:V16SF
6437             (match_operand:V8SF 1 "register_operand" "v")
6438             (match_operand:V8SF 2 "nonimmediate_operand" "vm"))
6439           (parallel [(const_int 0) (const_int 8)
6440                      (const_int 1) (const_int 9)
6441                      (const_int 4) (const_int 12)
6442                      (const_int 5) (const_int 13)])))]
6443   "TARGET_AVX && <mask_avx512vl_condition>"
6444   "vunpcklps\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
6445   [(set_attr "type" "sselog")
6446    (set_attr "prefix" "vex")
6447    (set_attr "mode" "V8SF")])
6448
6449 (define_insn "unpcklps128_mask"
6450   [(set (match_operand:V4SF 0 "register_operand" "=v")
6451         (vec_merge:V4SF
6452           (vec_select:V4SF
6453             (vec_concat:V8SF
6454               (match_operand:V4SF 1 "register_operand" "v")
6455               (match_operand:V4SF 2 "nonimmediate_operand" "vm"))
6456             (parallel [(const_int 0) (const_int 4)
6457                       (const_int 1) (const_int 5)]))
6458           (match_operand:V4SF 3 "vector_move_operand" "0C")
6459           (match_operand:QI 4 "register_operand" "Yk")))]
6460   "TARGET_AVX512VL"
6461   "vunpcklps\t{%2, %1, %0%{%4%}%N3|%0%{%4%}%N3, %1, %2}"
6462   [(set_attr "type" "sselog")
6463    (set_attr "prefix" "evex")
6464    (set_attr "mode" "V4SF")])
6465
6466 (define_expand "vec_interleave_lowv8sf"
6467   [(set (match_dup 3)
6468         (vec_select:V8SF
6469           (vec_concat:V16SF
6470             (match_operand:V8SF 1 "register_operand")
6471             (match_operand:V8SF 2 "nonimmediate_operand"))
6472           (parallel [(const_int 0) (const_int 8)
6473                      (const_int 1) (const_int 9)
6474                      (const_int 4) (const_int 12)
6475                      (const_int 5) (const_int 13)])))
6476    (set (match_dup 4)
6477         (vec_select:V8SF
6478           (vec_concat:V16SF
6479             (match_dup 1)
6480             (match_dup 2))
6481           (parallel [(const_int 2) (const_int 10)
6482                      (const_int 3) (const_int 11)
6483                      (const_int 6) (const_int 14)
6484                      (const_int 7) (const_int 15)])))
6485    (set (match_operand:V8SF 0 "register_operand")
6486         (vec_select:V8SF
6487           (vec_concat:V16SF
6488             (match_dup 3)
6489             (match_dup 4))
6490           (parallel [(const_int 0) (const_int 1)
6491                      (const_int 2) (const_int 3)
6492                      (const_int 8) (const_int 9)
6493                      (const_int 10) (const_int 11)])))]
6494  "TARGET_AVX"
6495 {
6496   operands[3] = gen_reg_rtx (V8SFmode);
6497   operands[4] = gen_reg_rtx (V8SFmode);
6498 })
6499
6500 (define_insn "vec_interleave_lowv4sf"
6501   [(set (match_operand:V4SF 0 "register_operand" "=x,v")
6502         (vec_select:V4SF
6503           (vec_concat:V8SF
6504             (match_operand:V4SF 1 "register_operand" "0,v")
6505             (match_operand:V4SF 2 "vector_operand" "xBm,vm"))
6506           (parallel [(const_int 0) (const_int 4)
6507                      (const_int 1) (const_int 5)])))]
6508   "TARGET_SSE"
6509   "@
6510    unpcklps\t{%2, %0|%0, %2}
6511    vunpcklps\t{%2, %1, %0|%0, %1, %2}"
6512   [(set_attr "isa" "noavx,avx")
6513    (set_attr "type" "sselog")
6514    (set_attr "prefix" "orig,maybe_evex")
6515    (set_attr "mode" "V4SF")])
6516
6517 ;; These are modeled with the same vec_concat as the others so that we
6518 ;; capture users of shufps that can use the new instructions
6519 (define_insn "avx_movshdup256<mask_name>"
6520   [(set (match_operand:V8SF 0 "register_operand" "=v")
6521         (vec_select:V8SF
6522           (vec_concat:V16SF
6523             (match_operand:V8SF 1 "nonimmediate_operand" "vm")
6524             (match_dup 1))
6525           (parallel [(const_int 1) (const_int 1)
6526                      (const_int 3) (const_int 3)
6527                      (const_int 5) (const_int 5)
6528                      (const_int 7) (const_int 7)])))]
6529   "TARGET_AVX && <mask_avx512vl_condition>"
6530   "vmovshdup\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
6531   [(set_attr "type" "sse")
6532    (set_attr "prefix" "vex")
6533    (set_attr "mode" "V8SF")])
6534
6535 (define_insn "sse3_movshdup<mask_name>"
6536   [(set (match_operand:V4SF 0 "register_operand" "=v")
6537         (vec_select:V4SF
6538           (vec_concat:V8SF
6539             (match_operand:V4SF 1 "vector_operand" "vBm")
6540             (match_dup 1))
6541           (parallel [(const_int 1)
6542                      (const_int 1)
6543                      (const_int 7)
6544                      (const_int 7)])))]
6545   "TARGET_SSE3 && <mask_avx512vl_condition>"
6546   "%vmovshdup\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
6547   [(set_attr "type" "sse")
6548    (set_attr "prefix_rep" "1")
6549    (set_attr "prefix" "maybe_vex")
6550    (set_attr "mode" "V4SF")])
6551
6552 (define_insn "<mask_codefor>avx512f_movshdup512<mask_name>"
6553   [(set (match_operand:V16SF 0 "register_operand" "=v")
6554         (vec_select:V16SF
6555           (vec_concat:V32SF
6556             (match_operand:V16SF 1 "nonimmediate_operand" "vm")
6557             (match_dup 1))
6558           (parallel [(const_int 1) (const_int 1)
6559                      (const_int 3) (const_int 3)
6560                      (const_int 5) (const_int 5)
6561                      (const_int 7) (const_int 7)
6562                      (const_int 9) (const_int 9)
6563                      (const_int 11) (const_int 11)
6564                      (const_int 13) (const_int 13)
6565                      (const_int 15) (const_int 15)])))]
6566   "TARGET_AVX512F"
6567   "vmovshdup\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
6568   [(set_attr "type" "sse")
6569    (set_attr "prefix" "evex")
6570    (set_attr "mode" "V16SF")])
6571
6572 (define_insn "avx_movsldup256<mask_name>"
6573   [(set (match_operand:V8SF 0 "register_operand" "=v")
6574         (vec_select:V8SF
6575           (vec_concat:V16SF
6576             (match_operand:V8SF 1 "nonimmediate_operand" "vm")
6577             (match_dup 1))
6578           (parallel [(const_int 0) (const_int 0)
6579                      (const_int 2) (const_int 2)
6580                      (const_int 4) (const_int 4)
6581                      (const_int 6) (const_int 6)])))]
6582   "TARGET_AVX && <mask_avx512vl_condition>"
6583   "vmovsldup\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
6584   [(set_attr "type" "sse")
6585    (set_attr "prefix" "vex")
6586    (set_attr "mode" "V8SF")])
6587
6588 (define_insn "sse3_movsldup<mask_name>"
6589   [(set (match_operand:V4SF 0 "register_operand" "=v")
6590         (vec_select:V4SF
6591           (vec_concat:V8SF
6592             (match_operand:V4SF 1 "vector_operand" "vBm")
6593             (match_dup 1))
6594           (parallel [(const_int 0)
6595                      (const_int 0)
6596                      (const_int 6)
6597                      (const_int 6)])))]
6598   "TARGET_SSE3 && <mask_avx512vl_condition>"
6599   "%vmovsldup\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
6600   [(set_attr "type" "sse")
6601    (set_attr "prefix_rep" "1")
6602    (set_attr "prefix" "maybe_vex")
6603    (set_attr "mode" "V4SF")])
6604
6605 (define_insn "<mask_codefor>avx512f_movsldup512<mask_name>"
6606   [(set (match_operand:V16SF 0 "register_operand" "=v")
6607         (vec_select:V16SF
6608           (vec_concat:V32SF
6609             (match_operand:V16SF 1 "nonimmediate_operand" "vm")
6610             (match_dup 1))
6611           (parallel [(const_int 0) (const_int 0)
6612                      (const_int 2) (const_int 2)
6613                      (const_int 4) (const_int 4)
6614                      (const_int 6) (const_int 6)
6615                      (const_int 8) (const_int 8)
6616                      (const_int 10) (const_int 10)
6617                      (const_int 12) (const_int 12)
6618                      (const_int 14) (const_int 14)])))]
6619   "TARGET_AVX512F"
6620   "vmovsldup\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
6621   [(set_attr "type" "sse")
6622    (set_attr "prefix" "evex")
6623    (set_attr "mode" "V16SF")])
6624
6625 (define_expand "avx_shufps256<mask_expand4_name>"
6626   [(match_operand:V8SF 0 "register_operand")
6627    (match_operand:V8SF 1 "register_operand")
6628    (match_operand:V8SF 2 "nonimmediate_operand")
6629    (match_operand:SI 3 "const_int_operand")]
6630   "TARGET_AVX"
6631 {
6632   int mask = INTVAL (operands[3]);
6633   emit_insn (gen_avx_shufps256_1<mask_expand4_name> (operands[0],
6634                                                      operands[1],
6635                                                      operands[2],
6636                                                      GEN_INT ((mask >> 0) & 3),
6637                                                      GEN_INT ((mask >> 2) & 3),
6638                                                      GEN_INT (((mask >> 4) & 3) + 8),
6639                                                      GEN_INT (((mask >> 6) & 3) + 8),
6640                                                      GEN_INT (((mask >> 0) & 3) + 4),
6641                                                      GEN_INT (((mask >> 2) & 3) + 4),
6642                                                      GEN_INT (((mask >> 4) & 3) + 12),
6643                                                      GEN_INT (((mask >> 6) & 3) + 12)
6644                                                      <mask_expand4_args>));
6645   DONE;
6646 })
6647
6648 ;; One bit in mask selects 2 elements.
6649 (define_insn "avx_shufps256_1<mask_name>"
6650   [(set (match_operand:V8SF 0 "register_operand" "=v")
6651         (vec_select:V8SF
6652           (vec_concat:V16SF
6653             (match_operand:V8SF 1 "register_operand" "v")
6654             (match_operand:V8SF 2 "nonimmediate_operand" "vm"))
6655           (parallel [(match_operand 3  "const_0_to_3_operand"  )
6656                      (match_operand 4  "const_0_to_3_operand"  )
6657                      (match_operand 5  "const_8_to_11_operand" )
6658                      (match_operand 6  "const_8_to_11_operand" )
6659                      (match_operand 7  "const_4_to_7_operand"  )
6660                      (match_operand 8  "const_4_to_7_operand"  )
6661                      (match_operand 9  "const_12_to_15_operand")
6662                      (match_operand 10 "const_12_to_15_operand")])))]
6663   "TARGET_AVX
6664    && <mask_avx512vl_condition>
6665    && (INTVAL (operands[3]) == (INTVAL (operands[7]) - 4)
6666        && INTVAL (operands[4]) == (INTVAL (operands[8]) - 4)
6667        && INTVAL (operands[5]) == (INTVAL (operands[9]) - 4)
6668        && INTVAL (operands[6]) == (INTVAL (operands[10]) - 4))"
6669 {
6670   int mask;
6671   mask = INTVAL (operands[3]);
6672   mask |= INTVAL (operands[4]) << 2;
6673   mask |= (INTVAL (operands[5]) - 8) << 4;
6674   mask |= (INTVAL (operands[6]) - 8) << 6;
6675   operands[3] = GEN_INT (mask);
6676
6677   return "vshufps\t{%3, %2, %1, %0<mask_operand11>|%0<mask_operand11>, %1, %2, %3}";
6678 }
6679   [(set_attr "type" "sseshuf")
6680    (set_attr "length_immediate" "1")
6681    (set_attr "prefix" "<mask_prefix>")
6682    (set_attr "mode" "V8SF")])
6683
6684 (define_expand "sse_shufps<mask_expand4_name>"
6685   [(match_operand:V4SF 0 "register_operand")
6686    (match_operand:V4SF 1 "register_operand")
6687    (match_operand:V4SF 2 "vector_operand")
6688    (match_operand:SI 3 "const_int_operand")]
6689   "TARGET_SSE"
6690 {
6691   int mask = INTVAL (operands[3]);
6692   emit_insn (gen_sse_shufps_v4sf<mask_expand4_name> (operands[0],
6693                                                      operands[1],
6694                                                      operands[2],
6695                                                      GEN_INT ((mask >> 0) & 3),
6696                                                      GEN_INT ((mask >> 2) & 3),
6697                                                      GEN_INT (((mask >> 4) & 3) + 4),
6698                                                      GEN_INT (((mask >> 6) & 3) + 4)
6699                                                      <mask_expand4_args>));
6700   DONE;
6701 })
6702
6703 (define_insn "sse_shufps_v4sf_mask"
6704   [(set (match_operand:V4SF 0 "register_operand" "=v")
6705     (vec_merge:V4SF
6706           (vec_select:V4SF
6707             (vec_concat:V8SF
6708               (match_operand:V4SF 1 "register_operand" "v")
6709               (match_operand:V4SF 2 "nonimmediate_operand" "vm"))
6710             (parallel [(match_operand 3 "const_0_to_3_operand")
6711                        (match_operand 4 "const_0_to_3_operand")
6712                        (match_operand 5 "const_4_to_7_operand")
6713                        (match_operand 6 "const_4_to_7_operand")]))
6714       (match_operand:V4SF 7 "vector_move_operand" "0C")
6715       (match_operand:QI 8 "register_operand" "Yk")))]
6716   "TARGET_AVX512VL"
6717 {
6718   int mask = 0;
6719   mask |= INTVAL (operands[3]) << 0;
6720   mask |= INTVAL (operands[4]) << 2;
6721   mask |= (INTVAL (operands[5]) - 4) << 4;
6722   mask |= (INTVAL (operands[6]) - 4) << 6;
6723   operands[3] = GEN_INT (mask);
6724
6725   return "vshufps\t{%3, %2, %1, %0%{%8%}%N7|%0%{%8%}%N7, %1, %2, %3}";
6726 }
6727   [(set_attr "type" "sseshuf")
6728    (set_attr "length_immediate" "1")
6729    (set_attr "prefix" "evex")
6730    (set_attr "mode" "V4SF")])
6731
6732 (define_insn "sse_shufps_<mode>"
6733   [(set (match_operand:VI4F_128 0 "register_operand" "=x,v")
6734         (vec_select:VI4F_128
6735           (vec_concat:<ssedoublevecmode>
6736             (match_operand:VI4F_128 1 "register_operand" "0,v")
6737             (match_operand:VI4F_128 2 "vector_operand" "xBm,vm"))
6738           (parallel [(match_operand 3 "const_0_to_3_operand")
6739                      (match_operand 4 "const_0_to_3_operand")
6740                      (match_operand 5 "const_4_to_7_operand")
6741                      (match_operand 6 "const_4_to_7_operand")])))]
6742   "TARGET_SSE"
6743 {
6744   int mask = 0;
6745   mask |= INTVAL (operands[3]) << 0;
6746   mask |= INTVAL (operands[4]) << 2;
6747   mask |= (INTVAL (operands[5]) - 4) << 4;
6748   mask |= (INTVAL (operands[6]) - 4) << 6;
6749   operands[3] = GEN_INT (mask);
6750
6751   switch (which_alternative)
6752     {
6753     case 0:
6754       return "shufps\t{%3, %2, %0|%0, %2, %3}";
6755     case 1:
6756       return "vshufps\t{%3, %2, %1, %0|%0, %1, %2, %3}";
6757     default:
6758       gcc_unreachable ();
6759     }
6760 }
6761   [(set_attr "isa" "noavx,avx")
6762    (set_attr "type" "sseshuf")
6763    (set_attr "length_immediate" "1")
6764    (set_attr "prefix" "orig,maybe_evex")
6765    (set_attr "mode" "V4SF")])
6766
6767 (define_insn "sse_storehps"
6768   [(set (match_operand:V2SF 0 "nonimmediate_operand" "=m,v,v")
6769         (vec_select:V2SF
6770           (match_operand:V4SF 1 "nonimmediate_operand" "v,v,o")
6771           (parallel [(const_int 2) (const_int 3)])))]
6772   "TARGET_SSE && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
6773   "@
6774    %vmovhps\t{%1, %0|%q0, %1}
6775    %vmovhlps\t{%1, %d0|%d0, %1}
6776    %vmovlps\t{%H1, %d0|%d0, %H1}"
6777   [(set_attr "type" "ssemov")
6778    (set_attr "prefix" "maybe_vex")
6779    (set_attr "mode" "V2SF,V4SF,V2SF")])
6780
6781 (define_expand "sse_loadhps_exp"
6782   [(set (match_operand:V4SF 0 "nonimmediate_operand")
6783         (vec_concat:V4SF
6784           (vec_select:V2SF
6785             (match_operand:V4SF 1 "nonimmediate_operand")
6786             (parallel [(const_int 0) (const_int 1)]))
6787           (match_operand:V2SF 2 "nonimmediate_operand")))]
6788   "TARGET_SSE"
6789 {
6790   rtx dst = ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);
6791
6792   emit_insn (gen_sse_loadhps (dst, operands[1], operands[2]));
6793
6794   /* Fix up the destination if needed.  */
6795   if (dst != operands[0])
6796     emit_move_insn (operands[0], dst);
6797
6798   DONE;
6799 })
6800
6801 (define_insn "sse_loadhps"
6802   [(set (match_operand:V4SF 0 "nonimmediate_operand"     "=x,v,x,v,o")
6803         (vec_concat:V4SF
6804           (vec_select:V2SF
6805             (match_operand:V4SF 1 "nonimmediate_operand" " 0,v,0,v,0")
6806             (parallel [(const_int 0) (const_int 1)]))
6807           (match_operand:V2SF 2 "nonimmediate_operand"   " m,m,x,v,v")))]
6808   "TARGET_SSE"
6809   "@
6810    movhps\t{%2, %0|%0, %q2}
6811    vmovhps\t{%2, %1, %0|%0, %1, %q2}
6812    movlhps\t{%2, %0|%0, %2}
6813    vmovlhps\t{%2, %1, %0|%0, %1, %2}
6814    %vmovlps\t{%2, %H0|%H0, %2}"
6815   [(set_attr "isa" "noavx,avx,noavx,avx,*")
6816    (set_attr "type" "ssemov")
6817    (set_attr "prefix" "orig,maybe_evex,orig,maybe_evex,maybe_vex")
6818    (set_attr "mode" "V2SF,V2SF,V4SF,V4SF,V2SF")])
6819
6820 (define_insn "sse_storelps"
6821   [(set (match_operand:V2SF 0 "nonimmediate_operand"   "=m,v,v")
6822         (vec_select:V2SF
6823           (match_operand:V4SF 1 "nonimmediate_operand" " v,v,m")
6824           (parallel [(const_int 0) (const_int 1)])))]
6825   "TARGET_SSE && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
6826   "@
6827    %vmovlps\t{%1, %0|%q0, %1}
6828    %vmovaps\t{%1, %0|%0, %1}
6829    %vmovlps\t{%1, %d0|%d0, %q1}"
6830   [(set_attr "type" "ssemov")
6831    (set_attr "prefix" "maybe_vex")
6832    (set_attr "mode" "V2SF,V4SF,V2SF")])
6833
6834 (define_expand "sse_loadlps_exp"
6835   [(set (match_operand:V4SF 0 "nonimmediate_operand")
6836         (vec_concat:V4SF
6837           (match_operand:V2SF 2 "nonimmediate_operand")
6838           (vec_select:V2SF
6839             (match_operand:V4SF 1 "nonimmediate_operand")
6840             (parallel [(const_int 2) (const_int 3)]))))]
6841   "TARGET_SSE"
6842 {
6843   rtx dst = ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);
6844
6845   emit_insn (gen_sse_loadlps (dst, operands[1], operands[2]));
6846
6847   /* Fix up the destination if needed.  */
6848   if (dst != operands[0])
6849     emit_move_insn (operands[0], dst);
6850
6851   DONE;
6852 })
6853
6854 (define_insn "sse_loadlps"
6855   [(set (match_operand:V4SF 0 "nonimmediate_operand"     "=x,v,x,v,m")
6856         (vec_concat:V4SF
6857           (match_operand:V2SF 2 "nonimmediate_operand"   " 0,v,m,m,v")
6858           (vec_select:V2SF
6859             (match_operand:V4SF 1 "nonimmediate_operand" " x,v,0,v,0")
6860             (parallel [(const_int 2) (const_int 3)]))))]
6861   "TARGET_SSE"
6862   "@
6863    shufps\t{$0xe4, %1, %0|%0, %1, 0xe4}
6864    vshufps\t{$0xe4, %1, %2, %0|%0, %2, %1, 0xe4}
6865    movlps\t{%2, %0|%0, %q2}
6866    vmovlps\t{%2, %1, %0|%0, %1, %q2}
6867    %vmovlps\t{%2, %0|%q0, %2}"
6868   [(set_attr "isa" "noavx,avx,noavx,avx,*")
6869    (set_attr "type" "sseshuf,sseshuf,ssemov,ssemov,ssemov")
6870    (set (attr "length_immediate")
6871      (if_then_else (eq_attr "alternative" "0,1")
6872                    (const_string "1")
6873                    (const_string "*")))
6874    (set_attr "prefix" "orig,maybe_evex,orig,maybe_evex,maybe_vex")
6875    (set_attr "mode" "V4SF,V4SF,V2SF,V2SF,V2SF")])
6876
6877 (define_insn "sse_movss"
6878   [(set (match_operand:V4SF 0 "register_operand"   "=x,v")
6879         (vec_merge:V4SF
6880           (match_operand:V4SF 2 "register_operand" " x,v")
6881           (match_operand:V4SF 1 "register_operand" " 0,v")
6882           (const_int 1)))]
6883   "TARGET_SSE"
6884   "@
6885    movss\t{%2, %0|%0, %2}
6886    vmovss\t{%2, %1, %0|%0, %1, %2}"
6887   [(set_attr "isa" "noavx,avx")
6888    (set_attr "type" "ssemov")
6889    (set_attr "prefix" "orig,maybe_evex")
6890    (set_attr "mode" "SF")])
6891
6892 (define_insn "avx2_vec_dup<mode>"
6893   [(set (match_operand:VF1_128_256 0 "register_operand" "=v")
6894         (vec_duplicate:VF1_128_256
6895           (vec_select:SF
6896             (match_operand:V4SF 1 "register_operand" "v")
6897             (parallel [(const_int 0)]))))]
6898   "TARGET_AVX2"
6899   "vbroadcastss\t{%1, %0|%0, %1}"
6900   [(set_attr "type" "sselog1")
6901     (set_attr "prefix" "maybe_evex")
6902     (set_attr "mode" "<MODE>")])
6903
6904 (define_insn "avx2_vec_dupv8sf_1"
6905   [(set (match_operand:V8SF 0 "register_operand" "=v")
6906         (vec_duplicate:V8SF
6907           (vec_select:SF
6908             (match_operand:V8SF 1 "register_operand" "v")
6909             (parallel [(const_int 0)]))))]
6910   "TARGET_AVX2"
6911   "vbroadcastss\t{%x1, %0|%0, %x1}"
6912   [(set_attr "type" "sselog1")
6913     (set_attr "prefix" "maybe_evex")
6914     (set_attr "mode" "V8SF")])
6915
6916 (define_insn "avx512f_vec_dup<mode>_1"
6917   [(set (match_operand:VF_512 0 "register_operand" "=v")
6918         (vec_duplicate:VF_512
6919           (vec_select:<ssescalarmode>
6920             (match_operand:VF_512 1 "register_operand" "v")
6921             (parallel [(const_int 0)]))))]
6922   "TARGET_AVX512F"
6923   "vbroadcast<bcstscalarsuff>\t{%x1, %0|%0, %x1}"
6924   [(set_attr "type" "sselog1")
6925     (set_attr "prefix" "evex")
6926     (set_attr "mode" "<MODE>")])
6927
6928 ;; Although insertps takes register source, we prefer
6929 ;; unpcklps with register source since it is shorter.
6930 (define_insn "*vec_concatv2sf_sse4_1"
6931   [(set (match_operand:V2SF 0 "register_operand"
6932           "=Yr,*x, v,Yr,*x,v,v,*y ,*y")
6933         (vec_concat:V2SF
6934           (match_operand:SF 1 "nonimmediate_operand"
6935           "  0, 0,Yv, 0,0, v,m, 0 , m")
6936           (match_operand:SF 2 "vector_move_operand"
6937           " Yr,*x,Yv, m,m, m,C,*ym, C")))]
6938   "TARGET_SSE4_1 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
6939   "@
6940    unpcklps\t{%2, %0|%0, %2}
6941    unpcklps\t{%2, %0|%0, %2}
6942    vunpcklps\t{%2, %1, %0|%0, %1, %2}
6943    insertps\t{$0x10, %2, %0|%0, %2, 0x10}
6944    insertps\t{$0x10, %2, %0|%0, %2, 0x10}
6945    vinsertps\t{$0x10, %2, %1, %0|%0, %1, %2, 0x10}
6946    %vmovss\t{%1, %0|%0, %1}
6947    punpckldq\t{%2, %0|%0, %2}
6948    movd\t{%1, %0|%0, %1}"
6949   [(set (attr "isa")
6950      (cond [(eq_attr "alternative" "0,1,3,4")
6951               (const_string "noavx")
6952             (eq_attr "alternative" "2,5")
6953               (const_string "avx")
6954            ]
6955            (const_string "*")))
6956    (set (attr "type")
6957      (cond [(eq_attr "alternative" "6")
6958               (const_string "ssemov")
6959             (eq_attr "alternative" "7")
6960               (const_string "mmxcvt")
6961             (eq_attr "alternative" "8")
6962               (const_string "mmxmov")
6963            ]
6964            (const_string "sselog")))
6965    (set (attr "prefix_data16")
6966      (if_then_else (eq_attr "alternative" "3,4")
6967                    (const_string "1")
6968                    (const_string "*")))
6969    (set (attr "prefix_extra")
6970      (if_then_else (eq_attr "alternative" "3,4,5")
6971                    (const_string "1")
6972                    (const_string "*")))
6973    (set (attr "length_immediate")
6974      (if_then_else (eq_attr "alternative" "3,4,5")
6975                    (const_string "1")
6976                    (const_string "*")))
6977    (set (attr "prefix")
6978      (cond [(eq_attr "alternative" "2,5")
6979               (const_string "maybe_evex")
6980             (eq_attr "alternative" "6")
6981               (const_string "maybe_vex")
6982            ]
6983            (const_string "orig")))
6984    (set_attr "mode" "V4SF,V4SF,V4SF,V4SF,V4SF,V4SF,SF,DI,DI")])
6985
6986 ;; ??? In theory we can match memory for the MMX alternative, but allowing
6987 ;; vector_operand for operand 2 and *not* allowing memory for the SSE
6988 ;; alternatives pretty much forces the MMX alternative to be chosen.
6989 (define_insn "*vec_concatv2sf_sse"
6990   [(set (match_operand:V2SF 0 "register_operand"     "=x,x,*y,*y")
6991         (vec_concat:V2SF
6992           (match_operand:SF 1 "nonimmediate_operand" " 0,m, 0, m")
6993           (match_operand:SF 2 "reg_or_0_operand"     " x,C,*y, C")))]
6994   "TARGET_SSE"
6995   "@
6996    unpcklps\t{%2, %0|%0, %2}
6997    movss\t{%1, %0|%0, %1}
6998    punpckldq\t{%2, %0|%0, %2}
6999    movd\t{%1, %0|%0, %1}"
7000   [(set_attr "type" "sselog,ssemov,mmxcvt,mmxmov")
7001    (set_attr "mode" "V4SF,SF,DI,DI")])
7002
7003 (define_insn "*vec_concatv4sf"
7004   [(set (match_operand:V4SF 0 "register_operand"       "=x,v,x,v")
7005         (vec_concat:V4SF
7006           (match_operand:V2SF 1 "register_operand"     " 0,v,0,v")
7007           (match_operand:V2SF 2 "nonimmediate_operand" " x,v,m,m")))]
7008   "TARGET_SSE"
7009   "@
7010    movlhps\t{%2, %0|%0, %2}
7011    vmovlhps\t{%2, %1, %0|%0, %1, %2}
7012    movhps\t{%2, %0|%0, %q2}
7013    vmovhps\t{%2, %1, %0|%0, %1, %q2}"
7014   [(set_attr "isa" "noavx,avx,noavx,avx")
7015    (set_attr "type" "ssemov")
7016    (set_attr "prefix" "orig,maybe_evex,orig,maybe_evex")
7017    (set_attr "mode" "V4SF,V4SF,V2SF,V2SF")])
7018
7019 ;; Avoid combining registers from different units in a single alternative,
7020 ;; see comment above inline_secondary_memory_needed function in i386.c
7021 (define_insn "vec_set<mode>_0"
7022   [(set (match_operand:VI4F_128 0 "nonimmediate_operand"
7023           "=Yr,*x,v,v,Yi,x,x,v,Yr ,*x ,x  ,m ,m   ,m")
7024         (vec_merge:VI4F_128
7025           (vec_duplicate:VI4F_128
7026             (match_operand:<ssescalarmode> 2 "general_operand"
7027           " Yr,*x,v,m,r ,m,x,v,*rm,*rm,*rm,!x,!*re,!*fF"))
7028           (match_operand:VI4F_128 1 "vector_move_operand"
7029           " C , C,C,C,C ,C,0,v,0  ,0  ,x  ,0 ,0   ,0")
7030           (const_int 1)))]
7031   "TARGET_SSE"
7032   "@
7033    insertps\t{$0xe, %2, %0|%0, %2, 0xe}
7034    insertps\t{$0xe, %2, %0|%0, %2, 0xe}
7035    vinsertps\t{$0xe, %2, %2, %0|%0, %2, %2, 0xe}
7036    %vmov<ssescalarmodesuffix>\t{%2, %0|%0, %2}
7037    %vmovd\t{%2, %0|%0, %2}
7038    movss\t{%2, %0|%0, %2}
7039    movss\t{%2, %0|%0, %2}
7040    vmovss\t{%2, %1, %0|%0, %1, %2}
7041    pinsrd\t{$0, %2, %0|%0, %2, 0}
7042    pinsrd\t{$0, %2, %0|%0, %2, 0}
7043    vpinsrd\t{$0, %2, %1, %0|%0, %1, %2, 0}
7044    #
7045    #
7046    #"
7047   [(set (attr "isa")
7048      (cond [(eq_attr "alternative" "0,1,8,9")
7049               (const_string "sse4_noavx")
7050             (eq_attr "alternative" "2,7,10")
7051               (const_string "avx")
7052             (eq_attr "alternative" "3,4")
7053               (const_string "sse2")
7054             (eq_attr "alternative" "5,6")
7055               (const_string "noavx")
7056            ]
7057            (const_string "*")))
7058    (set (attr "type")
7059      (cond [(eq_attr "alternative" "0,1,2,8,9,10")
7060               (const_string "sselog")
7061             (eq_attr "alternative" "12")
7062               (const_string "imov")
7063             (eq_attr "alternative" "13")
7064               (const_string "fmov")
7065            ]
7066            (const_string "ssemov")))
7067    (set (attr "prefix_extra")
7068      (if_then_else (eq_attr "alternative" "8,9,10")
7069                    (const_string "1")
7070                    (const_string "*")))
7071    (set (attr "length_immediate")
7072      (if_then_else (eq_attr "alternative" "8,9,10")
7073                    (const_string "1")
7074                    (const_string "*")))
7075    (set (attr "prefix")
7076      (cond [(eq_attr "alternative" "0,1,5,6,8,9")
7077               (const_string "orig")
7078             (eq_attr "alternative" "2")
7079               (const_string "maybe_evex")
7080             (eq_attr "alternative" "3,4")
7081               (const_string "maybe_vex")
7082             (eq_attr "alternative" "7,10")
7083               (const_string "vex")
7084            ]
7085            (const_string "*")))
7086    (set_attr "mode" "SF,SF,SF,<ssescalarmode>,SI,SF,SF,SF,TI,TI,TI,*,*,*")])
7087
7088 ;; A subset is vec_setv4sf.
7089 (define_insn "*vec_setv4sf_sse4_1"
7090   [(set (match_operand:V4SF 0 "register_operand" "=Yr,*x,v")
7091         (vec_merge:V4SF
7092           (vec_duplicate:V4SF
7093             (match_operand:SF 2 "nonimmediate_operand" "Yrm,*xm,vm"))
7094           (match_operand:V4SF 1 "register_operand" "0,0,v")
7095           (match_operand:SI 3 "const_int_operand")))]
7096   "TARGET_SSE4_1
7097    && ((unsigned) exact_log2 (INTVAL (operands[3]))
7098        < GET_MODE_NUNITS (V4SFmode))"
7099 {
7100   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])) << 4);
7101   switch (which_alternative)
7102     {
7103     case 0:
7104     case 1:
7105       return "insertps\t{%3, %2, %0|%0, %2, %3}";
7106     case 2:
7107       return "vinsertps\t{%3, %2, %1, %0|%0, %1, %2, %3}";
7108     default:
7109       gcc_unreachable ();
7110     }
7111 }
7112   [(set_attr "isa" "noavx,noavx,avx")
7113    (set_attr "type" "sselog")
7114    (set_attr "prefix_data16" "1,1,*")
7115    (set_attr "prefix_extra" "1")
7116    (set_attr "length_immediate" "1")
7117    (set_attr "prefix" "orig,orig,maybe_evex")
7118    (set_attr "mode" "V4SF")])
7119
7120 ;; All of vinsertps, vmovss, vmovd clear also the higher bits.
7121 (define_insn "vec_set<mode>_0"
7122   [(set (match_operand:VI4F_256_512 0 "register_operand" "=v,v,Yi")
7123         (vec_merge:VI4F_256_512
7124           (vec_duplicate:VI4F_256_512
7125             (match_operand:<ssescalarmode> 2 "general_operand" "v,m,r"))
7126           (match_operand:VI4F_256_512 1 "const0_operand" "C,C,C")
7127           (const_int 1)))]
7128   "TARGET_AVX"
7129   "@
7130    vinsertps\t{$0xe, %2, %2, %x0|%x0, %2, %2, 0xe}
7131    vmov<ssescalarmodesuffix>\t{%x2, %x0|%x0, %2}
7132    vmovd\t{%2, %x0|%x0, %2}"
7133   [(set (attr "type")
7134      (if_then_else (eq_attr "alternative" "0")
7135                    (const_string "sselog")
7136                    (const_string "ssemov")))
7137    (set_attr "prefix" "maybe_evex")
7138    (set_attr "mode" "SF,<ssescalarmode>,SI")])
7139
7140 (define_insn "sse4_1_insertps"
7141   [(set (match_operand:V4SF 0 "register_operand" "=Yr,*x,v")
7142         (unspec:V4SF [(match_operand:V4SF 2 "nonimmediate_operand" "Yrm,*xm,vm")
7143                       (match_operand:V4SF 1 "register_operand" "0,0,v")
7144                       (match_operand:SI 3 "const_0_to_255_operand" "n,n,n")]
7145                      UNSPEC_INSERTPS))]
7146   "TARGET_SSE4_1"
7147 {
7148   if (MEM_P (operands[2]))
7149     {
7150       unsigned count_s = INTVAL (operands[3]) >> 6;
7151       if (count_s)
7152         operands[3] = GEN_INT (INTVAL (operands[3]) & 0x3f);
7153       operands[2] = adjust_address_nv (operands[2], SFmode, count_s * 4);
7154     }
7155   switch (which_alternative)
7156     {
7157     case 0:
7158     case 1:
7159       return "insertps\t{%3, %2, %0|%0, %2, %3}";
7160     case 2:
7161       return "vinsertps\t{%3, %2, %1, %0|%0, %1, %2, %3}";
7162     default:
7163       gcc_unreachable ();
7164     }
7165 }
7166   [(set_attr "isa" "noavx,noavx,avx")
7167    (set_attr "type" "sselog")
7168    (set_attr "prefix_data16" "1,1,*")
7169    (set_attr "prefix_extra" "1")
7170    (set_attr "length_immediate" "1")
7171    (set_attr "prefix" "orig,orig,maybe_evex")
7172    (set_attr "mode" "V4SF")])
7173
7174 (define_split
7175   [(set (match_operand:VI4F_128 0 "memory_operand")
7176         (vec_merge:VI4F_128
7177           (vec_duplicate:VI4F_128
7178             (match_operand:<ssescalarmode> 1 "nonmemory_operand"))
7179           (match_dup 0)
7180           (const_int 1)))]
7181   "TARGET_SSE && reload_completed"
7182   [(set (match_dup 0) (match_dup 1))]
7183   "operands[0] = adjust_address (operands[0], <ssescalarmode>mode, 0);")
7184
7185 (define_expand "vec_set<mode>"
7186   [(match_operand:V 0 "register_operand")
7187    (match_operand:<ssescalarmode> 1 "register_operand")
7188    (match_operand 2 "const_int_operand")]
7189   "TARGET_SSE"
7190 {
7191   ix86_expand_vector_set (false, operands[0], operands[1],
7192                           INTVAL (operands[2]));
7193   DONE;
7194 })
7195
7196 (define_insn_and_split "*vec_extractv4sf_0"
7197   [(set (match_operand:SF 0 "nonimmediate_operand" "=v,m,f,r")
7198         (vec_select:SF
7199           (match_operand:V4SF 1 "nonimmediate_operand" "vm,v,m,m")
7200           (parallel [(const_int 0)])))]
7201   "TARGET_SSE && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
7202   "#"
7203   "&& reload_completed"
7204   [(set (match_dup 0) (match_dup 1))]
7205   "operands[1] = gen_lowpart (SFmode, operands[1]);")
7206
7207 (define_insn_and_split "*sse4_1_extractps"
7208   [(set (match_operand:SF 0 "nonimmediate_operand" "=rm,rm,rm,Yv,Yv")
7209         (vec_select:SF
7210           (match_operand:V4SF 1 "register_operand" "Yr,*x,v,0,v")
7211           (parallel [(match_operand:SI 2 "const_0_to_3_operand" "n,n,n,n,n")])))]
7212   "TARGET_SSE4_1"
7213   "@
7214    extractps\t{%2, %1, %0|%0, %1, %2}
7215    extractps\t{%2, %1, %0|%0, %1, %2}
7216    vextractps\t{%2, %1, %0|%0, %1, %2}
7217    #
7218    #"
7219   "&& reload_completed && SSE_REG_P (operands[0])"
7220   [(const_int 0)]
7221 {
7222   rtx dest = lowpart_subreg (V4SFmode, operands[0], SFmode);
7223   switch (INTVAL (operands[2]))
7224     {
7225     case 1:
7226     case 3:
7227       emit_insn (gen_sse_shufps_v4sf (dest, operands[1], operands[1],
7228                                       operands[2], operands[2],
7229                                       GEN_INT (INTVAL (operands[2]) + 4),
7230                                       GEN_INT (INTVAL (operands[2]) + 4)));
7231       break;
7232     case 2:
7233       emit_insn (gen_vec_interleave_highv4sf (dest, operands[1], operands[1]));
7234       break;
7235     default:
7236       /* 0 should be handled by the *vec_extractv4sf_0 pattern above.  */
7237       gcc_unreachable ();
7238     }
7239   DONE;
7240 }
7241   [(set_attr "isa" "noavx,noavx,avx,noavx,avx")
7242    (set_attr "type" "sselog,sselog,sselog,*,*")
7243    (set_attr "prefix_data16" "1,1,1,*,*")
7244    (set_attr "prefix_extra" "1,1,1,*,*")
7245    (set_attr "length_immediate" "1,1,1,*,*")
7246    (set_attr "prefix" "orig,orig,maybe_evex,*,*")
7247    (set_attr "mode" "V4SF,V4SF,V4SF,*,*")])
7248
7249 (define_insn_and_split "*vec_extractv4sf_mem"
7250   [(set (match_operand:SF 0 "register_operand" "=v,*r,f")
7251         (vec_select:SF
7252           (match_operand:V4SF 1 "memory_operand" "o,o,o")
7253           (parallel [(match_operand 2 "const_0_to_3_operand" "n,n,n")])))]
7254   "TARGET_SSE"
7255   "#"
7256   "&& reload_completed"
7257   [(set (match_dup 0) (match_dup 1))]
7258 {
7259   operands[1] = adjust_address (operands[1], SFmode, INTVAL (operands[2]) * 4);
7260 })
7261
7262 (define_mode_attr extract_type
7263   [(V16SF "avx512f") (V16SI "avx512f") (V8DF "avx512dq") (V8DI "avx512dq")])
7264
7265 (define_mode_attr extract_suf
7266   [(V16SF "32x4") (V16SI "32x4") (V8DF "64x2") (V8DI "64x2")])
7267
7268 (define_mode_iterator AVX512_VEC
7269   [(V8DF "TARGET_AVX512DQ") (V8DI "TARGET_AVX512DQ") V16SF V16SI])
7270
7271 (define_expand "<extract_type>_vextract<shuffletype><extract_suf>_mask"
7272   [(match_operand:<ssequartermode> 0 "nonimmediate_operand")
7273    (match_operand:AVX512_VEC 1 "register_operand")
7274    (match_operand:SI 2 "const_0_to_3_operand")
7275    (match_operand:<ssequartermode> 3 "nonimmediate_operand")
7276    (match_operand:QI 4 "register_operand")]
7277   "TARGET_AVX512F"
7278 {
7279   int mask;
7280   mask = INTVAL (operands[2]);
7281   rtx dest = operands[0];
7282
7283   if (MEM_P (operands[0]) && !rtx_equal_p (operands[0], operands[3]))
7284     dest = gen_reg_rtx (<ssequartermode>mode);
7285
7286   if (<MODE>mode == V16SImode || <MODE>mode == V16SFmode)
7287     emit_insn (gen_avx512f_vextract<shuffletype>32x4_1_mask (dest,
7288         operands[1], GEN_INT (mask * 4), GEN_INT (mask * 4 + 1),
7289         GEN_INT (mask * 4 + 2), GEN_INT (mask * 4 + 3), operands[3],
7290         operands[4]));
7291   else
7292     emit_insn (gen_avx512dq_vextract<shuffletype>64x2_1_mask (dest,
7293         operands[1], GEN_INT (mask * 2), GEN_INT (mask * 2 + 1), operands[3],
7294         operands[4]));
7295   if (dest != operands[0])
7296     emit_move_insn (operands[0], dest);
7297   DONE;
7298 })
7299
7300 (define_insn "avx512dq_vextract<shuffletype>64x2_1_maskm"
7301   [(set (match_operand:<ssequartermode> 0 "memory_operand" "=m")
7302         (vec_merge:<ssequartermode>
7303           (vec_select:<ssequartermode>
7304             (match_operand:V8FI 1 "register_operand" "v")
7305             (parallel [(match_operand 2  "const_0_to_7_operand")
7306               (match_operand 3  "const_0_to_7_operand")]))
7307           (match_operand:<ssequartermode> 4 "memory_operand" "0")
7308           (match_operand:QI 5 "register_operand" "Yk")))]
7309   "TARGET_AVX512DQ
7310    && INTVAL (operands[2]) % 2 == 0
7311    && INTVAL (operands[2]) == INTVAL (operands[3]) - 1
7312    && rtx_equal_p (operands[4], operands[0])"
7313 {
7314   operands[2] = GEN_INT ((INTVAL (operands[2])) >> 1);
7315   return "vextract<shuffletype>64x2\t{%2, %1, %0%{%5%}|%0%{%5%}, %1, %2}";
7316 }
7317   [(set_attr "type" "sselog")
7318    (set_attr "prefix_extra" "1")
7319    (set_attr "length_immediate" "1")
7320    (set_attr "memory" "store")
7321    (set_attr "prefix" "evex")
7322    (set_attr "mode" "<sseinsnmode>")])
7323
7324 (define_insn "avx512f_vextract<shuffletype>32x4_1_maskm"
7325   [(set (match_operand:<ssequartermode> 0 "memory_operand" "=m")
7326         (vec_merge:<ssequartermode>
7327           (vec_select:<ssequartermode>
7328             (match_operand:V16FI 1 "register_operand" "v")
7329             (parallel [(match_operand 2  "const_0_to_15_operand")
7330               (match_operand 3  "const_0_to_15_operand")
7331               (match_operand 4  "const_0_to_15_operand")
7332               (match_operand 5  "const_0_to_15_operand")]))
7333           (match_operand:<ssequartermode> 6 "memory_operand" "0")
7334           (match_operand:QI 7 "register_operand" "Yk")))]
7335   "TARGET_AVX512F
7336    && INTVAL (operands[2]) % 4 == 0
7337    && INTVAL (operands[2]) == INTVAL (operands[3]) - 1
7338    && INTVAL (operands[3]) == INTVAL (operands[4]) - 1
7339    && INTVAL (operands[4]) == INTVAL (operands[5]) - 1
7340    && rtx_equal_p (operands[6], operands[0])"
7341 {
7342   operands[2] = GEN_INT (INTVAL (operands[2]) >> 2);
7343   return "vextract<shuffletype>32x4\t{%2, %1, %0%{%7%}|%0%{%7%}, %1, %2}";
7344 }
7345   [(set_attr "type" "sselog")
7346    (set_attr "prefix_extra" "1")
7347    (set_attr "length_immediate" "1")
7348    (set_attr "memory" "store")
7349    (set_attr "prefix" "evex")
7350    (set_attr "mode" "<sseinsnmode>")])
7351
7352 (define_insn "<mask_codefor>avx512dq_vextract<shuffletype>64x2_1<mask_name>"
7353   [(set (match_operand:<ssequartermode> 0 "<store_mask_predicate>" "=<store_mask_constraint>")
7354         (vec_select:<ssequartermode>
7355           (match_operand:V8FI 1 "register_operand" "v")
7356           (parallel [(match_operand 2  "const_0_to_7_operand")
7357             (match_operand 3  "const_0_to_7_operand")])))]
7358   "TARGET_AVX512DQ
7359    && INTVAL (operands[2]) % 2 == 0
7360    && INTVAL (operands[2]) == INTVAL (operands[3]) - 1"
7361 {
7362   operands[2] = GEN_INT (INTVAL (operands[2]) >> 1);
7363   return "vextract<shuffletype>64x2\t{%2, %1, %0<mask_operand4>|%0<mask_operand4>, %1, %2}";
7364 }
7365   [(set_attr "type" "sselog1")
7366    (set_attr "prefix_extra" "1")
7367    (set_attr "length_immediate" "1")
7368    (set_attr "prefix" "evex")
7369    (set_attr "mode" "<sseinsnmode>")])
7370
7371 (define_split
7372   [(set (match_operand:<ssequartermode> 0 "nonimmediate_operand")
7373         (vec_select:<ssequartermode>
7374           (match_operand:V8FI 1 "register_operand")
7375           (parallel [(const_int 0) (const_int 1)])))]
7376   "TARGET_AVX512DQ
7377    && reload_completed
7378    && (TARGET_AVX512VL
7379        || REG_P (operands[0])
7380        || !EXT_REX_SSE_REG_P (operands[1]))"
7381   [(set (match_dup 0) (match_dup 1))]
7382 {
7383   if (!TARGET_AVX512VL
7384       && REG_P (operands[0])
7385       && EXT_REX_SSE_REG_P (operands[1]))
7386     operands[0]
7387       = lowpart_subreg (<MODE>mode, operands[0], <ssequartermode>mode);
7388   else
7389     operands[1] = gen_lowpart (<ssequartermode>mode, operands[1]);
7390 })
7391
7392 (define_insn "<mask_codefor>avx512f_vextract<shuffletype>32x4_1<mask_name>"
7393   [(set (match_operand:<ssequartermode> 0 "<store_mask_predicate>" "=<store_mask_constraint>")
7394         (vec_select:<ssequartermode>
7395           (match_operand:V16FI 1 "register_operand" "v")
7396           (parallel [(match_operand 2  "const_0_to_15_operand")
7397             (match_operand 3  "const_0_to_15_operand")
7398             (match_operand 4  "const_0_to_15_operand")
7399             (match_operand 5  "const_0_to_15_operand")])))]
7400   "TARGET_AVX512F
7401    && INTVAL (operands[2]) % 4 == 0
7402    && INTVAL (operands[2]) == INTVAL (operands[3]) - 1
7403    && INTVAL (operands[3]) == INTVAL (operands[4]) - 1
7404    && INTVAL (operands[4]) == INTVAL (operands[5]) - 1"
7405 {
7406   operands[2] = GEN_INT (INTVAL (operands[2]) >> 2);
7407   return "vextract<shuffletype>32x4\t{%2, %1, %0<mask_operand6>|%0<mask_operand6>, %1, %2}";
7408 }
7409   [(set_attr "type" "sselog1")
7410    (set_attr "prefix_extra" "1")
7411    (set_attr "length_immediate" "1")
7412    (set_attr "prefix" "evex")
7413    (set_attr "mode" "<sseinsnmode>")])
7414
7415 (define_split
7416   [(set (match_operand:<ssequartermode> 0 "nonimmediate_operand")
7417         (vec_select:<ssequartermode>
7418           (match_operand:V16FI 1 "register_operand")
7419           (parallel [(const_int 0) (const_int 1)
7420                      (const_int 2) (const_int 3)])))]
7421   "TARGET_AVX512F
7422    && reload_completed
7423    && (TARGET_AVX512VL
7424        || REG_P (operands[0])
7425        || !EXT_REX_SSE_REG_P (operands[1]))"
7426   [(set (match_dup 0) (match_dup 1))]
7427 {
7428   if (!TARGET_AVX512VL
7429       && REG_P (operands[0])
7430       && EXT_REX_SSE_REG_P (operands[1]))
7431     operands[0]
7432       = lowpart_subreg (<MODE>mode, operands[0], <ssequartermode>mode);
7433   else
7434     operands[1] = gen_lowpart (<ssequartermode>mode, operands[1]);
7435 })
7436
7437 (define_mode_attr extract_type_2
7438   [(V16SF "avx512dq") (V16SI "avx512dq") (V8DF "avx512f") (V8DI "avx512f")])
7439
7440 (define_mode_attr extract_suf_2
7441   [(V16SF "32x8") (V16SI "32x8") (V8DF "64x4") (V8DI "64x4")])
7442
7443 (define_mode_iterator AVX512_VEC_2
7444   [(V16SF "TARGET_AVX512DQ") (V16SI "TARGET_AVX512DQ") V8DF V8DI])
7445
7446 (define_expand "<extract_type_2>_vextract<shuffletype><extract_suf_2>_mask"
7447   [(match_operand:<ssehalfvecmode> 0 "nonimmediate_operand")
7448    (match_operand:AVX512_VEC_2 1 "register_operand")
7449    (match_operand:SI 2 "const_0_to_1_operand")
7450    (match_operand:<ssehalfvecmode> 3 "nonimmediate_operand")
7451    (match_operand:QI 4 "register_operand")]
7452   "TARGET_AVX512F"
7453 {
7454   rtx (*insn)(rtx, rtx, rtx, rtx);
7455   rtx dest = operands[0];
7456
7457   if (MEM_P (dest) && !rtx_equal_p (dest, operands[3]))
7458     dest = gen_reg_rtx (<ssehalfvecmode>mode);
7459
7460   switch (INTVAL (operands[2]))
7461     {
7462     case 0:
7463       insn = gen_vec_extract_lo_<mode>_mask;
7464       break;
7465     case 1:
7466       insn = gen_vec_extract_hi_<mode>_mask;
7467       break;
7468     default:
7469       gcc_unreachable ();
7470     }
7471
7472   emit_insn (insn (dest, operands[1], operands[3], operands[4]));
7473   if (dest != operands[0])
7474     emit_move_insn (operands[0], dest);
7475   DONE;
7476 })
7477
7478 (define_split
7479   [(set (match_operand:<ssehalfvecmode> 0 "nonimmediate_operand")
7480         (vec_select:<ssehalfvecmode>
7481           (match_operand:V8FI 1 "nonimmediate_operand")
7482           (parallel [(const_int 0) (const_int 1)
7483             (const_int 2) (const_int 3)])))]
7484   "TARGET_AVX512F && !(MEM_P (operands[0]) && MEM_P (operands[1]))
7485    && reload_completed
7486    && (TARGET_AVX512VL
7487        || (REG_P (operands[0]) && !EXT_REX_SSE_REG_P (operands[1])))"
7488   [(set (match_dup 0) (match_dup 1))]
7489   "operands[1] = gen_lowpart (<ssehalfvecmode>mode, operands[1]);")
7490
7491 (define_insn "vec_extract_lo_<mode>_maskm"
7492   [(set (match_operand:<ssehalfvecmode> 0 "memory_operand" "=m")
7493         (vec_merge:<ssehalfvecmode>
7494           (vec_select:<ssehalfvecmode>
7495             (match_operand:V8FI 1 "register_operand" "v")
7496             (parallel [(const_int 0) (const_int 1)
7497               (const_int 2) (const_int 3)]))
7498           (match_operand:<ssehalfvecmode> 2 "memory_operand" "0")
7499           (match_operand:QI 3 "register_operand" "Yk")))]
7500   "TARGET_AVX512F
7501    && rtx_equal_p (operands[2], operands[0])"
7502   "vextract<shuffletype>64x4\t{$0x0, %1, %0%{%3%}|%0%{%3%}, %1, 0x0}"
7503   [(set_attr "type" "sselog1")
7504    (set_attr "prefix_extra" "1")
7505    (set_attr "length_immediate" "1")
7506    (set_attr "prefix" "evex")
7507    (set_attr "mode" "<sseinsnmode>")])
7508
7509 (define_insn "vec_extract_lo_<mode><mask_name>"
7510   [(set (match_operand:<ssehalfvecmode> 0 "<store_mask_predicate>" "=v,<store_mask_constraint>,v")
7511         (vec_select:<ssehalfvecmode>
7512           (match_operand:V8FI 1 "<store_mask_predicate>" "v,v,<store_mask_constraint>")
7513           (parallel [(const_int 0) (const_int 1)
7514             (const_int 2) (const_int 3)])))]
7515   "TARGET_AVX512F
7516    && (<mask_applied> || !(MEM_P (operands[0]) && MEM_P (operands[1])))"
7517 {
7518   if (<mask_applied> || (!TARGET_AVX512VL && !MEM_P (operands[1])))
7519     return "vextract<shuffletype>64x4\t{$0x0, %1, %0<mask_operand2>|%0<mask_operand2>, %1, 0x0}";
7520   else
7521     return "#";
7522 }
7523   [(set_attr "type" "sselog1")
7524    (set_attr "prefix_extra" "1")
7525    (set_attr "length_immediate" "1")
7526    (set_attr "memory" "none,store,load")
7527    (set_attr "prefix" "evex")
7528    (set_attr "mode" "<sseinsnmode>")])
7529
7530 (define_insn "vec_extract_hi_<mode>_maskm"
7531   [(set (match_operand:<ssehalfvecmode> 0 "memory_operand" "=m")
7532         (vec_merge:<ssehalfvecmode>
7533           (vec_select:<ssehalfvecmode>
7534             (match_operand:V8FI 1 "register_operand" "v")
7535             (parallel [(const_int 4) (const_int 5)
7536               (const_int 6) (const_int 7)]))
7537           (match_operand:<ssehalfvecmode> 2 "memory_operand" "0")
7538           (match_operand:QI 3 "register_operand" "Yk")))]
7539   "TARGET_AVX512F
7540    && rtx_equal_p (operands[2], operands[0])"
7541   "vextract<shuffletype>64x4\t{$0x1, %1, %0%{%3%}|%0%{%3%}, %1, 0x1}"
7542   [(set_attr "type" "sselog")
7543    (set_attr "prefix_extra" "1")
7544    (set_attr "length_immediate" "1")
7545    (set_attr "memory" "store")
7546    (set_attr "prefix" "evex")
7547    (set_attr "mode" "<sseinsnmode>")])
7548
7549 (define_insn "vec_extract_hi_<mode><mask_name>"
7550   [(set (match_operand:<ssehalfvecmode> 0 "<store_mask_predicate>" "=<store_mask_constraint>")
7551         (vec_select:<ssehalfvecmode>
7552           (match_operand:V8FI 1 "register_operand" "v")
7553           (parallel [(const_int 4) (const_int 5)
7554             (const_int 6) (const_int 7)])))]
7555   "TARGET_AVX512F"
7556   "vextract<shuffletype>64x4\t{$0x1, %1, %0<mask_operand2>|%0<mask_operand2>, %1, 0x1}"
7557   [(set_attr "type" "sselog1")
7558    (set_attr "prefix_extra" "1")
7559    (set_attr "length_immediate" "1")
7560    (set_attr "prefix" "evex")
7561    (set_attr "mode" "<sseinsnmode>")])
7562
7563 (define_insn "vec_extract_hi_<mode>_maskm"
7564    [(set (match_operand:<ssehalfvecmode> 0 "memory_operand" "=m")
7565         (vec_merge:<ssehalfvecmode>
7566           (vec_select:<ssehalfvecmode>
7567             (match_operand:V16FI 1 "register_operand" "v")
7568             (parallel [(const_int 8) (const_int 9)
7569               (const_int 10) (const_int 11)
7570               (const_int 12) (const_int 13)
7571               (const_int 14) (const_int 15)]))
7572           (match_operand:<ssehalfvecmode> 2 "memory_operand" "0")
7573           (match_operand:QI 3 "register_operand" "Yk")))]
7574   "TARGET_AVX512DQ
7575    && rtx_equal_p (operands[2], operands[0])"
7576   "vextract<shuffletype>32x8\t{$0x1, %1, %0%{%3%}|%0%{%3%}, %1, 0x1}"
7577   [(set_attr "type" "sselog1")
7578    (set_attr "prefix_extra" "1")
7579    (set_attr "length_immediate" "1")
7580    (set_attr "prefix" "evex")
7581    (set_attr "mode" "<sseinsnmode>")])
7582
7583 (define_insn "vec_extract_hi_<mode><mask_name>"
7584   [(set (match_operand:<ssehalfvecmode> 0 "<store_mask_predicate>" "=<store_mask_constraint>,vm")
7585         (vec_select:<ssehalfvecmode>
7586           (match_operand:V16FI 1 "register_operand" "v,v")
7587           (parallel [(const_int 8) (const_int 9)
7588             (const_int 10) (const_int 11)
7589             (const_int 12) (const_int 13)
7590             (const_int 14) (const_int 15)])))]
7591   "TARGET_AVX512F && <mask_avx512dq_condition>"
7592   "@
7593    vextract<shuffletype>32x8\t{$0x1, %1, %0<mask_operand2>|%0<mask_operand2>, %1, 0x1}
7594    vextracti64x4\t{$0x1, %1, %0|%0, %1, 0x1}"
7595   [(set_attr "type" "sselog1")
7596    (set_attr "prefix_extra" "1")
7597    (set_attr "isa" "avx512dq,noavx512dq")
7598    (set_attr "length_immediate" "1")
7599    (set_attr "prefix" "evex")
7600    (set_attr "mode" "<sseinsnmode>")])
7601
7602 (define_expand "avx512vl_vextractf128<mode>"
7603   [(match_operand:<ssehalfvecmode> 0 "nonimmediate_operand")
7604    (match_operand:VI48F_256 1 "register_operand")
7605    (match_operand:SI 2 "const_0_to_1_operand")
7606    (match_operand:<ssehalfvecmode> 3 "vector_move_operand")
7607    (match_operand:QI 4 "register_operand")]
7608   "TARGET_AVX512DQ && TARGET_AVX512VL"
7609 {
7610   rtx (*insn)(rtx, rtx, rtx, rtx);
7611   rtx dest = operands[0];
7612
7613   if (MEM_P (dest)
7614       && (GET_MODE_SIZE (GET_MODE_INNER (<MODE>mode)) == 4
7615           /* For V8S[IF]mode there are maskm insns with =m and 0
7616              constraints.  */
7617           ? !rtx_equal_p (dest, operands[3])
7618           /* For V4D[IF]mode, hi insns don't allow memory, and
7619              lo insns have =m and 0C constraints.  */
7620           : (operands[2] != const0_rtx
7621              || (!rtx_equal_p (dest, operands[3])
7622                  && GET_CODE (operands[3]) != CONST_VECTOR))))
7623     dest = gen_reg_rtx (<ssehalfvecmode>mode);
7624   switch (INTVAL (operands[2]))
7625     {
7626     case 0:
7627       insn = gen_vec_extract_lo_<mode>_mask;
7628       break;
7629     case 1:
7630       insn = gen_vec_extract_hi_<mode>_mask;
7631       break;
7632     default:
7633       gcc_unreachable ();
7634     }
7635
7636   emit_insn (insn (dest, operands[1], operands[3], operands[4]));
7637   if (dest != operands[0])
7638     emit_move_insn (operands[0], dest);
7639   DONE;
7640 })
7641
7642 (define_expand "avx_vextractf128<mode>"
7643   [(match_operand:<ssehalfvecmode> 0 "nonimmediate_operand")
7644    (match_operand:V_256 1 "register_operand")
7645    (match_operand:SI 2 "const_0_to_1_operand")]
7646   "TARGET_AVX"
7647 {
7648   rtx (*insn)(rtx, rtx);
7649
7650   switch (INTVAL (operands[2]))
7651     {
7652     case 0:
7653       insn = gen_vec_extract_lo_<mode>;
7654       break;
7655     case 1:
7656       insn = gen_vec_extract_hi_<mode>;
7657       break;
7658     default:
7659       gcc_unreachable ();
7660     }
7661
7662   emit_insn (insn (operands[0], operands[1]));
7663   DONE;
7664 })
7665
7666 (define_insn "vec_extract_lo_<mode><mask_name>"
7667   [(set (match_operand:<ssehalfvecmode> 0 "nonimmediate_operand" "=v,v,m")
7668         (vec_select:<ssehalfvecmode>
7669           (match_operand:V16FI 1 "<store_mask_predicate>"
7670                                  "v,<store_mask_constraint>,v")
7671           (parallel [(const_int 0) (const_int 1)
7672                      (const_int 2) (const_int 3)
7673                      (const_int 4) (const_int 5)
7674                      (const_int 6) (const_int 7)])))]
7675   "TARGET_AVX512F
7676    && <mask_mode512bit_condition>
7677    && (<mask_applied> || !(MEM_P (operands[0]) && MEM_P (operands[1])))"
7678 {
7679   if (<mask_applied>
7680       || (!TARGET_AVX512VL
7681           && !REG_P (operands[0])
7682           && EXT_REX_SSE_REG_P (operands[1])))
7683     return "vextract<shuffletype>32x8\t{$0x0, %1, %0<mask_operand2>|%0<mask_operand2>, %1, 0x0}";
7684   else
7685     return "#";
7686 }
7687   [(set_attr "type" "sselog1")
7688    (set_attr "prefix_extra" "1")
7689    (set_attr "length_immediate" "1")
7690    (set_attr "memory" "none,load,store")
7691    (set_attr "prefix" "evex")
7692    (set_attr "mode" "<sseinsnmode>")])
7693
7694 (define_split
7695   [(set (match_operand:<ssehalfvecmode> 0 "nonimmediate_operand")
7696         (vec_select:<ssehalfvecmode>
7697           (match_operand:V16FI 1 "nonimmediate_operand")
7698           (parallel [(const_int 0) (const_int 1)
7699             (const_int 2) (const_int 3)
7700             (const_int 4) (const_int 5)
7701             (const_int 6) (const_int 7)])))]
7702   "TARGET_AVX512F && !(MEM_P (operands[0]) && MEM_P (operands[1]))
7703    && reload_completed
7704    && (TARGET_AVX512VL
7705        || REG_P (operands[0])
7706        || !EXT_REX_SSE_REG_P (operands[1]))"
7707   [(set (match_dup 0) (match_dup 1))]
7708 {
7709   if (!TARGET_AVX512VL
7710       && REG_P (operands[0])
7711       && EXT_REX_SSE_REG_P (operands[1]))
7712     operands[0]
7713       = lowpart_subreg (<MODE>mode, operands[0], <ssehalfvecmode>mode);
7714   else
7715     operands[1] = gen_lowpart (<ssehalfvecmode>mode, operands[1]);
7716 })
7717
7718 (define_insn "vec_extract_lo_<mode><mask_name>"
7719   [(set (match_operand:<ssehalfvecmode> 0 "<store_mask_predicate>" "=v,v,m")
7720         (vec_select:<ssehalfvecmode>
7721           (match_operand:VI8F_256 1 "<store_mask_predicate>"
7722                                     "v,<store_mask_constraint>,v")
7723           (parallel [(const_int 0) (const_int 1)])))]
7724   "TARGET_AVX
7725    && <mask_avx512vl_condition> && <mask_avx512dq_condition>
7726    && (<mask_applied> || !(MEM_P (operands[0]) && MEM_P (operands[1])))"
7727 {
7728   if (<mask_applied>)
7729     return "vextract<shuffletype>64x2\t{$0x0, %1, %0%{%3%}|%0%{%3%}, %1, 0x0}";
7730   else
7731     return "#";
7732 }
7733    [(set_attr "type" "sselog1")
7734     (set_attr "prefix_extra" "1")
7735     (set_attr "length_immediate" "1")
7736     (set_attr "memory" "none,load,store")
7737     (set_attr "prefix" "evex")
7738     (set_attr "mode" "XI")])
7739
7740 (define_split
7741   [(set (match_operand:<ssehalfvecmode> 0 "nonimmediate_operand")
7742         (vec_select:<ssehalfvecmode>
7743           (match_operand:VI8F_256 1 "nonimmediate_operand")
7744           (parallel [(const_int 0) (const_int 1)])))]
7745   "TARGET_AVX && !(MEM_P (operands[0]) && MEM_P (operands[1]))
7746    && reload_completed"
7747   [(set (match_dup 0) (match_dup 1))]
7748   "operands[1] = gen_lowpart (<ssehalfvecmode>mode, operands[1]);")
7749
7750 (define_insn "vec_extract_hi_<mode><mask_name>"
7751   [(set (match_operand:<ssehalfvecmode> 0 "<store_mask_predicate>" "=v,<store_mask_constraint>")
7752         (vec_select:<ssehalfvecmode>
7753           (match_operand:VI8F_256 1 "register_operand" "v,v")
7754           (parallel [(const_int 2) (const_int 3)])))]
7755   "TARGET_AVX && <mask_avx512vl_condition> && <mask_avx512dq_condition>"
7756 {
7757   if (TARGET_AVX512VL)
7758   {
7759     if (TARGET_AVX512DQ)
7760       return "vextract<shuffletype>64x2\t{$0x1, %1, %0<mask_operand2>|%0<mask_operand2>, %1, 0x1}";
7761     else
7762       return "vextract<shuffletype>32x4\t{$0x1, %1, %0|%0, %1, 0x1}";
7763   }
7764   else
7765     return "vextract<i128>\t{$0x1, %1, %0|%0, %1, 0x1}";
7766 }
7767   [(set_attr "type" "sselog1")
7768    (set_attr "prefix_extra" "1")
7769    (set_attr "length_immediate" "1")
7770    (set_attr "prefix" "vex")
7771    (set_attr "mode" "<sseinsnmode>")])
7772
7773 (define_split
7774   [(set (match_operand:<ssehalfvecmode> 0 "nonimmediate_operand")
7775         (vec_select:<ssehalfvecmode>
7776           (match_operand:VI4F_256 1 "nonimmediate_operand")
7777           (parallel [(const_int 0) (const_int 1)
7778                      (const_int 2) (const_int 3)])))]
7779   "TARGET_AVX && !(MEM_P (operands[0]) && MEM_P (operands[1]))
7780    && reload_completed"
7781   [(set (match_dup 0) (match_dup 1))]
7782   "operands[1] = gen_lowpart (<ssehalfvecmode>mode, operands[1]);")
7783
7784 (define_insn "vec_extract_lo_<mode><mask_name>"
7785   [(set (match_operand:<ssehalfvecmode> 0 "<store_mask_predicate>"
7786                                           "=<store_mask_constraint>,v")
7787         (vec_select:<ssehalfvecmode>
7788           (match_operand:VI4F_256 1 "<store_mask_predicate>"
7789                                     "v,<store_mask_constraint>")
7790           (parallel [(const_int 0) (const_int 1)
7791                      (const_int 2) (const_int 3)])))]
7792   "TARGET_AVX
7793    && <mask_avx512vl_condition> && <mask_avx512dq_condition>
7794    && (<mask_applied> || !(MEM_P (operands[0]) && MEM_P (operands[1])))"
7795 {
7796   if (<mask_applied>)
7797     return "vextract<shuffletype>32x4\t{$0x0, %1, %0<mask_operand2>|%0<mask_operand2>, %1, 0x0}";
7798   else
7799     return "#";
7800 }
7801   [(set_attr "type" "sselog1")
7802    (set_attr "prefix_extra" "1")
7803    (set_attr "length_immediate" "1")
7804    (set_attr "prefix" "evex")
7805    (set_attr "mode" "<sseinsnmode>")])
7806
7807 (define_insn "vec_extract_lo_<mode>_maskm"
7808   [(set (match_operand:<ssehalfvecmode> 0 "memory_operand" "=m")
7809         (vec_merge:<ssehalfvecmode>
7810           (vec_select:<ssehalfvecmode>
7811             (match_operand:VI4F_256 1 "register_operand" "v")
7812             (parallel [(const_int 0) (const_int 1)
7813                       (const_int 2) (const_int 3)]))
7814           (match_operand:<ssehalfvecmode> 2 "memory_operand" "0")
7815           (match_operand:QI 3 "register_operand" "Yk")))]
7816   "TARGET_AVX512VL && TARGET_AVX512F
7817    && rtx_equal_p (operands[2], operands[0])"
7818   "vextract<shuffletype>32x4\t{$0x0, %1, %0%{%3%}|%0%{%3%}, %1, 0x0}"
7819   [(set_attr "type" "sselog1")
7820    (set_attr "prefix_extra" "1")
7821    (set_attr "length_immediate" "1")
7822    (set_attr "prefix" "evex")
7823    (set_attr "mode" "<sseinsnmode>")])
7824
7825 (define_insn "vec_extract_hi_<mode>_maskm"
7826   [(set (match_operand:<ssehalfvecmode> 0 "memory_operand" "=m")
7827         (vec_merge:<ssehalfvecmode>
7828           (vec_select:<ssehalfvecmode>
7829             (match_operand:VI4F_256 1 "register_operand" "v")
7830             (parallel [(const_int 4) (const_int 5)
7831                       (const_int 6) (const_int 7)]))
7832           (match_operand:<ssehalfvecmode> 2 "memory_operand" "0")
7833           (match_operand:<ssehalfvecmode> 3 "register_operand" "Yk")))]
7834   "TARGET_AVX512F && TARGET_AVX512VL
7835    && rtx_equal_p (operands[2], operands[0])"
7836   "vextract<shuffletype>32x4\t{$0x1, %1, %0%{%3%}|%0%{%3%}, %1, 0x1}"
7837   [(set_attr "type" "sselog1")
7838    (set_attr "length_immediate" "1")
7839    (set_attr "prefix" "evex")
7840    (set_attr "mode" "<sseinsnmode>")])
7841
7842 (define_insn "vec_extract_hi_<mode>_mask"
7843   [(set (match_operand:<ssehalfvecmode> 0 "register_operand" "=v")
7844         (vec_merge:<ssehalfvecmode>
7845           (vec_select:<ssehalfvecmode>
7846             (match_operand:VI4F_256 1 "register_operand" "v")
7847             (parallel [(const_int 4) (const_int 5)
7848                        (const_int 6) (const_int 7)]))
7849           (match_operand:<ssehalfvecmode> 2 "vector_move_operand" "0C")
7850           (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk")))]
7851   "TARGET_AVX512VL"
7852   "vextract<shuffletype>32x4\t{$0x1, %1, %0%{%3%}%N2|%0%{%3%}%N2, %1, 0x1}"
7853   [(set_attr "type" "sselog1")
7854    (set_attr "length_immediate" "1")
7855    (set_attr "prefix" "evex")
7856    (set_attr "mode" "<sseinsnmode>")])
7857
7858 (define_insn "vec_extract_hi_<mode>"
7859   [(set (match_operand:<ssehalfvecmode> 0 "nonimmediate_operand" "=xm, vm")
7860         (vec_select:<ssehalfvecmode>
7861           (match_operand:VI4F_256 1 "register_operand" "x, v")
7862           (parallel [(const_int 4) (const_int 5)
7863                      (const_int 6) (const_int 7)])))]
7864   "TARGET_AVX"
7865   "@
7866     vextract<i128>\t{$0x1, %1, %0|%0, %1, 0x1}
7867     vextract<shuffletype>32x4\t{$0x1, %1, %0|%0, %1, 0x1}"
7868   [(set_attr "isa" "*, avx512vl")
7869    (set_attr "prefix" "vex, evex")
7870    (set_attr "type" "sselog1")
7871    (set_attr "length_immediate" "1")
7872    (set_attr "mode" "<sseinsnmode>")])
7873
7874 (define_insn_and_split "vec_extract_lo_v32hi"
7875   [(set (match_operand:V16HI 0 "nonimmediate_operand" "=v,v,m")
7876         (vec_select:V16HI
7877           (match_operand:V32HI 1 "nonimmediate_operand" "v,m,v")
7878           (parallel [(const_int 0) (const_int 1)
7879                      (const_int 2) (const_int 3)
7880                      (const_int 4) (const_int 5)
7881                      (const_int 6) (const_int 7)
7882                      (const_int 8) (const_int 9)
7883                      (const_int 10) (const_int 11)
7884                      (const_int 12) (const_int 13)
7885                      (const_int 14) (const_int 15)])))]
7886   "TARGET_AVX512F && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
7887 {
7888   if (TARGET_AVX512VL
7889       || REG_P (operands[0])
7890       || !EXT_REX_SSE_REG_P (operands[1]))
7891     return "#";
7892   else
7893     return "vextracti64x4\t{$0x0, %1, %0|%0, %1, 0x0}";
7894 }
7895   "&& reload_completed
7896    && (TARGET_AVX512VL
7897        || REG_P (operands[0])
7898        || !EXT_REX_SSE_REG_P (operands[1]))"
7899   [(set (match_dup 0) (match_dup 1))]
7900 {
7901   if (!TARGET_AVX512VL
7902       && REG_P (operands[0])
7903       && EXT_REX_SSE_REG_P (operands[1]))
7904     operands[0] = lowpart_subreg (V32HImode, operands[0], V16HImode);
7905   else
7906     operands[1] = gen_lowpart (V16HImode, operands[1]);
7907 }
7908   [(set_attr "type" "sselog1")
7909    (set_attr "prefix_extra" "1")
7910    (set_attr "length_immediate" "1")
7911    (set_attr "memory" "none,load,store")
7912    (set_attr "prefix" "evex")
7913    (set_attr "mode" "XI")])
7914
7915 (define_insn "vec_extract_hi_v32hi"
7916   [(set (match_operand:V16HI 0 "nonimmediate_operand" "=vm")
7917         (vec_select:V16HI
7918           (match_operand:V32HI 1 "register_operand" "v")
7919           (parallel [(const_int 16) (const_int 17)
7920                      (const_int 18) (const_int 19)
7921                      (const_int 20) (const_int 21)
7922                      (const_int 22) (const_int 23)
7923                      (const_int 24) (const_int 25)
7924                      (const_int 26) (const_int 27)
7925                      (const_int 28) (const_int 29)
7926                      (const_int 30) (const_int 31)])))]
7927   "TARGET_AVX512F"
7928   "vextracti64x4\t{$0x1, %1, %0|%0, %1, 0x1}"
7929   [(set_attr "type" "sselog1")
7930    (set_attr "prefix_extra" "1")
7931    (set_attr "length_immediate" "1")
7932    (set_attr "prefix" "evex")
7933    (set_attr "mode" "XI")])
7934
7935 (define_insn_and_split "vec_extract_lo_v16hi"
7936   [(set (match_operand:V8HI 0 "nonimmediate_operand" "=v,m")
7937         (vec_select:V8HI
7938           (match_operand:V16HI 1 "nonimmediate_operand" "vm,v")
7939           (parallel [(const_int 0) (const_int 1)
7940                      (const_int 2) (const_int 3)
7941                      (const_int 4) (const_int 5)
7942                      (const_int 6) (const_int 7)])))]
7943   "TARGET_AVX && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
7944   "#"
7945   "&& reload_completed"
7946   [(set (match_dup 0) (match_dup 1))]
7947   "operands[1] = gen_lowpart (V8HImode, operands[1]);")
7948
7949 (define_insn "vec_extract_hi_v16hi"
7950   [(set (match_operand:V8HI 0 "nonimmediate_operand" "=xm,vm,vm")
7951         (vec_select:V8HI
7952           (match_operand:V16HI 1 "register_operand" "x,v,v")
7953           (parallel [(const_int 8) (const_int 9)
7954                      (const_int 10) (const_int 11)
7955                      (const_int 12) (const_int 13)
7956                      (const_int 14) (const_int 15)])))]
7957   "TARGET_AVX"
7958   "@
7959    vextract%~128\t{$0x1, %1, %0|%0, %1, 0x1}
7960    vextracti32x4\t{$0x1, %1, %0|%0, %1, 0x1}
7961    vextracti32x4\t{$0x1, %g1, %0|%0, %g1, 0x1}"
7962   [(set_attr "type" "sselog1")
7963    (set_attr "prefix_extra" "1")
7964    (set_attr "length_immediate" "1")
7965    (set_attr "isa" "*,avx512dq,avx512f")
7966    (set_attr "prefix" "vex,evex,evex")
7967    (set_attr "mode" "OI")])
7968
7969 (define_insn_and_split "vec_extract_lo_v64qi"
7970   [(set (match_operand:V32QI 0 "nonimmediate_operand" "=v,v,m")
7971         (vec_select:V32QI
7972           (match_operand:V64QI 1 "nonimmediate_operand" "v,m,v")
7973           (parallel [(const_int 0) (const_int 1)
7974                      (const_int 2) (const_int 3)
7975                      (const_int 4) (const_int 5)
7976                      (const_int 6) (const_int 7)
7977                      (const_int 8) (const_int 9)
7978                      (const_int 10) (const_int 11)
7979                      (const_int 12) (const_int 13)
7980                      (const_int 14) (const_int 15)
7981                      (const_int 16) (const_int 17)
7982                      (const_int 18) (const_int 19)
7983                      (const_int 20) (const_int 21)
7984                      (const_int 22) (const_int 23)
7985                      (const_int 24) (const_int 25)
7986                      (const_int 26) (const_int 27)
7987                      (const_int 28) (const_int 29)
7988                      (const_int 30) (const_int 31)])))]
7989   "TARGET_AVX512F && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
7990 {
7991   if (TARGET_AVX512VL
7992       || REG_P (operands[0])
7993       || !EXT_REX_SSE_REG_P (operands[1]))
7994     return "#";
7995   else
7996     return "vextracti64x4\t{$0x0, %1, %0|%0, %1, 0x0}";
7997 }
7998   "&& reload_completed
7999    && (TARGET_AVX512VL
8000        || REG_P (operands[0])
8001        || !EXT_REX_SSE_REG_P (operands[1]))"
8002   [(set (match_dup 0) (match_dup 1))]
8003 {
8004   if (!TARGET_AVX512VL
8005       && REG_P (operands[0])
8006       && EXT_REX_SSE_REG_P (operands[1]))
8007     operands[0] = lowpart_subreg (V64QImode, operands[0], V32QImode);
8008   else
8009     operands[1] = gen_lowpart (V32QImode, operands[1]);
8010 }
8011   [(set_attr "type" "sselog1")
8012    (set_attr "prefix_extra" "1")
8013    (set_attr "length_immediate" "1")
8014    (set_attr "memory" "none,load,store")
8015    (set_attr "prefix" "evex")
8016    (set_attr "mode" "XI")])
8017
8018 (define_insn "vec_extract_hi_v64qi"
8019   [(set (match_operand:V32QI 0 "nonimmediate_operand" "=vm")
8020         (vec_select:V32QI
8021           (match_operand:V64QI 1 "register_operand" "v")
8022           (parallel [(const_int 32) (const_int 33)
8023                      (const_int 34) (const_int 35)
8024                      (const_int 36) (const_int 37)
8025                      (const_int 38) (const_int 39)
8026                      (const_int 40) (const_int 41)
8027                      (const_int 42) (const_int 43)
8028                      (const_int 44) (const_int 45)
8029                      (const_int 46) (const_int 47)
8030                      (const_int 48) (const_int 49)
8031                      (const_int 50) (const_int 51)
8032                      (const_int 52) (const_int 53)
8033                      (const_int 54) (const_int 55)
8034                      (const_int 56) (const_int 57)
8035                      (const_int 58) (const_int 59)
8036                      (const_int 60) (const_int 61)
8037                      (const_int 62) (const_int 63)])))]
8038   "TARGET_AVX512F"
8039   "vextracti64x4\t{$0x1, %1, %0|%0, %1, 0x1}"
8040   [(set_attr "type" "sselog1")
8041    (set_attr "prefix_extra" "1")
8042    (set_attr "length_immediate" "1")
8043    (set_attr "prefix" "evex")
8044    (set_attr "mode" "XI")])
8045
8046 (define_insn_and_split "vec_extract_lo_v32qi"
8047   [(set (match_operand:V16QI 0 "nonimmediate_operand" "=v,m")
8048         (vec_select:V16QI
8049           (match_operand:V32QI 1 "nonimmediate_operand" "vm,v")
8050           (parallel [(const_int 0) (const_int 1)
8051                      (const_int 2) (const_int 3)
8052                      (const_int 4) (const_int 5)
8053                      (const_int 6) (const_int 7)
8054                      (const_int 8) (const_int 9)
8055                      (const_int 10) (const_int 11)
8056                      (const_int 12) (const_int 13)
8057                      (const_int 14) (const_int 15)])))]
8058   "TARGET_AVX && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
8059   "#"
8060   "&& reload_completed"
8061   [(set (match_dup 0) (match_dup 1))]
8062   "operands[1] = gen_lowpart (V16QImode, operands[1]);")
8063
8064 (define_insn "vec_extract_hi_v32qi"
8065   [(set (match_operand:V16QI 0 "nonimmediate_operand" "=xm,vm,vm")
8066         (vec_select:V16QI
8067           (match_operand:V32QI 1 "register_operand" "x,v,v")
8068           (parallel [(const_int 16) (const_int 17)
8069                      (const_int 18) (const_int 19)
8070                      (const_int 20) (const_int 21)
8071                      (const_int 22) (const_int 23)
8072                      (const_int 24) (const_int 25)
8073                      (const_int 26) (const_int 27)
8074                      (const_int 28) (const_int 29)
8075                      (const_int 30) (const_int 31)])))]
8076   "TARGET_AVX"
8077   "@
8078    vextract%~128\t{$0x1, %1, %0|%0, %1, 0x1}
8079    vextracti32x4\t{$0x1, %1, %0|%0, %1, 0x1}
8080    vextracti32x4\t{$0x1, %g1, %0|%0, %g1, 0x1}"
8081   [(set_attr "type" "sselog1")
8082    (set_attr "prefix_extra" "1")
8083    (set_attr "length_immediate" "1")
8084    (set_attr "isa" "*,avx512dq,avx512f")
8085    (set_attr "prefix" "vex,evex,evex")
8086    (set_attr "mode" "OI")])
8087
8088 ;; Modes handled by vec_extract patterns.
8089 (define_mode_iterator VEC_EXTRACT_MODE
8090   [(V64QI "TARGET_AVX512BW") (V32QI "TARGET_AVX") V16QI
8091    (V32HI "TARGET_AVX512BW") (V16HI "TARGET_AVX") V8HI
8092    (V16SI "TARGET_AVX512F") (V8SI "TARGET_AVX") V4SI
8093    (V8DI "TARGET_AVX512F") (V4DI "TARGET_AVX") V2DI
8094    (V16SF "TARGET_AVX512F") (V8SF "TARGET_AVX") V4SF
8095    (V8DF "TARGET_AVX512F") (V4DF "TARGET_AVX") V2DF
8096    (V4TI "TARGET_AVX512F") (V2TI "TARGET_AVX")])
8097
8098 (define_expand "vec_extract<mode><ssescalarmodelower>"
8099   [(match_operand:<ssescalarmode> 0 "register_operand")
8100    (match_operand:VEC_EXTRACT_MODE 1 "register_operand")
8101    (match_operand 2 "const_int_operand")]
8102   "TARGET_SSE"
8103 {
8104   ix86_expand_vector_extract (false, operands[0], operands[1],
8105                               INTVAL (operands[2]));
8106   DONE;
8107 })
8108
8109 (define_expand "vec_extract<mode><ssehalfvecmodelower>"
8110   [(match_operand:<ssehalfvecmode> 0 "nonimmediate_operand")
8111    (match_operand:V_512 1 "register_operand")
8112    (match_operand 2 "const_0_to_1_operand")]
8113   "TARGET_AVX512F"
8114 {
8115   if (INTVAL (operands[2]))
8116     emit_insn (gen_vec_extract_hi_<mode> (operands[0], operands[1]));
8117   else
8118     emit_insn (gen_vec_extract_lo_<mode> (operands[0], operands[1]));
8119   DONE;
8120 })
8121
8122 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8123 ;;
8124 ;; Parallel double-precision floating point element swizzling
8125 ;;
8126 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8127
8128 (define_insn "<mask_codefor>avx512f_unpckhpd512<mask_name>"
8129   [(set (match_operand:V8DF 0 "register_operand" "=v")
8130         (vec_select:V8DF
8131           (vec_concat:V16DF
8132             (match_operand:V8DF 1 "register_operand" "v")
8133             (match_operand:V8DF 2 "nonimmediate_operand" "vm"))
8134           (parallel [(const_int 1) (const_int 9)
8135                      (const_int 3) (const_int 11)
8136                      (const_int 5) (const_int 13)
8137                      (const_int 7) (const_int 15)])))]
8138   "TARGET_AVX512F"
8139   "vunpckhpd\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
8140   [(set_attr "type" "sselog")
8141    (set_attr "prefix" "evex")
8142    (set_attr "mode" "V8DF")])
8143
8144 ;; Recall that the 256-bit unpck insns only shuffle within their lanes.
8145 (define_insn "avx_unpckhpd256<mask_name>"
8146   [(set (match_operand:V4DF 0 "register_operand" "=v")
8147         (vec_select:V4DF
8148           (vec_concat:V8DF
8149             (match_operand:V4DF 1 "register_operand" "v")
8150             (match_operand:V4DF 2 "nonimmediate_operand" "vm"))
8151           (parallel [(const_int 1) (const_int 5)
8152                      (const_int 3) (const_int 7)])))]
8153   "TARGET_AVX && <mask_avx512vl_condition>"
8154   "vunpckhpd\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
8155   [(set_attr "type" "sselog")
8156    (set_attr "prefix" "vex")
8157    (set_attr "mode" "V4DF")])
8158
8159 (define_expand "vec_interleave_highv4df"
8160   [(set (match_dup 3)
8161         (vec_select:V4DF
8162           (vec_concat:V8DF
8163             (match_operand:V4DF 1 "register_operand")
8164             (match_operand:V4DF 2 "nonimmediate_operand"))
8165           (parallel [(const_int 0) (const_int 4)
8166                      (const_int 2) (const_int 6)])))
8167    (set (match_dup 4)
8168         (vec_select:V4DF
8169           (vec_concat:V8DF
8170             (match_dup 1)
8171             (match_dup 2))
8172           (parallel [(const_int 1) (const_int 5)
8173                      (const_int 3) (const_int 7)])))
8174    (set (match_operand:V4DF 0 "register_operand")
8175         (vec_select:V4DF
8176           (vec_concat:V8DF
8177             (match_dup 3)
8178             (match_dup 4))
8179           (parallel [(const_int 2) (const_int 3)
8180                      (const_int 6) (const_int 7)])))]
8181  "TARGET_AVX"
8182 {
8183   operands[3] = gen_reg_rtx (V4DFmode);
8184   operands[4] = gen_reg_rtx (V4DFmode);
8185 })
8186
8187
8188 (define_insn "avx512vl_unpckhpd128_mask"
8189   [(set (match_operand:V2DF 0 "register_operand" "=v")
8190         (vec_merge:V2DF
8191           (vec_select:V2DF
8192             (vec_concat:V4DF
8193               (match_operand:V2DF 1 "register_operand" "v")
8194               (match_operand:V2DF 2 "nonimmediate_operand" "vm"))
8195             (parallel [(const_int 1) (const_int 3)]))
8196           (match_operand:V2DF 3 "vector_move_operand" "0C")
8197           (match_operand:QI 4 "register_operand" "Yk")))]
8198   "TARGET_AVX512VL"
8199   "vunpckhpd\t{%2, %1, %0%{%4%}%N3|%0%{%4%}%N3, %1, %2}"
8200   [(set_attr "type" "sselog")
8201    (set_attr "prefix" "evex")
8202    (set_attr "mode" "V2DF")])
8203
8204 (define_expand "vec_interleave_highv2df"
8205   [(set (match_operand:V2DF 0 "register_operand")
8206         (vec_select:V2DF
8207           (vec_concat:V4DF
8208             (match_operand:V2DF 1 "nonimmediate_operand")
8209             (match_operand:V2DF 2 "nonimmediate_operand"))
8210           (parallel [(const_int 1)
8211                      (const_int 3)])))]
8212   "TARGET_SSE2"
8213 {
8214   if (!ix86_vec_interleave_v2df_operator_ok (operands, 1))
8215     operands[2] = force_reg (V2DFmode, operands[2]);
8216 })
8217
8218 (define_insn "*vec_interleave_highv2df"
8219   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,v,v,x,v,m")
8220         (vec_select:V2DF
8221           (vec_concat:V4DF
8222             (match_operand:V2DF 1 "nonimmediate_operand" " 0,v,o,o,o,v")
8223             (match_operand:V2DF 2 "nonimmediate_operand" " x,v,1,0,v,0"))
8224           (parallel [(const_int 1)
8225                      (const_int 3)])))]
8226   "TARGET_SSE2 && ix86_vec_interleave_v2df_operator_ok (operands, 1)"
8227   "@
8228    unpckhpd\t{%2, %0|%0, %2}
8229    vunpckhpd\t{%2, %1, %0|%0, %1, %2}
8230    %vmovddup\t{%H1, %0|%0, %H1}
8231    movlpd\t{%H1, %0|%0, %H1}
8232    vmovlpd\t{%H1, %2, %0|%0, %2, %H1}
8233    %vmovhpd\t{%1, %0|%q0, %1}"
8234   [(set_attr "isa" "noavx,avx,sse3,noavx,avx,*")
8235    (set_attr "type" "sselog,sselog,sselog,ssemov,ssemov,ssemov")
8236    (set (attr "prefix_data16")
8237      (if_then_else (eq_attr "alternative" "3,5")
8238                    (const_string "1")
8239                    (const_string "*")))
8240    (set_attr "prefix" "orig,maybe_evex,maybe_vex,orig,maybe_evex,maybe_vex")
8241    (set_attr "mode" "V2DF,V2DF,DF,V1DF,V1DF,V1DF")])
8242
8243 (define_expand "avx512f_movddup512<mask_name>"
8244   [(set (match_operand:V8DF 0 "register_operand")
8245         (vec_select:V8DF
8246           (vec_concat:V16DF
8247             (match_operand:V8DF 1 "nonimmediate_operand")
8248             (match_dup 1))
8249           (parallel [(const_int 0) (const_int 8)
8250                      (const_int 2) (const_int 10)
8251                      (const_int 4) (const_int 12)
8252                      (const_int 6) (const_int 14)])))]
8253   "TARGET_AVX512F")
8254
8255 (define_expand "avx512f_unpcklpd512<mask_name>"
8256   [(set (match_operand:V8DF 0 "register_operand")
8257         (vec_select:V8DF
8258           (vec_concat:V16DF
8259             (match_operand:V8DF 1 "register_operand")
8260             (match_operand:V8DF 2 "nonimmediate_operand"))
8261           (parallel [(const_int 0) (const_int 8)
8262                      (const_int 2) (const_int 10)
8263                      (const_int 4) (const_int 12)
8264                      (const_int 6) (const_int 14)])))]
8265   "TARGET_AVX512F")
8266
8267 (define_insn "*avx512f_unpcklpd512<mask_name>"
8268   [(set (match_operand:V8DF 0 "register_operand" "=v,v")
8269         (vec_select:V8DF
8270           (vec_concat:V16DF
8271             (match_operand:V8DF 1 "nonimmediate_operand" "vm, v")
8272             (match_operand:V8DF 2 "nonimmediate_operand" "1 ,vm"))
8273           (parallel [(const_int 0) (const_int 8)
8274                      (const_int 2) (const_int 10)
8275                      (const_int 4) (const_int 12)
8276                      (const_int 6) (const_int 14)])))]
8277   "TARGET_AVX512F"
8278   "@
8279    vmovddup\t{%1, %0<mask_operand3>|%0<mask_operand3>, %1}
8280    vunpcklpd\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
8281   [(set_attr "type" "sselog")
8282    (set_attr "prefix" "evex")
8283    (set_attr "mode" "V8DF")])
8284
8285 ;; Recall that the 256-bit unpck insns only shuffle within their lanes.
8286 (define_expand "avx_movddup256<mask_name>"
8287   [(set (match_operand:V4DF 0 "register_operand")
8288         (vec_select:V4DF
8289           (vec_concat:V8DF
8290             (match_operand:V4DF 1 "nonimmediate_operand")
8291             (match_dup 1))
8292           (parallel [(const_int 0) (const_int 4)
8293                      (const_int 2) (const_int 6)])))]
8294   "TARGET_AVX && <mask_avx512vl_condition>")
8295
8296 (define_expand "avx_unpcklpd256<mask_name>"
8297   [(set (match_operand:V4DF 0 "register_operand")
8298         (vec_select:V4DF
8299           (vec_concat:V8DF
8300             (match_operand:V4DF 1 "register_operand")
8301             (match_operand:V4DF 2 "nonimmediate_operand"))
8302           (parallel [(const_int 0) (const_int 4)
8303                      (const_int 2) (const_int 6)])))]
8304   "TARGET_AVX && <mask_avx512vl_condition>")
8305
8306 (define_insn "*avx_unpcklpd256<mask_name>"
8307   [(set (match_operand:V4DF 0 "register_operand"         "=v,v")
8308         (vec_select:V4DF
8309           (vec_concat:V8DF
8310             (match_operand:V4DF 1 "nonimmediate_operand" " v,m")
8311             (match_operand:V4DF 2 "nonimmediate_operand" "vm,1"))
8312           (parallel [(const_int 0) (const_int 4)
8313                      (const_int 2) (const_int 6)])))]
8314   "TARGET_AVX && <mask_avx512vl_condition>"
8315   "@
8316    vunpcklpd\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}
8317    vmovddup\t{%1, %0<mask_operand3>|%0<mask_operand3>, %1}"
8318   [(set_attr "type" "sselog")
8319    (set_attr "prefix" "vex")
8320    (set_attr "mode" "V4DF")])
8321
8322 (define_expand "vec_interleave_lowv4df"
8323   [(set (match_dup 3)
8324         (vec_select:V4DF
8325           (vec_concat:V8DF
8326             (match_operand:V4DF 1 "register_operand")
8327             (match_operand:V4DF 2 "nonimmediate_operand"))
8328           (parallel [(const_int 0) (const_int 4)
8329                      (const_int 2) (const_int 6)])))
8330    (set (match_dup 4)
8331         (vec_select:V4DF
8332           (vec_concat:V8DF
8333             (match_dup 1)
8334             (match_dup 2))
8335           (parallel [(const_int 1) (const_int 5)
8336                      (const_int 3) (const_int 7)])))
8337    (set (match_operand:V4DF 0 "register_operand")
8338         (vec_select:V4DF
8339           (vec_concat:V8DF
8340             (match_dup 3)
8341             (match_dup 4))
8342           (parallel [(const_int 0) (const_int 1)
8343                      (const_int 4) (const_int 5)])))]
8344  "TARGET_AVX"
8345 {
8346   operands[3] = gen_reg_rtx (V4DFmode);
8347   operands[4] = gen_reg_rtx (V4DFmode);
8348 })
8349
8350 (define_insn "avx512vl_unpcklpd128_mask"
8351   [(set (match_operand:V2DF 0 "register_operand" "=v")
8352         (vec_merge:V2DF
8353           (vec_select:V2DF
8354             (vec_concat:V4DF
8355               (match_operand:V2DF 1 "register_operand" "v")
8356               (match_operand:V2DF 2 "nonimmediate_operand" "vm"))
8357             (parallel [(const_int 0) (const_int 2)]))
8358           (match_operand:V2DF 3 "vector_move_operand" "0C")
8359           (match_operand:QI 4 "register_operand" "Yk")))]
8360   "TARGET_AVX512VL"
8361   "vunpcklpd\t{%2, %1, %0%{%4%}%N3|%0%{%4%}%N3, %1, %2}"
8362   [(set_attr "type" "sselog")
8363    (set_attr "prefix" "evex")
8364    (set_attr "mode" "V2DF")])
8365
8366 (define_expand "vec_interleave_lowv2df"
8367   [(set (match_operand:V2DF 0 "register_operand")
8368         (vec_select:V2DF
8369           (vec_concat:V4DF
8370             (match_operand:V2DF 1 "nonimmediate_operand")
8371             (match_operand:V2DF 2 "nonimmediate_operand"))
8372           (parallel [(const_int 0)
8373                      (const_int 2)])))]
8374   "TARGET_SSE2"
8375 {
8376   if (!ix86_vec_interleave_v2df_operator_ok (operands, 0))
8377     operands[1] = force_reg (V2DFmode, operands[1]);
8378 })
8379
8380 (define_insn "*vec_interleave_lowv2df"
8381   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,v,v,x,v,o")
8382         (vec_select:V2DF
8383           (vec_concat:V4DF
8384             (match_operand:V2DF 1 "nonimmediate_operand" " 0,v,m,0,v,0")
8385             (match_operand:V2DF 2 "nonimmediate_operand" " x,v,1,m,m,v"))
8386           (parallel [(const_int 0)
8387                      (const_int 2)])))]
8388   "TARGET_SSE2 && ix86_vec_interleave_v2df_operator_ok (operands, 0)"
8389   "@
8390    unpcklpd\t{%2, %0|%0, %2}
8391    vunpcklpd\t{%2, %1, %0|%0, %1, %2}
8392    %vmovddup\t{%1, %0|%0, %q1}
8393    movhpd\t{%2, %0|%0, %q2}
8394    vmovhpd\t{%2, %1, %0|%0, %1, %q2}
8395    %vmovlpd\t{%2, %H0|%H0, %2}"
8396   [(set_attr "isa" "noavx,avx,sse3,noavx,avx,*")
8397    (set_attr "type" "sselog,sselog,sselog,ssemov,ssemov,ssemov")
8398    (set (attr "prefix_data16")
8399      (if_then_else (eq_attr "alternative" "3,5")
8400                    (const_string "1")
8401                    (const_string "*")))
8402    (set_attr "prefix" "orig,maybe_evex,maybe_vex,orig,maybe_evex,maybe_vex")
8403    (set_attr "mode" "V2DF,V2DF,DF,V1DF,V1DF,V1DF")])
8404
8405 (define_split
8406   [(set (match_operand:V2DF 0 "memory_operand")
8407         (vec_select:V2DF
8408           (vec_concat:V4DF
8409             (match_operand:V2DF 1 "register_operand")
8410             (match_dup 1))
8411           (parallel [(const_int 0)
8412                      (const_int 2)])))]
8413   "TARGET_SSE3 && reload_completed"
8414   [(const_int 0)]
8415 {
8416   rtx low = gen_lowpart (DFmode, operands[1]);
8417
8418   emit_move_insn (adjust_address (operands[0], DFmode, 0), low);
8419   emit_move_insn (adjust_address (operands[0], DFmode, 8), low);
8420   DONE;
8421 })
8422
8423 (define_split
8424   [(set (match_operand:V2DF 0 "register_operand")
8425         (vec_select:V2DF
8426           (vec_concat:V4DF
8427             (match_operand:V2DF 1 "memory_operand")
8428             (match_dup 1))
8429           (parallel [(match_operand:SI 2 "const_0_to_1_operand")
8430                      (match_operand:SI 3 "const_int_operand")])))]
8431   "TARGET_SSE3 && INTVAL (operands[2]) + 2 == INTVAL (operands[3])"
8432   [(set (match_dup 0) (vec_duplicate:V2DF (match_dup 1)))]
8433 {
8434   operands[1] = adjust_address (operands[1], DFmode, INTVAL (operands[2]) * 8);
8435 })
8436
8437 (define_insn "avx512f_vmscalef<mode><mask_scalar_name><round_scalar_name>"
8438   [(set (match_operand:VF_128 0 "register_operand" "=v")
8439         (vec_merge:VF_128
8440           (unspec:VF_128
8441             [(match_operand:VF_128 1 "register_operand" "v")
8442              (match_operand:VF_128 2 "<round_scalar_nimm_predicate>" "<round_scalar_constraint>")]
8443             UNSPEC_SCALEF)
8444           (match_dup 1)
8445           (const_int 1)))]
8446   "TARGET_AVX512F"
8447   "vscalef<ssescalarmodesuffix>\t{<round_scalar_mask_op3>%2, %1, %0<mask_scalar_operand3>|%0<mask_scalar_operand3>, %1, %2<round_scalar_mask_op3>}"
8448   [(set_attr "prefix" "evex")
8449    (set_attr "mode"  "<ssescalarmode>")])
8450
8451 (define_insn "<avx512>_scalef<mode><mask_name><round_name>"
8452   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
8453         (unspec:VF_AVX512VL
8454           [(match_operand:VF_AVX512VL 1 "register_operand" "v")
8455            (match_operand:VF_AVX512VL 2 "nonimmediate_operand" "<round_constraint>")]
8456           UNSPEC_SCALEF))]
8457   "TARGET_AVX512F"
8458   "vscalef<ssemodesuffix>\t{<round_mask_op3>%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2<round_mask_op3>}"
8459   [(set_attr "prefix" "evex")
8460    (set_attr "mode"  "<MODE>")])
8461
8462 (define_expand "<avx512>_vternlog<mode>_maskz"
8463   [(match_operand:VI48_AVX512VL 0 "register_operand")
8464    (match_operand:VI48_AVX512VL 1 "register_operand")
8465    (match_operand:VI48_AVX512VL 2 "register_operand")
8466    (match_operand:VI48_AVX512VL 3 "nonimmediate_operand")
8467    (match_operand:SI 4 "const_0_to_255_operand")
8468    (match_operand:<avx512fmaskmode> 5 "register_operand")]
8469   "TARGET_AVX512F"
8470 {
8471   emit_insn (gen_<avx512>_vternlog<mode>_maskz_1 (
8472     operands[0], operands[1], operands[2], operands[3],
8473     operands[4], CONST0_RTX (<MODE>mode), operands[5]));
8474   DONE;
8475 })
8476
8477 (define_insn "<avx512>_vternlog<mode><sd_maskz_name>"
8478   [(set (match_operand:VI48_AVX512VL 0 "register_operand" "=v")
8479         (unspec:VI48_AVX512VL
8480           [(match_operand:VI48_AVX512VL 1 "register_operand" "0")
8481            (match_operand:VI48_AVX512VL 2 "register_operand" "v")
8482            (match_operand:VI48_AVX512VL 3 "nonimmediate_operand" "vm")
8483            (match_operand:SI 4 "const_0_to_255_operand")]
8484           UNSPEC_VTERNLOG))]
8485   "TARGET_AVX512F"
8486   "vpternlog<ssemodesuffix>\t{%4, %3, %2, %0<sd_mask_op5>|%0<sd_mask_op5>, %2, %3, %4}"
8487   [(set_attr "type" "sselog")
8488    (set_attr "prefix" "evex")
8489    (set_attr "mode" "<sseinsnmode>")])
8490
8491 (define_insn "<avx512>_vternlog<mode>_mask"
8492   [(set (match_operand:VI48_AVX512VL 0 "register_operand" "=v")
8493         (vec_merge:VI48_AVX512VL
8494           (unspec:VI48_AVX512VL
8495             [(match_operand:VI48_AVX512VL 1 "register_operand" "0")
8496              (match_operand:VI48_AVX512VL 2 "register_operand" "v")
8497              (match_operand:VI48_AVX512VL 3 "nonimmediate_operand" "vm")
8498              (match_operand:SI 4 "const_0_to_255_operand")]
8499             UNSPEC_VTERNLOG)
8500           (match_dup 1)
8501           (match_operand:<avx512fmaskmode> 5 "register_operand" "Yk")))]
8502   "TARGET_AVX512F"
8503   "vpternlog<ssemodesuffix>\t{%4, %3, %2, %0%{%5%}|%0%{%5%}, %2, %3, %4}"
8504   [(set_attr "type" "sselog")
8505    (set_attr "prefix" "evex")
8506    (set_attr "mode" "<sseinsnmode>")])
8507
8508 (define_insn "<avx512>_getexp<mode><mask_name><round_saeonly_name>"
8509   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
8510         (unspec:VF_AVX512VL [(match_operand:VF_AVX512VL 1 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")]
8511                         UNSPEC_GETEXP))]
8512    "TARGET_AVX512F"
8513    "vgetexp<ssemodesuffix>\t{<round_saeonly_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_saeonly_mask_op2>}";
8514     [(set_attr "prefix" "evex")
8515      (set_attr "mode" "<MODE>")])
8516
8517 (define_insn "avx512f_sgetexp<mode><mask_scalar_name><round_saeonly_scalar_name>"
8518   [(set (match_operand:VF_128 0 "register_operand" "=v")
8519         (vec_merge:VF_128
8520           (unspec:VF_128
8521             [(match_operand:VF_128 1 "register_operand" "v")
8522              (match_operand:VF_128 2 "<round_saeonly_scalar_nimm_predicate>" "<round_saeonly_scalar_constraint>")]
8523             UNSPEC_GETEXP)
8524           (match_dup 1)
8525           (const_int 1)))]
8526    "TARGET_AVX512F"
8527    "vgetexp<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>}";
8528     [(set_attr "prefix" "evex")
8529      (set_attr "mode" "<ssescalarmode>")])
8530
8531 (define_insn "<mask_codefor><avx512>_align<mode><mask_name>"
8532   [(set (match_operand:VI48_AVX512VL 0 "register_operand" "=v")
8533         (unspec:VI48_AVX512VL [(match_operand:VI48_AVX512VL 1 "register_operand" "v")
8534                                (match_operand:VI48_AVX512VL 2 "nonimmediate_operand" "vm")
8535                                (match_operand:SI 3 "const_0_to_255_operand")]
8536                               UNSPEC_ALIGN))]
8537   "TARGET_AVX512F"
8538   "valign<ssemodesuffix>\t{%3, %2, %1, %0<mask_operand4>|%0<mask_operand4>, %1, %2, %3}";
8539   [(set_attr "prefix" "evex")
8540    (set_attr "mode" "<sseinsnmode>")])
8541
8542 (define_expand "avx512f_shufps512_mask"
8543   [(match_operand:V16SF 0 "register_operand")
8544    (match_operand:V16SF 1 "register_operand")
8545    (match_operand:V16SF 2 "nonimmediate_operand")
8546    (match_operand:SI 3 "const_0_to_255_operand")
8547    (match_operand:V16SF 4 "register_operand")
8548    (match_operand:HI 5 "register_operand")]
8549   "TARGET_AVX512F"
8550 {
8551   int mask = INTVAL (operands[3]);
8552   emit_insn (gen_avx512f_shufps512_1_mask (operands[0], operands[1], operands[2],
8553                                           GEN_INT ((mask >> 0) & 3),
8554                                           GEN_INT ((mask >> 2) & 3),
8555                                           GEN_INT (((mask >> 4) & 3) + 16),
8556                                           GEN_INT (((mask >> 6) & 3) + 16),
8557                                           GEN_INT (((mask >> 0) & 3) + 4),
8558                                           GEN_INT (((mask >> 2) & 3) + 4),
8559                                           GEN_INT (((mask >> 4) & 3) + 20),
8560                                           GEN_INT (((mask >> 6) & 3) + 20),
8561                                           GEN_INT (((mask >> 0) & 3) + 8),
8562                                           GEN_INT (((mask >> 2) & 3) + 8),
8563                                           GEN_INT (((mask >> 4) & 3) + 24),
8564                                           GEN_INT (((mask >> 6) & 3) + 24),
8565                                           GEN_INT (((mask >> 0) & 3) + 12),
8566                                           GEN_INT (((mask >> 2) & 3) + 12),
8567                                           GEN_INT (((mask >> 4) & 3) + 28),
8568                                           GEN_INT (((mask >> 6) & 3) + 28),
8569                                           operands[4], operands[5]));
8570   DONE;
8571 })
8572
8573
8574 (define_expand "<avx512>_fixupimm<mode>_maskz<round_saeonly_expand_name>"
8575   [(match_operand:VF_AVX512VL 0 "register_operand")
8576    (match_operand:VF_AVX512VL 1 "register_operand")
8577    (match_operand:VF_AVX512VL 2 "register_operand")
8578    (match_operand:<sseintvecmode> 3 "<round_saeonly_expand_nimm_predicate>")
8579    (match_operand:SI 4 "const_0_to_255_operand")
8580    (match_operand:<avx512fmaskmode> 5 "register_operand")]
8581   "TARGET_AVX512F"
8582 {
8583   emit_insn (gen_<avx512>_fixupimm<mode>_maskz_1<round_saeonly_expand_name> (
8584         operands[0], operands[1], operands[2], operands[3],
8585         operands[4], CONST0_RTX (<MODE>mode), operands[5]
8586         <round_saeonly_expand_operand6>));
8587   DONE;
8588 })
8589
8590 (define_insn "<avx512>_fixupimm<mode><sd_maskz_name><round_saeonly_name>"
8591   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
8592         (unspec:VF_AVX512VL
8593           [(match_operand:VF_AVX512VL 1 "register_operand" "0")
8594            (match_operand:VF_AVX512VL 2 "register_operand" "v")
8595            (match_operand:<sseintvecmode> 3 "nonimmediate_operand" "<round_saeonly_constraint>")
8596            (match_operand:SI 4 "const_0_to_255_operand")]
8597            UNSPEC_FIXUPIMM))]
8598   "TARGET_AVX512F"
8599   "vfixupimm<ssemodesuffix>\t{%4, <round_saeonly_sd_mask_op5>%3, %2, %0<sd_mask_op5>|%0<sd_mask_op5>, %2, %3<round_saeonly_sd_mask_op5>, %4}";
8600   [(set_attr "prefix" "evex")
8601    (set_attr "mode" "<MODE>")])
8602
8603 (define_insn "<avx512>_fixupimm<mode>_mask<round_saeonly_name>"
8604   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
8605         (vec_merge:VF_AVX512VL
8606           (unspec:VF_AVX512VL
8607             [(match_operand:VF_AVX512VL 1 "register_operand" "0")
8608              (match_operand:VF_AVX512VL 2 "register_operand" "v")
8609              (match_operand:<sseintvecmode> 3 "nonimmediate_operand" "<round_saeonly_constraint>")
8610              (match_operand:SI 4 "const_0_to_255_operand")]
8611              UNSPEC_FIXUPIMM)
8612           (match_dup 1)
8613           (match_operand:<avx512fmaskmode> 5 "register_operand" "Yk")))]
8614   "TARGET_AVX512F"
8615   "vfixupimm<ssemodesuffix>\t{%4, <round_saeonly_op6>%3, %2, %0%{%5%}|%0%{%5%}, %2, %3<round_saeonly_op6>, %4}";
8616   [(set_attr "prefix" "evex")
8617    (set_attr "mode" "<MODE>")])
8618
8619 (define_expand "avx512f_sfixupimm<mode>_maskz<round_saeonly_expand_name>"
8620   [(match_operand:VF_128 0 "register_operand")
8621    (match_operand:VF_128 1 "register_operand")
8622    (match_operand:VF_128 2 "register_operand")
8623    (match_operand:<sseintvecmode> 3 "<round_saeonly_expand_nimm_predicate>")
8624    (match_operand:SI 4 "const_0_to_255_operand")
8625    (match_operand:<avx512fmaskmode> 5 "register_operand")]
8626   "TARGET_AVX512F"
8627 {
8628   emit_insn (gen_avx512f_sfixupimm<mode>_maskz_1<round_saeonly_expand_name> (
8629         operands[0], operands[1], operands[2], operands[3],
8630         operands[4], CONST0_RTX (<MODE>mode), operands[5]
8631         <round_saeonly_expand_operand6>));
8632   DONE;
8633 })
8634
8635 (define_insn "avx512f_sfixupimm<mode><sd_maskz_name><round_saeonly_name>"
8636   [(set (match_operand:VF_128 0 "register_operand" "=v")
8637         (vec_merge:VF_128
8638           (unspec:VF_128
8639             [(match_operand:VF_128 1 "register_operand" "0")
8640              (match_operand:VF_128 2 "register_operand" "v")
8641              (match_operand:<sseintvecmode> 3 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")
8642              (match_operand:SI 4 "const_0_to_255_operand")]
8643             UNSPEC_FIXUPIMM)
8644           (match_dup 1)
8645           (const_int 1)))]
8646    "TARGET_AVX512F"
8647    "vfixupimm<ssescalarmodesuffix>\t{%4, <round_saeonly_sd_mask_op5>%3, %2, %0<sd_mask_op5>|%0<sd_mask_op5>, %2, %<iptr>3<round_saeonly_sd_mask_op5>, %4}";
8648    [(set_attr "prefix" "evex")
8649    (set_attr "mode" "<ssescalarmode>")])
8650
8651 (define_insn "avx512f_sfixupimm<mode>_mask<round_saeonly_name>"
8652   [(set (match_operand:VF_128 0 "register_operand" "=v")
8653         (vec_merge:VF_128
8654           (vec_merge:VF_128
8655             (unspec:VF_128
8656                [(match_operand:VF_128 1 "register_operand" "0")
8657                 (match_operand:VF_128 2 "register_operand" "v")
8658                 (match_operand:<sseintvecmode> 3 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")
8659                 (match_operand:SI 4 "const_0_to_255_operand")]
8660                UNSPEC_FIXUPIMM)
8661             (match_dup 1)
8662             (const_int 1))
8663           (match_dup 1)
8664           (match_operand:<avx512fmaskmode> 5 "register_operand" "Yk")))]
8665   "TARGET_AVX512F"
8666   "vfixupimm<ssescalarmodesuffix>\t{%4, <round_saeonly_op6>%3, %2, %0%{%5%}|%0%{%5%}, %2, %<iptr>3<round_saeonly_op6>, %4}";
8667   [(set_attr "prefix" "evex")
8668    (set_attr "mode" "<ssescalarmode>")])
8669
8670 (define_insn "<avx512>_rndscale<mode><mask_name><round_saeonly_name>"
8671   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
8672         (unspec:VF_AVX512VL
8673           [(match_operand:VF_AVX512VL 1 "nonimmediate_operand" "<round_saeonly_constraint>")
8674            (match_operand:SI 2 "const_0_to_255_operand")]
8675           UNSPEC_ROUND))]
8676   "TARGET_AVX512F"
8677   "vrndscale<ssemodesuffix>\t{%2, <round_saeonly_mask_op3>%1, %0<mask_operand3>|%0<mask_operand3>, %1<round_saeonly_mask_op3>, %2}"
8678   [(set_attr "length_immediate" "1")
8679    (set_attr "prefix" "evex")
8680    (set_attr "mode" "<MODE>")])
8681
8682 (define_insn "avx512f_rndscale<mode><round_saeonly_name>"
8683   [(set (match_operand:VF_128 0 "register_operand" "=v")
8684         (vec_merge:VF_128
8685           (unspec:VF_128
8686             [(match_operand:VF_128 1 "register_operand" "v")
8687              (match_operand:VF_128 2 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")
8688              (match_operand:SI 3 "const_0_to_255_operand")]
8689             UNSPEC_ROUND)
8690           (match_dup 1)
8691           (const_int 1)))]
8692   "TARGET_AVX512F"
8693   "vrndscale<ssescalarmodesuffix>\t{%3, <round_saeonly_op4>%2, %1, %0|%0, %1, %<iptr>2<round_saeonly_op4>, %3}"
8694   [(set_attr "length_immediate" "1")
8695    (set_attr "prefix" "evex")
8696    (set_attr "mode" "<MODE>")])
8697
8698 ;; One bit in mask selects 2 elements.
8699 (define_insn "avx512f_shufps512_1<mask_name>"
8700   [(set (match_operand:V16SF 0 "register_operand" "=v")
8701         (vec_select:V16SF
8702           (vec_concat:V32SF
8703             (match_operand:V16SF 1 "register_operand" "v")
8704             (match_operand:V16SF 2 "nonimmediate_operand" "vm"))
8705           (parallel [(match_operand 3  "const_0_to_3_operand")
8706                      (match_operand 4  "const_0_to_3_operand")
8707                      (match_operand 5  "const_16_to_19_operand")
8708                      (match_operand 6  "const_16_to_19_operand")
8709                      (match_operand 7  "const_4_to_7_operand")
8710                      (match_operand 8  "const_4_to_7_operand")
8711                      (match_operand 9  "const_20_to_23_operand")
8712                      (match_operand 10  "const_20_to_23_operand")
8713                      (match_operand 11  "const_8_to_11_operand")
8714                      (match_operand 12  "const_8_to_11_operand")
8715                      (match_operand 13  "const_24_to_27_operand")
8716                      (match_operand 14  "const_24_to_27_operand")
8717                      (match_operand 15  "const_12_to_15_operand")
8718                      (match_operand 16  "const_12_to_15_operand")
8719                      (match_operand 17  "const_28_to_31_operand")
8720                      (match_operand 18  "const_28_to_31_operand")])))]
8721   "TARGET_AVX512F
8722    && (INTVAL (operands[3]) == (INTVAL (operands[7]) - 4)
8723        && INTVAL (operands[4]) == (INTVAL (operands[8]) - 4)
8724        && INTVAL (operands[5]) == (INTVAL (operands[9]) - 4)
8725        && INTVAL (operands[6]) == (INTVAL (operands[10]) - 4)
8726        && INTVAL (operands[3]) == (INTVAL (operands[11]) - 8)
8727        && INTVAL (operands[4]) == (INTVAL (operands[12]) - 8)
8728        && INTVAL (operands[5]) == (INTVAL (operands[13]) - 8)
8729        && INTVAL (operands[6]) == (INTVAL (operands[14]) - 8)
8730        && INTVAL (operands[3]) == (INTVAL (operands[15]) - 12)
8731        && INTVAL (operands[4]) == (INTVAL (operands[16]) - 12)
8732        && INTVAL (operands[5]) == (INTVAL (operands[17]) - 12)
8733        && INTVAL (operands[6]) == (INTVAL (operands[18]) - 12))"
8734 {
8735   int mask;
8736   mask = INTVAL (operands[3]);
8737   mask |= INTVAL (operands[4]) << 2;
8738   mask |= (INTVAL (operands[5]) - 16) << 4;
8739   mask |= (INTVAL (operands[6]) - 16) << 6;
8740   operands[3] = GEN_INT (mask);
8741
8742   return "vshufps\t{%3, %2, %1, %0<mask_operand19>|%0<mask_operand19>, %1, %2, %3}";
8743 }
8744   [(set_attr "type" "sselog")
8745    (set_attr "length_immediate" "1")
8746    (set_attr "prefix" "evex")
8747    (set_attr "mode" "V16SF")])
8748
8749 (define_expand "avx512f_shufpd512_mask"
8750   [(match_operand:V8DF 0 "register_operand")
8751    (match_operand:V8DF 1 "register_operand")
8752    (match_operand:V8DF 2 "nonimmediate_operand")
8753    (match_operand:SI 3 "const_0_to_255_operand")
8754    (match_operand:V8DF 4 "register_operand")
8755    (match_operand:QI 5 "register_operand")]
8756   "TARGET_AVX512F"
8757 {
8758   int mask = INTVAL (operands[3]);
8759   emit_insn (gen_avx512f_shufpd512_1_mask (operands[0], operands[1], operands[2],
8760                                         GEN_INT (mask & 1),
8761                                         GEN_INT (mask & 2 ? 9 : 8),
8762                                         GEN_INT (mask & 4 ? 3 : 2),
8763                                         GEN_INT (mask & 8 ? 11 : 10),
8764                                         GEN_INT (mask & 16 ? 5 : 4),
8765                                         GEN_INT (mask & 32 ? 13 : 12),
8766                                         GEN_INT (mask & 64 ? 7 : 6),
8767                                         GEN_INT (mask & 128 ? 15 : 14),
8768                                         operands[4], operands[5]));
8769   DONE;
8770 })
8771
8772 (define_insn "avx512f_shufpd512_1<mask_name>"
8773   [(set (match_operand:V8DF 0 "register_operand" "=v")
8774         (vec_select:V8DF
8775           (vec_concat:V16DF
8776             (match_operand:V8DF 1 "register_operand" "v")
8777             (match_operand:V8DF 2 "nonimmediate_operand" "vm"))
8778           (parallel [(match_operand 3 "const_0_to_1_operand")
8779                      (match_operand 4 "const_8_to_9_operand")
8780                      (match_operand 5 "const_2_to_3_operand")
8781                      (match_operand 6 "const_10_to_11_operand")
8782                      (match_operand 7 "const_4_to_5_operand")
8783                      (match_operand 8 "const_12_to_13_operand")
8784                      (match_operand 9 "const_6_to_7_operand")
8785                      (match_operand 10 "const_14_to_15_operand")])))]
8786   "TARGET_AVX512F"
8787 {
8788   int mask;
8789   mask = INTVAL (operands[3]);
8790   mask |= (INTVAL (operands[4]) - 8) << 1;
8791   mask |= (INTVAL (operands[5]) - 2) << 2;
8792   mask |= (INTVAL (operands[6]) - 10) << 3;
8793   mask |= (INTVAL (operands[7]) - 4) << 4;
8794   mask |= (INTVAL (operands[8]) - 12) << 5;
8795   mask |= (INTVAL (operands[9]) - 6) << 6;
8796   mask |= (INTVAL (operands[10]) - 14) << 7;
8797   operands[3] = GEN_INT (mask);
8798
8799   return "vshufpd\t{%3, %2, %1, %0<mask_operand11>|%0<mask_operand11>, %1, %2, %3}";
8800 }
8801   [(set_attr "type" "sselog")
8802    (set_attr "length_immediate" "1")
8803    (set_attr "prefix" "evex")
8804    (set_attr "mode" "V8DF")])
8805
8806 (define_expand "avx_shufpd256<mask_expand4_name>"
8807   [(match_operand:V4DF 0 "register_operand")
8808    (match_operand:V4DF 1 "register_operand")
8809    (match_operand:V4DF 2 "nonimmediate_operand")
8810    (match_operand:SI 3 "const_int_operand")]
8811   "TARGET_AVX"
8812 {
8813   int mask = INTVAL (operands[3]);
8814   emit_insn (gen_avx_shufpd256_1<mask_expand4_name> (operands[0],
8815                                                      operands[1],
8816                                                      operands[2],
8817                                                      GEN_INT (mask & 1),
8818                                                      GEN_INT (mask & 2 ? 5 : 4),
8819                                                      GEN_INT (mask & 4 ? 3 : 2),
8820                                                      GEN_INT (mask & 8 ? 7 : 6)
8821                                                      <mask_expand4_args>));
8822   DONE;
8823 })
8824
8825 (define_insn "avx_shufpd256_1<mask_name>"
8826   [(set (match_operand:V4DF 0 "register_operand" "=v")
8827         (vec_select:V4DF
8828           (vec_concat:V8DF
8829             (match_operand:V4DF 1 "register_operand" "v")
8830             (match_operand:V4DF 2 "nonimmediate_operand" "vm"))
8831           (parallel [(match_operand 3 "const_0_to_1_operand")
8832                      (match_operand 4 "const_4_to_5_operand")
8833                      (match_operand 5 "const_2_to_3_operand")
8834                      (match_operand 6 "const_6_to_7_operand")])))]
8835   "TARGET_AVX && <mask_avx512vl_condition>"
8836 {
8837   int mask;
8838   mask = INTVAL (operands[3]);
8839   mask |= (INTVAL (operands[4]) - 4) << 1;
8840   mask |= (INTVAL (operands[5]) - 2) << 2;
8841   mask |= (INTVAL (operands[6]) - 6) << 3;
8842   operands[3] = GEN_INT (mask);
8843
8844   return "vshufpd\t{%3, %2, %1, %0<mask_operand7>|%0<mask_operand7>, %1, %2, %3}";
8845 }
8846   [(set_attr "type" "sseshuf")
8847    (set_attr "length_immediate" "1")
8848    (set_attr "prefix" "vex")
8849    (set_attr "mode" "V4DF")])
8850
8851 (define_expand "sse2_shufpd<mask_expand4_name>"
8852   [(match_operand:V2DF 0 "register_operand")
8853    (match_operand:V2DF 1 "register_operand")
8854    (match_operand:V2DF 2 "vector_operand")
8855    (match_operand:SI 3 "const_int_operand")]
8856   "TARGET_SSE2"
8857 {
8858   int mask = INTVAL (operands[3]);
8859   emit_insn (gen_sse2_shufpd_v2df<mask_expand4_name> (operands[0], operands[1],
8860                                                       operands[2], GEN_INT (mask & 1),
8861                                                       GEN_INT (mask & 2 ? 3 : 2)
8862                                                       <mask_expand4_args>));
8863   DONE;
8864 })
8865
8866 (define_insn "sse2_shufpd_v2df_mask"
8867   [(set (match_operand:V2DF 0 "register_operand" "=v")
8868     (vec_merge:V2DF
8869           (vec_select:V2DF
8870             (vec_concat:V4DF
8871               (match_operand:V2DF 1 "register_operand" "v")
8872               (match_operand:V2DF 2 "nonimmediate_operand" "vm"))
8873             (parallel [(match_operand 3 "const_0_to_1_operand")
8874                            (match_operand 4 "const_2_to_3_operand")]))
8875       (match_operand:V2DF 5 "vector_move_operand" "0C")
8876       (match_operand:QI 6 "register_operand" "Yk")))]
8877   "TARGET_AVX512VL"
8878 {
8879   int mask;
8880   mask = INTVAL (operands[3]);
8881   mask |= (INTVAL (operands[4]) - 2) << 1;
8882   operands[3] = GEN_INT (mask);
8883
8884   return "vshufpd\t{%3, %2, %1, %0%{%6%}%N5|%0%{%6%}%N5, %1, %2, %3}";
8885 }
8886   [(set_attr "type" "sseshuf")
8887    (set_attr "length_immediate" "1")
8888    (set_attr "prefix" "evex")
8889    (set_attr "mode" "V2DF")])
8890
8891 ;; punpcklqdq and punpckhqdq are shorter than shufpd.
8892 (define_insn "avx2_interleave_highv4di<mask_name>"
8893   [(set (match_operand:V4DI 0 "register_operand" "=v")
8894         (vec_select:V4DI
8895           (vec_concat:V8DI
8896             (match_operand:V4DI 1 "register_operand" "v")
8897             (match_operand:V4DI 2 "nonimmediate_operand" "vm"))
8898           (parallel [(const_int 1)
8899                      (const_int 5)
8900                      (const_int 3)
8901                      (const_int 7)])))]
8902   "TARGET_AVX2 && <mask_avx512vl_condition>"
8903   "vpunpckhqdq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
8904   [(set_attr "type" "sselog")
8905    (set_attr "prefix" "vex")
8906    (set_attr "mode" "OI")])
8907
8908 (define_insn "<mask_codefor>avx512f_interleave_highv8di<mask_name>"
8909   [(set (match_operand:V8DI 0 "register_operand" "=v")
8910         (vec_select:V8DI
8911           (vec_concat:V16DI
8912             (match_operand:V8DI 1 "register_operand" "v")
8913             (match_operand:V8DI 2 "nonimmediate_operand" "vm"))
8914           (parallel [(const_int 1) (const_int 9)
8915                      (const_int 3) (const_int 11)
8916                      (const_int 5) (const_int 13)
8917                      (const_int 7) (const_int 15)])))]
8918   "TARGET_AVX512F"
8919   "vpunpckhqdq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
8920   [(set_attr "type" "sselog")
8921    (set_attr "prefix" "evex")
8922    (set_attr "mode" "XI")])
8923
8924 (define_insn "vec_interleave_highv2di<mask_name>"
8925   [(set (match_operand:V2DI 0 "register_operand" "=x,v")
8926         (vec_select:V2DI
8927           (vec_concat:V4DI
8928             (match_operand:V2DI 1 "register_operand" "0,v")
8929             (match_operand:V2DI 2 "vector_operand" "xBm,vm"))
8930           (parallel [(const_int 1)
8931                      (const_int 3)])))]
8932   "TARGET_SSE2 && <mask_avx512vl_condition>"
8933   "@
8934    punpckhqdq\t{%2, %0|%0, %2}
8935    vpunpckhqdq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
8936   [(set_attr "isa" "noavx,avx")
8937    (set_attr "type" "sselog")
8938    (set_attr "prefix_data16" "1,*")
8939    (set_attr "prefix" "orig,<mask_prefix>")
8940    (set_attr "mode" "TI")])
8941
8942 (define_insn "avx2_interleave_lowv4di<mask_name>"
8943   [(set (match_operand:V4DI 0 "register_operand" "=v")
8944         (vec_select:V4DI
8945           (vec_concat:V8DI
8946             (match_operand:V4DI 1 "register_operand" "v")
8947             (match_operand:V4DI 2 "nonimmediate_operand" "vm"))
8948           (parallel [(const_int 0)
8949                      (const_int 4)
8950                      (const_int 2)
8951                      (const_int 6)])))]
8952   "TARGET_AVX2 && <mask_avx512vl_condition>"
8953   "vpunpcklqdq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
8954   [(set_attr "type" "sselog")
8955    (set_attr "prefix" "vex")
8956    (set_attr "mode" "OI")])
8957
8958 (define_insn "<mask_codefor>avx512f_interleave_lowv8di<mask_name>"
8959   [(set (match_operand:V8DI 0 "register_operand" "=v")
8960         (vec_select:V8DI
8961           (vec_concat:V16DI
8962             (match_operand:V8DI 1 "register_operand" "v")
8963             (match_operand:V8DI 2 "nonimmediate_operand" "vm"))
8964           (parallel [(const_int 0) (const_int 8)
8965                      (const_int 2) (const_int 10)
8966                      (const_int 4) (const_int 12)
8967                      (const_int 6) (const_int 14)])))]
8968   "TARGET_AVX512F"
8969   "vpunpcklqdq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
8970   [(set_attr "type" "sselog")
8971    (set_attr "prefix" "evex")
8972    (set_attr "mode" "XI")])
8973
8974 (define_insn "vec_interleave_lowv2di<mask_name>"
8975   [(set (match_operand:V2DI 0 "register_operand" "=x,v")
8976         (vec_select:V2DI
8977           (vec_concat:V4DI
8978             (match_operand:V2DI 1 "register_operand" "0,v")
8979             (match_operand:V2DI 2 "vector_operand" "xBm,vm"))
8980           (parallel [(const_int 0)
8981                      (const_int 2)])))]
8982   "TARGET_SSE2 && <mask_avx512vl_condition>"
8983   "@
8984    punpcklqdq\t{%2, %0|%0, %2}
8985    vpunpcklqdq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
8986   [(set_attr "isa" "noavx,avx")
8987    (set_attr "type" "sselog")
8988    (set_attr "prefix_data16" "1,*")
8989    (set_attr "prefix" "orig,vex")
8990    (set_attr "mode" "TI")])
8991
8992 (define_insn "sse2_shufpd_<mode>"
8993   [(set (match_operand:VI8F_128 0 "register_operand" "=x,v")
8994         (vec_select:VI8F_128
8995           (vec_concat:<ssedoublevecmode>
8996             (match_operand:VI8F_128 1 "register_operand" "0,v")
8997             (match_operand:VI8F_128 2 "vector_operand" "xBm,vm"))
8998           (parallel [(match_operand 3 "const_0_to_1_operand")
8999                      (match_operand 4 "const_2_to_3_operand")])))]
9000   "TARGET_SSE2"
9001 {
9002   int mask;
9003   mask = INTVAL (operands[3]);
9004   mask |= (INTVAL (operands[4]) - 2) << 1;
9005   operands[3] = GEN_INT (mask);
9006
9007   switch (which_alternative)
9008     {
9009     case 0:
9010       return "shufpd\t{%3, %2, %0|%0, %2, %3}";
9011     case 1:
9012       return "vshufpd\t{%3, %2, %1, %0|%0, %1, %2, %3}";
9013     default:
9014       gcc_unreachable ();
9015     }
9016 }
9017   [(set_attr "isa" "noavx,avx")
9018    (set_attr "type" "sseshuf")
9019    (set_attr "length_immediate" "1")
9020    (set_attr "prefix" "orig,maybe_evex")
9021    (set_attr "mode" "V2DF")])
9022
9023 ;; Avoid combining registers from different units in a single alternative,
9024 ;; see comment above inline_secondary_memory_needed function in i386.c
9025 (define_insn "sse2_storehpd"
9026   [(set (match_operand:DF 0 "nonimmediate_operand"     "=m,x,Yv,x,*f,r")
9027         (vec_select:DF
9028           (match_operand:V2DF 1 "nonimmediate_operand" " v,0, v,o,o,o")
9029           (parallel [(const_int 1)])))]
9030   "TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
9031   "@
9032    %vmovhpd\t{%1, %0|%0, %1}
9033    unpckhpd\t%0, %0
9034    vunpckhpd\t{%d1, %0|%0, %d1}
9035    #
9036    #
9037    #"
9038   [(set_attr "isa" "*,noavx,avx,*,*,*")
9039    (set_attr "type" "ssemov,sselog1,sselog1,ssemov,fmov,imov")
9040    (set (attr "prefix_data16")
9041      (if_then_else
9042        (and (eq_attr "alternative" "0")
9043             (not (match_test "TARGET_AVX")))
9044        (const_string "1")
9045        (const_string "*")))
9046    (set_attr "prefix" "maybe_vex,orig,maybe_evex,*,*,*")
9047    (set_attr "mode" "V1DF,V1DF,V2DF,DF,DF,DF")])
9048
9049 (define_split
9050   [(set (match_operand:DF 0 "register_operand")
9051         (vec_select:DF
9052           (match_operand:V2DF 1 "memory_operand")
9053           (parallel [(const_int 1)])))]
9054   "TARGET_SSE2 && reload_completed"
9055   [(set (match_dup 0) (match_dup 1))]
9056   "operands[1] = adjust_address (operands[1], DFmode, 8);")
9057
9058 (define_insn "*vec_extractv2df_1_sse"
9059   [(set (match_operand:DF 0 "nonimmediate_operand" "=m,x,x")
9060         (vec_select:DF
9061           (match_operand:V2DF 1 "nonimmediate_operand" "x,x,o")
9062           (parallel [(const_int 1)])))]
9063   "!TARGET_SSE2 && TARGET_SSE
9064    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
9065   "@
9066    movhps\t{%1, %0|%q0, %1}
9067    movhlps\t{%1, %0|%0, %1}
9068    movlps\t{%H1, %0|%0, %H1}"
9069   [(set_attr "type" "ssemov")
9070    (set_attr "mode" "V2SF,V4SF,V2SF")])
9071
9072 ;; Avoid combining registers from different units in a single alternative,
9073 ;; see comment above inline_secondary_memory_needed function in i386.c
9074 (define_insn "sse2_storelpd"
9075   [(set (match_operand:DF 0 "nonimmediate_operand"     "=m,x,x,*f,r")
9076         (vec_select:DF
9077           (match_operand:V2DF 1 "nonimmediate_operand" " v,x,m,m,m")
9078           (parallel [(const_int 0)])))]
9079   "TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
9080   "@
9081    %vmovlpd\t{%1, %0|%0, %1}
9082    #
9083    #
9084    #
9085    #"
9086   [(set_attr "type" "ssemov,ssemov,ssemov,fmov,imov")
9087    (set (attr "prefix_data16")
9088      (if_then_else (eq_attr "alternative" "0")
9089                    (const_string "1")
9090                    (const_string "*")))
9091    (set_attr "prefix" "maybe_vex")
9092    (set_attr "mode" "V1DF,DF,DF,DF,DF")])
9093
9094 (define_split
9095   [(set (match_operand:DF 0 "register_operand")
9096         (vec_select:DF
9097           (match_operand:V2DF 1 "nonimmediate_operand")
9098           (parallel [(const_int 0)])))]
9099   "TARGET_SSE2 && reload_completed"
9100   [(set (match_dup 0) (match_dup 1))]
9101   "operands[1] = gen_lowpart (DFmode, operands[1]);")
9102
9103 (define_insn "*vec_extractv2df_0_sse"
9104   [(set (match_operand:DF 0 "nonimmediate_operand" "=m,x,x")
9105         (vec_select:DF
9106           (match_operand:V2DF 1 "nonimmediate_operand" "x,x,m")
9107           (parallel [(const_int 0)])))]
9108   "!TARGET_SSE2 && TARGET_SSE
9109    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
9110   "@
9111    movlps\t{%1, %0|%0, %1}
9112    movaps\t{%1, %0|%0, %1}
9113    movlps\t{%1, %0|%0, %q1}"
9114   [(set_attr "type" "ssemov")
9115    (set_attr "mode" "V2SF,V4SF,V2SF")])
9116
9117 (define_expand "sse2_loadhpd_exp"
9118   [(set (match_operand:V2DF 0 "nonimmediate_operand")
9119         (vec_concat:V2DF
9120           (vec_select:DF
9121             (match_operand:V2DF 1 "nonimmediate_operand")
9122             (parallel [(const_int 0)]))
9123           (match_operand:DF 2 "nonimmediate_operand")))]
9124   "TARGET_SSE2"
9125 {
9126   rtx dst = ix86_fixup_binary_operands (UNKNOWN, V2DFmode, operands);
9127
9128   emit_insn (gen_sse2_loadhpd (dst, operands[1], operands[2]));
9129
9130   /* Fix up the destination if needed.  */
9131   if (dst != operands[0])
9132     emit_move_insn (operands[0], dst);
9133
9134   DONE;
9135 })
9136
9137 ;; Avoid combining registers from different units in a single alternative,
9138 ;; see comment above inline_secondary_memory_needed function in i386.c
9139 (define_insn "sse2_loadhpd"
9140   [(set (match_operand:V2DF 0 "nonimmediate_operand"
9141           "=x,v,x,v ,o,o ,o")
9142         (vec_concat:V2DF
9143           (vec_select:DF
9144             (match_operand:V2DF 1 "nonimmediate_operand"
9145           " 0,v,0,v ,0,0 ,0")
9146             (parallel [(const_int 0)]))
9147           (match_operand:DF 2 "nonimmediate_operand"
9148           " m,m,x,Yv,x,*f,r")))]
9149   "TARGET_SSE2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
9150   "@
9151    movhpd\t{%2, %0|%0, %2}
9152    vmovhpd\t{%2, %1, %0|%0, %1, %2}
9153    unpcklpd\t{%2, %0|%0, %2}
9154    vunpcklpd\t{%2, %1, %0|%0, %1, %2}
9155    #
9156    #
9157    #"
9158   [(set_attr "isa" "noavx,avx,noavx,avx,*,*,*")
9159    (set_attr "type" "ssemov,ssemov,sselog,sselog,ssemov,fmov,imov")
9160    (set (attr "prefix_data16")
9161      (if_then_else (eq_attr "alternative" "0")
9162                    (const_string "1")
9163                    (const_string "*")))
9164    (set_attr "prefix" "orig,maybe_evex,orig,maybe_evex,*,*,*")
9165    (set_attr "mode" "V1DF,V1DF,V2DF,V2DF,DF,DF,DF")])
9166
9167 (define_split
9168   [(set (match_operand:V2DF 0 "memory_operand")
9169         (vec_concat:V2DF
9170           (vec_select:DF (match_dup 0) (parallel [(const_int 0)]))
9171           (match_operand:DF 1 "register_operand")))]
9172   "TARGET_SSE2 && reload_completed"
9173   [(set (match_dup 0) (match_dup 1))]
9174   "operands[0] = adjust_address (operands[0], DFmode, 8);")
9175
9176 (define_expand "sse2_loadlpd_exp"
9177   [(set (match_operand:V2DF 0 "nonimmediate_operand")
9178         (vec_concat:V2DF
9179           (match_operand:DF 2 "nonimmediate_operand")
9180           (vec_select:DF
9181             (match_operand:V2DF 1 "nonimmediate_operand")
9182             (parallel [(const_int 1)]))))]
9183   "TARGET_SSE2"
9184 {
9185   rtx dst = ix86_fixup_binary_operands (UNKNOWN, V2DFmode, operands);
9186
9187   emit_insn (gen_sse2_loadlpd (dst, operands[1], operands[2]));
9188
9189   /* Fix up the destination if needed.  */
9190   if (dst != operands[0])
9191     emit_move_insn (operands[0], dst);
9192
9193   DONE;
9194 })
9195
9196 ;; Avoid combining registers from different units in a single alternative,
9197 ;; see comment above inline_secondary_memory_needed function in i386.c
9198 (define_insn "sse2_loadlpd"
9199   [(set (match_operand:V2DF 0 "nonimmediate_operand"
9200           "=v,x,v,x,v,x,x,v,m,m ,m")
9201         (vec_concat:V2DF
9202           (match_operand:DF 2 "nonimmediate_operand"
9203           "vm,m,m,x,v,0,0,v,x,*f,r")
9204           (vec_select:DF
9205             (match_operand:V2DF 1 "vector_move_operand"
9206           " C,0,v,0,v,x,o,o,0,0 ,0")
9207             (parallel [(const_int 1)]))))]
9208   "TARGET_SSE2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
9209   "@
9210    %vmovq\t{%2, %0|%0, %2}
9211    movlpd\t{%2, %0|%0, %2}
9212    vmovlpd\t{%2, %1, %0|%0, %1, %2}
9213    movsd\t{%2, %0|%0, %2}
9214    vmovsd\t{%2, %1, %0|%0, %1, %2}
9215    shufpd\t{$2, %1, %0|%0, %1, 2}
9216    movhpd\t{%H1, %0|%0, %H1}
9217    vmovhpd\t{%H1, %2, %0|%0, %2, %H1}
9218    #
9219    #
9220    #"
9221   [(set_attr "isa" "*,noavx,avx,noavx,avx,noavx,noavx,avx,*,*,*")
9222    (set (attr "type")
9223      (cond [(eq_attr "alternative" "5")
9224               (const_string "sselog")
9225             (eq_attr "alternative" "9")
9226               (const_string "fmov")
9227             (eq_attr "alternative" "10")
9228               (const_string "imov")
9229            ]
9230            (const_string "ssemov")))
9231    (set (attr "prefix_data16")
9232      (if_then_else (eq_attr "alternative" "1,6")
9233                    (const_string "1")
9234                    (const_string "*")))
9235    (set (attr "length_immediate")
9236      (if_then_else (eq_attr "alternative" "5")
9237                    (const_string "1")
9238                    (const_string "*")))
9239    (set (attr "prefix")
9240      (cond [(eq_attr "alternative" "0")
9241               (const_string "maybe_vex")
9242             (eq_attr "alternative" "1,3,5,6")
9243               (const_string "orig")
9244             (eq_attr "alternative" "2,4,7")
9245               (const_string "maybe_evex")
9246            ]
9247            (const_string "*")))
9248    (set_attr "mode" "DF,V1DF,V1DF,V1DF,V1DF,V2DF,V1DF,V1DF,DF,DF,DF")])
9249
9250 (define_split
9251   [(set (match_operand:V2DF 0 "memory_operand")
9252         (vec_concat:V2DF
9253           (match_operand:DF 1 "register_operand")
9254           (vec_select:DF (match_dup 0) (parallel [(const_int 1)]))))]
9255   "TARGET_SSE2 && reload_completed"
9256   [(set (match_dup 0) (match_dup 1))]
9257   "operands[0] = adjust_address (operands[0], DFmode, 0);")
9258
9259 (define_insn "sse2_movsd"
9260   [(set (match_operand:V2DF 0 "nonimmediate_operand"   "=x,v,x,v,m,x,x,v,o")
9261         (vec_merge:V2DF
9262           (match_operand:V2DF 2 "nonimmediate_operand" " x,v,m,m,v,0,0,v,0")
9263           (match_operand:V2DF 1 "nonimmediate_operand" " 0,v,0,v,0,x,o,o,v")
9264           (const_int 1)))]
9265   "TARGET_SSE2"
9266   "@
9267    movsd\t{%2, %0|%0, %2}
9268    vmovsd\t{%2, %1, %0|%0, %1, %2}
9269    movlpd\t{%2, %0|%0, %q2}
9270    vmovlpd\t{%2, %1, %0|%0, %1, %q2}
9271    %vmovlpd\t{%2, %0|%q0, %2}
9272    shufpd\t{$2, %1, %0|%0, %1, 2}
9273    movhps\t{%H1, %0|%0, %H1}
9274    vmovhps\t{%H1, %2, %0|%0, %2, %H1}
9275    %vmovhps\t{%1, %H0|%H0, %1}"
9276   [(set_attr "isa" "noavx,avx,noavx,avx,*,noavx,noavx,avx,*")
9277    (set (attr "type")
9278      (if_then_else
9279        (eq_attr "alternative" "5")
9280        (const_string "sselog")
9281        (const_string "ssemov")))
9282    (set (attr "prefix_data16")
9283      (if_then_else
9284        (and (eq_attr "alternative" "2,4")
9285             (not (match_test "TARGET_AVX")))
9286        (const_string "1")
9287        (const_string "*")))
9288    (set (attr "length_immediate")
9289      (if_then_else (eq_attr "alternative" "5")
9290                    (const_string "1")
9291                    (const_string "*")))
9292    (set (attr "prefix")
9293      (cond [(eq_attr "alternative" "1,3,7")
9294               (const_string "maybe_evex")
9295             (eq_attr "alternative" "4,8")
9296               (const_string "maybe_vex")
9297            ]
9298            (const_string "orig")))
9299    (set_attr "mode" "DF,DF,V1DF,V1DF,V1DF,V2DF,V1DF,V1DF,V1DF")])
9300
9301 (define_insn "vec_dupv2df<mask_name>"
9302   [(set (match_operand:V2DF 0 "register_operand"     "=x,x,v")
9303         (vec_duplicate:V2DF
9304           (match_operand:DF 1 "nonimmediate_operand" " 0,xm,vm")))]
9305   "TARGET_SSE2 && <mask_avx512vl_condition>"
9306   "@
9307    unpcklpd\t%0, %0
9308    %vmovddup\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}
9309    vmovddup\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
9310   [(set_attr "isa" "noavx,sse3,avx512vl")
9311    (set_attr "type" "sselog1")
9312    (set_attr "prefix" "orig,maybe_vex,evex")
9313    (set_attr "mode" "V2DF,DF,DF")])
9314
9315 (define_insn "vec_concatv2df"
9316   [(set (match_operand:V2DF 0 "register_operand"     "=x,x,v,x,v,x,x, v,x,x")
9317         (vec_concat:V2DF
9318           (match_operand:DF 1 "nonimmediate_operand" " 0,x,v,m,m,0,x,xm,0,0")
9319           (match_operand:DF 2 "vector_move_operand"  " x,x,v,1,1,m,m, C,x,m")))]
9320   "TARGET_SSE
9321    && (!(MEM_P (operands[1]) && MEM_P (operands[2]))
9322        || (TARGET_SSE3 && rtx_equal_p (operands[1], operands[2])))"
9323   "@
9324    unpcklpd\t{%2, %0|%0, %2}
9325    vunpcklpd\t{%2, %1, %0|%0, %1, %2}
9326    vunpcklpd\t{%2, %1, %0|%0, %1, %2}
9327    %vmovddup\t{%1, %0|%0, %1}
9328    vmovddup\t{%1, %0|%0, %1}
9329    movhpd\t{%2, %0|%0, %2}
9330    vmovhpd\t{%2, %1, %0|%0, %1, %2}
9331    %vmovq\t{%1, %0|%0, %1}
9332    movlhps\t{%2, %0|%0, %2}
9333    movhps\t{%2, %0|%0, %2}"
9334   [(set (attr "isa")
9335      (cond [(eq_attr "alternative" "0,5")
9336               (const_string "sse2_noavx")
9337             (eq_attr "alternative" "1,6")
9338               (const_string "avx")
9339             (eq_attr "alternative" "2,4")
9340               (const_string "avx512vl")
9341             (eq_attr "alternative" "3")
9342               (const_string "sse3")
9343             (eq_attr "alternative" "7")
9344               (const_string "sse2")
9345            ]
9346            (const_string "noavx")))
9347    (set (attr "type")
9348      (if_then_else
9349        (eq_attr "alternative" "0,1,2,3,4")
9350        (const_string "sselog")
9351        (const_string "ssemov")))
9352    (set (attr "prefix_data16")
9353         (if_then_else (eq_attr "alternative" "5")
9354                       (const_string "1")
9355                       (const_string "*")))
9356    (set (attr "prefix")
9357      (cond [(eq_attr "alternative" "1,6")
9358               (const_string "vex")
9359             (eq_attr "alternative" "2,4")
9360               (const_string "evex")
9361             (eq_attr "alternative" "3,7")
9362               (const_string "maybe_vex")
9363            ]
9364            (const_string "orig")))
9365    (set_attr "mode" "V2DF,V2DF,V2DF, DF, DF, V1DF,V1DF,DF,V4SF,V2SF")])
9366
9367 ;; vmovq clears also the higher bits.
9368 (define_insn "vec_set<mode>_0"
9369   [(set (match_operand:VF2_512_256 0 "register_operand" "=v")
9370         (vec_merge:VF2_512_256
9371           (vec_duplicate:VF2_512_256
9372             (match_operand:<ssescalarmode> 2 "general_operand" "xm"))
9373           (match_operand:VF2_512_256 1 "const0_operand" "C")
9374           (const_int 1)))]
9375   "TARGET_AVX"
9376   "vmovq\t{%2, %x0|%x0, %2}"
9377   [(set_attr "type" "ssemov")
9378    (set_attr "prefix" "maybe_evex")
9379    (set_attr "mode" "DF")])
9380
9381 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9382 ;;
9383 ;; Parallel integer down-conversion operations
9384 ;;
9385 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9386
9387 (define_mode_iterator PMOV_DST_MODE_1 [V16QI V16HI V8SI V8HI])
9388 (define_mode_attr pmov_src_mode
9389   [(V16QI "V16SI") (V16HI "V16SI") (V8SI "V8DI") (V8HI "V8DI")])
9390 (define_mode_attr pmov_src_lower
9391   [(V16QI "v16si") (V16HI "v16si") (V8SI "v8di") (V8HI "v8di")])
9392 (define_mode_attr pmov_suff_1
9393   [(V16QI "db") (V16HI "dw") (V8SI "qd") (V8HI "qw")])
9394
9395 (define_insn "*avx512f_<code><pmov_src_lower><mode>2"
9396   [(set (match_operand:PMOV_DST_MODE_1 0 "nonimmediate_operand" "=v,m")
9397         (any_truncate:PMOV_DST_MODE_1
9398           (match_operand:<pmov_src_mode> 1 "register_operand" "v,v")))]
9399   "TARGET_AVX512F"
9400   "vpmov<trunsuffix><pmov_suff_1>\t{%1, %0|%0, %1}"
9401   [(set_attr "type" "ssemov")
9402    (set_attr "memory" "none,store")
9403    (set_attr "prefix" "evex")
9404    (set_attr "mode" "<sseinsnmode>")])
9405
9406 (define_insn "avx512f_<code><pmov_src_lower><mode>2_mask"
9407   [(set (match_operand:PMOV_DST_MODE_1 0 "nonimmediate_operand" "=v,m")
9408     (vec_merge:PMOV_DST_MODE_1
9409       (any_truncate:PMOV_DST_MODE_1
9410         (match_operand:<pmov_src_mode> 1 "register_operand" "v,v"))
9411       (match_operand:PMOV_DST_MODE_1 2 "vector_move_operand" "0C,0")
9412       (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk,Yk")))]
9413   "TARGET_AVX512F"
9414   "vpmov<trunsuffix><pmov_suff_1>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
9415   [(set_attr "type" "ssemov")
9416    (set_attr "memory" "none,store")
9417    (set_attr "prefix" "evex")
9418    (set_attr "mode" "<sseinsnmode>")])
9419
9420 (define_expand "avx512f_<code><pmov_src_lower><mode>2_mask_store"
9421   [(set (match_operand:PMOV_DST_MODE_1 0 "memory_operand")
9422     (vec_merge:PMOV_DST_MODE_1
9423       (any_truncate:PMOV_DST_MODE_1
9424         (match_operand:<pmov_src_mode> 1 "register_operand"))
9425       (match_dup 0)
9426       (match_operand:<avx512fmaskmode> 2 "register_operand")))]
9427   "TARGET_AVX512F")
9428
9429 (define_insn "avx512bw_<code>v32hiv32qi2"
9430   [(set (match_operand:V32QI 0 "nonimmediate_operand" "=v,m")
9431         (any_truncate:V32QI
9432             (match_operand:V32HI 1 "register_operand" "v,v")))]
9433   "TARGET_AVX512BW"
9434   "vpmov<trunsuffix>wb\t{%1, %0|%0, %1}"
9435   [(set_attr "type" "ssemov")
9436    (set_attr "memory" "none,store")
9437    (set_attr "prefix" "evex")
9438    (set_attr "mode" "XI")])
9439
9440 (define_insn "avx512bw_<code>v32hiv32qi2_mask"
9441   [(set (match_operand:V32QI 0 "nonimmediate_operand" "=v,m")
9442     (vec_merge:V32QI
9443       (any_truncate:V32QI
9444         (match_operand:V32HI 1 "register_operand" "v,v"))
9445       (match_operand:V32QI 2 "vector_move_operand" "0C,0")
9446       (match_operand:SI 3 "register_operand" "Yk,Yk")))]
9447   "TARGET_AVX512BW"
9448   "vpmov<trunsuffix>wb\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
9449   [(set_attr "type" "ssemov")
9450    (set_attr "memory" "none,store")
9451    (set_attr "prefix" "evex")
9452    (set_attr "mode" "XI")])
9453
9454 (define_expand "avx512bw_<code>v32hiv32qi2_mask_store"
9455   [(set (match_operand:V32QI 0 "nonimmediate_operand")
9456     (vec_merge:V32QI
9457       (any_truncate:V32QI
9458         (match_operand:V32HI 1 "register_operand"))
9459       (match_dup 0)
9460       (match_operand:SI 2 "register_operand")))]
9461   "TARGET_AVX512BW")
9462
9463 (define_mode_iterator PMOV_DST_MODE_2
9464   [V4SI V8HI (V16QI "TARGET_AVX512BW")])
9465 (define_mode_attr pmov_suff_2
9466   [(V16QI "wb") (V8HI "dw") (V4SI "qd")])
9467
9468 (define_insn "*avx512vl_<code><ssedoublemodelower><mode>2"
9469   [(set (match_operand:PMOV_DST_MODE_2 0 "nonimmediate_operand" "=v,m")
9470         (any_truncate:PMOV_DST_MODE_2
9471             (match_operand:<ssedoublemode> 1 "register_operand" "v,v")))]
9472   "TARGET_AVX512VL"
9473   "vpmov<trunsuffix><pmov_suff_2>\t{%1, %0|%0, %1}"
9474   [(set_attr "type" "ssemov")
9475    (set_attr "memory" "none,store")
9476    (set_attr "prefix" "evex")
9477    (set_attr "mode" "<sseinsnmode>")])
9478
9479 (define_insn "<avx512>_<code><ssedoublemodelower><mode>2_mask"
9480   [(set (match_operand:PMOV_DST_MODE_2 0 "nonimmediate_operand" "=v,m")
9481     (vec_merge:PMOV_DST_MODE_2
9482       (any_truncate:PMOV_DST_MODE_2
9483         (match_operand:<ssedoublemode> 1 "register_operand" "v,v"))
9484       (match_operand:PMOV_DST_MODE_2 2 "vector_move_operand" "0C,0")
9485       (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk,Yk")))]
9486   "TARGET_AVX512VL"
9487   "vpmov<trunsuffix><pmov_suff_2>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
9488   [(set_attr "type" "ssemov")
9489    (set_attr "memory" "none,store")
9490    (set_attr "prefix" "evex")
9491    (set_attr "mode" "<sseinsnmode>")])
9492
9493 (define_expand "<avx512>_<code><ssedoublemodelower><mode>2_mask_store"
9494   [(set (match_operand:PMOV_DST_MODE_2 0 "nonimmediate_operand")
9495     (vec_merge:PMOV_DST_MODE_2
9496       (any_truncate:PMOV_DST_MODE_2
9497         (match_operand:<ssedoublemode> 1 "register_operand"))
9498       (match_dup 0)
9499       (match_operand:<avx512fmaskmode> 2 "register_operand")))]
9500   "TARGET_AVX512VL")
9501
9502 (define_mode_iterator PMOV_SRC_MODE_3 [V4DI V2DI V8SI V4SI (V8HI "TARGET_AVX512BW")])
9503 (define_mode_attr pmov_dst_3
9504   [(V4DI "V4QI") (V2DI "V2QI") (V8SI "V8QI") (V4SI "V4QI") (V8HI "V8QI")])
9505 (define_mode_attr pmov_dst_zeroed_3
9506   [(V4DI "V12QI") (V2DI "V14QI") (V8SI "V8QI") (V4SI "V12QI") (V8HI "V8QI")])
9507 (define_mode_attr pmov_suff_3
9508   [(V4DI "qb") (V2DI "qb") (V8SI "db") (V4SI "db") (V8HI "wb")])
9509
9510 (define_insn "*avx512vl_<code><mode>v<ssescalarnum>qi2"
9511   [(set (match_operand:V16QI 0 "register_operand" "=v")
9512     (vec_concat:V16QI
9513       (any_truncate:<pmov_dst_3>
9514               (match_operand:PMOV_SRC_MODE_3 1 "register_operand" "v"))
9515       (match_operand:<pmov_dst_zeroed_3> 2 "const0_operand")))]
9516   "TARGET_AVX512VL"
9517   "vpmov<trunsuffix><pmov_suff_3>\t{%1, %0|%0, %1}"
9518   [(set_attr "type" "ssemov")
9519    (set_attr "prefix" "evex")
9520    (set_attr "mode" "TI")])
9521
9522 (define_insn "*avx512vl_<code>v2div2qi2_store"
9523   [(set (match_operand:V16QI 0 "memory_operand" "=m")
9524     (vec_concat:V16QI
9525       (any_truncate:V2QI
9526               (match_operand:V2DI 1 "register_operand" "v"))
9527       (vec_select:V14QI
9528         (match_dup 0)
9529         (parallel [(const_int 2) (const_int 3)
9530                    (const_int 4) (const_int 5)
9531                    (const_int 6) (const_int 7)
9532                    (const_int 8) (const_int 9)
9533                    (const_int 10) (const_int 11)
9534                    (const_int 12) (const_int 13)
9535                    (const_int 14) (const_int 15)]))))]
9536   "TARGET_AVX512VL"
9537   "vpmov<trunsuffix>qb\t{%1, %0|%w0, %1}"
9538   [(set_attr "type" "ssemov")
9539    (set_attr "memory" "store")
9540    (set_attr "prefix" "evex")
9541    (set_attr "mode" "TI")])
9542
9543 (define_insn "avx512vl_<code>v2div2qi2_mask"
9544   [(set (match_operand:V16QI 0 "register_operand" "=v")
9545     (vec_concat:V16QI
9546       (vec_merge:V2QI
9547         (any_truncate:V2QI
9548           (match_operand:V2DI 1 "register_operand" "v"))
9549         (vec_select:V2QI
9550           (match_operand:V16QI 2 "vector_move_operand" "0C")
9551           (parallel [(const_int 0) (const_int 1)]))
9552         (match_operand:QI 3 "register_operand" "Yk"))
9553       (const_vector:V14QI [(const_int 0) (const_int 0)
9554                            (const_int 0) (const_int 0)
9555                            (const_int 0) (const_int 0)
9556                            (const_int 0) (const_int 0)
9557                            (const_int 0) (const_int 0)
9558                            (const_int 0) (const_int 0)
9559                            (const_int 0) (const_int 0)])))]
9560   "TARGET_AVX512VL"
9561   "vpmov<trunsuffix>qb\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
9562   [(set_attr "type" "ssemov")
9563    (set_attr "prefix" "evex")
9564    (set_attr "mode" "TI")])
9565
9566 (define_insn "*avx512vl_<code>v2div2qi2_mask_1"
9567   [(set (match_operand:V16QI 0 "register_operand" "=v")
9568     (vec_concat:V16QI
9569       (vec_merge:V2QI
9570         (any_truncate:V2QI
9571           (match_operand:V2DI 1 "register_operand" "v"))
9572         (const_vector:V2QI [(const_int 0) (const_int 0)])
9573         (match_operand:QI 2 "register_operand" "Yk"))
9574       (const_vector:V14QI [(const_int 0) (const_int 0)
9575                            (const_int 0) (const_int 0)
9576                            (const_int 0) (const_int 0)
9577                            (const_int 0) (const_int 0)
9578                            (const_int 0) (const_int 0)
9579                            (const_int 0) (const_int 0)
9580                            (const_int 0) (const_int 0)])))]
9581   "TARGET_AVX512VL"
9582   "vpmov<trunsuffix>qb\t{%1, %0%{%2%}%{z%}|%0%{%2%}%{z%}, %1}"
9583   [(set_attr "type" "ssemov")
9584    (set_attr "prefix" "evex")
9585    (set_attr "mode" "TI")])
9586
9587 (define_insn "avx512vl_<code>v2div2qi2_mask_store"
9588   [(set (match_operand:V16QI 0 "memory_operand" "=m")
9589     (vec_concat:V16QI
9590       (vec_merge:V2QI
9591         (any_truncate:V2QI
9592           (match_operand:V2DI 1 "register_operand" "v"))
9593         (vec_select:V2QI
9594           (match_dup 0)
9595           (parallel [(const_int 0) (const_int 1)]))
9596         (match_operand:QI 2 "register_operand" "Yk"))
9597       (vec_select:V14QI
9598         (match_dup 0)
9599         (parallel [(const_int 2) (const_int 3)
9600                    (const_int 4) (const_int 5)
9601                    (const_int 6) (const_int 7)
9602                    (const_int 8) (const_int 9)
9603                    (const_int 10) (const_int 11)
9604                    (const_int 12) (const_int 13)
9605                    (const_int 14) (const_int 15)]))))]
9606   "TARGET_AVX512VL"
9607   "vpmov<trunsuffix>qb\t{%1, %0%{%2%}|%w0%{%2%}, %1}"
9608   [(set_attr "type" "ssemov")
9609    (set_attr "memory" "store")
9610    (set_attr "prefix" "evex")
9611    (set_attr "mode" "TI")])
9612
9613 (define_insn "*avx512vl_<code><mode>v4qi2_store"
9614   [(set (match_operand:V16QI 0 "memory_operand" "=m")
9615     (vec_concat:V16QI
9616       (any_truncate:V4QI
9617               (match_operand:VI4_128_8_256 1 "register_operand" "v"))
9618       (vec_select:V12QI
9619         (match_dup 0)
9620         (parallel [(const_int 4) (const_int 5)
9621                    (const_int 6) (const_int 7)
9622                    (const_int 8) (const_int 9)
9623                    (const_int 10) (const_int 11)
9624                    (const_int 12) (const_int 13)
9625                    (const_int 14) (const_int 15)]))))]
9626   "TARGET_AVX512VL"
9627   "vpmov<trunsuffix><pmov_suff_3>\t{%1, %0|%k0, %1}"
9628   [(set_attr "type" "ssemov")
9629    (set_attr "memory" "store")
9630    (set_attr "prefix" "evex")
9631    (set_attr "mode" "TI")])
9632
9633 (define_insn "avx512vl_<code><mode>v4qi2_mask"
9634   [(set (match_operand:V16QI 0 "register_operand" "=v")
9635     (vec_concat:V16QI
9636       (vec_merge:V4QI
9637         (any_truncate:V4QI
9638           (match_operand:VI4_128_8_256 1 "register_operand" "v"))
9639         (vec_select:V4QI
9640           (match_operand:V16QI 2 "vector_move_operand" "0C")
9641           (parallel [(const_int 0) (const_int 1)
9642                      (const_int 2) (const_int 3)]))
9643         (match_operand:QI 3 "register_operand" "Yk"))
9644       (const_vector:V12QI [(const_int 0) (const_int 0)
9645                            (const_int 0) (const_int 0)
9646                            (const_int 0) (const_int 0)
9647                            (const_int 0) (const_int 0)
9648                            (const_int 0) (const_int 0)
9649                            (const_int 0) (const_int 0)])))]
9650   "TARGET_AVX512VL"
9651   "vpmov<trunsuffix><pmov_suff_3>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
9652   [(set_attr "type" "ssemov")
9653    (set_attr "prefix" "evex")
9654    (set_attr "mode" "TI")])
9655
9656 (define_insn "*avx512vl_<code><mode>v4qi2_mask_1"
9657   [(set (match_operand:V16QI 0 "register_operand" "=v")
9658     (vec_concat:V16QI
9659       (vec_merge:V4QI
9660         (any_truncate:V4QI
9661           (match_operand:VI4_128_8_256 1 "register_operand" "v"))
9662         (const_vector:V4QI [(const_int 0) (const_int 0)
9663                             (const_int 0) (const_int 0)])
9664         (match_operand:QI 2 "register_operand" "Yk"))
9665       (const_vector:V12QI [(const_int 0) (const_int 0)
9666                            (const_int 0) (const_int 0)
9667                            (const_int 0) (const_int 0)
9668                            (const_int 0) (const_int 0)
9669                            (const_int 0) (const_int 0)
9670                            (const_int 0) (const_int 0)])))]
9671   "TARGET_AVX512VL"
9672   "vpmov<trunsuffix><pmov_suff_3>\t{%1, %0%{%2%}%{z%}|%0%{%2%}%{z%}, %1}"
9673   [(set_attr "type" "ssemov")
9674    (set_attr "prefix" "evex")
9675    (set_attr "mode" "TI")])
9676
9677 (define_insn "avx512vl_<code><mode>v4qi2_mask_store"
9678   [(set (match_operand:V16QI 0 "memory_operand" "=m")
9679     (vec_concat:V16QI
9680       (vec_merge:V4QI
9681         (any_truncate:V4QI
9682           (match_operand:VI4_128_8_256 1 "register_operand" "v"))
9683         (vec_select:V4QI
9684           (match_dup 0)
9685           (parallel [(const_int 0) (const_int 1)
9686                      (const_int 2) (const_int 3)]))
9687         (match_operand:QI 2 "register_operand" "Yk"))
9688       (vec_select:V12QI
9689         (match_dup 0)
9690         (parallel [(const_int 4) (const_int 5)
9691                    (const_int 6) (const_int 7)
9692                    (const_int 8) (const_int 9)
9693                    (const_int 10) (const_int 11)
9694                    (const_int 12) (const_int 13)
9695                    (const_int 14) (const_int 15)]))))]
9696   "TARGET_AVX512VL"
9697   "vpmov<trunsuffix><pmov_suff_3>\t{%1, %0%{%2%}|%k0%{%2%}, %1}"
9698   [(set_attr "type" "ssemov")
9699    (set_attr "memory" "store")
9700    (set_attr "prefix" "evex")
9701    (set_attr "mode" "TI")])
9702
9703 (define_mode_iterator VI2_128_BW_4_256
9704   [(V8HI "TARGET_AVX512BW") V8SI])
9705
9706 (define_insn "*avx512vl_<code><mode>v8qi2_store"
9707   [(set (match_operand:V16QI 0 "memory_operand" "=m")
9708     (vec_concat:V16QI
9709       (any_truncate:V8QI
9710               (match_operand:VI2_128_BW_4_256 1 "register_operand" "v"))
9711       (vec_select:V8QI
9712         (match_dup 0)
9713         (parallel [(const_int 8) (const_int 9)
9714                    (const_int 10) (const_int 11)
9715                    (const_int 12) (const_int 13)
9716                    (const_int 14) (const_int 15)]))))]
9717   "TARGET_AVX512VL"
9718   "vpmov<trunsuffix><pmov_suff_3>\t{%1, %0|%q0, %1}"
9719   [(set_attr "type" "ssemov")
9720    (set_attr "memory" "store")
9721    (set_attr "prefix" "evex")
9722    (set_attr "mode" "TI")])
9723
9724 (define_insn "avx512vl_<code><mode>v8qi2_mask"
9725   [(set (match_operand:V16QI 0 "register_operand" "=v")
9726     (vec_concat:V16QI
9727       (vec_merge:V8QI
9728         (any_truncate:V8QI
9729           (match_operand:VI2_128_BW_4_256 1 "register_operand" "v"))
9730         (vec_select:V8QI
9731           (match_operand:V16QI 2 "vector_move_operand" "0C")
9732           (parallel [(const_int 0) (const_int 1)
9733                      (const_int 2) (const_int 3)
9734                      (const_int 4) (const_int 5)
9735                      (const_int 6) (const_int 7)]))
9736         (match_operand:QI 3 "register_operand" "Yk"))
9737       (const_vector:V8QI [(const_int 0) (const_int 0)
9738                           (const_int 0) (const_int 0)
9739                           (const_int 0) (const_int 0)
9740                           (const_int 0) (const_int 0)])))]
9741   "TARGET_AVX512VL"
9742   "vpmov<trunsuffix><pmov_suff_3>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
9743   [(set_attr "type" "ssemov")
9744    (set_attr "prefix" "evex")
9745    (set_attr "mode" "TI")])
9746
9747 (define_insn "*avx512vl_<code><mode>v8qi2_mask_1"
9748   [(set (match_operand:V16QI 0 "register_operand" "=v")
9749     (vec_concat:V16QI
9750       (vec_merge:V8QI
9751         (any_truncate:V8QI
9752           (match_operand:VI2_128_BW_4_256 1 "register_operand" "v"))
9753         (const_vector:V8QI [(const_int 0) (const_int 0)
9754                             (const_int 0) (const_int 0)
9755                             (const_int 0) (const_int 0)
9756                             (const_int 0) (const_int 0)])
9757         (match_operand:QI 2 "register_operand" "Yk"))
9758       (const_vector:V8QI [(const_int 0) (const_int 0)
9759                           (const_int 0) (const_int 0)
9760                           (const_int 0) (const_int 0)
9761                           (const_int 0) (const_int 0)])))]
9762   "TARGET_AVX512VL"
9763   "vpmov<trunsuffix><pmov_suff_3>\t{%1, %0%{%2%}%{z%}|%0%{%2%}%{z%}, %1}"
9764   [(set_attr "type" "ssemov")
9765    (set_attr "prefix" "evex")
9766    (set_attr "mode" "TI")])
9767
9768 (define_insn "avx512vl_<code><mode>v8qi2_mask_store"
9769   [(set (match_operand:V16QI 0 "memory_operand" "=m")
9770     (vec_concat:V16QI
9771       (vec_merge:V8QI
9772         (any_truncate:V8QI
9773           (match_operand:VI2_128_BW_4_256 1 "register_operand" "v"))
9774         (vec_select:V8QI
9775           (match_dup 0)
9776           (parallel [(const_int 0) (const_int 1)
9777                      (const_int 2) (const_int 3)
9778                      (const_int 4) (const_int 5)
9779                      (const_int 6) (const_int 7)]))
9780         (match_operand:QI 2 "register_operand" "Yk"))
9781       (vec_select:V8QI
9782         (match_dup 0)
9783         (parallel [(const_int 8) (const_int 9)
9784                    (const_int 10) (const_int 11)
9785                    (const_int 12) (const_int 13)
9786                    (const_int 14) (const_int 15)]))))]
9787   "TARGET_AVX512VL"
9788   "vpmov<trunsuffix><pmov_suff_3>\t{%1, %0%{%2%}|%q0%{%2%}, %1}"
9789   [(set_attr "type" "ssemov")
9790    (set_attr "memory" "store")
9791    (set_attr "prefix" "evex")
9792    (set_attr "mode" "TI")])
9793
9794 (define_mode_iterator PMOV_SRC_MODE_4 [V4DI V2DI V4SI])
9795 (define_mode_attr pmov_dst_4
9796   [(V4DI "V4HI") (V2DI "V2HI") (V4SI "V4HI")])
9797 (define_mode_attr pmov_dst_zeroed_4
9798   [(V4DI "V4HI") (V2DI "V6HI") (V4SI "V4HI")])
9799 (define_mode_attr pmov_suff_4
9800   [(V4DI "qw") (V2DI "qw") (V4SI "dw")])
9801
9802 (define_insn "*avx512vl_<code><mode>v<ssescalarnum>hi2"
9803   [(set (match_operand:V8HI 0 "register_operand" "=v")
9804     (vec_concat:V8HI
9805       (any_truncate:<pmov_dst_4>
9806               (match_operand:PMOV_SRC_MODE_4 1 "register_operand" "v"))
9807       (match_operand:<pmov_dst_zeroed_4> 2 "const0_operand")))]
9808   "TARGET_AVX512VL"
9809   "vpmov<trunsuffix><pmov_suff_4>\t{%1, %0|%0, %1}"
9810   [(set_attr "type" "ssemov")
9811    (set_attr "prefix" "evex")
9812    (set_attr "mode" "TI")])
9813
9814 (define_insn "*avx512vl_<code><mode>v4hi2_store"
9815   [(set (match_operand:V8HI 0 "memory_operand" "=m")
9816     (vec_concat:V8HI
9817       (any_truncate:V4HI
9818               (match_operand:VI4_128_8_256 1 "register_operand" "v"))
9819       (vec_select:V4HI
9820         (match_dup 0)
9821         (parallel [(const_int 4) (const_int 5)
9822                    (const_int 6) (const_int 7)]))))]
9823   "TARGET_AVX512VL"
9824   "vpmov<trunsuffix><pmov_suff_4>\t{%1, %0|%0, %1}"
9825   [(set_attr "type" "ssemov")
9826    (set_attr "memory" "store")
9827    (set_attr "prefix" "evex")
9828    (set_attr "mode" "TI")])
9829
9830 (define_insn "avx512vl_<code><mode>v4hi2_mask"
9831   [(set (match_operand:V8HI 0 "register_operand" "=v")
9832     (vec_concat:V8HI
9833       (vec_merge:V4HI
9834         (any_truncate:V4HI
9835           (match_operand:VI4_128_8_256 1 "register_operand" "v"))
9836         (vec_select:V4HI
9837           (match_operand:V8HI 2 "vector_move_operand" "0C")
9838           (parallel [(const_int 0) (const_int 1)
9839                      (const_int 2) (const_int 3)]))
9840         (match_operand:QI 3 "register_operand" "Yk"))
9841       (const_vector:V4HI [(const_int 0) (const_int 0)
9842                           (const_int 0) (const_int 0)])))]
9843   "TARGET_AVX512VL"
9844   "vpmov<trunsuffix><pmov_suff_4>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
9845   [(set_attr "type" "ssemov")
9846    (set_attr "prefix" "evex")
9847    (set_attr "mode" "TI")])
9848
9849 (define_insn "*avx512vl_<code><mode>v4hi2_mask_1"
9850   [(set (match_operand:V8HI 0 "register_operand" "=v")
9851     (vec_concat:V8HI
9852       (vec_merge:V4HI
9853         (any_truncate:V4HI
9854           (match_operand:VI4_128_8_256 1 "register_operand" "v"))
9855         (const_vector:V4HI [(const_int 0) (const_int 0)
9856                             (const_int 0) (const_int 0)])
9857         (match_operand:QI 2 "register_operand" "Yk"))
9858       (const_vector:V4HI [(const_int 0) (const_int 0)
9859                           (const_int 0) (const_int 0)])))]
9860   "TARGET_AVX512VL"
9861   "vpmov<trunsuffix><pmov_suff_4>\t{%1, %0%{%2%}%{z%}|%0%{%2%}%{z%}, %1}"
9862   [(set_attr "type" "ssemov")
9863    (set_attr "prefix" "evex")
9864    (set_attr "mode" "TI")])
9865
9866 (define_insn "avx512vl_<code><mode>v4hi2_mask_store"
9867   [(set (match_operand:V8HI 0 "memory_operand" "=m")
9868     (vec_concat:V8HI
9869       (vec_merge:V4HI
9870         (any_truncate:V4HI
9871           (match_operand:VI4_128_8_256 1 "register_operand" "v"))
9872         (vec_select:V4HI
9873           (match_dup 0)
9874           (parallel [(const_int 0) (const_int 1)
9875                      (const_int 2) (const_int 3)]))
9876         (match_operand:QI 2 "register_operand" "Yk"))
9877       (vec_select:V4HI
9878         (match_dup 0)
9879         (parallel [(const_int 4) (const_int 5)
9880                    (const_int 6) (const_int 7)]))))]
9881   "TARGET_AVX512VL"
9882 {
9883   if (GET_MODE_SIZE (GET_MODE_INNER (<MODE>mode)) == 4)
9884     return "vpmov<trunsuffix><pmov_suff_4>\t{%1, %0%{%2%}|%0%{%2%}, %t1}";
9885   return "vpmov<trunsuffix><pmov_suff_4>\t{%1, %0%{%2%}|%0%{%2%}, %g1}";
9886 }
9887   [(set_attr "type" "ssemov")
9888    (set_attr "memory" "store")
9889    (set_attr "prefix" "evex")
9890    (set_attr "mode" "TI")])
9891
9892 (define_insn "*avx512vl_<code>v2div2hi2_store"
9893   [(set (match_operand:V8HI 0 "memory_operand" "=m")
9894     (vec_concat:V8HI
9895       (any_truncate:V2HI
9896               (match_operand:V2DI 1 "register_operand" "v"))
9897       (vec_select:V6HI
9898         (match_dup 0)
9899         (parallel [(const_int 2) (const_int 3)
9900                    (const_int 4) (const_int 5)
9901                    (const_int 6) (const_int 7)]))))]
9902   "TARGET_AVX512VL"
9903   "vpmov<trunsuffix>qw\t{%1, %0|%0, %1}"
9904   [(set_attr "type" "ssemov")
9905    (set_attr "memory" "store")
9906    (set_attr "prefix" "evex")
9907    (set_attr "mode" "TI")])
9908
9909 (define_insn "avx512vl_<code>v2div2hi2_mask"
9910   [(set (match_operand:V8HI 0 "register_operand" "=v")
9911     (vec_concat:V8HI
9912       (vec_merge:V2HI
9913         (any_truncate:V2HI
9914           (match_operand:V2DI 1 "register_operand" "v"))
9915         (vec_select:V2HI
9916           (match_operand:V8HI 2 "vector_move_operand" "0C")
9917           (parallel [(const_int 0) (const_int 1)]))
9918         (match_operand:QI 3 "register_operand" "Yk"))
9919       (const_vector:V6HI [(const_int 0) (const_int 0)
9920                           (const_int 0) (const_int 0)
9921                           (const_int 0) (const_int 0)])))]
9922   "TARGET_AVX512VL"
9923   "vpmov<trunsuffix>qw\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
9924   [(set_attr "type" "ssemov")
9925    (set_attr "prefix" "evex")
9926    (set_attr "mode" "TI")])
9927
9928 (define_insn "*avx512vl_<code>v2div2hi2_mask_1"
9929   [(set (match_operand:V8HI 0 "register_operand" "=v")
9930     (vec_concat:V8HI
9931       (vec_merge:V2HI
9932         (any_truncate:V2HI
9933           (match_operand:V2DI 1 "register_operand" "v"))
9934         (const_vector:V2HI [(const_int 0) (const_int 0)])
9935         (match_operand:QI 2 "register_operand" "Yk"))
9936       (const_vector:V6HI [(const_int 0) (const_int 0)
9937                           (const_int 0) (const_int 0)
9938                           (const_int 0) (const_int 0)])))]
9939   "TARGET_AVX512VL"
9940   "vpmov<trunsuffix>qw\t{%1, %0%{%2%}%{z%}|%0%{%2%}%{z%}, %1}"
9941   [(set_attr "type" "ssemov")
9942    (set_attr "prefix" "evex")
9943    (set_attr "mode" "TI")])
9944
9945 (define_insn "avx512vl_<code>v2div2hi2_mask_store"
9946   [(set (match_operand:V8HI 0 "memory_operand" "=m")
9947     (vec_concat:V8HI
9948       (vec_merge:V2HI
9949         (any_truncate:V2HI
9950           (match_operand:V2DI 1 "register_operand" "v"))
9951         (vec_select:V2HI
9952           (match_dup 0)
9953           (parallel [(const_int 0) (const_int 1)]))
9954         (match_operand:QI 2 "register_operand" "Yk"))
9955       (vec_select:V6HI
9956         (match_dup 0)
9957         (parallel [(const_int 2) (const_int 3)
9958                    (const_int 4) (const_int 5)
9959                    (const_int 6) (const_int 7)]))))]
9960   "TARGET_AVX512VL"
9961   "vpmov<trunsuffix>qw\t{%1, %0%{%2%}|%0%{%2%}, %g1}"
9962   [(set_attr "type" "ssemov")
9963    (set_attr "memory" "store")
9964    (set_attr "prefix" "evex")
9965    (set_attr "mode" "TI")])
9966
9967 (define_insn "*avx512vl_<code>v2div2si2"
9968   [(set (match_operand:V4SI 0 "register_operand" "=v")
9969     (vec_concat:V4SI
9970       (any_truncate:V2SI
9971               (match_operand:V2DI 1 "register_operand" "v"))
9972       (match_operand:V2SI 2 "const0_operand")))]
9973   "TARGET_AVX512VL"
9974   "vpmov<trunsuffix>qd\t{%1, %0|%0, %1}"
9975   [(set_attr "type" "ssemov")
9976    (set_attr "prefix" "evex")
9977    (set_attr "mode" "TI")])
9978
9979 (define_insn "*avx512vl_<code>v2div2si2_store"
9980   [(set (match_operand:V4SI 0 "memory_operand" "=m")
9981     (vec_concat:V4SI
9982       (any_truncate:V2SI
9983               (match_operand:V2DI 1 "register_operand" "v"))
9984       (vec_select:V2SI
9985         (match_dup 0)
9986         (parallel [(const_int 2) (const_int 3)]))))]
9987   "TARGET_AVX512VL"
9988   "vpmov<trunsuffix>qd\t{%1, %0|%0, %1}"
9989   [(set_attr "type" "ssemov")
9990    (set_attr "memory" "store")
9991    (set_attr "prefix" "evex")
9992    (set_attr "mode" "TI")])
9993
9994 (define_insn "avx512vl_<code>v2div2si2_mask"
9995   [(set (match_operand:V4SI 0 "register_operand" "=v")
9996     (vec_concat:V4SI
9997       (vec_merge:V2SI
9998         (any_truncate:V2SI
9999           (match_operand:V2DI 1 "register_operand" "v"))
10000         (vec_select:V2SI
10001           (match_operand:V4SI 2 "vector_move_operand" "0C")
10002           (parallel [(const_int 0) (const_int 1)]))
10003         (match_operand:QI 3 "register_operand" "Yk"))
10004       (const_vector:V2SI [(const_int 0) (const_int 0)])))]
10005   "TARGET_AVX512VL"
10006   "vpmov<trunsuffix>qd\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
10007   [(set_attr "type" "ssemov")
10008    (set_attr "prefix" "evex")
10009    (set_attr "mode" "TI")])
10010
10011 (define_insn "*avx512vl_<code>v2div2si2_mask_1"
10012   [(set (match_operand:V4SI 0 "register_operand" "=v")
10013     (vec_concat:V4SI
10014       (vec_merge:V2SI
10015         (any_truncate:V2SI
10016           (match_operand:V2DI 1 "register_operand" "v"))
10017         (const_vector:V2SI [(const_int 0) (const_int 0)])
10018         (match_operand:QI 2 "register_operand" "Yk"))
10019       (const_vector:V2SI [(const_int 0) (const_int 0)])))]
10020   "TARGET_AVX512VL"
10021   "vpmov<trunsuffix>qd\t{%1, %0%{%2%}%{z%}|%0%{%2%}%{z%}, %1}"
10022   [(set_attr "type" "ssemov")
10023    (set_attr "prefix" "evex")
10024    (set_attr "mode" "TI")])
10025
10026 (define_insn "avx512vl_<code>v2div2si2_mask_store"
10027   [(set (match_operand:V4SI 0 "memory_operand" "=m")
10028     (vec_concat:V4SI
10029       (vec_merge:V2SI
10030         (any_truncate:V2SI
10031           (match_operand:V2DI 1 "register_operand" "v"))
10032         (vec_select:V2SI
10033           (match_dup 0)
10034           (parallel [(const_int 0) (const_int 1)]))
10035         (match_operand:QI 2 "register_operand" "Yk"))
10036       (vec_select:V2SI
10037         (match_dup 0)
10038         (parallel [(const_int 2) (const_int 3)]))))]
10039   "TARGET_AVX512VL"
10040   "vpmov<trunsuffix>qd\t{%1, %0%{%2%}|%0%{%2%}, %t1}"
10041   [(set_attr "type" "ssemov")
10042    (set_attr "memory" "store")
10043    (set_attr "prefix" "evex")
10044    (set_attr "mode" "TI")])
10045
10046 (define_insn "*avx512f_<code>v8div16qi2"
10047   [(set (match_operand:V16QI 0 "register_operand" "=v")
10048         (vec_concat:V16QI
10049           (any_truncate:V8QI
10050             (match_operand:V8DI 1 "register_operand" "v"))
10051           (const_vector:V8QI [(const_int 0) (const_int 0)
10052                               (const_int 0) (const_int 0)
10053                               (const_int 0) (const_int 0)
10054                               (const_int 0) (const_int 0)])))]
10055   "TARGET_AVX512F"
10056   "vpmov<trunsuffix>qb\t{%1, %0|%0, %1}"
10057   [(set_attr "type" "ssemov")
10058    (set_attr "prefix" "evex")
10059    (set_attr "mode" "TI")])
10060
10061 (define_insn "*avx512f_<code>v8div16qi2_store"
10062   [(set (match_operand:V16QI 0 "memory_operand" "=m")
10063         (vec_concat:V16QI
10064           (any_truncate:V8QI
10065             (match_operand:V8DI 1 "register_operand" "v"))
10066           (vec_select:V8QI
10067             (match_dup 0)
10068             (parallel [(const_int 8) (const_int 9)
10069                        (const_int 10) (const_int 11)
10070                        (const_int 12) (const_int 13)
10071                        (const_int 14) (const_int 15)]))))]
10072   "TARGET_AVX512F"
10073   "vpmov<trunsuffix>qb\t{%1, %0|%0, %1}"
10074   [(set_attr "type" "ssemov")
10075    (set_attr "memory" "store")
10076    (set_attr "prefix" "evex")
10077    (set_attr "mode" "TI")])
10078
10079 (define_insn "avx512f_<code>v8div16qi2_mask"
10080   [(set (match_operand:V16QI 0 "register_operand" "=v")
10081     (vec_concat:V16QI
10082       (vec_merge:V8QI
10083         (any_truncate:V8QI
10084           (match_operand:V8DI 1 "register_operand" "v"))
10085         (vec_select:V8QI
10086           (match_operand:V16QI 2 "vector_move_operand" "0C")
10087           (parallel [(const_int 0) (const_int 1)
10088                      (const_int 2) (const_int 3)
10089                      (const_int 4) (const_int 5)
10090                      (const_int 6) (const_int 7)]))
10091         (match_operand:QI 3 "register_operand" "Yk"))
10092       (const_vector:V8QI [(const_int 0) (const_int 0)
10093                           (const_int 0) (const_int 0)
10094                           (const_int 0) (const_int 0)
10095                           (const_int 0) (const_int 0)])))]
10096   "TARGET_AVX512F"
10097   "vpmov<trunsuffix>qb\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
10098   [(set_attr "type" "ssemov")
10099    (set_attr "prefix" "evex")
10100    (set_attr "mode" "TI")])
10101
10102 (define_insn "*avx512f_<code>v8div16qi2_mask_1"
10103   [(set (match_operand:V16QI 0 "register_operand" "=v")
10104     (vec_concat:V16QI
10105       (vec_merge:V8QI
10106         (any_truncate:V8QI
10107           (match_operand:V8DI 1 "register_operand" "v"))
10108         (const_vector:V8QI [(const_int 0) (const_int 0)
10109                             (const_int 0) (const_int 0)
10110                             (const_int 0) (const_int 0)
10111                             (const_int 0) (const_int 0)])
10112         (match_operand:QI 2 "register_operand" "Yk"))
10113       (const_vector:V8QI [(const_int 0) (const_int 0)
10114                           (const_int 0) (const_int 0)
10115                           (const_int 0) (const_int 0)
10116                           (const_int 0) (const_int 0)])))]
10117   "TARGET_AVX512F"
10118   "vpmov<trunsuffix>qb\t{%1, %0%{%2%}%{z%}|%0%{%2%}%{z%}, %1}"
10119   [(set_attr "type" "ssemov")
10120    (set_attr "prefix" "evex")
10121    (set_attr "mode" "TI")])
10122
10123 (define_insn "avx512f_<code>v8div16qi2_mask_store"
10124   [(set (match_operand:V16QI 0 "memory_operand" "=m")
10125     (vec_concat:V16QI
10126       (vec_merge:V8QI
10127         (any_truncate:V8QI
10128           (match_operand:V8DI 1 "register_operand" "v"))
10129         (vec_select:V8QI
10130           (match_dup 0)
10131           (parallel [(const_int 0) (const_int 1)
10132                      (const_int 2) (const_int 3)
10133                      (const_int 4) (const_int 5)
10134                      (const_int 6) (const_int 7)]))
10135         (match_operand:QI 2 "register_operand" "Yk"))
10136       (vec_select:V8QI
10137         (match_dup 0)
10138         (parallel [(const_int 8) (const_int 9)
10139                    (const_int 10) (const_int 11)
10140                    (const_int 12) (const_int 13)
10141                    (const_int 14) (const_int 15)]))))]
10142   "TARGET_AVX512F"
10143   "vpmov<trunsuffix>qb\t{%1, %0%{%2%}|%q0%{%2%}, %1}"
10144   [(set_attr "type" "ssemov")
10145    (set_attr "memory" "store")
10146    (set_attr "prefix" "evex")
10147    (set_attr "mode" "TI")])
10148
10149 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10150 ;;
10151 ;; Parallel integral arithmetic
10152 ;;
10153 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10154
10155 (define_expand "neg<mode>2"
10156   [(set (match_operand:VI_AVX2 0 "register_operand")
10157         (minus:VI_AVX2
10158           (match_dup 2)
10159           (match_operand:VI_AVX2 1 "vector_operand")))]
10160   "TARGET_SSE2"
10161   "operands[2] = force_reg (<MODE>mode, CONST0_RTX (<MODE>mode));")
10162
10163 (define_expand "<plusminus_insn><mode>3"
10164   [(set (match_operand:VI_AVX2 0 "register_operand")
10165         (plusminus:VI_AVX2
10166           (match_operand:VI_AVX2 1 "vector_operand")
10167           (match_operand:VI_AVX2 2 "vector_operand")))]
10168   "TARGET_SSE2"
10169   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
10170
10171 (define_expand "<plusminus_insn><mode>3_mask"
10172   [(set (match_operand:VI48_AVX512VL 0 "register_operand")
10173         (vec_merge:VI48_AVX512VL
10174           (plusminus:VI48_AVX512VL
10175             (match_operand:VI48_AVX512VL 1 "nonimmediate_operand")
10176             (match_operand:VI48_AVX512VL 2 "nonimmediate_operand"))
10177           (match_operand:VI48_AVX512VL 3 "vector_move_operand")
10178           (match_operand:<avx512fmaskmode> 4 "register_operand")))]
10179   "TARGET_AVX512F"
10180   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
10181
10182 (define_expand "<plusminus_insn><mode>3_mask"
10183   [(set (match_operand:VI12_AVX512VL 0 "register_operand")
10184         (vec_merge:VI12_AVX512VL
10185           (plusminus:VI12_AVX512VL
10186             (match_operand:VI12_AVX512VL 1 "nonimmediate_operand")
10187             (match_operand:VI12_AVX512VL 2 "nonimmediate_operand"))
10188           (match_operand:VI12_AVX512VL 3 "vector_move_operand")
10189           (match_operand:<avx512fmaskmode> 4 "register_operand")))]
10190   "TARGET_AVX512BW"
10191   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
10192
10193 (define_insn "*<plusminus_insn><mode>3"
10194   [(set (match_operand:VI_AVX2 0 "register_operand" "=x,v")
10195         (plusminus:VI_AVX2
10196           (match_operand:VI_AVX2 1 "vector_operand" "<comm>0,v")
10197           (match_operand:VI_AVX2 2 "vector_operand" "xBm,vm")))]
10198   "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
10199   "@
10200    p<plusminus_mnemonic><ssemodesuffix>\t{%2, %0|%0, %2}
10201    vp<plusminus_mnemonic><ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
10202   [(set_attr "isa" "noavx,avx")
10203    (set_attr "type" "sseiadd")
10204    (set_attr "prefix_data16" "1,*")
10205    (set_attr "prefix" "orig,vex")
10206    (set_attr "mode" "<sseinsnmode>")])
10207
10208 (define_insn "*<plusminus_insn><mode>3_mask"
10209   [(set (match_operand:VI48_AVX512VL 0 "register_operand" "=v")
10210         (vec_merge:VI48_AVX512VL
10211           (plusminus:VI48_AVX512VL
10212             (match_operand:VI48_AVX512VL 1 "nonimmediate_operand" "<comm>v")
10213             (match_operand:VI48_AVX512VL 2 "nonimmediate_operand" "vm"))
10214           (match_operand:VI48_AVX512VL 3 "vector_move_operand" "0C")
10215           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
10216   "TARGET_AVX512F && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
10217   "vp<plusminus_mnemonic><ssemodesuffix>\t{%2, %1, %0%{%4%}%N3|%0%{%4%}%N3, %1, %2}"
10218   [(set_attr "type" "sseiadd")
10219    (set_attr "prefix" "evex")
10220    (set_attr "mode" "<sseinsnmode>")])
10221
10222 (define_insn "*<plusminus_insn><mode>3_mask"
10223   [(set (match_operand:VI12_AVX512VL 0 "register_operand" "=v")
10224         (vec_merge:VI12_AVX512VL
10225           (plusminus:VI12_AVX512VL
10226             (match_operand:VI12_AVX512VL 1 "nonimmediate_operand" "<comm>v")
10227             (match_operand:VI12_AVX512VL 2 "nonimmediate_operand" "vm"))
10228           (match_operand:VI12_AVX512VL 3 "vector_move_operand" "0C")
10229           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
10230   "TARGET_AVX512BW && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
10231   "vp<plusminus_mnemonic><ssemodesuffix>\t{%2, %1, %0%{%4%}%N3|%0%{%4%}%N3, %1, %2}"
10232   [(set_attr "type" "sseiadd")
10233    (set_attr "prefix" "evex")
10234    (set_attr "mode" "<sseinsnmode>")])
10235
10236 (define_expand "<sse2_avx2>_<plusminus_insn><mode>3<mask_name>"
10237   [(set (match_operand:VI12_AVX2 0 "register_operand")
10238         (sat_plusminus:VI12_AVX2
10239           (match_operand:VI12_AVX2 1 "vector_operand")
10240           (match_operand:VI12_AVX2 2 "vector_operand")))]
10241   "TARGET_SSE2 && <mask_mode512bit_condition> && <mask_avx512bw_condition>"
10242   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
10243
10244 (define_insn "*<sse2_avx2>_<plusminus_insn><mode>3<mask_name>"
10245   [(set (match_operand:VI12_AVX2 0 "register_operand" "=x,v")
10246         (sat_plusminus:VI12_AVX2
10247           (match_operand:VI12_AVX2 1 "vector_operand" "<comm>0,v")
10248           (match_operand:VI12_AVX2 2 "vector_operand" "xBm,vm")))]
10249   "TARGET_SSE2 && <mask_mode512bit_condition> && <mask_avx512bw_condition>
10250    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
10251   "@
10252    p<plusminus_mnemonic><ssemodesuffix>\t{%2, %0|%0, %2}
10253    vp<plusminus_mnemonic><ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
10254   [(set_attr "isa" "noavx,avx")
10255    (set_attr "type" "sseiadd")
10256    (set_attr "prefix_data16" "1,*")
10257    (set_attr "prefix" "orig,maybe_evex")
10258    (set_attr "mode" "TI")])
10259
10260 (define_expand "mul<mode>3<mask_name>"
10261   [(set (match_operand:VI1_AVX512 0 "register_operand")
10262         (mult:VI1_AVX512 (match_operand:VI1_AVX512 1 "register_operand")
10263                        (match_operand:VI1_AVX512 2 "register_operand")))]
10264   "TARGET_SSE2 && <mask_mode512bit_condition> && <mask_avx512bw_condition>"
10265 {
10266   ix86_expand_vecop_qihi (MULT, operands[0], operands[1], operands[2]);
10267   DONE;
10268 })
10269
10270 (define_expand "mul<mode>3<mask_name>"
10271   [(set (match_operand:VI2_AVX2 0 "register_operand")
10272         (mult:VI2_AVX2 (match_operand:VI2_AVX2 1 "vector_operand")
10273                        (match_operand:VI2_AVX2 2 "vector_operand")))]
10274   "TARGET_SSE2 && <mask_mode512bit_condition> && <mask_avx512bw_condition>"
10275   "ix86_fixup_binary_operands_no_copy (MULT, <MODE>mode, operands);")
10276
10277 (define_insn "*mul<mode>3<mask_name>"
10278   [(set (match_operand:VI2_AVX2 0 "register_operand" "=x,v")
10279         (mult:VI2_AVX2 (match_operand:VI2_AVX2 1 "vector_operand" "%0,v")
10280                        (match_operand:VI2_AVX2 2 "vector_operand" "xBm,vm")))]
10281   "TARGET_SSE2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))
10282    && <mask_mode512bit_condition> && <mask_avx512bw_condition>"
10283   "@
10284    pmullw\t{%2, %0|%0, %2}
10285    vpmullw\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
10286   [(set_attr "isa" "noavx,avx")
10287    (set_attr "type" "sseimul")
10288    (set_attr "prefix_data16" "1,*")
10289    (set_attr "prefix" "orig,vex")
10290    (set_attr "mode" "<sseinsnmode>")])
10291
10292 (define_expand "<s>mul<mode>3_highpart<mask_name>"
10293   [(set (match_operand:VI2_AVX2 0 "register_operand")
10294         (truncate:VI2_AVX2
10295           (lshiftrt:<ssedoublemode>
10296             (mult:<ssedoublemode>
10297               (any_extend:<ssedoublemode>
10298                 (match_operand:VI2_AVX2 1 "vector_operand"))
10299               (any_extend:<ssedoublemode>
10300                 (match_operand:VI2_AVX2 2 "vector_operand")))
10301             (const_int 16))))]
10302   "TARGET_SSE2
10303    && <mask_mode512bit_condition> && <mask_avx512bw_condition>"
10304   "ix86_fixup_binary_operands_no_copy (MULT, <MODE>mode, operands);")
10305
10306 (define_insn "*<s>mul<mode>3_highpart<mask_name>"
10307   [(set (match_operand:VI2_AVX2 0 "register_operand" "=x,v")
10308         (truncate:VI2_AVX2
10309           (lshiftrt:<ssedoublemode>
10310             (mult:<ssedoublemode>
10311               (any_extend:<ssedoublemode>
10312                 (match_operand:VI2_AVX2 1 "vector_operand" "%0,v"))
10313               (any_extend:<ssedoublemode>
10314                 (match_operand:VI2_AVX2 2 "vector_operand" "xBm,vm")))
10315             (const_int 16))))]
10316   "TARGET_SSE2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))
10317    && <mask_mode512bit_condition> && <mask_avx512bw_condition>"
10318   "@
10319    pmulh<u>w\t{%2, %0|%0, %2}
10320    vpmulh<u>w\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
10321   [(set_attr "isa" "noavx,avx")
10322    (set_attr "type" "sseimul")
10323    (set_attr "prefix_data16" "1,*")
10324    (set_attr "prefix" "orig,vex")
10325    (set_attr "mode" "<sseinsnmode>")])
10326
10327 (define_expand "vec_widen_umult_even_v16si<mask_name>"
10328   [(set (match_operand:V8DI 0 "register_operand")
10329         (mult:V8DI
10330           (zero_extend:V8DI
10331             (vec_select:V8SI
10332               (match_operand:V16SI 1 "nonimmediate_operand")
10333               (parallel [(const_int 0) (const_int 2)
10334                          (const_int 4) (const_int 6)
10335                          (const_int 8) (const_int 10)
10336                          (const_int 12) (const_int 14)])))
10337           (zero_extend:V8DI
10338             (vec_select:V8SI
10339               (match_operand:V16SI 2 "nonimmediate_operand")
10340               (parallel [(const_int 0) (const_int 2)
10341                          (const_int 4) (const_int 6)
10342                          (const_int 8) (const_int 10)
10343                          (const_int 12) (const_int 14)])))))]
10344   "TARGET_AVX512F"
10345   "ix86_fixup_binary_operands_no_copy (MULT, V16SImode, operands);")
10346
10347 (define_insn "*vec_widen_umult_even_v16si<mask_name>"
10348   [(set (match_operand:V8DI 0 "register_operand" "=v")
10349         (mult:V8DI
10350           (zero_extend:V8DI
10351             (vec_select:V8SI
10352               (match_operand:V16SI 1 "nonimmediate_operand" "%v")
10353               (parallel [(const_int 0) (const_int 2)
10354                          (const_int 4) (const_int 6)
10355                          (const_int 8) (const_int 10)
10356                          (const_int 12) (const_int 14)])))
10357           (zero_extend:V8DI
10358             (vec_select:V8SI
10359               (match_operand:V16SI 2 "nonimmediate_operand" "vm")
10360               (parallel [(const_int 0) (const_int 2)
10361                          (const_int 4) (const_int 6)
10362                          (const_int 8) (const_int 10)
10363                          (const_int 12) (const_int 14)])))))]
10364   "TARGET_AVX512F && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
10365   "vpmuludq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
10366   [(set_attr "type" "sseimul")
10367    (set_attr "prefix_extra" "1")
10368    (set_attr "prefix" "evex")
10369    (set_attr "mode" "XI")])
10370
10371 (define_expand "vec_widen_umult_even_v8si<mask_name>"
10372   [(set (match_operand:V4DI 0 "register_operand")
10373         (mult:V4DI
10374           (zero_extend:V4DI
10375             (vec_select:V4SI
10376               (match_operand:V8SI 1 "nonimmediate_operand")
10377               (parallel [(const_int 0) (const_int 2)
10378                          (const_int 4) (const_int 6)])))
10379           (zero_extend:V4DI
10380             (vec_select:V4SI
10381               (match_operand:V8SI 2 "nonimmediate_operand")
10382               (parallel [(const_int 0) (const_int 2)
10383                          (const_int 4) (const_int 6)])))))]
10384   "TARGET_AVX2 && <mask_avx512vl_condition>"
10385   "ix86_fixup_binary_operands_no_copy (MULT, V8SImode, operands);")
10386
10387 (define_insn "*vec_widen_umult_even_v8si<mask_name>"
10388   [(set (match_operand:V4DI 0 "register_operand" "=v")
10389         (mult:V4DI
10390           (zero_extend:V4DI
10391             (vec_select:V4SI
10392               (match_operand:V8SI 1 "nonimmediate_operand" "%v")
10393               (parallel [(const_int 0) (const_int 2)
10394                          (const_int 4) (const_int 6)])))
10395           (zero_extend:V4DI
10396             (vec_select:V4SI
10397               (match_operand:V8SI 2 "nonimmediate_operand" "vm")
10398               (parallel [(const_int 0) (const_int 2)
10399                          (const_int 4) (const_int 6)])))))]
10400   "TARGET_AVX2 && <mask_avx512vl_condition>
10401    && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
10402   "vpmuludq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
10403   [(set_attr "type" "sseimul")
10404    (set_attr "prefix" "maybe_evex")
10405    (set_attr "mode" "OI")])
10406
10407 (define_expand "vec_widen_umult_even_v4si<mask_name>"
10408   [(set (match_operand:V2DI 0 "register_operand")
10409         (mult:V2DI
10410           (zero_extend:V2DI
10411             (vec_select:V2SI
10412               (match_operand:V4SI 1 "vector_operand")
10413               (parallel [(const_int 0) (const_int 2)])))
10414           (zero_extend:V2DI
10415             (vec_select:V2SI
10416               (match_operand:V4SI 2 "vector_operand")
10417               (parallel [(const_int 0) (const_int 2)])))))]
10418   "TARGET_SSE2 && <mask_avx512vl_condition>"
10419   "ix86_fixup_binary_operands_no_copy (MULT, V4SImode, operands);")
10420
10421 (define_insn "*vec_widen_umult_even_v4si<mask_name>"
10422   [(set (match_operand:V2DI 0 "register_operand" "=x,v")
10423         (mult:V2DI
10424           (zero_extend:V2DI
10425             (vec_select:V2SI
10426               (match_operand:V4SI 1 "vector_operand" "%0,v")
10427               (parallel [(const_int 0) (const_int 2)])))
10428           (zero_extend:V2DI
10429             (vec_select:V2SI
10430               (match_operand:V4SI 2 "vector_operand" "xBm,vm")
10431               (parallel [(const_int 0) (const_int 2)])))))]
10432   "TARGET_SSE2 && <mask_avx512vl_condition>
10433    && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
10434   "@
10435    pmuludq\t{%2, %0|%0, %2}
10436    vpmuludq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
10437   [(set_attr "isa" "noavx,avx")
10438    (set_attr "type" "sseimul")
10439    (set_attr "prefix_data16" "1,*")
10440    (set_attr "prefix" "orig,maybe_evex")
10441    (set_attr "mode" "TI")])
10442
10443 (define_expand "vec_widen_smult_even_v16si<mask_name>"
10444   [(set (match_operand:V8DI 0 "register_operand")
10445         (mult:V8DI
10446           (sign_extend:V8DI
10447             (vec_select:V8SI
10448               (match_operand:V16SI 1 "nonimmediate_operand")
10449               (parallel [(const_int 0) (const_int 2)
10450                          (const_int 4) (const_int 6)
10451                          (const_int 8) (const_int 10)
10452                          (const_int 12) (const_int 14)])))
10453           (sign_extend:V8DI
10454             (vec_select:V8SI
10455               (match_operand:V16SI 2 "nonimmediate_operand")
10456               (parallel [(const_int 0) (const_int 2)
10457                          (const_int 4) (const_int 6)
10458                          (const_int 8) (const_int 10)
10459                          (const_int 12) (const_int 14)])))))]
10460   "TARGET_AVX512F"
10461   "ix86_fixup_binary_operands_no_copy (MULT, V16SImode, operands);")
10462
10463 (define_insn "*vec_widen_smult_even_v16si<mask_name>"
10464   [(set (match_operand:V8DI 0 "register_operand" "=v")
10465         (mult:V8DI
10466           (sign_extend:V8DI
10467             (vec_select:V8SI
10468               (match_operand:V16SI 1 "nonimmediate_operand" "%v")
10469               (parallel [(const_int 0) (const_int 2)
10470                          (const_int 4) (const_int 6)
10471                          (const_int 8) (const_int 10)
10472                          (const_int 12) (const_int 14)])))
10473           (sign_extend:V8DI
10474             (vec_select:V8SI
10475               (match_operand:V16SI 2 "nonimmediate_operand" "vm")
10476               (parallel [(const_int 0) (const_int 2)
10477                          (const_int 4) (const_int 6)
10478                          (const_int 8) (const_int 10)
10479                          (const_int 12) (const_int 14)])))))]
10480   "TARGET_AVX512F && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
10481   "vpmuldq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
10482   [(set_attr "type" "sseimul")
10483    (set_attr "prefix_extra" "1")
10484    (set_attr "prefix" "evex")
10485    (set_attr "mode" "XI")])
10486
10487 (define_expand "vec_widen_smult_even_v8si<mask_name>"
10488   [(set (match_operand:V4DI 0 "register_operand")
10489         (mult:V4DI
10490           (sign_extend:V4DI
10491             (vec_select:V4SI
10492               (match_operand:V8SI 1 "nonimmediate_operand")
10493               (parallel [(const_int 0) (const_int 2)
10494                          (const_int 4) (const_int 6)])))
10495           (sign_extend:V4DI
10496             (vec_select:V4SI
10497               (match_operand:V8SI 2 "nonimmediate_operand")
10498               (parallel [(const_int 0) (const_int 2)
10499                          (const_int 4) (const_int 6)])))))]
10500   "TARGET_AVX2 && <mask_avx512vl_condition>"
10501   "ix86_fixup_binary_operands_no_copy (MULT, V8SImode, operands);")
10502
10503 (define_insn "*vec_widen_smult_even_v8si<mask_name>"
10504   [(set (match_operand:V4DI 0 "register_operand" "=v")
10505         (mult:V4DI
10506           (sign_extend:V4DI
10507             (vec_select:V4SI
10508               (match_operand:V8SI 1 "nonimmediate_operand" "%v")
10509               (parallel [(const_int 0) (const_int 2)
10510                          (const_int 4) (const_int 6)])))
10511           (sign_extend:V4DI
10512             (vec_select:V4SI
10513               (match_operand:V8SI 2 "nonimmediate_operand" "vm")
10514               (parallel [(const_int 0) (const_int 2)
10515                          (const_int 4) (const_int 6)])))))]
10516   "TARGET_AVX2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
10517   "vpmuldq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
10518   [(set_attr "type" "sseimul")
10519    (set_attr "prefix_extra" "1")
10520    (set_attr "prefix" "vex")
10521    (set_attr "mode" "OI")])
10522
10523 (define_expand "sse4_1_mulv2siv2di3<mask_name>"
10524   [(set (match_operand:V2DI 0 "register_operand")
10525         (mult:V2DI
10526           (sign_extend:V2DI
10527             (vec_select:V2SI
10528               (match_operand:V4SI 1 "vector_operand")
10529               (parallel [(const_int 0) (const_int 2)])))
10530           (sign_extend:V2DI
10531             (vec_select:V2SI
10532               (match_operand:V4SI 2 "vector_operand")
10533               (parallel [(const_int 0) (const_int 2)])))))]
10534   "TARGET_SSE4_1 && <mask_avx512vl_condition>"
10535   "ix86_fixup_binary_operands_no_copy (MULT, V4SImode, operands);")
10536
10537 (define_insn "*sse4_1_mulv2siv2di3<mask_name>"
10538   [(set (match_operand:V2DI 0 "register_operand" "=Yr,*x,v")
10539         (mult:V2DI
10540           (sign_extend:V2DI
10541             (vec_select:V2SI
10542               (match_operand:V4SI 1 "vector_operand" "%0,0,v")
10543               (parallel [(const_int 0) (const_int 2)])))
10544           (sign_extend:V2DI
10545             (vec_select:V2SI
10546               (match_operand:V4SI 2 "vector_operand" "YrBm,*xBm,vm")
10547               (parallel [(const_int 0) (const_int 2)])))))]
10548   "TARGET_SSE4_1 && <mask_avx512vl_condition>
10549    && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
10550   "@
10551    pmuldq\t{%2, %0|%0, %2}
10552    pmuldq\t{%2, %0|%0, %2}
10553    vpmuldq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
10554   [(set_attr "isa" "noavx,noavx,avx")
10555    (set_attr "type" "sseimul")
10556    (set_attr "prefix_data16" "1,1,*")
10557    (set_attr "prefix_extra" "1")
10558    (set_attr "prefix" "orig,orig,vex")
10559    (set_attr "mode" "TI")])
10560
10561 (define_insn "avx512bw_pmaddwd512<mode><mask_name>"
10562   [(set (match_operand:<sseunpackmode> 0 "register_operand" "=v")
10563           (unspec:<sseunpackmode>
10564             [(match_operand:VI2_AVX2 1 "register_operand" "v")
10565              (match_operand:VI2_AVX2 2 "nonimmediate_operand" "vm")]
10566              UNSPEC_PMADDWD512))]
10567    "TARGET_AVX512BW && <mask_mode512bit_condition>"
10568    "vpmaddwd\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}";
10569   [(set_attr "type" "sseiadd")
10570    (set_attr "prefix" "evex")
10571    (set_attr "mode" "XI")])
10572
10573 (define_expand "avx2_pmaddwd"
10574   [(set (match_operand:V8SI 0 "register_operand")
10575         (plus:V8SI
10576           (mult:V8SI
10577             (sign_extend:V8SI
10578               (vec_select:V8HI
10579                 (match_operand:V16HI 1 "nonimmediate_operand")
10580                 (parallel [(const_int 0) (const_int 2)
10581                            (const_int 4) (const_int 6)
10582                            (const_int 8) (const_int 10)
10583                            (const_int 12) (const_int 14)])))
10584             (sign_extend:V8SI
10585               (vec_select:V8HI
10586                 (match_operand:V16HI 2 "nonimmediate_operand")
10587                 (parallel [(const_int 0) (const_int 2)
10588                            (const_int 4) (const_int 6)
10589                            (const_int 8) (const_int 10)
10590                            (const_int 12) (const_int 14)]))))
10591           (mult:V8SI
10592             (sign_extend:V8SI
10593               (vec_select:V8HI (match_dup 1)
10594                 (parallel [(const_int 1) (const_int 3)
10595                            (const_int 5) (const_int 7)
10596                            (const_int 9) (const_int 11)
10597                            (const_int 13) (const_int 15)])))
10598             (sign_extend:V8SI
10599               (vec_select:V8HI (match_dup 2)
10600                 (parallel [(const_int 1) (const_int 3)
10601                            (const_int 5) (const_int 7)
10602                            (const_int 9) (const_int 11)
10603                            (const_int 13) (const_int 15)]))))))]
10604   "TARGET_AVX2"
10605   "ix86_fixup_binary_operands_no_copy (MULT, V16HImode, operands);")
10606
10607 (define_insn "*avx2_pmaddwd"
10608   [(set (match_operand:V8SI 0 "register_operand" "=x,v")
10609         (plus:V8SI
10610           (mult:V8SI
10611             (sign_extend:V8SI
10612               (vec_select:V8HI
10613                 (match_operand:V16HI 1 "nonimmediate_operand" "%x,v")
10614                 (parallel [(const_int 0) (const_int 2)
10615                            (const_int 4) (const_int 6)
10616                            (const_int 8) (const_int 10)
10617                            (const_int 12) (const_int 14)])))
10618             (sign_extend:V8SI
10619               (vec_select:V8HI
10620                 (match_operand:V16HI 2 "nonimmediate_operand" "xm,vm")
10621                 (parallel [(const_int 0) (const_int 2)
10622                            (const_int 4) (const_int 6)
10623                            (const_int 8) (const_int 10)
10624                            (const_int 12) (const_int 14)]))))
10625           (mult:V8SI
10626             (sign_extend:V8SI
10627               (vec_select:V8HI (match_dup 1)
10628                 (parallel [(const_int 1) (const_int 3)
10629                            (const_int 5) (const_int 7)
10630                            (const_int 9) (const_int 11)
10631                            (const_int 13) (const_int 15)])))
10632             (sign_extend:V8SI
10633               (vec_select:V8HI (match_dup 2)
10634                 (parallel [(const_int 1) (const_int 3)
10635                            (const_int 5) (const_int 7)
10636                            (const_int 9) (const_int 11)
10637                            (const_int 13) (const_int 15)]))))))]
10638   "TARGET_AVX2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
10639   "vpmaddwd\t{%2, %1, %0|%0, %1, %2}"
10640   [(set_attr "type" "sseiadd")
10641    (set_attr "isa" "*,avx512bw")
10642    (set_attr "prefix" "vex,evex")
10643    (set_attr "mode" "OI")])
10644
10645 (define_expand "sse2_pmaddwd"
10646   [(set (match_operand:V4SI 0 "register_operand")
10647         (plus:V4SI
10648           (mult:V4SI
10649             (sign_extend:V4SI
10650               (vec_select:V4HI
10651                 (match_operand:V8HI 1 "vector_operand")
10652                 (parallel [(const_int 0) (const_int 2)
10653                            (const_int 4) (const_int 6)])))
10654             (sign_extend:V4SI
10655               (vec_select:V4HI
10656                 (match_operand:V8HI 2 "vector_operand")
10657                 (parallel [(const_int 0) (const_int 2)
10658                            (const_int 4) (const_int 6)]))))
10659           (mult:V4SI
10660             (sign_extend:V4SI
10661               (vec_select:V4HI (match_dup 1)
10662                 (parallel [(const_int 1) (const_int 3)
10663                            (const_int 5) (const_int 7)])))
10664             (sign_extend:V4SI
10665               (vec_select:V4HI (match_dup 2)
10666                 (parallel [(const_int 1) (const_int 3)
10667                            (const_int 5) (const_int 7)]))))))]
10668   "TARGET_SSE2"
10669   "ix86_fixup_binary_operands_no_copy (MULT, V8HImode, operands);")
10670
10671 (define_insn "*sse2_pmaddwd"
10672   [(set (match_operand:V4SI 0 "register_operand" "=x,x,v")
10673         (plus:V4SI
10674           (mult:V4SI
10675             (sign_extend:V4SI
10676               (vec_select:V4HI
10677                 (match_operand:V8HI 1 "vector_operand" "%0,x,v")
10678                 (parallel [(const_int 0) (const_int 2)
10679                            (const_int 4) (const_int 6)])))
10680             (sign_extend:V4SI
10681               (vec_select:V4HI
10682                 (match_operand:V8HI 2 "vector_operand" "xBm,xm,vm")
10683                 (parallel [(const_int 0) (const_int 2)
10684                            (const_int 4) (const_int 6)]))))
10685           (mult:V4SI
10686             (sign_extend:V4SI
10687               (vec_select:V4HI (match_dup 1)
10688                 (parallel [(const_int 1) (const_int 3)
10689                            (const_int 5) (const_int 7)])))
10690             (sign_extend:V4SI
10691               (vec_select:V4HI (match_dup 2)
10692                 (parallel [(const_int 1) (const_int 3)
10693                            (const_int 5) (const_int 7)]))))))]
10694   "TARGET_SSE2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
10695   "@
10696    pmaddwd\t{%2, %0|%0, %2}
10697    vpmaddwd\t{%2, %1, %0|%0, %1, %2}
10698    vpmaddwd\t{%2, %1, %0|%0, %1, %2}"
10699   [(set_attr "isa" "noavx,avx,avx512bw")
10700    (set_attr "type" "sseiadd")
10701    (set_attr "atom_unit" "simul")
10702    (set_attr "prefix_data16" "1,*,*")
10703    (set_attr "prefix" "orig,vex,evex")
10704    (set_attr "mode" "TI")])
10705
10706 (define_insn "avx512dq_mul<mode>3<mask_name>"
10707   [(set (match_operand:VI8 0 "register_operand" "=v")
10708         (mult:VI8
10709           (match_operand:VI8 1 "register_operand" "v")
10710           (match_operand:VI8 2 "nonimmediate_operand" "vm")))]
10711   "TARGET_AVX512DQ && <mask_mode512bit_condition>"
10712   "vpmullq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
10713   [(set_attr "type" "sseimul")
10714    (set_attr "prefix" "evex")
10715    (set_attr "mode" "<sseinsnmode>")])
10716
10717 (define_expand "mul<mode>3<mask_name>"
10718   [(set (match_operand:VI4_AVX512F 0 "register_operand")
10719         (mult:VI4_AVX512F
10720           (match_operand:VI4_AVX512F 1 "general_vector_operand")
10721           (match_operand:VI4_AVX512F 2 "general_vector_operand")))]
10722   "TARGET_SSE2 && <mask_mode512bit_condition>"
10723 {
10724   if (TARGET_SSE4_1)
10725     {
10726       if (!vector_operand (operands[1], <MODE>mode))
10727         operands[1] = force_reg (<MODE>mode, operands[1]);
10728       if (!vector_operand (operands[2], <MODE>mode))
10729         operands[2] = force_reg (<MODE>mode, operands[2]);
10730       ix86_fixup_binary_operands_no_copy (MULT, <MODE>mode, operands);
10731     }
10732   else
10733     {
10734       ix86_expand_sse2_mulv4si3 (operands[0], operands[1], operands[2]);
10735       DONE;
10736     }
10737 })
10738
10739 (define_insn "*<sse4_1_avx2>_mul<mode>3<mask_name>"
10740   [(set (match_operand:VI4_AVX512F 0 "register_operand" "=Yr,*x,v")
10741         (mult:VI4_AVX512F
10742           (match_operand:VI4_AVX512F 1 "vector_operand" "%0,0,v")
10743           (match_operand:VI4_AVX512F 2 "vector_operand" "YrBm,*xBm,vm")))]
10744   "TARGET_SSE4_1 && !(MEM_P (operands[1]) && MEM_P (operands[2]))
10745    && <mask_mode512bit_condition>"
10746   "@
10747    pmulld\t{%2, %0|%0, %2}
10748    pmulld\t{%2, %0|%0, %2}
10749    vpmulld\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
10750   [(set_attr "isa" "noavx,noavx,avx")
10751    (set_attr "type" "sseimul")
10752    (set_attr "prefix_extra" "1")
10753    (set_attr "prefix" "<mask_prefix4>")
10754    (set_attr "btver2_decode" "vector,vector,vector")
10755    (set_attr "mode" "<sseinsnmode>")])
10756
10757 (define_expand "mul<mode>3"
10758   [(set (match_operand:VI8_AVX2_AVX512F 0 "register_operand")
10759         (mult:VI8_AVX2_AVX512F
10760           (match_operand:VI8_AVX2_AVX512F 1 "register_operand")
10761           (match_operand:VI8_AVX2_AVX512F 2 "register_operand")))]
10762   "TARGET_SSE2"
10763 {
10764   ix86_expand_sse2_mulvxdi3 (operands[0], operands[1], operands[2]);
10765   DONE;
10766 })
10767
10768 (define_expand "vec_widen_<s>mult_hi_<mode>"
10769   [(match_operand:<sseunpackmode> 0 "register_operand")
10770    (any_extend:<sseunpackmode>
10771      (match_operand:VI124_AVX2 1 "register_operand"))
10772    (match_operand:VI124_AVX2 2 "register_operand")]
10773   "TARGET_SSE2"
10774 {
10775   ix86_expand_mul_widen_hilo (operands[0], operands[1], operands[2],
10776                               <u_bool>, true);
10777   DONE;
10778 })
10779
10780 (define_expand "vec_widen_<s>mult_lo_<mode>"
10781   [(match_operand:<sseunpackmode> 0 "register_operand")
10782    (any_extend:<sseunpackmode>
10783      (match_operand:VI124_AVX2 1 "register_operand"))
10784    (match_operand:VI124_AVX2 2 "register_operand")]
10785   "TARGET_SSE2"
10786 {
10787   ix86_expand_mul_widen_hilo (operands[0], operands[1], operands[2],
10788                               <u_bool>, false);
10789   DONE;
10790 })
10791
10792 ;; Most widen_<s>mult_even_<mode> can be handled directly from other
10793 ;; named patterns, but signed V4SI needs special help for plain SSE2.
10794 (define_expand "vec_widen_smult_even_v4si"
10795   [(match_operand:V2DI 0 "register_operand")
10796    (match_operand:V4SI 1 "vector_operand")
10797    (match_operand:V4SI 2 "vector_operand")]
10798   "TARGET_SSE2"
10799 {
10800   ix86_expand_mul_widen_evenodd (operands[0], operands[1], operands[2],
10801                                  false, false);
10802   DONE;
10803 })
10804
10805 (define_expand "vec_widen_<s>mult_odd_<mode>"
10806   [(match_operand:<sseunpackmode> 0 "register_operand")
10807    (any_extend:<sseunpackmode>
10808      (match_operand:VI4_AVX512F 1 "general_vector_operand"))
10809    (match_operand:VI4_AVX512F 2 "general_vector_operand")]
10810   "TARGET_SSE2"
10811 {
10812   ix86_expand_mul_widen_evenodd (operands[0], operands[1], operands[2],
10813                                  <u_bool>, true);
10814   DONE;
10815 })
10816
10817 (define_mode_attr SDOT_PMADD_SUF
10818   [(V32HI "512v32hi") (V16HI "") (V8HI "")])
10819
10820 (define_expand "sdot_prod<mode>"
10821   [(match_operand:<sseunpackmode> 0 "register_operand")
10822    (match_operand:VI2_AVX2 1 "register_operand")
10823    (match_operand:VI2_AVX2 2 "register_operand")
10824    (match_operand:<sseunpackmode> 3 "register_operand")]
10825   "TARGET_SSE2"
10826 {
10827   rtx t = gen_reg_rtx (<sseunpackmode>mode);
10828   emit_insn (gen_<sse2_avx2>_pmaddwd<SDOT_PMADD_SUF> (t, operands[1], operands[2]));
10829   emit_insn (gen_rtx_SET (operands[0],
10830                           gen_rtx_PLUS (<sseunpackmode>mode,
10831                                         operands[3], t)));
10832   DONE;
10833 })
10834
10835 ;; Normally we use widen_mul_even/odd, but combine can't quite get it all
10836 ;; back together when madd is available.
10837 (define_expand "sdot_prodv4si"
10838   [(match_operand:V2DI 0 "register_operand")
10839    (match_operand:V4SI 1 "register_operand")
10840    (match_operand:V4SI 2 "register_operand")
10841    (match_operand:V2DI 3 "register_operand")]
10842   "TARGET_XOP"
10843 {
10844   rtx t = gen_reg_rtx (V2DImode);
10845   emit_insn (gen_xop_pmacsdqh (t, operands[1], operands[2], operands[3]));
10846   emit_insn (gen_xop_pmacsdql (operands[0], operands[1], operands[2], t));
10847   DONE;
10848 })
10849
10850 (define_expand "usadv16qi"
10851   [(match_operand:V4SI 0 "register_operand")
10852    (match_operand:V16QI 1 "register_operand")
10853    (match_operand:V16QI 2 "vector_operand")
10854    (match_operand:V4SI 3 "vector_operand")]
10855   "TARGET_SSE2"
10856 {
10857   rtx t1 = gen_reg_rtx (V2DImode);
10858   rtx t2 = gen_reg_rtx (V4SImode);
10859   emit_insn (gen_sse2_psadbw (t1, operands[1], operands[2]));
10860   convert_move (t2, t1, 0);
10861   emit_insn (gen_addv4si3 (operands[0], t2, operands[3]));
10862   DONE;
10863 })
10864
10865 (define_expand "usadv32qi"
10866   [(match_operand:V8SI 0 "register_operand")
10867    (match_operand:V32QI 1 "register_operand")
10868    (match_operand:V32QI 2 "nonimmediate_operand")
10869    (match_operand:V8SI 3 "nonimmediate_operand")]
10870   "TARGET_AVX2"
10871 {
10872   rtx t1 = gen_reg_rtx (V4DImode);
10873   rtx t2 = gen_reg_rtx (V8SImode);
10874   emit_insn (gen_avx2_psadbw (t1, operands[1], operands[2]));
10875   convert_move (t2, t1, 0);
10876   emit_insn (gen_addv8si3 (operands[0], t2, operands[3]));
10877   DONE;
10878 })
10879
10880 (define_insn "<mask_codefor>ashr<mode>3<mask_name>"
10881   [(set (match_operand:VI248_AVX512BW_1 0 "register_operand" "=v,v")
10882         (ashiftrt:VI248_AVX512BW_1
10883           (match_operand:VI248_AVX512BW_1 1 "nonimmediate_operand" "v,vm")
10884           (match_operand:DI 2 "nonmemory_operand" "v,N")))]
10885   "TARGET_AVX512VL"
10886   "vpsra<ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
10887   [(set_attr "type" "sseishft")
10888    (set (attr "length_immediate")
10889      (if_then_else (match_operand 2 "const_int_operand")
10890        (const_string "1")
10891        (const_string "0")))
10892    (set_attr "mode" "<sseinsnmode>")])
10893
10894 (define_insn "ashr<mode>3"
10895   [(set (match_operand:VI24_AVX2 0 "register_operand" "=x,x")
10896         (ashiftrt:VI24_AVX2
10897           (match_operand:VI24_AVX2 1 "register_operand" "0,x")
10898           (match_operand:DI 2 "nonmemory_operand" "xN,xN")))]
10899   "TARGET_SSE2"
10900   "@
10901    psra<ssemodesuffix>\t{%2, %0|%0, %2}
10902    vpsra<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
10903   [(set_attr "isa" "noavx,avx")
10904    (set_attr "type" "sseishft")
10905    (set (attr "length_immediate")
10906      (if_then_else (match_operand 2 "const_int_operand")
10907        (const_string "1")
10908        (const_string "0")))
10909    (set_attr "prefix_data16" "1,*")
10910    (set_attr "prefix" "orig,vex")
10911    (set_attr "mode" "<sseinsnmode>")])
10912
10913 (define_insn "ashr<mode>3<mask_name>"
10914   [(set (match_operand:VI248_AVX512BW_AVX512VL 0 "register_operand" "=v,v")
10915         (ashiftrt:VI248_AVX512BW_AVX512VL
10916           (match_operand:VI248_AVX512BW_AVX512VL 1 "nonimmediate_operand" "v,vm")
10917           (match_operand:DI 2 "nonmemory_operand" "v,N")))]
10918   "TARGET_AVX512F"
10919   "vpsra<ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
10920   [(set_attr "type" "sseishft")
10921    (set (attr "length_immediate")
10922      (if_then_else (match_operand 2 "const_int_operand")
10923        (const_string "1")
10924        (const_string "0")))
10925    (set_attr "mode" "<sseinsnmode>")])
10926
10927 (define_insn "<mask_codefor><shift_insn><mode>3<mask_name>"
10928   [(set (match_operand:VI248_AVX512BW_2 0 "register_operand" "=v,v")
10929         (any_lshift:VI248_AVX512BW_2
10930           (match_operand:VI248_AVX512BW_2 1 "nonimmediate_operand" "v,vm")
10931           (match_operand:DI 2 "nonmemory_operand" "v,N")))]
10932   "TARGET_AVX512VL"
10933   "vp<vshift><ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
10934   [(set_attr "type" "sseishft")
10935    (set (attr "length_immediate")
10936      (if_then_else (match_operand 2 "const_int_operand")
10937        (const_string "1")
10938        (const_string "0")))
10939    (set_attr "mode" "<sseinsnmode>")])
10940
10941 (define_insn "<shift_insn><mode>3"
10942   [(set (match_operand:VI248_AVX2 0 "register_operand" "=x,x")
10943         (any_lshift:VI248_AVX2
10944           (match_operand:VI248_AVX2 1 "register_operand" "0,x")
10945           (match_operand:DI 2 "nonmemory_operand" "xN,xN")))]
10946   "TARGET_SSE2"
10947   "@
10948    p<vshift><ssemodesuffix>\t{%2, %0|%0, %2}
10949    vp<vshift><ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
10950   [(set_attr "isa" "noavx,avx")
10951    (set_attr "type" "sseishft")
10952    (set (attr "length_immediate")
10953      (if_then_else (match_operand 2 "const_int_operand")
10954        (const_string "1")
10955        (const_string "0")))
10956    (set_attr "prefix_data16" "1,*")
10957    (set_attr "prefix" "orig,vex")
10958    (set_attr "mode" "<sseinsnmode>")])
10959
10960 (define_insn "<shift_insn><mode>3<mask_name>"
10961   [(set (match_operand:VI248_AVX512BW 0 "register_operand" "=v,v")
10962         (any_lshift:VI248_AVX512BW
10963           (match_operand:VI248_AVX512BW 1 "nonimmediate_operand" "v,m")
10964           (match_operand:DI 2 "nonmemory_operand" "vN,N")))]
10965   "TARGET_AVX512F"
10966   "vp<vshift><ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
10967   [(set_attr "type" "sseishft")
10968    (set (attr "length_immediate")
10969      (if_then_else (match_operand 2 "const_int_operand")
10970        (const_string "1")
10971        (const_string "0")))
10972    (set_attr "mode" "<sseinsnmode>")])
10973
10974
10975 (define_expand "vec_shr_<mode>"
10976   [(set (match_dup 3)
10977         (lshiftrt:V1TI
10978          (match_operand:VI_128 1 "register_operand")
10979          (match_operand:SI 2 "const_0_to_255_mul_8_operand")))
10980    (set (match_operand:VI_128 0 "register_operand") (match_dup 4))]
10981   "TARGET_SSE2"
10982 {
10983   operands[1] = gen_lowpart (V1TImode, operands[1]);
10984   operands[3] = gen_reg_rtx (V1TImode);
10985   operands[4] = gen_lowpart (<MODE>mode, operands[3]);
10986 })
10987
10988 (define_insn "avx512bw_<shift_insn><mode>3"
10989   [(set (match_operand:VIMAX_AVX512VL 0 "register_operand" "=v")
10990         (any_lshift:VIMAX_AVX512VL
10991          (match_operand:VIMAX_AVX512VL 1 "nonimmediate_operand" "vm")
10992          (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))]
10993   "TARGET_AVX512BW"
10994 {
10995   operands[2] = GEN_INT (INTVAL (operands[2]) / 8);
10996   return "vp<vshift>dq\t{%2, %1, %0|%0, %1, %2}";
10997 }
10998   [(set_attr "type" "sseishft")
10999    (set_attr "length_immediate" "1")
11000    (set_attr "prefix" "maybe_evex")
11001    (set_attr "mode" "<sseinsnmode>")])
11002
11003 (define_insn "<sse2_avx2>_<shift_insn><mode>3"
11004   [(set (match_operand:VIMAX_AVX2 0 "register_operand" "=x,v")
11005         (any_lshift:VIMAX_AVX2
11006          (match_operand:VIMAX_AVX2 1 "register_operand" "0,v")
11007          (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n,n")))]
11008   "TARGET_SSE2"
11009 {
11010   operands[2] = GEN_INT (INTVAL (operands[2]) / 8);
11011
11012   switch (which_alternative)
11013     {
11014     case 0:
11015       return "p<vshift>dq\t{%2, %0|%0, %2}";
11016     case 1:
11017       return "vp<vshift>dq\t{%2, %1, %0|%0, %1, %2}";
11018     default:
11019       gcc_unreachable ();
11020     }
11021 }
11022   [(set_attr "isa" "noavx,avx")
11023    (set_attr "type" "sseishft")
11024    (set_attr "length_immediate" "1")
11025    (set_attr "atom_unit" "sishuf")
11026    (set_attr "prefix_data16" "1,*")
11027    (set_attr "prefix" "orig,vex")
11028    (set_attr "mode" "<sseinsnmode>")])
11029
11030 (define_insn "<avx512>_<rotate>v<mode><mask_name>"
11031   [(set (match_operand:VI48_AVX512VL 0 "register_operand" "=v")
11032         (any_rotate:VI48_AVX512VL
11033           (match_operand:VI48_AVX512VL 1 "register_operand" "v")
11034           (match_operand:VI48_AVX512VL 2 "nonimmediate_operand" "vm")))]
11035   "TARGET_AVX512F"
11036   "vp<rotate>v<ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
11037   [(set_attr "prefix" "evex")
11038    (set_attr "mode" "<sseinsnmode>")])
11039
11040 (define_insn "<avx512>_<rotate><mode><mask_name>"
11041   [(set (match_operand:VI48_AVX512VL 0 "register_operand" "=v")
11042         (any_rotate:VI48_AVX512VL
11043           (match_operand:VI48_AVX512VL 1 "nonimmediate_operand" "vm")
11044           (match_operand:SI 2 "const_0_to_255_operand")))]
11045   "TARGET_AVX512F"
11046   "vp<rotate><ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
11047   [(set_attr "prefix" "evex")
11048    (set_attr "mode" "<sseinsnmode>")])
11049
11050 (define_expand "<code><mode>3"
11051   [(set (match_operand:VI124_256_AVX512F_AVX512BW 0 "register_operand")
11052         (maxmin:VI124_256_AVX512F_AVX512BW
11053           (match_operand:VI124_256_AVX512F_AVX512BW 1 "nonimmediate_operand")
11054           (match_operand:VI124_256_AVX512F_AVX512BW 2 "nonimmediate_operand")))]
11055   "TARGET_AVX2"
11056   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
11057
11058 (define_insn "*avx2_<code><mode>3"
11059   [(set (match_operand:VI124_256 0 "register_operand" "=v")
11060         (maxmin:VI124_256
11061           (match_operand:VI124_256 1 "nonimmediate_operand" "%v")
11062           (match_operand:VI124_256 2 "nonimmediate_operand" "vm")))]
11063   "TARGET_AVX2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11064   "vp<maxmin_int><ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
11065   [(set_attr "type" "sseiadd")
11066    (set_attr "prefix_extra" "1")
11067    (set_attr "prefix" "vex")
11068    (set_attr "mode" "OI")])
11069
11070 (define_expand "<code><mode>3_mask"
11071   [(set (match_operand:VI48_AVX512VL 0 "register_operand")
11072         (vec_merge:VI48_AVX512VL
11073           (maxmin:VI48_AVX512VL
11074             (match_operand:VI48_AVX512VL 1 "nonimmediate_operand")
11075             (match_operand:VI48_AVX512VL 2 "nonimmediate_operand"))
11076           (match_operand:VI48_AVX512VL 3 "vector_move_operand")
11077           (match_operand:<avx512fmaskmode> 4 "register_operand")))]
11078   "TARGET_AVX512F"
11079   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
11080
11081 (define_insn "*avx512f_<code><mode>3<mask_name>"
11082   [(set (match_operand:VI48_AVX512VL 0 "register_operand" "=v")
11083         (maxmin:VI48_AVX512VL
11084           (match_operand:VI48_AVX512VL 1 "nonimmediate_operand" "%v")
11085           (match_operand:VI48_AVX512VL 2 "nonimmediate_operand" "vm")))]
11086   "TARGET_AVX512F && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11087   "vp<maxmin_int><ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
11088   [(set_attr "type" "sseiadd")
11089    (set_attr "prefix_extra" "1")
11090    (set_attr "prefix" "maybe_evex")
11091    (set_attr "mode" "<sseinsnmode>")])
11092
11093 (define_insn "<mask_codefor><code><mode>3<mask_name>"
11094   [(set (match_operand:VI12_AVX512VL 0 "register_operand" "=v")
11095         (maxmin:VI12_AVX512VL
11096           (match_operand:VI12_AVX512VL 1 "register_operand" "v")
11097           (match_operand:VI12_AVX512VL 2 "nonimmediate_operand" "vm")))]
11098   "TARGET_AVX512BW"
11099   "vp<maxmin_int><ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
11100   [(set_attr "type" "sseiadd")
11101    (set_attr "prefix" "evex")
11102    (set_attr "mode" "<sseinsnmode>")])
11103
11104 (define_expand "<code><mode>3"
11105   [(set (match_operand:VI8_AVX2_AVX512F 0 "register_operand")
11106         (maxmin:VI8_AVX2_AVX512F
11107           (match_operand:VI8_AVX2_AVX512F 1 "register_operand")
11108           (match_operand:VI8_AVX2_AVX512F 2 "register_operand")))]
11109   "TARGET_SSE4_2"
11110 {
11111   if (TARGET_AVX512F
11112       && (<MODE>mode == V8DImode || TARGET_AVX512VL))
11113     ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);
11114   else 
11115     {
11116       enum rtx_code code;
11117       rtx xops[6];
11118       bool ok;
11119
11120
11121       xops[0] = operands[0];
11122
11123       if (<CODE> == SMAX || <CODE> == UMAX)
11124         {
11125           xops[1] = operands[1];
11126           xops[2] = operands[2];
11127         }
11128       else
11129         {
11130           xops[1] = operands[2];
11131           xops[2] = operands[1];
11132         }
11133
11134       code = (<CODE> == UMAX || <CODE> == UMIN) ? GTU : GT;
11135
11136       xops[3] = gen_rtx_fmt_ee (code, VOIDmode, operands[1], operands[2]);
11137       xops[4] = operands[1];
11138       xops[5] = operands[2];
11139
11140       ok = ix86_expand_int_vcond (xops);
11141       gcc_assert (ok);
11142       DONE;
11143     }
11144 })
11145
11146 (define_expand "<code><mode>3"
11147   [(set (match_operand:VI124_128 0 "register_operand")
11148         (smaxmin:VI124_128
11149           (match_operand:VI124_128 1 "vector_operand")
11150           (match_operand:VI124_128 2 "vector_operand")))]
11151   "TARGET_SSE2"
11152 {
11153   if (TARGET_SSE4_1 || <MODE>mode == V8HImode)
11154     ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);
11155   else
11156     {
11157       rtx xops[6];
11158       bool ok;
11159
11160       xops[0] = operands[0];
11161       operands[1] = force_reg (<MODE>mode, operands[1]);
11162       operands[2] = force_reg (<MODE>mode, operands[2]);
11163
11164       if (<CODE> == SMAX)
11165         {
11166           xops[1] = operands[1];
11167           xops[2] = operands[2];
11168         }
11169       else
11170         {
11171           xops[1] = operands[2];
11172           xops[2] = operands[1];
11173         }
11174
11175       xops[3] = gen_rtx_GT (VOIDmode, operands[1], operands[2]);
11176       xops[4] = operands[1];
11177       xops[5] = operands[2];
11178
11179       ok = ix86_expand_int_vcond (xops);
11180       gcc_assert (ok);
11181       DONE;
11182     }
11183 })
11184
11185 (define_insn "*sse4_1_<code><mode>3<mask_name>"
11186   [(set (match_operand:VI14_128 0 "register_operand" "=Yr,*x,v")
11187         (smaxmin:VI14_128
11188           (match_operand:VI14_128 1 "vector_operand" "%0,0,v")
11189           (match_operand:VI14_128 2 "vector_operand" "YrBm,*xBm,vm")))]
11190   "TARGET_SSE4_1
11191    && <mask_mode512bit_condition>
11192    && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11193   "@
11194    p<maxmin_int><ssemodesuffix>\t{%2, %0|%0, %2}
11195    p<maxmin_int><ssemodesuffix>\t{%2, %0|%0, %2}
11196    vp<maxmin_int><ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
11197   [(set_attr "isa" "noavx,noavx,avx")
11198    (set_attr "type" "sseiadd")
11199    (set_attr "prefix_extra" "1,1,*")
11200    (set_attr "prefix" "orig,orig,vex")
11201    (set_attr "mode" "TI")])
11202
11203 (define_insn "*<code>v8hi3"
11204   [(set (match_operand:V8HI 0 "register_operand" "=x,x,v")
11205         (smaxmin:V8HI
11206           (match_operand:V8HI 1 "vector_operand" "%0,x,v")
11207           (match_operand:V8HI 2 "vector_operand" "xBm,xm,vm")))]
11208   "TARGET_SSE2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11209   "@
11210    p<maxmin_int>w\t{%2, %0|%0, %2}
11211    vp<maxmin_int>w\t{%2, %1, %0|%0, %1, %2}
11212    vp<maxmin_int>w\t{%2, %1, %0|%0, %1, %2}"
11213   [(set_attr "isa" "noavx,avx,avx512bw")
11214    (set_attr "type" "sseiadd")
11215    (set_attr "prefix_data16" "1,*,*")
11216    (set_attr "prefix_extra" "*,1,1")
11217    (set_attr "prefix" "orig,vex,evex")
11218    (set_attr "mode" "TI")])
11219
11220 (define_expand "<code><mode>3"
11221   [(set (match_operand:VI124_128 0 "register_operand")
11222         (umaxmin:VI124_128
11223           (match_operand:VI124_128 1 "vector_operand")
11224           (match_operand:VI124_128 2 "vector_operand")))]
11225   "TARGET_SSE2"
11226 {
11227   if (TARGET_SSE4_1 || <MODE>mode == V16QImode)
11228     ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);
11229   else if (<CODE> == UMAX && <MODE>mode == V8HImode)
11230     {
11231       rtx op0 = operands[0], op2 = operands[2], op3 = op0;
11232       operands[1] = force_reg (<MODE>mode, operands[1]);
11233       if (rtx_equal_p (op3, op2))
11234         op3 = gen_reg_rtx (V8HImode);
11235       emit_insn (gen_sse2_ussubv8hi3 (op3, operands[1], op2));
11236       emit_insn (gen_addv8hi3 (op0, op3, op2));
11237       DONE;
11238     }
11239   else
11240     {
11241       rtx xops[6];
11242       bool ok;
11243
11244       operands[1] = force_reg (<MODE>mode, operands[1]);
11245       operands[2] = force_reg (<MODE>mode, operands[2]);
11246
11247       xops[0] = operands[0];
11248
11249       if (<CODE> == UMAX)
11250         {
11251           xops[1] = operands[1];
11252           xops[2] = operands[2];
11253         }
11254       else
11255         {
11256           xops[1] = operands[2];
11257           xops[2] = operands[1];
11258         }
11259
11260       xops[3] = gen_rtx_GTU (VOIDmode, operands[1], operands[2]);
11261       xops[4] = operands[1];
11262       xops[5] = operands[2];
11263
11264       ok = ix86_expand_int_vcond (xops);
11265       gcc_assert (ok);
11266       DONE;
11267     }
11268 })
11269
11270 (define_insn "*sse4_1_<code><mode>3<mask_name>"
11271   [(set (match_operand:VI24_128 0 "register_operand" "=Yr,*x,v")
11272         (umaxmin:VI24_128
11273           (match_operand:VI24_128 1 "vector_operand" "%0,0,v")
11274           (match_operand:VI24_128 2 "vector_operand" "YrBm,*xBm,vm")))]
11275   "TARGET_SSE4_1
11276    && <mask_mode512bit_condition>
11277    && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11278   "@
11279    p<maxmin_int><ssemodesuffix>\t{%2, %0|%0, %2}
11280    p<maxmin_int><ssemodesuffix>\t{%2, %0|%0, %2}
11281    vp<maxmin_int><ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
11282   [(set_attr "isa" "noavx,noavx,avx")
11283    (set_attr "type" "sseiadd")
11284    (set_attr "prefix_extra" "1,1,*")
11285    (set_attr "prefix" "orig,orig,vex")
11286    (set_attr "mode" "TI")])
11287
11288 (define_insn "*<code>v16qi3"
11289   [(set (match_operand:V16QI 0 "register_operand" "=x,x,v")
11290         (umaxmin:V16QI
11291           (match_operand:V16QI 1 "vector_operand" "%0,x,v")
11292           (match_operand:V16QI 2 "vector_operand" "xBm,xm,vm")))]
11293   "TARGET_SSE2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11294   "@
11295    p<maxmin_int>b\t{%2, %0|%0, %2}
11296    vp<maxmin_int>b\t{%2, %1, %0|%0, %1, %2}
11297    vp<maxmin_int>b\t{%2, %1, %0|%0, %1, %2}"
11298   [(set_attr "isa" "noavx,avx,avx512bw")
11299    (set_attr "type" "sseiadd")
11300    (set_attr "prefix_data16" "1,*,*")
11301    (set_attr "prefix_extra" "*,1,1")
11302    (set_attr "prefix" "orig,vex,evex")
11303    (set_attr "mode" "TI")])
11304
11305 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11306 ;;
11307 ;; Parallel integral comparisons
11308 ;;
11309 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11310
11311 (define_expand "avx2_eq<mode>3"
11312   [(set (match_operand:VI_256 0 "register_operand")
11313         (eq:VI_256
11314           (match_operand:VI_256 1 "nonimmediate_operand")
11315           (match_operand:VI_256 2 "nonimmediate_operand")))]
11316   "TARGET_AVX2"
11317   "ix86_fixup_binary_operands_no_copy (EQ, <MODE>mode, operands);")
11318
11319 (define_insn "*avx2_eq<mode>3"
11320   [(set (match_operand:VI_256 0 "register_operand" "=x")
11321         (eq:VI_256
11322           (match_operand:VI_256 1 "nonimmediate_operand" "%x")
11323           (match_operand:VI_256 2 "nonimmediate_operand" "xm")))]
11324   "TARGET_AVX2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11325   "vpcmpeq<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
11326   [(set_attr "type" "ssecmp")
11327    (set_attr "prefix_extra" "1")
11328    (set_attr "prefix" "vex")
11329    (set_attr "mode" "OI")])
11330
11331 (define_expand "<avx512>_eq<mode>3<mask_scalar_merge_name>"
11332   [(set (match_operand:<avx512fmaskmode> 0 "register_operand")
11333         (unspec:<avx512fmaskmode>
11334           [(match_operand:VI12_AVX512VL 1 "nonimmediate_operand")
11335            (match_operand:VI12_AVX512VL 2 "nonimmediate_operand")]
11336           UNSPEC_MASKED_EQ))]
11337   "TARGET_AVX512BW"
11338   "ix86_fixup_binary_operands_no_copy (EQ, <MODE>mode, operands);")
11339
11340 (define_expand "<avx512>_eq<mode>3<mask_scalar_merge_name>"
11341   [(set (match_operand:<avx512fmaskmode> 0 "register_operand")
11342         (unspec:<avx512fmaskmode>
11343           [(match_operand:VI48_AVX512VL 1 "nonimmediate_operand")
11344            (match_operand:VI48_AVX512VL 2 "nonimmediate_operand")]
11345           UNSPEC_MASKED_EQ))]
11346   "TARGET_AVX512F"
11347   "ix86_fixup_binary_operands_no_copy (EQ, <MODE>mode, operands);")
11348
11349 (define_insn "<avx512>_eq<mode>3<mask_scalar_merge_name>_1"
11350   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
11351         (unspec:<avx512fmaskmode>
11352           [(match_operand:VI12_AVX512VL 1 "nonimmediate_operand" "%v")
11353            (match_operand:VI12_AVX512VL 2 "nonimmediate_operand" "vm")]
11354           UNSPEC_MASKED_EQ))]
11355   "TARGET_AVX512F && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11356   "vpcmpeq<ssemodesuffix>\t{%2, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %2}"
11357   [(set_attr "type" "ssecmp")
11358    (set_attr "prefix_extra" "1")
11359    (set_attr "prefix" "evex")
11360    (set_attr "mode" "<sseinsnmode>")])
11361
11362 (define_insn "<avx512>_eq<mode>3<mask_scalar_merge_name>_1"
11363   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
11364         (unspec:<avx512fmaskmode>
11365           [(match_operand:VI48_AVX512VL 1 "nonimmediate_operand" "%v")
11366            (match_operand:VI48_AVX512VL 2 "nonimmediate_operand" "vm")]
11367           UNSPEC_MASKED_EQ))]
11368   "TARGET_AVX512F && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11369   "vpcmpeq<ssemodesuffix>\t{%2, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %2}"
11370   [(set_attr "type" "ssecmp")
11371    (set_attr "prefix_extra" "1")
11372    (set_attr "prefix" "evex")
11373    (set_attr "mode" "<sseinsnmode>")])
11374
11375 (define_insn "*sse4_1_eqv2di3"
11376   [(set (match_operand:V2DI 0 "register_operand" "=Yr,*x,x")
11377         (eq:V2DI
11378           (match_operand:V2DI 1 "vector_operand" "%0,0,x")
11379           (match_operand:V2DI 2 "vector_operand" "YrBm,*xBm,xm")))]
11380   "TARGET_SSE4_1 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11381   "@
11382    pcmpeqq\t{%2, %0|%0, %2}
11383    pcmpeqq\t{%2, %0|%0, %2}
11384    vpcmpeqq\t{%2, %1, %0|%0, %1, %2}"
11385   [(set_attr "isa" "noavx,noavx,avx")
11386    (set_attr "type" "ssecmp")
11387    (set_attr "prefix_extra" "1")
11388    (set_attr "prefix" "orig,orig,vex")
11389    (set_attr "mode" "TI")])
11390
11391 (define_insn "*sse2_eq<mode>3"
11392   [(set (match_operand:VI124_128 0 "register_operand" "=x,x")
11393         (eq:VI124_128
11394           (match_operand:VI124_128 1 "vector_operand" "%0,x")
11395           (match_operand:VI124_128 2 "vector_operand" "xBm,xm")))]
11396   "TARGET_SSE2 && !TARGET_XOP
11397    && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11398   "@
11399    pcmpeq<ssemodesuffix>\t{%2, %0|%0, %2}
11400    vpcmpeq<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
11401   [(set_attr "isa" "noavx,avx")
11402    (set_attr "type" "ssecmp")
11403    (set_attr "prefix_data16" "1,*")
11404    (set_attr "prefix" "orig,vex")
11405    (set_attr "mode" "TI")])
11406
11407 (define_expand "sse2_eq<mode>3"
11408   [(set (match_operand:VI124_128 0 "register_operand")
11409         (eq:VI124_128
11410           (match_operand:VI124_128 1 "vector_operand")
11411           (match_operand:VI124_128 2 "vector_operand")))]
11412   "TARGET_SSE2 && !TARGET_XOP "
11413   "ix86_fixup_binary_operands_no_copy (EQ, <MODE>mode, operands);")
11414
11415 (define_expand "sse4_1_eqv2di3"
11416   [(set (match_operand:V2DI 0 "register_operand")
11417         (eq:V2DI
11418           (match_operand:V2DI 1 "vector_operand")
11419           (match_operand:V2DI 2 "vector_operand")))]
11420   "TARGET_SSE4_1"
11421   "ix86_fixup_binary_operands_no_copy (EQ, V2DImode, operands);")
11422
11423 (define_insn "sse4_2_gtv2di3"
11424   [(set (match_operand:V2DI 0 "register_operand" "=Yr,*x,x")
11425         (gt:V2DI
11426           (match_operand:V2DI 1 "register_operand" "0,0,x")
11427           (match_operand:V2DI 2 "vector_operand" "YrBm,*xBm,xm")))]
11428   "TARGET_SSE4_2"
11429   "@
11430    pcmpgtq\t{%2, %0|%0, %2}
11431    pcmpgtq\t{%2, %0|%0, %2}
11432    vpcmpgtq\t{%2, %1, %0|%0, %1, %2}"
11433   [(set_attr "isa" "noavx,noavx,avx")
11434    (set_attr "type" "ssecmp")
11435    (set_attr "prefix_extra" "1")
11436    (set_attr "prefix" "orig,orig,vex")
11437    (set_attr "mode" "TI")])
11438
11439 (define_insn "avx2_gt<mode>3"
11440   [(set (match_operand:VI_256 0 "register_operand" "=x")
11441         (gt:VI_256
11442           (match_operand:VI_256 1 "register_operand" "x")
11443           (match_operand:VI_256 2 "nonimmediate_operand" "xm")))]
11444   "TARGET_AVX2"
11445   "vpcmpgt<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
11446   [(set_attr "type" "ssecmp")
11447    (set_attr "prefix_extra" "1")
11448    (set_attr "prefix" "vex")
11449    (set_attr "mode" "OI")])
11450
11451 (define_insn "<avx512>_gt<mode>3<mask_scalar_merge_name>"
11452   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
11453         (unspec:<avx512fmaskmode>
11454           [(match_operand:VI48_AVX512VL 1 "register_operand" "v")
11455            (match_operand:VI48_AVX512VL 2 "nonimmediate_operand" "vm")] UNSPEC_MASKED_GT))]
11456   "TARGET_AVX512F"
11457   "vpcmpgt<ssemodesuffix>\t{%2, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %2}"
11458   [(set_attr "type" "ssecmp")
11459    (set_attr "prefix_extra" "1")
11460    (set_attr "prefix" "evex")
11461    (set_attr "mode" "<sseinsnmode>")])
11462
11463 (define_insn "<avx512>_gt<mode>3<mask_scalar_merge_name>"
11464   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
11465         (unspec:<avx512fmaskmode>
11466           [(match_operand:VI12_AVX512VL 1 "register_operand" "v")
11467            (match_operand:VI12_AVX512VL 2 "nonimmediate_operand" "vm")] UNSPEC_MASKED_GT))]
11468   "TARGET_AVX512BW"
11469   "vpcmpgt<ssemodesuffix>\t{%2, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %2}"
11470   [(set_attr "type" "ssecmp")
11471    (set_attr "prefix_extra" "1")
11472    (set_attr "prefix" "evex")
11473    (set_attr "mode" "<sseinsnmode>")])
11474
11475 (define_insn "sse2_gt<mode>3"
11476   [(set (match_operand:VI124_128 0 "register_operand" "=x,x")
11477         (gt:VI124_128
11478           (match_operand:VI124_128 1 "register_operand" "0,x")
11479           (match_operand:VI124_128 2 "vector_operand" "xBm,xm")))]
11480   "TARGET_SSE2 && !TARGET_XOP"
11481   "@
11482    pcmpgt<ssemodesuffix>\t{%2, %0|%0, %2}
11483    vpcmpgt<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
11484   [(set_attr "isa" "noavx,avx")
11485    (set_attr "type" "ssecmp")
11486    (set_attr "prefix_data16" "1,*")
11487    (set_attr "prefix" "orig,vex")
11488    (set_attr "mode" "TI")])
11489
11490 (define_expand "vcond<V_512:mode><VI_AVX512BW:mode>"
11491   [(set (match_operand:V_512 0 "register_operand")
11492         (if_then_else:V_512
11493           (match_operator 3 ""
11494             [(match_operand:VI_AVX512BW 4 "nonimmediate_operand")
11495              (match_operand:VI_AVX512BW 5 "general_operand")])
11496           (match_operand:V_512 1)
11497           (match_operand:V_512 2)))]
11498   "TARGET_AVX512F
11499    && (GET_MODE_NUNITS (<V_512:MODE>mode)
11500        == GET_MODE_NUNITS (<VI_AVX512BW:MODE>mode))"
11501 {
11502   bool ok = ix86_expand_int_vcond (operands);
11503   gcc_assert (ok);
11504   DONE;
11505 })
11506
11507 (define_expand "vcond<V_256:mode><VI_256:mode>"
11508   [(set (match_operand:V_256 0 "register_operand")
11509         (if_then_else:V_256
11510           (match_operator 3 ""
11511             [(match_operand:VI_256 4 "nonimmediate_operand")
11512              (match_operand:VI_256 5 "general_operand")])
11513           (match_operand:V_256 1)
11514           (match_operand:V_256 2)))]
11515   "TARGET_AVX2
11516    && (GET_MODE_NUNITS (<V_256:MODE>mode)
11517        == GET_MODE_NUNITS (<VI_256:MODE>mode))"
11518 {
11519   bool ok = ix86_expand_int_vcond (operands);
11520   gcc_assert (ok);
11521   DONE;
11522 })
11523
11524 (define_expand "vcond<V_128:mode><VI124_128:mode>"
11525   [(set (match_operand:V_128 0 "register_operand")
11526         (if_then_else:V_128
11527           (match_operator 3 ""
11528             [(match_operand:VI124_128 4 "vector_operand")
11529              (match_operand:VI124_128 5 "general_operand")])
11530           (match_operand:V_128 1)
11531           (match_operand:V_128 2)))]
11532   "TARGET_SSE2
11533    && (GET_MODE_NUNITS (<V_128:MODE>mode)
11534        == GET_MODE_NUNITS (<VI124_128:MODE>mode))"
11535 {
11536   bool ok = ix86_expand_int_vcond (operands);
11537   gcc_assert (ok);
11538   DONE;
11539 })
11540
11541 (define_expand "vcond<VI8F_128:mode>v2di"
11542   [(set (match_operand:VI8F_128 0 "register_operand")
11543         (if_then_else:VI8F_128
11544           (match_operator 3 ""
11545             [(match_operand:V2DI 4 "vector_operand")
11546              (match_operand:V2DI 5 "general_operand")])
11547           (match_operand:VI8F_128 1)
11548           (match_operand:VI8F_128 2)))]
11549   "TARGET_SSE4_2"
11550 {
11551   bool ok = ix86_expand_int_vcond (operands);
11552   gcc_assert (ok);
11553   DONE;
11554 })
11555
11556 (define_expand "vcondu<V_512:mode><VI_AVX512BW:mode>"
11557   [(set (match_operand:V_512 0 "register_operand")
11558         (if_then_else:V_512
11559           (match_operator 3 ""
11560             [(match_operand:VI_AVX512BW 4 "nonimmediate_operand")
11561              (match_operand:VI_AVX512BW 5 "nonimmediate_operand")])
11562           (match_operand:V_512 1 "general_operand")
11563           (match_operand:V_512 2 "general_operand")))]
11564   "TARGET_AVX512F
11565    && (GET_MODE_NUNITS (<V_512:MODE>mode)
11566        == GET_MODE_NUNITS (<VI_AVX512BW:MODE>mode))"
11567 {
11568   bool ok = ix86_expand_int_vcond (operands);
11569   gcc_assert (ok);
11570   DONE;
11571 })
11572
11573 (define_expand "vcondu<V_256:mode><VI_256:mode>"
11574   [(set (match_operand:V_256 0 "register_operand")
11575         (if_then_else:V_256
11576           (match_operator 3 ""
11577             [(match_operand:VI_256 4 "nonimmediate_operand")
11578              (match_operand:VI_256 5 "nonimmediate_operand")])
11579           (match_operand:V_256 1 "general_operand")
11580           (match_operand:V_256 2 "general_operand")))]
11581   "TARGET_AVX2
11582    && (GET_MODE_NUNITS (<V_256:MODE>mode)
11583        == GET_MODE_NUNITS (<VI_256:MODE>mode))"
11584 {
11585   bool ok = ix86_expand_int_vcond (operands);
11586   gcc_assert (ok);
11587   DONE;
11588 })
11589
11590 (define_expand "vcondu<V_128:mode><VI124_128:mode>"
11591   [(set (match_operand:V_128 0 "register_operand")
11592         (if_then_else:V_128
11593           (match_operator 3 ""
11594             [(match_operand:VI124_128 4 "vector_operand")
11595              (match_operand:VI124_128 5 "vector_operand")])
11596           (match_operand:V_128 1 "general_operand")
11597           (match_operand:V_128 2 "general_operand")))]
11598   "TARGET_SSE2
11599    && (GET_MODE_NUNITS (<V_128:MODE>mode)
11600        == GET_MODE_NUNITS (<VI124_128:MODE>mode))"
11601 {
11602   bool ok = ix86_expand_int_vcond (operands);
11603   gcc_assert (ok);
11604   DONE;
11605 })
11606
11607 (define_expand "vcondu<VI8F_128:mode>v2di"
11608   [(set (match_operand:VI8F_128 0 "register_operand")
11609         (if_then_else:VI8F_128
11610           (match_operator 3 ""
11611             [(match_operand:V2DI 4 "vector_operand")
11612              (match_operand:V2DI 5 "vector_operand")])
11613           (match_operand:VI8F_128 1 "general_operand")
11614           (match_operand:VI8F_128 2 "general_operand")))]
11615   "TARGET_SSE4_2"
11616 {
11617   bool ok = ix86_expand_int_vcond (operands);
11618   gcc_assert (ok);
11619   DONE;
11620 })
11621
11622 (define_expand "vcondeq<VI8F_128:mode>v2di"
11623   [(set (match_operand:VI8F_128 0 "register_operand")
11624         (if_then_else:VI8F_128
11625           (match_operator 3 ""
11626             [(match_operand:V2DI 4 "vector_operand")
11627              (match_operand:V2DI 5 "general_operand")])
11628           (match_operand:VI8F_128 1)
11629           (match_operand:VI8F_128 2)))]
11630   "TARGET_SSE4_1"
11631 {
11632   bool ok = ix86_expand_int_vcond (operands);
11633   gcc_assert (ok);
11634   DONE;
11635 })
11636
11637 (define_mode_iterator VEC_PERM_AVX2
11638   [V16QI V8HI V4SI V2DI V4SF V2DF
11639    (V32QI "TARGET_AVX2") (V16HI "TARGET_AVX2")
11640    (V8SI "TARGET_AVX2") (V4DI "TARGET_AVX2")
11641    (V8SF "TARGET_AVX2") (V4DF "TARGET_AVX2")
11642    (V16SF "TARGET_AVX512F") (V8DF "TARGET_AVX512F")
11643    (V16SI "TARGET_AVX512F") (V8DI "TARGET_AVX512F")
11644    (V32HI "TARGET_AVX512BW") (V64QI "TARGET_AVX512VBMI")])
11645
11646 (define_expand "vec_perm<mode>"
11647   [(match_operand:VEC_PERM_AVX2 0 "register_operand")
11648    (match_operand:VEC_PERM_AVX2 1 "register_operand")
11649    (match_operand:VEC_PERM_AVX2 2 "register_operand")
11650    (match_operand:<sseintvecmode> 3 "register_operand")]
11651   "TARGET_SSSE3 || TARGET_AVX || TARGET_XOP"
11652 {
11653   ix86_expand_vec_perm (operands);
11654   DONE;
11655 })
11656
11657 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11658 ;;
11659 ;; Parallel bitwise logical operations
11660 ;;
11661 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11662
11663 (define_expand "one_cmpl<mode>2"
11664   [(set (match_operand:VI 0 "register_operand")
11665         (xor:VI (match_operand:VI 1 "vector_operand")
11666                 (match_dup 2)))]
11667   "TARGET_SSE"
11668 {
11669   operands[2] = force_reg (<MODE>mode, CONSTM1_RTX (<MODE>mode));
11670 })
11671
11672 (define_expand "<sse2_avx2>_andnot<mode>3"
11673   [(set (match_operand:VI_AVX2 0 "register_operand")
11674         (and:VI_AVX2
11675           (not:VI_AVX2 (match_operand:VI_AVX2 1 "register_operand"))
11676           (match_operand:VI_AVX2 2 "vector_operand")))]
11677   "TARGET_SSE2")
11678
11679 (define_expand "<sse2_avx2>_andnot<mode>3_mask"
11680   [(set (match_operand:VI48_AVX512VL 0 "register_operand")
11681         (vec_merge:VI48_AVX512VL
11682           (and:VI48_AVX512VL
11683             (not:VI48_AVX512VL
11684               (match_operand:VI48_AVX512VL 1 "register_operand"))
11685             (match_operand:VI48_AVX512VL 2 "nonimmediate_operand"))
11686           (match_operand:VI48_AVX512VL 3 "vector_move_operand")
11687           (match_operand:<avx512fmaskmode> 4 "register_operand")))]
11688   "TARGET_AVX512F")
11689
11690 (define_expand "<sse2_avx2>_andnot<mode>3_mask"
11691   [(set (match_operand:VI12_AVX512VL 0 "register_operand")
11692         (vec_merge:VI12_AVX512VL
11693           (and:VI12_AVX512VL
11694             (not:VI12_AVX512VL
11695               (match_operand:VI12_AVX512VL 1 "register_operand"))
11696             (match_operand:VI12_AVX512VL 2 "nonimmediate_operand"))
11697           (match_operand:VI12_AVX512VL 3 "vector_move_operand")
11698           (match_operand:<avx512fmaskmode> 4 "register_operand")))]
11699   "TARGET_AVX512BW")
11700
11701 (define_insn "*andnot<mode>3"
11702   [(set (match_operand:VI 0 "register_operand" "=x,x,v")
11703         (and:VI
11704           (not:VI (match_operand:VI 1 "register_operand" "0,x,v"))
11705           (match_operand:VI 2 "vector_operand" "xBm,xm,vm")))]
11706   "TARGET_SSE"
11707 {
11708   static char buf[64];
11709   const char *ops;
11710   const char *tmp;
11711   const char *ssesuffix;
11712
11713   switch (get_attr_mode (insn))
11714     {
11715     case MODE_XI:
11716       gcc_assert (TARGET_AVX512F);
11717       /* FALLTHRU */
11718     case MODE_OI:
11719       gcc_assert (TARGET_AVX2);
11720       /* FALLTHRU */
11721     case MODE_TI:
11722       gcc_assert (TARGET_SSE2);
11723       tmp = "pandn";
11724       switch (<MODE>mode)
11725         {
11726         case E_V64QImode:
11727         case E_V32HImode:
11728           /* There is no vpandnb or vpandnw instruction, nor vpandn for
11729              512-bit vectors. Use vpandnq instead.  */
11730           ssesuffix = "q";
11731           break;
11732         case E_V16SImode:
11733         case E_V8DImode:
11734           ssesuffix = "<ssemodesuffix>";
11735           break;
11736         case E_V8SImode:
11737         case E_V4DImode:
11738         case E_V4SImode:
11739         case E_V2DImode:
11740           ssesuffix = (TARGET_AVX512VL && which_alternative == 2
11741                        ? "<ssemodesuffix>" : "");
11742           break;
11743         default:
11744           ssesuffix = TARGET_AVX512VL && which_alternative == 2 ? "q" : "";
11745         }
11746       break;
11747
11748     case MODE_V16SF:
11749       gcc_assert (TARGET_AVX512F);
11750       /* FALLTHRU */
11751     case MODE_V8SF:
11752       gcc_assert (TARGET_AVX);
11753       /* FALLTHRU */
11754     case MODE_V4SF:
11755       gcc_assert (TARGET_SSE);
11756       tmp = "andn";
11757       ssesuffix = "ps";
11758       break;
11759
11760     default:
11761       gcc_unreachable ();
11762     }
11763
11764   switch (which_alternative)
11765     {
11766     case 0:
11767       ops = "%s%s\t{%%2, %%0|%%0, %%2}";
11768       break;
11769     case 1:
11770     case 2:
11771       ops = "v%s%s\t{%%2, %%1, %%0|%%0, %%1, %%2}";
11772       break;
11773     default:
11774       gcc_unreachable ();
11775     }
11776
11777   snprintf (buf, sizeof (buf), ops, tmp, ssesuffix);
11778   return buf;
11779 }
11780   [(set_attr "isa" "noavx,avx,avx")
11781    (set_attr "type" "sselog")
11782    (set (attr "prefix_data16")
11783      (if_then_else
11784        (and (eq_attr "alternative" "0")
11785             (eq_attr "mode" "TI"))
11786        (const_string "1")
11787        (const_string "*")))
11788    (set_attr "prefix" "orig,vex,evex")
11789    (set (attr "mode")
11790         (cond [(and (match_test "<MODE_SIZE> == 16")
11791                     (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL"))
11792                  (const_string "<ssePSmode>")
11793                (match_test "TARGET_AVX2")
11794                  (const_string "<sseinsnmode>")
11795                (match_test "TARGET_AVX")
11796                  (if_then_else
11797                    (match_test "<MODE_SIZE> > 16")
11798                    (const_string "V8SF")
11799                    (const_string "<sseinsnmode>"))
11800                (ior (not (match_test "TARGET_SSE2"))
11801                     (match_test "optimize_function_for_size_p (cfun)"))
11802                  (const_string "V4SF")
11803               ]
11804               (const_string "<sseinsnmode>")))])
11805
11806 (define_insn "*andnot<mode>3_mask"
11807   [(set (match_operand:VI48_AVX512VL 0 "register_operand" "=v")
11808         (vec_merge:VI48_AVX512VL
11809           (and:VI48_AVX512VL
11810             (not:VI48_AVX512VL
11811               (match_operand:VI48_AVX512VL 1 "register_operand" "v"))
11812             (match_operand:VI48_AVX512VL 2 "nonimmediate_operand" "vm"))
11813           (match_operand:VI48_AVX512VL 3 "vector_move_operand" "0C")
11814           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
11815   "TARGET_AVX512F"
11816   "vpandn<ssemodesuffix>\t{%2, %1, %0%{%4%}%N3|%0%{%4%}%N3, %1, %2}";
11817   [(set_attr "type" "sselog")
11818    (set_attr "prefix" "evex")
11819    (set_attr "mode" "<sseinsnmode>")])
11820
11821 (define_expand "<code><mode>3"
11822   [(set (match_operand:VI 0 "register_operand")
11823         (any_logic:VI
11824           (match_operand:VI 1 "nonimmediate_or_const_vector_operand")
11825           (match_operand:VI 2 "nonimmediate_or_const_vector_operand")))]
11826   "TARGET_SSE"
11827 {
11828   ix86_expand_vector_logical_operator (<CODE>, <MODE>mode, operands);
11829   DONE;
11830 })
11831
11832 (define_insn "<mask_codefor><code><mode>3<mask_name>"
11833   [(set (match_operand:VI48_AVX_AVX512F 0 "register_operand" "=x,x,v")
11834         (any_logic:VI48_AVX_AVX512F
11835           (match_operand:VI48_AVX_AVX512F 1 "vector_operand" "%0,x,v")
11836           (match_operand:VI48_AVX_AVX512F 2 "vector_operand" "xBm,xm,vm")))]
11837   "TARGET_SSE && <mask_mode512bit_condition>
11838    && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11839 {
11840   static char buf[64];
11841   const char *ops;
11842   const char *tmp;
11843   const char *ssesuffix;
11844
11845   switch (get_attr_mode (insn))
11846     {
11847     case MODE_XI:
11848       gcc_assert (TARGET_AVX512F);
11849       /* FALLTHRU */
11850     case MODE_OI:
11851       gcc_assert (TARGET_AVX2);
11852       /* FALLTHRU */
11853     case MODE_TI:
11854       gcc_assert (TARGET_SSE2);
11855       tmp = "p<logic>";
11856       switch (<MODE>mode)
11857         {
11858         case E_V16SImode:
11859         case E_V8DImode:
11860           ssesuffix = "<ssemodesuffix>";
11861           break;
11862         case E_V8SImode:
11863         case E_V4DImode:
11864         case E_V4SImode:
11865         case E_V2DImode:
11866           ssesuffix = (TARGET_AVX512VL
11867                        && (<mask_applied> || which_alternative == 2)
11868                        ? "<ssemodesuffix>" : "");
11869           break;
11870         default:
11871           gcc_unreachable ();
11872         }
11873       break;
11874
11875     case MODE_V8SF:
11876       gcc_assert (TARGET_AVX);
11877       /* FALLTHRU */
11878     case MODE_V4SF:
11879       gcc_assert (TARGET_SSE);
11880       tmp = "<logic>";
11881       ssesuffix = "ps";
11882       break;
11883
11884     default:
11885       gcc_unreachable ();
11886     }
11887
11888   switch (which_alternative)
11889     {
11890     case 0:
11891       if (<mask_applied>)
11892         ops = "v%s%s\t{%%2, %%0, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%0, %%2}";
11893       else
11894         ops = "%s%s\t{%%2, %%0|%%0, %%2}";
11895       break;
11896     case 1:
11897     case 2:
11898       ops = "v%s%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>, %%1, %%2}";
11899       break;
11900     default:
11901       gcc_unreachable ();
11902     }
11903
11904   snprintf (buf, sizeof (buf), ops, tmp, ssesuffix);
11905   return buf;
11906 }
11907   [(set_attr "isa" "noavx,avx,avx")
11908    (set_attr "type" "sselog")
11909    (set (attr "prefix_data16")
11910      (if_then_else
11911        (and (eq_attr "alternative" "0")
11912             (eq_attr "mode" "TI"))
11913        (const_string "1")
11914        (const_string "*")))
11915    (set_attr "prefix" "<mask_prefix3>,evex")
11916    (set (attr "mode")
11917         (cond [(and (match_test "<MODE_SIZE> == 16")
11918                     (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL"))
11919                  (const_string "<ssePSmode>")
11920                (match_test "TARGET_AVX2")
11921                  (const_string "<sseinsnmode>")
11922                (match_test "TARGET_AVX")
11923                  (if_then_else
11924                    (match_test "<MODE_SIZE> > 16")
11925                    (const_string "V8SF")
11926                    (const_string "<sseinsnmode>"))
11927                (ior (not (match_test "TARGET_SSE2"))
11928                     (match_test "optimize_function_for_size_p (cfun)"))
11929                  (const_string "V4SF")
11930               ]
11931               (const_string "<sseinsnmode>")))])
11932
11933 (define_insn "*<code><mode>3"
11934   [(set (match_operand:VI12_AVX_AVX512F 0 "register_operand" "=x,x,v")
11935         (any_logic:VI12_AVX_AVX512F
11936           (match_operand:VI12_AVX_AVX512F 1 "vector_operand" "%0,x,v")
11937           (match_operand:VI12_AVX_AVX512F 2 "vector_operand" "xBm,xm,vm")))]
11938   "TARGET_SSE && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11939 {
11940   static char buf[64];
11941   const char *ops;
11942   const char *tmp;
11943   const char *ssesuffix;
11944
11945   switch (get_attr_mode (insn))
11946     {
11947     case MODE_XI:
11948       gcc_assert (TARGET_AVX512F);
11949       /* FALLTHRU */
11950     case MODE_OI:
11951       gcc_assert (TARGET_AVX2);
11952       /* FALLTHRU */
11953     case MODE_TI:
11954       gcc_assert (TARGET_SSE2);
11955       tmp = "p<logic>";
11956       switch (<MODE>mode)
11957         {
11958         case E_V64QImode:
11959         case E_V32HImode:
11960           ssesuffix = "q";
11961           break;
11962         case E_V32QImode:
11963         case E_V16HImode:
11964         case E_V16QImode:
11965         case E_V8HImode:
11966           ssesuffix = TARGET_AVX512VL && which_alternative == 2 ? "q" : "";
11967           break;
11968         default:
11969           gcc_unreachable ();
11970         }
11971       break;
11972
11973     case MODE_V8SF:
11974       gcc_assert (TARGET_AVX);
11975       /* FALLTHRU */
11976     case MODE_V4SF:
11977       gcc_assert (TARGET_SSE);
11978       tmp = "<logic>";
11979       ssesuffix = "ps";
11980       break;
11981
11982     default:
11983       gcc_unreachable ();
11984     }
11985
11986   switch (which_alternative)
11987     {
11988     case 0:
11989       ops = "%s%s\t{%%2, %%0|%%0, %%2}";
11990       break;
11991     case 1:
11992     case 2:
11993       ops = "v%s%s\t{%%2, %%1, %%0|%%0, %%1, %%2}";
11994       break;
11995     default:
11996       gcc_unreachable ();
11997     }
11998
11999   snprintf (buf, sizeof (buf), ops, tmp, ssesuffix);
12000   return buf;
12001 }
12002   [(set_attr "isa" "noavx,avx,avx")
12003    (set_attr "type" "sselog")
12004    (set (attr "prefix_data16")
12005      (if_then_else
12006        (and (eq_attr "alternative" "0")
12007             (eq_attr "mode" "TI"))
12008        (const_string "1")
12009        (const_string "*")))
12010    (set_attr "prefix" "orig,vex,evex")
12011    (set (attr "mode")
12012         (cond [(and (match_test "<MODE_SIZE> == 16")
12013                     (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL"))
12014                  (const_string "<ssePSmode>")
12015                (match_test "TARGET_AVX2")
12016                  (const_string "<sseinsnmode>")
12017                (match_test "TARGET_AVX")
12018                  (if_then_else
12019                    (match_test "<MODE_SIZE> > 16")
12020                    (const_string "V8SF")
12021                    (const_string "<sseinsnmode>"))
12022                (ior (not (match_test "TARGET_SSE2"))
12023                     (match_test "optimize_function_for_size_p (cfun)"))
12024                  (const_string "V4SF")
12025               ]
12026               (const_string "<sseinsnmode>")))])
12027
12028 (define_insn "<avx512>_testm<mode>3<mask_scalar_merge_name>"
12029   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
12030         (unspec:<avx512fmaskmode>
12031          [(match_operand:VI12_AVX512VL 1 "register_operand" "v")
12032           (match_operand:VI12_AVX512VL 2 "nonimmediate_operand" "vm")]
12033          UNSPEC_TESTM))]
12034   "TARGET_AVX512BW"
12035   "vptestm<ssemodesuffix>\t{%2, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %2}"
12036   [(set_attr "prefix" "evex")
12037    (set_attr "mode"  "<sseinsnmode>")])
12038
12039 (define_insn "<avx512>_testm<mode>3<mask_scalar_merge_name>"
12040   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
12041         (unspec:<avx512fmaskmode>
12042          [(match_operand:VI48_AVX512VL 1 "register_operand" "v")
12043           (match_operand:VI48_AVX512VL 2 "nonimmediate_operand" "vm")]
12044          UNSPEC_TESTM))]
12045   "TARGET_AVX512F"
12046   "vptestm<ssemodesuffix>\t{%2, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %2}"
12047   [(set_attr "prefix" "evex")
12048    (set_attr "mode"  "<sseinsnmode>")])
12049
12050 (define_insn "<avx512>_testnm<mode>3<mask_scalar_merge_name>"
12051   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
12052         (unspec:<avx512fmaskmode>
12053          [(match_operand:VI12_AVX512VL 1 "register_operand" "v")
12054           (match_operand:VI12_AVX512VL 2 "nonimmediate_operand" "vm")]
12055          UNSPEC_TESTNM))]
12056   "TARGET_AVX512BW"
12057   "vptestnm<ssemodesuffix>\t{%2, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %2}"
12058   [(set_attr "prefix" "evex")
12059    (set_attr "mode"  "<sseinsnmode>")])
12060
12061 (define_insn "<avx512>_testnm<mode>3<mask_scalar_merge_name>"
12062   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
12063         (unspec:<avx512fmaskmode>
12064          [(match_operand:VI48_AVX512VL 1 "register_operand" "v")
12065           (match_operand:VI48_AVX512VL 2 "nonimmediate_operand" "vm")]
12066          UNSPEC_TESTNM))]
12067   "TARGET_AVX512F"
12068   "vptestnm<ssemodesuffix>\t{%2, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %2}"
12069   [(set_attr "prefix" "evex")
12070    (set_attr "mode"  "<sseinsnmode>")])
12071
12072 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12073 ;;
12074 ;; Parallel integral element swizzling
12075 ;;
12076 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12077
12078 (define_expand "vec_pack_trunc_<mode>"
12079   [(match_operand:<ssepackmode> 0 "register_operand")
12080    (match_operand:VI248_AVX2_8_AVX512F_24_AVX512BW 1 "register_operand")
12081    (match_operand:VI248_AVX2_8_AVX512F_24_AVX512BW 2 "register_operand")]
12082   "TARGET_SSE2"
12083 {
12084   rtx op1 = gen_lowpart (<ssepackmode>mode, operands[1]);
12085   rtx op2 = gen_lowpart (<ssepackmode>mode, operands[2]);
12086   ix86_expand_vec_extract_even_odd (operands[0], op1, op2, 0);
12087   DONE;
12088 })
12089
12090 (define_expand "vec_pack_trunc_qi"
12091   [(set (match_operand:HI 0 ("register_operand"))
12092         (ior:HI (ashift:HI (zero_extend:HI (match_operand:QI 2 ("register_operand")))
12093                            (const_int 8))
12094                 (zero_extend:HI (match_operand:QI 1 ("register_operand")))))]
12095   "TARGET_AVX512F")
12096
12097 (define_expand "vec_pack_trunc_<mode>"
12098   [(set (match_operand:<DOUBLEMASKMODE> 0 ("register_operand"))
12099         (ior:<DOUBLEMASKMODE> (ashift:<DOUBLEMASKMODE> (zero_extend:<DOUBLEMASKMODE> (match_operand:SWI24 2 ("register_operand")))
12100                            (match_dup 3))
12101                 (zero_extend:<DOUBLEMASKMODE> (match_operand:SWI24 1 ("register_operand")))))]
12102   "TARGET_AVX512BW"
12103 {
12104   operands[3] = GEN_INT (GET_MODE_BITSIZE (<MODE>mode));
12105 })
12106
12107 (define_insn "<sse2_avx2>_packsswb<mask_name>"
12108   [(set (match_operand:VI1_AVX512 0 "register_operand" "=x,x,v")
12109         (vec_concat:VI1_AVX512
12110           (ss_truncate:<ssehalfvecmode>
12111             (match_operand:<sseunpackmode> 1 "register_operand" "0,x,v"))
12112           (ss_truncate:<ssehalfvecmode>
12113             (match_operand:<sseunpackmode> 2 "vector_operand" "xBm,xm,vm"))))]
12114   "TARGET_SSE2 && <mask_mode512bit_condition> && <mask_avx512bw_condition>"
12115   "@
12116    packsswb\t{%2, %0|%0, %2}
12117    vpacksswb\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}
12118    vpacksswb\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12119   [(set_attr "isa" "noavx,avx,avx512bw")
12120    (set_attr "type" "sselog")
12121    (set_attr "prefix_data16" "1,*,*")
12122    (set_attr "prefix" "orig,<mask_prefix>,evex")
12123    (set_attr "mode" "<sseinsnmode>")])
12124
12125 (define_insn "<sse2_avx2>_packssdw<mask_name>"
12126   [(set (match_operand:VI2_AVX2 0 "register_operand" "=x,x,v")
12127         (vec_concat:VI2_AVX2
12128           (ss_truncate:<ssehalfvecmode>
12129             (match_operand:<sseunpackmode> 1 "register_operand" "0,x,v"))
12130           (ss_truncate:<ssehalfvecmode>
12131             (match_operand:<sseunpackmode> 2 "vector_operand" "xBm,xm,vm"))))]
12132   "TARGET_SSE2 && <mask_mode512bit_condition> && <mask_avx512bw_condition>"
12133   "@
12134    packssdw\t{%2, %0|%0, %2}
12135    vpackssdw\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}
12136    vpackssdw\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12137   [(set_attr "isa" "noavx,avx,avx512bw")
12138    (set_attr "type" "sselog")
12139    (set_attr "prefix_data16" "1,*,*")
12140    (set_attr "prefix" "orig,<mask_prefix>,evex")
12141    (set_attr "mode" "<sseinsnmode>")])
12142
12143 (define_insn "<sse2_avx2>_packuswb<mask_name>"
12144   [(set (match_operand:VI1_AVX512 0 "register_operand" "=x,x,v")
12145         (vec_concat:VI1_AVX512
12146           (us_truncate:<ssehalfvecmode>
12147             (match_operand:<sseunpackmode> 1 "register_operand" "0,x,v"))
12148           (us_truncate:<ssehalfvecmode>
12149             (match_operand:<sseunpackmode> 2 "vector_operand" "xBm,xm,vm"))))]
12150   "TARGET_SSE2 && <mask_mode512bit_condition> && <mask_avx512bw_condition>"
12151   "@
12152    packuswb\t{%2, %0|%0, %2}
12153    vpackuswb\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}
12154    vpackuswb\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12155   [(set_attr "isa" "noavx,avx,avx512bw")
12156    (set_attr "type" "sselog")
12157    (set_attr "prefix_data16" "1,*,*")
12158    (set_attr "prefix" "orig,<mask_prefix>,evex")
12159    (set_attr "mode" "<sseinsnmode>")])
12160
12161 (define_insn "avx512bw_interleave_highv64qi<mask_name>"
12162   [(set (match_operand:V64QI 0 "register_operand" "=v")
12163         (vec_select:V64QI
12164           (vec_concat:V128QI
12165             (match_operand:V64QI 1 "register_operand" "v")
12166             (match_operand:V64QI 2 "nonimmediate_operand" "vm"))
12167           (parallel [(const_int 8)  (const_int 72)
12168                      (const_int 9)  (const_int 73)
12169                      (const_int 10) (const_int 74)
12170                      (const_int 11) (const_int 75)
12171                      (const_int 12) (const_int 76)
12172                      (const_int 13) (const_int 77)
12173                      (const_int 14) (const_int 78)
12174                      (const_int 15) (const_int 79)
12175                      (const_int 24) (const_int 88)
12176                      (const_int 25) (const_int 89)
12177                      (const_int 26) (const_int 90)
12178                      (const_int 27) (const_int 91)
12179                      (const_int 28) (const_int 92)
12180                      (const_int 29) (const_int 93)
12181                      (const_int 30) (const_int 94)
12182                      (const_int 31) (const_int 95)
12183                      (const_int 40) (const_int 104)
12184                      (const_int 41) (const_int 105)
12185                      (const_int 42) (const_int 106)
12186                      (const_int 43) (const_int 107)
12187                      (const_int 44) (const_int 108)
12188                      (const_int 45) (const_int 109)
12189                      (const_int 46) (const_int 110)
12190                      (const_int 47) (const_int 111)
12191                      (const_int 56) (const_int 120)
12192                      (const_int 57) (const_int 121)
12193                      (const_int 58) (const_int 122)
12194                      (const_int 59) (const_int 123)
12195                      (const_int 60) (const_int 124)
12196                      (const_int 61) (const_int 125)
12197                      (const_int 62) (const_int 126)
12198                      (const_int 63) (const_int 127)])))]
12199   "TARGET_AVX512BW"
12200   "vpunpckhbw\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12201   [(set_attr "type" "sselog")
12202    (set_attr "prefix" "evex")
12203    (set_attr "mode" "XI")])
12204
12205 (define_insn "avx2_interleave_highv32qi<mask_name>"
12206   [(set (match_operand:V32QI 0 "register_operand" "=v")
12207         (vec_select:V32QI
12208           (vec_concat:V64QI
12209             (match_operand:V32QI 1 "register_operand" "v")
12210             (match_operand:V32QI 2 "nonimmediate_operand" "vm"))
12211           (parallel [(const_int 8)  (const_int 40)
12212                      (const_int 9)  (const_int 41)
12213                      (const_int 10) (const_int 42)
12214                      (const_int 11) (const_int 43)
12215                      (const_int 12) (const_int 44)
12216                      (const_int 13) (const_int 45)
12217                      (const_int 14) (const_int 46)
12218                      (const_int 15) (const_int 47)
12219                      (const_int 24) (const_int 56)
12220                      (const_int 25) (const_int 57)
12221                      (const_int 26) (const_int 58)
12222                      (const_int 27) (const_int 59)
12223                      (const_int 28) (const_int 60)
12224                      (const_int 29) (const_int 61)
12225                      (const_int 30) (const_int 62)
12226                      (const_int 31) (const_int 63)])))]
12227   "TARGET_AVX2 && <mask_avx512vl_condition>"
12228   "vpunpckhbw\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12229   [(set_attr "type" "sselog")
12230    (set_attr "prefix" "<mask_prefix>")
12231    (set_attr "mode" "OI")])
12232
12233 (define_insn "vec_interleave_highv16qi<mask_name>"
12234   [(set (match_operand:V16QI 0 "register_operand" "=x,v")
12235         (vec_select:V16QI
12236           (vec_concat:V32QI
12237             (match_operand:V16QI 1 "register_operand" "0,v")
12238             (match_operand:V16QI 2 "vector_operand" "xBm,vm"))
12239           (parallel [(const_int 8)  (const_int 24)
12240                      (const_int 9)  (const_int 25)
12241                      (const_int 10) (const_int 26)
12242                      (const_int 11) (const_int 27)
12243                      (const_int 12) (const_int 28)
12244                      (const_int 13) (const_int 29)
12245                      (const_int 14) (const_int 30)
12246                      (const_int 15) (const_int 31)])))]
12247   "TARGET_SSE2 && <mask_avx512vl_condition>"
12248   "@
12249    punpckhbw\t{%2, %0|%0, %2}
12250    vpunpckhbw\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12251   [(set_attr "isa" "noavx,avx")
12252    (set_attr "type" "sselog")
12253    (set_attr "prefix_data16" "1,*")
12254    (set_attr "prefix" "orig,<mask_prefix>")
12255    (set_attr "mode" "TI")])
12256
12257 (define_insn "avx512bw_interleave_lowv64qi<mask_name>"
12258   [(set (match_operand:V64QI 0 "register_operand" "=v")
12259         (vec_select:V64QI
12260           (vec_concat:V128QI
12261             (match_operand:V64QI 1 "register_operand" "v")
12262             (match_operand:V64QI 2 "nonimmediate_operand" "vm"))
12263           (parallel [(const_int 0) (const_int 64)
12264                      (const_int 1) (const_int 65)
12265                      (const_int 2) (const_int 66)
12266                      (const_int 3) (const_int 67)
12267                      (const_int 4) (const_int 68)
12268                      (const_int 5) (const_int 69)
12269                      (const_int 6) (const_int 70)
12270                      (const_int 7) (const_int 71)
12271                      (const_int 16) (const_int 80)
12272                      (const_int 17) (const_int 81)
12273                      (const_int 18) (const_int 82)
12274                      (const_int 19) (const_int 83)
12275                      (const_int 20) (const_int 84)
12276                      (const_int 21) (const_int 85)
12277                      (const_int 22) (const_int 86)
12278                      (const_int 23) (const_int 87)
12279                      (const_int 32) (const_int 96)
12280                      (const_int 33) (const_int 97)
12281                      (const_int 34) (const_int 98)
12282                      (const_int 35) (const_int 99)
12283                      (const_int 36) (const_int 100)
12284                      (const_int 37) (const_int 101)
12285                      (const_int 38) (const_int 102)
12286                      (const_int 39) (const_int 103)
12287                      (const_int 48) (const_int 112)
12288                      (const_int 49) (const_int 113)
12289                      (const_int 50) (const_int 114)
12290                      (const_int 51) (const_int 115)
12291                      (const_int 52) (const_int 116)
12292                      (const_int 53) (const_int 117)
12293                      (const_int 54) (const_int 118)
12294                      (const_int 55) (const_int 119)])))]
12295   "TARGET_AVX512BW"
12296   "vpunpcklbw\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12297   [(set_attr "type" "sselog")
12298    (set_attr "prefix" "evex")
12299    (set_attr "mode" "XI")])
12300
12301 (define_insn "avx2_interleave_lowv32qi<mask_name>"
12302   [(set (match_operand:V32QI 0 "register_operand" "=v")
12303         (vec_select:V32QI
12304           (vec_concat:V64QI
12305             (match_operand:V32QI 1 "register_operand" "v")
12306             (match_operand:V32QI 2 "nonimmediate_operand" "vm"))
12307           (parallel [(const_int 0) (const_int 32)
12308                      (const_int 1) (const_int 33)
12309                      (const_int 2) (const_int 34)
12310                      (const_int 3) (const_int 35)
12311                      (const_int 4) (const_int 36)
12312                      (const_int 5) (const_int 37)
12313                      (const_int 6) (const_int 38)
12314                      (const_int 7) (const_int 39)
12315                      (const_int 16) (const_int 48)
12316                      (const_int 17) (const_int 49)
12317                      (const_int 18) (const_int 50)
12318                      (const_int 19) (const_int 51)
12319                      (const_int 20) (const_int 52)
12320                      (const_int 21) (const_int 53)
12321                      (const_int 22) (const_int 54)
12322                      (const_int 23) (const_int 55)])))]
12323   "TARGET_AVX2 && <mask_avx512vl_condition> && <mask_avx512bw_condition>"
12324   "vpunpcklbw\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12325   [(set_attr "type" "sselog")
12326    (set_attr "prefix" "maybe_vex")
12327    (set_attr "mode" "OI")])
12328
12329 (define_insn "vec_interleave_lowv16qi<mask_name>"
12330   [(set (match_operand:V16QI 0 "register_operand" "=x,v")
12331         (vec_select:V16QI
12332           (vec_concat:V32QI
12333             (match_operand:V16QI 1 "register_operand" "0,v")
12334             (match_operand:V16QI 2 "vector_operand" "xBm,vm"))
12335           (parallel [(const_int 0) (const_int 16)
12336                      (const_int 1) (const_int 17)
12337                      (const_int 2) (const_int 18)
12338                      (const_int 3) (const_int 19)
12339                      (const_int 4) (const_int 20)
12340                      (const_int 5) (const_int 21)
12341                      (const_int 6) (const_int 22)
12342                      (const_int 7) (const_int 23)])))]
12343   "TARGET_SSE2 && <mask_avx512vl_condition> && <mask_avx512bw_condition>"
12344   "@
12345    punpcklbw\t{%2, %0|%0, %2}
12346    vpunpcklbw\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12347   [(set_attr "isa" "noavx,avx")
12348    (set_attr "type" "sselog")
12349    (set_attr "prefix_data16" "1,*")
12350    (set_attr "prefix" "orig,vex")
12351    (set_attr "mode" "TI")])
12352
12353 (define_insn "avx512bw_interleave_highv32hi<mask_name>"
12354   [(set (match_operand:V32HI 0 "register_operand" "=v")
12355         (vec_select:V32HI
12356           (vec_concat:V64HI
12357             (match_operand:V32HI 1 "register_operand" "v")
12358             (match_operand:V32HI 2 "nonimmediate_operand" "vm"))
12359           (parallel [(const_int 4) (const_int 36)
12360                      (const_int 5) (const_int 37)
12361                      (const_int 6) (const_int 38)
12362                      (const_int 7) (const_int 39)
12363                      (const_int 12) (const_int 44)
12364                      (const_int 13) (const_int 45)
12365                      (const_int 14) (const_int 46)
12366                      (const_int 15) (const_int 47)
12367                      (const_int 20) (const_int 52)
12368                      (const_int 21) (const_int 53)
12369                      (const_int 22) (const_int 54)
12370                      (const_int 23) (const_int 55)
12371                      (const_int 28) (const_int 60)
12372                      (const_int 29) (const_int 61)
12373                      (const_int 30) (const_int 62)
12374                      (const_int 31) (const_int 63)])))]
12375   "TARGET_AVX512BW"
12376   "vpunpckhwd\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12377   [(set_attr "type" "sselog")
12378    (set_attr "prefix" "evex")
12379    (set_attr "mode" "XI")])
12380
12381 (define_insn "avx2_interleave_highv16hi<mask_name>"
12382   [(set (match_operand:V16HI 0 "register_operand" "=v")
12383         (vec_select:V16HI
12384           (vec_concat:V32HI
12385             (match_operand:V16HI 1 "register_operand" "v")
12386             (match_operand:V16HI 2 "nonimmediate_operand" "vm"))
12387           (parallel [(const_int 4) (const_int 20)
12388                      (const_int 5) (const_int 21)
12389                      (const_int 6) (const_int 22)
12390                      (const_int 7) (const_int 23)
12391                      (const_int 12) (const_int 28)
12392                      (const_int 13) (const_int 29)
12393                      (const_int 14) (const_int 30)
12394                      (const_int 15) (const_int 31)])))]
12395   "TARGET_AVX2 && <mask_avx512vl_condition> && <mask_avx512bw_condition>"
12396   "vpunpckhwd\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12397   [(set_attr "type" "sselog")
12398    (set_attr "prefix" "maybe_evex")
12399    (set_attr "mode" "OI")])
12400
12401 (define_insn "vec_interleave_highv8hi<mask_name>"
12402   [(set (match_operand:V8HI 0 "register_operand" "=x,v")
12403         (vec_select:V8HI
12404           (vec_concat:V16HI
12405             (match_operand:V8HI 1 "register_operand" "0,v")
12406             (match_operand:V8HI 2 "vector_operand" "xBm,vm"))
12407           (parallel [(const_int 4) (const_int 12)
12408                      (const_int 5) (const_int 13)
12409                      (const_int 6) (const_int 14)
12410                      (const_int 7) (const_int 15)])))]
12411   "TARGET_SSE2 && <mask_avx512vl_condition> && <mask_avx512bw_condition>"
12412   "@
12413    punpckhwd\t{%2, %0|%0, %2}
12414    vpunpckhwd\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12415   [(set_attr "isa" "noavx,avx")
12416    (set_attr "type" "sselog")
12417    (set_attr "prefix_data16" "1,*")
12418    (set_attr "prefix" "orig,maybe_vex")
12419    (set_attr "mode" "TI")])
12420
12421 (define_insn "<mask_codefor>avx512bw_interleave_lowv32hi<mask_name>"
12422   [(set (match_operand:V32HI 0 "register_operand" "=v")
12423         (vec_select:V32HI
12424           (vec_concat:V64HI
12425             (match_operand:V32HI 1 "register_operand" "v")
12426             (match_operand:V32HI 2 "nonimmediate_operand" "vm"))
12427           (parallel [(const_int 0) (const_int 32)
12428                      (const_int 1) (const_int 33)
12429                      (const_int 2) (const_int 34)
12430                      (const_int 3) (const_int 35)
12431                      (const_int 8) (const_int 40)
12432                      (const_int 9) (const_int 41)
12433                      (const_int 10) (const_int 42)
12434                      (const_int 11) (const_int 43)
12435                      (const_int 16) (const_int 48)
12436                      (const_int 17) (const_int 49)
12437                      (const_int 18) (const_int 50)
12438                      (const_int 19) (const_int 51)
12439                      (const_int 24) (const_int 56)
12440                      (const_int 25) (const_int 57)
12441                      (const_int 26) (const_int 58)
12442                      (const_int 27) (const_int 59)])))]
12443   "TARGET_AVX512BW"
12444   "vpunpcklwd\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12445   [(set_attr "type" "sselog")
12446    (set_attr "prefix" "evex")
12447    (set_attr "mode" "XI")])
12448
12449 (define_insn "avx2_interleave_lowv16hi<mask_name>"
12450   [(set (match_operand:V16HI 0 "register_operand" "=v")
12451         (vec_select:V16HI
12452           (vec_concat:V32HI
12453             (match_operand:V16HI 1 "register_operand" "v")
12454             (match_operand:V16HI 2 "nonimmediate_operand" "vm"))
12455           (parallel [(const_int 0) (const_int 16)
12456                      (const_int 1) (const_int 17)
12457                      (const_int 2) (const_int 18)
12458                      (const_int 3) (const_int 19)
12459                      (const_int 8) (const_int 24)
12460                      (const_int 9) (const_int 25)
12461                      (const_int 10) (const_int 26)
12462                      (const_int 11) (const_int 27)])))]
12463   "TARGET_AVX2 && <mask_avx512vl_condition> && <mask_avx512bw_condition>"
12464   "vpunpcklwd\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12465   [(set_attr "type" "sselog")
12466    (set_attr "prefix" "maybe_evex")
12467    (set_attr "mode" "OI")])
12468
12469 (define_insn "vec_interleave_lowv8hi<mask_name>"
12470   [(set (match_operand:V8HI 0 "register_operand" "=x,v")
12471         (vec_select:V8HI
12472           (vec_concat:V16HI
12473             (match_operand:V8HI 1 "register_operand" "0,v")
12474             (match_operand:V8HI 2 "vector_operand" "xBm,vm"))
12475           (parallel [(const_int 0) (const_int 8)
12476                      (const_int 1) (const_int 9)
12477                      (const_int 2) (const_int 10)
12478                      (const_int 3) (const_int 11)])))]
12479   "TARGET_SSE2 && <mask_avx512vl_condition> && <mask_avx512bw_condition>"
12480   "@
12481    punpcklwd\t{%2, %0|%0, %2}
12482    vpunpcklwd\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12483   [(set_attr "isa" "noavx,avx")
12484    (set_attr "type" "sselog")
12485    (set_attr "prefix_data16" "1,*")
12486    (set_attr "prefix" "orig,maybe_evex")
12487    (set_attr "mode" "TI")])
12488
12489 (define_insn "avx2_interleave_highv8si<mask_name>"
12490   [(set (match_operand:V8SI 0 "register_operand" "=v")
12491         (vec_select:V8SI
12492           (vec_concat:V16SI
12493             (match_operand:V8SI 1 "register_operand" "v")
12494             (match_operand:V8SI 2 "nonimmediate_operand" "vm"))
12495           (parallel [(const_int 2) (const_int 10)
12496                      (const_int 3) (const_int 11)
12497                      (const_int 6) (const_int 14)
12498                      (const_int 7) (const_int 15)])))]
12499   "TARGET_AVX2 && <mask_avx512vl_condition>"
12500   "vpunpckhdq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12501   [(set_attr "type" "sselog")
12502    (set_attr "prefix" "maybe_evex")
12503    (set_attr "mode" "OI")])
12504
12505 (define_insn "<mask_codefor>avx512f_interleave_highv16si<mask_name>"
12506   [(set (match_operand:V16SI 0 "register_operand" "=v")
12507         (vec_select:V16SI
12508           (vec_concat:V32SI
12509             (match_operand:V16SI 1 "register_operand" "v")
12510             (match_operand:V16SI 2 "nonimmediate_operand" "vm"))
12511           (parallel [(const_int 2) (const_int 18)
12512                      (const_int 3) (const_int 19)
12513                      (const_int 6) (const_int 22)
12514                      (const_int 7) (const_int 23)
12515                      (const_int 10) (const_int 26)
12516                      (const_int 11) (const_int 27)
12517                      (const_int 14) (const_int 30)
12518                      (const_int 15) (const_int 31)])))]
12519   "TARGET_AVX512F"
12520   "vpunpckhdq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12521   [(set_attr "type" "sselog")
12522    (set_attr "prefix" "evex")
12523    (set_attr "mode" "XI")])
12524
12525
12526 (define_insn "vec_interleave_highv4si<mask_name>"
12527   [(set (match_operand:V4SI 0 "register_operand" "=x,v")
12528         (vec_select:V4SI
12529           (vec_concat:V8SI
12530             (match_operand:V4SI 1 "register_operand" "0,v")
12531             (match_operand:V4SI 2 "vector_operand" "xBm,vm"))
12532           (parallel [(const_int 2) (const_int 6)
12533                      (const_int 3) (const_int 7)])))]
12534   "TARGET_SSE2 && <mask_avx512vl_condition>"
12535   "@
12536    punpckhdq\t{%2, %0|%0, %2}
12537    vpunpckhdq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12538   [(set_attr "isa" "noavx,avx")
12539    (set_attr "type" "sselog")
12540    (set_attr "prefix_data16" "1,*")
12541    (set_attr "prefix" "orig,maybe_vex")
12542    (set_attr "mode" "TI")])
12543
12544 (define_insn "avx2_interleave_lowv8si<mask_name>"
12545   [(set (match_operand:V8SI 0 "register_operand" "=v")
12546         (vec_select:V8SI
12547           (vec_concat:V16SI
12548             (match_operand:V8SI 1 "register_operand" "v")
12549             (match_operand:V8SI 2 "nonimmediate_operand" "vm"))
12550           (parallel [(const_int 0) (const_int 8)
12551                      (const_int 1) (const_int 9)
12552                      (const_int 4) (const_int 12)
12553                      (const_int 5) (const_int 13)])))]
12554   "TARGET_AVX2 && <mask_avx512vl_condition>"
12555   "vpunpckldq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12556   [(set_attr "type" "sselog")
12557    (set_attr "prefix" "maybe_evex")
12558    (set_attr "mode" "OI")])
12559
12560 (define_insn "<mask_codefor>avx512f_interleave_lowv16si<mask_name>"
12561   [(set (match_operand:V16SI 0 "register_operand" "=v")
12562         (vec_select:V16SI
12563           (vec_concat:V32SI
12564             (match_operand:V16SI 1 "register_operand" "v")
12565             (match_operand:V16SI 2 "nonimmediate_operand" "vm"))
12566           (parallel [(const_int 0) (const_int 16)
12567                      (const_int 1) (const_int 17)
12568                      (const_int 4) (const_int 20)
12569                      (const_int 5) (const_int 21)
12570                      (const_int 8) (const_int 24)
12571                      (const_int 9) (const_int 25)
12572                      (const_int 12) (const_int 28)
12573                      (const_int 13) (const_int 29)])))]
12574   "TARGET_AVX512F"
12575   "vpunpckldq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12576   [(set_attr "type" "sselog")
12577    (set_attr "prefix" "evex")
12578    (set_attr "mode" "XI")])
12579
12580 (define_insn "vec_interleave_lowv4si<mask_name>"
12581   [(set (match_operand:V4SI 0 "register_operand" "=x,v")
12582         (vec_select:V4SI
12583           (vec_concat:V8SI
12584             (match_operand:V4SI 1 "register_operand" "0,v")
12585             (match_operand:V4SI 2 "vector_operand" "xBm,vm"))
12586           (parallel [(const_int 0) (const_int 4)
12587                      (const_int 1) (const_int 5)])))]
12588   "TARGET_SSE2 && <mask_avx512vl_condition>"
12589   "@
12590    punpckldq\t{%2, %0|%0, %2}
12591    vpunpckldq\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
12592   [(set_attr "isa" "noavx,avx")
12593    (set_attr "type" "sselog")
12594    (set_attr "prefix_data16" "1,*")
12595    (set_attr "prefix" "orig,vex")
12596    (set_attr "mode" "TI")])
12597
12598 (define_expand "vec_interleave_high<mode>"
12599   [(match_operand:VI_256 0 "register_operand")
12600    (match_operand:VI_256 1 "register_operand")
12601    (match_operand:VI_256 2 "nonimmediate_operand")]
12602  "TARGET_AVX2"
12603 {
12604   rtx t1 = gen_reg_rtx (<MODE>mode);
12605   rtx t2 = gen_reg_rtx (<MODE>mode);
12606   rtx t3 = gen_reg_rtx (V4DImode);
12607   emit_insn (gen_avx2_interleave_low<mode> (t1, operands[1], operands[2]));
12608   emit_insn (gen_avx2_interleave_high<mode> (t2,  operands[1], operands[2]));
12609   emit_insn (gen_avx2_permv2ti (t3, gen_lowpart (V4DImode, t1),
12610                                 gen_lowpart (V4DImode, t2),
12611                                 GEN_INT (1 + (3 << 4))));
12612   emit_move_insn (operands[0], gen_lowpart (<MODE>mode, t3));
12613   DONE;
12614 })
12615
12616 (define_expand "vec_interleave_low<mode>"
12617   [(match_operand:VI_256 0 "register_operand")
12618    (match_operand:VI_256 1 "register_operand")
12619    (match_operand:VI_256 2 "nonimmediate_operand")]
12620  "TARGET_AVX2"
12621 {
12622   rtx t1 = gen_reg_rtx (<MODE>mode);
12623   rtx t2 = gen_reg_rtx (<MODE>mode);
12624   rtx t3 = gen_reg_rtx (V4DImode);
12625   emit_insn (gen_avx2_interleave_low<mode> (t1, operands[1], operands[2]));
12626   emit_insn (gen_avx2_interleave_high<mode> (t2, operands[1], operands[2]));
12627   emit_insn (gen_avx2_permv2ti (t3, gen_lowpart (V4DImode, t1),
12628                                 gen_lowpart (V4DImode, t2),
12629                                 GEN_INT (0 + (2 << 4))));
12630   emit_move_insn (operands[0], gen_lowpart (<MODE>mode, t3));
12631   DONE;
12632 })
12633
12634 ;; Modes handled by pinsr patterns.
12635 (define_mode_iterator PINSR_MODE
12636   [(V16QI "TARGET_SSE4_1") V8HI
12637    (V4SI "TARGET_SSE4_1")
12638    (V2DI "TARGET_SSE4_1 && TARGET_64BIT")])
12639
12640 (define_mode_attr sse2p4_1
12641   [(V16QI "sse4_1") (V8HI "sse2")
12642    (V4SI "sse4_1") (V2DI "sse4_1")])
12643
12644 (define_mode_attr pinsr_evex_isa
12645   [(V16QI "avx512bw") (V8HI "avx512bw")
12646    (V4SI "avx512dq") (V2DI "avx512dq")])
12647
12648 ;; sse4_1_pinsrd must come before sse2_loadld since it is preferred.
12649 (define_insn "<sse2p4_1>_pinsr<ssemodesuffix>"
12650   [(set (match_operand:PINSR_MODE 0 "register_operand" "=x,x,x,x,v,v")
12651         (vec_merge:PINSR_MODE
12652           (vec_duplicate:PINSR_MODE
12653             (match_operand:<ssescalarmode> 2 "nonimmediate_operand" "r,m,r,m,r,m"))
12654           (match_operand:PINSR_MODE 1 "register_operand" "0,0,x,x,v,v")
12655           (match_operand:SI 3 "const_int_operand")))]
12656   "TARGET_SSE2
12657    && ((unsigned) exact_log2 (INTVAL (operands[3]))
12658        < GET_MODE_NUNITS (<MODE>mode))"
12659 {
12660   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
12661
12662   switch (which_alternative)
12663     {
12664     case 0:
12665       if (GET_MODE_SIZE (<ssescalarmode>mode) < GET_MODE_SIZE (SImode))
12666         return "pinsr<ssemodesuffix>\t{%3, %k2, %0|%0, %k2, %3}";
12667       /* FALLTHRU */
12668     case 1:
12669       return "pinsr<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}";
12670     case 2:
12671     case 4:
12672       if (GET_MODE_SIZE (<ssescalarmode>mode) < GET_MODE_SIZE (SImode))
12673         return "vpinsr<ssemodesuffix>\t{%3, %k2, %1, %0|%0, %1, %k2, %3}";
12674       /* FALLTHRU */
12675     case 3:
12676     case 5:
12677       return "vpinsr<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}";
12678     default:
12679       gcc_unreachable ();
12680     }
12681 }
12682   [(set_attr "isa" "noavx,noavx,avx,avx,<pinsr_evex_isa>,<pinsr_evex_isa>")
12683    (set_attr "type" "sselog")
12684    (set (attr "prefix_rex")
12685      (if_then_else
12686        (and (not (match_test "TARGET_AVX"))
12687             (eq (const_string "<MODE>mode") (const_string "V2DImode")))
12688        (const_string "1")
12689        (const_string "*")))
12690    (set (attr "prefix_data16")
12691      (if_then_else
12692        (and (not (match_test "TARGET_AVX"))
12693             (eq (const_string "<MODE>mode") (const_string "V8HImode")))
12694        (const_string "1")
12695        (const_string "*")))
12696    (set (attr "prefix_extra")
12697      (if_then_else
12698        (and (not (match_test "TARGET_AVX"))
12699             (eq (const_string "<MODE>mode") (const_string "V8HImode")))
12700        (const_string "*")
12701        (const_string "1")))
12702    (set_attr "length_immediate" "1")
12703    (set_attr "prefix" "orig,orig,vex,vex,evex,evex")
12704    (set_attr "mode" "TI")])
12705
12706 (define_expand "<extract_type>_vinsert<shuffletype><extract_suf>_mask"
12707   [(match_operand:AVX512_VEC 0 "register_operand")
12708    (match_operand:AVX512_VEC 1 "register_operand")
12709    (match_operand:<ssequartermode> 2 "nonimmediate_operand")
12710    (match_operand:SI 3 "const_0_to_3_operand")
12711    (match_operand:AVX512_VEC 4 "register_operand")
12712    (match_operand:<avx512fmaskmode> 5 "register_operand")]
12713   "TARGET_AVX512F"
12714 {
12715   int mask, selector;
12716   mask = INTVAL (operands[3]);
12717   selector = (GET_MODE_UNIT_SIZE (<MODE>mode) == 4
12718               ? 0xFFFF ^ (0x000F << mask * 4)
12719               : 0xFF ^ (0x03 << mask * 2));
12720   emit_insn (gen_<extract_type>_vinsert<shuffletype><extract_suf>_1_mask
12721     (operands[0], operands[1], operands[2], GEN_INT (selector),
12722      operands[4], operands[5]));
12723   DONE;
12724 })
12725
12726 (define_insn "<mask_codefor><extract_type>_vinsert<shuffletype><extract_suf>_1<mask_name>"
12727   [(set (match_operand:AVX512_VEC 0 "register_operand" "=v")
12728         (vec_merge:AVX512_VEC
12729           (match_operand:AVX512_VEC 1 "register_operand" "v")
12730           (vec_duplicate:AVX512_VEC
12731                 (match_operand:<ssequartermode> 2 "nonimmediate_operand" "vm"))
12732           (match_operand:SI 3 "const_int_operand" "n")))]
12733   "TARGET_AVX512F"
12734 {
12735   int mask;
12736   int selector = INTVAL (operands[3]);
12737
12738   if (selector == (GET_MODE_UNIT_SIZE (<MODE>mode) == 4 ? 0xFFF0 : 0xFC))
12739     mask = 0;
12740   else if (selector == (GET_MODE_UNIT_SIZE (<MODE>mode) == 4 ? 0xFF0F : 0xF3))
12741     mask = 1;
12742   else if (selector == (GET_MODE_UNIT_SIZE (<MODE>mode) == 4 ? 0xF0FF : 0xCF))
12743     mask = 2;
12744   else if (selector == (GET_MODE_UNIT_SIZE (<MODE>mode) == 4 ? 0x0FFF : 0x3F))
12745     mask = 3;
12746   else
12747     gcc_unreachable ();
12748
12749   operands[3] = GEN_INT (mask);
12750
12751   return "vinsert<shuffletype><extract_suf>\t{%3, %2, %1, %0<mask_operand4>|%0<mask_operand4>, %1, %2, %3}";
12752 }
12753   [(set_attr "type" "sselog")
12754    (set_attr "length_immediate" "1")
12755    (set_attr "prefix" "evex")
12756    (set_attr "mode" "<sseinsnmode>")])
12757
12758 (define_expand "<extract_type_2>_vinsert<shuffletype><extract_suf_2>_mask"
12759   [(match_operand:AVX512_VEC_2 0 "register_operand")
12760    (match_operand:AVX512_VEC_2 1 "register_operand")
12761    (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand")
12762    (match_operand:SI 3 "const_0_to_1_operand")
12763    (match_operand:AVX512_VEC_2 4 "register_operand")
12764    (match_operand:<avx512fmaskmode> 5 "register_operand")]
12765   "TARGET_AVX512F"
12766 {
12767   int mask = INTVAL (operands[3]);
12768   if (mask == 0)
12769     emit_insn (gen_vec_set_lo_<mode>_mask (operands[0], operands[1],
12770                                            operands[2], operands[4],
12771                                            operands[5]));
12772   else
12773     emit_insn (gen_vec_set_hi_<mode>_mask (operands[0], operands[1],
12774                                            operands[2], operands[4],
12775                                            operands[5]));
12776   DONE;
12777 })
12778
12779 (define_insn "vec_set_lo_<mode><mask_name>"
12780   [(set (match_operand:V16FI 0 "register_operand" "=v")
12781         (vec_concat:V16FI
12782           (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "vm")
12783           (vec_select:<ssehalfvecmode>
12784             (match_operand:V16FI 1 "register_operand" "v")
12785             (parallel [(const_int 8) (const_int 9)
12786                        (const_int 10) (const_int 11)
12787                        (const_int 12) (const_int 13)
12788                        (const_int 14) (const_int 15)]))))]
12789   "TARGET_AVX512DQ"
12790   "vinsert<shuffletype>32x8\t{$0x0, %2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2, 0x0}"
12791   [(set_attr "type" "sselog")
12792    (set_attr "length_immediate" "1")
12793    (set_attr "prefix" "evex")
12794    (set_attr "mode" "<sseinsnmode>")])
12795
12796 (define_insn "vec_set_hi_<mode><mask_name>"
12797   [(set (match_operand:V16FI 0 "register_operand" "=v")
12798         (vec_concat:V16FI
12799           (vec_select:<ssehalfvecmode>
12800             (match_operand:V16FI 1 "register_operand" "v")
12801             (parallel [(const_int 0) (const_int 1)
12802                        (const_int 2) (const_int 3)
12803                        (const_int 4) (const_int 5)
12804                        (const_int 6) (const_int 7)]))
12805           (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "vm")))]
12806   "TARGET_AVX512DQ"
12807   "vinsert<shuffletype>32x8\t{$0x1, %2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2, 0x1}"
12808   [(set_attr "type" "sselog")
12809    (set_attr "length_immediate" "1")
12810    (set_attr "prefix" "evex")
12811    (set_attr "mode" "<sseinsnmode>")])
12812
12813 (define_insn "vec_set_lo_<mode><mask_name>"
12814   [(set (match_operand:V8FI 0 "register_operand" "=v")
12815         (vec_concat:V8FI
12816           (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "vm")
12817           (vec_select:<ssehalfvecmode>
12818             (match_operand:V8FI 1 "register_operand" "v")
12819             (parallel [(const_int 4) (const_int 5)
12820                        (const_int 6) (const_int 7)]))))]
12821   "TARGET_AVX512F"
12822   "vinsert<shuffletype>64x4\t{$0x0, %2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2, 0x0}"
12823   [(set_attr "type" "sselog")
12824    (set_attr "length_immediate" "1")
12825    (set_attr "prefix" "evex")
12826    (set_attr "mode" "XI")])
12827
12828 (define_insn "vec_set_hi_<mode><mask_name>"
12829   [(set (match_operand:V8FI 0 "register_operand" "=v")
12830         (vec_concat:V8FI
12831           (vec_select:<ssehalfvecmode>
12832             (match_operand:V8FI 1 "register_operand" "v")
12833             (parallel [(const_int 0) (const_int 1)
12834                        (const_int 2) (const_int 3)]))
12835           (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "vm")))]
12836   "TARGET_AVX512F"
12837   "vinsert<shuffletype>64x4\t{$0x1, %2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2, 0x1}"
12838   [(set_attr "type" "sselog")
12839    (set_attr "length_immediate" "1")
12840    (set_attr "prefix" "evex")
12841    (set_attr "mode" "XI")])
12842
12843 (define_expand "avx512dq_shuf_<shuffletype>64x2_mask"
12844   [(match_operand:VI8F_256 0 "register_operand")
12845    (match_operand:VI8F_256 1 "register_operand")
12846    (match_operand:VI8F_256 2 "nonimmediate_operand")
12847    (match_operand:SI 3 "const_0_to_3_operand")
12848    (match_operand:VI8F_256 4 "register_operand")
12849    (match_operand:QI 5 "register_operand")]
12850   "TARGET_AVX512DQ"
12851 {
12852   int mask = INTVAL (operands[3]);
12853   emit_insn (gen_avx512dq_shuf_<shuffletype>64x2_1_mask
12854       (operands[0], operands[1], operands[2],
12855        GEN_INT (((mask >> 0) & 1) * 2 + 0),
12856        GEN_INT (((mask >> 0) & 1) * 2 + 1),
12857        GEN_INT (((mask >> 1) & 1) * 2 + 4),
12858        GEN_INT (((mask >> 1) & 1) * 2 + 5),
12859        operands[4], operands[5]));
12860   DONE;
12861 })
12862
12863 (define_insn "<mask_codefor>avx512dq_shuf_<shuffletype>64x2_1<mask_name>"
12864   [(set (match_operand:VI8F_256 0 "register_operand" "=v")
12865         (vec_select:VI8F_256
12866           (vec_concat:<ssedoublemode>
12867             (match_operand:VI8F_256 1 "register_operand" "v")
12868             (match_operand:VI8F_256 2 "nonimmediate_operand" "vm"))
12869           (parallel [(match_operand 3 "const_0_to_3_operand")
12870                      (match_operand 4 "const_0_to_3_operand")
12871                      (match_operand 5 "const_4_to_7_operand")
12872                      (match_operand 6 "const_4_to_7_operand")])))]
12873   "TARGET_AVX512VL
12874    && (INTVAL (operands[3]) & 1) == 0
12875    && INTVAL (operands[3]) == INTVAL (operands[4]) - 1
12876    && (INTVAL (operands[5]) & 1) == 0
12877    && INTVAL (operands[5]) == INTVAL (operands[6]) - 1"
12878 {
12879   int mask;
12880   mask = INTVAL (operands[3]) / 2;
12881   mask |= (INTVAL (operands[5]) - 4) / 2 << 1;
12882   operands[3] = GEN_INT (mask);
12883   return "vshuf<shuffletype>64x2\t{%3, %2, %1, %0<mask_operand7>|%0<mask_operand7>, %1, %2, %3}";
12884 }
12885   [(set_attr "type" "sselog")
12886    (set_attr "length_immediate" "1")
12887    (set_attr "prefix" "evex")
12888    (set_attr "mode" "XI")])
12889
12890 (define_expand "avx512f_shuf_<shuffletype>64x2_mask"
12891   [(match_operand:V8FI 0 "register_operand")
12892    (match_operand:V8FI 1 "register_operand")
12893    (match_operand:V8FI 2 "nonimmediate_operand")
12894    (match_operand:SI 3 "const_0_to_255_operand")
12895    (match_operand:V8FI 4 "register_operand")
12896    (match_operand:QI 5 "register_operand")]
12897   "TARGET_AVX512F"
12898 {
12899   int mask = INTVAL (operands[3]);
12900   emit_insn (gen_avx512f_shuf_<shuffletype>64x2_1_mask
12901       (operands[0], operands[1], operands[2],
12902        GEN_INT (((mask >> 0) & 3) * 2),
12903        GEN_INT (((mask >> 0) & 3) * 2 + 1),
12904        GEN_INT (((mask >> 2) & 3) * 2),
12905        GEN_INT (((mask >> 2) & 3) * 2 + 1),
12906        GEN_INT (((mask >> 4) & 3) * 2 + 8),
12907        GEN_INT (((mask >> 4) & 3) * 2 + 9),
12908        GEN_INT (((mask >> 6) & 3) * 2 + 8),
12909        GEN_INT (((mask >> 6) & 3) * 2 + 9),
12910        operands[4], operands[5]));
12911   DONE;
12912 })
12913
12914 (define_insn "avx512f_shuf_<shuffletype>64x2_1<mask_name>"
12915   [(set (match_operand:V8FI 0 "register_operand" "=v")
12916         (vec_select:V8FI
12917           (vec_concat:<ssedoublemode>
12918             (match_operand:V8FI 1 "register_operand" "v")
12919             (match_operand:V8FI 2 "nonimmediate_operand" "vm"))
12920           (parallel [(match_operand 3 "const_0_to_7_operand")
12921                      (match_operand 4 "const_0_to_7_operand")
12922                      (match_operand 5 "const_0_to_7_operand")
12923                      (match_operand 6 "const_0_to_7_operand")
12924                      (match_operand 7 "const_8_to_15_operand")
12925                      (match_operand 8 "const_8_to_15_operand")
12926                      (match_operand 9 "const_8_to_15_operand")
12927                      (match_operand 10 "const_8_to_15_operand")])))]
12928   "TARGET_AVX512F
12929    && (INTVAL (operands[3]) & 1) == 0
12930    && INTVAL (operands[3]) == INTVAL (operands[4]) - 1
12931    && (INTVAL (operands[5]) & 1) == 0
12932    && INTVAL (operands[5]) == INTVAL (operands[6]) - 1
12933    && (INTVAL (operands[7]) & 1) == 0
12934    && INTVAL (operands[7]) == INTVAL (operands[8]) - 1
12935    && (INTVAL (operands[9]) & 1) == 0
12936    && INTVAL (operands[9]) == INTVAL (operands[10]) - 1"
12937 {
12938   int mask;
12939   mask = INTVAL (operands[3]) / 2;
12940   mask |= INTVAL (operands[5]) / 2 << 2;
12941   mask |= (INTVAL (operands[7]) - 8) / 2 << 4;
12942   mask |= (INTVAL (operands[9]) - 8) / 2 << 6;
12943   operands[3] = GEN_INT (mask);
12944
12945   return "vshuf<shuffletype>64x2\t{%3, %2, %1, %0<mask_operand11>|%0<mask_operand11>, %1, %2, %3}";
12946 }
12947   [(set_attr "type" "sselog")
12948    (set_attr "length_immediate" "1")
12949    (set_attr "prefix" "evex")
12950    (set_attr "mode" "<sseinsnmode>")])
12951
12952 (define_expand "avx512vl_shuf_<shuffletype>32x4_mask"
12953   [(match_operand:VI4F_256 0 "register_operand")
12954    (match_operand:VI4F_256 1 "register_operand")
12955    (match_operand:VI4F_256 2 "nonimmediate_operand")
12956    (match_operand:SI 3 "const_0_to_3_operand")
12957    (match_operand:VI4F_256 4 "register_operand")
12958    (match_operand:QI 5 "register_operand")]
12959   "TARGET_AVX512VL"
12960 {
12961   int mask = INTVAL (operands[3]);
12962   emit_insn (gen_avx512vl_shuf_<shuffletype>32x4_1_mask
12963       (operands[0], operands[1], operands[2],
12964        GEN_INT (((mask >> 0) & 1) * 4 + 0),
12965        GEN_INT (((mask >> 0) & 1) * 4 + 1),
12966        GEN_INT (((mask >> 0) & 1) * 4 + 2),
12967        GEN_INT (((mask >> 0) & 1) * 4 + 3),
12968        GEN_INT (((mask >> 1) & 1) * 4 + 8),
12969        GEN_INT (((mask >> 1) & 1) * 4 + 9),
12970        GEN_INT (((mask >> 1) & 1) * 4 + 10),
12971        GEN_INT (((mask >> 1) & 1) * 4 + 11),
12972        operands[4], operands[5]));
12973   DONE;
12974 })
12975
12976 (define_insn "avx512vl_shuf_<shuffletype>32x4_1<mask_name>"
12977   [(set (match_operand:VI4F_256 0 "register_operand" "=v")
12978         (vec_select:VI4F_256
12979           (vec_concat:<ssedoublemode>
12980             (match_operand:VI4F_256 1 "register_operand" "v")
12981             (match_operand:VI4F_256 2 "nonimmediate_operand" "vm"))
12982           (parallel [(match_operand 3 "const_0_to_7_operand")
12983                      (match_operand 4 "const_0_to_7_operand")
12984                      (match_operand 5 "const_0_to_7_operand")
12985                      (match_operand 6 "const_0_to_7_operand")
12986                      (match_operand 7 "const_8_to_15_operand")
12987                      (match_operand 8 "const_8_to_15_operand")
12988                      (match_operand 9 "const_8_to_15_operand")
12989                      (match_operand 10 "const_8_to_15_operand")])))]
12990   "TARGET_AVX512VL
12991    && (INTVAL (operands[3]) & 3) == 0
12992    && INTVAL (operands[3]) == INTVAL (operands[4]) - 1
12993    && INTVAL (operands[3]) == INTVAL (operands[5]) - 2
12994    && INTVAL (operands[3]) == INTVAL (operands[6]) - 3
12995    && (INTVAL (operands[7]) & 3) == 0
12996    && INTVAL (operands[7]) == INTVAL (operands[8]) - 1
12997    && INTVAL (operands[7]) == INTVAL (operands[9]) - 2
12998    && INTVAL (operands[7]) == INTVAL (operands[10]) - 3"
12999 {
13000   int mask;
13001   mask = INTVAL (operands[3]) / 4;
13002   mask |= (INTVAL (operands[7]) - 8) / 4 << 1;
13003   operands[3] = GEN_INT (mask);
13004
13005   return "vshuf<shuffletype>32x4\t{%3, %2, %1, %0<mask_operand11>|%0<mask_operand11>, %1, %2, %3}";
13006 }
13007   [(set_attr "type" "sselog")
13008    (set_attr "length_immediate" "1")
13009    (set_attr "prefix" "evex")
13010    (set_attr "mode" "<sseinsnmode>")])
13011
13012 (define_expand "avx512f_shuf_<shuffletype>32x4_mask"
13013   [(match_operand:V16FI 0 "register_operand")
13014    (match_operand:V16FI 1 "register_operand")
13015    (match_operand:V16FI 2 "nonimmediate_operand")
13016    (match_operand:SI 3 "const_0_to_255_operand")
13017    (match_operand:V16FI 4 "register_operand")
13018    (match_operand:HI 5 "register_operand")]
13019   "TARGET_AVX512F"
13020 {
13021   int mask = INTVAL (operands[3]);
13022   emit_insn (gen_avx512f_shuf_<shuffletype>32x4_1_mask
13023       (operands[0], operands[1], operands[2],
13024        GEN_INT (((mask >> 0) & 3) * 4),
13025        GEN_INT (((mask >> 0) & 3) * 4 + 1),
13026        GEN_INT (((mask >> 0) & 3) * 4 + 2),
13027        GEN_INT (((mask >> 0) & 3) * 4 + 3),
13028        GEN_INT (((mask >> 2) & 3) * 4),
13029        GEN_INT (((mask >> 2) & 3) * 4 + 1),
13030        GEN_INT (((mask >> 2) & 3) * 4 + 2),
13031        GEN_INT (((mask >> 2) & 3) * 4 + 3),
13032        GEN_INT (((mask >> 4) & 3) * 4 + 16),
13033        GEN_INT (((mask >> 4) & 3) * 4 + 17),
13034        GEN_INT (((mask >> 4) & 3) * 4 + 18),
13035        GEN_INT (((mask >> 4) & 3) * 4 + 19),
13036        GEN_INT (((mask >> 6) & 3) * 4 + 16),
13037        GEN_INT (((mask >> 6) & 3) * 4 + 17),
13038        GEN_INT (((mask >> 6) & 3) * 4 + 18),
13039        GEN_INT (((mask >> 6) & 3) * 4 + 19),
13040        operands[4], operands[5]));
13041   DONE;
13042 })
13043
13044 (define_insn "avx512f_shuf_<shuffletype>32x4_1<mask_name>"
13045   [(set (match_operand:V16FI 0 "register_operand" "=v")
13046         (vec_select:V16FI
13047           (vec_concat:<ssedoublemode>
13048             (match_operand:V16FI 1 "register_operand" "v")
13049             (match_operand:V16FI 2 "nonimmediate_operand" "vm"))
13050           (parallel [(match_operand 3 "const_0_to_15_operand")
13051                      (match_operand 4 "const_0_to_15_operand")
13052                      (match_operand 5 "const_0_to_15_operand")
13053                      (match_operand 6 "const_0_to_15_operand")
13054                      (match_operand 7 "const_0_to_15_operand")
13055                      (match_operand 8 "const_0_to_15_operand")
13056                      (match_operand 9 "const_0_to_15_operand")
13057                      (match_operand 10 "const_0_to_15_operand")
13058                      (match_operand 11 "const_16_to_31_operand")
13059                      (match_operand 12 "const_16_to_31_operand")
13060                      (match_operand 13 "const_16_to_31_operand")
13061                      (match_operand 14 "const_16_to_31_operand")
13062                      (match_operand 15 "const_16_to_31_operand")
13063                      (match_operand 16 "const_16_to_31_operand")
13064                      (match_operand 17 "const_16_to_31_operand")
13065                      (match_operand 18 "const_16_to_31_operand")])))]
13066   "TARGET_AVX512F
13067    && (INTVAL (operands[3]) & 3) == 0
13068    && INTVAL (operands[3]) == INTVAL (operands[4]) - 1
13069    && INTVAL (operands[3]) == INTVAL (operands[5]) - 2
13070    && INTVAL (operands[3]) == INTVAL (operands[6]) - 3
13071    && (INTVAL (operands[7]) & 3) == 0
13072    && INTVAL (operands[7]) == INTVAL (operands[8]) - 1
13073    && INTVAL (operands[7]) == INTVAL (operands[9]) - 2
13074    && INTVAL (operands[7]) == INTVAL (operands[10]) - 3
13075    && (INTVAL (operands[11]) & 3) == 0
13076    && INTVAL (operands[11]) == INTVAL (operands[12]) - 1
13077    && INTVAL (operands[11]) == INTVAL (operands[13]) - 2
13078    && INTVAL (operands[11]) == INTVAL (operands[14]) - 3
13079    && (INTVAL (operands[15]) & 3) == 0
13080    && INTVAL (operands[15]) == INTVAL (operands[16]) - 1
13081    && INTVAL (operands[15]) == INTVAL (operands[17]) - 2
13082    && INTVAL (operands[15]) == INTVAL (operands[18]) - 3"
13083 {
13084   int mask;
13085   mask = INTVAL (operands[3]) / 4;
13086   mask |= INTVAL (operands[7]) / 4 << 2;
13087   mask |= (INTVAL (operands[11]) - 16) / 4 << 4;
13088   mask |= (INTVAL (operands[15]) - 16) / 4 << 6;
13089   operands[3] = GEN_INT (mask);
13090
13091   return "vshuf<shuffletype>32x4\t{%3, %2, %1, %0<mask_operand19>|%0<mask_operand19>, %1, %2, %3}";
13092 }
13093   [(set_attr "type" "sselog")
13094    (set_attr "length_immediate" "1")
13095    (set_attr "prefix" "evex")
13096    (set_attr "mode" "<sseinsnmode>")])
13097
13098 (define_expand "avx512f_pshufdv3_mask"
13099   [(match_operand:V16SI 0 "register_operand")
13100    (match_operand:V16SI 1 "nonimmediate_operand")
13101    (match_operand:SI 2 "const_0_to_255_operand")
13102    (match_operand:V16SI 3 "register_operand")
13103    (match_operand:HI 4 "register_operand")]
13104   "TARGET_AVX512F"
13105 {
13106   int mask = INTVAL (operands[2]);
13107   emit_insn (gen_avx512f_pshufd_1_mask (operands[0], operands[1],
13108                                        GEN_INT ((mask >> 0) & 3),
13109                                        GEN_INT ((mask >> 2) & 3),
13110                                        GEN_INT ((mask >> 4) & 3),
13111                                        GEN_INT ((mask >> 6) & 3),
13112                                        GEN_INT (((mask >> 0) & 3) + 4),
13113                                        GEN_INT (((mask >> 2) & 3) + 4),
13114                                        GEN_INT (((mask >> 4) & 3) + 4),
13115                                        GEN_INT (((mask >> 6) & 3) + 4),
13116                                        GEN_INT (((mask >> 0) & 3) + 8),
13117                                        GEN_INT (((mask >> 2) & 3) + 8),
13118                                        GEN_INT (((mask >> 4) & 3) + 8),
13119                                        GEN_INT (((mask >> 6) & 3) + 8),
13120                                        GEN_INT (((mask >> 0) & 3) + 12),
13121                                        GEN_INT (((mask >> 2) & 3) + 12),
13122                                        GEN_INT (((mask >> 4) & 3) + 12),
13123                                        GEN_INT (((mask >> 6) & 3) + 12),
13124                                        operands[3], operands[4]));
13125   DONE;
13126 })
13127
13128 (define_insn "avx512f_pshufd_1<mask_name>"
13129   [(set (match_operand:V16SI 0 "register_operand" "=v")
13130         (vec_select:V16SI
13131           (match_operand:V16SI 1 "nonimmediate_operand" "vm")
13132           (parallel [(match_operand 2 "const_0_to_3_operand")
13133                      (match_operand 3 "const_0_to_3_operand")
13134                      (match_operand 4 "const_0_to_3_operand")
13135                      (match_operand 5 "const_0_to_3_operand")
13136                      (match_operand 6 "const_4_to_7_operand")
13137                      (match_operand 7 "const_4_to_7_operand")
13138                      (match_operand 8 "const_4_to_7_operand")
13139                      (match_operand 9 "const_4_to_7_operand")
13140                      (match_operand 10 "const_8_to_11_operand")
13141                      (match_operand 11 "const_8_to_11_operand")
13142                      (match_operand 12 "const_8_to_11_operand")
13143                      (match_operand 13 "const_8_to_11_operand")
13144                      (match_operand 14 "const_12_to_15_operand")
13145                      (match_operand 15 "const_12_to_15_operand")
13146                      (match_operand 16 "const_12_to_15_operand")
13147                      (match_operand 17 "const_12_to_15_operand")])))]
13148   "TARGET_AVX512F
13149    && INTVAL (operands[2]) + 4 == INTVAL (operands[6])
13150    && INTVAL (operands[3]) + 4 == INTVAL (operands[7])
13151    && INTVAL (operands[4]) + 4 == INTVAL (operands[8])
13152    && INTVAL (operands[5]) + 4 == INTVAL (operands[9])
13153    && INTVAL (operands[2]) + 8 == INTVAL (operands[10])
13154    && INTVAL (operands[3]) + 8 == INTVAL (operands[11])
13155    && INTVAL (operands[4]) + 8 == INTVAL (operands[12])
13156    && INTVAL (operands[5]) + 8 == INTVAL (operands[13])
13157    && INTVAL (operands[2]) + 12 == INTVAL (operands[14])
13158    && INTVAL (operands[3]) + 12 == INTVAL (operands[15])
13159    && INTVAL (operands[4]) + 12 == INTVAL (operands[16])
13160    && INTVAL (operands[5]) + 12 == INTVAL (operands[17])"
13161 {
13162   int mask = 0;
13163   mask |= INTVAL (operands[2]) << 0;
13164   mask |= INTVAL (operands[3]) << 2;
13165   mask |= INTVAL (operands[4]) << 4;
13166   mask |= INTVAL (operands[5]) << 6;
13167   operands[2] = GEN_INT (mask);
13168
13169   return "vpshufd\t{%2, %1, %0<mask_operand18>|%0<mask_operand18>, %1, %2}";
13170 }
13171   [(set_attr "type" "sselog1")
13172    (set_attr "prefix" "evex")
13173    (set_attr "length_immediate" "1")
13174    (set_attr "mode" "XI")])
13175
13176 (define_expand "avx512vl_pshufdv3_mask"
13177   [(match_operand:V8SI 0 "register_operand")
13178    (match_operand:V8SI 1 "nonimmediate_operand")
13179    (match_operand:SI 2 "const_0_to_255_operand")
13180    (match_operand:V8SI 3 "register_operand")
13181    (match_operand:QI 4 "register_operand")]
13182   "TARGET_AVX512VL"
13183 {
13184   int mask = INTVAL (operands[2]);
13185   emit_insn (gen_avx2_pshufd_1_mask (operands[0], operands[1],
13186                                 GEN_INT ((mask >> 0) & 3),
13187                                 GEN_INT ((mask >> 2) & 3),
13188                                 GEN_INT ((mask >> 4) & 3),
13189                                 GEN_INT ((mask >> 6) & 3),
13190                                 GEN_INT (((mask >> 0) & 3) + 4),
13191                                 GEN_INT (((mask >> 2) & 3) + 4),
13192                                 GEN_INT (((mask >> 4) & 3) + 4),
13193                                 GEN_INT (((mask >> 6) & 3) + 4),
13194                 operands[3], operands[4]));
13195   DONE;
13196 })
13197
13198 (define_expand "avx2_pshufdv3"
13199   [(match_operand:V8SI 0 "register_operand")
13200    (match_operand:V8SI 1 "nonimmediate_operand")
13201    (match_operand:SI 2 "const_0_to_255_operand")]
13202   "TARGET_AVX2"
13203 {
13204   int mask = INTVAL (operands[2]);
13205   emit_insn (gen_avx2_pshufd_1 (operands[0], operands[1],
13206                                 GEN_INT ((mask >> 0) & 3),
13207                                 GEN_INT ((mask >> 2) & 3),
13208                                 GEN_INT ((mask >> 4) & 3),
13209                                 GEN_INT ((mask >> 6) & 3),
13210                                 GEN_INT (((mask >> 0) & 3) + 4),
13211                                 GEN_INT (((mask >> 2) & 3) + 4),
13212                                 GEN_INT (((mask >> 4) & 3) + 4),
13213                                 GEN_INT (((mask >> 6) & 3) + 4)));
13214   DONE;
13215 })
13216
13217 (define_insn "avx2_pshufd_1<mask_name>"
13218   [(set (match_operand:V8SI 0 "register_operand" "=v")
13219         (vec_select:V8SI
13220           (match_operand:V8SI 1 "nonimmediate_operand" "vm")
13221           (parallel [(match_operand 2 "const_0_to_3_operand")
13222                      (match_operand 3 "const_0_to_3_operand")
13223                      (match_operand 4 "const_0_to_3_operand")
13224                      (match_operand 5 "const_0_to_3_operand")
13225                      (match_operand 6 "const_4_to_7_operand")
13226                      (match_operand 7 "const_4_to_7_operand")
13227                      (match_operand 8 "const_4_to_7_operand")
13228                      (match_operand 9 "const_4_to_7_operand")])))]
13229   "TARGET_AVX2
13230    && <mask_avx512vl_condition>
13231    && INTVAL (operands[2]) + 4 == INTVAL (operands[6])
13232    && INTVAL (operands[3]) + 4 == INTVAL (operands[7])
13233    && INTVAL (operands[4]) + 4 == INTVAL (operands[8])
13234    && INTVAL (operands[5]) + 4 == INTVAL (operands[9])"
13235 {
13236   int mask = 0;
13237   mask |= INTVAL (operands[2]) << 0;
13238   mask |= INTVAL (operands[3]) << 2;
13239   mask |= INTVAL (operands[4]) << 4;
13240   mask |= INTVAL (operands[5]) << 6;
13241   operands[2] = GEN_INT (mask);
13242
13243   return "vpshufd\t{%2, %1, %0<mask_operand10>|%0<mask_operand10>, %1, %2}";
13244 }
13245   [(set_attr "type" "sselog1")
13246    (set_attr "prefix" "maybe_evex")
13247    (set_attr "length_immediate" "1")
13248    (set_attr "mode" "OI")])
13249
13250 (define_expand "avx512vl_pshufd_mask"
13251   [(match_operand:V4SI 0 "register_operand")
13252    (match_operand:V4SI 1 "nonimmediate_operand")
13253    (match_operand:SI 2 "const_0_to_255_operand")
13254    (match_operand:V4SI 3 "register_operand")
13255    (match_operand:QI 4 "register_operand")]
13256   "TARGET_AVX512VL"
13257 {
13258   int mask = INTVAL (operands[2]);
13259   emit_insn (gen_sse2_pshufd_1_mask (operands[0], operands[1],
13260                                 GEN_INT ((mask >> 0) & 3),
13261                                 GEN_INT ((mask >> 2) & 3),
13262                                 GEN_INT ((mask >> 4) & 3),
13263                                 GEN_INT ((mask >> 6) & 3),
13264                 operands[3], operands[4]));
13265   DONE;
13266 })
13267
13268 (define_expand "sse2_pshufd"
13269   [(match_operand:V4SI 0 "register_operand")
13270    (match_operand:V4SI 1 "vector_operand")
13271    (match_operand:SI 2 "const_int_operand")]
13272   "TARGET_SSE2"
13273 {
13274   int mask = INTVAL (operands[2]);
13275   emit_insn (gen_sse2_pshufd_1 (operands[0], operands[1],
13276                                 GEN_INT ((mask >> 0) & 3),
13277                                 GEN_INT ((mask >> 2) & 3),
13278                                 GEN_INT ((mask >> 4) & 3),
13279                                 GEN_INT ((mask >> 6) & 3)));
13280   DONE;
13281 })
13282
13283 (define_insn "sse2_pshufd_1<mask_name>"
13284   [(set (match_operand:V4SI 0 "register_operand" "=v")
13285         (vec_select:V4SI
13286           (match_operand:V4SI 1 "vector_operand" "vBm")
13287           (parallel [(match_operand 2 "const_0_to_3_operand")
13288                      (match_operand 3 "const_0_to_3_operand")
13289                      (match_operand 4 "const_0_to_3_operand")
13290                      (match_operand 5 "const_0_to_3_operand")])))]
13291   "TARGET_SSE2 && <mask_avx512vl_condition>"
13292 {
13293   int mask = 0;
13294   mask |= INTVAL (operands[2]) << 0;
13295   mask |= INTVAL (operands[3]) << 2;
13296   mask |= INTVAL (operands[4]) << 4;
13297   mask |= INTVAL (operands[5]) << 6;
13298   operands[2] = GEN_INT (mask);
13299
13300   return "%vpshufd\t{%2, %1, %0<mask_operand6>|%0<mask_operand6>, %1, %2}";
13301 }
13302   [(set_attr "type" "sselog1")
13303    (set_attr "prefix_data16" "1")
13304    (set_attr "prefix" "<mask_prefix2>")
13305    (set_attr "length_immediate" "1")
13306    (set_attr "mode" "TI")])
13307
13308 (define_insn "<mask_codefor>avx512bw_pshuflwv32hi<mask_name>"
13309   [(set (match_operand:V32HI 0 "register_operand" "=v")
13310         (unspec:V32HI
13311           [(match_operand:V32HI 1 "nonimmediate_operand" "vm")
13312            (match_operand:SI 2 "const_0_to_255_operand" "n")]
13313           UNSPEC_PSHUFLW))]
13314   "TARGET_AVX512BW"
13315   "vpshuflw\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
13316   [(set_attr "type" "sselog")
13317    (set_attr "prefix" "evex")
13318    (set_attr "mode" "XI")])
13319
13320 (define_expand "avx512vl_pshuflwv3_mask"
13321   [(match_operand:V16HI 0 "register_operand")
13322    (match_operand:V16HI 1 "nonimmediate_operand")
13323    (match_operand:SI 2 "const_0_to_255_operand")
13324    (match_operand:V16HI 3 "register_operand")
13325    (match_operand:HI 4 "register_operand")]
13326   "TARGET_AVX512VL && TARGET_AVX512BW"
13327 {
13328   int mask = INTVAL (operands[2]);
13329   emit_insn (gen_avx2_pshuflw_1_mask (operands[0], operands[1],
13330                                  GEN_INT ((mask >> 0) & 3),
13331                                  GEN_INT ((mask >> 2) & 3),
13332                                  GEN_INT ((mask >> 4) & 3),
13333                                  GEN_INT ((mask >> 6) & 3),
13334                                  GEN_INT (((mask >> 0) & 3) + 8),
13335                                  GEN_INT (((mask >> 2) & 3) + 8),
13336                                  GEN_INT (((mask >> 4) & 3) + 8),
13337                                  GEN_INT (((mask >> 6) & 3) + 8),
13338                  operands[3], operands[4]));
13339   DONE;
13340 })
13341
13342 (define_expand "avx2_pshuflwv3"
13343   [(match_operand:V16HI 0 "register_operand")
13344    (match_operand:V16HI 1 "nonimmediate_operand")
13345    (match_operand:SI 2 "const_0_to_255_operand")]
13346   "TARGET_AVX2"
13347 {
13348   int mask = INTVAL (operands[2]);
13349   emit_insn (gen_avx2_pshuflw_1 (operands[0], operands[1],
13350                                  GEN_INT ((mask >> 0) & 3),
13351                                  GEN_INT ((mask >> 2) & 3),
13352                                  GEN_INT ((mask >> 4) & 3),
13353                                  GEN_INT ((mask >> 6) & 3),
13354                                  GEN_INT (((mask >> 0) & 3) + 8),
13355                                  GEN_INT (((mask >> 2) & 3) + 8),
13356                                  GEN_INT (((mask >> 4) & 3) + 8),
13357                                  GEN_INT (((mask >> 6) & 3) + 8)));
13358   DONE;
13359 })
13360
13361 (define_insn "avx2_pshuflw_1<mask_name>"
13362   [(set (match_operand:V16HI 0 "register_operand" "=v")
13363         (vec_select:V16HI
13364           (match_operand:V16HI 1 "nonimmediate_operand" "vm")
13365           (parallel [(match_operand 2 "const_0_to_3_operand")
13366                      (match_operand 3 "const_0_to_3_operand")
13367                      (match_operand 4 "const_0_to_3_operand")
13368                      (match_operand 5 "const_0_to_3_operand")
13369                      (const_int 4)
13370                      (const_int 5)
13371                      (const_int 6)
13372                      (const_int 7)
13373                      (match_operand 6 "const_8_to_11_operand")
13374                      (match_operand 7 "const_8_to_11_operand")
13375                      (match_operand 8 "const_8_to_11_operand")
13376                      (match_operand 9 "const_8_to_11_operand")
13377                      (const_int 12)
13378                      (const_int 13)
13379                      (const_int 14)
13380                      (const_int 15)])))]
13381   "TARGET_AVX2
13382    && <mask_avx512bw_condition> && <mask_avx512vl_condition>
13383    && INTVAL (operands[2]) + 8 == INTVAL (operands[6])
13384    && INTVAL (operands[3]) + 8 == INTVAL (operands[7])
13385    && INTVAL (operands[4]) + 8 == INTVAL (operands[8])
13386    && INTVAL (operands[5]) + 8 == INTVAL (operands[9])"
13387 {
13388   int mask = 0;
13389   mask |= INTVAL (operands[2]) << 0;
13390   mask |= INTVAL (operands[3]) << 2;
13391   mask |= INTVAL (operands[4]) << 4;
13392   mask |= INTVAL (operands[5]) << 6;
13393   operands[2] = GEN_INT (mask);
13394
13395   return "vpshuflw\t{%2, %1, %0<mask_operand10>|%0<mask_operand10>, %1, %2}";
13396 }
13397   [(set_attr "type" "sselog")
13398    (set_attr "prefix" "maybe_evex")
13399    (set_attr "length_immediate" "1")
13400    (set_attr "mode" "OI")])
13401
13402 (define_expand "avx512vl_pshuflw_mask"
13403   [(match_operand:V8HI 0 "register_operand")
13404    (match_operand:V8HI 1 "nonimmediate_operand")
13405    (match_operand:SI 2 "const_0_to_255_operand")
13406    (match_operand:V8HI 3 "register_operand")
13407    (match_operand:QI 4 "register_operand")]
13408   "TARGET_AVX512VL && TARGET_AVX512BW"
13409 {
13410   int mask = INTVAL (operands[2]);
13411   emit_insn (gen_sse2_pshuflw_1_mask (operands[0], operands[1],
13412                                  GEN_INT ((mask >> 0) & 3),
13413                                  GEN_INT ((mask >> 2) & 3),
13414                                  GEN_INT ((mask >> 4) & 3),
13415                                  GEN_INT ((mask >> 6) & 3),
13416                  operands[3], operands[4]));
13417   DONE;
13418 })
13419
13420 (define_expand "sse2_pshuflw"
13421   [(match_operand:V8HI 0 "register_operand")
13422    (match_operand:V8HI 1 "vector_operand")
13423    (match_operand:SI 2 "const_int_operand")]
13424   "TARGET_SSE2"
13425 {
13426   int mask = INTVAL (operands[2]);
13427   emit_insn (gen_sse2_pshuflw_1 (operands[0], operands[1],
13428                                  GEN_INT ((mask >> 0) & 3),
13429                                  GEN_INT ((mask >> 2) & 3),
13430                                  GEN_INT ((mask >> 4) & 3),
13431                                  GEN_INT ((mask >> 6) & 3)));
13432   DONE;
13433 })
13434
13435 (define_insn "sse2_pshuflw_1<mask_name>"
13436   [(set (match_operand:V8HI 0 "register_operand" "=v")
13437         (vec_select:V8HI
13438           (match_operand:V8HI 1 "vector_operand" "vBm")
13439           (parallel [(match_operand 2 "const_0_to_3_operand")
13440                      (match_operand 3 "const_0_to_3_operand")
13441                      (match_operand 4 "const_0_to_3_operand")
13442                      (match_operand 5 "const_0_to_3_operand")
13443                      (const_int 4)
13444                      (const_int 5)
13445                      (const_int 6)
13446                      (const_int 7)])))]
13447   "TARGET_SSE2 && <mask_avx512bw_condition> && <mask_avx512vl_condition>"
13448 {
13449   int mask = 0;
13450   mask |= INTVAL (operands[2]) << 0;
13451   mask |= INTVAL (operands[3]) << 2;
13452   mask |= INTVAL (operands[4]) << 4;
13453   mask |= INTVAL (operands[5]) << 6;
13454   operands[2] = GEN_INT (mask);
13455
13456   return "%vpshuflw\t{%2, %1, %0<mask_operand6>|%0<mask_operand6>, %1, %2}";
13457 }
13458   [(set_attr "type" "sselog")
13459    (set_attr "prefix_data16" "0")
13460    (set_attr "prefix_rep" "1")
13461    (set_attr "prefix" "maybe_vex")
13462    (set_attr "length_immediate" "1")
13463    (set_attr "mode" "TI")])
13464
13465 (define_expand "avx2_pshufhwv3"
13466   [(match_operand:V16HI 0 "register_operand")
13467    (match_operand:V16HI 1 "nonimmediate_operand")
13468    (match_operand:SI 2 "const_0_to_255_operand")]
13469   "TARGET_AVX2"
13470 {
13471   int mask = INTVAL (operands[2]);
13472   emit_insn (gen_avx2_pshufhw_1 (operands[0], operands[1],
13473                                  GEN_INT (((mask >> 0) & 3) + 4),
13474                                  GEN_INT (((mask >> 2) & 3) + 4),
13475                                  GEN_INT (((mask >> 4) & 3) + 4),
13476                                  GEN_INT (((mask >> 6) & 3) + 4),
13477                                  GEN_INT (((mask >> 0) & 3) + 12),
13478                                  GEN_INT (((mask >> 2) & 3) + 12),
13479                                  GEN_INT (((mask >> 4) & 3) + 12),
13480                                  GEN_INT (((mask >> 6) & 3) + 12)));
13481   DONE;
13482 })
13483
13484 (define_insn "<mask_codefor>avx512bw_pshufhwv32hi<mask_name>"
13485   [(set (match_operand:V32HI 0 "register_operand" "=v")
13486         (unspec:V32HI
13487           [(match_operand:V32HI 1 "nonimmediate_operand" "vm")
13488            (match_operand:SI 2 "const_0_to_255_operand" "n")]
13489           UNSPEC_PSHUFHW))]
13490   "TARGET_AVX512BW"
13491   "vpshufhw\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
13492   [(set_attr "type" "sselog")
13493    (set_attr "prefix" "evex")
13494    (set_attr "mode" "XI")])
13495
13496 (define_expand "avx512vl_pshufhwv3_mask"
13497   [(match_operand:V16HI 0 "register_operand")
13498    (match_operand:V16HI 1 "nonimmediate_operand")
13499    (match_operand:SI 2 "const_0_to_255_operand")
13500    (match_operand:V16HI 3 "register_operand")
13501    (match_operand:HI 4 "register_operand")]
13502   "TARGET_AVX512VL && TARGET_AVX512BW"
13503 {
13504   int mask = INTVAL (operands[2]);
13505   emit_insn (gen_avx2_pshufhw_1_mask (operands[0], operands[1],
13506                                  GEN_INT (((mask >> 0) & 3) + 4),
13507                                  GEN_INT (((mask >> 2) & 3) + 4),
13508                                  GEN_INT (((mask >> 4) & 3) + 4),
13509                                  GEN_INT (((mask >> 6) & 3) + 4),
13510                                  GEN_INT (((mask >> 0) & 3) + 12),
13511                                  GEN_INT (((mask >> 2) & 3) + 12),
13512                                  GEN_INT (((mask >> 4) & 3) + 12),
13513                                  GEN_INT (((mask >> 6) & 3) + 12),
13514                  operands[3], operands[4]));
13515   DONE;
13516 })
13517
13518 (define_insn "avx2_pshufhw_1<mask_name>"
13519   [(set (match_operand:V16HI 0 "register_operand" "=v")
13520         (vec_select:V16HI
13521           (match_operand:V16HI 1 "nonimmediate_operand" "vm")
13522           (parallel [(const_int 0)
13523                      (const_int 1)
13524                      (const_int 2)
13525                      (const_int 3)
13526                      (match_operand 2 "const_4_to_7_operand")
13527                      (match_operand 3 "const_4_to_7_operand")
13528                      (match_operand 4 "const_4_to_7_operand")
13529                      (match_operand 5 "const_4_to_7_operand")
13530                      (const_int 8)
13531                      (const_int 9)
13532                      (const_int 10)
13533                      (const_int 11)
13534                      (match_operand 6 "const_12_to_15_operand")
13535                      (match_operand 7 "const_12_to_15_operand")
13536                      (match_operand 8 "const_12_to_15_operand")
13537                      (match_operand 9 "const_12_to_15_operand")])))]
13538   "TARGET_AVX2
13539    && <mask_avx512bw_condition> && <mask_avx512vl_condition>
13540    && INTVAL (operands[2]) + 8 == INTVAL (operands[6])
13541    && INTVAL (operands[3]) + 8 == INTVAL (operands[7])
13542    && INTVAL (operands[4]) + 8 == INTVAL (operands[8])
13543    && INTVAL (operands[5]) + 8 == INTVAL (operands[9])"
13544 {
13545   int mask = 0;
13546   mask |= (INTVAL (operands[2]) - 4) << 0;
13547   mask |= (INTVAL (operands[3]) - 4) << 2;
13548   mask |= (INTVAL (operands[4]) - 4) << 4;
13549   mask |= (INTVAL (operands[5]) - 4) << 6;
13550   operands[2] = GEN_INT (mask);
13551
13552   return "vpshufhw\t{%2, %1, %0<mask_operand10>|%0<mask_operand10>, %1, %2}";
13553 }
13554   [(set_attr "type" "sselog")
13555    (set_attr "prefix" "maybe_evex")
13556    (set_attr "length_immediate" "1")
13557    (set_attr "mode" "OI")])
13558
13559 (define_expand "avx512vl_pshufhw_mask"
13560   [(match_operand:V8HI 0 "register_operand")
13561    (match_operand:V8HI 1 "nonimmediate_operand")
13562    (match_operand:SI 2 "const_0_to_255_operand")
13563    (match_operand:V8HI 3 "register_operand")
13564    (match_operand:QI 4 "register_operand")]
13565   "TARGET_AVX512VL && TARGET_AVX512BW"
13566 {
13567   int mask = INTVAL (operands[2]);
13568   emit_insn (gen_sse2_pshufhw_1_mask (operands[0], operands[1],
13569                                  GEN_INT (((mask >> 0) & 3) + 4),
13570                                  GEN_INT (((mask >> 2) & 3) + 4),
13571                                  GEN_INT (((mask >> 4) & 3) + 4),
13572                                  GEN_INT (((mask >> 6) & 3) + 4),
13573                  operands[3], operands[4]));
13574   DONE;
13575 })
13576
13577 (define_expand "sse2_pshufhw"
13578   [(match_operand:V8HI 0 "register_operand")
13579    (match_operand:V8HI 1 "vector_operand")
13580    (match_operand:SI 2 "const_int_operand")]
13581   "TARGET_SSE2"
13582 {
13583   int mask = INTVAL (operands[2]);
13584   emit_insn (gen_sse2_pshufhw_1 (operands[0], operands[1],
13585                                  GEN_INT (((mask >> 0) & 3) + 4),
13586                                  GEN_INT (((mask >> 2) & 3) + 4),
13587                                  GEN_INT (((mask >> 4) & 3) + 4),
13588                                  GEN_INT (((mask >> 6) & 3) + 4)));
13589   DONE;
13590 })
13591
13592 (define_insn "sse2_pshufhw_1<mask_name>"
13593   [(set (match_operand:V8HI 0 "register_operand" "=v")
13594         (vec_select:V8HI
13595           (match_operand:V8HI 1 "vector_operand" "vBm")
13596           (parallel [(const_int 0)
13597                      (const_int 1)
13598                      (const_int 2)
13599                      (const_int 3)
13600                      (match_operand 2 "const_4_to_7_operand")
13601                      (match_operand 3 "const_4_to_7_operand")
13602                      (match_operand 4 "const_4_to_7_operand")
13603                      (match_operand 5 "const_4_to_7_operand")])))]
13604   "TARGET_SSE2 && <mask_avx512bw_condition> && <mask_avx512vl_condition>"
13605 {
13606   int mask = 0;
13607   mask |= (INTVAL (operands[2]) - 4) << 0;
13608   mask |= (INTVAL (operands[3]) - 4) << 2;
13609   mask |= (INTVAL (operands[4]) - 4) << 4;
13610   mask |= (INTVAL (operands[5]) - 4) << 6;
13611   operands[2] = GEN_INT (mask);
13612
13613   return "%vpshufhw\t{%2, %1, %0<mask_operand6>|%0<mask_operand6>, %1, %2}";
13614 }
13615   [(set_attr "type" "sselog")
13616    (set_attr "prefix_rep" "1")
13617    (set_attr "prefix_data16" "0")
13618    (set_attr "prefix" "maybe_vex")
13619    (set_attr "length_immediate" "1")
13620    (set_attr "mode" "TI")])
13621
13622 (define_expand "sse2_loadd"
13623   [(set (match_operand:V4SI 0 "register_operand")
13624         (vec_merge:V4SI
13625           (vec_duplicate:V4SI
13626             (match_operand:SI 1 "nonimmediate_operand"))
13627           (match_dup 2)
13628           (const_int 1)))]
13629   "TARGET_SSE"
13630   "operands[2] = CONST0_RTX (V4SImode);")
13631
13632 (define_insn "sse2_loadld"
13633   [(set (match_operand:V4SI 0 "register_operand"       "=v,Yi,x,x,v")
13634         (vec_merge:V4SI
13635           (vec_duplicate:V4SI
13636             (match_operand:SI 2 "nonimmediate_operand" "m ,r ,m,x,v"))
13637           (match_operand:V4SI 1 "reg_or_0_operand"     "C ,C ,C,0,v")
13638           (const_int 1)))]
13639   "TARGET_SSE"
13640   "@
13641    %vmovd\t{%2, %0|%0, %2}
13642    %vmovd\t{%2, %0|%0, %2}
13643    movss\t{%2, %0|%0, %2}
13644    movss\t{%2, %0|%0, %2}
13645    vmovss\t{%2, %1, %0|%0, %1, %2}"
13646   [(set_attr "isa" "sse2,sse2,noavx,noavx,avx")
13647    (set_attr "type" "ssemov")
13648    (set_attr "prefix" "maybe_vex,maybe_vex,orig,orig,maybe_evex")
13649    (set_attr "mode" "TI,TI,V4SF,SF,SF")])
13650
13651 ;; QI and HI modes handled by pextr patterns.
13652 (define_mode_iterator PEXTR_MODE12
13653   [(V16QI "TARGET_SSE4_1") V8HI])
13654
13655 (define_insn "*vec_extract<mode>"
13656   [(set (match_operand:<ssescalarmode> 0 "register_sse4nonimm_operand" "=r,m,r,m")
13657         (vec_select:<ssescalarmode>
13658           (match_operand:PEXTR_MODE12 1 "register_operand" "x,x,v,v")
13659           (parallel
13660             [(match_operand:SI 2 "const_0_to_<ssescalarnummask>_operand")])))]
13661   "TARGET_SSE2"
13662   "@
13663    %vpextr<ssemodesuffix>\t{%2, %1, %k0|%k0, %1, %2}
13664    %vpextr<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}
13665    vpextr<ssemodesuffix>\t{%2, %1, %k0|%k0, %1, %2}
13666    vpextr<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
13667   [(set_attr "isa" "*,sse4,avx512bw,avx512bw")
13668    (set_attr "type" "sselog1")
13669    (set_attr "prefix_data16" "1")
13670    (set (attr "prefix_extra")
13671      (if_then_else
13672        (and (eq_attr "alternative" "0,2")
13673             (eq (const_string "<MODE>mode") (const_string "V8HImode")))
13674        (const_string "*")
13675        (const_string "1")))
13676    (set_attr "length_immediate" "1")
13677    (set_attr "prefix" "maybe_vex,maybe_vex,evex,evex")
13678    (set_attr "mode" "TI")])
13679
13680 (define_insn "*vec_extract<PEXTR_MODE12:mode>_zext"
13681   [(set (match_operand:SWI48 0 "register_operand" "=r,r")
13682         (zero_extend:SWI48
13683           (vec_select:<PEXTR_MODE12:ssescalarmode>
13684             (match_operand:PEXTR_MODE12 1 "register_operand" "x,v")
13685             (parallel
13686               [(match_operand:SI 2
13687                 "const_0_to_<PEXTR_MODE12:ssescalarnummask>_operand")]))))]
13688   "TARGET_SSE2"
13689   "@
13690    %vpextr<PEXTR_MODE12:ssemodesuffix>\t{%2, %1, %k0|%k0, %1, %2}
13691    vpextr<PEXTR_MODE12:ssemodesuffix>\t{%2, %1, %k0|%k0, %1, %2}"
13692   [(set_attr "isa" "*,avx512bw")
13693    (set_attr "type" "sselog1")
13694    (set_attr "prefix_data16" "1")
13695    (set (attr "prefix_extra")
13696      (if_then_else
13697        (eq (const_string "<PEXTR_MODE12:MODE>mode") (const_string "V8HImode"))
13698        (const_string "*")
13699        (const_string "1")))
13700    (set_attr "length_immediate" "1")
13701    (set_attr "prefix" "maybe_vex")
13702    (set_attr "mode" "TI")])
13703
13704 (define_insn "*vec_extract<mode>_mem"
13705   [(set (match_operand:<ssescalarmode> 0 "register_operand" "=r")
13706         (vec_select:<ssescalarmode>
13707           (match_operand:VI12_128 1 "memory_operand" "o")
13708           (parallel
13709             [(match_operand 2 "const_0_to_<ssescalarnummask>_operand")])))]
13710   "TARGET_SSE"
13711   "#")
13712
13713 (define_insn "*vec_extract<ssevecmodelower>_0"
13714   [(set (match_operand:SWI48 0 "nonimmediate_operand"          "=r ,v ,m")
13715         (vec_select:SWI48
13716           (match_operand:<ssevecmode> 1 "nonimmediate_operand" "mYj,vm,v")
13717           (parallel [(const_int 0)])))]
13718   "TARGET_SSE && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
13719   "#")
13720
13721 (define_insn "*vec_extractv2di_0_sse"
13722   [(set (match_operand:DI 0 "nonimmediate_operand"     "=v,m")
13723         (vec_select:DI
13724           (match_operand:V2DI 1 "nonimmediate_operand" "vm,v")
13725           (parallel [(const_int 0)])))]
13726   "TARGET_SSE && !TARGET_64BIT
13727    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
13728   "#")
13729
13730 (define_split
13731   [(set (match_operand:SWI48x 0 "nonimmediate_operand")
13732         (vec_select:SWI48x
13733           (match_operand:<ssevecmode> 1 "register_operand")
13734           (parallel [(const_int 0)])))]
13735   "TARGET_SSE && reload_completed"
13736   [(set (match_dup 0) (match_dup 1))]
13737   "operands[1] = gen_lowpart (<MODE>mode, operands[1]);")
13738
13739 (define_insn "*vec_extractv4si_0_zext_sse4"
13740   [(set (match_operand:DI 0 "register_operand" "=r,x,v")
13741         (zero_extend:DI
13742           (vec_select:SI
13743             (match_operand:V4SI 1 "register_operand" "Yj,x,v")
13744             (parallel [(const_int 0)]))))]
13745   "TARGET_SSE4_1"
13746   "#"
13747   [(set_attr "isa" "x64,*,avx512f")])
13748
13749 (define_insn "*vec_extractv4si_0_zext"
13750   [(set (match_operand:DI 0 "register_operand" "=r")
13751         (zero_extend:DI
13752           (vec_select:SI
13753             (match_operand:V4SI 1 "register_operand" "x")
13754             (parallel [(const_int 0)]))))]
13755   "TARGET_64BIT && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_FROM_VEC"
13756   "#")
13757
13758 (define_split
13759   [(set (match_operand:DI 0 "register_operand")
13760         (zero_extend:DI
13761           (vec_select:SI
13762             (match_operand:V4SI 1 "register_operand")
13763             (parallel [(const_int 0)]))))]
13764   "TARGET_SSE2 && reload_completed"
13765   [(set (match_dup 0) (zero_extend:DI (match_dup 1)))]
13766   "operands[1] = gen_lowpart (SImode, operands[1]);")
13767
13768 (define_insn "*vec_extractv4si"
13769   [(set (match_operand:SI 0 "nonimmediate_operand" "=rm,rm,Yr,*x,x,Yv")
13770         (vec_select:SI
13771           (match_operand:V4SI 1 "register_operand" "x,v,0,0,x,v")
13772           (parallel [(match_operand:SI 2 "const_0_to_3_operand")])))]
13773   "TARGET_SSE4_1"
13774 {
13775   switch (which_alternative)
13776     {
13777     case 0:
13778     case 1:
13779       return "%vpextrd\t{%2, %1, %0|%0, %1, %2}";
13780
13781     case 2:
13782     case 3:
13783       operands[2] = GEN_INT (INTVAL (operands[2]) * 4);
13784       return "psrldq\t{%2, %0|%0, %2}";
13785
13786     case 4:
13787     case 5:
13788       operands[2] = GEN_INT (INTVAL (operands[2]) * 4);
13789       return "vpsrldq\t{%2, %1, %0|%0, %1, %2}";
13790
13791     default:
13792       gcc_unreachable ();
13793     }
13794 }
13795   [(set_attr "isa" "*,avx512dq,noavx,noavx,avx,avx512bw")
13796    (set_attr "type" "sselog1,sselog1,sseishft1,sseishft1,sseishft1,sseishft1")
13797    (set (attr "prefix_extra")
13798      (if_then_else (eq_attr "alternative" "0,1")
13799                    (const_string "1")
13800                    (const_string "*")))
13801    (set_attr "length_immediate" "1")
13802    (set_attr "prefix" "maybe_vex,evex,orig,orig,vex,evex")
13803    (set_attr "mode" "TI")])
13804
13805 (define_insn "*vec_extractv4si_zext"
13806   [(set (match_operand:DI 0 "register_operand" "=r,r")
13807         (zero_extend:DI
13808           (vec_select:SI
13809             (match_operand:V4SI 1 "register_operand" "x,v")
13810             (parallel [(match_operand:SI 2 "const_0_to_3_operand")]))))]
13811   "TARGET_64BIT && TARGET_SSE4_1"
13812   "%vpextrd\t{%2, %1, %k0|%k0, %1, %2}"
13813   [(set_attr "isa" "*,avx512dq")
13814    (set_attr "type" "sselog1")
13815    (set_attr "prefix_extra" "1")
13816    (set_attr "length_immediate" "1")
13817    (set_attr "prefix" "maybe_vex")
13818    (set_attr "mode" "TI")])
13819
13820 (define_insn "*vec_extractv4si_mem"
13821   [(set (match_operand:SI 0 "register_operand" "=x,r")
13822         (vec_select:SI
13823           (match_operand:V4SI 1 "memory_operand" "o,o")
13824           (parallel [(match_operand 2 "const_0_to_3_operand")])))]
13825   "TARGET_SSE"
13826   "#")
13827
13828 (define_insn_and_split "*vec_extractv4si_zext_mem"
13829   [(set (match_operand:DI 0 "register_operand" "=x,r")
13830         (zero_extend:DI
13831           (vec_select:SI
13832             (match_operand:V4SI 1 "memory_operand" "o,o")
13833             (parallel [(match_operand:SI 2 "const_0_to_3_operand")]))))]
13834   "TARGET_64BIT && TARGET_SSE"
13835   "#"
13836   "&& reload_completed"
13837   [(set (match_dup 0) (zero_extend:DI (match_dup 1)))]
13838 {
13839   operands[1] = adjust_address (operands[1], SImode, INTVAL (operands[2]) * 4);
13840 })
13841
13842 (define_insn "*vec_extractv2di_1"
13843   [(set (match_operand:DI 0 "nonimmediate_operand"     "=rm,rm,m,x,x,Yv,x,v,r")
13844         (vec_select:DI
13845           (match_operand:V2DI 1 "nonimmediate_operand"  "x ,v ,v,0,x, v,x,o,o")
13846           (parallel [(const_int 1)])))]
13847   "TARGET_SSE && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
13848   "@
13849    %vpextrq\t{$1, %1, %0|%0, %1, 1}
13850    vpextrq\t{$1, %1, %0|%0, %1, 1}
13851    %vmovhps\t{%1, %0|%0, %1}
13852    psrldq\t{$8, %0|%0, 8}
13853    vpsrldq\t{$8, %1, %0|%0, %1, 8}
13854    vpsrldq\t{$8, %1, %0|%0, %1, 8}
13855    movhlps\t{%1, %0|%0, %1}
13856    #
13857    #"
13858   [(set (attr "isa")
13859      (cond [(eq_attr "alternative" "0")
13860               (const_string "x64_sse4")
13861             (eq_attr "alternative" "1")
13862               (const_string "x64_avx512dq")
13863             (eq_attr "alternative" "3")
13864               (const_string "sse2_noavx")
13865             (eq_attr "alternative" "4")
13866               (const_string "avx")
13867             (eq_attr "alternative" "5")
13868               (const_string "avx512bw")
13869             (eq_attr "alternative" "6")
13870               (const_string "noavx")
13871             (eq_attr "alternative" "8")
13872               (const_string "x64")
13873            ]
13874            (const_string "*")))
13875    (set (attr "type")
13876      (cond [(eq_attr "alternative" "2,6,7")
13877               (const_string "ssemov")
13878             (eq_attr "alternative" "3,4,5")
13879               (const_string "sseishft1")
13880             (eq_attr "alternative" "8")
13881               (const_string "imov")
13882            ]
13883            (const_string "sselog1")))
13884    (set (attr "length_immediate")
13885      (if_then_else (eq_attr "alternative" "0,1,3,4,5")
13886                    (const_string "1")
13887                    (const_string "*")))
13888    (set (attr "prefix_rex")
13889      (if_then_else (eq_attr "alternative" "0,1")
13890                    (const_string "1")
13891                    (const_string "*")))
13892    (set (attr "prefix_extra")
13893      (if_then_else (eq_attr "alternative" "0,1")
13894                    (const_string "1")
13895                    (const_string "*")))
13896    (set_attr "prefix" "maybe_vex,evex,maybe_vex,orig,vex,evex,orig,*,*")
13897    (set_attr "mode" "TI,TI,V2SF,TI,TI,TI,V4SF,DI,DI")])
13898
13899 (define_split
13900   [(set (match_operand:<ssescalarmode> 0 "register_operand")
13901         (vec_select:<ssescalarmode>
13902           (match_operand:VI_128 1 "memory_operand")
13903           (parallel
13904             [(match_operand 2 "const_0_to_<ssescalarnummask>_operand")])))]
13905   "TARGET_SSE && reload_completed"
13906   [(set (match_dup 0) (match_dup 1))]
13907 {
13908   int offs = INTVAL (operands[2]) * GET_MODE_SIZE (<ssescalarmode>mode);
13909
13910   operands[1] = adjust_address (operands[1], <ssescalarmode>mode, offs);
13911 })
13912
13913 (define_insn "*vec_extractv2ti"
13914   [(set (match_operand:TI 0 "nonimmediate_operand" "=xm,vm")
13915         (vec_select:TI
13916           (match_operand:V2TI 1 "register_operand" "x,v")
13917           (parallel
13918             [(match_operand:SI 2 "const_0_to_1_operand")])))]
13919   "TARGET_AVX"
13920   "@
13921    vextract%~128\t{%2, %1, %0|%0, %1, %2}
13922    vextracti32x4\t{%2, %g1, %0|%0, %g1, %2}"
13923   [(set_attr "type" "sselog")
13924    (set_attr "prefix_extra" "1")
13925    (set_attr "length_immediate" "1")
13926    (set_attr "prefix" "vex,evex")
13927    (set_attr "mode" "OI")])
13928
13929 (define_insn "*vec_extractv4ti"
13930   [(set (match_operand:TI 0 "nonimmediate_operand" "=vm")
13931         (vec_select:TI
13932           (match_operand:V4TI 1 "register_operand" "v")
13933           (parallel
13934             [(match_operand:SI 2 "const_0_to_3_operand")])))]
13935   "TARGET_AVX512F"
13936   "vextracti32x4\t{%2, %1, %0|%0, %1, %2}"
13937   [(set_attr "type" "sselog")
13938    (set_attr "prefix_extra" "1")
13939    (set_attr "length_immediate" "1")
13940    (set_attr "prefix" "evex")
13941    (set_attr "mode" "XI")])
13942
13943 (define_mode_iterator VEXTRACTI128_MODE
13944   [(V4TI "TARGET_AVX512F") V2TI])
13945
13946 (define_split
13947   [(set (match_operand:TI 0 "nonimmediate_operand")
13948         (vec_select:TI
13949           (match_operand:VEXTRACTI128_MODE 1 "register_operand")
13950           (parallel [(const_int 0)])))]
13951   "TARGET_AVX
13952    && reload_completed
13953    && (TARGET_AVX512VL || !EXT_REX_SSE_REG_P (operands[1]))"
13954   [(set (match_dup 0) (match_dup 1))]
13955   "operands[1] = gen_lowpart (TImode, operands[1]);")
13956
13957 ;; Turn SImode or DImode extraction from arbitrary SSE/AVX/AVX512F
13958 ;; vector modes into vec_extract*.
13959 (define_split
13960   [(set (match_operand:SWI48x 0 "nonimmediate_operand")
13961         (subreg:SWI48x (match_operand 1 "register_operand") 0))]
13962   "can_create_pseudo_p ()
13963    && REG_P (operands[1])
13964    && VECTOR_MODE_P (GET_MODE (operands[1]))
13965    && ((TARGET_SSE && GET_MODE_SIZE (GET_MODE (operands[1])) == 16)
13966        || (TARGET_AVX && GET_MODE_SIZE (GET_MODE (operands[1])) == 32)
13967        || (TARGET_AVX512F && GET_MODE_SIZE (GET_MODE (operands[1])) == 64))
13968    && (<MODE>mode == SImode || TARGET_64BIT || MEM_P (operands[0]))"
13969   [(set (match_dup 0) (vec_select:SWI48x (match_dup 1)
13970                                          (parallel [(const_int 0)])))]
13971 {
13972   rtx tmp;
13973
13974   switch (GET_MODE_SIZE (GET_MODE (operands[1])))
13975     {
13976     case 64:
13977       if (<MODE>mode == SImode)
13978         {
13979           tmp = gen_reg_rtx (V8SImode);
13980           emit_insn (gen_vec_extract_lo_v16si (tmp,
13981                                                gen_lowpart (V16SImode,
13982                                                             operands[1])));
13983         }
13984       else
13985         {
13986           tmp = gen_reg_rtx (V4DImode);
13987           emit_insn (gen_vec_extract_lo_v8di (tmp,
13988                                               gen_lowpart (V8DImode,
13989                                                            operands[1])));
13990         }
13991       operands[1] = tmp;
13992       /* FALLTHRU */
13993     case 32:
13994       tmp = gen_reg_rtx (<ssevecmode>mode);
13995       if (<MODE>mode == SImode)
13996         emit_insn (gen_vec_extract_lo_v8si (tmp, gen_lowpart (V8SImode,
13997                                                               operands[1])));
13998       else
13999         emit_insn (gen_vec_extract_lo_v4di (tmp, gen_lowpart (V4DImode,
14000                                                               operands[1])));
14001       operands[1] = tmp;
14002       break;
14003     case 16:
14004       operands[1] = gen_lowpart (<ssevecmode>mode, operands[1]);
14005       break;
14006     }
14007 })
14008
14009 (define_insn "*vec_concatv2si_sse4_1"
14010   [(set (match_operand:V2SI 0 "register_operand"
14011           "=Yr,*x, x, v,Yr,*x, v, v, *y,*y")
14012         (vec_concat:V2SI
14013           (match_operand:SI 1 "nonimmediate_operand"
14014           "  0, 0, x,Yv, 0, 0,Yv,rm,  0,rm")
14015           (match_operand:SI 2 "vector_move_operand"
14016           " rm,rm,rm,rm,Yr,*x,Yv, C,*ym, C")))]
14017   "TARGET_SSE4_1 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
14018   "@
14019    pinsrd\t{$1, %2, %0|%0, %2, 1}
14020    pinsrd\t{$1, %2, %0|%0, %2, 1}
14021    vpinsrd\t{$1, %2, %1, %0|%0, %1, %2, 1}
14022    vpinsrd\t{$1, %2, %1, %0|%0, %1, %2, 1}
14023    punpckldq\t{%2, %0|%0, %2}
14024    punpckldq\t{%2, %0|%0, %2}
14025    vpunpckldq\t{%2, %1, %0|%0, %1, %2}
14026    %vmovd\t{%1, %0|%0, %1}
14027    punpckldq\t{%2, %0|%0, %2}
14028    movd\t{%1, %0|%0, %1}"
14029   [(set_attr "isa" "noavx,noavx,avx,avx512dq,noavx,noavx,avx,*,*,*")
14030    (set (attr "type")
14031      (cond [(eq_attr "alternative" "7")
14032               (const_string "ssemov")
14033             (eq_attr "alternative" "8")
14034               (const_string "mmxcvt")
14035             (eq_attr "alternative" "9")
14036               (const_string "mmxmov")
14037            ]
14038            (const_string "sselog")))
14039    (set (attr "prefix_extra")
14040      (if_then_else (eq_attr "alternative" "0,1,2,3")
14041                    (const_string "1")
14042                    (const_string "*")))
14043    (set (attr "length_immediate")
14044      (if_then_else (eq_attr "alternative" "0,1,2,3")
14045                    (const_string "1")
14046                    (const_string "*")))
14047    (set_attr "prefix" "orig,orig,vex,evex,orig,orig,maybe_evex,maybe_vex,orig,orig")
14048    (set_attr "mode" "TI,TI,TI,TI,TI,TI,TI,TI,DI,DI")])
14049
14050 ;; ??? In theory we can match memory for the MMX alternative, but allowing
14051 ;; nonimmediate_operand for operand 2 and *not* allowing memory for the SSE
14052 ;; alternatives pretty much forces the MMX alternative to be chosen.
14053 (define_insn "*vec_concatv2si"
14054   [(set (match_operand:V2SI 0 "register_operand"     "=x,x ,*y,x,x,*y,*y")
14055         (vec_concat:V2SI
14056           (match_operand:SI 1 "nonimmediate_operand" " 0,rm,rm,0,m, 0,*rm")
14057           (match_operand:SI 2 "reg_or_0_operand"     " x,C ,C, x,C,*y,C")))]
14058   "TARGET_SSE && !TARGET_SSE4_1"
14059   "@
14060    punpckldq\t{%2, %0|%0, %2}
14061    movd\t{%1, %0|%0, %1}
14062    movd\t{%1, %0|%0, %1}
14063    unpcklps\t{%2, %0|%0, %2}
14064    movss\t{%1, %0|%0, %1}
14065    punpckldq\t{%2, %0|%0, %2}
14066    movd\t{%1, %0|%0, %1}"
14067   [(set_attr "isa" "sse2,sse2,sse2,*,*,*,*")
14068    (set_attr "type" "sselog,ssemov,mmxmov,sselog,ssemov,mmxcvt,mmxmov")
14069    (set_attr "mode" "TI,TI,DI,V4SF,SF,DI,DI")])
14070
14071 (define_insn "*vec_concatv4si"
14072   [(set (match_operand:V4SI 0 "register_operand"       "=x,v,x,x,v")
14073         (vec_concat:V4SI
14074           (match_operand:V2SI 1 "register_operand"     " 0,v,0,0,v")
14075           (match_operand:V2SI 2 "nonimmediate_operand" " x,v,x,m,m")))]
14076   "TARGET_SSE"
14077   "@
14078    punpcklqdq\t{%2, %0|%0, %2}
14079    vpunpcklqdq\t{%2, %1, %0|%0, %1, %2}
14080    movlhps\t{%2, %0|%0, %2}
14081    movhps\t{%2, %0|%0, %q2}
14082    vmovhps\t{%2, %1, %0|%0, %1, %q2}"
14083   [(set_attr "isa" "sse2_noavx,avx,noavx,noavx,avx")
14084    (set_attr "type" "sselog,sselog,ssemov,ssemov,ssemov")
14085    (set_attr "prefix" "orig,maybe_evex,orig,orig,maybe_evex")
14086    (set_attr "mode" "TI,TI,V4SF,V2SF,V2SF")])
14087
14088 ;; movd instead of movq is required to handle broken assemblers.
14089 (define_insn "vec_concatv2di"
14090   [(set (match_operand:V2DI 0 "register_operand"
14091           "=Yr,*x,x ,v ,Yi,v ,x    ,x,v ,x,x,v")
14092         (vec_concat:V2DI
14093           (match_operand:DI 1 "nonimmediate_operand"
14094           "  0, 0,x ,Yv,r ,vm,?!*Yn,0,Yv,0,0,v")
14095           (match_operand:DI 2 "vector_move_operand"
14096           " rm,rm,rm,rm,C ,C ,C ,x,Yv,x,m,m")))]
14097   "TARGET_SSE"
14098   "@
14099    pinsrq\t{$1, %2, %0|%0, %2, 1}
14100    pinsrq\t{$1, %2, %0|%0, %2, 1}
14101    vpinsrq\t{$1, %2, %1, %0|%0, %1, %2, 1}
14102    vpinsrq\t{$1, %2, %1, %0|%0, %1, %2, 1}
14103    * return HAVE_AS_IX86_INTERUNIT_MOVQ ? \"%vmovq\t{%1, %0|%0, %1}\" : \"%vmovd\t{%1, %0|%0, %1}\";
14104    %vmovq\t{%1, %0|%0, %1}
14105    movq2dq\t{%1, %0|%0, %1}
14106    punpcklqdq\t{%2, %0|%0, %2}
14107    vpunpcklqdq\t{%2, %1, %0|%0, %1, %2}
14108    movlhps\t{%2, %0|%0, %2}
14109    movhps\t{%2, %0|%0, %2}
14110    vmovhps\t{%2, %1, %0|%0, %1, %2}"
14111   [(set (attr "isa")
14112      (cond [(eq_attr "alternative" "0,1")
14113               (const_string "x64_sse4_noavx")
14114             (eq_attr "alternative" "2")
14115               (const_string "x64_avx")
14116             (eq_attr "alternative" "3")
14117               (const_string "x64_avx512dq")
14118             (eq_attr "alternative" "4")
14119               (const_string "x64")
14120             (eq_attr "alternative" "5,6")
14121               (const_string "sse2")
14122             (eq_attr "alternative" "7")
14123               (const_string "sse2_noavx")
14124             (eq_attr "alternative" "8,11")
14125               (const_string "avx")
14126            ]
14127            (const_string "noavx")))
14128    (set (attr "type")
14129      (if_then_else
14130        (eq_attr "alternative" "0,1,2,3,7,8")
14131        (const_string "sselog")
14132        (const_string "ssemov")))
14133    (set (attr "prefix_rex")
14134      (if_then_else (eq_attr "alternative" "0,1,2,3,4")
14135                    (const_string "1")
14136                    (const_string "*")))
14137    (set (attr "prefix_extra")
14138      (if_then_else (eq_attr "alternative" "0,1,2,3")
14139                    (const_string "1")
14140                    (const_string "*")))
14141    (set (attr "length_immediate")
14142      (if_then_else (eq_attr "alternative" "0,1,2,3")
14143                    (const_string "1")
14144                    (const_string "*")))
14145    (set (attr "prefix")
14146      (cond [(eq_attr "alternative" "2")
14147               (const_string "vex")
14148             (eq_attr "alternative" "3")
14149               (const_string "evex")
14150             (eq_attr "alternative" "4,5")
14151               (const_string "maybe_vex")
14152             (eq_attr "alternative" "8,11")
14153               (const_string "maybe_evex")
14154            ]
14155            (const_string "orig")))
14156    (set_attr "mode" "TI,TI,TI,TI,TI,TI,TI,TI,TI,V4SF,V2SF,V2SF")])
14157
14158 ;; vmovq clears also the higher bits.
14159 (define_insn "vec_set<mode>_0"
14160   [(set (match_operand:VI8_AVX_AVX512F 0 "register_operand" "=Yi,v")
14161         (vec_merge:VI8_AVX_AVX512F
14162           (vec_duplicate:VI8_AVX_AVX512F
14163             (match_operand:<ssescalarmode> 2 "general_operand" "r,vm"))
14164           (match_operand:VI8_AVX_AVX512F 1 "const0_operand" "C,C")
14165           (const_int 1)))]
14166   "TARGET_AVX"
14167   "vmovq\t{%2, %x0|%x0, %2}"
14168   [(set_attr "isa" "x64,*")
14169    (set_attr "type" "ssemov")
14170    (set_attr "prefix_rex" "1,*")
14171    (set_attr "prefix" "maybe_evex")
14172    (set_attr "mode" "TI")])
14173
14174 (define_expand "vec_unpacks_lo_<mode>"
14175   [(match_operand:<sseunpackmode> 0 "register_operand")
14176    (match_operand:VI124_AVX2_24_AVX512F_1_AVX512BW 1 "register_operand")]
14177   "TARGET_SSE2"
14178   "ix86_expand_sse_unpack (operands[0], operands[1], false, false); DONE;")
14179
14180 (define_expand "vec_unpacks_hi_<mode>"
14181   [(match_operand:<sseunpackmode> 0 "register_operand")
14182    (match_operand:VI124_AVX2_24_AVX512F_1_AVX512BW 1 "register_operand")]
14183   "TARGET_SSE2"
14184   "ix86_expand_sse_unpack (operands[0], operands[1], false, true); DONE;")
14185
14186 (define_expand "vec_unpacku_lo_<mode>"
14187   [(match_operand:<sseunpackmode> 0 "register_operand")
14188    (match_operand:VI124_AVX2_24_AVX512F_1_AVX512BW 1 "register_operand")]
14189   "TARGET_SSE2"
14190   "ix86_expand_sse_unpack (operands[0], operands[1], true, false); DONE;")
14191
14192 (define_expand "vec_unpacks_lo_hi"
14193   [(set (subreg:HI (match_operand:QI 0 "register_operand") 0)
14194         (match_operand:HI 1 "register_operand"))]
14195   "TARGET_AVX512F")
14196
14197 (define_expand "vec_unpacks_lo_si"
14198   [(set (match_operand:HI 0 "register_operand")
14199         (subreg:HI (match_operand:SI 1 "register_operand") 0))]
14200   "TARGET_AVX512F")
14201
14202 (define_expand "vec_unpacks_lo_di"
14203   [(set (match_operand:SI 0 "register_operand")
14204         (subreg:SI (match_operand:DI 1 "register_operand") 0))]
14205   "TARGET_AVX512BW")
14206
14207 (define_expand "vec_unpacku_hi_<mode>"
14208   [(match_operand:<sseunpackmode> 0 "register_operand")
14209    (match_operand:VI124_AVX2_24_AVX512F_1_AVX512BW 1 "register_operand")]
14210   "TARGET_SSE2"
14211   "ix86_expand_sse_unpack (operands[0], operands[1], true, true); DONE;")
14212
14213 (define_expand "vec_unpacks_hi_hi"
14214   [(parallel
14215      [(set (subreg:HI (match_operand:QI 0 "register_operand") 0)
14216            (lshiftrt:HI (match_operand:HI 1 "register_operand")
14217                         (const_int 8)))
14218       (unspec [(const_int 0)] UNSPEC_MASKOP)])]
14219   "TARGET_AVX512F")
14220
14221 (define_expand "vec_unpacks_hi_<mode>"
14222   [(parallel
14223      [(set (subreg:SWI48x
14224              (match_operand:<HALFMASKMODE> 0 "register_operand") 0)
14225            (lshiftrt:SWI48x (match_operand:SWI48x 1 "register_operand")
14226                             (match_dup 2)))
14227       (unspec [(const_int 0)] UNSPEC_MASKOP)])]
14228   "TARGET_AVX512BW"
14229   "operands[2] = GEN_INT (GET_MODE_BITSIZE (<HALFMASKMODE>mode));")
14230
14231 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14232 ;;
14233 ;; Miscellaneous
14234 ;;
14235 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14236
14237 (define_expand "<sse2_avx2>_uavg<mode>3<mask_name>"
14238   [(set (match_operand:VI12_AVX2 0 "register_operand")
14239         (truncate:VI12_AVX2
14240           (lshiftrt:<ssedoublemode>
14241             (plus:<ssedoublemode>
14242               (plus:<ssedoublemode>
14243                 (zero_extend:<ssedoublemode>
14244                   (match_operand:VI12_AVX2 1 "vector_operand"))
14245                 (zero_extend:<ssedoublemode>
14246                   (match_operand:VI12_AVX2 2 "vector_operand")))
14247               (match_dup <mask_expand_op3>))
14248             (const_int 1))))]
14249   "TARGET_SSE2 && <mask_mode512bit_condition> && <mask_avx512bw_condition>"
14250 {
14251   rtx tmp;
14252   if (<mask_applied>)
14253     tmp = operands[3];
14254   operands[3] = CONST1_RTX(<MODE>mode);
14255   ix86_fixup_binary_operands_no_copy (PLUS, <MODE>mode, operands);
14256
14257   if (<mask_applied>)
14258     {
14259       operands[5] = operands[3];
14260       operands[3] = tmp;
14261     }
14262 })
14263
14264 (define_insn "*<sse2_avx2>_uavg<mode>3<mask_name>"
14265   [(set (match_operand:VI12_AVX2 0 "register_operand" "=x,v")
14266         (truncate:VI12_AVX2
14267           (lshiftrt:<ssedoublemode>
14268             (plus:<ssedoublemode>
14269               (plus:<ssedoublemode>
14270                 (zero_extend:<ssedoublemode>
14271                   (match_operand:VI12_AVX2 1 "vector_operand" "%0,v"))
14272                 (zero_extend:<ssedoublemode>
14273                   (match_operand:VI12_AVX2 2 "vector_operand" "xBm,vm")))
14274               (match_operand:VI12_AVX2 <mask_expand_op3> "const1_operand"))
14275             (const_int 1))))]
14276   "TARGET_SSE2 && <mask_mode512bit_condition> && <mask_avx512bw_condition>
14277    && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
14278   "@
14279    pavg<ssemodesuffix>\t{%2, %0|%0, %2}
14280    vpavg<ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
14281   [(set_attr "isa" "noavx,avx")
14282    (set_attr "type" "sseiadd")
14283    (set_attr "prefix_data16" "1,*")
14284    (set_attr "prefix" "orig,<mask_prefix>")
14285    (set_attr "mode" "<sseinsnmode>")])
14286
14287 ;; The correct representation for this is absolutely enormous, and
14288 ;; surely not generally useful.
14289 (define_insn "<sse2_avx2>_psadbw"
14290   [(set (match_operand:VI8_AVX2_AVX512BW 0 "register_operand" "=x,v")
14291         (unspec:VI8_AVX2_AVX512BW
14292           [(match_operand:<ssebytemode> 1 "register_operand" "0,v")
14293            (match_operand:<ssebytemode> 2 "vector_operand" "xBm,vm")]
14294           UNSPEC_PSADBW))]
14295   "TARGET_SSE2"
14296   "@
14297    psadbw\t{%2, %0|%0, %2}
14298    vpsadbw\t{%2, %1, %0|%0, %1, %2}"
14299   [(set_attr "isa" "noavx,avx")
14300    (set_attr "type" "sseiadd")
14301    (set_attr "atom_unit" "simul")
14302    (set_attr "prefix_data16" "1,*")
14303    (set_attr "prefix" "orig,maybe_evex")
14304    (set_attr "mode" "<sseinsnmode>")])
14305
14306 (define_insn "<sse>_movmsk<ssemodesuffix><avxsizesuffix>"
14307   [(set (match_operand:SI 0 "register_operand" "=r")
14308         (unspec:SI
14309           [(match_operand:VF_128_256 1 "register_operand" "x")]
14310           UNSPEC_MOVMSK))]
14311   "TARGET_SSE"
14312   "%vmovmsk<ssemodesuffix>\t{%1, %0|%0, %1}"
14313   [(set_attr "type" "ssemov")
14314    (set_attr "prefix" "maybe_vex")
14315    (set_attr "mode" "<MODE>")])
14316
14317 (define_insn "*<sse>_movmsk<ssemodesuffix><avxsizesuffix>_zext"
14318   [(set (match_operand:DI 0 "register_operand" "=r")
14319         (zero_extend:DI
14320           (unspec:SI
14321             [(match_operand:VF_128_256 1 "register_operand" "x")]
14322             UNSPEC_MOVMSK)))]
14323   "TARGET_64BIT && TARGET_SSE"
14324   "%vmovmsk<ssemodesuffix>\t{%1, %k0|%k0, %1}"
14325   [(set_attr "type" "ssemov")
14326    (set_attr "prefix" "maybe_vex")
14327    (set_attr "mode" "<MODE>")])
14328
14329 (define_insn "<sse2_avx2>_pmovmskb"
14330   [(set (match_operand:SI 0 "register_operand" "=r")
14331         (unspec:SI
14332           [(match_operand:VI1_AVX2 1 "register_operand" "x")]
14333           UNSPEC_MOVMSK))]
14334   "TARGET_SSE2"
14335   "%vpmovmskb\t{%1, %0|%0, %1}"
14336   [(set_attr "type" "ssemov")
14337    (set (attr "prefix_data16")
14338      (if_then_else
14339        (match_test "TARGET_AVX")
14340      (const_string "*")
14341      (const_string "1")))
14342    (set_attr "prefix" "maybe_vex")
14343    (set_attr "mode" "SI")])
14344
14345 (define_insn "*<sse2_avx2>_pmovmskb_zext"
14346   [(set (match_operand:DI 0 "register_operand" "=r")
14347         (zero_extend:DI
14348           (unspec:SI
14349             [(match_operand:VI1_AVX2 1 "register_operand" "x")]
14350             UNSPEC_MOVMSK)))]
14351   "TARGET_64BIT && TARGET_SSE2"
14352   "%vpmovmskb\t{%1, %k0|%k0, %1}"
14353   [(set_attr "type" "ssemov")
14354    (set (attr "prefix_data16")
14355      (if_then_else
14356        (match_test "TARGET_AVX")
14357      (const_string "*")
14358      (const_string "1")))
14359    (set_attr "prefix" "maybe_vex")
14360    (set_attr "mode" "SI")])
14361
14362 (define_expand "sse2_maskmovdqu"
14363   [(set (match_operand:V16QI 0 "memory_operand")
14364         (unspec:V16QI [(match_operand:V16QI 1 "register_operand")
14365                        (match_operand:V16QI 2 "register_operand")
14366                        (match_dup 0)]
14367                       UNSPEC_MASKMOV))]
14368   "TARGET_SSE2")
14369
14370 (define_insn "*sse2_maskmovdqu"
14371   [(set (mem:V16QI (match_operand:P 0 "register_operand" "D"))
14372         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "x")
14373                        (match_operand:V16QI 2 "register_operand" "x")
14374                        (mem:V16QI (match_dup 0))]
14375                       UNSPEC_MASKMOV))]
14376   "TARGET_SSE2"
14377 {
14378   /* We can't use %^ here due to ASM_OUTPUT_OPCODE processing
14379      that requires %v to be at the beginning of the opcode name.  */
14380   if (Pmode != word_mode)
14381     fputs ("\taddr32", asm_out_file);
14382   return "%vmaskmovdqu\t{%2, %1|%1, %2}";
14383 }
14384   [(set_attr "type" "ssemov")
14385    (set_attr "prefix_data16" "1")
14386    (set (attr "length_address")
14387      (symbol_ref ("Pmode != word_mode")))
14388    ;; The implicit %rdi operand confuses default length_vex computation.
14389    (set (attr "length_vex")
14390      (symbol_ref ("3 + REX_SSE_REGNO_P (REGNO (operands[2]))")))
14391    (set_attr "prefix" "maybe_vex")
14392    (set_attr "znver1_decode" "vector")
14393    (set_attr "mode" "TI")])
14394
14395 (define_insn "sse_ldmxcsr"
14396   [(unspec_volatile [(match_operand:SI 0 "memory_operand" "m")]
14397                     UNSPECV_LDMXCSR)]
14398   "TARGET_SSE"
14399   "%vldmxcsr\t%0"
14400   [(set_attr "type" "sse")
14401    (set_attr "atom_sse_attr" "mxcsr")
14402    (set_attr "prefix" "maybe_vex")
14403    (set_attr "memory" "load")])
14404
14405 (define_insn "sse_stmxcsr"
14406   [(set (match_operand:SI 0 "memory_operand" "=m")
14407         (unspec_volatile:SI [(const_int 0)] UNSPECV_STMXCSR))]
14408   "TARGET_SSE"
14409   "%vstmxcsr\t%0"
14410   [(set_attr "type" "sse")
14411    (set_attr "atom_sse_attr" "mxcsr")
14412    (set_attr "prefix" "maybe_vex")
14413    (set_attr "memory" "store")])
14414
14415 (define_insn "sse2_clflush"
14416   [(unspec_volatile [(match_operand 0 "address_operand" "p")]
14417                     UNSPECV_CLFLUSH)]
14418   "TARGET_SSE2"
14419   "clflush\t%a0"
14420   [(set_attr "type" "sse")
14421    (set_attr "atom_sse_attr" "fence")
14422    (set_attr "memory" "unknown")])
14423
14424 ;; As per AMD and Intel ISA manuals, the first operand is extensions
14425 ;; and it goes to %ecx. The second operand received is hints and it goes
14426 ;; to %eax.
14427 (define_insn "sse3_mwait"
14428   [(unspec_volatile [(match_operand:SI 0 "register_operand" "c")
14429                      (match_operand:SI 1 "register_operand" "a")]
14430                     UNSPECV_MWAIT)]
14431   "TARGET_SSE3"
14432 ;; 64bit version is "mwait %rax,%rcx". But only lower 32bits are used.
14433 ;; Since 32bit register operands are implicitly zero extended to 64bit,
14434 ;; we only need to set up 32bit registers.
14435   "mwait"
14436   [(set_attr "length" "3")])
14437
14438 (define_insn "sse3_monitor_<mode>"
14439   [(unspec_volatile [(match_operand:P 0 "register_operand" "a")
14440                      (match_operand:SI 1 "register_operand" "c")
14441                      (match_operand:SI 2 "register_operand" "d")]
14442                     UNSPECV_MONITOR)]
14443   "TARGET_SSE3"
14444 ;; 64bit version is "monitor %rax,%rcx,%rdx". But only lower 32bits in
14445 ;; RCX and RDX are used.  Since 32bit register operands are implicitly
14446 ;; zero extended to 64bit, we only need to set up 32bit registers.
14447   "%^monitor"
14448   [(set (attr "length")
14449      (symbol_ref ("(Pmode != word_mode) + 3")))])
14450
14451 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14452 ;;
14453 ;; SSSE3 instructions
14454 ;;
14455 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14456
14457 (define_code_iterator ssse3_plusminus [plus ss_plus minus ss_minus])
14458
14459 (define_insn "avx2_ph<plusminus_mnemonic>wv16hi3"
14460   [(set (match_operand:V16HI 0 "register_operand" "=x")
14461         (vec_concat:V16HI
14462           (vec_concat:V8HI
14463             (vec_concat:V4HI
14464               (vec_concat:V2HI
14465                 (ssse3_plusminus:HI
14466                   (vec_select:HI
14467                     (match_operand:V16HI 1 "register_operand" "x")
14468                     (parallel [(const_int 0)]))
14469                   (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
14470                 (ssse3_plusminus:HI
14471                   (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
14472                   (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
14473               (vec_concat:V2HI
14474                 (ssse3_plusminus:HI
14475                   (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
14476                   (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
14477                 (ssse3_plusminus:HI
14478                   (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
14479                   (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
14480             (vec_concat:V4HI
14481               (vec_concat:V2HI
14482                 (ssse3_plusminus:HI
14483                   (vec_select:HI (match_dup 1) (parallel [(const_int 8)]))
14484                   (vec_select:HI (match_dup 1) (parallel [(const_int 9)])))
14485                 (ssse3_plusminus:HI
14486                   (vec_select:HI (match_dup 1) (parallel [(const_int 10)]))
14487                   (vec_select:HI (match_dup 1) (parallel [(const_int 11)]))))
14488               (vec_concat:V2HI
14489                 (ssse3_plusminus:HI
14490                   (vec_select:HI (match_dup 1) (parallel [(const_int 12)]))
14491                   (vec_select:HI (match_dup 1) (parallel [(const_int 13)])))
14492                 (ssse3_plusminus:HI
14493                   (vec_select:HI (match_dup 1) (parallel [(const_int 14)]))
14494                   (vec_select:HI (match_dup 1) (parallel [(const_int 15)]))))))
14495           (vec_concat:V8HI
14496             (vec_concat:V4HI
14497               (vec_concat:V2HI
14498                 (ssse3_plusminus:HI
14499                   (vec_select:HI
14500                     (match_operand:V16HI 2 "nonimmediate_operand" "xm")
14501                     (parallel [(const_int 0)]))
14502                   (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
14503                 (ssse3_plusminus:HI
14504                   (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
14505                   (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
14506               (vec_concat:V2HI
14507                 (ssse3_plusminus:HI
14508                   (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
14509                   (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
14510                 (ssse3_plusminus:HI
14511                   (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
14512                   (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))
14513             (vec_concat:V4HI
14514               (vec_concat:V2HI
14515                 (ssse3_plusminus:HI
14516                   (vec_select:HI (match_dup 2) (parallel [(const_int 8)]))
14517                   (vec_select:HI (match_dup 2) (parallel [(const_int 9)])))
14518                 (ssse3_plusminus:HI
14519                   (vec_select:HI (match_dup 2) (parallel [(const_int 10)]))
14520                   (vec_select:HI (match_dup 2) (parallel [(const_int 11)]))))
14521               (vec_concat:V2HI
14522                 (ssse3_plusminus:HI
14523                   (vec_select:HI (match_dup 2) (parallel [(const_int 12)]))
14524                   (vec_select:HI (match_dup 2) (parallel [(const_int 13)])))
14525                 (ssse3_plusminus:HI
14526                   (vec_select:HI (match_dup 2) (parallel [(const_int 14)]))
14527                   (vec_select:HI (match_dup 2) (parallel [(const_int 15)]))))))))]
14528   "TARGET_AVX2"
14529   "vph<plusminus_mnemonic>w\t{%2, %1, %0|%0, %1, %2}"
14530   [(set_attr "type" "sseiadd")
14531    (set_attr "prefix_extra" "1")
14532    (set_attr "prefix" "vex")
14533    (set_attr "mode" "OI")])
14534
14535 (define_insn "ssse3_ph<plusminus_mnemonic>wv8hi3"
14536   [(set (match_operand:V8HI 0 "register_operand" "=x,x")
14537         (vec_concat:V8HI
14538           (vec_concat:V4HI
14539             (vec_concat:V2HI
14540               (ssse3_plusminus:HI
14541                 (vec_select:HI
14542                   (match_operand:V8HI 1 "register_operand" "0,x")
14543                   (parallel [(const_int 0)]))
14544                 (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
14545               (ssse3_plusminus:HI
14546                 (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
14547                 (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
14548             (vec_concat:V2HI
14549               (ssse3_plusminus:HI
14550                 (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
14551                 (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
14552               (ssse3_plusminus:HI
14553                 (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
14554                 (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
14555           (vec_concat:V4HI
14556             (vec_concat:V2HI
14557               (ssse3_plusminus:HI
14558                 (vec_select:HI
14559                   (match_operand:V8HI 2 "vector_operand" "xBm,xm")
14560                   (parallel [(const_int 0)]))
14561                 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
14562               (ssse3_plusminus:HI
14563                 (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
14564                 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
14565             (vec_concat:V2HI
14566               (ssse3_plusminus:HI
14567                 (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
14568                 (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
14569               (ssse3_plusminus:HI
14570                 (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
14571                 (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))))]
14572   "TARGET_SSSE3"
14573   "@
14574    ph<plusminus_mnemonic>w\t{%2, %0|%0, %2}
14575    vph<plusminus_mnemonic>w\t{%2, %1, %0|%0, %1, %2}"
14576   [(set_attr "isa" "noavx,avx")
14577    (set_attr "type" "sseiadd")
14578    (set_attr "atom_unit" "complex")
14579    (set_attr "prefix_data16" "1,*")
14580    (set_attr "prefix_extra" "1")
14581    (set_attr "prefix" "orig,vex")
14582    (set_attr "mode" "TI")])
14583
14584 (define_insn "ssse3_ph<plusminus_mnemonic>wv4hi3"
14585   [(set (match_operand:V4HI 0 "register_operand" "=y")
14586         (vec_concat:V4HI
14587           (vec_concat:V2HI
14588             (ssse3_plusminus:HI
14589               (vec_select:HI
14590                 (match_operand:V4HI 1 "register_operand" "0")
14591                 (parallel [(const_int 0)]))
14592               (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
14593             (ssse3_plusminus:HI
14594               (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
14595               (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
14596           (vec_concat:V2HI
14597             (ssse3_plusminus:HI
14598               (vec_select:HI
14599                 (match_operand:V4HI 2 "nonimmediate_operand" "ym")
14600                 (parallel [(const_int 0)]))
14601               (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
14602             (ssse3_plusminus:HI
14603               (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
14604               (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))))]
14605   "TARGET_SSSE3"
14606   "ph<plusminus_mnemonic>w\t{%2, %0|%0, %2}"
14607   [(set_attr "type" "sseiadd")
14608    (set_attr "atom_unit" "complex")
14609    (set_attr "prefix_extra" "1")
14610    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
14611    (set_attr "mode" "DI")])
14612
14613 (define_insn "avx2_ph<plusminus_mnemonic>dv8si3"
14614   [(set (match_operand:V8SI 0 "register_operand" "=x")
14615         (vec_concat:V8SI
14616           (vec_concat:V4SI
14617             (vec_concat:V2SI
14618               (plusminus:SI
14619                 (vec_select:SI
14620                   (match_operand:V8SI 1 "register_operand" "x")
14621                   (parallel [(const_int 0)]))
14622                 (vec_select:SI (match_dup 1) (parallel [(const_int 1)])))
14623               (plusminus:SI
14624                 (vec_select:SI (match_dup 1) (parallel [(const_int 2)]))
14625                 (vec_select:SI (match_dup 1) (parallel [(const_int 3)]))))
14626             (vec_concat:V2SI
14627               (plusminus:SI
14628                 (vec_select:SI (match_dup 1) (parallel [(const_int 4)]))
14629                 (vec_select:SI (match_dup 1) (parallel [(const_int 5)])))
14630               (plusminus:SI
14631                 (vec_select:SI (match_dup 1) (parallel [(const_int 6)]))
14632                 (vec_select:SI (match_dup 1) (parallel [(const_int 7)])))))
14633           (vec_concat:V4SI
14634             (vec_concat:V2SI
14635               (plusminus:SI
14636                 (vec_select:SI
14637                   (match_operand:V8SI 2 "nonimmediate_operand" "xm")
14638                   (parallel [(const_int 0)]))
14639                 (vec_select:SI (match_dup 2) (parallel [(const_int 1)])))
14640               (plusminus:SI
14641                 (vec_select:SI (match_dup 2) (parallel [(const_int 2)]))
14642                 (vec_select:SI (match_dup 2) (parallel [(const_int 3)]))))
14643             (vec_concat:V2SI
14644               (plusminus:SI
14645                 (vec_select:SI (match_dup 2) (parallel [(const_int 4)]))
14646                 (vec_select:SI (match_dup 2) (parallel [(const_int 5)])))
14647               (plusminus:SI
14648                 (vec_select:SI (match_dup 2) (parallel [(const_int 6)]))
14649                 (vec_select:SI (match_dup 2) (parallel [(const_int 7)])))))))]
14650   "TARGET_AVX2"
14651   "vph<plusminus_mnemonic>d\t{%2, %1, %0|%0, %1, %2}"
14652   [(set_attr "type" "sseiadd")
14653    (set_attr "prefix_extra" "1")
14654    (set_attr "prefix" "vex")
14655    (set_attr "mode" "OI")])
14656
14657 (define_insn "ssse3_ph<plusminus_mnemonic>dv4si3"
14658   [(set (match_operand:V4SI 0 "register_operand" "=x,x")
14659         (vec_concat:V4SI
14660           (vec_concat:V2SI
14661             (plusminus:SI
14662               (vec_select:SI
14663                 (match_operand:V4SI 1 "register_operand" "0,x")
14664                 (parallel [(const_int 0)]))
14665               (vec_select:SI (match_dup 1) (parallel [(const_int 1)])))
14666             (plusminus:SI
14667               (vec_select:SI (match_dup 1) (parallel [(const_int 2)]))
14668               (vec_select:SI (match_dup 1) (parallel [(const_int 3)]))))
14669           (vec_concat:V2SI
14670             (plusminus:SI
14671               (vec_select:SI
14672                 (match_operand:V4SI 2 "vector_operand" "xBm,xm")
14673                 (parallel [(const_int 0)]))
14674               (vec_select:SI (match_dup 2) (parallel [(const_int 1)])))
14675             (plusminus:SI
14676               (vec_select:SI (match_dup 2) (parallel [(const_int 2)]))
14677               (vec_select:SI (match_dup 2) (parallel [(const_int 3)]))))))]
14678   "TARGET_SSSE3"
14679   "@
14680    ph<plusminus_mnemonic>d\t{%2, %0|%0, %2}
14681    vph<plusminus_mnemonic>d\t{%2, %1, %0|%0, %1, %2}"
14682   [(set_attr "isa" "noavx,avx")
14683    (set_attr "type" "sseiadd")
14684    (set_attr "atom_unit" "complex")
14685    (set_attr "prefix_data16" "1,*")
14686    (set_attr "prefix_extra" "1")
14687    (set_attr "prefix" "orig,vex")
14688    (set_attr "mode" "TI")])
14689
14690 (define_insn "ssse3_ph<plusminus_mnemonic>dv2si3"
14691   [(set (match_operand:V2SI 0 "register_operand" "=y")
14692         (vec_concat:V2SI
14693           (plusminus:SI
14694             (vec_select:SI
14695               (match_operand:V2SI 1 "register_operand" "0")
14696               (parallel [(const_int 0)]))
14697             (vec_select:SI (match_dup 1) (parallel [(const_int 1)])))
14698           (plusminus:SI
14699             (vec_select:SI
14700               (match_operand:V2SI 2 "nonimmediate_operand" "ym")
14701               (parallel [(const_int 0)]))
14702             (vec_select:SI (match_dup 2) (parallel [(const_int 1)])))))]
14703   "TARGET_SSSE3"
14704   "ph<plusminus_mnemonic>d\t{%2, %0|%0, %2}"
14705   [(set_attr "type" "sseiadd")
14706    (set_attr "atom_unit" "complex")
14707    (set_attr "prefix_extra" "1")
14708    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
14709    (set_attr "mode" "DI")])
14710
14711 (define_insn "avx2_pmaddubsw256"
14712   [(set (match_operand:V16HI 0 "register_operand" "=x,v")
14713         (ss_plus:V16HI
14714           (mult:V16HI
14715             (zero_extend:V16HI
14716               (vec_select:V16QI
14717                 (match_operand:V32QI 1 "register_operand" "x,v")
14718                 (parallel [(const_int 0) (const_int 2)
14719                            (const_int 4) (const_int 6)
14720                            (const_int 8) (const_int 10)
14721                            (const_int 12) (const_int 14)
14722                            (const_int 16) (const_int 18)
14723                            (const_int 20) (const_int 22)
14724                            (const_int 24) (const_int 26)
14725                            (const_int 28) (const_int 30)])))
14726             (sign_extend:V16HI
14727               (vec_select:V16QI
14728                 (match_operand:V32QI 2 "nonimmediate_operand" "xm,vm")
14729                 (parallel [(const_int 0) (const_int 2)
14730                            (const_int 4) (const_int 6)
14731                            (const_int 8) (const_int 10)
14732                            (const_int 12) (const_int 14)
14733                            (const_int 16) (const_int 18)
14734                            (const_int 20) (const_int 22)
14735                            (const_int 24) (const_int 26)
14736                            (const_int 28) (const_int 30)]))))
14737           (mult:V16HI
14738             (zero_extend:V16HI
14739               (vec_select:V16QI (match_dup 1)
14740                 (parallel [(const_int 1) (const_int 3)
14741                            (const_int 5) (const_int 7)
14742                            (const_int 9) (const_int 11)
14743                            (const_int 13) (const_int 15)
14744                            (const_int 17) (const_int 19)
14745                            (const_int 21) (const_int 23)
14746                            (const_int 25) (const_int 27)
14747                            (const_int 29) (const_int 31)])))
14748             (sign_extend:V16HI
14749               (vec_select:V16QI (match_dup 2)
14750                 (parallel [(const_int 1) (const_int 3)
14751                            (const_int 5) (const_int 7)
14752                            (const_int 9) (const_int 11)
14753                            (const_int 13) (const_int 15)
14754                            (const_int 17) (const_int 19)
14755                            (const_int 21) (const_int 23)
14756                            (const_int 25) (const_int 27)
14757                            (const_int 29) (const_int 31)]))))))]
14758   "TARGET_AVX2"
14759   "vpmaddubsw\t{%2, %1, %0|%0, %1, %2}"
14760   [(set_attr "isa" "*,avx512bw")
14761    (set_attr "type" "sseiadd")
14762    (set_attr "prefix_extra" "1")
14763    (set_attr "prefix" "vex,evex")
14764    (set_attr "mode" "OI")])
14765
14766 ;; The correct representation for this is absolutely enormous, and
14767 ;; surely not generally useful.
14768 (define_insn "avx512bw_pmaddubsw512<mode><mask_name>"
14769   [(set (match_operand:VI2_AVX512VL 0 "register_operand" "=v")
14770           (unspec:VI2_AVX512VL
14771             [(match_operand:<dbpsadbwmode> 1 "register_operand" "v")
14772              (match_operand:<dbpsadbwmode> 2 "nonimmediate_operand" "vm")]
14773              UNSPEC_PMADDUBSW512))]
14774    "TARGET_AVX512BW"
14775    "vpmaddubsw\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}";
14776   [(set_attr "type" "sseiadd")
14777    (set_attr "prefix" "evex")
14778    (set_attr "mode" "XI")])
14779
14780 (define_insn "avx512bw_umulhrswv32hi3<mask_name>"
14781   [(set (match_operand:V32HI 0 "register_operand" "=v")
14782         (truncate:V32HI
14783           (lshiftrt:V32SI
14784             (plus:V32SI
14785               (lshiftrt:V32SI
14786                 (mult:V32SI
14787                   (sign_extend:V32SI
14788                     (match_operand:V32HI 1 "nonimmediate_operand" "%v"))
14789                   (sign_extend:V32SI
14790                     (match_operand:V32HI 2 "nonimmediate_operand" "vm")))
14791                 (const_int 14))
14792               (const_vector:V32HI [(const_int 1) (const_int 1)
14793                                    (const_int 1) (const_int 1)
14794                                    (const_int 1) (const_int 1)
14795                                    (const_int 1) (const_int 1)
14796                                    (const_int 1) (const_int 1)
14797                                    (const_int 1) (const_int 1)
14798                                    (const_int 1) (const_int 1)
14799                                    (const_int 1) (const_int 1)
14800                                    (const_int 1) (const_int 1)
14801                                    (const_int 1) (const_int 1)
14802                                    (const_int 1) (const_int 1)
14803                                    (const_int 1) (const_int 1)
14804                                    (const_int 1) (const_int 1)
14805                                    (const_int 1) (const_int 1)
14806                                    (const_int 1) (const_int 1)
14807                                    (const_int 1) (const_int 1)]))
14808             (const_int 1))))]
14809   "TARGET_AVX512BW"
14810   "vpmulhrsw\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
14811   [(set_attr "type" "sseimul")
14812    (set_attr "prefix" "evex")
14813    (set_attr "mode" "XI")])
14814
14815 (define_insn "ssse3_pmaddubsw128"
14816   [(set (match_operand:V8HI 0 "register_operand" "=x,x,v")
14817         (ss_plus:V8HI
14818           (mult:V8HI
14819             (zero_extend:V8HI
14820               (vec_select:V8QI
14821                 (match_operand:V16QI 1 "register_operand" "0,x,v")
14822                 (parallel [(const_int 0) (const_int 2)
14823                            (const_int 4) (const_int 6)
14824                            (const_int 8) (const_int 10)
14825                            (const_int 12) (const_int 14)])))
14826             (sign_extend:V8HI
14827               (vec_select:V8QI
14828                 (match_operand:V16QI 2 "vector_operand" "xBm,xm,vm")
14829                 (parallel [(const_int 0) (const_int 2)
14830                            (const_int 4) (const_int 6)
14831                            (const_int 8) (const_int 10)
14832                            (const_int 12) (const_int 14)]))))
14833           (mult:V8HI
14834             (zero_extend:V8HI
14835               (vec_select:V8QI (match_dup 1)
14836                 (parallel [(const_int 1) (const_int 3)
14837                            (const_int 5) (const_int 7)
14838                            (const_int 9) (const_int 11)
14839                            (const_int 13) (const_int 15)])))
14840             (sign_extend:V8HI
14841               (vec_select:V8QI (match_dup 2)
14842                 (parallel [(const_int 1) (const_int 3)
14843                            (const_int 5) (const_int 7)
14844                            (const_int 9) (const_int 11)
14845                            (const_int 13) (const_int 15)]))))))]
14846   "TARGET_SSSE3"
14847   "@
14848    pmaddubsw\t{%2, %0|%0, %2}
14849    vpmaddubsw\t{%2, %1, %0|%0, %1, %2}
14850    vpmaddubsw\t{%2, %1, %0|%0, %1, %2}"
14851   [(set_attr "isa" "noavx,avx,avx512bw")
14852    (set_attr "type" "sseiadd")
14853    (set_attr "atom_unit" "simul")
14854    (set_attr "prefix_data16" "1,*,*")
14855    (set_attr "prefix_extra" "1")
14856    (set_attr "prefix" "orig,vex,evex")
14857    (set_attr "mode" "TI")])
14858
14859 (define_insn "ssse3_pmaddubsw"
14860   [(set (match_operand:V4HI 0 "register_operand" "=y")
14861         (ss_plus:V4HI
14862           (mult:V4HI
14863             (zero_extend:V4HI
14864               (vec_select:V4QI
14865                 (match_operand:V8QI 1 "register_operand" "0")
14866                 (parallel [(const_int 0) (const_int 2)
14867                            (const_int 4) (const_int 6)])))
14868             (sign_extend:V4HI
14869               (vec_select:V4QI
14870                 (match_operand:V8QI 2 "nonimmediate_operand" "ym")
14871                 (parallel [(const_int 0) (const_int 2)
14872                            (const_int 4) (const_int 6)]))))
14873           (mult:V4HI
14874             (zero_extend:V4HI
14875               (vec_select:V4QI (match_dup 1)
14876                 (parallel [(const_int 1) (const_int 3)
14877                            (const_int 5) (const_int 7)])))
14878             (sign_extend:V4HI
14879               (vec_select:V4QI (match_dup 2)
14880                 (parallel [(const_int 1) (const_int 3)
14881                            (const_int 5) (const_int 7)]))))))]
14882   "TARGET_SSSE3"
14883   "pmaddubsw\t{%2, %0|%0, %2}"
14884   [(set_attr "type" "sseiadd")
14885    (set_attr "atom_unit" "simul")
14886    (set_attr "prefix_extra" "1")
14887    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
14888    (set_attr "mode" "DI")])
14889
14890 (define_mode_iterator PMULHRSW
14891   [V4HI V8HI (V16HI "TARGET_AVX2")])
14892
14893 (define_expand "<ssse3_avx2>_pmulhrsw<mode>3_mask"
14894   [(set (match_operand:PMULHRSW 0 "register_operand")
14895         (vec_merge:PMULHRSW
14896           (truncate:PMULHRSW
14897             (lshiftrt:<ssedoublemode>
14898               (plus:<ssedoublemode>
14899                 (lshiftrt:<ssedoublemode>
14900                   (mult:<ssedoublemode>
14901                     (sign_extend:<ssedoublemode>
14902                       (match_operand:PMULHRSW 1 "nonimmediate_operand"))
14903                     (sign_extend:<ssedoublemode>
14904                       (match_operand:PMULHRSW 2 "nonimmediate_operand")))
14905                   (const_int 14))
14906                 (match_dup 5))
14907               (const_int 1)))
14908           (match_operand:PMULHRSW 3 "register_operand")
14909           (match_operand:<avx512fmaskmode> 4 "register_operand")))]
14910   "TARGET_AVX512BW && TARGET_AVX512VL"
14911 {
14912   operands[5] = CONST1_RTX(<MODE>mode);
14913   ix86_fixup_binary_operands_no_copy (MULT, <MODE>mode, operands);
14914 })
14915
14916 (define_expand "<ssse3_avx2>_pmulhrsw<mode>3"
14917   [(set (match_operand:PMULHRSW 0 "register_operand")
14918         (truncate:PMULHRSW
14919           (lshiftrt:<ssedoublemode>
14920             (plus:<ssedoublemode>
14921               (lshiftrt:<ssedoublemode>
14922                 (mult:<ssedoublemode>
14923                   (sign_extend:<ssedoublemode>
14924                     (match_operand:PMULHRSW 1 "nonimmediate_operand"))
14925                   (sign_extend:<ssedoublemode>
14926                     (match_operand:PMULHRSW 2 "nonimmediate_operand")))
14927                 (const_int 14))
14928               (match_dup 3))
14929             (const_int 1))))]
14930   "TARGET_AVX2"
14931 {
14932   operands[3] = CONST1_RTX(<MODE>mode);
14933   ix86_fixup_binary_operands_no_copy (MULT, <MODE>mode, operands);
14934 })
14935
14936 (define_insn "*<ssse3_avx2>_pmulhrsw<mode>3<mask_name>"
14937   [(set (match_operand:VI2_AVX2 0 "register_operand" "=x,x,v")
14938         (truncate:VI2_AVX2
14939           (lshiftrt:<ssedoublemode>
14940             (plus:<ssedoublemode>
14941               (lshiftrt:<ssedoublemode>
14942                 (mult:<ssedoublemode>
14943                   (sign_extend:<ssedoublemode>
14944                     (match_operand:VI2_AVX2 1 "vector_operand" "%0,x,v"))
14945                   (sign_extend:<ssedoublemode>
14946                     (match_operand:VI2_AVX2 2 "vector_operand" "xBm,xm,vm")))
14947                 (const_int 14))
14948               (match_operand:VI2_AVX2 3 "const1_operand"))
14949             (const_int 1))))]
14950   "TARGET_SSSE3 && <mask_mode512bit_condition> && <mask_avx512bw_condition>
14951    && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
14952   "@
14953    pmulhrsw\t{%2, %0|%0, %2}
14954    vpmulhrsw\t{%2, %1, %0<mask_operand4>|%0<mask_operand4>, %1, %2}
14955    vpmulhrsw\t{%2, %1, %0<mask_operand4>|%0<mask_operand4>, %1, %2}"
14956   [(set_attr "isa" "noavx,avx,avx512bw")
14957    (set_attr "type" "sseimul")
14958    (set_attr "prefix_data16" "1,*,*")
14959    (set_attr "prefix_extra" "1")
14960    (set_attr "prefix" "orig,maybe_evex,evex")
14961    (set_attr "mode" "<sseinsnmode>")])
14962
14963 (define_insn "*ssse3_pmulhrswv4hi3"
14964   [(set (match_operand:V4HI 0 "register_operand" "=y")
14965         (truncate:V4HI
14966           (lshiftrt:V4SI
14967             (plus:V4SI
14968               (lshiftrt:V4SI
14969                 (mult:V4SI
14970                   (sign_extend:V4SI
14971                     (match_operand:V4HI 1 "nonimmediate_operand" "%0"))
14972                   (sign_extend:V4SI
14973                     (match_operand:V4HI 2 "nonimmediate_operand" "ym")))
14974                 (const_int 14))
14975               (match_operand:V4HI 3 "const1_operand"))
14976             (const_int 1))))]
14977   "TARGET_SSSE3 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
14978   "pmulhrsw\t{%2, %0|%0, %2}"
14979   [(set_attr "type" "sseimul")
14980    (set_attr "prefix_extra" "1")
14981    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
14982    (set_attr "mode" "DI")])
14983
14984 (define_insn "<ssse3_avx2>_pshufb<mode>3<mask_name>"
14985   [(set (match_operand:VI1_AVX512 0 "register_operand" "=x,x,v")
14986         (unspec:VI1_AVX512
14987           [(match_operand:VI1_AVX512 1 "register_operand" "0,x,v")
14988            (match_operand:VI1_AVX512 2 "vector_operand" "xBm,xm,vm")]
14989           UNSPEC_PSHUFB))]
14990   "TARGET_SSSE3 && <mask_mode512bit_condition> && <mask_avx512bw_condition>"
14991   "@
14992    pshufb\t{%2, %0|%0, %2}
14993    vpshufb\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}
14994    vpshufb\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
14995   [(set_attr "isa" "noavx,avx,avx512bw")
14996    (set_attr "type" "sselog1")
14997    (set_attr "prefix_data16" "1,*,*")
14998    (set_attr "prefix_extra" "1")
14999    (set_attr "prefix" "orig,maybe_evex,evex")
15000    (set_attr "btver2_decode" "vector")
15001    (set_attr "mode" "<sseinsnmode>")])
15002
15003 (define_insn "ssse3_pshufbv8qi3"
15004   [(set (match_operand:V8QI 0 "register_operand" "=y")
15005         (unspec:V8QI [(match_operand:V8QI 1 "register_operand" "0")
15006                       (match_operand:V8QI 2 "nonimmediate_operand" "ym")]
15007                      UNSPEC_PSHUFB))]
15008   "TARGET_SSSE3"
15009   "pshufb\t{%2, %0|%0, %2}";
15010   [(set_attr "type" "sselog1")
15011    (set_attr "prefix_extra" "1")
15012    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
15013    (set_attr "mode" "DI")])
15014
15015 (define_insn "<ssse3_avx2>_psign<mode>3"
15016   [(set (match_operand:VI124_AVX2 0 "register_operand" "=x,x")
15017         (unspec:VI124_AVX2
15018           [(match_operand:VI124_AVX2 1 "register_operand" "0,x")
15019            (match_operand:VI124_AVX2 2 "vector_operand" "xBm,xm")]
15020           UNSPEC_PSIGN))]
15021   "TARGET_SSSE3"
15022   "@
15023    psign<ssemodesuffix>\t{%2, %0|%0, %2}
15024    vpsign<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
15025   [(set_attr "isa" "noavx,avx")
15026    (set_attr "type" "sselog1")
15027    (set_attr "prefix_data16" "1,*")
15028    (set_attr "prefix_extra" "1")
15029    (set_attr "prefix" "orig,vex")
15030    (set_attr "mode" "<sseinsnmode>")])
15031
15032 (define_insn "ssse3_psign<mode>3"
15033   [(set (match_operand:MMXMODEI 0 "register_operand" "=y")
15034         (unspec:MMXMODEI
15035           [(match_operand:MMXMODEI 1 "register_operand" "0")
15036            (match_operand:MMXMODEI 2 "nonimmediate_operand" "ym")]
15037           UNSPEC_PSIGN))]
15038   "TARGET_SSSE3"
15039   "psign<mmxvecsize>\t{%2, %0|%0, %2}";
15040   [(set_attr "type" "sselog1")
15041    (set_attr "prefix_extra" "1")
15042    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
15043    (set_attr "mode" "DI")])
15044
15045 (define_insn "<ssse3_avx2>_palignr<mode>_mask"
15046   [(set (match_operand:VI1_AVX512 0 "register_operand" "=v")
15047         (vec_merge:VI1_AVX512
15048           (unspec:VI1_AVX512
15049             [(match_operand:VI1_AVX512 1 "register_operand" "v")
15050              (match_operand:VI1_AVX512 2 "nonimmediate_operand" "vm")
15051              (match_operand:SI 3 "const_0_to_255_mul_8_operand" "n")]
15052             UNSPEC_PALIGNR)
15053         (match_operand:VI1_AVX512 4 "vector_move_operand" "0C")
15054         (match_operand:<avx512fmaskmode> 5 "register_operand" "Yk")))]
15055   "TARGET_AVX512BW && (<MODE_SIZE> == 64 || TARGET_AVX512VL)"
15056 {
15057   operands[3] = GEN_INT (INTVAL (operands[3]) / 8);
15058   return "vpalignr\t{%3, %2, %1, %0%{%5%}%N4|%0%{%5%}%N4, %1, %2, %3}";
15059 }
15060   [(set_attr "type" "sseishft")
15061    (set_attr "atom_unit" "sishuf")
15062    (set_attr "prefix_extra" "1")
15063    (set_attr "length_immediate" "1")
15064    (set_attr "prefix" "evex")
15065    (set_attr "mode" "<sseinsnmode>")])
15066
15067 (define_insn "<ssse3_avx2>_palignr<mode>"
15068   [(set (match_operand:SSESCALARMODE 0 "register_operand" "=x,x,v")
15069         (unspec:SSESCALARMODE
15070           [(match_operand:SSESCALARMODE 1 "register_operand" "0,x,v")
15071            (match_operand:SSESCALARMODE 2 "vector_operand" "xBm,xm,vm")
15072            (match_operand:SI 3 "const_0_to_255_mul_8_operand" "n,n,n")]
15073           UNSPEC_PALIGNR))]
15074   "TARGET_SSSE3"
15075 {
15076   operands[3] = GEN_INT (INTVAL (operands[3]) / 8);
15077
15078   switch (which_alternative)
15079     {
15080     case 0:
15081       return "palignr\t{%3, %2, %0|%0, %2, %3}";
15082     case 1:
15083     case 2:
15084       return "vpalignr\t{%3, %2, %1, %0|%0, %1, %2, %3}";
15085     default:
15086       gcc_unreachable ();
15087     }
15088 }
15089   [(set_attr "isa" "noavx,avx,avx512bw")
15090    (set_attr "type" "sseishft")
15091    (set_attr "atom_unit" "sishuf")
15092    (set_attr "prefix_data16" "1,*,*")
15093    (set_attr "prefix_extra" "1")
15094    (set_attr "length_immediate" "1")
15095    (set_attr "prefix" "orig,vex,evex")
15096    (set_attr "mode" "<sseinsnmode>")])
15097
15098 (define_insn "ssse3_palignrdi"
15099   [(set (match_operand:DI 0 "register_operand" "=y")
15100         (unspec:DI [(match_operand:DI 1 "register_operand" "0")
15101                     (match_operand:DI 2 "nonimmediate_operand" "ym")
15102                     (match_operand:SI 3 "const_0_to_255_mul_8_operand" "n")]
15103                    UNSPEC_PALIGNR))]
15104   "TARGET_SSSE3"
15105 {
15106   operands[3] = GEN_INT (INTVAL (operands[3]) / 8);
15107   return "palignr\t{%3, %2, %0|%0, %2, %3}";
15108 }
15109   [(set_attr "type" "sseishft")
15110    (set_attr "atom_unit" "sishuf")
15111    (set_attr "prefix_extra" "1")
15112    (set_attr "length_immediate" "1")
15113    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
15114    (set_attr "mode" "DI")])
15115
15116 ;; Mode iterator to handle singularity w/ absence of V2DI and V4DI
15117 ;; modes for abs instruction on pre AVX-512 targets.
15118 (define_mode_iterator VI1248_AVX512VL_AVX512BW
15119   [(V64QI "TARGET_AVX512BW") (V32QI "TARGET_AVX2") V16QI
15120    (V32HI "TARGET_AVX512BW") (V16HI "TARGET_AVX2") V8HI
15121    (V16SI "TARGET_AVX512F") (V8SI "TARGET_AVX2") V4SI
15122    (V8DI "TARGET_AVX512F") (V4DI "TARGET_AVX512VL") (V2DI "TARGET_AVX512VL")])
15123
15124 (define_insn "*abs<mode>2"
15125   [(set (match_operand:VI1248_AVX512VL_AVX512BW 0 "register_operand" "=v")
15126         (abs:VI1248_AVX512VL_AVX512BW
15127           (match_operand:VI1248_AVX512VL_AVX512BW 1 "vector_operand" "vBm")))]
15128   "TARGET_SSSE3"
15129   "%vpabs<ssemodesuffix>\t{%1, %0|%0, %1}"
15130   [(set_attr "type" "sselog1")
15131    (set_attr "prefix_data16" "1")
15132    (set_attr "prefix_extra" "1")
15133    (set_attr "prefix" "maybe_vex")
15134    (set_attr "mode" "<sseinsnmode>")])
15135
15136 (define_insn "abs<mode>2_mask"
15137   [(set (match_operand:VI48_AVX512VL 0 "register_operand" "=v")
15138         (vec_merge:VI48_AVX512VL
15139           (abs:VI48_AVX512VL
15140             (match_operand:VI48_AVX512VL 1 "nonimmediate_operand" "vm"))
15141           (match_operand:VI48_AVX512VL 2 "vector_move_operand" "0C")
15142           (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk")))]
15143   "TARGET_AVX512F"
15144   "vpabs<ssemodesuffix>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
15145   [(set_attr "type" "sselog1")
15146    (set_attr "prefix" "evex")
15147    (set_attr "mode" "<sseinsnmode>")])
15148
15149 (define_insn "abs<mode>2_mask"
15150   [(set (match_operand:VI12_AVX512VL 0 "register_operand" "=v")
15151         (vec_merge:VI12_AVX512VL
15152           (abs:VI12_AVX512VL
15153             (match_operand:VI12_AVX512VL 1 "nonimmediate_operand" "vm"))
15154           (match_operand:VI12_AVX512VL 2 "vector_move_operand" "0C")
15155           (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk")))]
15156   "TARGET_AVX512BW"
15157   "vpabs<ssemodesuffix>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
15158   [(set_attr "type" "sselog1")
15159    (set_attr "prefix" "evex")
15160    (set_attr "mode" "<sseinsnmode>")])
15161
15162 (define_expand "abs<mode>2"
15163   [(set (match_operand:VI1248_AVX512VL_AVX512BW 0 "register_operand")
15164         (abs:VI1248_AVX512VL_AVX512BW
15165           (match_operand:VI1248_AVX512VL_AVX512BW 1 "vector_operand")))]
15166   "TARGET_SSE2"
15167 {
15168   if (!TARGET_SSSE3)
15169     {
15170       ix86_expand_sse2_abs (operands[0], operands[1]);
15171       DONE;
15172     }
15173 })
15174
15175 (define_insn "abs<mode>2"
15176   [(set (match_operand:MMXMODEI 0 "register_operand" "=y")
15177         (abs:MMXMODEI
15178           (match_operand:MMXMODEI 1 "nonimmediate_operand" "ym")))]
15179   "TARGET_SSSE3"
15180   "pabs<mmxvecsize>\t{%1, %0|%0, %1}";
15181   [(set_attr "type" "sselog1")
15182    (set_attr "prefix_rep" "0")
15183    (set_attr "prefix_extra" "1")
15184    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
15185    (set_attr "mode" "DI")])
15186
15187 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
15188 ;;
15189 ;; AMD SSE4A instructions
15190 ;;
15191 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
15192
15193 (define_insn "sse4a_movnt<mode>"
15194   [(set (match_operand:MODEF 0 "memory_operand" "=m")
15195         (unspec:MODEF
15196           [(match_operand:MODEF 1 "register_operand" "x")]
15197           UNSPEC_MOVNT))]
15198   "TARGET_SSE4A"
15199   "movnt<ssemodesuffix>\t{%1, %0|%0, %1}"
15200   [(set_attr "type" "ssemov")
15201    (set_attr "mode" "<MODE>")])
15202
15203 (define_insn "sse4a_vmmovnt<mode>"
15204   [(set (match_operand:<ssescalarmode> 0 "memory_operand" "=m")
15205         (unspec:<ssescalarmode>
15206           [(vec_select:<ssescalarmode>
15207              (match_operand:VF_128 1 "register_operand" "x")
15208              (parallel [(const_int 0)]))]
15209           UNSPEC_MOVNT))]
15210   "TARGET_SSE4A"
15211   "movnt<ssescalarmodesuffix>\t{%1, %0|%0, %1}"
15212   [(set_attr "type" "ssemov")
15213    (set_attr "mode" "<ssescalarmode>")])
15214
15215 (define_insn "sse4a_extrqi"
15216   [(set (match_operand:V2DI 0 "register_operand" "=x")
15217         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
15218                       (match_operand 2 "const_0_to_255_operand")
15219                       (match_operand 3 "const_0_to_255_operand")]
15220                      UNSPEC_EXTRQI))]
15221   "TARGET_SSE4A"
15222   "extrq\t{%3, %2, %0|%0, %2, %3}"
15223   [(set_attr "type" "sse")
15224    (set_attr "prefix_data16" "1")
15225    (set_attr "length_immediate" "2")
15226    (set_attr "mode" "TI")])
15227
15228 (define_insn "sse4a_extrq"
15229   [(set (match_operand:V2DI 0 "register_operand" "=x")
15230         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
15231                       (match_operand:V16QI 2 "register_operand" "x")]
15232                      UNSPEC_EXTRQ))]
15233   "TARGET_SSE4A"
15234   "extrq\t{%2, %0|%0, %2}"
15235   [(set_attr "type" "sse")
15236    (set_attr "prefix_data16" "1")
15237    (set_attr "mode" "TI")])
15238
15239 (define_insn "sse4a_insertqi"
15240   [(set (match_operand:V2DI 0 "register_operand" "=x")
15241         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
15242                       (match_operand:V2DI 2 "register_operand" "x")
15243                       (match_operand 3 "const_0_to_255_operand")
15244                       (match_operand 4 "const_0_to_255_operand")]
15245                      UNSPEC_INSERTQI))]
15246   "TARGET_SSE4A"
15247   "insertq\t{%4, %3, %2, %0|%0, %2, %3, %4}"
15248   [(set_attr "type" "sseins")
15249    (set_attr "prefix_data16" "0")
15250    (set_attr "prefix_rep" "1")
15251    (set_attr "length_immediate" "2")
15252    (set_attr "mode" "TI")])
15253
15254 (define_insn "sse4a_insertq"
15255   [(set (match_operand:V2DI 0 "register_operand" "=x")
15256         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
15257                       (match_operand:V2DI 2 "register_operand" "x")]
15258                      UNSPEC_INSERTQ))]
15259   "TARGET_SSE4A"
15260   "insertq\t{%2, %0|%0, %2}"
15261   [(set_attr "type" "sseins")
15262    (set_attr "prefix_data16" "0")
15263    (set_attr "prefix_rep" "1")
15264    (set_attr "mode" "TI")])
15265
15266 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
15267 ;;
15268 ;; Intel SSE4.1 instructions
15269 ;;
15270 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
15271
15272 ;; Mapping of immediate bits for blend instructions
15273 (define_mode_attr blendbits
15274   [(V8SF "255") (V4SF "15") (V4DF "15") (V2DF "3")])
15275
15276 (define_insn "<sse4_1>_blend<ssemodesuffix><avxsizesuffix>"
15277   [(set (match_operand:VF_128_256 0 "register_operand" "=Yr,*x,x")
15278         (vec_merge:VF_128_256
15279           (match_operand:VF_128_256 2 "vector_operand" "YrBm,*xBm,xm")
15280           (match_operand:VF_128_256 1 "register_operand" "0,0,x")
15281           (match_operand:SI 3 "const_0_to_<blendbits>_operand")))]
15282   "TARGET_SSE4_1"
15283   "@
15284    blend<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}
15285    blend<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}
15286    vblend<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
15287   [(set_attr "isa" "noavx,noavx,avx")
15288    (set_attr "type" "ssemov")
15289    (set_attr "length_immediate" "1")
15290    (set_attr "prefix_data16" "1,1,*")
15291    (set_attr "prefix_extra" "1")
15292    (set_attr "prefix" "orig,orig,vex")
15293    (set_attr "mode" "<MODE>")])
15294
15295 (define_insn "<sse4_1>_blendv<ssemodesuffix><avxsizesuffix>"
15296   [(set (match_operand:VF_128_256 0 "register_operand" "=Yr,*x,x")
15297         (unspec:VF_128_256
15298           [(match_operand:VF_128_256 1 "register_operand" "0,0,x")
15299            (match_operand:VF_128_256 2 "vector_operand" "YrBm,*xBm,xm")
15300            (match_operand:VF_128_256 3 "register_operand" "Yz,Yz,x")]
15301           UNSPEC_BLENDV))]
15302   "TARGET_SSE4_1"
15303   "@
15304    blendv<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}
15305    blendv<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}
15306    vblendv<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
15307   [(set_attr "isa" "noavx,noavx,avx")
15308    (set_attr "type" "ssemov")
15309    (set_attr "length_immediate" "1")
15310    (set_attr "prefix_data16" "1,1,*")
15311    (set_attr "prefix_extra" "1")
15312    (set_attr "prefix" "orig,orig,vex")
15313    (set_attr "btver2_decode" "vector,vector,vector") 
15314    (set_attr "mode" "<MODE>")])
15315
15316 (define_insn "<sse4_1>_dp<ssemodesuffix><avxsizesuffix>"
15317   [(set (match_operand:VF_128_256 0 "register_operand" "=Yr,*x,x")
15318         (unspec:VF_128_256
15319           [(match_operand:VF_128_256 1 "vector_operand" "%0,0,x")
15320            (match_operand:VF_128_256 2 "vector_operand" "YrBm,*xBm,xm")
15321            (match_operand:SI 3 "const_0_to_255_operand" "n,n,n")]
15322           UNSPEC_DP))]
15323   "TARGET_SSE4_1"
15324   "@
15325    dp<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}
15326    dp<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}
15327    vdp<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
15328   [(set_attr "isa" "noavx,noavx,avx")
15329    (set_attr "type" "ssemul")
15330    (set_attr "length_immediate" "1")
15331    (set_attr "prefix_data16" "1,1,*")
15332    (set_attr "prefix_extra" "1")
15333    (set_attr "prefix" "orig,orig,vex")
15334    (set_attr "btver2_decode" "vector,vector,vector")
15335    (set_attr "znver1_decode" "vector,vector,vector")
15336    (set_attr "mode" "<MODE>")])
15337
15338 ;; Mode attribute used by `vmovntdqa' pattern
15339 (define_mode_attr vi8_sse4_1_avx2_avx512
15340    [(V2DI "sse4_1") (V4DI "avx2") (V8DI "avx512f")])
15341
15342 (define_insn "<vi8_sse4_1_avx2_avx512>_movntdqa"
15343   [(set (match_operand:VI8_AVX2_AVX512F 0 "register_operand" "=Yr,*x,v")
15344         (unspec:VI8_AVX2_AVX512F [(match_operand:VI8_AVX2_AVX512F 1 "memory_operand" "m,m,m")]
15345                      UNSPEC_MOVNTDQA))]
15346   "TARGET_SSE4_1"
15347   "%vmovntdqa\t{%1, %0|%0, %1}"
15348   [(set_attr "isa" "noavx,noavx,avx")
15349    (set_attr "type" "ssemov")
15350    (set_attr "prefix_extra" "1,1,*")
15351    (set_attr "prefix" "orig,orig,maybe_evex")
15352    (set_attr "mode" "<sseinsnmode>")])
15353
15354 (define_insn "<sse4_1_avx2>_mpsadbw"
15355   [(set (match_operand:VI1_AVX2 0 "register_operand" "=Yr,*x,x")
15356         (unspec:VI1_AVX2
15357           [(match_operand:VI1_AVX2 1 "register_operand" "0,0,x")
15358            (match_operand:VI1_AVX2 2 "vector_operand" "YrBm,*xBm,xm")
15359            (match_operand:SI 3 "const_0_to_255_operand" "n,n,n")]
15360           UNSPEC_MPSADBW))]
15361   "TARGET_SSE4_1"
15362   "@
15363    mpsadbw\t{%3, %2, %0|%0, %2, %3}
15364    mpsadbw\t{%3, %2, %0|%0, %2, %3}
15365    vmpsadbw\t{%3, %2, %1, %0|%0, %1, %2, %3}"
15366   [(set_attr "isa" "noavx,noavx,avx")
15367    (set_attr "type" "sselog1")
15368    (set_attr "length_immediate" "1")
15369    (set_attr "prefix_extra" "1")
15370    (set_attr "prefix" "orig,orig,vex")
15371    (set_attr "btver2_decode" "vector,vector,vector")
15372    (set_attr "znver1_decode" "vector,vector,vector")
15373    (set_attr "mode" "<sseinsnmode>")])
15374
15375 (define_insn "<sse4_1_avx2>_packusdw<mask_name>"
15376   [(set (match_operand:VI2_AVX2 0 "register_operand" "=Yr,*x,x,v")
15377         (vec_concat:VI2_AVX2
15378           (us_truncate:<ssehalfvecmode>
15379             (match_operand:<sseunpackmode> 1 "register_operand" "0,0,x,v"))
15380           (us_truncate:<ssehalfvecmode>
15381             (match_operand:<sseunpackmode> 2 "vector_operand" "YrBm,*xBm,xm,vm"))))]
15382   "TARGET_SSE4_1 && <mask_mode512bit_condition> && <mask_avx512bw_condition>"
15383   "@
15384    packusdw\t{%2, %0|%0, %2}
15385    packusdw\t{%2, %0|%0, %2}
15386    vpackusdw\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}
15387    vpackusdw\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
15388   [(set_attr "isa" "noavx,noavx,avx,avx512bw")
15389    (set_attr "type" "sselog")
15390    (set_attr "prefix_extra" "1")
15391    (set_attr "prefix" "orig,orig,<mask_prefix>,evex")
15392    (set_attr "mode" "<sseinsnmode>")])
15393
15394 (define_insn "<sse4_1_avx2>_pblendvb"
15395   [(set (match_operand:VI1_AVX2 0 "register_operand" "=Yr,*x,x")
15396         (unspec:VI1_AVX2
15397           [(match_operand:VI1_AVX2 1 "register_operand"  "0,0,x")
15398            (match_operand:VI1_AVX2 2 "vector_operand" "YrBm,*xBm,xm")
15399            (match_operand:VI1_AVX2 3 "register_operand" "Yz,Yz,x")]
15400           UNSPEC_BLENDV))]
15401   "TARGET_SSE4_1"
15402   "@
15403    pblendvb\t{%3, %2, %0|%0, %2, %3}
15404    pblendvb\t{%3, %2, %0|%0, %2, %3}
15405    vpblendvb\t{%3, %2, %1, %0|%0, %1, %2, %3}"
15406   [(set_attr "isa" "noavx,noavx,avx")
15407    (set_attr "type" "ssemov")
15408    (set_attr "prefix_extra" "1")
15409    (set_attr "length_immediate" "*,*,1")
15410    (set_attr "prefix" "orig,orig,vex")
15411    (set_attr "btver2_decode" "vector,vector,vector")
15412    (set_attr "mode" "<sseinsnmode>")])
15413
15414 (define_insn "sse4_1_pblendw"
15415   [(set (match_operand:V8HI 0 "register_operand" "=Yr,*x,x")
15416         (vec_merge:V8HI
15417           (match_operand:V8HI 2 "vector_operand" "YrBm,*xBm,xm")
15418           (match_operand:V8HI 1 "register_operand" "0,0,x")
15419           (match_operand:SI 3 "const_0_to_255_operand" "n,n,n")))]
15420   "TARGET_SSE4_1"
15421   "@
15422    pblendw\t{%3, %2, %0|%0, %2, %3}
15423    pblendw\t{%3, %2, %0|%0, %2, %3}
15424    vpblendw\t{%3, %2, %1, %0|%0, %1, %2, %3}"
15425   [(set_attr "isa" "noavx,noavx,avx")
15426    (set_attr "type" "ssemov")
15427    (set_attr "prefix_extra" "1")
15428    (set_attr "length_immediate" "1")
15429    (set_attr "prefix" "orig,orig,vex")
15430    (set_attr "mode" "TI")])
15431
15432 ;; The builtin uses an 8-bit immediate.  Expand that.
15433 (define_expand "avx2_pblendw"
15434   [(set (match_operand:V16HI 0 "register_operand")
15435         (vec_merge:V16HI
15436           (match_operand:V16HI 2 "nonimmediate_operand")
15437           (match_operand:V16HI 1 "register_operand")
15438           (match_operand:SI 3 "const_0_to_255_operand")))]
15439   "TARGET_AVX2"
15440 {
15441   HOST_WIDE_INT val = INTVAL (operands[3]) & 0xff;
15442   operands[3] = GEN_INT (val << 8 | val);
15443 })
15444
15445 (define_insn "*avx2_pblendw"
15446   [(set (match_operand:V16HI 0 "register_operand" "=x")
15447         (vec_merge:V16HI
15448           (match_operand:V16HI 2 "nonimmediate_operand" "xm")
15449           (match_operand:V16HI 1 "register_operand" "x")
15450           (match_operand:SI 3 "avx2_pblendw_operand" "n")))]
15451   "TARGET_AVX2"
15452 {
15453   operands[3] = GEN_INT (INTVAL (operands[3]) & 0xff);
15454   return "vpblendw\t{%3, %2, %1, %0|%0, %1, %2, %3}";
15455 }
15456   [(set_attr "type" "ssemov")
15457    (set_attr "prefix_extra" "1")
15458    (set_attr "length_immediate" "1")
15459    (set_attr "prefix" "vex")
15460    (set_attr "mode" "OI")])
15461
15462 (define_insn "avx2_pblendd<mode>"
15463   [(set (match_operand:VI4_AVX2 0 "register_operand" "=x")
15464         (vec_merge:VI4_AVX2
15465           (match_operand:VI4_AVX2 2 "nonimmediate_operand" "xm")
15466           (match_operand:VI4_AVX2 1 "register_operand" "x")
15467           (match_operand:SI 3 "const_0_to_255_operand" "n")))]
15468   "TARGET_AVX2"
15469   "vpblendd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
15470   [(set_attr "type" "ssemov")
15471    (set_attr "prefix_extra" "1")
15472    (set_attr "length_immediate" "1")
15473    (set_attr "prefix" "vex")
15474    (set_attr "mode" "<sseinsnmode>")])
15475
15476 (define_insn "sse4_1_phminposuw"
15477   [(set (match_operand:V8HI 0 "register_operand" "=Yr,*x,x")
15478         (unspec:V8HI [(match_operand:V8HI 1 "vector_operand" "YrBm,*xBm,xm")]
15479                      UNSPEC_PHMINPOSUW))]
15480   "TARGET_SSE4_1"
15481   "%vphminposuw\t{%1, %0|%0, %1}"
15482   [(set_attr "isa" "noavx,noavx,avx")
15483    (set_attr "type" "sselog1")
15484    (set_attr "prefix_extra" "1")
15485    (set_attr "prefix" "orig,orig,vex")
15486    (set_attr "mode" "TI")])
15487
15488 (define_insn "avx2_<code>v16qiv16hi2<mask_name>"
15489   [(set (match_operand:V16HI 0 "register_operand" "=v")
15490         (any_extend:V16HI
15491           (match_operand:V16QI 1 "nonimmediate_operand" "vm")))]
15492   "TARGET_AVX2 && <mask_avx512bw_condition> && <mask_avx512vl_condition>"
15493   "vpmov<extsuffix>bw\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
15494   [(set_attr "type" "ssemov")
15495    (set_attr "prefix_extra" "1")
15496    (set_attr "prefix" "maybe_evex")
15497    (set_attr "mode" "OI")])
15498
15499 (define_insn "avx512bw_<code>v32qiv32hi2<mask_name>"
15500   [(set (match_operand:V32HI 0 "register_operand" "=v")
15501         (any_extend:V32HI
15502           (match_operand:V32QI 1 "nonimmediate_operand" "vm")))]
15503   "TARGET_AVX512BW"
15504   "vpmov<extsuffix>bw\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
15505   [(set_attr "type" "ssemov")
15506    (set_attr "prefix_extra" "1")
15507    (set_attr "prefix" "evex")
15508    (set_attr "mode" "XI")])
15509
15510 (define_insn "sse4_1_<code>v8qiv8hi2<mask_name>"
15511   [(set (match_operand:V8HI 0 "register_operand" "=Yr,*x,v")
15512         (any_extend:V8HI
15513           (vec_select:V8QI
15514             (match_operand:V16QI 1 "nonimmediate_operand" "Yrm,*xm,vm")
15515             (parallel [(const_int 0) (const_int 1)
15516                        (const_int 2) (const_int 3)
15517                        (const_int 4) (const_int 5)
15518                        (const_int 6) (const_int 7)]))))]
15519   "TARGET_SSE4_1 && <mask_avx512bw_condition> && <mask_avx512vl_condition>"
15520   "%vpmov<extsuffix>bw\t{%1, %0<mask_operand2>|%0<mask_operand2>, %q1}"
15521   [(set_attr "isa" "noavx,noavx,avx")
15522    (set_attr "type" "ssemov")
15523    (set_attr "prefix_extra" "1")
15524    (set_attr "prefix" "orig,orig,maybe_evex")
15525    (set_attr "mode" "TI")])
15526
15527 (define_insn "<mask_codefor>avx512f_<code>v16qiv16si2<mask_name>"
15528   [(set (match_operand:V16SI 0 "register_operand" "=v")
15529         (any_extend:V16SI
15530           (match_operand:V16QI 1 "nonimmediate_operand" "vm")))]
15531   "TARGET_AVX512F"
15532   "vpmov<extsuffix>bd\t{%1, %0<mask_operand2>|%0<mask_operand2>, %q1}"
15533   [(set_attr "type" "ssemov")
15534    (set_attr "prefix" "evex")
15535    (set_attr "mode" "XI")])
15536
15537 (define_insn "avx2_<code>v8qiv8si2<mask_name>"
15538   [(set (match_operand:V8SI 0 "register_operand" "=v")
15539         (any_extend:V8SI
15540           (vec_select:V8QI
15541             (match_operand:V16QI 1 "nonimmediate_operand" "vm")
15542             (parallel [(const_int 0) (const_int 1)
15543                        (const_int 2) (const_int 3)
15544                        (const_int 4) (const_int 5)
15545                        (const_int 6) (const_int 7)]))))]
15546   "TARGET_AVX2 && <mask_avx512vl_condition>"
15547   "vpmov<extsuffix>bd\t{%1, %0<mask_operand2>|%0<mask_operand2>, %q1}"
15548   [(set_attr "type" "ssemov")
15549    (set_attr "prefix_extra" "1")
15550    (set_attr "prefix" "maybe_evex")
15551    (set_attr "mode" "OI")])
15552
15553 (define_insn "sse4_1_<code>v4qiv4si2<mask_name>"
15554   [(set (match_operand:V4SI 0 "register_operand" "=Yr,*x,v")
15555         (any_extend:V4SI
15556           (vec_select:V4QI
15557             (match_operand:V16QI 1 "nonimmediate_operand" "Yrm,*xm,vm")
15558             (parallel [(const_int 0) (const_int 1)
15559                        (const_int 2) (const_int 3)]))))]
15560   "TARGET_SSE4_1 && <mask_avx512vl_condition>"
15561   "%vpmov<extsuffix>bd\t{%1, %0<mask_operand2>|%0<mask_operand2>, %k1}"
15562   [(set_attr "isa" "noavx,noavx,avx")
15563    (set_attr "type" "ssemov")
15564    (set_attr "prefix_extra" "1")
15565    (set_attr "prefix" "orig,orig,maybe_evex")
15566    (set_attr "mode" "TI")])
15567
15568 (define_insn "avx512f_<code>v16hiv16si2<mask_name>"
15569   [(set (match_operand:V16SI 0 "register_operand" "=v")
15570         (any_extend:V16SI
15571           (match_operand:V16HI 1 "nonimmediate_operand" "vm")))]
15572   "TARGET_AVX512F"
15573   "vpmov<extsuffix>wd\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
15574   [(set_attr "type" "ssemov")
15575    (set_attr "prefix" "evex")
15576    (set_attr "mode" "XI")])
15577
15578 (define_insn "avx2_<code>v8hiv8si2<mask_name>"
15579   [(set (match_operand:V8SI 0 "register_operand" "=v")
15580         (any_extend:V8SI
15581             (match_operand:V8HI 1 "nonimmediate_operand" "vm")))]
15582   "TARGET_AVX2 && <mask_avx512vl_condition>"
15583   "vpmov<extsuffix>wd\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
15584   [(set_attr "type" "ssemov")
15585    (set_attr "prefix_extra" "1")
15586    (set_attr "prefix" "maybe_evex")
15587    (set_attr "mode" "OI")])
15588
15589 (define_insn "sse4_1_<code>v4hiv4si2<mask_name>"
15590   [(set (match_operand:V4SI 0 "register_operand" "=Yr,*x,v")
15591         (any_extend:V4SI
15592           (vec_select:V4HI
15593             (match_operand:V8HI 1 "nonimmediate_operand" "Yrm,*xm,vm")
15594             (parallel [(const_int 0) (const_int 1)
15595                        (const_int 2) (const_int 3)]))))]
15596   "TARGET_SSE4_1 && <mask_avx512vl_condition>"
15597   "%vpmov<extsuffix>wd\t{%1, %0<mask_operand2>|%0<mask_operand2>, %q1}"
15598   [(set_attr "isa" "noavx,noavx,avx")
15599    (set_attr "type" "ssemov")
15600    (set_attr "prefix_extra" "1")
15601    (set_attr "prefix" "orig,orig,maybe_evex")
15602    (set_attr "mode" "TI")])
15603
15604 (define_insn "avx512f_<code>v8qiv8di2<mask_name>"
15605   [(set (match_operand:V8DI 0 "register_operand" "=v")
15606         (any_extend:V8DI
15607           (vec_select:V8QI
15608             (match_operand:V16QI 1 "nonimmediate_operand" "vm")
15609             (parallel [(const_int 0) (const_int 1)
15610                        (const_int 2) (const_int 3)
15611                        (const_int 4) (const_int 5)
15612                        (const_int 6) (const_int 7)]))))]
15613   "TARGET_AVX512F"
15614   "vpmov<extsuffix>bq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %k1}"
15615   [(set_attr "type" "ssemov")
15616    (set_attr "prefix" "evex")
15617    (set_attr "mode" "XI")])
15618
15619 (define_insn "avx2_<code>v4qiv4di2<mask_name>"
15620   [(set (match_operand:V4DI 0 "register_operand" "=v")
15621         (any_extend:V4DI
15622           (vec_select:V4QI
15623             (match_operand:V16QI 1 "nonimmediate_operand" "vm")
15624             (parallel [(const_int 0) (const_int 1)
15625                        (const_int 2) (const_int 3)]))))]
15626   "TARGET_AVX2 && <mask_avx512vl_condition>"
15627   "vpmov<extsuffix>bq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %k1}"
15628   [(set_attr "type" "ssemov")
15629    (set_attr "prefix_extra" "1")
15630    (set_attr "prefix" "maybe_evex")
15631    (set_attr "mode" "OI")])
15632
15633 (define_insn "sse4_1_<code>v2qiv2di2<mask_name>"
15634   [(set (match_operand:V2DI 0 "register_operand" "=Yr,*x,v")
15635         (any_extend:V2DI
15636           (vec_select:V2QI
15637             (match_operand:V16QI 1 "nonimmediate_operand" "Yrm,*xm,vm")
15638             (parallel [(const_int 0) (const_int 1)]))))]
15639   "TARGET_SSE4_1 && <mask_avx512vl_condition>"
15640   "%vpmov<extsuffix>bq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %w1}"
15641   [(set_attr "isa" "noavx,noavx,avx")
15642    (set_attr "type" "ssemov")
15643    (set_attr "prefix_extra" "1")
15644    (set_attr "prefix" "orig,orig,maybe_evex")
15645    (set_attr "mode" "TI")])
15646
15647 (define_insn "avx512f_<code>v8hiv8di2<mask_name>"
15648   [(set (match_operand:V8DI 0 "register_operand" "=v")
15649         (any_extend:V8DI
15650           (match_operand:V8HI 1 "nonimmediate_operand" "vm")))]
15651   "TARGET_AVX512F"
15652   "vpmov<extsuffix>wq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %q1}"
15653   [(set_attr "type" "ssemov")
15654    (set_attr "prefix" "evex")
15655    (set_attr "mode" "XI")])
15656
15657 (define_insn "avx2_<code>v4hiv4di2<mask_name>"
15658   [(set (match_operand:V4DI 0 "register_operand" "=v")
15659         (any_extend:V4DI
15660           (vec_select:V4HI
15661             (match_operand:V8HI 1 "nonimmediate_operand" "vm")
15662             (parallel [(const_int 0) (const_int 1)
15663                        (const_int 2) (const_int 3)]))))]
15664   "TARGET_AVX2 && <mask_avx512vl_condition>"
15665   "vpmov<extsuffix>wq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %q1}"
15666   [(set_attr "type" "ssemov")
15667    (set_attr "prefix_extra" "1")
15668    (set_attr "prefix" "maybe_evex")
15669    (set_attr "mode" "OI")])
15670
15671 (define_insn "sse4_1_<code>v2hiv2di2<mask_name>"
15672   [(set (match_operand:V2DI 0 "register_operand" "=Yr,*x,v")
15673         (any_extend:V2DI
15674           (vec_select:V2HI
15675             (match_operand:V8HI 1 "nonimmediate_operand" "Yrm,*xm,vm")
15676             (parallel [(const_int 0) (const_int 1)]))))]
15677   "TARGET_SSE4_1 && <mask_avx512vl_condition>"
15678   "%vpmov<extsuffix>wq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %k1}"
15679   [(set_attr "isa" "noavx,noavx,avx")
15680    (set_attr "type" "ssemov")
15681    (set_attr "prefix_extra" "1")
15682    (set_attr "prefix" "orig,orig,maybe_evex")
15683    (set_attr "mode" "TI")])
15684
15685 (define_insn "avx512f_<code>v8siv8di2<mask_name>"
15686   [(set (match_operand:V8DI 0 "register_operand" "=v")
15687         (any_extend:V8DI
15688           (match_operand:V8SI 1 "nonimmediate_operand" "vm")))]
15689   "TARGET_AVX512F"
15690   "vpmov<extsuffix>dq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
15691   [(set_attr "type" "ssemov")
15692    (set_attr "prefix" "evex")
15693    (set_attr "mode" "XI")])
15694
15695 (define_insn "avx2_<code>v4siv4di2<mask_name>"
15696   [(set (match_operand:V4DI 0 "register_operand" "=v")
15697         (any_extend:V4DI
15698             (match_operand:V4SI 1 "nonimmediate_operand" "vm")))]
15699   "TARGET_AVX2 && <mask_avx512vl_condition>"
15700   "vpmov<extsuffix>dq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
15701   [(set_attr "type" "ssemov")
15702    (set_attr "prefix" "maybe_evex")
15703    (set_attr "prefix_extra" "1")
15704    (set_attr "mode" "OI")])
15705
15706 (define_insn "sse4_1_<code>v2siv2di2<mask_name>"
15707   [(set (match_operand:V2DI 0 "register_operand" "=Yr,*x,v")
15708         (any_extend:V2DI
15709           (vec_select:V2SI
15710             (match_operand:V4SI 1 "nonimmediate_operand" "Yrm,*xm,vm")
15711             (parallel [(const_int 0) (const_int 1)]))))]
15712   "TARGET_SSE4_1 && <mask_avx512vl_condition>"
15713   "%vpmov<extsuffix>dq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %q1}"
15714   [(set_attr "isa" "noavx,noavx,avx")
15715    (set_attr "type" "ssemov")
15716    (set_attr "prefix_extra" "1")
15717    (set_attr "prefix" "orig,orig,maybe_evex")
15718    (set_attr "mode" "TI")])
15719
15720 ;; ptestps/ptestpd are very similar to comiss and ucomiss when
15721 ;; setting FLAGS_REG. But it is not a really compare instruction.
15722 (define_insn "avx_vtest<ssemodesuffix><avxsizesuffix>"
15723   [(set (reg:CC FLAGS_REG)
15724         (unspec:CC [(match_operand:VF_128_256 0 "register_operand" "x")
15725                     (match_operand:VF_128_256 1 "nonimmediate_operand" "xm")]
15726                    UNSPEC_VTESTP))]
15727   "TARGET_AVX"
15728   "vtest<ssemodesuffix>\t{%1, %0|%0, %1}"
15729   [(set_attr "type" "ssecomi")
15730    (set_attr "prefix_extra" "1")
15731    (set_attr "prefix" "vex")
15732    (set_attr "mode" "<MODE>")])
15733
15734 ;; ptest is very similar to comiss and ucomiss when setting FLAGS_REG.
15735 ;; But it is not a really compare instruction.
15736 (define_insn "<sse4_1>_ptest<mode>"
15737   [(set (reg:CC FLAGS_REG)
15738         (unspec:CC [(match_operand:V_AVX 0 "register_operand" "Yr, *x, x")
15739                     (match_operand:V_AVX 1 "vector_operand" "YrBm, *xBm, xm")]
15740                    UNSPEC_PTEST))]
15741   "TARGET_SSE4_1"
15742   "%vptest\t{%1, %0|%0, %1}"
15743   [(set_attr "isa" "noavx,noavx,avx")
15744    (set_attr "type" "ssecomi")
15745    (set_attr "prefix_extra" "1")
15746    (set_attr "prefix" "orig,orig,vex")
15747    (set (attr "btver2_decode")
15748      (if_then_else
15749        (match_test "<sseinsnmode>mode==OImode")
15750      (const_string "vector")
15751      (const_string "*")))
15752    (set_attr "mode" "<sseinsnmode>")])
15753
15754 (define_insn "ptesttf2"
15755   [(set (reg:CC FLAGS_REG)
15756         (unspec:CC [(match_operand:TF 0 "register_operand" "Yr, *x, x")
15757                     (match_operand:TF 1 "vector_operand" "YrBm, *xBm, xm")]
15758                    UNSPEC_PTEST))]
15759   "TARGET_SSE4_1"
15760   "%vptest\t{%1, %0|%0, %1}"
15761   [(set_attr "isa" "noavx,noavx,avx")
15762    (set_attr "type" "ssecomi")
15763    (set_attr "prefix_extra" "1")
15764    (set_attr "prefix" "orig,orig,vex")
15765    (set_attr "mode" "TI")])
15766
15767 (define_insn "<sse4_1>_round<ssemodesuffix><avxsizesuffix>"
15768   [(set (match_operand:VF_128_256 0 "register_operand" "=Yr,*x,x")
15769         (unspec:VF_128_256
15770           [(match_operand:VF_128_256 1 "vector_operand" "YrBm,*xBm,xm")
15771            (match_operand:SI 2 "const_0_to_15_operand" "n,n,n")]
15772           UNSPEC_ROUND))]
15773   "TARGET_SSE4_1"
15774   "%vround<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
15775   [(set_attr "isa" "noavx,noavx,avx")
15776    (set_attr "type" "ssecvt")
15777    (set_attr "prefix_data16" "1,1,*")
15778    (set_attr "prefix_extra" "1")
15779    (set_attr "length_immediate" "1")
15780    (set_attr "prefix" "orig,orig,vex")
15781    (set_attr "mode" "<MODE>")])
15782
15783 (define_expand "<sse4_1>_round<ssemodesuffix>_sfix<avxsizesuffix>"
15784   [(match_operand:<sseintvecmode> 0 "register_operand")
15785    (match_operand:VF1_128_256 1 "vector_operand")
15786    (match_operand:SI 2 "const_0_to_15_operand")]
15787   "TARGET_SSE4_1"
15788 {
15789   rtx tmp = gen_reg_rtx (<MODE>mode);
15790
15791   emit_insn
15792     (gen_<sse4_1>_round<ssemodesuffix><avxsizesuffix> (tmp, operands[1],
15793                                                        operands[2]));
15794   emit_insn
15795     (gen_fix_trunc<mode><sseintvecmodelower>2 (operands[0], tmp));
15796   DONE;
15797 })
15798
15799 (define_expand "avx512f_round<castmode>512"
15800   [(match_operand:VF_512 0 "register_operand")
15801    (match_operand:VF_512 1 "nonimmediate_operand")
15802    (match_operand:SI 2 "const_0_to_15_operand")]
15803   "TARGET_AVX512F"
15804 {
15805   emit_insn (gen_avx512f_rndscale<mode> (operands[0], operands[1], operands[2]));
15806   DONE;
15807 })
15808
15809 (define_expand "avx512f_roundps512_sfix"
15810   [(match_operand:V16SI 0 "register_operand")
15811    (match_operand:V16SF 1 "nonimmediate_operand")
15812    (match_operand:SI 2 "const_0_to_15_operand")]
15813   "TARGET_AVX512F"
15814 {
15815   rtx tmp = gen_reg_rtx (V16SFmode);
15816   emit_insn (gen_avx512f_rndscalev16sf (tmp, operands[1], operands[2]));
15817   emit_insn (gen_fix_truncv16sfv16si2 (operands[0], tmp));
15818   DONE;
15819 })
15820
15821 (define_expand "<sse4_1>_round<ssemodesuffix>_vec_pack_sfix<avxsizesuffix>"
15822   [(match_operand:<ssepackfltmode> 0 "register_operand")
15823    (match_operand:VF2 1 "vector_operand")
15824    (match_operand:VF2 2 "vector_operand")
15825    (match_operand:SI 3 "const_0_to_15_operand")]
15826   "TARGET_SSE4_1"
15827 {
15828   rtx tmp0, tmp1;
15829
15830   if (<MODE>mode == V2DFmode
15831       && TARGET_AVX && !TARGET_PREFER_AVX128 && optimize_insn_for_speed_p ())
15832     {
15833       rtx tmp2 = gen_reg_rtx (V4DFmode);
15834
15835       tmp0 = gen_reg_rtx (V4DFmode);
15836       tmp1 = force_reg (V2DFmode, operands[1]);
15837
15838       emit_insn (gen_avx_vec_concatv4df (tmp0, tmp1, operands[2]));
15839       emit_insn (gen_avx_roundpd256 (tmp2, tmp0, operands[3]));
15840       emit_insn (gen_fix_truncv4dfv4si2 (operands[0], tmp2));
15841     }
15842   else
15843     {
15844       tmp0 = gen_reg_rtx (<MODE>mode);
15845       tmp1 = gen_reg_rtx (<MODE>mode);
15846
15847       emit_insn
15848        (gen_<sse4_1>_round<ssemodesuffix><avxsizesuffix> (tmp0, operands[1],
15849                                                           operands[3]));
15850       emit_insn
15851        (gen_<sse4_1>_round<ssemodesuffix><avxsizesuffix> (tmp1, operands[2],
15852                                                           operands[3]));
15853       emit_insn
15854        (gen_vec_pack_sfix_trunc_<mode> (operands[0], tmp0, tmp1));
15855     }
15856   DONE;
15857 })
15858
15859 (define_insn "sse4_1_round<ssescalarmodesuffix>"
15860   [(set (match_operand:VF_128 0 "register_operand" "=Yr,*x,x,v")
15861         (vec_merge:VF_128
15862           (unspec:VF_128
15863             [(match_operand:VF_128 2 "register_operand" "Yr,*x,x,v")
15864              (match_operand:SI 3 "const_0_to_15_operand" "n,n,n,n")]
15865             UNSPEC_ROUND)
15866           (match_operand:VF_128 1 "register_operand" "0,0,x,v")
15867           (const_int 1)))]
15868   "TARGET_SSE4_1"
15869   "@
15870    round<ssescalarmodesuffix>\t{%3, %2, %0|%0, %2, %3}
15871    round<ssescalarmodesuffix>\t{%3, %2, %0|%0, %2, %3}
15872    vround<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}
15873    vrndscale<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
15874   [(set_attr "isa" "noavx,noavx,avx,avx512f")
15875    (set_attr "type" "ssecvt")
15876    (set_attr "length_immediate" "1")
15877    (set_attr "prefix_data16" "1,1,*,*")
15878    (set_attr "prefix_extra" "1")
15879    (set_attr "prefix" "orig,orig,vex,evex")
15880    (set_attr "mode" "<MODE>")])
15881
15882 (define_expand "round<mode>2"
15883   [(set (match_dup 3)
15884         (plus:VF
15885           (match_operand:VF 1 "register_operand")
15886           (match_dup 2)))
15887    (set (match_operand:VF 0 "register_operand")
15888         (unspec:VF
15889           [(match_dup 3) (match_dup 4)]
15890           UNSPEC_ROUND))]
15891   "TARGET_SSE4_1 && !flag_trapping_math"
15892 {
15893   machine_mode scalar_mode;
15894   const struct real_format *fmt;
15895   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
15896   rtx half, vec_half;
15897
15898   scalar_mode = GET_MODE_INNER (<MODE>mode);
15899
15900   /* load nextafter (0.5, 0.0) */
15901   fmt = REAL_MODE_FORMAT (scalar_mode);
15902   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, scalar_mode);
15903   real_arithmetic (&pred_half, MINUS_EXPR, &dconsthalf, &half_minus_pred_half);
15904   half = const_double_from_real_value (pred_half, scalar_mode);
15905
15906   vec_half = ix86_build_const_vector (<MODE>mode, true, half);
15907   vec_half = force_reg (<MODE>mode, vec_half);
15908
15909   operands[2] = gen_reg_rtx (<MODE>mode);
15910   emit_insn (gen_copysign<mode>3 (operands[2], vec_half, operands[1]));
15911
15912   operands[3] = gen_reg_rtx (<MODE>mode);
15913   operands[4] = GEN_INT (ROUND_TRUNC);
15914 })
15915
15916 (define_expand "round<mode>2_sfix"
15917   [(match_operand:<sseintvecmode> 0 "register_operand")
15918    (match_operand:VF1 1 "register_operand")]
15919   "TARGET_SSE4_1 && !flag_trapping_math"
15920 {
15921   rtx tmp = gen_reg_rtx (<MODE>mode);
15922
15923   emit_insn (gen_round<mode>2 (tmp, operands[1]));
15924
15925   emit_insn
15926     (gen_fix_trunc<mode><sseintvecmodelower>2 (operands[0], tmp));
15927   DONE;
15928 })
15929
15930 (define_expand "round<mode>2_vec_pack_sfix"
15931   [(match_operand:<ssepackfltmode> 0 "register_operand")
15932    (match_operand:VF2 1 "register_operand")
15933    (match_operand:VF2 2 "register_operand")]
15934   "TARGET_SSE4_1 && !flag_trapping_math"
15935 {
15936   rtx tmp0, tmp1;
15937
15938   if (<MODE>mode == V2DFmode
15939       && TARGET_AVX && !TARGET_PREFER_AVX128 && optimize_insn_for_speed_p ())
15940     {
15941       rtx tmp2 = gen_reg_rtx (V4DFmode);
15942
15943       tmp0 = gen_reg_rtx (V4DFmode);
15944       tmp1 = force_reg (V2DFmode, operands[1]);
15945
15946       emit_insn (gen_avx_vec_concatv4df (tmp0, tmp1, operands[2]));
15947       emit_insn (gen_roundv4df2 (tmp2, tmp0));
15948       emit_insn (gen_fix_truncv4dfv4si2 (operands[0], tmp2));
15949     }
15950   else
15951     {
15952       tmp0 = gen_reg_rtx (<MODE>mode);
15953       tmp1 = gen_reg_rtx (<MODE>mode);
15954
15955       emit_insn (gen_round<mode>2 (tmp0, operands[1]));
15956       emit_insn (gen_round<mode>2 (tmp1, operands[2]));
15957
15958       emit_insn
15959        (gen_vec_pack_sfix_trunc_<mode> (operands[0], tmp0, tmp1));
15960     }
15961   DONE;
15962 })
15963
15964 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
15965 ;;
15966 ;; Intel SSE4.2 string/text processing instructions
15967 ;;
15968 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
15969
15970 (define_insn_and_split "sse4_2_pcmpestr"
15971   [(set (match_operand:SI 0 "register_operand" "=c,c")
15972         (unspec:SI
15973           [(match_operand:V16QI 2 "register_operand" "x,x")
15974            (match_operand:SI 3 "register_operand" "a,a")
15975            (match_operand:V16QI 4 "nonimmediate_operand" "x,m")
15976            (match_operand:SI 5 "register_operand" "d,d")
15977            (match_operand:SI 6 "const_0_to_255_operand" "n,n")]
15978           UNSPEC_PCMPESTR))
15979    (set (match_operand:V16QI 1 "register_operand" "=Yz,Yz")
15980         (unspec:V16QI
15981           [(match_dup 2)
15982            (match_dup 3)
15983            (match_dup 4)
15984            (match_dup 5)
15985            (match_dup 6)]
15986           UNSPEC_PCMPESTR))
15987    (set (reg:CC FLAGS_REG)
15988         (unspec:CC
15989           [(match_dup 2)
15990            (match_dup 3)
15991            (match_dup 4)
15992            (match_dup 5)
15993            (match_dup 6)]
15994           UNSPEC_PCMPESTR))]
15995   "TARGET_SSE4_2
15996    && can_create_pseudo_p ()"
15997   "#"
15998   "&& 1"
15999   [(const_int 0)]
16000 {
16001   int ecx = !find_regno_note (curr_insn, REG_UNUSED, REGNO (operands[0]));
16002   int xmm0 = !find_regno_note (curr_insn, REG_UNUSED, REGNO (operands[1]));
16003   int flags = !find_regno_note (curr_insn, REG_UNUSED, FLAGS_REG);
16004
16005   if (ecx)
16006     emit_insn (gen_sse4_2_pcmpestri (operands[0], operands[2],
16007                                      operands[3], operands[4],
16008                                      operands[5], operands[6]));
16009   if (xmm0)
16010     emit_insn (gen_sse4_2_pcmpestrm (operands[1], operands[2],
16011                                      operands[3], operands[4],
16012                                      operands[5], operands[6]));
16013   if (flags && !(ecx || xmm0))
16014     emit_insn (gen_sse4_2_pcmpestr_cconly (NULL, NULL,
16015                                            operands[2], operands[3],
16016                                            operands[4], operands[5],
16017                                            operands[6]));
16018   if (!(flags || ecx || xmm0))
16019     emit_note (NOTE_INSN_DELETED);
16020
16021   DONE;
16022 }
16023   [(set_attr "type" "sselog")
16024    (set_attr "prefix_data16" "1")
16025    (set_attr "prefix_extra" "1")
16026    (set_attr "length_immediate" "1")
16027    (set_attr "memory" "none,load")
16028    (set_attr "mode" "TI")])
16029
16030 (define_insn "sse4_2_pcmpestri"
16031   [(set (match_operand:SI 0 "register_operand" "=c,c")
16032         (unspec:SI
16033           [(match_operand:V16QI 1 "register_operand" "x,x")
16034            (match_operand:SI 2 "register_operand" "a,a")
16035            (match_operand:V16QI 3 "nonimmediate_operand" "x,m")
16036            (match_operand:SI 4 "register_operand" "d,d")
16037            (match_operand:SI 5 "const_0_to_255_operand" "n,n")]
16038           UNSPEC_PCMPESTR))
16039    (set (reg:CC FLAGS_REG)
16040         (unspec:CC
16041           [(match_dup 1)
16042            (match_dup 2)
16043            (match_dup 3)
16044            (match_dup 4)
16045            (match_dup 5)]
16046           UNSPEC_PCMPESTR))]
16047   "TARGET_SSE4_2"
16048   "%vpcmpestri\t{%5, %3, %1|%1, %3, %5}"
16049   [(set_attr "type" "sselog")
16050    (set_attr "prefix_data16" "1")
16051    (set_attr "prefix_extra" "1")
16052    (set_attr "prefix" "maybe_vex")
16053    (set_attr "length_immediate" "1")
16054    (set_attr "btver2_decode" "vector")
16055    (set_attr "memory" "none,load")
16056    (set_attr "mode" "TI")])
16057
16058 (define_insn "sse4_2_pcmpestrm"
16059   [(set (match_operand:V16QI 0 "register_operand" "=Yz,Yz")
16060         (unspec:V16QI
16061           [(match_operand:V16QI 1 "register_operand" "x,x")
16062            (match_operand:SI 2 "register_operand" "a,a")
16063            (match_operand:V16QI 3 "nonimmediate_operand" "x,m")
16064            (match_operand:SI 4 "register_operand" "d,d")
16065            (match_operand:SI 5 "const_0_to_255_operand" "n,n")]
16066           UNSPEC_PCMPESTR))
16067    (set (reg:CC FLAGS_REG)
16068         (unspec:CC
16069           [(match_dup 1)
16070            (match_dup 2)
16071            (match_dup 3)
16072            (match_dup 4)
16073            (match_dup 5)]
16074           UNSPEC_PCMPESTR))]
16075   "TARGET_SSE4_2"
16076   "%vpcmpestrm\t{%5, %3, %1|%1, %3, %5}"
16077   [(set_attr "type" "sselog")
16078    (set_attr "prefix_data16" "1")
16079    (set_attr "prefix_extra" "1")
16080    (set_attr "length_immediate" "1")
16081    (set_attr "prefix" "maybe_vex")
16082    (set_attr "btver2_decode" "vector")
16083    (set_attr "memory" "none,load")
16084    (set_attr "mode" "TI")])
16085
16086 (define_insn "sse4_2_pcmpestr_cconly"
16087   [(set (reg:CC FLAGS_REG)
16088         (unspec:CC
16089           [(match_operand:V16QI 2 "register_operand" "x,x,x,x")
16090            (match_operand:SI 3 "register_operand" "a,a,a,a")
16091            (match_operand:V16QI 4 "nonimmediate_operand" "x,m,x,m")
16092            (match_operand:SI 5 "register_operand" "d,d,d,d")
16093            (match_operand:SI 6 "const_0_to_255_operand" "n,n,n,n")]
16094           UNSPEC_PCMPESTR))
16095    (clobber (match_scratch:V16QI 0 "=Yz,Yz,X,X"))
16096    (clobber (match_scratch:SI    1 "= X, X,c,c"))]
16097   "TARGET_SSE4_2"
16098   "@
16099    %vpcmpestrm\t{%6, %4, %2|%2, %4, %6}
16100    %vpcmpestrm\t{%6, %4, %2|%2, %4, %6}
16101    %vpcmpestri\t{%6, %4, %2|%2, %4, %6}
16102    %vpcmpestri\t{%6, %4, %2|%2, %4, %6}"
16103   [(set_attr "type" "sselog")
16104    (set_attr "prefix_data16" "1")
16105    (set_attr "prefix_extra" "1")
16106    (set_attr "length_immediate" "1")
16107    (set_attr "memory" "none,load,none,load")
16108    (set_attr "btver2_decode" "vector,vector,vector,vector") 
16109    (set_attr "prefix" "maybe_vex")
16110    (set_attr "mode" "TI")])
16111
16112 (define_insn_and_split "sse4_2_pcmpistr"
16113   [(set (match_operand:SI 0 "register_operand" "=c,c")
16114         (unspec:SI
16115           [(match_operand:V16QI 2 "register_operand" "x,x")
16116            (match_operand:V16QI 3 "nonimmediate_operand" "x,m")
16117            (match_operand:SI 4 "const_0_to_255_operand" "n,n")]
16118           UNSPEC_PCMPISTR))
16119    (set (match_operand:V16QI 1 "register_operand" "=Yz,Yz")
16120         (unspec:V16QI
16121           [(match_dup 2)
16122            (match_dup 3)
16123            (match_dup 4)]
16124           UNSPEC_PCMPISTR))
16125    (set (reg:CC FLAGS_REG)
16126         (unspec:CC
16127           [(match_dup 2)
16128            (match_dup 3)
16129            (match_dup 4)]
16130           UNSPEC_PCMPISTR))]
16131   "TARGET_SSE4_2
16132    && can_create_pseudo_p ()"
16133   "#"
16134   "&& 1"
16135   [(const_int 0)]
16136 {
16137   int ecx = !find_regno_note (curr_insn, REG_UNUSED, REGNO (operands[0]));
16138   int xmm0 = !find_regno_note (curr_insn, REG_UNUSED, REGNO (operands[1]));
16139   int flags = !find_regno_note (curr_insn, REG_UNUSED, FLAGS_REG);
16140
16141   if (ecx)
16142     emit_insn (gen_sse4_2_pcmpistri (operands[0], operands[2],
16143                                      operands[3], operands[4]));
16144   if (xmm0)
16145     emit_insn (gen_sse4_2_pcmpistrm (operands[1], operands[2],
16146                                      operands[3], operands[4]));
16147   if (flags && !(ecx || xmm0))
16148     emit_insn (gen_sse4_2_pcmpistr_cconly (NULL, NULL,
16149                                            operands[2], operands[3],
16150                                            operands[4]));
16151   if (!(flags || ecx || xmm0))
16152     emit_note (NOTE_INSN_DELETED);
16153
16154   DONE;
16155 }
16156   [(set_attr "type" "sselog")
16157    (set_attr "prefix_data16" "1")
16158    (set_attr "prefix_extra" "1")
16159    (set_attr "length_immediate" "1")
16160    (set_attr "memory" "none,load")
16161    (set_attr "mode" "TI")])
16162
16163 (define_insn "sse4_2_pcmpistri"
16164   [(set (match_operand:SI 0 "register_operand" "=c,c")
16165         (unspec:SI
16166           [(match_operand:V16QI 1 "register_operand" "x,x")
16167            (match_operand:V16QI 2 "nonimmediate_operand" "x,m")
16168            (match_operand:SI 3 "const_0_to_255_operand" "n,n")]
16169           UNSPEC_PCMPISTR))
16170    (set (reg:CC FLAGS_REG)
16171         (unspec:CC
16172           [(match_dup 1)
16173            (match_dup 2)
16174            (match_dup 3)]
16175           UNSPEC_PCMPISTR))]
16176   "TARGET_SSE4_2"
16177   "%vpcmpistri\t{%3, %2, %1|%1, %2, %3}"
16178   [(set_attr "type" "sselog")
16179    (set_attr "prefix_data16" "1")
16180    (set_attr "prefix_extra" "1")
16181    (set_attr "length_immediate" "1")
16182    (set_attr "prefix" "maybe_vex")
16183    (set_attr "memory" "none,load")
16184    (set_attr "btver2_decode" "vector")
16185    (set_attr "mode" "TI")])
16186
16187 (define_insn "sse4_2_pcmpistrm"
16188   [(set (match_operand:V16QI 0 "register_operand" "=Yz,Yz")
16189         (unspec:V16QI
16190           [(match_operand:V16QI 1 "register_operand" "x,x")
16191            (match_operand:V16QI 2 "nonimmediate_operand" "x,m")
16192            (match_operand:SI 3 "const_0_to_255_operand" "n,n")]
16193           UNSPEC_PCMPISTR))
16194    (set (reg:CC FLAGS_REG)
16195         (unspec:CC
16196           [(match_dup 1)
16197            (match_dup 2)
16198            (match_dup 3)]
16199           UNSPEC_PCMPISTR))]
16200   "TARGET_SSE4_2"
16201   "%vpcmpistrm\t{%3, %2, %1|%1, %2, %3}"
16202   [(set_attr "type" "sselog")
16203    (set_attr "prefix_data16" "1")
16204    (set_attr "prefix_extra" "1")
16205    (set_attr "length_immediate" "1")
16206    (set_attr "prefix" "maybe_vex")
16207    (set_attr "memory" "none,load")
16208    (set_attr "btver2_decode" "vector")
16209    (set_attr "mode" "TI")])
16210
16211 (define_insn "sse4_2_pcmpistr_cconly"
16212   [(set (reg:CC FLAGS_REG)
16213         (unspec:CC
16214           [(match_operand:V16QI 2 "register_operand" "x,x,x,x")
16215            (match_operand:V16QI 3 "nonimmediate_operand" "x,m,x,m")
16216            (match_operand:SI 4 "const_0_to_255_operand" "n,n,n,n")]
16217           UNSPEC_PCMPISTR))
16218    (clobber (match_scratch:V16QI 0 "=Yz,Yz,X,X"))
16219    (clobber (match_scratch:SI    1 "= X, X,c,c"))]
16220   "TARGET_SSE4_2"
16221   "@
16222    %vpcmpistrm\t{%4, %3, %2|%2, %3, %4}
16223    %vpcmpistrm\t{%4, %3, %2|%2, %3, %4}
16224    %vpcmpistri\t{%4, %3, %2|%2, %3, %4}
16225    %vpcmpistri\t{%4, %3, %2|%2, %3, %4}"
16226   [(set_attr "type" "sselog")
16227    (set_attr "prefix_data16" "1")
16228    (set_attr "prefix_extra" "1")
16229    (set_attr "length_immediate" "1")
16230    (set_attr "memory" "none,load,none,load")
16231    (set_attr "prefix" "maybe_vex")
16232    (set_attr "btver2_decode" "vector,vector,vector,vector")
16233    (set_attr "mode" "TI")])
16234
16235 ;; Packed float variants
16236 (define_mode_attr GATHER_SCATTER_SF_MEM_MODE
16237                       [(V8DI "V8SF") (V16SI "V16SF")])
16238
16239 (define_expand "avx512pf_gatherpf<mode>sf"
16240   [(unspec
16241      [(match_operand:<avx512fmaskmode> 0 "register_operand")
16242       (mem:<GATHER_SCATTER_SF_MEM_MODE>
16243         (match_par_dup 5
16244           [(match_operand 2 "vsib_address_operand")
16245            (match_operand:VI48_512 1 "register_operand")
16246            (match_operand:SI 3 "const1248_operand")]))
16247       (match_operand:SI 4 "const_2_to_3_operand")]
16248      UNSPEC_GATHER_PREFETCH)]
16249   "TARGET_AVX512PF"
16250 {
16251   operands[5]
16252     = gen_rtx_UNSPEC (Pmode, gen_rtvec (3, operands[2], operands[1],
16253                                         operands[3]), UNSPEC_VSIBADDR);
16254 })
16255
16256 (define_insn "*avx512pf_gatherpf<mode>sf_mask"
16257   [(unspec
16258      [(match_operand:<avx512fmaskmode> 0 "register_operand" "Yk")
16259       (match_operator:<GATHER_SCATTER_SF_MEM_MODE> 5 "vsib_mem_operator"
16260         [(unspec:P
16261            [(match_operand:P 2 "vsib_address_operand" "Tv")
16262             (match_operand:VI48_512 1 "register_operand" "v")
16263             (match_operand:SI 3 "const1248_operand" "n")]
16264            UNSPEC_VSIBADDR)])
16265       (match_operand:SI 4 "const_2_to_3_operand" "n")]
16266      UNSPEC_GATHER_PREFETCH)]
16267   "TARGET_AVX512PF"
16268 {
16269   switch (INTVAL (operands[4]))
16270     {
16271     case 3:
16272       /* %X5 so that we don't emit any *WORD PTR for -masm=intel, as
16273          gas changed what it requires incompatibly.  */
16274       return "vgatherpf0<ssemodesuffix>ps\t{%5%{%0%}|%X5%{%0%}}";
16275     case 2:
16276       return "vgatherpf1<ssemodesuffix>ps\t{%5%{%0%}|%X5%{%0%}}";
16277     default:
16278       gcc_unreachable ();
16279     }
16280 }
16281   [(set_attr "type" "sse")
16282    (set_attr "prefix" "evex")
16283    (set_attr "mode" "XI")])
16284
16285 ;; Packed double variants
16286 (define_expand "avx512pf_gatherpf<mode>df"
16287   [(unspec
16288      [(match_operand:<avx512fmaskmode> 0 "register_operand")
16289       (mem:V8DF
16290         (match_par_dup 5
16291           [(match_operand 2 "vsib_address_operand")
16292            (match_operand:VI4_256_8_512 1 "register_operand")
16293            (match_operand:SI 3 "const1248_operand")]))
16294       (match_operand:SI 4 "const_2_to_3_operand")]
16295      UNSPEC_GATHER_PREFETCH)]
16296   "TARGET_AVX512PF"
16297 {
16298   operands[5]
16299     = gen_rtx_UNSPEC (Pmode, gen_rtvec (3, operands[2], operands[1],
16300                                         operands[3]), UNSPEC_VSIBADDR);
16301 })
16302
16303 (define_insn "*avx512pf_gatherpf<mode>df_mask"
16304   [(unspec
16305      [(match_operand:<avx512fmaskmode> 0 "register_operand" "Yk")
16306       (match_operator:V8DF 5 "vsib_mem_operator"
16307         [(unspec:P
16308            [(match_operand:P 2 "vsib_address_operand" "Tv")
16309             (match_operand:VI4_256_8_512 1 "register_operand" "v")
16310             (match_operand:SI 3 "const1248_operand" "n")]
16311            UNSPEC_VSIBADDR)])
16312       (match_operand:SI 4 "const_2_to_3_operand" "n")]
16313      UNSPEC_GATHER_PREFETCH)]
16314   "TARGET_AVX512PF"
16315 {
16316   switch (INTVAL (operands[4]))
16317     {
16318     case 3:
16319       /* %X5 so that we don't emit any *WORD PTR for -masm=intel, as
16320          gas changed what it requires incompatibly.  */
16321       return "vgatherpf0<ssemodesuffix>pd\t{%5%{%0%}|%X5%{%0%}}";
16322     case 2:
16323       return "vgatherpf1<ssemodesuffix>pd\t{%5%{%0%}|%X5%{%0%}}";
16324     default:
16325       gcc_unreachable ();
16326     }
16327 }
16328   [(set_attr "type" "sse")
16329    (set_attr "prefix" "evex")
16330    (set_attr "mode" "XI")])
16331
16332 ;; Packed float variants
16333 (define_expand "avx512pf_scatterpf<mode>sf"
16334   [(unspec
16335      [(match_operand:<avx512fmaskmode> 0 "register_operand")
16336       (mem:<GATHER_SCATTER_SF_MEM_MODE>
16337         (match_par_dup 5
16338           [(match_operand 2 "vsib_address_operand")
16339            (match_operand:VI48_512 1 "register_operand")
16340            (match_operand:SI 3 "const1248_operand")]))
16341       (match_operand:SI 4 "const2367_operand")]
16342      UNSPEC_SCATTER_PREFETCH)]
16343   "TARGET_AVX512PF"
16344 {
16345   operands[5]
16346     = gen_rtx_UNSPEC (Pmode, gen_rtvec (3, operands[2], operands[1],
16347                                         operands[3]), UNSPEC_VSIBADDR);
16348 })
16349
16350 (define_insn "*avx512pf_scatterpf<mode>sf_mask"
16351   [(unspec
16352      [(match_operand:<avx512fmaskmode> 0 "register_operand" "Yk")
16353       (match_operator:<GATHER_SCATTER_SF_MEM_MODE> 5 "vsib_mem_operator"
16354         [(unspec:P
16355            [(match_operand:P 2 "vsib_address_operand" "Tv")
16356             (match_operand:VI48_512 1 "register_operand" "v")
16357             (match_operand:SI 3 "const1248_operand" "n")]
16358            UNSPEC_VSIBADDR)])
16359       (match_operand:SI 4 "const2367_operand" "n")]
16360      UNSPEC_SCATTER_PREFETCH)]
16361   "TARGET_AVX512PF"
16362 {
16363   switch (INTVAL (operands[4]))
16364     {
16365     case 3:
16366     case 7:
16367       /* %X5 so that we don't emit any *WORD PTR for -masm=intel, as
16368          gas changed what it requires incompatibly.  */
16369       return "vscatterpf0<ssemodesuffix>ps\t{%5%{%0%}|%X5%{%0%}}";
16370     case 2:
16371     case 6:
16372       return "vscatterpf1<ssemodesuffix>ps\t{%5%{%0%}|%X5%{%0%}}";
16373     default:
16374       gcc_unreachable ();
16375     }
16376 }
16377   [(set_attr "type" "sse")
16378    (set_attr "prefix" "evex")
16379    (set_attr "mode" "XI")])
16380
16381 ;; Packed double variants
16382 (define_expand "avx512pf_scatterpf<mode>df"
16383   [(unspec
16384      [(match_operand:<avx512fmaskmode> 0 "register_operand")
16385       (mem:V8DF
16386         (match_par_dup 5
16387           [(match_operand 2 "vsib_address_operand")
16388            (match_operand:VI4_256_8_512 1 "register_operand")
16389            (match_operand:SI 3 "const1248_operand")]))
16390       (match_operand:SI 4 "const2367_operand")]
16391      UNSPEC_SCATTER_PREFETCH)]
16392   "TARGET_AVX512PF"
16393 {
16394   operands[5]
16395     = gen_rtx_UNSPEC (Pmode, gen_rtvec (3, operands[2], operands[1],
16396                                         operands[3]), UNSPEC_VSIBADDR);
16397 })
16398
16399 (define_insn "*avx512pf_scatterpf<mode>df_mask"
16400   [(unspec
16401      [(match_operand:<avx512fmaskmode> 0 "register_operand" "Yk")
16402       (match_operator:V8DF 5 "vsib_mem_operator"
16403         [(unspec:P
16404            [(match_operand:P 2 "vsib_address_operand" "Tv")
16405             (match_operand:VI4_256_8_512 1 "register_operand" "v")
16406             (match_operand:SI 3 "const1248_operand" "n")]
16407            UNSPEC_VSIBADDR)])
16408       (match_operand:SI 4 "const2367_operand" "n")]
16409      UNSPEC_SCATTER_PREFETCH)]
16410   "TARGET_AVX512PF"
16411 {
16412   switch (INTVAL (operands[4]))
16413     {
16414     case 3:
16415     case 7:
16416       /* %X5 so that we don't emit any *WORD PTR for -masm=intel, as
16417          gas changed what it requires incompatibly.  */
16418       return "vscatterpf0<ssemodesuffix>pd\t{%5%{%0%}|%X5%{%0%}}";
16419     case 2:
16420     case 6:
16421       return "vscatterpf1<ssemodesuffix>pd\t{%5%{%0%}|%X5%{%0%}}";
16422     default:
16423       gcc_unreachable ();
16424     }
16425 }
16426   [(set_attr "type" "sse")
16427    (set_attr "prefix" "evex")
16428    (set_attr "mode" "XI")])
16429
16430 (define_insn "avx512er_exp2<mode><mask_name><round_saeonly_name>"
16431   [(set (match_operand:VF_512 0 "register_operand" "=v")
16432         (unspec:VF_512
16433           [(match_operand:VF_512 1 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")]
16434           UNSPEC_EXP2))]
16435   "TARGET_AVX512ER"
16436   "vexp2<ssemodesuffix>\t{<round_saeonly_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_saeonly_mask_op2>}"
16437   [(set_attr "prefix" "evex")
16438    (set_attr "type" "sse")
16439    (set_attr "mode" "<MODE>")])
16440
16441 (define_insn "<mask_codefor>avx512er_rcp28<mode><mask_name><round_saeonly_name>"
16442   [(set (match_operand:VF_512 0 "register_operand" "=v")
16443         (unspec:VF_512
16444           [(match_operand:VF_512 1 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")]
16445           UNSPEC_RCP28))]
16446   "TARGET_AVX512ER"
16447   "vrcp28<ssemodesuffix>\t{<round_saeonly_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_saeonly_mask_op2>}"
16448   [(set_attr "prefix" "evex")
16449    (set_attr "type" "sse")
16450    (set_attr "mode" "<MODE>")])
16451
16452 (define_insn "avx512er_vmrcp28<mode><round_saeonly_name>"
16453   [(set (match_operand:VF_128 0 "register_operand" "=v")
16454         (vec_merge:VF_128
16455           (unspec:VF_128
16456             [(match_operand:VF_128 1 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")]
16457             UNSPEC_RCP28)
16458           (match_operand:VF_128 2 "register_operand" "v")
16459           (const_int 1)))]
16460   "TARGET_AVX512ER"
16461   "vrcp28<ssescalarmodesuffix>\t{<round_saeonly_op3>%1, %2, %0|%0, %2, %<iptr>1<round_saeonly_op3>}"
16462   [(set_attr "length_immediate" "1")
16463    (set_attr "prefix" "evex")
16464    (set_attr "type" "sse")
16465    (set_attr "mode" "<MODE>")])
16466
16467 (define_insn "<mask_codefor>avx512er_rsqrt28<mode><mask_name><round_saeonly_name>"
16468   [(set (match_operand:VF_512 0 "register_operand" "=v")
16469         (unspec:VF_512
16470           [(match_operand:VF_512 1 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")]
16471           UNSPEC_RSQRT28))]
16472   "TARGET_AVX512ER"
16473   "vrsqrt28<ssemodesuffix>\t{<round_saeonly_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_saeonly_mask_op2>}"
16474   [(set_attr "prefix" "evex")
16475    (set_attr "type" "sse")
16476    (set_attr "mode" "<MODE>")])
16477
16478 (define_insn "avx512er_vmrsqrt28<mode><round_saeonly_name>"
16479   [(set (match_operand:VF_128 0 "register_operand" "=v")
16480         (vec_merge:VF_128
16481           (unspec:VF_128
16482             [(match_operand:VF_128 1 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")]
16483             UNSPEC_RSQRT28)
16484           (match_operand:VF_128 2 "register_operand" "v")
16485           (const_int 1)))]
16486   "TARGET_AVX512ER"
16487   "vrsqrt28<ssescalarmodesuffix>\t{<round_saeonly_op3>%1, %2, %0|%0, %2, %<iptr>1<round_saeonly_op3>}"
16488   [(set_attr "length_immediate" "1")
16489    (set_attr "type" "sse")
16490    (set_attr "prefix" "evex")
16491    (set_attr "mode" "<MODE>")])
16492
16493 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
16494 ;;
16495 ;; XOP instructions
16496 ;;
16497 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
16498
16499 (define_code_iterator xop_plus [plus ss_plus])
16500
16501 (define_code_attr macs [(plus "macs") (ss_plus "macss")])
16502 (define_code_attr madcs [(plus "madcs") (ss_plus "madcss")])
16503
16504 ;; XOP parallel integer multiply/add instructions.
16505
16506 (define_insn "xop_p<macs><ssemodesuffix><ssemodesuffix>"
16507   [(set (match_operand:VI24_128 0 "register_operand" "=x")
16508         (xop_plus:VI24_128
16509          (mult:VI24_128
16510           (match_operand:VI24_128 1 "nonimmediate_operand" "%x")
16511           (match_operand:VI24_128 2 "nonimmediate_operand" "xm"))
16512          (match_operand:VI24_128 3 "register_operand" "x")))]
16513   "TARGET_XOP"
16514   "vp<macs><ssemodesuffix><ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
16515   [(set_attr "type" "ssemuladd")
16516    (set_attr "mode" "TI")])
16517
16518 (define_insn "xop_p<macs>dql"
16519   [(set (match_operand:V2DI 0 "register_operand" "=x")
16520         (xop_plus:V2DI
16521          (mult:V2DI
16522           (sign_extend:V2DI
16523            (vec_select:V2SI
16524             (match_operand:V4SI 1 "nonimmediate_operand" "%x")
16525             (parallel [(const_int 0) (const_int 2)])))
16526           (sign_extend:V2DI
16527            (vec_select:V2SI
16528             (match_operand:V4SI 2 "nonimmediate_operand" "xm")
16529             (parallel [(const_int 0) (const_int 2)]))))
16530          (match_operand:V2DI 3 "register_operand" "x")))]
16531   "TARGET_XOP"
16532   "vp<macs>dql\t{%3, %2, %1, %0|%0, %1, %2, %3}"
16533   [(set_attr "type" "ssemuladd")
16534    (set_attr "mode" "TI")])
16535
16536 (define_insn "xop_p<macs>dqh"
16537   [(set (match_operand:V2DI 0 "register_operand" "=x")
16538         (xop_plus:V2DI
16539          (mult:V2DI
16540           (sign_extend:V2DI
16541            (vec_select:V2SI
16542             (match_operand:V4SI 1 "nonimmediate_operand" "%x")
16543             (parallel [(const_int 1) (const_int 3)])))
16544           (sign_extend:V2DI
16545            (vec_select:V2SI
16546             (match_operand:V4SI 2 "nonimmediate_operand" "xm")
16547             (parallel [(const_int 1) (const_int 3)]))))
16548          (match_operand:V2DI 3 "register_operand" "x")))]
16549   "TARGET_XOP"
16550   "vp<macs>dqh\t{%3, %2, %1, %0|%0, %1, %2, %3}"
16551   [(set_attr "type" "ssemuladd")
16552    (set_attr "mode" "TI")])
16553
16554 ;; XOP parallel integer multiply/add instructions for the intrinisics
16555 (define_insn "xop_p<macs>wd"
16556   [(set (match_operand:V4SI 0 "register_operand" "=x")
16557         (xop_plus:V4SI
16558          (mult:V4SI
16559           (sign_extend:V4SI
16560            (vec_select:V4HI
16561             (match_operand:V8HI 1 "nonimmediate_operand" "%x")
16562             (parallel [(const_int 1) (const_int 3)
16563                        (const_int 5) (const_int 7)])))
16564           (sign_extend:V4SI
16565            (vec_select:V4HI
16566             (match_operand:V8HI 2 "nonimmediate_operand" "xm")
16567             (parallel [(const_int 1) (const_int 3)
16568                        (const_int 5) (const_int 7)]))))
16569          (match_operand:V4SI 3 "register_operand" "x")))]
16570   "TARGET_XOP"
16571   "vp<macs>wd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
16572   [(set_attr "type" "ssemuladd")
16573    (set_attr "mode" "TI")])
16574
16575 (define_insn "xop_p<madcs>wd"
16576   [(set (match_operand:V4SI 0 "register_operand" "=x")
16577         (xop_plus:V4SI
16578          (plus:V4SI
16579           (mult:V4SI
16580            (sign_extend:V4SI
16581             (vec_select:V4HI
16582              (match_operand:V8HI 1 "nonimmediate_operand" "%x")
16583              (parallel [(const_int 0) (const_int 2)
16584                         (const_int 4) (const_int 6)])))
16585            (sign_extend:V4SI
16586             (vec_select:V4HI
16587              (match_operand:V8HI 2 "nonimmediate_operand" "xm")
16588              (parallel [(const_int 0) (const_int 2)
16589                         (const_int 4) (const_int 6)]))))
16590           (mult:V4SI
16591            (sign_extend:V4SI
16592             (vec_select:V4HI
16593              (match_dup 1)
16594              (parallel [(const_int 1) (const_int 3)
16595                         (const_int 5) (const_int 7)])))
16596            (sign_extend:V4SI
16597             (vec_select:V4HI
16598              (match_dup 2)
16599              (parallel [(const_int 1) (const_int 3)
16600                         (const_int 5) (const_int 7)])))))
16601          (match_operand:V4SI 3 "register_operand" "x")))]
16602   "TARGET_XOP"
16603   "vp<madcs>wd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
16604   [(set_attr "type" "ssemuladd")
16605    (set_attr "mode" "TI")])
16606
16607 ;; XOP parallel XMM conditional moves
16608 (define_insn "xop_pcmov_<mode><avxsizesuffix>"
16609   [(set (match_operand:V_128_256 0 "register_operand" "=x,x")
16610         (if_then_else:V_128_256
16611           (match_operand:V_128_256 3 "nonimmediate_operand" "x,m")
16612           (match_operand:V_128_256 1 "register_operand" "x,x")
16613           (match_operand:V_128_256 2 "nonimmediate_operand" "xm,x")))]
16614   "TARGET_XOP"
16615   "vpcmov\t{%3, %2, %1, %0|%0, %1, %2, %3}"
16616   [(set_attr "type" "sse4arg")])
16617
16618 ;; XOP horizontal add/subtract instructions
16619 (define_insn "xop_phadd<u>bw"
16620   [(set (match_operand:V8HI 0 "register_operand" "=x")
16621         (plus:V8HI
16622          (any_extend:V8HI
16623           (vec_select:V8QI
16624            (match_operand:V16QI 1 "nonimmediate_operand" "xm")
16625            (parallel [(const_int 0) (const_int 2)
16626                       (const_int 4) (const_int 6)
16627                       (const_int 8) (const_int 10)
16628                       (const_int 12) (const_int 14)])))
16629          (any_extend:V8HI
16630           (vec_select:V8QI
16631            (match_dup 1)
16632            (parallel [(const_int 1) (const_int 3)
16633                       (const_int 5) (const_int 7)
16634                       (const_int 9) (const_int 11)
16635                       (const_int 13) (const_int 15)])))))]
16636   "TARGET_XOP"
16637   "vphadd<u>bw\t{%1, %0|%0, %1}"
16638   [(set_attr "type" "sseiadd1")])
16639
16640 (define_insn "xop_phadd<u>bd"
16641   [(set (match_operand:V4SI 0 "register_operand" "=x")
16642         (plus:V4SI
16643          (plus:V4SI
16644           (any_extend:V4SI
16645            (vec_select:V4QI
16646             (match_operand:V16QI 1 "nonimmediate_operand" "xm")
16647             (parallel [(const_int 0) (const_int 4)
16648                        (const_int 8) (const_int 12)])))
16649           (any_extend:V4SI
16650            (vec_select:V4QI
16651             (match_dup 1)
16652             (parallel [(const_int 1) (const_int 5)
16653                        (const_int 9) (const_int 13)]))))
16654          (plus:V4SI
16655           (any_extend:V4SI
16656            (vec_select:V4QI
16657             (match_dup 1)
16658             (parallel [(const_int 2) (const_int 6)
16659                        (const_int 10) (const_int 14)])))
16660           (any_extend:V4SI
16661            (vec_select:V4QI
16662             (match_dup 1)
16663             (parallel [(const_int 3) (const_int 7)
16664                        (const_int 11) (const_int 15)]))))))]
16665   "TARGET_XOP"
16666   "vphadd<u>bd\t{%1, %0|%0, %1}"
16667   [(set_attr "type" "sseiadd1")])
16668
16669 (define_insn "xop_phadd<u>bq"
16670   [(set (match_operand:V2DI 0 "register_operand" "=x")
16671         (plus:V2DI
16672          (plus:V2DI
16673           (plus:V2DI
16674            (any_extend:V2DI
16675             (vec_select:V2QI
16676              (match_operand:V16QI 1 "nonimmediate_operand" "xm")
16677              (parallel [(const_int 0) (const_int 8)])))
16678            (any_extend:V2DI
16679             (vec_select:V2QI
16680              (match_dup 1)
16681              (parallel [(const_int 1) (const_int 9)]))))
16682           (plus:V2DI
16683            (any_extend:V2DI
16684             (vec_select:V2QI
16685              (match_dup 1)
16686              (parallel [(const_int 2) (const_int 10)])))
16687            (any_extend:V2DI
16688             (vec_select:V2QI
16689              (match_dup 1)
16690              (parallel [(const_int 3) (const_int 11)])))))
16691          (plus:V2DI
16692           (plus:V2DI
16693            (any_extend:V2DI
16694             (vec_select:V2QI
16695              (match_dup 1)
16696              (parallel [(const_int 4) (const_int 12)])))
16697            (any_extend:V2DI
16698             (vec_select:V2QI
16699              (match_dup 1)
16700              (parallel [(const_int 5) (const_int 13)]))))
16701           (plus:V2DI
16702            (any_extend:V2DI
16703             (vec_select:V2QI
16704              (match_dup 1)
16705              (parallel [(const_int 6) (const_int 14)])))
16706            (any_extend:V2DI
16707             (vec_select:V2QI
16708              (match_dup 1)
16709              (parallel [(const_int 7) (const_int 15)])))))))]
16710   "TARGET_XOP"
16711   "vphadd<u>bq\t{%1, %0|%0, %1}"
16712   [(set_attr "type" "sseiadd1")])
16713
16714 (define_insn "xop_phadd<u>wd"
16715   [(set (match_operand:V4SI 0 "register_operand" "=x")
16716         (plus:V4SI
16717          (any_extend:V4SI
16718           (vec_select:V4HI
16719            (match_operand:V8HI 1 "nonimmediate_operand" "xm")
16720            (parallel [(const_int 0) (const_int 2)
16721                       (const_int 4) (const_int 6)])))
16722          (any_extend:V4SI
16723           (vec_select:V4HI
16724            (match_dup 1)
16725            (parallel [(const_int 1) (const_int 3)
16726                       (const_int 5) (const_int 7)])))))]
16727   "TARGET_XOP"
16728   "vphadd<u>wd\t{%1, %0|%0, %1}"
16729   [(set_attr "type" "sseiadd1")])
16730
16731 (define_insn "xop_phadd<u>wq"
16732   [(set (match_operand:V2DI 0 "register_operand" "=x")
16733         (plus:V2DI
16734          (plus:V2DI
16735           (any_extend:V2DI
16736            (vec_select:V2HI
16737             (match_operand:V8HI 1 "nonimmediate_operand" "xm")
16738             (parallel [(const_int 0) (const_int 4)])))
16739           (any_extend:V2DI
16740            (vec_select:V2HI
16741             (match_dup 1)
16742             (parallel [(const_int 1) (const_int 5)]))))
16743          (plus:V2DI
16744           (any_extend:V2DI
16745            (vec_select:V2HI
16746             (match_dup 1)
16747             (parallel [(const_int 2) (const_int 6)])))
16748           (any_extend:V2DI
16749            (vec_select:V2HI
16750             (match_dup 1)
16751             (parallel [(const_int 3) (const_int 7)]))))))]
16752   "TARGET_XOP"
16753   "vphadd<u>wq\t{%1, %0|%0, %1}"
16754   [(set_attr "type" "sseiadd1")])
16755
16756 (define_insn "xop_phadd<u>dq"
16757   [(set (match_operand:V2DI 0 "register_operand" "=x")
16758         (plus:V2DI
16759          (any_extend:V2DI
16760           (vec_select:V2SI
16761            (match_operand:V4SI 1 "nonimmediate_operand" "xm")
16762            (parallel [(const_int 0) (const_int 2)])))
16763          (any_extend:V2DI
16764           (vec_select:V2SI
16765            (match_dup 1)
16766            (parallel [(const_int 1) (const_int 3)])))))]
16767   "TARGET_XOP"
16768   "vphadd<u>dq\t{%1, %0|%0, %1}"
16769   [(set_attr "type" "sseiadd1")])
16770
16771 (define_insn "xop_phsubbw"
16772   [(set (match_operand:V8HI 0 "register_operand" "=x")
16773         (minus:V8HI
16774          (sign_extend:V8HI
16775           (vec_select:V8QI
16776            (match_operand:V16QI 1 "nonimmediate_operand" "xm")
16777            (parallel [(const_int 0) (const_int 2)
16778                       (const_int 4) (const_int 6)
16779                       (const_int 8) (const_int 10)
16780                       (const_int 12) (const_int 14)])))
16781          (sign_extend:V8HI
16782           (vec_select:V8QI
16783            (match_dup 1)
16784            (parallel [(const_int 1) (const_int 3)
16785                       (const_int 5) (const_int 7)
16786                       (const_int 9) (const_int 11)
16787                       (const_int 13) (const_int 15)])))))]
16788   "TARGET_XOP"
16789   "vphsubbw\t{%1, %0|%0, %1}"
16790   [(set_attr "type" "sseiadd1")])
16791
16792 (define_insn "xop_phsubwd"
16793   [(set (match_operand:V4SI 0 "register_operand" "=x")
16794         (minus:V4SI
16795          (sign_extend:V4SI
16796           (vec_select:V4HI
16797            (match_operand:V8HI 1 "nonimmediate_operand" "xm")
16798            (parallel [(const_int 0) (const_int 2)
16799                       (const_int 4) (const_int 6)])))
16800          (sign_extend:V4SI
16801           (vec_select:V4HI
16802            (match_dup 1)
16803            (parallel [(const_int 1) (const_int 3)
16804                       (const_int 5) (const_int 7)])))))]
16805   "TARGET_XOP"
16806   "vphsubwd\t{%1, %0|%0, %1}"
16807   [(set_attr "type" "sseiadd1")])
16808
16809 (define_insn "xop_phsubdq"
16810   [(set (match_operand:V2DI 0 "register_operand" "=x")
16811         (minus:V2DI
16812          (sign_extend:V2DI
16813           (vec_select:V2SI
16814            (match_operand:V4SI 1 "nonimmediate_operand" "xm")
16815            (parallel [(const_int 0) (const_int 2)])))
16816          (sign_extend:V2DI
16817           (vec_select:V2SI
16818            (match_dup 1)
16819            (parallel [(const_int 1) (const_int 3)])))))]
16820   "TARGET_XOP"
16821   "vphsubdq\t{%1, %0|%0, %1}"
16822   [(set_attr "type" "sseiadd1")])
16823
16824 ;; XOP permute instructions
16825 (define_insn "xop_pperm"
16826   [(set (match_operand:V16QI 0 "register_operand" "=x,x")
16827         (unspec:V16QI
16828           [(match_operand:V16QI 1 "register_operand" "x,x")
16829            (match_operand:V16QI 2 "nonimmediate_operand" "x,m")
16830            (match_operand:V16QI 3 "nonimmediate_operand" "xm,x")]
16831           UNSPEC_XOP_PERMUTE))]
16832   "TARGET_XOP && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
16833   "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
16834   [(set_attr "type" "sse4arg")
16835    (set_attr "mode" "TI")])
16836
16837 ;; XOP pack instructions that combine two vectors into a smaller vector
16838 (define_insn "xop_pperm_pack_v2di_v4si"
16839   [(set (match_operand:V4SI 0 "register_operand" "=x,x")
16840         (vec_concat:V4SI
16841          (truncate:V2SI
16842           (match_operand:V2DI 1 "register_operand" "x,x"))
16843          (truncate:V2SI
16844           (match_operand:V2DI 2 "nonimmediate_operand" "x,m"))))
16845    (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x"))]
16846   "TARGET_XOP && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
16847   "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
16848   [(set_attr "type" "sse4arg")
16849    (set_attr "mode" "TI")])
16850
16851 (define_insn "xop_pperm_pack_v4si_v8hi"
16852   [(set (match_operand:V8HI 0 "register_operand" "=x,x")
16853         (vec_concat:V8HI
16854          (truncate:V4HI
16855           (match_operand:V4SI 1 "register_operand" "x,x"))
16856          (truncate:V4HI
16857           (match_operand:V4SI 2 "nonimmediate_operand" "x,m"))))
16858    (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x"))]
16859   "TARGET_XOP && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
16860   "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
16861   [(set_attr "type" "sse4arg")
16862    (set_attr "mode" "TI")])
16863
16864 (define_insn "xop_pperm_pack_v8hi_v16qi"
16865   [(set (match_operand:V16QI 0 "register_operand" "=x,x")
16866         (vec_concat:V16QI
16867          (truncate:V8QI
16868           (match_operand:V8HI 1 "register_operand" "x,x"))
16869          (truncate:V8QI
16870           (match_operand:V8HI 2 "nonimmediate_operand" "x,m"))))
16871    (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x"))]
16872   "TARGET_XOP && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
16873   "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
16874   [(set_attr "type" "sse4arg")
16875    (set_attr "mode" "TI")])
16876
16877 ;; XOP packed rotate instructions
16878 (define_expand "rotl<mode>3"
16879   [(set (match_operand:VI_128 0 "register_operand")
16880         (rotate:VI_128
16881          (match_operand:VI_128 1 "nonimmediate_operand")
16882          (match_operand:SI 2 "general_operand")))]
16883   "TARGET_XOP"
16884 {
16885   /* If we were given a scalar, convert it to parallel */
16886   if (! const_0_to_<sserotatemax>_operand (operands[2], SImode))
16887     {
16888       rtvec vs = rtvec_alloc (<ssescalarnum>);
16889       rtx par = gen_rtx_PARALLEL (<MODE>mode, vs);
16890       rtx reg = gen_reg_rtx (<MODE>mode);
16891       rtx op2 = operands[2];
16892       int i;
16893
16894       if (GET_MODE (op2) != <ssescalarmode>mode)
16895         {
16896           op2 = gen_reg_rtx (<ssescalarmode>mode);
16897           convert_move (op2, operands[2], false);
16898         }
16899
16900       for (i = 0; i < <ssescalarnum>; i++)
16901         RTVEC_ELT (vs, i) = op2;
16902
16903       emit_insn (gen_vec_init<mode><ssescalarmodelower> (reg, par));
16904       emit_insn (gen_xop_vrotl<mode>3 (operands[0], operands[1], reg));
16905       DONE;
16906     }
16907 })
16908
16909 (define_expand "rotr<mode>3"
16910   [(set (match_operand:VI_128 0 "register_operand")
16911         (rotatert:VI_128
16912          (match_operand:VI_128 1 "nonimmediate_operand")
16913          (match_operand:SI 2 "general_operand")))]
16914   "TARGET_XOP"
16915 {
16916   /* If we were given a scalar, convert it to parallel */
16917   if (! const_0_to_<sserotatemax>_operand (operands[2], SImode))
16918     {
16919       rtvec vs = rtvec_alloc (<ssescalarnum>);
16920       rtx par = gen_rtx_PARALLEL (<MODE>mode, vs);
16921       rtx neg = gen_reg_rtx (<MODE>mode);
16922       rtx reg = gen_reg_rtx (<MODE>mode);
16923       rtx op2 = operands[2];
16924       int i;
16925
16926       if (GET_MODE (op2) != <ssescalarmode>mode)
16927         {
16928           op2 = gen_reg_rtx (<ssescalarmode>mode);
16929           convert_move (op2, operands[2], false);
16930         }
16931
16932       for (i = 0; i < <ssescalarnum>; i++)
16933         RTVEC_ELT (vs, i) = op2;
16934
16935       emit_insn (gen_vec_init<mode><ssescalarmodelower> (reg, par));
16936       emit_insn (gen_neg<mode>2 (neg, reg));
16937       emit_insn (gen_xop_vrotl<mode>3 (operands[0], operands[1], neg));
16938       DONE;
16939     }
16940 })
16941
16942 (define_insn "xop_rotl<mode>3"
16943   [(set (match_operand:VI_128 0 "register_operand" "=x")
16944         (rotate:VI_128
16945          (match_operand:VI_128 1 "nonimmediate_operand" "xm")
16946          (match_operand:SI 2 "const_0_to_<sserotatemax>_operand" "n")))]
16947   "TARGET_XOP"
16948   "vprot<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
16949   [(set_attr "type" "sseishft")
16950    (set_attr "length_immediate" "1")
16951    (set_attr "mode" "TI")])
16952
16953 (define_insn "xop_rotr<mode>3"
16954   [(set (match_operand:VI_128 0 "register_operand" "=x")
16955         (rotatert:VI_128
16956          (match_operand:VI_128 1 "nonimmediate_operand" "xm")
16957          (match_operand:SI 2 "const_0_to_<sserotatemax>_operand" "n")))]
16958   "TARGET_XOP"
16959 {
16960   operands[3]
16961     = GEN_INT (GET_MODE_BITSIZE (<ssescalarmode>mode) - INTVAL (operands[2]));
16962   return \"vprot<ssemodesuffix>\t{%3, %1, %0|%0, %1, %3}\";
16963 }
16964   [(set_attr "type" "sseishft")
16965    (set_attr "length_immediate" "1")
16966    (set_attr "mode" "TI")])
16967
16968 (define_expand "vrotr<mode>3"
16969   [(match_operand:VI_128 0 "register_operand")
16970    (match_operand:VI_128 1 "register_operand")
16971    (match_operand:VI_128 2 "register_operand")]
16972   "TARGET_XOP"
16973 {
16974   rtx reg = gen_reg_rtx (<MODE>mode);
16975   emit_insn (gen_neg<mode>2 (reg, operands[2]));
16976   emit_insn (gen_xop_vrotl<mode>3 (operands[0], operands[1], reg));
16977   DONE;
16978 })
16979
16980 (define_expand "vrotl<mode>3"
16981   [(match_operand:VI_128 0 "register_operand")
16982    (match_operand:VI_128 1 "register_operand")
16983    (match_operand:VI_128 2 "register_operand")]
16984   "TARGET_XOP"
16985 {
16986   emit_insn (gen_xop_vrotl<mode>3 (operands[0], operands[1], operands[2]));
16987   DONE;
16988 })
16989
16990 (define_insn "xop_vrotl<mode>3"
16991   [(set (match_operand:VI_128 0 "register_operand" "=x,x")
16992         (if_then_else:VI_128
16993          (ge:VI_128
16994           (match_operand:VI_128 2 "nonimmediate_operand" "x,m")
16995           (const_int 0))
16996          (rotate:VI_128
16997           (match_operand:VI_128 1 "nonimmediate_operand" "xm,x")
16998           (match_dup 2))
16999          (rotatert:VI_128
17000           (match_dup 1)
17001           (neg:VI_128 (match_dup 2)))))]
17002   "TARGET_XOP && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
17003   "vprot<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
17004   [(set_attr "type" "sseishft")
17005    (set_attr "prefix_data16" "0")
17006    (set_attr "prefix_extra" "2")
17007    (set_attr "mode" "TI")])
17008
17009 ;; XOP packed shift instructions.
17010 (define_expand "vlshr<mode>3"
17011   [(set (match_operand:VI12_128 0 "register_operand")
17012         (lshiftrt:VI12_128
17013           (match_operand:VI12_128 1 "register_operand")
17014           (match_operand:VI12_128 2 "nonimmediate_operand")))]
17015   "TARGET_XOP"
17016 {
17017   rtx neg = gen_reg_rtx (<MODE>mode);
17018   emit_insn (gen_neg<mode>2 (neg, operands[2]));
17019   emit_insn (gen_xop_shl<mode>3 (operands[0], operands[1], neg));
17020   DONE;
17021 })
17022
17023 (define_expand "vlshr<mode>3"
17024   [(set (match_operand:VI48_128 0 "register_operand")
17025         (lshiftrt:VI48_128
17026           (match_operand:VI48_128 1 "register_operand")
17027           (match_operand:VI48_128 2 "nonimmediate_operand")))]
17028   "TARGET_AVX2 || TARGET_XOP"
17029 {
17030   if (!TARGET_AVX2)
17031     {
17032       rtx neg = gen_reg_rtx (<MODE>mode);
17033       emit_insn (gen_neg<mode>2 (neg, operands[2]));
17034       emit_insn (gen_xop_shl<mode>3 (operands[0], operands[1], neg));
17035       DONE;
17036     }
17037 })
17038
17039 (define_expand "vlshr<mode>3"
17040   [(set (match_operand:VI48_512 0 "register_operand")
17041         (lshiftrt:VI48_512
17042           (match_operand:VI48_512 1 "register_operand")
17043           (match_operand:VI48_512 2 "nonimmediate_operand")))]
17044   "TARGET_AVX512F")
17045
17046 (define_expand "vlshr<mode>3"
17047   [(set (match_operand:VI48_256 0 "register_operand")
17048         (lshiftrt:VI48_256
17049           (match_operand:VI48_256 1 "register_operand")
17050           (match_operand:VI48_256 2 "nonimmediate_operand")))]
17051   "TARGET_AVX2")
17052
17053 (define_expand "vashrv8hi3<mask_name>"
17054   [(set (match_operand:V8HI 0 "register_operand")
17055         (ashiftrt:V8HI
17056           (match_operand:V8HI 1 "register_operand")
17057           (match_operand:V8HI 2 "nonimmediate_operand")))]
17058   "TARGET_XOP || (TARGET_AVX512BW && TARGET_AVX512VL)"
17059 {
17060   if (TARGET_XOP)
17061     {
17062       rtx neg = gen_reg_rtx (V8HImode);
17063       emit_insn (gen_negv8hi2 (neg, operands[2]));
17064       emit_insn (gen_xop_shav8hi3 (operands[0], operands[1], neg));
17065       DONE;
17066     }
17067 })
17068
17069 (define_expand "vashrv16qi3"
17070   [(set (match_operand:V16QI 0 "register_operand")
17071         (ashiftrt:V16QI
17072           (match_operand:V16QI 1 "register_operand")
17073           (match_operand:V16QI 2 "nonimmediate_operand")))]
17074   "TARGET_XOP"
17075 {
17076    rtx neg = gen_reg_rtx (V16QImode);
17077    emit_insn (gen_negv16qi2 (neg, operands[2]));
17078    emit_insn (gen_xop_shav16qi3 (operands[0], operands[1], neg));
17079    DONE;
17080 })
17081
17082 (define_expand "vashrv2di3<mask_name>"
17083   [(set (match_operand:V2DI 0 "register_operand")
17084         (ashiftrt:V2DI
17085           (match_operand:V2DI 1 "register_operand")
17086           (match_operand:V2DI 2 "nonimmediate_operand")))]
17087   "TARGET_XOP || TARGET_AVX512VL"
17088 {
17089   if (TARGET_XOP)
17090     {
17091       rtx neg = gen_reg_rtx (V2DImode);
17092       emit_insn (gen_negv2di2 (neg, operands[2]));
17093       emit_insn (gen_xop_shav2di3 (operands[0], operands[1], neg));
17094       DONE;
17095     }
17096 })
17097
17098 (define_expand "vashrv4si3"
17099   [(set (match_operand:V4SI 0 "register_operand")
17100         (ashiftrt:V4SI (match_operand:V4SI 1 "register_operand")
17101                        (match_operand:V4SI 2 "nonimmediate_operand")))]
17102   "TARGET_AVX2 || TARGET_XOP"
17103 {
17104   if (!TARGET_AVX2)
17105     {
17106       rtx neg = gen_reg_rtx (V4SImode);
17107       emit_insn (gen_negv4si2 (neg, operands[2]));
17108       emit_insn (gen_xop_shav4si3 (operands[0], operands[1], neg));
17109       DONE;
17110     }
17111 })
17112
17113 (define_expand "vashrv16si3"
17114   [(set (match_operand:V16SI 0 "register_operand")
17115         (ashiftrt:V16SI (match_operand:V16SI 1 "register_operand")
17116                         (match_operand:V16SI 2 "nonimmediate_operand")))]
17117   "TARGET_AVX512F")
17118
17119 (define_expand "vashrv8si3"
17120   [(set (match_operand:V8SI 0 "register_operand")
17121         (ashiftrt:V8SI (match_operand:V8SI 1 "register_operand")
17122                        (match_operand:V8SI 2 "nonimmediate_operand")))]
17123   "TARGET_AVX2")
17124
17125 (define_expand "vashl<mode>3"
17126   [(set (match_operand:VI12_128 0 "register_operand")
17127         (ashift:VI12_128
17128           (match_operand:VI12_128 1 "register_operand")
17129           (match_operand:VI12_128 2 "nonimmediate_operand")))]
17130   "TARGET_XOP"
17131 {
17132   emit_insn (gen_xop_sha<mode>3 (operands[0], operands[1], operands[2]));
17133   DONE;
17134 })
17135
17136 (define_expand "vashl<mode>3"
17137   [(set (match_operand:VI48_128 0 "register_operand")
17138         (ashift:VI48_128
17139           (match_operand:VI48_128 1 "register_operand")
17140           (match_operand:VI48_128 2 "nonimmediate_operand")))]
17141   "TARGET_AVX2 || TARGET_XOP"
17142 {
17143   if (!TARGET_AVX2)
17144     {
17145       operands[2] = force_reg (<MODE>mode, operands[2]);
17146       emit_insn (gen_xop_sha<mode>3 (operands[0], operands[1], operands[2]));
17147       DONE;
17148     }
17149 })
17150
17151 (define_expand "vashl<mode>3"
17152   [(set (match_operand:VI48_512 0 "register_operand")
17153         (ashift:VI48_512
17154           (match_operand:VI48_512 1 "register_operand")
17155           (match_operand:VI48_512 2 "nonimmediate_operand")))]
17156   "TARGET_AVX512F")
17157
17158 (define_expand "vashl<mode>3"
17159   [(set (match_operand:VI48_256 0 "register_operand")
17160         (ashift:VI48_256
17161           (match_operand:VI48_256 1 "register_operand")
17162           (match_operand:VI48_256 2 "nonimmediate_operand")))]
17163   "TARGET_AVX2")
17164
17165 (define_insn "xop_sha<mode>3"
17166   [(set (match_operand:VI_128 0 "register_operand" "=x,x")
17167         (if_then_else:VI_128
17168          (ge:VI_128
17169           (match_operand:VI_128 2 "nonimmediate_operand" "x,m")
17170           (const_int 0))
17171          (ashift:VI_128
17172           (match_operand:VI_128 1 "nonimmediate_operand" "xm,x")
17173           (match_dup 2))
17174          (ashiftrt:VI_128
17175           (match_dup 1)
17176           (neg:VI_128 (match_dup 2)))))]
17177   "TARGET_XOP && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
17178   "vpsha<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
17179   [(set_attr "type" "sseishft")
17180    (set_attr "prefix_data16" "0")
17181    (set_attr "prefix_extra" "2")
17182    (set_attr "mode" "TI")])
17183
17184 (define_insn "xop_shl<mode>3"
17185   [(set (match_operand:VI_128 0 "register_operand" "=x,x")
17186         (if_then_else:VI_128
17187          (ge:VI_128
17188           (match_operand:VI_128 2 "nonimmediate_operand" "x,m")
17189           (const_int 0))
17190          (ashift:VI_128
17191           (match_operand:VI_128 1 "nonimmediate_operand" "xm,x")
17192           (match_dup 2))
17193          (lshiftrt:VI_128
17194           (match_dup 1)
17195           (neg:VI_128 (match_dup 2)))))]
17196   "TARGET_XOP && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
17197   "vpshl<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
17198   [(set_attr "type" "sseishft")
17199    (set_attr "prefix_data16" "0")
17200    (set_attr "prefix_extra" "2")
17201    (set_attr "mode" "TI")])
17202
17203 (define_expand "<shift_insn><mode>3"
17204   [(set (match_operand:VI1_AVX512 0 "register_operand")
17205         (any_shift:VI1_AVX512
17206           (match_operand:VI1_AVX512 1 "register_operand")
17207           (match_operand:SI 2 "nonmemory_operand")))]
17208   "TARGET_SSE2"
17209 {
17210   if (TARGET_XOP && <MODE>mode == V16QImode)
17211     {
17212       bool negate = false;
17213       rtx (*gen) (rtx, rtx, rtx);
17214       rtx tmp, par;
17215       int i;
17216
17217       if (<CODE> != ASHIFT)
17218         {
17219           if (CONST_INT_P (operands[2]))
17220             operands[2] = GEN_INT (-INTVAL (operands[2]));
17221           else
17222             negate = true;
17223         }
17224       par = gen_rtx_PARALLEL (V16QImode, rtvec_alloc (16));
17225       for (i = 0; i < 16; i++)
17226         XVECEXP (par, 0, i) = operands[2];
17227
17228       tmp = gen_reg_rtx (V16QImode);
17229       emit_insn (gen_vec_initv16qiqi (tmp, par));
17230
17231       if (negate)
17232         emit_insn (gen_negv16qi2 (tmp, tmp));
17233
17234       gen = (<CODE> == LSHIFTRT ? gen_xop_shlv16qi3 : gen_xop_shav16qi3);
17235       emit_insn (gen (operands[0], operands[1], tmp));
17236     }
17237   else
17238     ix86_expand_vecop_qihi (<CODE>, operands[0], operands[1], operands[2]);
17239   DONE;
17240 })
17241
17242 (define_expand "ashrv2di3"
17243   [(set (match_operand:V2DI 0 "register_operand")
17244         (ashiftrt:V2DI
17245           (match_operand:V2DI 1 "register_operand")
17246           (match_operand:DI 2 "nonmemory_operand")))]
17247   "TARGET_XOP || TARGET_AVX512VL"
17248 {
17249   if (!TARGET_AVX512VL)
17250     {
17251       rtx reg = gen_reg_rtx (V2DImode);
17252       rtx par;
17253       bool negate = false;
17254       int i;
17255
17256       if (CONST_INT_P (operands[2]))
17257         operands[2] = GEN_INT (-INTVAL (operands[2]));
17258       else
17259         negate = true;
17260
17261       par = gen_rtx_PARALLEL (V2DImode, rtvec_alloc (2));
17262       for (i = 0; i < 2; i++)
17263         XVECEXP (par, 0, i) = operands[2];
17264
17265       emit_insn (gen_vec_initv2didi (reg, par));
17266
17267       if (negate)
17268         emit_insn (gen_negv2di2 (reg, reg));
17269
17270       emit_insn (gen_xop_shav2di3 (operands[0], operands[1], reg));
17271       DONE;
17272     }
17273 })
17274
17275 ;; XOP FRCZ support
17276 (define_insn "xop_frcz<mode>2"
17277   [(set (match_operand:FMAMODE 0 "register_operand" "=x")
17278         (unspec:FMAMODE
17279          [(match_operand:FMAMODE 1 "nonimmediate_operand" "xm")]
17280          UNSPEC_FRCZ))]
17281   "TARGET_XOP"
17282   "vfrcz<ssemodesuffix>\t{%1, %0|%0, %1}"
17283   [(set_attr "type" "ssecvt1")
17284    (set_attr "mode" "<MODE>")])
17285
17286 (define_expand "xop_vmfrcz<mode>2"
17287   [(set (match_operand:VF_128 0 "register_operand")
17288         (vec_merge:VF_128
17289           (unspec:VF_128
17290            [(match_operand:VF_128 1 "nonimmediate_operand")]
17291            UNSPEC_FRCZ)
17292           (match_dup 2)
17293           (const_int 1)))]
17294   "TARGET_XOP"
17295   "operands[2] = CONST0_RTX (<MODE>mode);")
17296
17297 (define_insn "*xop_vmfrcz<mode>2"
17298   [(set (match_operand:VF_128 0 "register_operand" "=x")
17299         (vec_merge:VF_128
17300           (unspec:VF_128
17301            [(match_operand:VF_128 1 "nonimmediate_operand" "xm")]
17302            UNSPEC_FRCZ)
17303           (match_operand:VF_128 2 "const0_operand")
17304           (const_int 1)))]
17305   "TARGET_XOP"
17306   "vfrcz<ssescalarmodesuffix>\t{%1, %0|%0, %<iptr>1}"
17307   [(set_attr "type" "ssecvt1")
17308    (set_attr "mode" "<MODE>")])
17309
17310 (define_insn "xop_maskcmp<mode>3"
17311   [(set (match_operand:VI_128 0 "register_operand" "=x")
17312         (match_operator:VI_128 1 "ix86_comparison_int_operator"
17313          [(match_operand:VI_128 2 "register_operand" "x")
17314           (match_operand:VI_128 3 "nonimmediate_operand" "xm")]))]
17315   "TARGET_XOP"
17316   "vpcom%Y1<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}"
17317   [(set_attr "type" "sse4arg")
17318    (set_attr "prefix_data16" "0")
17319    (set_attr "prefix_rep" "0")
17320    (set_attr "prefix_extra" "2")
17321    (set_attr "length_immediate" "1")
17322    (set_attr "mode" "TI")])
17323
17324 (define_insn "xop_maskcmp_uns<mode>3"
17325   [(set (match_operand:VI_128 0 "register_operand" "=x")
17326         (match_operator:VI_128 1 "ix86_comparison_uns_operator"
17327          [(match_operand:VI_128 2 "register_operand" "x")
17328           (match_operand:VI_128 3 "nonimmediate_operand" "xm")]))]
17329   "TARGET_XOP"
17330   "vpcom%Y1u<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}"
17331   [(set_attr "type" "ssecmp")
17332    (set_attr "prefix_data16" "0")
17333    (set_attr "prefix_rep" "0")
17334    (set_attr "prefix_extra" "2")
17335    (set_attr "length_immediate" "1")
17336    (set_attr "mode" "TI")])
17337
17338 ;; Version of pcom*u* that is called from the intrinsics that allows pcomequ*
17339 ;; and pcomneu* not to be converted to the signed ones in case somebody needs
17340 ;; the exact instruction generated for the intrinsic.
17341 (define_insn "xop_maskcmp_uns2<mode>3"
17342   [(set (match_operand:VI_128 0 "register_operand" "=x")
17343         (unspec:VI_128
17344          [(match_operator:VI_128 1 "ix86_comparison_uns_operator"
17345           [(match_operand:VI_128 2 "register_operand" "x")
17346            (match_operand:VI_128 3 "nonimmediate_operand" "xm")])]
17347          UNSPEC_XOP_UNSIGNED_CMP))]
17348   "TARGET_XOP"
17349   "vpcom%Y1u<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}"
17350   [(set_attr "type" "ssecmp")
17351    (set_attr "prefix_data16" "0")
17352    (set_attr "prefix_extra" "2")
17353    (set_attr "length_immediate" "1")
17354    (set_attr "mode" "TI")])
17355
17356 ;; Pcomtrue and pcomfalse support.  These are useless instructions, but are
17357 ;; being added here to be complete.
17358 (define_insn "xop_pcom_tf<mode>3"
17359   [(set (match_operand:VI_128 0 "register_operand" "=x")
17360         (unspec:VI_128
17361           [(match_operand:VI_128 1 "register_operand" "x")
17362            (match_operand:VI_128 2 "nonimmediate_operand" "xm")
17363            (match_operand:SI 3 "const_int_operand" "n")]
17364           UNSPEC_XOP_TRUEFALSE))]
17365   "TARGET_XOP"
17366 {
17367   return ((INTVAL (operands[3]) != 0)
17368           ? "vpcomtrue<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
17369           : "vpcomfalse<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}");
17370 }
17371   [(set_attr "type" "ssecmp")
17372    (set_attr "prefix_data16" "0")
17373    (set_attr "prefix_extra" "2")
17374    (set_attr "length_immediate" "1")
17375    (set_attr "mode" "TI")])
17376
17377 (define_insn "xop_vpermil2<mode>3"
17378   [(set (match_operand:VF_128_256 0 "register_operand" "=x,x")
17379         (unspec:VF_128_256
17380           [(match_operand:VF_128_256 1 "register_operand" "x,x")
17381            (match_operand:VF_128_256 2 "nonimmediate_operand" "x,m")
17382            (match_operand:<sseintvecmode> 3 "nonimmediate_operand" "xm,x")
17383            (match_operand:SI 4 "const_0_to_3_operand" "n,n")]
17384           UNSPEC_VPERMIL2))]
17385   "TARGET_XOP"
17386   "vpermil2<ssemodesuffix>\t{%4, %3, %2, %1, %0|%0, %1, %2, %3, %4}"
17387   [(set_attr "type" "sse4arg")
17388    (set_attr "length_immediate" "1")
17389    (set_attr "mode" "<MODE>")])
17390
17391 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
17392
17393 (define_insn "aesenc"
17394   [(set (match_operand:V2DI 0 "register_operand" "=x,x")
17395         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0,x")
17396                        (match_operand:V2DI 2 "vector_operand" "xBm,xm")]
17397                       UNSPEC_AESENC))]
17398   "TARGET_AES"
17399   "@
17400    aesenc\t{%2, %0|%0, %2}
17401    vaesenc\t{%2, %1, %0|%0, %1, %2}"
17402   [(set_attr "isa" "noavx,avx")
17403    (set_attr "type" "sselog1")
17404    (set_attr "prefix_extra" "1")
17405    (set_attr "prefix" "orig,vex")
17406    (set_attr "btver2_decode" "double,double")
17407    (set_attr "mode" "TI")])
17408
17409 (define_insn "aesenclast"
17410   [(set (match_operand:V2DI 0 "register_operand" "=x,x")
17411         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0,x")
17412                        (match_operand:V2DI 2 "vector_operand" "xBm,xm")]
17413                       UNSPEC_AESENCLAST))]
17414   "TARGET_AES"
17415   "@
17416    aesenclast\t{%2, %0|%0, %2}
17417    vaesenclast\t{%2, %1, %0|%0, %1, %2}"
17418   [(set_attr "isa" "noavx,avx")
17419    (set_attr "type" "sselog1")
17420    (set_attr "prefix_extra" "1")
17421    (set_attr "prefix" "orig,vex")
17422    (set_attr "btver2_decode" "double,double") 
17423    (set_attr "mode" "TI")])
17424
17425 (define_insn "aesdec"
17426   [(set (match_operand:V2DI 0 "register_operand" "=x,x")
17427         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0,x")
17428                        (match_operand:V2DI 2 "vector_operand" "xBm,xm")]
17429                       UNSPEC_AESDEC))]
17430   "TARGET_AES"
17431   "@
17432    aesdec\t{%2, %0|%0, %2}
17433    vaesdec\t{%2, %1, %0|%0, %1, %2}"
17434   [(set_attr "isa" "noavx,avx")
17435    (set_attr "type" "sselog1")
17436    (set_attr "prefix_extra" "1")
17437    (set_attr "prefix" "orig,vex")
17438    (set_attr "btver2_decode" "double,double") 
17439    (set_attr "mode" "TI")])
17440
17441 (define_insn "aesdeclast"
17442   [(set (match_operand:V2DI 0 "register_operand" "=x,x")
17443         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0,x")
17444                        (match_operand:V2DI 2 "vector_operand" "xBm,xm")]
17445                       UNSPEC_AESDECLAST))]
17446   "TARGET_AES"
17447   "@
17448    aesdeclast\t{%2, %0|%0, %2}
17449    vaesdeclast\t{%2, %1, %0|%0, %1, %2}"
17450   [(set_attr "isa" "noavx,avx")
17451    (set_attr "type" "sselog1")
17452    (set_attr "prefix_extra" "1")
17453    (set_attr "prefix" "orig,vex")
17454    (set_attr "btver2_decode" "double,double")
17455    (set_attr "mode" "TI")])
17456
17457 (define_insn "aesimc"
17458   [(set (match_operand:V2DI 0 "register_operand" "=x")
17459         (unspec:V2DI [(match_operand:V2DI 1 "vector_operand" "xBm")]
17460                       UNSPEC_AESIMC))]
17461   "TARGET_AES"
17462   "%vaesimc\t{%1, %0|%0, %1}"
17463   [(set_attr "type" "sselog1")
17464    (set_attr "prefix_extra" "1")
17465    (set_attr "prefix" "maybe_vex")
17466    (set_attr "mode" "TI")])
17467
17468 (define_insn "aeskeygenassist"
17469   [(set (match_operand:V2DI 0 "register_operand" "=x")
17470         (unspec:V2DI [(match_operand:V2DI 1 "vector_operand" "xBm")
17471                       (match_operand:SI 2 "const_0_to_255_operand" "n")]
17472                      UNSPEC_AESKEYGENASSIST))]
17473   "TARGET_AES"
17474   "%vaeskeygenassist\t{%2, %1, %0|%0, %1, %2}"
17475   [(set_attr "type" "sselog1")
17476    (set_attr "prefix_extra" "1")
17477    (set_attr "length_immediate" "1")
17478    (set_attr "prefix" "maybe_vex")
17479    (set_attr "mode" "TI")])
17480
17481 (define_insn "pclmulqdq"
17482   [(set (match_operand:V2DI 0 "register_operand" "=x,x")
17483         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0,x")
17484                       (match_operand:V2DI 2 "vector_operand" "xBm,xm")
17485                       (match_operand:SI 3 "const_0_to_255_operand" "n,n")]
17486                      UNSPEC_PCLMUL))]
17487   "TARGET_PCLMUL"
17488   "@
17489    pclmulqdq\t{%3, %2, %0|%0, %2, %3}
17490    vpclmulqdq\t{%3, %2, %1, %0|%0, %1, %2, %3}"
17491   [(set_attr "isa" "noavx,avx")
17492    (set_attr "type" "sselog1")
17493    (set_attr "prefix_extra" "1")
17494    (set_attr "length_immediate" "1")
17495    (set_attr "prefix" "orig,vex")
17496    (set_attr "mode" "TI")])
17497
17498 (define_expand "avx_vzeroall"
17499   [(match_par_dup 0 [(const_int 0)])]
17500   "TARGET_AVX"
17501 {
17502   int nregs = TARGET_64BIT ? 16 : 8;
17503   int regno;
17504
17505   operands[0] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nregs + 1));
17506
17507   XVECEXP (operands[0], 0, 0)
17508     = gen_rtx_UNSPEC_VOLATILE (VOIDmode, gen_rtvec (1, const0_rtx),
17509                                UNSPECV_VZEROALL);
17510
17511   for (regno = 0; regno < nregs; regno++)
17512     XVECEXP (operands[0], 0, regno + 1)
17513       = gen_rtx_SET (gen_rtx_REG (V8SImode, GET_SSE_REGNO (regno)),
17514                      CONST0_RTX (V8SImode));
17515 })
17516
17517 (define_insn "*avx_vzeroall"
17518   [(match_parallel 0 "vzeroall_operation"
17519     [(unspec_volatile [(const_int 0)] UNSPECV_VZEROALL)])]
17520   "TARGET_AVX"
17521   "vzeroall"
17522   [(set_attr "type" "sse")
17523    (set_attr "modrm" "0")
17524    (set_attr "memory" "none")
17525    (set_attr "prefix" "vex")
17526    (set_attr "btver2_decode" "vector")
17527    (set_attr "mode" "OI")])
17528
17529 ;; Clear the upper 128bits of AVX registers, equivalent to a NOP
17530 ;; if the upper 128bits are unused.
17531 (define_insn "avx_vzeroupper"
17532   [(unspec_volatile [(const_int 0)] UNSPECV_VZEROUPPER)]
17533   "TARGET_AVX"
17534   "vzeroupper"
17535   [(set_attr "type" "sse")
17536    (set_attr "modrm" "0")
17537    (set_attr "memory" "none")
17538    (set_attr "prefix" "vex")
17539    (set_attr "btver2_decode" "vector")
17540    (set_attr "mode" "OI")])
17541
17542 (define_mode_attr pbroadcast_evex_isa
17543   [(V64QI "avx512bw") (V32QI "avx512bw") (V16QI "avx512bw")
17544    (V32HI "avx512bw") (V16HI "avx512bw") (V8HI "avx512bw")
17545    (V16SI "avx512f") (V8SI "avx512f") (V4SI "avx512f")
17546    (V8DI "avx512f") (V4DI "avx512f") (V2DI "avx512f")])
17547
17548 (define_insn "avx2_pbroadcast<mode>"
17549   [(set (match_operand:VI 0 "register_operand" "=x,v")
17550         (vec_duplicate:VI
17551           (vec_select:<ssescalarmode>
17552             (match_operand:<ssexmmmode> 1 "nonimmediate_operand" "xm,vm")
17553             (parallel [(const_int 0)]))))]
17554   "TARGET_AVX2"
17555   "vpbroadcast<ssemodesuffix>\t{%1, %0|%0, %<iptr>1}"
17556   [(set_attr "isa" "*,<pbroadcast_evex_isa>")
17557    (set_attr "type" "ssemov")
17558    (set_attr "prefix_extra" "1")
17559    (set_attr "prefix" "vex,evex")
17560    (set_attr "mode" "<sseinsnmode>")])
17561
17562 (define_insn "avx2_pbroadcast<mode>_1"
17563   [(set (match_operand:VI_256 0 "register_operand" "=x,x,v,v")
17564         (vec_duplicate:VI_256
17565           (vec_select:<ssescalarmode>
17566             (match_operand:VI_256 1 "nonimmediate_operand" "m,x,m,v")
17567             (parallel [(const_int 0)]))))]
17568   "TARGET_AVX2"
17569   "@
17570    vpbroadcast<ssemodesuffix>\t{%1, %0|%0, %<iptr>1}
17571    vpbroadcast<ssemodesuffix>\t{%x1, %0|%0, %x1}
17572    vpbroadcast<ssemodesuffix>\t{%1, %0|%0, %<iptr>1}
17573    vpbroadcast<ssemodesuffix>\t{%x1, %0|%0, %x1}"
17574   [(set_attr "isa" "*,*,<pbroadcast_evex_isa>,<pbroadcast_evex_isa>")
17575    (set_attr "type" "ssemov")
17576    (set_attr "prefix_extra" "1")
17577    (set_attr "prefix" "vex")
17578    (set_attr "mode" "<sseinsnmode>")])
17579
17580 (define_insn "<avx2_avx512>_permvar<mode><mask_name>"
17581   [(set (match_operand:VI48F_256_512 0 "register_operand" "=v")
17582         (unspec:VI48F_256_512
17583           [(match_operand:VI48F_256_512 1 "nonimmediate_operand" "vm")
17584            (match_operand:<sseintvecmode> 2 "register_operand" "v")]
17585           UNSPEC_VPERMVAR))]
17586   "TARGET_AVX2 && <mask_mode512bit_condition>"
17587   "vperm<ssemodesuffix>\t{%1, %2, %0<mask_operand3>|%0<mask_operand3>, %2, %1}"
17588   [(set_attr "type" "sselog")
17589    (set_attr "prefix" "<mask_prefix2>")
17590    (set_attr "mode" "<sseinsnmode>")])
17591
17592 (define_insn "<avx512>_permvar<mode><mask_name>"
17593   [(set (match_operand:VI1_AVX512VL 0 "register_operand" "=v")
17594         (unspec:VI1_AVX512VL
17595           [(match_operand:VI1_AVX512VL 1 "nonimmediate_operand" "vm")
17596            (match_operand:<sseintvecmode> 2 "register_operand" "v")]
17597           UNSPEC_VPERMVAR))]
17598   "TARGET_AVX512VBMI && <mask_mode512bit_condition>"
17599   "vperm<ssemodesuffix>\t{%1, %2, %0<mask_operand3>|%0<mask_operand3>, %2, %1}"
17600   [(set_attr "type" "sselog")
17601    (set_attr "prefix" "<mask_prefix2>")
17602    (set_attr "mode" "<sseinsnmode>")])
17603
17604 (define_insn "<avx512>_permvar<mode><mask_name>"
17605   [(set (match_operand:VI2_AVX512VL 0 "register_operand" "=v")
17606         (unspec:VI2_AVX512VL
17607           [(match_operand:VI2_AVX512VL 1 "nonimmediate_operand" "vm")
17608            (match_operand:<sseintvecmode> 2 "register_operand" "v")]
17609           UNSPEC_VPERMVAR))]
17610   "TARGET_AVX512BW && <mask_mode512bit_condition>"
17611   "vperm<ssemodesuffix>\t{%1, %2, %0<mask_operand3>|%0<mask_operand3>, %2, %1}"
17612   [(set_attr "type" "sselog")
17613    (set_attr "prefix" "<mask_prefix2>")
17614    (set_attr "mode" "<sseinsnmode>")])
17615
17616 (define_expand "avx2_perm<mode>"
17617   [(match_operand:VI8F_256 0 "register_operand")
17618    (match_operand:VI8F_256 1 "nonimmediate_operand")
17619    (match_operand:SI 2 "const_0_to_255_operand")]
17620   "TARGET_AVX2"
17621 {
17622   int mask = INTVAL (operands[2]);
17623   emit_insn (gen_avx2_perm<mode>_1 (operands[0], operands[1],
17624                                     GEN_INT ((mask >> 0) & 3),
17625                                     GEN_INT ((mask >> 2) & 3),
17626                                     GEN_INT ((mask >> 4) & 3),
17627                                     GEN_INT ((mask >> 6) & 3)));
17628   DONE;
17629 })
17630
17631 (define_expand "avx512vl_perm<mode>_mask"
17632   [(match_operand:VI8F_256 0 "register_operand")
17633    (match_operand:VI8F_256 1 "nonimmediate_operand")
17634    (match_operand:SI 2 "const_0_to_255_operand")
17635    (match_operand:VI8F_256 3 "vector_move_operand")
17636    (match_operand:<avx512fmaskmode> 4 "register_operand")]
17637   "TARGET_AVX512VL"
17638 {
17639   int mask = INTVAL (operands[2]);
17640   emit_insn (gen_<avx2_avx512>_perm<mode>_1_mask (operands[0], operands[1],
17641                                                   GEN_INT ((mask >> 0) & 3),
17642                                                   GEN_INT ((mask >> 2) & 3),
17643                                                   GEN_INT ((mask >> 4) & 3),
17644                                                   GEN_INT ((mask >> 6) & 3),
17645                                                   operands[3], operands[4]));
17646   DONE;
17647 })
17648
17649 (define_insn "avx2_perm<mode>_1<mask_name>"
17650   [(set (match_operand:VI8F_256 0 "register_operand" "=v")
17651         (vec_select:VI8F_256
17652           (match_operand:VI8F_256 1 "nonimmediate_operand" "vm")
17653           (parallel [(match_operand 2 "const_0_to_3_operand")
17654                      (match_operand 3 "const_0_to_3_operand")
17655                      (match_operand 4 "const_0_to_3_operand")
17656                      (match_operand 5 "const_0_to_3_operand")])))]
17657   "TARGET_AVX2 && <mask_mode512bit_condition>"
17658 {
17659   int mask = 0;
17660   mask |= INTVAL (operands[2]) << 0;
17661   mask |= INTVAL (operands[3]) << 2;
17662   mask |= INTVAL (operands[4]) << 4;
17663   mask |= INTVAL (operands[5]) << 6;
17664   operands[2] = GEN_INT (mask);
17665   return "vperm<ssemodesuffix>\t{%2, %1, %0<mask_operand6>|%0<mask_operand6>, %1, %2}";
17666 }
17667   [(set_attr "type" "sselog")
17668    (set_attr "prefix" "<mask_prefix2>")
17669    (set_attr "mode" "<sseinsnmode>")])
17670
17671 (define_expand "avx512f_perm<mode>"
17672   [(match_operand:V8FI 0 "register_operand")
17673    (match_operand:V8FI 1 "nonimmediate_operand")
17674    (match_operand:SI 2 "const_0_to_255_operand")]
17675   "TARGET_AVX512F"
17676 {
17677   int mask = INTVAL (operands[2]);
17678   emit_insn (gen_avx512f_perm<mode>_1 (operands[0], operands[1],
17679                                        GEN_INT ((mask >> 0) & 3),
17680                                        GEN_INT ((mask >> 2) & 3),
17681                                        GEN_INT ((mask >> 4) & 3),
17682                                        GEN_INT ((mask >> 6) & 3),
17683                                        GEN_INT (((mask >> 0) & 3) + 4),
17684                                        GEN_INT (((mask >> 2) & 3) + 4),
17685                                        GEN_INT (((mask >> 4) & 3) + 4),
17686                                        GEN_INT (((mask >> 6) & 3) + 4)));
17687   DONE;
17688 })
17689
17690 (define_expand "avx512f_perm<mode>_mask"
17691   [(match_operand:V8FI 0 "register_operand")
17692    (match_operand:V8FI 1 "nonimmediate_operand")
17693    (match_operand:SI 2 "const_0_to_255_operand")
17694    (match_operand:V8FI 3 "vector_move_operand")
17695    (match_operand:<avx512fmaskmode> 4 "register_operand")]
17696   "TARGET_AVX512F"
17697 {
17698   int mask = INTVAL (operands[2]);
17699   emit_insn (gen_avx512f_perm<mode>_1_mask (operands[0], operands[1],
17700                                             GEN_INT ((mask >> 0) & 3),
17701                                             GEN_INT ((mask >> 2) & 3),
17702                                             GEN_INT ((mask >> 4) & 3),
17703                                             GEN_INT ((mask >> 6) & 3),
17704                                             GEN_INT (((mask >> 0) & 3) + 4),
17705                                             GEN_INT (((mask >> 2) & 3) + 4),
17706                                             GEN_INT (((mask >> 4) & 3) + 4),
17707                                             GEN_INT (((mask >> 6) & 3) + 4),
17708                                             operands[3], operands[4]));
17709   DONE;
17710 })
17711
17712 (define_insn "avx512f_perm<mode>_1<mask_name>"
17713   [(set (match_operand:V8FI 0 "register_operand" "=v")
17714         (vec_select:V8FI
17715           (match_operand:V8FI 1 "nonimmediate_operand" "vm")
17716           (parallel [(match_operand 2 "const_0_to_3_operand")
17717                      (match_operand 3 "const_0_to_3_operand")
17718                      (match_operand 4 "const_0_to_3_operand")
17719                      (match_operand 5 "const_0_to_3_operand")
17720                      (match_operand 6 "const_4_to_7_operand")
17721                      (match_operand 7 "const_4_to_7_operand")
17722                      (match_operand 8 "const_4_to_7_operand")
17723                      (match_operand 9 "const_4_to_7_operand")])))]
17724   "TARGET_AVX512F && <mask_mode512bit_condition>
17725    && (INTVAL (operands[2]) == (INTVAL (operands[6]) - 4)
17726        && INTVAL (operands[3]) == (INTVAL (operands[7]) - 4)
17727        && INTVAL (operands[4]) == (INTVAL (operands[8]) - 4)
17728        && INTVAL (operands[5]) == (INTVAL (operands[9]) - 4))"
17729 {
17730   int mask = 0;
17731   mask |= INTVAL (operands[2]) << 0;
17732   mask |= INTVAL (operands[3]) << 2;
17733   mask |= INTVAL (operands[4]) << 4;
17734   mask |= INTVAL (operands[5]) << 6;
17735   operands[2] = GEN_INT (mask);
17736   return "vperm<ssemodesuffix>\t{%2, %1, %0<mask_operand10>|%0<mask_operand10>, %1, %2}";
17737 }
17738   [(set_attr "type" "sselog")
17739    (set_attr "prefix" "<mask_prefix2>")
17740    (set_attr "mode" "<sseinsnmode>")])
17741
17742 (define_insn "avx2_permv2ti"
17743   [(set (match_operand:V4DI 0 "register_operand" "=x")
17744         (unspec:V4DI
17745           [(match_operand:V4DI 1 "register_operand" "x")
17746            (match_operand:V4DI 2 "nonimmediate_operand" "xm")
17747            (match_operand:SI 3 "const_0_to_255_operand" "n")]
17748           UNSPEC_VPERMTI))]
17749   "TARGET_AVX2"
17750   "vperm2i128\t{%3, %2, %1, %0|%0, %1, %2, %3}"
17751   [(set_attr "type" "sselog")
17752    (set_attr "prefix" "vex")
17753    (set_attr "mode" "OI")])
17754
17755 (define_insn "avx2_vec_dupv4df"
17756   [(set (match_operand:V4DF 0 "register_operand" "=v")
17757         (vec_duplicate:V4DF
17758           (vec_select:DF
17759             (match_operand:V2DF 1 "register_operand" "v")
17760             (parallel [(const_int 0)]))))]
17761   "TARGET_AVX2"
17762   "vbroadcastsd\t{%1, %0|%0, %1}"
17763   [(set_attr "type" "sselog1")
17764    (set_attr "prefix" "maybe_evex")
17765    (set_attr "mode" "V4DF")])
17766
17767 (define_insn "<avx512>_vec_dup<mode>_1"
17768   [(set (match_operand:VI_AVX512BW 0 "register_operand" "=v,v")
17769         (vec_duplicate:VI_AVX512BW
17770           (vec_select:<ssescalarmode>
17771             (match_operand:VI_AVX512BW 1 "nonimmediate_operand" "v,m")
17772             (parallel [(const_int 0)]))))]
17773   "TARGET_AVX512F"
17774   "@
17775    vpbroadcast<ssemodesuffix>\t{%x1, %0|%0, %x1}
17776    vpbroadcast<ssemodesuffix>\t{%x1, %0|%0, %<iptr>1}"
17777   [(set_attr "type" "ssemov")
17778    (set_attr "prefix" "evex")
17779    (set_attr "mode" "<sseinsnmode>")])
17780
17781 (define_insn "<avx512>_vec_dup<mode><mask_name>"
17782   [(set (match_operand:V48_AVX512VL 0 "register_operand" "=v")
17783         (vec_duplicate:V48_AVX512VL
17784           (vec_select:<ssescalarmode>
17785             (match_operand:<ssexmmmode> 1 "nonimmediate_operand" "vm")
17786             (parallel [(const_int 0)]))))]
17787   "TARGET_AVX512F"
17788 {
17789   /*  There is no DF broadcast (in AVX-512*) to 128b register.
17790       Mimic it with integer variant.  */
17791   if (<MODE>mode == V2DFmode)
17792     return "vpbroadcastq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %q1}";
17793
17794   return "v<sseintprefix>broadcast<bcstscalarsuff>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %<iptr>1}";
17795 }
17796   [(set_attr "type" "ssemov")
17797    (set_attr "prefix" "evex")
17798    (set_attr "mode" "<sseinsnmode>")])
17799
17800 (define_insn "<avx512>_vec_dup<mode><mask_name>"
17801   [(set (match_operand:VI12_AVX512VL 0 "register_operand" "=v")
17802         (vec_duplicate:VI12_AVX512VL
17803           (vec_select:<ssescalarmode>
17804             (match_operand:<ssexmmmode> 1 "nonimmediate_operand" "vm")
17805             (parallel [(const_int 0)]))))]
17806   "TARGET_AVX512BW"
17807   "vpbroadcast<bcstscalarsuff>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %<iptr>1}"
17808   [(set_attr "type" "ssemov")
17809    (set_attr "prefix" "evex")
17810    (set_attr "mode" "<sseinsnmode>")])
17811
17812 (define_insn "<mask_codefor>avx512f_broadcast<mode><mask_name>"
17813   [(set (match_operand:V16FI 0 "register_operand" "=v,v")
17814         (vec_duplicate:V16FI
17815           (match_operand:<ssexmmmode> 1 "nonimmediate_operand" "v,m")))]
17816   "TARGET_AVX512F"
17817   "@
17818    vshuf<shuffletype>32x4\t{$0x0, %g1, %g1, %0<mask_operand2>|%0<mask_operand2>, %g1, %g1, 0x0}
17819    vbroadcast<shuffletype>32x4\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
17820   [(set_attr "type" "ssemov")
17821    (set_attr "prefix" "evex")
17822    (set_attr "mode" "<sseinsnmode>")])
17823
17824 (define_insn "<mask_codefor>avx512f_broadcast<mode><mask_name>"
17825   [(set (match_operand:V8FI 0 "register_operand" "=v,v")
17826         (vec_duplicate:V8FI
17827           (match_operand:<ssehalfvecmode> 1 "nonimmediate_operand" "v,m")))]
17828   "TARGET_AVX512F"
17829   "@
17830    vshuf<shuffletype>64x2\t{$0x44, %g1, %g1, %0<mask_operand2>|%0<mask_operand2>, %g1, %g1, 0x44}
17831    vbroadcast<shuffletype>64x4\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
17832   [(set_attr "type" "ssemov")
17833    (set_attr "prefix" "evex")
17834    (set_attr "mode" "<sseinsnmode>")])
17835
17836 (define_insn "<mask_codefor><avx512>_vec_dup_gpr<mode><mask_name>"
17837   [(set (match_operand:VI12_AVX512VL 0 "register_operand" "=v,v")
17838         (vec_duplicate:VI12_AVX512VL
17839           (match_operand:<ssescalarmode> 1 "nonimmediate_operand" "vm,r")))]
17840   "TARGET_AVX512BW"
17841   "@
17842    vpbroadcast<bcstscalarsuff>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}
17843    vpbroadcast<bcstscalarsuff>\t{%k1, %0<mask_operand2>|%0<mask_operand2>, %k1}"
17844   [(set_attr "type" "ssemov")
17845    (set_attr "prefix" "evex")
17846    (set_attr "mode" "<sseinsnmode>")])
17847
17848 (define_insn "<mask_codefor><avx512>_vec_dup_gpr<mode><mask_name>"
17849   [(set (match_operand:V48_AVX512VL 0 "register_operand" "=v,v")
17850         (vec_duplicate:V48_AVX512VL
17851           (match_operand:<ssescalarmode> 1 "nonimmediate_operand" "vm,r")))]
17852   "TARGET_AVX512F"
17853   "v<sseintprefix>broadcast<bcstscalarsuff>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
17854   [(set_attr "type" "ssemov")
17855    (set_attr "prefix" "evex")
17856    (set_attr "mode" "<sseinsnmode>")
17857    (set (attr "enabled")
17858      (if_then_else (eq_attr "alternative" "1")
17859         (symbol_ref "GET_MODE_CLASS (<ssescalarmode>mode) == MODE_INT
17860                      && (<ssescalarmode>mode != DImode || TARGET_64BIT)")
17861         (const_int 1)))])
17862
17863 (define_insn "vec_dupv4sf"
17864   [(set (match_operand:V4SF 0 "register_operand" "=v,v,x")
17865         (vec_duplicate:V4SF
17866           (match_operand:SF 1 "nonimmediate_operand" "Yv,m,0")))]
17867   "TARGET_SSE"
17868   "@
17869    vshufps\t{$0, %1, %1, %0|%0, %1, %1, 0}
17870    vbroadcastss\t{%1, %0|%0, %1}
17871    shufps\t{$0, %0, %0|%0, %0, 0}"
17872   [(set_attr "isa" "avx,avx,noavx")
17873    (set_attr "type" "sseshuf1,ssemov,sseshuf1")
17874    (set_attr "length_immediate" "1,0,1")
17875    (set_attr "prefix_extra" "0,1,*")
17876    (set_attr "prefix" "maybe_evex,maybe_evex,orig")
17877    (set_attr "mode" "V4SF")])
17878
17879 (define_insn "*vec_dupv4si"
17880   [(set (match_operand:V4SI 0 "register_operand"     "=v,v,x")
17881         (vec_duplicate:V4SI
17882           (match_operand:SI 1 "nonimmediate_operand" "Yv,m,0")))]
17883   "TARGET_SSE"
17884   "@
17885    %vpshufd\t{$0, %1, %0|%0, %1, 0}
17886    vbroadcastss\t{%1, %0|%0, %1}
17887    shufps\t{$0, %0, %0|%0, %0, 0}"
17888   [(set_attr "isa" "sse2,avx,noavx")
17889    (set_attr "type" "sselog1,ssemov,sselog1")
17890    (set_attr "length_immediate" "1,0,1")
17891    (set_attr "prefix_extra" "0,1,*")
17892    (set_attr "prefix" "maybe_vex,maybe_evex,orig")
17893    (set_attr "mode" "TI,V4SF,V4SF")])
17894
17895 (define_insn "*vec_dupv2di"
17896   [(set (match_operand:V2DI 0 "register_operand"     "=x,v,v,x")
17897         (vec_duplicate:V2DI
17898           (match_operand:DI 1 "nonimmediate_operand" " 0,Yv,m,0")))]
17899   "TARGET_SSE"
17900   "@
17901    punpcklqdq\t%0, %0
17902    vpunpcklqdq\t{%d1, %0|%0, %d1}
17903    %vmovddup\t{%1, %0|%0, %1}
17904    movlhps\t%0, %0"
17905   [(set_attr "isa" "sse2_noavx,avx,sse3,noavx")
17906    (set_attr "type" "sselog1,sselog1,sselog1,ssemov")
17907    (set_attr "prefix" "orig,maybe_evex,maybe_vex,orig")
17908    (set_attr "mode" "TI,TI,DF,V4SF")])
17909
17910 (define_insn "avx2_vbroadcasti128_<mode>"
17911   [(set (match_operand:VI_256 0 "register_operand" "=x,v,v")
17912         (vec_concat:VI_256
17913           (match_operand:<ssehalfvecmode> 1 "memory_operand" "m,m,m")
17914           (match_dup 1)))]
17915   "TARGET_AVX2"
17916   "@
17917    vbroadcasti128\t{%1, %0|%0, %1}
17918    vbroadcast<i128vldq>\t{%1, %0|%0, %1}
17919    vbroadcast<shuffletype>32x4\t{%1, %0|%0, %1}"
17920   [(set_attr "isa" "*,avx512dq,avx512vl")
17921    (set_attr "type" "ssemov")
17922    (set_attr "prefix_extra" "1")
17923    (set_attr "prefix" "vex,evex,evex")
17924    (set_attr "mode" "OI")])
17925
17926 ;; Modes handled by AVX vec_dup patterns.
17927 (define_mode_iterator AVX_VEC_DUP_MODE
17928   [V8SI V8SF V4DI V4DF])
17929 (define_mode_attr vecdupssescalarmodesuffix
17930   [(V8SF "ss") (V4DF "sd") (V8SI "ss") (V4DI "sd")])
17931 ;; Modes handled by AVX2 vec_dup patterns.
17932 (define_mode_iterator AVX2_VEC_DUP_MODE
17933   [V32QI V16QI V16HI V8HI V8SI V4SI])
17934
17935 (define_insn "*vec_dup<mode>"
17936   [(set (match_operand:AVX2_VEC_DUP_MODE 0 "register_operand" "=x,x,Yi")
17937         (vec_duplicate:AVX2_VEC_DUP_MODE
17938           (match_operand:<ssescalarmode> 1 "nonimmediate_operand" "m,x,$r")))]
17939   "TARGET_AVX2"
17940   "@
17941    v<sseintprefix>broadcast<bcstscalarsuff>\t{%1, %0|%0, %1}
17942    v<sseintprefix>broadcast<bcstscalarsuff>\t{%x1, %0|%0, %x1}
17943    #"
17944   [(set_attr "isa" "*,*,noavx512vl")
17945    (set_attr "type" "ssemov")
17946    (set_attr "prefix_extra" "1")
17947    (set_attr "prefix" "maybe_evex")
17948    (set_attr "mode" "<sseinsnmode>")])
17949
17950 (define_insn "vec_dup<mode>"
17951   [(set (match_operand:AVX_VEC_DUP_MODE 0 "register_operand" "=x,x,x,v,x")
17952         (vec_duplicate:AVX_VEC_DUP_MODE
17953           (match_operand:<ssescalarmode> 1 "nonimmediate_operand" "m,m,x,v,?x")))]
17954   "TARGET_AVX"
17955   "@
17956    v<sseintprefix>broadcast<bcstscalarsuff>\t{%1, %0|%0, %1}
17957    vbroadcast<vecdupssescalarmodesuffix>\t{%1, %0|%0, %1}
17958    v<sseintprefix>broadcast<bcstscalarsuff>\t{%x1, %0|%0, %x1}
17959    v<sseintprefix>broadcast<bcstscalarsuff>\t{%x1, %g0|%g0, %x1}
17960    #"
17961   [(set_attr "type" "ssemov")
17962    (set_attr "prefix_extra" "1")
17963    (set_attr "prefix" "maybe_evex")
17964    (set_attr "isa" "avx2,noavx2,avx2,avx512f,noavx2")
17965    (set_attr "mode" "<sseinsnmode>,V8SF,<sseinsnmode>,<sseinsnmode>,V8SF")])
17966
17967 (define_split
17968   [(set (match_operand:AVX2_VEC_DUP_MODE 0 "register_operand")
17969         (vec_duplicate:AVX2_VEC_DUP_MODE
17970           (match_operand:<ssescalarmode> 1 "register_operand")))]
17971   "TARGET_AVX2
17972    /* Disable this splitter if avx512vl_vec_dup_gprv*[qhs]i insn is
17973       available, because then we can broadcast from GPRs directly.
17974       For V*[QH]I modes it requires both -mavx512vl and -mavx512bw,
17975       for V*SI mode it requires just -mavx512vl.  */
17976    && !(TARGET_AVX512VL
17977         && (TARGET_AVX512BW || <ssescalarmode>mode == SImode))
17978    && reload_completed && GENERAL_REG_P (operands[1])"
17979   [(const_int 0)]
17980 {
17981   emit_insn (gen_vec_setv4si_0 (gen_lowpart (V4SImode, operands[0]),
17982                                 CONST0_RTX (V4SImode),
17983                                 gen_lowpart (SImode, operands[1])));
17984   emit_insn (gen_avx2_pbroadcast<mode> (operands[0],
17985                                         gen_lowpart (<ssexmmmode>mode,
17986                                                      operands[0])));
17987   DONE;
17988 })
17989
17990 (define_split
17991   [(set (match_operand:AVX_VEC_DUP_MODE 0 "register_operand")
17992         (vec_duplicate:AVX_VEC_DUP_MODE
17993           (match_operand:<ssescalarmode> 1 "register_operand")))]
17994   "TARGET_AVX && !TARGET_AVX2 && reload_completed"
17995   [(set (match_dup 2)
17996         (vec_duplicate:<ssehalfvecmode> (match_dup 1)))
17997    (set (match_dup 0)
17998         (vec_concat:AVX_VEC_DUP_MODE (match_dup 2) (match_dup 2)))]
17999   "operands[2] = gen_lowpart (<ssehalfvecmode>mode, operands[0]);")
18000
18001 (define_insn "avx_vbroadcastf128_<mode>"
18002   [(set (match_operand:V_256 0 "register_operand" "=x,x,x,v,v,v,v")
18003         (vec_concat:V_256
18004           (match_operand:<ssehalfvecmode> 1 "nonimmediate_operand" "m,0,?x,m,0,m,0")
18005           (match_dup 1)))]
18006   "TARGET_AVX"
18007   "@
18008    vbroadcast<i128>\t{%1, %0|%0, %1}
18009    vinsert<i128>\t{$1, %1, %0, %0|%0, %0, %1, 1}
18010    vperm2<i128>\t{$0, %t1, %t1, %0|%0, %t1, %t1, 0}
18011    vbroadcast<i128vldq>\t{%1, %0|%0, %1}
18012    vinsert<i128vldq>\t{$1, %1, %0, %0|%0, %0, %1, 1}
18013    vbroadcast<shuffletype>32x4\t{%1, %0|%0, %1}
18014    vinsert<shuffletype>32x4\t{$1, %1, %0, %0|%0, %0, %1, 1}"
18015   [(set_attr "isa" "*,*,*,avx512dq,avx512dq,avx512vl,avx512vl")
18016    (set_attr "type" "ssemov,sselog1,sselog1,ssemov,sselog1,ssemov,sselog1")
18017    (set_attr "prefix_extra" "1")
18018    (set_attr "length_immediate" "0,1,1,0,1,0,1")
18019    (set_attr "prefix" "vex,vex,vex,evex,evex,evex,evex")
18020    (set_attr "mode" "<sseinsnmode>")])
18021
18022 ;; For broadcast[i|f]32x2.  Yes there is no v4sf version, only v4si.
18023 (define_mode_iterator VI4F_BRCST32x2
18024   [V16SI (V8SI "TARGET_AVX512VL") (V4SI "TARGET_AVX512VL")
18025    V16SF (V8SF "TARGET_AVX512VL")])
18026
18027 (define_mode_attr 64x2mode
18028   [(V8DF "V2DF") (V8DI "V2DI") (V4DI "V2DI") (V4DF "V2DF")])
18029
18030 (define_mode_attr 32x2mode
18031   [(V16SF "V2SF") (V16SI "V2SI") (V8SI "V2SI")
18032   (V8SF "V2SF") (V4SI "V2SI")])
18033
18034 (define_insn "<mask_codefor>avx512dq_broadcast<mode><mask_name>"
18035   [(set (match_operand:VI4F_BRCST32x2 0 "register_operand" "=v")
18036         (vec_duplicate:VI4F_BRCST32x2
18037           (vec_select:<32x2mode>
18038             (match_operand:<ssexmmmode> 1 "nonimmediate_operand" "vm")
18039             (parallel [(const_int 0) (const_int 1)]))))]
18040   "TARGET_AVX512DQ"
18041   "vbroadcast<shuffletype>32x2\t{%1, %0<mask_operand2>|%0<mask_operand2>, %q1}"
18042   [(set_attr "type" "ssemov")
18043    (set_attr "prefix_extra" "1")
18044    (set_attr "prefix" "evex")
18045    (set_attr "mode" "<sseinsnmode>")])
18046
18047 (define_insn "<mask_codefor>avx512vl_broadcast<mode><mask_name>_1"
18048   [(set (match_operand:VI4F_256 0 "register_operand" "=v,v")
18049         (vec_duplicate:VI4F_256
18050          (match_operand:<ssexmmmode> 1 "nonimmediate_operand" "v,m")))]
18051   "TARGET_AVX512VL"
18052   "@
18053    vshuf<shuffletype>32x4\t{$0x0, %t1, %t1, %0<mask_operand2>|%0<mask_operand2>, %t1, %t1, 0x0}
18054    vbroadcast<shuffletype>32x4\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
18055   [(set_attr "type" "ssemov")
18056    (set_attr "prefix_extra" "1")
18057    (set_attr "prefix" "evex")
18058    (set_attr "mode" "<sseinsnmode>")])
18059
18060 (define_insn "<mask_codefor>avx512dq_broadcast<mode><mask_name>_1"
18061   [(set (match_operand:V16FI 0 "register_operand" "=v,v")
18062        (vec_duplicate:V16FI
18063          (match_operand:<ssehalfvecmode> 1 "nonimmediate_operand" "v,m")))]
18064   "TARGET_AVX512DQ"
18065   "@
18066    vshuf<shuffletype>32x4\t{$0x44, %g1, %g1, %0<mask_operand2>|%0<mask_operand2>, %g1, %g1, 0x44}
18067    vbroadcast<shuffletype>32x8\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
18068   [(set_attr "type" "ssemov")
18069    (set_attr "prefix_extra" "1")
18070    (set_attr "prefix" "evex")
18071    (set_attr "mode" "<sseinsnmode>")])
18072
18073 ;; For broadcast[i|f]64x2
18074 (define_mode_iterator VI8F_BRCST64x2
18075   [V8DI V8DF (V4DI "TARGET_AVX512VL") (V4DF "TARGET_AVX512VL")])
18076
18077 (define_insn "<mask_codefor>avx512dq_broadcast<mode><mask_name>_1"
18078   [(set (match_operand:VI8F_BRCST64x2 0 "register_operand" "=v,v")
18079        (vec_duplicate:VI8F_BRCST64x2
18080          (match_operand:<64x2mode> 1 "nonimmediate_operand" "v,m")))]
18081   "TARGET_AVX512DQ"
18082   "@
18083    vshuf<shuffletype>64x2\t{$0x0, %<concat_tg_mode>1, %<concat_tg_mode>1, %0<mask_operand2>|%0<mask_operand2>, %<concat_tg_mode>1, %<concat_tg_mode>1, 0x0}
18084    vbroadcast<shuffletype>64x2\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
18085   [(set_attr "type" "ssemov")
18086    (set_attr "prefix_extra" "1")
18087    (set_attr "prefix" "evex")
18088    (set_attr "mode" "<sseinsnmode>")])
18089
18090 (define_insn "avx512cd_maskb_vec_dup<mode>"
18091   [(set (match_operand:VI8_AVX512VL 0 "register_operand" "=v")
18092         (vec_duplicate:VI8_AVX512VL
18093           (zero_extend:DI
18094             (match_operand:QI 1 "register_operand" "Yk"))))]
18095   "TARGET_AVX512CD"
18096   "vpbroadcastmb2q\t{%1, %0|%0, %1}"
18097   [(set_attr "type" "mskmov")
18098    (set_attr "prefix" "evex")
18099    (set_attr "mode" "XI")])
18100
18101 (define_insn "avx512cd_maskw_vec_dup<mode>"
18102   [(set (match_operand:VI4_AVX512VL 0 "register_operand" "=v")
18103         (vec_duplicate:VI4_AVX512VL
18104           (zero_extend:SI
18105             (match_operand:HI 1 "register_operand" "Yk"))))]
18106   "TARGET_AVX512CD"
18107   "vpbroadcastmw2d\t{%1, %0|%0, %1}"
18108   [(set_attr "type" "mskmov")
18109    (set_attr "prefix" "evex")
18110    (set_attr "mode" "XI")])
18111
18112 ;; Recognize broadcast as a vec_select as produced by builtin_vec_perm.
18113 ;; If it so happens that the input is in memory, use vbroadcast.
18114 ;; Otherwise use vpermilp (and in the case of 256-bit modes, vperm2f128).
18115 (define_insn "*avx_vperm_broadcast_v4sf"
18116   [(set (match_operand:V4SF 0 "register_operand" "=v,v,v")
18117         (vec_select:V4SF
18118           (match_operand:V4SF 1 "nonimmediate_operand" "m,o,v")
18119           (match_parallel 2 "avx_vbroadcast_operand"
18120             [(match_operand 3 "const_int_operand" "C,n,n")])))]
18121   "TARGET_AVX"
18122 {
18123   int elt = INTVAL (operands[3]);
18124   switch (which_alternative)
18125     {
18126     case 0:
18127     case 1:
18128       operands[1] = adjust_address_nv (operands[1], SFmode, elt * 4);
18129       return "vbroadcastss\t{%1, %0|%0, %k1}";
18130     case 2:
18131       operands[2] = GEN_INT (elt * 0x55);
18132       return "vpermilps\t{%2, %1, %0|%0, %1, %2}";
18133     default:
18134       gcc_unreachable ();
18135     }
18136 }
18137   [(set_attr "type" "ssemov,ssemov,sselog1")
18138    (set_attr "prefix_extra" "1")
18139    (set_attr "length_immediate" "0,0,1")
18140    (set_attr "prefix" "maybe_evex")
18141    (set_attr "mode" "SF,SF,V4SF")])
18142
18143 (define_insn_and_split "*avx_vperm_broadcast_<mode>"
18144   [(set (match_operand:VF_256 0 "register_operand" "=v,v,v")
18145         (vec_select:VF_256
18146           (match_operand:VF_256 1 "nonimmediate_operand" "m,o,?v")
18147           (match_parallel 2 "avx_vbroadcast_operand"
18148             [(match_operand 3 "const_int_operand" "C,n,n")])))]
18149   "TARGET_AVX"
18150   "#"
18151   "&& reload_completed && (<MODE>mode != V4DFmode || !TARGET_AVX2)"
18152   [(set (match_dup 0) (vec_duplicate:VF_256 (match_dup 1)))]
18153 {
18154   rtx op0 = operands[0], op1 = operands[1];
18155   int elt = INTVAL (operands[3]);
18156
18157   if (REG_P (op1))
18158     {
18159       int mask;
18160
18161       if (TARGET_AVX2 && elt == 0)
18162         {
18163           emit_insn (gen_vec_dup<mode> (op0, gen_lowpart (<ssescalarmode>mode,
18164                                                           op1)));
18165           DONE;
18166         }
18167
18168       /* Shuffle element we care about into all elements of the 128-bit lane.
18169          The other lane gets shuffled too, but we don't care.  */
18170       if (<MODE>mode == V4DFmode)
18171         mask = (elt & 1 ? 15 : 0);
18172       else
18173         mask = (elt & 3) * 0x55;
18174       emit_insn (gen_avx_vpermil<mode> (op0, op1, GEN_INT (mask)));
18175
18176       /* Shuffle the lane we care about into both lanes of the dest.  */
18177       mask = (elt / (<ssescalarnum> / 2)) * 0x11;
18178       if (EXT_REX_SSE_REG_P (op0))
18179         {
18180           /* There is no EVEX VPERM2F128, but we can use either VBROADCASTSS
18181              or VSHUFF128.  */
18182           gcc_assert (<MODE>mode == V8SFmode);
18183           if ((mask & 1) == 0)
18184             emit_insn (gen_avx2_vec_dupv8sf (op0,
18185                                              gen_lowpart (V4SFmode, op0)));
18186           else
18187             emit_insn (gen_avx512vl_shuf_f32x4_1 (op0, op0, op0,
18188                                                   GEN_INT (4), GEN_INT (5),
18189                                                   GEN_INT (6), GEN_INT (7),
18190                                                   GEN_INT (12), GEN_INT (13),
18191                                                   GEN_INT (14), GEN_INT (15)));
18192           DONE;
18193         }
18194
18195       emit_insn (gen_avx_vperm2f128<mode>3 (op0, op0, op0, GEN_INT (mask)));
18196       DONE;
18197     }
18198
18199   operands[1] = adjust_address (op1, <ssescalarmode>mode,
18200                                 elt * GET_MODE_SIZE (<ssescalarmode>mode));
18201 })
18202
18203 (define_expand "<sse2_avx_avx512f>_vpermil<mode><mask_name>"
18204   [(set (match_operand:VF2 0 "register_operand")
18205         (vec_select:VF2
18206           (match_operand:VF2 1 "nonimmediate_operand")
18207           (match_operand:SI 2 "const_0_to_255_operand")))]
18208   "TARGET_AVX && <mask_mode512bit_condition>"
18209 {
18210   int mask = INTVAL (operands[2]);
18211   rtx perm[<ssescalarnum>];
18212
18213   int i;
18214   for (i = 0; i < <ssescalarnum>; i = i + 2)
18215     {
18216       perm[i]     = GEN_INT (((mask >> i)       & 1) + i);
18217       perm[i + 1] = GEN_INT (((mask >> (i + 1)) & 1) + i);
18218     }
18219
18220   operands[2]
18221     = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (<ssescalarnum>, perm));
18222 })
18223
18224 (define_expand "<sse2_avx_avx512f>_vpermil<mode><mask_name>"
18225   [(set (match_operand:VF1 0 "register_operand")
18226         (vec_select:VF1
18227           (match_operand:VF1 1 "nonimmediate_operand")
18228           (match_operand:SI 2 "const_0_to_255_operand")))]
18229   "TARGET_AVX && <mask_mode512bit_condition>"
18230 {
18231   int mask = INTVAL (operands[2]);
18232   rtx perm[<ssescalarnum>];
18233
18234   int i;
18235   for (i = 0; i < <ssescalarnum>; i = i + 4)
18236     {
18237       perm[i]     = GEN_INT (((mask >> 0) & 3) + i);
18238       perm[i + 1] = GEN_INT (((mask >> 2) & 3) + i);
18239       perm[i + 2] = GEN_INT (((mask >> 4) & 3) + i);
18240       perm[i + 3] = GEN_INT (((mask >> 6) & 3) + i);
18241     }
18242
18243   operands[2]
18244     = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (<ssescalarnum>, perm));
18245 })
18246
18247 (define_insn "*<sse2_avx_avx512f>_vpermilp<mode><mask_name>"
18248   [(set (match_operand:VF 0 "register_operand" "=v")
18249         (vec_select:VF
18250           (match_operand:VF 1 "nonimmediate_operand" "vm")
18251           (match_parallel 2 ""
18252             [(match_operand 3 "const_int_operand")])))]
18253   "TARGET_AVX && <mask_mode512bit_condition>
18254    && avx_vpermilp_parallel (operands[2], <MODE>mode)"
18255 {
18256   int mask = avx_vpermilp_parallel (operands[2], <MODE>mode) - 1;
18257   operands[2] = GEN_INT (mask);
18258   return "vpermil<ssemodesuffix>\t{%2, %1, %0<mask_operand4>|%0<mask_operand4>, %1, %2}";
18259 }
18260   [(set_attr "type" "sselog")
18261    (set_attr "prefix_extra" "1")
18262    (set_attr "length_immediate" "1")
18263    (set_attr "prefix" "<mask_prefix>")
18264    (set_attr "mode" "<sseinsnmode>")])
18265
18266 (define_insn "<sse2_avx_avx512f>_vpermilvar<mode>3<mask_name>"
18267   [(set (match_operand:VF 0 "register_operand" "=v")
18268         (unspec:VF
18269           [(match_operand:VF 1 "register_operand" "v")
18270            (match_operand:<sseintvecmode> 2 "nonimmediate_operand" "vm")]
18271           UNSPEC_VPERMIL))]
18272   "TARGET_AVX && <mask_mode512bit_condition>"
18273   "vpermil<ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
18274   [(set_attr "type" "sselog")
18275    (set_attr "prefix_extra" "1")
18276    (set_attr "btver2_decode" "vector")
18277    (set_attr "prefix" "<mask_prefix>")
18278    (set_attr "mode" "<sseinsnmode>")])
18279
18280 (define_mode_iterator VPERMI2
18281   [V16SI V16SF V8DI V8DF
18282    (V8SI "TARGET_AVX512VL") (V8SF "TARGET_AVX512VL")
18283    (V4DI "TARGET_AVX512VL") (V4DF "TARGET_AVX512VL")
18284    (V4SI "TARGET_AVX512VL") (V4SF "TARGET_AVX512VL")
18285    (V2DI "TARGET_AVX512VL") (V2DF "TARGET_AVX512VL")
18286    (V32HI "TARGET_AVX512BW") (V16HI "TARGET_AVX512BW && TARGET_AVX512VL")
18287    (V8HI "TARGET_AVX512BW && TARGET_AVX512VL")
18288    (V64QI "TARGET_AVX512VBMI") (V32QI "TARGET_AVX512VBMI && TARGET_AVX512VL")
18289    (V16QI "TARGET_AVX512VBMI && TARGET_AVX512VL")])
18290
18291 (define_mode_iterator VPERMI2I
18292   [V16SI V8DI
18293    (V8SI "TARGET_AVX512VL") (V4SI "TARGET_AVX512VL")
18294    (V4DI "TARGET_AVX512VL") (V2DI "TARGET_AVX512VL")
18295    (V32HI "TARGET_AVX512BW") (V16HI "TARGET_AVX512BW && TARGET_AVX512VL")
18296    (V8HI "TARGET_AVX512BW && TARGET_AVX512VL")
18297    (V64QI "TARGET_AVX512VBMI") (V32QI "TARGET_AVX512VBMI && TARGET_AVX512VL")
18298    (V16QI "TARGET_AVX512VBMI && TARGET_AVX512VL")])
18299
18300 (define_expand "<avx512>_vpermi2var<mode>3_mask"
18301   [(set (match_operand:VPERMI2 0 "register_operand")
18302         (vec_merge:VPERMI2
18303           (unspec:VPERMI2
18304             [(match_operand:<sseintvecmode> 2 "register_operand")
18305              (match_operand:VPERMI2 1 "register_operand")
18306              (match_operand:VPERMI2 3 "nonimmediate_operand")]
18307             UNSPEC_VPERMT2)
18308           (match_dup 5)
18309           (match_operand:<avx512fmaskmode> 4 "register_operand")))]
18310   "TARGET_AVX512F"
18311 {
18312   operands[2] = force_reg (<sseintvecmode>mode, operands[2]);
18313   operands[5] = gen_lowpart (<MODE>mode, operands[2]);
18314 })
18315
18316 (define_insn "*<avx512>_vpermi2var<mode>3_mask"
18317   [(set (match_operand:VPERMI2I 0 "register_operand" "=v")
18318         (vec_merge:VPERMI2I
18319           (unspec:VPERMI2I
18320             [(match_operand:<sseintvecmode> 2 "register_operand" "0")
18321              (match_operand:VPERMI2I 1 "register_operand" "v")
18322              (match_operand:VPERMI2I 3 "nonimmediate_operand" "vm")]
18323             UNSPEC_VPERMT2)
18324           (match_dup 2)
18325           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
18326   "TARGET_AVX512F"
18327   "vpermi2<ssemodesuffix>\t{%3, %1, %0%{%4%}|%0%{%4%}, %1, %3}"
18328   [(set_attr "type" "sselog")
18329    (set_attr "prefix" "evex")
18330    (set_attr "mode" "<sseinsnmode>")])
18331
18332 (define_insn "*<avx512>_vpermi2var<mode>3_mask"
18333   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
18334         (vec_merge:VF_AVX512VL
18335           (unspec:VF_AVX512VL
18336             [(match_operand:<sseintvecmode> 2 "register_operand" "0")
18337              (match_operand:VF_AVX512VL 1 "register_operand" "v")
18338              (match_operand:VF_AVX512VL 3 "nonimmediate_operand" "vm")]
18339             UNSPEC_VPERMT2)
18340           (subreg:VF_AVX512VL (match_dup 2) 0)
18341           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
18342   "TARGET_AVX512F"
18343   "vpermi2<ssemodesuffix>\t{%3, %1, %0%{%4%}|%0%{%4%}, %1, %3}"
18344   [(set_attr "type" "sselog")
18345    (set_attr "prefix" "evex")
18346    (set_attr "mode" "<sseinsnmode>")])
18347
18348 (define_expand "<avx512>_vpermt2var<mode>3_maskz"
18349   [(match_operand:VPERMI2 0 "register_operand")
18350    (match_operand:<sseintvecmode> 1 "register_operand")
18351    (match_operand:VPERMI2 2 "register_operand")
18352    (match_operand:VPERMI2 3 "nonimmediate_operand")
18353    (match_operand:<avx512fmaskmode> 4 "register_operand")]
18354   "TARGET_AVX512F"
18355 {
18356   emit_insn (gen_<avx512>_vpermt2var<mode>3_maskz_1 (
18357         operands[0], operands[1], operands[2], operands[3],
18358         CONST0_RTX (<MODE>mode), operands[4]));
18359   DONE;
18360 })
18361
18362 (define_insn "<avx512>_vpermt2var<mode>3<sd_maskz_name>"
18363   [(set (match_operand:VPERMI2 0 "register_operand" "=v,v")
18364         (unspec:VPERMI2
18365           [(match_operand:<sseintvecmode> 1 "register_operand" "v,0")
18366            (match_operand:VPERMI2 2 "register_operand" "0,v")
18367            (match_operand:VPERMI2 3 "nonimmediate_operand" "vm,vm")]
18368           UNSPEC_VPERMT2))]
18369   "TARGET_AVX512F"
18370   "@
18371    vpermt2<ssemodesuffix>\t{%3, %1, %0<sd_mask_op4>|%0<sd_mask_op4>, %1, %3}
18372    vpermi2<ssemodesuffix>\t{%3, %2, %0<sd_mask_op4>|%0<sd_mask_op4>, %2, %3}"
18373   [(set_attr "type" "sselog")
18374    (set_attr "prefix" "evex")
18375    (set_attr "mode" "<sseinsnmode>")])
18376
18377 (define_insn "<avx512>_vpermt2var<mode>3_mask"
18378   [(set (match_operand:VPERMI2 0 "register_operand" "=v")
18379         (vec_merge:VPERMI2
18380           (unspec:VPERMI2
18381             [(match_operand:<sseintvecmode> 1 "register_operand" "v")
18382             (match_operand:VPERMI2 2 "register_operand" "0")
18383             (match_operand:VPERMI2 3 "nonimmediate_operand" "vm")]
18384             UNSPEC_VPERMT2)
18385           (match_dup 2)
18386           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
18387   "TARGET_AVX512F"
18388   "vpermt2<ssemodesuffix>\t{%3, %1, %0%{%4%}|%0%{%4%}, %1, %3}"
18389   [(set_attr "type" "sselog")
18390    (set_attr "prefix" "evex")
18391    (set_attr "mode" "<sseinsnmode>")])
18392
18393 (define_expand "avx_vperm2f128<mode>3"
18394   [(set (match_operand:AVX256MODE2P 0 "register_operand")
18395         (unspec:AVX256MODE2P
18396           [(match_operand:AVX256MODE2P 1 "register_operand")
18397            (match_operand:AVX256MODE2P 2 "nonimmediate_operand")
18398            (match_operand:SI 3 "const_0_to_255_operand")]
18399           UNSPEC_VPERMIL2F128))]
18400   "TARGET_AVX"
18401 {
18402   int mask = INTVAL (operands[3]);
18403   if ((mask & 0x88) == 0)
18404     {
18405       rtx perm[<ssescalarnum>], t1, t2;
18406       int i, base, nelt = <ssescalarnum>, nelt2 = nelt / 2;
18407
18408       base = (mask & 3) * nelt2;
18409       for (i = 0; i < nelt2; ++i)
18410         perm[i] = GEN_INT (base + i);
18411
18412       base = ((mask >> 4) & 3) * nelt2;
18413       for (i = 0; i < nelt2; ++i)
18414         perm[i + nelt2] = GEN_INT (base + i);
18415
18416       t2 = gen_rtx_VEC_CONCAT (<ssedoublevecmode>mode,
18417                                operands[1], operands[2]);
18418       t1 = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelt, perm));
18419       t2 = gen_rtx_VEC_SELECT (<MODE>mode, t2, t1);
18420       t2 = gen_rtx_SET (operands[0], t2);
18421       emit_insn (t2);
18422       DONE;
18423     }
18424 })
18425
18426 ;; Note that bits 7 and 3 of the imm8 allow lanes to be zeroed, which
18427 ;; means that in order to represent this properly in rtl we'd have to
18428 ;; nest *another* vec_concat with a zero operand and do the select from
18429 ;; a 4x wide vector.  That doesn't seem very nice.
18430 (define_insn "*avx_vperm2f128<mode>_full"
18431   [(set (match_operand:AVX256MODE2P 0 "register_operand" "=x")
18432         (unspec:AVX256MODE2P
18433           [(match_operand:AVX256MODE2P 1 "register_operand" "x")
18434            (match_operand:AVX256MODE2P 2 "nonimmediate_operand" "xm")
18435            (match_operand:SI 3 "const_0_to_255_operand" "n")]
18436           UNSPEC_VPERMIL2F128))]
18437   "TARGET_AVX"
18438   "vperm2<i128>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
18439   [(set_attr "type" "sselog")
18440    (set_attr "prefix_extra" "1")
18441    (set_attr "length_immediate" "1")
18442    (set_attr "prefix" "vex")
18443    (set_attr "mode" "<sseinsnmode>")])
18444
18445 (define_insn "*avx_vperm2f128<mode>_nozero"
18446   [(set (match_operand:AVX256MODE2P 0 "register_operand" "=x")
18447         (vec_select:AVX256MODE2P
18448           (vec_concat:<ssedoublevecmode>
18449             (match_operand:AVX256MODE2P 1 "register_operand" "x")
18450             (match_operand:AVX256MODE2P 2 "nonimmediate_operand" "xm"))
18451           (match_parallel 3 ""
18452             [(match_operand 4 "const_int_operand")])))]
18453   "TARGET_AVX
18454    && avx_vperm2f128_parallel (operands[3], <MODE>mode)"
18455 {
18456   int mask = avx_vperm2f128_parallel (operands[3], <MODE>mode) - 1;
18457   if (mask == 0x12)
18458     return "vinsert<i128>\t{$0, %x2, %1, %0|%0, %1, %x2, 0}";
18459   if (mask == 0x20)
18460     return "vinsert<i128>\t{$1, %x2, %1, %0|%0, %1, %x2, 1}";
18461   operands[3] = GEN_INT (mask);
18462   return "vperm2<i128>\t{%3, %2, %1, %0|%0, %1, %2, %3}";
18463 }
18464   [(set_attr "type" "sselog")
18465    (set_attr "prefix_extra" "1")
18466    (set_attr "length_immediate" "1")
18467    (set_attr "prefix" "vex")
18468    (set_attr "mode" "<sseinsnmode>")])
18469
18470 (define_insn "*ssse3_palignr<mode>_perm"
18471   [(set (match_operand:V_128 0 "register_operand" "=x,x,v")
18472       (vec_select:V_128
18473         (match_operand:V_128 1 "register_operand" "0,x,v")
18474         (match_parallel 2 "palignr_operand"
18475           [(match_operand 3 "const_int_operand" "n,n,n")])))]
18476   "TARGET_SSSE3"
18477 {
18478   operands[2] = (GEN_INT (INTVAL (operands[3])
18479                  * GET_MODE_UNIT_SIZE (GET_MODE (operands[0]))));
18480
18481   switch (which_alternative)
18482     {
18483     case 0:
18484       return "palignr\t{%2, %1, %0|%0, %1, %2}";
18485     case 1:
18486     case 2:
18487       return "vpalignr\t{%2, %1, %1, %0|%0, %1, %1, %2}";
18488     default:
18489       gcc_unreachable ();
18490     }
18491 }
18492   [(set_attr "isa" "noavx,avx,avx512bw")
18493    (set_attr "type" "sseishft")
18494    (set_attr "atom_unit" "sishuf")
18495    (set_attr "prefix_data16" "1,*,*")
18496    (set_attr "prefix_extra" "1")
18497    (set_attr "length_immediate" "1")
18498    (set_attr "prefix" "orig,vex,evex")])
18499
18500 (define_expand "avx512vl_vinsert<mode>"
18501   [(match_operand:VI48F_256 0 "register_operand")
18502    (match_operand:VI48F_256 1 "register_operand")
18503    (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand")
18504    (match_operand:SI 3 "const_0_to_1_operand")
18505    (match_operand:VI48F_256 4 "register_operand")
18506    (match_operand:<avx512fmaskmode> 5 "register_operand")]
18507   "TARGET_AVX512VL"
18508 {
18509   rtx (*insn)(rtx, rtx, rtx, rtx, rtx);
18510
18511   switch (INTVAL (operands[3]))
18512     {
18513     case 0:
18514       insn = gen_vec_set_lo_<mode>_mask;
18515       break;
18516     case 1:
18517       insn = gen_vec_set_hi_<mode>_mask;
18518       break;
18519     default:
18520       gcc_unreachable ();
18521     }
18522
18523   emit_insn (insn (operands[0], operands[1], operands[2], operands[4],
18524                    operands[5]));
18525   DONE;
18526 })
18527
18528 (define_expand "avx_vinsertf128<mode>"
18529   [(match_operand:V_256 0 "register_operand")
18530    (match_operand:V_256 1 "register_operand")
18531    (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand")
18532    (match_operand:SI 3 "const_0_to_1_operand")]
18533   "TARGET_AVX"
18534 {
18535   rtx (*insn)(rtx, rtx, rtx);
18536
18537   switch (INTVAL (operands[3]))
18538     {
18539     case 0:
18540       insn = gen_vec_set_lo_<mode>;
18541       break;
18542     case 1:
18543       insn = gen_vec_set_hi_<mode>;
18544       break;
18545     default:
18546       gcc_unreachable ();
18547     }
18548
18549   emit_insn (insn (operands[0], operands[1], operands[2]));
18550   DONE;
18551 })
18552
18553 (define_insn "vec_set_lo_<mode><mask_name>"
18554   [(set (match_operand:VI8F_256 0 "register_operand" "=v")
18555         (vec_concat:VI8F_256
18556           (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "vm")
18557           (vec_select:<ssehalfvecmode>
18558             (match_operand:VI8F_256 1 "register_operand" "v")
18559             (parallel [(const_int 2) (const_int 3)]))))]
18560   "TARGET_AVX && <mask_avx512dq_condition>"
18561 {
18562   if (TARGET_AVX512DQ)
18563     return "vinsert<shuffletype>64x2\t{$0x0, %2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2, 0x0}";
18564   else if (TARGET_AVX512VL)
18565     return "vinsert<shuffletype>32x4\t{$0x0, %2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2, 0x0}";
18566   else
18567     return "vinsert<i128>\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}";
18568 }
18569   [(set_attr "type" "sselog")
18570    (set_attr "prefix_extra" "1")
18571    (set_attr "length_immediate" "1")
18572    (set_attr "prefix" "vex")
18573    (set_attr "mode" "<sseinsnmode>")])
18574
18575 (define_insn "vec_set_hi_<mode><mask_name>"
18576   [(set (match_operand:VI8F_256 0 "register_operand" "=v")
18577         (vec_concat:VI8F_256
18578           (vec_select:<ssehalfvecmode>
18579             (match_operand:VI8F_256 1 "register_operand" "v")
18580             (parallel [(const_int 0) (const_int 1)]))
18581           (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "vm")))]
18582   "TARGET_AVX && <mask_avx512dq_condition>"
18583 {
18584   if (TARGET_AVX512DQ)
18585     return "vinsert<shuffletype>64x2\t{$0x1, %2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2, 0x1}";
18586   else if (TARGET_AVX512VL)
18587     return "vinsert<shuffletype>32x4\t{$0x1, %2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2, 0x1}";
18588   else
18589     return "vinsert<i128>\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}";
18590 }
18591   [(set_attr "type" "sselog")
18592    (set_attr "prefix_extra" "1")
18593    (set_attr "length_immediate" "1")
18594    (set_attr "prefix" "vex")
18595    (set_attr "mode" "<sseinsnmode>")])
18596
18597 (define_insn "vec_set_lo_<mode><mask_name>"
18598   [(set (match_operand:VI4F_256 0 "register_operand" "=v")
18599         (vec_concat:VI4F_256
18600           (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "vm")
18601           (vec_select:<ssehalfvecmode>
18602             (match_operand:VI4F_256 1 "register_operand" "v")
18603             (parallel [(const_int 4) (const_int 5)
18604                        (const_int 6) (const_int 7)]))))]
18605   "TARGET_AVX"
18606 {
18607   if (TARGET_AVX512VL)
18608     return "vinsert<shuffletype>32x4\t{$0x0, %2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2, 0x0}";
18609   else
18610     return "vinsert<i128>\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}";
18611 }
18612   [(set_attr "type" "sselog")
18613    (set_attr "prefix_extra" "1")
18614    (set_attr "length_immediate" "1")
18615    (set_attr "prefix" "vex")
18616    (set_attr "mode" "<sseinsnmode>")])
18617
18618 (define_insn "vec_set_hi_<mode><mask_name>"
18619   [(set (match_operand:VI4F_256 0 "register_operand" "=v")
18620         (vec_concat:VI4F_256
18621           (vec_select:<ssehalfvecmode>
18622             (match_operand:VI4F_256 1 "register_operand" "v")
18623             (parallel [(const_int 0) (const_int 1)
18624                        (const_int 2) (const_int 3)]))
18625           (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "vm")))]
18626   "TARGET_AVX"
18627 {
18628   if (TARGET_AVX512VL)
18629     return "vinsert<shuffletype>32x4\t{$0x1, %2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2, 0x1}";
18630   else
18631     return "vinsert<i128>\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}";
18632 }
18633   [(set_attr "type" "sselog")
18634    (set_attr "prefix_extra" "1")
18635    (set_attr "length_immediate" "1")
18636    (set_attr "prefix" "vex")
18637    (set_attr "mode" "<sseinsnmode>")])
18638
18639 (define_insn "vec_set_lo_v16hi"
18640   [(set (match_operand:V16HI 0 "register_operand" "=x,v")
18641         (vec_concat:V16HI
18642           (match_operand:V8HI 2 "nonimmediate_operand" "xm,vm")
18643           (vec_select:V8HI
18644             (match_operand:V16HI 1 "register_operand" "x,v")
18645             (parallel [(const_int 8) (const_int 9)
18646                        (const_int 10) (const_int 11)
18647                        (const_int 12) (const_int 13)
18648                        (const_int 14) (const_int 15)]))))]
18649   "TARGET_AVX"
18650   "@
18651    vinsert%~128\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}
18652    vinserti32x4\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}"
18653   [(set_attr "type" "sselog")
18654    (set_attr "prefix_extra" "1")
18655    (set_attr "length_immediate" "1")
18656    (set_attr "prefix" "vex,evex")
18657    (set_attr "mode" "OI")])
18658
18659 (define_insn "vec_set_hi_v16hi"
18660   [(set (match_operand:V16HI 0 "register_operand" "=x,v")
18661         (vec_concat:V16HI
18662           (vec_select:V8HI
18663             (match_operand:V16HI 1 "register_operand" "x,v")
18664             (parallel [(const_int 0) (const_int 1)
18665                        (const_int 2) (const_int 3)
18666                        (const_int 4) (const_int 5)
18667                        (const_int 6) (const_int 7)]))
18668           (match_operand:V8HI 2 "nonimmediate_operand" "xm,vm")))]
18669   "TARGET_AVX"
18670   "@
18671    vinsert%~128\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}
18672    vinserti32x4\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}"
18673   [(set_attr "type" "sselog")
18674    (set_attr "prefix_extra" "1")
18675    (set_attr "length_immediate" "1")
18676    (set_attr "prefix" "vex,evex")
18677    (set_attr "mode" "OI")])
18678
18679 (define_insn "vec_set_lo_v32qi"
18680   [(set (match_operand:V32QI 0 "register_operand" "=x,v")
18681         (vec_concat:V32QI
18682           (match_operand:V16QI 2 "nonimmediate_operand" "xm,v")
18683           (vec_select:V16QI
18684             (match_operand:V32QI 1 "register_operand" "x,v")
18685             (parallel [(const_int 16) (const_int 17)
18686                        (const_int 18) (const_int 19)
18687                        (const_int 20) (const_int 21)
18688                        (const_int 22) (const_int 23)
18689                        (const_int 24) (const_int 25)
18690                        (const_int 26) (const_int 27)
18691                        (const_int 28) (const_int 29)
18692                        (const_int 30) (const_int 31)]))))]
18693   "TARGET_AVX"
18694   "@
18695    vinsert%~128\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}
18696    vinserti32x4\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}"
18697   [(set_attr "type" "sselog")
18698    (set_attr "prefix_extra" "1")
18699    (set_attr "length_immediate" "1")
18700    (set_attr "prefix" "vex,evex")
18701    (set_attr "mode" "OI")])
18702
18703 (define_insn "vec_set_hi_v32qi"
18704   [(set (match_operand:V32QI 0 "register_operand" "=x,v")
18705         (vec_concat:V32QI
18706           (vec_select:V16QI
18707             (match_operand:V32QI 1 "register_operand" "x,v")
18708             (parallel [(const_int 0) (const_int 1)
18709                        (const_int 2) (const_int 3)
18710                        (const_int 4) (const_int 5)
18711                        (const_int 6) (const_int 7)
18712                        (const_int 8) (const_int 9)
18713                        (const_int 10) (const_int 11)
18714                        (const_int 12) (const_int 13)
18715                        (const_int 14) (const_int 15)]))
18716           (match_operand:V16QI 2 "nonimmediate_operand" "xm,vm")))]
18717   "TARGET_AVX"
18718   "@
18719    vinsert%~128\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}
18720    vinserti32x4\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}"
18721   [(set_attr "type" "sselog")
18722    (set_attr "prefix_extra" "1")
18723    (set_attr "length_immediate" "1")
18724    (set_attr "prefix" "vex,evex")
18725    (set_attr "mode" "OI")])
18726
18727 (define_insn "<avx_avx2>_maskload<ssemodesuffix><avxsizesuffix>"
18728   [(set (match_operand:V48_AVX2 0 "register_operand" "=x")
18729         (unspec:V48_AVX2
18730           [(match_operand:<sseintvecmode> 2 "register_operand" "x")
18731            (match_operand:V48_AVX2 1 "memory_operand" "m")]
18732           UNSPEC_MASKMOV))]
18733   "TARGET_AVX"
18734   "v<sseintprefix>maskmov<ssemodesuffix>\t{%1, %2, %0|%0, %2, %1}"
18735   [(set_attr "type" "sselog1")
18736    (set_attr "prefix_extra" "1")
18737    (set_attr "prefix" "vex")
18738    (set_attr "btver2_decode" "vector")
18739    (set_attr "mode" "<sseinsnmode>")])
18740
18741 (define_insn "<avx_avx2>_maskstore<ssemodesuffix><avxsizesuffix>"
18742   [(set (match_operand:V48_AVX2 0 "memory_operand" "+m")
18743         (unspec:V48_AVX2
18744           [(match_operand:<sseintvecmode> 1 "register_operand" "x")
18745            (match_operand:V48_AVX2 2 "register_operand" "x")
18746            (match_dup 0)]
18747           UNSPEC_MASKMOV))]
18748   "TARGET_AVX"
18749   "v<sseintprefix>maskmov<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
18750   [(set_attr "type" "sselog1")
18751    (set_attr "prefix_extra" "1")
18752    (set_attr "prefix" "vex")
18753    (set_attr "btver2_decode" "vector") 
18754    (set_attr "mode" "<sseinsnmode>")])
18755
18756 (define_expand "maskload<mode><sseintvecmodelower>"
18757   [(set (match_operand:V48_AVX2 0 "register_operand")
18758         (unspec:V48_AVX2
18759           [(match_operand:<sseintvecmode> 2 "register_operand")
18760            (match_operand:V48_AVX2 1 "memory_operand")]
18761           UNSPEC_MASKMOV))]
18762   "TARGET_AVX")
18763
18764 (define_expand "maskload<mode><avx512fmaskmodelower>"
18765   [(set (match_operand:V48_AVX512VL 0 "register_operand")
18766         (vec_merge:V48_AVX512VL
18767           (match_operand:V48_AVX512VL 1 "memory_operand")
18768           (match_dup 0)
18769           (match_operand:<avx512fmaskmode> 2 "register_operand")))]
18770   "TARGET_AVX512F")
18771
18772 (define_expand "maskload<mode><avx512fmaskmodelower>"
18773   [(set (match_operand:VI12_AVX512VL 0 "register_operand")
18774         (vec_merge:VI12_AVX512VL
18775           (match_operand:VI12_AVX512VL 1 "memory_operand")
18776           (match_dup 0)
18777           (match_operand:<avx512fmaskmode> 2 "register_operand")))]
18778   "TARGET_AVX512BW")
18779
18780 (define_expand "maskstore<mode><sseintvecmodelower>"
18781   [(set (match_operand:V48_AVX2 0 "memory_operand")
18782         (unspec:V48_AVX2
18783           [(match_operand:<sseintvecmode> 2 "register_operand")
18784            (match_operand:V48_AVX2 1 "register_operand")
18785            (match_dup 0)]
18786           UNSPEC_MASKMOV))]
18787   "TARGET_AVX")
18788
18789 (define_expand "maskstore<mode><avx512fmaskmodelower>"
18790   [(set (match_operand:V48_AVX512VL 0 "memory_operand")
18791         (vec_merge:V48_AVX512VL
18792           (match_operand:V48_AVX512VL 1 "register_operand")
18793           (match_dup 0)
18794           (match_operand:<avx512fmaskmode> 2 "register_operand")))]
18795   "TARGET_AVX512F")
18796
18797 (define_expand "maskstore<mode><avx512fmaskmodelower>"
18798   [(set (match_operand:VI12_AVX512VL 0 "memory_operand")
18799         (vec_merge:VI12_AVX512VL
18800           (match_operand:VI12_AVX512VL 1 "register_operand")
18801           (match_dup 0)
18802           (match_operand:<avx512fmaskmode> 2 "register_operand")))]
18803   "TARGET_AVX512BW")
18804
18805 (define_expand "cbranch<mode>4"
18806   [(set (reg:CC FLAGS_REG)
18807         (compare:CC (match_operand:VI48_AVX 1 "register_operand")
18808                     (match_operand:VI48_AVX 2 "nonimmediate_operand")))
18809    (set (pc) (if_then_else
18810                (match_operator 0 "bt_comparison_operator"
18811                 [(reg:CC FLAGS_REG) (const_int 0)])
18812                (label_ref (match_operand 3))
18813                (pc)))]
18814   "TARGET_SSE4_1"
18815 {
18816   ix86_expand_branch (GET_CODE (operands[0]),
18817                       operands[1], operands[2], operands[3]);
18818   DONE;
18819 })
18820
18821
18822 (define_insn_and_split "avx_<castmode><avxsizesuffix>_<castmode>"
18823   [(set (match_operand:AVX256MODE2P 0 "nonimmediate_operand" "=x,m")
18824         (unspec:AVX256MODE2P
18825           [(match_operand:<ssehalfvecmode> 1 "nonimmediate_operand" "xm,x")]
18826           UNSPEC_CAST))]
18827   "TARGET_AVX && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
18828   "#"
18829   "&& reload_completed"
18830   [(set (match_dup 0) (match_dup 1))]
18831 {
18832   if (REG_P (operands[0]))
18833     operands[0] = gen_lowpart (<ssehalfvecmode>mode, operands[0]);
18834   else
18835     operands[1] = lowpart_subreg (<MODE>mode, operands[1],
18836                                   <ssehalfvecmode>mode);
18837 })
18838
18839 ;; Modes handled by vec_init expanders.
18840 (define_mode_iterator VEC_INIT_MODE
18841   [(V64QI "TARGET_AVX512F") (V32QI "TARGET_AVX") V16QI
18842    (V32HI "TARGET_AVX512F") (V16HI "TARGET_AVX") V8HI
18843    (V16SI "TARGET_AVX512F") (V8SI "TARGET_AVX") V4SI
18844    (V8DI "TARGET_AVX512F") (V4DI "TARGET_AVX") V2DI
18845    (V16SF "TARGET_AVX512F") (V8SF "TARGET_AVX") V4SF
18846    (V8DF "TARGET_AVX512F") (V4DF "TARGET_AVX") (V2DF "TARGET_SSE2")
18847    (V4TI "TARGET_AVX512F") (V2TI "TARGET_AVX")])
18848
18849 ;; Likewise, but for initialization from half sized vectors.
18850 ;; Thus, these are all VEC_INIT_MODE modes except V2??.
18851 (define_mode_iterator VEC_INIT_HALF_MODE
18852   [(V64QI "TARGET_AVX512F") (V32QI "TARGET_AVX") V16QI
18853    (V32HI "TARGET_AVX512F") (V16HI "TARGET_AVX") V8HI
18854    (V16SI "TARGET_AVX512F") (V8SI "TARGET_AVX") V4SI
18855    (V8DI "TARGET_AVX512F") (V4DI "TARGET_AVX")
18856    (V16SF "TARGET_AVX512F") (V8SF "TARGET_AVX") V4SF
18857    (V8DF "TARGET_AVX512F") (V4DF "TARGET_AVX")
18858    (V4TI "TARGET_AVX512F")])
18859
18860 (define_expand "vec_init<mode><ssescalarmodelower>"
18861   [(match_operand:VEC_INIT_MODE 0 "register_operand")
18862    (match_operand 1)]
18863   "TARGET_SSE"
18864 {
18865   ix86_expand_vector_init (false, operands[0], operands[1]);
18866   DONE;
18867 })
18868
18869 (define_expand "vec_init<mode><ssehalfvecmodelower>"
18870   [(match_operand:VEC_INIT_HALF_MODE 0 "register_operand")
18871    (match_operand 1)]
18872   "TARGET_SSE"
18873 {
18874   ix86_expand_vector_init (false, operands[0], operands[1]);
18875   DONE;
18876 })
18877
18878 (define_insn "<avx2_avx512>_ashrv<mode><mask_name>"
18879   [(set (match_operand:VI48_AVX512F_AVX512VL 0 "register_operand" "=v")
18880         (ashiftrt:VI48_AVX512F_AVX512VL
18881           (match_operand:VI48_AVX512F_AVX512VL 1 "register_operand" "v")
18882           (match_operand:VI48_AVX512F_AVX512VL 2 "nonimmediate_operand" "vm")))]
18883   "TARGET_AVX2 && <mask_mode512bit_condition>"
18884   "vpsrav<ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
18885   [(set_attr "type" "sseishft")
18886    (set_attr "prefix" "maybe_evex")
18887    (set_attr "mode" "<sseinsnmode>")])
18888
18889 (define_insn "<avx2_avx512>_ashrv<mode><mask_name>"
18890   [(set (match_operand:VI2_AVX512VL 0 "register_operand" "=v")
18891         (ashiftrt:VI2_AVX512VL
18892           (match_operand:VI2_AVX512VL 1 "register_operand" "v")
18893           (match_operand:VI2_AVX512VL 2 "nonimmediate_operand" "vm")))]
18894   "TARGET_AVX512BW"
18895   "vpsravw\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
18896   [(set_attr "type" "sseishft")
18897    (set_attr "prefix" "maybe_evex")
18898    (set_attr "mode" "<sseinsnmode>")])
18899
18900 (define_insn "<avx2_avx512>_<shift_insn>v<mode><mask_name>"
18901   [(set (match_operand:VI48_AVX512F 0 "register_operand" "=v")
18902         (any_lshift:VI48_AVX512F
18903           (match_operand:VI48_AVX512F 1 "register_operand" "v")
18904           (match_operand:VI48_AVX512F 2 "nonimmediate_operand" "vm")))]
18905   "TARGET_AVX2 && <mask_mode512bit_condition>"
18906   "vp<vshift>v<ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
18907   [(set_attr "type" "sseishft")
18908    (set_attr "prefix" "maybe_evex")
18909    (set_attr "mode" "<sseinsnmode>")])
18910
18911 (define_insn "<avx2_avx512>_<shift_insn>v<mode><mask_name>"
18912   [(set (match_operand:VI2_AVX512VL 0 "register_operand" "=v")
18913         (any_lshift:VI2_AVX512VL
18914           (match_operand:VI2_AVX512VL 1 "register_operand" "v")
18915           (match_operand:VI2_AVX512VL 2 "nonimmediate_operand" "vm")))]
18916   "TARGET_AVX512BW"
18917   "vp<vshift>v<ssemodesuffix>\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
18918   [(set_attr "type" "sseishft")
18919    (set_attr "prefix" "maybe_evex")
18920    (set_attr "mode" "<sseinsnmode>")])
18921
18922 (define_insn "avx_vec_concat<mode>"
18923   [(set (match_operand:V_256_512 0 "register_operand" "=x,v,x,Yv")
18924         (vec_concat:V_256_512
18925           (match_operand:<ssehalfvecmode> 1 "register_operand" "x,v,x,v")
18926           (match_operand:<ssehalfvecmode> 2 "vector_move_operand" "xm,vm,C,C")))]
18927   "TARGET_AVX"
18928 {
18929   switch (which_alternative)
18930     {
18931     case 0:
18932       return "vinsert<i128>\t{$0x1, %2, %<concat_tg_mode>1, %0|%0, %<concat_tg_mode>1, %2, 0x1}";
18933     case 1:
18934       if (<MODE_SIZE> == 64)
18935         {
18936           if (TARGET_AVX512DQ && GET_MODE_SIZE (<ssescalarmode>mode) == 4)
18937             return "vinsert<shuffletype>32x8\t{$0x1, %2, %<concat_tg_mode>1, %0|%0, %<concat_tg_mode>1, %2, 0x1}";
18938           else
18939             return "vinsert<shuffletype>64x4\t{$0x1, %2, %<concat_tg_mode>1, %0|%0, %<concat_tg_mode>1, %2, 0x1}";
18940         }
18941       else
18942         {
18943           if (TARGET_AVX512DQ && GET_MODE_SIZE (<ssescalarmode>mode) == 8)
18944             return "vinsert<shuffletype>64x2\t{$0x1, %2, %<concat_tg_mode>1, %0|%0, %<concat_tg_mode>1, %2, 0x1}";
18945           else
18946             return "vinsert<shuffletype>32x4\t{$0x1, %2, %<concat_tg_mode>1, %0|%0, %<concat_tg_mode>1, %2, 0x1}";
18947         }
18948     case 2:
18949     case 3:
18950       switch (get_attr_mode (insn))
18951         {
18952         case MODE_V16SF:
18953           return "vmovaps\t{%1, %t0|%t0, %1}";
18954         case MODE_V8DF:
18955           return "vmovapd\t{%1, %t0|%t0, %1}";
18956         case MODE_V8SF:
18957           return "vmovaps\t{%1, %x0|%x0, %1}";
18958         case MODE_V4DF:
18959           return "vmovapd\t{%1, %x0|%x0, %1}";
18960         case MODE_XI:
18961           if (which_alternative == 2)
18962             return "vmovdqa\t{%1, %t0|%t0, %1}";
18963           else if (GET_MODE_SIZE (<ssescalarmode>mode) == 8)
18964             return "vmovdqa64\t{%1, %t0|%t0, %1}";
18965           else
18966             return "vmovdqa32\t{%1, %t0|%t0, %1}";
18967         case MODE_OI:
18968           if (which_alternative == 2)
18969             return "vmovdqa\t{%1, %x0|%x0, %1}";
18970           else if (GET_MODE_SIZE (<ssescalarmode>mode) == 8)
18971             return "vmovdqa64\t{%1, %x0|%x0, %1}";
18972           else
18973             return "vmovdqa32\t{%1, %x0|%x0, %1}";
18974         default:
18975           gcc_unreachable ();
18976         }
18977     default:
18978       gcc_unreachable ();
18979     }
18980 }
18981   [(set_attr "type" "sselog,sselog,ssemov,ssemov")
18982    (set_attr "prefix_extra" "1,1,*,*")
18983    (set_attr "length_immediate" "1,1,*,*")
18984    (set_attr "prefix" "maybe_evex")
18985    (set_attr "mode" "<sseinsnmode>")])
18986
18987 (define_insn "vcvtph2ps<mask_name>"
18988   [(set (match_operand:V4SF 0 "register_operand" "=v")
18989         (vec_select:V4SF
18990           (unspec:V8SF [(match_operand:V8HI 1 "register_operand" "v")]
18991                        UNSPEC_VCVTPH2PS)
18992           (parallel [(const_int 0) (const_int 1)
18993                      (const_int 2) (const_int 3)])))]
18994   "TARGET_F16C || TARGET_AVX512VL"
18995   "vcvtph2ps\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
18996   [(set_attr "type" "ssecvt")
18997    (set_attr "prefix" "maybe_evex")
18998    (set_attr "mode" "V4SF")])
18999
19000 (define_insn "*vcvtph2ps_load<mask_name>"
19001   [(set (match_operand:V4SF 0 "register_operand" "=v")
19002         (unspec:V4SF [(match_operand:V4HI 1 "memory_operand" "m")]
19003                      UNSPEC_VCVTPH2PS))]
19004   "TARGET_F16C || TARGET_AVX512VL"
19005   "vcvtph2ps\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
19006   [(set_attr "type" "ssecvt")
19007    (set_attr "prefix" "vex")
19008    (set_attr "mode" "V8SF")])
19009
19010 (define_insn "vcvtph2ps256<mask_name>"
19011   [(set (match_operand:V8SF 0 "register_operand" "=v")
19012         (unspec:V8SF [(match_operand:V8HI 1 "nonimmediate_operand" "vm")]
19013                      UNSPEC_VCVTPH2PS))]
19014   "TARGET_F16C || TARGET_AVX512VL"
19015   "vcvtph2ps\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
19016   [(set_attr "type" "ssecvt")
19017    (set_attr "prefix" "vex")
19018    (set_attr "btver2_decode" "double")
19019    (set_attr "mode" "V8SF")])
19020
19021 (define_insn "<mask_codefor>avx512f_vcvtph2ps512<mask_name><round_saeonly_name>"
19022   [(set (match_operand:V16SF 0 "register_operand" "=v")
19023         (unspec:V16SF
19024           [(match_operand:V16HI 1 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")]
19025           UNSPEC_VCVTPH2PS))]
19026   "TARGET_AVX512F"
19027   "vcvtph2ps\t{<round_saeonly_mask_op2>%1, %0<mask_operand2>|%0<mask_operand2>, %1<round_saeonly_mask_op2>}"
19028   [(set_attr "type" "ssecvt")
19029    (set_attr "prefix" "evex")
19030    (set_attr "mode" "V16SF")])
19031
19032 (define_expand "vcvtps2ph_mask"
19033   [(set (match_operand:V8HI 0 "register_operand")
19034         (vec_merge:V8HI
19035           (vec_concat:V8HI
19036             (unspec:V4HI [(match_operand:V4SF 1 "register_operand")
19037                           (match_operand:SI 2 "const_0_to_255_operand")]
19038                           UNSPEC_VCVTPS2PH)
19039             (match_dup 5))
19040            (match_operand:V8HI 3 "vector_move_operand")
19041            (match_operand:QI 4 "register_operand")))]
19042   "TARGET_AVX512VL"
19043   "operands[5] = CONST0_RTX (V4HImode);")
19044
19045 (define_expand "vcvtps2ph"
19046   [(set (match_operand:V8HI 0 "register_operand")
19047         (vec_concat:V8HI
19048           (unspec:V4HI [(match_operand:V4SF 1 "register_operand")
19049                         (match_operand:SI 2 "const_0_to_255_operand")]
19050                        UNSPEC_VCVTPS2PH)
19051           (match_dup 3)))]
19052   "TARGET_F16C"
19053   "operands[3] = CONST0_RTX (V4HImode);")
19054
19055 (define_insn "*vcvtps2ph<mask_name>"
19056   [(set (match_operand:V8HI 0 "register_operand" "=v")
19057         (vec_concat:V8HI
19058           (unspec:V4HI [(match_operand:V4SF 1 "register_operand" "v")
19059                         (match_operand:SI 2 "const_0_to_255_operand" "N")]
19060                        UNSPEC_VCVTPS2PH)
19061           (match_operand:V4HI 3 "const0_operand")))]
19062   "(TARGET_F16C || TARGET_AVX512VL) && <mask_avx512vl_condition>"
19063   "vcvtps2ph\t{%2, %1, %0<mask_operand4>|%0<mask_operand4>, %1, %2}"
19064   [(set_attr "type" "ssecvt")
19065    (set_attr "prefix" "maybe_evex")
19066    (set_attr "mode" "V4SF")])
19067
19068 (define_insn "*vcvtps2ph_store<mask_name>"
19069   [(set (match_operand:V4HI 0 "memory_operand" "=m")
19070         (unspec:V4HI [(match_operand:V4SF 1 "register_operand" "v")
19071                       (match_operand:SI 2 "const_0_to_255_operand" "N")]
19072                      UNSPEC_VCVTPS2PH))]
19073   "TARGET_F16C || TARGET_AVX512VL"
19074   "vcvtps2ph\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
19075   [(set_attr "type" "ssecvt")
19076    (set_attr "prefix" "maybe_evex")
19077    (set_attr "mode" "V4SF")])
19078
19079 (define_insn "vcvtps2ph256<mask_name>"
19080   [(set (match_operand:V8HI 0 "nonimmediate_operand" "=vm")
19081         (unspec:V8HI [(match_operand:V8SF 1 "register_operand" "v")
19082                       (match_operand:SI 2 "const_0_to_255_operand" "N")]
19083                      UNSPEC_VCVTPS2PH))]
19084   "TARGET_F16C || TARGET_AVX512VL"
19085   "vcvtps2ph\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
19086   [(set_attr "type" "ssecvt")
19087    (set_attr "prefix" "maybe_evex")
19088    (set_attr "btver2_decode" "vector")
19089    (set_attr "mode" "V8SF")])
19090
19091 (define_insn "<mask_codefor>avx512f_vcvtps2ph512<mask_name>"
19092   [(set (match_operand:V16HI 0 "nonimmediate_operand" "=vm")
19093         (unspec:V16HI
19094           [(match_operand:V16SF 1 "register_operand" "v")
19095            (match_operand:SI 2 "const_0_to_255_operand" "N")]
19096           UNSPEC_VCVTPS2PH))]
19097   "TARGET_AVX512F"
19098   "vcvtps2ph\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
19099   [(set_attr "type" "ssecvt")
19100    (set_attr "prefix" "evex")
19101    (set_attr "mode" "V16SF")])
19102
19103 ;; For gather* insn patterns
19104 (define_mode_iterator VEC_GATHER_MODE
19105                       [V2DI V2DF V4DI V4DF V4SI V4SF V8SI V8SF])
19106 (define_mode_attr VEC_GATHER_IDXSI
19107                       [(V2DI "V4SI") (V4DI "V4SI") (V8DI "V8SI")
19108                        (V2DF "V4SI") (V4DF "V4SI") (V8DF "V8SI")
19109                        (V4SI "V4SI") (V8SI "V8SI") (V16SI "V16SI")
19110                        (V4SF "V4SI") (V8SF "V8SI") (V16SF "V16SI")])
19111
19112 (define_mode_attr VEC_GATHER_IDXDI
19113                       [(V2DI "V2DI") (V4DI "V4DI") (V8DI "V8DI")
19114                        (V2DF "V2DI") (V4DF "V4DI") (V8DF "V8DI")
19115                        (V4SI "V2DI") (V8SI "V4DI") (V16SI "V8DI")
19116                        (V4SF "V2DI") (V8SF "V4DI") (V16SF "V8DI")])
19117
19118 (define_mode_attr VEC_GATHER_SRCDI
19119                       [(V2DI "V2DI") (V4DI "V4DI") (V8DI "V8DI")
19120                        (V2DF "V2DF") (V4DF "V4DF") (V8DF "V8DF")
19121                        (V4SI "V4SI") (V8SI "V4SI") (V16SI "V8SI")
19122                        (V4SF "V4SF") (V8SF "V4SF") (V16SF "V8SF")])
19123
19124 (define_expand "avx2_gathersi<mode>"
19125   [(parallel [(set (match_operand:VEC_GATHER_MODE 0 "register_operand")
19126                    (unspec:VEC_GATHER_MODE
19127                      [(match_operand:VEC_GATHER_MODE 1 "register_operand")
19128                       (mem:<ssescalarmode>
19129                         (match_par_dup 6
19130                           [(match_operand 2 "vsib_address_operand")
19131                            (match_operand:<VEC_GATHER_IDXSI>
19132                               3 "register_operand")
19133                            (match_operand:SI 5 "const1248_operand ")]))
19134                       (mem:BLK (scratch))
19135                       (match_operand:VEC_GATHER_MODE 4 "register_operand")]
19136                      UNSPEC_GATHER))
19137               (clobber (match_scratch:VEC_GATHER_MODE 7))])]
19138   "TARGET_AVX2"
19139 {
19140   operands[6]
19141     = gen_rtx_UNSPEC (Pmode, gen_rtvec (3, operands[2], operands[3],
19142                                         operands[5]), UNSPEC_VSIBADDR);
19143 })
19144
19145 (define_insn "*avx2_gathersi<mode>"
19146   [(set (match_operand:VEC_GATHER_MODE 0 "register_operand" "=&x")
19147         (unspec:VEC_GATHER_MODE
19148           [(match_operand:VEC_GATHER_MODE 2 "register_operand" "0")
19149            (match_operator:<ssescalarmode> 7 "vsib_mem_operator"
19150              [(unspec:P
19151                 [(match_operand:P 3 "vsib_address_operand" "Tv")
19152                  (match_operand:<VEC_GATHER_IDXSI> 4 "register_operand" "x")
19153                  (match_operand:SI 6 "const1248_operand" "n")]
19154                 UNSPEC_VSIBADDR)])
19155            (mem:BLK (scratch))
19156            (match_operand:VEC_GATHER_MODE 5 "register_operand" "1")]
19157           UNSPEC_GATHER))
19158    (clobber (match_scratch:VEC_GATHER_MODE 1 "=&x"))]
19159   "TARGET_AVX2"
19160   "v<sseintprefix>gatherd<ssemodesuffix>\t{%1, %7, %0|%0, %7, %1}"
19161   [(set_attr "type" "ssemov")
19162    (set_attr "prefix" "vex")
19163    (set_attr "mode" "<sseinsnmode>")])
19164
19165 (define_insn "*avx2_gathersi<mode>_2"
19166   [(set (match_operand:VEC_GATHER_MODE 0 "register_operand" "=&x")
19167         (unspec:VEC_GATHER_MODE
19168           [(pc)
19169            (match_operator:<ssescalarmode> 6 "vsib_mem_operator"
19170              [(unspec:P
19171                 [(match_operand:P 2 "vsib_address_operand" "Tv")
19172                  (match_operand:<VEC_GATHER_IDXSI> 3 "register_operand" "x")
19173                  (match_operand:SI 5 "const1248_operand" "n")]
19174                 UNSPEC_VSIBADDR)])
19175            (mem:BLK (scratch))
19176            (match_operand:VEC_GATHER_MODE 4 "register_operand" "1")]
19177           UNSPEC_GATHER))
19178    (clobber (match_scratch:VEC_GATHER_MODE 1 "=&x"))]
19179   "TARGET_AVX2"
19180   "v<sseintprefix>gatherd<ssemodesuffix>\t{%1, %6, %0|%0, %6, %1}"
19181   [(set_attr "type" "ssemov")
19182    (set_attr "prefix" "vex")
19183    (set_attr "mode" "<sseinsnmode>")])
19184
19185 (define_expand "avx2_gatherdi<mode>"
19186   [(parallel [(set (match_operand:VEC_GATHER_MODE 0 "register_operand")
19187                    (unspec:VEC_GATHER_MODE
19188                      [(match_operand:<VEC_GATHER_SRCDI> 1 "register_operand")
19189                       (mem:<ssescalarmode>
19190                         (match_par_dup 6
19191                           [(match_operand 2 "vsib_address_operand")
19192                            (match_operand:<VEC_GATHER_IDXDI>
19193                               3 "register_operand")
19194                            (match_operand:SI 5 "const1248_operand ")]))
19195                       (mem:BLK (scratch))
19196                       (match_operand:<VEC_GATHER_SRCDI> 4 "register_operand")]
19197                      UNSPEC_GATHER))
19198               (clobber (match_scratch:VEC_GATHER_MODE 7))])]
19199   "TARGET_AVX2"
19200 {
19201   operands[6]
19202     = gen_rtx_UNSPEC (Pmode, gen_rtvec (3, operands[2], operands[3],
19203                                         operands[5]), UNSPEC_VSIBADDR);
19204 })
19205
19206 (define_insn "*avx2_gatherdi<mode>"
19207   [(set (match_operand:VEC_GATHER_MODE 0 "register_operand" "=&x")
19208         (unspec:VEC_GATHER_MODE
19209           [(match_operand:<VEC_GATHER_SRCDI> 2 "register_operand" "0")
19210            (match_operator:<ssescalarmode> 7 "vsib_mem_operator"
19211              [(unspec:P
19212                 [(match_operand:P 3 "vsib_address_operand" "Tv")
19213                  (match_operand:<VEC_GATHER_IDXDI> 4 "register_operand" "x")
19214                  (match_operand:SI 6 "const1248_operand" "n")]
19215                 UNSPEC_VSIBADDR)])
19216            (mem:BLK (scratch))
19217            (match_operand:<VEC_GATHER_SRCDI> 5 "register_operand" "1")]
19218           UNSPEC_GATHER))
19219    (clobber (match_scratch:VEC_GATHER_MODE 1 "=&x"))]
19220   "TARGET_AVX2"
19221   "v<sseintprefix>gatherq<ssemodesuffix>\t{%5, %7, %2|%2, %7, %5}"
19222   [(set_attr "type" "ssemov")
19223    (set_attr "prefix" "vex")
19224    (set_attr "mode" "<sseinsnmode>")])
19225
19226 (define_insn "*avx2_gatherdi<mode>_2"
19227   [(set (match_operand:VEC_GATHER_MODE 0 "register_operand" "=&x")
19228         (unspec:VEC_GATHER_MODE
19229           [(pc)
19230            (match_operator:<ssescalarmode> 6 "vsib_mem_operator"
19231              [(unspec:P
19232                 [(match_operand:P 2 "vsib_address_operand" "Tv")
19233                  (match_operand:<VEC_GATHER_IDXDI> 3 "register_operand" "x")
19234                  (match_operand:SI 5 "const1248_operand" "n")]
19235                 UNSPEC_VSIBADDR)])
19236            (mem:BLK (scratch))
19237            (match_operand:<VEC_GATHER_SRCDI> 4 "register_operand" "1")]
19238           UNSPEC_GATHER))
19239    (clobber (match_scratch:VEC_GATHER_MODE 1 "=&x"))]
19240   "TARGET_AVX2"
19241 {
19242   if (<MODE>mode != <VEC_GATHER_SRCDI>mode)
19243     return "v<sseintprefix>gatherq<ssemodesuffix>\t{%4, %6, %x0|%x0, %6, %4}";
19244   return "v<sseintprefix>gatherq<ssemodesuffix>\t{%4, %6, %0|%0, %6, %4}";
19245 }
19246   [(set_attr "type" "ssemov")
19247    (set_attr "prefix" "vex")
19248    (set_attr "mode" "<sseinsnmode>")])
19249
19250 (define_insn "*avx2_gatherdi<mode>_3"
19251   [(set (match_operand:<VEC_GATHER_SRCDI> 0 "register_operand" "=&x")
19252         (vec_select:<VEC_GATHER_SRCDI>
19253           (unspec:VI4F_256
19254             [(match_operand:<VEC_GATHER_SRCDI> 2 "register_operand" "0")
19255              (match_operator:<ssescalarmode> 7 "vsib_mem_operator"
19256                [(unspec:P
19257                   [(match_operand:P 3 "vsib_address_operand" "Tv")
19258                    (match_operand:<VEC_GATHER_IDXDI> 4 "register_operand" "x")
19259                    (match_operand:SI 6 "const1248_operand" "n")]
19260                   UNSPEC_VSIBADDR)])
19261              (mem:BLK (scratch))
19262              (match_operand:<VEC_GATHER_SRCDI> 5 "register_operand" "1")]
19263              UNSPEC_GATHER)
19264           (parallel [(const_int 0) (const_int 1)
19265                      (const_int 2) (const_int 3)])))
19266    (clobber (match_scratch:VI4F_256 1 "=&x"))]
19267   "TARGET_AVX2"
19268   "v<sseintprefix>gatherq<ssemodesuffix>\t{%5, %7, %0|%0, %7, %5}"
19269   [(set_attr "type" "ssemov")
19270    (set_attr "prefix" "vex")
19271    (set_attr "mode" "<sseinsnmode>")])
19272
19273 (define_insn "*avx2_gatherdi<mode>_4"
19274   [(set (match_operand:<VEC_GATHER_SRCDI> 0 "register_operand" "=&x")
19275         (vec_select:<VEC_GATHER_SRCDI>
19276           (unspec:VI4F_256
19277             [(pc)
19278              (match_operator:<ssescalarmode> 6 "vsib_mem_operator"
19279                [(unspec:P
19280                   [(match_operand:P 2 "vsib_address_operand" "Tv")
19281                    (match_operand:<VEC_GATHER_IDXDI> 3 "register_operand" "x")
19282                    (match_operand:SI 5 "const1248_operand" "n")]
19283                   UNSPEC_VSIBADDR)])
19284              (mem:BLK (scratch))
19285              (match_operand:<VEC_GATHER_SRCDI> 4 "register_operand" "1")]
19286             UNSPEC_GATHER)
19287           (parallel [(const_int 0) (const_int 1)
19288                      (const_int 2) (const_int 3)])))
19289    (clobber (match_scratch:VI4F_256 1 "=&x"))]
19290   "TARGET_AVX2"
19291   "v<sseintprefix>gatherq<ssemodesuffix>\t{%4, %6, %0|%0, %6, %4}"
19292   [(set_attr "type" "ssemov")
19293    (set_attr "prefix" "vex")
19294    (set_attr "mode" "<sseinsnmode>")])
19295
19296 (define_expand "<avx512>_gathersi<mode>"
19297   [(parallel [(set (match_operand:VI48F 0 "register_operand")
19298                    (unspec:VI48F
19299                      [(match_operand:VI48F 1 "register_operand")
19300                       (match_operand:<avx512fmaskmode> 4 "register_operand")
19301                       (mem:<ssescalarmode>
19302                         (match_par_dup 6
19303                           [(match_operand 2 "vsib_address_operand")
19304                            (match_operand:<VEC_GATHER_IDXSI> 3 "register_operand")
19305                            (match_operand:SI 5 "const1248_operand")]))]
19306                      UNSPEC_GATHER))
19307               (clobber (match_scratch:<avx512fmaskmode> 7))])]
19308   "TARGET_AVX512F"
19309 {
19310   operands[6]
19311     = gen_rtx_UNSPEC (Pmode, gen_rtvec (3, operands[2], operands[3],
19312                                         operands[5]), UNSPEC_VSIBADDR);
19313 })
19314
19315 (define_insn "*avx512f_gathersi<mode>"
19316   [(set (match_operand:VI48F 0 "register_operand" "=&v")
19317         (unspec:VI48F
19318           [(match_operand:VI48F 1 "register_operand" "0")
19319            (match_operand:<avx512fmaskmode> 7 "register_operand" "2")
19320            (match_operator:<ssescalarmode> 6 "vsib_mem_operator"
19321              [(unspec:P
19322                 [(match_operand:P 4 "vsib_address_operand" "Tv")
19323                  (match_operand:<VEC_GATHER_IDXSI> 3 "register_operand" "v")
19324                  (match_operand:SI 5 "const1248_operand" "n")]
19325                 UNSPEC_VSIBADDR)])]
19326           UNSPEC_GATHER))
19327    (clobber (match_scratch:<avx512fmaskmode> 2 "=&Yk"))]
19328   "TARGET_AVX512F"
19329 ;; %X6 so that we don't emit any *WORD PTR for -masm=intel, as
19330 ;; gas changed what it requires incompatibly.
19331   "v<sseintprefix>gatherd<ssemodesuffix>\t{%6, %0%{%2%}|%0%{%2%}, %X6}"
19332   [(set_attr "type" "ssemov")
19333    (set_attr "prefix" "evex")
19334    (set_attr "mode" "<sseinsnmode>")])
19335
19336 (define_insn "*avx512f_gathersi<mode>_2"
19337   [(set (match_operand:VI48F 0 "register_operand" "=&v")
19338         (unspec:VI48F
19339           [(pc)
19340            (match_operand:<avx512fmaskmode> 6 "register_operand" "1")
19341            (match_operator:<ssescalarmode> 5 "vsib_mem_operator"
19342              [(unspec:P
19343                 [(match_operand:P 3 "vsib_address_operand" "Tv")
19344                  (match_operand:<VEC_GATHER_IDXSI> 2 "register_operand" "v")
19345                  (match_operand:SI 4 "const1248_operand" "n")]
19346                 UNSPEC_VSIBADDR)])]
19347           UNSPEC_GATHER))
19348    (clobber (match_scratch:<avx512fmaskmode> 1 "=&Yk"))]
19349   "TARGET_AVX512F"
19350 ;; %X5 so that we don't emit any *WORD PTR for -masm=intel, as
19351 ;; gas changed what it requires incompatibly.
19352   "v<sseintprefix>gatherd<ssemodesuffix>\t{%5, %0%{%1%}|%0%{%1%}, %X5}"
19353   [(set_attr "type" "ssemov")
19354    (set_attr "prefix" "evex")
19355    (set_attr "mode" "<sseinsnmode>")])
19356
19357
19358 (define_expand "<avx512>_gatherdi<mode>"
19359   [(parallel [(set (match_operand:VI48F 0 "register_operand")
19360                    (unspec:VI48F
19361                      [(match_operand:<VEC_GATHER_SRCDI> 1 "register_operand")
19362                       (match_operand:QI 4 "register_operand")
19363                       (mem:<ssescalarmode>
19364                         (match_par_dup 6
19365                           [(match_operand 2 "vsib_address_operand")
19366                            (match_operand:<VEC_GATHER_IDXDI> 3 "register_operand")
19367                            (match_operand:SI 5 "const1248_operand")]))]
19368                      UNSPEC_GATHER))
19369               (clobber (match_scratch:QI 7))])]
19370   "TARGET_AVX512F"
19371 {
19372   operands[6]
19373     = gen_rtx_UNSPEC (Pmode, gen_rtvec (3, operands[2], operands[3],
19374                                         operands[5]), UNSPEC_VSIBADDR);
19375 })
19376
19377 (define_insn "*avx512f_gatherdi<mode>"
19378   [(set (match_operand:VI48F 0 "register_operand" "=&v")
19379         (unspec:VI48F
19380           [(match_operand:<VEC_GATHER_SRCDI> 1 "register_operand" "0")
19381            (match_operand:QI 7 "register_operand" "2")
19382            (match_operator:<ssescalarmode> 6 "vsib_mem_operator"
19383              [(unspec:P
19384                 [(match_operand:P 4 "vsib_address_operand" "Tv")
19385                  (match_operand:<VEC_GATHER_IDXDI> 3 "register_operand" "v")
19386                  (match_operand:SI 5 "const1248_operand" "n")]
19387                 UNSPEC_VSIBADDR)])]
19388           UNSPEC_GATHER))
19389    (clobber (match_scratch:QI 2 "=&Yk"))]
19390   "TARGET_AVX512F"
19391 ;; %X6 so that we don't emit any *WORD PTR for -masm=intel, as
19392 ;; gas changed what it requires incompatibly.
19393   "v<sseintprefix>gatherq<ssemodesuffix>\t{%6, %1%{%2%}|%1%{%2%}, %X6}"
19394   [(set_attr "type" "ssemov")
19395    (set_attr "prefix" "evex")
19396    (set_attr "mode" "<sseinsnmode>")])
19397
19398 (define_insn "*avx512f_gatherdi<mode>_2"
19399   [(set (match_operand:VI48F 0 "register_operand" "=&v")
19400         (unspec:VI48F
19401           [(pc)
19402            (match_operand:QI 6 "register_operand" "1")
19403            (match_operator:<ssescalarmode> 5 "vsib_mem_operator"
19404              [(unspec:P
19405                 [(match_operand:P 3 "vsib_address_operand" "Tv")
19406                  (match_operand:<VEC_GATHER_IDXDI> 2 "register_operand" "v")
19407                  (match_operand:SI 4 "const1248_operand" "n")]
19408                 UNSPEC_VSIBADDR)])]
19409           UNSPEC_GATHER))
19410    (clobber (match_scratch:QI 1 "=&Yk"))]
19411   "TARGET_AVX512F"
19412 {
19413   /* %X5 so that we don't emit any *WORD PTR for -masm=intel, as
19414      gas changed what it requires incompatibly.  */
19415   if (<MODE>mode != <VEC_GATHER_SRCDI>mode)
19416     {
19417       if (<MODE_SIZE> != 64)
19418         return "v<sseintprefix>gatherq<ssemodesuffix>\t{%5, %x0%{%1%}|%x0%{%1%}, %X5}";
19419       else
19420         return "v<sseintprefix>gatherq<ssemodesuffix>\t{%5, %t0%{%1%}|%t0%{%1%}, %X5}";
19421     }
19422   return "v<sseintprefix>gatherq<ssemodesuffix>\t{%5, %0%{%1%}|%0%{%1%}, %X5}";
19423 }
19424   [(set_attr "type" "ssemov")
19425    (set_attr "prefix" "evex")
19426    (set_attr "mode" "<sseinsnmode>")])
19427
19428 (define_expand "<avx512>_scattersi<mode>"
19429   [(parallel [(set (mem:VI48F
19430                      (match_par_dup 5
19431                        [(match_operand 0 "vsib_address_operand")
19432                         (match_operand:<VEC_GATHER_IDXSI> 2 "register_operand")
19433                         (match_operand:SI 4 "const1248_operand")]))
19434                    (unspec:VI48F
19435                      [(match_operand:<avx512fmaskmode> 1 "register_operand")
19436                       (match_operand:VI48F 3 "register_operand")]
19437                      UNSPEC_SCATTER))
19438               (clobber (match_scratch:<avx512fmaskmode> 6))])]
19439   "TARGET_AVX512F"
19440 {
19441   operands[5]
19442     = gen_rtx_UNSPEC (Pmode, gen_rtvec (3, operands[0], operands[2],
19443                                         operands[4]), UNSPEC_VSIBADDR);
19444 })
19445
19446 (define_insn "*avx512f_scattersi<mode>"
19447   [(set (match_operator:VI48F 5 "vsib_mem_operator"
19448           [(unspec:P
19449              [(match_operand:P 0 "vsib_address_operand" "Tv")
19450               (match_operand:<VEC_GATHER_IDXSI> 2 "register_operand" "v")
19451               (match_operand:SI 4 "const1248_operand" "n")]
19452              UNSPEC_VSIBADDR)])
19453         (unspec:VI48F
19454           [(match_operand:<avx512fmaskmode> 6 "register_operand" "1")
19455            (match_operand:VI48F 3 "register_operand" "v")]
19456           UNSPEC_SCATTER))
19457    (clobber (match_scratch:<avx512fmaskmode> 1 "=&Yk"))]
19458   "TARGET_AVX512F"
19459 ;; %X5 so that we don't emit any *WORD PTR for -masm=intel, as
19460 ;; gas changed what it requires incompatibly.
19461   "v<sseintprefix>scatterd<ssemodesuffix>\t{%3, %5%{%1%}|%X5%{%1%}, %3}"
19462   [(set_attr "type" "ssemov")
19463    (set_attr "prefix" "evex")
19464    (set_attr "mode" "<sseinsnmode>")])
19465
19466 (define_expand "<avx512>_scatterdi<mode>"
19467   [(parallel [(set (mem:VI48F
19468                      (match_par_dup 5
19469                        [(match_operand 0 "vsib_address_operand")
19470                         (match_operand:<VEC_GATHER_IDXDI> 2 "register_operand")
19471                         (match_operand:SI 4 "const1248_operand")]))
19472                    (unspec:VI48F
19473                      [(match_operand:QI 1 "register_operand")
19474                       (match_operand:<VEC_GATHER_SRCDI> 3 "register_operand")]
19475                      UNSPEC_SCATTER))
19476               (clobber (match_scratch:QI 6))])]
19477   "TARGET_AVX512F"
19478 {
19479   operands[5]
19480     = gen_rtx_UNSPEC (Pmode, gen_rtvec (3, operands[0], operands[2],
19481                                         operands[4]), UNSPEC_VSIBADDR);
19482 })
19483
19484 (define_insn "*avx512f_scatterdi<mode>"
19485   [(set (match_operator:VI48F 5 "vsib_mem_operator"
19486           [(unspec:P
19487              [(match_operand:P 0 "vsib_address_operand" "Tv")
19488               (match_operand:<VEC_GATHER_IDXDI> 2 "register_operand" "v")
19489               (match_operand:SI 4 "const1248_operand" "n")]
19490              UNSPEC_VSIBADDR)])
19491         (unspec:VI48F
19492           [(match_operand:QI 6 "register_operand" "1")
19493            (match_operand:<VEC_GATHER_SRCDI> 3 "register_operand" "v")]
19494           UNSPEC_SCATTER))
19495    (clobber (match_scratch:QI 1 "=&Yk"))]
19496   "TARGET_AVX512F"
19497 ;; %X5 so that we don't emit any *WORD PTR for -masm=intel, as
19498 ;; gas changed what it requires incompatibly.
19499   "v<sseintprefix>scatterq<ssemodesuffix>\t{%3, %5%{%1%}|%X5%{%1%}, %3}"
19500   [(set_attr "type" "ssemov")
19501    (set_attr "prefix" "evex")
19502    (set_attr "mode" "<sseinsnmode>")])
19503
19504 (define_insn "<avx512>_compress<mode>_mask"
19505   [(set (match_operand:VI48F 0 "register_operand" "=v")
19506         (unspec:VI48F
19507           [(match_operand:VI48F 1 "register_operand" "v")
19508            (match_operand:VI48F 2 "vector_move_operand" "0C")
19509            (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk")]
19510           UNSPEC_COMPRESS))]
19511   "TARGET_AVX512F"
19512   "v<sseintprefix>compress<ssemodesuffix>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
19513   [(set_attr "type" "ssemov")
19514    (set_attr "prefix" "evex")
19515    (set_attr "mode" "<sseinsnmode>")])
19516
19517 (define_insn "compress<mode>_mask"
19518   [(set (match_operand:VI12_AVX512VLBW 0 "register_operand" "=v")
19519         (unspec:VI12_AVX512VLBW
19520           [(match_operand:VI12_AVX512VLBW 1 "register_operand" "v")
19521            (match_operand:VI12_AVX512VLBW 2 "vector_move_operand" "0C")
19522            (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk")]
19523           UNSPEC_COMPRESS))]
19524   "TARGET_AVX512VBMI2"
19525   "vpcompress<ssemodesuffix>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
19526   [(set_attr "type" "ssemov")
19527    (set_attr "prefix" "evex")
19528    (set_attr "mode" "<sseinsnmode>")])
19529
19530 (define_insn "<avx512>_compressstore<mode>_mask"
19531   [(set (match_operand:VI48F 0 "memory_operand" "=m")
19532         (unspec:VI48F
19533           [(match_operand:VI48F 1 "register_operand" "x")
19534            (match_dup 0)
19535            (match_operand:<avx512fmaskmode> 2 "register_operand" "Yk")]
19536           UNSPEC_COMPRESS_STORE))]
19537   "TARGET_AVX512F"
19538   "v<sseintprefix>compress<ssemodesuffix>\t{%1, %0%{%2%}|%0%{%2%}, %1}"
19539   [(set_attr "type" "ssemov")
19540    (set_attr "prefix" "evex")
19541    (set_attr "memory" "store")
19542    (set_attr "mode" "<sseinsnmode>")])
19543
19544 (define_insn "compressstore<mode>_mask"
19545   [(set (match_operand:VI12_AVX512VLBW 0 "memory_operand" "=m")
19546         (unspec:VI12_AVX512VLBW
19547           [(match_operand:VI12_AVX512VLBW 1 "register_operand" "x")
19548            (match_dup 0)
19549            (match_operand:<avx512fmaskmode> 2 "register_operand" "Yk")]
19550           UNSPEC_COMPRESS_STORE))]
19551   "TARGET_AVX512VBMI2"
19552   "vpcompress<ssemodesuffix>\t{%1, %0%{%2%}|%0%{%2%}, %1}"
19553   [(set_attr "type" "ssemov")
19554    (set_attr "prefix" "evex")
19555    (set_attr "memory" "store")
19556    (set_attr "mode" "<sseinsnmode>")])
19557
19558 (define_expand "<avx512>_expand<mode>_maskz"
19559   [(set (match_operand:VI48F 0 "register_operand")
19560         (unspec:VI48F
19561           [(match_operand:VI48F 1 "nonimmediate_operand")
19562            (match_operand:VI48F 2 "vector_move_operand")
19563            (match_operand:<avx512fmaskmode> 3 "register_operand")]
19564           UNSPEC_EXPAND))]
19565   "TARGET_AVX512F"
19566   "operands[2] = CONST0_RTX (<MODE>mode);")
19567
19568 (define_insn "<avx512>_expand<mode>_mask"
19569   [(set (match_operand:VI48F 0 "register_operand" "=v,v")
19570         (unspec:VI48F
19571           [(match_operand:VI48F 1 "nonimmediate_operand" "v,m")
19572            (match_operand:VI48F 2 "vector_move_operand" "0C,0C")
19573            (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk,Yk")]
19574           UNSPEC_EXPAND))]
19575   "TARGET_AVX512F"
19576   "v<sseintprefix>expand<ssemodesuffix>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
19577   [(set_attr "type" "ssemov")
19578    (set_attr "prefix" "evex")
19579    (set_attr "memory" "none,load")
19580    (set_attr "mode" "<sseinsnmode>")])
19581
19582 (define_insn "expand<mode>_mask"
19583   [(set (match_operand:VI12_AVX512VLBW 0 "register_operand" "=v,v")
19584         (unspec:VI12_AVX512VLBW
19585           [(match_operand:VI12_AVX512VLBW 1 "nonimmediate_operand" "v,m")
19586            (match_operand:VI12_AVX512VLBW 2 "vector_move_operand" "0C,0C")
19587            (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk,Yk")]
19588           UNSPEC_EXPAND))]
19589   "TARGET_AVX512VBMI2"
19590   "v<sseintprefix>expand<ssemodesuffix>\t{%1, %0%{%3%}%N2|%0%{%3%}%N2, %1}"
19591   [(set_attr "type" "ssemov")
19592    (set_attr "prefix" "evex")
19593    (set_attr "memory" "none,load")
19594    (set_attr "mode" "<sseinsnmode>")])
19595
19596 (define_expand "expand<mode>_maskz"
19597   [(set (match_operand:VI12_AVX512VLBW 0 "register_operand")
19598         (unspec:VI12_AVX512VLBW
19599           [(match_operand:VI12_AVX512VLBW 1 "nonimmediate_operand")
19600            (match_operand:VI12_AVX512VLBW 2 "vector_move_operand")
19601            (match_operand:<avx512fmaskmode> 3 "register_operand")]
19602           UNSPEC_EXPAND))]
19603   "TARGET_AVX512VBMI2"
19604   "operands[2] = CONST0_RTX (<MODE>mode);")
19605
19606 (define_insn "avx512dq_rangep<mode><mask_name><round_saeonly_name>"
19607   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
19608         (unspec:VF_AVX512VL
19609           [(match_operand:VF_AVX512VL 1 "register_operand" "v")
19610            (match_operand:VF_AVX512VL 2 "<round_saeonly_nimm_predicate>" "<round_saeonly_constraint>")
19611            (match_operand:SI 3 "const_0_to_15_operand")]
19612           UNSPEC_RANGE))]
19613   "TARGET_AVX512DQ && <round_saeonly_mode512bit_condition>"
19614   "vrange<ssemodesuffix>\t{%3, <round_saeonly_mask_op4>%2, %1, %0<mask_operand4>|%0<mask_operand4>, %1, %2<round_saeonly_mask_op4>, %3}"
19615   [(set_attr "type" "sse")
19616    (set_attr "prefix" "evex")
19617    (set_attr "mode" "<MODE>")])
19618
19619 (define_insn "avx512dq_ranges<mode><mask_scalar_name><round_saeonly_scalar_name>"
19620   [(set (match_operand:VF_128 0 "register_operand" "=v")
19621         (vec_merge:VF_128
19622           (unspec:VF_128
19623             [(match_operand:VF_128 1 "register_operand" "v")
19624              (match_operand:VF_128 2 "<round_saeonly_scalar_nimm_predicate>" "<round_saeonly_scalar_constraint>")
19625              (match_operand:SI 3 "const_0_to_15_operand")]
19626             UNSPEC_RANGE)
19627           (match_dup 1)
19628           (const_int 1)))]
19629   "TARGET_AVX512DQ"
19630   "vrange<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}"
19631   [(set_attr "type" "sse")
19632    (set_attr "prefix" "evex")
19633    (set_attr "mode" "<MODE>")])
19634
19635 (define_insn "avx512dq_fpclass<mode><mask_scalar_merge_name>"
19636   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
19637           (unspec:<avx512fmaskmode>
19638             [(match_operand:VF_AVX512VL 1 "register_operand" "v")
19639              (match_operand:QI 2 "const_0_to_255_operand" "n")]
19640              UNSPEC_FPCLASS))]
19641    "TARGET_AVX512DQ"
19642    "vfpclass<ssemodesuffix>\t{%2, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %2}";
19643   [(set_attr "type" "sse")
19644    (set_attr "length_immediate" "1")
19645    (set_attr "prefix" "evex")
19646    (set_attr "mode" "<MODE>")])
19647
19648 (define_insn "avx512dq_vmfpclass<mode>"
19649   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
19650         (and:<avx512fmaskmode>
19651           (unspec:<avx512fmaskmode>
19652             [(match_operand:VF_128 1 "register_operand" "v")
19653              (match_operand:QI 2 "const_0_to_255_operand" "n")]
19654             UNSPEC_FPCLASS)
19655           (const_int 1)))]
19656    "TARGET_AVX512DQ"
19657    "vfpclass<ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %2}";
19658   [(set_attr "type" "sse")
19659    (set_attr "length_immediate" "1")
19660    (set_attr "prefix" "evex")
19661    (set_attr "mode" "<MODE>")])
19662
19663 (define_insn "<avx512>_getmant<mode><mask_name><round_saeonly_name>"
19664   [(set (match_operand:VF_AVX512VL 0 "register_operand" "=v")
19665         (unspec:VF_AVX512VL
19666           [(match_operand:VF_AVX512VL 1 "nonimmediate_operand" "<round_saeonly_constraint>")
19667            (match_operand:SI 2 "const_0_to_15_operand")]
19668           UNSPEC_GETMANT))]
19669   "TARGET_AVX512F"
19670   "vgetmant<ssemodesuffix>\t{%2, <round_saeonly_mask_op3>%1, %0<mask_operand3>|%0<mask_operand3>, %1<round_saeonly_mask_op3>, %2}";
19671   [(set_attr "prefix" "evex")
19672    (set_attr "mode" "<MODE>")])
19673
19674 (define_insn "avx512f_vgetmant<mode><mask_scalar_name><round_saeonly_scalar_name>"
19675   [(set (match_operand:VF_128 0 "register_operand" "=v")
19676         (vec_merge:VF_128
19677           (unspec:VF_128
19678             [(match_operand:VF_128 1 "register_operand" "v")
19679              (match_operand:VF_128 2 "<round_saeonly_scalar_nimm_predicate>" "<round_saeonly_scalar_constraint>")
19680              (match_operand:SI 3 "const_0_to_15_operand")]
19681             UNSPEC_GETMANT)
19682           (match_dup 1)
19683           (const_int 1)))]
19684    "TARGET_AVX512F"
19685    "vgetmant<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}";
19686    [(set_attr "prefix" "evex")
19687    (set_attr "mode" "<ssescalarmode>")])
19688
19689 ;; The correct representation for this is absolutely enormous, and
19690 ;; surely not generally useful.
19691 (define_insn "<mask_codefor>avx512bw_dbpsadbw<mode><mask_name>"
19692   [(set (match_operand:VI2_AVX512VL 0 "register_operand" "=v")
19693         (unspec:VI2_AVX512VL
19694           [(match_operand:<dbpsadbwmode> 1 "register_operand" "v")
19695            (match_operand:<dbpsadbwmode> 2 "nonimmediate_operand" "vm")
19696            (match_operand:SI 3 "const_0_to_255_operand")]
19697           UNSPEC_DBPSADBW))]
19698    "TARGET_AVX512BW"
19699   "vdbpsadbw\t{%3, %2, %1, %0<mask_operand4>|%0<mask_operand4>, %1, %2, %3}"
19700   [(set_attr "type" "sselog1")
19701    (set_attr "length_immediate" "1")
19702    (set_attr "prefix" "evex")
19703    (set_attr "mode" "<sseinsnmode>")])
19704
19705 (define_insn "clz<mode>2<mask_name>"
19706   [(set (match_operand:VI48_AVX512VL 0 "register_operand" "=v")
19707         (clz:VI48_AVX512VL
19708           (match_operand:VI48_AVX512VL 1 "nonimmediate_operand" "vm")))]
19709   "TARGET_AVX512CD"
19710   "vplzcnt<ssemodesuffix>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
19711   [(set_attr "type" "sse")
19712    (set_attr "prefix" "evex")
19713    (set_attr "mode" "<sseinsnmode>")])
19714
19715 (define_insn "<mask_codefor>conflict<mode><mask_name>"
19716   [(set (match_operand:VI48_AVX512VL 0 "register_operand" "=v")
19717         (unspec:VI48_AVX512VL
19718           [(match_operand:VI48_AVX512VL 1 "nonimmediate_operand" "vm")]
19719           UNSPEC_CONFLICT))]
19720   "TARGET_AVX512CD"
19721   "vpconflict<ssemodesuffix>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
19722   [(set_attr "type" "sse")
19723    (set_attr "prefix" "evex")
19724    (set_attr "mode" "<sseinsnmode>")])
19725
19726 (define_insn "sha1msg1"
19727   [(set (match_operand:V4SI 0 "register_operand" "=x")
19728         (unspec:V4SI
19729           [(match_operand:V4SI 1 "register_operand" "0")
19730            (match_operand:V4SI 2 "vector_operand" "xBm")]
19731           UNSPEC_SHA1MSG1))]
19732   "TARGET_SHA"
19733   "sha1msg1\t{%2, %0|%0, %2}"
19734   [(set_attr "type" "sselog1")
19735    (set_attr "mode" "TI")])
19736
19737 (define_insn "sha1msg2"
19738   [(set (match_operand:V4SI 0 "register_operand" "=x")
19739         (unspec:V4SI
19740           [(match_operand:V4SI 1 "register_operand" "0")
19741            (match_operand:V4SI 2 "vector_operand" "xBm")]
19742           UNSPEC_SHA1MSG2))]
19743   "TARGET_SHA"
19744   "sha1msg2\t{%2, %0|%0, %2}"
19745   [(set_attr "type" "sselog1")
19746    (set_attr "mode" "TI")])
19747
19748 (define_insn "sha1nexte"
19749   [(set (match_operand:V4SI 0 "register_operand" "=x")
19750         (unspec:V4SI
19751           [(match_operand:V4SI 1 "register_operand" "0")
19752            (match_operand:V4SI 2 "vector_operand" "xBm")]
19753           UNSPEC_SHA1NEXTE))]
19754   "TARGET_SHA"
19755   "sha1nexte\t{%2, %0|%0, %2}"
19756   [(set_attr "type" "sselog1")
19757    (set_attr "mode" "TI")])
19758
19759 (define_insn "sha1rnds4"
19760   [(set (match_operand:V4SI 0 "register_operand" "=x")
19761         (unspec:V4SI
19762           [(match_operand:V4SI 1 "register_operand" "0")
19763            (match_operand:V4SI 2 "vector_operand" "xBm")
19764            (match_operand:SI 3 "const_0_to_3_operand" "n")]
19765           UNSPEC_SHA1RNDS4))]
19766   "TARGET_SHA"
19767   "sha1rnds4\t{%3, %2, %0|%0, %2, %3}"
19768   [(set_attr "type" "sselog1")
19769    (set_attr "length_immediate" "1")
19770    (set_attr "mode" "TI")])
19771
19772 (define_insn "sha256msg1"
19773   [(set (match_operand:V4SI 0 "register_operand" "=x")
19774         (unspec:V4SI
19775           [(match_operand:V4SI 1 "register_operand" "0")
19776            (match_operand:V4SI 2 "vector_operand" "xBm")]
19777           UNSPEC_SHA256MSG1))]
19778   "TARGET_SHA"
19779   "sha256msg1\t{%2, %0|%0, %2}"
19780   [(set_attr "type" "sselog1")
19781    (set_attr "mode" "TI")])
19782
19783 (define_insn "sha256msg2"
19784   [(set (match_operand:V4SI 0 "register_operand" "=x")
19785         (unspec:V4SI
19786           [(match_operand:V4SI 1 "register_operand" "0")
19787            (match_operand:V4SI 2 "vector_operand" "xBm")]
19788           UNSPEC_SHA256MSG2))]
19789   "TARGET_SHA"
19790   "sha256msg2\t{%2, %0|%0, %2}"
19791   [(set_attr "type" "sselog1")
19792    (set_attr "mode" "TI")])
19793
19794 (define_insn "sha256rnds2"
19795   [(set (match_operand:V4SI 0 "register_operand" "=x")
19796         (unspec:V4SI
19797           [(match_operand:V4SI 1 "register_operand" "0")
19798            (match_operand:V4SI 2 "vector_operand" "xBm")
19799            (match_operand:V4SI 3 "register_operand" "Yz")]
19800           UNSPEC_SHA256RNDS2))]
19801   "TARGET_SHA"
19802   "sha256rnds2\t{%3, %2, %0|%0, %2, %3}"
19803   [(set_attr "type" "sselog1")
19804    (set_attr "length_immediate" "1")
19805    (set_attr "mode" "TI")])
19806
19807 (define_insn_and_split "avx512f_<castmode><avxsizesuffix>_<castmode>"
19808   [(set (match_operand:AVX512MODE2P 0 "nonimmediate_operand" "=x,m")
19809         (unspec:AVX512MODE2P
19810           [(match_operand:<ssequartermode> 1 "nonimmediate_operand" "xm,x")]
19811           UNSPEC_CAST))]
19812   "TARGET_AVX512F && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
19813   "#"
19814   "&& reload_completed"
19815   [(set (match_dup 0) (match_dup 1))]
19816 {
19817   if (REG_P (operands[0]))
19818     operands[0] = gen_lowpart (<ssequartermode>mode, operands[0]);
19819   else
19820     operands[1] = lowpart_subreg (<MODE>mode, operands[1],
19821                                   <ssequartermode>mode);
19822 })
19823
19824 (define_insn_and_split "avx512f_<castmode><avxsizesuffix>_256<castmode>"
19825   [(set (match_operand:AVX512MODE2P 0 "nonimmediate_operand" "=x,m")
19826         (unspec:AVX512MODE2P
19827           [(match_operand:<ssehalfvecmode> 1 "nonimmediate_operand" "xm,x")]
19828           UNSPEC_CAST))]
19829   "TARGET_AVX512F && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
19830   "#"
19831   "&& reload_completed"
19832   [(set (match_dup 0) (match_dup 1))]
19833 {
19834   if (REG_P (operands[0]))
19835     operands[0] = gen_lowpart (<ssehalfvecmode>mode, operands[0]);
19836   else
19837     operands[1] = lowpart_subreg (<MODE>mode, operands[1],
19838                                   <ssehalfvecmode>mode);
19839 })
19840
19841 (define_int_iterator VPMADD52
19842         [UNSPEC_VPMADD52LUQ
19843          UNSPEC_VPMADD52HUQ])
19844
19845 (define_int_attr vpmadd52type
19846   [(UNSPEC_VPMADD52LUQ "luq") (UNSPEC_VPMADD52HUQ "huq")])
19847
19848 (define_expand "vpamdd52huq<mode>_maskz"
19849   [(match_operand:VI8_AVX512VL 0 "register_operand")
19850    (match_operand:VI8_AVX512VL 1 "register_operand")
19851    (match_operand:VI8_AVX512VL 2 "register_operand")
19852    (match_operand:VI8_AVX512VL 3 "nonimmediate_operand")
19853    (match_operand:<avx512fmaskmode> 4 "register_operand")]
19854   "TARGET_AVX512IFMA"
19855 {
19856   emit_insn (gen_vpamdd52huq<mode>_maskz_1 (
19857     operands[0], operands[1], operands[2], operands[3],
19858     CONST0_RTX (<MODE>mode), operands[4]));
19859   DONE;
19860 })
19861
19862 (define_expand "vpamdd52luq<mode>_maskz"
19863   [(match_operand:VI8_AVX512VL 0 "register_operand")
19864    (match_operand:VI8_AVX512VL 1 "register_operand")
19865    (match_operand:VI8_AVX512VL 2 "register_operand")
19866    (match_operand:VI8_AVX512VL 3 "nonimmediate_operand")
19867    (match_operand:<avx512fmaskmode> 4 "register_operand")]
19868   "TARGET_AVX512IFMA"
19869 {
19870   emit_insn (gen_vpamdd52luq<mode>_maskz_1 (
19871     operands[0], operands[1], operands[2], operands[3],
19872     CONST0_RTX (<MODE>mode), operands[4]));
19873   DONE;
19874 })
19875
19876 (define_insn "vpamdd52<vpmadd52type><mode><sd_maskz_name>"
19877   [(set (match_operand:VI8_AVX512VL 0 "register_operand" "=v")
19878         (unspec:VI8_AVX512VL
19879           [(match_operand:VI8_AVX512VL 1 "register_operand" "0")
19880            (match_operand:VI8_AVX512VL 2 "register_operand" "v")
19881            (match_operand:VI8_AVX512VL 3 "nonimmediate_operand" "vm")]
19882           VPMADD52))]
19883   "TARGET_AVX512IFMA"
19884   "vpmadd52<vpmadd52type>\t{%3, %2, %0<sd_mask_op4>|%0<sd_mask_op4>, %2, %3}"
19885   [(set_attr "type" "ssemuladd")
19886    (set_attr "prefix" "evex")
19887    (set_attr "mode" "<sseinsnmode>")])
19888
19889 (define_insn "vpamdd52<vpmadd52type><mode>_mask"
19890   [(set (match_operand:VI8_AVX512VL 0 "register_operand" "=v")
19891         (vec_merge:VI8_AVX512VL
19892           (unspec:VI8_AVX512VL
19893             [(match_operand:VI8_AVX512VL 1 "register_operand" "0")
19894              (match_operand:VI8_AVX512VL 2 "register_operand" "v")
19895              (match_operand:VI8_AVX512VL 3 "nonimmediate_operand" "vm")]
19896             VPMADD52)
19897           (match_dup 1)
19898           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
19899   "TARGET_AVX512IFMA"
19900   "vpmadd52<vpmadd52type>\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3}"
19901   [(set_attr "type" "ssemuladd")
19902    (set_attr "prefix" "evex")
19903    (set_attr "mode" "<sseinsnmode>")])
19904
19905 (define_insn "vpmultishiftqb<mode><mask_name>"
19906   [(set (match_operand:VI1_AVX512VL 0 "register_operand" "=v")
19907         (unspec:VI1_AVX512VL
19908           [(match_operand:VI1_AVX512VL 1 "register_operand" "v")
19909            (match_operand:VI1_AVX512VL 2 "nonimmediate_operand" "vm")]
19910           UNSPEC_VPMULTISHIFT))]
19911   "TARGET_AVX512VBMI"
19912   "vpmultishiftqb\t{%2, %1, %0<mask_operand3>|%0<mask_operand3>, %1, %2}"
19913   [(set_attr "type" "sselog")
19914    (set_attr "prefix" "evex")
19915    (set_attr "mode" "<sseinsnmode>")])
19916
19917 (define_mode_iterator IMOD4
19918   [(V64SF "TARGET_AVX5124FMAPS") (V64SI "TARGET_AVX5124VNNIW")])
19919
19920 (define_mode_attr imod4_narrow
19921   [(V64SF "V16SF") (V64SI "V16SI")])
19922
19923 (define_expand "mov<mode>"
19924   [(set (match_operand:IMOD4 0 "nonimmediate_operand")
19925         (match_operand:IMOD4 1 "vector_move_operand"))]
19926   "TARGET_AVX512F"
19927 {
19928   ix86_expand_vector_move (<MODE>mode, operands);
19929   DONE;
19930 })
19931
19932 (define_insn_and_split "*mov<mode>_internal"
19933   [(set (match_operand:IMOD4 0 "nonimmediate_operand" "=v,v ,m")
19934         (match_operand:IMOD4 1 "vector_move_operand"  " C,vm,v"))]
19935   "TARGET_AVX512F
19936    && (register_operand (operands[0], <MODE>mode)
19937        || register_operand (operands[1], <MODE>mode))"
19938   "#"
19939   "&& reload_completed"
19940   [(const_int 0)]
19941 {
19942   rtx op0, op1;
19943   int i;
19944
19945   for (i = 0; i < 4; i++)
19946     {
19947       op0 = simplify_subreg
19948              (<imod4_narrow>mode, operands[0], <MODE>mode, i * 64);
19949       op1 = simplify_subreg
19950              (<imod4_narrow>mode, operands[1], <MODE>mode, i * 64);
19951       emit_move_insn (op0, op1);
19952     }
19953   DONE;
19954 })
19955
19956 (define_insn "avx5124fmaddps_4fmaddps"
19957   [(set (match_operand:V16SF 0 "register_operand" "=v")
19958         (unspec:V16SF
19959           [(match_operand:V16SF 1 "register_operand" "0")
19960            (match_operand:V64SF 2 "register_operand" "Yh")
19961            (match_operand:V4SF 3 "memory_operand" "m")] UNSPEC_VP4FMADD))]
19962   "TARGET_AVX5124FMAPS"
19963   "v4fmaddps\t{%3, %g2, %0|%0, %g2, %3}"
19964    [(set_attr ("type") ("ssemuladd"))
19965     (set_attr ("prefix") ("evex"))
19966     (set_attr ("mode") ("V16SF"))])
19967
19968 (define_insn "avx5124fmaddps_4fmaddps_mask"
19969   [(set (match_operand:V16SF 0 "register_operand" "=v")
19970         (vec_merge:V16SF
19971           (unspec:V16SF
19972              [(match_operand:V64SF 1 "register_operand" "Yh")
19973               (match_operand:V4SF 2 "memory_operand" "m")] UNSPEC_VP4FMADD)
19974           (match_operand:V16SF 3 "register_operand" "0")
19975           (match_operand:HI 4 "register_operand" "Yk")))]
19976   "TARGET_AVX5124FMAPS"
19977   "v4fmaddps\t{%2, %g1, %0%{%4%}|%0%{%4%}, %g1, %2}"
19978    [(set_attr ("type") ("ssemuladd"))
19979     (set_attr ("prefix") ("evex"))
19980     (set_attr ("mode") ("V16SF"))])
19981
19982 (define_insn "avx5124fmaddps_4fmaddps_maskz"
19983   [(set (match_operand:V16SF 0 "register_operand" "=v")
19984         (vec_merge:V16SF
19985           (unspec:V16SF
19986             [(match_operand:V16SF 1 "register_operand" "0")
19987              (match_operand:V64SF 2 "register_operand" "Yh")
19988              (match_operand:V4SF 3 "memory_operand" "m")] UNSPEC_VP4FMADD)
19989           (match_operand:V16SF 4 "const0_operand" "C")
19990           (match_operand:HI 5 "register_operand" "Yk")))]
19991   "TARGET_AVX5124FMAPS"
19992   "v4fmaddps\t{%3, %g2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %g2, %3}"
19993    [(set_attr ("type") ("ssemuladd"))
19994     (set_attr ("prefix") ("evex"))
19995     (set_attr ("mode") ("V16SF"))])
19996
19997 (define_insn "avx5124fmaddps_4fmaddss"
19998   [(set (match_operand:V4SF 0 "register_operand" "=v")
19999         (unspec:V4SF
20000           [(match_operand:V4SF 1 "register_operand" "0")
20001            (match_operand:V64SF 2 "register_operand" "Yh")
20002            (match_operand:V4SF 3 "memory_operand" "m")] UNSPEC_VP4FMADD))]
20003   "TARGET_AVX5124FMAPS"
20004   "v4fmaddss\t{%3, %x2, %0|%0, %x2, %3}"
20005    [(set_attr ("type") ("ssemuladd"))
20006     (set_attr ("prefix") ("evex"))
20007     (set_attr ("mode") ("SF"))])
20008
20009 (define_insn "avx5124fmaddps_4fmaddss_mask"
20010   [(set (match_operand:V4SF 0 "register_operand" "=v")
20011         (vec_merge:V4SF
20012           (unspec:V4SF
20013             [(match_operand:V64SF 1 "register_operand" "Yh")
20014              (match_operand:V4SF 2 "memory_operand" "m")] UNSPEC_VP4FMADD)
20015           (match_operand:V4SF 3 "register_operand" "0")
20016           (match_operand:QI 4 "register_operand" "Yk")))]
20017   "TARGET_AVX5124FMAPS"
20018   "v4fmaddss\t{%2, %x1, %0%{%4%}|%0%{%4%}, %x1, %2}"
20019    [(set_attr ("type") ("ssemuladd"))
20020     (set_attr ("prefix") ("evex"))
20021     (set_attr ("mode") ("SF"))])
20022
20023 (define_insn "avx5124fmaddps_4fmaddss_maskz"
20024   [(set (match_operand:V4SF 0 "register_operand" "=v")
20025         (vec_merge:V4SF
20026           (unspec:V4SF
20027             [(match_operand:V4SF 1 "register_operand" "0")
20028              (match_operand:V64SF 2 "register_operand" "Yh")
20029              (match_operand:V4SF 3 "memory_operand" "m")] UNSPEC_VP4FMADD)
20030           (match_operand:V4SF 4 "const0_operand" "C")
20031           (match_operand:QI 5 "register_operand" "Yk")))]
20032   "TARGET_AVX5124FMAPS"
20033   "v4fmaddss\t{%3, %x2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %x2, %3}"
20034    [(set_attr ("type") ("ssemuladd"))
20035     (set_attr ("prefix") ("evex"))
20036     (set_attr ("mode") ("SF"))])
20037
20038 (define_insn "avx5124fmaddps_4fnmaddps"
20039   [(set (match_operand:V16SF 0 "register_operand" "=v")
20040         (unspec:V16SF
20041           [(match_operand:V16SF 1 "register_operand" "0")
20042            (match_operand:V64SF 2 "register_operand" "Yh")
20043            (match_operand:V4SF 3 "memory_operand" "m")] UNSPEC_VP4FNMADD))]
20044   "TARGET_AVX5124FMAPS"
20045   "v4fnmaddps\t{%3, %g2, %0|%0, %g2, %3}"
20046    [(set_attr ("type") ("ssemuladd"))
20047     (set_attr ("prefix") ("evex"))
20048     (set_attr ("mode") ("V16SF"))])
20049
20050 (define_insn "avx5124fmaddps_4fnmaddps_mask"
20051   [(set (match_operand:V16SF 0 "register_operand" "=v")
20052         (vec_merge:V16SF
20053           (unspec:V16SF
20054              [(match_operand:V64SF 1 "register_operand" "Yh")
20055               (match_operand:V4SF 2 "memory_operand" "m")] UNSPEC_VP4FNMADD)
20056           (match_operand:V16SF 3 "register_operand" "0")
20057           (match_operand:HI 4 "register_operand" "Yk")))]
20058   "TARGET_AVX5124FMAPS"
20059   "v4fnmaddps\t{%2, %g1, %0%{%4%}|%0%{%4%}, %g1, %2}"
20060    [(set_attr ("type") ("ssemuladd"))
20061     (set_attr ("prefix") ("evex"))
20062     (set_attr ("mode") ("V16SF"))])
20063
20064 (define_insn "avx5124fmaddps_4fnmaddps_maskz"
20065   [(set (match_operand:V16SF 0 "register_operand" "=v")
20066         (vec_merge:V16SF
20067           (unspec:V16SF
20068             [(match_operand:V16SF 1 "register_operand" "0")
20069              (match_operand:V64SF 2 "register_operand" "Yh")
20070              (match_operand:V4SF 3 "memory_operand" "m")] UNSPEC_VP4FNMADD)
20071           (match_operand:V16SF 4 "const0_operand" "C")
20072           (match_operand:HI 5 "register_operand" "Yk")))]
20073   "TARGET_AVX5124FMAPS"
20074   "v4fnmaddps\t{%3, %g2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %g2, %3}"
20075    [(set_attr ("type") ("ssemuladd"))
20076     (set_attr ("prefix") ("evex"))
20077     (set_attr ("mode") ("V16SF"))])
20078
20079 (define_insn "avx5124fmaddps_4fnmaddss"
20080   [(set (match_operand:V4SF 0 "register_operand" "=v")
20081         (unspec:V4SF
20082           [(match_operand:V4SF 1 "register_operand" "0")
20083            (match_operand:V64SF 2 "register_operand" "Yh")
20084            (match_operand:V4SF 3 "memory_operand" "m")] UNSPEC_VP4FNMADD))]
20085   "TARGET_AVX5124FMAPS"
20086   "v4fnmaddss\t{%3, %x2, %0|%0, %x2, %3}"
20087    [(set_attr ("type") ("ssemuladd"))
20088     (set_attr ("prefix") ("evex"))
20089     (set_attr ("mode") ("SF"))])
20090
20091 (define_insn "avx5124fmaddps_4fnmaddss_mask"
20092   [(set (match_operand:V4SF 0 "register_operand" "=v")
20093         (vec_merge:V4SF
20094           (unspec:V4SF
20095             [(match_operand:V64SF 1 "register_operand" "Yh")
20096              (match_operand:V4SF 2 "memory_operand" "m")] UNSPEC_VP4FNMADD)
20097           (match_operand:V4SF 3 "register_operand" "0")
20098           (match_operand:QI 4 "register_operand" "Yk")))]
20099   "TARGET_AVX5124FMAPS"
20100   "v4fnmaddss\t{%2, %x1, %0%{%4%}|%0%{%4%}, %x1, %2}"
20101    [(set_attr ("type") ("ssemuladd"))
20102     (set_attr ("prefix") ("evex"))
20103     (set_attr ("mode") ("SF"))])
20104
20105 (define_insn "avx5124fmaddps_4fnmaddss_maskz"
20106   [(set (match_operand:V4SF 0 "register_operand" "=v")
20107         (vec_merge:V4SF
20108           (unspec:V4SF
20109             [(match_operand:V4SF 1 "register_operand" "0")
20110              (match_operand:V64SF 2 "register_operand" "Yh")
20111              (match_operand:V4SF 3 "memory_operand" "m")] UNSPEC_VP4FNMADD)
20112           (match_operand:V4SF 4 "const0_operand" "C")
20113           (match_operand:QI 5 "register_operand" "Yk")))]
20114   "TARGET_AVX5124FMAPS"
20115   "v4fnmaddss\t{%3, %x2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %x2, %3}"
20116    [(set_attr ("type") ("ssemuladd"))
20117     (set_attr ("prefix") ("evex"))
20118     (set_attr ("mode") ("SF"))])
20119
20120 (define_insn "avx5124vnniw_vp4dpwssd"
20121   [(set (match_operand:V16SI 0 "register_operand" "=v")
20122         (unspec:V16SI
20123           [(match_operand:V16SI 1 "register_operand" "0")
20124            (match_operand:V64SI 2 "register_operand" "Yh")
20125            (match_operand:V4SI 3 "memory_operand" "m")] UNSPEC_VP4DPWSSD))]
20126   "TARGET_AVX5124VNNIW"
20127   "vp4dpwssd\t{%3, %g2, %0|%0, %g2, %3}"
20128    [(set_attr ("type") ("ssemuladd"))
20129     (set_attr ("prefix") ("evex"))
20130     (set_attr ("mode") ("TI"))])
20131
20132 (define_insn "avx5124vnniw_vp4dpwssd_mask"
20133   [(set (match_operand:V16SI 0 "register_operand" "=v")
20134         (vec_merge:V16SI
20135           (unspec:V16SI
20136              [(match_operand:V64SI 1 "register_operand" "Yh")
20137               (match_operand:V4SI 2 "memory_operand" "m")] UNSPEC_VP4DPWSSD)
20138           (match_operand:V16SI 3 "register_operand" "0")
20139           (match_operand:HI 4 "register_operand" "Yk")))]
20140   "TARGET_AVX5124VNNIW"
20141   "vp4dpwssd\t{%2, %g1, %0%{%4%}|%0%{%4%}, %g1, %2}"
20142    [(set_attr ("type") ("ssemuladd"))
20143     (set_attr ("prefix") ("evex"))
20144     (set_attr ("mode") ("TI"))])
20145
20146 (define_insn "avx5124vnniw_vp4dpwssd_maskz"
20147   [(set (match_operand:V16SI 0 "register_operand" "=v")
20148         (vec_merge:V16SI
20149           (unspec:V16SI
20150             [(match_operand:V16SI 1 "register_operand" "0")
20151              (match_operand:V64SI 2 "register_operand" "Yh")
20152              (match_operand:V4SI 3 "memory_operand" "m")] UNSPEC_VP4DPWSSD)
20153           (match_operand:V16SI 4 "const0_operand" "C")
20154           (match_operand:HI 5 "register_operand" "Yk")))]
20155   "TARGET_AVX5124VNNIW"
20156   "vp4dpwssd\t{%3, %g2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %g2, %3}"
20157    [(set_attr ("type") ("ssemuladd"))
20158     (set_attr ("prefix") ("evex"))
20159     (set_attr ("mode") ("TI"))])
20160
20161 (define_insn "avx5124vnniw_vp4dpwssds"
20162   [(set (match_operand:V16SI 0 "register_operand" "=v")
20163         (unspec:V16SI
20164           [(match_operand:V16SI 1 "register_operand" "0")
20165            (match_operand:V64SI 2 "register_operand" "Yh")
20166            (match_operand:V4SI 3 "memory_operand" "m")] UNSPEC_VP4DPWSSDS))]
20167   "TARGET_AVX5124VNNIW"
20168   "vp4dpwssds\t{%3, %g2, %0|%0, %g2, %3}"
20169    [(set_attr ("type") ("ssemuladd"))
20170     (set_attr ("prefix") ("evex"))
20171     (set_attr ("mode") ("TI"))])
20172
20173 (define_insn "avx5124vnniw_vp4dpwssds_mask"
20174   [(set (match_operand:V16SI 0 "register_operand" "=v")
20175         (vec_merge:V16SI
20176           (unspec:V16SI
20177              [(match_operand:V64SI 1 "register_operand" "Yh")
20178               (match_operand:V4SI 2 "memory_operand" "m")] UNSPEC_VP4DPWSSDS)
20179           (match_operand:V16SI 3 "register_operand" "0")
20180           (match_operand:HI 4 "register_operand" "Yk")))]
20181   "TARGET_AVX5124VNNIW"
20182   "vp4dpwssds\t{%2, %g1, %0%{%4%}|%0%{%4%}, %g1, %2}"
20183    [(set_attr ("type") ("ssemuladd"))
20184     (set_attr ("prefix") ("evex"))
20185     (set_attr ("mode") ("TI"))])
20186
20187 (define_insn "avx5124vnniw_vp4dpwssds_maskz"
20188   [(set (match_operand:V16SI 0 "register_operand" "=v")
20189         (vec_merge:V16SI
20190           (unspec:V16SI
20191             [(match_operand:V16SI 1 "register_operand" "0")
20192              (match_operand:V64SI 2 "register_operand" "Yh")
20193              (match_operand:V4SI 3 "memory_operand" "m")] UNSPEC_VP4DPWSSDS)
20194           (match_operand:V16SI 4 "const0_operand" "C")
20195           (match_operand:HI 5 "register_operand" "Yk")))]
20196   "TARGET_AVX5124VNNIW"
20197   "vp4dpwssds\t{%3, %g2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %g2, %3}"
20198    [(set_attr ("type") ("ssemuladd"))
20199     (set_attr ("prefix") ("evex"))
20200     (set_attr ("mode") ("TI"))])
20201
20202 (define_insn "vpopcount<mode><mask_name>"
20203   [(set (match_operand:VI48_AVX512VL 0 "register_operand" "=v")
20204         (popcount:VI48_AVX512VL
20205           (match_operand:VI48_AVX512VL 1 "nonimmediate_operand" "vm")))]
20206   "TARGET_AVX512VPOPCNTDQ"
20207   "vpopcnt<ssemodesuffix>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}")
20208
20209 ;; Save multiple registers out-of-line.
20210 (define_insn "save_multiple<mode>"
20211   [(match_parallel 0 "save_multiple"
20212     [(use (match_operand:P 1 "symbol_operand"))])]
20213   "TARGET_SSE && TARGET_64BIT"
20214   "call\t%P1")
20215
20216 ;; Restore multiple registers out-of-line.
20217 (define_insn "restore_multiple<mode>"
20218   [(match_parallel 0 "restore_multiple"
20219     [(use (match_operand:P 1 "symbol_operand"))])]
20220   "TARGET_SSE && TARGET_64BIT"
20221   "call\t%P1")
20222
20223 ;; Restore multiple registers out-of-line and return.
20224 (define_insn "restore_multiple_and_return<mode>"
20225   [(match_parallel 0 "restore_multiple"
20226     [(return)
20227      (use (match_operand:P 1 "symbol_operand"))
20228      (set (reg:DI SP_REG) (reg:DI R10_REG))
20229     ])]
20230   "TARGET_SSE && TARGET_64BIT"
20231   "jmp\t%P1")
20232
20233 ;; Restore multiple registers out-of-line when hard frame pointer is used,
20234 ;; perform the leave operation prior to returning (from the function).
20235 (define_insn "restore_multiple_leave_return<mode>"
20236   [(match_parallel 0 "restore_multiple"
20237     [(return)
20238      (use (match_operand:P 1 "symbol_operand"))
20239      (set (reg:DI SP_REG) (plus:DI (reg:DI BP_REG) (const_int 8)))
20240      (set (reg:DI BP_REG) (mem:DI (reg:DI BP_REG)))
20241      (clobber (mem:BLK (scratch)))
20242     ])]
20243   "TARGET_SSE && TARGET_64BIT"
20244   "jmp\t%P1")
20245
20246 (define_insn "vpopcount<mode><mask_name>"
20247   [(set (match_operand:VI12_AVX512VL 0 "register_operand" "=v")
20248         (popcount:VI12_AVX512VL
20249           (match_operand:VI12_AVX512VL 1 "nonimmediate_operand" "vm")))]
20250   "TARGET_AVX512BITALG"
20251   "vpopcnt<ssemodesuffix>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}")
20252
20253 (define_insn "vgf2p8affineinvqb_<mode><mask_name>"
20254   [(set (match_operand:VI1_AVX512F 0 "register_operand" "=x,x,v")
20255         (unspec:VI1_AVX512F
20256           [(match_operand:VI1_AVX512F 1 "register_operand" "%0,x,v")
20257            (match_operand:VI1_AVX512F 2 "nonimmediate_operand" "xBm,xm,vm")
20258            (match_operand:QI 3 "const_0_to_255_operand" "n,n,n")]
20259           UNSPEC_GF2P8AFFINEINV))]
20260   "TARGET_GFNI"
20261   "@
20262    gf2p8affineinvqb\t{%3, %2, %0| %0, %2, %3}
20263    vgf2p8affineinvqb\t{%3, %2, %1, %0<mask_operand4>| %0<mask_operand4>, %1, %2, %3}
20264    vgf2p8affineinvqb\t{%3, %2, %1, %0<mask_operand4>| %0<mask_operand4>, %1, %2, %3}"
20265   [(set_attr "isa" "noavx,avx,avx512f")
20266    (set_attr "prefix_data16" "1,*,*")
20267    (set_attr "prefix_extra" "1")
20268    (set_attr "prefix" "orig,maybe_evex,evex")
20269    (set_attr "mode" "<sseinsnmode>")])
20270
20271 (define_insn "vgf2p8affineqb_<mode><mask_name>"
20272   [(set (match_operand:VI1_AVX512F 0 "register_operand" "=x,x,v")
20273         (unspec:VI1_AVX512F
20274           [(match_operand:VI1_AVX512F 1 "register_operand" "%0,x,v")
20275            (match_operand:VI1_AVX512F 2 "nonimmediate_operand" "xBm,xm,vm")
20276            (match_operand:QI 3 "const_0_to_255_operand" "n,n,n")]
20277           UNSPEC_GF2P8AFFINE))]
20278   "TARGET_GFNI"
20279   "@
20280    gf2p8affineqb\t{%3, %2, %0| %0, %2, %3}
20281    vgf2p8affineqb\t{%3, %2, %1, %0<mask_operand4>| %0<mask_operand4>, %1, %2, %3}
20282    vgf2p8affineqb\t{%3, %2, %1, %0<mask_operand4>| %0<mask_operand4>, %1, %2, %3}"
20283   [(set_attr "isa" "noavx,avx,avx512f")
20284    (set_attr "prefix_data16" "1,*,*")
20285    (set_attr "prefix_extra" "1")
20286    (set_attr "prefix" "orig,maybe_evex,evex")
20287    (set_attr "mode" "<sseinsnmode>")])
20288
20289 (define_insn "vgf2p8mulb_<mode><mask_name>"
20290   [(set (match_operand:VI1_AVX512F 0 "register_operand" "=x,x,v")
20291         (unspec:VI1_AVX512F
20292           [(match_operand:VI1_AVX512F 1 "register_operand" "%0,x,v")
20293            (match_operand:VI1_AVX512F 2 "nonimmediate_operand" "xBm,xm,vm")]
20294           UNSPEC_GF2P8MUL))]
20295   "TARGET_GFNI"
20296   "@
20297    gf2p8mulb\t{%2, %0| %0, %2}
20298    vgf2p8mulb\t{%2, %1, %0<mask_operand3>| %0<mask_operand3>, %1, %2}
20299    vgf2p8mulb\t{%2, %1, %0<mask_operand3>| %0<mask_operand3>, %1, %2}"
20300   [(set_attr "isa" "noavx,avx,avx512f")
20301    (set_attr "prefix_data16" "1,*,*")
20302    (set_attr "prefix_extra" "1")
20303    (set_attr "prefix" "orig,maybe_evex,evex")
20304    (set_attr "mode" "<sseinsnmode>")])
20305
20306 (define_insn "vpshrd_<mode><mask_name>"
20307   [(set (match_operand:VI248_AVX512VL 0 "register_operand" "=v")
20308         (unspec:VI248_AVX512VL
20309           [(match_operand:VI248_AVX512VL 1 "register_operand" "v")
20310            (match_operand:VI248_AVX512VL 2 "nonimmediate_operand" "vm")
20311            (match_operand:SI 3 "const_0_to_255_operand" "n")]
20312           UNSPEC_VPSHRD))]
20313   "TARGET_AVX512VBMI2"
20314   "vpshrd<ssemodesuffix>\t{%3, %2, %1, %0<mask_operand4>|%0<mask_operand4>, %1, %2, %3 }"
20315    [(set_attr ("prefix") ("evex"))])
20316
20317 (define_insn "vpshld_<mode><mask_name>"
20318   [(set (match_operand:VI248_AVX512VL 0 "register_operand" "=v")
20319         (unspec:VI248_AVX512VL
20320           [(match_operand:VI248_AVX512VL 1 "register_operand" "v")
20321            (match_operand:VI248_AVX512VL 2 "nonimmediate_operand" "vm")
20322            (match_operand:SI 3 "const_0_to_255_operand" "n")]
20323           UNSPEC_VPSHLD))]
20324   "TARGET_AVX512VBMI2"
20325   "vpshld<ssemodesuffix>\t{%3, %2, %1, %0<mask_operand4>|%0<mask_operand4>, %1, %2, %3 }"
20326    [(set_attr ("prefix") ("evex"))])
20327
20328 (define_insn "vpshrdv_<mode>"
20329   [(set (match_operand:VI248_AVX512VL 0 "register_operand" "=v")
20330         (unspec:VI248_AVX512VL
20331           [(match_operand:VI248_AVX512VL 1 "register_operand" "0")
20332            (match_operand:VI248_AVX512VL 2 "register_operand" "v")
20333            (match_operand:VI248_AVX512VL 3 "nonimmediate_operand" "vm")]
20334           UNSPEC_VPSHRDV))]
20335   "TARGET_AVX512VBMI2"
20336   "vpshrdv<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3 }"
20337    [(set_attr ("prefix") ("evex"))
20338    (set_attr "mode" "<sseinsnmode>")])
20339
20340 (define_insn "vpshrdv_<mode>_mask"
20341   [(set (match_operand:VI248_AVX512VL 0 "register_operand" "=v")
20342         (vec_merge:VI248_AVX512VL
20343           (unspec:VI248_AVX512VL
20344             [(match_operand:VI248_AVX512VL 1 "register_operand" "0")
20345              (match_operand:VI248_AVX512VL 2 "register_operand" "v")
20346              (match_operand:VI248_AVX512VL 3 "nonimmediate_operand" "vm")]
20347             UNSPEC_VPSHRDV)
20348           (match_dup 1)
20349           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
20350   "TARGET_AVX512VBMI2"
20351   "vpshrdv<ssemodesuffix>\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3 }"
20352    [(set_attr ("prefix") ("evex"))
20353    (set_attr "mode" "<sseinsnmode>")])
20354
20355 (define_expand "vpshrdv_<mode>_maskz"
20356   [(match_operand:VI248_AVX512VL 0 "register_operand")
20357    (match_operand:VI248_AVX512VL 1 "register_operand")
20358    (match_operand:VI248_AVX512VL 2 "register_operand")
20359    (match_operand:VI248_AVX512VL 3 "nonimmediate_operand")
20360    (match_operand:<avx512fmaskmode> 4 "register_operand")]
20361   "TARGET_AVX512VBMI2"
20362 {
20363   emit_insn (gen_vpshrdv_<mode>_maskz_1 (operands[0], operands[1],
20364                                          operands[2], operands[3],
20365                                          CONST0_RTX (<MODE>mode),
20366                                                      operands[4]));
20367   DONE;
20368 })
20369
20370 (define_insn "vpshrdv_<mode>_maskz_1"
20371   [(set (match_operand:VI248_AVX512VL 0 "register_operand" "=v")
20372         (vec_merge:VI248_AVX512VL
20373           (unspec:VI248_AVX512VL
20374             [(match_operand:VI248_AVX512VL 1 "register_operand" "0")
20375              (match_operand:VI248_AVX512VL 2 "register_operand" "v")
20376              (match_operand:VI248_AVX512VL 3 "nonimmediate_operand" "vm")]
20377             UNSPEC_VPSHRDV)
20378           (match_operand:VI248_AVX512VL 4 "const0_operand" "C")
20379           (match_operand:<avx512fmaskmode> 5 "register_operand" "Yk")))]
20380   "TARGET_AVX512VBMI2"
20381   "vpshrdv<ssemodesuffix>\t{%3, %2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %2, %3 }"
20382    [(set_attr ("prefix") ("evex"))
20383    (set_attr "mode" "<sseinsnmode>")])
20384
20385 (define_insn "vpshldv_<mode>"
20386   [(set (match_operand:VI248_AVX512VL 0 "register_operand" "=v")
20387         (unspec:VI248_AVX512VL
20388           [(match_operand:VI248_AVX512VL 1 "register_operand" "0")
20389            (match_operand:VI248_AVX512VL 2 "register_operand" "v")
20390            (match_operand:VI248_AVX512VL 3 "nonimmediate_operand" "vm")]
20391           UNSPEC_VPSHLDV))]
20392   "TARGET_AVX512VBMI2"
20393   "vpshldv<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3 }"
20394    [(set_attr ("prefix") ("evex"))
20395    (set_attr "mode" "<sseinsnmode>")])
20396
20397 (define_insn "vpshldv_<mode>_mask"
20398   [(set (match_operand:VI248_AVX512VL 0 "register_operand" "=v")
20399         (vec_merge:VI248_AVX512VL
20400           (unspec:VI248_AVX512VL
20401             [(match_operand:VI248_AVX512VL 1 "register_operand" "0")
20402              (match_operand:VI248_AVX512VL 2 "register_operand" "v")
20403              (match_operand:VI248_AVX512VL 3 "nonimmediate_operand" "vm")]
20404             UNSPEC_VPSHLDV)
20405           (match_dup 1)
20406           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
20407   "TARGET_AVX512VBMI2"
20408   "vpshldv<ssemodesuffix>\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3 }"
20409    [(set_attr ("prefix") ("evex"))
20410    (set_attr "mode" "<sseinsnmode>")])
20411
20412 (define_expand "vpshldv_<mode>_maskz"
20413   [(match_operand:VI248_AVX512VL 0 "register_operand")
20414    (match_operand:VI248_AVX512VL 1 "register_operand")
20415    (match_operand:VI248_AVX512VL 2 "register_operand")
20416    (match_operand:VI248_AVX512VL 3 "nonimmediate_operand")
20417    (match_operand:<avx512fmaskmode> 4 "register_operand")]
20418   "TARGET_AVX512VBMI2"
20419 {
20420   emit_insn (gen_vpshldv_<mode>_maskz_1 (operands[0], operands[1],
20421                                          operands[2], operands[3],
20422                                          CONST0_RTX (<MODE>mode),
20423                                                      operands[4]));
20424   DONE;
20425 })
20426
20427 (define_insn "vpshldv_<mode>_maskz_1"
20428   [(set (match_operand:VI248_AVX512VL 0 "register_operand" "=v")
20429         (vec_merge:VI248_AVX512VL
20430           (unspec:VI248_AVX512VL
20431             [(match_operand:VI248_AVX512VL 1 "register_operand" "0")
20432              (match_operand:VI248_AVX512VL 2 "register_operand" "v")
20433              (match_operand:VI248_AVX512VL 3 "nonimmediate_operand" "vm")]
20434             UNSPEC_VPSHLDV)
20435           (match_operand:VI248_AVX512VL 4 "const0_operand" "C")
20436           (match_operand:<avx512fmaskmode> 5 "register_operand" "Yk")))]
20437   "TARGET_AVX512VBMI2"
20438   "vpshldv<ssemodesuffix>\t{%3, %2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %2, %3 }"
20439    [(set_attr ("prefix") ("evex"))
20440    (set_attr "mode" "<sseinsnmode>")])
20441
20442 (define_insn "vpdpbusd_<mode>"
20443   [(set (match_operand:VI4_AVX512VL 0 "register_operand" "=v")
20444         (unspec:VI4_AVX512VL
20445           [(match_operand:VI4_AVX512VL 1 "register_operand" "0")
20446            (match_operand:VI4_AVX512VL 2 "register_operand" "v")
20447            (match_operand:VI4_AVX512VL 3 "nonimmediate_operand" "vm")]
20448           UNSPEC_VPMADDUBSWACCD))]
20449   "TARGET_AVX512VNNI"
20450   "vpdpbusd\t{%3, %2, %0|%0, %2, %3 }"
20451    [(set_attr ("prefix") ("evex"))])
20452
20453 (define_insn "vpdpbusd_<mode>_mask"
20454   [(set (match_operand:VI4_AVX512VL 0 "register_operand" "=v")
20455         (vec_merge:VI4_AVX512VL
20456           (unspec:VI4_AVX512VL
20457             [(match_operand:VI4_AVX512VL 1 "register_operand" "0")
20458              (match_operand:VI4_AVX512VL 2 "register_operand" "v")
20459              (match_operand:VI4_AVX512VL 3 "nonimmediate_operand" "vm")]
20460             UNSPEC_VPMADDUBSWACCD)
20461           (match_dup 1)
20462           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
20463   "TARGET_AVX512VNNI"
20464   "vpdpbusd\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3 }"
20465    [(set_attr ("prefix") ("evex"))])
20466
20467 (define_expand "vpdpbusd_<mode>_maskz"
20468   [(match_operand:VI4_AVX512VL 0 "register_operand")
20469    (match_operand:VI4_AVX512VL 1 "register_operand")
20470    (match_operand:VI4_AVX512VL 2 "register_operand")
20471    (match_operand:VI4_AVX512VL 3 "nonimmediate_operand")
20472    (match_operand:<avx512fmaskmode> 4 "register_operand")]
20473   "TARGET_AVX512VNNI"
20474 {
20475   emit_insn (gen_vpdpbusd_<mode>_maskz_1 (operands[0], operands[1],
20476                                           operands[2], operands[3],
20477                                           CONST0_RTX (<MODE>mode),
20478                                                       operands[4]));
20479   DONE;
20480 })
20481
20482 (define_insn "vpdpbusd_<mode>_maskz_1"
20483   [(set (match_operand:VI4_AVX512VL 0 "register_operand" "=v")
20484         (vec_merge:VI4_AVX512VL
20485           (unspec:VI4_AVX512VL
20486             [(match_operand:VI4_AVX512VL 1 "register_operand" "0")
20487              (match_operand:VI4_AVX512VL 2 "register_operand" "v")
20488              (match_operand:VI4_AVX512VL 3 "nonimmediate_operand" "vm")
20489             ] UNSPEC_VPMADDUBSWACCD)
20490           (match_operand:VI4_AVX512VL 4 "const0_operand" "C")
20491           (match_operand:<avx512fmaskmode> 5 "register_operand" "Yk")))]
20492   "TARGET_AVX512VNNI"
20493   "vpdpbusd\t{%3, %2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %2, %3 }"
20494    [(set_attr ("prefix") ("evex"))])
20495
20496
20497 (define_insn "vpdpbusds_<mode>"
20498   [(set (match_operand:VI4_AVX512VL 0 "register_operand" "=v")
20499         (unspec:VI4_AVX512VL
20500           [(match_operand:VI4_AVX512VL 1 "register_operand" "0")
20501            (match_operand:VI4_AVX512VL 2 "register_operand" "v")
20502            (match_operand:VI4_AVX512VL 3 "nonimmediate_operand" "vm")]
20503           UNSPEC_VPMADDUBSWACCSSD))]
20504   "TARGET_AVX512VNNI"
20505   "vpdpbusds\t{%3, %2, %0|%0, %2, %3 }"
20506    [(set_attr ("prefix") ("evex"))])
20507
20508 (define_insn "vpdpbusds_<mode>_mask"
20509   [(set (match_operand:VI4_AVX512VL 0 "register_operand" "=v")
20510         (vec_merge:VI4_AVX512VL
20511           (unspec:VI4_AVX512VL
20512             [(match_operand:VI4_AVX512VL 1 "register_operand" "0")
20513              (match_operand:VI4_AVX512VL 2 "register_operand" "v")
20514              (match_operand:VI4_AVX512VL 3 "nonimmediate_operand" "vm")]
20515             UNSPEC_VPMADDUBSWACCSSD)
20516           (match_dup 1)
20517           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
20518   "TARGET_AVX512VNNI"
20519   "vpdpbusds\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3 }"
20520    [(set_attr ("prefix") ("evex"))])
20521
20522 (define_expand "vpdpbusds_<mode>_maskz"
20523   [(match_operand:VI4_AVX512VL 0 "register_operand")
20524    (match_operand:VI4_AVX512VL 1 "register_operand")
20525    (match_operand:VI4_AVX512VL 2 "register_operand")
20526    (match_operand:VI4_AVX512VL 3 "nonimmediate_operand")
20527    (match_operand:<avx512fmaskmode> 4 "register_operand")]
20528   "TARGET_AVX512VNNI"
20529 {
20530   emit_insn (gen_vpdpbusds_<mode>_maskz_1 (operands[0], operands[1],
20531                                            operands[2], operands[3],
20532                                            CONST0_RTX (<MODE>mode),
20533                                                        operands[4]));
20534   DONE;
20535 })
20536
20537 (define_insn "vpdpbusds_<mode>_maskz_1"
20538   [(set (match_operand:VI4_AVX512VL 0 "register_operand" "=v")
20539         (vec_merge:VI4_AVX512VL
20540           (unspec:VI4_AVX512VL
20541             [(match_operand:VI4_AVX512VL 1 "register_operand" "0")
20542              (match_operand:VI4_AVX512VL 2 "register_operand" "v")
20543              (match_operand:VI4_AVX512VL 3 "nonimmediate_operand" "vm")]
20544             UNSPEC_VPMADDUBSWACCSSD)
20545           (match_operand:VI4_AVX512VL 4 "const0_operand" "C")
20546           (match_operand:<avx512fmaskmode> 5 "register_operand" "Yk")))]
20547   "TARGET_AVX512VNNI"
20548   "vpdpbusds\t{%3, %2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %2, %3 }"
20549    [(set_attr ("prefix") ("evex"))])
20550
20551
20552 (define_insn "vpdpwssd_<mode>"
20553   [(set (match_operand:VI4_AVX512VL 0 "register_operand" "=v")
20554         (unspec:VI4_AVX512VL
20555           [(match_operand:VI4_AVX512VL 1 "register_operand" "0")
20556            (match_operand:VI4_AVX512VL 2 "register_operand" "v")
20557            (match_operand:VI4_AVX512VL 3 "nonimmediate_operand" "vm")]
20558           UNSPEC_VPMADDWDACCD))]
20559   "TARGET_AVX512VNNI"
20560   "vpdpwssd\t{%3, %2, %0|%0, %2, %3 }"
20561    [(set_attr ("prefix") ("evex"))])
20562
20563 (define_insn "vpdpwssd_<mode>_mask"
20564   [(set (match_operand:VI4_AVX512VL 0 "register_operand" "=v")
20565         (vec_merge:VI4_AVX512VL
20566           (unspec:VI4_AVX512VL
20567             [(match_operand:VI4_AVX512VL 1 "register_operand" "0")
20568              (match_operand:VI4_AVX512VL 2 "register_operand" "v")
20569              (match_operand:VI4_AVX512VL 3 "nonimmediate_operand" "vm")]
20570             UNSPEC_VPMADDWDACCD)
20571           (match_dup 1)
20572           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
20573   "TARGET_AVX512VNNI"
20574   "vpdpwssd\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3 }"
20575    [(set_attr ("prefix") ("evex"))])
20576
20577 (define_expand "vpdpwssd_<mode>_maskz"
20578   [(match_operand:VI4_AVX512VL 0 "register_operand")
20579    (match_operand:VI4_AVX512VL 1 "register_operand")
20580    (match_operand:VI4_AVX512VL 2 "register_operand")
20581    (match_operand:VI4_AVX512VL 3 "nonimmediate_operand")
20582    (match_operand:<avx512fmaskmode> 4 "register_operand")]
20583   "TARGET_AVX512VNNI"
20584 {
20585   emit_insn (gen_vpdpwssd_<mode>_maskz_1 (operands[0], operands[1],
20586                                           operands[2], operands[3],
20587                                           CONST0_RTX (<MODE>mode),
20588                                                       operands[4]));
20589   DONE;
20590 })
20591
20592 (define_insn "vpdpwssd_<mode>_maskz_1"
20593   [(set (match_operand:VI4_AVX512VL 0 "register_operand" "=v")
20594         (vec_merge:VI4_AVX512VL
20595           (unspec:VI4_AVX512VL
20596             [(match_operand:VI4_AVX512VL 1 "register_operand" "0")
20597              (match_operand:VI4_AVX512VL 2 "register_operand" "v")
20598              (match_operand:VI4_AVX512VL 3 "nonimmediate_operand" "vm")]
20599             UNSPEC_VPMADDWDACCD)
20600           (match_operand:VI4_AVX512VL 4 "const0_operand" "C")
20601           (match_operand:<avx512fmaskmode> 5 "register_operand" "Yk")))]
20602   "TARGET_AVX512VNNI"
20603   "vpdpwssd\t{%3, %2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %2, %3 }"
20604    [(set_attr ("prefix") ("evex"))])
20605
20606
20607 (define_insn "vpdpwssds_<mode>"
20608   [(set (match_operand:VI4_AVX512VL 0 "register_operand" "=v")
20609         (unspec:VI4_AVX512VL
20610           [(match_operand:VI4_AVX512VL 1 "register_operand" "0")
20611            (match_operand:VI4_AVX512VL 2 "register_operand" "v")
20612            (match_operand:VI4_AVX512VL 3 "nonimmediate_operand" "vm")]
20613           UNSPEC_VPMADDWDACCSSD))]
20614   "TARGET_AVX512VNNI"
20615   "vpdpwssds\t{%3, %2, %0|%0, %2, %3 }"
20616    [(set_attr ("prefix") ("evex"))])
20617
20618 (define_insn "vpdpwssds_<mode>_mask"
20619   [(set (match_operand:VI4_AVX512VL 0 "register_operand" "=v")
20620         (vec_merge:VI4_AVX512VL
20621           (unspec:VI4_AVX512VL
20622             [(match_operand:VI4_AVX512VL 1 "register_operand" "0")
20623              (match_operand:VI4_AVX512VL 2 "register_operand" "v")
20624              (match_operand:VI4_AVX512VL 3 "nonimmediate_operand" "vm")]
20625             UNSPEC_VPMADDWDACCSSD)
20626           (match_dup 1)
20627           (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
20628   "TARGET_AVX512VNNI"
20629   "vpdpwssds\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3 }"
20630    [(set_attr ("prefix") ("evex"))])
20631
20632 (define_expand "vpdpwssds_<mode>_maskz"
20633   [(match_operand:VI4_AVX512VL 0 "register_operand")
20634    (match_operand:VI4_AVX512VL 1 "register_operand")
20635    (match_operand:VI4_AVX512VL 2 "register_operand")
20636    (match_operand:VI4_AVX512VL 3 "nonimmediate_operand")
20637    (match_operand:<avx512fmaskmode> 4 "register_operand")]
20638   "TARGET_AVX512VNNI"
20639 {
20640   emit_insn (gen_vpdpwssds_<mode>_maskz_1 (operands[0], operands[1],
20641                                            operands[2], operands[3],
20642                                            CONST0_RTX (<MODE>mode),
20643                                                        operands[4]));
20644   DONE;
20645 })
20646
20647 (define_insn "vpdpwssds_<mode>_maskz_1"
20648   [(set (match_operand:VI4_AVX512VL 0 "register_operand" "=v")
20649         (vec_merge:VI4_AVX512VL
20650           (unspec:VI4_AVX512VL
20651             [(match_operand:VI4_AVX512VL 1 "register_operand" "0")
20652              (match_operand:VI4_AVX512VL 2 "register_operand" "v")
20653              (match_operand:VI4_AVX512VL 3 "nonimmediate_operand" "vm")]
20654             UNSPEC_VPMADDWDACCSSD)
20655           (match_operand:VI4_AVX512VL 4 "const0_operand" "C")
20656           (match_operand:<avx512fmaskmode> 5 "register_operand" "Yk")))]
20657   "TARGET_AVX512VNNI"
20658   "vpdpwssds\t{%3, %2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %2, %3 }"
20659    [(set_attr ("prefix") ("evex"))])
20660
20661 (define_insn "vaesdec_<mode>"
20662   [(set (match_operand:VI1_AVX512VL_F 0 "register_operand" "=v")
20663         (unspec:VI1_AVX512VL_F
20664           [(match_operand:VI1_AVX512VL_F 1 "register_operand" "v")
20665            (match_operand:VI1_AVX512VL_F 2 "vector_operand" "v")]
20666           UNSPEC_VAESDEC))]
20667   "TARGET_VAES"
20668   "vaesdec\t{%2, %1, %0|%0, %1, %2}"
20669 )
20670
20671 (define_insn "vaesdeclast_<mode>"
20672   [(set (match_operand:VI1_AVX512VL_F 0 "register_operand" "=v")
20673         (unspec:VI1_AVX512VL_F
20674           [(match_operand:VI1_AVX512VL_F 1 "register_operand" "v")
20675            (match_operand:VI1_AVX512VL_F 2 "vector_operand" "v")]
20676           UNSPEC_VAESDECLAST))]
20677   "TARGET_VAES"
20678   "vaesdeclast\t{%2, %1, %0|%0, %1, %2}"
20679 )
20680
20681 (define_insn "vaesenc_<mode>"
20682   [(set (match_operand:VI1_AVX512VL_F 0 "register_operand" "=v")
20683         (unspec:VI1_AVX512VL_F
20684           [(match_operand:VI1_AVX512VL_F 1 "register_operand" "v")
20685            (match_operand:VI1_AVX512VL_F 2 "vector_operand" "vm")]
20686           UNSPEC_VAESENC))]
20687   "TARGET_VAES"
20688   "vaesenc\t{%2, %1, %0|%0, %1, %2}"
20689 )
20690
20691 (define_insn "vaesenclast_<mode>"
20692   [(set (match_operand:VI1_AVX512VL_F 0 "register_operand" "=v")
20693         (unspec:VI1_AVX512VL_F
20694           [(match_operand:VI1_AVX512VL_F 1 "register_operand" "v")
20695            (match_operand:VI1_AVX512VL_F 2 "vector_operand" "vm")]
20696           UNSPEC_VAESENCLAST))]
20697   "TARGET_VAES"
20698   "vaesenclast\t{%2, %1, %0|%0, %1, %2}"
20699 )
20700
20701 (define_insn "vpclmulqdq_<mode>"
20702   [(set (match_operand:VI8_FVL 0 "register_operand" "=v")
20703         (unspec:VI8_FVL [(match_operand:VI8_FVL 1 "register_operand" "v")
20704                          (match_operand:VI8_FVL 2 "vector_operand" "vm")
20705                          (match_operand:SI 3 "const_0_to_255_operand" "n")]
20706                         UNSPEC_VPCLMULQDQ))]
20707   "TARGET_VPCLMULQDQ"
20708   "vpclmulqdq\t{%3, %2, %1, %0|%0, %1, %2, %3}"
20709   [(set_attr "mode" "DI")])
20710
20711 (define_insn "avx512vl_vpshufbitqmb<mode><mask_scalar_merge_name>"
20712   [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
20713         (unspec:<avx512fmaskmode>
20714           [(match_operand:VI1_AVX512VLBW 1 "register_operand" "v")
20715            (match_operand:VI1_AVX512VLBW 2 "nonimmediate_operand" "vm")]
20716           UNSPEC_VPSHUFBIT))]
20717   "TARGET_AVX512BITALG"
20718   "vpshufbitqmb\t{%2, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %2}"
20719   [(set_attr "prefix" "evex")
20720    (set_attr "mode" "<sseinsnmode>")])