Merged with trunk at revision 155767
[official-gcc.git] / gcc / config / i386 / sse.md
blob54befb4b1398f2680e7ab138e520f00ef8e732aa
1 ;; GCC machine description for SSE instructions
2 ;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
3 ;; Free Software Foundation, Inc.
4 ;;
5 ;; This file is part of GCC.
6 ;;
7 ;; GCC is free software; you can redistribute it and/or modify
8 ;; it under the terms of the GNU General Public License as published by
9 ;; the Free Software Foundation; either version 3, or (at your option)
10 ;; any later version.
12 ;; GCC is distributed in the hope that it will be useful,
13 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 ;; GNU General Public License for more details.
17 ;; You should have received a copy of the GNU General Public License
18 ;; along with GCC; see the file COPYING3.  If not see
19 ;; <http://www.gnu.org/licenses/>.
22 ;; 16 byte integral modes handled by SSE
23 (define_mode_iterator SSEMODEI [V16QI V8HI V4SI V2DI])
25 ;; All 16-byte vector modes handled by SSE
26 (define_mode_iterator SSEMODE [V16QI V8HI V4SI V2DI V4SF V2DF])
27 (define_mode_iterator SSEMODE16 [V16QI V8HI V4SI V2DI V1TI V4SF V2DF])
29 ;; 32 byte integral vector modes handled by AVX
30 (define_mode_iterator AVX256MODEI [V32QI V16HI V8SI V4DI])
32 ;; All 32-byte vector modes handled by AVX
33 (define_mode_iterator AVX256MODE [V32QI V16HI V8SI V4DI V8SF V4DF])
35 ;; All QI vector modes handled by AVX
36 (define_mode_iterator AVXMODEQI [V32QI V16QI])
38 ;; All DI vector modes handled by AVX
39 (define_mode_iterator AVXMODEDI [V4DI V2DI])
41 ;; All vector modes handled by AVX
42 (define_mode_iterator AVXMODE
43   [V16QI V8HI V4SI V2DI V4SF V2DF V32QI V16HI V8SI V4DI V8SF V4DF])
44 (define_mode_iterator AVXMODE16
45   [V16QI V8HI V4SI V2DI V1TI V4SF V2DF V32QI V16HI V8SI V4DI V8SF V4DF])
47 ;; Mix-n-match
48 (define_mode_iterator SSEMODE12 [V16QI V8HI])
49 (define_mode_iterator SSEMODE24 [V8HI V4SI])
50 (define_mode_iterator SSEMODE14 [V16QI V4SI])
51 (define_mode_iterator SSEMODE124 [V16QI V8HI V4SI])
52 (define_mode_iterator SSEMODE248 [V8HI V4SI V2DI])
53 (define_mode_iterator SSEMODE1248 [V16QI V8HI V4SI V2DI])
54 (define_mode_iterator SSEMODEF4 [SF DF V4SF V2DF])
55 (define_mode_iterator FMA4MODEF4 [V8SF V4DF])
56 (define_mode_iterator SSEMODEF2P [V4SF V2DF])
58 (define_mode_iterator AVX256MODEF2P [V8SF V4DF])
59 (define_mode_iterator AVX256MODE2P [V8SI V8SF V4DF])
60 (define_mode_iterator AVX256MODE24P [V8SI V8SF V4DI V4DF])
61 (define_mode_iterator AVX256MODE4P [V4DI V4DF])
62 (define_mode_iterator AVX256MODE8P [V8SI V8SF])
63 (define_mode_iterator AVXMODEF2P [V4SF V2DF V8SF V4DF])
64 (define_mode_iterator AVXMODEF4P [V4SF V4DF])
65 (define_mode_iterator AVXMODEFDP [V2DF V4DF])
66 (define_mode_iterator AVXMODEFSP [V4SF V8SF])
67 (define_mode_iterator AVXMODEDCVTDQ2PS [V4SF V8SF])
68 (define_mode_iterator AVXMODEDCVTPS2DQ [V4SI V8SI])
70 ;; Int-float size matches
71 (define_mode_iterator SSEMODE4S [V4SF V4SI])
72 (define_mode_iterator SSEMODE2D [V2DF V2DI])
74 ;; Modes handled by integer vcond pattern
75 (define_mode_iterator SSEMODE124C8 [V16QI V8HI V4SI
76                                     (V2DI "TARGET_SSE4_2")])
78 ;; Modes handled by vec_extract_even/odd pattern.
79 (define_mode_iterator SSEMODE_EO
80   [(V4SF "TARGET_SSE")
81    (V2DF "TARGET_SSE2")
82    (V2DI "TARGET_SSE2") (V4SI "TARGET_SSE2")
83    (V8HI "TARGET_SSE2") (V16QI "TARGET_SSE2")
84    (V4DF "TARGET_AVX") (V8SF "TARGET_AVX")])
86 ;; Mapping from float mode to required SSE level
87 (define_mode_attr sse [(SF "sse") (DF "sse2") (V4SF "sse") (V2DF "sse2")])
89 ;; Mapping from integer vector mode to mnemonic suffix
90 (define_mode_attr ssevecsize [(V16QI "b") (V8HI "w") (V4SI "d") (V2DI "q")])
92 ;; Mapping of the fma4 suffix
93 (define_mode_attr fma4modesuffixf4 [(V8SF "ps") (V4DF "pd")])
94 (define_mode_attr ssemodesuffixf2s [(SF "ss") (DF "sd")
95                                     (V4SF "ss") (V2DF "sd")])
97 ;; Mapping of the avx suffix
98 (define_mode_attr ssemodesuffixf4 [(SF "ss") (DF "sd")
99                                    (V4SF "ps") (V2DF "pd")])
101 (define_mode_attr ssemodesuffixf2c [(V4SF "s") (V2DF "d")])
103 (define_mode_attr ssescalarmodesuffix2s [(V4SF "ss") (V4SI "d")])
105 ;; Mapping of the max integer size for xop rotate immediate constraint
106 (define_mode_attr sserotatemax [(V16QI "7") (V8HI "15") (V4SI "31") (V2DI "63")])
108 ;; Mapping of vector modes back to the scalar modes
109 (define_mode_attr ssescalarmode [(V4SF "SF") (V2DF "DF")
110                                  (V16QI "QI") (V8HI "HI")
111                                  (V4SI "SI") (V2DI "DI")])
113 ;; Mapping of vector modes to a vector mode of double size
114 (define_mode_attr ssedoublesizemode
115   [(V2DF "V4DF") (V2DI "V4DI") (V4SF "V8SF") (V4SI "V8SI")
116    (V8HI "V16HI") (V16QI "V32QI")
117    (V4DF "V8DF") (V8SF "V16SF")
118    (V4DI "V8DI") (V8SI "V16SI") (V16HI "V32HI") (V32QI "V64QI")])
120 ;; Number of scalar elements in each vector type
121 (define_mode_attr ssescalarnum
122   [(V4SF "4") (V2DF "2") (V16QI "16") (V8HI "8") (V4SI "4") (V2DI "2")
123    (V8SF "8") (V4DF "4") (V32QI "32") (V16HI "16") (V8SI "8") (V4DI "4")])
125 ;; Mapping for AVX
126 (define_mode_attr avxvecmode
127   [(V16QI "TI") (V8HI "TI") (V4SI "TI") (V2DI "TI") (V1TI "TI")
128    (V4SF "V4SF") (V8SF "V8SF") (V2DF "V2DF") (V4DF "V4DF")
129    (V32QI "OI") (V16HI "OI") (V8SI "OI") (V4DI "OI")])
130 (define_mode_attr avxvecpsmode
131   [(V16QI "V4SF") (V8HI "V4SF") (V4SI "V4SF") (V2DI "V4SF")
132    (V32QI "V8SF") (V16HI "V8SF") (V8SI "V8SF") (V4DI "V8SF")])
133 (define_mode_attr avxhalfvecmode
134   [(V32QI "V16QI") (V16HI "V8HI") (V8SI "V4SI") (V4DI "V2DI")
135    (V8SF "V4SF") (V4DF "V2DF")
136    (V16QI  "V8QI") (V8HI  "V4HI") (V4SI "V2SI") (V4SF "V2SF")])
137 (define_mode_attr avxscalarmode
138   [(V16QI "QI") (V8HI  "HI") (V4SI "SI") (V2DI "DI") (V4SF "SF") (V2DF "DF")
139    (V32QI "QI") (V16HI "HI") (V8SI "SI") (V4DI "DI") (V8SF "SF") (V4DF "DF")])
140 (define_mode_attr avxcvtvecmode
141   [(V4SF "V4SI") (V8SF "V8SI") (V4SI "V4SF") (V8SI "V8SF")])
142 (define_mode_attr avxpermvecmode
143   [(V2DF "V2DI") (V4SF "V4SI") (V4DF "V4DI") (V8SF "V8SI")])
144 (define_mode_attr avxmodesuffixf2c
145   [(V4SF "s") (V2DF "d") (V8SI "s") (V8SF "s") (V4DI "d") (V4DF "d")])
146 (define_mode_attr avxmodesuffixp
147  [(V2DF "pd") (V4SI "si") (V4SF "ps") (V8SF "ps") (V8SI "si")
148   (V4DF "pd")])
149 (define_mode_attr avxmodesuffix
150   [(V16QI "") (V32QI "256") (V4SI "") (V4SF "") (V2DF "")
151    (V8SI "256") (V8SF "256") (V4DF "256")])
153 ;; Mapping of immediate bits for blend instructions
154 (define_mode_attr blendbits
155   [(V8SF "255") (V4SF "15") (V4DF "15") (V2DF "3")])
157 ;; Mapping of immediate bits for pinsr instructions
158 (define_mode_attr pinsrbits [(V16QI "32768") (V8HI "128") (V4SI "8")])
160 ;; Patterns whose name begins with "sse{,2,3}_" are invoked by intrinsics.
162 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
164 ;; Move patterns
166 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
168 (define_expand "mov<mode>"
169   [(set (match_operand:AVX256MODE 0 "nonimmediate_operand" "")
170         (match_operand:AVX256MODE 1 "nonimmediate_operand" ""))]
171   "TARGET_AVX"
173   ix86_expand_vector_move (<MODE>mode, operands);
174   DONE;
177 (define_insn "*avx_mov<mode>_internal"
178   [(set (match_operand:AVXMODE16 0 "nonimmediate_operand" "=x,x ,m")
179         (match_operand:AVXMODE16 1 "nonimmediate_or_sse_const_operand"  "C ,xm,x"))]
180   "TARGET_AVX
181    && (register_operand (operands[0], <MODE>mode)
182        || register_operand (operands[1], <MODE>mode))"
184   switch (which_alternative)
185     {
186     case 0:
187       return standard_sse_constant_opcode (insn, operands[1]);
188     case 1:
189     case 2:
190       switch (get_attr_mode (insn))
191         {
192         case MODE_V8SF:
193         case MODE_V4SF:
194           return "vmovaps\t{%1, %0|%0, %1}";
195         case MODE_V4DF:
196         case MODE_V2DF:
197           return "vmovapd\t{%1, %0|%0, %1}";
198         default:
199           return "vmovdqa\t{%1, %0|%0, %1}";
200         }
201     default:
202       gcc_unreachable ();
203     }
205   [(set_attr "type" "sselog1,ssemov,ssemov")
206    (set_attr "prefix" "vex")
207    (set_attr "mode" "<avxvecmode>")])
209 ;; All of these patterns are enabled for SSE1 as well as SSE2.
210 ;; This is essential for maintaining stable calling conventions.
212 (define_expand "mov<mode>"
213   [(set (match_operand:SSEMODE16 0 "nonimmediate_operand" "")
214         (match_operand:SSEMODE16 1 "nonimmediate_operand" ""))]
215   "TARGET_SSE"
217   ix86_expand_vector_move (<MODE>mode, operands);
218   DONE;
221 (define_insn "*mov<mode>_internal"
222   [(set (match_operand:SSEMODE16 0 "nonimmediate_operand" "=x,x ,m")
223         (match_operand:SSEMODE16 1 "nonimmediate_or_sse_const_operand"  "C ,xm,x"))]
224   "TARGET_SSE
225    && (register_operand (operands[0], <MODE>mode)
226        || register_operand (operands[1], <MODE>mode))"
228   switch (which_alternative)
229     {
230     case 0:
231       return standard_sse_constant_opcode (insn, operands[1]);
232     case 1:
233     case 2:
234       switch (get_attr_mode (insn))
235         {
236         case MODE_V4SF:
237           return "movaps\t{%1, %0|%0, %1}";
238         case MODE_V2DF:
239           return "movapd\t{%1, %0|%0, %1}";
240         default:
241           return "movdqa\t{%1, %0|%0, %1}";
242         }
243     default:
244       gcc_unreachable ();
245     }
247   [(set_attr "type" "sselog1,ssemov,ssemov")
248    (set (attr "mode")
249         (cond [(ior (ior (ne (symbol_ref "optimize_function_for_size_p (cfun)") (const_int 0))
250                          (eq (symbol_ref "TARGET_SSE2") (const_int 0)))
251                     (and (eq_attr "alternative" "2")
252                          (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
253                              (const_int 0))))
254                  (const_string "V4SF")
255                (eq (const_string "<MODE>mode") (const_string "V4SFmode"))
256                  (const_string "V4SF")
257                (eq (const_string "<MODE>mode") (const_string "V2DFmode"))
258                  (const_string "V2DF")
259               ]
260           (const_string "TI")))])
262 ;; Move a DI from a 32-bit register pair (e.g. %edx:%eax) to an xmm.
263 ;; We'd rather avoid this entirely; if the 32-bit reg pair was loaded
264 ;; from memory, we'd prefer to load the memory directly into the %xmm
265 ;; register.  To facilitate this happy circumstance, this pattern won't
266 ;; split until after register allocation.  If the 64-bit value didn't
267 ;; come from memory, this is the best we can do.  This is much better
268 ;; than storing %edx:%eax into a stack temporary and loading an %xmm
269 ;; from there.
271 (define_insn_and_split "movdi_to_sse"
272   [(parallel
273     [(set (match_operand:V4SI 0 "register_operand" "=?x,x")
274           (subreg:V4SI (match_operand:DI 1 "nonimmediate_operand" "r,m") 0))
275      (clobber (match_scratch:V4SI 2 "=&x,X"))])]
276   "!TARGET_64BIT && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES"
277   "#"
278   "&& reload_completed"
279   [(const_int 0)]
281  if (register_operand (operands[1], DImode))
282    {
283       /* The DImode arrived in a pair of integral registers (e.g. %edx:%eax).
284          Assemble the 64-bit DImode value in an xmm register.  */
285       emit_insn (gen_sse2_loadld (operands[0], CONST0_RTX (V4SImode),
286                                   gen_rtx_SUBREG (SImode, operands[1], 0)));
287       emit_insn (gen_sse2_loadld (operands[2], CONST0_RTX (V4SImode),
288                                   gen_rtx_SUBREG (SImode, operands[1], 4)));
289       emit_insn (gen_vec_interleave_lowv4si (operands[0], operands[0],
290                                              operands[2]));
291     }
292  else if (memory_operand (operands[1], DImode))
293    emit_insn (gen_vec_concatv2di (gen_lowpart (V2DImode, operands[0]),
294                                   operands[1], const0_rtx));
295  else
296    gcc_unreachable ();
299 (define_split
300   [(set (match_operand:V4SF 0 "register_operand" "")
301         (match_operand:V4SF 1 "zero_extended_scalar_load_operand" ""))]
302   "TARGET_SSE && reload_completed"
303   [(set (match_dup 0)
304         (vec_merge:V4SF
305           (vec_duplicate:V4SF (match_dup 1))
306           (match_dup 2)
307           (const_int 1)))]
309   operands[1] = simplify_gen_subreg (SFmode, operands[1], V4SFmode, 0);
310   operands[2] = CONST0_RTX (V4SFmode);
313 (define_split
314   [(set (match_operand:V2DF 0 "register_operand" "")
315         (match_operand:V2DF 1 "zero_extended_scalar_load_operand" ""))]
316   "TARGET_SSE2 && reload_completed"
317   [(set (match_dup 0) (vec_concat:V2DF (match_dup 1) (match_dup 2)))]
319   operands[1] = simplify_gen_subreg (DFmode, operands[1], V2DFmode, 0);
320   operands[2] = CONST0_RTX (DFmode);
323 (define_expand "push<mode>1"
324   [(match_operand:AVX256MODE 0 "register_operand" "")]
325   "TARGET_AVX"
327   ix86_expand_push (<MODE>mode, operands[0]);
328   DONE;
331 (define_expand "push<mode>1"
332   [(match_operand:SSEMODE16 0 "register_operand" "")]
333   "TARGET_SSE"
335   ix86_expand_push (<MODE>mode, operands[0]);
336   DONE;
339 (define_expand "movmisalign<mode>"
340   [(set (match_operand:AVX256MODE 0 "nonimmediate_operand" "")
341         (match_operand:AVX256MODE 1 "nonimmediate_operand" ""))]
342   "TARGET_AVX"
344   ix86_expand_vector_move_misalign (<MODE>mode, operands);
345   DONE;
348 (define_expand "movmisalign<mode>"
349   [(set (match_operand:SSEMODE16 0 "nonimmediate_operand" "")
350         (match_operand:SSEMODE16 1 "nonimmediate_operand" ""))]
351   "TARGET_SSE"
353   ix86_expand_vector_move_misalign (<MODE>mode, operands);
354   DONE;
357 (define_insn "avx_movup<avxmodesuffixf2c><avxmodesuffix>"
358   [(set (match_operand:AVXMODEF2P 0 "nonimmediate_operand" "=x,m")
359         (unspec:AVXMODEF2P
360           [(match_operand:AVXMODEF2P 1 "nonimmediate_operand" "xm,x")]
361           UNSPEC_MOVU))]
362   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)
363    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
364   "vmovup<avxmodesuffixf2c>\t{%1, %0|%0, %1}"
365   [(set_attr "type" "ssemov")
366    (set_attr "movu" "1")
367    (set_attr "prefix" "vex")
368    (set_attr "mode" "<MODE>")])
370 (define_insn "sse2_movq128"
371   [(set (match_operand:V2DI 0 "register_operand" "=x")
372         (vec_concat:V2DI
373           (vec_select:DI
374             (match_operand:V2DI 1 "nonimmediate_operand" "xm")
375             (parallel [(const_int 0)]))
376           (const_int 0)))]
377   "TARGET_SSE2"
378   "%vmovq\t{%1, %0|%0, %1}"
379   [(set_attr "type" "ssemov")
380    (set_attr "prefix" "maybe_vex")
381    (set_attr "mode" "TI")])
383 (define_insn "<sse>_movup<ssemodesuffixf2c>"
384   [(set (match_operand:SSEMODEF2P 0 "nonimmediate_operand" "=x,m")
385         (unspec:SSEMODEF2P
386           [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "xm,x")]
387           UNSPEC_MOVU))]
388   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)
389    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
390   "movup<ssemodesuffixf2c>\t{%1, %0|%0, %1}"
391   [(set_attr "type" "ssemov")
392    (set_attr "movu" "1")
393    (set_attr "mode" "<MODE>")])
395 (define_insn "avx_movdqu<avxmodesuffix>"
396   [(set (match_operand:AVXMODEQI 0 "nonimmediate_operand" "=x,m")
397         (unspec:AVXMODEQI
398           [(match_operand:AVXMODEQI 1 "nonimmediate_operand" "xm,x")]
399           UNSPEC_MOVU))]
400   "TARGET_AVX && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
401   "vmovdqu\t{%1, %0|%0, %1}"
402   [(set_attr "type" "ssemov")
403    (set_attr "movu" "1")
404    (set_attr "prefix" "vex")
405    (set_attr "mode" "<avxvecmode>")])
407 (define_insn "sse2_movdqu"
408   [(set (match_operand:V16QI 0 "nonimmediate_operand" "=x,m")
409         (unspec:V16QI [(match_operand:V16QI 1 "nonimmediate_operand" "xm,x")]
410                       UNSPEC_MOVU))]
411   "TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
412   "movdqu\t{%1, %0|%0, %1}"
413   [(set_attr "type" "ssemov")
414    (set_attr "movu" "1")
415    (set_attr "prefix_data16" "1")
416    (set_attr "mode" "TI")])
418 (define_insn "avx_movnt<mode>"
419   [(set (match_operand:AVXMODEF2P 0 "memory_operand" "=m")
420         (unspec:AVXMODEF2P
421           [(match_operand:AVXMODEF2P 1 "register_operand" "x")]
422           UNSPEC_MOVNT))]
423   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
424   "vmovntp<avxmodesuffixf2c>\t{%1, %0|%0, %1}"
425   [(set_attr "type" "ssemov")
426    (set_attr "prefix" "vex")
427    (set_attr "mode" "<MODE>")])
429 (define_insn "<sse>_movnt<mode>"
430   [(set (match_operand:SSEMODEF2P 0 "memory_operand" "=m")
431         (unspec:SSEMODEF2P
432           [(match_operand:SSEMODEF2P 1 "register_operand" "x")]
433           UNSPEC_MOVNT))]
434   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
435   "movntp<ssemodesuffixf2c>\t{%1, %0|%0, %1}"
436   [(set_attr "type" "ssemov")
437    (set_attr "mode" "<MODE>")])
439 (define_insn "avx_movnt<mode>"
440   [(set (match_operand:AVXMODEDI 0 "memory_operand" "=m")
441         (unspec:AVXMODEDI
442           [(match_operand:AVXMODEDI 1 "register_operand" "x")]
443           UNSPEC_MOVNT))]
444   "TARGET_AVX"
445   "vmovntdq\t{%1, %0|%0, %1}"
446   [(set_attr "type" "ssecvt")
447    (set_attr "prefix" "vex")
448    (set_attr "mode" "<avxvecmode>")])
450 (define_insn "sse2_movntv2di"
451   [(set (match_operand:V2DI 0 "memory_operand" "=m")
452         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "x")]
453                      UNSPEC_MOVNT))]
454   "TARGET_SSE2"
455   "movntdq\t{%1, %0|%0, %1}"
456   [(set_attr "type" "ssemov")
457    (set_attr "prefix_data16" "1")
458    (set_attr "mode" "TI")])
460 (define_insn "sse2_movntsi"
461   [(set (match_operand:SI 0 "memory_operand" "=m")
462         (unspec:SI [(match_operand:SI 1 "register_operand" "r")]
463                    UNSPEC_MOVNT))]
464   "TARGET_SSE2"
465   "movnti\t{%1, %0|%0, %1}"
466   [(set_attr "type" "ssemov")
467    (set_attr "prefix_data16" "0")
468    (set_attr "mode" "V2DF")])
470 (define_insn "avx_lddqu<avxmodesuffix>"
471   [(set (match_operand:AVXMODEQI 0 "register_operand" "=x")
472         (unspec:AVXMODEQI
473           [(match_operand:AVXMODEQI 1 "memory_operand" "m")]
474           UNSPEC_LDDQU))]
475   "TARGET_AVX"
476   "vlddqu\t{%1, %0|%0, %1}"
477   [(set_attr "type" "ssecvt")
478    (set_attr "movu" "1")
479    (set_attr "prefix" "vex")
480    (set_attr "mode" "<avxvecmode>")])
482 (define_insn "sse3_lddqu"
483   [(set (match_operand:V16QI 0 "register_operand" "=x")
484         (unspec:V16QI [(match_operand:V16QI 1 "memory_operand" "m")]
485                       UNSPEC_LDDQU))]
486   "TARGET_SSE3"
487   "lddqu\t{%1, %0|%0, %1}"
488   [(set_attr "type" "ssemov")
489    (set_attr "movu" "1")
490    (set_attr "prefix_data16" "0")
491    (set_attr "prefix_rep" "1")
492    (set_attr "mode" "TI")])
494 ; Expand patterns for non-temporal stores.  At the moment, only those
495 ; that directly map to insns are defined; it would be possible to
496 ; define patterns for other modes that would expand to several insns.
498 (define_expand "storent<mode>"
499   [(set (match_operand:SSEMODEF2P 0 "memory_operand" "")
500         (unspec:SSEMODEF2P
501           [(match_operand:SSEMODEF2P 1 "register_operand" "")]
502           UNSPEC_MOVNT))]
503   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
504   "")
506 (define_expand "storent<mode>"
507   [(set (match_operand:MODEF 0 "memory_operand" "")
508         (unspec:MODEF
509           [(match_operand:MODEF 1 "register_operand" "")]
510           UNSPEC_MOVNT))]
511   "TARGET_SSE4A"
512   "")
514 (define_expand "storentv2di"
515   [(set (match_operand:V2DI 0 "memory_operand" "")
516         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "")]
517                      UNSPEC_MOVNT))]
518   "TARGET_SSE2"
519   "")
521 (define_expand "storentsi"
522   [(set (match_operand:SI 0 "memory_operand" "")
523         (unspec:SI [(match_operand:SI 1 "register_operand" "")]
524                    UNSPEC_MOVNT))]
525   "TARGET_SSE2"
526   "")
528 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
530 ;; Parallel floating point arithmetic
532 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
534 (define_expand "<code><mode>2"
535   [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
536         (absneg:SSEMODEF2P
537           (match_operand:SSEMODEF2P 1 "register_operand" "")))]
538   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
539   "ix86_expand_fp_absneg_operator (<CODE>, <MODE>mode, operands); DONE;")
541 (define_expand "<plusminus_insn><mode>3"
542   [(set (match_operand:AVX256MODEF2P 0 "register_operand" "")
543         (plusminus:AVX256MODEF2P
544           (match_operand:AVX256MODEF2P 1 "nonimmediate_operand" "")
545           (match_operand:AVX256MODEF2P 2 "nonimmediate_operand" "")))]
546   "AVX256_VEC_FLOAT_MODE_P (<MODE>mode)"
547   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
549 (define_insn "*avx_<plusminus_insn><mode>3"
550   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
551         (plusminus:AVXMODEF2P
552           (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "<comm>x")
553           (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
554   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)
555    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
556   "v<plusminus_mnemonic>p<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
557   [(set_attr "type" "sseadd")
558    (set_attr "prefix" "vex")
559    (set_attr "mode" "<avxvecmode>")])
561 (define_expand "<plusminus_insn><mode>3"
562   [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
563         (plusminus:SSEMODEF2P
564           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "")
565           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "")))]
566   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
567   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
569 (define_insn "*<plusminus_insn><mode>3"
570   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
571         (plusminus:SSEMODEF2P
572           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "<comm>0")
573           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
574   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)
575    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
576   "<plusminus_mnemonic>p<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
577   [(set_attr "type" "sseadd")
578    (set_attr "mode" "<MODE>")])
580 (define_insn "*avx_vm<plusminus_insn><mode>3"
581   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
582         (vec_merge:SSEMODEF2P
583           (plusminus:SSEMODEF2P
584             (match_operand:SSEMODEF2P 1 "register_operand" "x")
585             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
586           (match_dup 1)
587           (const_int 1)))]
588   "AVX128_VEC_FLOAT_MODE_P (<MODE>mode)"
589   "v<plusminus_mnemonic>s<ssemodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
590   [(set_attr "type" "sseadd")
591    (set_attr "prefix" "vex")
592    (set_attr "mode" "<ssescalarmode>")])
594 (define_insn "<sse>_vm<plusminus_insn><mode>3"
595   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
596         (vec_merge:SSEMODEF2P
597           (plusminus:SSEMODEF2P
598             (match_operand:SSEMODEF2P 1 "register_operand" "0")
599             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
600           (match_dup 1)
601           (const_int 1)))]
602   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
603   "<plusminus_mnemonic>s<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
604   [(set_attr "type" "sseadd")
605    (set_attr "mode" "<ssescalarmode>")])
607 (define_expand "mul<mode>3"
608   [(set (match_operand:AVX256MODEF2P 0 "register_operand" "")
609         (mult:AVX256MODEF2P
610           (match_operand:AVX256MODEF2P 1 "nonimmediate_operand" "")
611           (match_operand:AVX256MODEF2P 2 "nonimmediate_operand" "")))]
612   "AVX256_VEC_FLOAT_MODE_P (<MODE>mode)"
613   "ix86_fixup_binary_operands_no_copy (MULT, <MODE>mode, operands);")
615 (define_insn "*avx_mul<mode>3"
616   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
617         (mult:AVXMODEF2P
618           (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x")
619           (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
620   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)
621    && ix86_binary_operator_ok (MULT, <MODE>mode, operands)"
622   "vmulp<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
623   [(set_attr "type" "ssemul")
624    (set_attr "prefix" "vex")
625    (set_attr "mode" "<avxvecmode>")])
627 (define_expand "mul<mode>3"
628   [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
629         (mult:SSEMODEF2P
630           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "")
631           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "")))]
632   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
633   "ix86_fixup_binary_operands_no_copy (MULT, <MODE>mode, operands);")
635 (define_insn "*mul<mode>3"
636   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
637         (mult:SSEMODEF2P
638           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%0")
639           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
640   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)
641    && ix86_binary_operator_ok (MULT, <MODE>mode, operands)"
642   "mulp<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
643   [(set_attr "type" "ssemul")
644    (set_attr "mode" "<MODE>")])
646 (define_insn "*avx_vmmul<mode>3"
647   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
648         (vec_merge:SSEMODEF2P
649           (mult:SSEMODEF2P
650             (match_operand:SSEMODEF2P 1 "register_operand" "x")
651             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
652           (match_dup 1)
653           (const_int 1)))]
654   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
655   "vmuls<ssemodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
656   [(set_attr "type" "ssemul")
657    (set_attr "prefix" "vex")
658    (set_attr "mode" "<ssescalarmode>")])
660 (define_insn "<sse>_vmmul<mode>3"
661   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
662         (vec_merge:SSEMODEF2P
663           (mult:SSEMODEF2P
664             (match_operand:SSEMODEF2P 1 "register_operand" "0")
665             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
666           (match_dup 1)
667           (const_int 1)))]
668   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
669   "muls<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
670   [(set_attr "type" "ssemul")
671    (set_attr "mode" "<ssescalarmode>")])
673 (define_expand "divv8sf3"
674   [(set (match_operand:V8SF 0 "register_operand" "")
675         (div:V8SF (match_operand:V8SF 1 "register_operand" "")
676                   (match_operand:V8SF 2 "nonimmediate_operand" "")))]
677   "TARGET_AVX"
679   ix86_fixup_binary_operands_no_copy (DIV, V8SFmode, operands);
681   if (TARGET_SSE_MATH && TARGET_RECIP && !optimize_insn_for_size_p ()
682       && flag_finite_math_only && !flag_trapping_math
683       && flag_unsafe_math_optimizations)
684     {
685       ix86_emit_swdivsf (operands[0], operands[1],
686                          operands[2], V8SFmode);
687       DONE;
688     }
691 (define_expand "divv4df3"
692   [(set (match_operand:V4DF 0 "register_operand" "")
693         (div:V4DF (match_operand:V4DF 1 "register_operand" "")
694                   (match_operand:V4DF 2 "nonimmediate_operand" "")))]
695   "TARGET_AVX"
696   "ix86_fixup_binary_operands_no_copy (DIV, V4DFmode, operands);")
698 (define_insn "avx_div<mode>3"
699   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
700         (div:AVXMODEF2P
701           (match_operand:AVXMODEF2P 1 "register_operand" "x")
702           (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
703   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
704   "vdivp<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
705   [(set_attr "type" "ssediv")
706    (set_attr "prefix" "vex")
707    (set_attr "mode" "<MODE>")])
709 (define_expand "divv4sf3"
710   [(set (match_operand:V4SF 0 "register_operand" "")
711         (div:V4SF (match_operand:V4SF 1 "register_operand" "")
712                   (match_operand:V4SF 2 "nonimmediate_operand" "")))]
713   "TARGET_SSE"
715   if (TARGET_SSE_MATH && TARGET_RECIP && optimize_insn_for_speed_p ()
716       && flag_finite_math_only && !flag_trapping_math
717       && flag_unsafe_math_optimizations)
718     {
719       ix86_emit_swdivsf (operands[0], operands[1],
720                          operands[2], V4SFmode);
721       DONE;
722     }
725 (define_expand "divv2df3"
726   [(set (match_operand:V2DF 0 "register_operand" "")
727         (div:V2DF (match_operand:V2DF 1 "register_operand" "")
728                   (match_operand:V2DF 2 "nonimmediate_operand" "")))]
729   "TARGET_SSE2"
730   "")
732 (define_insn "*avx_div<mode>3"
733   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
734         (div:SSEMODEF2P
735           (match_operand:SSEMODEF2P 1 "register_operand" "x")
736           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
737   "AVX128_VEC_FLOAT_MODE_P (<MODE>mode)"
738   "vdivp<ssemodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
739   [(set_attr "type" "ssediv")
740    (set_attr "prefix" "vex")
741    (set_attr "mode" "<MODE>")])
743 (define_insn "<sse>_div<mode>3"
744   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
745         (div:SSEMODEF2P
746           (match_operand:SSEMODEF2P 1 "register_operand" "0")
747           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
748   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
749   "divp<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
750   [(set_attr "type" "ssediv")
751    (set_attr "mode" "<MODE>")])
753 (define_insn "*avx_vmdiv<mode>3"
754   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
755         (vec_merge:SSEMODEF2P
756           (div:SSEMODEF2P
757             (match_operand:SSEMODEF2P 1 "register_operand" "x")
758             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
759           (match_dup 1)
760           (const_int 1)))]
761   "AVX128_VEC_FLOAT_MODE_P (<MODE>mode)"
762   "vdivs<ssemodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
763   [(set_attr "type" "ssediv")
764    (set_attr "prefix" "vex")
765    (set_attr "mode" "<ssescalarmode>")])
767 (define_insn "<sse>_vmdiv<mode>3"
768   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
769         (vec_merge:SSEMODEF2P
770           (div:SSEMODEF2P
771             (match_operand:SSEMODEF2P 1 "register_operand" "0")
772             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
773           (match_dup 1)
774           (const_int 1)))]
775   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
776   "divs<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
777   [(set_attr "type" "ssediv")
778    (set_attr "mode" "<ssescalarmode>")])
780 (define_insn "avx_rcpv8sf2"
781   [(set (match_operand:V8SF 0 "register_operand" "=x")
782         (unspec:V8SF
783           [(match_operand:V8SF 1 "nonimmediate_operand" "xm")] UNSPEC_RCP))]
784   "TARGET_AVX"
785   "vrcpps\t{%1, %0|%0, %1}"
786   [(set_attr "type" "sse")
787    (set_attr "prefix" "vex")
788    (set_attr "mode" "V8SF")])
790 (define_insn "sse_rcpv4sf2"
791   [(set (match_operand:V4SF 0 "register_operand" "=x")
792         (unspec:V4SF
793           [(match_operand:V4SF 1 "nonimmediate_operand" "xm")] UNSPEC_RCP))]
794   "TARGET_SSE"
795   "%vrcpps\t{%1, %0|%0, %1}"
796   [(set_attr "type" "sse")
797    (set_attr "atom_sse_attr" "rcp")
798    (set_attr "prefix" "maybe_vex")
799    (set_attr "mode" "V4SF")])
801 (define_insn "*avx_vmrcpv4sf2"
802   [(set (match_operand:V4SF 0 "register_operand" "=x")
803         (vec_merge:V4SF
804           (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
805                        UNSPEC_RCP)
806           (match_operand:V4SF 2 "register_operand" "x")
807           (const_int 1)))]
808   "TARGET_AVX"
809   "vrcpss\t{%1, %2, %0|%0, %2, %1}"
810   [(set_attr "type" "sse")
811    (set_attr "prefix" "vex")
812    (set_attr "mode" "SF")])
814 (define_insn "sse_vmrcpv4sf2"
815   [(set (match_operand:V4SF 0 "register_operand" "=x")
816         (vec_merge:V4SF
817           (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
818                        UNSPEC_RCP)
819           (match_operand:V4SF 2 "register_operand" "0")
820           (const_int 1)))]
821   "TARGET_SSE"
822   "rcpss\t{%1, %0|%0, %1}"
823   [(set_attr "type" "sse")
824    (set_attr "atom_sse_attr" "rcp")
825    (set_attr "mode" "SF")])
827 (define_expand "sqrtv8sf2"
828   [(set (match_operand:V8SF 0 "register_operand" "")
829         (sqrt:V8SF (match_operand:V8SF 1 "nonimmediate_operand" "")))]
830   "TARGET_AVX"
832   if (TARGET_SSE_MATH && TARGET_RECIP && !optimize_insn_for_size_p ()
833       && flag_finite_math_only && !flag_trapping_math
834       && flag_unsafe_math_optimizations)
835     {
836       ix86_emit_swsqrtsf (operands[0], operands[1], V8SFmode, 0);
837       DONE;
838     }
841 (define_insn "avx_sqrtv8sf2"
842   [(set (match_operand:V8SF 0 "register_operand" "=x")
843         (sqrt:V8SF (match_operand:V8SF 1 "nonimmediate_operand" "xm")))]
844   "TARGET_AVX"
845   "vsqrtps\t{%1, %0|%0, %1}"
846   [(set_attr "type" "sse")
847    (set_attr "prefix" "vex")
848    (set_attr "mode" "V8SF")])
850 (define_expand "sqrtv4sf2"
851   [(set (match_operand:V4SF 0 "register_operand" "")
852         (sqrt:V4SF (match_operand:V4SF 1 "nonimmediate_operand" "")))]
853   "TARGET_SSE"
855   if (TARGET_SSE_MATH && TARGET_RECIP && optimize_insn_for_speed_p ()
856       && flag_finite_math_only && !flag_trapping_math
857       && flag_unsafe_math_optimizations)
858     {
859       ix86_emit_swsqrtsf (operands[0], operands[1], V4SFmode, 0);
860       DONE;
861     }
864 (define_insn "sse_sqrtv4sf2"
865   [(set (match_operand:V4SF 0 "register_operand" "=x")
866         (sqrt:V4SF (match_operand:V4SF 1 "nonimmediate_operand" "xm")))]
867   "TARGET_SSE"
868   "%vsqrtps\t{%1, %0|%0, %1}"
869   [(set_attr "type" "sse")
870    (set_attr "atom_sse_attr" "sqrt")
871    (set_attr "prefix" "maybe_vex")
872    (set_attr "mode" "V4SF")])
874 (define_insn "sqrtv4df2"
875   [(set (match_operand:V4DF 0 "register_operand" "=x")
876         (sqrt:V4DF (match_operand:V4DF 1 "nonimmediate_operand" "xm")))]
877   "TARGET_AVX"
878   "vsqrtpd\t{%1, %0|%0, %1}"
879   [(set_attr "type" "sse")
880    (set_attr "prefix" "vex")
881    (set_attr "mode" "V4DF")])
883 (define_insn "sqrtv2df2"
884   [(set (match_operand:V2DF 0 "register_operand" "=x")
885         (sqrt:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "xm")))]
886   "TARGET_SSE2"
887   "%vsqrtpd\t{%1, %0|%0, %1}"
888   [(set_attr "type" "sse")
889    (set_attr "prefix" "maybe_vex")
890    (set_attr "mode" "V2DF")])
892 (define_insn "*avx_vmsqrt<mode>2"
893   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
894         (vec_merge:SSEMODEF2P
895           (sqrt:SSEMODEF2P
896             (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "xm"))
897           (match_operand:SSEMODEF2P 2 "register_operand" "x")
898           (const_int 1)))]
899   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
900   "vsqrts<ssemodesuffixf2c>\t{%1, %2, %0|%0, %2, %1}"
901   [(set_attr "type" "sse")
902    (set_attr "prefix" "vex")
903    (set_attr "mode" "<ssescalarmode>")])
905 (define_insn "<sse>_vmsqrt<mode>2"
906   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
907         (vec_merge:SSEMODEF2P
908           (sqrt:SSEMODEF2P
909             (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "xm"))
910           (match_operand:SSEMODEF2P 2 "register_operand" "0")
911           (const_int 1)))]
912   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
913   "sqrts<ssemodesuffixf2c>\t{%1, %0|%0, %1}"
914   [(set_attr "type" "sse")
915    (set_attr "atom_sse_attr" "sqrt")
916    (set_attr "mode" "<ssescalarmode>")])
918 (define_expand "rsqrtv8sf2"
919   [(set (match_operand:V8SF 0 "register_operand" "")
920         (unspec:V8SF
921           [(match_operand:V8SF 1 "nonimmediate_operand" "")] UNSPEC_RSQRT))]
922   "TARGET_AVX && TARGET_SSE_MATH"
924   ix86_emit_swsqrtsf (operands[0], operands[1], V8SFmode, 1);
925   DONE;
928 (define_insn "avx_rsqrtv8sf2"
929   [(set (match_operand:V8SF 0 "register_operand" "=x")
930         (unspec:V8SF
931           [(match_operand:V8SF 1 "nonimmediate_operand" "xm")] UNSPEC_RSQRT))]
932   "TARGET_AVX"
933   "vrsqrtps\t{%1, %0|%0, %1}"
934   [(set_attr "type" "sse")
935    (set_attr "prefix" "vex")
936    (set_attr "mode" "V8SF")])
938 (define_expand "rsqrtv4sf2"
939   [(set (match_operand:V4SF 0 "register_operand" "")
940         (unspec:V4SF
941           [(match_operand:V4SF 1 "nonimmediate_operand" "")] UNSPEC_RSQRT))]
942   "TARGET_SSE_MATH"
944   ix86_emit_swsqrtsf (operands[0], operands[1], V4SFmode, 1);
945   DONE;
948 (define_insn "sse_rsqrtv4sf2"
949   [(set (match_operand:V4SF 0 "register_operand" "=x")
950         (unspec:V4SF
951           [(match_operand:V4SF 1 "nonimmediate_operand" "xm")] UNSPEC_RSQRT))]
952   "TARGET_SSE"
953   "%vrsqrtps\t{%1, %0|%0, %1}"
954   [(set_attr "type" "sse")
955    (set_attr "prefix" "maybe_vex")
956    (set_attr "mode" "V4SF")])
958 (define_insn "*avx_vmrsqrtv4sf2"
959   [(set (match_operand:V4SF 0 "register_operand" "=x")
960         (vec_merge:V4SF
961           (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
962                        UNSPEC_RSQRT)
963           (match_operand:V4SF 2 "register_operand" "x")
964           (const_int 1)))]
965   "TARGET_AVX"
966   "vrsqrtss\t{%1, %2, %0|%0, %2, %1}"
967   [(set_attr "type" "sse")
968    (set_attr "prefix" "vex")
969    (set_attr "mode" "SF")])
971 (define_insn "sse_vmrsqrtv4sf2"
972   [(set (match_operand:V4SF 0 "register_operand" "=x")
973         (vec_merge:V4SF
974           (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
975                        UNSPEC_RSQRT)
976           (match_operand:V4SF 2 "register_operand" "0")
977           (const_int 1)))]
978   "TARGET_SSE"
979   "rsqrtss\t{%1, %0|%0, %1}"
980   [(set_attr "type" "sse")
981    (set_attr "mode" "SF")])
983 ;; ??? For !flag_finite_math_only, the representation with SMIN/SMAX
984 ;; isn't really correct, as those rtl operators aren't defined when
985 ;; applied to NaNs.  Hopefully the optimizers won't get too smart on us.
987 (define_expand "<code><mode>3"
988   [(set (match_operand:AVX256MODEF2P 0 "register_operand" "")
989         (smaxmin:AVX256MODEF2P
990           (match_operand:AVX256MODEF2P 1 "nonimmediate_operand" "")
991           (match_operand:AVX256MODEF2P 2 "nonimmediate_operand" "")))]
992   "AVX256_VEC_FLOAT_MODE_P (<MODE>mode)"
994   if (!flag_finite_math_only)
995     operands[1] = force_reg (<MODE>mode, operands[1]);
996   ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);
999 (define_expand "<code><mode>3"
1000   [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
1001         (smaxmin:SSEMODEF2P
1002           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "")
1003           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "")))]
1004   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1006   if (!flag_finite_math_only)
1007     operands[1] = force_reg (<MODE>mode, operands[1]);
1008   ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);
1011 (define_insn "*avx_<code><mode>3_finite"
1012   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1013         (smaxmin:AVXMODEF2P
1014           (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x")
1015           (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
1016   "AVX_VEC_FLOAT_MODE_P (<MODE>mode) && flag_finite_math_only
1017    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
1018   "v<maxminfprefix>p<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
1019   [(set_attr "type" "sseadd")
1020    (set_attr "prefix" "vex")
1021    (set_attr "mode" "<MODE>")])
1023 (define_insn "*<code><mode>3_finite"
1024   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1025         (smaxmin:SSEMODEF2P
1026           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%0")
1027           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
1028   "SSE_VEC_FLOAT_MODE_P (<MODE>mode) && flag_finite_math_only
1029    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
1030   "<maxminfprefix>p<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
1031   [(set_attr "type" "sseadd")
1032    (set_attr "mode" "<MODE>")])
1034 (define_insn "*avx_<code><mode>3"
1035   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1036         (smaxmin:AVXMODEF2P
1037           (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x")
1038           (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
1039   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
1040   "v<maxminfprefix>p<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
1041   [(set_attr "type" "sseadd")
1042    (set_attr "prefix" "vex")
1043    (set_attr "mode" "<avxvecmode>")])
1045 (define_insn "*<code><mode>3"
1046   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1047         (smaxmin:SSEMODEF2P
1048           (match_operand:SSEMODEF2P 1 "register_operand" "0")
1049           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
1050   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1051   "<maxminfprefix>p<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
1052   [(set_attr "type" "sseadd")
1053    (set_attr "mode" "<MODE>")])
1055 (define_insn "*avx_vm<code><mode>3"
1056   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1057         (vec_merge:SSEMODEF2P
1058           (smaxmin:SSEMODEF2P
1059             (match_operand:SSEMODEF2P 1 "register_operand" "x")
1060             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
1061          (match_dup 1)
1062          (const_int 1)))]
1063   "AVX128_VEC_FLOAT_MODE_P (<MODE>mode)"
1064   "v<maxminfprefix>s<ssemodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
1065   [(set_attr "type" "sse")
1066    (set_attr "prefix" "vex")
1067    (set_attr "mode" "<ssescalarmode>")])
1069 (define_insn "<sse>_vm<code><mode>3"
1070   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1071         (vec_merge:SSEMODEF2P
1072           (smaxmin:SSEMODEF2P
1073             (match_operand:SSEMODEF2P 1 "register_operand" "0")
1074             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
1075          (match_dup 1)
1076          (const_int 1)))]
1077   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1078   "<maxminfprefix>s<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
1079   [(set_attr "type" "sseadd")
1080    (set_attr "mode" "<ssescalarmode>")])
1082 ;; These versions of the min/max patterns implement exactly the operations
1083 ;;   min = (op1 < op2 ? op1 : op2)
1084 ;;   max = (!(op1 < op2) ? op1 : op2)
1085 ;; Their operands are not commutative, and thus they may be used in the
1086 ;; presence of -0.0 and NaN.
1088 (define_insn "*avx_ieee_smin<mode>3"
1089   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1090         (unspec:AVXMODEF2P
1091           [(match_operand:AVXMODEF2P 1 "register_operand" "x")
1092            (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")]
1093          UNSPEC_IEEE_MIN))]
1094   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
1095   "vminp<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
1096   [(set_attr "type" "sseadd")
1097    (set_attr "prefix" "vex")
1098    (set_attr "mode" "<avxvecmode>")])
1100 (define_insn "*avx_ieee_smax<mode>3"
1101   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1102         (unspec:AVXMODEF2P
1103           [(match_operand:AVXMODEF2P 1 "register_operand" "x")
1104            (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")]
1105          UNSPEC_IEEE_MAX))]
1106   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
1107   "vmaxp<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
1108   [(set_attr "type" "sseadd")
1109    (set_attr "prefix" "vex")
1110    (set_attr "mode" "<avxvecmode>")])
1112 (define_insn "*ieee_smin<mode>3"
1113   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1114         (unspec:SSEMODEF2P
1115           [(match_operand:SSEMODEF2P 1 "register_operand" "0")
1116            (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")]
1117          UNSPEC_IEEE_MIN))]
1118   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1119   "minp<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
1120   [(set_attr "type" "sseadd")
1121    (set_attr "mode" "<MODE>")])
1123 (define_insn "*ieee_smax<mode>3"
1124   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1125         (unspec:SSEMODEF2P
1126           [(match_operand:SSEMODEF2P 1 "register_operand" "0")
1127            (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")]
1128          UNSPEC_IEEE_MAX))]
1129   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1130   "maxp<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
1131   [(set_attr "type" "sseadd")
1132    (set_attr "mode" "<MODE>")])
1134 (define_insn "avx_addsubv8sf3"
1135   [(set (match_operand:V8SF 0 "register_operand" "=x")
1136         (vec_merge:V8SF
1137           (plus:V8SF
1138             (match_operand:V8SF 1 "register_operand" "x")
1139             (match_operand:V8SF 2 "nonimmediate_operand" "xm"))
1140           (minus:V8SF (match_dup 1) (match_dup 2))
1141           (const_int 170)))]
1142   "TARGET_AVX"
1143   "vaddsubps\t{%2, %1, %0|%0, %1, %2}"
1144   [(set_attr "type" "sseadd")
1145    (set_attr "prefix" "vex")
1146    (set_attr "mode" "V8SF")])
1148 (define_insn "avx_addsubv4df3"
1149   [(set (match_operand:V4DF 0 "register_operand" "=x")
1150         (vec_merge:V4DF
1151           (plus:V4DF
1152             (match_operand:V4DF 1 "register_operand" "x")
1153             (match_operand:V4DF 2 "nonimmediate_operand" "xm"))
1154           (minus:V4DF (match_dup 1) (match_dup 2))
1155           (const_int 10)))]
1156   "TARGET_AVX"
1157   "vaddsubpd\t{%2, %1, %0|%0, %1, %2}"
1158   [(set_attr "type" "sseadd")
1159    (set_attr "prefix" "vex")
1160    (set_attr "mode" "V4DF")])
1162 (define_insn "*avx_addsubv4sf3"
1163   [(set (match_operand:V4SF 0 "register_operand" "=x")
1164         (vec_merge:V4SF
1165           (plus:V4SF
1166             (match_operand:V4SF 1 "register_operand" "x")
1167             (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
1168           (minus:V4SF (match_dup 1) (match_dup 2))
1169           (const_int 10)))]
1170   "TARGET_AVX"
1171   "vaddsubps\t{%2, %1, %0|%0, %1, %2}"
1172   [(set_attr "type" "sseadd")
1173    (set_attr "prefix" "vex")
1174    (set_attr "mode" "V4SF")])
1176 (define_insn "sse3_addsubv4sf3"
1177   [(set (match_operand:V4SF 0 "register_operand" "=x")
1178         (vec_merge:V4SF
1179           (plus:V4SF
1180             (match_operand:V4SF 1 "register_operand" "0")
1181             (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
1182           (minus:V4SF (match_dup 1) (match_dup 2))
1183           (const_int 10)))]
1184   "TARGET_SSE3"
1185   "addsubps\t{%2, %0|%0, %2}"
1186   [(set_attr "type" "sseadd")
1187    (set_attr "prefix_rep" "1")
1188    (set_attr "mode" "V4SF")])
1190 (define_insn "*avx_addsubv2df3"
1191   [(set (match_operand:V2DF 0 "register_operand" "=x")
1192         (vec_merge:V2DF
1193           (plus:V2DF
1194             (match_operand:V2DF 1 "register_operand" "x")
1195             (match_operand:V2DF 2 "nonimmediate_operand" "xm"))
1196           (minus:V2DF (match_dup 1) (match_dup 2))
1197           (const_int 2)))]
1198   "TARGET_AVX"
1199   "vaddsubpd\t{%2, %1, %0|%0, %1, %2}"
1200   [(set_attr "type" "sseadd")
1201    (set_attr "prefix" "vex")
1202    (set_attr "mode" "V2DF")])
1204 (define_insn "sse3_addsubv2df3"
1205   [(set (match_operand:V2DF 0 "register_operand" "=x")
1206         (vec_merge:V2DF
1207           (plus:V2DF
1208             (match_operand:V2DF 1 "register_operand" "0")
1209             (match_operand:V2DF 2 "nonimmediate_operand" "xm"))
1210           (minus:V2DF (match_dup 1) (match_dup 2))
1211           (const_int 2)))]
1212   "TARGET_SSE3"
1213   "addsubpd\t{%2, %0|%0, %2}"
1214   [(set_attr "type" "sseadd")
1215    (set_attr "atom_unit" "complex")
1216    (set_attr "mode" "V2DF")])
1218 (define_insn "avx_h<plusminus_insn>v4df3"
1219   [(set (match_operand:V4DF 0 "register_operand" "=x")
1220         (vec_concat:V4DF
1221           (vec_concat:V2DF
1222             (plusminus:DF
1223               (vec_select:DF
1224                 (match_operand:V4DF 1 "register_operand" "x")
1225                 (parallel [(const_int 0)]))
1226               (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
1227             (plusminus:DF
1228               (vec_select:DF (match_dup 1) (parallel [(const_int 2)]))
1229               (vec_select:DF (match_dup 1) (parallel [(const_int 3)]))))
1230           (vec_concat:V2DF
1231             (plusminus:DF
1232               (vec_select:DF
1233                 (match_operand:V4DF 2 "nonimmediate_operand" "xm")
1234                 (parallel [(const_int 0)]))
1235               (vec_select:DF (match_dup 2) (parallel [(const_int 1)])))
1236             (plusminus:DF
1237               (vec_select:DF (match_dup 2) (parallel [(const_int 2)]))
1238               (vec_select:DF (match_dup 2) (parallel [(const_int 3)]))))))]
1239   "TARGET_AVX"
1240   "vh<plusminus_mnemonic>pd\t{%2, %1, %0|%0, %1, %2}"
1241   [(set_attr "type" "sseadd")
1242    (set_attr "prefix" "vex")
1243    (set_attr "mode" "V4DF")])
1245 (define_insn "avx_h<plusminus_insn>v8sf3"
1246   [(set (match_operand:V8SF 0 "register_operand" "=x")
1247         (vec_concat:V8SF
1248           (vec_concat:V4SF
1249             (vec_concat:V2SF
1250               (plusminus:SF
1251                 (vec_select:SF
1252                   (match_operand:V8SF 1 "register_operand" "x")
1253                   (parallel [(const_int 0)]))
1254                 (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))
1255               (plusminus:SF
1256                 (vec_select:SF (match_dup 1) (parallel [(const_int 2)]))
1257                 (vec_select:SF (match_dup 1) (parallel [(const_int 3)]))))
1258             (vec_concat:V2SF
1259               (plusminus:SF
1260                 (vec_select:SF
1261                   (match_operand:V8SF 2 "nonimmediate_operand" "xm")
1262                   (parallel [(const_int 0)]))
1263                 (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))
1264               (plusminus:SF
1265                 (vec_select:SF (match_dup 2) (parallel [(const_int 2)]))
1266                 (vec_select:SF (match_dup 2) (parallel [(const_int 3)])))))
1267           (vec_concat:V4SF
1268             (vec_concat:V2SF
1269               (plusminus:SF
1270                 (vec_select:SF (match_dup 1) (parallel [(const_int 4)]))
1271                 (vec_select:SF (match_dup 1) (parallel [(const_int 5)])))
1272               (plusminus:SF
1273                 (vec_select:SF (match_dup 1) (parallel [(const_int 6)]))
1274                 (vec_select:SF (match_dup 1) (parallel [(const_int 7)]))))
1275             (vec_concat:V2SF
1276               (plusminus:SF
1277                 (vec_select:SF (match_dup 2) (parallel [(const_int 4)]))
1278                 (vec_select:SF (match_dup 2) (parallel [(const_int 5)])))
1279               (plusminus:SF
1280                 (vec_select:SF (match_dup 2) (parallel [(const_int 6)]))
1281                 (vec_select:SF (match_dup 2) (parallel [(const_int 7)])))))))]
1282   "TARGET_AVX"
1283   "vh<plusminus_mnemonic>ps\t{%2, %1, %0|%0, %1, %2}"
1284   [(set_attr "type" "sseadd")
1285    (set_attr "prefix" "vex")
1286    (set_attr "mode" "V8SF")])
1288 (define_insn "*avx_h<plusminus_insn>v4sf3"
1289   [(set (match_operand:V4SF 0 "register_operand" "=x")
1290         (vec_concat:V4SF
1291           (vec_concat:V2SF
1292             (plusminus:SF
1293               (vec_select:SF
1294                 (match_operand:V4SF 1 "register_operand" "x")
1295                 (parallel [(const_int 0)]))
1296               (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))
1297             (plusminus:SF
1298               (vec_select:SF (match_dup 1) (parallel [(const_int 2)]))
1299               (vec_select:SF (match_dup 1) (parallel [(const_int 3)]))))
1300           (vec_concat:V2SF
1301             (plusminus:SF
1302               (vec_select:SF
1303                 (match_operand:V4SF 2 "nonimmediate_operand" "xm")
1304                 (parallel [(const_int 0)]))
1305               (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))
1306             (plusminus:SF
1307               (vec_select:SF (match_dup 2) (parallel [(const_int 2)]))
1308               (vec_select:SF (match_dup 2) (parallel [(const_int 3)]))))))]
1309   "TARGET_AVX"
1310   "vh<plusminus_mnemonic>ps\t{%2, %1, %0|%0, %1, %2}"
1311   [(set_attr "type" "sseadd")
1312    (set_attr "prefix" "vex")
1313    (set_attr "mode" "V4SF")])
1315 (define_insn "sse3_h<plusminus_insn>v4sf3"
1316   [(set (match_operand:V4SF 0 "register_operand" "=x")
1317         (vec_concat:V4SF
1318           (vec_concat:V2SF
1319             (plusminus:SF
1320               (vec_select:SF
1321                 (match_operand:V4SF 1 "register_operand" "0")
1322                 (parallel [(const_int 0)]))
1323               (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))
1324             (plusminus:SF
1325               (vec_select:SF (match_dup 1) (parallel [(const_int 2)]))
1326               (vec_select:SF (match_dup 1) (parallel [(const_int 3)]))))
1327           (vec_concat:V2SF
1328             (plusminus:SF
1329               (vec_select:SF
1330                 (match_operand:V4SF 2 "nonimmediate_operand" "xm")
1331                 (parallel [(const_int 0)]))
1332               (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))
1333             (plusminus:SF
1334               (vec_select:SF (match_dup 2) (parallel [(const_int 2)]))
1335               (vec_select:SF (match_dup 2) (parallel [(const_int 3)]))))))]
1336   "TARGET_SSE3"
1337   "h<plusminus_mnemonic>ps\t{%2, %0|%0, %2}"
1338   [(set_attr "type" "sseadd")
1339    (set_attr "atom_unit" "complex")
1340    (set_attr "prefix_rep" "1")
1341    (set_attr "mode" "V4SF")])
1343 (define_insn "*avx_h<plusminus_insn>v2df3"
1344   [(set (match_operand:V2DF 0 "register_operand" "=x")
1345         (vec_concat:V2DF
1346           (plusminus:DF
1347             (vec_select:DF
1348               (match_operand:V2DF 1 "register_operand" "x")
1349               (parallel [(const_int 0)]))
1350             (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
1351           (plusminus:DF
1352             (vec_select:DF
1353               (match_operand:V2DF 2 "nonimmediate_operand" "xm")
1354               (parallel [(const_int 0)]))
1355             (vec_select:DF (match_dup 2) (parallel [(const_int 1)])))))]
1356   "TARGET_AVX"
1357   "vh<plusminus_mnemonic>pd\t{%2, %1, %0|%0, %1, %2}"
1358   [(set_attr "type" "sseadd")
1359    (set_attr "prefix" "vex")
1360    (set_attr "mode" "V2DF")])
1362 (define_insn "sse3_h<plusminus_insn>v2df3"
1363   [(set (match_operand:V2DF 0 "register_operand" "=x")
1364         (vec_concat:V2DF
1365           (plusminus:DF
1366             (vec_select:DF
1367               (match_operand:V2DF 1 "register_operand" "0")
1368               (parallel [(const_int 0)]))
1369             (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
1370           (plusminus:DF
1371             (vec_select:DF
1372               (match_operand:V2DF 2 "nonimmediate_operand" "xm")
1373               (parallel [(const_int 0)]))
1374             (vec_select:DF (match_dup 2) (parallel [(const_int 1)])))))]
1375   "TARGET_SSE3"
1376   "h<plusminus_mnemonic>pd\t{%2, %0|%0, %2}"
1377   [(set_attr "type" "sseadd")
1378    (set_attr "mode" "V2DF")])
1380 (define_expand "reduc_splus_v4sf"
1381   [(match_operand:V4SF 0 "register_operand" "")
1382    (match_operand:V4SF 1 "register_operand" "")]
1383   "TARGET_SSE"
1385   if (TARGET_SSE3)
1386     {
1387       rtx tmp = gen_reg_rtx (V4SFmode);
1388       emit_insn (gen_sse3_haddv4sf3 (tmp, operands[1], operands[1]));
1389       emit_insn (gen_sse3_haddv4sf3 (operands[0], tmp, tmp));
1390     }
1391   else
1392     ix86_expand_reduc_v4sf (gen_addv4sf3, operands[0], operands[1]);
1393   DONE;
1396 (define_expand "reduc_splus_v2df"
1397   [(match_operand:V2DF 0 "register_operand" "")
1398    (match_operand:V2DF 1 "register_operand" "")]
1399   "TARGET_SSE3"
1401   emit_insn (gen_sse3_haddv2df3 (operands[0], operands[1], operands[1]));
1402   DONE;
1405 (define_expand "reduc_smax_v4sf"
1406   [(match_operand:V4SF 0 "register_operand" "")
1407    (match_operand:V4SF 1 "register_operand" "")]
1408   "TARGET_SSE"
1410   ix86_expand_reduc_v4sf (gen_smaxv4sf3, operands[0], operands[1]);
1411   DONE;
1414 (define_expand "reduc_smin_v4sf"
1415   [(match_operand:V4SF 0 "register_operand" "")
1416    (match_operand:V4SF 1 "register_operand" "")]
1417   "TARGET_SSE"
1419   ix86_expand_reduc_v4sf (gen_sminv4sf3, operands[0], operands[1]);
1420   DONE;
1423 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1425 ;; Parallel floating point comparisons
1427 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1429 (define_insn "avx_cmpp<avxmodesuffixf2c><mode>3"
1430   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1431         (unspec:AVXMODEF2P
1432           [(match_operand:AVXMODEF2P 1 "register_operand" "x")
1433            (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")
1434            (match_operand:SI 3 "const_0_to_31_operand" "n")]
1435           UNSPEC_PCMP))]
1436   "TARGET_AVX"
1437   "vcmpp<avxmodesuffixf2c>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1438   [(set_attr "type" "ssecmp")
1439    (set_attr "length_immediate" "1")
1440    (set_attr "prefix" "vex")
1441    (set_attr "mode" "<MODE>")])
1443 (define_insn "avx_cmps<ssemodesuffixf2c><mode>3"
1444   [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
1445         (vec_merge:SSEMODEF2P
1446           (unspec:SSEMODEF2P
1447             [(match_operand:SSEMODEF2P 1 "register_operand" "x")
1448              (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")
1449              (match_operand:SI 3 "const_0_to_31_operand" "n")]
1450             UNSPEC_PCMP)
1451          (match_dup 1)
1452          (const_int 1)))]
1453   "TARGET_AVX"
1454   "vcmps<ssemodesuffixf2c>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1455   [(set_attr "type" "ssecmp")
1456    (set_attr "length_immediate" "1")
1457    (set_attr "prefix" "vex")
1458    (set_attr "mode" "<ssescalarmode>")])
1460 ;; We don't promote 128bit vector compare intrinsics. But vectorizer
1461 ;; may generate 256bit vector compare instructions.
1462 (define_insn "*avx_maskcmp<mode>3"
1463   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1464         (match_operator:AVXMODEF2P 3 "avx_comparison_float_operator"
1465                 [(match_operand:AVXMODEF2P 1 "register_operand" "x")
1466                  (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")]))]
1467   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
1468   "vcmp%D3p<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
1469   [(set_attr "type" "ssecmp")
1470    (set_attr "prefix" "vex")
1471    (set_attr "length_immediate" "1")
1472    (set_attr "mode" "<avxvecmode>")])
1474 (define_insn "<sse>_maskcmp<mode>3"
1475   [(set (match_operand:SSEMODEF4 0 "register_operand" "=x")
1476         (match_operator:SSEMODEF4 3 "sse_comparison_operator"
1477                 [(match_operand:SSEMODEF4 1 "register_operand" "0")
1478                  (match_operand:SSEMODEF4 2 "nonimmediate_operand" "xm")]))]
1479   "!TARGET_XOP 
1480   && (SSE_FLOAT_MODE_P (<MODE>mode) || SSE_VEC_FLOAT_MODE_P (<MODE>mode))"
1481   "cmp%D3<ssemodesuffixf4>\t{%2, %0|%0, %2}"
1482   [(set_attr "type" "ssecmp")
1483    (set_attr "length_immediate" "1")
1484    (set_attr "mode" "<MODE>")])
1486 (define_insn "<sse>_vmmaskcmp<mode>3"
1487   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1488         (vec_merge:SSEMODEF2P
1489          (match_operator:SSEMODEF2P 3 "sse_comparison_operator"
1490                 [(match_operand:SSEMODEF2P 1 "register_operand" "0")
1491                  (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")])
1492          (match_dup 1)
1493          (const_int 1)))]
1494   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1495   "cmp%D3s<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
1496   [(set_attr "type" "ssecmp")
1497    (set_attr "length_immediate" "1")
1498    (set_attr "mode" "<ssescalarmode>")])
1500 (define_insn "<sse>_comi"
1501   [(set (reg:CCFP FLAGS_REG)
1502         (compare:CCFP
1503           (vec_select:MODEF
1504             (match_operand:<ssevecmode> 0 "register_operand" "x")
1505             (parallel [(const_int 0)]))
1506           (vec_select:MODEF
1507             (match_operand:<ssevecmode> 1 "nonimmediate_operand" "xm")
1508             (parallel [(const_int 0)]))))]
1509   "SSE_FLOAT_MODE_P (<MODE>mode)"
1510   "%vcomis<ssemodefsuffix>\t{%1, %0|%0, %1}"
1511   [(set_attr "type" "ssecomi")
1512    (set_attr "prefix" "maybe_vex")
1513    (set_attr "prefix_rep" "0")
1514    (set (attr "prefix_data16")
1515         (if_then_else (eq_attr "mode" "DF")
1516                       (const_string "1")
1517                       (const_string "0")))
1518    (set_attr "mode" "<MODE>")])
1520 (define_insn "<sse>_ucomi"
1521   [(set (reg:CCFPU FLAGS_REG)
1522         (compare:CCFPU
1523           (vec_select:MODEF
1524             (match_operand:<ssevecmode> 0 "register_operand" "x")
1525             (parallel [(const_int 0)]))
1526           (vec_select:MODEF
1527             (match_operand:<ssevecmode> 1 "nonimmediate_operand" "xm")
1528             (parallel [(const_int 0)]))))]
1529   "SSE_FLOAT_MODE_P (<MODE>mode)"
1530   "%vucomis<ssemodefsuffix>\t{%1, %0|%0, %1}"
1531   [(set_attr "type" "ssecomi")
1532    (set_attr "prefix" "maybe_vex")
1533    (set_attr "prefix_rep" "0")
1534    (set (attr "prefix_data16")
1535         (if_then_else (eq_attr "mode" "DF")
1536                       (const_string "1")
1537                       (const_string "0")))
1538    (set_attr "mode" "<MODE>")])
1540 (define_expand "vcond<mode>"
1541   [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
1542         (if_then_else:SSEMODEF2P
1543           (match_operator 3 ""
1544             [(match_operand:SSEMODEF2P 4 "nonimmediate_operand" "")
1545              (match_operand:SSEMODEF2P 5 "nonimmediate_operand" "")])
1546           (match_operand:SSEMODEF2P 1 "general_operand" "")
1547           (match_operand:SSEMODEF2P 2 "general_operand" "")))]
1548   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1550   bool ok = ix86_expand_fp_vcond (operands);
1551   gcc_assert (ok);
1552   DONE;
1555 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1557 ;; Parallel floating point logical operations
1559 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1561 (define_insn "avx_andnot<mode>3"
1562   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1563         (and:AVXMODEF2P
1564           (not:AVXMODEF2P
1565             (match_operand:AVXMODEF2P 1 "register_operand" "x"))
1566           (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
1567   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
1568   "vandnp<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
1569   [(set_attr "type" "sselog")
1570    (set_attr "prefix" "vex")
1571    (set_attr "mode" "<avxvecmode>")])
1573 (define_insn "<sse>_andnot<mode>3"
1574   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1575         (and:SSEMODEF2P
1576           (not:SSEMODEF2P
1577             (match_operand:SSEMODEF2P 1 "register_operand" "0"))
1578           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
1579   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1580   "andnp<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
1581   [(set_attr "type" "sselog")
1582    (set_attr "mode" "<MODE>")])
1584 (define_expand "<code><mode>3"
1585   [(set (match_operand:AVX256MODEF2P 0 "register_operand" "")
1586         (any_logic:AVX256MODEF2P
1587           (match_operand:AVX256MODEF2P 1 "nonimmediate_operand" "")
1588           (match_operand:AVX256MODEF2P 2 "nonimmediate_operand" "")))]
1589   "AVX256_VEC_FLOAT_MODE_P (<MODE>mode)"
1590   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
1592 (define_insn "*avx_<code><mode>3"
1593   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1594         (any_logic:AVXMODEF2P
1595           (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x")
1596           (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
1597   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)
1598    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
1599   "v<logicprefix>p<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
1600   [(set_attr "type" "sselog")
1601    (set_attr "prefix" "vex")
1602    (set_attr "mode" "<avxvecmode>")])
1604 (define_expand "<code><mode>3"
1605   [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
1606         (any_logic:SSEMODEF2P
1607           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "")
1608           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "")))]
1609   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1610   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
1612 (define_insn "*<code><mode>3"
1613   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1614         (any_logic:SSEMODEF2P
1615           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%0")
1616           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
1617   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)
1618    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
1619   "<logicprefix>p<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
1620   [(set_attr "type" "sselog")
1621    (set_attr "mode" "<MODE>")])
1623 (define_expand "copysign<mode>3"
1624   [(set (match_dup 4)
1625         (and:SSEMODEF2P 
1626           (not:SSEMODEF2P (match_dup 3))
1627           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "")))
1628    (set (match_dup 5)
1629         (and:SSEMODEF2P (match_dup 3)
1630                         (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "")))
1631    (set (match_operand:SSEMODEF2P 0 "register_operand" "")
1632         (ior:SSEMODEF2P (match_dup 4) (match_dup 5)))]
1633   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1635   operands[3] = ix86_build_signbit_mask (<ssescalarmode>mode, 1, 0);
1637   operands[4] = gen_reg_rtx (<MODE>mode);
1638   operands[5] = gen_reg_rtx (<MODE>mode);
1641 ;; Also define scalar versions.  These are used for abs, neg, and
1642 ;; conditional move.  Using subregs into vector modes causes register
1643 ;; allocation lossage.  These patterns do not allow memory operands
1644 ;; because the native instructions read the full 128-bits.
1646 (define_insn "*avx_andnot<mode>3"
1647   [(set (match_operand:MODEF 0 "register_operand" "=x")
1648         (and:MODEF
1649           (not:MODEF
1650             (match_operand:MODEF 1 "register_operand" "x"))
1651             (match_operand:MODEF 2 "register_operand" "x")))]
1652   "AVX_FLOAT_MODE_P (<MODE>mode)"
1653   "vandnp<ssemodefsuffix>\t{%2, %1, %0|%0, %1, %2}"
1654   [(set_attr "type" "sselog")
1655    (set_attr "prefix" "vex")
1656    (set_attr "mode" "<ssevecmode>")])
1658 (define_insn "*andnot<mode>3"
1659   [(set (match_operand:MODEF 0 "register_operand" "=x")
1660         (and:MODEF
1661           (not:MODEF
1662             (match_operand:MODEF 1 "register_operand" "0"))
1663             (match_operand:MODEF 2 "register_operand" "x")))]
1664   "SSE_FLOAT_MODE_P (<MODE>mode)"
1665   "andnp<ssemodefsuffix>\t{%2, %0|%0, %2}"
1666   [(set_attr "type" "sselog")
1667    (set_attr "mode" "<ssevecmode>")])
1669 (define_insn "*avx_<code><mode>3"
1670   [(set (match_operand:MODEF 0 "register_operand" "=x")
1671         (any_logic:MODEF
1672           (match_operand:MODEF 1 "register_operand" "x")
1673           (match_operand:MODEF 2 "register_operand" "x")))]
1674   "AVX_FLOAT_MODE_P (<MODE>mode)"
1675   "v<logicprefix>p<ssemodefsuffix>\t{%2, %1, %0|%0, %1, %2}"
1676   [(set_attr "type" "sselog")
1677    (set_attr "prefix" "vex")
1678    (set_attr "mode" "<ssevecmode>")])
1680 (define_insn "*<code><mode>3"
1681   [(set (match_operand:MODEF 0 "register_operand" "=x")
1682         (any_logic:MODEF
1683           (match_operand:MODEF 1 "register_operand" "0")
1684           (match_operand:MODEF 2 "register_operand" "x")))]
1685   "SSE_FLOAT_MODE_P (<MODE>mode)"
1686   "<logicprefix>p<ssemodefsuffix>\t{%2, %0|%0, %2}"
1687   [(set_attr "type" "sselog")
1688    (set_attr "mode" "<ssevecmode>")])
1690 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1692 ;; FMA4 floating point multiply/accumulate instructions.  This
1693 ;; includes the scalar version of the instructions as well as the
1694 ;; vector.
1696 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1698 ;; In order to match (*a * *b) + *c, particularly when vectorizing, allow
1699 ;; combine to generate a multiply/add with two memory references.  We then
1700 ;; split this insn, into loading up the destination register with one of the
1701 ;; memory operations.  If we don't manage to split the insn, reload will
1702 ;; generate the appropriate moves.  The reason this is needed, is that combine
1703 ;; has already folded one of the memory references into both the multiply and
1704 ;; add insns, and it can't generate a new pseudo.  I.e.:
1705 ;;      (set (reg1) (mem (addr1)))
1706 ;;      (set (reg2) (mult (reg1) (mem (addr2))))
1707 ;;      (set (reg3) (plus (reg2) (mem (addr3))))
1709 (define_insn "fma4_fmadd<mode>4256"
1710   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1711         (plus:FMA4MODEF4
1712          (mult:FMA4MODEF4
1713           (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1714           (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1715          (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x")))]
1716   "TARGET_FMA4 && TARGET_FUSED_MADD"
1717   "vfmadd<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1718   [(set_attr "type" "ssemuladd")
1719    (set_attr "mode" "<MODE>")])
1721 ;; Floating multiply and subtract.
1722 (define_insn "fma4_fmsub<mode>4256"
1723   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1724         (minus:FMA4MODEF4
1725          (mult:FMA4MODEF4
1726           (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1727           (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1728          (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x")))]
1729   "TARGET_FMA4 && TARGET_FUSED_MADD"
1730   "vfmsub<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1731   [(set_attr "type" "ssemuladd")
1732    (set_attr "mode" "<MODE>")])
1734 ;; Floating point negative multiply and add.
1735 ;; Rewrite (- (a * b) + c) into the canonical form: c - (a * b).
1736 (define_insn "fma4_fnmadd<mode>4256"
1737   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1738         (minus:FMA4MODEF4
1739          (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x")
1740          (mult:FMA4MODEF4
1741           (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1742           (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))))]
1743   "TARGET_FMA4 && TARGET_FUSED_MADD"
1744   "vfnmadd<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1745   [(set_attr "type" "ssemuladd")
1746    (set_attr "mode" "<MODE>")])
1748 ;; Floating point negative multiply and subtract.
1749 (define_insn "fma4_fnmsub<mode>4256"
1750   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1751         (minus:FMA4MODEF4
1752          (mult:FMA4MODEF4
1753           (neg:FMA4MODEF4
1754            (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x"))
1755           (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1756          (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x")))]
1757   "TARGET_FMA4 && TARGET_FUSED_MADD"
1758   "vfnmsub<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1759   [(set_attr "type" "ssemuladd")
1760    (set_attr "mode" "<MODE>")])
1762 (define_insn "fma4_fmadd<mode>4"
1763   [(set (match_operand:SSEMODEF4 0 "register_operand" "=x,x")
1764         (plus:SSEMODEF4
1765          (mult:SSEMODEF4
1766           (match_operand:SSEMODEF4 1 "nonimmediate_operand" "%x,x")
1767           (match_operand:SSEMODEF4 2 "nonimmediate_operand" "x,m"))
1768          (match_operand:SSEMODEF4 3 "nonimmediate_operand" "xm,x")))]
1769   "TARGET_FMA4 && TARGET_FUSED_MADD"
1770   "vfmadd<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1771   [(set_attr "type" "ssemuladd")
1772    (set_attr "mode" "<MODE>")])
1774 ;; For the scalar operations, use operand1 for the upper words that aren't
1775 ;; modified, so restrict the forms that are generated.
1776 ;; Scalar version of fmadd.
1777 (define_insn "fma4_vmfmadd<mode>4"
1778   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1779         (vec_merge:SSEMODEF2P
1780          (plus:SSEMODEF2P
1781           (mult:SSEMODEF2P
1782            (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
1783            (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
1784           (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
1785          (match_dup 0)
1786          (const_int 1)))]
1787   "TARGET_FMA4 && TARGET_FUSED_MADD"
1788   "vfmadd<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1789   [(set_attr "type" "ssemuladd")
1790    (set_attr "mode" "<MODE>")])
1792 ;; Floating multiply and subtract.
1793 ;; Allow two memory operands the same as fmadd.
1794 (define_insn "fma4_fmsub<mode>4"
1795   [(set (match_operand:SSEMODEF4 0 "register_operand" "=x,x")
1796         (minus:SSEMODEF4
1797          (mult:SSEMODEF4
1798           (match_operand:SSEMODEF4 1 "nonimmediate_operand" "%x,x")
1799           (match_operand:SSEMODEF4 2 "nonimmediate_operand" "x,m"))
1800          (match_operand:SSEMODEF4 3 "nonimmediate_operand" "xm,x")))]
1801   "TARGET_FMA4 && TARGET_FUSED_MADD"
1802   "vfmsub<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1803   [(set_attr "type" "ssemuladd")
1804    (set_attr "mode" "<MODE>")])
1806 ;; For the scalar operations, use operand1 for the upper words that aren't
1807 ;; modified, so restrict the forms that are generated.
1808 ;; Scalar version of fmsub.
1809 (define_insn "fma4_vmfmsub<mode>4"
1810   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1811         (vec_merge:SSEMODEF2P
1812          (minus:SSEMODEF2P
1813           (mult:SSEMODEF2P
1814            (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
1815            (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
1816           (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
1817          (match_dup 0)
1818          (const_int 1)))]
1819   "TARGET_FMA4 && TARGET_FUSED_MADD"
1820   "vfmsub<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1821   [(set_attr "type" "ssemuladd")
1822    (set_attr "mode" "<MODE>")])
1824 ;; Floating point negative multiply and add.
1825 ;; Rewrite (- (a * b) + c) into the canonical form: c - (a * b).
1826 (define_insn "fma4_fnmadd<mode>4"
1827   [(set (match_operand:SSEMODEF4 0 "register_operand" "=x,x")
1828         (minus:SSEMODEF4
1829          (match_operand:SSEMODEF4 3 "nonimmediate_operand" "xm,x")
1830          (mult:SSEMODEF4
1831           (match_operand:SSEMODEF4 1 "nonimmediate_operand" "%x,x")
1832           (match_operand:SSEMODEF4 2 "nonimmediate_operand" "x,m"))))]
1833   "TARGET_FMA4 && TARGET_FUSED_MADD"
1834   "vfnmadd<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1835   [(set_attr "type" "ssemuladd")
1836    (set_attr "mode" "<MODE>")])
1838 ;; For the scalar operations, use operand1 for the upper words that aren't
1839 ;; modified, so restrict the forms that are generated.
1840 ;; Scalar version of fnmadd.
1841 (define_insn "fma4_vmfnmadd<mode>4"
1842   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1843         (vec_merge:SSEMODEF2P
1844          (minus:SSEMODEF2P
1845           (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x")
1846           (mult:SSEMODEF2P
1847            (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
1848            (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m")))
1849          (match_dup 0)
1850          (const_int 1)))]
1851   "TARGET_FMA4 && TARGET_FUSED_MADD"
1852   "vfnmadd<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1853   [(set_attr "type" "ssemuladd")
1854    (set_attr "mode" "<MODE>")])
1856 ;; Floating point negative multiply and subtract.
1857 ;; Rewrite (- (a * b) - c) into the canonical form: ((-a) * b) - c.
1858 (define_insn "fma4_fnmsub<mode>4"
1859   [(set (match_operand:SSEMODEF4 0 "register_operand" "=x,x")
1860         (minus:SSEMODEF4
1861          (mult:SSEMODEF4
1862           (neg:SSEMODEF4
1863            (match_operand:SSEMODEF4 1 "nonimmediate_operand" "%x,x"))
1864           (match_operand:SSEMODEF4 2 "nonimmediate_operand" "x,m"))
1865          (match_operand:SSEMODEF4 3 "nonimmediate_operand" "xm,x")))]
1866   "TARGET_FMA4 && TARGET_FUSED_MADD"
1867   "vfnmsub<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1868   [(set_attr "type" "ssemuladd")
1869    (set_attr "mode" "<MODE>")])
1871 ;; For the scalar operations, use operand1 for the upper words that aren't
1872 ;; modified, so restrict the forms that are generated.
1873 ;; Scalar version of fnmsub.
1874 (define_insn "fma4_vmfnmsub<mode>4"
1875   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1876         (vec_merge:SSEMODEF2P
1877          (minus:SSEMODEF2P
1878           (mult:SSEMODEF2P
1879            (neg:SSEMODEF2P
1880             (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x"))
1881            (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
1882           (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
1883          (match_dup 0)
1884          (const_int 1)))]
1885   "TARGET_FMA4 && TARGET_FUSED_MADD"
1886   "vfnmsub<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1887   [(set_attr "type" "ssemuladd")
1888    (set_attr "mode" "<MODE>")])
1890 (define_insn "fma4i_fmadd<mode>4256"
1891   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1892         (unspec:FMA4MODEF4
1893          [(plus:FMA4MODEF4
1894            (mult:FMA4MODEF4
1895             (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1896             (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1897            (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x"))]
1898          UNSPEC_FMA4_INTRINSIC))]
1899   "TARGET_FMA4 && TARGET_FUSED_MADD"
1900   "vfmadd<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1901   [(set_attr "type" "ssemuladd")
1902    (set_attr "mode" "<MODE>")])
1904 (define_insn "fma4i_fmsub<mode>4256"
1905   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1906         (unspec:FMA4MODEF4
1907          [(minus:FMA4MODEF4
1908            (mult:FMA4MODEF4
1909             (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1910             (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1911            (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x"))]
1912          UNSPEC_FMA4_INTRINSIC))]
1913   "TARGET_FMA4 && TARGET_FUSED_MADD"
1914   "vfmsub<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1915   [(set_attr "type" "ssemuladd")
1916    (set_attr "mode" "<MODE>")])
1918 (define_insn "fma4i_fnmadd<mode>4256"
1919   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1920         (unspec:FMA4MODEF4
1921          [(minus:FMA4MODEF4
1922            (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x")
1923            (mult:FMA4MODEF4
1924             (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1925             (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m")))]
1926          UNSPEC_FMA4_INTRINSIC))]
1927   "TARGET_FMA4 && TARGET_FUSED_MADD"
1928   "vfnmadd<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1929   [(set_attr "type" "ssemuladd")
1930    (set_attr "mode" "<MODE>")])
1932 (define_insn "fma4i_fnmsub<mode>4256"
1933   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1934         (unspec:FMA4MODEF4
1935          [(minus:FMA4MODEF4
1936            (mult:FMA4MODEF4
1937             (neg:FMA4MODEF4
1938              (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x"))
1939             (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1940            (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x"))]
1941          UNSPEC_FMA4_INTRINSIC))]
1942   "TARGET_FMA4 && TARGET_FUSED_MADD"
1943   "vfnmsub<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1944   [(set_attr "type" "ssemuladd")
1945    (set_attr "mode" "<MODE>")])
1947 (define_insn "fma4i_fmadd<mode>4"
1948   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1949         (unspec:SSEMODEF2P
1950          [(plus:SSEMODEF2P
1951            (mult:SSEMODEF2P
1952             (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
1953             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
1954            (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))]
1955          UNSPEC_FMA4_INTRINSIC))]
1956   "TARGET_FMA4 && TARGET_FUSED_MADD"
1957   "vfmadd<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1958   [(set_attr "type" "ssemuladd")
1959    (set_attr "mode" "<MODE>")])
1961 (define_insn "fma4i_fmsub<mode>4"
1962   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1963         (unspec:SSEMODEF2P
1964          [(minus:SSEMODEF2P
1965            (mult:SSEMODEF2P
1966             (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
1967             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
1968            (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))]
1969          UNSPEC_FMA4_INTRINSIC))]
1970   "TARGET_FMA4 && TARGET_FUSED_MADD"
1971   "vfmsub<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1972   [(set_attr "type" "ssemuladd")
1973    (set_attr "mode" "<MODE>")])
1975 (define_insn "fma4i_fnmadd<mode>4"
1976   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1977         (unspec:SSEMODEF2P
1978          [(minus:SSEMODEF2P
1979            (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x")
1980            (mult:SSEMODEF2P
1981             (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
1982             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m")))]
1983          UNSPEC_FMA4_INTRINSIC))]
1984   "TARGET_FMA4 && TARGET_FUSED_MADD"
1985   "vfnmadd<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1986   [(set_attr "type" "ssemuladd")
1987    (set_attr "mode" "<MODE>")])
1989 (define_insn "fma4i_fnmsub<mode>4"
1990   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1991         (unspec:SSEMODEF2P
1992          [(minus:SSEMODEF2P
1993            (mult:SSEMODEF2P
1994             (neg:SSEMODEF2P
1995              (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x"))
1996             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
1997            (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))]
1998          UNSPEC_FMA4_INTRINSIC))]
1999   "TARGET_FMA4 && TARGET_FUSED_MADD"
2000   "vfnmsub<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2001   [(set_attr "type" "ssemuladd")
2002    (set_attr "mode" "<MODE>")])
2004 ;; For the scalar operations, use operand1 for the upper words that aren't
2005 ;; modified, so restrict the forms that are accepted.
2006 (define_insn "fma4i_vmfmadd<mode>4"
2007   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
2008         (unspec:SSEMODEF2P
2009          [(vec_merge:SSEMODEF2P
2010            (plus:SSEMODEF2P
2011             (mult:SSEMODEF2P
2012              (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
2013              (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
2014             (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
2015            (match_dup 0)
2016            (const_int 1))]
2017          UNSPEC_FMA4_INTRINSIC))]
2018   "TARGET_FMA4 && TARGET_FUSED_MADD"
2019   "vfmadd<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2020   [(set_attr "type" "ssemuladd")
2021    (set_attr "mode" "<ssescalarmode>")])
2023 (define_insn "fma4i_vmfmsub<mode>4"
2024   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
2025         (unspec:SSEMODEF2P
2026          [(vec_merge:SSEMODEF2P
2027            (minus:SSEMODEF2P
2028             (mult:SSEMODEF2P
2029              (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
2030              (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
2031             (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
2032            (match_dup 0)
2033            (const_int 1))]
2034          UNSPEC_FMA4_INTRINSIC))]
2035   "TARGET_FMA4 && TARGET_FUSED_MADD"
2036   "vfmsub<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2037   [(set_attr "type" "ssemuladd")
2038    (set_attr "mode" "<ssescalarmode>")])
2040 (define_insn "fma4i_vmfnmadd<mode>4"
2041   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
2042         (unspec:SSEMODEF2P
2043          [(vec_merge:SSEMODEF2P
2044            (minus:SSEMODEF2P
2045             (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x")
2046             (mult:SSEMODEF2P
2047              (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
2048              (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m")))
2049            (match_dup 0)
2050            (const_int 1))]
2051          UNSPEC_FMA4_INTRINSIC))]
2052   "TARGET_FMA4 && TARGET_FUSED_MADD"
2053   "vfnmadd<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2054   [(set_attr "type" "ssemuladd")
2055    (set_attr "mode" "<ssescalarmode>")])
2057 (define_insn "fma4i_vmfnmsub<mode>4"
2058   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
2059         (unspec:SSEMODEF2P
2060          [(vec_merge:SSEMODEF2P
2061            (minus:SSEMODEF2P
2062             (mult:SSEMODEF2P
2063              (neg:SSEMODEF2P
2064               (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x"))
2065              (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
2066             (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
2067            (match_dup 0)
2068            (const_int 1))]
2069          UNSPEC_FMA4_INTRINSIC))]
2070   "TARGET_FMA4 && TARGET_FUSED_MADD"
2071   "vfnmsub<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2072   [(set_attr "type" "ssemuladd")
2073    (set_attr "mode" "<ssescalarmode>")])
2075 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2077 ;; FMA4 Parallel floating point multiply addsub and subadd operations.
2079 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2081 (define_insn "fma4_fmaddsubv8sf4"
2082   [(set (match_operand:V8SF 0 "register_operand" "=x,x")
2083         (vec_merge:V8SF
2084           (plus:V8SF
2085             (mult:V8SF
2086               (match_operand:V8SF 1 "nonimmediate_operand" "%x,x")
2087               (match_operand:V8SF 2 "nonimmediate_operand" "x,m"))
2088             (match_operand:V8SF 3 "nonimmediate_operand" "xm,x"))
2089           (minus:V8SF
2090             (mult:V8SF
2091               (match_dup 1)
2092               (match_dup 2))
2093             (match_dup 3))
2094           (const_int 170)))]
2095   "TARGET_FMA4 && TARGET_FUSED_MADD"
2096   "vfmaddsubps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2097   [(set_attr "type" "ssemuladd")
2098    (set_attr "mode" "V8SF")])
2100 (define_insn "fma4_fmaddsubv4df4"
2101   [(set (match_operand:V4DF 0 "register_operand" "=x,x")
2102         (vec_merge:V4DF
2103           (plus:V4DF
2104             (mult:V4DF
2105               (match_operand:V4DF 1 "nonimmediate_operand" "%x,x")
2106               (match_operand:V4DF 2 "nonimmediate_operand" "x,m"))
2107             (match_operand:V4DF 3 "nonimmediate_operand" "xm,x"))
2108           (minus:V4DF
2109             (mult:V4DF
2110               (match_dup 1)
2111               (match_dup 2))
2112             (match_dup 3))
2113           (const_int 10)))]
2114   "TARGET_FMA4 && TARGET_FUSED_MADD"
2115   "vfmaddsubpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2116   [(set_attr "type" "ssemuladd")
2117    (set_attr "mode" "V4DF")])
2119 (define_insn "fma4_fmaddsubv4sf4"
2120   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2121         (vec_merge:V4SF
2122           (plus:V4SF
2123             (mult:V4SF
2124               (match_operand:V4SF 1 "nonimmediate_operand" "%x,x")
2125               (match_operand:V4SF 2 "nonimmediate_operand" "x,m"))
2126             (match_operand:V4SF 3 "nonimmediate_operand" "xm,x"))
2127           (minus:V4SF
2128             (mult:V4SF
2129               (match_dup 1)
2130               (match_dup 2))
2131             (match_dup 3))
2132           (const_int 10)))]
2133   "TARGET_FMA4 && TARGET_FUSED_MADD"
2134   "vfmaddsubps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2135   [(set_attr "type" "ssemuladd")
2136    (set_attr "mode" "V4SF")])
2138 (define_insn "fma4_fmaddsubv2df4"
2139   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2140         (vec_merge:V2DF
2141           (plus:V2DF
2142             (mult:V2DF
2143               (match_operand:V2DF 1 "nonimmediate_operand" "%x,x")
2144               (match_operand:V2DF 2 "nonimmediate_operand" "x,m"))
2145             (match_operand:V2DF 3 "nonimmediate_operand" "xm,x"))
2146           (minus:V2DF
2147             (mult:V2DF
2148               (match_dup 1)
2149               (match_dup 2))
2150             (match_dup 3))
2151           (const_int 2)))]
2152   "TARGET_FMA4 && TARGET_FUSED_MADD"
2153   "vfmaddsubpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2154   [(set_attr "type" "ssemuladd")
2155    (set_attr "mode" "V2DF")])
2157 (define_insn "fma4_fmsubaddv8sf4"
2158   [(set (match_operand:V8SF 0 "register_operand" "=x,x")
2159         (vec_merge:V8SF
2160           (plus:V8SF
2161             (mult:V8SF
2162               (match_operand:V8SF 1 "nonimmediate_operand" "%x,x")
2163               (match_operand:V8SF 2 "nonimmediate_operand" "x,m"))
2164             (match_operand:V8SF 3 "nonimmediate_operand" "xm,x"))
2165           (minus:V8SF
2166             (mult:V8SF
2167               (match_dup 1)
2168               (match_dup 2))
2169             (match_dup 3))
2170           (const_int 85)))]
2171   "TARGET_FMA4 && TARGET_FUSED_MADD"
2172   "vfmsubaddps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2173   [(set_attr "type" "ssemuladd")
2174    (set_attr "mode" "V8SF")])
2176 (define_insn "fma4_fmsubaddv4df4"
2177   [(set (match_operand:V4DF 0 "register_operand" "=x,x")
2178         (vec_merge:V4DF
2179           (plus:V4DF
2180             (mult:V4DF
2181               (match_operand:V4DF 1 "nonimmediate_operand" "%x,x")
2182               (match_operand:V4DF 2 "nonimmediate_operand" "x,m"))
2183             (match_operand:V4DF 3 "nonimmediate_operand" "xm,x"))
2184           (minus:V4DF
2185             (mult:V4DF
2186               (match_dup 1)
2187               (match_dup 2))
2188             (match_dup 3))
2189           (const_int 5)))]
2190   "TARGET_FMA4 && TARGET_FUSED_MADD"
2191   "vfmsubaddpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2192   [(set_attr "type" "ssemuladd")
2193    (set_attr "mode" "V4DF")])
2195 (define_insn "fma4_fmsubaddv4sf4"
2196   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2197         (vec_merge:V4SF
2198           (plus:V4SF
2199             (mult:V4SF
2200               (match_operand:V4SF 1 "nonimmediate_operand" "%x,x")
2201               (match_operand:V4SF 2 "nonimmediate_operand" "x,m"))
2202             (match_operand:V4SF 3 "nonimmediate_operand" "xm,x"))
2203           (minus:V4SF
2204             (mult:V4SF
2205               (match_dup 1)
2206               (match_dup 2))
2207             (match_dup 3))
2208           (const_int 5)))]
2209   "TARGET_FMA4 && TARGET_FUSED_MADD"
2210   "vfmsubaddps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2211   [(set_attr "type" "ssemuladd")
2212    (set_attr "mode" "V4SF")])
2214 (define_insn "fma4_fmsubaddv2df4"
2215   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2216         (vec_merge:V2DF
2217           (plus:V2DF
2218             (mult:V2DF
2219               (match_operand:V2DF 1 "nonimmediate_operand" "%x,x")
2220               (match_operand:V2DF 2 "nonimmediate_operand" "x,m"))
2221             (match_operand:V2DF 3 "nonimmediate_operand" "xm,x"))
2222           (minus:V2DF
2223             (mult:V2DF
2224               (match_dup 1)
2225               (match_dup 2))
2226             (match_dup 3))
2227           (const_int 1)))]
2228   "TARGET_FMA4 && TARGET_FUSED_MADD"
2229   "vfmsubaddpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2230   [(set_attr "type" "ssemuladd")
2231    (set_attr "mode" "V2DF")])
2233 (define_insn "fma4i_fmaddsubv8sf4"
2234   [(set (match_operand:V8SF 0 "register_operand" "=x,x")
2235         (unspec:V8SF
2236          [(vec_merge:V8SF
2237            (plus:V8SF
2238              (mult:V8SF
2239                (match_operand:V8SF 1 "nonimmediate_operand" "%x,x")
2240                (match_operand:V8SF 2 "nonimmediate_operand" "x,m"))
2241              (match_operand:V8SF 3 "nonimmediate_operand" "xm,x"))
2242            (minus:V8SF
2243              (mult:V8SF
2244                (match_dup 1)
2245                (match_dup 2))
2246              (match_dup 3))
2247            (const_int 170))]
2248          UNSPEC_FMA4_INTRINSIC))]
2249   "TARGET_FMA4 && TARGET_FUSED_MADD"
2250   "vfmaddsubps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2251   [(set_attr "type" "ssemuladd")
2252    (set_attr "mode" "V8SF")])
2254 (define_insn "fma4i_fmaddsubv4df4"
2255   [(set (match_operand:V4DF 0 "register_operand" "=x,x")
2256         (unspec:V4DF
2257          [(vec_merge:V4DF
2258            (plus:V4DF
2259              (mult:V4DF
2260                (match_operand:V4DF 1 "nonimmediate_operand" "%x,x")
2261                (match_operand:V4DF 2 "nonimmediate_operand" "x,m"))
2262              (match_operand:V4DF 3 "nonimmediate_operand" "xm,x"))
2263            (minus:V4DF
2264              (mult:V4DF
2265                (match_dup 1)
2266                (match_dup 2))
2267              (match_dup 3))
2268            (const_int 10))]
2269          UNSPEC_FMA4_INTRINSIC))]
2270   "TARGET_FMA4 && TARGET_FUSED_MADD"
2271   "vfmaddsubpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2272   [(set_attr "type" "ssemuladd")
2273    (set_attr "mode" "V4DF")])
2275 (define_insn "fma4i_fmaddsubv4sf4"
2276   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2277         (unspec:V4SF
2278          [(vec_merge:V4SF
2279            (plus:V4SF
2280              (mult:V4SF
2281                (match_operand:V4SF 1 "nonimmediate_operand" "%x,x")
2282                (match_operand:V4SF 2 "nonimmediate_operand" "x,m"))
2283              (match_operand:V4SF 3 "nonimmediate_operand" "xm,x"))
2284            (minus:V4SF
2285              (mult:V4SF
2286                (match_dup 1)
2287                (match_dup 2))
2288              (match_dup 3))
2289            (const_int 10))]
2290          UNSPEC_FMA4_INTRINSIC))]
2291   "TARGET_FMA4 && TARGET_FUSED_MADD"
2292   "vfmaddsubps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2293   [(set_attr "type" "ssemuladd")
2294    (set_attr "mode" "V4SF")])
2296 (define_insn "fma4i_fmaddsubv2df4"
2297   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2298         (unspec:V2DF
2299          [(vec_merge:V2DF
2300            (plus:V2DF
2301              (mult:V2DF
2302                (match_operand:V2DF 1 "nonimmediate_operand" "%x,x")
2303                (match_operand:V2DF 2 "nonimmediate_operand" "x,m"))
2304              (match_operand:V2DF 3 "nonimmediate_operand" "xm,x"))
2305            (minus:V2DF
2306              (mult:V2DF
2307                (match_dup 1)
2308                (match_dup 2))
2309              (match_dup 3))
2310            (const_int 2))]
2311          UNSPEC_FMA4_INTRINSIC))]
2312   "TARGET_FMA4 && TARGET_FUSED_MADD"
2313   "vfmaddsubpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2314   [(set_attr "type" "ssemuladd")
2315    (set_attr "mode" "V2DF")])
2317 (define_insn "fma4i_fmsubaddv8sf4"
2318   [(set (match_operand:V8SF 0 "register_operand" "=x,x")
2319         (unspec:V8SF
2320          [(vec_merge:V8SF
2321            (plus:V8SF
2322              (mult:V8SF
2323                (match_operand:V8SF 1 "nonimmediate_operand" "%x,x")
2324                (match_operand:V8SF 2 "nonimmediate_operand" "x,m"))
2325              (match_operand:V8SF 3 "nonimmediate_operand" "xm,x"))
2326            (minus:V8SF
2327              (mult:V8SF
2328                (match_dup 1)
2329                (match_dup 2))
2330              (match_dup 3))
2331            (const_int 85))]
2332          UNSPEC_FMA4_INTRINSIC))]
2333   "TARGET_FMA4 && TARGET_FUSED_MADD"
2334   "vfmsubaddps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2335   [(set_attr "type" "ssemuladd")
2336    (set_attr "mode" "V8SF")])
2338 (define_insn "fma4i_fmsubaddv4df4"
2339   [(set (match_operand:V4DF 0 "register_operand" "=x,x")
2340         (unspec:V4DF
2341          [(vec_merge:V4DF
2342            (plus:V4DF
2343              (mult:V4DF
2344                (match_operand:V4DF 1 "nonimmediate_operand" "%x,x")
2345                (match_operand:V4DF 2 "nonimmediate_operand" "x,m"))
2346              (match_operand:V4DF 3 "nonimmediate_operand" "xm,x"))
2347            (minus:V4DF
2348              (mult:V4DF
2349                (match_dup 1)
2350                (match_dup 2))
2351              (match_dup 3))
2352            (const_int 5))]
2353          UNSPEC_FMA4_INTRINSIC))]
2354   "TARGET_FMA4 && TARGET_FUSED_MADD"
2355   "vfmsubaddpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2356   [(set_attr "type" "ssemuladd")
2357    (set_attr "mode" "V4DF")])
2359 (define_insn "fma4i_fmsubaddv4sf4"
2360   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2361         (unspec:V4SF
2362          [(vec_merge:V4SF
2363            (plus:V4SF
2364              (mult:V4SF
2365                (match_operand:V4SF 1 "nonimmediate_operand" "%x,x")
2366                (match_operand:V4SF 2 "nonimmediate_operand" "x,m"))
2367              (match_operand:V4SF 3 "nonimmediate_operand" "xm,x"))
2368            (minus:V4SF
2369              (mult:V4SF
2370                (match_dup 1)
2371                (match_dup 2))
2372              (match_dup 3))
2373            (const_int 5))]
2374          UNSPEC_FMA4_INTRINSIC))]
2375   "TARGET_FMA4 && TARGET_FUSED_MADD"
2376   "vfmsubaddps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2377   [(set_attr "type" "ssemuladd")
2378    (set_attr "mode" "V4SF")])
2380 (define_insn "fma4i_fmsubaddv2df4"
2381   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2382         (unspec:V2DF
2383          [(vec_merge:V2DF
2384            (plus:V2DF
2385              (mult:V2DF
2386                (match_operand:V2DF 1 "nonimmediate_operand" "%x,x")
2387                (match_operand:V2DF 2 "nonimmediate_operand" "x,m"))
2388              (match_operand:V2DF 3 "nonimmediate_operand" "xm,x"))
2389            (minus:V2DF
2390              (mult:V2DF
2391                (match_dup 1)
2392                (match_dup 2))
2393              (match_dup 3))
2394            (const_int 1))]
2395          UNSPEC_FMA4_INTRINSIC))]
2396   "TARGET_FMA4 && TARGET_FUSED_MADD"
2397   "vfmsubaddpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2398   [(set_attr "type" "ssemuladd")
2399    (set_attr "mode" "V2DF")])
2401 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2403 ;; Parallel single-precision floating point conversion operations
2405 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2407 (define_insn "sse_cvtpi2ps"
2408   [(set (match_operand:V4SF 0 "register_operand" "=x")
2409         (vec_merge:V4SF
2410           (vec_duplicate:V4SF
2411             (float:V2SF (match_operand:V2SI 2 "nonimmediate_operand" "ym")))
2412           (match_operand:V4SF 1 "register_operand" "0")
2413           (const_int 3)))]
2414   "TARGET_SSE"
2415   "cvtpi2ps\t{%2, %0|%0, %2}"
2416   [(set_attr "type" "ssecvt")
2417    (set_attr "mode" "V4SF")])
2419 (define_insn "sse_cvtps2pi"
2420   [(set (match_operand:V2SI 0 "register_operand" "=y")
2421         (vec_select:V2SI
2422           (unspec:V4SI [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
2423                        UNSPEC_FIX_NOTRUNC)
2424           (parallel [(const_int 0) (const_int 1)])))]
2425   "TARGET_SSE"
2426   "cvtps2pi\t{%1, %0|%0, %1}"
2427   [(set_attr "type" "ssecvt")
2428    (set_attr "unit" "mmx")
2429    (set_attr "mode" "DI")])
2431 (define_insn "sse_cvttps2pi"
2432   [(set (match_operand:V2SI 0 "register_operand" "=y")
2433         (vec_select:V2SI
2434           (fix:V4SI (match_operand:V4SF 1 "nonimmediate_operand" "xm"))
2435           (parallel [(const_int 0) (const_int 1)])))]
2436   "TARGET_SSE"
2437   "cvttps2pi\t{%1, %0|%0, %1}"
2438   [(set_attr "type" "ssecvt")
2439    (set_attr "unit" "mmx")
2440    (set_attr "prefix_rep" "0")
2441    (set_attr "mode" "SF")])
2443 (define_insn "*avx_cvtsi2ss"
2444   [(set (match_operand:V4SF 0 "register_operand" "=x")
2445         (vec_merge:V4SF
2446           (vec_duplicate:V4SF
2447             (float:SF (match_operand:SI 2 "nonimmediate_operand" "rm")))
2448           (match_operand:V4SF 1 "register_operand" "x")
2449           (const_int 1)))]
2450   "TARGET_AVX"
2451   "vcvtsi2ss\t{%2, %1, %0|%0, %1, %2}"
2452   [(set_attr "type" "sseicvt")
2453    (set_attr "prefix" "vex")
2454    (set_attr "mode" "SF")])
2456 (define_insn "sse_cvtsi2ss"
2457   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2458         (vec_merge:V4SF
2459           (vec_duplicate:V4SF
2460             (float:SF (match_operand:SI 2 "nonimmediate_operand" "r,m")))
2461           (match_operand:V4SF 1 "register_operand" "0,0")
2462           (const_int 1)))]
2463   "TARGET_SSE"
2464   "cvtsi2ss\t{%2, %0|%0, %2}"
2465   [(set_attr "type" "sseicvt")
2466    (set_attr "athlon_decode" "vector,double")
2467    (set_attr "amdfam10_decode" "vector,double")
2468    (set_attr "mode" "SF")])
2470 (define_insn "*avx_cvtsi2ssq"
2471   [(set (match_operand:V4SF 0 "register_operand" "=x")
2472         (vec_merge:V4SF
2473           (vec_duplicate:V4SF
2474             (float:SF (match_operand:DI 2 "nonimmediate_operand" "rm")))
2475           (match_operand:V4SF 1 "register_operand" "x")
2476           (const_int 1)))]
2477   "TARGET_AVX && TARGET_64BIT"
2478   "vcvtsi2ssq\t{%2, %1, %0|%0, %1, %2}"
2479   [(set_attr "type" "sseicvt")
2480    (set_attr "length_vex" "4")
2481    (set_attr "prefix" "vex")
2482    (set_attr "mode" "SF")])
2484 (define_insn "sse_cvtsi2ssq"
2485   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2486         (vec_merge:V4SF
2487           (vec_duplicate:V4SF
2488             (float:SF (match_operand:DI 2 "nonimmediate_operand" "r,rm")))
2489           (match_operand:V4SF 1 "register_operand" "0,0")
2490           (const_int 1)))]
2491   "TARGET_SSE && TARGET_64BIT"
2492   "cvtsi2ssq\t{%2, %0|%0, %2}"
2493   [(set_attr "type" "sseicvt")
2494    (set_attr "prefix_rex" "1")
2495    (set_attr "athlon_decode" "vector,double")
2496    (set_attr "amdfam10_decode" "vector,double")
2497    (set_attr "mode" "SF")])
2499 (define_insn "sse_cvtss2si"
2500   [(set (match_operand:SI 0 "register_operand" "=r,r")
2501         (unspec:SI
2502           [(vec_select:SF
2503              (match_operand:V4SF 1 "nonimmediate_operand" "x,m")
2504              (parallel [(const_int 0)]))]
2505           UNSPEC_FIX_NOTRUNC))]
2506   "TARGET_SSE"
2507   "%vcvtss2si\t{%1, %0|%0, %1}"
2508   [(set_attr "type" "sseicvt")
2509    (set_attr "athlon_decode" "double,vector")
2510    (set_attr "prefix_rep" "1")
2511    (set_attr "prefix" "maybe_vex")
2512    (set_attr "mode" "SI")])
2514 (define_insn "sse_cvtss2si_2"
2515   [(set (match_operand:SI 0 "register_operand" "=r,r")
2516         (unspec:SI [(match_operand:SF 1 "nonimmediate_operand" "x,m")]
2517                    UNSPEC_FIX_NOTRUNC))]
2518   "TARGET_SSE"
2519   "%vcvtss2si\t{%1, %0|%0, %1}"
2520   [(set_attr "type" "sseicvt")
2521    (set_attr "athlon_decode" "double,vector")
2522    (set_attr "amdfam10_decode" "double,double")
2523    (set_attr "prefix_rep" "1")
2524    (set_attr "prefix" "maybe_vex")
2525    (set_attr "mode" "SI")])
2527 (define_insn "sse_cvtss2siq"
2528   [(set (match_operand:DI 0 "register_operand" "=r,r")
2529         (unspec:DI
2530           [(vec_select:SF
2531              (match_operand:V4SF 1 "nonimmediate_operand" "x,m")
2532              (parallel [(const_int 0)]))]
2533           UNSPEC_FIX_NOTRUNC))]
2534   "TARGET_SSE && TARGET_64BIT"
2535   "%vcvtss2si{q}\t{%1, %0|%0, %1}"
2536   [(set_attr "type" "sseicvt")
2537    (set_attr "athlon_decode" "double,vector")
2538    (set_attr "prefix_rep" "1")
2539    (set_attr "prefix" "maybe_vex")
2540    (set_attr "mode" "DI")])
2542 (define_insn "sse_cvtss2siq_2"
2543   [(set (match_operand:DI 0 "register_operand" "=r,r")
2544         (unspec:DI [(match_operand:SF 1 "nonimmediate_operand" "x,m")]
2545                    UNSPEC_FIX_NOTRUNC))]
2546   "TARGET_SSE && TARGET_64BIT"
2547   "%vcvtss2si{q}\t{%1, %0|%0, %1}"
2548   [(set_attr "type" "sseicvt")
2549    (set_attr "athlon_decode" "double,vector")
2550    (set_attr "amdfam10_decode" "double,double")
2551    (set_attr "prefix_rep" "1")
2552    (set_attr "prefix" "maybe_vex")
2553    (set_attr "mode" "DI")])
2555 (define_insn "sse_cvttss2si"
2556   [(set (match_operand:SI 0 "register_operand" "=r,r")
2557         (fix:SI
2558           (vec_select:SF
2559             (match_operand:V4SF 1 "nonimmediate_operand" "x,m")
2560             (parallel [(const_int 0)]))))]
2561   "TARGET_SSE"
2562   "%vcvttss2si\t{%1, %0|%0, %1}"
2563   [(set_attr "type" "sseicvt")
2564    (set_attr "athlon_decode" "double,vector")
2565    (set_attr "amdfam10_decode" "double,double")
2566    (set_attr "prefix_rep" "1")
2567    (set_attr "prefix" "maybe_vex")
2568    (set_attr "mode" "SI")])
2570 (define_insn "sse_cvttss2siq"
2571   [(set (match_operand:DI 0 "register_operand" "=r,r")
2572         (fix:DI
2573           (vec_select:SF
2574             (match_operand:V4SF 1 "nonimmediate_operand" "x,m")
2575             (parallel [(const_int 0)]))))]
2576   "TARGET_SSE && TARGET_64BIT"
2577   "%vcvttss2si{q}\t{%1, %0|%0, %1}"
2578   [(set_attr "type" "sseicvt")
2579    (set_attr "athlon_decode" "double,vector")
2580    (set_attr "amdfam10_decode" "double,double")
2581    (set_attr "prefix_rep" "1")
2582    (set_attr "prefix" "maybe_vex")
2583    (set_attr "mode" "DI")])
2585 (define_insn "avx_cvtdq2ps<avxmodesuffix>"
2586   [(set (match_operand:AVXMODEDCVTDQ2PS 0 "register_operand" "=x")
2587         (float:AVXMODEDCVTDQ2PS
2588           (match_operand:<avxcvtvecmode> 1 "nonimmediate_operand" "xm")))]
2589   "TARGET_AVX"
2590   "vcvtdq2ps\t{%1, %0|%0, %1}"
2591   [(set_attr "type" "ssecvt")
2592    (set_attr "prefix" "vex")
2593    (set_attr "mode" "<avxvecmode>")])
2595 (define_insn "sse2_cvtdq2ps"
2596   [(set (match_operand:V4SF 0 "register_operand" "=x")
2597         (float:V4SF (match_operand:V4SI 1 "nonimmediate_operand" "xm")))]
2598   "TARGET_SSE2"
2599   "cvtdq2ps\t{%1, %0|%0, %1}"
2600   [(set_attr "type" "ssecvt")
2601    (set_attr "mode" "V4SF")])
2603 (define_expand "sse2_cvtudq2ps"
2604   [(set (match_dup 5)
2605         (float:V4SF (match_operand:V4SI 1 "nonimmediate_operand" "")))
2606    (set (match_dup 6)
2607         (lt:V4SF (match_dup 5) (match_dup 3)))
2608    (set (match_dup 7)
2609         (and:V4SF (match_dup 6) (match_dup 4)))
2610    (set (match_operand:V4SF 0 "register_operand" "")
2611         (plus:V4SF (match_dup 5) (match_dup 7)))]
2612   "TARGET_SSE2"
2614   REAL_VALUE_TYPE TWO32r;
2615   rtx x;
2616   int i;
2618   real_ldexp (&TWO32r, &dconst1, 32);
2619   x = const_double_from_real_value (TWO32r, SFmode);
2621   operands[3] = force_reg (V4SFmode, CONST0_RTX (V4SFmode));
2622   operands[4] = force_reg (V4SFmode, ix86_build_const_vector (SFmode, 1, x));
2624   for (i = 5; i < 8; i++)
2625     operands[i] = gen_reg_rtx (V4SFmode);
2628 (define_insn "avx_cvtps2dq<avxmodesuffix>"
2629   [(set (match_operand:AVXMODEDCVTPS2DQ 0 "register_operand" "=x")
2630         (unspec:AVXMODEDCVTPS2DQ
2631           [(match_operand:<avxcvtvecmode> 1 "nonimmediate_operand" "xm")]
2632           UNSPEC_FIX_NOTRUNC))]
2633   "TARGET_AVX"
2634   "vcvtps2dq\t{%1, %0|%0, %1}"
2635   [(set_attr "type" "ssecvt")
2636    (set_attr "prefix" "vex")
2637    (set_attr "mode" "<avxvecmode>")])
2639 (define_insn "sse2_cvtps2dq"
2640   [(set (match_operand:V4SI 0 "register_operand" "=x")
2641         (unspec:V4SI [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
2642                      UNSPEC_FIX_NOTRUNC))]
2643   "TARGET_SSE2"
2644   "cvtps2dq\t{%1, %0|%0, %1}"
2645   [(set_attr "type" "ssecvt")
2646    (set_attr "prefix_data16" "1")
2647    (set_attr "mode" "TI")])
2649 (define_insn "avx_cvttps2dq<avxmodesuffix>"
2650   [(set (match_operand:AVXMODEDCVTPS2DQ 0 "register_operand" "=x")
2651         (fix:AVXMODEDCVTPS2DQ
2652           (match_operand:<avxcvtvecmode> 1 "nonimmediate_operand" "xm")))]
2653   "TARGET_AVX"
2654   "vcvttps2dq\t{%1, %0|%0, %1}"
2655   [(set_attr "type" "ssecvt")
2656    (set_attr "prefix" "vex")
2657    (set_attr "mode" "<avxvecmode>")])
2659 (define_insn "sse2_cvttps2dq"
2660   [(set (match_operand:V4SI 0 "register_operand" "=x")
2661         (fix:V4SI (match_operand:V4SF 1 "nonimmediate_operand" "xm")))]
2662   "TARGET_SSE2"
2663   "cvttps2dq\t{%1, %0|%0, %1}"
2664   [(set_attr "type" "ssecvt")
2665    (set_attr "prefix_rep" "1")
2666    (set_attr "prefix_data16" "0")
2667    (set_attr "mode" "TI")])
2669 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2671 ;; Parallel double-precision floating point conversion operations
2673 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2675 (define_insn "sse2_cvtpi2pd"
2676   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2677         (float:V2DF (match_operand:V2SI 1 "nonimmediate_operand" "y,m")))]
2678   "TARGET_SSE2"
2679   "cvtpi2pd\t{%1, %0|%0, %1}"
2680   [(set_attr "type" "ssecvt")
2681    (set_attr "unit" "mmx,*")
2682    (set_attr "prefix_data16" "1,*")
2683    (set_attr "mode" "V2DF")])
2685 (define_insn "sse2_cvtpd2pi"
2686   [(set (match_operand:V2SI 0 "register_operand" "=y")
2687         (unspec:V2SI [(match_operand:V2DF 1 "nonimmediate_operand" "xm")]
2688                      UNSPEC_FIX_NOTRUNC))]
2689   "TARGET_SSE2"
2690   "cvtpd2pi\t{%1, %0|%0, %1}"
2691   [(set_attr "type" "ssecvt")
2692    (set_attr "unit" "mmx")
2693    (set_attr "prefix_data16" "1")
2694    (set_attr "mode" "DI")])
2696 (define_insn "sse2_cvttpd2pi"
2697   [(set (match_operand:V2SI 0 "register_operand" "=y")
2698         (fix:V2SI (match_operand:V2DF 1 "nonimmediate_operand" "xm")))]
2699   "TARGET_SSE2"
2700   "cvttpd2pi\t{%1, %0|%0, %1}"
2701   [(set_attr "type" "ssecvt")
2702    (set_attr "unit" "mmx")
2703    (set_attr "prefix_data16" "1")
2704    (set_attr "mode" "TI")])
2706 (define_insn "*avx_cvtsi2sd"
2707   [(set (match_operand:V2DF 0 "register_operand" "=x")
2708         (vec_merge:V2DF
2709           (vec_duplicate:V2DF
2710             (float:DF (match_operand:SI 2 "nonimmediate_operand" "rm")))
2711           (match_operand:V2DF 1 "register_operand" "x")
2712           (const_int 1)))]
2713   "TARGET_AVX"
2714   "vcvtsi2sd\t{%2, %1, %0|%0, %1, %2}"
2715   [(set_attr "type" "sseicvt")
2716    (set_attr "prefix" "vex")
2717    (set_attr "mode" "DF")])
2719 (define_insn "sse2_cvtsi2sd"
2720   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2721         (vec_merge:V2DF
2722           (vec_duplicate:V2DF
2723             (float:DF (match_operand:SI 2 "nonimmediate_operand" "r,m")))
2724           (match_operand:V2DF 1 "register_operand" "0,0")
2725           (const_int 1)))]
2726   "TARGET_SSE2"
2727   "cvtsi2sd\t{%2, %0|%0, %2}"
2728   [(set_attr "type" "sseicvt")
2729    (set_attr "mode" "DF")
2730    (set_attr "athlon_decode" "double,direct")
2731    (set_attr "amdfam10_decode" "vector,double")])
2733 (define_insn "*avx_cvtsi2sdq"
2734   [(set (match_operand:V2DF 0 "register_operand" "=x")
2735         (vec_merge:V2DF
2736           (vec_duplicate:V2DF
2737             (float:DF (match_operand:DI 2 "nonimmediate_operand" "rm")))
2738           (match_operand:V2DF 1 "register_operand" "x")
2739           (const_int 1)))]
2740   "TARGET_AVX && TARGET_64BIT"
2741   "vcvtsi2sdq\t{%2, %1, %0|%0, %1, %2}"
2742   [(set_attr "type" "sseicvt")
2743    (set_attr "length_vex" "4")
2744    (set_attr "prefix" "vex")
2745    (set_attr "mode" "DF")])
2747 (define_insn "sse2_cvtsi2sdq"
2748   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2749         (vec_merge:V2DF
2750           (vec_duplicate:V2DF
2751             (float:DF (match_operand:DI 2 "nonimmediate_operand" "r,m")))
2752           (match_operand:V2DF 1 "register_operand" "0,0")
2753           (const_int 1)))]
2754   "TARGET_SSE2 && TARGET_64BIT"
2755   "cvtsi2sdq\t{%2, %0|%0, %2}"
2756   [(set_attr "type" "sseicvt")
2757    (set_attr "prefix_rex" "1")
2758    (set_attr "mode" "DF")
2759    (set_attr "athlon_decode" "double,direct")
2760    (set_attr "amdfam10_decode" "vector,double")])
2762 (define_insn "sse2_cvtsd2si"
2763   [(set (match_operand:SI 0 "register_operand" "=r,r")
2764         (unspec:SI
2765           [(vec_select:DF
2766              (match_operand:V2DF 1 "nonimmediate_operand" "x,m")
2767              (parallel [(const_int 0)]))]
2768           UNSPEC_FIX_NOTRUNC))]
2769   "TARGET_SSE2"
2770   "%vcvtsd2si\t{%1, %0|%0, %1}"
2771   [(set_attr "type" "sseicvt")
2772    (set_attr "athlon_decode" "double,vector")
2773    (set_attr "prefix_rep" "1")
2774    (set_attr "prefix" "maybe_vex")
2775    (set_attr "mode" "SI")])
2777 (define_insn "sse2_cvtsd2si_2"
2778   [(set (match_operand:SI 0 "register_operand" "=r,r")
2779         (unspec:SI [(match_operand:DF 1 "nonimmediate_operand" "x,m")]
2780                    UNSPEC_FIX_NOTRUNC))]
2781   "TARGET_SSE2"
2782   "%vcvtsd2si\t{%1, %0|%0, %1}"
2783   [(set_attr "type" "sseicvt")
2784    (set_attr "athlon_decode" "double,vector")
2785    (set_attr "amdfam10_decode" "double,double")
2786    (set_attr "prefix_rep" "1")
2787    (set_attr "prefix" "maybe_vex")
2788    (set_attr "mode" "SI")])
2790 (define_insn "sse2_cvtsd2siq"
2791   [(set (match_operand:DI 0 "register_operand" "=r,r")
2792         (unspec:DI
2793           [(vec_select:DF
2794              (match_operand:V2DF 1 "nonimmediate_operand" "x,m")
2795              (parallel [(const_int 0)]))]
2796           UNSPEC_FIX_NOTRUNC))]
2797   "TARGET_SSE2 && TARGET_64BIT"
2798   "%vcvtsd2siq\t{%1, %0|%0, %1}"
2799   [(set_attr "type" "sseicvt")
2800    (set_attr "athlon_decode" "double,vector")
2801    (set_attr "prefix_rep" "1")
2802    (set_attr "prefix" "maybe_vex")
2803    (set_attr "mode" "DI")])
2805 (define_insn "sse2_cvtsd2siq_2"
2806   [(set (match_operand:DI 0 "register_operand" "=r,r")
2807         (unspec:DI [(match_operand:DF 1 "nonimmediate_operand" "x,m")]
2808                    UNSPEC_FIX_NOTRUNC))]
2809   "TARGET_SSE2 && TARGET_64BIT"
2810   "%vcvtsd2siq\t{%1, %0|%0, %1}"
2811   [(set_attr "type" "sseicvt")
2812    (set_attr "athlon_decode" "double,vector")
2813    (set_attr "amdfam10_decode" "double,double")
2814    (set_attr "prefix_rep" "1")
2815    (set_attr "prefix" "maybe_vex")
2816    (set_attr "mode" "DI")])
2818 (define_insn "sse2_cvttsd2si"
2819   [(set (match_operand:SI 0 "register_operand" "=r,r")
2820         (fix:SI
2821           (vec_select:DF
2822             (match_operand:V2DF 1 "nonimmediate_operand" "x,m")
2823             (parallel [(const_int 0)]))))]
2824   "TARGET_SSE2"
2825   "%vcvttsd2si\t{%1, %0|%0, %1}"
2826   [(set_attr "type" "sseicvt")
2827    (set_attr "prefix_rep" "1")
2828    (set_attr "prefix" "maybe_vex")
2829    (set_attr "mode" "SI")
2830    (set_attr "athlon_decode" "double,vector")
2831    (set_attr "amdfam10_decode" "double,double")])
2833 (define_insn "sse2_cvttsd2siq"
2834   [(set (match_operand:DI 0 "register_operand" "=r,r")
2835         (fix:DI
2836           (vec_select:DF
2837             (match_operand:V2DF 1 "nonimmediate_operand" "x,m")
2838             (parallel [(const_int 0)]))))]
2839   "TARGET_SSE2 && TARGET_64BIT"
2840   "%vcvttsd2siq\t{%1, %0|%0, %1}"
2841   [(set_attr "type" "sseicvt")
2842    (set_attr "prefix_rep" "1")
2843    (set_attr "prefix" "maybe_vex")
2844    (set_attr "mode" "DI")
2845    (set_attr "athlon_decode" "double,vector")
2846    (set_attr "amdfam10_decode" "double,double")])
2848 (define_insn "avx_cvtdq2pd256"
2849   [(set (match_operand:V4DF 0 "register_operand" "=x")
2850         (float:V4DF (match_operand:V4SI 1 "nonimmediate_operand" "xm")))]
2851   "TARGET_AVX"
2852   "vcvtdq2pd\t{%1, %0|%0, %1}"
2853   [(set_attr "type" "ssecvt")
2854    (set_attr "prefix" "vex")
2855    (set_attr "mode" "V4DF")])
2857 (define_insn "sse2_cvtdq2pd"
2858   [(set (match_operand:V2DF 0 "register_operand" "=x")
2859         (float:V2DF
2860           (vec_select:V2SI
2861             (match_operand:V4SI 1 "nonimmediate_operand" "xm")
2862             (parallel [(const_int 0) (const_int 1)]))))]
2863   "TARGET_SSE2"
2864   "%vcvtdq2pd\t{%1, %0|%0, %1}"
2865   [(set_attr "type" "ssecvt")
2866    (set_attr "prefix" "maybe_vex")
2867    (set_attr "mode" "V2DF")])
2869 (define_insn "avx_cvtpd2dq256"
2870   [(set (match_operand:V4SI 0 "register_operand" "=x")
2871         (unspec:V4SI [(match_operand:V4DF 1 "nonimmediate_operand" "xm")]
2872                      UNSPEC_FIX_NOTRUNC))]
2873   "TARGET_AVX"
2874   "vcvtpd2dq{y}\t{%1, %0|%0, %1}"
2875   [(set_attr "type" "ssecvt")
2876    (set_attr "prefix" "vex")
2877    (set_attr "mode" "OI")])
2879 (define_expand "sse2_cvtpd2dq"
2880   [(set (match_operand:V4SI 0 "register_operand" "")
2881         (vec_concat:V4SI
2882           (unspec:V2SI [(match_operand:V2DF 1 "nonimmediate_operand" "")]
2883                        UNSPEC_FIX_NOTRUNC)
2884           (match_dup 2)))]
2885   "TARGET_SSE2"
2886   "operands[2] = CONST0_RTX (V2SImode);")
2888 (define_insn "*sse2_cvtpd2dq"
2889   [(set (match_operand:V4SI 0 "register_operand" "=x")
2890         (vec_concat:V4SI
2891           (unspec:V2SI [(match_operand:V2DF 1 "nonimmediate_operand" "xm")]
2892                        UNSPEC_FIX_NOTRUNC)
2893           (match_operand:V2SI 2 "const0_operand" "")))]
2894   "TARGET_SSE2"
2895   "* return TARGET_AVX ? \"vcvtpd2dq{x}\t{%1, %0|%0, %1}\"
2896                        : \"cvtpd2dq\t{%1, %0|%0, %1}\";"
2897   [(set_attr "type" "ssecvt")
2898    (set_attr "prefix_rep" "1")
2899    (set_attr "prefix_data16" "0")
2900    (set_attr "prefix" "maybe_vex")
2901    (set_attr "mode" "TI")
2902    (set_attr "amdfam10_decode" "double")])
2904 (define_insn "avx_cvttpd2dq256"
2905   [(set (match_operand:V4SI 0 "register_operand" "=x")
2906         (fix:V4SI (match_operand:V4DF 1 "nonimmediate_operand" "xm")))]
2907   "TARGET_AVX"
2908   "vcvttpd2dq{y}\t{%1, %0|%0, %1}"
2909   [(set_attr "type" "ssecvt")
2910    (set_attr "prefix" "vex")
2911    (set_attr "mode" "OI")])
2913 (define_expand "sse2_cvttpd2dq"
2914   [(set (match_operand:V4SI 0 "register_operand" "")
2915         (vec_concat:V4SI
2916           (fix:V2SI (match_operand:V2DF 1 "nonimmediate_operand" ""))
2917           (match_dup 2)))]
2918   "TARGET_SSE2"
2919   "operands[2] = CONST0_RTX (V2SImode);")
2921 (define_insn "*sse2_cvttpd2dq"
2922   [(set (match_operand:V4SI 0 "register_operand" "=x")
2923         (vec_concat:V4SI
2924           (fix:V2SI (match_operand:V2DF 1 "nonimmediate_operand" "xm"))
2925           (match_operand:V2SI 2 "const0_operand" "")))]
2926   "TARGET_SSE2"
2927   "* return TARGET_AVX ? \"vcvttpd2dq{x}\t{%1, %0|%0, %1}\"
2928                        : \"cvttpd2dq\t{%1, %0|%0, %1}\";"
2929   [(set_attr "type" "ssecvt")
2930    (set_attr "prefix" "maybe_vex")
2931    (set_attr "mode" "TI")
2932    (set_attr "amdfam10_decode" "double")])
2934 (define_insn "*avx_cvtsd2ss"
2935   [(set (match_operand:V4SF 0 "register_operand" "=x")
2936         (vec_merge:V4SF
2937           (vec_duplicate:V4SF
2938             (float_truncate:V2SF
2939               (match_operand:V2DF 2 "nonimmediate_operand" "xm")))
2940           (match_operand:V4SF 1 "register_operand" "x")
2941           (const_int 1)))]
2942   "TARGET_AVX"
2943   "vcvtsd2ss\t{%2, %1, %0|%0, %1, %2}"
2944   [(set_attr "type" "ssecvt")
2945    (set_attr "prefix" "vex")
2946    (set_attr "mode" "SF")])
2948 (define_insn "sse2_cvtsd2ss"
2949   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2950         (vec_merge:V4SF
2951           (vec_duplicate:V4SF
2952             (float_truncate:V2SF
2953               (match_operand:V2DF 2 "nonimmediate_operand" "x,m")))
2954           (match_operand:V4SF 1 "register_operand" "0,0")
2955           (const_int 1)))]
2956   "TARGET_SSE2"
2957   "cvtsd2ss\t{%2, %0|%0, %2}"
2958   [(set_attr "type" "ssecvt")
2959    (set_attr "athlon_decode" "vector,double")
2960    (set_attr "amdfam10_decode" "vector,double")
2961    (set_attr "mode" "SF")])
2963 (define_insn "*avx_cvtss2sd"
2964   [(set (match_operand:V2DF 0 "register_operand" "=x")
2965         (vec_merge:V2DF
2966           (float_extend:V2DF
2967             (vec_select:V2SF
2968               (match_operand:V4SF 2 "nonimmediate_operand" "xm")
2969               (parallel [(const_int 0) (const_int 1)])))
2970           (match_operand:V2DF 1 "register_operand" "x")
2971           (const_int 1)))]
2972   "TARGET_AVX"
2973   "vcvtss2sd\t{%2, %1, %0|%0, %1, %2}"
2974   [(set_attr "type" "ssecvt")
2975    (set_attr "prefix" "vex")
2976    (set_attr "mode" "DF")])
2978 (define_insn "sse2_cvtss2sd"
2979   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2980         (vec_merge:V2DF
2981           (float_extend:V2DF
2982             (vec_select:V2SF
2983               (match_operand:V4SF 2 "nonimmediate_operand" "x,m")
2984               (parallel [(const_int 0) (const_int 1)])))
2985           (match_operand:V2DF 1 "register_operand" "0,0")
2986           (const_int 1)))]
2987   "TARGET_SSE2"
2988   "cvtss2sd\t{%2, %0|%0, %2}"
2989   [(set_attr "type" "ssecvt")
2990    (set_attr "amdfam10_decode" "vector,double")
2991    (set_attr "mode" "DF")])
2993 (define_insn "avx_cvtpd2ps256"
2994   [(set (match_operand:V4SF 0 "register_operand" "=x")
2995         (float_truncate:V4SF
2996           (match_operand:V4DF 1 "nonimmediate_operand" "xm")))]
2997   "TARGET_AVX"
2998   "vcvtpd2ps{y}\t{%1, %0|%0, %1}"
2999   [(set_attr "type" "ssecvt")
3000    (set_attr "prefix" "vex")
3001    (set_attr "mode" "V4SF")])
3003 (define_expand "sse2_cvtpd2ps"
3004   [(set (match_operand:V4SF 0 "register_operand" "")
3005         (vec_concat:V4SF
3006           (float_truncate:V2SF
3007             (match_operand:V2DF 1 "nonimmediate_operand" ""))
3008           (match_dup 2)))]
3009   "TARGET_SSE2"
3010   "operands[2] = CONST0_RTX (V2SFmode);")
3012 (define_insn "*sse2_cvtpd2ps"
3013   [(set (match_operand:V4SF 0 "register_operand" "=x")
3014         (vec_concat:V4SF
3015           (float_truncate:V2SF
3016             (match_operand:V2DF 1 "nonimmediate_operand" "xm"))
3017           (match_operand:V2SF 2 "const0_operand" "")))]
3018   "TARGET_SSE2"
3019   "* return TARGET_AVX ? \"vcvtpd2ps{x}\t{%1, %0|%0, %1}\"
3020                        : \"cvtpd2ps\t{%1, %0|%0, %1}\";"
3021   [(set_attr "type" "ssecvt")
3022    (set_attr "prefix_data16" "1")
3023    (set_attr "prefix" "maybe_vex")
3024    (set_attr "mode" "V4SF")
3025    (set_attr "amdfam10_decode" "double")])
3027 (define_insn "avx_cvtps2pd256"
3028   [(set (match_operand:V4DF 0 "register_operand" "=x")
3029         (float_extend:V4DF
3030           (match_operand:V4SF 1 "nonimmediate_operand" "xm")))]
3031   "TARGET_AVX"
3032   "vcvtps2pd\t{%1, %0|%0, %1}"
3033   [(set_attr "type" "ssecvt")
3034    (set_attr "prefix" "vex")
3035    (set_attr "mode" "V4DF")])
3037 (define_insn "sse2_cvtps2pd"
3038   [(set (match_operand:V2DF 0 "register_operand" "=x")
3039         (float_extend:V2DF
3040           (vec_select:V2SF
3041             (match_operand:V4SF 1 "nonimmediate_operand" "xm")
3042             (parallel [(const_int 0) (const_int 1)]))))]
3043   "TARGET_SSE2"
3044   "%vcvtps2pd\t{%1, %0|%0, %1}"
3045   [(set_attr "type" "ssecvt")
3046    (set_attr "prefix" "maybe_vex")
3047    (set_attr "mode" "V2DF")
3048    (set_attr "prefix_data16" "0")
3049    (set_attr "amdfam10_decode" "direct")])
3051 (define_expand "vec_unpacks_hi_v4sf"
3052   [(set (match_dup 2)
3053    (vec_select:V4SF
3054      (vec_concat:V8SF
3055        (match_dup 2)
3056        (match_operand:V4SF 1 "nonimmediate_operand" ""))
3057      (parallel [(const_int 6)
3058                 (const_int 7)
3059                 (const_int 2)
3060                 (const_int 3)])))
3061   (set (match_operand:V2DF 0 "register_operand" "")
3062    (float_extend:V2DF
3063      (vec_select:V2SF
3064        (match_dup 2)
3065        (parallel [(const_int 0) (const_int 1)]))))]
3066  "TARGET_SSE2"
3068  operands[2] = gen_reg_rtx (V4SFmode);
3071 (define_expand "vec_unpacks_lo_v4sf"
3072   [(set (match_operand:V2DF 0 "register_operand" "")
3073         (float_extend:V2DF
3074           (vec_select:V2SF
3075             (match_operand:V4SF 1 "nonimmediate_operand" "")
3076             (parallel [(const_int 0) (const_int 1)]))))]
3077   "TARGET_SSE2")
3079 (define_expand "vec_unpacks_float_hi_v8hi"
3080   [(match_operand:V4SF 0 "register_operand" "")
3081    (match_operand:V8HI 1 "register_operand" "")]
3082   "TARGET_SSE2"
3084   rtx tmp = gen_reg_rtx (V4SImode);
3086   emit_insn (gen_vec_unpacks_hi_v8hi (tmp, operands[1]));
3087   emit_insn (gen_sse2_cvtdq2ps (operands[0], tmp));
3088   DONE;
3091 (define_expand "vec_unpacks_float_lo_v8hi"
3092   [(match_operand:V4SF 0 "register_operand" "")
3093    (match_operand:V8HI 1 "register_operand" "")]
3094   "TARGET_SSE2"
3096   rtx tmp = gen_reg_rtx (V4SImode);
3098   emit_insn (gen_vec_unpacks_lo_v8hi (tmp, operands[1]));
3099   emit_insn (gen_sse2_cvtdq2ps (operands[0], tmp));
3100   DONE;
3103 (define_expand "vec_unpacku_float_hi_v8hi"
3104   [(match_operand:V4SF 0 "register_operand" "")
3105    (match_operand:V8HI 1 "register_operand" "")]
3106   "TARGET_SSE2"
3108   rtx tmp = gen_reg_rtx (V4SImode);
3110   emit_insn (gen_vec_unpacku_hi_v8hi (tmp, operands[1]));
3111   emit_insn (gen_sse2_cvtdq2ps (operands[0], tmp));
3112   DONE;
3115 (define_expand "vec_unpacku_float_lo_v8hi"
3116   [(match_operand:V4SF 0 "register_operand" "")
3117    (match_operand:V8HI 1 "register_operand" "")]
3118   "TARGET_SSE2"
3120   rtx tmp = gen_reg_rtx (V4SImode);
3122   emit_insn (gen_vec_unpacku_lo_v8hi (tmp, operands[1]));
3123   emit_insn (gen_sse2_cvtdq2ps (operands[0], tmp));
3124   DONE;
3127 (define_expand "vec_unpacks_float_hi_v4si"
3128   [(set (match_dup 2)
3129         (vec_select:V4SI
3130           (match_operand:V4SI 1 "nonimmediate_operand" "")
3131           (parallel [(const_int 2)
3132                      (const_int 3)
3133                      (const_int 2)
3134                      (const_int 3)])))
3135    (set (match_operand:V2DF 0 "register_operand" "")
3136         (float:V2DF
3137           (vec_select:V2SI
3138           (match_dup 2)
3139             (parallel [(const_int 0) (const_int 1)]))))]
3140  "TARGET_SSE2"
3141  "operands[2] = gen_reg_rtx (V4SImode);")
3143 (define_expand "vec_unpacks_float_lo_v4si"
3144   [(set (match_operand:V2DF 0 "register_operand" "")
3145         (float:V2DF
3146           (vec_select:V2SI
3147             (match_operand:V4SI 1 "nonimmediate_operand" "")
3148             (parallel [(const_int 0) (const_int 1)]))))]
3149   "TARGET_SSE2")
3151 (define_expand "vec_unpacku_float_hi_v4si"
3152   [(set (match_dup 5)
3153         (vec_select:V4SI
3154           (match_operand:V4SI 1 "nonimmediate_operand" "")
3155           (parallel [(const_int 2)
3156                      (const_int 3)
3157                      (const_int 2)
3158                      (const_int 3)])))
3159    (set (match_dup 6)
3160         (float:V2DF
3161           (vec_select:V2SI
3162           (match_dup 5)
3163             (parallel [(const_int 0) (const_int 1)]))))
3164    (set (match_dup 7)
3165         (lt:V2DF (match_dup 6) (match_dup 3)))
3166    (set (match_dup 8)
3167         (and:V2DF (match_dup 7) (match_dup 4)))
3168    (set (match_operand:V2DF 0 "register_operand" "")
3169         (plus:V2DF (match_dup 6) (match_dup 8)))]
3170  "TARGET_SSE2"
3172   REAL_VALUE_TYPE TWO32r;
3173   rtx x;
3174   int i;
3176   real_ldexp (&TWO32r, &dconst1, 32);
3177   x = const_double_from_real_value (TWO32r, DFmode);
3179   operands[3] = force_reg (V2DFmode, CONST0_RTX (V2DFmode));
3180   operands[4] = force_reg (V2DFmode, ix86_build_const_vector (DFmode, 1, x));
3182   operands[5] = gen_reg_rtx (V4SImode);
3184   for (i = 6; i < 9; i++)
3185     operands[i] = gen_reg_rtx (V2DFmode);
3188 (define_expand "vec_unpacku_float_lo_v4si"
3189   [(set (match_dup 5)
3190         (float:V2DF
3191           (vec_select:V2SI
3192             (match_operand:V4SI 1 "nonimmediate_operand" "")
3193             (parallel [(const_int 0) (const_int 1)]))))
3194    (set (match_dup 6)
3195         (lt:V2DF (match_dup 5) (match_dup 3)))
3196    (set (match_dup 7)
3197         (and:V2DF (match_dup 6) (match_dup 4)))
3198    (set (match_operand:V2DF 0 "register_operand" "")
3199         (plus:V2DF (match_dup 5) (match_dup 7)))]
3200   "TARGET_SSE2"
3202   REAL_VALUE_TYPE TWO32r;
3203   rtx x;
3204   int i;
3206   real_ldexp (&TWO32r, &dconst1, 32);
3207   x = const_double_from_real_value (TWO32r, DFmode);
3209   operands[3] = force_reg (V2DFmode, CONST0_RTX (V2DFmode));
3210   operands[4] = force_reg (V2DFmode, ix86_build_const_vector (DFmode, 1, x));
3212   for (i = 5; i < 8; i++)
3213     operands[i] = gen_reg_rtx (V2DFmode);
3216 (define_expand "vec_pack_trunc_v2df"
3217   [(match_operand:V4SF 0 "register_operand" "")
3218    (match_operand:V2DF 1 "nonimmediate_operand" "")
3219    (match_operand:V2DF 2 "nonimmediate_operand" "")]
3220   "TARGET_SSE2"
3222   rtx r1, r2;
3224   r1 = gen_reg_rtx (V4SFmode);
3225   r2 = gen_reg_rtx (V4SFmode);
3227   emit_insn (gen_sse2_cvtpd2ps (r1, operands[1]));
3228   emit_insn (gen_sse2_cvtpd2ps (r2, operands[2]));
3229   emit_insn (gen_sse_movlhps (operands[0], r1, r2));
3230   DONE;
3233 (define_expand "vec_pack_sfix_trunc_v2df"
3234   [(match_operand:V4SI 0 "register_operand" "")
3235    (match_operand:V2DF 1 "nonimmediate_operand" "")
3236    (match_operand:V2DF 2 "nonimmediate_operand" "")]
3237   "TARGET_SSE2"
3239   rtx r1, r2;
3241   r1 = gen_reg_rtx (V4SImode);
3242   r2 = gen_reg_rtx (V4SImode);
3244   emit_insn (gen_sse2_cvttpd2dq (r1, operands[1]));
3245   emit_insn (gen_sse2_cvttpd2dq (r2, operands[2]));
3246   emit_insn (gen_vec_interleave_lowv2di (gen_lowpart (V2DImode, operands[0]),
3247                                          gen_lowpart (V2DImode, r1),
3248                                          gen_lowpart (V2DImode, r2)));
3249   DONE;
3252 (define_expand "vec_pack_sfix_v2df"
3253   [(match_operand:V4SI 0 "register_operand" "")
3254    (match_operand:V2DF 1 "nonimmediate_operand" "")
3255    (match_operand:V2DF 2 "nonimmediate_operand" "")]
3256   "TARGET_SSE2"
3258   rtx r1, r2;
3260   r1 = gen_reg_rtx (V4SImode);
3261   r2 = gen_reg_rtx (V4SImode);
3263   emit_insn (gen_sse2_cvtpd2dq (r1, operands[1]));
3264   emit_insn (gen_sse2_cvtpd2dq (r2, operands[2]));
3265   emit_insn (gen_vec_interleave_lowv2di (gen_lowpart (V2DImode, operands[0]),
3266                                          gen_lowpart (V2DImode, r1),
3267                                          gen_lowpart (V2DImode, r2)));
3268   DONE;
3271 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3273 ;; Parallel single-precision floating point element swizzling
3275 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3277 (define_expand "sse_movhlps_exp"
3278   [(set (match_operand:V4SF 0 "nonimmediate_operand" "")
3279         (vec_select:V4SF
3280           (vec_concat:V8SF
3281             (match_operand:V4SF 1 "nonimmediate_operand" "")
3282             (match_operand:V4SF 2 "nonimmediate_operand" ""))
3283           (parallel [(const_int 6)
3284                      (const_int 7)
3285                      (const_int 2)
3286                      (const_int 3)])))]
3287   "TARGET_SSE"
3288   "ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);")
3290 (define_insn "*avx_movhlps"
3291   [(set (match_operand:V4SF 0 "nonimmediate_operand"     "=x,x,m")
3292         (vec_select:V4SF
3293           (vec_concat:V8SF
3294             (match_operand:V4SF 1 "nonimmediate_operand" " x,x,0")
3295             (match_operand:V4SF 2 "nonimmediate_operand" " x,o,x"))
3296           (parallel [(const_int 6)
3297                      (const_int 7)
3298                      (const_int 2)
3299                      (const_int 3)])))]
3300   "TARGET_AVX && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
3301   "@
3302    vmovhlps\t{%2, %1, %0|%0, %1, %2}
3303    vmovlps\t{%H2, %1, %0|%0, %1, %H2}
3304    vmovhps\t{%2, %0|%0, %2}"
3305   [(set_attr "type" "ssemov")
3306    (set_attr "prefix" "vex")
3307    (set_attr "mode" "V4SF,V2SF,V2SF")])
3309 (define_insn "sse_movhlps"
3310   [(set (match_operand:V4SF 0 "nonimmediate_operand"     "=x,x,m")
3311         (vec_select:V4SF
3312           (vec_concat:V8SF
3313             (match_operand:V4SF 1 "nonimmediate_operand" " 0,0,0")
3314             (match_operand:V4SF 2 "nonimmediate_operand" " x,o,x"))
3315           (parallel [(const_int 6)
3316                      (const_int 7)
3317                      (const_int 2)
3318                      (const_int 3)])))]
3319   "TARGET_SSE && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
3320   "@
3321    movhlps\t{%2, %0|%0, %2}
3322    movlps\t{%H2, %0|%0, %H2}
3323    movhps\t{%2, %0|%0, %2}"
3324   [(set_attr "type" "ssemov")
3325    (set_attr "mode" "V4SF,V2SF,V2SF")])
3327 (define_expand "sse_movlhps_exp"
3328   [(set (match_operand:V4SF 0 "nonimmediate_operand" "")
3329         (vec_select:V4SF
3330           (vec_concat:V8SF
3331             (match_operand:V4SF 1 "nonimmediate_operand" "")
3332             (match_operand:V4SF 2 "nonimmediate_operand" ""))
3333           (parallel [(const_int 0)
3334                      (const_int 1)
3335                      (const_int 4)
3336                      (const_int 5)])))]
3337   "TARGET_SSE"
3338   "ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);")
3340 (define_insn "*avx_movlhps"
3341   [(set (match_operand:V4SF 0 "nonimmediate_operand"     "=x,x,o")
3342         (vec_select:V4SF
3343           (vec_concat:V8SF
3344             (match_operand:V4SF 1 "nonimmediate_operand" " x,x,0")
3345             (match_operand:V4SF 2 "nonimmediate_operand" " x,m,x"))
3346           (parallel [(const_int 0)
3347                      (const_int 1)
3348                      (const_int 4)
3349                      (const_int 5)])))]
3350   "TARGET_AVX && ix86_binary_operator_ok (UNKNOWN, V4SFmode, operands)"
3351   "@
3352    vmovlhps\t{%2, %1, %0|%0, %1, %2}
3353    vmovhps\t{%2, %1, %0|%0, %1, %2}
3354    vmovlps\t{%2, %H0|%H0, %2}"
3355   [(set_attr "type" "ssemov")
3356    (set_attr "prefix" "vex")
3357    (set_attr "mode" "V4SF,V2SF,V2SF")])
3359 (define_insn "sse_movlhps"
3360   [(set (match_operand:V4SF 0 "nonimmediate_operand"     "=x,x,o")
3361         (vec_select:V4SF
3362           (vec_concat:V8SF
3363             (match_operand:V4SF 1 "nonimmediate_operand" " 0,0,0")
3364             (match_operand:V4SF 2 "nonimmediate_operand" " x,m,x"))
3365           (parallel [(const_int 0)
3366                      (const_int 1)
3367                      (const_int 4)
3368                      (const_int 5)])))]
3369   "TARGET_SSE && ix86_binary_operator_ok (UNKNOWN, V4SFmode, operands)"
3370   "@
3371    movlhps\t{%2, %0|%0, %2}
3372    movhps\t{%2, %0|%0, %2}
3373    movlps\t{%2, %H0|%H0, %2}"
3374   [(set_attr "type" "ssemov")
3375    (set_attr "mode" "V4SF,V2SF,V2SF")])
3377 ;; Recall that the 256-bit unpck insns only shuffle within their lanes.
3378 (define_insn "avx_unpckhps256"
3379   [(set (match_operand:V8SF 0 "register_operand" "=x")
3380         (vec_select:V8SF
3381           (vec_concat:V16SF
3382             (match_operand:V8SF 1 "register_operand" "x")
3383             (match_operand:V8SF 2 "nonimmediate_operand" "xm"))
3384           (parallel [(const_int 2) (const_int 10)
3385                      (const_int 3) (const_int 11)
3386                      (const_int 6) (const_int 14)
3387                      (const_int 7) (const_int 15)])))]
3388   "TARGET_AVX"
3389   "vunpckhps\t{%2, %1, %0|%0, %1, %2}"
3390   [(set_attr "type" "sselog")
3391    (set_attr "prefix" "vex")
3392    (set_attr "mode" "V8SF")])
3394 (define_insn "*avx_interleave_highv4sf"
3395   [(set (match_operand:V4SF 0 "register_operand" "=x")
3396         (vec_select:V4SF
3397           (vec_concat:V8SF
3398             (match_operand:V4SF 1 "register_operand" "x")
3399             (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
3400           (parallel [(const_int 2) (const_int 6)
3401                      (const_int 3) (const_int 7)])))]
3402   "TARGET_AVX"
3403   "vunpckhps\t{%2, %1, %0|%0, %1, %2}"
3404   [(set_attr "type" "sselog")
3405    (set_attr "prefix" "vex")
3406    (set_attr "mode" "V4SF")])
3408 (define_insn "vec_interleave_highv4sf"
3409   [(set (match_operand:V4SF 0 "register_operand" "=x")
3410         (vec_select:V4SF
3411           (vec_concat:V8SF
3412             (match_operand:V4SF 1 "register_operand" "0")
3413             (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
3414           (parallel [(const_int 2) (const_int 6)
3415                      (const_int 3) (const_int 7)])))]
3416   "TARGET_SSE"
3417   "unpckhps\t{%2, %0|%0, %2}"
3418   [(set_attr "type" "sselog")
3419    (set_attr "mode" "V4SF")])
3421 ;; Recall that the 256-bit unpck insns only shuffle within their lanes.
3422 (define_insn "avx_unpcklps256"
3423   [(set (match_operand:V8SF 0 "register_operand" "=x")
3424         (vec_select:V8SF
3425           (vec_concat:V16SF
3426             (match_operand:V8SF 1 "register_operand" "x")
3427             (match_operand:V8SF 2 "nonimmediate_operand" "xm"))
3428           (parallel [(const_int 0) (const_int 8)
3429                      (const_int 1) (const_int 9)
3430                      (const_int 4) (const_int 12)
3431                      (const_int 5) (const_int 13)])))]
3432   "TARGET_AVX"
3433   "vunpcklps\t{%2, %1, %0|%0, %1, %2}"
3434   [(set_attr "type" "sselog")
3435    (set_attr "prefix" "vex")
3436    (set_attr "mode" "V8SF")])
3438 (define_insn "*avx_interleave_lowv4sf"
3439   [(set (match_operand:V4SF 0 "register_operand" "=x")
3440         (vec_select:V4SF
3441           (vec_concat:V8SF
3442             (match_operand:V4SF 1 "register_operand" "x")
3443             (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
3444           (parallel [(const_int 0) (const_int 4)
3445                      (const_int 1) (const_int 5)])))]
3446   "TARGET_AVX"
3447   "vunpcklps\t{%2, %1, %0|%0, %1, %2}"
3448   [(set_attr "type" "sselog")
3449    (set_attr "prefix" "vex")
3450    (set_attr "mode" "V4SF")])
3452 (define_insn "vec_interleave_lowv4sf"
3453   [(set (match_operand:V4SF 0 "register_operand" "=x")
3454         (vec_select:V4SF
3455           (vec_concat:V8SF
3456             (match_operand:V4SF 1 "register_operand" "0")
3457             (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
3458           (parallel [(const_int 0) (const_int 4)
3459                      (const_int 1) (const_int 5)])))]
3460   "TARGET_SSE"
3461   "unpcklps\t{%2, %0|%0, %2}"
3462   [(set_attr "type" "sselog")
3463    (set_attr "mode" "V4SF")])
3465 ;; These are modeled with the same vec_concat as the others so that we
3466 ;; capture users of shufps that can use the new instructions
3467 (define_insn "avx_movshdup256"
3468   [(set (match_operand:V8SF 0 "register_operand" "=x")
3469         (vec_select:V8SF
3470           (vec_concat:V16SF
3471             (match_operand:V8SF 1 "nonimmediate_operand" "xm")
3472             (match_dup 1))
3473           (parallel [(const_int 1) (const_int 1)
3474                      (const_int 3) (const_int 3)
3475                      (const_int 5) (const_int 5)
3476                      (const_int 7) (const_int 7)])))]
3477   "TARGET_AVX"
3478   "vmovshdup\t{%1, %0|%0, %1}"
3479   [(set_attr "type" "sse")
3480    (set_attr "prefix" "vex")
3481    (set_attr "mode" "V8SF")])
3483 (define_insn "sse3_movshdup"
3484   [(set (match_operand:V4SF 0 "register_operand" "=x")
3485         (vec_select:V4SF
3486           (vec_concat:V8SF
3487             (match_operand:V4SF 1 "nonimmediate_operand" "xm")
3488             (match_dup 1))
3489           (parallel [(const_int 1)
3490                      (const_int 1)
3491                      (const_int 7)
3492                      (const_int 7)])))]
3493   "TARGET_SSE3"
3494   "%vmovshdup\t{%1, %0|%0, %1}"
3495   [(set_attr "type" "sse")
3496    (set_attr "prefix_rep" "1")
3497    (set_attr "prefix" "maybe_vex")
3498    (set_attr "mode" "V4SF")])
3500 (define_insn "avx_movsldup256"
3501   [(set (match_operand:V8SF 0 "register_operand" "=x")
3502         (vec_select:V8SF
3503           (vec_concat:V16SF
3504             (match_operand:V8SF 1 "nonimmediate_operand" "xm")
3505             (match_dup 1))
3506           (parallel [(const_int 0) (const_int 0)
3507                      (const_int 2) (const_int 2)
3508                      (const_int 4) (const_int 4)
3509                      (const_int 6) (const_int 6)])))]
3510   "TARGET_AVX"
3511   "vmovsldup\t{%1, %0|%0, %1}"
3512   [(set_attr "type" "sse")
3513    (set_attr "prefix" "vex")
3514    (set_attr "mode" "V8SF")])
3516 (define_insn "sse3_movsldup"
3517   [(set (match_operand:V4SF 0 "register_operand" "=x")
3518         (vec_select:V4SF
3519           (vec_concat:V8SF
3520             (match_operand:V4SF 1 "nonimmediate_operand" "xm")
3521             (match_dup 1))
3522           (parallel [(const_int 0)
3523                      (const_int 0)
3524                      (const_int 6)
3525                      (const_int 6)])))]
3526   "TARGET_SSE3"
3527   "%vmovsldup\t{%1, %0|%0, %1}"
3528   [(set_attr "type" "sse")
3529    (set_attr "prefix_rep" "1")
3530    (set_attr "prefix" "maybe_vex")
3531    (set_attr "mode" "V4SF")])
3533 (define_expand "avx_shufps256"
3534   [(match_operand:V8SF 0 "register_operand" "")
3535    (match_operand:V8SF 1 "register_operand" "")
3536    (match_operand:V8SF 2 "nonimmediate_operand" "")
3537    (match_operand:SI 3 "const_int_operand" "")]
3538   "TARGET_AVX"
3540   int mask = INTVAL (operands[3]);
3541   emit_insn (gen_avx_shufps256_1 (operands[0], operands[1], operands[2],
3542                                   GEN_INT ((mask >> 0) & 3),
3543                                   GEN_INT ((mask >> 2) & 3),
3544                                   GEN_INT (((mask >> 4) & 3) + 8),
3545                                   GEN_INT (((mask >> 6) & 3) + 8),
3546                                   GEN_INT (((mask >> 0) & 3) + 4),
3547                                   GEN_INT (((mask >> 2) & 3) + 4),
3548                                   GEN_INT (((mask >> 4) & 3) + 12),
3549                                   GEN_INT (((mask >> 6) & 3) + 12)));
3550   DONE;
3553 ;; One bit in mask selects 2 elements.
3554 (define_insn "avx_shufps256_1"
3555   [(set (match_operand:V8SF 0 "register_operand" "=x")
3556         (vec_select:V8SF
3557           (vec_concat:V16SF
3558             (match_operand:V8SF 1 "register_operand" "x")
3559             (match_operand:V8SF 2 "nonimmediate_operand" "xm"))
3560           (parallel [(match_operand 3  "const_0_to_3_operand"   "")
3561                      (match_operand 4  "const_0_to_3_operand"   "")
3562                      (match_operand 5  "const_8_to_11_operand"  "")
3563                      (match_operand 6  "const_8_to_11_operand"  "")
3564                      (match_operand 7  "const_4_to_7_operand"   "")
3565                      (match_operand 8  "const_4_to_7_operand"   "")
3566                      (match_operand 9  "const_12_to_15_operand" "")
3567                      (match_operand 10 "const_12_to_15_operand" "")])))]
3568   "TARGET_AVX
3569    && (INTVAL (operands[3]) == (INTVAL (operands[7]) - 4)
3570        && INTVAL (operands[4]) == (INTVAL (operands[8]) - 4)
3571        && INTVAL (operands[5]) == (INTVAL (operands[9]) - 4)
3572        && INTVAL (operands[6]) == (INTVAL (operands[10]) - 4))"
3574   int mask;
3575   mask = INTVAL (operands[3]);
3576   mask |= INTVAL (operands[4]) << 2;
3577   mask |= (INTVAL (operands[5]) - 8) << 4;
3578   mask |= (INTVAL (operands[6]) - 8) << 6;
3579   operands[3] = GEN_INT (mask);
3581   return "vshufps\t{%3, %2, %1, %0|%0, %1, %2, %3}";
3583   [(set_attr "type" "sselog")
3584    (set_attr "length_immediate" "1")
3585    (set_attr "prefix" "vex")
3586    (set_attr "mode" "V8SF")])
3588 (define_expand "sse_shufps"
3589   [(match_operand:V4SF 0 "register_operand" "")
3590    (match_operand:V4SF 1 "register_operand" "")
3591    (match_operand:V4SF 2 "nonimmediate_operand" "")
3592    (match_operand:SI 3 "const_int_operand" "")]
3593   "TARGET_SSE"
3595   int mask = INTVAL (operands[3]);
3596   emit_insn (gen_sse_shufps_v4sf (operands[0], operands[1], operands[2],
3597                                GEN_INT ((mask >> 0) & 3),
3598                                GEN_INT ((mask >> 2) & 3),
3599                                GEN_INT (((mask >> 4) & 3) + 4),
3600                                GEN_INT (((mask >> 6) & 3) + 4)));
3601   DONE;
3604 (define_insn "*avx_shufps_<mode>"
3605   [(set (match_operand:SSEMODE4S 0 "register_operand" "=x")
3606         (vec_select:SSEMODE4S
3607           (vec_concat:<ssedoublesizemode>
3608             (match_operand:SSEMODE4S 1 "register_operand" "x")
3609             (match_operand:SSEMODE4S 2 "nonimmediate_operand" "xm"))
3610           (parallel [(match_operand 3 "const_0_to_3_operand" "")
3611                      (match_operand 4 "const_0_to_3_operand" "")
3612                      (match_operand 5 "const_4_to_7_operand" "")
3613                      (match_operand 6 "const_4_to_7_operand" "")])))]
3614   "TARGET_AVX"
3616   int mask = 0;
3617   mask |= INTVAL (operands[3]) << 0;
3618   mask |= INTVAL (operands[4]) << 2;
3619   mask |= (INTVAL (operands[5]) - 4) << 4;
3620   mask |= (INTVAL (operands[6]) - 4) << 6;
3621   operands[3] = GEN_INT (mask);
3623   return "vshufps\t{%3, %2, %1, %0|%0, %1, %2, %3}";
3625   [(set_attr "type" "sselog")
3626    (set_attr "length_immediate" "1")
3627    (set_attr "prefix" "vex")
3628    (set_attr "mode" "V4SF")])
3630 (define_insn "sse_shufps_<mode>"
3631   [(set (match_operand:SSEMODE4S 0 "register_operand" "=x")
3632         (vec_select:SSEMODE4S
3633           (vec_concat:<ssedoublesizemode>
3634             (match_operand:SSEMODE4S 1 "register_operand" "0")
3635             (match_operand:SSEMODE4S 2 "nonimmediate_operand" "xm"))
3636           (parallel [(match_operand 3 "const_0_to_3_operand" "")
3637                      (match_operand 4 "const_0_to_3_operand" "")
3638                      (match_operand 5 "const_4_to_7_operand" "")
3639                      (match_operand 6 "const_4_to_7_operand" "")])))]
3640   "TARGET_SSE"
3642   int mask = 0;
3643   mask |= INTVAL (operands[3]) << 0;
3644   mask |= INTVAL (operands[4]) << 2;
3645   mask |= (INTVAL (operands[5]) - 4) << 4;
3646   mask |= (INTVAL (operands[6]) - 4) << 6;
3647   operands[3] = GEN_INT (mask);
3649   return "shufps\t{%3, %2, %0|%0, %2, %3}";
3651   [(set_attr "type" "sselog")
3652    (set_attr "length_immediate" "1")
3653    (set_attr "mode" "V4SF")])
3655 (define_insn "sse_storehps"
3656   [(set (match_operand:V2SF 0 "nonimmediate_operand" "=m,x,x")
3657         (vec_select:V2SF
3658           (match_operand:V4SF 1 "nonimmediate_operand" "x,x,o")
3659           (parallel [(const_int 2) (const_int 3)])))]
3660   "TARGET_SSE"
3661   "@
3662    %vmovhps\t{%1, %0|%0, %1}
3663    %vmovhlps\t{%1, %d0|%d0, %1}
3664    %vmovlps\t{%H1, %d0|%d0, %H1}"
3665   [(set_attr "type" "ssemov")
3666    (set_attr "prefix" "maybe_vex")
3667    (set_attr "mode" "V2SF,V4SF,V2SF")])
3669 (define_expand "sse_loadhps_exp"
3670   [(set (match_operand:V4SF 0 "nonimmediate_operand" "")
3671         (vec_concat:V4SF
3672           (vec_select:V2SF
3673             (match_operand:V4SF 1 "nonimmediate_operand" "")
3674             (parallel [(const_int 0) (const_int 1)]))
3675           (match_operand:V2SF 2 "nonimmediate_operand" "")))]
3676   "TARGET_SSE"
3677   "ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);")
3679 (define_insn "*avx_loadhps"
3680   [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,o")
3681         (vec_concat:V4SF
3682           (vec_select:V2SF
3683             (match_operand:V4SF 1 "nonimmediate_operand" "x,x,0")
3684             (parallel [(const_int 0) (const_int 1)]))
3685           (match_operand:V2SF 2 "nonimmediate_operand" "m,x,x")))]
3686   "TARGET_AVX"
3687   "@
3688    vmovhps\t{%2, %1, %0|%0, %1, %2}
3689    vmovlhps\t{%2, %1, %0|%0, %1, %2}
3690    vmovlps\t{%2, %H0|%H0, %2}"
3691   [(set_attr "type" "ssemov")
3692    (set_attr "prefix" "vex")
3693    (set_attr "mode" "V2SF,V4SF,V2SF")])
3695 (define_insn "sse_loadhps"
3696   [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,o")
3697         (vec_concat:V4SF
3698           (vec_select:V2SF
3699             (match_operand:V4SF 1 "nonimmediate_operand" "0,0,0")
3700             (parallel [(const_int 0) (const_int 1)]))
3701           (match_operand:V2SF 2 "nonimmediate_operand" "m,x,x")))]
3702   "TARGET_SSE"
3703   "@
3704    movhps\t{%2, %0|%0, %2}
3705    movlhps\t{%2, %0|%0, %2}
3706    movlps\t{%2, %H0|%H0, %2}"
3707   [(set_attr "type" "ssemov")
3708    (set_attr "mode" "V2SF,V4SF,V2SF")])
3710 (define_insn "*avx_storelps"
3711   [(set (match_operand:V2SF 0 "nonimmediate_operand" "=m,x,x")
3712         (vec_select:V2SF
3713           (match_operand:V4SF 1 "nonimmediate_operand" "x,x,m")
3714           (parallel [(const_int 0) (const_int 1)])))]
3715   "TARGET_AVX"
3716   "@
3717    vmovlps\t{%1, %0|%0, %1}
3718    vmovaps\t{%1, %0|%0, %1}
3719    vmovlps\t{%1, %0, %0|%0, %0, %1}"
3720   [(set_attr "type" "ssemov")
3721    (set_attr "prefix" "vex")
3722    (set_attr "mode" "V2SF,V2DF,V2SF")])
3724 (define_insn "sse_storelps"
3725   [(set (match_operand:V2SF 0 "nonimmediate_operand" "=m,x,x")
3726         (vec_select:V2SF
3727           (match_operand:V4SF 1 "nonimmediate_operand" "x,x,m")
3728           (parallel [(const_int 0) (const_int 1)])))]
3729   "TARGET_SSE"
3730   "@
3731    movlps\t{%1, %0|%0, %1}
3732    movaps\t{%1, %0|%0, %1}
3733    movlps\t{%1, %0|%0, %1}"
3734   [(set_attr "type" "ssemov")
3735    (set_attr "mode" "V2SF,V4SF,V2SF")])
3737 (define_expand "sse_loadlps_exp"
3738   [(set (match_operand:V4SF 0 "nonimmediate_operand" "")
3739         (vec_concat:V4SF
3740           (match_operand:V2SF 2 "nonimmediate_operand" "")
3741           (vec_select:V2SF
3742             (match_operand:V4SF 1 "nonimmediate_operand" "")
3743             (parallel [(const_int 2) (const_int 3)]))))]
3744   "TARGET_SSE"
3745   "ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);")
3747 (define_insn "*avx_loadlps"
3748   [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,m")
3749         (vec_concat:V4SF
3750           (match_operand:V2SF 2 "nonimmediate_operand" "x,m,x")
3751           (vec_select:V2SF
3752             (match_operand:V4SF 1 "nonimmediate_operand" "x,x,0")
3753             (parallel [(const_int 2) (const_int 3)]))))]
3754   "TARGET_AVX"
3755   "@
3756    shufps\t{$0xe4, %1, %2, %0|%0, %2, %1, 0xe4}
3757    vmovlps\t{%2, %1, %0|%0, %1, %2}
3758    vmovlps\t{%2, %0|%0, %2}"
3759   [(set_attr "type" "sselog,ssemov,ssemov")
3760    (set_attr "length_immediate" "1,*,*")
3761    (set_attr "prefix" "vex")
3762    (set_attr "mode" "V4SF,V2SF,V2SF")])
3764 (define_insn "sse_loadlps"
3765   [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,m")
3766         (vec_concat:V4SF
3767           (match_operand:V2SF 2 "nonimmediate_operand" "0,m,x")
3768           (vec_select:V2SF
3769             (match_operand:V4SF 1 "nonimmediate_operand" "x,0,0")
3770             (parallel [(const_int 2) (const_int 3)]))))]
3771   "TARGET_SSE"
3772   "@
3773    shufps\t{$0xe4, %1, %0|%0, %1, 0xe4}
3774    movlps\t{%2, %0|%0, %2}
3775    movlps\t{%2, %0|%0, %2}"
3776   [(set_attr "type" "sselog,ssemov,ssemov")
3777    (set_attr "length_immediate" "1,*,*")
3778    (set_attr "mode" "V4SF,V2SF,V2SF")])
3780 (define_insn "*avx_movss"
3781   [(set (match_operand:V4SF 0 "register_operand" "=x")
3782         (vec_merge:V4SF
3783           (match_operand:V4SF 2 "register_operand" "x")
3784           (match_operand:V4SF 1 "register_operand" "x")
3785           (const_int 1)))]
3786   "TARGET_AVX"
3787   "vmovss\t{%2, %1, %0|%0, %1, %2}"
3788   [(set_attr "type" "ssemov")
3789    (set_attr "prefix" "vex")
3790    (set_attr "mode" "SF")])
3792 (define_insn "sse_movss"
3793   [(set (match_operand:V4SF 0 "register_operand" "=x")
3794         (vec_merge:V4SF
3795           (match_operand:V4SF 2 "register_operand" "x")
3796           (match_operand:V4SF 1 "register_operand" "0")
3797           (const_int 1)))]
3798   "TARGET_SSE"
3799   "movss\t{%2, %0|%0, %2}"
3800   [(set_attr "type" "ssemov")
3801    (set_attr "mode" "SF")])
3803 (define_expand "vec_dupv4sf"
3804   [(set (match_operand:V4SF 0 "register_operand" "")
3805         (vec_duplicate:V4SF
3806           (match_operand:SF 1 "nonimmediate_operand" "")))]
3807   "TARGET_SSE"
3809   if (!TARGET_AVX)
3810     operands[1] = force_reg (V4SFmode, operands[1]);
3813 (define_insn "*vec_dupv4sf_avx"
3814   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
3815         (vec_duplicate:V4SF
3816           (match_operand:SF 1 "nonimmediate_operand" "x,m")))]
3817   "TARGET_AVX"
3818   "@
3819    vshufps\t{$0, %1, %1, %0|%0, %1, %1, 0}
3820    vbroadcastss\t{%1, %0|%0, %1}"
3821   [(set_attr "type" "sselog1,ssemov")
3822    (set_attr "length_immediate" "1,0")
3823    (set_attr "prefix_extra" "0,1")
3824    (set_attr "prefix" "vex")
3825    (set_attr "mode" "V4SF")])
3827 (define_insn "*vec_dupv4sf"
3828   [(set (match_operand:V4SF 0 "register_operand" "=x")
3829         (vec_duplicate:V4SF
3830           (match_operand:SF 1 "register_operand" "0")))]
3831   "TARGET_SSE"
3832   "shufps\t{$0, %0, %0|%0, %0, 0}"
3833   [(set_attr "type" "sselog1")
3834    (set_attr "length_immediate" "1")
3835    (set_attr "mode" "V4SF")])
3837 (define_insn "*vec_concatv2sf_avx"
3838   [(set (match_operand:V2SF 0 "register_operand"     "=x,x,x,*y ,*y")
3839         (vec_concat:V2SF
3840           (match_operand:SF 1 "nonimmediate_operand" " x,x,m, x , m")
3841           (match_operand:SF 2 "vector_move_operand"  " x,m,C,*ym, C")))]
3842   "TARGET_AVX"
3843   "@
3844    vunpcklps\t{%2, %1, %0|%0, %1, %2}
3845    vinsertps\t{$0x10, %2, %1, %0|%0, %1, %2, 0x10}
3846    vmovss\t{%1, %0|%0, %1}
3847    punpckldq\t{%2, %0|%0, %2}
3848    movd\t{%1, %0|%0, %1}"
3849   [(set_attr "type" "sselog,sselog,ssemov,mmxcvt,mmxmov")
3850    (set_attr "length_immediate" "*,1,*,*,*")
3851    (set_attr "prefix_extra" "*,1,*,*,*")
3852    (set (attr "prefix")
3853      (if_then_else (eq_attr "alternative" "3,4")
3854        (const_string "orig")
3855        (const_string "vex")))
3856    (set_attr "mode" "V4SF,V4SF,SF,DI,DI")])
3858 ;; Although insertps takes register source, we prefer
3859 ;; unpcklps with register source since it is shorter.
3860 (define_insn "*vec_concatv2sf_sse4_1"
3861   [(set (match_operand:V2SF 0 "register_operand"     "=x,x,x,*y ,*y")
3862         (vec_concat:V2SF
3863           (match_operand:SF 1 "nonimmediate_operand" " 0,0,m, 0 , m")
3864           (match_operand:SF 2 "vector_move_operand"  " x,m,C,*ym, C")))]
3865   "TARGET_SSE4_1"
3866   "@
3867    unpcklps\t{%2, %0|%0, %2}
3868    insertps\t{$0x10, %2, %0|%0, %2, 0x10}
3869    movss\t{%1, %0|%0, %1}
3870    punpckldq\t{%2, %0|%0, %2}
3871    movd\t{%1, %0|%0, %1}"
3872   [(set_attr "type" "sselog,sselog,ssemov,mmxcvt,mmxmov")
3873    (set_attr "prefix_data16" "*,1,*,*,*")
3874    (set_attr "prefix_extra" "*,1,*,*,*")
3875    (set_attr "length_immediate" "*,1,*,*,*")
3876    (set_attr "mode" "V4SF,V4SF,SF,DI,DI")])
3878 ;; ??? In theory we can match memory for the MMX alternative, but allowing
3879 ;; nonimmediate_operand for operand 2 and *not* allowing memory for the SSE
3880 ;; alternatives pretty much forces the MMX alternative to be chosen.
3881 (define_insn "*vec_concatv2sf_sse"
3882   [(set (match_operand:V2SF 0 "register_operand"     "=x,x,*y,*y")
3883         (vec_concat:V2SF
3884           (match_operand:SF 1 "nonimmediate_operand" " 0,m, 0, m")
3885           (match_operand:SF 2 "reg_or_0_operand"     " x,C,*y, C")))]
3886   "TARGET_SSE"
3887   "@
3888    unpcklps\t{%2, %0|%0, %2}
3889    movss\t{%1, %0|%0, %1}
3890    punpckldq\t{%2, %0|%0, %2}
3891    movd\t{%1, %0|%0, %1}"
3892   [(set_attr "type" "sselog,ssemov,mmxcvt,mmxmov")
3893    (set_attr "mode" "V4SF,SF,DI,DI")])
3895 (define_insn "*vec_concatv4sf_avx"
3896   [(set (match_operand:V4SF 0 "register_operand"   "=x,x")
3897         (vec_concat:V4SF
3898           (match_operand:V2SF 1 "register_operand" " x,x")
3899           (match_operand:V2SF 2 "nonimmediate_operand" " x,m")))]
3900   "TARGET_AVX"
3901   "@
3902    vmovlhps\t{%2, %1, %0|%0, %1, %2}
3903    vmovhps\t{%2, %1, %0|%0, %1, %2}"
3904   [(set_attr "type" "ssemov")
3905    (set_attr "prefix" "vex")
3906    (set_attr "mode" "V4SF,V2SF")])
3908 (define_insn "*vec_concatv4sf_sse"
3909   [(set (match_operand:V4SF 0 "register_operand"   "=x,x")
3910         (vec_concat:V4SF
3911           (match_operand:V2SF 1 "register_operand" " 0,0")
3912           (match_operand:V2SF 2 "nonimmediate_operand" " x,m")))]
3913   "TARGET_SSE"
3914   "@
3915    movlhps\t{%2, %0|%0, %2}
3916    movhps\t{%2, %0|%0, %2}"
3917   [(set_attr "type" "ssemov")
3918    (set_attr "mode" "V4SF,V2SF")])
3920 (define_expand "vec_init<mode>"
3921   [(match_operand:SSEMODE 0 "register_operand" "")
3922    (match_operand 1 "" "")]
3923   "TARGET_SSE"
3925   ix86_expand_vector_init (false, operands[0], operands[1]);
3926   DONE;
3929 (define_insn "*vec_set<mode>_0_avx"
3930   [(set (match_operand:SSEMODE4S 0 "nonimmediate_operand"  "=x,x, x,x,  x,m")
3931         (vec_merge:SSEMODE4S
3932           (vec_duplicate:SSEMODE4S
3933             (match_operand:<ssescalarmode> 2
3934               "general_operand"                            " x,m,*r,x,*rm,x*rfF"))
3935           (match_operand:SSEMODE4S 1 "vector_move_operand" " C,C, C,x,  x,0")
3936           (const_int 1)))]
3937   "TARGET_AVX"
3938   "@
3939    vinsertps\t{$0xe, %2, %2, %0|%0, %2, %2, 0xe}
3940    vmov<ssescalarmodesuffix2s>\t{%2, %0|%0, %2}
3941    vmovd\t{%2, %0|%0, %2}
3942    vmovss\t{%2, %1, %0|%0, %1, %2}
3943    vpinsrd\t{$0, %2, %1, %0|%0, %1, %2, 0}
3944    #"
3945   [(set_attr "type" "sselog,ssemov,ssemov,ssemov,sselog,*")
3946    (set_attr "prefix_extra" "*,*,*,*,1,*")
3947    (set_attr "length_immediate" "*,*,*,*,1,*")
3948    (set_attr "prefix" "vex")
3949    (set_attr "mode" "SF,<ssescalarmode>,SI,SF,TI,*")])
3951 (define_insn "*vec_set<mode>_0_sse4_1"
3952   [(set (match_operand:SSEMODE4S 0 "nonimmediate_operand"  "=x,x, x,x,  x,m")
3953         (vec_merge:SSEMODE4S
3954           (vec_duplicate:SSEMODE4S
3955             (match_operand:<ssescalarmode> 2
3956               "general_operand"                            " x,m,*r,x,*rm,*rfF"))
3957           (match_operand:SSEMODE4S 1 "vector_move_operand" " C,C, C,0,  0,0")
3958           (const_int 1)))]
3959   "TARGET_SSE4_1"
3960   "@
3961    insertps\t{$0xe, %2, %0|%0, %2, 0xe}
3962    mov<ssescalarmodesuffix2s>\t{%2, %0|%0, %2}
3963    movd\t{%2, %0|%0, %2}
3964    movss\t{%2, %0|%0, %2}
3965    pinsrd\t{$0, %2, %0|%0, %2, 0}
3966    #"
3967   [(set_attr "type" "sselog,ssemov,ssemov,ssemov,sselog,*")
3968    (set_attr "prefix_extra" "*,*,*,*,1,*")
3969    (set_attr "length_immediate" "*,*,*,*,1,*")
3970    (set_attr "mode" "SF,<ssescalarmode>,SI,SF,TI,*")])
3972 (define_insn "*vec_set<mode>_0_sse2"
3973   [(set (match_operand:SSEMODE4S 0 "nonimmediate_operand"  "=x, x,x,m")
3974         (vec_merge:SSEMODE4S
3975           (vec_duplicate:SSEMODE4S
3976             (match_operand:<ssescalarmode> 2
3977               "general_operand"                            " m,*r,x,x*rfF"))
3978           (match_operand:SSEMODE4S 1 "vector_move_operand" " C, C,0,0")
3979           (const_int 1)))]
3980   "TARGET_SSE2"
3981   "@
3982    mov<ssescalarmodesuffix2s>\t{%2, %0|%0, %2}
3983    movd\t{%2, %0|%0, %2}
3984    movss\t{%2, %0|%0, %2}
3985    #"
3986   [(set_attr "type" "ssemov")
3987    (set_attr "mode" "<ssescalarmode>,SI,SF,*")])
3989 (define_insn "vec_set<mode>_0"
3990   [(set (match_operand:SSEMODE4S 0 "nonimmediate_operand"  "=x,x,m")
3991         (vec_merge:SSEMODE4S
3992           (vec_duplicate:SSEMODE4S
3993             (match_operand:<ssescalarmode> 2
3994               "general_operand"                            " m,x,x*rfF"))
3995           (match_operand:SSEMODE4S 1 "vector_move_operand" " C,0,0")
3996           (const_int 1)))]
3997   "TARGET_SSE"
3998   "@
3999    movss\t{%2, %0|%0, %2}
4000    movss\t{%2, %0|%0, %2}
4001    #"
4002   [(set_attr "type" "ssemov")
4003    (set_attr "mode" "SF")])
4005 ;; A subset is vec_setv4sf.
4006 (define_insn "*vec_setv4sf_avx"
4007   [(set (match_operand:V4SF 0 "register_operand" "=x")
4008         (vec_merge:V4SF
4009           (vec_duplicate:V4SF
4010             (match_operand:SF 2 "nonimmediate_operand" "xm"))
4011           (match_operand:V4SF 1 "register_operand" "x")
4012           (match_operand:SI 3 "const_pow2_1_to_8_operand" "n")))]
4013   "TARGET_AVX"
4015   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])) << 4);
4016   return "vinsertps\t{%3, %2, %1, %0|%0, %1, %2, %3}";
4018   [(set_attr "type" "sselog")
4019    (set_attr "prefix_extra" "1")
4020    (set_attr "length_immediate" "1")
4021    (set_attr "prefix" "vex")
4022    (set_attr "mode" "V4SF")])
4024 (define_insn "*vec_setv4sf_sse4_1"
4025   [(set (match_operand:V4SF 0 "register_operand" "=x")
4026         (vec_merge:V4SF
4027           (vec_duplicate:V4SF
4028             (match_operand:SF 2 "nonimmediate_operand" "xm"))
4029           (match_operand:V4SF 1 "register_operand" "0")
4030           (match_operand:SI 3 "const_pow2_1_to_8_operand" "n")))]
4031   "TARGET_SSE4_1"
4033   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])) << 4);
4034   return "insertps\t{%3, %2, %0|%0, %2, %3}";
4036   [(set_attr "type" "sselog")
4037    (set_attr "prefix_data16" "1")
4038    (set_attr "prefix_extra" "1")
4039    (set_attr "length_immediate" "1")
4040    (set_attr "mode" "V4SF")])
4042 (define_insn "*avx_insertps"
4043   [(set (match_operand:V4SF 0 "register_operand" "=x")
4044         (unspec:V4SF [(match_operand:V4SF 2 "nonimmediate_operand" "xm")
4045                       (match_operand:V4SF 1 "register_operand" "x")
4046                       (match_operand:SI 3 "const_0_to_255_operand" "n")]
4047                      UNSPEC_INSERTPS))]
4048   "TARGET_AVX"
4049   "vinsertps\t{%3, %2, %1, %0|%0, %1, %2, %3}";
4050   [(set_attr "type" "sselog")
4051    (set_attr "prefix" "vex")
4052    (set_attr "prefix_extra" "1")
4053    (set_attr "length_immediate" "1")
4054    (set_attr "mode" "V4SF")])
4056 (define_insn "sse4_1_insertps"
4057   [(set (match_operand:V4SF 0 "register_operand" "=x")
4058         (unspec:V4SF [(match_operand:V4SF 2 "register_operand" "x")
4059                       (match_operand:V4SF 1 "register_operand" "0")
4060                       (match_operand:SI 3 "const_0_to_255_operand" "n")]
4061                      UNSPEC_INSERTPS))]
4062   "TARGET_SSE4_1"
4063   "insertps\t{%3, %2, %0|%0, %2, %3}";
4064   [(set_attr "type" "sselog")
4065    (set_attr "prefix_data16" "1")
4066    (set_attr "prefix_extra" "1")
4067    (set_attr "length_immediate" "1")
4068    (set_attr "mode" "V4SF")])
4070 (define_split
4071   [(set (match_operand:V4SF 0 "memory_operand" "")
4072         (vec_merge:V4SF
4073           (vec_duplicate:V4SF
4074             (match_operand:SF 1 "nonmemory_operand" ""))
4075           (match_dup 0)
4076           (const_int 1)))]
4077   "TARGET_SSE && reload_completed"
4078   [(const_int 0)]
4080   emit_move_insn (adjust_address (operands[0], SFmode, 0), operands[1]);
4081   DONE;
4084 (define_expand "vec_set<mode>"
4085   [(match_operand:SSEMODE 0 "register_operand" "")
4086    (match_operand:<ssescalarmode> 1 "register_operand" "")
4087    (match_operand 2 "const_int_operand" "")]
4088   "TARGET_SSE"
4090   ix86_expand_vector_set (false, operands[0], operands[1],
4091                           INTVAL (operands[2]));
4092   DONE;
4095 (define_insn_and_split "*vec_extractv4sf_0"
4096   [(set (match_operand:SF 0 "nonimmediate_operand" "=x,m,f,r")
4097         (vec_select:SF
4098           (match_operand:V4SF 1 "nonimmediate_operand" "xm,x,m,m")
4099           (parallel [(const_int 0)])))]
4100   "TARGET_SSE && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
4101   "#"
4102   "&& reload_completed"
4103   [(const_int 0)]
4105   rtx op1 = operands[1];
4106   if (REG_P (op1))
4107     op1 = gen_rtx_REG (SFmode, REGNO (op1));
4108   else
4109     op1 = gen_lowpart (SFmode, op1);
4110   emit_move_insn (operands[0], op1);
4111   DONE;
4114 (define_expand "avx_vextractf128<mode>"
4115   [(match_operand:<avxhalfvecmode> 0 "nonimmediate_operand" "")
4116    (match_operand:AVX256MODE 1 "register_operand" "")
4117    (match_operand:SI 2 "const_0_to_1_operand" "")]
4118   "TARGET_AVX"
4120   switch (INTVAL (operands[2]))
4121     {
4122     case 0:
4123       emit_insn (gen_vec_extract_lo_<mode> (operands[0], operands[1]));
4124       break;
4125     case 1:
4126       emit_insn (gen_vec_extract_hi_<mode> (operands[0], operands[1]));
4127       break;
4128     default:
4129       gcc_unreachable ();
4130     }
4131   DONE;
4134 (define_insn "vec_extract_lo_<mode>"
4135   [(set (match_operand:<avxhalfvecmode> 0 "nonimmediate_operand" "=x,m")
4136         (vec_select:<avxhalfvecmode>
4137           (match_operand:AVX256MODE4P 1 "register_operand" "x,x")
4138           (parallel [(const_int 0) (const_int 1)])))]
4139   "TARGET_AVX"
4140   "vextractf128\t{$0x0, %1, %0|%0, %1, 0x0}"
4141   [(set_attr "type" "sselog")
4142    (set_attr "prefix_extra" "1")
4143    (set_attr "length_immediate" "1")
4144    (set_attr "memory" "none,store")
4145    (set_attr "prefix" "vex")
4146    (set_attr "mode" "V8SF")])
4148 (define_insn "vec_extract_hi_<mode>"
4149   [(set (match_operand:<avxhalfvecmode> 0 "nonimmediate_operand" "=x,m")
4150         (vec_select:<avxhalfvecmode>
4151           (match_operand:AVX256MODE4P 1 "register_operand" "x,x")
4152           (parallel [(const_int 2) (const_int 3)])))]
4153   "TARGET_AVX"
4154   "vextractf128\t{$0x1, %1, %0|%0, %1, 0x1}"
4155   [(set_attr "type" "sselog")
4156    (set_attr "prefix_extra" "1")
4157    (set_attr "length_immediate" "1")
4158    (set_attr "memory" "none,store")
4159    (set_attr "prefix" "vex")
4160    (set_attr "mode" "V8SF")])
4162 (define_insn "vec_extract_lo_<mode>"
4163   [(set (match_operand:<avxhalfvecmode> 0 "nonimmediate_operand" "=x,m")
4164         (vec_select:<avxhalfvecmode>
4165           (match_operand:AVX256MODE8P 1 "register_operand" "x,x")
4166           (parallel [(const_int 0) (const_int 1)
4167                      (const_int 2) (const_int 3)])))]
4168   "TARGET_AVX"
4169   "vextractf128\t{$0x1, %1, %0|%0, %1, 0x1}"
4170   [(set_attr "type" "sselog")
4171    (set_attr "prefix_extra" "1")
4172    (set_attr "length_immediate" "1")
4173    (set_attr "memory" "none,store")
4174    (set_attr "prefix" "vex")
4175    (set_attr "mode" "V8SF")])
4177 (define_insn "vec_extract_hi_<mode>"
4178   [(set (match_operand:<avxhalfvecmode> 0 "nonimmediate_operand" "=x,m")
4179         (vec_select:<avxhalfvecmode>
4180           (match_operand:AVX256MODE8P 1 "register_operand" "x,x")
4181           (parallel [(const_int 4) (const_int 5)
4182                      (const_int 6) (const_int 7)])))]
4183   "TARGET_AVX"
4184   "vextractf128\t{$0x1, %1, %0|%0, %1, 0x1}"
4185   [(set_attr "type" "sselog")
4186    (set_attr "prefix_extra" "1")
4187    (set_attr "length_immediate" "1")
4188    (set_attr "memory" "none,store")
4189    (set_attr "prefix" "vex")
4190    (set_attr "mode" "V8SF")])
4192 (define_insn "vec_extract_lo_v16hi"
4193   [(set (match_operand:V8HI 0 "nonimmediate_operand" "=x,m")
4194         (vec_select:V8HI
4195           (match_operand:V16HI 1 "register_operand" "x,x")
4196           (parallel [(const_int 0) (const_int 1)
4197                      (const_int 2) (const_int 3)
4198                      (const_int 4) (const_int 5)
4199                      (const_int 6) (const_int 7)])))]
4200   "TARGET_AVX"
4201   "vextractf128\t{$0x1, %1, %0|%0, %1, 0x1}"
4202   [(set_attr "type" "sselog")
4203    (set_attr "prefix_extra" "1")
4204    (set_attr "length_immediate" "1")
4205    (set_attr "memory" "none,store")
4206    (set_attr "prefix" "vex")
4207    (set_attr "mode" "V8SF")])
4209 (define_insn "vec_extract_hi_v16hi"
4210   [(set (match_operand:V8HI 0 "nonimmediate_operand" "=x,m")
4211         (vec_select:V8HI
4212           (match_operand:V16HI 1 "register_operand" "x,x")
4213           (parallel [(const_int 8) (const_int 9)
4214                      (const_int 10) (const_int 11)
4215                      (const_int 12) (const_int 13)
4216                      (const_int 14) (const_int 15)])))]
4217   "TARGET_AVX"
4218   "vextractf128\t{$0x1, %1, %0|%0, %1, 0x1}"
4219   [(set_attr "type" "sselog")
4220    (set_attr "prefix_extra" "1")
4221    (set_attr "length_immediate" "1")
4222    (set_attr "memory" "none,store")
4223    (set_attr "prefix" "vex")
4224    (set_attr "mode" "V8SF")])
4226 (define_insn "vec_extract_lo_v32qi"
4227   [(set (match_operand:V16QI 0 "nonimmediate_operand" "=x,m")
4228         (vec_select:V16QI
4229           (match_operand:V32QI 1 "register_operand" "x,x")
4230           (parallel [(const_int 0) (const_int 1)
4231                      (const_int 2) (const_int 3)
4232                      (const_int 4) (const_int 5)
4233                      (const_int 6) (const_int 7)
4234                      (const_int 8) (const_int 9)
4235                      (const_int 10) (const_int 11)
4236                      (const_int 12) (const_int 13)
4237                      (const_int 14) (const_int 15)])))]
4238   "TARGET_AVX"
4239   "vextractf128\t{$0x1, %1, %0|%0, %1, 0x1}"
4240   [(set_attr "type" "sselog")
4241    (set_attr "prefix_extra" "1")
4242    (set_attr "length_immediate" "1")
4243    (set_attr "memory" "none,store")
4244    (set_attr "prefix" "vex")
4245    (set_attr "mode" "V8SF")])
4247 (define_insn "vec_extract_hi_v32qi"
4248   [(set (match_operand:V16QI 0 "nonimmediate_operand" "=x,m")
4249         (vec_select:V16QI
4250           (match_operand:V32QI 1 "register_operand" "x,x")
4251           (parallel [(const_int 16) (const_int 17)
4252                      (const_int 18) (const_int 19)
4253                      (const_int 20) (const_int 21)
4254                      (const_int 22) (const_int 23)
4255                      (const_int 24) (const_int 25)
4256                      (const_int 26) (const_int 27)
4257                      (const_int 28) (const_int 29)
4258                      (const_int 30) (const_int 31)])))]
4259   "TARGET_AVX"
4260   "vextractf128\t{$0x1, %1, %0|%0, %1, 0x1}"
4261   [(set_attr "type" "sselog")
4262    (set_attr "prefix_extra" "1")
4263    (set_attr "length_immediate" "1")
4264    (set_attr "memory" "none,store")
4265    (set_attr "prefix" "vex")
4266    (set_attr "mode" "V8SF")])
4268 (define_insn "*sse4_1_extractps"
4269   [(set (match_operand:SF 0 "nonimmediate_operand" "=rm")
4270         (vec_select:SF
4271           (match_operand:V4SF 1 "register_operand" "x")
4272           (parallel [(match_operand:SI 2 "const_0_to_3_operand" "n")])))]
4273   "TARGET_SSE4_1"
4274   "%vextractps\t{%2, %1, %0|%0, %1, %2}"
4275   [(set_attr "type" "sselog")
4276    (set_attr "prefix_data16" "1")
4277    (set_attr "prefix_extra" "1")
4278    (set_attr "length_immediate" "1")
4279    (set_attr "prefix" "maybe_vex")
4280    (set_attr "mode" "V4SF")])
4282 (define_insn_and_split "*vec_extract_v4sf_mem"
4283   [(set (match_operand:SF 0 "register_operand" "=x*rf")
4284        (vec_select:SF
4285          (match_operand:V4SF 1 "memory_operand" "o")
4286          (parallel [(match_operand 2 "const_0_to_3_operand" "n")])))]
4287   ""
4288   "#"
4289   "reload_completed"
4290   [(const_int 0)]
4292   int i = INTVAL (operands[2]);
4294   emit_move_insn (operands[0], adjust_address (operands[1], SFmode, i*4));
4295   DONE;
4298 (define_expand "vec_extract<mode>"
4299   [(match_operand:<ssescalarmode> 0 "register_operand" "")
4300    (match_operand:SSEMODE 1 "register_operand" "")
4301    (match_operand 2 "const_int_operand" "")]
4302   "TARGET_SSE"
4304   ix86_expand_vector_extract (false, operands[0], operands[1],
4305                               INTVAL (operands[2]));
4306   DONE;
4309 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4311 ;; Parallel double-precision floating point element swizzling
4313 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4315 ;; Recall that the 256-bit unpck insns only shuffle within their lanes.
4316 (define_insn "avx_unpckhpd256"
4317   [(set (match_operand:V4DF 0 "register_operand" "=x")
4318         (vec_select:V4DF
4319           (vec_concat:V8DF
4320             (match_operand:V4DF 1 "register_operand" "x")
4321             (match_operand:V4DF 2 "nonimmediate_operand" "xm"))
4322           (parallel [(const_int 1) (const_int 5)
4323                      (const_int 3) (const_int 7)])))]
4324   "TARGET_AVX"
4325   "vunpckhpd\t{%2, %1, %0|%0, %1, %2}"
4326   [(set_attr "type" "sselog")
4327    (set_attr "prefix" "vex")
4328    (set_attr "mode" "V4DF")])
4330 (define_expand "vec_interleave_highv2df"
4331   [(set (match_operand:V2DF 0 "register_operand" "")
4332         (vec_select:V2DF
4333           (vec_concat:V4DF
4334             (match_operand:V2DF 1 "nonimmediate_operand" "")
4335             (match_operand:V2DF 2 "nonimmediate_operand" ""))
4336           (parallel [(const_int 1)
4337                      (const_int 3)])))]
4338   "TARGET_SSE2"
4340   if (!ix86_vec_interleave_v2df_operator_ok (operands, 1))
4341     operands[2] = force_reg (V2DFmode, operands[2]);
4344 (define_insn "*avx_interleave_highv2df"
4345   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,x,x,m")
4346         (vec_select:V2DF
4347           (vec_concat:V4DF
4348             (match_operand:V2DF 1 "nonimmediate_operand" " x,o,o,x")
4349             (match_operand:V2DF 2 "nonimmediate_operand" " x,1,x,0"))
4350           (parallel [(const_int 1)
4351                      (const_int 3)])))]
4352   "TARGET_AVX && ix86_vec_interleave_v2df_operator_ok (operands, 1)"
4353   "@
4354    vunpckhpd\t{%2, %1, %0|%0, %1, %2}
4355    vmovddup\t{%H1, %0|%0, %H1}
4356    vmovlpd\t{%H1, %2, %0|%0, %2, %H1}
4357    vmovhpd\t{%1, %0|%0, %1}"
4358   [(set_attr "type" "sselog,sselog,ssemov,ssemov")
4359    (set_attr "prefix" "vex")
4360    (set_attr "mode" "V2DF,V2DF,V1DF,V1DF")])
4362 (define_insn "*sse3_interleave_highv2df"
4363   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,x,x,m")
4364         (vec_select:V2DF
4365           (vec_concat:V4DF
4366             (match_operand:V2DF 1 "nonimmediate_operand" " 0,o,o,x")
4367             (match_operand:V2DF 2 "nonimmediate_operand" " x,1,0,0"))
4368           (parallel [(const_int 1)
4369                      (const_int 3)])))]
4370   "TARGET_SSE3 && ix86_vec_interleave_v2df_operator_ok (operands, 1)"
4371   "@
4372    unpckhpd\t{%2, %0|%0, %2}
4373    movddup\t{%H1, %0|%0, %H1}
4374    movlpd\t{%H1, %0|%0, %H1}
4375    movhpd\t{%1, %0|%0, %1}"
4376   [(set_attr "type" "sselog,sselog,ssemov,ssemov")
4377    (set_attr "prefix_data16" "*,*,1,1")
4378    (set_attr "mode" "V2DF,V2DF,V1DF,V1DF")])
4380 (define_insn "*sse2_interleave_highv2df"
4381   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,x,m")
4382         (vec_select:V2DF
4383           (vec_concat:V4DF
4384             (match_operand:V2DF 1 "nonimmediate_operand" " 0,o,x")
4385             (match_operand:V2DF 2 "nonimmediate_operand" " x,0,0"))
4386           (parallel [(const_int 1)
4387                      (const_int 3)])))]
4388   "TARGET_SSE2 && ix86_vec_interleave_v2df_operator_ok (operands, 1)"
4389   "@
4390    unpckhpd\t{%2, %0|%0, %2}
4391    movlpd\t{%H1, %0|%0, %H1}
4392    movhpd\t{%1, %0|%0, %1}"
4393   [(set_attr "type" "sselog,ssemov,ssemov")
4394    (set_attr "prefix_data16" "*,1,1")
4395    (set_attr "mode" "V2DF,V1DF,V1DF")])
4397 ;; Recall that the 256-bit unpck insns only shuffle within their lanes.
4398 (define_expand "avx_movddup256"
4399   [(set (match_operand:V4DF 0 "register_operand" "")
4400         (vec_select:V4DF
4401           (vec_concat:V8DF
4402             (match_operand:V4DF 1 "nonimmediate_operand" "")
4403             (match_dup 1))
4404           (parallel [(const_int 0) (const_int 4)
4405                      (const_int 2) (const_int 6)])))]
4406   "TARGET_AVX"
4407   "")
4409 (define_expand "avx_unpcklpd256"
4410   [(set (match_operand:V4DF 0 "register_operand" "")
4411         (vec_select:V4DF
4412           (vec_concat:V8DF
4413             (match_operand:V4DF 1 "register_operand" "")
4414             (match_operand:V4DF 2 "nonimmediate_operand" ""))
4415           (parallel [(const_int 0) (const_int 4)
4416                      (const_int 2) (const_int 6)])))]
4417   "TARGET_AVX"
4418   "")
4420 (define_insn "*avx_unpcklpd256"
4421   [(set (match_operand:V4DF 0 "register_operand"         "=x,x")
4422         (vec_select:V4DF
4423           (vec_concat:V8DF
4424             (match_operand:V4DF 1 "nonimmediate_operand" "xm,x")
4425             (match_operand:V4DF 2 "nonimmediate_operand" " 1,xm"))
4426           (parallel [(const_int 0) (const_int 4)
4427                      (const_int 2) (const_int 6)])))]
4428   "TARGET_AVX
4429    && (!MEM_P (operands[1]) || rtx_equal_p (operands[1], operands[2]))"
4430   "@
4431    vmovddup\t{%1, %0|%0, %1}
4432    vunpcklpd\t{%2, %1, %0|%0, %1, %2}"
4433   [(set_attr "type" "sselog")
4434    (set_attr "prefix" "vex")
4435    (set_attr "mode" "V4DF")])
4437 (define_expand "vec_interleave_lowv2df"
4438   [(set (match_operand:V2DF 0 "register_operand" "")
4439         (vec_select:V2DF
4440           (vec_concat:V4DF
4441             (match_operand:V2DF 1 "nonimmediate_operand" "")
4442             (match_operand:V2DF 2 "nonimmediate_operand" ""))
4443           (parallel [(const_int 0)
4444                      (const_int 2)])))]
4445   "TARGET_SSE2"
4447   if (!ix86_vec_interleave_v2df_operator_ok (operands, 0))
4448     operands[1] = force_reg (V2DFmode, operands[1]);
4451 (define_insn "*avx_interleave_lowv2df"
4452   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,x,x,o")
4453         (vec_select:V2DF
4454           (vec_concat:V4DF
4455             (match_operand:V2DF 1 "nonimmediate_operand" " x,m,x,0")
4456             (match_operand:V2DF 2 "nonimmediate_operand" " x,1,m,x"))
4457           (parallel [(const_int 0)
4458                      (const_int 2)])))]
4459   "TARGET_AVX && ix86_vec_interleave_v2df_operator_ok (operands, 0)"
4460   "@
4461    vunpcklpd\t{%2, %1, %0|%0, %1, %2}
4462    vmovddup\t{%1, %0|%0, %1}
4463    vmovhpd\t{%2, %1, %0|%0, %1, %2}
4464    vmovlpd\t{%2, %H0|%H0, %2}"
4465   [(set_attr "type" "sselog,sselog,ssemov,ssemov")
4466    (set_attr "prefix" "vex")
4467    (set_attr "mode" "V2DF,V2DF,V1DF,V1DF")])
4469 (define_insn "*sse3_interleave_lowv2df"
4470   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,x,x,o")
4471         (vec_select:V2DF
4472           (vec_concat:V4DF
4473             (match_operand:V2DF 1 "nonimmediate_operand" " 0,m,0,0")
4474             (match_operand:V2DF 2 "nonimmediate_operand" " x,1,m,x"))
4475           (parallel [(const_int 0)
4476                      (const_int 2)])))]
4477   "TARGET_SSE3 && ix86_vec_interleave_v2df_operator_ok (operands, 0)"
4478   "@
4479    unpcklpd\t{%2, %0|%0, %2}
4480    movddup\t{%1, %0|%0, %1}
4481    movhpd\t{%2, %0|%0, %2}
4482    movlpd\t{%2, %H0|%H0, %2}"
4483   [(set_attr "type" "sselog,sselog,ssemov,ssemov")
4484    (set_attr "prefix_data16" "*,*,1,1")
4485    (set_attr "mode" "V2DF,V2DF,V1DF,V1DF")])
4487 (define_insn "*sse2_interleave_lowv2df"
4488   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,x,o")
4489         (vec_select:V2DF
4490           (vec_concat:V4DF
4491             (match_operand:V2DF 1 "nonimmediate_operand" " 0,0,0")
4492             (match_operand:V2DF 2 "nonimmediate_operand" " x,m,x"))
4493           (parallel [(const_int 0)
4494                      (const_int 2)])))]
4495   "TARGET_SSE2 && ix86_vec_interleave_v2df_operator_ok (operands, 0)"
4496   "@
4497    unpcklpd\t{%2, %0|%0, %2}
4498    movhpd\t{%2, %0|%0, %2}
4499    movlpd\t{%2, %H0|%H0, %2}"
4500   [(set_attr "type" "sselog,ssemov,ssemov")
4501    (set_attr "prefix_data16" "*,1,1")
4502    (set_attr "mode" "V2DF,V1DF,V1DF")])
4504 (define_split
4505   [(set (match_operand:V2DF 0 "memory_operand" "")
4506         (vec_select:V2DF
4507           (vec_concat:V4DF
4508             (match_operand:V2DF 1 "register_operand" "")
4509             (match_dup 1))
4510           (parallel [(const_int 0)
4511                      (const_int 2)])))]
4512   "TARGET_SSE3 && reload_completed"
4513   [(const_int 0)]
4515   rtx low = gen_rtx_REG (DFmode, REGNO (operands[1]));
4516   emit_move_insn (adjust_address (operands[0], DFmode, 0), low);
4517   emit_move_insn (adjust_address (operands[0], DFmode, 8), low);
4518   DONE;
4521 (define_split
4522   [(set (match_operand:V2DF 0 "register_operand" "")
4523         (vec_select:V2DF
4524           (vec_concat:V4DF
4525             (match_operand:V2DF 1 "memory_operand" "")
4526             (match_dup 1))
4527           (parallel [(match_operand:SI 2 "const_0_to_1_operand" "")
4528                      (match_operand:SI 3 "const_int_operand" "")])))]
4529   "TARGET_SSE3 && INTVAL (operands[2]) + 2 == INTVAL (operands[3])"
4530   [(set (match_dup 0) (vec_duplicate:V2DF (match_dup 1)))]
4532   operands[1] = adjust_address (operands[1], DFmode, INTVAL (operands[2]) * 8);
4535 (define_expand "avx_shufpd256"
4536   [(match_operand:V4DF 0 "register_operand" "")
4537    (match_operand:V4DF 1 "register_operand" "")
4538    (match_operand:V4DF 2 "nonimmediate_operand" "")
4539    (match_operand:SI 3 "const_int_operand" "")]
4540   "TARGET_AVX"
4542   int mask = INTVAL (operands[3]);
4543   emit_insn (gen_avx_shufpd256_1 (operands[0], operands[1], operands[2],
4544                                    GEN_INT (mask & 1),
4545                                    GEN_INT (mask & 2 ? 5 : 4),
4546                                    GEN_INT (mask & 4 ? 3 : 2),
4547                                    GEN_INT (mask & 8 ? 7 : 6)));
4548   DONE;
4551 (define_insn "avx_shufpd256_1"
4552   [(set (match_operand:V4DF 0 "register_operand" "=x")
4553         (vec_select:V4DF
4554           (vec_concat:V8DF
4555             (match_operand:V4DF 1 "register_operand" "x")
4556             (match_operand:V4DF 2 "nonimmediate_operand" "xm"))
4557           (parallel [(match_operand 3 "const_0_to_1_operand" "")
4558                      (match_operand 4 "const_4_to_5_operand" "")
4559                      (match_operand 5 "const_2_to_3_operand" "")
4560                      (match_operand 6 "const_6_to_7_operand" "")])))]
4561   "TARGET_AVX"
4563   int mask;
4564   mask = INTVAL (operands[3]);
4565   mask |= (INTVAL (operands[4]) - 4) << 1;
4566   mask |= (INTVAL (operands[5]) - 2) << 2;
4567   mask |= (INTVAL (operands[6]) - 6) << 3;
4568   operands[3] = GEN_INT (mask);
4570   return "vshufpd\t{%3, %2, %1, %0|%0, %1, %2, %3}";
4572   [(set_attr "type" "sselog")
4573    (set_attr "length_immediate" "1")
4574    (set_attr "prefix" "vex")
4575    (set_attr "mode" "V4DF")])
4577 (define_expand "sse2_shufpd"
4578   [(match_operand:V2DF 0 "register_operand" "")
4579    (match_operand:V2DF 1 "register_operand" "")
4580    (match_operand:V2DF 2 "nonimmediate_operand" "")
4581    (match_operand:SI 3 "const_int_operand" "")]
4582   "TARGET_SSE2"
4584   int mask = INTVAL (operands[3]);
4585   emit_insn (gen_sse2_shufpd_v2df (operands[0], operands[1], operands[2],
4586                                 GEN_INT (mask & 1),
4587                                 GEN_INT (mask & 2 ? 3 : 2)));
4588   DONE;
4591 (define_expand "vec_extract_even<mode>"
4592   [(match_operand:SSEMODE_EO 0 "register_operand" "")
4593    (match_operand:SSEMODE_EO 1 "register_operand" "")
4594    (match_operand:SSEMODE_EO 2 "register_operand" "")]
4595   ""
4597   ix86_expand_vec_extract_even_odd (operands[0], operands[1], operands[2], 0);
4598   DONE;
4601 (define_expand "vec_extract_odd<mode>"
4602   [(match_operand:SSEMODE_EO 0 "register_operand" "")
4603    (match_operand:SSEMODE_EO 1 "register_operand" "")
4604    (match_operand:SSEMODE_EO 2 "register_operand" "")]
4605   ""
4607   ix86_expand_vec_extract_even_odd (operands[0], operands[1], operands[2], 1);
4608   DONE;
4611 ;; punpcklqdq and punpckhqdq are shorter than shufpd.
4612 (define_insn "*avx_interleave_highv2di"
4613   [(set (match_operand:V2DI 0 "register_operand" "=x")
4614         (vec_select:V2DI
4615           (vec_concat:V4DI
4616             (match_operand:V2DI 1 "register_operand" "x")
4617             (match_operand:V2DI 2 "nonimmediate_operand" "xm"))
4618           (parallel [(const_int 1)
4619                      (const_int 3)])))]
4620   "TARGET_AVX"
4621   "vpunpckhqdq\t{%2, %1, %0|%0, %1, %2}"
4622   [(set_attr "type" "sselog")
4623    (set_attr "prefix" "vex")
4624    (set_attr "mode" "TI")])
4626 (define_insn "vec_interleave_highv2di"
4627   [(set (match_operand:V2DI 0 "register_operand" "=x")
4628         (vec_select:V2DI
4629           (vec_concat:V4DI
4630             (match_operand:V2DI 1 "register_operand" "0")
4631             (match_operand:V2DI 2 "nonimmediate_operand" "xm"))
4632           (parallel [(const_int 1)
4633                      (const_int 3)])))]
4634   "TARGET_SSE2"
4635   "punpckhqdq\t{%2, %0|%0, %2}"
4636   [(set_attr "type" "sselog")
4637    (set_attr "prefix_data16" "1")
4638    (set_attr "mode" "TI")])
4640 (define_insn "*avx_interleave_lowv2di"
4641   [(set (match_operand:V2DI 0 "register_operand" "=x")
4642         (vec_select:V2DI
4643           (vec_concat:V4DI
4644             (match_operand:V2DI 1 "register_operand" "x")
4645             (match_operand:V2DI 2 "nonimmediate_operand" "xm"))
4646           (parallel [(const_int 0)
4647                      (const_int 2)])))]
4648   "TARGET_AVX"
4649   "vpunpcklqdq\t{%2, %1, %0|%0, %1, %2}"
4650   [(set_attr "type" "sselog")
4651    (set_attr "prefix" "vex")
4652    (set_attr "mode" "TI")])
4654 (define_insn "vec_interleave_lowv2di"
4655   [(set (match_operand:V2DI 0 "register_operand" "=x")
4656         (vec_select:V2DI
4657           (vec_concat:V4DI
4658             (match_operand:V2DI 1 "register_operand" "0")
4659             (match_operand:V2DI 2 "nonimmediate_operand" "xm"))
4660           (parallel [(const_int 0)
4661                      (const_int 2)])))]
4662   "TARGET_SSE2"
4663   "punpcklqdq\t{%2, %0|%0, %2}"
4664   [(set_attr "type" "sselog")
4665    (set_attr "prefix_data16" "1")
4666    (set_attr "mode" "TI")])
4668 (define_insn "*avx_shufpd_<mode>"
4669   [(set (match_operand:SSEMODE2D 0 "register_operand" "=x")
4670         (vec_select:SSEMODE2D
4671           (vec_concat:<ssedoublesizemode>
4672             (match_operand:SSEMODE2D 1 "register_operand" "x")
4673             (match_operand:SSEMODE2D 2 "nonimmediate_operand" "xm"))
4674           (parallel [(match_operand 3 "const_0_to_1_operand" "")
4675                      (match_operand 4 "const_2_to_3_operand" "")])))]
4676   "TARGET_AVX"
4678   int mask;
4679   mask = INTVAL (operands[3]);
4680   mask |= (INTVAL (operands[4]) - 2) << 1;
4681   operands[3] = GEN_INT (mask);
4683   return "vshufpd\t{%3, %2, %1, %0|%0, %1, %2, %3}";
4685   [(set_attr "type" "sselog")
4686    (set_attr "length_immediate" "1")
4687    (set_attr "prefix" "vex")
4688    (set_attr "mode" "V2DF")])
4690 (define_insn "sse2_shufpd_<mode>"
4691   [(set (match_operand:SSEMODE2D 0 "register_operand" "=x")
4692         (vec_select:SSEMODE2D
4693           (vec_concat:<ssedoublesizemode>
4694             (match_operand:SSEMODE2D 1 "register_operand" "0")
4695             (match_operand:SSEMODE2D 2 "nonimmediate_operand" "xm"))
4696           (parallel [(match_operand 3 "const_0_to_1_operand" "")
4697                      (match_operand 4 "const_2_to_3_operand" "")])))]
4698   "TARGET_SSE2"
4700   int mask;
4701   mask = INTVAL (operands[3]);
4702   mask |= (INTVAL (operands[4]) - 2) << 1;
4703   operands[3] = GEN_INT (mask);
4705   return "shufpd\t{%3, %2, %0|%0, %2, %3}";
4707   [(set_attr "type" "sselog")
4708    (set_attr "length_immediate" "1")
4709    (set_attr "mode" "V2DF")])
4711 ;; Avoid combining registers from different units in a single alternative,
4712 ;; see comment above inline_secondary_memory_needed function in i386.c
4713 (define_insn "*avx_storehpd"
4714   [(set (match_operand:DF 0 "nonimmediate_operand"     "=m,x,x,*f,r")
4715         (vec_select:DF
4716           (match_operand:V2DF 1 "nonimmediate_operand" " x,x,o,o,o")
4717           (parallel [(const_int 1)])))]
4718   "TARGET_AVX && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
4719   "@
4720    vmovhpd\t{%1, %0|%0, %1}
4721    vunpckhpd\t{%1, %1, %0|%0, %1, %1}
4722    #
4723    #
4724    #"
4725   [(set_attr "type" "ssemov,sselog1,ssemov,fmov,imov")
4726    (set_attr "prefix" "vex")
4727    (set_attr "mode" "V1DF,V2DF,DF,DF,DF")])
4729 (define_insn "sse2_storehpd"
4730   [(set (match_operand:DF 0 "nonimmediate_operand"     "=m,x,x,*f,r")
4731         (vec_select:DF
4732           (match_operand:V2DF 1 "nonimmediate_operand" " x,0,o,o,o")
4733           (parallel [(const_int 1)])))]
4734   "TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
4735   "@
4736    movhpd\t{%1, %0|%0, %1}
4737    unpckhpd\t%0, %0
4738    #
4739    #
4740    #"
4741   [(set_attr "type" "ssemov,sselog1,ssemov,fmov,imov")
4742    (set_attr "prefix_data16" "1,*,*,*,*")
4743    (set_attr "mode" "V1DF,V2DF,DF,DF,DF")])
4745 (define_split
4746   [(set (match_operand:DF 0 "register_operand" "")
4747         (vec_select:DF
4748           (match_operand:V2DF 1 "memory_operand" "")
4749           (parallel [(const_int 1)])))]
4750   "TARGET_SSE2 && reload_completed"
4751   [(set (match_dup 0) (match_dup 1))]
4753   operands[1] = adjust_address (operands[1], DFmode, 8);
4756 ;; Avoid combining registers from different units in a single alternative,
4757 ;; see comment above inline_secondary_memory_needed function in i386.c
4758 (define_insn "sse2_storelpd"
4759   [(set (match_operand:DF 0 "nonimmediate_operand"     "=m,x,x,*f,r")
4760         (vec_select:DF
4761           (match_operand:V2DF 1 "nonimmediate_operand" " x,x,m,m,m")
4762           (parallel [(const_int 0)])))]
4763   "TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
4764   "@
4765    %vmovlpd\t{%1, %0|%0, %1}
4766    #
4767    #
4768    #
4769    #"
4770   [(set_attr "type" "ssemov,ssemov,ssemov,fmov,imov")
4771    (set_attr "prefix_data16" "1,*,*,*,*")
4772    (set_attr "prefix" "maybe_vex")
4773    (set_attr "mode" "V1DF,DF,DF,DF,DF")])
4775 (define_split
4776   [(set (match_operand:DF 0 "register_operand" "")
4777         (vec_select:DF
4778           (match_operand:V2DF 1 "nonimmediate_operand" "")
4779           (parallel [(const_int 0)])))]
4780   "TARGET_SSE2 && reload_completed"
4781   [(const_int 0)]
4783   rtx op1 = operands[1];
4784   if (REG_P (op1))
4785     op1 = gen_rtx_REG (DFmode, REGNO (op1));
4786   else
4787     op1 = gen_lowpart (DFmode, op1);
4788   emit_move_insn (operands[0], op1);
4789   DONE;
4792 (define_expand "sse2_loadhpd_exp"
4793   [(set (match_operand:V2DF 0 "nonimmediate_operand" "")
4794         (vec_concat:V2DF
4795           (vec_select:DF
4796             (match_operand:V2DF 1 "nonimmediate_operand" "")
4797             (parallel [(const_int 0)]))
4798           (match_operand:DF 2 "nonimmediate_operand" "")))]
4799   "TARGET_SSE2"
4800   "ix86_fixup_binary_operands (UNKNOWN, V2DFmode, operands);")
4802 ;; Avoid combining registers from different units in a single alternative,
4803 ;; see comment above inline_secondary_memory_needed function in i386.c
4804 (define_insn "*avx_loadhpd"
4805   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,x,o,o,o")
4806         (vec_concat:V2DF
4807           (vec_select:DF
4808             (match_operand:V2DF 1 "nonimmediate_operand" " x,x,0,0,0")
4809             (parallel [(const_int 0)]))
4810           (match_operand:DF 2 "nonimmediate_operand"     " m,x,x,*f,r")))]
4811   "TARGET_AVX && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
4812   "@
4813    vmovhpd\t{%2, %1, %0|%0, %1, %2}
4814    vunpcklpd\t{%2, %1, %0|%0, %1, %2}
4815    #
4816    #
4817    #"
4818   [(set_attr "type" "ssemov,sselog,ssemov,fmov,imov")
4819    (set_attr "prefix" "vex")
4820    (set_attr "mode" "V1DF,V2DF,DF,DF,DF")])
4822 (define_insn "sse2_loadhpd"
4823   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,x,x,o,o,o")
4824         (vec_concat:V2DF
4825           (vec_select:DF
4826             (match_operand:V2DF 1 "nonimmediate_operand" " 0,0,x,0,0,0")
4827             (parallel [(const_int 0)]))
4828           (match_operand:DF 2 "nonimmediate_operand"     " m,x,0,x,*f,r")))]
4829   "TARGET_SSE2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
4830   "@
4831    movhpd\t{%2, %0|%0, %2}
4832    unpcklpd\t{%2, %0|%0, %2}
4833    shufpd\t{$1, %1, %0|%0, %1, 1}
4834    #
4835    #
4836    #"
4837   [(set_attr "type" "ssemov,sselog,sselog,ssemov,fmov,imov")
4838    (set_attr "prefix_data16" "1,*,*,*,*,*")
4839    (set_attr "length_immediate" "*,*,1,*,*,*")
4840    (set_attr "mode" "V1DF,V2DF,V2DF,DF,DF,DF")])
4842 (define_split
4843   [(set (match_operand:V2DF 0 "memory_operand" "")
4844         (vec_concat:V2DF
4845           (vec_select:DF (match_dup 0) (parallel [(const_int 0)]))
4846           (match_operand:DF 1 "register_operand" "")))]
4847   "TARGET_SSE2 && reload_completed"
4848   [(set (match_dup 0) (match_dup 1))]
4850   operands[0] = adjust_address (operands[0], DFmode, 8);
4853 (define_expand "sse2_loadlpd_exp"
4854   [(set (match_operand:V2DF 0 "nonimmediate_operand" "")
4855         (vec_concat:V2DF
4856           (match_operand:DF 2 "nonimmediate_operand" "")
4857           (vec_select:DF
4858             (match_operand:V2DF 1 "nonimmediate_operand" "")
4859             (parallel [(const_int 1)]))))]
4860   "TARGET_SSE2"
4861   "ix86_fixup_binary_operands (UNKNOWN, V2DFmode, operands);")
4863 ;; Avoid combining registers from different units in a single alternative,
4864 ;; see comment above inline_secondary_memory_needed function in i386.c
4865 (define_insn "*avx_loadlpd"
4866   [(set (match_operand:V2DF 0 "nonimmediate_operand"    "=x,x,x,x,m,m,m")
4867         (vec_concat:V2DF
4868           (match_operand:DF 2 "nonimmediate_operand"    " m,m,x,x,x,*f,r")
4869           (vec_select:DF
4870             (match_operand:V2DF 1 "vector_move_operand" " C,x,x,o,0,0,0")
4871             (parallel [(const_int 1)]))))]
4872   "TARGET_AVX && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
4873   "@
4874    vmovsd\t{%2, %0|%0, %2}
4875    vmovlpd\t{%2, %1, %0|%0, %1, %2}
4876    vmovsd\t{%2, %1, %0|%0, %1, %2}
4877    vmovhpd\t{%H1, %2, %0|%0, %2, %H1}
4878    #
4879    #
4880    #"
4881   [(set_attr "type" "ssemov,ssemov,ssemov,ssemov,ssemov,fmov,imov")
4882    (set_attr "prefix" "vex")
4883    (set_attr "mode" "DF,V1DF,V1DF,V1DF,DF,DF,DF")])
4885 (define_insn "sse2_loadlpd"
4886   [(set (match_operand:V2DF 0 "nonimmediate_operand"    "=x,x,x,x,x,m,m,m")
4887         (vec_concat:V2DF
4888           (match_operand:DF 2 "nonimmediate_operand"    " m,m,x,0,0,x,*f,r")
4889           (vec_select:DF
4890             (match_operand:V2DF 1 "vector_move_operand" " C,0,0,x,o,0,0,0")
4891             (parallel [(const_int 1)]))))]
4892   "TARGET_SSE2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
4893   "@
4894    movsd\t{%2, %0|%0, %2}
4895    movlpd\t{%2, %0|%0, %2}
4896    movsd\t{%2, %0|%0, %2}
4897    shufpd\t{$2, %2, %0|%0, %2, 2}
4898    movhpd\t{%H1, %0|%0, %H1}
4899    #
4900    #
4901    #"
4902   [(set_attr "type" "ssemov,ssemov,ssemov,sselog,ssemov,ssemov,fmov,imov")
4903    (set_attr "prefix_data16" "*,1,*,*,1,*,*,*")
4904    (set_attr "length_immediate" "*,*,*,1,*,*,*,*")
4905    (set_attr "mode" "DF,V1DF,V1DF,V2DF,V1DF,DF,DF,DF")])
4907 (define_split
4908   [(set (match_operand:V2DF 0 "memory_operand" "")
4909         (vec_concat:V2DF
4910           (match_operand:DF 1 "register_operand" "")
4911           (vec_select:DF (match_dup 0) (parallel [(const_int 1)]))))]
4912   "TARGET_SSE2 && reload_completed"
4913   [(set (match_dup 0) (match_dup 1))]
4915   operands[0] = adjust_address (operands[0], DFmode, 8);
4918 ;; Not sure these two are ever used, but it doesn't hurt to have
4919 ;; them. -aoliva
4920 (define_insn "*vec_extractv2df_1_sse"
4921   [(set (match_operand:DF 0 "nonimmediate_operand" "=m,x,x")
4922         (vec_select:DF
4923           (match_operand:V2DF 1 "nonimmediate_operand" "x,x,o")
4924           (parallel [(const_int 1)])))]
4925   "!TARGET_SSE2 && TARGET_SSE
4926    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
4927   "@
4928    movhps\t{%1, %0|%0, %1}
4929    movhlps\t{%1, %0|%0, %1}
4930    movlps\t{%H1, %0|%0, %H1}"
4931   [(set_attr "type" "ssemov")
4932    (set_attr "mode" "V2SF,V4SF,V2SF")])
4934 (define_insn "*vec_extractv2df_0_sse"
4935   [(set (match_operand:DF 0 "nonimmediate_operand" "=m,x,x")
4936         (vec_select:DF
4937           (match_operand:V2DF 1 "nonimmediate_operand" "x,x,m")
4938           (parallel [(const_int 0)])))]
4939   "!TARGET_SSE2 && TARGET_SSE
4940    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
4941   "@
4942    movlps\t{%1, %0|%0, %1}
4943    movaps\t{%1, %0|%0, %1}
4944    movlps\t{%1, %0|%0, %1}"
4945   [(set_attr "type" "ssemov")
4946    (set_attr "mode" "V2SF,V4SF,V2SF")])
4948 (define_insn "*avx_movsd"
4949   [(set (match_operand:V2DF 0 "nonimmediate_operand"   "=x,x,m,x,o")
4950         (vec_merge:V2DF
4951           (match_operand:V2DF 2 "nonimmediate_operand" " x,m,x,x,0")
4952           (match_operand:V2DF 1 "nonimmediate_operand" " x,x,0,o,x")
4953           (const_int 1)))]
4954   "TARGET_AVX"
4955   "@
4956    vmovsd\t{%2, %1, %0|%0, %1, %2}
4957    vmovlpd\t{%2, %1, %0|%0, %1, %2}
4958    vmovlpd\t{%2, %0|%0, %2}
4959    vmovhps\t{%H1, %2, %0|%0, %2, %H1}
4960    vmovhps\t{%1, %H0|%H0, %1}"
4961   [(set_attr "type" "ssemov,ssemov,ssemov,ssemov,ssemov")
4962    (set_attr "prefix" "vex")
4963    (set_attr "mode" "DF,V1DF,V1DF,V1DF,V1DF")])
4965 (define_insn "sse2_movsd"
4966   [(set (match_operand:V2DF 0 "nonimmediate_operand"   "=x,x,m,x,x,o")
4967         (vec_merge:V2DF
4968           (match_operand:V2DF 2 "nonimmediate_operand" " x,m,x,0,0,0")
4969           (match_operand:V2DF 1 "nonimmediate_operand" " 0,0,0,x,o,x")
4970           (const_int 1)))]
4971   "TARGET_SSE2"
4972   "@
4973    movsd\t{%2, %0|%0, %2}
4974    movlpd\t{%2, %0|%0, %2}
4975    movlpd\t{%2, %0|%0, %2}
4976    shufpd\t{$2, %2, %0|%0, %2, 2}
4977    movhps\t{%H1, %0|%0, %H1}
4978    movhps\t{%1, %H0|%H0, %1}"
4979   [(set_attr "type" "ssemov,ssemov,ssemov,sselog,ssemov,ssemov")
4980    (set_attr "prefix_data16" "*,1,1,*,*,*")
4981    (set_attr "length_immediate" "*,*,*,1,*,*")
4982    (set_attr "mode" "DF,V1DF,V1DF,V2DF,V1DF,V1DF")])
4984 (define_insn "*vec_dupv2df_sse3"
4985   [(set (match_operand:V2DF 0 "register_operand" "=x")
4986         (vec_duplicate:V2DF
4987           (match_operand:DF 1 "nonimmediate_operand" "xm")))]
4988   "TARGET_SSE3"
4989   "%vmovddup\t{%1, %0|%0, %1}"
4990   [(set_attr "type" "sselog1")
4991    (set_attr "prefix" "maybe_vex")
4992    (set_attr "mode" "DF")])
4994 (define_insn "vec_dupv2df"
4995   [(set (match_operand:V2DF 0 "register_operand" "=x")
4996         (vec_duplicate:V2DF
4997           (match_operand:DF 1 "register_operand" "0")))]
4998   "TARGET_SSE2"
4999   "unpcklpd\t%0, %0"
5000   [(set_attr "type" "sselog1")
5001    (set_attr "mode" "V2DF")])
5003 (define_insn "*vec_concatv2df_sse3"
5004   [(set (match_operand:V2DF 0 "register_operand" "=x")
5005         (vec_concat:V2DF
5006           (match_operand:DF 1 "nonimmediate_operand" "xm")
5007           (match_dup 1)))]
5008   "TARGET_SSE3"
5009   "%vmovddup\t{%1, %0|%0, %1}"
5010   [(set_attr "type" "sselog1")
5011    (set_attr "prefix" "maybe_vex")
5012    (set_attr "mode" "DF")])
5014 (define_insn "*vec_concatv2df_avx"
5015   [(set (match_operand:V2DF 0 "register_operand"     "=x,x,x")
5016         (vec_concat:V2DF
5017           (match_operand:DF 1 "nonimmediate_operand" " x,x,m")
5018           (match_operand:DF 2 "vector_move_operand"  " x,m,C")))]
5019   "TARGET_AVX"
5020   "@
5021    vunpcklpd\t{%2, %1, %0|%0, %1, %2}
5022    vmovhpd\t{%2, %1, %0|%0, %1, %2}
5023    vmovsd\t{%1, %0|%0, %1}"
5024   [(set_attr "type" "ssemov")
5025    (set_attr "prefix" "vex")
5026    (set_attr "mode" "DF,V1DF,DF")])
5028 (define_insn "*vec_concatv2df"
5029   [(set (match_operand:V2DF 0 "register_operand"     "=Y2,Y2,Y2,x,x")
5030         (vec_concat:V2DF
5031           (match_operand:DF 1 "nonimmediate_operand" " 0 ,0 ,m ,0,0")
5032           (match_operand:DF 2 "vector_move_operand"  " Y2,m ,C ,x,m")))]
5033   "TARGET_SSE"
5034   "@
5035    unpcklpd\t{%2, %0|%0, %2}
5036    movhpd\t{%2, %0|%0, %2}
5037    movsd\t{%1, %0|%0, %1}
5038    movlhps\t{%2, %0|%0, %2}
5039    movhps\t{%2, %0|%0, %2}"
5040   [(set_attr "type" "sselog,ssemov,ssemov,ssemov,ssemov")
5041    (set_attr "prefix_data16" "*,1,*,*,*")
5042    (set_attr "mode" "V2DF,V1DF,DF,V4SF,V2SF")])
5044 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5046 ;; Parallel integral arithmetic
5048 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5050 (define_expand "neg<mode>2"
5051   [(set (match_operand:SSEMODEI 0 "register_operand" "")
5052         (minus:SSEMODEI
5053           (match_dup 2)
5054           (match_operand:SSEMODEI 1 "nonimmediate_operand" "")))]
5055   "TARGET_SSE2"
5056   "operands[2] = force_reg (<MODE>mode, CONST0_RTX (<MODE>mode));")
5058 (define_expand "<plusminus_insn><mode>3"
5059   [(set (match_operand:SSEMODEI 0 "register_operand" "")
5060         (plusminus:SSEMODEI
5061           (match_operand:SSEMODEI 1 "nonimmediate_operand" "")
5062           (match_operand:SSEMODEI 2 "nonimmediate_operand" "")))]
5063   "TARGET_SSE2"
5064   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
5066 (define_insn "*avx_<plusminus_insn><mode>3"
5067   [(set (match_operand:SSEMODEI 0 "register_operand" "=x")
5068         (plusminus:SSEMODEI
5069           (match_operand:SSEMODEI 1 "nonimmediate_operand" "<comm>x")
5070           (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))]
5071   "TARGET_AVX && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
5072   "vp<plusminus_mnemonic><ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
5073   [(set_attr "type" "sseiadd")
5074    (set_attr "prefix" "vex")
5075    (set_attr "mode" "TI")])
5077 (define_insn "*<plusminus_insn><mode>3"
5078   [(set (match_operand:SSEMODEI 0 "register_operand" "=x")
5079         (plusminus:SSEMODEI
5080           (match_operand:SSEMODEI 1 "nonimmediate_operand" "<comm>0")
5081           (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))]
5082   "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
5083   "p<plusminus_mnemonic><ssevecsize>\t{%2, %0|%0, %2}"
5084   [(set_attr "type" "sseiadd")
5085    (set_attr "prefix_data16" "1")
5086    (set_attr "mode" "TI")])
5088 (define_expand "sse2_<plusminus_insn><mode>3"
5089   [(set (match_operand:SSEMODE12 0 "register_operand" "")
5090         (sat_plusminus:SSEMODE12
5091           (match_operand:SSEMODE12 1 "nonimmediate_operand" "")
5092           (match_operand:SSEMODE12 2 "nonimmediate_operand" "")))]
5093   "TARGET_SSE2"
5094   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
5096 (define_insn "*avx_<plusminus_insn><mode>3"
5097   [(set (match_operand:SSEMODE12 0 "register_operand" "=x")
5098         (sat_plusminus:SSEMODE12
5099           (match_operand:SSEMODE12 1 "nonimmediate_operand" "<comm>x")
5100           (match_operand:SSEMODE12 2 "nonimmediate_operand" "xm")))]
5101   "TARGET_AVX && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
5102   "vp<plusminus_mnemonic><ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
5103   [(set_attr "type" "sseiadd")
5104    (set_attr "prefix" "vex")
5105    (set_attr "mode" "TI")])
5107 (define_insn "*sse2_<plusminus_insn><mode>3"
5108   [(set (match_operand:SSEMODE12 0 "register_operand" "=x")
5109         (sat_plusminus:SSEMODE12
5110           (match_operand:SSEMODE12 1 "nonimmediate_operand" "<comm>0")
5111           (match_operand:SSEMODE12 2 "nonimmediate_operand" "xm")))]
5112   "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
5113   "p<plusminus_mnemonic><ssevecsize>\t{%2, %0|%0, %2}"
5114   [(set_attr "type" "sseiadd")
5115    (set_attr "prefix_data16" "1")
5116    (set_attr "mode" "TI")])
5118 (define_insn_and_split "mulv16qi3"
5119   [(set (match_operand:V16QI 0 "register_operand" "")
5120         (mult:V16QI (match_operand:V16QI 1 "register_operand" "")
5121                     (match_operand:V16QI 2 "register_operand" "")))]
5122   "TARGET_SSE2
5123    && can_create_pseudo_p ()"
5124   "#"
5125   "&& 1"
5126   [(const_int 0)]
5128   rtx t[6];
5129   int i;
5131   for (i = 0; i < 6; ++i)
5132     t[i] = gen_reg_rtx (V16QImode);
5134   /* Unpack data such that we've got a source byte in each low byte of
5135      each word.  We don't care what goes into the high byte of each word.
5136      Rather than trying to get zero in there, most convenient is to let
5137      it be a copy of the low byte.  */
5138   emit_insn (gen_vec_interleave_highv16qi (t[0], operands[1], operands[1]));
5139   emit_insn (gen_vec_interleave_highv16qi (t[1], operands[2], operands[2]));
5140   emit_insn (gen_vec_interleave_lowv16qi (t[2], operands[1], operands[1]));
5141   emit_insn (gen_vec_interleave_lowv16qi (t[3], operands[2], operands[2]));
5143   /* Multiply words.  The end-of-line annotations here give a picture of what
5144      the output of that instruction looks like.  Dot means don't care; the
5145      letters are the bytes of the result with A being the most significant.  */
5146   emit_insn (gen_mulv8hi3 (gen_lowpart (V8HImode, t[4]), /* .A.B.C.D.E.F.G.H */
5147                            gen_lowpart (V8HImode, t[0]),
5148                            gen_lowpart (V8HImode, t[1])));
5149   emit_insn (gen_mulv8hi3 (gen_lowpart (V8HImode, t[5]), /* .I.J.K.L.M.N.O.P */
5150                            gen_lowpart (V8HImode, t[2]),
5151                            gen_lowpart (V8HImode, t[3])));
5153   /* Extract the even bytes and merge them back together.  */
5154   ix86_expand_vec_extract_even_odd (operands[0], t[5], t[4], 0);
5155   DONE;
5158 (define_expand "mulv8hi3"
5159   [(set (match_operand:V8HI 0 "register_operand" "")
5160         (mult:V8HI (match_operand:V8HI 1 "nonimmediate_operand" "")
5161                    (match_operand:V8HI 2 "nonimmediate_operand" "")))]
5162   "TARGET_SSE2"
5163   "ix86_fixup_binary_operands_no_copy (MULT, V8HImode, operands);")
5165 (define_insn "*avx_mulv8hi3"
5166   [(set (match_operand:V8HI 0 "register_operand" "=x")
5167         (mult:V8HI (match_operand:V8HI 1 "nonimmediate_operand" "%x")
5168                    (match_operand:V8HI 2 "nonimmediate_operand" "xm")))]
5169   "TARGET_AVX && ix86_binary_operator_ok (MULT, V8HImode, operands)"
5170   "vpmullw\t{%2, %1, %0|%0, %1, %2}"
5171   [(set_attr "type" "sseimul")
5172    (set_attr "prefix" "vex")
5173    (set_attr "mode" "TI")])
5175 (define_insn "*mulv8hi3"
5176   [(set (match_operand:V8HI 0 "register_operand" "=x")
5177         (mult:V8HI (match_operand:V8HI 1 "nonimmediate_operand" "%0")
5178                    (match_operand:V8HI 2 "nonimmediate_operand" "xm")))]
5179   "TARGET_SSE2 && ix86_binary_operator_ok (MULT, V8HImode, operands)"
5180   "pmullw\t{%2, %0|%0, %2}"
5181   [(set_attr "type" "sseimul")
5182    (set_attr "prefix_data16" "1")
5183    (set_attr "mode" "TI")])
5185 (define_expand "smulv8hi3_highpart"
5186   [(set (match_operand:V8HI 0 "register_operand" "")
5187         (truncate:V8HI
5188           (lshiftrt:V8SI
5189             (mult:V8SI
5190               (sign_extend:V8SI
5191                 (match_operand:V8HI 1 "nonimmediate_operand" ""))
5192               (sign_extend:V8SI
5193                 (match_operand:V8HI 2 "nonimmediate_operand" "")))
5194             (const_int 16))))]
5195   "TARGET_SSE2"
5196   "ix86_fixup_binary_operands_no_copy (MULT, V8HImode, operands);")
5198 (define_insn "*avxv8hi3_highpart"
5199   [(set (match_operand:V8HI 0 "register_operand" "=x")
5200         (truncate:V8HI
5201           (lshiftrt:V8SI
5202             (mult:V8SI
5203               (sign_extend:V8SI
5204                 (match_operand:V8HI 1 "nonimmediate_operand" "%x"))
5205               (sign_extend:V8SI
5206                 (match_operand:V8HI 2 "nonimmediate_operand" "xm")))
5207             (const_int 16))))]
5208   "TARGET_AVX && ix86_binary_operator_ok (MULT, V8HImode, operands)"
5209   "vpmulhw\t{%2, %1, %0|%0, %1, %2}"
5210   [(set_attr "type" "sseimul")
5211    (set_attr "prefix" "vex")
5212    (set_attr "mode" "TI")])
5214 (define_insn "*smulv8hi3_highpart"
5215   [(set (match_operand:V8HI 0 "register_operand" "=x")
5216         (truncate:V8HI
5217           (lshiftrt:V8SI
5218             (mult:V8SI
5219               (sign_extend:V8SI
5220                 (match_operand:V8HI 1 "nonimmediate_operand" "%0"))
5221               (sign_extend:V8SI
5222                 (match_operand:V8HI 2 "nonimmediate_operand" "xm")))
5223             (const_int 16))))]
5224   "TARGET_SSE2 && ix86_binary_operator_ok (MULT, V8HImode, operands)"
5225   "pmulhw\t{%2, %0|%0, %2}"
5226   [(set_attr "type" "sseimul")
5227    (set_attr "prefix_data16" "1")
5228    (set_attr "mode" "TI")])
5230 (define_expand "umulv8hi3_highpart"
5231   [(set (match_operand:V8HI 0 "register_operand" "")
5232         (truncate:V8HI
5233           (lshiftrt:V8SI
5234             (mult:V8SI
5235               (zero_extend:V8SI
5236                 (match_operand:V8HI 1 "nonimmediate_operand" ""))
5237               (zero_extend:V8SI
5238                 (match_operand:V8HI 2 "nonimmediate_operand" "")))
5239             (const_int 16))))]
5240   "TARGET_SSE2"
5241   "ix86_fixup_binary_operands_no_copy (MULT, V8HImode, operands);")
5243 (define_insn "*avx_umulv8hi3_highpart"
5244   [(set (match_operand:V8HI 0 "register_operand" "=x")
5245         (truncate:V8HI
5246           (lshiftrt:V8SI
5247             (mult:V8SI
5248               (zero_extend:V8SI
5249                 (match_operand:V8HI 1 "nonimmediate_operand" "%x"))
5250               (zero_extend:V8SI
5251                 (match_operand:V8HI 2 "nonimmediate_operand" "xm")))
5252             (const_int 16))))]
5253   "TARGET_AVX && ix86_binary_operator_ok (MULT, V8HImode, operands)"
5254   "vpmulhuw\t{%2, %1, %0|%0, %1, %2}"
5255   [(set_attr "type" "sseimul")
5256    (set_attr "prefix" "vex")
5257    (set_attr "mode" "TI")])
5259 (define_insn "*umulv8hi3_highpart"
5260   [(set (match_operand:V8HI 0 "register_operand" "=x")
5261         (truncate:V8HI
5262           (lshiftrt:V8SI
5263             (mult:V8SI
5264               (zero_extend:V8SI
5265                 (match_operand:V8HI 1 "nonimmediate_operand" "%0"))
5266               (zero_extend:V8SI
5267                 (match_operand:V8HI 2 "nonimmediate_operand" "xm")))
5268             (const_int 16))))]
5269   "TARGET_SSE2 && ix86_binary_operator_ok (MULT, V8HImode, operands)"
5270   "pmulhuw\t{%2, %0|%0, %2}"
5271   [(set_attr "type" "sseimul")
5272    (set_attr "prefix_data16" "1")
5273    (set_attr "mode" "TI")])
5275 (define_expand "sse2_umulv2siv2di3"
5276   [(set (match_operand:V2DI 0 "register_operand" "")
5277         (mult:V2DI
5278           (zero_extend:V2DI
5279             (vec_select:V2SI
5280               (match_operand:V4SI 1 "nonimmediate_operand" "")
5281               (parallel [(const_int 0) (const_int 2)])))
5282           (zero_extend:V2DI
5283             (vec_select:V2SI
5284               (match_operand:V4SI 2 "nonimmediate_operand" "")
5285               (parallel [(const_int 0) (const_int 2)])))))]
5286   "TARGET_SSE2"
5287   "ix86_fixup_binary_operands_no_copy (MULT, V4SImode, operands);")
5289 (define_insn "*avx_umulv2siv2di3"
5290   [(set (match_operand:V2DI 0 "register_operand" "=x")
5291         (mult:V2DI
5292           (zero_extend:V2DI
5293             (vec_select:V2SI
5294               (match_operand:V4SI 1 "nonimmediate_operand" "%x")
5295               (parallel [(const_int 0) (const_int 2)])))
5296           (zero_extend:V2DI
5297             (vec_select:V2SI
5298               (match_operand:V4SI 2 "nonimmediate_operand" "xm")
5299               (parallel [(const_int 0) (const_int 2)])))))]
5300   "TARGET_AVX && ix86_binary_operator_ok (MULT, V4SImode, operands)"
5301   "vpmuludq\t{%2, %1, %0|%0, %1, %2}"
5302   [(set_attr "type" "sseimul")
5303    (set_attr "prefix" "vex")
5304    (set_attr "mode" "TI")])
5306 (define_insn "*sse2_umulv2siv2di3"
5307   [(set (match_operand:V2DI 0 "register_operand" "=x")
5308         (mult:V2DI
5309           (zero_extend:V2DI
5310             (vec_select:V2SI
5311               (match_operand:V4SI 1 "nonimmediate_operand" "%0")
5312               (parallel [(const_int 0) (const_int 2)])))
5313           (zero_extend:V2DI
5314             (vec_select:V2SI
5315               (match_operand:V4SI 2 "nonimmediate_operand" "xm")
5316               (parallel [(const_int 0) (const_int 2)])))))]
5317   "TARGET_SSE2 && ix86_binary_operator_ok (MULT, V4SImode, operands)"
5318   "pmuludq\t{%2, %0|%0, %2}"
5319   [(set_attr "type" "sseimul")
5320    (set_attr "prefix_data16" "1")
5321    (set_attr "mode" "TI")])
5323 (define_expand "sse4_1_mulv2siv2di3"
5324   [(set (match_operand:V2DI 0 "register_operand" "")
5325         (mult:V2DI
5326           (sign_extend:V2DI
5327             (vec_select:V2SI
5328               (match_operand:V4SI 1 "nonimmediate_operand" "")
5329               (parallel [(const_int 0) (const_int 2)])))
5330           (sign_extend:V2DI
5331             (vec_select:V2SI
5332               (match_operand:V4SI 2 "nonimmediate_operand" "")
5333               (parallel [(const_int 0) (const_int 2)])))))]
5334   "TARGET_SSE4_1"
5335   "ix86_fixup_binary_operands_no_copy (MULT, V4SImode, operands);")
5337 (define_insn "*avx_mulv2siv2di3"
5338   [(set (match_operand:V2DI 0 "register_operand" "=x")
5339         (mult:V2DI
5340           (sign_extend:V2DI
5341             (vec_select:V2SI
5342               (match_operand:V4SI 1 "nonimmediate_operand" "%x")
5343               (parallel [(const_int 0) (const_int 2)])))
5344           (sign_extend:V2DI
5345             (vec_select:V2SI
5346               (match_operand:V4SI 2 "nonimmediate_operand" "xm")
5347               (parallel [(const_int 0) (const_int 2)])))))]
5348   "TARGET_AVX && ix86_binary_operator_ok (MULT, V4SImode, operands)"
5349   "vpmuldq\t{%2, %1, %0|%0, %1, %2}"
5350   [(set_attr "type" "sseimul")
5351    (set_attr "prefix_extra" "1")
5352    (set_attr "prefix" "vex")
5353    (set_attr "mode" "TI")])
5355 (define_insn "*sse4_1_mulv2siv2di3"
5356   [(set (match_operand:V2DI 0 "register_operand" "=x")
5357         (mult:V2DI
5358           (sign_extend:V2DI
5359             (vec_select:V2SI
5360               (match_operand:V4SI 1 "nonimmediate_operand" "%0")
5361               (parallel [(const_int 0) (const_int 2)])))
5362           (sign_extend:V2DI
5363             (vec_select:V2SI
5364               (match_operand:V4SI 2 "nonimmediate_operand" "xm")
5365               (parallel [(const_int 0) (const_int 2)])))))]
5366   "TARGET_SSE4_1 && ix86_binary_operator_ok (MULT, V4SImode, operands)"
5367   "pmuldq\t{%2, %0|%0, %2}"
5368   [(set_attr "type" "sseimul")
5369    (set_attr "prefix_extra" "1")
5370    (set_attr "mode" "TI")])
5372 (define_expand "sse2_pmaddwd"
5373   [(set (match_operand:V4SI 0 "register_operand" "")
5374         (plus:V4SI
5375           (mult:V4SI
5376             (sign_extend:V4SI
5377               (vec_select:V4HI
5378                 (match_operand:V8HI 1 "nonimmediate_operand" "")
5379                 (parallel [(const_int 0)
5380                            (const_int 2)
5381                            (const_int 4)
5382                            (const_int 6)])))
5383             (sign_extend:V4SI
5384               (vec_select:V4HI
5385                 (match_operand:V8HI 2 "nonimmediate_operand" "")
5386                 (parallel [(const_int 0)
5387                            (const_int 2)
5388                            (const_int 4)
5389                            (const_int 6)]))))
5390           (mult:V4SI
5391             (sign_extend:V4SI
5392               (vec_select:V4HI (match_dup 1)
5393                 (parallel [(const_int 1)
5394                            (const_int 3)
5395                            (const_int 5)
5396                            (const_int 7)])))
5397             (sign_extend:V4SI
5398               (vec_select:V4HI (match_dup 2)
5399                 (parallel [(const_int 1)
5400                            (const_int 3)
5401                            (const_int 5)
5402                            (const_int 7)]))))))]
5403   "TARGET_SSE2"
5404   "ix86_fixup_binary_operands_no_copy (MULT, V8HImode, operands);")
5406 (define_insn "*avx_pmaddwd"
5407   [(set (match_operand:V4SI 0 "register_operand" "=x")
5408         (plus:V4SI
5409           (mult:V4SI
5410             (sign_extend:V4SI
5411               (vec_select:V4HI
5412                 (match_operand:V8HI 1 "nonimmediate_operand" "%x")
5413                 (parallel [(const_int 0)
5414                            (const_int 2)
5415                            (const_int 4)
5416                            (const_int 6)])))
5417             (sign_extend:V4SI
5418               (vec_select:V4HI
5419                 (match_operand:V8HI 2 "nonimmediate_operand" "xm")
5420                 (parallel [(const_int 0)
5421                            (const_int 2)
5422                            (const_int 4)
5423                            (const_int 6)]))))
5424           (mult:V4SI
5425             (sign_extend:V4SI
5426               (vec_select:V4HI (match_dup 1)
5427                 (parallel [(const_int 1)
5428                            (const_int 3)
5429                            (const_int 5)
5430                            (const_int 7)])))
5431             (sign_extend:V4SI
5432               (vec_select:V4HI (match_dup 2)
5433                 (parallel [(const_int 1)
5434                            (const_int 3)
5435                            (const_int 5)
5436                            (const_int 7)]))))))]
5437   "TARGET_AVX && ix86_binary_operator_ok (MULT, V8HImode, operands)"
5438   "vpmaddwd\t{%2, %1, %0|%0, %1, %2}"
5439   [(set_attr "type" "sseiadd")
5440    (set_attr "prefix" "vex")
5441    (set_attr "mode" "TI")])
5443 (define_insn "*sse2_pmaddwd"
5444   [(set (match_operand:V4SI 0 "register_operand" "=x")
5445         (plus:V4SI
5446           (mult:V4SI
5447             (sign_extend:V4SI
5448               (vec_select:V4HI
5449                 (match_operand:V8HI 1 "nonimmediate_operand" "%0")
5450                 (parallel [(const_int 0)
5451                            (const_int 2)
5452                            (const_int 4)
5453                            (const_int 6)])))
5454             (sign_extend:V4SI
5455               (vec_select:V4HI
5456                 (match_operand:V8HI 2 "nonimmediate_operand" "xm")
5457                 (parallel [(const_int 0)
5458                            (const_int 2)
5459                            (const_int 4)
5460                            (const_int 6)]))))
5461           (mult:V4SI
5462             (sign_extend:V4SI
5463               (vec_select:V4HI (match_dup 1)
5464                 (parallel [(const_int 1)
5465                            (const_int 3)
5466                            (const_int 5)
5467                            (const_int 7)])))
5468             (sign_extend:V4SI
5469               (vec_select:V4HI (match_dup 2)
5470                 (parallel [(const_int 1)
5471                            (const_int 3)
5472                            (const_int 5)
5473                            (const_int 7)]))))))]
5474   "TARGET_SSE2 && ix86_binary_operator_ok (MULT, V8HImode, operands)"
5475   "pmaddwd\t{%2, %0|%0, %2}"
5476   [(set_attr "type" "sseiadd")
5477    (set_attr "atom_unit" "simul")
5478    (set_attr "prefix_data16" "1")
5479    (set_attr "mode" "TI")])
5481 (define_expand "mulv4si3"
5482   [(set (match_operand:V4SI 0 "register_operand" "")
5483         (mult:V4SI (match_operand:V4SI 1 "register_operand" "")
5484                    (match_operand:V4SI 2 "register_operand" "")))]
5485   "TARGET_SSE2"
5487   if (TARGET_SSE4_1 || TARGET_AVX)
5488     ix86_fixup_binary_operands_no_copy (MULT, V4SImode, operands);
5491 (define_insn "*avx_mulv4si3"
5492   [(set (match_operand:V4SI 0 "register_operand" "=x")
5493         (mult:V4SI (match_operand:V4SI 1 "nonimmediate_operand" "%x")
5494                    (match_operand:V4SI 2 "nonimmediate_operand" "xm")))]
5495   "TARGET_AVX && ix86_binary_operator_ok (MULT, V4SImode, operands)"
5496   "vpmulld\t{%2, %1, %0|%0, %1, %2}"
5497   [(set_attr "type" "sseimul")
5498    (set_attr "prefix_extra" "1")
5499    (set_attr "prefix" "vex")
5500    (set_attr "mode" "TI")])
5502 (define_insn "*sse4_1_mulv4si3"
5503   [(set (match_operand:V4SI 0 "register_operand" "=x")
5504         (mult:V4SI (match_operand:V4SI 1 "nonimmediate_operand" "%0")
5505                    (match_operand:V4SI 2 "nonimmediate_operand" "xm")))]
5506   "TARGET_SSE4_1 && ix86_binary_operator_ok (MULT, V4SImode, operands)"
5507   "pmulld\t{%2, %0|%0, %2}"
5508   [(set_attr "type" "sseimul")
5509    (set_attr "prefix_extra" "1")
5510    (set_attr "mode" "TI")])
5512 (define_insn_and_split "*sse2_mulv4si3"
5513   [(set (match_operand:V4SI 0 "register_operand" "")
5514         (mult:V4SI (match_operand:V4SI 1 "register_operand" "")
5515                    (match_operand:V4SI 2 "register_operand" "")))]
5516   "TARGET_SSE2 && !TARGET_SSE4_1 && !TARGET_AVX
5517    && can_create_pseudo_p ()"
5518   "#"
5519   "&& 1"
5520   [(const_int 0)]
5522   rtx t1, t2, t3, t4, t5, t6, thirtytwo;
5523   rtx op0, op1, op2;
5525   op0 = operands[0];
5526   op1 = operands[1];
5527   op2 = operands[2];
5528   t1 = gen_reg_rtx (V4SImode);
5529   t2 = gen_reg_rtx (V4SImode);
5530   t3 = gen_reg_rtx (V4SImode);
5531   t4 = gen_reg_rtx (V4SImode);
5532   t5 = gen_reg_rtx (V4SImode);
5533   t6 = gen_reg_rtx (V4SImode);
5534   thirtytwo = GEN_INT (32);
5536   /* Multiply elements 2 and 0.  */
5537   emit_insn (gen_sse2_umulv2siv2di3 (gen_lowpart (V2DImode, t1),
5538                                      op1, op2));
5540   /* Shift both input vectors down one element, so that elements 3
5541      and 1 are now in the slots for elements 2 and 0.  For K8, at
5542      least, this is faster than using a shuffle.  */
5543   emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, t2),
5544                                  gen_lowpart (V1TImode, op1),
5545                                  thirtytwo));
5546   emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, t3),
5547                                  gen_lowpart (V1TImode, op2),
5548                                  thirtytwo));
5549   /* Multiply elements 3 and 1.  */
5550   emit_insn (gen_sse2_umulv2siv2di3 (gen_lowpart (V2DImode, t4),
5551                                      t2, t3));
5553   /* Move the results in element 2 down to element 1; we don't care
5554      what goes in elements 2 and 3.  */
5555   emit_insn (gen_sse2_pshufd_1 (t5, t1, const0_rtx, const2_rtx,
5556                                 const0_rtx, const0_rtx));
5557   emit_insn (gen_sse2_pshufd_1 (t6, t4, const0_rtx, const2_rtx,
5558                                 const0_rtx, const0_rtx));
5560   /* Merge the parts back together.  */
5561   emit_insn (gen_vec_interleave_lowv4si (op0, t5, t6));
5562   DONE;
5565 (define_insn_and_split "mulv2di3"
5566   [(set (match_operand:V2DI 0 "register_operand" "")
5567         (mult:V2DI (match_operand:V2DI 1 "register_operand" "")
5568                    (match_operand:V2DI 2 "register_operand" "")))]
5569   "TARGET_SSE2
5570    && can_create_pseudo_p ()"
5571   "#"
5572   "&& 1"
5573   [(const_int 0)]
5575   rtx t1, t2, t3, t4, t5, t6, thirtytwo;
5576   rtx op0, op1, op2;
5578   op0 = operands[0];
5579   op1 = operands[1];
5580   op2 = operands[2];
5582   if (TARGET_XOP)
5583     {
5584       /* op1: A,B,C,D, op2: E,F,G,H */
5585       op1 = gen_lowpart (V4SImode, op1);
5586       op2 = gen_lowpart (V4SImode, op2);
5588       t1 = gen_reg_rtx (V4SImode);
5589       t2 = gen_reg_rtx (V4SImode);
5590       t3 = gen_reg_rtx (V2DImode);
5591       t4 = gen_reg_rtx (V2DImode);
5593       /* t1: B,A,D,C */
5594       emit_insn (gen_sse2_pshufd_1 (t1, op1,
5595                                     GEN_INT (1),
5596                                     GEN_INT (0),
5597                                     GEN_INT (3),
5598                                     GEN_INT (2)));
5600       /* t2: (B*E),(A*F),(D*G),(C*H) */
5601       emit_insn (gen_mulv4si3 (t2, t1, op2));
5603       /* t4: (B*E)+(A*F), (D*G)+(C*H) */
5604       emit_insn (gen_xop_phadddq (t3, t2));
5606       /* t5: ((B*E)+(A*F))<<32, ((D*G)+(C*H))<<32 */
5607       emit_insn (gen_ashlv2di3 (t4, t3, GEN_INT (32)));
5609       /* op0: (((B*E)+(A*F))<<32)+(B*F), (((D*G)+(C*H))<<32)+(D*H) */
5610       emit_insn (gen_xop_pmacsdql (op0, op1, op2, t4));
5611     }
5612   else
5613     {
5614       t1 = gen_reg_rtx (V2DImode);
5615       t2 = gen_reg_rtx (V2DImode);
5616       t3 = gen_reg_rtx (V2DImode);
5617       t4 = gen_reg_rtx (V2DImode);
5618       t5 = gen_reg_rtx (V2DImode);
5619       t6 = gen_reg_rtx (V2DImode);
5620       thirtytwo = GEN_INT (32);
5622       /* Multiply low parts.  */
5623       emit_insn (gen_sse2_umulv2siv2di3 (t1, gen_lowpart (V4SImode, op1),
5624                                          gen_lowpart (V4SImode, op2)));
5626       /* Shift input vectors left 32 bits so we can multiply high parts.  */
5627       emit_insn (gen_lshrv2di3 (t2, op1, thirtytwo));
5628       emit_insn (gen_lshrv2di3 (t3, op2, thirtytwo));
5630       /* Multiply high parts by low parts.  */
5631       emit_insn (gen_sse2_umulv2siv2di3 (t4, gen_lowpart (V4SImode, op1),
5632                                          gen_lowpart (V4SImode, t3)));
5633       emit_insn (gen_sse2_umulv2siv2di3 (t5, gen_lowpart (V4SImode, op2),
5634                                          gen_lowpart (V4SImode, t2)));
5636       /* Shift them back.  */
5637       emit_insn (gen_ashlv2di3 (t4, t4, thirtytwo));
5638       emit_insn (gen_ashlv2di3 (t5, t5, thirtytwo));
5640       /* Add the three parts together.  */
5641       emit_insn (gen_addv2di3 (t6, t1, t4));
5642       emit_insn (gen_addv2di3 (op0, t6, t5));
5643     }
5644   DONE;
5647 (define_expand "vec_widen_smult_hi_v8hi"
5648   [(match_operand:V4SI 0 "register_operand" "")
5649    (match_operand:V8HI 1 "register_operand" "")
5650    (match_operand:V8HI 2 "register_operand" "")]
5651   "TARGET_SSE2"
5653   rtx op1, op2, t1, t2, dest;
5655   op1 = operands[1];
5656   op2 = operands[2];
5657   t1 = gen_reg_rtx (V8HImode);
5658   t2 = gen_reg_rtx (V8HImode);
5659   dest = gen_lowpart (V8HImode, operands[0]);
5661   emit_insn (gen_mulv8hi3 (t1, op1, op2));
5662   emit_insn (gen_smulv8hi3_highpart (t2, op1, op2));
5663   emit_insn (gen_vec_interleave_highv8hi (dest, t1, t2));
5664   DONE;
5667 (define_expand "vec_widen_smult_lo_v8hi"
5668   [(match_operand:V4SI 0 "register_operand" "")
5669    (match_operand:V8HI 1 "register_operand" "")
5670    (match_operand:V8HI 2 "register_operand" "")]
5671   "TARGET_SSE2"
5673   rtx op1, op2, t1, t2, dest;
5675   op1 = operands[1];
5676   op2 = operands[2];
5677   t1 = gen_reg_rtx (V8HImode);
5678   t2 = gen_reg_rtx (V8HImode);
5679   dest = gen_lowpart (V8HImode, operands[0]);
5681   emit_insn (gen_mulv8hi3 (t1, op1, op2));
5682   emit_insn (gen_smulv8hi3_highpart (t2, op1, op2));
5683   emit_insn (gen_vec_interleave_lowv8hi (dest, t1, t2));
5684   DONE;
5687 (define_expand "vec_widen_umult_hi_v8hi"
5688   [(match_operand:V4SI 0 "register_operand" "")
5689    (match_operand:V8HI 1 "register_operand" "")
5690    (match_operand:V8HI 2 "register_operand" "")]
5691   "TARGET_SSE2"
5693   rtx op1, op2, t1, t2, dest;
5695   op1 = operands[1];
5696   op2 = operands[2];
5697   t1 = gen_reg_rtx (V8HImode);
5698   t2 = gen_reg_rtx (V8HImode);
5699   dest = gen_lowpart (V8HImode, operands[0]);
5701   emit_insn (gen_mulv8hi3 (t1, op1, op2));
5702   emit_insn (gen_umulv8hi3_highpart (t2, op1, op2));
5703   emit_insn (gen_vec_interleave_highv8hi (dest, t1, t2));
5704   DONE;
5707 (define_expand "vec_widen_umult_lo_v8hi"
5708   [(match_operand:V4SI 0 "register_operand" "")
5709    (match_operand:V8HI 1 "register_operand" "")
5710    (match_operand:V8HI 2 "register_operand" "")]
5711   "TARGET_SSE2"
5713   rtx op1, op2, t1, t2, dest;
5715   op1 = operands[1];
5716   op2 = operands[2];
5717   t1 = gen_reg_rtx (V8HImode);
5718   t2 = gen_reg_rtx (V8HImode);
5719   dest = gen_lowpart (V8HImode, operands[0]);
5721   emit_insn (gen_mulv8hi3 (t1, op1, op2));
5722   emit_insn (gen_umulv8hi3_highpart (t2, op1, op2));
5723   emit_insn (gen_vec_interleave_lowv8hi (dest, t1, t2));
5724   DONE;
5727 (define_expand "vec_widen_smult_hi_v4si"
5728   [(match_operand:V2DI 0 "register_operand" "")
5729    (match_operand:V4SI 1 "register_operand" "")
5730    (match_operand:V4SI 2 "register_operand" "")]
5731   "TARGET_XOP"
5733   rtx t1, t2;
5735   t1 = gen_reg_rtx (V4SImode);
5736   t2 = gen_reg_rtx (V4SImode);
5738   emit_insn (gen_sse2_pshufd_1 (t1, operands[1],
5739                                 GEN_INT (0),
5740                                 GEN_INT (2),
5741                                 GEN_INT (1),
5742                                 GEN_INT (3)));
5743   emit_insn (gen_sse2_pshufd_1 (t2, operands[2],
5744                                 GEN_INT (0),
5745                                 GEN_INT (2),
5746                                 GEN_INT (1),
5747                                 GEN_INT (3)));
5748   emit_insn (gen_xop_mulv2div2di3_high (operands[0], t1, t2));
5749   DONE;
5752 (define_expand "vec_widen_smult_lo_v4si"
5753   [(match_operand:V2DI 0 "register_operand" "")
5754    (match_operand:V4SI 1 "register_operand" "")
5755    (match_operand:V4SI 2 "register_operand" "")]
5756   "TARGET_XOP"
5758   rtx t1, t2;
5760   t1 = gen_reg_rtx (V4SImode);
5761   t2 = gen_reg_rtx (V4SImode);
5763   emit_insn (gen_sse2_pshufd_1 (t1, operands[1],
5764                                 GEN_INT (0),
5765                                 GEN_INT (2),
5766                                 GEN_INT (1),
5767                                 GEN_INT (3)));
5768   emit_insn (gen_sse2_pshufd_1 (t2, operands[2],
5769                                 GEN_INT (0),
5770                                 GEN_INT (2),
5771                                 GEN_INT (1),
5772                                 GEN_INT (3)));
5773   emit_insn (gen_xop_mulv2div2di3_low (operands[0], t1, t2));
5774   DONE;
5777 (define_expand "vec_widen_umult_hi_v4si"
5778   [(match_operand:V2DI 0 "register_operand" "")
5779    (match_operand:V4SI 1 "register_operand" "")
5780    (match_operand:V4SI 2 "register_operand" "")]
5781   "TARGET_SSE2"
5783   rtx op1, op2, t1, t2;
5785   op1 = operands[1];
5786   op2 = operands[2];
5787   t1 = gen_reg_rtx (V4SImode);
5788   t2 = gen_reg_rtx (V4SImode);
5790   emit_insn (gen_vec_interleave_highv4si (t1, op1, op1));
5791   emit_insn (gen_vec_interleave_highv4si (t2, op2, op2));
5792   emit_insn (gen_sse2_umulv2siv2di3 (operands[0], t1, t2));
5793   DONE;
5796 (define_expand "vec_widen_umult_lo_v4si"
5797   [(match_operand:V2DI 0 "register_operand" "")
5798    (match_operand:V4SI 1 "register_operand" "")
5799    (match_operand:V4SI 2 "register_operand" "")]
5800   "TARGET_SSE2"
5802   rtx op1, op2, t1, t2;
5804   op1 = operands[1];
5805   op2 = operands[2];
5806   t1 = gen_reg_rtx (V4SImode);
5807   t2 = gen_reg_rtx (V4SImode);
5809   emit_insn (gen_vec_interleave_lowv4si (t1, op1, op1));
5810   emit_insn (gen_vec_interleave_lowv4si (t2, op2, op2));
5811   emit_insn (gen_sse2_umulv2siv2di3 (operands[0], t1, t2));
5812   DONE;
5815 (define_expand "sdot_prodv8hi"
5816   [(match_operand:V4SI 0 "register_operand" "")
5817    (match_operand:V8HI 1 "register_operand" "")
5818    (match_operand:V8HI 2 "register_operand" "")
5819    (match_operand:V4SI 3 "register_operand" "")]
5820   "TARGET_SSE2"
5822   rtx t = gen_reg_rtx (V4SImode);
5823   emit_insn (gen_sse2_pmaddwd (t, operands[1], operands[2]));
5824   emit_insn (gen_addv4si3 (operands[0], operands[3], t));
5825   DONE;
5828 (define_expand "udot_prodv4si"
5829   [(match_operand:V2DI 0 "register_operand" "")
5830    (match_operand:V4SI 1 "register_operand" "")
5831    (match_operand:V4SI 2 "register_operand" "")
5832    (match_operand:V2DI 3 "register_operand" "")]
5833   "TARGET_SSE2"
5835   rtx t1, t2, t3, t4;
5837   t1 = gen_reg_rtx (V2DImode);
5838   emit_insn (gen_sse2_umulv2siv2di3 (t1, operands[1], operands[2]));
5839   emit_insn (gen_addv2di3 (t1, t1, operands[3]));
5841   t2 = gen_reg_rtx (V4SImode);
5842   t3 = gen_reg_rtx (V4SImode);
5843   emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, t2),
5844                                  gen_lowpart (V1TImode, operands[1]),
5845                                  GEN_INT (32)));
5846   emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, t3),
5847                                  gen_lowpart (V1TImode, operands[2]),
5848                                  GEN_INT (32)));
5850   t4 = gen_reg_rtx (V2DImode);
5851   emit_insn (gen_sse2_umulv2siv2di3 (t4, t2, t3));
5853   emit_insn (gen_addv2di3 (operands[0], t1, t4));
5854   DONE;
5857 (define_insn "*avx_ashr<mode>3"
5858   [(set (match_operand:SSEMODE24 0 "register_operand" "=x")
5859         (ashiftrt:SSEMODE24
5860           (match_operand:SSEMODE24 1 "register_operand" "x")
5861           (match_operand:SI 2 "nonmemory_operand" "xN")))]
5862   "TARGET_AVX"
5863   "vpsra<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
5864   [(set_attr "type" "sseishft")
5865    (set_attr "prefix" "vex")
5866    (set (attr "length_immediate")
5867      (if_then_else (match_operand 2 "const_int_operand" "")
5868        (const_string "1")
5869        (const_string "0")))
5870    (set_attr "mode" "TI")])
5872 (define_insn "ashr<mode>3"
5873   [(set (match_operand:SSEMODE24 0 "register_operand" "=x")
5874         (ashiftrt:SSEMODE24
5875           (match_operand:SSEMODE24 1 "register_operand" "0")
5876           (match_operand:SI 2 "nonmemory_operand" "xN")))]
5877   "TARGET_SSE2"
5878   "psra<ssevecsize>\t{%2, %0|%0, %2}"
5879   [(set_attr "type" "sseishft")
5880    (set_attr "prefix_data16" "1")
5881    (set (attr "length_immediate")
5882      (if_then_else (match_operand 2 "const_int_operand" "")
5883        (const_string "1")
5884        (const_string "0")))
5885    (set_attr "mode" "TI")])
5887 (define_insn "*avx_lshrv1ti3"
5888   [(set (match_operand:V1TI 0 "register_operand" "=x")
5889         (lshiftrt:V1TI
5890          (match_operand:V1TI 1 "register_operand" "x")
5891          (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))]
5892   "TARGET_AVX"
5894   operands[2] = GEN_INT (INTVAL (operands[2]) / 8);
5895   return "vpsrldq\t{%2, %1, %0|%0, %1, %2}";
5897   [(set_attr "type" "sseishft")
5898    (set_attr "prefix" "vex")
5899    (set_attr "length_immediate" "1")
5900    (set_attr "mode" "TI")])
5902 (define_insn "*avx_lshr<mode>3"
5903   [(set (match_operand:SSEMODE248 0 "register_operand" "=x")
5904         (lshiftrt:SSEMODE248
5905           (match_operand:SSEMODE248 1 "register_operand" "x")
5906           (match_operand:SI 2 "nonmemory_operand" "xN")))]
5907   "TARGET_AVX"
5908   "vpsrl<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
5909   [(set_attr "type" "sseishft")
5910    (set_attr "prefix" "vex")
5911    (set (attr "length_immediate")
5912      (if_then_else (match_operand 2 "const_int_operand" "")
5913        (const_string "1")
5914        (const_string "0")))
5915    (set_attr "mode" "TI")])
5917 (define_insn "sse2_lshrv1ti3"
5918   [(set (match_operand:V1TI 0 "register_operand" "=x")
5919         (lshiftrt:V1TI
5920          (match_operand:V1TI 1 "register_operand" "0")
5921          (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))]
5922   "TARGET_SSE2"
5924   operands[2] = GEN_INT (INTVAL (operands[2]) / 8);
5925   return "psrldq\t{%2, %0|%0, %2}";
5927   [(set_attr "type" "sseishft")
5928    (set_attr "prefix_data16" "1")
5929    (set_attr "length_immediate" "1")
5930    (set_attr "mode" "TI")])
5932 (define_insn "lshr<mode>3"
5933   [(set (match_operand:SSEMODE248 0 "register_operand" "=x")
5934         (lshiftrt:SSEMODE248
5935           (match_operand:SSEMODE248 1 "register_operand" "0")
5936           (match_operand:SI 2 "nonmemory_operand" "xN")))]
5937   "TARGET_SSE2"
5938   "psrl<ssevecsize>\t{%2, %0|%0, %2}"
5939   [(set_attr "type" "sseishft")
5940    (set_attr "prefix_data16" "1")
5941    (set (attr "length_immediate")
5942      (if_then_else (match_operand 2 "const_int_operand" "")
5943        (const_string "1")
5944        (const_string "0")))
5945    (set_attr "mode" "TI")])
5947 (define_insn "*avx_ashlv1ti3"
5948   [(set (match_operand:V1TI 0 "register_operand" "=x")
5949         (ashift:V1TI (match_operand:V1TI 1 "register_operand" "x")
5950                      (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))]
5951   "TARGET_AVX"
5953   operands[2] = GEN_INT (INTVAL (operands[2]) / 8);
5954   return "vpslldq\t{%2, %1, %0|%0, %1, %2}";
5956   [(set_attr "type" "sseishft")
5957    (set_attr "prefix" "vex")
5958    (set_attr "length_immediate" "1")
5959    (set_attr "mode" "TI")])
5961 (define_insn "*avx_ashl<mode>3"
5962   [(set (match_operand:SSEMODE248 0 "register_operand" "=x")
5963         (ashift:SSEMODE248
5964           (match_operand:SSEMODE248 1 "register_operand" "x")
5965           (match_operand:SI 2 "nonmemory_operand" "xN")))]
5966   "TARGET_AVX"
5967   "vpsll<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
5968   [(set_attr "type" "sseishft")
5969    (set_attr "prefix" "vex")
5970    (set (attr "length_immediate")
5971      (if_then_else (match_operand 2 "const_int_operand" "")
5972        (const_string "1")
5973        (const_string "0")))
5974    (set_attr "mode" "TI")])
5976 (define_insn "sse2_ashlv1ti3"
5977   [(set (match_operand:V1TI 0 "register_operand" "=x")
5978         (ashift:V1TI (match_operand:V1TI 1 "register_operand" "0")
5979                      (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))]
5980   "TARGET_SSE2"
5982   operands[2] = GEN_INT (INTVAL (operands[2]) / 8);
5983   return "pslldq\t{%2, %0|%0, %2}";
5985   [(set_attr "type" "sseishft")
5986    (set_attr "prefix_data16" "1")
5987    (set_attr "length_immediate" "1")
5988    (set_attr "mode" "TI")])
5990 (define_insn "ashl<mode>3"
5991   [(set (match_operand:SSEMODE248 0 "register_operand" "=x")
5992         (ashift:SSEMODE248
5993           (match_operand:SSEMODE248 1 "register_operand" "0")
5994           (match_operand:SI 2 "nonmemory_operand" "xN")))]
5995   "TARGET_SSE2"
5996   "psll<ssevecsize>\t{%2, %0|%0, %2}"
5997   [(set_attr "type" "sseishft")
5998    (set_attr "prefix_data16" "1")
5999    (set (attr "length_immediate")
6000      (if_then_else (match_operand 2 "const_int_operand" "")
6001        (const_string "1")
6002        (const_string "0")))
6003    (set_attr "mode" "TI")])
6005 (define_expand "vec_shl_<mode>"
6006   [(set (match_operand:SSEMODEI 0 "register_operand" "")
6007         (ashift:V1TI
6008          (match_operand:SSEMODEI 1 "register_operand" "")
6009          (match_operand:SI 2 "const_0_to_255_mul_8_operand" "")))]
6010   "TARGET_SSE2"
6012   operands[0] = gen_lowpart (V1TImode, operands[0]);
6013   operands[1] = gen_lowpart (V1TImode, operands[1]);
6016 (define_expand "vec_shr_<mode>"
6017   [(set (match_operand:SSEMODEI 0 "register_operand" "")
6018         (lshiftrt:V1TI
6019          (match_operand:SSEMODEI 1 "register_operand" "")
6020          (match_operand:SI 2 "const_0_to_255_mul_8_operand" "")))]
6021   "TARGET_SSE2"
6023   operands[0] = gen_lowpart (V1TImode, operands[0]);
6024   operands[1] = gen_lowpart (V1TImode, operands[1]);
6027 (define_insn "*avx_<code><mode>3"
6028   [(set (match_operand:SSEMODE124 0 "register_operand" "=x")
6029         (maxmin:SSEMODE124
6030           (match_operand:SSEMODE124 1 "nonimmediate_operand" "%x")
6031           (match_operand:SSEMODE124 2 "nonimmediate_operand" "xm")))]
6032   "TARGET_AVX && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
6033   "vp<maxminiprefix><ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
6034   [(set_attr "type" "sseiadd")
6035    (set (attr "prefix_extra")
6036      (if_then_else
6037        (ne (symbol_ref "<MODE>mode != ((<CODE> == SMAX || <CODE> == SMIN) ? V8HImode : V16QImode)")
6038            (const_int 0))
6039        (const_string "1")
6040        (const_string "0")))
6041    (set_attr "prefix" "vex")
6042    (set_attr "mode" "TI")])
6044 (define_expand "<code>v16qi3"
6045   [(set (match_operand:V16QI 0 "register_operand" "")
6046         (umaxmin:V16QI
6047           (match_operand:V16QI 1 "nonimmediate_operand" "")
6048           (match_operand:V16QI 2 "nonimmediate_operand" "")))]
6049   "TARGET_SSE2"
6050   "ix86_fixup_binary_operands_no_copy (<CODE>, V16QImode, operands);")
6052 (define_insn "*<code>v16qi3"
6053   [(set (match_operand:V16QI 0 "register_operand" "=x")
6054         (umaxmin:V16QI
6055           (match_operand:V16QI 1 "nonimmediate_operand" "%0")
6056           (match_operand:V16QI 2 "nonimmediate_operand" "xm")))]
6057   "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, V16QImode, operands)"
6058   "p<maxminiprefix>b\t{%2, %0|%0, %2}"
6059   [(set_attr "type" "sseiadd")
6060    (set_attr "prefix_data16" "1")
6061    (set_attr "mode" "TI")])
6063 (define_expand "<code>v8hi3"
6064   [(set (match_operand:V8HI 0 "register_operand" "")
6065         (smaxmin:V8HI
6066           (match_operand:V8HI 1 "nonimmediate_operand" "")
6067           (match_operand:V8HI 2 "nonimmediate_operand" "")))]
6068   "TARGET_SSE2"
6069   "ix86_fixup_binary_operands_no_copy (<CODE>, V8HImode, operands);")
6071 (define_insn "*<code>v8hi3"
6072   [(set (match_operand:V8HI 0 "register_operand" "=x")
6073         (smaxmin:V8HI
6074           (match_operand:V8HI 1 "nonimmediate_operand" "%0")
6075           (match_operand:V8HI 2 "nonimmediate_operand" "xm")))]
6076   "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, V8HImode, operands)"
6077   "p<maxminiprefix>w\t{%2, %0|%0, %2}"
6078   [(set_attr "type" "sseiadd")
6079    (set_attr "prefix_data16" "1")
6080    (set_attr "mode" "TI")])
6082 (define_expand "umaxv8hi3"
6083   [(set (match_operand:V8HI 0 "register_operand" "")
6084         (umax:V8HI (match_operand:V8HI 1 "register_operand" "")
6085                    (match_operand:V8HI 2 "nonimmediate_operand" "")))]
6086   "TARGET_SSE2"
6088   if (TARGET_SSE4_1)
6089     ix86_fixup_binary_operands_no_copy (UMAX, V8HImode, operands);
6090   else
6091     {
6092       rtx op0 = operands[0], op2 = operands[2], op3 = op0;
6093       if (rtx_equal_p (op3, op2))
6094         op3 = gen_reg_rtx (V8HImode);
6095       emit_insn (gen_sse2_ussubv8hi3 (op3, operands[1], op2));
6096       emit_insn (gen_addv8hi3 (op0, op3, op2));
6097       DONE;
6098     }
6101 (define_expand "smax<mode>3"
6102   [(set (match_operand:SSEMODE14 0 "register_operand" "")
6103         (smax:SSEMODE14 (match_operand:SSEMODE14 1 "register_operand" "")
6104                         (match_operand:SSEMODE14 2 "register_operand" "")))]
6105   "TARGET_SSE2"
6107   if (TARGET_SSE4_1)
6108     ix86_fixup_binary_operands_no_copy (SMAX, <MODE>mode, operands);
6109   else
6110   {
6111     rtx xops[6];
6112     bool ok;
6114     xops[0] = operands[0];
6115     xops[1] = operands[1];
6116     xops[2] = operands[2];
6117     xops[3] = gen_rtx_GT (VOIDmode, operands[1], operands[2]);
6118     xops[4] = operands[1];
6119     xops[5] = operands[2];
6120     ok = ix86_expand_int_vcond (xops);
6121     gcc_assert (ok);
6122     DONE;
6123   }
6126 (define_insn "*sse4_1_<code><mode>3"
6127   [(set (match_operand:SSEMODE14 0 "register_operand" "=x")
6128         (smaxmin:SSEMODE14
6129           (match_operand:SSEMODE14 1 "nonimmediate_operand" "%0")
6130           (match_operand:SSEMODE14 2 "nonimmediate_operand" "xm")))]
6131   "TARGET_SSE4_1 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
6132   "p<maxminiprefix><ssevecsize>\t{%2, %0|%0, %2}"
6133   [(set_attr "type" "sseiadd")
6134    (set_attr "prefix_extra" "1")
6135    (set_attr "mode" "TI")])
6137 (define_expand "smaxv2di3"
6138   [(set (match_operand:V2DI 0 "register_operand" "")
6139         (smax:V2DI (match_operand:V2DI 1 "register_operand" "")
6140                    (match_operand:V2DI 2 "register_operand" "")))]
6141   "TARGET_SSE4_2"
6143   rtx xops[6];
6144   bool ok;
6146   xops[0] = operands[0];
6147   xops[1] = operands[1];
6148   xops[2] = operands[2];
6149   xops[3] = gen_rtx_GT (VOIDmode, operands[1], operands[2]);
6150   xops[4] = operands[1];
6151   xops[5] = operands[2];
6152   ok = ix86_expand_int_vcond (xops);
6153   gcc_assert (ok);
6154   DONE;
6157 (define_expand "umaxv4si3"
6158   [(set (match_operand:V4SI 0 "register_operand" "")
6159         (umax:V4SI (match_operand:V4SI 1 "register_operand" "")
6160                    (match_operand:V4SI 2 "register_operand" "")))]
6161   "TARGET_SSE2"
6163   if (TARGET_SSE4_1)
6164     ix86_fixup_binary_operands_no_copy (UMAX, V4SImode, operands);
6165   else
6166   {
6167     rtx xops[6];
6168     bool ok;
6170     xops[0] = operands[0];
6171     xops[1] = operands[1];
6172     xops[2] = operands[2];
6173     xops[3] = gen_rtx_GTU (VOIDmode, operands[1], operands[2]);
6174     xops[4] = operands[1];
6175     xops[5] = operands[2];
6176     ok = ix86_expand_int_vcond (xops);
6177     gcc_assert (ok);
6178     DONE;
6179   }
6182 (define_insn "*sse4_1_<code><mode>3"
6183   [(set (match_operand:SSEMODE24 0 "register_operand" "=x")
6184         (umaxmin:SSEMODE24
6185           (match_operand:SSEMODE24 1 "nonimmediate_operand" "%0")
6186           (match_operand:SSEMODE24 2 "nonimmediate_operand" "xm")))]
6187   "TARGET_SSE4_1 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
6188   "p<maxminiprefix><ssevecsize>\t{%2, %0|%0, %2}"
6189   [(set_attr "type" "sseiadd")
6190    (set_attr "prefix_extra" "1")
6191    (set_attr "mode" "TI")])
6193 (define_expand "umaxv2di3"
6194   [(set (match_operand:V2DI 0 "register_operand" "")
6195         (umax:V2DI (match_operand:V2DI 1 "register_operand" "")
6196                    (match_operand:V2DI 2 "register_operand" "")))]
6197   "TARGET_SSE4_2"
6199   rtx xops[6];
6200   bool ok;
6202   xops[0] = operands[0];
6203   xops[1] = operands[1];
6204   xops[2] = operands[2];
6205   xops[3] = gen_rtx_GTU (VOIDmode, operands[1], operands[2]);
6206   xops[4] = operands[1];
6207   xops[5] = operands[2];
6208   ok = ix86_expand_int_vcond (xops);
6209   gcc_assert (ok);
6210   DONE;
6213 (define_expand "smin<mode>3"
6214   [(set (match_operand:SSEMODE14 0 "register_operand" "")
6215         (smin:SSEMODE14 (match_operand:SSEMODE14 1 "register_operand" "")
6216                         (match_operand:SSEMODE14 2 "register_operand" "")))]
6217   "TARGET_SSE2"
6219   if (TARGET_SSE4_1)
6220     ix86_fixup_binary_operands_no_copy (SMIN, <MODE>mode, operands);
6221   else
6222     {
6223       rtx xops[6];
6224       bool ok;
6226       xops[0] = operands[0];
6227       xops[1] = operands[2];
6228       xops[2] = operands[1];
6229       xops[3] = gen_rtx_GT (VOIDmode, operands[1], operands[2]);
6230       xops[4] = operands[1];
6231       xops[5] = operands[2];
6232       ok = ix86_expand_int_vcond (xops);
6233       gcc_assert (ok);
6234       DONE;
6235     }
6238 (define_expand "sminv2di3"
6239   [(set (match_operand:V2DI 0 "register_operand" "")
6240         (smin:V2DI (match_operand:V2DI 1 "register_operand" "")
6241                    (match_operand:V2DI 2 "register_operand" "")))]
6242   "TARGET_SSE4_2"
6244   rtx xops[6];
6245   bool ok;
6247   xops[0] = operands[0];
6248   xops[1] = operands[2];
6249   xops[2] = operands[1];
6250   xops[3] = gen_rtx_GT (VOIDmode, operands[1], operands[2]);
6251   xops[4] = operands[1];
6252   xops[5] = operands[2];
6253   ok = ix86_expand_int_vcond (xops);
6254   gcc_assert (ok);
6255   DONE;
6258 (define_expand "umin<mode>3"
6259   [(set (match_operand:SSEMODE24 0 "register_operand" "")
6260         (umin:SSEMODE24 (match_operand:SSEMODE24 1 "register_operand" "")
6261                         (match_operand:SSEMODE24 2 "register_operand" "")))]
6262   "TARGET_SSE2"
6264   if (TARGET_SSE4_1)
6265     ix86_fixup_binary_operands_no_copy (UMIN, <MODE>mode, operands);
6266   else
6267     {
6268       rtx xops[6];
6269       bool ok;
6271       xops[0] = operands[0];
6272       xops[1] = operands[2];
6273       xops[2] = operands[1];
6274       xops[3] = gen_rtx_GTU (VOIDmode, operands[1], operands[2]);
6275       xops[4] = operands[1];
6276       xops[5] = operands[2];
6277       ok = ix86_expand_int_vcond (xops);
6278       gcc_assert (ok);
6279       DONE;
6280     }
6283 (define_expand "uminv2di3"
6284   [(set (match_operand:V2DI 0 "register_operand" "")
6285         (umin:V2DI (match_operand:V2DI 1 "register_operand" "")
6286                    (match_operand:V2DI 2 "register_operand" "")))]
6287   "TARGET_SSE4_2"
6289   rtx xops[6];
6290   bool ok;
6292   xops[0] = operands[0];
6293   xops[1] = operands[2];
6294   xops[2] = operands[1];
6295   xops[3] = gen_rtx_GTU (VOIDmode, operands[1], operands[2]);
6296   xops[4] = operands[1];
6297   xops[5] = operands[2];
6298   ok = ix86_expand_int_vcond (xops);
6299   gcc_assert (ok);
6300   DONE;
6303 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6305 ;; Parallel integral comparisons
6307 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6309 (define_expand "sse2_eq<mode>3"
6310   [(set (match_operand:SSEMODE124 0 "register_operand" "")
6311         (eq:SSEMODE124
6312           (match_operand:SSEMODE124 1 "nonimmediate_operand" "")
6313           (match_operand:SSEMODE124 2 "nonimmediate_operand" "")))]
6314   "TARGET_SSE2 && !TARGET_XOP "
6315   "ix86_fixup_binary_operands_no_copy (EQ, <MODE>mode, operands);")
6317 (define_insn "*avx_eq<mode>3"
6318   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x")
6319         (eq:SSEMODE1248
6320           (match_operand:SSEMODE1248 1 "nonimmediate_operand" "%x")
6321           (match_operand:SSEMODE1248 2 "nonimmediate_operand" "xm")))]
6322   "TARGET_AVX && ix86_binary_operator_ok (EQ, <MODE>mode, operands)"
6323   "vpcmpeq<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
6324   [(set_attr "type" "ssecmp")
6325    (set (attr "prefix_extra")
6326      (if_then_else (match_operand:V2DI 0 "" "")
6327        (const_string "1")
6328        (const_string "*")))
6329    (set_attr "prefix" "vex")
6330    (set_attr "mode" "TI")])
6332 (define_insn "*sse2_eq<mode>3"
6333   [(set (match_operand:SSEMODE124 0 "register_operand" "=x")
6334         (eq:SSEMODE124
6335           (match_operand:SSEMODE124 1 "nonimmediate_operand" "%0")
6336           (match_operand:SSEMODE124 2 "nonimmediate_operand" "xm")))]
6337   "TARGET_SSE2 && !TARGET_XOP
6338    && ix86_binary_operator_ok (EQ, <MODE>mode, operands)"
6339   "pcmpeq<ssevecsize>\t{%2, %0|%0, %2}"
6340   [(set_attr "type" "ssecmp")
6341    (set_attr "prefix_data16" "1")
6342    (set_attr "mode" "TI")])
6344 (define_expand "sse4_1_eqv2di3"
6345   [(set (match_operand:V2DI 0 "register_operand" "")
6346         (eq:V2DI
6347           (match_operand:V2DI 1 "nonimmediate_operand" "")
6348           (match_operand:V2DI 2 "nonimmediate_operand" "")))]
6349   "TARGET_SSE4_1"
6350   "ix86_fixup_binary_operands_no_copy (EQ, V2DImode, operands);")
6352 (define_insn "*sse4_1_eqv2di3"
6353   [(set (match_operand:V2DI 0 "register_operand" "=x")
6354         (eq:V2DI
6355           (match_operand:V2DI 1 "nonimmediate_operand" "%0")
6356           (match_operand:V2DI 2 "nonimmediate_operand" "xm")))]
6357   "TARGET_SSE4_1 && ix86_binary_operator_ok (EQ, V2DImode, operands)"
6358   "pcmpeqq\t{%2, %0|%0, %2}"
6359   [(set_attr "type" "ssecmp")
6360    (set_attr "prefix_extra" "1")
6361    (set_attr "mode" "TI")])
6363 (define_insn "*avx_gt<mode>3"
6364   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x")
6365         (gt:SSEMODE1248
6366           (match_operand:SSEMODE1248 1 "register_operand" "x")
6367           (match_operand:SSEMODE1248 2 "nonimmediate_operand" "xm")))]
6368   "TARGET_AVX"
6369   "vpcmpgt<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
6370   [(set_attr "type" "ssecmp")
6371    (set (attr "prefix_extra")
6372      (if_then_else (match_operand:V2DI 0 "" "")
6373        (const_string "1")
6374        (const_string "*")))
6375    (set_attr "prefix" "vex")
6376    (set_attr "mode" "TI")])
6378 (define_insn "sse2_gt<mode>3"
6379   [(set (match_operand:SSEMODE124 0 "register_operand" "=x")
6380         (gt:SSEMODE124
6381           (match_operand:SSEMODE124 1 "register_operand" "0")
6382           (match_operand:SSEMODE124 2 "nonimmediate_operand" "xm")))]
6383   "TARGET_SSE2 && !TARGET_XOP"
6384   "pcmpgt<ssevecsize>\t{%2, %0|%0, %2}"
6385   [(set_attr "type" "ssecmp")
6386    (set_attr "prefix_data16" "1")
6387    (set_attr "mode" "TI")])
6389 (define_insn "sse4_2_gtv2di3"
6390   [(set (match_operand:V2DI 0 "register_operand" "=x")
6391         (gt:V2DI
6392           (match_operand:V2DI 1 "register_operand" "0")
6393           (match_operand:V2DI 2 "nonimmediate_operand" "xm")))]
6394   "TARGET_SSE4_2"
6395   "pcmpgtq\t{%2, %0|%0, %2}"
6396   [(set_attr "type" "ssecmp")
6397    (set_attr "prefix_extra" "1")
6398    (set_attr "mode" "TI")])
6400 (define_expand "vcond<mode>"
6401   [(set (match_operand:SSEMODE124C8 0 "register_operand" "")
6402         (if_then_else:SSEMODE124C8
6403           (match_operator 3 ""
6404             [(match_operand:SSEMODE124C8 4 "nonimmediate_operand" "")
6405              (match_operand:SSEMODE124C8 5 "nonimmediate_operand" "")])
6406           (match_operand:SSEMODE124C8 1 "general_operand" "")
6407           (match_operand:SSEMODE124C8 2 "general_operand" "")))]
6408   "TARGET_SSE2"
6410   bool ok = ix86_expand_int_vcond (operands);
6411   gcc_assert (ok);
6412   DONE;
6415 (define_expand "vcondu<mode>"
6416   [(set (match_operand:SSEMODE124C8 0 "register_operand" "")
6417         (if_then_else:SSEMODE124C8
6418           (match_operator 3 ""
6419             [(match_operand:SSEMODE124C8 4 "nonimmediate_operand" "")
6420              (match_operand:SSEMODE124C8 5 "nonimmediate_operand" "")])
6421           (match_operand:SSEMODE124C8 1 "general_operand" "")
6422           (match_operand:SSEMODE124C8 2 "general_operand" "")))]
6423   "TARGET_SSE2"
6425   bool ok = ix86_expand_int_vcond (operands);
6426   gcc_assert (ok);
6427   DONE;
6430 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6432 ;; Parallel bitwise logical operations
6434 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6436 (define_expand "one_cmpl<mode>2"
6437   [(set (match_operand:SSEMODEI 0 "register_operand" "")
6438         (xor:SSEMODEI (match_operand:SSEMODEI 1 "nonimmediate_operand" "")
6439                       (match_dup 2)))]
6440   "TARGET_SSE2"
6442   int i, n = GET_MODE_NUNITS (<MODE>mode);
6443   rtvec v = rtvec_alloc (n);
6445   for (i = 0; i < n; ++i)
6446     RTVEC_ELT (v, i) = constm1_rtx;
6448   operands[2] = force_reg (<MODE>mode, gen_rtx_CONST_VECTOR (<MODE>mode, v));
6451 (define_insn "*avx_andnot<mode>3"
6452   [(set (match_operand:AVX256MODEI 0 "register_operand" "=x")
6453         (and:AVX256MODEI
6454           (not:AVX256MODEI (match_operand:AVX256MODEI 1 "register_operand" "x"))
6455           (match_operand:AVX256MODEI 2 "nonimmediate_operand" "xm")))]
6456   "TARGET_AVX"
6457   "vandnps\t{%2, %1, %0|%0, %1, %2}"
6458   [(set_attr "type" "sselog")
6459    (set_attr "prefix" "vex")
6460    (set_attr "mode" "<avxvecpsmode>")])
6462 (define_insn "*sse_andnot<mode>3"
6463   [(set (match_operand:SSEMODEI 0 "register_operand" "=x")
6464         (and:SSEMODEI
6465           (not:SSEMODEI (match_operand:SSEMODEI 1 "register_operand" "0"))
6466           (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))]
6467   "(TARGET_SSE && !TARGET_SSE2)"
6468   "andnps\t{%2, %0|%0, %2}"
6469   [(set_attr "type" "sselog")
6470    (set_attr "mode" "V4SF")])
6472 (define_insn "*avx_andnot<mode>3"
6473   [(set (match_operand:SSEMODEI 0 "register_operand" "=x")
6474         (and:SSEMODEI
6475           (not:SSEMODEI (match_operand:SSEMODEI 1 "register_operand" "x"))
6476           (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))]
6477   "TARGET_AVX"
6478   "vpandn\t{%2, %1, %0|%0, %1, %2}"
6479   [(set_attr "type" "sselog")
6480    (set_attr "prefix" "vex")
6481    (set_attr "mode" "TI")])
6483 (define_insn "sse2_andnot<mode>3"
6484   [(set (match_operand:SSEMODEI 0 "register_operand" "=x")
6485         (and:SSEMODEI
6486           (not:SSEMODEI (match_operand:SSEMODEI 1 "register_operand" "0"))
6487           (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))]
6488   "TARGET_SSE2"
6489   "pandn\t{%2, %0|%0, %2}"
6490   [(set_attr "type" "sselog")
6491    (set_attr "prefix_data16" "1")
6492    (set_attr "mode" "TI")])
6494 (define_insn "*andnottf3"
6495   [(set (match_operand:TF 0 "register_operand" "=x")
6496         (and:TF
6497           (not:TF (match_operand:TF 1 "register_operand" "0"))
6498           (match_operand:TF 2 "nonimmediate_operand" "xm")))]
6499   "TARGET_SSE2"
6500   "pandn\t{%2, %0|%0, %2}"
6501   [(set_attr "type" "sselog")
6502    (set_attr "prefix_data16" "1")
6503    (set_attr "mode" "TI")])
6505 (define_expand "<code><mode>3"
6506   [(set (match_operand:SSEMODEI 0 "register_operand" "")
6507         (any_logic:SSEMODEI
6508           (match_operand:SSEMODEI 1 "nonimmediate_operand" "")
6509           (match_operand:SSEMODEI 2 "nonimmediate_operand" "")))]
6510   "TARGET_SSE"
6511   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
6513 (define_insn "*avx_<code><mode>3"
6514   [(set (match_operand:AVX256MODEI 0 "register_operand" "=x")
6515         (any_logic:AVX256MODEI
6516           (match_operand:AVX256MODEI 1 "nonimmediate_operand" "%x")
6517           (match_operand:AVX256MODEI 2 "nonimmediate_operand" "xm")))]
6518   "TARGET_AVX
6519    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
6520   "v<logicprefix>ps\t{%2, %1, %0|%0, %1, %2}"
6521   [(set_attr "type" "sselog")
6522    (set_attr "prefix" "vex")
6523    (set_attr "mode" "<avxvecpsmode>")])
6525 (define_insn "*sse_<code><mode>3"
6526   [(set (match_operand:SSEMODEI 0 "register_operand" "=x")
6527         (any_logic:SSEMODEI
6528           (match_operand:SSEMODEI 1 "nonimmediate_operand" "%0")
6529           (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))]
6530   "(TARGET_SSE && !TARGET_SSE2)
6531    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
6532   "<logicprefix>ps\t{%2, %0|%0, %2}"
6533   [(set_attr "type" "sselog")
6534    (set_attr "mode" "V4SF")])
6536 (define_insn "*avx_<code><mode>3"
6537   [(set (match_operand:SSEMODEI 0 "register_operand" "=x")
6538         (any_logic:SSEMODEI
6539           (match_operand:SSEMODEI 1 "nonimmediate_operand" "%x")
6540           (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))]
6541   "TARGET_AVX
6542    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
6543   "vp<logicprefix>\t{%2, %1, %0|%0, %1, %2}"
6544   [(set_attr "type" "sselog")
6545    (set_attr "prefix" "vex")
6546    (set_attr "mode" "TI")])
6548 (define_insn "*sse2_<code><mode>3"
6549   [(set (match_operand:SSEMODEI 0 "register_operand" "=x")
6550         (any_logic:SSEMODEI
6551           (match_operand:SSEMODEI 1 "nonimmediate_operand" "%0")
6552           (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))]
6553   "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
6554   "p<logicprefix>\t{%2, %0|%0, %2}"
6555   [(set_attr "type" "sselog")
6556    (set_attr "prefix_data16" "1")
6557    (set_attr "mode" "TI")])
6559 (define_expand "<code>tf3"
6560   [(set (match_operand:TF 0 "register_operand" "")
6561         (any_logic:TF
6562           (match_operand:TF 1 "nonimmediate_operand" "")
6563           (match_operand:TF 2 "nonimmediate_operand" "")))]
6564   "TARGET_SSE2"
6565   "ix86_fixup_binary_operands_no_copy (<CODE>, TFmode, operands);")
6567 (define_insn "*<code>tf3"
6568   [(set (match_operand:TF 0 "register_operand" "=x")
6569         (any_logic:TF
6570           (match_operand:TF 1 "nonimmediate_operand" "%0")
6571           (match_operand:TF 2 "nonimmediate_operand" "xm")))]
6572   "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, TFmode, operands)"
6573   "p<logicprefix>\t{%2, %0|%0, %2}"
6574   [(set_attr "type" "sselog")
6575    (set_attr "prefix_data16" "1")
6576    (set_attr "mode" "TI")])
6578 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6580 ;; Parallel integral element swizzling
6582 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6584 (define_expand "vec_pack_trunc_v8hi"
6585   [(match_operand:V16QI 0 "register_operand" "")
6586    (match_operand:V8HI 1 "register_operand" "")
6587    (match_operand:V8HI 2 "register_operand" "")]
6588   "TARGET_SSE2"
6590   rtx op1 = gen_lowpart (V16QImode, operands[1]);
6591   rtx op2 = gen_lowpart (V16QImode, operands[2]);
6592   ix86_expand_vec_extract_even_odd (operands[0], op1, op2, 0);
6593   DONE;
6596 (define_expand "vec_pack_trunc_v4si"
6597   [(match_operand:V8HI 0 "register_operand" "")
6598    (match_operand:V4SI 1 "register_operand" "")
6599    (match_operand:V4SI 2 "register_operand" "")]
6600   "TARGET_SSE2"
6602   rtx op1 = gen_lowpart (V8HImode, operands[1]);
6603   rtx op2 = gen_lowpart (V8HImode, operands[2]);
6604   ix86_expand_vec_extract_even_odd (operands[0], op1, op2, 0);
6605   DONE;
6608 (define_expand "vec_pack_trunc_v2di"
6609   [(match_operand:V4SI 0 "register_operand" "")
6610    (match_operand:V2DI 1 "register_operand" "")
6611    (match_operand:V2DI 2 "register_operand" "")]
6612   "TARGET_SSE2"
6614   rtx op1 = gen_lowpart (V4SImode, operands[1]);
6615   rtx op2 = gen_lowpart (V4SImode, operands[2]);
6616   ix86_expand_vec_extract_even_odd (operands[0], op1, op2, 0);
6617   DONE;
6620 (define_insn "*avx_packsswb"
6621   [(set (match_operand:V16QI 0 "register_operand" "=x")
6622         (vec_concat:V16QI
6623           (ss_truncate:V8QI
6624             (match_operand:V8HI 1 "register_operand" "x"))
6625           (ss_truncate:V8QI
6626             (match_operand:V8HI 2 "nonimmediate_operand" "xm"))))]
6627   "TARGET_AVX"
6628   "vpacksswb\t{%2, %1, %0|%0, %1, %2}"
6629   [(set_attr "type" "sselog")
6630    (set_attr "prefix" "vex")
6631    (set_attr "mode" "TI")])
6633 (define_insn "sse2_packsswb"
6634   [(set (match_operand:V16QI 0 "register_operand" "=x")
6635         (vec_concat:V16QI
6636           (ss_truncate:V8QI
6637             (match_operand:V8HI 1 "register_operand" "0"))
6638           (ss_truncate:V8QI
6639             (match_operand:V8HI 2 "nonimmediate_operand" "xm"))))]
6640   "TARGET_SSE2"
6641   "packsswb\t{%2, %0|%0, %2}"
6642   [(set_attr "type" "sselog")
6643    (set_attr "prefix_data16" "1")
6644    (set_attr "mode" "TI")])
6646 (define_insn "*avx_packssdw"
6647   [(set (match_operand:V8HI 0 "register_operand" "=x")
6648         (vec_concat:V8HI
6649           (ss_truncate:V4HI
6650             (match_operand:V4SI 1 "register_operand" "x"))
6651           (ss_truncate:V4HI
6652             (match_operand:V4SI 2 "nonimmediate_operand" "xm"))))]
6653   "TARGET_AVX"
6654   "vpackssdw\t{%2, %1, %0|%0, %1, %2}"
6655   [(set_attr "type" "sselog")
6656    (set_attr "prefix" "vex")
6657    (set_attr "mode" "TI")])
6659 (define_insn "sse2_packssdw"
6660   [(set (match_operand:V8HI 0 "register_operand" "=x")
6661         (vec_concat:V8HI
6662           (ss_truncate:V4HI
6663             (match_operand:V4SI 1 "register_operand" "0"))
6664           (ss_truncate:V4HI
6665             (match_operand:V4SI 2 "nonimmediate_operand" "xm"))))]
6666   "TARGET_SSE2"
6667   "packssdw\t{%2, %0|%0, %2}"
6668   [(set_attr "type" "sselog")
6669    (set_attr "prefix_data16" "1")
6670    (set_attr "mode" "TI")])
6672 (define_insn "*avx_packuswb"
6673   [(set (match_operand:V16QI 0 "register_operand" "=x")
6674         (vec_concat:V16QI
6675           (us_truncate:V8QI
6676             (match_operand:V8HI 1 "register_operand" "x"))
6677           (us_truncate:V8QI
6678             (match_operand:V8HI 2 "nonimmediate_operand" "xm"))))]
6679   "TARGET_AVX"
6680   "vpackuswb\t{%2, %1, %0|%0, %1, %2}"
6681   [(set_attr "type" "sselog")
6682    (set_attr "prefix" "vex")
6683    (set_attr "mode" "TI")])
6685 (define_insn "sse2_packuswb"
6686   [(set (match_operand:V16QI 0 "register_operand" "=x")
6687         (vec_concat:V16QI
6688           (us_truncate:V8QI
6689             (match_operand:V8HI 1 "register_operand" "0"))
6690           (us_truncate:V8QI
6691             (match_operand:V8HI 2 "nonimmediate_operand" "xm"))))]
6692   "TARGET_SSE2"
6693   "packuswb\t{%2, %0|%0, %2}"
6694   [(set_attr "type" "sselog")
6695    (set_attr "prefix_data16" "1")
6696    (set_attr "mode" "TI")])
6698 (define_insn "*avx_interleave_highv16qi"
6699   [(set (match_operand:V16QI 0 "register_operand" "=x")
6700         (vec_select:V16QI
6701           (vec_concat:V32QI
6702             (match_operand:V16QI 1 "register_operand" "x")
6703             (match_operand:V16QI 2 "nonimmediate_operand" "xm"))
6704           (parallel [(const_int 8)  (const_int 24)
6705                      (const_int 9)  (const_int 25)
6706                      (const_int 10) (const_int 26)
6707                      (const_int 11) (const_int 27)
6708                      (const_int 12) (const_int 28)
6709                      (const_int 13) (const_int 29)
6710                      (const_int 14) (const_int 30)
6711                      (const_int 15) (const_int 31)])))]
6712   "TARGET_AVX"
6713   "vpunpckhbw\t{%2, %1, %0|%0, %1, %2}"
6714   [(set_attr "type" "sselog")
6715    (set_attr "prefix" "vex")
6716    (set_attr "mode" "TI")])
6718 (define_insn "vec_interleave_highv16qi"
6719   [(set (match_operand:V16QI 0 "register_operand" "=x")
6720         (vec_select:V16QI
6721           (vec_concat:V32QI
6722             (match_operand:V16QI 1 "register_operand" "0")
6723             (match_operand:V16QI 2 "nonimmediate_operand" "xm"))
6724           (parallel [(const_int 8)  (const_int 24)
6725                      (const_int 9)  (const_int 25)
6726                      (const_int 10) (const_int 26)
6727                      (const_int 11) (const_int 27)
6728                      (const_int 12) (const_int 28)
6729                      (const_int 13) (const_int 29)
6730                      (const_int 14) (const_int 30)
6731                      (const_int 15) (const_int 31)])))]
6732   "TARGET_SSE2"
6733   "punpckhbw\t{%2, %0|%0, %2}"
6734   [(set_attr "type" "sselog")
6735    (set_attr "prefix_data16" "1")
6736    (set_attr "mode" "TI")])
6738 (define_insn "*avx_interleave_lowv16qi"
6739   [(set (match_operand:V16QI 0 "register_operand" "=x")
6740         (vec_select:V16QI
6741           (vec_concat:V32QI
6742             (match_operand:V16QI 1 "register_operand" "x")
6743             (match_operand:V16QI 2 "nonimmediate_operand" "xm"))
6744           (parallel [(const_int 0) (const_int 16)
6745                      (const_int 1) (const_int 17)
6746                      (const_int 2) (const_int 18)
6747                      (const_int 3) (const_int 19)
6748                      (const_int 4) (const_int 20)
6749                      (const_int 5) (const_int 21)
6750                      (const_int 6) (const_int 22)
6751                      (const_int 7) (const_int 23)])))]
6752   "TARGET_AVX"
6753   "vpunpcklbw\t{%2, %1, %0|%0, %1, %2}"
6754   [(set_attr "type" "sselog")
6755    (set_attr "prefix" "vex")
6756    (set_attr "mode" "TI")])
6758 (define_insn "vec_interleave_lowv16qi"
6759   [(set (match_operand:V16QI 0 "register_operand" "=x")
6760         (vec_select:V16QI
6761           (vec_concat:V32QI
6762             (match_operand:V16QI 1 "register_operand" "0")
6763             (match_operand:V16QI 2 "nonimmediate_operand" "xm"))
6764           (parallel [(const_int 0) (const_int 16)
6765                      (const_int 1) (const_int 17)
6766                      (const_int 2) (const_int 18)
6767                      (const_int 3) (const_int 19)
6768                      (const_int 4) (const_int 20)
6769                      (const_int 5) (const_int 21)
6770                      (const_int 6) (const_int 22)
6771                      (const_int 7) (const_int 23)])))]
6772   "TARGET_SSE2"
6773   "punpcklbw\t{%2, %0|%0, %2}"
6774   [(set_attr "type" "sselog")
6775    (set_attr "prefix_data16" "1")
6776    (set_attr "mode" "TI")])
6778 (define_insn "*avx_interleave_highv8hi"
6779   [(set (match_operand:V8HI 0 "register_operand" "=x")
6780         (vec_select:V8HI
6781           (vec_concat:V16HI
6782             (match_operand:V8HI 1 "register_operand" "x")
6783             (match_operand:V8HI 2 "nonimmediate_operand" "xm"))
6784           (parallel [(const_int 4) (const_int 12)
6785                      (const_int 5) (const_int 13)
6786                      (const_int 6) (const_int 14)
6787                      (const_int 7) (const_int 15)])))]
6788   "TARGET_AVX"
6789   "vpunpckhwd\t{%2, %1, %0|%0, %1, %2}"
6790   [(set_attr "type" "sselog")
6791    (set_attr "prefix" "vex")
6792    (set_attr "mode" "TI")])
6794 (define_insn "vec_interleave_highv8hi"
6795   [(set (match_operand:V8HI 0 "register_operand" "=x")
6796         (vec_select:V8HI
6797           (vec_concat:V16HI
6798             (match_operand:V8HI 1 "register_operand" "0")
6799             (match_operand:V8HI 2 "nonimmediate_operand" "xm"))
6800           (parallel [(const_int 4) (const_int 12)
6801                      (const_int 5) (const_int 13)
6802                      (const_int 6) (const_int 14)
6803                      (const_int 7) (const_int 15)])))]
6804   "TARGET_SSE2"
6805   "punpckhwd\t{%2, %0|%0, %2}"
6806   [(set_attr "type" "sselog")
6807    (set_attr "prefix_data16" "1")
6808    (set_attr "mode" "TI")])
6810 (define_insn "*avx_interleave_lowv8hi"
6811   [(set (match_operand:V8HI 0 "register_operand" "=x")
6812         (vec_select:V8HI
6813           (vec_concat:V16HI
6814             (match_operand:V8HI 1 "register_operand" "x")
6815             (match_operand:V8HI 2 "nonimmediate_operand" "xm"))
6816           (parallel [(const_int 0) (const_int 8)
6817                      (const_int 1) (const_int 9)
6818                      (const_int 2) (const_int 10)
6819                      (const_int 3) (const_int 11)])))]
6820   "TARGET_AVX"
6821   "vpunpcklwd\t{%2, %1, %0|%0, %1, %2}"
6822   [(set_attr "type" "sselog")
6823    (set_attr "prefix" "vex")
6824    (set_attr "mode" "TI")])
6826 (define_insn "vec_interleave_lowv8hi"
6827   [(set (match_operand:V8HI 0 "register_operand" "=x")
6828         (vec_select:V8HI
6829           (vec_concat:V16HI
6830             (match_operand:V8HI 1 "register_operand" "0")
6831             (match_operand:V8HI 2 "nonimmediate_operand" "xm"))
6832           (parallel [(const_int 0) (const_int 8)
6833                      (const_int 1) (const_int 9)
6834                      (const_int 2) (const_int 10)
6835                      (const_int 3) (const_int 11)])))]
6836   "TARGET_SSE2"
6837   "punpcklwd\t{%2, %0|%0, %2}"
6838   [(set_attr "type" "sselog")
6839    (set_attr "prefix_data16" "1")
6840    (set_attr "mode" "TI")])
6842 (define_insn "*avx_interleave_highv4si"
6843   [(set (match_operand:V4SI 0 "register_operand" "=x")
6844         (vec_select:V4SI
6845           (vec_concat:V8SI
6846             (match_operand:V4SI 1 "register_operand" "x")
6847             (match_operand:V4SI 2 "nonimmediate_operand" "xm"))
6848           (parallel [(const_int 2) (const_int 6)
6849                      (const_int 3) (const_int 7)])))]
6850   "TARGET_AVX"
6851   "vpunpckhdq\t{%2, %1, %0|%0, %1, %2}"
6852   [(set_attr "type" "sselog")
6853    (set_attr "prefix" "vex")
6854    (set_attr "mode" "TI")])
6856 (define_insn "vec_interleave_highv4si"
6857   [(set (match_operand:V4SI 0 "register_operand" "=x")
6858         (vec_select:V4SI
6859           (vec_concat:V8SI
6860             (match_operand:V4SI 1 "register_operand" "0")
6861             (match_operand:V4SI 2 "nonimmediate_operand" "xm"))
6862           (parallel [(const_int 2) (const_int 6)
6863                      (const_int 3) (const_int 7)])))]
6864   "TARGET_SSE2"
6865   "punpckhdq\t{%2, %0|%0, %2}"
6866   [(set_attr "type" "sselog")
6867    (set_attr "prefix_data16" "1")
6868    (set_attr "mode" "TI")])
6870 (define_insn "*avx_interleave_lowv4si"
6871   [(set (match_operand:V4SI 0 "register_operand" "=x")
6872         (vec_select:V4SI
6873           (vec_concat:V8SI
6874             (match_operand:V4SI 1 "register_operand" "x")
6875             (match_operand:V4SI 2 "nonimmediate_operand" "xm"))
6876           (parallel [(const_int 0) (const_int 4)
6877                      (const_int 1) (const_int 5)])))]
6878   "TARGET_AVX"
6879   "vpunpckldq\t{%2, %1, %0|%0, %1, %2}"
6880   [(set_attr "type" "sselog")
6881    (set_attr "prefix" "vex")
6882    (set_attr "mode" "TI")])
6884 (define_insn "vec_interleave_lowv4si"
6885   [(set (match_operand:V4SI 0 "register_operand" "=x")
6886         (vec_select:V4SI
6887           (vec_concat:V8SI
6888             (match_operand:V4SI 1 "register_operand" "0")
6889             (match_operand:V4SI 2 "nonimmediate_operand" "xm"))
6890           (parallel [(const_int 0) (const_int 4)
6891                      (const_int 1) (const_int 5)])))]
6892   "TARGET_SSE2"
6893   "punpckldq\t{%2, %0|%0, %2}"
6894   [(set_attr "type" "sselog")
6895    (set_attr "prefix_data16" "1")
6896    (set_attr "mode" "TI")])
6898 (define_insn "*avx_pinsr<ssevecsize>"
6899   [(set (match_operand:SSEMODE124 0 "register_operand" "=x")
6900         (vec_merge:SSEMODE124
6901           (vec_duplicate:SSEMODE124
6902             (match_operand:<avxscalarmode> 2 "nonimmediate_operand" "rm"))
6903           (match_operand:SSEMODE124 1 "register_operand" "x")
6904           (match_operand:SI 3 "const_pow2_1_to_<pinsrbits>_operand" "n")))]
6905   "TARGET_AVX"
6907   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
6908   if (MEM_P (operands[2]))
6909     return "vpinsr<ssevecsize>\t{%3, %2, %1, %0|%0, %1, %2, %3}";
6910   else
6911     return "vpinsr<ssevecsize>\t{%3, %k2, %1, %0|%0, %1, %k2, %3}";
6913   [(set_attr "type" "sselog")
6914    (set (attr "prefix_extra")
6915      (if_then_else (match_operand:V8HI 0 "register_operand" "")
6916        (const_string "0")
6917        (const_string "1")))
6918    (set_attr "length_immediate" "1")
6919    (set_attr "prefix" "vex")
6920    (set_attr "mode" "TI")])
6922 (define_insn "*sse4_1_pinsrb"
6923   [(set (match_operand:V16QI 0 "register_operand" "=x")
6924         (vec_merge:V16QI
6925           (vec_duplicate:V16QI
6926             (match_operand:QI 2 "nonimmediate_operand" "rm"))
6927           (match_operand:V16QI 1 "register_operand" "0")
6928           (match_operand:SI 3 "const_pow2_1_to_32768_operand" "n")))]
6929   "TARGET_SSE4_1"
6931   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
6932   if (MEM_P (operands[2]))
6933     return "pinsrb\t{%3, %2, %0|%0, %2, %3}";
6934   else
6935     return "pinsrb\t{%3, %k2, %0|%0, %k2, %3}";
6937   [(set_attr "type" "sselog")
6938    (set_attr "prefix_extra" "1")
6939    (set_attr "length_immediate" "1")
6940    (set_attr "mode" "TI")])
6942 (define_insn "*sse2_pinsrw"
6943   [(set (match_operand:V8HI 0 "register_operand" "=x")
6944         (vec_merge:V8HI
6945           (vec_duplicate:V8HI
6946             (match_operand:HI 2 "nonimmediate_operand" "rm"))
6947           (match_operand:V8HI 1 "register_operand" "0")
6948           (match_operand:SI 3 "const_pow2_1_to_128_operand" "n")))]
6949   "TARGET_SSE2"
6951   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
6952   if (MEM_P (operands[2]))
6953     return "pinsrw\t{%3, %2, %0|%0, %2, %3}";
6954   else
6955     return "pinsrw\t{%3, %k2, %0|%0, %k2, %3}";
6957   [(set_attr "type" "sselog")
6958    (set_attr "prefix_data16" "1")
6959    (set_attr "length_immediate" "1")
6960    (set_attr "mode" "TI")])
6962 ;; It must come before sse2_loadld since it is preferred.
6963 (define_insn "*sse4_1_pinsrd"
6964   [(set (match_operand:V4SI 0 "register_operand" "=x")
6965         (vec_merge:V4SI
6966           (vec_duplicate:V4SI
6967             (match_operand:SI 2 "nonimmediate_operand" "rm"))
6968           (match_operand:V4SI 1 "register_operand" "0")
6969           (match_operand:SI 3 "const_pow2_1_to_8_operand" "n")))]
6970   "TARGET_SSE4_1"
6972   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
6973   return "pinsrd\t{%3, %2, %0|%0, %2, %3}";
6975   [(set_attr "type" "sselog")
6976    (set_attr "prefix_extra" "1")
6977    (set_attr "length_immediate" "1")
6978    (set_attr "mode" "TI")])
6980 (define_insn "*avx_pinsrq"
6981   [(set (match_operand:V2DI 0 "register_operand" "=x")
6982         (vec_merge:V2DI
6983           (vec_duplicate:V2DI
6984             (match_operand:DI 2 "nonimmediate_operand" "rm"))
6985           (match_operand:V2DI 1 "register_operand" "x")
6986           (match_operand:SI 3 "const_pow2_1_to_2_operand" "n")))]
6987   "TARGET_AVX && TARGET_64BIT"
6989   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
6990   return "vpinsrq\t{%3, %2, %1, %0|%0, %1, %2, %3}";
6992   [(set_attr "type" "sselog")
6993    (set_attr "prefix_extra" "1")
6994    (set_attr "length_immediate" "1")
6995    (set_attr "prefix" "vex")
6996    (set_attr "mode" "TI")])
6998 (define_insn "*sse4_1_pinsrq"
6999   [(set (match_operand:V2DI 0 "register_operand" "=x")
7000         (vec_merge:V2DI
7001           (vec_duplicate:V2DI
7002             (match_operand:DI 2 "nonimmediate_operand" "rm"))
7003           (match_operand:V2DI 1 "register_operand" "0")
7004           (match_operand:SI 3 "const_pow2_1_to_2_operand" "n")))]
7005   "TARGET_SSE4_1 && TARGET_64BIT"
7007   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
7008   return "pinsrq\t{%3, %2, %0|%0, %2, %3}";
7010   [(set_attr "type" "sselog")
7011    (set_attr "prefix_rex" "1")
7012    (set_attr "prefix_extra" "1")
7013    (set_attr "length_immediate" "1")
7014    (set_attr "mode" "TI")])
7016 (define_insn "*sse4_1_pextrb"
7017   [(set (match_operand:SI 0 "register_operand" "=r")
7018         (zero_extend:SI
7019           (vec_select:QI
7020             (match_operand:V16QI 1 "register_operand" "x")
7021             (parallel [(match_operand:SI 2 "const_0_to_15_operand" "n")]))))]
7022   "TARGET_SSE4_1"
7023   "%vpextrb\t{%2, %1, %0|%0, %1, %2}"
7024   [(set_attr "type" "sselog")
7025    (set_attr "prefix_extra" "1")
7026    (set_attr "length_immediate" "1")
7027    (set_attr "prefix" "maybe_vex")
7028    (set_attr "mode" "TI")])
7030 (define_insn "*sse4_1_pextrb_memory"
7031   [(set (match_operand:QI 0 "memory_operand" "=m")
7032         (vec_select:QI
7033           (match_operand:V16QI 1 "register_operand" "x")
7034           (parallel [(match_operand:SI 2 "const_0_to_15_operand" "n")])))]
7035   "TARGET_SSE4_1"
7036   "%vpextrb\t{%2, %1, %0|%0, %1, %2}"
7037   [(set_attr "type" "sselog")
7038    (set_attr "prefix_extra" "1")
7039    (set_attr "length_immediate" "1")
7040    (set_attr "prefix" "maybe_vex")
7041    (set_attr "mode" "TI")])
7043 (define_insn "*sse2_pextrw"
7044   [(set (match_operand:SI 0 "register_operand" "=r")
7045         (zero_extend:SI
7046           (vec_select:HI
7047             (match_operand:V8HI 1 "register_operand" "x")
7048             (parallel [(match_operand:SI 2 "const_0_to_7_operand" "n")]))))]
7049   "TARGET_SSE2"
7050   "%vpextrw\t{%2, %1, %0|%0, %1, %2}"
7051   [(set_attr "type" "sselog")
7052    (set_attr "prefix_data16" "1")
7053    (set_attr "length_immediate" "1")
7054    (set_attr "prefix" "maybe_vex")
7055    (set_attr "mode" "TI")])
7057 (define_insn "*sse4_1_pextrw_memory"
7058   [(set (match_operand:HI 0 "memory_operand" "=m")
7059         (vec_select:HI
7060           (match_operand:V8HI 1 "register_operand" "x")
7061           (parallel [(match_operand:SI 2 "const_0_to_7_operand" "n")])))]
7062   "TARGET_SSE4_1"
7063   "%vpextrw\t{%2, %1, %0|%0, %1, %2}"
7064   [(set_attr "type" "sselog")
7065    (set_attr "prefix_extra" "1")
7066    (set_attr "length_immediate" "1")
7067    (set_attr "prefix" "maybe_vex")
7068    (set_attr "mode" "TI")])
7070 (define_insn "*sse4_1_pextrd"
7071   [(set (match_operand:SI 0 "nonimmediate_operand" "=rm")
7072         (vec_select:SI
7073           (match_operand:V4SI 1 "register_operand" "x")
7074           (parallel [(match_operand:SI 2 "const_0_to_3_operand" "n")])))]
7075   "TARGET_SSE4_1"
7076   "%vpextrd\t{%2, %1, %0|%0, %1, %2}"
7077   [(set_attr "type" "sselog")
7078    (set_attr "prefix_extra" "1")
7079    (set_attr "length_immediate" "1")
7080    (set_attr "prefix" "maybe_vex")
7081    (set_attr "mode" "TI")])
7083 ;; It must come before *vec_extractv2di_1_sse since it is preferred.
7084 (define_insn "*sse4_1_pextrq"
7085   [(set (match_operand:DI 0 "nonimmediate_operand" "=rm")
7086         (vec_select:DI
7087           (match_operand:V2DI 1 "register_operand" "x")
7088           (parallel [(match_operand:SI 2 "const_0_to_1_operand" "n")])))]
7089   "TARGET_SSE4_1 && TARGET_64BIT"
7090   "%vpextrq\t{%2, %1, %0|%0, %1, %2}"
7091   [(set_attr "type" "sselog")
7092    (set_attr "prefix_rex" "1")
7093    (set_attr "prefix_extra" "1")
7094    (set_attr "length_immediate" "1")
7095    (set_attr "prefix" "maybe_vex")
7096    (set_attr "mode" "TI")])
7098 (define_expand "sse2_pshufd"
7099   [(match_operand:V4SI 0 "register_operand" "")
7100    (match_operand:V4SI 1 "nonimmediate_operand" "")
7101    (match_operand:SI 2 "const_int_operand" "")]
7102   "TARGET_SSE2"
7104   int mask = INTVAL (operands[2]);
7105   emit_insn (gen_sse2_pshufd_1 (operands[0], operands[1],
7106                                 GEN_INT ((mask >> 0) & 3),
7107                                 GEN_INT ((mask >> 2) & 3),
7108                                 GEN_INT ((mask >> 4) & 3),
7109                                 GEN_INT ((mask >> 6) & 3)));
7110   DONE;
7113 (define_insn "sse2_pshufd_1"
7114   [(set (match_operand:V4SI 0 "register_operand" "=x")
7115         (vec_select:V4SI
7116           (match_operand:V4SI 1 "nonimmediate_operand" "xm")
7117           (parallel [(match_operand 2 "const_0_to_3_operand" "")
7118                      (match_operand 3 "const_0_to_3_operand" "")
7119                      (match_operand 4 "const_0_to_3_operand" "")
7120                      (match_operand 5 "const_0_to_3_operand" "")])))]
7121   "TARGET_SSE2"
7123   int mask = 0;
7124   mask |= INTVAL (operands[2]) << 0;
7125   mask |= INTVAL (operands[3]) << 2;
7126   mask |= INTVAL (operands[4]) << 4;
7127   mask |= INTVAL (operands[5]) << 6;
7128   operands[2] = GEN_INT (mask);
7130   return "%vpshufd\t{%2, %1, %0|%0, %1, %2}";
7132   [(set_attr "type" "sselog1")
7133    (set_attr "prefix_data16" "1")
7134    (set_attr "prefix" "maybe_vex")
7135    (set_attr "length_immediate" "1")
7136    (set_attr "mode" "TI")])
7138 (define_expand "sse2_pshuflw"
7139   [(match_operand:V8HI 0 "register_operand" "")
7140    (match_operand:V8HI 1 "nonimmediate_operand" "")
7141    (match_operand:SI 2 "const_int_operand" "")]
7142   "TARGET_SSE2"
7144   int mask = INTVAL (operands[2]);
7145   emit_insn (gen_sse2_pshuflw_1 (operands[0], operands[1],
7146                                  GEN_INT ((mask >> 0) & 3),
7147                                  GEN_INT ((mask >> 2) & 3),
7148                                  GEN_INT ((mask >> 4) & 3),
7149                                  GEN_INT ((mask >> 6) & 3)));
7150   DONE;
7153 (define_insn "sse2_pshuflw_1"
7154   [(set (match_operand:V8HI 0 "register_operand" "=x")
7155         (vec_select:V8HI
7156           (match_operand:V8HI 1 "nonimmediate_operand" "xm")
7157           (parallel [(match_operand 2 "const_0_to_3_operand" "")
7158                      (match_operand 3 "const_0_to_3_operand" "")
7159                      (match_operand 4 "const_0_to_3_operand" "")
7160                      (match_operand 5 "const_0_to_3_operand" "")
7161                      (const_int 4)
7162                      (const_int 5)
7163                      (const_int 6)
7164                      (const_int 7)])))]
7165   "TARGET_SSE2"
7167   int mask = 0;
7168   mask |= INTVAL (operands[2]) << 0;
7169   mask |= INTVAL (operands[3]) << 2;
7170   mask |= INTVAL (operands[4]) << 4;
7171   mask |= INTVAL (operands[5]) << 6;
7172   operands[2] = GEN_INT (mask);
7174   return "%vpshuflw\t{%2, %1, %0|%0, %1, %2}";
7176   [(set_attr "type" "sselog")
7177    (set_attr "prefix_data16" "0")
7178    (set_attr "prefix_rep" "1")
7179    (set_attr "prefix" "maybe_vex")
7180    (set_attr "length_immediate" "1")
7181    (set_attr "mode" "TI")])
7183 (define_expand "sse2_pshufhw"
7184   [(match_operand:V8HI 0 "register_operand" "")
7185    (match_operand:V8HI 1 "nonimmediate_operand" "")
7186    (match_operand:SI 2 "const_int_operand" "")]
7187   "TARGET_SSE2"
7189   int mask = INTVAL (operands[2]);
7190   emit_insn (gen_sse2_pshufhw_1 (operands[0], operands[1],
7191                                  GEN_INT (((mask >> 0) & 3) + 4),
7192                                  GEN_INT (((mask >> 2) & 3) + 4),
7193                                  GEN_INT (((mask >> 4) & 3) + 4),
7194                                  GEN_INT (((mask >> 6) & 3) + 4)));
7195   DONE;
7198 (define_insn "sse2_pshufhw_1"
7199   [(set (match_operand:V8HI 0 "register_operand" "=x")
7200         (vec_select:V8HI
7201           (match_operand:V8HI 1 "nonimmediate_operand" "xm")
7202           (parallel [(const_int 0)
7203                      (const_int 1)
7204                      (const_int 2)
7205                      (const_int 3)
7206                      (match_operand 2 "const_4_to_7_operand" "")
7207                      (match_operand 3 "const_4_to_7_operand" "")
7208                      (match_operand 4 "const_4_to_7_operand" "")
7209                      (match_operand 5 "const_4_to_7_operand" "")])))]
7210   "TARGET_SSE2"
7212   int mask = 0;
7213   mask |= (INTVAL (operands[2]) - 4) << 0;
7214   mask |= (INTVAL (operands[3]) - 4) << 2;
7215   mask |= (INTVAL (operands[4]) - 4) << 4;
7216   mask |= (INTVAL (operands[5]) - 4) << 6;
7217   operands[2] = GEN_INT (mask);
7219   return "%vpshufhw\t{%2, %1, %0|%0, %1, %2}";
7221   [(set_attr "type" "sselog")
7222    (set_attr "prefix_rep" "1")
7223    (set_attr "prefix_data16" "0")
7224    (set_attr "prefix" "maybe_vex")
7225    (set_attr "length_immediate" "1")
7226    (set_attr "mode" "TI")])
7228 (define_expand "sse2_loadd"
7229   [(set (match_operand:V4SI 0 "register_operand" "")
7230         (vec_merge:V4SI
7231           (vec_duplicate:V4SI
7232             (match_operand:SI 1 "nonimmediate_operand" ""))
7233           (match_dup 2)
7234           (const_int 1)))]
7235   "TARGET_SSE"
7236   "operands[2] = CONST0_RTX (V4SImode);")
7238 (define_insn "*avx_loadld"
7239   [(set (match_operand:V4SI 0 "register_operand"       "=x,Yi,x")
7240         (vec_merge:V4SI
7241           (vec_duplicate:V4SI
7242             (match_operand:SI 2 "nonimmediate_operand" "m ,r ,x"))
7243           (match_operand:V4SI 1 "reg_or_0_operand"     "C ,C ,x")
7244           (const_int 1)))]
7245   "TARGET_AVX"
7246   "@
7247    vmovd\t{%2, %0|%0, %2}
7248    vmovd\t{%2, %0|%0, %2}
7249    vmovss\t{%2, %1, %0|%0, %1, %2}"
7250   [(set_attr "type" "ssemov")
7251    (set_attr "prefix" "vex")
7252    (set_attr "mode" "TI,TI,V4SF")])
7254 (define_insn "sse2_loadld"
7255   [(set (match_operand:V4SI 0 "register_operand"       "=Y2,Yi,x,x")
7256         (vec_merge:V4SI
7257           (vec_duplicate:V4SI
7258             (match_operand:SI 2 "nonimmediate_operand" "m  ,r ,m,x"))
7259           (match_operand:V4SI 1 "reg_or_0_operand"     "C  ,C ,C,0")
7260           (const_int 1)))]
7261   "TARGET_SSE"
7262   "@
7263    movd\t{%2, %0|%0, %2}
7264    movd\t{%2, %0|%0, %2}
7265    movss\t{%2, %0|%0, %2}
7266    movss\t{%2, %0|%0, %2}"
7267   [(set_attr "type" "ssemov")
7268    (set_attr "mode" "TI,TI,V4SF,SF")])
7270 (define_insn_and_split "sse2_stored"
7271   [(set (match_operand:SI 0 "nonimmediate_operand" "=mx,r")
7272         (vec_select:SI
7273           (match_operand:V4SI 1 "register_operand" "x,Yi")
7274           (parallel [(const_int 0)])))]
7275   "TARGET_SSE"
7276   "#"
7277   "&& reload_completed
7278    && (TARGET_INTER_UNIT_MOVES
7279        || MEM_P (operands [0])
7280        || !GENERAL_REGNO_P (true_regnum (operands [0])))"
7281   [(set (match_dup 0) (match_dup 1))]
7283   operands[1] = gen_rtx_REG (SImode, REGNO (operands[1]));
7286 (define_insn_and_split "*vec_ext_v4si_mem"
7287   [(set (match_operand:SI 0 "register_operand" "=r")
7288         (vec_select:SI
7289           (match_operand:V4SI 1 "memory_operand" "o")
7290           (parallel [(match_operand 2 "const_0_to_3_operand" "")])))]
7291   ""
7292   "#"
7293   "reload_completed"
7294   [(const_int 0)]
7296   int i = INTVAL (operands[2]);
7298   emit_move_insn (operands[0], adjust_address (operands[1], SImode, i*4));
7299   DONE;
7302 (define_expand "sse_storeq"
7303   [(set (match_operand:DI 0 "nonimmediate_operand" "")
7304         (vec_select:DI
7305           (match_operand:V2DI 1 "register_operand" "")
7306           (parallel [(const_int 0)])))]
7307   "TARGET_SSE"
7308   "")
7310 (define_insn "*sse2_storeq_rex64"
7311   [(set (match_operand:DI 0 "nonimmediate_operand" "=mx,*r,r")
7312         (vec_select:DI
7313           (match_operand:V2DI 1 "nonimmediate_operand" "x,Yi,o")
7314           (parallel [(const_int 0)])))]
7315   "TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
7316   "@
7317    #
7318    #
7319    %vmov{q}\t{%1, %0|%0, %1}"
7320   [(set_attr "type" "*,*,imov")
7321    (set_attr "prefix" "*,*,maybe_vex")
7322    (set_attr "mode" "*,*,DI")])
7324 (define_insn "*sse2_storeq"
7325   [(set (match_operand:DI 0 "nonimmediate_operand" "=mx")
7326         (vec_select:DI
7327           (match_operand:V2DI 1 "register_operand" "x")
7328           (parallel [(const_int 0)])))]
7329   "TARGET_SSE"
7330   "#")
7332 (define_split
7333   [(set (match_operand:DI 0 "nonimmediate_operand" "")
7334         (vec_select:DI
7335           (match_operand:V2DI 1 "register_operand" "")
7336           (parallel [(const_int 0)])))]
7337   "TARGET_SSE
7338    && reload_completed
7339    && (TARGET_INTER_UNIT_MOVES
7340        || MEM_P (operands [0])
7341        || !GENERAL_REGNO_P (true_regnum (operands [0])))"
7342   [(set (match_dup 0) (match_dup 1))]
7344   operands[1] = gen_rtx_REG (DImode, REGNO (operands[1]));
7347 (define_insn "*vec_extractv2di_1_rex64_avx"
7348   [(set (match_operand:DI 0 "nonimmediate_operand" "=m,x,x,r")
7349         (vec_select:DI
7350           (match_operand:V2DI 1 "nonimmediate_operand" "x,x,o,o")
7351           (parallel [(const_int 1)])))]
7352   "TARGET_64BIT
7353    && TARGET_AVX
7354    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
7355   "@
7356    vmovhps\t{%1, %0|%0, %1}
7357    vpsrldq\t{$8, %1, %0|%0, %1, 8}
7358    vmovq\t{%H1, %0|%0, %H1}
7359    vmov{q}\t{%H1, %0|%0, %H1}"
7360   [(set_attr "type" "ssemov,sseishft,ssemov,imov")
7361    (set_attr "length_immediate" "*,1,*,*")
7362    (set_attr "memory" "*,none,*,*")
7363    (set_attr "prefix" "vex")
7364    (set_attr "mode" "V2SF,TI,TI,DI")])
7366 (define_insn "*vec_extractv2di_1_rex64"
7367   [(set (match_operand:DI 0 "nonimmediate_operand" "=m,x,x,r")
7368         (vec_select:DI
7369           (match_operand:V2DI 1 "nonimmediate_operand" "x,0,o,o")
7370           (parallel [(const_int 1)])))]
7371   "TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
7372   "@
7373    movhps\t{%1, %0|%0, %1}
7374    psrldq\t{$8, %0|%0, 8}
7375    movq\t{%H1, %0|%0, %H1}
7376    mov{q}\t{%H1, %0|%0, %H1}"
7377   [(set_attr "type" "ssemov,sseishft,ssemov,imov")
7378    (set_attr "length_immediate" "*,1,*,*")
7379    (set_attr "atom_unit" "*,sishuf,*,*")
7380    (set_attr "memory" "*,none,*,*")
7381    (set_attr "mode" "V2SF,TI,TI,DI")])
7383 (define_insn "*vec_extractv2di_1_avx"
7384   [(set (match_operand:DI 0 "nonimmediate_operand" "=m,x,x")
7385         (vec_select:DI
7386           (match_operand:V2DI 1 "nonimmediate_operand" "x,x,o")
7387           (parallel [(const_int 1)])))]
7388   "!TARGET_64BIT
7389    && TARGET_AVX
7390    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
7391   "@
7392    vmovhps\t{%1, %0|%0, %1}
7393    vpsrldq\t{$8, %1, %0|%0, %1, 8}
7394    vmovq\t{%H1, %0|%0, %H1}"
7395   [(set_attr "type" "ssemov,sseishft,ssemov")
7396    (set_attr "length_immediate" "*,1,*")
7397    (set_attr "memory" "*,none,*")
7398    (set_attr "prefix" "vex")
7399    (set_attr "mode" "V2SF,TI,TI")])
7401 (define_insn "*vec_extractv2di_1_sse2"
7402   [(set (match_operand:DI 0 "nonimmediate_operand" "=m,x,x")
7403         (vec_select:DI
7404           (match_operand:V2DI 1 "nonimmediate_operand" "x,0,o")
7405           (parallel [(const_int 1)])))]
7406   "!TARGET_64BIT
7407    && TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
7408   "@
7409    movhps\t{%1, %0|%0, %1}
7410    psrldq\t{$8, %0|%0, 8}
7411    movq\t{%H1, %0|%0, %H1}"
7412   [(set_attr "type" "ssemov,sseishft,ssemov")
7413    (set_attr "length_immediate" "*,1,*")
7414    (set_attr "atom_unit" "*,sishuf,*")
7415    (set_attr "memory" "*,none,*")
7416    (set_attr "mode" "V2SF,TI,TI")])
7418 ;; Not sure this is ever used, but it doesn't hurt to have it. -aoliva
7419 (define_insn "*vec_extractv2di_1_sse"
7420   [(set (match_operand:DI 0 "nonimmediate_operand" "=m,x,x")
7421         (vec_select:DI
7422           (match_operand:V2DI 1 "nonimmediate_operand" "x,x,o")
7423           (parallel [(const_int 1)])))]
7424   "!TARGET_SSE2 && TARGET_SSE
7425    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
7426   "@
7427    movhps\t{%1, %0|%0, %1}
7428    movhlps\t{%1, %0|%0, %1}
7429    movlps\t{%H1, %0|%0, %H1}"
7430   [(set_attr "type" "ssemov")
7431    (set_attr "mode" "V2SF,V4SF,V2SF")])
7433 (define_insn "*vec_dupv4si_avx"
7434   [(set (match_operand:V4SI 0 "register_operand" "=x,x")
7435         (vec_duplicate:V4SI
7436           (match_operand:SI 1 "register_operand" "x,m")))]
7437   "TARGET_AVX"
7438   "@
7439    vpshufd\t{$0, %1, %0|%0, %1, 0}
7440    vbroadcastss\t{%1, %0|%0, %1}"
7441   [(set_attr "type" "sselog1,ssemov")
7442    (set_attr "length_immediate" "1,0")
7443    (set_attr "prefix_extra" "0,1")
7444    (set_attr "prefix" "vex")
7445    (set_attr "mode" "TI,V4SF")])
7447 (define_insn "*vec_dupv4si"
7448   [(set (match_operand:V4SI 0 "register_operand" "=Y2,x")
7449         (vec_duplicate:V4SI
7450           (match_operand:SI 1 "register_operand" " Y2,0")))]
7451   "TARGET_SSE"
7452   "@
7453    %vpshufd\t{$0, %1, %0|%0, %1, 0}
7454    shufps\t{$0, %0, %0|%0, %0, 0}"
7455   [(set_attr "type" "sselog1")
7456    (set_attr "length_immediate" "1")
7457    (set_attr "mode" "TI,V4SF")])
7459 (define_insn "*vec_dupv2di_avx"
7460   [(set (match_operand:V2DI 0 "register_operand"     "=x,x")
7461         (vec_duplicate:V2DI
7462           (match_operand:DI 1 "nonimmediate_operand" " x,m")))]
7463   "TARGET_AVX"
7464   "@
7465    vpunpcklqdq\t{%1, %1, %0|%0, %1, %1}
7466    vmovddup\t{%1, %0|%0, %1}"
7467   [(set_attr "type" "sselog1")
7468    (set_attr "prefix" "vex")
7469    (set_attr "mode" "TI,DF")])
7471 (define_insn "*vec_dupv2di_sse3"
7472   [(set (match_operand:V2DI 0 "register_operand"     "=x,x")
7473         (vec_duplicate:V2DI
7474           (match_operand:DI 1 "nonimmediate_operand" " 0,m")))]
7475   "TARGET_SSE3"
7476   "@
7477    punpcklqdq\t%0, %0
7478    movddup\t{%1, %0|%0, %1}"
7479   [(set_attr "type" "sselog1")
7480    (set_attr "mode" "TI,DF")])
7482 (define_insn "*vec_dupv2di"
7483   [(set (match_operand:V2DI 0 "register_operand" "=Y2,x")
7484         (vec_duplicate:V2DI
7485           (match_operand:DI 1 "register_operand" " 0 ,0")))]
7486   "TARGET_SSE"
7487   "@
7488    punpcklqdq\t%0, %0
7489    movlhps\t%0, %0"
7490   [(set_attr "type" "sselog1,ssemov")
7491    (set_attr "mode" "TI,V4SF")])
7493 (define_insn "*vec_concatv2si_avx"
7494   [(set (match_operand:V2SI 0 "register_operand"     "=x,x,x ,*y ,*y")
7495         (vec_concat:V2SI
7496           (match_operand:SI 1 "nonimmediate_operand" "x ,x,rm, 0 ,rm")
7497           (match_operand:SI 2 "vector_move_operand"  "rm,x,C ,*ym,C")))]
7498   "TARGET_AVX"
7499   "@
7500    vpinsrd\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}
7501    vpunpckldq\t{%2, %1, %0|%0, %1, %2}
7502    vmovd\t{%1, %0|%0, %1}
7503    punpckldq\t{%2, %0|%0, %2}
7504    movd\t{%1, %0|%0, %1}"
7505   [(set_attr "type" "sselog,sselog,ssemov,mmxcvt,mmxmov")
7506    (set_attr "prefix_extra" "1,*,*,*,*")
7507    (set_attr "length_immediate" "1,*,*,*,*")
7508    (set (attr "prefix")
7509      (if_then_else (eq_attr "alternative" "3,4")
7510        (const_string "orig")
7511        (const_string "vex")))
7512    (set_attr "mode" "TI,TI,TI,DI,DI")])
7514 (define_insn "*vec_concatv2si_sse4_1"
7515   [(set (match_operand:V2SI 0 "register_operand"     "=x,x,x ,*y ,*y")
7516         (vec_concat:V2SI
7517           (match_operand:SI 1 "nonimmediate_operand" "0 ,0,rm, 0 ,rm")
7518           (match_operand:SI 2 "vector_move_operand"  "rm,x,C ,*ym,C")))]
7519   "TARGET_SSE4_1"
7520   "@
7521    pinsrd\t{$0x1, %2, %0|%0, %2, 0x1}
7522    punpckldq\t{%2, %0|%0, %2}
7523    movd\t{%1, %0|%0, %1}
7524    punpckldq\t{%2, %0|%0, %2}
7525    movd\t{%1, %0|%0, %1}"
7526   [(set_attr "type" "sselog,sselog,ssemov,mmxcvt,mmxmov")
7527    (set_attr "prefix_extra" "1,*,*,*,*")
7528    (set_attr "length_immediate" "1,*,*,*,*")
7529    (set_attr "mode" "TI,TI,TI,DI,DI")])
7531 ;; ??? In theory we can match memory for the MMX alternative, but allowing
7532 ;; nonimmediate_operand for operand 2 and *not* allowing memory for the SSE
7533 ;; alternatives pretty much forces the MMX alternative to be chosen.
7534 (define_insn "*vec_concatv2si_sse2"
7535   [(set (match_operand:V2SI 0 "register_operand"     "=x,x ,*y,*y")
7536         (vec_concat:V2SI
7537           (match_operand:SI 1 "nonimmediate_operand" " 0,rm, 0,rm")
7538           (match_operand:SI 2 "reg_or_0_operand"     " x,C ,*y, C")))]
7539   "TARGET_SSE2"
7540   "@
7541    punpckldq\t{%2, %0|%0, %2}
7542    movd\t{%1, %0|%0, %1}
7543    punpckldq\t{%2, %0|%0, %2}
7544    movd\t{%1, %0|%0, %1}"
7545   [(set_attr "type" "sselog,ssemov,mmxcvt,mmxmov")
7546    (set_attr "mode" "TI,TI,DI,DI")])
7548 (define_insn "*vec_concatv2si_sse"
7549   [(set (match_operand:V2SI 0 "register_operand"     "=x,x,*y,*y")
7550         (vec_concat:V2SI
7551           (match_operand:SI 1 "nonimmediate_operand" " 0,m, 0,*rm")
7552           (match_operand:SI 2 "reg_or_0_operand"     " x,C,*y,C")))]
7553   "TARGET_SSE"
7554   "@
7555    unpcklps\t{%2, %0|%0, %2}
7556    movss\t{%1, %0|%0, %1}
7557    punpckldq\t{%2, %0|%0, %2}
7558    movd\t{%1, %0|%0, %1}"
7559   [(set_attr "type" "sselog,ssemov,mmxcvt,mmxmov")
7560    (set_attr "mode" "V4SF,V4SF,DI,DI")])
7562 (define_insn "*vec_concatv4si_1_avx"
7563   [(set (match_operand:V4SI 0 "register_operand"       "=x,x")
7564         (vec_concat:V4SI
7565           (match_operand:V2SI 1 "register_operand"     " x,x")
7566           (match_operand:V2SI 2 "nonimmediate_operand" " x,m")))]
7567   "TARGET_AVX"
7568   "@
7569    vpunpcklqdq\t{%2, %1, %0|%0, %1, %2}
7570    vmovhps\t{%2, %1, %0|%0, %1, %2}"
7571   [(set_attr "type" "sselog,ssemov")
7572    (set_attr "prefix" "vex")
7573    (set_attr "mode" "TI,V2SF")])
7575 (define_insn "*vec_concatv4si_1"
7576   [(set (match_operand:V4SI 0 "register_operand"       "=Y2,x,x")
7577         (vec_concat:V4SI
7578           (match_operand:V2SI 1 "register_operand"     " 0 ,0,0")
7579           (match_operand:V2SI 2 "nonimmediate_operand" " Y2,x,m")))]
7580   "TARGET_SSE"
7581   "@
7582    punpcklqdq\t{%2, %0|%0, %2}
7583    movlhps\t{%2, %0|%0, %2}
7584    movhps\t{%2, %0|%0, %2}"
7585   [(set_attr "type" "sselog,ssemov,ssemov")
7586    (set_attr "mode" "TI,V4SF,V2SF")])
7588 (define_insn "*vec_concatv2di_avx"
7589   [(set (match_operand:V2DI 0 "register_operand"     "=x,?x,x,x")
7590         (vec_concat:V2DI
7591           (match_operand:DI 1 "nonimmediate_operand" " m,*y,x,x")
7592           (match_operand:DI 2 "vector_move_operand"  " C, C,x,m")))]
7593   "!TARGET_64BIT && TARGET_AVX"
7594   "@
7595    vmovq\t{%1, %0|%0, %1}
7596    movq2dq\t{%1, %0|%0, %1}
7597    vpunpcklqdq\t{%2, %1, %0|%0, %1, %2}
7598    vmovhps\t{%2, %1, %0|%0, %1, %2}"
7599   [(set_attr "type" "ssemov,ssemov,sselog,ssemov")
7600    (set (attr "prefix")
7601      (if_then_else (eq_attr "alternative" "1")
7602        (const_string "orig")
7603        (const_string "vex")))
7604    (set_attr "mode" "TI,TI,TI,V2SF")])
7606 (define_insn "vec_concatv2di"
7607   [(set (match_operand:V2DI 0 "register_operand"     "=Y2 ,?Y2,Y2,x,x")
7608         (vec_concat:V2DI
7609           (match_operand:DI 1 "nonimmediate_operand" " mY2,*y ,0 ,0,0")
7610           (match_operand:DI 2 "vector_move_operand"  " C  ,  C,Y2,x,m")))]
7611   "!TARGET_64BIT && TARGET_SSE"
7612   "@
7613    movq\t{%1, %0|%0, %1}
7614    movq2dq\t{%1, %0|%0, %1}
7615    punpcklqdq\t{%2, %0|%0, %2}
7616    movlhps\t{%2, %0|%0, %2}
7617    movhps\t{%2, %0|%0, %2}"
7618   [(set_attr "type" "ssemov,ssemov,sselog,ssemov,ssemov")
7619    (set_attr "mode" "TI,TI,TI,V4SF,V2SF")])
7621 (define_insn "*vec_concatv2di_rex64_avx"
7622   [(set (match_operand:V2DI 0 "register_operand"     "=x,x,Yi,!x,x,x")
7623         (vec_concat:V2DI
7624           (match_operand:DI 1 "nonimmediate_operand" " x,m,r ,*y,x,x")
7625           (match_operand:DI 2 "vector_move_operand"  "rm,C,C ,C ,x,m")))]
7626   "TARGET_64BIT && TARGET_AVX"
7627   "@
7628    vpinsrq\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}
7629    vmovq\t{%1, %0|%0, %1}
7630    vmovq\t{%1, %0|%0, %1}
7631    movq2dq\t{%1, %0|%0, %1}
7632    vpunpcklqdq\t{%2, %1, %0|%0, %1, %2}
7633    vmovhps\t{%2, %1, %0|%0, %1, %2}"
7634   [(set_attr "type" "sselog,ssemov,ssemov,ssemov,sselog,ssemov")
7635    (set_attr "prefix_extra" "1,*,*,*,*,*")
7636    (set_attr "length_immediate" "1,*,*,*,*,*")
7637    (set (attr "prefix")
7638      (if_then_else (eq_attr "alternative" "3")
7639        (const_string "orig")
7640        (const_string "vex")))
7641    (set_attr "mode" "TI,TI,TI,TI,TI,V2SF")])
7643 (define_insn "*vec_concatv2di_rex64_sse4_1"
7644   [(set (match_operand:V2DI 0 "register_operand"     "=x ,x ,Yi,!x,x,x,x")
7645         (vec_concat:V2DI
7646           (match_operand:DI 1 "nonimmediate_operand" " 0 ,mx,r ,*y,0,0,0")
7647           (match_operand:DI 2 "vector_move_operand"  " rm,C ,C ,C ,x,x,m")))]
7648   "TARGET_64BIT && TARGET_SSE4_1"
7649   "@
7650    pinsrq\t{$0x1, %2, %0|%0, %2, 0x1}
7651    movq\t{%1, %0|%0, %1}
7652    movq\t{%1, %0|%0, %1}
7653    movq2dq\t{%1, %0|%0, %1}
7654    punpcklqdq\t{%2, %0|%0, %2}
7655    movlhps\t{%2, %0|%0, %2}
7656    movhps\t{%2, %0|%0, %2}"
7657   [(set_attr "type" "sselog,ssemov,ssemov,ssemov,sselog,ssemov,ssemov")
7658    (set_attr "prefix_rex" "1,*,1,*,*,*,*")
7659    (set_attr "prefix_extra" "1,*,*,*,*,*,*")
7660    (set_attr "length_immediate" "1,*,*,*,*,*,*")
7661    (set_attr "mode" "TI,TI,TI,TI,TI,V4SF,V2SF")])
7663 (define_insn "*vec_concatv2di_rex64_sse"
7664   [(set (match_operand:V2DI 0 "register_operand"     "=Y2 ,Yi,!Y2,Y2,x,x")
7665         (vec_concat:V2DI
7666           (match_operand:DI 1 "nonimmediate_operand" " mY2,r ,*y ,0 ,0,0")
7667           (match_operand:DI 2 "vector_move_operand"  " C  ,C ,C  ,Y2,x,m")))]
7668   "TARGET_64BIT && TARGET_SSE"
7669   "@
7670    movq\t{%1, %0|%0, %1}
7671    movq\t{%1, %0|%0, %1}
7672    movq2dq\t{%1, %0|%0, %1}
7673    punpcklqdq\t{%2, %0|%0, %2}
7674    movlhps\t{%2, %0|%0, %2}
7675    movhps\t{%2, %0|%0, %2}"
7676   [(set_attr "type" "ssemov,ssemov,ssemov,sselog,ssemov,ssemov")
7677    (set_attr "prefix_rex" "*,1,*,*,*,*")
7678    (set_attr "mode" "TI,TI,TI,TI,V4SF,V2SF")])
7680 (define_expand "vec_unpacku_hi_v16qi"
7681   [(match_operand:V8HI 0 "register_operand" "")
7682    (match_operand:V16QI 1 "register_operand" "")]
7683   "TARGET_SSE2"
7685   if (TARGET_SSE4_1)
7686     ix86_expand_sse4_unpack (operands, true, true);
7687   else
7688     ix86_expand_sse_unpack (operands, true, true);
7689   DONE;
7692 (define_expand "vec_unpacks_hi_v16qi"
7693   [(match_operand:V8HI 0 "register_operand" "")
7694    (match_operand:V16QI 1 "register_operand" "")]
7695   "TARGET_SSE2"
7697   if (TARGET_SSE4_1)
7698     ix86_expand_sse4_unpack (operands, false, true);
7699   else
7700     ix86_expand_sse_unpack (operands, false, true);
7701   DONE;
7704 (define_expand "vec_unpacku_lo_v16qi"
7705   [(match_operand:V8HI 0 "register_operand" "")
7706    (match_operand:V16QI 1 "register_operand" "")]
7707   "TARGET_SSE2"
7709   if (TARGET_SSE4_1)
7710     ix86_expand_sse4_unpack (operands, true, false);
7711   else
7712     ix86_expand_sse_unpack (operands, true, false);
7713   DONE;
7716 (define_expand "vec_unpacks_lo_v16qi"
7717   [(match_operand:V8HI 0 "register_operand" "")
7718    (match_operand:V16QI 1 "register_operand" "")]
7719   "TARGET_SSE2"
7721   if (TARGET_SSE4_1)
7722     ix86_expand_sse4_unpack (operands, false, false);
7723   else
7724     ix86_expand_sse_unpack (operands, false, false);
7725   DONE;
7728 (define_expand "vec_unpacku_hi_v8hi"
7729   [(match_operand:V4SI 0 "register_operand" "")
7730    (match_operand:V8HI 1 "register_operand" "")]
7731   "TARGET_SSE2"
7733   if (TARGET_SSE4_1)
7734     ix86_expand_sse4_unpack (operands, true, true);
7735   else
7736     ix86_expand_sse_unpack (operands, true, true);
7737   DONE;
7740 (define_expand "vec_unpacks_hi_v8hi"
7741   [(match_operand:V4SI 0 "register_operand" "")
7742    (match_operand:V8HI 1 "register_operand" "")]
7743   "TARGET_SSE2"
7745   if (TARGET_SSE4_1)
7746     ix86_expand_sse4_unpack (operands, false, true);
7747   else
7748     ix86_expand_sse_unpack (operands, false, true);
7749   DONE;
7752 (define_expand "vec_unpacku_lo_v8hi"
7753   [(match_operand:V4SI 0 "register_operand" "")
7754    (match_operand:V8HI 1 "register_operand" "")]
7755   "TARGET_SSE2"
7757   if (TARGET_SSE4_1)
7758     ix86_expand_sse4_unpack (operands, true, false);
7759   else
7760     ix86_expand_sse_unpack (operands, true, false);
7761   DONE;
7764 (define_expand "vec_unpacks_lo_v8hi"
7765   [(match_operand:V4SI 0 "register_operand" "")
7766    (match_operand:V8HI 1 "register_operand" "")]
7767   "TARGET_SSE2"
7769   if (TARGET_SSE4_1)
7770     ix86_expand_sse4_unpack (operands, false, false);
7771   else
7772     ix86_expand_sse_unpack (operands, false, false);
7773   DONE;
7776 (define_expand "vec_unpacku_hi_v4si"
7777   [(match_operand:V2DI 0 "register_operand" "")
7778    (match_operand:V4SI 1 "register_operand" "")]
7779   "TARGET_SSE2"
7781   if (TARGET_SSE4_1)
7782     ix86_expand_sse4_unpack (operands, true, true);
7783   else
7784     ix86_expand_sse_unpack (operands, true, true);
7785   DONE;
7788 (define_expand "vec_unpacks_hi_v4si"
7789   [(match_operand:V2DI 0 "register_operand" "")
7790    (match_operand:V4SI 1 "register_operand" "")]
7791   "TARGET_SSE2"
7793   if (TARGET_SSE4_1)
7794     ix86_expand_sse4_unpack (operands, false, true);
7795   else
7796     ix86_expand_sse_unpack (operands, false, true);
7797   DONE;
7800 (define_expand "vec_unpacku_lo_v4si"
7801   [(match_operand:V2DI 0 "register_operand" "")
7802    (match_operand:V4SI 1 "register_operand" "")]
7803   "TARGET_SSE2"
7805   if (TARGET_SSE4_1)
7806     ix86_expand_sse4_unpack (operands, true, false);
7807   else
7808     ix86_expand_sse_unpack (operands, true, false);
7809   DONE;
7812 (define_expand "vec_unpacks_lo_v4si"
7813   [(match_operand:V2DI 0 "register_operand" "")
7814    (match_operand:V4SI 1 "register_operand" "")]
7815   "TARGET_SSE2"
7817   if (TARGET_SSE4_1)
7818     ix86_expand_sse4_unpack (operands, false, false);
7819   else
7820     ix86_expand_sse_unpack (operands, false, false);
7821   DONE;
7824 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7826 ;; Miscellaneous
7828 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7830 (define_expand "sse2_uavgv16qi3"
7831   [(set (match_operand:V16QI 0 "register_operand" "")
7832         (truncate:V16QI
7833           (lshiftrt:V16HI
7834             (plus:V16HI
7835               (plus:V16HI
7836                 (zero_extend:V16HI
7837                   (match_operand:V16QI 1 "nonimmediate_operand" ""))
7838                 (zero_extend:V16HI
7839                   (match_operand:V16QI 2 "nonimmediate_operand" "")))
7840               (const_vector:V16QI [(const_int 1) (const_int 1)
7841                                    (const_int 1) (const_int 1)
7842                                    (const_int 1) (const_int 1)
7843                                    (const_int 1) (const_int 1)
7844                                    (const_int 1) (const_int 1)
7845                                    (const_int 1) (const_int 1)
7846                                    (const_int 1) (const_int 1)
7847                                    (const_int 1) (const_int 1)]))
7848             (const_int 1))))]
7849   "TARGET_SSE2"
7850   "ix86_fixup_binary_operands_no_copy (PLUS, V16QImode, operands);")
7852 (define_insn "*avx_uavgv16qi3"
7853   [(set (match_operand:V16QI 0 "register_operand" "=x")
7854         (truncate:V16QI
7855           (lshiftrt:V16HI
7856             (plus:V16HI
7857               (plus:V16HI
7858                 (zero_extend:V16HI
7859                   (match_operand:V16QI 1 "nonimmediate_operand" "%x"))
7860                 (zero_extend:V16HI
7861                   (match_operand:V16QI 2 "nonimmediate_operand" "xm")))
7862               (const_vector:V16QI [(const_int 1) (const_int 1)
7863                                    (const_int 1) (const_int 1)
7864                                    (const_int 1) (const_int 1)
7865                                    (const_int 1) (const_int 1)
7866                                    (const_int 1) (const_int 1)
7867                                    (const_int 1) (const_int 1)
7868                                    (const_int 1) (const_int 1)
7869                                    (const_int 1) (const_int 1)]))
7870             (const_int 1))))]
7871   "TARGET_AVX && ix86_binary_operator_ok (PLUS, V16QImode, operands)"
7872   "vpavgb\t{%2, %1, %0|%0, %1, %2}"
7873   [(set_attr "type" "sseiadd")
7874    (set_attr "prefix" "vex")
7875    (set_attr "mode" "TI")])
7877 (define_insn "*sse2_uavgv16qi3"
7878   [(set (match_operand:V16QI 0 "register_operand" "=x")
7879         (truncate:V16QI
7880           (lshiftrt:V16HI
7881             (plus:V16HI
7882               (plus:V16HI
7883                 (zero_extend:V16HI
7884                   (match_operand:V16QI 1 "nonimmediate_operand" "%0"))
7885                 (zero_extend:V16HI
7886                   (match_operand:V16QI 2 "nonimmediate_operand" "xm")))
7887               (const_vector:V16QI [(const_int 1) (const_int 1)
7888                                    (const_int 1) (const_int 1)
7889                                    (const_int 1) (const_int 1)
7890                                    (const_int 1) (const_int 1)
7891                                    (const_int 1) (const_int 1)
7892                                    (const_int 1) (const_int 1)
7893                                    (const_int 1) (const_int 1)
7894                                    (const_int 1) (const_int 1)]))
7895             (const_int 1))))]
7896   "TARGET_SSE2 && ix86_binary_operator_ok (PLUS, V16QImode, operands)"
7897   "pavgb\t{%2, %0|%0, %2}"
7898   [(set_attr "type" "sseiadd")
7899    (set_attr "prefix_data16" "1")
7900    (set_attr "mode" "TI")])
7902 (define_expand "sse2_uavgv8hi3"
7903   [(set (match_operand:V8HI 0 "register_operand" "")
7904         (truncate:V8HI
7905           (lshiftrt:V8SI
7906             (plus:V8SI
7907               (plus:V8SI
7908                 (zero_extend:V8SI
7909                   (match_operand:V8HI 1 "nonimmediate_operand" ""))
7910                 (zero_extend:V8SI
7911                   (match_operand:V8HI 2 "nonimmediate_operand" "")))
7912               (const_vector:V8HI [(const_int 1) (const_int 1)
7913                                   (const_int 1) (const_int 1)
7914                                   (const_int 1) (const_int 1)
7915                                   (const_int 1) (const_int 1)]))
7916             (const_int 1))))]
7917   "TARGET_SSE2"
7918   "ix86_fixup_binary_operands_no_copy (PLUS, V8HImode, operands);")
7920 (define_insn "*avx_uavgv8hi3"
7921   [(set (match_operand:V8HI 0 "register_operand" "=x")
7922         (truncate:V8HI
7923           (lshiftrt:V8SI
7924             (plus:V8SI
7925               (plus:V8SI
7926                 (zero_extend:V8SI
7927                   (match_operand:V8HI 1 "nonimmediate_operand" "%x"))
7928                 (zero_extend:V8SI
7929                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")))
7930               (const_vector:V8HI [(const_int 1) (const_int 1)
7931                                   (const_int 1) (const_int 1)
7932                                   (const_int 1) (const_int 1)
7933                                   (const_int 1) (const_int 1)]))
7934             (const_int 1))))]
7935   "TARGET_AVX && ix86_binary_operator_ok (PLUS, V8HImode, operands)"
7936   "vpavgw\t{%2, %1, %0|%0, %1, %2}"
7937   [(set_attr "type" "sseiadd")
7938    (set_attr "prefix" "vex")
7939    (set_attr "mode" "TI")])
7941 (define_insn "*sse2_uavgv8hi3"
7942   [(set (match_operand:V8HI 0 "register_operand" "=x")
7943         (truncate:V8HI
7944           (lshiftrt:V8SI
7945             (plus:V8SI
7946               (plus:V8SI
7947                 (zero_extend:V8SI
7948                   (match_operand:V8HI 1 "nonimmediate_operand" "%0"))
7949                 (zero_extend:V8SI
7950                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")))
7951               (const_vector:V8HI [(const_int 1) (const_int 1)
7952                                   (const_int 1) (const_int 1)
7953                                   (const_int 1) (const_int 1)
7954                                   (const_int 1) (const_int 1)]))
7955             (const_int 1))))]
7956   "TARGET_SSE2 && ix86_binary_operator_ok (PLUS, V8HImode, operands)"
7957   "pavgw\t{%2, %0|%0, %2}"
7958   [(set_attr "type" "sseiadd")
7959    (set_attr "prefix_data16" "1")
7960    (set_attr "mode" "TI")])
7962 ;; The correct representation for this is absolutely enormous, and
7963 ;; surely not generally useful.
7964 (define_insn "*avx_psadbw"
7965   [(set (match_operand:V2DI 0 "register_operand" "=x")
7966         (unspec:V2DI [(match_operand:V16QI 1 "register_operand" "x")
7967                       (match_operand:V16QI 2 "nonimmediate_operand" "xm")]
7968                      UNSPEC_PSADBW))]
7969   "TARGET_AVX"
7970   "vpsadbw\t{%2, %1, %0|%0, %1, %2}"
7971   [(set_attr "type" "sseiadd")
7972    (set_attr "prefix" "vex")
7973    (set_attr "mode" "TI")])
7975 (define_insn "sse2_psadbw"
7976   [(set (match_operand:V2DI 0 "register_operand" "=x")
7977         (unspec:V2DI [(match_operand:V16QI 1 "register_operand" "0")
7978                       (match_operand:V16QI 2 "nonimmediate_operand" "xm")]
7979                      UNSPEC_PSADBW))]
7980   "TARGET_SSE2"
7981   "psadbw\t{%2, %0|%0, %2}"
7982   [(set_attr "type" "sseiadd")
7983    (set_attr "atom_unit" "simul")
7984    (set_attr "prefix_data16" "1")
7985    (set_attr "mode" "TI")])
7987 (define_insn "avx_movmskp<avxmodesuffixf2c>256"
7988   [(set (match_operand:SI 0 "register_operand" "=r")
7989         (unspec:SI
7990           [(match_operand:AVX256MODEF2P 1 "register_operand" "x")]
7991           UNSPEC_MOVMSK))]
7992   "AVX256_VEC_FLOAT_MODE_P (<MODE>mode)"
7993   "vmovmskp<avxmodesuffixf2c>\t{%1, %0|%0, %1}"
7994   [(set_attr "type" "ssecvt")
7995    (set_attr "prefix" "vex")
7996    (set_attr "mode" "<MODE>")])
7998 (define_insn "<sse>_movmskp<ssemodesuffixf2c>"
7999   [(set (match_operand:SI 0 "register_operand" "=r")
8000         (unspec:SI
8001           [(match_operand:SSEMODEF2P 1 "register_operand" "x")]
8002           UNSPEC_MOVMSK))]
8003   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
8004   "%vmovmskp<ssemodesuffixf2c>\t{%1, %0|%0, %1}"
8005   [(set_attr "type" "ssemov")
8006    (set_attr "prefix" "maybe_vex")
8007    (set_attr "mode" "<MODE>")])
8009 (define_insn "sse2_pmovmskb"
8010   [(set (match_operand:SI 0 "register_operand" "=r")
8011         (unspec:SI [(match_operand:V16QI 1 "register_operand" "x")]
8012                    UNSPEC_MOVMSK))]
8013   "TARGET_SSE2"
8014   "%vpmovmskb\t{%1, %0|%0, %1}"
8015   [(set_attr "type" "ssemov")
8016    (set_attr "prefix_data16" "1")
8017    (set_attr "prefix" "maybe_vex")
8018    (set_attr "mode" "SI")])
8020 (define_expand "sse2_maskmovdqu"
8021   [(set (match_operand:V16QI 0 "memory_operand" "")
8022         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "")
8023                        (match_operand:V16QI 2 "register_operand" "")
8024                        (match_dup 0)]
8025                       UNSPEC_MASKMOV))]
8026   "TARGET_SSE2"
8027   "")
8029 (define_insn "*sse2_maskmovdqu"
8030   [(set (mem:V16QI (match_operand:SI 0 "register_operand" "D"))
8031         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "x")
8032                        (match_operand:V16QI 2 "register_operand" "x")
8033                        (mem:V16QI (match_dup 0))]
8034                       UNSPEC_MASKMOV))]
8035   "TARGET_SSE2 && !TARGET_64BIT"
8036   ;; @@@ check ordering of operands in intel/nonintel syntax
8037   "%vmaskmovdqu\t{%2, %1|%1, %2}"
8038   [(set_attr "type" "ssemov")
8039    (set_attr "prefix_data16" "1")
8040    ;; The implicit %rdi operand confuses default length_vex computation.
8041    (set_attr "length_vex" "3")
8042    (set_attr "prefix" "maybe_vex")
8043    (set_attr "mode" "TI")])
8045 (define_insn "*sse2_maskmovdqu_rex64"
8046   [(set (mem:V16QI (match_operand:DI 0 "register_operand" "D"))
8047         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "x")
8048                        (match_operand:V16QI 2 "register_operand" "x")
8049                        (mem:V16QI (match_dup 0))]
8050                       UNSPEC_MASKMOV))]
8051   "TARGET_SSE2 && TARGET_64BIT"
8052   ;; @@@ check ordering of operands in intel/nonintel syntax
8053   "%vmaskmovdqu\t{%2, %1|%1, %2}"
8054   [(set_attr "type" "ssemov")
8055    (set_attr "prefix_data16" "1")
8056    ;; The implicit %rdi operand confuses default length_vex computation.
8057    (set (attr "length_vex")
8058      (symbol_ref ("REGNO (operands[2]) >= FIRST_REX_SSE_REG ? 3 + 1 : 2 + 1")))
8059    (set_attr "prefix" "maybe_vex")
8060    (set_attr "mode" "TI")])
8062 (define_insn "sse_ldmxcsr"
8063   [(unspec_volatile [(match_operand:SI 0 "memory_operand" "m")]
8064                     UNSPECV_LDMXCSR)]
8065   "TARGET_SSE"
8066   "%vldmxcsr\t%0"
8067   [(set_attr "type" "sse")
8068    (set_attr "atom_sse_attr" "mxcsr")
8069    (set_attr "prefix" "maybe_vex")
8070    (set_attr "memory" "load")])
8072 (define_insn "sse_stmxcsr"
8073   [(set (match_operand:SI 0 "memory_operand" "=m")
8074         (unspec_volatile:SI [(const_int 0)] UNSPECV_STMXCSR))]
8075   "TARGET_SSE"
8076   "%vstmxcsr\t%0"
8077   [(set_attr "type" "sse")
8078    (set_attr "atom_sse_attr" "mxcsr")
8079    (set_attr "prefix" "maybe_vex")
8080    (set_attr "memory" "store")])
8082 (define_expand "sse_sfence"
8083   [(set (match_dup 0)
8084         (unspec:BLK [(match_dup 0)] UNSPEC_SFENCE))]
8085   "TARGET_SSE || TARGET_3DNOW_A"
8087   operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
8088   MEM_VOLATILE_P (operands[0]) = 1;
8091 (define_insn "*sse_sfence"
8092   [(set (match_operand:BLK 0 "" "")
8093         (unspec:BLK [(match_dup 0)] UNSPEC_SFENCE))]
8094   "TARGET_SSE || TARGET_3DNOW_A"
8095   "sfence"
8096   [(set_attr "type" "sse")
8097    (set_attr "length_address" "0")
8098    (set_attr "atom_sse_attr" "fence")
8099    (set_attr "memory" "unknown")])
8101 (define_insn "sse2_clflush"
8102   [(unspec_volatile [(match_operand 0 "address_operand" "p")]
8103                     UNSPECV_CLFLUSH)]
8104   "TARGET_SSE2"
8105   "clflush\t%a0"
8106   [(set_attr "type" "sse")
8107    (set_attr "atom_sse_attr" "fence")
8108    (set_attr "memory" "unknown")])
8110 (define_expand "sse2_mfence"
8111   [(set (match_dup 0)
8112         (unspec:BLK [(match_dup 0)] UNSPEC_MFENCE))]
8113   "TARGET_SSE2"
8115   operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
8116   MEM_VOLATILE_P (operands[0]) = 1;
8119 (define_insn "*sse2_mfence"
8120   [(set (match_operand:BLK 0 "" "")
8121         (unspec:BLK [(match_dup 0)] UNSPEC_MFENCE))]
8122   "TARGET_64BIT || TARGET_SSE2"
8123   "mfence"
8124   [(set_attr "type" "sse")
8125    (set_attr "length_address" "0")
8126    (set_attr "atom_sse_attr" "fence")
8127    (set_attr "memory" "unknown")])
8129 (define_expand "sse2_lfence"
8130   [(set (match_dup 0)
8131         (unspec:BLK [(match_dup 0)] UNSPEC_LFENCE))]
8132   "TARGET_SSE2"
8134   operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
8135   MEM_VOLATILE_P (operands[0]) = 1;
8138 (define_insn "*sse2_lfence"
8139   [(set (match_operand:BLK 0 "" "")
8140         (unspec:BLK [(match_dup 0)] UNSPEC_LFENCE))]
8141   "TARGET_SSE2"
8142   "lfence"
8143   [(set_attr "type" "sse")
8144    (set_attr "length_address" "0")
8145    (set_attr "atom_sse_attr" "lfence")
8146    (set_attr "memory" "unknown")])
8148 (define_insn "sse3_mwait"
8149   [(unspec_volatile [(match_operand:SI 0 "register_operand" "a")
8150                      (match_operand:SI 1 "register_operand" "c")]
8151                     UNSPECV_MWAIT)]
8152   "TARGET_SSE3"
8153 ;; 64bit version is "mwait %rax,%rcx". But only lower 32bits are used.
8154 ;; Since 32bit register operands are implicitly zero extended to 64bit,
8155 ;; we only need to set up 32bit registers.
8156   "mwait"
8157   [(set_attr "length" "3")])
8159 (define_insn "sse3_monitor"
8160   [(unspec_volatile [(match_operand:SI 0 "register_operand" "a")
8161                      (match_operand:SI 1 "register_operand" "c")
8162                      (match_operand:SI 2 "register_operand" "d")]
8163                     UNSPECV_MONITOR)]
8164   "TARGET_SSE3 && !TARGET_64BIT"
8165   "monitor\t%0, %1, %2"
8166   [(set_attr "length" "3")])
8168 (define_insn "sse3_monitor64"
8169   [(unspec_volatile [(match_operand:DI 0 "register_operand" "a")
8170                      (match_operand:SI 1 "register_operand" "c")
8171                      (match_operand:SI 2 "register_operand" "d")]
8172                     UNSPECV_MONITOR)]
8173   "TARGET_SSE3 && TARGET_64BIT"
8174 ;; 64bit version is "monitor %rax,%rcx,%rdx". But only lower 32bits in
8175 ;; RCX and RDX are used.  Since 32bit register operands are implicitly
8176 ;; zero extended to 64bit, we only need to set up 32bit registers.
8177   "monitor"
8178   [(set_attr "length" "3")])
8180 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8182 ;; SSSE3 instructions
8184 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8186 (define_insn "*avx_phaddwv8hi3"
8187   [(set (match_operand:V8HI 0 "register_operand" "=x")
8188         (vec_concat:V8HI
8189           (vec_concat:V4HI
8190             (vec_concat:V2HI
8191               (plus:HI
8192                 (vec_select:HI
8193                   (match_operand:V8HI 1 "register_operand" "x")
8194                   (parallel [(const_int 0)]))
8195                 (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8196               (plus:HI
8197                 (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8198                 (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8199             (vec_concat:V2HI
8200               (plus:HI
8201                 (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
8202                 (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
8203               (plus:HI
8204                 (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
8205                 (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
8206           (vec_concat:V4HI
8207             (vec_concat:V2HI
8208               (plus:HI
8209                 (vec_select:HI
8210                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")
8211                   (parallel [(const_int 0)]))
8212                 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8213               (plus:HI
8214                 (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8215                 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
8216             (vec_concat:V2HI
8217               (plus:HI
8218                 (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
8219                 (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
8220               (plus:HI
8221                 (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
8222                 (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))))]
8223   "TARGET_AVX"
8224   "vphaddw\t{%2, %1, %0|%0, %1, %2}"
8225   [(set_attr "type" "sseiadd")
8226    (set_attr "prefix_extra" "1")
8227    (set_attr "prefix" "vex")
8228    (set_attr "mode" "TI")])
8230 (define_insn "ssse3_phaddwv8hi3"
8231   [(set (match_operand:V8HI 0 "register_operand" "=x")
8232         (vec_concat:V8HI
8233           (vec_concat:V4HI
8234             (vec_concat:V2HI
8235               (plus:HI
8236                 (vec_select:HI
8237                   (match_operand:V8HI 1 "register_operand" "0")
8238                   (parallel [(const_int 0)]))
8239                 (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8240               (plus:HI
8241                 (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8242                 (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8243             (vec_concat:V2HI
8244               (plus:HI
8245                 (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
8246                 (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
8247               (plus:HI
8248                 (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
8249                 (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
8250           (vec_concat:V4HI
8251             (vec_concat:V2HI
8252               (plus:HI
8253                 (vec_select:HI
8254                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")
8255                   (parallel [(const_int 0)]))
8256                 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8257               (plus:HI
8258                 (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8259                 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
8260             (vec_concat:V2HI
8261               (plus:HI
8262                 (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
8263                 (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
8264               (plus:HI
8265                 (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
8266                 (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))))]
8267   "TARGET_SSSE3"
8268   "phaddw\t{%2, %0|%0, %2}"
8269   [(set_attr "type" "sseiadd")
8270    (set_attr "atom_unit" "complex")
8271    (set_attr "prefix_data16" "1")
8272    (set_attr "prefix_extra" "1")
8273    (set_attr "mode" "TI")])
8275 (define_insn "ssse3_phaddwv4hi3"
8276   [(set (match_operand:V4HI 0 "register_operand" "=y")
8277         (vec_concat:V4HI
8278           (vec_concat:V2HI
8279             (plus:HI
8280               (vec_select:HI
8281                 (match_operand:V4HI 1 "register_operand" "0")
8282                 (parallel [(const_int 0)]))
8283               (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8284             (plus:HI
8285               (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8286               (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8287           (vec_concat:V2HI
8288             (plus:HI
8289               (vec_select:HI
8290                 (match_operand:V4HI 2 "nonimmediate_operand" "ym")
8291                 (parallel [(const_int 0)]))
8292               (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8293             (plus:HI
8294               (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8295               (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))))]
8296   "TARGET_SSSE3"
8297   "phaddw\t{%2, %0|%0, %2}"
8298   [(set_attr "type" "sseiadd")
8299    (set_attr "atom_unit" "complex")
8300    (set_attr "prefix_extra" "1")
8301    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
8302    (set_attr "mode" "DI")])
8304 (define_insn "*avx_phadddv4si3"
8305   [(set (match_operand:V4SI 0 "register_operand" "=x")
8306         (vec_concat:V4SI
8307           (vec_concat:V2SI
8308             (plus:SI
8309               (vec_select:SI
8310                 (match_operand:V4SI 1 "register_operand" "x")
8311                 (parallel [(const_int 0)]))
8312               (vec_select:SI (match_dup 1) (parallel [(const_int 1)])))
8313             (plus:SI
8314               (vec_select:SI (match_dup 1) (parallel [(const_int 2)]))
8315               (vec_select:SI (match_dup 1) (parallel [(const_int 3)]))))
8316           (vec_concat:V2SI
8317             (plus:SI
8318               (vec_select:SI
8319                 (match_operand:V4SI 2 "nonimmediate_operand" "xm")
8320                 (parallel [(const_int 0)]))
8321               (vec_select:SI (match_dup 2) (parallel [(const_int 1)])))
8322             (plus:SI
8323               (vec_select:SI (match_dup 2) (parallel [(const_int 2)]))
8324               (vec_select:SI (match_dup 2) (parallel [(const_int 3)]))))))]
8325   "TARGET_AVX"
8326   "vphaddd\t{%2, %1, %0|%0, %1, %2}"
8327   [(set_attr "type" "sseiadd")
8328    (set_attr "prefix_extra" "1")
8329    (set_attr "prefix" "vex")
8330    (set_attr "mode" "TI")])
8332 (define_insn "ssse3_phadddv4si3"
8333   [(set (match_operand:V4SI 0 "register_operand" "=x")
8334         (vec_concat:V4SI
8335           (vec_concat:V2SI
8336             (plus:SI
8337               (vec_select:SI
8338                 (match_operand:V4SI 1 "register_operand" "0")
8339                 (parallel [(const_int 0)]))
8340               (vec_select:SI (match_dup 1) (parallel [(const_int 1)])))
8341             (plus:SI
8342               (vec_select:SI (match_dup 1) (parallel [(const_int 2)]))
8343               (vec_select:SI (match_dup 1) (parallel [(const_int 3)]))))
8344           (vec_concat:V2SI
8345             (plus:SI
8346               (vec_select:SI
8347                 (match_operand:V4SI 2 "nonimmediate_operand" "xm")
8348                 (parallel [(const_int 0)]))
8349               (vec_select:SI (match_dup 2) (parallel [(const_int 1)])))
8350             (plus:SI
8351               (vec_select:SI (match_dup 2) (parallel [(const_int 2)]))
8352               (vec_select:SI (match_dup 2) (parallel [(const_int 3)]))))))]
8353   "TARGET_SSSE3"
8354   "phaddd\t{%2, %0|%0, %2}"
8355   [(set_attr "type" "sseiadd")
8356    (set_attr "atom_unit" "complex")
8357    (set_attr "prefix_data16" "1")
8358    (set_attr "prefix_extra" "1")
8359    (set_attr "mode" "TI")])
8361 (define_insn "ssse3_phadddv2si3"
8362   [(set (match_operand:V2SI 0 "register_operand" "=y")
8363         (vec_concat:V2SI
8364           (plus:SI
8365             (vec_select:SI
8366               (match_operand:V2SI 1 "register_operand" "0")
8367               (parallel [(const_int 0)]))
8368             (vec_select:SI (match_dup 1) (parallel [(const_int 1)])))
8369           (plus:SI
8370             (vec_select:SI
8371               (match_operand:V2SI 2 "nonimmediate_operand" "ym")
8372               (parallel [(const_int 0)]))
8373             (vec_select:SI (match_dup 2) (parallel [(const_int 1)])))))]
8374   "TARGET_SSSE3"
8375   "phaddd\t{%2, %0|%0, %2}"
8376   [(set_attr "type" "sseiadd")
8377    (set_attr "atom_unit" "complex")
8378    (set_attr "prefix_extra" "1")
8379    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
8380    (set_attr "mode" "DI")])
8382 (define_insn "*avx_phaddswv8hi3"
8383   [(set (match_operand:V8HI 0 "register_operand" "=x")
8384         (vec_concat:V8HI
8385           (vec_concat:V4HI
8386             (vec_concat:V2HI
8387               (ss_plus:HI
8388                 (vec_select:HI
8389                   (match_operand:V8HI 1 "register_operand" "x")
8390                   (parallel [(const_int 0)]))
8391                 (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8392               (ss_plus:HI
8393                 (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8394                 (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8395             (vec_concat:V2HI
8396               (ss_plus:HI
8397                 (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
8398                 (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
8399               (ss_plus:HI
8400                 (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
8401                 (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
8402           (vec_concat:V4HI
8403             (vec_concat:V2HI
8404               (ss_plus:HI
8405                 (vec_select:HI
8406                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")
8407                   (parallel [(const_int 0)]))
8408                 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8409               (ss_plus:HI
8410                 (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8411                 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
8412             (vec_concat:V2HI
8413               (ss_plus:HI
8414                 (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
8415                 (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
8416               (ss_plus:HI
8417                 (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
8418                 (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))))]
8419   "TARGET_AVX"
8420   "vphaddsw\t{%2, %1, %0|%0, %1, %2}"
8421   [(set_attr "type" "sseiadd")
8422    (set_attr "prefix_extra" "1")
8423    (set_attr "prefix" "vex")
8424    (set_attr "mode" "TI")])
8426 (define_insn "ssse3_phaddswv8hi3"
8427   [(set (match_operand:V8HI 0 "register_operand" "=x")
8428         (vec_concat:V8HI
8429           (vec_concat:V4HI
8430             (vec_concat:V2HI
8431               (ss_plus:HI
8432                 (vec_select:HI
8433                   (match_operand:V8HI 1 "register_operand" "0")
8434                   (parallel [(const_int 0)]))
8435                 (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8436               (ss_plus:HI
8437                 (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8438                 (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8439             (vec_concat:V2HI
8440               (ss_plus:HI
8441                 (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
8442                 (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
8443               (ss_plus:HI
8444                 (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
8445                 (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
8446           (vec_concat:V4HI
8447             (vec_concat:V2HI
8448               (ss_plus:HI
8449                 (vec_select:HI
8450                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")
8451                   (parallel [(const_int 0)]))
8452                 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8453               (ss_plus:HI
8454                 (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8455                 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
8456             (vec_concat:V2HI
8457               (ss_plus:HI
8458                 (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
8459                 (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
8460               (ss_plus:HI
8461                 (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
8462                 (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))))]
8463   "TARGET_SSSE3"
8464   "phaddsw\t{%2, %0|%0, %2}"
8465   [(set_attr "type" "sseiadd")
8466    (set_attr "atom_unit" "complex")
8467    (set_attr "prefix_data16" "1")
8468    (set_attr "prefix_extra" "1")
8469    (set_attr "mode" "TI")])
8471 (define_insn "ssse3_phaddswv4hi3"
8472   [(set (match_operand:V4HI 0 "register_operand" "=y")
8473         (vec_concat:V4HI
8474           (vec_concat:V2HI
8475             (ss_plus:HI
8476               (vec_select:HI
8477                 (match_operand:V4HI 1 "register_operand" "0")
8478                 (parallel [(const_int 0)]))
8479               (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8480             (ss_plus:HI
8481               (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8482               (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8483           (vec_concat:V2HI
8484             (ss_plus:HI
8485               (vec_select:HI
8486                 (match_operand:V4HI 2 "nonimmediate_operand" "ym")
8487                 (parallel [(const_int 0)]))
8488               (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8489             (ss_plus:HI
8490               (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8491               (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))))]
8492   "TARGET_SSSE3"
8493   "phaddsw\t{%2, %0|%0, %2}"
8494   [(set_attr "type" "sseiadd")
8495    (set_attr "atom_unit" "complex")
8496    (set_attr "prefix_extra" "1")
8497    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
8498    (set_attr "mode" "DI")])
8500 (define_insn "*avx_phsubwv8hi3"
8501   [(set (match_operand:V8HI 0 "register_operand" "=x")
8502         (vec_concat:V8HI
8503           (vec_concat:V4HI
8504             (vec_concat:V2HI
8505               (minus:HI
8506                 (vec_select:HI
8507                   (match_operand:V8HI 1 "register_operand" "x")
8508                   (parallel [(const_int 0)]))
8509                 (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8510               (minus:HI
8511                 (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8512                 (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8513             (vec_concat:V2HI
8514               (minus:HI
8515                 (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
8516                 (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
8517               (minus:HI
8518                 (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
8519                 (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
8520           (vec_concat:V4HI
8521             (vec_concat:V2HI
8522               (minus:HI
8523                 (vec_select:HI
8524                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")
8525                   (parallel [(const_int 0)]))
8526                 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8527               (minus:HI
8528                 (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8529                 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
8530             (vec_concat:V2HI
8531               (minus:HI
8532                 (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
8533                 (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
8534               (minus:HI
8535                 (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
8536                 (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))))]
8537   "TARGET_AVX"
8538   "vphsubw\t{%2, %1, %0|%0, %1, %2}"
8539   [(set_attr "type" "sseiadd")
8540    (set_attr "prefix_extra" "1")
8541    (set_attr "prefix" "vex")
8542    (set_attr "mode" "TI")])
8544 (define_insn "ssse3_phsubwv8hi3"
8545   [(set (match_operand:V8HI 0 "register_operand" "=x")
8546         (vec_concat:V8HI
8547           (vec_concat:V4HI
8548             (vec_concat:V2HI
8549               (minus:HI
8550                 (vec_select:HI
8551                   (match_operand:V8HI 1 "register_operand" "0")
8552                   (parallel [(const_int 0)]))
8553                 (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8554               (minus:HI
8555                 (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8556                 (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8557             (vec_concat:V2HI
8558               (minus:HI
8559                 (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
8560                 (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
8561               (minus:HI
8562                 (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
8563                 (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
8564           (vec_concat:V4HI
8565             (vec_concat:V2HI
8566               (minus:HI
8567                 (vec_select:HI
8568                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")
8569                   (parallel [(const_int 0)]))
8570                 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8571               (minus:HI
8572                 (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8573                 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
8574             (vec_concat:V2HI
8575               (minus:HI
8576                 (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
8577                 (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
8578               (minus:HI
8579                 (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
8580                 (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))))]
8581   "TARGET_SSSE3"
8582   "phsubw\t{%2, %0|%0, %2}"
8583   [(set_attr "type" "sseiadd")
8584    (set_attr "atom_unit" "complex")
8585    (set_attr "prefix_data16" "1")
8586    (set_attr "prefix_extra" "1")
8587    (set_attr "mode" "TI")])
8589 (define_insn "ssse3_phsubwv4hi3"
8590   [(set (match_operand:V4HI 0 "register_operand" "=y")
8591         (vec_concat:V4HI
8592           (vec_concat:V2HI
8593             (minus:HI
8594               (vec_select:HI
8595                 (match_operand:V4HI 1 "register_operand" "0")
8596                 (parallel [(const_int 0)]))
8597               (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8598             (minus:HI
8599               (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8600               (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8601           (vec_concat:V2HI
8602             (minus:HI
8603               (vec_select:HI
8604                 (match_operand:V4HI 2 "nonimmediate_operand" "ym")
8605                 (parallel [(const_int 0)]))
8606               (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8607             (minus:HI
8608               (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8609               (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))))]
8610   "TARGET_SSSE3"
8611   "phsubw\t{%2, %0|%0, %2}"
8612   [(set_attr "type" "sseiadd")
8613    (set_attr "atom_unit" "complex")
8614    (set_attr "prefix_extra" "1")
8615    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
8616    (set_attr "mode" "DI")])
8618 (define_insn "*avx_phsubdv4si3"
8619   [(set (match_operand:V4SI 0 "register_operand" "=x")
8620         (vec_concat:V4SI
8621           (vec_concat:V2SI
8622             (minus:SI
8623               (vec_select:SI
8624                 (match_operand:V4SI 1 "register_operand" "x")
8625                 (parallel [(const_int 0)]))
8626               (vec_select:SI (match_dup 1) (parallel [(const_int 1)])))
8627             (minus:SI
8628               (vec_select:SI (match_dup 1) (parallel [(const_int 2)]))
8629               (vec_select:SI (match_dup 1) (parallel [(const_int 3)]))))
8630           (vec_concat:V2SI
8631             (minus:SI
8632               (vec_select:SI
8633                 (match_operand:V4SI 2 "nonimmediate_operand" "xm")
8634                 (parallel [(const_int 0)]))
8635               (vec_select:SI (match_dup 2) (parallel [(const_int 1)])))
8636             (minus:SI
8637               (vec_select:SI (match_dup 2) (parallel [(const_int 2)]))
8638               (vec_select:SI (match_dup 2) (parallel [(const_int 3)]))))))]
8639   "TARGET_AVX"
8640   "vphsubd\t{%2, %1, %0|%0, %1, %2}"
8641   [(set_attr "type" "sseiadd")
8642    (set_attr "prefix_extra" "1")
8643    (set_attr "prefix" "vex")
8644    (set_attr "mode" "TI")])
8646 (define_insn "ssse3_phsubdv4si3"
8647   [(set (match_operand:V4SI 0 "register_operand" "=x")
8648         (vec_concat:V4SI
8649           (vec_concat:V2SI
8650             (minus:SI
8651               (vec_select:SI
8652                 (match_operand:V4SI 1 "register_operand" "0")
8653                 (parallel [(const_int 0)]))
8654               (vec_select:SI (match_dup 1) (parallel [(const_int 1)])))
8655             (minus:SI
8656               (vec_select:SI (match_dup 1) (parallel [(const_int 2)]))
8657               (vec_select:SI (match_dup 1) (parallel [(const_int 3)]))))
8658           (vec_concat:V2SI
8659             (minus:SI
8660               (vec_select:SI
8661                 (match_operand:V4SI 2 "nonimmediate_operand" "xm")
8662                 (parallel [(const_int 0)]))
8663               (vec_select:SI (match_dup 2) (parallel [(const_int 1)])))
8664             (minus:SI
8665               (vec_select:SI (match_dup 2) (parallel [(const_int 2)]))
8666               (vec_select:SI (match_dup 2) (parallel [(const_int 3)]))))))]
8667   "TARGET_SSSE3"
8668   "phsubd\t{%2, %0|%0, %2}"
8669   [(set_attr "type" "sseiadd")
8670    (set_attr "atom_unit" "complex")
8671    (set_attr "prefix_data16" "1")
8672    (set_attr "prefix_extra" "1")
8673    (set_attr "mode" "TI")])
8675 (define_insn "ssse3_phsubdv2si3"
8676   [(set (match_operand:V2SI 0 "register_operand" "=y")
8677         (vec_concat:V2SI
8678           (minus:SI
8679             (vec_select:SI
8680               (match_operand:V2SI 1 "register_operand" "0")
8681               (parallel [(const_int 0)]))
8682             (vec_select:SI (match_dup 1) (parallel [(const_int 1)])))
8683           (minus:SI
8684             (vec_select:SI
8685               (match_operand:V2SI 2 "nonimmediate_operand" "ym")
8686               (parallel [(const_int 0)]))
8687             (vec_select:SI (match_dup 2) (parallel [(const_int 1)])))))]
8688   "TARGET_SSSE3"
8689   "phsubd\t{%2, %0|%0, %2}"
8690   [(set_attr "type" "sseiadd")
8691    (set_attr "atom_unit" "complex")
8692    (set_attr "prefix_extra" "1")
8693    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
8694    (set_attr "mode" "DI")])
8696 (define_insn "*avx_phsubswv8hi3"
8697   [(set (match_operand:V8HI 0 "register_operand" "=x")
8698         (vec_concat:V8HI
8699           (vec_concat:V4HI
8700             (vec_concat:V2HI
8701               (ss_minus:HI
8702                 (vec_select:HI
8703                   (match_operand:V8HI 1 "register_operand" "x")
8704                   (parallel [(const_int 0)]))
8705                 (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8706               (ss_minus:HI
8707                 (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8708                 (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8709             (vec_concat:V2HI
8710               (ss_minus:HI
8711                 (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
8712                 (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
8713               (ss_minus:HI
8714                 (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
8715                 (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
8716           (vec_concat:V4HI
8717             (vec_concat:V2HI
8718               (ss_minus:HI
8719                 (vec_select:HI
8720                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")
8721                   (parallel [(const_int 0)]))
8722                 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8723               (ss_minus:HI
8724                 (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8725                 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
8726             (vec_concat:V2HI
8727               (ss_minus:HI
8728                 (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
8729                 (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
8730               (ss_minus:HI
8731                 (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
8732                 (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))))]
8733   "TARGET_AVX"
8734   "vphsubsw\t{%2, %1, %0|%0, %1, %2}"
8735   [(set_attr "type" "sseiadd")
8736    (set_attr "prefix_extra" "1")
8737    (set_attr "prefix" "vex")
8738    (set_attr "mode" "TI")])
8740 (define_insn "ssse3_phsubswv8hi3"
8741   [(set (match_operand:V8HI 0 "register_operand" "=x")
8742         (vec_concat:V8HI
8743           (vec_concat:V4HI
8744             (vec_concat:V2HI
8745               (ss_minus:HI
8746                 (vec_select:HI
8747                   (match_operand:V8HI 1 "register_operand" "0")
8748                   (parallel [(const_int 0)]))
8749                 (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8750               (ss_minus:HI
8751                 (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8752                 (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8753             (vec_concat:V2HI
8754               (ss_minus:HI
8755                 (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
8756                 (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
8757               (ss_minus:HI
8758                 (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
8759                 (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
8760           (vec_concat:V4HI
8761             (vec_concat:V2HI
8762               (ss_minus:HI
8763                 (vec_select:HI
8764                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")
8765                   (parallel [(const_int 0)]))
8766                 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8767               (ss_minus:HI
8768                 (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8769                 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
8770             (vec_concat:V2HI
8771               (ss_minus:HI
8772                 (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
8773                 (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
8774               (ss_minus:HI
8775                 (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
8776                 (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))))]
8777   "TARGET_SSSE3"
8778   "phsubsw\t{%2, %0|%0, %2}"
8779   [(set_attr "type" "sseiadd")
8780    (set_attr "atom_unit" "complex")
8781    (set_attr "prefix_data16" "1")
8782    (set_attr "prefix_extra" "1")
8783    (set_attr "mode" "TI")])
8785 (define_insn "ssse3_phsubswv4hi3"
8786   [(set (match_operand:V4HI 0 "register_operand" "=y")
8787         (vec_concat:V4HI
8788           (vec_concat:V2HI
8789             (ss_minus:HI
8790               (vec_select:HI
8791                 (match_operand:V4HI 1 "register_operand" "0")
8792                 (parallel [(const_int 0)]))
8793               (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8794             (ss_minus:HI
8795               (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8796               (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8797           (vec_concat:V2HI
8798             (ss_minus:HI
8799               (vec_select:HI
8800                 (match_operand:V4HI 2 "nonimmediate_operand" "ym")
8801                 (parallel [(const_int 0)]))
8802               (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8803             (ss_minus:HI
8804               (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8805               (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))))]
8806   "TARGET_SSSE3"
8807   "phsubsw\t{%2, %0|%0, %2}"
8808   [(set_attr "type" "sseiadd")
8809    (set_attr "atom_unit" "complex")
8810    (set_attr "prefix_extra" "1")
8811    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
8812    (set_attr "mode" "DI")])
8814 (define_insn "*avx_pmaddubsw128"
8815   [(set (match_operand:V8HI 0 "register_operand" "=x")
8816         (ss_plus:V8HI
8817           (mult:V8HI
8818             (zero_extend:V8HI
8819               (vec_select:V4QI
8820                 (match_operand:V16QI 1 "register_operand" "x")
8821                 (parallel [(const_int 0)
8822                            (const_int 2)
8823                            (const_int 4)
8824                            (const_int 6)
8825                            (const_int 8)
8826                            (const_int 10)
8827                            (const_int 12)
8828                            (const_int 14)])))
8829             (sign_extend:V8HI
8830               (vec_select:V8QI
8831                 (match_operand:V16QI 2 "nonimmediate_operand" "xm")
8832                 (parallel [(const_int 0)
8833                            (const_int 2)
8834                            (const_int 4)
8835                            (const_int 6)
8836                            (const_int 8)
8837                            (const_int 10)
8838                            (const_int 12)
8839                            (const_int 14)]))))
8840           (mult:V8HI
8841             (zero_extend:V8HI
8842               (vec_select:V16QI (match_dup 1)
8843                 (parallel [(const_int 1)
8844                            (const_int 3)
8845                            (const_int 5)
8846                            (const_int 7)
8847                            (const_int 9)
8848                            (const_int 11)
8849                            (const_int 13)
8850                            (const_int 15)])))
8851             (sign_extend:V8HI
8852               (vec_select:V16QI (match_dup 2)
8853                 (parallel [(const_int 1)
8854                            (const_int 3)
8855                            (const_int 5)
8856                            (const_int 7)
8857                            (const_int 9)
8858                            (const_int 11)
8859                            (const_int 13)
8860                            (const_int 15)]))))))]
8861   "TARGET_AVX"
8862   "vpmaddubsw\t{%2, %1, %0|%0, %1, %2}"
8863   [(set_attr "type" "sseiadd")
8864    (set_attr "prefix_extra" "1")
8865    (set_attr "prefix" "vex")
8866    (set_attr "mode" "TI")])
8868 (define_insn "ssse3_pmaddubsw128"
8869   [(set (match_operand:V8HI 0 "register_operand" "=x")
8870         (ss_plus:V8HI
8871           (mult:V8HI
8872             (zero_extend:V8HI
8873               (vec_select:V4QI
8874                 (match_operand:V16QI 1 "register_operand" "0")
8875                 (parallel [(const_int 0)
8876                            (const_int 2)
8877                            (const_int 4)
8878                            (const_int 6)
8879                            (const_int 8)
8880                            (const_int 10)
8881                            (const_int 12)
8882                            (const_int 14)])))
8883             (sign_extend:V8HI
8884               (vec_select:V8QI
8885                 (match_operand:V16QI 2 "nonimmediate_operand" "xm")
8886                 (parallel [(const_int 0)
8887                            (const_int 2)
8888                            (const_int 4)
8889                            (const_int 6)
8890                            (const_int 8)
8891                            (const_int 10)
8892                            (const_int 12)
8893                            (const_int 14)]))))
8894           (mult:V8HI
8895             (zero_extend:V8HI
8896               (vec_select:V16QI (match_dup 1)
8897                 (parallel [(const_int 1)
8898                            (const_int 3)
8899                            (const_int 5)
8900                            (const_int 7)
8901                            (const_int 9)
8902                            (const_int 11)
8903                            (const_int 13)
8904                            (const_int 15)])))
8905             (sign_extend:V8HI
8906               (vec_select:V16QI (match_dup 2)
8907                 (parallel [(const_int 1)
8908                            (const_int 3)
8909                            (const_int 5)
8910                            (const_int 7)
8911                            (const_int 9)
8912                            (const_int 11)
8913                            (const_int 13)
8914                            (const_int 15)]))))))]
8915   "TARGET_SSSE3"
8916   "pmaddubsw\t{%2, %0|%0, %2}"
8917   [(set_attr "type" "sseiadd")
8918    (set_attr "atom_unit" "simul")
8919    (set_attr "prefix_data16" "1")
8920    (set_attr "prefix_extra" "1")
8921    (set_attr "mode" "TI")])
8923 (define_insn "ssse3_pmaddubsw"
8924   [(set (match_operand:V4HI 0 "register_operand" "=y")
8925         (ss_plus:V4HI
8926           (mult:V4HI
8927             (zero_extend:V4HI
8928               (vec_select:V4QI
8929                 (match_operand:V8QI 1 "register_operand" "0")
8930                 (parallel [(const_int 0)
8931                            (const_int 2)
8932                            (const_int 4)
8933                            (const_int 6)])))
8934             (sign_extend:V4HI
8935               (vec_select:V4QI
8936                 (match_operand:V8QI 2 "nonimmediate_operand" "ym")
8937                 (parallel [(const_int 0)
8938                            (const_int 2)
8939                            (const_int 4)
8940                            (const_int 6)]))))
8941           (mult:V4HI
8942             (zero_extend:V4HI
8943               (vec_select:V8QI (match_dup 1)
8944                 (parallel [(const_int 1)
8945                            (const_int 3)
8946                            (const_int 5)
8947                            (const_int 7)])))
8948             (sign_extend:V4HI
8949               (vec_select:V8QI (match_dup 2)
8950                 (parallel [(const_int 1)
8951                            (const_int 3)
8952                            (const_int 5)
8953                            (const_int 7)]))))))]
8954   "TARGET_SSSE3"
8955   "pmaddubsw\t{%2, %0|%0, %2}"
8956   [(set_attr "type" "sseiadd")
8957    (set_attr "atom_unit" "simul")
8958    (set_attr "prefix_extra" "1")
8959    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
8960    (set_attr "mode" "DI")])
8962 (define_expand "ssse3_pmulhrswv8hi3"
8963   [(set (match_operand:V8HI 0 "register_operand" "")
8964         (truncate:V8HI
8965           (lshiftrt:V8SI
8966             (plus:V8SI
8967               (lshiftrt:V8SI
8968                 (mult:V8SI
8969                   (sign_extend:V8SI
8970                     (match_operand:V8HI 1 "nonimmediate_operand" ""))
8971                   (sign_extend:V8SI
8972                     (match_operand:V8HI 2 "nonimmediate_operand" "")))
8973                 (const_int 14))
8974               (const_vector:V8HI [(const_int 1) (const_int 1)
8975                                   (const_int 1) (const_int 1)
8976                                   (const_int 1) (const_int 1)
8977                                   (const_int 1) (const_int 1)]))
8978             (const_int 1))))]
8979   "TARGET_SSSE3"
8980   "ix86_fixup_binary_operands_no_copy (MULT, V8HImode, operands);")
8982 (define_insn "*avx_pmulhrswv8hi3"
8983   [(set (match_operand:V8HI 0 "register_operand" "=x")
8984         (truncate:V8HI
8985           (lshiftrt:V8SI
8986             (plus:V8SI
8987               (lshiftrt:V8SI
8988                 (mult:V8SI
8989                   (sign_extend:V8SI
8990                     (match_operand:V8HI 1 "nonimmediate_operand" "%x"))
8991                   (sign_extend:V8SI
8992                     (match_operand:V8HI 2 "nonimmediate_operand" "xm")))
8993                 (const_int 14))
8994               (const_vector:V8HI [(const_int 1) (const_int 1)
8995                                   (const_int 1) (const_int 1)
8996                                   (const_int 1) (const_int 1)
8997                                   (const_int 1) (const_int 1)]))
8998             (const_int 1))))]
8999   "TARGET_AVX && ix86_binary_operator_ok (MULT, V8HImode, operands)"
9000   "vpmulhrsw\t{%2, %1, %0|%0, %1, %2}"
9001   [(set_attr "type" "sseimul")
9002    (set_attr "prefix_extra" "1")
9003    (set_attr "prefix" "vex")
9004    (set_attr "mode" "TI")])
9006 (define_insn "*ssse3_pmulhrswv8hi3"
9007   [(set (match_operand:V8HI 0 "register_operand" "=x")
9008         (truncate:V8HI
9009           (lshiftrt:V8SI
9010             (plus:V8SI
9011               (lshiftrt:V8SI
9012                 (mult:V8SI
9013                   (sign_extend:V8SI
9014                     (match_operand:V8HI 1 "nonimmediate_operand" "%0"))
9015                   (sign_extend:V8SI
9016                     (match_operand:V8HI 2 "nonimmediate_operand" "xm")))
9017                 (const_int 14))
9018               (const_vector:V8HI [(const_int 1) (const_int 1)
9019                                   (const_int 1) (const_int 1)
9020                                   (const_int 1) (const_int 1)
9021                                   (const_int 1) (const_int 1)]))
9022             (const_int 1))))]
9023   "TARGET_SSSE3 && ix86_binary_operator_ok (MULT, V8HImode, operands)"
9024   "pmulhrsw\t{%2, %0|%0, %2}"
9025   [(set_attr "type" "sseimul")
9026    (set_attr "prefix_data16" "1")
9027    (set_attr "prefix_extra" "1")
9028    (set_attr "mode" "TI")])
9030 (define_expand "ssse3_pmulhrswv4hi3"
9031   [(set (match_operand:V4HI 0 "register_operand" "")
9032         (truncate:V4HI
9033           (lshiftrt:V4SI
9034             (plus:V4SI
9035               (lshiftrt:V4SI
9036                 (mult:V4SI
9037                   (sign_extend:V4SI
9038                     (match_operand:V4HI 1 "nonimmediate_operand" ""))
9039                   (sign_extend:V4SI
9040                     (match_operand:V4HI 2 "nonimmediate_operand" "")))
9041                 (const_int 14))
9042               (const_vector:V4HI [(const_int 1) (const_int 1)
9043                                   (const_int 1) (const_int 1)]))
9044             (const_int 1))))]
9045   "TARGET_SSSE3"
9046   "ix86_fixup_binary_operands_no_copy (MULT, V4HImode, operands);")
9048 (define_insn "*ssse3_pmulhrswv4hi3"
9049   [(set (match_operand:V4HI 0 "register_operand" "=y")
9050         (truncate:V4HI
9051           (lshiftrt:V4SI
9052             (plus:V4SI
9053               (lshiftrt:V4SI
9054                 (mult:V4SI
9055                   (sign_extend:V4SI
9056                     (match_operand:V4HI 1 "nonimmediate_operand" "%0"))
9057                   (sign_extend:V4SI
9058                     (match_operand:V4HI 2 "nonimmediate_operand" "ym")))
9059                 (const_int 14))
9060               (const_vector:V4HI [(const_int 1) (const_int 1)
9061                                   (const_int 1) (const_int 1)]))
9062             (const_int 1))))]
9063   "TARGET_SSSE3 && ix86_binary_operator_ok (MULT, V4HImode, operands)"
9064   "pmulhrsw\t{%2, %0|%0, %2}"
9065   [(set_attr "type" "sseimul")
9066    (set_attr "prefix_extra" "1")
9067    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
9068    (set_attr "mode" "DI")])
9070 (define_insn "*avx_pshufbv16qi3"
9071   [(set (match_operand:V16QI 0 "register_operand" "=x")
9072         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "x")
9073                        (match_operand:V16QI 2 "nonimmediate_operand" "xm")]
9074                       UNSPEC_PSHUFB))]
9075   "TARGET_AVX"
9076   "vpshufb\t{%2, %1, %0|%0, %1, %2}";
9077   [(set_attr "type" "sselog1")
9078    (set_attr "prefix_extra" "1")
9079    (set_attr "prefix" "vex")
9080    (set_attr "mode" "TI")])
9082 (define_insn "ssse3_pshufbv16qi3"
9083   [(set (match_operand:V16QI 0 "register_operand" "=x")
9084         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "0")
9085                        (match_operand:V16QI 2 "nonimmediate_operand" "xm")]
9086                       UNSPEC_PSHUFB))]
9087   "TARGET_SSSE3"
9088   "pshufb\t{%2, %0|%0, %2}";
9089   [(set_attr "type" "sselog1")
9090    (set_attr "prefix_data16" "1")
9091    (set_attr "prefix_extra" "1")
9092    (set_attr "mode" "TI")])
9094 (define_insn "ssse3_pshufbv8qi3"
9095   [(set (match_operand:V8QI 0 "register_operand" "=y")
9096         (unspec:V8QI [(match_operand:V8QI 1 "register_operand" "0")
9097                       (match_operand:V8QI 2 "nonimmediate_operand" "ym")]
9098                      UNSPEC_PSHUFB))]
9099   "TARGET_SSSE3"
9100   "pshufb\t{%2, %0|%0, %2}";
9101   [(set_attr "type" "sselog1")
9102    (set_attr "prefix_extra" "1")
9103    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
9104    (set_attr "mode" "DI")])
9106 (define_insn "*avx_psign<mode>3"
9107   [(set (match_operand:SSEMODE124 0 "register_operand" "=x")
9108         (unspec:SSEMODE124
9109           [(match_operand:SSEMODE124 1 "register_operand" "x")
9110            (match_operand:SSEMODE124 2 "nonimmediate_operand" "xm")]
9111           UNSPEC_PSIGN))]
9112   "TARGET_AVX"
9113   "vpsign<ssevecsize>\t{%2, %1, %0|%0, %1, %2}";
9114   [(set_attr "type" "sselog1")
9115    (set_attr "prefix_extra" "1")
9116    (set_attr "prefix" "vex")
9117    (set_attr "mode" "TI")])
9119 (define_insn "ssse3_psign<mode>3"
9120   [(set (match_operand:SSEMODE124 0 "register_operand" "=x")
9121         (unspec:SSEMODE124
9122           [(match_operand:SSEMODE124 1 "register_operand" "0")
9123            (match_operand:SSEMODE124 2 "nonimmediate_operand" "xm")]
9124           UNSPEC_PSIGN))]
9125   "TARGET_SSSE3"
9126   "psign<ssevecsize>\t{%2, %0|%0, %2}";
9127   [(set_attr "type" "sselog1")
9128    (set_attr "prefix_data16" "1")
9129    (set_attr "prefix_extra" "1")
9130    (set_attr "mode" "TI")])
9132 (define_insn "ssse3_psign<mode>3"
9133   [(set (match_operand:MMXMODEI 0 "register_operand" "=y")
9134         (unspec:MMXMODEI
9135           [(match_operand:MMXMODEI 1 "register_operand" "0")
9136            (match_operand:MMXMODEI 2 "nonimmediate_operand" "ym")]
9137           UNSPEC_PSIGN))]
9138   "TARGET_SSSE3"
9139   "psign<mmxvecsize>\t{%2, %0|%0, %2}";
9140   [(set_attr "type" "sselog1")
9141    (set_attr "prefix_extra" "1")
9142    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
9143    (set_attr "mode" "DI")])
9145 (define_insn "*avx_palignrti"
9146   [(set (match_operand:TI 0 "register_operand" "=x")
9147         (unspec:TI [(match_operand:TI 1 "register_operand" "x")
9148                     (match_operand:TI 2 "nonimmediate_operand" "xm")
9149                     (match_operand:SI 3 "const_0_to_255_mul_8_operand" "n")]
9150                    UNSPEC_PALIGNR))]
9151   "TARGET_AVX"
9153   operands[3] = GEN_INT (INTVAL (operands[3]) / 8);
9154   return "vpalignr\t{%3, %2, %1, %0|%0, %1, %2, %3}";
9156   [(set_attr "type" "sseishft")
9157    (set_attr "prefix_extra" "1")
9158    (set_attr "length_immediate" "1")
9159    (set_attr "prefix" "vex")
9160    (set_attr "mode" "TI")])
9162 (define_insn "ssse3_palignrti"
9163   [(set (match_operand:TI 0 "register_operand" "=x")
9164         (unspec:TI [(match_operand:TI 1 "register_operand" "0")
9165                     (match_operand:TI 2 "nonimmediate_operand" "xm")
9166                     (match_operand:SI 3 "const_0_to_255_mul_8_operand" "n")]
9167                    UNSPEC_PALIGNR))]
9168   "TARGET_SSSE3"
9170   operands[3] = GEN_INT (INTVAL (operands[3]) / 8);
9171   return "palignr\t{%3, %2, %0|%0, %2, %3}";
9173   [(set_attr "type" "sseishft")
9174    (set_attr "atom_unit" "sishuf")
9175    (set_attr "prefix_data16" "1")
9176    (set_attr "prefix_extra" "1")
9177    (set_attr "length_immediate" "1")
9178    (set_attr "mode" "TI")])
9180 (define_insn "ssse3_palignrdi"
9181   [(set (match_operand:DI 0 "register_operand" "=y")
9182         (unspec:DI [(match_operand:DI 1 "register_operand" "0")
9183                     (match_operand:DI 2 "nonimmediate_operand" "ym")
9184                     (match_operand:SI 3 "const_0_to_255_mul_8_operand" "n")]
9185                    UNSPEC_PALIGNR))]
9186   "TARGET_SSSE3"
9188   operands[3] = GEN_INT (INTVAL (operands[3]) / 8);
9189   return "palignr\t{%3, %2, %0|%0, %2, %3}";
9191   [(set_attr "type" "sseishft")
9192    (set_attr "atom_unit" "sishuf")
9193    (set_attr "prefix_extra" "1")
9194    (set_attr "length_immediate" "1")
9195    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
9196    (set_attr "mode" "DI")])
9198 (define_insn "abs<mode>2"
9199   [(set (match_operand:SSEMODE124 0 "register_operand" "=x")
9200         (abs:SSEMODE124 (match_operand:SSEMODE124 1 "nonimmediate_operand" "xm")))]
9201   "TARGET_SSSE3"
9202   "%vpabs<ssevecsize>\t{%1, %0|%0, %1}"
9203   [(set_attr "type" "sselog1")
9204    (set_attr "prefix_data16" "1")
9205    (set_attr "prefix_extra" "1")
9206    (set_attr "prefix" "maybe_vex")
9207    (set_attr "mode" "TI")])
9209 (define_insn "abs<mode>2"
9210   [(set (match_operand:MMXMODEI 0 "register_operand" "=y")
9211         (abs:MMXMODEI (match_operand:MMXMODEI 1 "nonimmediate_operand" "ym")))]
9212   "TARGET_SSSE3"
9213   "pabs<mmxvecsize>\t{%1, %0|%0, %1}";
9214   [(set_attr "type" "sselog1")
9215    (set_attr "prefix_rep" "0")
9216    (set_attr "prefix_extra" "1")
9217    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
9218    (set_attr "mode" "DI")])
9220 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9222 ;; AMD SSE4A instructions
9224 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9226 (define_insn "sse4a_movnt<mode>"
9227   [(set (match_operand:MODEF 0 "memory_operand" "=m")
9228         (unspec:MODEF
9229           [(match_operand:MODEF 1 "register_operand" "x")]
9230           UNSPEC_MOVNT))]
9231   "TARGET_SSE4A"
9232   "movnts<ssemodefsuffix>\t{%1, %0|%0, %1}"
9233   [(set_attr "type" "ssemov")
9234    (set_attr "mode" "<MODE>")])
9236 (define_insn "sse4a_vmmovnt<mode>"
9237   [(set (match_operand:<ssescalarmode> 0 "memory_operand" "=m")
9238         (unspec:<ssescalarmode>
9239           [(vec_select:<ssescalarmode>
9240              (match_operand:SSEMODEF2P 1 "register_operand" "x")
9241              (parallel [(const_int 0)]))]
9242           UNSPEC_MOVNT))]
9243   "TARGET_SSE4A"
9244   "movnts<ssemodesuffixf2c>\t{%1, %0|%0, %1}"
9245   [(set_attr "type" "ssemov")
9246    (set_attr "mode" "<ssescalarmode>")])
9248 (define_insn "sse4a_extrqi"
9249   [(set (match_operand:V2DI 0 "register_operand" "=x")
9250         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
9251                       (match_operand 2 "const_int_operand" "")
9252                       (match_operand 3 "const_int_operand" "")]
9253                      UNSPEC_EXTRQI))]
9254   "TARGET_SSE4A"
9255   "extrq\t{%3, %2, %0|%0, %2, %3}"
9256   [(set_attr "type" "sse")
9257    (set_attr "prefix_data16" "1")
9258    (set_attr "length_immediate" "2")
9259    (set_attr "mode" "TI")])
9261 (define_insn "sse4a_extrq"
9262   [(set (match_operand:V2DI 0 "register_operand" "=x")
9263         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
9264                       (match_operand:V16QI 2 "register_operand" "x")]
9265                      UNSPEC_EXTRQ))]
9266   "TARGET_SSE4A"
9267   "extrq\t{%2, %0|%0, %2}"
9268   [(set_attr "type" "sse")
9269    (set_attr "prefix_data16" "1")
9270    (set_attr "mode" "TI")])
9272 (define_insn "sse4a_insertqi"
9273   [(set (match_operand:V2DI 0 "register_operand" "=x")
9274         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
9275                       (match_operand:V2DI 2 "register_operand" "x")
9276                       (match_operand 3 "const_int_operand" "")
9277                       (match_operand 4 "const_int_operand" "")]
9278                      UNSPEC_INSERTQI))]
9279   "TARGET_SSE4A"
9280   "insertq\t{%4, %3, %2, %0|%0, %2, %3, %4}"
9281   [(set_attr "type" "sseins")
9282    (set_attr "prefix_data16" "0")
9283    (set_attr "prefix_rep" "1")
9284    (set_attr "length_immediate" "2")
9285    (set_attr "mode" "TI")])
9287 (define_insn "sse4a_insertq"
9288   [(set (match_operand:V2DI 0 "register_operand" "=x")
9289         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
9290                       (match_operand:V2DI 2 "register_operand" "x")]
9291                      UNSPEC_INSERTQ))]
9292   "TARGET_SSE4A"
9293   "insertq\t{%2, %0|%0, %2}"
9294   [(set_attr "type" "sseins")
9295    (set_attr "prefix_data16" "0")
9296    (set_attr "prefix_rep" "1")
9297    (set_attr "mode" "TI")])
9299 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9301 ;; Intel SSE4.1 instructions
9303 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9305 (define_insn "avx_blendp<avxmodesuffixf2c><avxmodesuffix>"
9306   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
9307         (vec_merge:AVXMODEF2P
9308           (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")
9309           (match_operand:AVXMODEF2P 1 "register_operand" "x")
9310           (match_operand:SI 3 "const_0_to_<blendbits>_operand" "n")))]
9311   "TARGET_AVX"
9312   "vblendp<avxmodesuffixf2c>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
9313   [(set_attr "type" "ssemov")
9314    (set_attr "prefix_extra" "1")
9315    (set_attr "length_immediate" "1")
9316    (set_attr "prefix" "vex")
9317    (set_attr "mode" "<avxvecmode>")])
9319 (define_insn "avx_blendvp<avxmodesuffixf2c><avxmodesuffix>"
9320   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
9321         (unspec:AVXMODEF2P
9322           [(match_operand:AVXMODEF2P 1 "register_operand" "x")
9323            (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")
9324            (match_operand:AVXMODEF2P 3 "register_operand" "x")]
9325           UNSPEC_BLENDV))]
9326   "TARGET_AVX"
9327   "vblendvp<avxmodesuffixf2c>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
9328   [(set_attr "type" "ssemov")
9329    (set_attr "prefix_extra" "1")
9330    (set_attr "length_immediate" "1")
9331    (set_attr "prefix" "vex")
9332    (set_attr "mode" "<avxvecmode>")])
9334 (define_insn "sse4_1_blendp<ssemodesuffixf2c>"
9335   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
9336         (vec_merge:SSEMODEF2P
9337           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")
9338           (match_operand:SSEMODEF2P 1 "register_operand" "0")
9339           (match_operand:SI 3 "const_0_to_<blendbits>_operand" "n")))]
9340   "TARGET_SSE4_1"
9341   "blendp<ssemodesuffixf2c>\t{%3, %2, %0|%0, %2, %3}"
9342   [(set_attr "type" "ssemov")
9343    (set_attr "prefix_data16" "1")
9344    (set_attr "prefix_extra" "1")
9345    (set_attr "length_immediate" "1")
9346    (set_attr "mode" "<MODE>")])
9348 (define_insn "sse4_1_blendvp<ssemodesuffixf2c>"
9349   [(set (match_operand:SSEMODEF2P 0 "reg_not_xmm0_operand" "=x")
9350         (unspec:SSEMODEF2P
9351           [(match_operand:SSEMODEF2P 1 "reg_not_xmm0_operand" "0")
9352            (match_operand:SSEMODEF2P 2 "nonimm_not_xmm0_operand" "xm")
9353            (match_operand:SSEMODEF2P 3 "register_operand" "Yz")]
9354           UNSPEC_BLENDV))]
9355   "TARGET_SSE4_1"
9356   "blendvp<ssemodesuffixf2c>\t{%3, %2, %0|%0, %2, %3}"
9357   [(set_attr "type" "ssemov")
9358    (set_attr "prefix_data16" "1")
9359    (set_attr "prefix_extra" "1")
9360    (set_attr "mode" "<MODE>")])
9362 (define_insn "avx_dpp<avxmodesuffixf2c><avxmodesuffix>"
9363   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
9364         (unspec:AVXMODEF2P
9365           [(match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x")
9366            (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")
9367            (match_operand:SI 3 "const_0_to_255_operand" "n")]
9368           UNSPEC_DP))]
9369   "TARGET_AVX"
9370   "vdpp<avxmodesuffixf2c>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
9371   [(set_attr "type" "ssemul")
9372    (set_attr "prefix" "vex")
9373    (set_attr "prefix_extra" "1")
9374    (set_attr "length_immediate" "1")
9375    (set_attr "mode" "<avxvecmode>")])
9377 (define_insn "sse4_1_dpp<ssemodesuffixf2c>"
9378   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
9379         (unspec:SSEMODEF2P
9380           [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%0")
9381            (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")
9382            (match_operand:SI 3 "const_0_to_255_operand" "n")]
9383           UNSPEC_DP))]
9384   "TARGET_SSE4_1"
9385   "dpp<ssemodesuffixf2c>\t{%3, %2, %0|%0, %2, %3}"
9386   [(set_attr "type" "ssemul")
9387    (set_attr "prefix_data16" "1")
9388    (set_attr "prefix_extra" "1")
9389    (set_attr "length_immediate" "1")
9390    (set_attr "mode" "<MODE>")])
9392 (define_insn "sse4_1_movntdqa"
9393   [(set (match_operand:V2DI 0 "register_operand" "=x")
9394         (unspec:V2DI [(match_operand:V2DI 1 "memory_operand" "m")]
9395                      UNSPEC_MOVNTDQA))]
9396   "TARGET_SSE4_1"
9397   "%vmovntdqa\t{%1, %0|%0, %1}"
9398   [(set_attr "type" "ssemov")
9399    (set_attr "prefix_extra" "1")
9400    (set_attr "prefix" "maybe_vex")
9401    (set_attr "mode" "TI")])
9403 (define_insn "*avx_mpsadbw"
9404   [(set (match_operand:V16QI 0 "register_operand" "=x")
9405         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "x")
9406                        (match_operand:V16QI 2 "nonimmediate_operand" "xm")
9407                        (match_operand:SI 3 "const_0_to_255_operand" "n")]
9408                       UNSPEC_MPSADBW))]
9409   "TARGET_AVX"
9410   "vmpsadbw\t{%3, %2, %1, %0|%0, %1, %2, %3}"
9411   [(set_attr "type" "sselog1")
9412    (set_attr "prefix" "vex")
9413    (set_attr "prefix_extra" "1")
9414    (set_attr "length_immediate" "1")
9415    (set_attr "mode" "TI")])
9417 (define_insn "sse4_1_mpsadbw"
9418   [(set (match_operand:V16QI 0 "register_operand" "=x")
9419         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "0")
9420                        (match_operand:V16QI 2 "nonimmediate_operand" "xm")
9421                        (match_operand:SI 3 "const_0_to_255_operand" "n")]
9422                       UNSPEC_MPSADBW))]
9423   "TARGET_SSE4_1"
9424   "mpsadbw\t{%3, %2, %0|%0, %2, %3}"
9425   [(set_attr "type" "sselog1")
9426    (set_attr "prefix_extra" "1")
9427    (set_attr "length_immediate" "1")
9428    (set_attr "mode" "TI")])
9430 (define_insn "*avx_packusdw"
9431   [(set (match_operand:V8HI 0 "register_operand" "=x")
9432         (vec_concat:V8HI
9433           (us_truncate:V4HI
9434             (match_operand:V4SI 1 "register_operand" "x"))
9435           (us_truncate:V4HI
9436             (match_operand:V4SI 2 "nonimmediate_operand" "xm"))))]
9437   "TARGET_AVX"
9438   "vpackusdw\t{%2, %1, %0|%0, %1, %2}"
9439   [(set_attr "type" "sselog")
9440    (set_attr "prefix_extra" "1")
9441    (set_attr "prefix" "vex")
9442    (set_attr "mode" "TI")])
9444 (define_insn "sse4_1_packusdw"
9445   [(set (match_operand:V8HI 0 "register_operand" "=x")
9446         (vec_concat:V8HI
9447           (us_truncate:V4HI
9448             (match_operand:V4SI 1 "register_operand" "0"))
9449           (us_truncate:V4HI
9450             (match_operand:V4SI 2 "nonimmediate_operand" "xm"))))]
9451   "TARGET_SSE4_1"
9452   "packusdw\t{%2, %0|%0, %2}"
9453   [(set_attr "type" "sselog")
9454    (set_attr "prefix_extra" "1")
9455    (set_attr "mode" "TI")])
9457 (define_insn "*avx_pblendvb"
9458   [(set (match_operand:V16QI 0 "register_operand" "=x")
9459         (unspec:V16QI [(match_operand:V16QI 1 "register_operand"  "x")
9460                        (match_operand:V16QI 2 "nonimmediate_operand" "xm")
9461                        (match_operand:V16QI 3 "register_operand" "x")]
9462                       UNSPEC_BLENDV))]
9463   "TARGET_AVX"
9464   "vpblendvb\t{%3, %2, %1, %0|%0, %1, %2, %3}"
9465   [(set_attr "type" "ssemov")
9466    (set_attr "prefix_extra" "1")
9467    (set_attr "length_immediate" "1")
9468    (set_attr "prefix" "vex")
9469    (set_attr "mode" "TI")])
9471 (define_insn "sse4_1_pblendvb"
9472   [(set (match_operand:V16QI 0 "reg_not_xmm0_operand" "=x")
9473         (unspec:V16QI [(match_operand:V16QI 1 "reg_not_xmm0_operand"  "0")
9474                        (match_operand:V16QI 2 "nonimm_not_xmm0_operand" "xm")
9475                        (match_operand:V16QI 3 "register_operand" "Yz")]
9476                       UNSPEC_BLENDV))]
9477   "TARGET_SSE4_1"
9478   "pblendvb\t{%3, %2, %0|%0, %2, %3}"
9479   [(set_attr "type" "ssemov")
9480    (set_attr "prefix_extra" "1")
9481    (set_attr "mode" "TI")])
9483 (define_insn "*avx_pblendw"
9484   [(set (match_operand:V8HI 0 "register_operand" "=x")
9485         (vec_merge:V8HI
9486           (match_operand:V8HI 2 "nonimmediate_operand" "xm")
9487           (match_operand:V8HI 1 "register_operand" "x")
9488           (match_operand:SI 3 "const_0_to_255_operand" "n")))]
9489   "TARGET_AVX"
9490   "vpblendw\t{%3, %2, %1, %0|%0, %1, %2, %3}"
9491   [(set_attr "type" "ssemov")
9492    (set_attr "prefix" "vex")
9493    (set_attr "prefix_extra" "1")
9494    (set_attr "length_immediate" "1")
9495    (set_attr "mode" "TI")])
9497 (define_insn "sse4_1_pblendw"
9498   [(set (match_operand:V8HI 0 "register_operand" "=x")
9499         (vec_merge:V8HI
9500           (match_operand:V8HI 2 "nonimmediate_operand" "xm")
9501           (match_operand:V8HI 1 "register_operand" "0")
9502           (match_operand:SI 3 "const_0_to_255_operand" "n")))]
9503   "TARGET_SSE4_1"
9504   "pblendw\t{%3, %2, %0|%0, %2, %3}"
9505   [(set_attr "type" "ssemov")
9506    (set_attr "prefix_extra" "1")
9507    (set_attr "length_immediate" "1")
9508    (set_attr "mode" "TI")])
9510 (define_insn "sse4_1_phminposuw"
9511   [(set (match_operand:V8HI 0 "register_operand" "=x")
9512         (unspec:V8HI [(match_operand:V8HI 1 "nonimmediate_operand" "xm")]
9513                      UNSPEC_PHMINPOSUW))]
9514   "TARGET_SSE4_1"
9515   "%vphminposuw\t{%1, %0|%0, %1}"
9516   [(set_attr "type" "sselog1")
9517    (set_attr "prefix_extra" "1")
9518    (set_attr "prefix" "maybe_vex")
9519    (set_attr "mode" "TI")])
9521 (define_insn "sse4_1_extendv8qiv8hi2"
9522   [(set (match_operand:V8HI 0 "register_operand" "=x")
9523         (sign_extend:V8HI
9524           (vec_select:V8QI
9525             (match_operand:V16QI 1 "register_operand" "x")
9526             (parallel [(const_int 0)
9527                        (const_int 1)
9528                        (const_int 2)
9529                        (const_int 3)
9530                        (const_int 4)
9531                        (const_int 5)
9532                        (const_int 6)
9533                        (const_int 7)]))))]
9534   "TARGET_SSE4_1"
9535   "%vpmovsxbw\t{%1, %0|%0, %1}"
9536   [(set_attr "type" "ssemov")
9537    (set_attr "prefix_extra" "1")
9538    (set_attr "prefix" "maybe_vex")
9539    (set_attr "mode" "TI")])
9541 (define_insn "*sse4_1_extendv8qiv8hi2"
9542   [(set (match_operand:V8HI 0 "register_operand" "=x")
9543         (sign_extend:V8HI
9544           (vec_select:V8QI
9545             (vec_duplicate:V16QI
9546               (match_operand:V8QI 1 "nonimmediate_operand" "xm"))
9547             (parallel [(const_int 0)
9548                        (const_int 1)
9549                        (const_int 2)
9550                        (const_int 3)
9551                        (const_int 4)
9552                        (const_int 5)
9553                        (const_int 6)
9554                        (const_int 7)]))))]
9555   "TARGET_SSE4_1"
9556   "%vpmovsxbw\t{%1, %0|%0, %1}"
9557   [(set_attr "type" "ssemov")
9558    (set_attr "prefix_extra" "1")
9559    (set_attr "prefix" "maybe_vex")
9560    (set_attr "mode" "TI")])
9562 (define_insn "sse4_1_extendv4qiv4si2"
9563   [(set (match_operand:V4SI 0 "register_operand" "=x")
9564         (sign_extend:V4SI
9565           (vec_select:V4QI
9566             (match_operand:V16QI 1 "register_operand" "x")
9567             (parallel [(const_int 0)
9568                        (const_int 1)
9569                        (const_int 2)
9570                        (const_int 3)]))))]
9571   "TARGET_SSE4_1"
9572   "%vpmovsxbd\t{%1, %0|%0, %1}"
9573   [(set_attr "type" "ssemov")
9574    (set_attr "prefix_extra" "1")
9575    (set_attr "prefix" "maybe_vex")
9576    (set_attr "mode" "TI")])
9578 (define_insn "*sse4_1_extendv4qiv4si2"
9579   [(set (match_operand:V4SI 0 "register_operand" "=x")
9580         (sign_extend:V4SI
9581           (vec_select:V4QI
9582             (vec_duplicate:V16QI
9583               (match_operand:V4QI 1 "nonimmediate_operand" "xm"))
9584             (parallel [(const_int 0)
9585                        (const_int 1)
9586                        (const_int 2)
9587                        (const_int 3)]))))]
9588   "TARGET_SSE4_1"
9589   "%vpmovsxbd\t{%1, %0|%0, %1}"
9590   [(set_attr "type" "ssemov")
9591    (set_attr "prefix_extra" "1")
9592    (set_attr "prefix" "maybe_vex")
9593    (set_attr "mode" "TI")])
9595 (define_insn "sse4_1_extendv2qiv2di2"
9596   [(set (match_operand:V2DI 0 "register_operand" "=x")
9597         (sign_extend:V2DI
9598           (vec_select:V2QI
9599             (match_operand:V16QI 1 "register_operand" "x")
9600             (parallel [(const_int 0)
9601                        (const_int 1)]))))]
9602   "TARGET_SSE4_1"
9603   "%vpmovsxbq\t{%1, %0|%0, %1}"
9604   [(set_attr "type" "ssemov")
9605    (set_attr "prefix_extra" "1")
9606    (set_attr "prefix" "maybe_vex")
9607    (set_attr "mode" "TI")])
9609 (define_insn "*sse4_1_extendv2qiv2di2"
9610   [(set (match_operand:V2DI 0 "register_operand" "=x")
9611         (sign_extend:V2DI
9612           (vec_select:V2QI
9613             (vec_duplicate:V16QI
9614               (match_operand:V2QI 1 "nonimmediate_operand" "xm"))
9615             (parallel [(const_int 0)
9616                        (const_int 1)]))))]
9617   "TARGET_SSE4_1"
9618   "%vpmovsxbq\t{%1, %0|%0, %1}"
9619   [(set_attr "type" "ssemov")
9620    (set_attr "prefix_extra" "1")
9621    (set_attr "prefix" "maybe_vex")
9622    (set_attr "mode" "TI")])
9624 (define_insn "sse4_1_extendv4hiv4si2"
9625   [(set (match_operand:V4SI 0 "register_operand" "=x")
9626         (sign_extend:V4SI
9627           (vec_select:V4HI
9628             (match_operand:V8HI 1 "register_operand" "x")
9629             (parallel [(const_int 0)
9630                        (const_int 1)
9631                        (const_int 2)
9632                        (const_int 3)]))))]
9633   "TARGET_SSE4_1"
9634   "%vpmovsxwd\t{%1, %0|%0, %1}"
9635   [(set_attr "type" "ssemov")
9636    (set_attr "prefix_extra" "1")
9637    (set_attr "prefix" "maybe_vex")
9638    (set_attr "mode" "TI")])
9640 (define_insn "*sse4_1_extendv4hiv4si2"
9641   [(set (match_operand:V4SI 0 "register_operand" "=x")
9642         (sign_extend:V4SI
9643           (vec_select:V4HI
9644             (vec_duplicate:V8HI
9645               (match_operand:V2HI 1 "nonimmediate_operand" "xm"))
9646             (parallel [(const_int 0)
9647                        (const_int 1)
9648                        (const_int 2)
9649                        (const_int 3)]))))]
9650   "TARGET_SSE4_1"
9651   "%vpmovsxwd\t{%1, %0|%0, %1}"
9652   [(set_attr "type" "ssemov")
9653    (set_attr "prefix_extra" "1")
9654    (set_attr "prefix" "maybe_vex")
9655    (set_attr "mode" "TI")])
9657 (define_insn "sse4_1_extendv2hiv2di2"
9658   [(set (match_operand:V2DI 0 "register_operand" "=x")
9659         (sign_extend:V2DI
9660           (vec_select:V2HI
9661             (match_operand:V8HI 1 "register_operand" "x")
9662             (parallel [(const_int 0)
9663                        (const_int 1)]))))]
9664   "TARGET_SSE4_1"
9665   "%vpmovsxwq\t{%1, %0|%0, %1}"
9666   [(set_attr "type" "ssemov")
9667    (set_attr "prefix_extra" "1")
9668    (set_attr "prefix" "maybe_vex")
9669    (set_attr "mode" "TI")])
9671 (define_insn "*sse4_1_extendv2hiv2di2"
9672   [(set (match_operand:V2DI 0 "register_operand" "=x")
9673         (sign_extend:V2DI
9674           (vec_select:V2HI
9675             (vec_duplicate:V8HI
9676               (match_operand:V8HI 1 "nonimmediate_operand" "xm"))
9677             (parallel [(const_int 0)
9678                        (const_int 1)]))))]
9679   "TARGET_SSE4_1"
9680   "%vpmovsxwq\t{%1, %0|%0, %1}"
9681   [(set_attr "type" "ssemov")
9682    (set_attr "prefix_extra" "1")
9683    (set_attr "prefix" "maybe_vex")
9684    (set_attr "mode" "TI")])
9686 (define_insn "sse4_1_extendv2siv2di2"
9687   [(set (match_operand:V2DI 0 "register_operand" "=x")
9688         (sign_extend:V2DI
9689           (vec_select:V2SI
9690             (match_operand:V4SI 1 "register_operand" "x")
9691             (parallel [(const_int 0)
9692                        (const_int 1)]))))]
9693   "TARGET_SSE4_1"
9694   "%vpmovsxdq\t{%1, %0|%0, %1}"
9695   [(set_attr "type" "ssemov")
9696    (set_attr "prefix_extra" "1")
9697    (set_attr "prefix" "maybe_vex")
9698    (set_attr "mode" "TI")])
9700 (define_insn "*sse4_1_extendv2siv2di2"
9701   [(set (match_operand:V2DI 0 "register_operand" "=x")
9702         (sign_extend:V2DI
9703           (vec_select:V2SI
9704             (vec_duplicate:V4SI
9705               (match_operand:V2SI 1 "nonimmediate_operand" "xm"))
9706             (parallel [(const_int 0)
9707                        (const_int 1)]))))]
9708   "TARGET_SSE4_1"
9709   "%vpmovsxdq\t{%1, %0|%0, %1}"
9710   [(set_attr "type" "ssemov")
9711    (set_attr "prefix_extra" "1")
9712    (set_attr "prefix" "maybe_vex")
9713    (set_attr "mode" "TI")])
9715 (define_insn "sse4_1_zero_extendv8qiv8hi2"
9716   [(set (match_operand:V8HI 0 "register_operand" "=x")
9717         (zero_extend:V8HI
9718           (vec_select:V8QI
9719             (match_operand:V16QI 1 "register_operand" "x")
9720             (parallel [(const_int 0)
9721                        (const_int 1)
9722                        (const_int 2)
9723                        (const_int 3)
9724                        (const_int 4)
9725                        (const_int 5)
9726                        (const_int 6)
9727                        (const_int 7)]))))]
9728   "TARGET_SSE4_1"
9729   "%vpmovzxbw\t{%1, %0|%0, %1}"
9730   [(set_attr "type" "ssemov")
9731    (set_attr "prefix_extra" "1")
9732    (set_attr "prefix" "maybe_vex")
9733    (set_attr "mode" "TI")])
9735 (define_insn "*sse4_1_zero_extendv8qiv8hi2"
9736   [(set (match_operand:V8HI 0 "register_operand" "=x")
9737         (zero_extend:V8HI
9738           (vec_select:V8QI
9739             (vec_duplicate:V16QI
9740               (match_operand:V8QI 1 "nonimmediate_operand" "xm"))
9741             (parallel [(const_int 0)
9742                        (const_int 1)
9743                        (const_int 2)
9744                        (const_int 3)
9745                        (const_int 4)
9746                        (const_int 5)
9747                        (const_int 6)
9748                        (const_int 7)]))))]
9749   "TARGET_SSE4_1"
9750   "%vpmovzxbw\t{%1, %0|%0, %1}"
9751   [(set_attr "type" "ssemov")
9752    (set_attr "prefix_extra" "1")
9753    (set_attr "prefix" "maybe_vex")
9754    (set_attr "mode" "TI")])
9756 (define_insn "sse4_1_zero_extendv4qiv4si2"
9757   [(set (match_operand:V4SI 0 "register_operand" "=x")
9758         (zero_extend:V4SI
9759           (vec_select:V4QI
9760             (match_operand:V16QI 1 "register_operand" "x")
9761             (parallel [(const_int 0)
9762                        (const_int 1)
9763                        (const_int 2)
9764                        (const_int 3)]))))]
9765   "TARGET_SSE4_1"
9766   "%vpmovzxbd\t{%1, %0|%0, %1}"
9767   [(set_attr "type" "ssemov")
9768    (set_attr "prefix_extra" "1")
9769    (set_attr "prefix" "maybe_vex")
9770    (set_attr "mode" "TI")])
9772 (define_insn "*sse4_1_zero_extendv4qiv4si2"
9773   [(set (match_operand:V4SI 0 "register_operand" "=x")
9774         (zero_extend:V4SI
9775           (vec_select:V4QI
9776             (vec_duplicate:V16QI
9777               (match_operand:V4QI 1 "nonimmediate_operand" "xm"))
9778             (parallel [(const_int 0)
9779                        (const_int 1)
9780                        (const_int 2)
9781                        (const_int 3)]))))]
9782   "TARGET_SSE4_1"
9783   "%vpmovzxbd\t{%1, %0|%0, %1}"
9784   [(set_attr "type" "ssemov")
9785    (set_attr "prefix_extra" "1")
9786    (set_attr "prefix" "maybe_vex")
9787    (set_attr "mode" "TI")])
9789 (define_insn "sse4_1_zero_extendv2qiv2di2"
9790   [(set (match_operand:V2DI 0 "register_operand" "=x")
9791         (zero_extend:V2DI
9792           (vec_select:V2QI
9793             (match_operand:V16QI 1 "register_operand" "x")
9794             (parallel [(const_int 0)
9795                        (const_int 1)]))))]
9796   "TARGET_SSE4_1"
9797   "%vpmovzxbq\t{%1, %0|%0, %1}"
9798   [(set_attr "type" "ssemov")
9799    (set_attr "prefix_extra" "1")
9800    (set_attr "prefix" "maybe_vex")
9801    (set_attr "mode" "TI")])
9803 (define_insn "*sse4_1_zero_extendv2qiv2di2"
9804   [(set (match_operand:V2DI 0 "register_operand" "=x")
9805         (zero_extend:V2DI
9806           (vec_select:V2QI
9807             (vec_duplicate:V16QI
9808               (match_operand:V2QI 1 "nonimmediate_operand" "xm"))
9809             (parallel [(const_int 0)
9810                        (const_int 1)]))))]
9811   "TARGET_SSE4_1"
9812   "%vpmovzxbq\t{%1, %0|%0, %1}"
9813   [(set_attr "type" "ssemov")
9814    (set_attr "prefix_extra" "1")
9815    (set_attr "prefix" "maybe_vex")
9816    (set_attr "mode" "TI")])
9818 (define_insn "sse4_1_zero_extendv4hiv4si2"
9819   [(set (match_operand:V4SI 0 "register_operand" "=x")
9820         (zero_extend:V4SI
9821           (vec_select:V4HI
9822             (match_operand:V8HI 1 "register_operand" "x")
9823             (parallel [(const_int 0)
9824                        (const_int 1)
9825                        (const_int 2)
9826                        (const_int 3)]))))]
9827   "TARGET_SSE4_1"
9828   "%vpmovzxwd\t{%1, %0|%0, %1}"
9829   [(set_attr "type" "ssemov")
9830    (set_attr "prefix_extra" "1")
9831    (set_attr "prefix" "maybe_vex")
9832    (set_attr "mode" "TI")])
9834 (define_insn "*sse4_1_zero_extendv4hiv4si2"
9835   [(set (match_operand:V4SI 0 "register_operand" "=x")
9836         (zero_extend:V4SI
9837           (vec_select:V4HI
9838             (vec_duplicate:V8HI
9839               (match_operand:V4HI 1 "nonimmediate_operand" "xm"))
9840             (parallel [(const_int 0)
9841                        (const_int 1)
9842                        (const_int 2)
9843                        (const_int 3)]))))]
9844   "TARGET_SSE4_1"
9845   "%vpmovzxwd\t{%1, %0|%0, %1}"
9846   [(set_attr "type" "ssemov")
9847    (set_attr "prefix_extra" "1")
9848    (set_attr "prefix" "maybe_vex")
9849    (set_attr "mode" "TI")])
9851 (define_insn "sse4_1_zero_extendv2hiv2di2"
9852   [(set (match_operand:V2DI 0 "register_operand" "=x")
9853         (zero_extend:V2DI
9854           (vec_select:V2HI
9855             (match_operand:V8HI 1 "register_operand" "x")
9856             (parallel [(const_int 0)
9857                        (const_int 1)]))))]
9858   "TARGET_SSE4_1"
9859   "%vpmovzxwq\t{%1, %0|%0, %1}"
9860   [(set_attr "type" "ssemov")
9861    (set_attr "prefix_extra" "1")
9862    (set_attr "prefix" "maybe_vex")
9863    (set_attr "mode" "TI")])
9865 (define_insn "*sse4_1_zero_extendv2hiv2di2"
9866   [(set (match_operand:V2DI 0 "register_operand" "=x")
9867         (zero_extend:V2DI
9868           (vec_select:V2HI
9869             (vec_duplicate:V8HI
9870               (match_operand:V2HI 1 "nonimmediate_operand" "xm"))
9871             (parallel [(const_int 0)
9872                        (const_int 1)]))))]
9873   "TARGET_SSE4_1"
9874   "%vpmovzxwq\t{%1, %0|%0, %1}"
9875   [(set_attr "type" "ssemov")
9876    (set_attr "prefix_extra" "1")
9877    (set_attr "prefix" "maybe_vex")
9878    (set_attr "mode" "TI")])
9880 (define_insn "sse4_1_zero_extendv2siv2di2"
9881   [(set (match_operand:V2DI 0 "register_operand" "=x")
9882         (zero_extend:V2DI
9883           (vec_select:V2SI
9884             (match_operand:V4SI 1 "register_operand" "x")
9885             (parallel [(const_int 0)
9886                        (const_int 1)]))))]
9887   "TARGET_SSE4_1"
9888   "%vpmovzxdq\t{%1, %0|%0, %1}"
9889   [(set_attr "type" "ssemov")
9890    (set_attr "prefix_extra" "1")
9891    (set_attr "prefix" "maybe_vex")
9892    (set_attr "mode" "TI")])
9894 (define_insn "*sse4_1_zero_extendv2siv2di2"
9895   [(set (match_operand:V2DI 0 "register_operand" "=x")
9896         (zero_extend:V2DI
9897           (vec_select:V2SI
9898             (vec_duplicate:V4SI
9899               (match_operand:V2SI 1 "nonimmediate_operand" "xm"))
9900             (parallel [(const_int 0)
9901                        (const_int 1)]))))]
9902   "TARGET_SSE4_1"
9903   "%vpmovzxdq\t{%1, %0|%0, %1}"
9904   [(set_attr "type" "ssemov")
9905    (set_attr "prefix_extra" "1")
9906    (set_attr "prefix" "maybe_vex")
9907    (set_attr "mode" "TI")])
9909 ;; ptestps/ptestpd are very similar to comiss and ucomiss when
9910 ;; setting FLAGS_REG. But it is not a really compare instruction.
9911 (define_insn "avx_vtestp<avxmodesuffixf2c><avxmodesuffix>"
9912   [(set (reg:CC FLAGS_REG)
9913         (unspec:CC [(match_operand:AVXMODEF2P 0 "register_operand" "x")
9914                     (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "xm")]
9915                    UNSPEC_VTESTP))]
9916   "TARGET_AVX"
9917   "vtestp<avxmodesuffixf2c>\t{%1, %0|%0, %1}"
9918   [(set_attr "type" "ssecomi")
9919    (set_attr "prefix_extra" "1")
9920    (set_attr "prefix" "vex")
9921    (set_attr "mode" "<MODE>")])
9923 ;; ptest is very similar to comiss and ucomiss when setting FLAGS_REG.
9924 ;; But it is not a really compare instruction.
9925 (define_insn "avx_ptest256"
9926   [(set (reg:CC FLAGS_REG)
9927         (unspec:CC [(match_operand:V4DI 0 "register_operand" "x")
9928                     (match_operand:V4DI 1 "nonimmediate_operand" "xm")]
9929                    UNSPEC_PTEST))]
9930   "TARGET_AVX"
9931   "vptest\t{%1, %0|%0, %1}"
9932   [(set_attr "type" "ssecomi")
9933    (set_attr "prefix_extra" "1")
9934    (set_attr "prefix" "vex")
9935    (set_attr "mode" "OI")])
9937 (define_insn "sse4_1_ptest"
9938   [(set (reg:CC FLAGS_REG)
9939         (unspec:CC [(match_operand:V2DI 0 "register_operand" "x")
9940                     (match_operand:V2DI 1 "nonimmediate_operand" "xm")]
9941                    UNSPEC_PTEST))]
9942   "TARGET_SSE4_1"
9943   "%vptest\t{%1, %0|%0, %1}"
9944   [(set_attr "type" "ssecomi")
9945    (set_attr "prefix_extra" "1")
9946    (set_attr "prefix" "maybe_vex")
9947    (set_attr "mode" "TI")])
9949 (define_insn "avx_roundp<avxmodesuffixf2c>256"
9950   [(set (match_operand:AVX256MODEF2P 0 "register_operand" "=x")
9951         (unspec:AVX256MODEF2P
9952           [(match_operand:AVX256MODEF2P 1 "nonimmediate_operand" "xm")
9953            (match_operand:SI 2 "const_0_to_15_operand" "n")]
9954           UNSPEC_ROUND))]
9955   "TARGET_AVX"
9956   "vroundp<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
9957   [(set_attr "type" "ssecvt")
9958    (set_attr "prefix_extra" "1")
9959    (set_attr "length_immediate" "1")
9960    (set_attr "prefix" "vex")
9961    (set_attr "mode" "<MODE>")])
9963 (define_insn "sse4_1_roundp<ssemodesuffixf2c>"
9964   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
9965         (unspec:SSEMODEF2P
9966           [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "xm")
9967            (match_operand:SI 2 "const_0_to_15_operand" "n")]
9968           UNSPEC_ROUND))]
9969   "TARGET_ROUND"
9970   "%vroundp<ssemodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
9971   [(set_attr "type" "ssecvt")
9972    (set_attr "prefix_data16" "1")
9973    (set_attr "prefix_extra" "1")
9974    (set_attr "length_immediate" "1")
9975    (set_attr "prefix" "maybe_vex")
9976    (set_attr "mode" "<MODE>")])
9978 (define_insn "*avx_rounds<ssemodesuffixf2c>"
9979   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
9980         (vec_merge:SSEMODEF2P
9981           (unspec:SSEMODEF2P
9982             [(match_operand:SSEMODEF2P 2 "register_operand" "x")
9983              (match_operand:SI 3 "const_0_to_15_operand" "n")]
9984             UNSPEC_ROUND)
9985           (match_operand:SSEMODEF2P 1 "register_operand" "x")
9986           (const_int 1)))]
9987   "TARGET_AVX"
9988   "vrounds<ssemodesuffixf2c>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
9989   [(set_attr "type" "ssecvt")
9990    (set_attr "prefix_extra" "1")
9991    (set_attr "length_immediate" "1")
9992    (set_attr "prefix" "vex")
9993    (set_attr "mode" "<MODE>")])
9995 (define_insn "sse4_1_rounds<ssemodesuffixf2c>"
9996   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
9997         (vec_merge:SSEMODEF2P
9998           (unspec:SSEMODEF2P
9999             [(match_operand:SSEMODEF2P 2 "register_operand" "x")
10000              (match_operand:SI 3 "const_0_to_15_operand" "n")]
10001             UNSPEC_ROUND)
10002           (match_operand:SSEMODEF2P 1 "register_operand" "0")
10003           (const_int 1)))]
10004   "TARGET_ROUND"
10005   "rounds<ssemodesuffixf2c>\t{%3, %2, %0|%0, %2, %3}"
10006   [(set_attr "type" "ssecvt")
10007    (set_attr "prefix_data16" "1")
10008    (set_attr "prefix_extra" "1")
10009    (set_attr "length_immediate" "1")
10010    (set_attr "mode" "<MODE>")])
10012 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10014 ;; Intel SSE4.2 string/text processing instructions
10016 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10018 (define_insn_and_split "sse4_2_pcmpestr"
10019   [(set (match_operand:SI 0 "register_operand" "=c,c")
10020         (unspec:SI
10021           [(match_operand:V16QI 2 "reg_not_xmm0_operand" "x,x")
10022            (match_operand:SI 3 "register_operand" "a,a")
10023            (match_operand:V16QI 4 "nonimm_not_xmm0_operand" "x,m")
10024            (match_operand:SI 5 "register_operand" "d,d")
10025            (match_operand:SI 6 "const_0_to_255_operand" "n,n")]
10026           UNSPEC_PCMPESTR))
10027    (set (match_operand:V16QI 1 "register_operand" "=Yz,Yz")
10028         (unspec:V16QI
10029           [(match_dup 2)
10030            (match_dup 3)
10031            (match_dup 4)
10032            (match_dup 5)
10033            (match_dup 6)]
10034           UNSPEC_PCMPESTR))
10035    (set (reg:CC FLAGS_REG)
10036         (unspec:CC
10037           [(match_dup 2)
10038            (match_dup 3)
10039            (match_dup 4)
10040            (match_dup 5)
10041            (match_dup 6)]
10042           UNSPEC_PCMPESTR))]
10043   "TARGET_SSE4_2
10044    && can_create_pseudo_p ()"
10045   "#"
10046   "&& 1"
10047   [(const_int 0)]
10049   int ecx = !find_regno_note (curr_insn, REG_UNUSED, REGNO (operands[0]));
10050   int xmm0 = !find_regno_note (curr_insn, REG_UNUSED, REGNO (operands[1]));
10051   int flags = !find_regno_note (curr_insn, REG_UNUSED, FLAGS_REG);
10053   if (ecx)
10054     emit_insn (gen_sse4_2_pcmpestri (operands[0], operands[2],
10055                                      operands[3], operands[4],
10056                                      operands[5], operands[6]));
10057   if (xmm0)
10058     emit_insn (gen_sse4_2_pcmpestrm (operands[1], operands[2],
10059                                      operands[3], operands[4],
10060                                      operands[5], operands[6]));
10061   if (flags && !(ecx || xmm0))
10062     emit_insn (gen_sse4_2_pcmpestr_cconly (NULL, NULL,
10063                                            operands[2], operands[3],
10064                                            operands[4], operands[5],
10065                                            operands[6]));
10066   DONE;
10068   [(set_attr "type" "sselog")
10069    (set_attr "prefix_data16" "1")
10070    (set_attr "prefix_extra" "1")
10071    (set_attr "length_immediate" "1")
10072    (set_attr "memory" "none,load")
10073    (set_attr "mode" "TI")])
10075 (define_insn "sse4_2_pcmpestri"
10076   [(set (match_operand:SI 0 "register_operand" "=c,c")
10077         (unspec:SI
10078           [(match_operand:V16QI 1 "register_operand" "x,x")
10079            (match_operand:SI 2 "register_operand" "a,a")
10080            (match_operand:V16QI 3 "nonimmediate_operand" "x,m")
10081            (match_operand:SI 4 "register_operand" "d,d")
10082            (match_operand:SI 5 "const_0_to_255_operand" "n,n")]
10083           UNSPEC_PCMPESTR))
10084    (set (reg:CC FLAGS_REG)
10085         (unspec:CC
10086           [(match_dup 1)
10087            (match_dup 2)
10088            (match_dup 3)
10089            (match_dup 4)
10090            (match_dup 5)]
10091           UNSPEC_PCMPESTR))]
10092   "TARGET_SSE4_2"
10093   "%vpcmpestri\t{%5, %3, %1|%1, %3, %5}"
10094   [(set_attr "type" "sselog")
10095    (set_attr "prefix_data16" "1")
10096    (set_attr "prefix_extra" "1")
10097    (set_attr "prefix" "maybe_vex")
10098    (set_attr "length_immediate" "1")
10099    (set_attr "memory" "none,load")
10100    (set_attr "mode" "TI")])
10102 (define_insn "sse4_2_pcmpestrm"
10103   [(set (match_operand:V16QI 0 "register_operand" "=Yz,Yz")
10104         (unspec:V16QI
10105           [(match_operand:V16QI 1 "register_operand" "x,x")
10106            (match_operand:SI 2 "register_operand" "a,a")
10107            (match_operand:V16QI 3 "nonimmediate_operand" "x,m")
10108            (match_operand:SI 4 "register_operand" "d,d")
10109            (match_operand:SI 5 "const_0_to_255_operand" "n,n")]
10110           UNSPEC_PCMPESTR))
10111    (set (reg:CC FLAGS_REG)
10112         (unspec:CC
10113           [(match_dup 1)
10114            (match_dup 2)
10115            (match_dup 3)
10116            (match_dup 4)
10117            (match_dup 5)]
10118           UNSPEC_PCMPESTR))]
10119   "TARGET_SSE4_2"
10120   "%vpcmpestrm\t{%5, %3, %1|%1, %3, %5}"
10121   [(set_attr "type" "sselog")
10122    (set_attr "prefix_data16" "1")
10123    (set_attr "prefix_extra" "1")
10124    (set_attr "length_immediate" "1")
10125    (set_attr "prefix" "maybe_vex")
10126    (set_attr "memory" "none,load")
10127    (set_attr "mode" "TI")])
10129 (define_insn "sse4_2_pcmpestr_cconly"
10130   [(set (reg:CC FLAGS_REG)
10131         (unspec:CC
10132           [(match_operand:V16QI 2 "register_operand" "x,x,x,x")
10133            (match_operand:SI 3 "register_operand" "a,a,a,a")
10134            (match_operand:V16QI 4 "nonimmediate_operand" "x,m,x,m")
10135            (match_operand:SI 5 "register_operand" "d,d,d,d")
10136            (match_operand:SI 6 "const_0_to_255_operand" "n,n,n,n")]
10137           UNSPEC_PCMPESTR))
10138    (clobber (match_scratch:V16QI 0 "=Yz,Yz,X,X"))
10139    (clobber (match_scratch:SI    1 "= X, X,c,c"))]
10140   "TARGET_SSE4_2"
10141   "@
10142    %vpcmpestrm\t{%6, %4, %2|%2, %4, %6}
10143    %vpcmpestrm\t{%6, %4, %2|%2, %4, %6}
10144    %vpcmpestri\t{%6, %4, %2|%2, %4, %6}
10145    %vpcmpestri\t{%6, %4, %2|%2, %4, %6}"
10146   [(set_attr "type" "sselog")
10147    (set_attr "prefix_data16" "1")
10148    (set_attr "prefix_extra" "1")
10149    (set_attr "length_immediate" "1")
10150    (set_attr "memory" "none,load,none,load")
10151    (set_attr "prefix" "maybe_vex")
10152    (set_attr "mode" "TI")])
10154 (define_insn_and_split "sse4_2_pcmpistr"
10155   [(set (match_operand:SI 0 "register_operand" "=c,c")
10156         (unspec:SI
10157           [(match_operand:V16QI 2 "reg_not_xmm0_operand" "x,x")
10158            (match_operand:V16QI 3 "nonimm_not_xmm0_operand" "x,m")
10159            (match_operand:SI 4 "const_0_to_255_operand" "n,n")]
10160           UNSPEC_PCMPISTR))
10161    (set (match_operand:V16QI 1 "register_operand" "=Yz,Yz")
10162         (unspec:V16QI
10163           [(match_dup 2)
10164            (match_dup 3)
10165            (match_dup 4)]
10166           UNSPEC_PCMPISTR))
10167    (set (reg:CC FLAGS_REG)
10168         (unspec:CC
10169           [(match_dup 2)
10170            (match_dup 3)
10171            (match_dup 4)]
10172           UNSPEC_PCMPISTR))]
10173   "TARGET_SSE4_2
10174    && can_create_pseudo_p ()"
10175   "#"
10176   "&& 1"
10177   [(const_int 0)]
10179   int ecx = !find_regno_note (curr_insn, REG_UNUSED, REGNO (operands[0]));
10180   int xmm0 = !find_regno_note (curr_insn, REG_UNUSED, REGNO (operands[1]));
10181   int flags = !find_regno_note (curr_insn, REG_UNUSED, FLAGS_REG);
10183   if (ecx)
10184     emit_insn (gen_sse4_2_pcmpistri (operands[0], operands[2],
10185                                      operands[3], operands[4]));
10186   if (xmm0)
10187     emit_insn (gen_sse4_2_pcmpistrm (operands[1], operands[2],
10188                                      operands[3], operands[4]));
10189   if (flags && !(ecx || xmm0))
10190     emit_insn (gen_sse4_2_pcmpistr_cconly (NULL, NULL,
10191                                            operands[2], operands[3],
10192                                            operands[4]));
10193   DONE;
10195   [(set_attr "type" "sselog")
10196    (set_attr "prefix_data16" "1")
10197    (set_attr "prefix_extra" "1")
10198    (set_attr "length_immediate" "1")
10199    (set_attr "memory" "none,load")
10200    (set_attr "mode" "TI")])
10202 (define_insn "sse4_2_pcmpistri"
10203   [(set (match_operand:SI 0 "register_operand" "=c,c")
10204         (unspec:SI
10205           [(match_operand:V16QI 1 "register_operand" "x,x")
10206            (match_operand:V16QI 2 "nonimmediate_operand" "x,m")
10207            (match_operand:SI 3 "const_0_to_255_operand" "n,n")]
10208           UNSPEC_PCMPISTR))
10209    (set (reg:CC FLAGS_REG)
10210         (unspec:CC
10211           [(match_dup 1)
10212            (match_dup 2)
10213            (match_dup 3)]
10214           UNSPEC_PCMPISTR))]
10215   "TARGET_SSE4_2"
10216   "%vpcmpistri\t{%3, %2, %1|%1, %2, %3}"
10217   [(set_attr "type" "sselog")
10218    (set_attr "prefix_data16" "1")
10219    (set_attr "prefix_extra" "1")
10220    (set_attr "length_immediate" "1")
10221    (set_attr "prefix" "maybe_vex")
10222    (set_attr "memory" "none,load")
10223    (set_attr "mode" "TI")])
10225 (define_insn "sse4_2_pcmpistrm"
10226   [(set (match_operand:V16QI 0 "register_operand" "=Yz,Yz")
10227         (unspec:V16QI
10228           [(match_operand:V16QI 1 "register_operand" "x,x")
10229            (match_operand:V16QI 2 "nonimmediate_operand" "x,m")
10230            (match_operand:SI 3 "const_0_to_255_operand" "n,n")]
10231           UNSPEC_PCMPISTR))
10232    (set (reg:CC FLAGS_REG)
10233         (unspec:CC
10234           [(match_dup 1)
10235            (match_dup 2)
10236            (match_dup 3)]
10237           UNSPEC_PCMPISTR))]
10238   "TARGET_SSE4_2"
10239   "%vpcmpistrm\t{%3, %2, %1|%1, %2, %3}"
10240   [(set_attr "type" "sselog")
10241    (set_attr "prefix_data16" "1")
10242    (set_attr "prefix_extra" "1")
10243    (set_attr "length_immediate" "1")
10244    (set_attr "prefix" "maybe_vex")
10245    (set_attr "memory" "none,load")
10246    (set_attr "mode" "TI")])
10248 (define_insn "sse4_2_pcmpistr_cconly"
10249   [(set (reg:CC FLAGS_REG)
10250         (unspec:CC
10251           [(match_operand:V16QI 2 "register_operand" "x,x,x,x")
10252            (match_operand:V16QI 3 "nonimmediate_operand" "x,m,x,m")
10253            (match_operand:SI 4 "const_0_to_255_operand" "n,n,n,n")]
10254           UNSPEC_PCMPISTR))
10255    (clobber (match_scratch:V16QI 0 "=Yz,Yz,X,X"))
10256    (clobber (match_scratch:SI    1 "= X, X,c,c"))]
10257   "TARGET_SSE4_2"
10258   "@
10259    %vpcmpistrm\t{%4, %3, %2|%2, %3, %4}
10260    %vpcmpistrm\t{%4, %3, %2|%2, %3, %4}
10261    %vpcmpistri\t{%4, %3, %2|%2, %3, %4}
10262    %vpcmpistri\t{%4, %3, %2|%2, %3, %4}"
10263   [(set_attr "type" "sselog")
10264    (set_attr "prefix_data16" "1")
10265    (set_attr "prefix_extra" "1")
10266    (set_attr "length_immediate" "1")
10267    (set_attr "memory" "none,load,none,load")
10268    (set_attr "prefix" "maybe_vex")
10269    (set_attr "mode" "TI")])
10271 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10273 ;; XOP instructions
10275 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10277 ;; XOP parallel integer multiply/add instructions.
10278 ;; Note the XOP multiply/add instructions
10279 ;;     a[i] = b[i] * c[i] + d[i];
10280 ;; do not allow the value being added to be a memory operation.
10281 (define_insn "xop_pmacsww"
10282   [(set (match_operand:V8HI 0 "register_operand" "=x")
10283         (plus:V8HI
10284          (mult:V8HI
10285           (match_operand:V8HI 1 "nonimmediate_operand" "%x")
10286           (match_operand:V8HI 2 "nonimmediate_operand" "xm"))
10287          (match_operand:V8HI 3 "nonimmediate_operand" "x")))]
10288   "TARGET_XOP"
10289   "vpmacsww\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10290   [(set_attr "type" "ssemuladd")
10291    (set_attr "mode" "TI")])
10293 (define_insn "xop_pmacssww"
10294   [(set (match_operand:V8HI 0 "register_operand" "=x")
10295         (ss_plus:V8HI
10296          (mult:V8HI (match_operand:V8HI 1 "nonimmediate_operand" "%x")
10297                     (match_operand:V8HI 2 "nonimmediate_operand" "xm"))
10298          (match_operand:V8HI 3 "nonimmediate_operand" "x")))]
10299   "TARGET_XOP"
10300   "vpmacssww\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10301   [(set_attr "type" "ssemuladd")
10302    (set_attr "mode" "TI")])
10304 (define_insn "xop_pmacsdd"
10305   [(set (match_operand:V4SI 0 "register_operand" "=x")
10306         (plus:V4SI
10307          (mult:V4SI
10308           (match_operand:V4SI 1 "nonimmediate_operand" "%x")
10309           (match_operand:V4SI 2 "nonimmediate_operand" "xm"))
10310          (match_operand:V4SI 3 "nonimmediate_operand" "x")))]
10311   "TARGET_XOP"
10312   "vpmacsdd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10313   [(set_attr "type" "ssemuladd")
10314    (set_attr "mode" "TI")])
10316 (define_insn "xop_pmacssdd"
10317   [(set (match_operand:V4SI 0 "register_operand" "=x")
10318         (ss_plus:V4SI
10319          (mult:V4SI (match_operand:V4SI 1 "nonimmediate_operand" "%x")
10320                     (match_operand:V4SI 2 "nonimmediate_operand" "xm"))
10321          (match_operand:V4SI 3 "nonimmediate_operand" "x")))]
10322   "TARGET_XOP"
10323   "vpmacssdd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10324   [(set_attr "type" "ssemuladd")
10325    (set_attr "mode" "TI")])
10327 (define_insn "xop_pmacssdql"
10328   [(set (match_operand:V2DI 0 "register_operand" "=x")
10329         (ss_plus:V2DI
10330          (mult:V2DI
10331           (sign_extend:V2DI
10332            (vec_select:V2SI
10333             (match_operand:V4SI 1 "nonimmediate_operand" "%x")
10334             (parallel [(const_int 1)
10335                        (const_int 3)])))
10336           (vec_select:V2SI
10337            (match_operand:V4SI 2 "nonimmediate_operand" "xm")
10338            (parallel [(const_int 1)
10339                       (const_int 3)])))
10340          (match_operand:V2DI 3 "nonimmediate_operand" "x")))]
10341   "TARGET_XOP"
10342   "vpmacssdql\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10343   [(set_attr "type" "ssemuladd")
10344    (set_attr "mode" "TI")])
10346 (define_insn "xop_pmacssdqh"
10347   [(set (match_operand:V2DI 0 "register_operand" "=x")
10348         (ss_plus:V2DI
10349          (mult:V2DI
10350           (sign_extend:V2DI
10351            (vec_select:V2SI
10352             (match_operand:V4SI 1 "nonimmediate_operand" "%x")
10353             (parallel [(const_int 0)
10354                        (const_int 2)])))
10355           (sign_extend:V2DI
10356            (vec_select:V2SI
10357             (match_operand:V4SI 2 "nonimmediate_operand" "xm")
10358             (parallel [(const_int 0)
10359                        (const_int 2)]))))
10360          (match_operand:V2DI 3 "nonimmediate_operand" "x")))]
10361   "TARGET_XOP"
10362   "vpmacssdqh\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10363   [(set_attr "type" "ssemuladd")
10364    (set_attr "mode" "TI")])
10366 (define_insn "xop_pmacsdql"
10367   [(set (match_operand:V2DI 0 "register_operand" "=x")
10368         (plus:V2DI
10369          (mult:V2DI
10370           (sign_extend:V2DI
10371            (vec_select:V2SI
10372             (match_operand:V4SI 1 "nonimmediate_operand" "%x")
10373             (parallel [(const_int 1)
10374                        (const_int 3)])))
10375           (sign_extend:V2DI
10376            (vec_select:V2SI
10377             (match_operand:V4SI 2 "nonimmediate_operand" "xm")
10378             (parallel [(const_int 1)
10379                        (const_int 3)]))))
10380          (match_operand:V2DI 3 "nonimmediate_operand" "x")))]
10381   "TARGET_XOP"
10382   "vpmacsdql\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10383   [(set_attr "type" "ssemuladd")
10384    (set_attr "mode" "TI")])
10386 ;; We don't have a straight 32-bit parallel multiply and extend on XOP, so
10387 ;; fake it with a multiply/add.  In general, we expect the define_split to
10388 ;; occur before register allocation, so we have to handle the corner case where
10389 ;; the target is the same as operands 1/2
10390 (define_insn_and_split "xop_mulv2div2di3_low"
10391   [(set (match_operand:V2DI 0 "register_operand" "=&x")
10392         (mult:V2DI
10393           (sign_extend:V2DI
10394             (vec_select:V2SI
10395               (match_operand:V4SI 1 "register_operand" "%x")
10396               (parallel [(const_int 1)
10397                          (const_int 3)])))
10398           (sign_extend:V2DI
10399             (vec_select:V2SI
10400               (match_operand:V4SI 2 "nonimmediate_operand" "xm")
10401               (parallel [(const_int 1)
10402                          (const_int 3)])))))]
10403   "TARGET_XOP"
10404   "#"
10405   "&& reload_completed"
10406   [(set (match_dup 0)
10407         (match_dup 3))
10408    (set (match_dup 0)
10409         (plus:V2DI
10410          (mult:V2DI
10411           (sign_extend:V2DI
10412            (vec_select:V2SI
10413             (match_dup 1)
10414             (parallel [(const_int 1)
10415                        (const_int 3)])))
10416           (sign_extend:V2DI
10417            (vec_select:V2SI
10418             (match_dup 2)
10419             (parallel [(const_int 1)
10420                        (const_int 3)]))))
10421          (match_dup 0)))]
10423   operands[3] = CONST0_RTX (V2DImode);
10425   [(set_attr "type" "ssemuladd")
10426    (set_attr "mode" "TI")])
10428 (define_insn "xop_pmacsdqh"
10429   [(set (match_operand:V2DI 0 "register_operand" "=x")
10430         (plus:V2DI
10431          (mult:V2DI
10432           (sign_extend:V2DI
10433            (vec_select:V2SI
10434             (match_operand:V4SI 1 "nonimmediate_operand" "%x")
10435             (parallel [(const_int 0)
10436                        (const_int 2)])))
10437           (sign_extend:V2DI
10438            (vec_select:V2SI
10439             (match_operand:V4SI 2 "nonimmediate_operand" "xm")
10440             (parallel [(const_int 0)
10441                        (const_int 2)]))))
10442          (match_operand:V2DI 3 "nonimmediate_operand" "x")))]
10443   "TARGET_XOP"
10444   "vpmacsdqh\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10445   [(set_attr "type" "ssemuladd")
10446    (set_attr "mode" "TI")])
10448 ;; We don't have a straight 32-bit parallel multiply and extend on XOP, so
10449 ;; fake it with a multiply/add.  In general, we expect the define_split to
10450 ;; occur before register allocation, so we have to handle the corner case where
10451 ;; the target is the same as either operands[1] or operands[2]
10452 (define_insn_and_split "xop_mulv2div2di3_high"
10453   [(set (match_operand:V2DI 0 "register_operand" "=&x")
10454         (mult:V2DI
10455           (sign_extend:V2DI
10456             (vec_select:V2SI
10457               (match_operand:V4SI 1 "register_operand" "%x")
10458               (parallel [(const_int 0)
10459                          (const_int 2)])))
10460           (sign_extend:V2DI
10461             (vec_select:V2SI
10462               (match_operand:V4SI 2 "nonimmediate_operand" "xm")
10463               (parallel [(const_int 0)
10464                          (const_int 2)])))))]
10465   "TARGET_XOP"
10466   "#"
10467   "&& reload_completed"
10468   [(set (match_dup 0)
10469         (match_dup 3))
10470    (set (match_dup 0)
10471         (plus:V2DI
10472          (mult:V2DI
10473           (sign_extend:V2DI
10474            (vec_select:V2SI
10475             (match_dup 1)
10476             (parallel [(const_int 0)
10477                        (const_int 2)])))
10478           (sign_extend:V2DI
10479            (vec_select:V2SI
10480             (match_dup 2)
10481             (parallel [(const_int 0)
10482                        (const_int 2)]))))
10483          (match_dup 0)))]
10485   operands[3] = CONST0_RTX (V2DImode);
10487   [(set_attr "type" "ssemuladd")
10488    (set_attr "mode" "TI")])
10490 ;; XOP parallel integer multiply/add instructions for the intrinisics
10491 (define_insn "xop_pmacsswd"
10492   [(set (match_operand:V4SI 0 "register_operand" "=x")
10493         (ss_plus:V4SI
10494          (mult:V4SI
10495           (sign_extend:V4SI
10496            (vec_select:V4HI
10497             (match_operand:V8HI 1 "nonimmediate_operand" "%x")
10498             (parallel [(const_int 1)
10499                        (const_int 3)
10500                        (const_int 5)
10501                        (const_int 7)])))
10502           (sign_extend:V4SI
10503            (vec_select:V4HI
10504             (match_operand:V8HI 2 "nonimmediate_operand" "xm")
10505             (parallel [(const_int 1)
10506                        (const_int 3)
10507                        (const_int 5)
10508                        (const_int 7)]))))
10509          (match_operand:V4SI 3 "nonimmediate_operand" "x")))]
10510   "TARGET_XOP"
10511   "vpmacsswd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10512   [(set_attr "type" "ssemuladd")
10513    (set_attr "mode" "TI")])
10515 (define_insn "xop_pmacswd"
10516   [(set (match_operand:V4SI 0 "register_operand" "=x")
10517         (plus:V4SI
10518          (mult:V4SI
10519           (sign_extend:V4SI
10520            (vec_select:V4HI
10521             (match_operand:V8HI 1 "nonimmediate_operand" "%x")
10522             (parallel [(const_int 1)
10523                        (const_int 3)
10524                        (const_int 5)
10525                        (const_int 7)])))
10526           (sign_extend:V4SI
10527            (vec_select:V4HI
10528             (match_operand:V8HI 2 "nonimmediate_operand" "xm")
10529             (parallel [(const_int 1)
10530                        (const_int 3)
10531                        (const_int 5)
10532                        (const_int 7)]))))
10533          (match_operand:V4SI 3 "nonimmediate_operand" "x")))]
10534   "TARGET_XOP"
10535   "vpmacswd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10536   [(set_attr "type" "ssemuladd")
10537    (set_attr "mode" "TI")])
10539 (define_insn "xop_pmadcsswd"
10540   [(set (match_operand:V4SI 0 "register_operand" "=x")
10541         (ss_plus:V4SI
10542          (plus:V4SI
10543           (mult:V4SI
10544            (sign_extend:V4SI
10545             (vec_select:V4HI
10546              (match_operand:V8HI 1 "nonimmediate_operand" "%x")
10547              (parallel [(const_int 0)
10548                         (const_int 2)
10549                         (const_int 4)
10550                         (const_int 6)])))
10551            (sign_extend:V4SI
10552             (vec_select:V4HI
10553              (match_operand:V8HI 2 "nonimmediate_operand" "xm")
10554              (parallel [(const_int 0)
10555                         (const_int 2)
10556                         (const_int 4)
10557                         (const_int 6)]))))
10558           (mult:V4SI
10559            (sign_extend:V4SI
10560             (vec_select:V4HI
10561              (match_dup 1)
10562              (parallel [(const_int 1)
10563                         (const_int 3)
10564                         (const_int 5)
10565                         (const_int 7)])))
10566            (sign_extend:V4SI
10567             (vec_select:V4HI
10568              (match_dup 2)
10569              (parallel [(const_int 1)
10570                         (const_int 3)
10571                         (const_int 5)
10572                         (const_int 7)])))))
10573          (match_operand:V4SI 3 "nonimmediate_operand" "x")))]
10574   "TARGET_XOP"
10575   "vpmadcsswd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10576   [(set_attr "type" "ssemuladd")
10577    (set_attr "mode" "TI")])
10579 (define_insn "xop_pmadcswd"
10580   [(set (match_operand:V4SI 0 "register_operand" "=x")
10581         (plus:V4SI
10582          (plus:V4SI
10583           (mult:V4SI
10584            (sign_extend:V4SI
10585             (vec_select:V4HI
10586              (match_operand:V8HI 1 "nonimmediate_operand" "%x")
10587              (parallel [(const_int 0)
10588                         (const_int 2)
10589                         (const_int 4)
10590                         (const_int 6)])))
10591            (sign_extend:V4SI
10592             (vec_select:V4HI
10593              (match_operand:V8HI 2 "nonimmediate_operand" "xm")
10594              (parallel [(const_int 0)
10595                         (const_int 2)
10596                         (const_int 4)
10597                         (const_int 6)]))))
10598           (mult:V4SI
10599            (sign_extend:V4SI
10600             (vec_select:V4HI
10601              (match_dup 1)
10602              (parallel [(const_int 1)
10603                         (const_int 3)
10604                         (const_int 5)
10605                         (const_int 7)])))
10606            (sign_extend:V4SI
10607             (vec_select:V4HI
10608              (match_dup 2)
10609              (parallel [(const_int 1)
10610                         (const_int 3)
10611                         (const_int 5)
10612                         (const_int 7)])))))
10613          (match_operand:V4SI 3 "nonimmediate_operand" "x")))]
10614   "TARGET_XOP"
10615   "vpmadcswd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10616   [(set_attr "type" "ssemuladd")
10617    (set_attr "mode" "TI")])
10619 ;; XOP parallel XMM conditional moves
10620 (define_insn "xop_pcmov_<mode>"
10621   [(set (match_operand:SSEMODE 0 "register_operand" "=x,x")
10622         (if_then_else:SSEMODE
10623           (match_operand:SSEMODE 3 "nonimmediate_operand" "x,m")
10624           (match_operand:SSEMODE 1 "vector_move_operand" "x,x")
10625           (match_operand:SSEMODE 2 "vector_move_operand" "xm,x")))]
10626   "TARGET_XOP"
10627   "vpcmov\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10628   [(set_attr "type" "sse4arg")])
10630 (define_insn "xop_pcmov_<mode>256"
10631   [(set (match_operand:AVX256MODE 0 "register_operand" "=x,x")
10632         (if_then_else:AVX256MODE
10633           (match_operand:AVX256MODE 3 "nonimmediate_operand" "x,m")
10634           (match_operand:AVX256MODE 1 "vector_move_operand" "x,x")
10635           (match_operand:AVX256MODE 2 "vector_move_operand" "xm,x")))]
10636   "TARGET_XOP"
10637   "vpcmov\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10638   [(set_attr "type" "sse4arg")])
10640 ;; XOP horizontal add/subtract instructions
10641 (define_insn "xop_phaddbw"
10642   [(set (match_operand:V8HI 0 "register_operand" "=x")
10643         (plus:V8HI
10644          (sign_extend:V8HI
10645           (vec_select:V8QI
10646            (match_operand:V16QI 1 "nonimmediate_operand" "xm")
10647            (parallel [(const_int 0)
10648                       (const_int 2)
10649                       (const_int 4)
10650                       (const_int 6)
10651                       (const_int 8)
10652                       (const_int 10)
10653                       (const_int 12)
10654                       (const_int 14)])))
10655          (sign_extend:V8HI
10656           (vec_select:V8QI
10657            (match_dup 1)
10658            (parallel [(const_int 1)
10659                       (const_int 3)
10660                       (const_int 5)
10661                       (const_int 7)
10662                       (const_int 9)
10663                       (const_int 11)
10664                       (const_int 13)
10665                       (const_int 15)])))))]
10666   "TARGET_XOP"
10667   "vphaddbw\t{%1, %0|%0, %1}"
10668   [(set_attr "type" "sseiadd1")])
10670 (define_insn "xop_phaddbd"
10671   [(set (match_operand:V4SI 0 "register_operand" "=x")
10672         (plus:V4SI
10673          (plus:V4SI
10674           (sign_extend:V4SI
10675            (vec_select:V4QI
10676             (match_operand:V16QI 1 "nonimmediate_operand" "xm")
10677             (parallel [(const_int 0)
10678                        (const_int 4)
10679                        (const_int 8)
10680                        (const_int 12)])))
10681           (sign_extend:V4SI
10682            (vec_select:V4QI
10683             (match_dup 1)
10684             (parallel [(const_int 1)
10685                        (const_int 5)
10686                        (const_int 9)
10687                        (const_int 13)]))))
10688          (plus:V4SI
10689           (sign_extend:V4SI
10690            (vec_select:V4QI
10691             (match_dup 1)
10692             (parallel [(const_int 2)
10693                        (const_int 6)
10694                        (const_int 10)
10695                        (const_int 14)])))
10696           (sign_extend:V4SI
10697            (vec_select:V4QI
10698             (match_dup 1)
10699             (parallel [(const_int 3)
10700                        (const_int 7)
10701                        (const_int 11)
10702                        (const_int 15)]))))))]
10703   "TARGET_XOP"
10704   "vphaddbd\t{%1, %0|%0, %1}"
10705   [(set_attr "type" "sseiadd1")])
10707 (define_insn "xop_phaddbq"
10708   [(set (match_operand:V2DI 0 "register_operand" "=x")
10709         (plus:V2DI
10710          (plus:V2DI
10711           (plus:V2DI
10712            (sign_extend:V2DI
10713             (vec_select:V2QI
10714              (match_operand:V16QI 1 "nonimmediate_operand" "xm")
10715              (parallel [(const_int 0)
10716                         (const_int 4)])))
10717            (sign_extend:V2DI
10718             (vec_select:V2QI
10719              (match_dup 1)
10720              (parallel [(const_int 1)
10721                         (const_int 5)]))))
10722           (plus:V2DI
10723            (sign_extend:V2DI
10724             (vec_select:V2QI
10725              (match_dup 1)
10726              (parallel [(const_int 2)
10727                         (const_int 6)])))
10728            (sign_extend:V2DI
10729             (vec_select:V2QI
10730              (match_dup 1)
10731              (parallel [(const_int 3)
10732                         (const_int 7)])))))
10733          (plus:V2DI
10734           (plus:V2DI
10735            (sign_extend:V2DI
10736             (vec_select:V2QI
10737              (match_dup 1)
10738              (parallel [(const_int 8)
10739                         (const_int 12)])))
10740            (sign_extend:V2DI
10741             (vec_select:V2QI
10742              (match_dup 1)
10743              (parallel [(const_int 9)
10744                         (const_int 13)]))))
10745           (plus:V2DI
10746            (sign_extend:V2DI
10747             (vec_select:V2QI
10748              (match_dup 1)
10749              (parallel [(const_int 10)
10750                         (const_int 14)])))
10751            (sign_extend:V2DI
10752             (vec_select:V2QI
10753              (match_dup 1)
10754              (parallel [(const_int 11)
10755                         (const_int 15)])))))))]
10756   "TARGET_XOP"
10757   "vphaddbq\t{%1, %0|%0, %1}"
10758   [(set_attr "type" "sseiadd1")])
10760 (define_insn "xop_phaddwd"
10761   [(set (match_operand:V4SI 0 "register_operand" "=x")
10762         (plus:V4SI
10763          (sign_extend:V4SI
10764           (vec_select:V4HI
10765            (match_operand:V8HI 1 "nonimmediate_operand" "xm")
10766            (parallel [(const_int 0)
10767                       (const_int 2)
10768                       (const_int 4)
10769                       (const_int 6)])))
10770          (sign_extend:V4SI
10771           (vec_select:V4HI
10772            (match_dup 1)
10773            (parallel [(const_int 1)
10774                       (const_int 3)
10775                       (const_int 5)
10776                       (const_int 7)])))))]
10777   "TARGET_XOP"
10778   "vphaddwd\t{%1, %0|%0, %1}"
10779   [(set_attr "type" "sseiadd1")])
10781 (define_insn "xop_phaddwq"
10782   [(set (match_operand:V2DI 0 "register_operand" "=x")
10783         (plus:V2DI
10784          (plus:V2DI
10785           (sign_extend:V2DI
10786            (vec_select:V2HI
10787             (match_operand:V8HI 1 "nonimmediate_operand" "xm")
10788             (parallel [(const_int 0)
10789                        (const_int 4)])))
10790           (sign_extend:V2DI
10791            (vec_select:V2HI
10792             (match_dup 1)
10793             (parallel [(const_int 1)
10794                        (const_int 5)]))))
10795          (plus:V2DI
10796           (sign_extend:V2DI
10797            (vec_select:V2HI
10798             (match_dup 1)
10799             (parallel [(const_int 2)
10800                        (const_int 6)])))
10801           (sign_extend:V2DI
10802            (vec_select:V2HI
10803             (match_dup 1)
10804             (parallel [(const_int 3)
10805                        (const_int 7)]))))))]
10806   "TARGET_XOP"
10807   "vphaddwq\t{%1, %0|%0, %1}"
10808   [(set_attr "type" "sseiadd1")])
10810 (define_insn "xop_phadddq"
10811   [(set (match_operand:V2DI 0 "register_operand" "=x")
10812         (plus:V2DI
10813          (sign_extend:V2DI
10814           (vec_select:V2SI
10815            (match_operand:V4SI 1 "nonimmediate_operand" "xm")
10816            (parallel [(const_int 0)
10817                       (const_int 2)])))
10818          (sign_extend:V2DI
10819           (vec_select:V2SI
10820            (match_dup 1)
10821            (parallel [(const_int 1)
10822                       (const_int 3)])))))]
10823   "TARGET_XOP"
10824   "vphadddq\t{%1, %0|%0, %1}"
10825   [(set_attr "type" "sseiadd1")])
10827 (define_insn "xop_phaddubw"
10828   [(set (match_operand:V8HI 0 "register_operand" "=x")
10829         (plus:V8HI
10830          (zero_extend:V8HI
10831           (vec_select:V8QI
10832            (match_operand:V16QI 1 "nonimmediate_operand" "xm")
10833            (parallel [(const_int 0)
10834                       (const_int 2)
10835                       (const_int 4)
10836                       (const_int 6)
10837                       (const_int 8)
10838                       (const_int 10)
10839                       (const_int 12)
10840                       (const_int 14)])))
10841          (zero_extend:V8HI
10842           (vec_select:V8QI
10843            (match_dup 1)
10844            (parallel [(const_int 1)
10845                       (const_int 3)
10846                       (const_int 5)
10847                       (const_int 7)
10848                       (const_int 9)
10849                       (const_int 11)
10850                       (const_int 13)
10851                       (const_int 15)])))))]
10852   "TARGET_XOP"
10853   "vphaddubw\t{%1, %0|%0, %1}"
10854   [(set_attr "type" "sseiadd1")])
10856 (define_insn "xop_phaddubd"
10857   [(set (match_operand:V4SI 0 "register_operand" "=x")
10858         (plus:V4SI
10859          (plus:V4SI
10860           (zero_extend:V4SI
10861            (vec_select:V4QI
10862             (match_operand:V16QI 1 "nonimmediate_operand" "xm")
10863             (parallel [(const_int 0)
10864                        (const_int 4)
10865                        (const_int 8)
10866                        (const_int 12)])))
10867           (zero_extend:V4SI
10868            (vec_select:V4QI
10869             (match_dup 1)
10870             (parallel [(const_int 1)
10871                        (const_int 5)
10872                        (const_int 9)
10873                        (const_int 13)]))))
10874          (plus:V4SI
10875           (zero_extend:V4SI
10876            (vec_select:V4QI
10877             (match_dup 1)
10878             (parallel [(const_int 2)
10879                        (const_int 6)
10880                        (const_int 10)
10881                        (const_int 14)])))
10882           (zero_extend:V4SI
10883            (vec_select:V4QI
10884             (match_dup 1)
10885             (parallel [(const_int 3)
10886                        (const_int 7)
10887                        (const_int 11)
10888                        (const_int 15)]))))))]
10889   "TARGET_XOP"
10890   "vphaddubd\t{%1, %0|%0, %1}"
10891   [(set_attr "type" "sseiadd1")])
10893 (define_insn "xop_phaddubq"
10894   [(set (match_operand:V2DI 0 "register_operand" "=x")
10895         (plus:V2DI
10896          (plus:V2DI
10897           (plus:V2DI
10898            (zero_extend:V2DI
10899             (vec_select:V2QI
10900              (match_operand:V16QI 1 "nonimmediate_operand" "xm")
10901              (parallel [(const_int 0)
10902                         (const_int 4)])))
10903            (sign_extend:V2DI
10904             (vec_select:V2QI
10905              (match_dup 1)
10906              (parallel [(const_int 1)
10907                         (const_int 5)]))))
10908           (plus:V2DI
10909            (zero_extend:V2DI
10910             (vec_select:V2QI
10911              (match_dup 1)
10912              (parallel [(const_int 2)
10913                         (const_int 6)])))
10914            (zero_extend:V2DI
10915             (vec_select:V2QI
10916              (match_dup 1)
10917              (parallel [(const_int 3)
10918                         (const_int 7)])))))
10919          (plus:V2DI
10920           (plus:V2DI
10921            (zero_extend:V2DI
10922             (vec_select:V2QI
10923              (match_dup 1)
10924              (parallel [(const_int 8)
10925                         (const_int 12)])))
10926            (sign_extend:V2DI
10927             (vec_select:V2QI
10928              (match_dup 1)
10929              (parallel [(const_int 9)
10930                         (const_int 13)]))))
10931           (plus:V2DI
10932            (zero_extend:V2DI
10933             (vec_select:V2QI
10934              (match_dup 1)
10935              (parallel [(const_int 10)
10936                         (const_int 14)])))
10937            (zero_extend:V2DI
10938             (vec_select:V2QI
10939              (match_dup 1)
10940              (parallel [(const_int 11)
10941                         (const_int 15)])))))))]
10942   "TARGET_XOP"
10943   "vphaddubq\t{%1, %0|%0, %1}"
10944   [(set_attr "type" "sseiadd1")])
10946 (define_insn "xop_phadduwd"
10947   [(set (match_operand:V4SI 0 "register_operand" "=x")
10948         (plus:V4SI
10949          (zero_extend:V4SI
10950           (vec_select:V4HI
10951            (match_operand:V8HI 1 "nonimmediate_operand" "xm")
10952            (parallel [(const_int 0)
10953                       (const_int 2)
10954                       (const_int 4)
10955                       (const_int 6)])))
10956          (zero_extend:V4SI
10957           (vec_select:V4HI
10958            (match_dup 1)
10959            (parallel [(const_int 1)
10960                       (const_int 3)
10961                       (const_int 5)
10962                       (const_int 7)])))))]
10963   "TARGET_XOP"
10964   "vphadduwd\t{%1, %0|%0, %1}"
10965   [(set_attr "type" "sseiadd1")])
10967 (define_insn "xop_phadduwq"
10968   [(set (match_operand:V2DI 0 "register_operand" "=x")
10969         (plus:V2DI
10970          (plus:V2DI
10971           (zero_extend:V2DI
10972            (vec_select:V2HI
10973             (match_operand:V8HI 1 "nonimmediate_operand" "xm")
10974             (parallel [(const_int 0)
10975                        (const_int 4)])))
10976           (zero_extend:V2DI
10977            (vec_select:V2HI
10978             (match_dup 1)
10979             (parallel [(const_int 1)
10980                        (const_int 5)]))))
10981          (plus:V2DI
10982           (zero_extend:V2DI
10983            (vec_select:V2HI
10984             (match_dup 1)
10985             (parallel [(const_int 2)
10986                        (const_int 6)])))
10987           (zero_extend:V2DI
10988            (vec_select:V2HI
10989             (match_dup 1)
10990             (parallel [(const_int 3)
10991                        (const_int 7)]))))))]
10992   "TARGET_XOP"
10993   "vphadduwq\t{%1, %0|%0, %1}"
10994   [(set_attr "type" "sseiadd1")])
10996 (define_insn "xop_phaddudq"
10997   [(set (match_operand:V2DI 0 "register_operand" "=x")
10998         (plus:V2DI
10999          (zero_extend:V2DI
11000           (vec_select:V2SI
11001            (match_operand:V4SI 1 "nonimmediate_operand" "xm")
11002            (parallel [(const_int 0)
11003                       (const_int 2)])))
11004          (zero_extend:V2DI
11005           (vec_select:V2SI
11006            (match_dup 1)
11007            (parallel [(const_int 1)
11008                       (const_int 3)])))))]
11009   "TARGET_XOP"
11010   "vphaddudq\t{%1, %0|%0, %1}"
11011   [(set_attr "type" "sseiadd1")])
11013 (define_insn "xop_phsubbw"
11014   [(set (match_operand:V8HI 0 "register_operand" "=x")
11015         (minus:V8HI
11016          (sign_extend:V8HI
11017           (vec_select:V8QI
11018            (match_operand:V16QI 1 "nonimmediate_operand" "xm")
11019            (parallel [(const_int 0)
11020                       (const_int 2)
11021                       (const_int 4)
11022                       (const_int 6)
11023                       (const_int 8)
11024                       (const_int 10)
11025                       (const_int 12)
11026                       (const_int 14)])))
11027          (sign_extend:V8HI
11028           (vec_select:V8QI
11029            (match_dup 1)
11030            (parallel [(const_int 1)
11031                       (const_int 3)
11032                       (const_int 5)
11033                       (const_int 7)
11034                       (const_int 9)
11035                       (const_int 11)
11036                       (const_int 13)
11037                       (const_int 15)])))))]
11038   "TARGET_XOP"
11039   "vphsubbw\t{%1, %0|%0, %1}"
11040   [(set_attr "type" "sseiadd1")])
11042 (define_insn "xop_phsubwd"
11043   [(set (match_operand:V4SI 0 "register_operand" "=x")
11044         (minus:V4SI
11045          (sign_extend:V4SI
11046           (vec_select:V4HI
11047            (match_operand:V8HI 1 "nonimmediate_operand" "xm")
11048            (parallel [(const_int 0)
11049                       (const_int 2)
11050                       (const_int 4)
11051                       (const_int 6)])))
11052          (sign_extend:V4SI
11053           (vec_select:V4HI
11054            (match_dup 1)
11055            (parallel [(const_int 1)
11056                       (const_int 3)
11057                       (const_int 5)
11058                       (const_int 7)])))))]
11059   "TARGET_XOP"
11060   "vphsubwd\t{%1, %0|%0, %1}"
11061   [(set_attr "type" "sseiadd1")])
11063 (define_insn "xop_phsubdq"
11064   [(set (match_operand:V2DI 0 "register_operand" "=x")
11065         (minus:V2DI
11066          (sign_extend:V2DI
11067           (vec_select:V2SI
11068            (match_operand:V4SI 1 "nonimmediate_operand" "xm")
11069            (parallel [(const_int 0)
11070                       (const_int 2)])))
11071          (sign_extend:V2DI
11072           (vec_select:V2SI
11073            (match_dup 1)
11074            (parallel [(const_int 1)
11075                       (const_int 3)])))))]
11076   "TARGET_XOP"
11077   "vphsubdq\t{%1, %0|%0, %1}"
11078   [(set_attr "type" "sseiadd1")])
11080 ;; XOP permute instructions
11081 (define_insn "xop_pperm"
11082   [(set (match_operand:V16QI 0 "register_operand" "=x,x")
11083         (unspec:V16QI
11084           [(match_operand:V16QI 1 "register_operand" "x,x")
11085            (match_operand:V16QI 2 "nonimmediate_operand" "x,m")
11086            (match_operand:V16QI 3 "nonimmediate_operand" "xm,x")]
11087           UNSPEC_XOP_PERMUTE))]
11088   "TARGET_XOP && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
11089   "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
11090   [(set_attr "type" "sse4arg")
11091    (set_attr "mode" "TI")])
11093 ;; XOP pack instructions that combine two vectors into a smaller vector
11094 (define_insn "xop_pperm_pack_v2di_v4si"
11095   [(set (match_operand:V4SI 0 "register_operand" "=x,x")
11096         (vec_concat:V4SI
11097          (truncate:V2SI
11098           (match_operand:V2DI 1 "register_operand" "x,x"))
11099          (truncate:V2SI
11100           (match_operand:V2DI 2 "nonimmediate_operand" "x,m"))))
11101    (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x"))]
11102   "TARGET_XOP && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
11103   "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
11104   [(set_attr "type" "sse4arg")
11105    (set_attr "mode" "TI")])
11107 (define_insn "xop_pperm_pack_v4si_v8hi"
11108   [(set (match_operand:V8HI 0 "register_operand" "=x,x")
11109         (vec_concat:V8HI
11110          (truncate:V4HI
11111           (match_operand:V4SI 1 "register_operand" "x,x"))
11112          (truncate:V4HI
11113           (match_operand:V4SI 2 "nonimmediate_operand" "x,m"))))
11114    (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x"))]
11115   "TARGET_XOP && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
11116   "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
11117   [(set_attr "type" "sse4arg")
11118    (set_attr "mode" "TI")])
11120 (define_insn "xop_pperm_pack_v8hi_v16qi"
11121   [(set (match_operand:V16QI 0 "register_operand" "=x,x")
11122         (vec_concat:V16QI
11123          (truncate:V8QI
11124           (match_operand:V8HI 1 "register_operand" "x,x"))
11125          (truncate:V8QI
11126           (match_operand:V8HI 2 "nonimmediate_operand" "x,m"))))
11127    (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x"))]
11128   "TARGET_XOP && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
11129   "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
11130   [(set_attr "type" "sse4arg")
11131    (set_attr "mode" "TI")])
11133 ;; XOP packed rotate instructions
11134 (define_expand "rotl<mode>3"
11135   [(set (match_operand:SSEMODE1248 0 "register_operand" "")
11136         (rotate:SSEMODE1248
11137          (match_operand:SSEMODE1248 1 "nonimmediate_operand" "")
11138          (match_operand:SI 2 "general_operand")))]
11139   "TARGET_XOP"
11141   /* If we were given a scalar, convert it to parallel */
11142   if (! const_0_to_<sserotatemax>_operand (operands[2], SImode))
11143     {
11144       rtvec vs = rtvec_alloc (<ssescalarnum>);
11145       rtx par = gen_rtx_PARALLEL (<MODE>mode, vs);
11146       rtx reg = gen_reg_rtx (<MODE>mode);
11147       rtx op2 = operands[2];
11148       int i;
11150       if (GET_MODE (op2) != <ssescalarmode>mode)
11151         {
11152           op2 = gen_reg_rtx (<ssescalarmode>mode);
11153           convert_move (op2, operands[2], false);
11154         }
11156       for (i = 0; i < <ssescalarnum>; i++)
11157         RTVEC_ELT (vs, i) = op2;
11159       emit_insn (gen_vec_init<mode> (reg, par));
11160       emit_insn (gen_xop_vrotl<mode>3 (operands[0], operands[1], reg));
11161       DONE;
11162     }
11165 (define_expand "rotr<mode>3"
11166   [(set (match_operand:SSEMODE1248 0 "register_operand" "")
11167         (rotatert:SSEMODE1248
11168          (match_operand:SSEMODE1248 1 "nonimmediate_operand" "")
11169          (match_operand:SI 2 "general_operand")))]
11170   "TARGET_XOP"
11172   /* If we were given a scalar, convert it to parallel */
11173   if (! const_0_to_<sserotatemax>_operand (operands[2], SImode))
11174     {
11175       rtvec vs = rtvec_alloc (<ssescalarnum>);
11176       rtx par = gen_rtx_PARALLEL (<MODE>mode, vs);
11177       rtx neg = gen_reg_rtx (<MODE>mode);
11178       rtx reg = gen_reg_rtx (<MODE>mode);
11179       rtx op2 = operands[2];
11180       int i;
11182       if (GET_MODE (op2) != <ssescalarmode>mode)
11183         {
11184           op2 = gen_reg_rtx (<ssescalarmode>mode);
11185           convert_move (op2, operands[2], false);
11186         }
11188       for (i = 0; i < <ssescalarnum>; i++)
11189         RTVEC_ELT (vs, i) = op2;
11191       emit_insn (gen_vec_init<mode> (reg, par));
11192       emit_insn (gen_neg<mode>2 (neg, reg));
11193       emit_insn (gen_xop_vrotl<mode>3 (operands[0], operands[1], neg));
11194       DONE;
11195     }
11198 (define_insn "xop_rotl<mode>3"
11199   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x")
11200         (rotate:SSEMODE1248
11201          (match_operand:SSEMODE1248 1 "nonimmediate_operand" "xm")
11202          (match_operand:SI 2 "const_0_to_<sserotatemax>_operand" "n")))]
11203   "TARGET_XOP"
11204   "vprot<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
11205   [(set_attr "type" "sseishft")
11206    (set_attr "length_immediate" "1")
11207    (set_attr "mode" "TI")])
11209 (define_insn "xop_rotr<mode>3"
11210   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x")
11211         (rotatert:SSEMODE1248
11212          (match_operand:SSEMODE1248 1 "nonimmediate_operand" "xm")
11213          (match_operand:SI 2 "const_0_to_<sserotatemax>_operand" "n")))]
11214   "TARGET_XOP"
11216   operands[3] = GEN_INT ((<ssescalarnum> * 8) - INTVAL (operands[2]));
11217   return \"vprot<ssevecsize>\t{%3, %1, %0|%0, %1, %3}\";
11219   [(set_attr "type" "sseishft")
11220    (set_attr "length_immediate" "1")
11221    (set_attr "mode" "TI")])
11223 (define_expand "vrotr<mode>3"
11224   [(match_operand:SSEMODE1248 0 "register_operand" "")
11225    (match_operand:SSEMODE1248 1 "register_operand" "")
11226    (match_operand:SSEMODE1248 2 "register_operand" "")]
11227   "TARGET_XOP"
11229   rtx reg = gen_reg_rtx (<MODE>mode);
11230   emit_insn (gen_neg<mode>2 (reg, operands[2]));
11231   emit_insn (gen_xop_vrotl<mode>3 (operands[0], operands[1], reg));
11232   DONE;
11235 (define_expand "vrotl<mode>3"
11236   [(match_operand:SSEMODE1248 0 "register_operand" "")
11237    (match_operand:SSEMODE1248 1 "register_operand" "")
11238    (match_operand:SSEMODE1248 2 "register_operand" "")]
11239   "TARGET_XOP"
11241   emit_insn (gen_xop_vrotl<mode>3 (operands[0], operands[1], operands[2]));
11242   DONE;
11245 (define_insn "xop_vrotl<mode>3"
11246   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x,x")
11247         (if_then_else:SSEMODE1248
11248          (ge:SSEMODE1248
11249           (match_operand:SSEMODE1248 2 "nonimmediate_operand" "x,m")
11250           (const_int 0))
11251          (rotate:SSEMODE1248
11252           (match_operand:SSEMODE1248 1 "nonimmediate_operand" "xm,x")
11253           (match_dup 2))
11254          (rotatert:SSEMODE1248
11255           (match_dup 1)
11256           (neg:SSEMODE1248 (match_dup 2)))))]
11257   "TARGET_XOP && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11258   "vprot<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
11259   [(set_attr "type" "sseishft")
11260    (set_attr "prefix_data16" "0")
11261    (set_attr "prefix_extra" "2")
11262    (set_attr "mode" "TI")])
11264 ;; XOP packed shift instructions.
11265 ;; FIXME: add V2DI back in
11266 (define_expand "vlshr<mode>3"
11267   [(match_operand:SSEMODE124 0 "register_operand" "")
11268    (match_operand:SSEMODE124 1 "register_operand" "")
11269    (match_operand:SSEMODE124 2 "register_operand" "")]
11270   "TARGET_XOP"
11272   rtx neg = gen_reg_rtx (<MODE>mode);
11273   emit_insn (gen_neg<mode>2 (neg, operands[2]));
11274   emit_insn (gen_xop_lshl<mode>3 (operands[0], operands[1], neg));
11275   DONE;
11278 (define_expand "vashr<mode>3"
11279   [(match_operand:SSEMODE124 0 "register_operand" "")
11280    (match_operand:SSEMODE124 1 "register_operand" "")
11281    (match_operand:SSEMODE124 2 "register_operand" "")]
11282   "TARGET_XOP"
11284   rtx neg = gen_reg_rtx (<MODE>mode);
11285   emit_insn (gen_neg<mode>2 (neg, operands[2]));
11286   emit_insn (gen_xop_ashl<mode>3 (operands[0], operands[1], neg));
11287   DONE;
11290 (define_expand "vashl<mode>3"
11291   [(match_operand:SSEMODE124 0 "register_operand" "")
11292    (match_operand:SSEMODE124 1 "register_operand" "")
11293    (match_operand:SSEMODE124 2 "register_operand" "")]
11294   "TARGET_XOP"
11296   emit_insn (gen_xop_ashl<mode>3 (operands[0], operands[1], operands[2]));
11297   DONE;
11300 (define_insn "xop_ashl<mode>3"
11301   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x,x")
11302         (if_then_else:SSEMODE1248
11303          (ge:SSEMODE1248
11304           (match_operand:SSEMODE1248 2 "nonimmediate_operand" "x,m")
11305           (const_int 0))
11306          (ashift:SSEMODE1248
11307           (match_operand:SSEMODE1248 1 "nonimmediate_operand" "xm,x")
11308           (match_dup 2))
11309          (ashiftrt:SSEMODE1248
11310           (match_dup 1)
11311           (neg:SSEMODE1248 (match_dup 2)))))]
11312   "TARGET_XOP && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11313   "vpsha<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
11314   [(set_attr "type" "sseishft")
11315    (set_attr "prefix_data16" "0")
11316    (set_attr "prefix_extra" "2")
11317    (set_attr "mode" "TI")])
11319 (define_insn "xop_lshl<mode>3"
11320   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x,x")
11321         (if_then_else:SSEMODE1248
11322          (ge:SSEMODE1248
11323           (match_operand:SSEMODE1248 2 "nonimmediate_operand" "x,m")
11324           (const_int 0))
11325          (ashift:SSEMODE1248
11326           (match_operand:SSEMODE1248 1 "nonimmediate_operand" "xm,x")
11327           (match_dup 2))
11328          (lshiftrt:SSEMODE1248
11329           (match_dup 1)
11330           (neg:SSEMODE1248 (match_dup 2)))))]
11331   "TARGET_XOP && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11332   "vpshl<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
11333   [(set_attr "type" "sseishft")
11334    (set_attr "prefix_data16" "0")
11335    (set_attr "prefix_extra" "2")
11336    (set_attr "mode" "TI")])
11338 ;; SSE2 doesn't have some shift varients, so define versions for XOP
11339 (define_expand "ashlv16qi3"
11340   [(match_operand:V16QI 0 "register_operand" "")
11341    (match_operand:V16QI 1 "register_operand" "")
11342    (match_operand:SI 2 "nonmemory_operand" "")]
11343   "TARGET_XOP"
11345   rtvec vs = rtvec_alloc (16);
11346   rtx par = gen_rtx_PARALLEL (V16QImode, vs);
11347   rtx reg = gen_reg_rtx (V16QImode);
11348   int i;
11349   for (i = 0; i < 16; i++)
11350     RTVEC_ELT (vs, i) = operands[2];
11352   emit_insn (gen_vec_initv16qi (reg, par));
11353   emit_insn (gen_xop_ashlv16qi3 (operands[0], operands[1], reg));
11354   DONE;
11357 (define_expand "lshlv16qi3"
11358   [(match_operand:V16QI 0 "register_operand" "")
11359    (match_operand:V16QI 1 "register_operand" "")
11360    (match_operand:SI 2 "nonmemory_operand" "")]
11361   "TARGET_XOP"
11363   rtvec vs = rtvec_alloc (16);
11364   rtx par = gen_rtx_PARALLEL (V16QImode, vs);
11365   rtx reg = gen_reg_rtx (V16QImode);
11366   int i;
11367   for (i = 0; i < 16; i++)
11368     RTVEC_ELT (vs, i) = operands[2];
11370   emit_insn (gen_vec_initv16qi (reg, par));
11371   emit_insn (gen_xop_lshlv16qi3 (operands[0], operands[1], reg));
11372   DONE;
11375 (define_expand "ashrv16qi3"
11376   [(match_operand:V16QI 0 "register_operand" "")
11377    (match_operand:V16QI 1 "register_operand" "")
11378    (match_operand:SI 2 "nonmemory_operand" "")]
11379   "TARGET_XOP"
11381   rtvec vs = rtvec_alloc (16);
11382   rtx par = gen_rtx_PARALLEL (V16QImode, vs);
11383   rtx reg = gen_reg_rtx (V16QImode);
11384   int i;
11385   rtx ele = ((CONST_INT_P (operands[2]))
11386              ? GEN_INT (- INTVAL (operands[2]))
11387              : operands[2]);
11389   for (i = 0; i < 16; i++)
11390     RTVEC_ELT (vs, i) = ele;
11392   emit_insn (gen_vec_initv16qi (reg, par));
11394   if (!CONST_INT_P (operands[2]))
11395     {
11396       rtx neg = gen_reg_rtx (V16QImode);
11397       emit_insn (gen_negv16qi2 (neg, reg));
11398       emit_insn (gen_xop_ashlv16qi3 (operands[0], operands[1], neg));
11399     }
11400   else
11401     emit_insn (gen_xop_ashlv16qi3 (operands[0], operands[1], reg));
11403   DONE;
11406 (define_expand "ashrv2di3"
11407   [(match_operand:V2DI 0 "register_operand" "")
11408    (match_operand:V2DI 1 "register_operand" "")
11409    (match_operand:DI 2 "nonmemory_operand" "")]
11410   "TARGET_XOP"
11412   rtvec vs = rtvec_alloc (2);
11413   rtx par = gen_rtx_PARALLEL (V2DImode, vs);
11414   rtx reg = gen_reg_rtx (V2DImode);
11415   rtx ele;
11417   if (CONST_INT_P (operands[2]))
11418     ele = GEN_INT (- INTVAL (operands[2]));
11419   else if (GET_MODE (operands[2]) != DImode)
11420     {
11421       rtx move = gen_reg_rtx (DImode);
11422       ele = gen_reg_rtx (DImode);
11423       convert_move (move, operands[2], false);
11424       emit_insn (gen_negdi2 (ele, move));
11425     }
11426   else
11427     {
11428       ele = gen_reg_rtx (DImode);
11429       emit_insn (gen_negdi2 (ele, operands[2]));
11430     }
11432   RTVEC_ELT (vs, 0) = ele;
11433   RTVEC_ELT (vs, 1) = ele;
11434   emit_insn (gen_vec_initv2di (reg, par));
11435   emit_insn (gen_xop_ashlv2di3 (operands[0], operands[1], reg));
11436   DONE;
11439 ;; XOP FRCZ support
11440 ;; parallel insns
11441 (define_insn "xop_frcz<mode>2"
11442   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
11443         (unspec:SSEMODEF2P
11444          [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "xm")]
11445          UNSPEC_FRCZ))]
11446   "TARGET_XOP"
11447   "vfrcz<ssemodesuffixf4>\t{%1, %0|%0, %1}"
11448   [(set_attr "type" "ssecvt1")
11449    (set_attr "mode" "<MODE>")])
11451 ;; scalar insns
11452 (define_insn "xop_vmfrcz<mode>2"
11453   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
11454         (vec_merge:SSEMODEF2P
11455           (unspec:SSEMODEF2P
11456            [(match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")]
11457            UNSPEC_FRCZ)
11458           (match_operand:SSEMODEF2P 1 "register_operand" "0")
11459           (const_int 1)))]
11460   "TARGET_XOP"
11461   "vfrcz<ssemodesuffixf2s>\t{%2, %0|%0, %2}"
11462   [(set_attr "type" "ssecvt1")
11463    (set_attr "mode" "<MODE>")])
11465 (define_insn "xop_frcz<mode>2256"
11466   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x")
11467         (unspec:FMA4MODEF4
11468          [(match_operand:FMA4MODEF4 1 "nonimmediate_operand" "xm")]
11469          UNSPEC_FRCZ))]
11470   "TARGET_XOP"
11471   "vfrcz<fma4modesuffixf4>\t{%1, %0|%0, %1}"
11472   [(set_attr "type" "ssecvt1")
11473    (set_attr "mode" "<MODE>")])
11475 (define_insn "xop_maskcmp<mode>3"
11476   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x")
11477         (match_operator:SSEMODE1248 1 "ix86_comparison_int_operator"
11478          [(match_operand:SSEMODE1248 2 "register_operand" "x")
11479           (match_operand:SSEMODE1248 3 "nonimmediate_operand" "xm")]))]
11480   "TARGET_XOP"
11481   "vpcom%Y1<ssevecsize>\t{%3, %2, %0|%0, %2, %3}"
11482   [(set_attr "type" "sse4arg")
11483    (set_attr "prefix_data16" "0")
11484    (set_attr "prefix_rep" "0")
11485    (set_attr "prefix_extra" "2")
11486    (set_attr "length_immediate" "1")
11487    (set_attr "mode" "TI")])
11489 (define_insn "xop_maskcmp_uns<mode>3"
11490   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x")
11491         (match_operator:SSEMODE1248 1 "ix86_comparison_uns_operator"
11492          [(match_operand:SSEMODE1248 2 "register_operand" "x")
11493           (match_operand:SSEMODE1248 3 "nonimmediate_operand" "xm")]))]
11494   "TARGET_XOP"
11495   "vpcom%Y1u<ssevecsize>\t{%3, %2, %0|%0, %2, %3}"
11496   [(set_attr "type" "ssecmp")
11497    (set_attr "prefix_data16" "0")
11498    (set_attr "prefix_rep" "0")
11499    (set_attr "prefix_extra" "2")
11500    (set_attr "length_immediate" "1")
11501    (set_attr "mode" "TI")])
11503 ;; Version of pcom*u* that is called from the intrinsics that allows pcomequ*
11504 ;; and pcomneu* not to be converted to the signed ones in case somebody needs
11505 ;; the exact instruction generated for the intrinsic.
11506 (define_insn "xop_maskcmp_uns2<mode>3"
11507   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x")
11508         (unspec:SSEMODE1248
11509          [(match_operator:SSEMODE1248 1 "ix86_comparison_uns_operator"
11510           [(match_operand:SSEMODE1248 2 "register_operand" "x")
11511            (match_operand:SSEMODE1248 3 "nonimmediate_operand" "xm")])]
11512          UNSPEC_XOP_UNSIGNED_CMP))]
11513   "TARGET_XOP"
11514   "vpcom%Y1u<ssevecsize>\t{%3, %2, %0|%0, %2, %3}"
11515   [(set_attr "type" "ssecmp")
11516    (set_attr "prefix_data16" "0")
11517    (set_attr "prefix_extra" "2")
11518    (set_attr "length_immediate" "1")
11519    (set_attr "mode" "TI")])
11521 ;; Pcomtrue and pcomfalse support.  These are useless instructions, but are
11522 ;; being added here to be complete.
11523 (define_insn "xop_pcom_tf<mode>3"
11524   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x")
11525         (unspec:SSEMODE1248
11526           [(match_operand:SSEMODE1248 1 "register_operand" "x")
11527            (match_operand:SSEMODE1248 2 "nonimmediate_operand" "xm")
11528            (match_operand:SI 3 "const_int_operand" "n")]
11529           UNSPEC_XOP_TRUEFALSE))]
11530   "TARGET_XOP"
11532   return ((INTVAL (operands[3]) != 0)
11533           ? "vpcomtrue<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
11534           : "vpcomfalse<ssevecsize>\t{%2, %1, %0|%0, %1, %2}");
11536   [(set_attr "type" "ssecmp")
11537    (set_attr "prefix_data16" "0")
11538    (set_attr "prefix_extra" "2")
11539    (set_attr "length_immediate" "1")
11540    (set_attr "mode" "TI")])
11542 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11543 (define_insn "*avx_aesenc"
11544   [(set (match_operand:V2DI 0 "register_operand" "=x")
11545         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "x")
11546                        (match_operand:V2DI 2 "nonimmediate_operand" "xm")]
11547                       UNSPEC_AESENC))]
11548   "TARGET_AES && TARGET_AVX"
11549   "vaesenc\t{%2, %1, %0|%0, %1, %2}"
11550   [(set_attr "type" "sselog1")
11551    (set_attr "prefix_extra" "1")
11552    (set_attr "prefix" "vex")
11553    (set_attr "mode" "TI")])
11555 (define_insn "aesenc"
11556   [(set (match_operand:V2DI 0 "register_operand" "=x")
11557         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
11558                        (match_operand:V2DI 2 "nonimmediate_operand" "xm")]
11559                       UNSPEC_AESENC))]
11560   "TARGET_AES"
11561   "aesenc\t{%2, %0|%0, %2}"
11562   [(set_attr "type" "sselog1")
11563    (set_attr "prefix_extra" "1")
11564    (set_attr "mode" "TI")])
11566 (define_insn "*avx_aesenclast"
11567   [(set (match_operand:V2DI 0 "register_operand" "=x")
11568         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "x")
11569                        (match_operand:V2DI 2 "nonimmediate_operand" "xm")]
11570                       UNSPEC_AESENCLAST))]
11571   "TARGET_AES && TARGET_AVX"
11572   "vaesenclast\t{%2, %1, %0|%0, %1, %2}"
11573   [(set_attr "type" "sselog1")
11574    (set_attr "prefix_extra" "1")
11575    (set_attr "prefix" "vex")
11576    (set_attr "mode" "TI")])
11578 (define_insn "aesenclast"
11579   [(set (match_operand:V2DI 0 "register_operand" "=x")
11580         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
11581                        (match_operand:V2DI 2 "nonimmediate_operand" "xm")]
11582                       UNSPEC_AESENCLAST))]
11583   "TARGET_AES"
11584   "aesenclast\t{%2, %0|%0, %2}"
11585   [(set_attr "type" "sselog1")
11586    (set_attr "prefix_extra" "1")
11587    (set_attr "mode" "TI")])
11589 (define_insn "*avx_aesdec"
11590   [(set (match_operand:V2DI 0 "register_operand" "=x")
11591         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "x")
11592                        (match_operand:V2DI 2 "nonimmediate_operand" "xm")]
11593                       UNSPEC_AESDEC))]
11594   "TARGET_AES && TARGET_AVX"
11595   "vaesdec\t{%2, %1, %0|%0, %1, %2}"
11596   [(set_attr "type" "sselog1")
11597    (set_attr "prefix_extra" "1")
11598    (set_attr "prefix" "vex")
11599    (set_attr "mode" "TI")])
11601 (define_insn "aesdec"
11602   [(set (match_operand:V2DI 0 "register_operand" "=x")
11603         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
11604                        (match_operand:V2DI 2 "nonimmediate_operand" "xm")]
11605                       UNSPEC_AESDEC))]
11606   "TARGET_AES"
11607   "aesdec\t{%2, %0|%0, %2}"
11608   [(set_attr "type" "sselog1")
11609    (set_attr "prefix_extra" "1")
11610    (set_attr "mode" "TI")])
11612 (define_insn "*avx_aesdeclast"
11613   [(set (match_operand:V2DI 0 "register_operand" "=x")
11614         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "x")
11615                        (match_operand:V2DI 2 "nonimmediate_operand" "xm")]
11616                       UNSPEC_AESDECLAST))]
11617   "TARGET_AES && TARGET_AVX"
11618   "vaesdeclast\t{%2, %1, %0|%0, %1, %2}"
11619   [(set_attr "type" "sselog1")
11620    (set_attr "prefix_extra" "1")
11621    (set_attr "prefix" "vex")
11622    (set_attr "mode" "TI")])
11624 (define_insn "aesdeclast"
11625   [(set (match_operand:V2DI 0 "register_operand" "=x")
11626         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
11627                        (match_operand:V2DI 2 "nonimmediate_operand" "xm")]
11628                       UNSPEC_AESDECLAST))]
11629   "TARGET_AES"
11630   "aesdeclast\t{%2, %0|%0, %2}"
11631   [(set_attr "type" "sselog1")
11632    (set_attr "prefix_extra" "1")
11633    (set_attr "mode" "TI")])
11635 (define_insn "aesimc"
11636   [(set (match_operand:V2DI 0 "register_operand" "=x")
11637         (unspec:V2DI [(match_operand:V2DI 1 "nonimmediate_operand" "xm")]
11638                       UNSPEC_AESIMC))]
11639   "TARGET_AES"
11640   "%vaesimc\t{%1, %0|%0, %1}"
11641   [(set_attr "type" "sselog1")
11642    (set_attr "prefix_extra" "1")
11643    (set_attr "prefix" "maybe_vex")
11644    (set_attr "mode" "TI")])
11646 (define_insn "aeskeygenassist"
11647   [(set (match_operand:V2DI 0 "register_operand" "=x")
11648         (unspec:V2DI [(match_operand:V2DI 1 "nonimmediate_operand" "xm")
11649                       (match_operand:SI 2 "const_0_to_255_operand" "n")]
11650                      UNSPEC_AESKEYGENASSIST))]
11651   "TARGET_AES"
11652   "%vaeskeygenassist\t{%2, %1, %0|%0, %1, %2}"
11653   [(set_attr "type" "sselog1")
11654    (set_attr "prefix_extra" "1")
11655    (set_attr "length_immediate" "1")
11656    (set_attr "prefix" "maybe_vex")
11657    (set_attr "mode" "TI")])
11659 (define_insn "*vpclmulqdq"
11660   [(set (match_operand:V2DI 0 "register_operand" "=x")
11661         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "x")
11662                       (match_operand:V2DI 2 "nonimmediate_operand" "xm")
11663                       (match_operand:SI 3 "const_0_to_255_operand" "n")]
11664                      UNSPEC_PCLMUL))]
11665   "TARGET_PCLMUL && TARGET_AVX"
11666   "vpclmulqdq\t{%3, %2, %1, %0|%0, %1, %2, %3}"
11667   [(set_attr "type" "sselog1")
11668    (set_attr "prefix_extra" "1")
11669    (set_attr "length_immediate" "1")
11670    (set_attr "prefix" "vex")
11671    (set_attr "mode" "TI")])
11673 (define_insn "pclmulqdq"
11674   [(set (match_operand:V2DI 0 "register_operand" "=x")
11675         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
11676                       (match_operand:V2DI 2 "nonimmediate_operand" "xm")
11677                       (match_operand:SI 3 "const_0_to_255_operand" "n")]
11678                      UNSPEC_PCLMUL))]
11679   "TARGET_PCLMUL"
11680   "pclmulqdq\t{%3, %2, %0|%0, %2, %3}"
11681   [(set_attr "type" "sselog1")
11682    (set_attr "prefix_extra" "1")
11683    (set_attr "length_immediate" "1")
11684    (set_attr "mode" "TI")])
11686 (define_expand "avx_vzeroall"
11687   [(match_par_dup 0 [(const_int 0)])]
11688   "TARGET_AVX"
11690   int nregs = TARGET_64BIT ? 16 : 8;
11691   int regno;
11693   operands[0] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nregs + 1));
11695   XVECEXP (operands[0], 0, 0)
11696     = gen_rtx_UNSPEC_VOLATILE (VOIDmode, gen_rtvec (1, const0_rtx),
11697                                UNSPECV_VZEROALL);
11699   for (regno = 0; regno < nregs; regno++)
11700     XVECEXP (operands[0], 0, regno + 1)
11701       = gen_rtx_SET (VOIDmode,
11702                      gen_rtx_REG (V8SImode, SSE_REGNO (regno)),
11703                      CONST0_RTX (V8SImode));
11706 (define_insn "*avx_vzeroall"
11707   [(match_parallel 0 "vzeroall_operation"
11708     [(unspec_volatile [(const_int 0)] UNSPECV_VZEROALL)])]
11709   "TARGET_AVX"
11710   "vzeroall"
11711   [(set_attr "type" "sse")
11712    (set_attr "modrm" "0")
11713    (set_attr "memory" "none")
11714    (set_attr "prefix" "vex")
11715    (set_attr "mode" "OI")])
11717 ;; vzeroupper clobbers the upper 128bits of AVX registers.
11718 (define_expand "avx_vzeroupper"
11719   [(match_par_dup 0 [(const_int 0)])]
11720   "TARGET_AVX"
11722   int nregs = TARGET_64BIT ? 16 : 8;
11723   int regno;
11725   operands[0] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nregs + 1));
11727   XVECEXP (operands[0], 0, 0)
11728     = gen_rtx_UNSPEC_VOLATILE (VOIDmode, gen_rtvec (1, const0_rtx),
11729                                UNSPECV_VZEROUPPER);
11731   for (regno = 0; regno < nregs; regno++)
11732     XVECEXP (operands[0], 0, regno + 1)
11733       = gen_rtx_CLOBBER (VOIDmode,
11734                          gen_rtx_REG (V8SImode, SSE_REGNO (regno)));
11737 (define_insn "*avx_vzeroupper"
11738   [(match_parallel 0 "vzeroupper_operation"
11739     [(unspec_volatile [(const_int 0)] UNSPECV_VZEROUPPER)])]
11740   "TARGET_AVX"
11741   "vzeroupper"
11742   [(set_attr "type" "sse")
11743    (set_attr "modrm" "0")
11744    (set_attr "memory" "none")
11745    (set_attr "prefix" "vex")
11746    (set_attr "mode" "OI")])
11748 (define_insn_and_split "vec_dup<mode>"
11749   [(set (match_operand:AVX256MODE24P 0 "register_operand" "=x,x")
11750         (vec_duplicate:AVX256MODE24P
11751           (match_operand:<avxscalarmode> 1 "nonimmediate_operand" "m,?x")))]
11752   "TARGET_AVX"
11753   "@
11754    vbroadcasts<avxmodesuffixf2c>\t{%1, %0|%0, %1}
11755    #"
11756   "&& reload_completed && REG_P (operands[1])"
11757   [(set (match_dup 2) (vec_duplicate:<avxhalfvecmode> (match_dup 1)))
11758    (set (match_dup 0) (vec_concat:AVX256MODE24P (match_dup 2) (match_dup 2)))]
11760   operands[2] = gen_rtx_REG (<avxhalfvecmode>mode, REGNO (operands[0]));
11762   [(set_attr "type" "ssemov")
11763    (set_attr "prefix_extra" "1")
11764    (set_attr "prefix" "vex")
11765    (set_attr "mode" "V8SF")])
11767 (define_insn "avx_vbroadcastf128_<mode>"
11768   [(set (match_operand:AVX256MODE 0 "register_operand" "=x,x,x")
11769         (vec_concat:AVX256MODE
11770           (match_operand:<avxhalfvecmode> 1 "nonimmediate_operand" "m,0,?x")
11771           (match_dup 1)))]
11772   "TARGET_AVX"
11773   "@
11774    vbroadcastf128\t{%1, %0|%0, %1}
11775    vinsertf128\t{$1, %1, %0, %0|%0, %0, %1, 1}
11776    vperm2f128\t{$0, %t1, %t1, %0|%0, %t1, %t1, 0}"
11777   [(set_attr "type" "ssemov,sselog1,sselog1")
11778    (set_attr "prefix_extra" "1")
11779    (set_attr "length_immediate" "0,1,1")
11780    (set_attr "prefix" "vex")
11781    (set_attr "mode" "V4SF,V8SF,V8SF")])
11783 ;; Recognize broadcast as a vec_select as produced by builtin_vec_perm.
11784 ;; If it so happens that the input is in memory, use vbroadcast.
11785 ;; Otherwise use vpermilp (and in the case of 256-bit modes, vperm2f128).
11786 (define_insn "*avx_vperm_broadcast_v4sf"
11787   [(set (match_operand:V4SF 0 "register_operand" "=x,x,x")
11788         (vec_select:V4SF
11789           (match_operand:V4SF 1 "nonimmediate_operand" "m,o,x")
11790           (match_parallel 2 "avx_vbroadcast_operand"
11791             [(match_operand 3 "const_int_operand" "C,n,n")])))]
11792   "TARGET_AVX"
11794   int elt = INTVAL (operands[3]);
11795   switch (which_alternative)
11796     {
11797     case 0:
11798     case 1:
11799       operands[1] = adjust_address_nv (operands[1], SFmode, elt * 4);
11800       return "vbroadcastss\t{%1, %0|%0, %1}";
11801     case 2:
11802       operands[2] = GEN_INT (elt * 0x55);
11803       return "vpermilps\t{%2, %1, %0|%0, %1, %2}";
11804     default:
11805       gcc_unreachable ();
11806     }
11808   [(set_attr "type" "ssemov,ssemov,sselog1")
11809    (set_attr "prefix_extra" "1")
11810    (set_attr "length_immediate" "0,0,1")
11811    (set_attr "prefix" "vex")
11812    (set_attr "mode" "SF,SF,V4SF")])
11814 (define_insn_and_split "*avx_vperm_broadcast_<mode>"
11815   [(set (match_operand:AVX256MODEF2P 0 "register_operand" "=x,x,x")
11816         (vec_select:AVX256MODEF2P
11817           (match_operand:AVX256MODEF2P 1 "nonimmediate_operand" "m,o,?x")
11818           (match_parallel 2 "avx_vbroadcast_operand"
11819             [(match_operand 3 "const_int_operand" "C,n,n")])))]
11820   "TARGET_AVX"
11821   "#"
11822   "&& reload_completed"
11823   [(set (match_dup 0) (vec_duplicate:AVX256MODEF2P (match_dup 1)))]
11825   rtx op0 = operands[0], op1 = operands[1];
11826   int elt = INTVAL (operands[3]);
11828   if (REG_P (op1))
11829     {
11830       int mask;
11832       /* Shuffle element we care about into all elements of the 128-bit lane.
11833          The other lane gets shuffled too, but we don't care.  */
11834       if (<MODE>mode == V4DFmode)
11835         mask = (elt & 1 ? 15 : 0);
11836       else
11837         mask = (elt & 3) * 0x55;
11838       emit_insn (gen_avx_vpermil<mode> (op0, op1, GEN_INT (mask)));
11840       /* Shuffle the lane we care about into both lanes of the dest.  */
11841       mask = (elt / (<ssescalarnum> / 2)) * 0x11;
11842       emit_insn (gen_avx_vperm2f128<mode>3 (op0, op0, op0, GEN_INT (mask)));
11843       DONE;
11844     }
11846   operands[1] = adjust_address_nv (op1, <avxscalarmode>mode,
11847                                    elt * GET_MODE_SIZE (<avxscalarmode>mode));
11850 (define_expand "avx_vpermil<mode>"
11851   [(set (match_operand:AVXMODEFDP 0 "register_operand" "")
11852         (vec_select:AVXMODEFDP
11853           (match_operand:AVXMODEFDP 1 "nonimmediate_operand" "")
11854           (match_operand:SI 2 "const_0_to_255_operand" "")))]
11855   "TARGET_AVX"
11857   int mask = INTVAL (operands[2]);
11858   rtx perm[<ssescalarnum>];
11860   perm[0] = GEN_INT (mask & 1);
11861   perm[1] = GEN_INT ((mask >> 1) & 1);
11862   if (<MODE>mode == V4DFmode)
11863     {
11864       perm[2] = GEN_INT (((mask >> 2) & 1) + 2);
11865       perm[3] = GEN_INT (((mask >> 3) & 1) + 2);
11866     }
11868   operands[2]
11869     = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (<ssescalarnum>, perm));
11872 (define_expand "avx_vpermil<mode>"
11873   [(set (match_operand:AVXMODEFSP 0 "register_operand" "")
11874         (vec_select:AVXMODEFSP
11875           (match_operand:AVXMODEFSP 1 "nonimmediate_operand" "")
11876           (match_operand:SI 2 "const_0_to_255_operand" "")))]
11877   "TARGET_AVX"
11879   int mask = INTVAL (operands[2]);
11880   rtx perm[<ssescalarnum>];
11882   perm[0] = GEN_INT (mask & 3);
11883   perm[1] = GEN_INT ((mask >> 2) & 3);
11884   perm[2] = GEN_INT ((mask >> 4) & 3);
11885   perm[3] = GEN_INT ((mask >> 6) & 3);
11886   if (<MODE>mode == V8SFmode)
11887     {
11888       perm[4] = GEN_INT ((mask & 3) + 4);
11889       perm[5] = GEN_INT (((mask >> 2) & 3) + 4);
11890       perm[6] = GEN_INT (((mask >> 4) & 3) + 4);
11891       perm[7] = GEN_INT (((mask >> 6) & 3) + 4);
11892     }
11894   operands[2]
11895     = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (<ssescalarnum>, perm));
11898 (define_insn "*avx_vpermilp<mode>"
11899   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
11900         (vec_select:AVXMODEF2P
11901           (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "xm")
11902           (match_parallel 2 "avx_vpermilp_<mode>_operand"
11903             [(match_operand 3 "const_int_operand" "")])))]
11904   "TARGET_AVX"
11906   int mask = avx_vpermilp_parallel (operands[2], <MODE>mode) - 1;
11907   operands[2] = GEN_INT (mask);
11908   return "vpermilp<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}";
11910   [(set_attr "type" "sselog")
11911    (set_attr "prefix_extra" "1")
11912    (set_attr "length_immediate" "1")
11913    (set_attr "prefix" "vex")
11914    (set_attr "mode" "<MODE>")])
11916 (define_insn "avx_vpermilvar<mode>3"
11917   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
11918         (unspec:AVXMODEF2P
11919           [(match_operand:AVXMODEF2P 1 "register_operand" "x")
11920            (match_operand:<avxpermvecmode> 2 "nonimmediate_operand" "xm")]
11921           UNSPEC_VPERMIL))]
11922   "TARGET_AVX"
11923   "vpermilp<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
11924   [(set_attr "type" "sselog")
11925    (set_attr "prefix_extra" "1")
11926    (set_attr "prefix" "vex")
11927    (set_attr "mode" "<MODE>")])
11929 (define_expand "avx_vperm2f128<mode>3"
11930   [(set (match_operand:AVX256MODE2P 0 "register_operand" "")
11931         (unspec:AVX256MODE2P
11932           [(match_operand:AVX256MODE2P 1 "register_operand" "")
11933            (match_operand:AVX256MODE2P 2 "nonimmediate_operand" "")
11934            (match_operand:SI 3 "const_0_to_255_operand" "")]
11935           UNSPEC_VPERMIL2F128))]
11936   "TARGET_AVX"
11938   int mask = INTVAL (operands[2]);
11939   if ((mask & 0x88) == 0)
11940     {
11941       rtx perm[<ssescalarnum>], t1, t2;
11942       int i, base, nelt = <ssescalarnum>, nelt2 = nelt / 2;
11944       base = (mask & 3) * nelt2;
11945       for (i = 0; i < nelt2; ++i)
11946         perm[i] = GEN_INT (base + i);
11948       base = ((mask >> 4) & 3) * nelt2;
11949       for (i = 0; i < nelt2; ++i)
11950         perm[i + nelt2] = GEN_INT (base + i);
11952       t2 = gen_rtx_VEC_CONCAT (<ssedoublesizemode>mode,
11953                                operands[1], operands[2]);
11954       t1 = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelt, perm));
11955       t2 = gen_rtx_VEC_SELECT (<MODE>mode, t2, t1);
11956       t2 = gen_rtx_SET (VOIDmode, operands[0], t2);
11957       emit_insn (t2);
11958       DONE;
11959     }
11962 ;; Note that bits 7 and 3 of the imm8 allow lanes to be zeroed, which
11963 ;; means that in order to represent this properly in rtl we'd have to
11964 ;; nest *another* vec_concat with a zero operand and do the select from
11965 ;; a 4x wide vector.  That doesn't seem very nice.
11966 (define_insn "*avx_vperm2f128<mode>_full"
11967   [(set (match_operand:AVX256MODE2P 0 "register_operand" "=x")
11968         (unspec:AVX256MODE2P
11969           [(match_operand:AVX256MODE2P 1 "register_operand" "x")
11970            (match_operand:AVX256MODE2P 2 "nonimmediate_operand" "xm")
11971            (match_operand:SI 3 "const_0_to_255_operand" "n")]
11972           UNSPEC_VPERMIL2F128))]
11973   "TARGET_AVX"
11974   "vperm2f128\t{%3, %2, %1, %0|%0, %1, %2, %3}"
11975   [(set_attr "type" "sselog")
11976    (set_attr "prefix_extra" "1")
11977    (set_attr "length_immediate" "1")
11978    (set_attr "prefix" "vex")
11979    (set_attr "mode" "V8SF")])
11981 (define_insn "*avx_vperm2f128<mode>_nozero"
11982   [(set (match_operand:AVX256MODE2P 0 "register_operand" "=x")
11983         (vec_select:AVX256MODE2P
11984           (vec_concat:<ssedoublesizemode>
11985             (match_operand:AVX256MODE2P 1 "register_operand" "x")
11986             (match_operand:AVX256MODE2P 2 "nonimmediate_operand" "xm"))
11987           (match_parallel 3 "avx_vperm2f128_<mode>_operand"
11988             [(match_operand 4 "const_int_operand" "")])))]
11989   "TARGET_AVX"
11991   int mask = avx_vperm2f128_parallel (operands[3], <MODE>mode) - 1;
11992   operands[3] = GEN_INT (mask);
11993   return "vperm2f128\t{%3, %2, %1, %0|%0, %1, %2, %3}";
11995   [(set_attr "type" "sselog")
11996    (set_attr "prefix_extra" "1")
11997    (set_attr "length_immediate" "1")
11998    (set_attr "prefix" "vex")
11999    (set_attr "mode" "V8SF")])
12001 (define_expand "avx_vinsertf128<mode>"
12002   [(match_operand:AVX256MODE 0 "register_operand" "")
12003    (match_operand:AVX256MODE 1 "register_operand" "")
12004    (match_operand:<avxhalfvecmode> 2 "nonimmediate_operand" "")
12005    (match_operand:SI 3 "const_0_to_1_operand" "")]
12006   "TARGET_AVX"
12008   switch (INTVAL (operands[3]))
12009     {
12010     case 0:
12011       emit_insn (gen_vec_set_lo_<mode> (operands[0], operands[1],
12012                                         operands[2]));
12013       break;
12014     case 1:
12015       emit_insn (gen_vec_set_hi_<mode> (operands[0], operands[1],
12016                                         operands[2]));
12017       break;
12018     default:
12019       gcc_unreachable ();
12020     }
12021   DONE;
12024 (define_insn "vec_set_lo_<mode>"
12025   [(set (match_operand:AVX256MODE4P 0 "register_operand" "=x")
12026         (vec_concat:AVX256MODE4P
12027           (match_operand:<avxhalfvecmode> 2 "nonimmediate_operand" "xm")
12028           (vec_select:<avxhalfvecmode>
12029             (match_operand:AVX256MODE4P 1 "register_operand" "x")
12030             (parallel [(const_int 2) (const_int 3)]))))]
12031   "TARGET_AVX"
12032   "vinsertf128\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}"
12033   [(set_attr "type" "sselog")
12034    (set_attr "prefix_extra" "1")
12035    (set_attr "length_immediate" "1")
12036    (set_attr "prefix" "vex")
12037    (set_attr "mode" "V8SF")])
12039 (define_insn "vec_set_hi_<mode>"
12040   [(set (match_operand:AVX256MODE4P 0 "register_operand" "=x")
12041         (vec_concat:AVX256MODE4P
12042           (vec_select:<avxhalfvecmode>
12043             (match_operand:AVX256MODE4P 1 "register_operand" "x")
12044             (parallel [(const_int 0) (const_int 1)]))
12045           (match_operand:<avxhalfvecmode> 2 "nonimmediate_operand" "xm")))]
12046   "TARGET_AVX"
12047   "vinsertf128\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}"
12048   [(set_attr "type" "sselog")
12049    (set_attr "prefix_extra" "1")
12050    (set_attr "length_immediate" "1")
12051    (set_attr "prefix" "vex")
12052    (set_attr "mode" "V8SF")])
12054 (define_insn "vec_set_lo_<mode>"
12055   [(set (match_operand:AVX256MODE8P 0 "register_operand" "=x")
12056         (vec_concat:AVX256MODE8P
12057           (match_operand:<avxhalfvecmode> 2 "nonimmediate_operand" "xm")
12058           (vec_select:<avxhalfvecmode>
12059             (match_operand:AVX256MODE8P 1 "register_operand" "x")
12060             (parallel [(const_int 4) (const_int 5)
12061                        (const_int 6) (const_int 7)]))))]
12062   "TARGET_AVX"
12063   "vinsertf128\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}"
12064   [(set_attr "type" "sselog")
12065    (set_attr "prefix_extra" "1")
12066    (set_attr "length_immediate" "1")
12067    (set_attr "prefix" "vex")
12068    (set_attr "mode" "V8SF")])
12070 (define_insn "vec_set_hi_<mode>"
12071   [(set (match_operand:AVX256MODE8P 0 "register_operand" "=x")
12072         (vec_concat:AVX256MODE8P
12073           (vec_select:<avxhalfvecmode>
12074             (match_operand:AVX256MODE8P 1 "register_operand" "x")
12075             (parallel [(const_int 0) (const_int 1)
12076                        (const_int 2) (const_int 3)]))
12077           (match_operand:<avxhalfvecmode> 2 "nonimmediate_operand" "xm")))]
12078   "TARGET_AVX"
12079   "vinsertf128\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}"
12080   [(set_attr "type" "sselog")
12081    (set_attr "prefix_extra" "1")
12082    (set_attr "length_immediate" "1")
12083    (set_attr "prefix" "vex")
12084    (set_attr "mode" "V8SF")])
12086 (define_insn "vec_set_lo_v16hi"
12087   [(set (match_operand:V16HI 0 "register_operand" "=x")
12088         (vec_concat:V16HI
12089           (match_operand:V8HI 2 "nonimmediate_operand" "xm")
12090           (vec_select:V8HI
12091             (match_operand:V16HI 1 "register_operand" "x")
12092             (parallel [(const_int 8) (const_int 9)
12093                        (const_int 10) (const_int 11)
12094                        (const_int 12) (const_int 13)
12095                        (const_int 14) (const_int 15)]))))]
12096   "TARGET_AVX"
12097   "vinsertf128\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}"
12098   [(set_attr "type" "sselog")
12099    (set_attr "prefix_extra" "1")
12100    (set_attr "length_immediate" "1")
12101    (set_attr "prefix" "vex")
12102    (set_attr "mode" "V8SF")])
12104 (define_insn "vec_set_hi_v16hi"
12105   [(set (match_operand:V16HI 0 "register_operand" "=x")
12106         (vec_concat:V16HI
12107           (vec_select:V8HI
12108             (match_operand:V16HI 1 "register_operand" "x")
12109             (parallel [(const_int 0) (const_int 1)
12110                        (const_int 2) (const_int 3)
12111                        (const_int 4) (const_int 5)
12112                        (const_int 6) (const_int 7)]))
12113           (match_operand:V8HI 2 "nonimmediate_operand" "xm")))]
12114   "TARGET_AVX"
12115   "vinsertf128\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}"
12116   [(set_attr "type" "sselog")
12117    (set_attr "prefix_extra" "1")
12118    (set_attr "length_immediate" "1")
12119    (set_attr "prefix" "vex")
12120    (set_attr "mode" "V8SF")])
12122 (define_insn "vec_set_lo_v32qi"
12123   [(set (match_operand:V32QI 0 "register_operand" "=x")
12124         (vec_concat:V32QI
12125           (match_operand:V16QI 2 "nonimmediate_operand" "xm")
12126           (vec_select:V16QI
12127             (match_operand:V32QI 1 "register_operand" "x")
12128             (parallel [(const_int 16) (const_int 17)
12129                        (const_int 18) (const_int 19)
12130                        (const_int 20) (const_int 21)
12131                        (const_int 22) (const_int 23)
12132                        (const_int 24) (const_int 25)
12133                        (const_int 26) (const_int 27)
12134                        (const_int 28) (const_int 29)
12135                        (const_int 30) (const_int 31)]))))]
12136   "TARGET_AVX"
12137   "vinsertf128\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}"
12138   [(set_attr "type" "sselog")
12139    (set_attr "prefix_extra" "1")
12140    (set_attr "length_immediate" "1")
12141    (set_attr "prefix" "vex")
12142    (set_attr "mode" "V8SF")])
12144 (define_insn "vec_set_hi_v32qi"
12145   [(set (match_operand:V32QI 0 "register_operand" "=x")
12146         (vec_concat:V32QI
12147           (vec_select:V16QI
12148             (match_operand:V32QI 1 "register_operand" "x")
12149             (parallel [(const_int 0) (const_int 1)
12150                        (const_int 2) (const_int 3)
12151                        (const_int 4) (const_int 5)
12152                        (const_int 6) (const_int 7)
12153                        (const_int 8) (const_int 9)
12154                        (const_int 10) (const_int 11)
12155                        (const_int 12) (const_int 13)
12156                        (const_int 14) (const_int 15)]))
12157           (match_operand:V16QI 2 "nonimmediate_operand" "xm")))]
12158   "TARGET_AVX"
12159   "vinsertf128\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}"
12160   [(set_attr "type" "sselog")
12161    (set_attr "prefix_extra" "1")
12162    (set_attr "length_immediate" "1")
12163    (set_attr "prefix" "vex")
12164    (set_attr "mode" "V8SF")])
12166 (define_insn "avx_maskloadp<avxmodesuffixf2c><avxmodesuffix>"
12167   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
12168         (unspec:AVXMODEF2P
12169           [(match_operand:AVXMODEF2P 1 "memory_operand" "m")
12170            (match_operand:AVXMODEF2P 2 "register_operand" "x")
12171            (match_dup 0)]
12172           UNSPEC_MASKLOAD))]
12173   "TARGET_AVX"
12174   "vmaskmovp<avxmodesuffixf2c>\t{%1, %2, %0|%0, %2, %1}"
12175   [(set_attr "type" "sselog1")
12176    (set_attr "prefix_extra" "1")
12177    (set_attr "prefix" "vex")
12178    (set_attr "mode" "<MODE>")])
12180 (define_insn "avx_maskstorep<avxmodesuffixf2c><avxmodesuffix>"
12181   [(set (match_operand:AVXMODEF2P 0 "memory_operand" "=m")
12182         (unspec:AVXMODEF2P
12183           [(match_operand:AVXMODEF2P 1 "register_operand" "x")
12184            (match_operand:AVXMODEF2P 2 "register_operand" "x")
12185            (match_dup 0)]
12186           UNSPEC_MASKSTORE))]
12187   "TARGET_AVX"
12188   "vmaskmovp<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
12189   [(set_attr "type" "sselog1")
12190    (set_attr "prefix_extra" "1")
12191    (set_attr "prefix" "vex")
12192    (set_attr "mode" "<MODE>")])
12194 (define_insn "avx_<avxmodesuffixp><avxmodesuffix>_<avxmodesuffixp>"
12195   [(set (match_operand:AVX256MODE2P 0 "register_operand" "=x,x")
12196         (unspec:AVX256MODE2P
12197           [(match_operand:<avxhalfvecmode> 1 "nonimmediate_operand" "0,xm")]
12198           UNSPEC_CAST))]
12199   "TARGET_AVX"
12201   switch (which_alternative)
12202     {
12203     case 0:
12204       return "";
12205     case 1:
12206       switch (get_attr_mode (insn))
12207         {
12208         case MODE_V8SF:
12209           return "vmovaps\t{%1, %x0|%x0, %1}";
12210         case MODE_V4DF:
12211           return "vmovapd\t{%1, %x0|%x0, %1}";
12212         case MODE_OI:
12213           return "vmovdqa\t{%1, %x0|%x0, %1}";
12214         default:
12215           break;
12216         }
12217     default:
12218       break;
12219     }
12220   gcc_unreachable ();
12222   [(set_attr "type" "ssemov")
12223    (set_attr "prefix" "vex")
12224    (set_attr "mode" "<avxvecmode>")
12225    (set (attr "length")
12226     (if_then_else (eq_attr "alternative" "0")
12227        (const_string "0")
12228        (const_string "*")))])
12230 (define_insn "avx_<avxmodesuffixp>_<avxmodesuffixp><avxmodesuffix>"
12231   [(set (match_operand:<avxhalfvecmode> 0 "register_operand" "=x,x")
12232         (unspec:<avxhalfvecmode>
12233           [(match_operand:AVX256MODE2P 1 "nonimmediate_operand" "0,xm")]
12234           UNSPEC_CAST))]
12235   "TARGET_AVX"
12237   switch (which_alternative)
12238     {
12239     case 0:
12240       return "";
12241     case 1:
12242       switch (get_attr_mode (insn))
12243         {
12244         case MODE_V8SF:
12245           return "vmovaps\t{%x1, %0|%0, %x1}";
12246         case MODE_V4DF:
12247           return "vmovapd\t{%x1, %0|%0, %x1}";
12248         case MODE_OI:
12249           return "vmovdqa\t{%x1, %0|%0, %x1}";
12250         default:
12251           break;
12252         }
12253     default:
12254       break;
12255     }
12256   gcc_unreachable ();
12258   [(set_attr "type" "ssemov")
12259    (set_attr "prefix" "vex")
12260    (set_attr "mode" "<avxvecmode>")
12261    (set (attr "length")
12262     (if_then_else (eq_attr "alternative" "0")
12263        (const_string "0")
12264        (const_string "*")))])
12266 (define_expand "vec_init<mode>"
12267   [(match_operand:AVX256MODE 0 "register_operand" "")
12268    (match_operand 1 "" "")]
12269   "TARGET_AVX"
12271   ix86_expand_vector_init (false, operands[0], operands[1]);
12272   DONE;
12275 (define_insn "*vec_concat<mode>_avx"
12276   [(set (match_operand:AVX256MODE 0 "register_operand"   "=x,x")
12277         (vec_concat:AVX256MODE
12278           (match_operand:<avxhalfvecmode> 1 "register_operand" "x,x")
12279           (match_operand:<avxhalfvecmode> 2 "vector_move_operand" "xm,C")))]
12280   "TARGET_AVX"
12282   switch (which_alternative)
12283     {
12284     case 0:
12285       return "vinsertf128\t{$0x1, %2, %t1, %0|%0, %t1, %2, 0x1}";
12286     case 1:
12287       switch (get_attr_mode (insn))
12288         {
12289         case MODE_V8SF:
12290           return "vmovaps\t{%1, %x0|%x0, %1}";
12291         case MODE_V4DF:
12292           return "vmovapd\t{%1, %x0|%x0, %1}";
12293         default:
12294           return "vmovdqa\t{%1, %x0|%x0, %1}";
12295         }
12296     default:
12297       gcc_unreachable ();
12298     }
12300   [(set_attr "type" "sselog,ssemov")
12301    (set_attr "prefix_extra" "1,*")
12302    (set_attr "length_immediate" "1,*")
12303    (set_attr "prefix" "vex")
12304    (set_attr "mode" "<avxvecmode>")])