Merge from mainline (163495:164578).
[official-gcc/graphite-test-results.git] / gcc / config / i386 / sse.md
blob0a116aa8370d694a304ea740fef44ba1114292d1
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 ;; Instruction suffix for sign and zero extensions.
23 (define_code_attr extsuffix [(sign_extend "sx") (zero_extend "zx")])
25 ;; 16 byte integral modes handled by SSE
26 (define_mode_iterator SSEMODEI [V16QI V8HI V4SI V2DI])
28 ;; All 16-byte vector modes handled by SSE
29 (define_mode_iterator SSEMODE [V16QI V8HI V4SI V2DI V4SF V2DF])
30 (define_mode_iterator SSEMODE16 [V16QI V8HI V4SI V2DI V1TI V4SF V2DF])
32 ;; 32 byte integral vector modes handled by AVX
33 (define_mode_iterator AVX256MODEI [V32QI V16HI V8SI V4DI])
35 ;; All 32-byte vector modes handled by AVX
36 (define_mode_iterator AVX256MODE [V32QI V16HI V8SI V4DI V8SF V4DF])
38 ;; All QI vector modes handled by AVX
39 (define_mode_iterator AVXMODEQI [V32QI V16QI])
41 ;; All DI vector modes handled by AVX
42 (define_mode_iterator AVXMODEDI [V4DI V2DI])
44 ;; All vector modes handled by AVX
45 (define_mode_iterator AVXMODE
46   [V16QI V8HI V4SI V2DI V4SF V2DF V32QI V16HI V8SI V4DI V8SF V4DF])
47 (define_mode_iterator AVXMODE16
48   [V16QI V8HI V4SI V2DI V1TI V4SF V2DF V32QI V16HI V8SI V4DI V8SF V4DF])
50 ;; Mix-n-match
51 (define_mode_iterator SSEMODE12 [V16QI V8HI])
52 (define_mode_iterator SSEMODE24 [V8HI V4SI])
53 (define_mode_iterator SSEMODE14 [V16QI V4SI])
54 (define_mode_iterator SSEMODE124 [V16QI V8HI V4SI])
55 (define_mode_iterator SSEMODE248 [V8HI V4SI V2DI])
56 (define_mode_iterator SSEMODE1248 [V16QI V8HI V4SI V2DI])
57 (define_mode_iterator SSEMODEF4 [SF DF V4SF V2DF])
58 (define_mode_iterator FMA4MODEF4 [V8SF V4DF])
59 (define_mode_iterator SSEMODEF2P [V4SF V2DF])
61 (define_mode_iterator AVX256MODEF2P [V8SF V4DF])
62 (define_mode_iterator AVX256MODE2P [V8SI V8SF V4DF])
63 (define_mode_iterator AVX256MODE24P [V8SI V8SF V4DI V4DF])
64 (define_mode_iterator AVX256MODE4P [V4DI V4DF])
65 (define_mode_iterator AVX256MODE8P [V8SI V8SF])
66 (define_mode_iterator AVXMODEF2P [V4SF V2DF V8SF V4DF])
67 (define_mode_iterator AVXMODEF4P [V4SF V4DF])
68 (define_mode_iterator AVXMODEFDP [V2DF V4DF])
69 (define_mode_iterator AVXMODEFSP [V4SF V8SF])
70 (define_mode_iterator AVXMODEDCVTDQ2PS [V4SF V8SF])
71 (define_mode_iterator AVXMODEDCVTPS2DQ [V4SI V8SI])
73 ;; Int-float size matches
74 (define_mode_iterator SSEMODE4S [V4SF V4SI])
75 (define_mode_iterator SSEMODE2D [V2DF V2DI])
77 ;; Modes handled by integer vcond pattern
78 (define_mode_iterator SSEMODE124C8 [V16QI V8HI V4SI
79                                     (V2DI "TARGET_SSE4_2")])
81 ;; Modes handled by vec_extract_even/odd pattern.
82 (define_mode_iterator SSEMODE_EO
83   [(V4SF "TARGET_SSE")
84    (V2DF "TARGET_SSE2")
85    (V2DI "TARGET_SSE2") (V4SI "TARGET_SSE2")
86    (V8HI "TARGET_SSE2") (V16QI "TARGET_SSE2")
87    (V4DF "TARGET_AVX") (V8SF "TARGET_AVX")])
89 ;; Mapping from float mode to required SSE level
90 (define_mode_attr sse [(SF "sse") (DF "sse2") (V4SF "sse") (V2DF "sse2")])
92 ;; Mapping from integer vector mode to mnemonic suffix
93 (define_mode_attr ssevecsize [(V16QI "b") (V8HI "w") (V4SI "d") (V2DI "q")])
95 ;; Mapping of the insn mnemonic suffix
96 (define_mode_attr ssemodesuffix
97   [(SF "ss") (DF "sd") (V4SF "ps") (V2DF "pd") (V8SF "ps") (V4DF "pd")
98    (V8SI "ps") (V4DI "pd")])
99 (define_mode_attr ssescalarmodesuffix 
100   [(SF "ss") (DF "sd") (V4SF "ss") (V2DF "sd") (V8SF "ss") (V4DF "sd")
101    (V4SI "d")])
103 ;; Mapping of the max integer size for xop rotate immediate constraint
104 (define_mode_attr sserotatemax [(V16QI "7") (V8HI "15") (V4SI "31") (V2DI "63")])
106 ;; Mapping of vector modes back to the scalar modes
107 (define_mode_attr ssescalarmode [(V4SF "SF") (V2DF "DF")
108                                  (V16QI "QI") (V8HI "HI")
109                                  (V4SI "SI") (V2DI "DI")])
111 ;; Mapping of vector modes to a vector mode of double size
112 (define_mode_attr ssedoublesizemode
113   [(V2DF "V4DF") (V2DI "V4DI") (V4SF "V8SF") (V4SI "V8SI")
114    (V8HI "V16HI") (V16QI "V32QI")
115    (V4DF "V8DF") (V8SF "V16SF")
116    (V4DI "V8DI") (V8SI "V16SI") (V16HI "V32HI") (V32QI "V64QI")])
118 ;; Number of scalar elements in each vector type
119 (define_mode_attr ssescalarnum
120   [(V4SF "4") (V2DF "2") (V16QI "16") (V8HI "8") (V4SI "4") (V2DI "2")
121    (V8SF "8") (V4DF "4") (V32QI "32") (V16HI "16") (V8SI "8") (V4DI "4")])
123 ;; Mapping for AVX
124 (define_mode_attr avxvecmode
125   [(V16QI "TI") (V8HI "TI") (V4SI "TI") (V2DI "TI") (V1TI "TI")
126    (V4SF "V4SF") (V8SF "V8SF") (V2DF "V2DF") (V4DF "V4DF")
127    (V32QI "OI") (V16HI "OI") (V8SI "OI") (V4DI "OI")])
128 (define_mode_attr avxvecpsmode
129   [(V16QI "V4SF") (V8HI "V4SF") (V4SI "V4SF") (V2DI "V4SF")
130    (V32QI "V8SF") (V16HI "V8SF") (V8SI "V8SF") (V4DI "V8SF")])
131 (define_mode_attr avxhalfvecmode
132   [(V32QI "V16QI") (V16HI "V8HI") (V8SI "V4SI") (V4DI "V2DI")
133    (V8SF "V4SF") (V4DF "V2DF")
134    (V16QI  "V8QI") (V8HI  "V4HI") (V4SI "V2SI") (V4SF "V2SF")])
135 (define_mode_attr avxscalarmode
136   [(V16QI "QI") (V8HI  "HI") (V4SI "SI") (V2DI "DI") (V4SF "SF") (V2DF "DF")
137    (V32QI "QI") (V16HI "HI") (V8SI "SI") (V4DI "DI") (V8SF "SF") (V4DF "DF")])
138 (define_mode_attr avxcvtvecmode
139   [(V4SF "V4SI") (V8SF "V8SI") (V4SI "V4SF") (V8SI "V8SF")])
140 (define_mode_attr avxpermvecmode
141   [(V2DF "V2DI") (V4SF "V4SI") (V4DF "V4DI") (V8SF "V8SI")])
142 (define_mode_attr avxmodesuffixp
143  [(V2DF "pd") (V4SI "si") (V4SF "ps") (V8SF "ps") (V8SI "si")
144   (V4DF "pd")])
145 (define_mode_attr avxmodesuffix
146   [(V16QI "") (V32QI "256") (V4SI "") (V4SF "") (V2DF "")
147    (V8SI "256") (V8SF "256") (V4DF "256")])
149 ;; Mapping of immediate bits for blend instructions
150 (define_mode_attr blendbits
151   [(V8SF "255") (V4SF "15") (V4DF "15") (V2DF "3")])
153 ;; Mapping of immediate bits for pinsr instructions
154 (define_mode_attr pinsrbits [(V16QI "32768") (V8HI "128") (V4SI "8")])
156 ;; Patterns whose name begins with "sse{,2,3}_" are invoked by intrinsics.
158 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
160 ;; Move patterns
162 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
164 (define_expand "mov<mode>"
165   [(set (match_operand:AVX256MODE 0 "nonimmediate_operand" "")
166         (match_operand:AVX256MODE 1 "nonimmediate_operand" ""))]
167   "TARGET_AVX"
169   ix86_expand_vector_move (<MODE>mode, operands);
170   DONE;
173 (define_insn "*avx_mov<mode>_internal"
174   [(set (match_operand:AVXMODE16 0 "nonimmediate_operand" "=x,x ,m")
175         (match_operand:AVXMODE16 1 "nonimmediate_or_sse_const_operand"  "C ,xm,x"))]
176   "TARGET_AVX
177    && (register_operand (operands[0], <MODE>mode)
178        || register_operand (operands[1], <MODE>mode))"
180   switch (which_alternative)
181     {
182     case 0:
183       return standard_sse_constant_opcode (insn, operands[1]);
184     case 1:
185     case 2:
186       switch (get_attr_mode (insn))
187         {
188         case MODE_V8SF:
189         case MODE_V4SF:
190           return "vmovaps\t{%1, %0|%0, %1}";
191         case MODE_V4DF:
192         case MODE_V2DF:
193           if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
194             return "vmovaps\t{%1, %0|%0, %1}";
195           else
196             return "vmovapd\t{%1, %0|%0, %1}";
197         default:
198           if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
199             return "vmovaps\t{%1, %0|%0, %1}";
200           else
201             return "vmovdqa\t{%1, %0|%0, %1}";
202         }
203     default:
204       gcc_unreachable ();
205     }
207   [(set_attr "type" "sselog1,ssemov,ssemov")
208    (set_attr "prefix" "vex")
209    (set_attr "mode" "<avxvecmode>")])
211 ;; All of these patterns are enabled for SSE1 as well as SSE2.
212 ;; This is essential for maintaining stable calling conventions.
214 (define_expand "mov<mode>"
215   [(set (match_operand:SSEMODE16 0 "nonimmediate_operand" "")
216         (match_operand:SSEMODE16 1 "nonimmediate_operand" ""))]
217   "TARGET_SSE"
219   ix86_expand_vector_move (<MODE>mode, operands);
220   DONE;
223 (define_insn "*mov<mode>_internal"
224   [(set (match_operand:SSEMODE16 0 "nonimmediate_operand" "=x,x ,m")
225         (match_operand:SSEMODE16 1 "nonimmediate_or_sse_const_operand"  "C ,xm,x"))]
226   "TARGET_SSE
227    && (register_operand (operands[0], <MODE>mode)
228        || register_operand (operands[1], <MODE>mode))"
230   switch (which_alternative)
231     {
232     case 0:
233       return standard_sse_constant_opcode (insn, operands[1]);
234     case 1:
235     case 2:
236       switch (get_attr_mode (insn))
237         {
238         case MODE_V4SF:
239           return "movaps\t{%1, %0|%0, %1}";
240         case MODE_V2DF:
241           if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
242             return "movaps\t{%1, %0|%0, %1}";
243           else
244             return "movapd\t{%1, %0|%0, %1}";
245         default:
246           if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
247             return "movaps\t{%1, %0|%0, %1}";
248           else
249             return "movdqa\t{%1, %0|%0, %1}";
250         }
251     default:
252       gcc_unreachable ();
253     }
255   [(set_attr "type" "sselog1,ssemov,ssemov")
256    (set (attr "mode")
257         (cond [(ior (ior (ne (symbol_ref "optimize_function_for_size_p (cfun)") (const_int 0))
258                          (eq (symbol_ref "TARGET_SSE2") (const_int 0)))
259                     (and (eq_attr "alternative" "2")
260                          (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
261                              (const_int 0))))
262                  (const_string "V4SF")
263                (eq (const_string "<MODE>mode") (const_string "V4SFmode"))
264                  (const_string "V4SF")
265                (eq (const_string "<MODE>mode") (const_string "V2DFmode"))
266                  (const_string "V2DF")
267               ]
268           (const_string "TI")))])
270 ;; Move a DI from a 32-bit register pair (e.g. %edx:%eax) to an xmm.
271 ;; We'd rather avoid this entirely; if the 32-bit reg pair was loaded
272 ;; from memory, we'd prefer to load the memory directly into the %xmm
273 ;; register.  To facilitate this happy circumstance, this pattern won't
274 ;; split until after register allocation.  If the 64-bit value didn't
275 ;; come from memory, this is the best we can do.  This is much better
276 ;; than storing %edx:%eax into a stack temporary and loading an %xmm
277 ;; from there.
279 (define_insn_and_split "movdi_to_sse"
280   [(parallel
281     [(set (match_operand:V4SI 0 "register_operand" "=?x,x")
282           (subreg:V4SI (match_operand:DI 1 "nonimmediate_operand" "r,m") 0))
283      (clobber (match_scratch:V4SI 2 "=&x,X"))])]
284   "!TARGET_64BIT && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES"
285   "#"
286   "&& reload_completed"
287   [(const_int 0)]
289  if (register_operand (operands[1], DImode))
290    {
291       /* The DImode arrived in a pair of integral registers (e.g. %edx:%eax).
292          Assemble the 64-bit DImode value in an xmm register.  */
293       emit_insn (gen_sse2_loadld (operands[0], CONST0_RTX (V4SImode),
294                                   gen_rtx_SUBREG (SImode, operands[1], 0)));
295       emit_insn (gen_sse2_loadld (operands[2], CONST0_RTX (V4SImode),
296                                   gen_rtx_SUBREG (SImode, operands[1], 4)));
297       emit_insn (gen_vec_interleave_lowv4si (operands[0], operands[0],
298                                              operands[2]));
299     }
300  else if (memory_operand (operands[1], DImode))
301    emit_insn (gen_vec_concatv2di (gen_lowpart (V2DImode, operands[0]),
302                                   operands[1], const0_rtx));
303  else
304    gcc_unreachable ();
307 (define_split
308   [(set (match_operand:V4SF 0 "register_operand" "")
309         (match_operand:V4SF 1 "zero_extended_scalar_load_operand" ""))]
310   "TARGET_SSE && reload_completed"
311   [(set (match_dup 0)
312         (vec_merge:V4SF
313           (vec_duplicate:V4SF (match_dup 1))
314           (match_dup 2)
315           (const_int 1)))]
317   operands[1] = simplify_gen_subreg (SFmode, operands[1], V4SFmode, 0);
318   operands[2] = CONST0_RTX (V4SFmode);
321 (define_split
322   [(set (match_operand:V2DF 0 "register_operand" "")
323         (match_operand:V2DF 1 "zero_extended_scalar_load_operand" ""))]
324   "TARGET_SSE2 && reload_completed"
325   [(set (match_dup 0) (vec_concat:V2DF (match_dup 1) (match_dup 2)))]
327   operands[1] = simplify_gen_subreg (DFmode, operands[1], V2DFmode, 0);
328   operands[2] = CONST0_RTX (DFmode);
331 (define_expand "push<mode>1"
332   [(match_operand:AVX256MODE 0 "register_operand" "")]
333   "TARGET_AVX"
335   ix86_expand_push (<MODE>mode, operands[0]);
336   DONE;
339 (define_expand "push<mode>1"
340   [(match_operand:SSEMODE16 0 "register_operand" "")]
341   "TARGET_SSE"
343   ix86_expand_push (<MODE>mode, operands[0]);
344   DONE;
347 (define_expand "movmisalign<mode>"
348   [(set (match_operand:AVX256MODE 0 "nonimmediate_operand" "")
349         (match_operand:AVX256MODE 1 "nonimmediate_operand" ""))]
350   "TARGET_AVX"
352   ix86_expand_vector_move_misalign (<MODE>mode, operands);
353   DONE;
356 (define_expand "movmisalign<mode>"
357   [(set (match_operand:SSEMODE16 0 "nonimmediate_operand" "")
358         (match_operand:SSEMODE16 1 "nonimmediate_operand" ""))]
359   "TARGET_SSE"
361   ix86_expand_vector_move_misalign (<MODE>mode, operands);
362   DONE;
365 (define_insn "avx_movu<ssemodesuffix><avxmodesuffix>"
366   [(set (match_operand:AVXMODEF2P 0 "nonimmediate_operand" "=x,m")
367         (unspec:AVXMODEF2P
368           [(match_operand:AVXMODEF2P 1 "nonimmediate_operand" "xm,x")]
369           UNSPEC_MOVU))]
370   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)
371    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
372   "vmovu<ssemodesuffix>\t{%1, %0|%0, %1}"
373   [(set_attr "type" "ssemov")
374    (set_attr "movu" "1")
375    (set_attr "prefix" "vex")
376    (set_attr "mode" "<MODE>")])
378 (define_insn "sse2_movq128"
379   [(set (match_operand:V2DI 0 "register_operand" "=x")
380         (vec_concat:V2DI
381           (vec_select:DI
382             (match_operand:V2DI 1 "nonimmediate_operand" "xm")
383             (parallel [(const_int 0)]))
384           (const_int 0)))]
385   "TARGET_SSE2"
386   "%vmovq\t{%1, %0|%0, %1}"
387   [(set_attr "type" "ssemov")
388    (set_attr "prefix" "maybe_vex")
389    (set_attr "mode" "TI")])
391 (define_insn "<sse>_movu<ssemodesuffix>"
392   [(set (match_operand:SSEMODEF2P 0 "nonimmediate_operand" "=x,m")
393         (unspec:SSEMODEF2P
394           [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "xm,x")]
395           UNSPEC_MOVU))]
396   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)
397    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
398   "movu<ssemodesuffix>\t{%1, %0|%0, %1}"
399   [(set_attr "type" "ssemov")
400    (set_attr "movu" "1")
401    (set_attr "mode" "<MODE>")])
403 (define_insn "avx_movdqu<avxmodesuffix>"
404   [(set (match_operand:AVXMODEQI 0 "nonimmediate_operand" "=x,m")
405         (unspec:AVXMODEQI
406           [(match_operand:AVXMODEQI 1 "nonimmediate_operand" "xm,x")]
407           UNSPEC_MOVU))]
408   "TARGET_AVX && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
409   "vmovdqu\t{%1, %0|%0, %1}"
410   [(set_attr "type" "ssemov")
411    (set_attr "movu" "1")
412    (set_attr "prefix" "vex")
413    (set_attr "mode" "<avxvecmode>")])
415 (define_insn "sse2_movdqu"
416   [(set (match_operand:V16QI 0 "nonimmediate_operand" "=x,m")
417         (unspec:V16QI [(match_operand:V16QI 1 "nonimmediate_operand" "xm,x")]
418                       UNSPEC_MOVU))]
419   "TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
420   "movdqu\t{%1, %0|%0, %1}"
421   [(set_attr "type" "ssemov")
422    (set_attr "movu" "1")
423    (set_attr "prefix_data16" "1")
424    (set_attr "mode" "TI")])
426 (define_insn "avx_movnt<mode>"
427   [(set (match_operand:AVXMODEF2P 0 "memory_operand" "=m")
428         (unspec:AVXMODEF2P
429           [(match_operand:AVXMODEF2P 1 "register_operand" "x")]
430           UNSPEC_MOVNT))]
431   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
432   "vmovnt<ssemodesuffix>\t{%1, %0|%0, %1}"
433   [(set_attr "type" "ssemov")
434    (set_attr "prefix" "vex")
435    (set_attr "mode" "<MODE>")])
437 (define_insn "<sse>_movnt<mode>"
438   [(set (match_operand:SSEMODEF2P 0 "memory_operand" "=m")
439         (unspec:SSEMODEF2P
440           [(match_operand:SSEMODEF2P 1 "register_operand" "x")]
441           UNSPEC_MOVNT))]
442   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
443   "movnt<ssemodesuffix>\t{%1, %0|%0, %1}"
444   [(set_attr "type" "ssemov")
445    (set_attr "mode" "<MODE>")])
447 (define_insn "avx_movnt<mode>"
448   [(set (match_operand:AVXMODEDI 0 "memory_operand" "=m")
449         (unspec:AVXMODEDI
450           [(match_operand:AVXMODEDI 1 "register_operand" "x")]
451           UNSPEC_MOVNT))]
452   "TARGET_AVX"
453   "vmovntdq\t{%1, %0|%0, %1}"
454   [(set_attr "type" "ssecvt")
455    (set_attr "prefix" "vex")
456    (set_attr "mode" "<avxvecmode>")])
458 (define_insn "sse2_movntv2di"
459   [(set (match_operand:V2DI 0 "memory_operand" "=m")
460         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "x")]
461                      UNSPEC_MOVNT))]
462   "TARGET_SSE2"
463   "movntdq\t{%1, %0|%0, %1}"
464   [(set_attr "type" "ssemov")
465    (set_attr "prefix_data16" "1")
466    (set_attr "mode" "TI")])
468 (define_insn "sse2_movntsi"
469   [(set (match_operand:SI 0 "memory_operand" "=m")
470         (unspec:SI [(match_operand:SI 1 "register_operand" "r")]
471                    UNSPEC_MOVNT))]
472   "TARGET_SSE2"
473   "movnti\t{%1, %0|%0, %1}"
474   [(set_attr "type" "ssemov")
475    (set_attr "prefix_data16" "0")
476    (set_attr "mode" "V2DF")])
478 (define_insn "avx_lddqu<avxmodesuffix>"
479   [(set (match_operand:AVXMODEQI 0 "register_operand" "=x")
480         (unspec:AVXMODEQI
481           [(match_operand:AVXMODEQI 1 "memory_operand" "m")]
482           UNSPEC_LDDQU))]
483   "TARGET_AVX"
484   "vlddqu\t{%1, %0|%0, %1}"
485   [(set_attr "type" "ssecvt")
486    (set_attr "movu" "1")
487    (set_attr "prefix" "vex")
488    (set_attr "mode" "<avxvecmode>")])
490 (define_insn "sse3_lddqu"
491   [(set (match_operand:V16QI 0 "register_operand" "=x")
492         (unspec:V16QI [(match_operand:V16QI 1 "memory_operand" "m")]
493                       UNSPEC_LDDQU))]
494   "TARGET_SSE3"
495   "lddqu\t{%1, %0|%0, %1}"
496   [(set_attr "type" "ssemov")
497    (set_attr "movu" "1")
498    (set_attr "prefix_data16" "0")
499    (set_attr "prefix_rep" "1")
500    (set_attr "mode" "TI")])
502 ; Expand patterns for non-temporal stores.  At the moment, only those
503 ; that directly map to insns are defined; it would be possible to
504 ; define patterns for other modes that would expand to several insns.
506 (define_expand "storent<mode>"
507   [(set (match_operand:SSEMODEF2P 0 "memory_operand" "")
508         (unspec:SSEMODEF2P
509           [(match_operand:SSEMODEF2P 1 "register_operand" "")]
510           UNSPEC_MOVNT))]
511   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)")
513 (define_expand "storent<mode>"
514   [(set (match_operand:MODEF 0 "memory_operand" "")
515         (unspec:MODEF
516           [(match_operand:MODEF 1 "register_operand" "")]
517           UNSPEC_MOVNT))]
518   "TARGET_SSE4A")
520 (define_expand "storentv2di"
521   [(set (match_operand:V2DI 0 "memory_operand" "")
522         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "")]
523                      UNSPEC_MOVNT))]
524   "TARGET_SSE2")
526 (define_expand "storentsi"
527   [(set (match_operand:SI 0 "memory_operand" "")
528         (unspec:SI [(match_operand:SI 1 "register_operand" "")]
529                    UNSPEC_MOVNT))]
530   "TARGET_SSE2")
532 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
534 ;; Parallel floating point arithmetic
536 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
538 (define_expand "<code><mode>2"
539   [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
540         (absneg:SSEMODEF2P
541           (match_operand:SSEMODEF2P 1 "register_operand" "")))]
542   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
543   "ix86_expand_fp_absneg_operator (<CODE>, <MODE>mode, operands); DONE;")
545 (define_expand "<plusminus_insn><mode>3"
546   [(set (match_operand:AVX256MODEF2P 0 "register_operand" "")
547         (plusminus:AVX256MODEF2P
548           (match_operand:AVX256MODEF2P 1 "nonimmediate_operand" "")
549           (match_operand:AVX256MODEF2P 2 "nonimmediate_operand" "")))]
550   "AVX256_VEC_FLOAT_MODE_P (<MODE>mode)"
551   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
553 (define_insn "*avx_<plusminus_insn><mode>3"
554   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
555         (plusminus:AVXMODEF2P
556           (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "<comm>x")
557           (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
558   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)
559    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
560   "v<plusminus_mnemonic><ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
561   [(set_attr "type" "sseadd")
562    (set_attr "prefix" "vex")
563    (set_attr "mode" "<avxvecmode>")])
565 (define_expand "<plusminus_insn><mode>3"
566   [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
567         (plusminus:SSEMODEF2P
568           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "")
569           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "")))]
570   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
571   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
573 (define_insn "*<plusminus_insn><mode>3"
574   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
575         (plusminus:SSEMODEF2P
576           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "<comm>0")
577           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
578   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)
579    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
580   "<plusminus_mnemonic><ssemodesuffix>\t{%2, %0|%0, %2}"
581   [(set_attr "type" "sseadd")
582    (set_attr "mode" "<MODE>")])
584 (define_insn "*avx_vm<plusminus_insn><mode>3"
585   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
586         (vec_merge:SSEMODEF2P
587           (plusminus:SSEMODEF2P
588             (match_operand:SSEMODEF2P 1 "register_operand" "x")
589             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
590           (match_dup 1)
591           (const_int 1)))]
592   "AVX128_VEC_FLOAT_MODE_P (<MODE>mode)"
593   "v<plusminus_mnemonic><ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
594   [(set_attr "type" "sseadd")
595    (set_attr "prefix" "vex")
596    (set_attr "mode" "<ssescalarmode>")])
598 (define_insn "<sse>_vm<plusminus_insn><mode>3"
599   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
600         (vec_merge:SSEMODEF2P
601           (plusminus:SSEMODEF2P
602             (match_operand:SSEMODEF2P 1 "register_operand" "0")
603             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
604           (match_dup 1)
605           (const_int 1)))]
606   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
607   "<plusminus_mnemonic><ssescalarmodesuffix>\t{%2, %0|%0, %2}"
608   [(set_attr "type" "sseadd")
609    (set_attr "mode" "<ssescalarmode>")])
611 (define_expand "mul<mode>3"
612   [(set (match_operand:AVX256MODEF2P 0 "register_operand" "")
613         (mult:AVX256MODEF2P
614           (match_operand:AVX256MODEF2P 1 "nonimmediate_operand" "")
615           (match_operand:AVX256MODEF2P 2 "nonimmediate_operand" "")))]
616   "AVX256_VEC_FLOAT_MODE_P (<MODE>mode)"
617   "ix86_fixup_binary_operands_no_copy (MULT, <MODE>mode, operands);")
619 (define_insn "*avx_mul<mode>3"
620   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
621         (mult:AVXMODEF2P
622           (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x")
623           (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
624   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)
625    && ix86_binary_operator_ok (MULT, <MODE>mode, operands)"
626   "vmul<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
627   [(set_attr "type" "ssemul")
628    (set_attr "prefix" "vex")
629    (set_attr "mode" "<avxvecmode>")])
631 (define_expand "mul<mode>3"
632   [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
633         (mult:SSEMODEF2P
634           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "")
635           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "")))]
636   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
637   "ix86_fixup_binary_operands_no_copy (MULT, <MODE>mode, operands);")
639 (define_insn "*mul<mode>3"
640   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
641         (mult:SSEMODEF2P
642           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%0")
643           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
644   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)
645    && ix86_binary_operator_ok (MULT, <MODE>mode, operands)"
646   "mul<ssemodesuffix>\t{%2, %0|%0, %2}"
647   [(set_attr "type" "ssemul")
648    (set_attr "mode" "<MODE>")])
650 (define_insn "*avx_vmmul<mode>3"
651   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
652         (vec_merge:SSEMODEF2P
653           (mult:SSEMODEF2P
654             (match_operand:SSEMODEF2P 1 "register_operand" "x")
655             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
656           (match_dup 1)
657           (const_int 1)))]
658   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
659   "vmul<ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
660   [(set_attr "type" "ssemul")
661    (set_attr "prefix" "vex")
662    (set_attr "mode" "<ssescalarmode>")])
664 (define_insn "<sse>_vmmul<mode>3"
665   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
666         (vec_merge:SSEMODEF2P
667           (mult:SSEMODEF2P
668             (match_operand:SSEMODEF2P 1 "register_operand" "0")
669             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
670           (match_dup 1)
671           (const_int 1)))]
672   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
673   "mul<ssescalarmodesuffix>\t{%2, %0|%0, %2}"
674   [(set_attr "type" "ssemul")
675    (set_attr "mode" "<ssescalarmode>")])
677 (define_expand "divv8sf3"
678   [(set (match_operand:V8SF 0 "register_operand" "")
679         (div:V8SF (match_operand:V8SF 1 "register_operand" "")
680                   (match_operand:V8SF 2 "nonimmediate_operand" "")))]
681   "TARGET_AVX"
683   ix86_fixup_binary_operands_no_copy (DIV, V8SFmode, operands);
685   if (TARGET_SSE_MATH && TARGET_RECIP && !optimize_insn_for_size_p ()
686       && flag_finite_math_only && !flag_trapping_math
687       && flag_unsafe_math_optimizations)
688     {
689       ix86_emit_swdivsf (operands[0], operands[1],
690                          operands[2], V8SFmode);
691       DONE;
692     }
695 (define_expand "divv4df3"
696   [(set (match_operand:V4DF 0 "register_operand" "")
697         (div:V4DF (match_operand:V4DF 1 "register_operand" "")
698                   (match_operand:V4DF 2 "nonimmediate_operand" "")))]
699   "TARGET_AVX"
700   "ix86_fixup_binary_operands_no_copy (DIV, V4DFmode, operands);")
702 (define_insn "avx_div<mode>3"
703   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
704         (div:AVXMODEF2P
705           (match_operand:AVXMODEF2P 1 "register_operand" "x")
706           (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
707   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
708   "vdiv<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
709   [(set_attr "type" "ssediv")
710    (set_attr "prefix" "vex")
711    (set_attr "mode" "<MODE>")])
713 (define_expand "divv4sf3"
714   [(set (match_operand:V4SF 0 "register_operand" "")
715         (div:V4SF (match_operand:V4SF 1 "register_operand" "")
716                   (match_operand:V4SF 2 "nonimmediate_operand" "")))]
717   "TARGET_SSE"
719   if (TARGET_SSE_MATH && TARGET_RECIP && optimize_insn_for_speed_p ()
720       && flag_finite_math_only && !flag_trapping_math
721       && flag_unsafe_math_optimizations)
722     {
723       ix86_emit_swdivsf (operands[0], operands[1],
724                          operands[2], V4SFmode);
725       DONE;
726     }
729 (define_expand "divv2df3"
730   [(set (match_operand:V2DF 0 "register_operand" "")
731         (div:V2DF (match_operand:V2DF 1 "register_operand" "")
732                   (match_operand:V2DF 2 "nonimmediate_operand" "")))]
733   "TARGET_SSE2")
735 (define_insn "*avx_div<mode>3"
736   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
737         (div:SSEMODEF2P
738           (match_operand:SSEMODEF2P 1 "register_operand" "x")
739           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
740   "AVX128_VEC_FLOAT_MODE_P (<MODE>mode)"
741   "vdiv<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
742   [(set_attr "type" "ssediv")
743    (set_attr "prefix" "vex")
744    (set_attr "mode" "<MODE>")])
746 (define_insn "<sse>_div<mode>3"
747   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
748         (div:SSEMODEF2P
749           (match_operand:SSEMODEF2P 1 "register_operand" "0")
750           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
751   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
752   "div<ssemodesuffix>\t{%2, %0|%0, %2}"
753   [(set_attr "type" "ssediv")
754    (set_attr "mode" "<MODE>")])
756 (define_insn "*avx_vmdiv<mode>3"
757   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
758         (vec_merge:SSEMODEF2P
759           (div:SSEMODEF2P
760             (match_operand:SSEMODEF2P 1 "register_operand" "x")
761             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
762           (match_dup 1)
763           (const_int 1)))]
764   "AVX128_VEC_FLOAT_MODE_P (<MODE>mode)"
765   "vdiv<ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
766   [(set_attr "type" "ssediv")
767    (set_attr "prefix" "vex")
768    (set_attr "mode" "<ssescalarmode>")])
770 (define_insn "<sse>_vmdiv<mode>3"
771   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
772         (vec_merge:SSEMODEF2P
773           (div:SSEMODEF2P
774             (match_operand:SSEMODEF2P 1 "register_operand" "0")
775             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
776           (match_dup 1)
777           (const_int 1)))]
778   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
779   "div<ssescalarmodesuffix>\t{%2, %0|%0, %2}"
780   [(set_attr "type" "ssediv")
781    (set_attr "mode" "<ssescalarmode>")])
783 (define_insn "avx_rcpv8sf2"
784   [(set (match_operand:V8SF 0 "register_operand" "=x")
785         (unspec:V8SF
786           [(match_operand:V8SF 1 "nonimmediate_operand" "xm")] UNSPEC_RCP))]
787   "TARGET_AVX"
788   "vrcpps\t{%1, %0|%0, %1}"
789   [(set_attr "type" "sse")
790    (set_attr "prefix" "vex")
791    (set_attr "mode" "V8SF")])
793 (define_insn "sse_rcpv4sf2"
794   [(set (match_operand:V4SF 0 "register_operand" "=x")
795         (unspec:V4SF
796           [(match_operand:V4SF 1 "nonimmediate_operand" "xm")] UNSPEC_RCP))]
797   "TARGET_SSE"
798   "%vrcpps\t{%1, %0|%0, %1}"
799   [(set_attr "type" "sse")
800    (set_attr "atom_sse_attr" "rcp")
801    (set_attr "prefix" "maybe_vex")
802    (set_attr "mode" "V4SF")])
804 (define_insn "*avx_vmrcpv4sf2"
805   [(set (match_operand:V4SF 0 "register_operand" "=x")
806         (vec_merge:V4SF
807           (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
808                        UNSPEC_RCP)
809           (match_operand:V4SF 2 "register_operand" "x")
810           (const_int 1)))]
811   "TARGET_AVX"
812   "vrcpss\t{%1, %2, %0|%0, %2, %1}"
813   [(set_attr "type" "sse")
814    (set_attr "prefix" "vex")
815    (set_attr "mode" "SF")])
817 (define_insn "sse_vmrcpv4sf2"
818   [(set (match_operand:V4SF 0 "register_operand" "=x")
819         (vec_merge:V4SF
820           (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
821                        UNSPEC_RCP)
822           (match_operand:V4SF 2 "register_operand" "0")
823           (const_int 1)))]
824   "TARGET_SSE"
825   "rcpss\t{%1, %0|%0, %1}"
826   [(set_attr "type" "sse")
827    (set_attr "atom_sse_attr" "rcp")
828    (set_attr "mode" "SF")])
830 (define_expand "sqrtv8sf2"
831   [(set (match_operand:V8SF 0 "register_operand" "")
832         (sqrt:V8SF (match_operand:V8SF 1 "nonimmediate_operand" "")))]
833   "TARGET_AVX"
835   if (TARGET_SSE_MATH && TARGET_RECIP && !optimize_insn_for_size_p ()
836       && flag_finite_math_only && !flag_trapping_math
837       && flag_unsafe_math_optimizations)
838     {
839       ix86_emit_swsqrtsf (operands[0], operands[1], V8SFmode, 0);
840       DONE;
841     }
844 (define_insn "avx_sqrtv8sf2"
845   [(set (match_operand:V8SF 0 "register_operand" "=x")
846         (sqrt:V8SF (match_operand:V8SF 1 "nonimmediate_operand" "xm")))]
847   "TARGET_AVX"
848   "vsqrtps\t{%1, %0|%0, %1}"
849   [(set_attr "type" "sse")
850    (set_attr "prefix" "vex")
851    (set_attr "mode" "V8SF")])
853 (define_expand "sqrtv4sf2"
854   [(set (match_operand:V4SF 0 "register_operand" "")
855         (sqrt:V4SF (match_operand:V4SF 1 "nonimmediate_operand" "")))]
856   "TARGET_SSE"
858   if (TARGET_SSE_MATH && TARGET_RECIP && optimize_insn_for_speed_p ()
859       && flag_finite_math_only && !flag_trapping_math
860       && flag_unsafe_math_optimizations)
861     {
862       ix86_emit_swsqrtsf (operands[0], operands[1], V4SFmode, 0);
863       DONE;
864     }
867 (define_insn "sse_sqrtv4sf2"
868   [(set (match_operand:V4SF 0 "register_operand" "=x")
869         (sqrt:V4SF (match_operand:V4SF 1 "nonimmediate_operand" "xm")))]
870   "TARGET_SSE"
871   "%vsqrtps\t{%1, %0|%0, %1}"
872   [(set_attr "type" "sse")
873    (set_attr "atom_sse_attr" "sqrt")
874    (set_attr "prefix" "maybe_vex")
875    (set_attr "mode" "V4SF")])
877 (define_insn "sqrtv4df2"
878   [(set (match_operand:V4DF 0 "register_operand" "=x")
879         (sqrt:V4DF (match_operand:V4DF 1 "nonimmediate_operand" "xm")))]
880   "TARGET_AVX"
881   "vsqrtpd\t{%1, %0|%0, %1}"
882   [(set_attr "type" "sse")
883    (set_attr "prefix" "vex")
884    (set_attr "mode" "V4DF")])
886 (define_insn "sqrtv2df2"
887   [(set (match_operand:V2DF 0 "register_operand" "=x")
888         (sqrt:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "xm")))]
889   "TARGET_SSE2"
890   "%vsqrtpd\t{%1, %0|%0, %1}"
891   [(set_attr "type" "sse")
892    (set_attr "prefix" "maybe_vex")
893    (set_attr "mode" "V2DF")])
895 (define_insn "*avx_vmsqrt<mode>2"
896   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
897         (vec_merge:SSEMODEF2P
898           (sqrt:SSEMODEF2P
899             (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "xm"))
900           (match_operand:SSEMODEF2P 2 "register_operand" "x")
901           (const_int 1)))]
902   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
903   "vsqrt<ssescalarmodesuffix>\t{%1, %2, %0|%0, %2, %1}"
904   [(set_attr "type" "sse")
905    (set_attr "prefix" "vex")
906    (set_attr "mode" "<ssescalarmode>")])
908 (define_insn "<sse>_vmsqrt<mode>2"
909   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
910         (vec_merge:SSEMODEF2P
911           (sqrt:SSEMODEF2P
912             (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "xm"))
913           (match_operand:SSEMODEF2P 2 "register_operand" "0")
914           (const_int 1)))]
915   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
916   "sqrt<ssescalarmodesuffix>\t{%1, %0|%0, %1}"
917   [(set_attr "type" "sse")
918    (set_attr "atom_sse_attr" "sqrt")
919    (set_attr "mode" "<ssescalarmode>")])
921 (define_expand "rsqrtv8sf2"
922   [(set (match_operand:V8SF 0 "register_operand" "")
923         (unspec:V8SF
924           [(match_operand:V8SF 1 "nonimmediate_operand" "")] UNSPEC_RSQRT))]
925   "TARGET_AVX && TARGET_SSE_MATH"
927   ix86_emit_swsqrtsf (operands[0], operands[1], V8SFmode, 1);
928   DONE;
931 (define_insn "avx_rsqrtv8sf2"
932   [(set (match_operand:V8SF 0 "register_operand" "=x")
933         (unspec:V8SF
934           [(match_operand:V8SF 1 "nonimmediate_operand" "xm")] UNSPEC_RSQRT))]
935   "TARGET_AVX"
936   "vrsqrtps\t{%1, %0|%0, %1}"
937   [(set_attr "type" "sse")
938    (set_attr "prefix" "vex")
939    (set_attr "mode" "V8SF")])
941 (define_expand "rsqrtv4sf2"
942   [(set (match_operand:V4SF 0 "register_operand" "")
943         (unspec:V4SF
944           [(match_operand:V4SF 1 "nonimmediate_operand" "")] UNSPEC_RSQRT))]
945   "TARGET_SSE_MATH"
947   ix86_emit_swsqrtsf (operands[0], operands[1], V4SFmode, 1);
948   DONE;
951 (define_insn "sse_rsqrtv4sf2"
952   [(set (match_operand:V4SF 0 "register_operand" "=x")
953         (unspec:V4SF
954           [(match_operand:V4SF 1 "nonimmediate_operand" "xm")] UNSPEC_RSQRT))]
955   "TARGET_SSE"
956   "%vrsqrtps\t{%1, %0|%0, %1}"
957   [(set_attr "type" "sse")
958    (set_attr "prefix" "maybe_vex")
959    (set_attr "mode" "V4SF")])
961 (define_insn "*avx_vmrsqrtv4sf2"
962   [(set (match_operand:V4SF 0 "register_operand" "=x")
963         (vec_merge:V4SF
964           (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
965                        UNSPEC_RSQRT)
966           (match_operand:V4SF 2 "register_operand" "x")
967           (const_int 1)))]
968   "TARGET_AVX"
969   "vrsqrtss\t{%1, %2, %0|%0, %2, %1}"
970   [(set_attr "type" "sse")
971    (set_attr "prefix" "vex")
972    (set_attr "mode" "SF")])
974 (define_insn "sse_vmrsqrtv4sf2"
975   [(set (match_operand:V4SF 0 "register_operand" "=x")
976         (vec_merge:V4SF
977           (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
978                        UNSPEC_RSQRT)
979           (match_operand:V4SF 2 "register_operand" "0")
980           (const_int 1)))]
981   "TARGET_SSE"
982   "rsqrtss\t{%1, %0|%0, %1}"
983   [(set_attr "type" "sse")
984    (set_attr "mode" "SF")])
986 ;; ??? For !flag_finite_math_only, the representation with SMIN/SMAX
987 ;; isn't really correct, as those rtl operators aren't defined when
988 ;; applied to NaNs.  Hopefully the optimizers won't get too smart on us.
990 (define_expand "<code><mode>3"
991   [(set (match_operand:AVX256MODEF2P 0 "register_operand" "")
992         (smaxmin:AVX256MODEF2P
993           (match_operand:AVX256MODEF2P 1 "nonimmediate_operand" "")
994           (match_operand:AVX256MODEF2P 2 "nonimmediate_operand" "")))]
995   "AVX256_VEC_FLOAT_MODE_P (<MODE>mode)"
997   if (!flag_finite_math_only)
998     operands[1] = force_reg (<MODE>mode, operands[1]);
999   ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);
1002 (define_expand "<code><mode>3"
1003   [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
1004         (smaxmin:SSEMODEF2P
1005           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "")
1006           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "")))]
1007   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1009   if (!flag_finite_math_only)
1010     operands[1] = force_reg (<MODE>mode, operands[1]);
1011   ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);
1014 (define_insn "*avx_<code><mode>3_finite"
1015   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1016         (smaxmin:AVXMODEF2P
1017           (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x")
1018           (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
1019   "AVX_VEC_FLOAT_MODE_P (<MODE>mode) && flag_finite_math_only
1020    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
1021   "v<maxmin_float><ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
1022   [(set_attr "type" "sseadd")
1023    (set_attr "prefix" "vex")
1024    (set_attr "mode" "<MODE>")])
1026 (define_insn "*<code><mode>3_finite"
1027   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1028         (smaxmin:SSEMODEF2P
1029           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%0")
1030           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
1031   "SSE_VEC_FLOAT_MODE_P (<MODE>mode) && flag_finite_math_only
1032    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
1033   "<maxmin_float><ssemodesuffix>\t{%2, %0|%0, %2}"
1034   [(set_attr "type" "sseadd")
1035    (set_attr "mode" "<MODE>")])
1037 (define_insn "*avx_<code><mode>3"
1038   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1039         (smaxmin:AVXMODEF2P
1040           (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x")
1041           (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
1042   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
1043   "v<maxmin_float><ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
1044   [(set_attr "type" "sseadd")
1045    (set_attr "prefix" "vex")
1046    (set_attr "mode" "<avxvecmode>")])
1048 (define_insn "*<code><mode>3"
1049   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1050         (smaxmin:SSEMODEF2P
1051           (match_operand:SSEMODEF2P 1 "register_operand" "0")
1052           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
1053   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1054   "<maxmin_float><ssemodesuffix>\t{%2, %0|%0, %2}"
1055   [(set_attr "type" "sseadd")
1056    (set_attr "mode" "<MODE>")])
1058 (define_insn "*avx_vm<code><mode>3"
1059   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1060         (vec_merge:SSEMODEF2P
1061           (smaxmin:SSEMODEF2P
1062             (match_operand:SSEMODEF2P 1 "register_operand" "x")
1063             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
1064          (match_dup 1)
1065          (const_int 1)))]
1066   "AVX128_VEC_FLOAT_MODE_P (<MODE>mode)"
1067   "v<maxmin_float><ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
1068   [(set_attr "type" "sse")
1069    (set_attr "prefix" "vex")
1070    (set_attr "mode" "<ssescalarmode>")])
1072 (define_insn "<sse>_vm<code><mode>3"
1073   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1074         (vec_merge:SSEMODEF2P
1075           (smaxmin:SSEMODEF2P
1076             (match_operand:SSEMODEF2P 1 "register_operand" "0")
1077             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
1078          (match_dup 1)
1079          (const_int 1)))]
1080   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1081   "<maxmin_float><ssescalarmodesuffix>\t{%2, %0|%0, %2}"
1082   [(set_attr "type" "sseadd")
1083    (set_attr "mode" "<ssescalarmode>")])
1085 ;; These versions of the min/max patterns implement exactly the operations
1086 ;;   min = (op1 < op2 ? op1 : op2)
1087 ;;   max = (!(op1 < op2) ? op1 : op2)
1088 ;; Their operands are not commutative, and thus they may be used in the
1089 ;; presence of -0.0 and NaN.
1091 (define_insn "*avx_ieee_smin<mode>3"
1092   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1093         (unspec:AVXMODEF2P
1094           [(match_operand:AVXMODEF2P 1 "register_operand" "x")
1095            (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")]
1096          UNSPEC_IEEE_MIN))]
1097   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
1098   "vmin<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
1099   [(set_attr "type" "sseadd")
1100    (set_attr "prefix" "vex")
1101    (set_attr "mode" "<avxvecmode>")])
1103 (define_insn "*avx_ieee_smax<mode>3"
1104   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1105         (unspec:AVXMODEF2P
1106           [(match_operand:AVXMODEF2P 1 "register_operand" "x")
1107            (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")]
1108          UNSPEC_IEEE_MAX))]
1109   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
1110   "vmax<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
1111   [(set_attr "type" "sseadd")
1112    (set_attr "prefix" "vex")
1113    (set_attr "mode" "<avxvecmode>")])
1115 (define_insn "*ieee_smin<mode>3"
1116   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1117         (unspec:SSEMODEF2P
1118           [(match_operand:SSEMODEF2P 1 "register_operand" "0")
1119            (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")]
1120          UNSPEC_IEEE_MIN))]
1121   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1122   "min<ssemodesuffix>\t{%2, %0|%0, %2}"
1123   [(set_attr "type" "sseadd")
1124    (set_attr "mode" "<MODE>")])
1126 (define_insn "*ieee_smax<mode>3"
1127   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1128         (unspec:SSEMODEF2P
1129           [(match_operand:SSEMODEF2P 1 "register_operand" "0")
1130            (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")]
1131          UNSPEC_IEEE_MAX))]
1132   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1133   "max<ssemodesuffix>\t{%2, %0|%0, %2}"
1134   [(set_attr "type" "sseadd")
1135    (set_attr "mode" "<MODE>")])
1137 (define_insn "avx_addsubv8sf3"
1138   [(set (match_operand:V8SF 0 "register_operand" "=x")
1139         (vec_merge:V8SF
1140           (plus:V8SF
1141             (match_operand:V8SF 1 "register_operand" "x")
1142             (match_operand:V8SF 2 "nonimmediate_operand" "xm"))
1143           (minus:V8SF (match_dup 1) (match_dup 2))
1144           (const_int 170)))]
1145   "TARGET_AVX"
1146   "vaddsubps\t{%2, %1, %0|%0, %1, %2}"
1147   [(set_attr "type" "sseadd")
1148    (set_attr "prefix" "vex")
1149    (set_attr "mode" "V8SF")])
1151 (define_insn "avx_addsubv4df3"
1152   [(set (match_operand:V4DF 0 "register_operand" "=x")
1153         (vec_merge:V4DF
1154           (plus:V4DF
1155             (match_operand:V4DF 1 "register_operand" "x")
1156             (match_operand:V4DF 2 "nonimmediate_operand" "xm"))
1157           (minus:V4DF (match_dup 1) (match_dup 2))
1158           (const_int 10)))]
1159   "TARGET_AVX"
1160   "vaddsubpd\t{%2, %1, %0|%0, %1, %2}"
1161   [(set_attr "type" "sseadd")
1162    (set_attr "prefix" "vex")
1163    (set_attr "mode" "V4DF")])
1165 (define_insn "*avx_addsubv4sf3"
1166   [(set (match_operand:V4SF 0 "register_operand" "=x")
1167         (vec_merge:V4SF
1168           (plus:V4SF
1169             (match_operand:V4SF 1 "register_operand" "x")
1170             (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
1171           (minus:V4SF (match_dup 1) (match_dup 2))
1172           (const_int 10)))]
1173   "TARGET_AVX"
1174   "vaddsubps\t{%2, %1, %0|%0, %1, %2}"
1175   [(set_attr "type" "sseadd")
1176    (set_attr "prefix" "vex")
1177    (set_attr "mode" "V4SF")])
1179 (define_insn "sse3_addsubv4sf3"
1180   [(set (match_operand:V4SF 0 "register_operand" "=x")
1181         (vec_merge:V4SF
1182           (plus:V4SF
1183             (match_operand:V4SF 1 "register_operand" "0")
1184             (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
1185           (minus:V4SF (match_dup 1) (match_dup 2))
1186           (const_int 10)))]
1187   "TARGET_SSE3"
1188   "addsubps\t{%2, %0|%0, %2}"
1189   [(set_attr "type" "sseadd")
1190    (set_attr "prefix_rep" "1")
1191    (set_attr "mode" "V4SF")])
1193 (define_insn "*avx_addsubv2df3"
1194   [(set (match_operand:V2DF 0 "register_operand" "=x")
1195         (vec_merge:V2DF
1196           (plus:V2DF
1197             (match_operand:V2DF 1 "register_operand" "x")
1198             (match_operand:V2DF 2 "nonimmediate_operand" "xm"))
1199           (minus:V2DF (match_dup 1) (match_dup 2))
1200           (const_int 2)))]
1201   "TARGET_AVX"
1202   "vaddsubpd\t{%2, %1, %0|%0, %1, %2}"
1203   [(set_attr "type" "sseadd")
1204    (set_attr "prefix" "vex")
1205    (set_attr "mode" "V2DF")])
1207 (define_insn "sse3_addsubv2df3"
1208   [(set (match_operand:V2DF 0 "register_operand" "=x")
1209         (vec_merge:V2DF
1210           (plus:V2DF
1211             (match_operand:V2DF 1 "register_operand" "0")
1212             (match_operand:V2DF 2 "nonimmediate_operand" "xm"))
1213           (minus:V2DF (match_dup 1) (match_dup 2))
1214           (const_int 2)))]
1215   "TARGET_SSE3"
1216   "addsubpd\t{%2, %0|%0, %2}"
1217   [(set_attr "type" "sseadd")
1218    (set_attr "atom_unit" "complex")
1219    (set_attr "mode" "V2DF")])
1221 (define_insn "avx_h<plusminus_insn>v4df3"
1222   [(set (match_operand:V4DF 0 "register_operand" "=x")
1223         (vec_concat:V4DF
1224           (vec_concat:V2DF
1225             (plusminus:DF
1226               (vec_select:DF
1227                 (match_operand:V4DF 1 "register_operand" "x")
1228                 (parallel [(const_int 0)]))
1229               (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
1230             (plusminus:DF
1231               (vec_select:DF (match_dup 1) (parallel [(const_int 2)]))
1232               (vec_select:DF (match_dup 1) (parallel [(const_int 3)]))))
1233           (vec_concat:V2DF
1234             (plusminus:DF
1235               (vec_select:DF
1236                 (match_operand:V4DF 2 "nonimmediate_operand" "xm")
1237                 (parallel [(const_int 0)]))
1238               (vec_select:DF (match_dup 2) (parallel [(const_int 1)])))
1239             (plusminus:DF
1240               (vec_select:DF (match_dup 2) (parallel [(const_int 2)]))
1241               (vec_select:DF (match_dup 2) (parallel [(const_int 3)]))))))]
1242   "TARGET_AVX"
1243   "vh<plusminus_mnemonic>pd\t{%2, %1, %0|%0, %1, %2}"
1244   [(set_attr "type" "sseadd")
1245    (set_attr "prefix" "vex")
1246    (set_attr "mode" "V4DF")])
1248 (define_insn "avx_h<plusminus_insn>v8sf3"
1249   [(set (match_operand:V8SF 0 "register_operand" "=x")
1250         (vec_concat:V8SF
1251           (vec_concat:V4SF
1252             (vec_concat:V2SF
1253               (plusminus:SF
1254                 (vec_select:SF
1255                   (match_operand:V8SF 1 "register_operand" "x")
1256                   (parallel [(const_int 0)]))
1257                 (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))
1258               (plusminus:SF
1259                 (vec_select:SF (match_dup 1) (parallel [(const_int 2)]))
1260                 (vec_select:SF (match_dup 1) (parallel [(const_int 3)]))))
1261             (vec_concat:V2SF
1262               (plusminus:SF
1263                 (vec_select:SF
1264                   (match_operand:V8SF 2 "nonimmediate_operand" "xm")
1265                   (parallel [(const_int 0)]))
1266                 (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))
1267               (plusminus:SF
1268                 (vec_select:SF (match_dup 2) (parallel [(const_int 2)]))
1269                 (vec_select:SF (match_dup 2) (parallel [(const_int 3)])))))
1270           (vec_concat:V4SF
1271             (vec_concat:V2SF
1272               (plusminus:SF
1273                 (vec_select:SF (match_dup 1) (parallel [(const_int 4)]))
1274                 (vec_select:SF (match_dup 1) (parallel [(const_int 5)])))
1275               (plusminus:SF
1276                 (vec_select:SF (match_dup 1) (parallel [(const_int 6)]))
1277                 (vec_select:SF (match_dup 1) (parallel [(const_int 7)]))))
1278             (vec_concat:V2SF
1279               (plusminus:SF
1280                 (vec_select:SF (match_dup 2) (parallel [(const_int 4)]))
1281                 (vec_select:SF (match_dup 2) (parallel [(const_int 5)])))
1282               (plusminus:SF
1283                 (vec_select:SF (match_dup 2) (parallel [(const_int 6)]))
1284                 (vec_select:SF (match_dup 2) (parallel [(const_int 7)])))))))]
1285   "TARGET_AVX"
1286   "vh<plusminus_mnemonic>ps\t{%2, %1, %0|%0, %1, %2}"
1287   [(set_attr "type" "sseadd")
1288    (set_attr "prefix" "vex")
1289    (set_attr "mode" "V8SF")])
1291 (define_insn "*avx_h<plusminus_insn>v4sf3"
1292   [(set (match_operand:V4SF 0 "register_operand" "=x")
1293         (vec_concat:V4SF
1294           (vec_concat:V2SF
1295             (plusminus:SF
1296               (vec_select:SF
1297                 (match_operand:V4SF 1 "register_operand" "x")
1298                 (parallel [(const_int 0)]))
1299               (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))
1300             (plusminus:SF
1301               (vec_select:SF (match_dup 1) (parallel [(const_int 2)]))
1302               (vec_select:SF (match_dup 1) (parallel [(const_int 3)]))))
1303           (vec_concat:V2SF
1304             (plusminus:SF
1305               (vec_select:SF
1306                 (match_operand:V4SF 2 "nonimmediate_operand" "xm")
1307                 (parallel [(const_int 0)]))
1308               (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))
1309             (plusminus:SF
1310               (vec_select:SF (match_dup 2) (parallel [(const_int 2)]))
1311               (vec_select:SF (match_dup 2) (parallel [(const_int 3)]))))))]
1312   "TARGET_AVX"
1313   "vh<plusminus_mnemonic>ps\t{%2, %1, %0|%0, %1, %2}"
1314   [(set_attr "type" "sseadd")
1315    (set_attr "prefix" "vex")
1316    (set_attr "mode" "V4SF")])
1318 (define_insn "sse3_h<plusminus_insn>v4sf3"
1319   [(set (match_operand:V4SF 0 "register_operand" "=x")
1320         (vec_concat:V4SF
1321           (vec_concat:V2SF
1322             (plusminus:SF
1323               (vec_select:SF
1324                 (match_operand:V4SF 1 "register_operand" "0")
1325                 (parallel [(const_int 0)]))
1326               (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))
1327             (plusminus:SF
1328               (vec_select:SF (match_dup 1) (parallel [(const_int 2)]))
1329               (vec_select:SF (match_dup 1) (parallel [(const_int 3)]))))
1330           (vec_concat:V2SF
1331             (plusminus:SF
1332               (vec_select:SF
1333                 (match_operand:V4SF 2 "nonimmediate_operand" "xm")
1334                 (parallel [(const_int 0)]))
1335               (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))
1336             (plusminus:SF
1337               (vec_select:SF (match_dup 2) (parallel [(const_int 2)]))
1338               (vec_select:SF (match_dup 2) (parallel [(const_int 3)]))))))]
1339   "TARGET_SSE3"
1340   "h<plusminus_mnemonic>ps\t{%2, %0|%0, %2}"
1341   [(set_attr "type" "sseadd")
1342    (set_attr "atom_unit" "complex")
1343    (set_attr "prefix_rep" "1")
1344    (set_attr "mode" "V4SF")])
1346 (define_insn "*avx_h<plusminus_insn>v2df3"
1347   [(set (match_operand:V2DF 0 "register_operand" "=x")
1348         (vec_concat:V2DF
1349           (plusminus:DF
1350             (vec_select:DF
1351               (match_operand:V2DF 1 "register_operand" "x")
1352               (parallel [(const_int 0)]))
1353             (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
1354           (plusminus:DF
1355             (vec_select:DF
1356               (match_operand:V2DF 2 "nonimmediate_operand" "xm")
1357               (parallel [(const_int 0)]))
1358             (vec_select:DF (match_dup 2) (parallel [(const_int 1)])))))]
1359   "TARGET_AVX"
1360   "vh<plusminus_mnemonic>pd\t{%2, %1, %0|%0, %1, %2}"
1361   [(set_attr "type" "sseadd")
1362    (set_attr "prefix" "vex")
1363    (set_attr "mode" "V2DF")])
1365 (define_insn "sse3_h<plusminus_insn>v2df3"
1366   [(set (match_operand:V2DF 0 "register_operand" "=x")
1367         (vec_concat:V2DF
1368           (plusminus:DF
1369             (vec_select:DF
1370               (match_operand:V2DF 1 "register_operand" "0")
1371               (parallel [(const_int 0)]))
1372             (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
1373           (plusminus:DF
1374             (vec_select:DF
1375               (match_operand:V2DF 2 "nonimmediate_operand" "xm")
1376               (parallel [(const_int 0)]))
1377             (vec_select:DF (match_dup 2) (parallel [(const_int 1)])))))]
1378   "TARGET_SSE3"
1379   "h<plusminus_mnemonic>pd\t{%2, %0|%0, %2}"
1380   [(set_attr "type" "sseadd")
1381    (set_attr "mode" "V2DF")])
1383 (define_expand "reduc_splus_v4sf"
1384   [(match_operand:V4SF 0 "register_operand" "")
1385    (match_operand:V4SF 1 "register_operand" "")]
1386   "TARGET_SSE"
1388   if (TARGET_SSE3)
1389     {
1390       rtx tmp = gen_reg_rtx (V4SFmode);
1391       emit_insn (gen_sse3_haddv4sf3 (tmp, operands[1], operands[1]));
1392       emit_insn (gen_sse3_haddv4sf3 (operands[0], tmp, tmp));
1393     }
1394   else
1395     ix86_expand_reduc_v4sf (gen_addv4sf3, operands[0], operands[1]);
1396   DONE;
1399 (define_expand "reduc_splus_v2df"
1400   [(match_operand:V2DF 0 "register_operand" "")
1401    (match_operand:V2DF 1 "register_operand" "")]
1402   "TARGET_SSE3"
1404   emit_insn (gen_sse3_haddv2df3 (operands[0], operands[1], operands[1]));
1405   DONE;
1408 (define_expand "reduc_smax_v4sf"
1409   [(match_operand:V4SF 0 "register_operand" "")
1410    (match_operand:V4SF 1 "register_operand" "")]
1411   "TARGET_SSE"
1413   ix86_expand_reduc_v4sf (gen_smaxv4sf3, operands[0], operands[1]);
1414   DONE;
1417 (define_expand "reduc_smin_v4sf"
1418   [(match_operand:V4SF 0 "register_operand" "")
1419    (match_operand:V4SF 1 "register_operand" "")]
1420   "TARGET_SSE"
1422   ix86_expand_reduc_v4sf (gen_sminv4sf3, operands[0], operands[1]);
1423   DONE;
1426 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1428 ;; Parallel floating point comparisons
1430 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1432 (define_insn "avx_cmp<ssemodesuffix><mode>3"
1433   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1434         (unspec:AVXMODEF2P
1435           [(match_operand:AVXMODEF2P 1 "register_operand" "x")
1436            (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")
1437            (match_operand:SI 3 "const_0_to_31_operand" "n")]
1438           UNSPEC_PCMP))]
1439   "TARGET_AVX"
1440   "vcmp<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1441   [(set_attr "type" "ssecmp")
1442    (set_attr "length_immediate" "1")
1443    (set_attr "prefix" "vex")
1444    (set_attr "mode" "<MODE>")])
1446 (define_insn "avx_cmp<ssescalarmodesuffix><mode>3"
1447   [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
1448         (vec_merge:SSEMODEF2P
1449           (unspec:SSEMODEF2P
1450             [(match_operand:SSEMODEF2P 1 "register_operand" "x")
1451              (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")
1452              (match_operand:SI 3 "const_0_to_31_operand" "n")]
1453             UNSPEC_PCMP)
1454          (match_dup 1)
1455          (const_int 1)))]
1456   "TARGET_AVX"
1457   "vcmp<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1458   [(set_attr "type" "ssecmp")
1459    (set_attr "length_immediate" "1")
1460    (set_attr "prefix" "vex")
1461    (set_attr "mode" "<ssescalarmode>")])
1463 ;; We don't promote 128bit vector compare intrinsics. But vectorizer
1464 ;; may generate 256bit vector compare instructions.
1465 (define_insn "*avx_maskcmp<mode>3"
1466   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1467         (match_operator:AVXMODEF2P 3 "avx_comparison_float_operator"
1468                 [(match_operand:AVXMODEF2P 1 "register_operand" "x")
1469                  (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")]))]
1470   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
1471   "vcmp%D3<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
1472   [(set_attr "type" "ssecmp")
1473    (set_attr "prefix" "vex")
1474    (set_attr "length_immediate" "1")
1475    (set_attr "mode" "<avxvecmode>")])
1477 (define_insn "<sse>_maskcmp<mode>3"
1478   [(set (match_operand:SSEMODEF4 0 "register_operand" "=x")
1479         (match_operator:SSEMODEF4 3 "sse_comparison_operator"
1480                 [(match_operand:SSEMODEF4 1 "register_operand" "0")
1481                  (match_operand:SSEMODEF4 2 "nonimmediate_operand" "xm")]))]
1482   "!TARGET_XOP 
1483   && (SSE_FLOAT_MODE_P (<MODE>mode) || SSE_VEC_FLOAT_MODE_P (<MODE>mode))"
1484   "cmp%D3<ssemodesuffix>\t{%2, %0|%0, %2}"
1485   [(set_attr "type" "ssecmp")
1486    (set_attr "length_immediate" "1")
1487    (set_attr "mode" "<MODE>")])
1489 (define_insn "*avx_vmmaskcmp<mode>3"
1490   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1491         (vec_merge:SSEMODEF2P
1492          (match_operator:SSEMODEF2P 3 "sse_comparison_operator"
1493                 [(match_operand:SSEMODEF2P 1 "register_operand" "x")
1494                  (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")])
1495          (match_dup 1)
1496          (const_int 1)))]
1497   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
1498   "vcmp%D3<ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
1499   [(set_attr "type" "ssecmp")
1500    (set_attr "prefix" "vex")
1501    (set_attr "mode" "<ssescalarmode>")])
1503 (define_insn "<sse>_vmmaskcmp<mode>3"
1504   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1505         (vec_merge:SSEMODEF2P
1506          (match_operator:SSEMODEF2P 3 "sse_comparison_operator"
1507                 [(match_operand:SSEMODEF2P 1 "register_operand" "0")
1508                  (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")])
1509          (match_dup 1)
1510          (const_int 1)))]
1511   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1512   "cmp%D3<ssescalarmodesuffix>\t{%2, %0|%0, %2}"
1513   [(set_attr "type" "ssecmp")
1514    (set_attr "length_immediate" "1")
1515    (set_attr "mode" "<ssescalarmode>")])
1517 (define_insn "<sse>_comi"
1518   [(set (reg:CCFP FLAGS_REG)
1519         (compare:CCFP
1520           (vec_select:MODEF
1521             (match_operand:<ssevecmode> 0 "register_operand" "x")
1522             (parallel [(const_int 0)]))
1523           (vec_select:MODEF
1524             (match_operand:<ssevecmode> 1 "nonimmediate_operand" "xm")
1525             (parallel [(const_int 0)]))))]
1526   "SSE_FLOAT_MODE_P (<MODE>mode)"
1527   "%vcomis<ssemodefsuffix>\t{%1, %0|%0, %1}"
1528   [(set_attr "type" "ssecomi")
1529    (set_attr "prefix" "maybe_vex")
1530    (set_attr "prefix_rep" "0")
1531    (set (attr "prefix_data16")
1532         (if_then_else (eq_attr "mode" "DF")
1533                       (const_string "1")
1534                       (const_string "0")))
1535    (set_attr "mode" "<MODE>")])
1537 (define_insn "<sse>_ucomi"
1538   [(set (reg:CCFPU FLAGS_REG)
1539         (compare:CCFPU
1540           (vec_select:MODEF
1541             (match_operand:<ssevecmode> 0 "register_operand" "x")
1542             (parallel [(const_int 0)]))
1543           (vec_select:MODEF
1544             (match_operand:<ssevecmode> 1 "nonimmediate_operand" "xm")
1545             (parallel [(const_int 0)]))))]
1546   "SSE_FLOAT_MODE_P (<MODE>mode)"
1547   "%vucomis<ssemodefsuffix>\t{%1, %0|%0, %1}"
1548   [(set_attr "type" "ssecomi")
1549    (set_attr "prefix" "maybe_vex")
1550    (set_attr "prefix_rep" "0")
1551    (set (attr "prefix_data16")
1552         (if_then_else (eq_attr "mode" "DF")
1553                       (const_string "1")
1554                       (const_string "0")))
1555    (set_attr "mode" "<MODE>")])
1557 (define_expand "vcond<mode>"
1558   [(set (match_operand:AVXMODEF2P 0 "register_operand" "")
1559         (if_then_else:AVXMODEF2P
1560           (match_operator 3 ""
1561             [(match_operand:AVXMODEF2P 4 "nonimmediate_operand" "")
1562              (match_operand:AVXMODEF2P 5 "nonimmediate_operand" "")])
1563           (match_operand:AVXMODEF2P 1 "general_operand" "")
1564           (match_operand:AVXMODEF2P 2 "general_operand" "")))]
1565   "(SSE_VEC_FLOAT_MODE_P (<MODE>mode)
1566     || AVX_VEC_FLOAT_MODE_P (<MODE>mode))"
1568   bool ok = ix86_expand_fp_vcond (operands);
1569   gcc_assert (ok);
1570   DONE;
1573 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1575 ;; Parallel floating point logical operations
1577 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1579 (define_insn "avx_andnot<mode>3"
1580   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1581         (and:AVXMODEF2P
1582           (not:AVXMODEF2P
1583             (match_operand:AVXMODEF2P 1 "register_operand" "x"))
1584           (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
1585   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
1586   "vandn<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
1587   [(set_attr "type" "sselog")
1588    (set_attr "prefix" "vex")
1589    (set_attr "mode" "<avxvecmode>")])
1591 (define_insn "<sse>_andnot<mode>3"
1592   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1593         (and:SSEMODEF2P
1594           (not:SSEMODEF2P
1595             (match_operand:SSEMODEF2P 1 "register_operand" "0"))
1596           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
1597   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1598   "andn<ssemodesuffix>\t{%2, %0|%0, %2}"
1599   [(set_attr "type" "sselog")
1600    (set_attr "mode" "<MODE>")])
1602 (define_expand "<code><mode>3"
1603   [(set (match_operand:AVX256MODEF2P 0 "register_operand" "")
1604         (any_logic:AVX256MODEF2P
1605           (match_operand:AVX256MODEF2P 1 "nonimmediate_operand" "")
1606           (match_operand:AVX256MODEF2P 2 "nonimmediate_operand" "")))]
1607   "AVX256_VEC_FLOAT_MODE_P (<MODE>mode)"
1608   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
1610 (define_insn "*avx_<code><mode>3"
1611   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1612         (any_logic:AVXMODEF2P
1613           (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x")
1614           (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
1615   "AVX_VEC_FLOAT_MODE_P (<MODE>mode)
1616    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
1618   if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
1619     return "v<logic>ps\t{%2, %1, %0|%0, %1, %2}";
1620   else
1621     return "v<logic><ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}";
1623   [(set_attr "type" "sselog")
1624    (set_attr "prefix" "vex")
1625    (set_attr "mode" "<avxvecmode>")])
1627 (define_expand "<code><mode>3"
1628   [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
1629         (any_logic:SSEMODEF2P
1630           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "")
1631           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "")))]
1632   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1633   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
1635 (define_insn "*<code><mode>3"
1636   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1637         (any_logic:SSEMODEF2P
1638           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%0")
1639           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
1640   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)
1641    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
1643   if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
1644     return "<logic>ps\t{%2, %0|%0, %2}";
1645   else
1646     return "<logic><ssemodesuffix>\t{%2, %0|%0, %2}";
1648   [(set_attr "type" "sselog")
1649    (set_attr "mode" "<MODE>")])
1651 (define_expand "copysign<mode>3"
1652   [(set (match_dup 4)
1653         (and:SSEMODEF2P 
1654           (not:SSEMODEF2P (match_dup 3))
1655           (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "")))
1656    (set (match_dup 5)
1657         (and:SSEMODEF2P (match_dup 3)
1658                         (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "")))
1659    (set (match_operand:SSEMODEF2P 0 "register_operand" "")
1660         (ior:SSEMODEF2P (match_dup 4) (match_dup 5)))]
1661   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1663   operands[3] = ix86_build_signbit_mask (<ssescalarmode>mode, 1, 0);
1665   operands[4] = gen_reg_rtx (<MODE>mode);
1666   operands[5] = gen_reg_rtx (<MODE>mode);
1669 ;; Also define scalar versions.  These are used for abs, neg, and
1670 ;; conditional move.  Using subregs into vector modes causes register
1671 ;; allocation lossage.  These patterns do not allow memory operands
1672 ;; because the native instructions read the full 128-bits.
1674 (define_insn "*avx_andnot<mode>3"
1675   [(set (match_operand:MODEF 0 "register_operand" "=x")
1676         (and:MODEF
1677           (not:MODEF
1678             (match_operand:MODEF 1 "register_operand" "x"))
1679             (match_operand:MODEF 2 "register_operand" "x")))]
1680   "AVX_FLOAT_MODE_P (<MODE>mode)"
1681   "vandnp<ssemodefsuffix>\t{%2, %1, %0|%0, %1, %2}"
1682   [(set_attr "type" "sselog")
1683    (set_attr "prefix" "vex")
1684    (set_attr "mode" "<ssevecmode>")])
1686 (define_insn "*andnot<mode>3"
1687   [(set (match_operand:MODEF 0 "register_operand" "=x")
1688         (and:MODEF
1689           (not:MODEF
1690             (match_operand:MODEF 1 "register_operand" "0"))
1691             (match_operand:MODEF 2 "register_operand" "x")))]
1692   "SSE_FLOAT_MODE_P (<MODE>mode)"
1693   "andnp<ssemodefsuffix>\t{%2, %0|%0, %2}"
1694   [(set_attr "type" "sselog")
1695    (set_attr "mode" "<ssevecmode>")])
1697 (define_insn "*avx_<code><mode>3"
1698   [(set (match_operand:MODEF 0 "register_operand" "=x")
1699         (any_logic:MODEF
1700           (match_operand:MODEF 1 "register_operand" "x")
1701           (match_operand:MODEF 2 "register_operand" "x")))]
1702   "AVX_FLOAT_MODE_P (<MODE>mode)"
1704   if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
1705     return "v<logic>ps\t{%2, %1, %0|%0, %1, %2}";
1706   else
1707     return "v<logic>p<ssemodefsuffix>\t{%2, %1, %0|%0, %1, %2}";
1709   [(set_attr "type" "sselog")
1710    (set_attr "prefix" "vex")
1711    (set_attr "mode" "<ssevecmode>")])
1713 (define_insn "*<code><mode>3"
1714   [(set (match_operand:MODEF 0 "register_operand" "=x")
1715         (any_logic:MODEF
1716           (match_operand:MODEF 1 "register_operand" "0")
1717           (match_operand:MODEF 2 "register_operand" "x")))]
1718   "SSE_FLOAT_MODE_P (<MODE>mode)"
1720   if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
1721     return "<logic>ps\t{%2, %0|%0, %2}";
1722   else
1723     return "<logic>p<ssemodefsuffix>\t{%2, %0|%0, %2}";
1725   [(set_attr "type" "sselog")
1726    (set_attr "mode" "<ssevecmode>")])
1728 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1730 ;; FMA4 floating point multiply/accumulate instructions.  This
1731 ;; includes the scalar version of the instructions as well as the
1732 ;; vector.
1734 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1736 ;; In order to match (*a * *b) + *c, particularly when vectorizing, allow
1737 ;; combine to generate a multiply/add with two memory references.  We then
1738 ;; split this insn, into loading up the destination register with one of the
1739 ;; memory operations.  If we don't manage to split the insn, reload will
1740 ;; generate the appropriate moves.  The reason this is needed, is that combine
1741 ;; has already folded one of the memory references into both the multiply and
1742 ;; add insns, and it can't generate a new pseudo.  I.e.:
1743 ;;      (set (reg1) (mem (addr1)))
1744 ;;      (set (reg2) (mult (reg1) (mem (addr2))))
1745 ;;      (set (reg3) (plus (reg2) (mem (addr3))))
1747 (define_insn "fma4_fmadd<mode>4256"
1748   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1749         (plus:FMA4MODEF4
1750          (mult:FMA4MODEF4
1751           (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1752           (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1753          (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x")))]
1754   "TARGET_FMA4 && TARGET_FUSED_MADD"
1755   "vfmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1756   [(set_attr "type" "ssemuladd")
1757    (set_attr "mode" "<MODE>")])
1759 ;; Floating multiply and subtract.
1760 (define_insn "fma4_fmsub<mode>4256"
1761   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1762         (minus:FMA4MODEF4
1763          (mult:FMA4MODEF4
1764           (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1765           (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1766          (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x")))]
1767   "TARGET_FMA4 && TARGET_FUSED_MADD"
1768   "vfmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1769   [(set_attr "type" "ssemuladd")
1770    (set_attr "mode" "<MODE>")])
1772 ;; Floating point negative multiply and add.
1773 ;; Rewrite (- (a * b) + c) into the canonical form: c - (a * b).
1774 (define_insn "fma4_fnmadd<mode>4256"
1775   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1776         (minus:FMA4MODEF4
1777          (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x")
1778          (mult:FMA4MODEF4
1779           (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1780           (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))))]
1781   "TARGET_FMA4 && TARGET_FUSED_MADD"
1782   "vfnmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1783   [(set_attr "type" "ssemuladd")
1784    (set_attr "mode" "<MODE>")])
1786 ;; Floating point negative multiply and subtract.
1787 (define_insn "fma4_fnmsub<mode>4256"
1788   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1789         (minus:FMA4MODEF4
1790          (mult:FMA4MODEF4
1791           (neg:FMA4MODEF4
1792            (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x"))
1793           (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1794          (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x")))]
1795   "TARGET_FMA4 && TARGET_FUSED_MADD"
1796   "vfnmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1797   [(set_attr "type" "ssemuladd")
1798    (set_attr "mode" "<MODE>")])
1800 (define_insn "fma4_fmadd<mode>4"
1801   [(set (match_operand:SSEMODEF4 0 "register_operand" "=x,x")
1802         (plus:SSEMODEF4
1803          (mult:SSEMODEF4
1804           (match_operand:SSEMODEF4 1 "nonimmediate_operand" "%x,x")
1805           (match_operand:SSEMODEF4 2 "nonimmediate_operand" "x,m"))
1806          (match_operand:SSEMODEF4 3 "nonimmediate_operand" "xm,x")))]
1807   "TARGET_FMA4 && TARGET_FUSED_MADD"
1808   "vfmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1809   [(set_attr "type" "ssemuladd")
1810    (set_attr "mode" "<MODE>")])
1812 ;; For the scalar operations, use operand1 for the upper words that aren't
1813 ;; modified, so restrict the forms that are generated.
1814 ;; Scalar version of fmadd.
1815 (define_insn "fma4_vmfmadd<mode>4"
1816   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1817         (vec_merge:SSEMODEF2P
1818          (plus:SSEMODEF2P
1819           (mult:SSEMODEF2P
1820            (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
1821            (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
1822           (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
1823          (match_dup 0)
1824          (const_int 1)))]
1825   "TARGET_FMA4 && TARGET_FUSED_MADD"
1826   "vfmadd<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1827   [(set_attr "type" "ssemuladd")
1828    (set_attr "mode" "<MODE>")])
1830 ;; Floating multiply and subtract.
1831 ;; Allow two memory operands the same as fmadd.
1832 (define_insn "fma4_fmsub<mode>4"
1833   [(set (match_operand:SSEMODEF4 0 "register_operand" "=x,x")
1834         (minus:SSEMODEF4
1835          (mult:SSEMODEF4
1836           (match_operand:SSEMODEF4 1 "nonimmediate_operand" "%x,x")
1837           (match_operand:SSEMODEF4 2 "nonimmediate_operand" "x,m"))
1838          (match_operand:SSEMODEF4 3 "nonimmediate_operand" "xm,x")))]
1839   "TARGET_FMA4 && TARGET_FUSED_MADD"
1840   "vfmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1841   [(set_attr "type" "ssemuladd")
1842    (set_attr "mode" "<MODE>")])
1844 ;; For the scalar operations, use operand1 for the upper words that aren't
1845 ;; modified, so restrict the forms that are generated.
1846 ;; Scalar version of fmsub.
1847 (define_insn "fma4_vmfmsub<mode>4"
1848   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1849         (vec_merge:SSEMODEF2P
1850          (minus:SSEMODEF2P
1851           (mult:SSEMODEF2P
1852            (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
1853            (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
1854           (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
1855          (match_dup 0)
1856          (const_int 1)))]
1857   "TARGET_FMA4 && TARGET_FUSED_MADD"
1858   "vfmsub<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1859   [(set_attr "type" "ssemuladd")
1860    (set_attr "mode" "<MODE>")])
1862 ;; Floating point negative multiply and add.
1863 ;; Rewrite (- (a * b) + c) into the canonical form: c - (a * b).
1864 (define_insn "fma4_fnmadd<mode>4"
1865   [(set (match_operand:SSEMODEF4 0 "register_operand" "=x,x")
1866         (minus:SSEMODEF4
1867          (match_operand:SSEMODEF4 3 "nonimmediate_operand" "xm,x")
1868          (mult:SSEMODEF4
1869           (match_operand:SSEMODEF4 1 "nonimmediate_operand" "%x,x")
1870           (match_operand:SSEMODEF4 2 "nonimmediate_operand" "x,m"))))]
1871   "TARGET_FMA4 && TARGET_FUSED_MADD"
1872   "vfnmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1873   [(set_attr "type" "ssemuladd")
1874    (set_attr "mode" "<MODE>")])
1876 ;; For the scalar operations, use operand1 for the upper words that aren't
1877 ;; modified, so restrict the forms that are generated.
1878 ;; Scalar version of fnmadd.
1879 (define_insn "fma4_vmfnmadd<mode>4"
1880   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1881         (vec_merge:SSEMODEF2P
1882          (minus:SSEMODEF2P
1883           (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x")
1884           (mult:SSEMODEF2P
1885            (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
1886            (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m")))
1887          (match_dup 0)
1888          (const_int 1)))]
1889   "TARGET_FMA4 && TARGET_FUSED_MADD"
1890   "vfnmadd<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1891   [(set_attr "type" "ssemuladd")
1892    (set_attr "mode" "<MODE>")])
1894 ;; Floating point negative multiply and subtract.
1895 ;; Rewrite (- (a * b) - c) into the canonical form: ((-a) * b) - c.
1896 (define_insn "fma4_fnmsub<mode>4"
1897   [(set (match_operand:SSEMODEF4 0 "register_operand" "=x,x")
1898         (minus:SSEMODEF4
1899          (mult:SSEMODEF4
1900           (neg:SSEMODEF4
1901            (match_operand:SSEMODEF4 1 "nonimmediate_operand" "%x,x"))
1902           (match_operand:SSEMODEF4 2 "nonimmediate_operand" "x,m"))
1903          (match_operand:SSEMODEF4 3 "nonimmediate_operand" "xm,x")))]
1904   "TARGET_FMA4 && TARGET_FUSED_MADD"
1905   "vfnmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1906   [(set_attr "type" "ssemuladd")
1907    (set_attr "mode" "<MODE>")])
1909 ;; For the scalar operations, use operand1 for the upper words that aren't
1910 ;; modified, so restrict the forms that are generated.
1911 ;; Scalar version of fnmsub.
1912 (define_insn "fma4_vmfnmsub<mode>4"
1913   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1914         (vec_merge:SSEMODEF2P
1915          (minus:SSEMODEF2P
1916           (mult:SSEMODEF2P
1917            (neg:SSEMODEF2P
1918             (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x"))
1919            (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
1920           (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
1921          (match_dup 0)
1922          (const_int 1)))]
1923   "TARGET_FMA4 && TARGET_FUSED_MADD"
1924   "vfnmsub<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1925   [(set_attr "type" "ssemuladd")
1926    (set_attr "mode" "<MODE>")])
1928 (define_insn "fma4i_fmadd<mode>4256"
1929   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1930         (unspec:FMA4MODEF4
1931          [(plus:FMA4MODEF4
1932            (mult:FMA4MODEF4
1933             (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1934             (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1935            (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x"))]
1936          UNSPEC_FMA4_INTRINSIC))]
1937   "TARGET_FMA4"
1938   "vfmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1939   [(set_attr "type" "ssemuladd")
1940    (set_attr "mode" "<MODE>")])
1942 (define_insn "fma4i_fmsub<mode>4256"
1943   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1944         (unspec:FMA4MODEF4
1945          [(minus:FMA4MODEF4
1946            (mult:FMA4MODEF4
1947             (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1948             (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1949            (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x"))]
1950          UNSPEC_FMA4_INTRINSIC))]
1951   "TARGET_FMA4"
1952   "vfmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1953   [(set_attr "type" "ssemuladd")
1954    (set_attr "mode" "<MODE>")])
1956 (define_insn "fma4i_fnmadd<mode>4256"
1957   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1958         (unspec:FMA4MODEF4
1959          [(minus:FMA4MODEF4
1960            (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x")
1961            (mult:FMA4MODEF4
1962             (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1963             (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m")))]
1964          UNSPEC_FMA4_INTRINSIC))]
1965   "TARGET_FMA4"
1966   "vfnmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1967   [(set_attr "type" "ssemuladd")
1968    (set_attr "mode" "<MODE>")])
1970 (define_insn "fma4i_fnmsub<mode>4256"
1971   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1972         (unspec:FMA4MODEF4
1973          [(minus:FMA4MODEF4
1974            (mult:FMA4MODEF4
1975             (neg:FMA4MODEF4
1976              (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x"))
1977             (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1978            (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x"))]
1979          UNSPEC_FMA4_INTRINSIC))]
1980   "TARGET_FMA4"
1981   "vfnmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1982   [(set_attr "type" "ssemuladd")
1983    (set_attr "mode" "<MODE>")])
1985 (define_insn "fma4i_fmadd<mode>4"
1986   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1987         (unspec:SSEMODEF2P
1988          [(plus:SSEMODEF2P
1989            (mult:SSEMODEF2P
1990             (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
1991             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
1992            (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))]
1993          UNSPEC_FMA4_INTRINSIC))]
1994   "TARGET_FMA4"
1995   "vfmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1996   [(set_attr "type" "ssemuladd")
1997    (set_attr "mode" "<MODE>")])
1999 (define_insn "fma4i_fmsub<mode>4"
2000   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
2001         (unspec:SSEMODEF2P
2002          [(minus:SSEMODEF2P
2003            (mult:SSEMODEF2P
2004             (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
2005             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
2006            (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))]
2007          UNSPEC_FMA4_INTRINSIC))]
2008   "TARGET_FMA4"
2009   "vfmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2010   [(set_attr "type" "ssemuladd")
2011    (set_attr "mode" "<MODE>")])
2013 (define_insn "fma4i_fnmadd<mode>4"
2014   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
2015         (unspec:SSEMODEF2P
2016          [(minus:SSEMODEF2P
2017            (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x")
2018            (mult:SSEMODEF2P
2019             (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
2020             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m")))]
2021          UNSPEC_FMA4_INTRINSIC))]
2022   "TARGET_FMA4"
2023   "vfnmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2024   [(set_attr "type" "ssemuladd")
2025    (set_attr "mode" "<MODE>")])
2027 (define_insn "fma4i_fnmsub<mode>4"
2028   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
2029         (unspec:SSEMODEF2P
2030          [(minus:SSEMODEF2P
2031            (mult:SSEMODEF2P
2032             (neg:SSEMODEF2P
2033              (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x"))
2034             (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
2035            (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))]
2036          UNSPEC_FMA4_INTRINSIC))]
2037   "TARGET_FMA4"
2038   "vfnmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2039   [(set_attr "type" "ssemuladd")
2040    (set_attr "mode" "<MODE>")])
2042 ;; For the scalar operations, use operand1 for the upper words that aren't
2043 ;; modified, so restrict the forms that are accepted.
2044 (define_insn "fma4i_vmfmadd<mode>4"
2045   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
2046         (unspec:SSEMODEF2P
2047          [(vec_merge:SSEMODEF2P
2048            (plus:SSEMODEF2P
2049             (mult:SSEMODEF2P
2050              (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
2051              (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
2052             (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
2053            (match_dup 0)
2054            (const_int 1))]
2055          UNSPEC_FMA4_INTRINSIC))]
2056   "TARGET_FMA4"
2057   "vfmadd<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2058   [(set_attr "type" "ssemuladd")
2059    (set_attr "mode" "<ssescalarmode>")])
2061 (define_insn "fma4i_vmfmsub<mode>4"
2062   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
2063         (unspec:SSEMODEF2P
2064          [(vec_merge:SSEMODEF2P
2065            (minus:SSEMODEF2P
2066             (mult:SSEMODEF2P
2067              (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
2068              (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
2069             (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
2070            (match_dup 0)
2071            (const_int 1))]
2072          UNSPEC_FMA4_INTRINSIC))]
2073   "TARGET_FMA4"
2074   "vfmsub<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2075   [(set_attr "type" "ssemuladd")
2076    (set_attr "mode" "<ssescalarmode>")])
2078 (define_insn "fma4i_vmfnmadd<mode>4"
2079   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
2080         (unspec:SSEMODEF2P
2081          [(vec_merge:SSEMODEF2P
2082            (minus:SSEMODEF2P
2083             (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x")
2084             (mult:SSEMODEF2P
2085              (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
2086              (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m")))
2087            (match_dup 0)
2088            (const_int 1))]
2089          UNSPEC_FMA4_INTRINSIC))]
2090   "TARGET_FMA4"
2091   "vfnmadd<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2092   [(set_attr "type" "ssemuladd")
2093    (set_attr "mode" "<ssescalarmode>")])
2095 (define_insn "fma4i_vmfnmsub<mode>4"
2096   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
2097         (unspec:SSEMODEF2P
2098          [(vec_merge:SSEMODEF2P
2099            (minus:SSEMODEF2P
2100             (mult:SSEMODEF2P
2101              (neg:SSEMODEF2P
2102               (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x"))
2103              (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
2104             (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
2105            (match_dup 0)
2106            (const_int 1))]
2107          UNSPEC_FMA4_INTRINSIC))]
2108   "TARGET_FMA4"
2109   "vfnmsub<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2110   [(set_attr "type" "ssemuladd")
2111    (set_attr "mode" "<ssescalarmode>")])
2113 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2115 ;; FMA4 Parallel floating point multiply addsub and subadd operations.
2117 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2119 (define_insn "fma4_fmaddsubv8sf4"
2120   [(set (match_operand:V8SF 0 "register_operand" "=x,x")
2121         (vec_merge:V8SF
2122           (plus:V8SF
2123             (mult:V8SF
2124               (match_operand:V8SF 1 "nonimmediate_operand" "%x,x")
2125               (match_operand:V8SF 2 "nonimmediate_operand" "x,m"))
2126             (match_operand:V8SF 3 "nonimmediate_operand" "xm,x"))
2127           (minus:V8SF
2128             (mult:V8SF
2129               (match_dup 1)
2130               (match_dup 2))
2131             (match_dup 3))
2132           (const_int 170)))]
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" "V8SF")])
2138 (define_insn "fma4_fmaddsubv4df4"
2139   [(set (match_operand:V4DF 0 "register_operand" "=x,x")
2140         (vec_merge:V4DF
2141           (plus:V4DF
2142             (mult:V4DF
2143               (match_operand:V4DF 1 "nonimmediate_operand" "%x,x")
2144               (match_operand:V4DF 2 "nonimmediate_operand" "x,m"))
2145             (match_operand:V4DF 3 "nonimmediate_operand" "xm,x"))
2146           (minus:V4DF
2147             (mult:V4DF
2148               (match_dup 1)
2149               (match_dup 2))
2150             (match_dup 3))
2151           (const_int 10)))]
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" "V4DF")])
2157 (define_insn "fma4_fmaddsubv4sf4"
2158   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2159         (vec_merge:V4SF
2160           (plus:V4SF
2161             (mult:V4SF
2162               (match_operand:V4SF 1 "nonimmediate_operand" "%x,x")
2163               (match_operand:V4SF 2 "nonimmediate_operand" "x,m"))
2164             (match_operand:V4SF 3 "nonimmediate_operand" "xm,x"))
2165           (minus:V4SF
2166             (mult:V4SF
2167               (match_dup 1)
2168               (match_dup 2))
2169             (match_dup 3))
2170           (const_int 10)))]
2171   "TARGET_FMA4 && TARGET_FUSED_MADD"
2172   "vfmaddsubps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2173   [(set_attr "type" "ssemuladd")
2174    (set_attr "mode" "V4SF")])
2176 (define_insn "fma4_fmaddsubv2df4"
2177   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2178         (vec_merge:V2DF
2179           (plus:V2DF
2180             (mult:V2DF
2181               (match_operand:V2DF 1 "nonimmediate_operand" "%x,x")
2182               (match_operand:V2DF 2 "nonimmediate_operand" "x,m"))
2183             (match_operand:V2DF 3 "nonimmediate_operand" "xm,x"))
2184           (minus:V2DF
2185             (mult:V2DF
2186               (match_dup 1)
2187               (match_dup 2))
2188             (match_dup 3))
2189           (const_int 2)))]
2190   "TARGET_FMA4 && TARGET_FUSED_MADD"
2191   "vfmaddsubpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2192   [(set_attr "type" "ssemuladd")
2193    (set_attr "mode" "V2DF")])
2195 (define_insn "fma4_fmsubaddv8sf4"
2196   [(set (match_operand:V8SF 0 "register_operand" "=x,x")
2197         (vec_merge:V8SF
2198           (plus:V8SF
2199             (mult:V8SF
2200               (match_operand:V8SF 1 "nonimmediate_operand" "%x,x")
2201               (match_operand:V8SF 2 "nonimmediate_operand" "x,m"))
2202             (match_operand:V8SF 3 "nonimmediate_operand" "xm,x"))
2203           (minus:V8SF
2204             (mult:V8SF
2205               (match_dup 1)
2206               (match_dup 2))
2207             (match_dup 3))
2208           (const_int 85)))]
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" "V8SF")])
2214 (define_insn "fma4_fmsubaddv4df4"
2215   [(set (match_operand:V4DF 0 "register_operand" "=x,x")
2216         (vec_merge:V4DF
2217           (plus:V4DF
2218             (mult:V4DF
2219               (match_operand:V4DF 1 "nonimmediate_operand" "%x,x")
2220               (match_operand:V4DF 2 "nonimmediate_operand" "x,m"))
2221             (match_operand:V4DF 3 "nonimmediate_operand" "xm,x"))
2222           (minus:V4DF
2223             (mult:V4DF
2224               (match_dup 1)
2225               (match_dup 2))
2226             (match_dup 3))
2227           (const_int 5)))]
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" "V4DF")])
2233 (define_insn "fma4_fmsubaddv4sf4"
2234   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2235         (vec_merge:V4SF
2236           (plus:V4SF
2237             (mult:V4SF
2238               (match_operand:V4SF 1 "nonimmediate_operand" "%x,x")
2239               (match_operand:V4SF 2 "nonimmediate_operand" "x,m"))
2240             (match_operand:V4SF 3 "nonimmediate_operand" "xm,x"))
2241           (minus:V4SF
2242             (mult:V4SF
2243               (match_dup 1)
2244               (match_dup 2))
2245             (match_dup 3))
2246           (const_int 5)))]
2247   "TARGET_FMA4 && TARGET_FUSED_MADD"
2248   "vfmsubaddps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2249   [(set_attr "type" "ssemuladd")
2250    (set_attr "mode" "V4SF")])
2252 (define_insn "fma4_fmsubaddv2df4"
2253   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2254         (vec_merge:V2DF
2255           (plus:V2DF
2256             (mult:V2DF
2257               (match_operand:V2DF 1 "nonimmediate_operand" "%x,x")
2258               (match_operand:V2DF 2 "nonimmediate_operand" "x,m"))
2259             (match_operand:V2DF 3 "nonimmediate_operand" "xm,x"))
2260           (minus:V2DF
2261             (mult:V2DF
2262               (match_dup 1)
2263               (match_dup 2))
2264             (match_dup 3))
2265           (const_int 1)))]
2266   "TARGET_FMA4 && TARGET_FUSED_MADD"
2267   "vfmsubaddpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2268   [(set_attr "type" "ssemuladd")
2269    (set_attr "mode" "V2DF")])
2271 (define_insn "fma4i_fmaddsubv8sf4"
2272   [(set (match_operand:V8SF 0 "register_operand" "=x,x")
2273         (unspec:V8SF
2274          [(vec_merge:V8SF
2275            (plus:V8SF
2276              (mult:V8SF
2277                (match_operand:V8SF 1 "nonimmediate_operand" "%x,x")
2278                (match_operand:V8SF 2 "nonimmediate_operand" "x,m"))
2279              (match_operand:V8SF 3 "nonimmediate_operand" "xm,x"))
2280            (minus:V8SF
2281              (mult:V8SF
2282                (match_dup 1)
2283                (match_dup 2))
2284              (match_dup 3))
2285            (const_int 170))]
2286          UNSPEC_FMA4_INTRINSIC))]
2287   "TARGET_FMA4"
2288   "vfmaddsubps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2289   [(set_attr "type" "ssemuladd")
2290    (set_attr "mode" "V8SF")])
2292 (define_insn "fma4i_fmaddsubv4df4"
2293   [(set (match_operand:V4DF 0 "register_operand" "=x,x")
2294         (unspec:V4DF
2295          [(vec_merge:V4DF
2296            (plus:V4DF
2297              (mult:V4DF
2298                (match_operand:V4DF 1 "nonimmediate_operand" "%x,x")
2299                (match_operand:V4DF 2 "nonimmediate_operand" "x,m"))
2300              (match_operand:V4DF 3 "nonimmediate_operand" "xm,x"))
2301            (minus:V4DF
2302              (mult:V4DF
2303                (match_dup 1)
2304                (match_dup 2))
2305              (match_dup 3))
2306            (const_int 10))]
2307          UNSPEC_FMA4_INTRINSIC))]
2308   "TARGET_FMA4"
2309   "vfmaddsubpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2310   [(set_attr "type" "ssemuladd")
2311    (set_attr "mode" "V4DF")])
2313 (define_insn "fma4i_fmaddsubv4sf4"
2314   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2315         (unspec:V4SF
2316          [(vec_merge:V4SF
2317            (plus:V4SF
2318              (mult:V4SF
2319                (match_operand:V4SF 1 "nonimmediate_operand" "%x,x")
2320                (match_operand:V4SF 2 "nonimmediate_operand" "x,m"))
2321              (match_operand:V4SF 3 "nonimmediate_operand" "xm,x"))
2322            (minus:V4SF
2323              (mult:V4SF
2324                (match_dup 1)
2325                (match_dup 2))
2326              (match_dup 3))
2327            (const_int 10))]
2328          UNSPEC_FMA4_INTRINSIC))]
2329   "TARGET_FMA4"
2330   "vfmaddsubps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2331   [(set_attr "type" "ssemuladd")
2332    (set_attr "mode" "V4SF")])
2334 (define_insn "fma4i_fmaddsubv2df4"
2335   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2336         (unspec:V2DF
2337          [(vec_merge:V2DF
2338            (plus:V2DF
2339              (mult:V2DF
2340                (match_operand:V2DF 1 "nonimmediate_operand" "%x,x")
2341                (match_operand:V2DF 2 "nonimmediate_operand" "x,m"))
2342              (match_operand:V2DF 3 "nonimmediate_operand" "xm,x"))
2343            (minus:V2DF
2344              (mult:V2DF
2345                (match_dup 1)
2346                (match_dup 2))
2347              (match_dup 3))
2348            (const_int 2))]
2349          UNSPEC_FMA4_INTRINSIC))]
2350   "TARGET_FMA4"
2351   "vfmaddsubpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2352   [(set_attr "type" "ssemuladd")
2353    (set_attr "mode" "V2DF")])
2355 (define_insn "fma4i_fmsubaddv8sf4"
2356   [(set (match_operand:V8SF 0 "register_operand" "=x,x")
2357         (unspec:V8SF
2358          [(vec_merge:V8SF
2359            (plus:V8SF
2360              (mult:V8SF
2361                (match_operand:V8SF 1 "nonimmediate_operand" "%x,x")
2362                (match_operand:V8SF 2 "nonimmediate_operand" "x,m"))
2363              (match_operand:V8SF 3 "nonimmediate_operand" "xm,x"))
2364            (minus:V8SF
2365              (mult:V8SF
2366                (match_dup 1)
2367                (match_dup 2))
2368              (match_dup 3))
2369            (const_int 85))]
2370          UNSPEC_FMA4_INTRINSIC))]
2371   "TARGET_FMA4"
2372   "vfmsubaddps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2373   [(set_attr "type" "ssemuladd")
2374    (set_attr "mode" "V8SF")])
2376 (define_insn "fma4i_fmsubaddv4df4"
2377   [(set (match_operand:V4DF 0 "register_operand" "=x,x")
2378         (unspec:V4DF
2379          [(vec_merge:V4DF
2380            (plus:V4DF
2381              (mult:V4DF
2382                (match_operand:V4DF 1 "nonimmediate_operand" "%x,x")
2383                (match_operand:V4DF 2 "nonimmediate_operand" "x,m"))
2384              (match_operand:V4DF 3 "nonimmediate_operand" "xm,x"))
2385            (minus:V4DF
2386              (mult:V4DF
2387                (match_dup 1)
2388                (match_dup 2))
2389              (match_dup 3))
2390            (const_int 5))]
2391          UNSPEC_FMA4_INTRINSIC))]
2392   "TARGET_FMA4"
2393   "vfmsubaddpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2394   [(set_attr "type" "ssemuladd")
2395    (set_attr "mode" "V4DF")])
2397 (define_insn "fma4i_fmsubaddv4sf4"
2398   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2399         (unspec:V4SF
2400          [(vec_merge:V4SF
2401            (plus:V4SF
2402              (mult:V4SF
2403                (match_operand:V4SF 1 "nonimmediate_operand" "%x,x")
2404                (match_operand:V4SF 2 "nonimmediate_operand" "x,m"))
2405              (match_operand:V4SF 3 "nonimmediate_operand" "xm,x"))
2406            (minus:V4SF
2407              (mult:V4SF
2408                (match_dup 1)
2409                (match_dup 2))
2410              (match_dup 3))
2411            (const_int 5))]
2412          UNSPEC_FMA4_INTRINSIC))]
2413   "TARGET_FMA4"
2414   "vfmsubaddps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2415   [(set_attr "type" "ssemuladd")
2416    (set_attr "mode" "V4SF")])
2418 (define_insn "fma4i_fmsubaddv2df4"
2419   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2420         (unspec:V2DF
2421          [(vec_merge:V2DF
2422            (plus:V2DF
2423              (mult:V2DF
2424                (match_operand:V2DF 1 "nonimmediate_operand" "%x,x")
2425                (match_operand:V2DF 2 "nonimmediate_operand" "x,m"))
2426              (match_operand:V2DF 3 "nonimmediate_operand" "xm,x"))
2427            (minus:V2DF
2428              (mult:V2DF
2429                (match_dup 1)
2430                (match_dup 2))
2431              (match_dup 3))
2432            (const_int 1))]
2433          UNSPEC_FMA4_INTRINSIC))]
2434   "TARGET_FMA4"
2435   "vfmsubaddpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2436   [(set_attr "type" "ssemuladd")
2437    (set_attr "mode" "V2DF")])
2439 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2441 ;; Parallel single-precision floating point conversion operations
2443 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2445 (define_insn "sse_cvtpi2ps"
2446   [(set (match_operand:V4SF 0 "register_operand" "=x")
2447         (vec_merge:V4SF
2448           (vec_duplicate:V4SF
2449             (float:V2SF (match_operand:V2SI 2 "nonimmediate_operand" "ym")))
2450           (match_operand:V4SF 1 "register_operand" "0")
2451           (const_int 3)))]
2452   "TARGET_SSE"
2453   "cvtpi2ps\t{%2, %0|%0, %2}"
2454   [(set_attr "type" "ssecvt")
2455    (set_attr "mode" "V4SF")])
2457 (define_insn "sse_cvtps2pi"
2458   [(set (match_operand:V2SI 0 "register_operand" "=y")
2459         (vec_select:V2SI
2460           (unspec:V4SI [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
2461                        UNSPEC_FIX_NOTRUNC)
2462           (parallel [(const_int 0) (const_int 1)])))]
2463   "TARGET_SSE"
2464   "cvtps2pi\t{%1, %0|%0, %1}"
2465   [(set_attr "type" "ssecvt")
2466    (set_attr "unit" "mmx")
2467    (set_attr "mode" "DI")])
2469 (define_insn "sse_cvttps2pi"
2470   [(set (match_operand:V2SI 0 "register_operand" "=y")
2471         (vec_select:V2SI
2472           (fix:V4SI (match_operand:V4SF 1 "nonimmediate_operand" "xm"))
2473           (parallel [(const_int 0) (const_int 1)])))]
2474   "TARGET_SSE"
2475   "cvttps2pi\t{%1, %0|%0, %1}"
2476   [(set_attr "type" "ssecvt")
2477    (set_attr "unit" "mmx")
2478    (set_attr "prefix_rep" "0")
2479    (set_attr "mode" "SF")])
2481 (define_insn "*avx_cvtsi2ss"
2482   [(set (match_operand:V4SF 0 "register_operand" "=x")
2483         (vec_merge:V4SF
2484           (vec_duplicate:V4SF
2485             (float:SF (match_operand:SI 2 "nonimmediate_operand" "rm")))
2486           (match_operand:V4SF 1 "register_operand" "x")
2487           (const_int 1)))]
2488   "TARGET_AVX"
2489   "vcvtsi2ss\t{%2, %1, %0|%0, %1, %2}"
2490   [(set_attr "type" "sseicvt")
2491    (set_attr "prefix" "vex")
2492    (set_attr "mode" "SF")])
2494 (define_insn "sse_cvtsi2ss"
2495   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2496         (vec_merge:V4SF
2497           (vec_duplicate:V4SF
2498             (float:SF (match_operand:SI 2 "nonimmediate_operand" "r,m")))
2499           (match_operand:V4SF 1 "register_operand" "0,0")
2500           (const_int 1)))]
2501   "TARGET_SSE"
2502   "cvtsi2ss\t{%2, %0|%0, %2}"
2503   [(set_attr "type" "sseicvt")
2504    (set_attr "athlon_decode" "vector,double")
2505    (set_attr "amdfam10_decode" "vector,double")
2506    (set_attr "mode" "SF")])
2508 (define_insn "*avx_cvtsi2ssq"
2509   [(set (match_operand:V4SF 0 "register_operand" "=x")
2510         (vec_merge:V4SF
2511           (vec_duplicate:V4SF
2512             (float:SF (match_operand:DI 2 "nonimmediate_operand" "rm")))
2513           (match_operand:V4SF 1 "register_operand" "x")
2514           (const_int 1)))]
2515   "TARGET_AVX && TARGET_64BIT"
2516   "vcvtsi2ssq\t{%2, %1, %0|%0, %1, %2}"
2517   [(set_attr "type" "sseicvt")
2518    (set_attr "length_vex" "4")
2519    (set_attr "prefix" "vex")
2520    (set_attr "mode" "SF")])
2522 (define_insn "sse_cvtsi2ssq"
2523   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2524         (vec_merge:V4SF
2525           (vec_duplicate:V4SF
2526             (float:SF (match_operand:DI 2 "nonimmediate_operand" "r,rm")))
2527           (match_operand:V4SF 1 "register_operand" "0,0")
2528           (const_int 1)))]
2529   "TARGET_SSE && TARGET_64BIT"
2530   "cvtsi2ssq\t{%2, %0|%0, %2}"
2531   [(set_attr "type" "sseicvt")
2532    (set_attr "prefix_rex" "1")
2533    (set_attr "athlon_decode" "vector,double")
2534    (set_attr "amdfam10_decode" "vector,double")
2535    (set_attr "mode" "SF")])
2537 (define_insn "sse_cvtss2si"
2538   [(set (match_operand:SI 0 "register_operand" "=r,r")
2539         (unspec:SI
2540           [(vec_select:SF
2541              (match_operand:V4SF 1 "nonimmediate_operand" "x,m")
2542              (parallel [(const_int 0)]))]
2543           UNSPEC_FIX_NOTRUNC))]
2544   "TARGET_SSE"
2545   "%vcvtss2si\t{%1, %0|%0, %1}"
2546   [(set_attr "type" "sseicvt")
2547    (set_attr "athlon_decode" "double,vector")
2548    (set_attr "prefix_rep" "1")
2549    (set_attr "prefix" "maybe_vex")
2550    (set_attr "mode" "SI")])
2552 (define_insn "sse_cvtss2si_2"
2553   [(set (match_operand:SI 0 "register_operand" "=r,r")
2554         (unspec:SI [(match_operand:SF 1 "nonimmediate_operand" "x,m")]
2555                    UNSPEC_FIX_NOTRUNC))]
2556   "TARGET_SSE"
2557   "%vcvtss2si\t{%1, %0|%0, %1}"
2558   [(set_attr "type" "sseicvt")
2559    (set_attr "athlon_decode" "double,vector")
2560    (set_attr "amdfam10_decode" "double,double")
2561    (set_attr "prefix_rep" "1")
2562    (set_attr "prefix" "maybe_vex")
2563    (set_attr "mode" "SI")])
2565 (define_insn "sse_cvtss2siq"
2566   [(set (match_operand:DI 0 "register_operand" "=r,r")
2567         (unspec:DI
2568           [(vec_select:SF
2569              (match_operand:V4SF 1 "nonimmediate_operand" "x,m")
2570              (parallel [(const_int 0)]))]
2571           UNSPEC_FIX_NOTRUNC))]
2572   "TARGET_SSE && TARGET_64BIT"
2573   "%vcvtss2si{q}\t{%1, %0|%0, %1}"
2574   [(set_attr "type" "sseicvt")
2575    (set_attr "athlon_decode" "double,vector")
2576    (set_attr "prefix_rep" "1")
2577    (set_attr "prefix" "maybe_vex")
2578    (set_attr "mode" "DI")])
2580 (define_insn "sse_cvtss2siq_2"
2581   [(set (match_operand:DI 0 "register_operand" "=r,r")
2582         (unspec:DI [(match_operand:SF 1 "nonimmediate_operand" "x,m")]
2583                    UNSPEC_FIX_NOTRUNC))]
2584   "TARGET_SSE && TARGET_64BIT"
2585   "%vcvtss2si{q}\t{%1, %0|%0, %1}"
2586   [(set_attr "type" "sseicvt")
2587    (set_attr "athlon_decode" "double,vector")
2588    (set_attr "amdfam10_decode" "double,double")
2589    (set_attr "prefix_rep" "1")
2590    (set_attr "prefix" "maybe_vex")
2591    (set_attr "mode" "DI")])
2593 (define_insn "sse_cvttss2si"
2594   [(set (match_operand:SI 0 "register_operand" "=r,r")
2595         (fix:SI
2596           (vec_select:SF
2597             (match_operand:V4SF 1 "nonimmediate_operand" "x,m")
2598             (parallel [(const_int 0)]))))]
2599   "TARGET_SSE"
2600   "%vcvttss2si\t{%1, %0|%0, %1}"
2601   [(set_attr "type" "sseicvt")
2602    (set_attr "athlon_decode" "double,vector")
2603    (set_attr "amdfam10_decode" "double,double")
2604    (set_attr "prefix_rep" "1")
2605    (set_attr "prefix" "maybe_vex")
2606    (set_attr "mode" "SI")])
2608 (define_insn "sse_cvttss2siq"
2609   [(set (match_operand:DI 0 "register_operand" "=r,r")
2610         (fix:DI
2611           (vec_select:SF
2612             (match_operand:V4SF 1 "nonimmediate_operand" "x,m")
2613             (parallel [(const_int 0)]))))]
2614   "TARGET_SSE && TARGET_64BIT"
2615   "%vcvttss2si{q}\t{%1, %0|%0, %1}"
2616   [(set_attr "type" "sseicvt")
2617    (set_attr "athlon_decode" "double,vector")
2618    (set_attr "amdfam10_decode" "double,double")
2619    (set_attr "prefix_rep" "1")
2620    (set_attr "prefix" "maybe_vex")
2621    (set_attr "mode" "DI")])
2623 (define_insn "avx_cvtdq2ps<avxmodesuffix>"
2624   [(set (match_operand:AVXMODEDCVTDQ2PS 0 "register_operand" "=x")
2625         (float:AVXMODEDCVTDQ2PS
2626           (match_operand:<avxcvtvecmode> 1 "nonimmediate_operand" "xm")))]
2627   "TARGET_AVX"
2628   "vcvtdq2ps\t{%1, %0|%0, %1}"
2629   [(set_attr "type" "ssecvt")
2630    (set_attr "prefix" "vex")
2631    (set_attr "mode" "<avxvecmode>")])
2633 (define_insn "sse2_cvtdq2ps"
2634   [(set (match_operand:V4SF 0 "register_operand" "=x")
2635         (float:V4SF (match_operand:V4SI 1 "nonimmediate_operand" "xm")))]
2636   "TARGET_SSE2"
2637   "cvtdq2ps\t{%1, %0|%0, %1}"
2638   [(set_attr "type" "ssecvt")
2639    (set_attr "mode" "V4SF")])
2641 (define_expand "sse2_cvtudq2ps"
2642   [(set (match_dup 5)
2643         (float:V4SF (match_operand:V4SI 1 "nonimmediate_operand" "")))
2644    (set (match_dup 6)
2645         (lt:V4SF (match_dup 5) (match_dup 3)))
2646    (set (match_dup 7)
2647         (and:V4SF (match_dup 6) (match_dup 4)))
2648    (set (match_operand:V4SF 0 "register_operand" "")
2649         (plus:V4SF (match_dup 5) (match_dup 7)))]
2650   "TARGET_SSE2"
2652   REAL_VALUE_TYPE TWO32r;
2653   rtx x;
2654   int i;
2656   real_ldexp (&TWO32r, &dconst1, 32);
2657   x = const_double_from_real_value (TWO32r, SFmode);
2659   operands[3] = force_reg (V4SFmode, CONST0_RTX (V4SFmode));
2660   operands[4] = force_reg (V4SFmode, ix86_build_const_vector (SFmode, 1, x));
2662   for (i = 5; i < 8; i++)
2663     operands[i] = gen_reg_rtx (V4SFmode);
2666 (define_insn "avx_cvtps2dq<avxmodesuffix>"
2667   [(set (match_operand:AVXMODEDCVTPS2DQ 0 "register_operand" "=x")
2668         (unspec:AVXMODEDCVTPS2DQ
2669           [(match_operand:<avxcvtvecmode> 1 "nonimmediate_operand" "xm")]
2670           UNSPEC_FIX_NOTRUNC))]
2671   "TARGET_AVX"
2672   "vcvtps2dq\t{%1, %0|%0, %1}"
2673   [(set_attr "type" "ssecvt")
2674    (set_attr "prefix" "vex")
2675    (set_attr "mode" "<avxvecmode>")])
2677 (define_insn "sse2_cvtps2dq"
2678   [(set (match_operand:V4SI 0 "register_operand" "=x")
2679         (unspec:V4SI [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
2680                      UNSPEC_FIX_NOTRUNC))]
2681   "TARGET_SSE2"
2682   "cvtps2dq\t{%1, %0|%0, %1}"
2683   [(set_attr "type" "ssecvt")
2684    (set_attr "prefix_data16" "1")
2685    (set_attr "mode" "TI")])
2687 (define_insn "avx_cvttps2dq<avxmodesuffix>"
2688   [(set (match_operand:AVXMODEDCVTPS2DQ 0 "register_operand" "=x")
2689         (fix:AVXMODEDCVTPS2DQ
2690           (match_operand:<avxcvtvecmode> 1 "nonimmediate_operand" "xm")))]
2691   "TARGET_AVX"
2692   "vcvttps2dq\t{%1, %0|%0, %1}"
2693   [(set_attr "type" "ssecvt")
2694    (set_attr "prefix" "vex")
2695    (set_attr "mode" "<avxvecmode>")])
2697 (define_insn "sse2_cvttps2dq"
2698   [(set (match_operand:V4SI 0 "register_operand" "=x")
2699         (fix:V4SI (match_operand:V4SF 1 "nonimmediate_operand" "xm")))]
2700   "TARGET_SSE2"
2701   "cvttps2dq\t{%1, %0|%0, %1}"
2702   [(set_attr "type" "ssecvt")
2703    (set_attr "prefix_rep" "1")
2704    (set_attr "prefix_data16" "0")
2705    (set_attr "mode" "TI")])
2707 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2709 ;; Parallel double-precision floating point conversion operations
2711 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2713 (define_insn "sse2_cvtpi2pd"
2714   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2715         (float:V2DF (match_operand:V2SI 1 "nonimmediate_operand" "y,m")))]
2716   "TARGET_SSE2"
2717   "cvtpi2pd\t{%1, %0|%0, %1}"
2718   [(set_attr "type" "ssecvt")
2719    (set_attr "unit" "mmx,*")
2720    (set_attr "prefix_data16" "1,*")
2721    (set_attr "mode" "V2DF")])
2723 (define_insn "sse2_cvtpd2pi"
2724   [(set (match_operand:V2SI 0 "register_operand" "=y")
2725         (unspec:V2SI [(match_operand:V2DF 1 "nonimmediate_operand" "xm")]
2726                      UNSPEC_FIX_NOTRUNC))]
2727   "TARGET_SSE2"
2728   "cvtpd2pi\t{%1, %0|%0, %1}"
2729   [(set_attr "type" "ssecvt")
2730    (set_attr "unit" "mmx")
2731    (set_attr "prefix_data16" "1")
2732    (set_attr "mode" "DI")])
2734 (define_insn "sse2_cvttpd2pi"
2735   [(set (match_operand:V2SI 0 "register_operand" "=y")
2736         (fix:V2SI (match_operand:V2DF 1 "nonimmediate_operand" "xm")))]
2737   "TARGET_SSE2"
2738   "cvttpd2pi\t{%1, %0|%0, %1}"
2739   [(set_attr "type" "ssecvt")
2740    (set_attr "unit" "mmx")
2741    (set_attr "prefix_data16" "1")
2742    (set_attr "mode" "TI")])
2744 (define_insn "*avx_cvtsi2sd"
2745   [(set (match_operand:V2DF 0 "register_operand" "=x")
2746         (vec_merge:V2DF
2747           (vec_duplicate:V2DF
2748             (float:DF (match_operand:SI 2 "nonimmediate_operand" "rm")))
2749           (match_operand:V2DF 1 "register_operand" "x")
2750           (const_int 1)))]
2751   "TARGET_AVX"
2752   "vcvtsi2sd\t{%2, %1, %0|%0, %1, %2}"
2753   [(set_attr "type" "sseicvt")
2754    (set_attr "prefix" "vex")
2755    (set_attr "mode" "DF")])
2757 (define_insn "sse2_cvtsi2sd"
2758   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2759         (vec_merge:V2DF
2760           (vec_duplicate:V2DF
2761             (float:DF (match_operand:SI 2 "nonimmediate_operand" "r,m")))
2762           (match_operand:V2DF 1 "register_operand" "0,0")
2763           (const_int 1)))]
2764   "TARGET_SSE2"
2765   "cvtsi2sd\t{%2, %0|%0, %2}"
2766   [(set_attr "type" "sseicvt")
2767    (set_attr "mode" "DF")
2768    (set_attr "athlon_decode" "double,direct")
2769    (set_attr "amdfam10_decode" "vector,double")])
2771 (define_insn "*avx_cvtsi2sdq"
2772   [(set (match_operand:V2DF 0 "register_operand" "=x")
2773         (vec_merge:V2DF
2774           (vec_duplicate:V2DF
2775             (float:DF (match_operand:DI 2 "nonimmediate_operand" "rm")))
2776           (match_operand:V2DF 1 "register_operand" "x")
2777           (const_int 1)))]
2778   "TARGET_AVX && TARGET_64BIT"
2779   "vcvtsi2sdq\t{%2, %1, %0|%0, %1, %2}"
2780   [(set_attr "type" "sseicvt")
2781    (set_attr "length_vex" "4")
2782    (set_attr "prefix" "vex")
2783    (set_attr "mode" "DF")])
2785 (define_insn "sse2_cvtsi2sdq"
2786   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2787         (vec_merge:V2DF
2788           (vec_duplicate:V2DF
2789             (float:DF (match_operand:DI 2 "nonimmediate_operand" "r,m")))
2790           (match_operand:V2DF 1 "register_operand" "0,0")
2791           (const_int 1)))]
2792   "TARGET_SSE2 && TARGET_64BIT"
2793   "cvtsi2sdq\t{%2, %0|%0, %2}"
2794   [(set_attr "type" "sseicvt")
2795    (set_attr "prefix_rex" "1")
2796    (set_attr "mode" "DF")
2797    (set_attr "athlon_decode" "double,direct")
2798    (set_attr "amdfam10_decode" "vector,double")])
2800 (define_insn "sse2_cvtsd2si"
2801   [(set (match_operand:SI 0 "register_operand" "=r,r")
2802         (unspec:SI
2803           [(vec_select:DF
2804              (match_operand:V2DF 1 "nonimmediate_operand" "x,m")
2805              (parallel [(const_int 0)]))]
2806           UNSPEC_FIX_NOTRUNC))]
2807   "TARGET_SSE2"
2808   "%vcvtsd2si\t{%1, %0|%0, %1}"
2809   [(set_attr "type" "sseicvt")
2810    (set_attr "athlon_decode" "double,vector")
2811    (set_attr "prefix_rep" "1")
2812    (set_attr "prefix" "maybe_vex")
2813    (set_attr "mode" "SI")])
2815 (define_insn "sse2_cvtsd2si_2"
2816   [(set (match_operand:SI 0 "register_operand" "=r,r")
2817         (unspec:SI [(match_operand:DF 1 "nonimmediate_operand" "x,m")]
2818                    UNSPEC_FIX_NOTRUNC))]
2819   "TARGET_SSE2"
2820   "%vcvtsd2si\t{%1, %0|%0, %1}"
2821   [(set_attr "type" "sseicvt")
2822    (set_attr "athlon_decode" "double,vector")
2823    (set_attr "amdfam10_decode" "double,double")
2824    (set_attr "prefix_rep" "1")
2825    (set_attr "prefix" "maybe_vex")
2826    (set_attr "mode" "SI")])
2828 (define_insn "sse2_cvtsd2siq"
2829   [(set (match_operand:DI 0 "register_operand" "=r,r")
2830         (unspec:DI
2831           [(vec_select:DF
2832              (match_operand:V2DF 1 "nonimmediate_operand" "x,m")
2833              (parallel [(const_int 0)]))]
2834           UNSPEC_FIX_NOTRUNC))]
2835   "TARGET_SSE2 && TARGET_64BIT"
2836   "%vcvtsd2siq\t{%1, %0|%0, %1}"
2837   [(set_attr "type" "sseicvt")
2838    (set_attr "athlon_decode" "double,vector")
2839    (set_attr "prefix_rep" "1")
2840    (set_attr "prefix" "maybe_vex")
2841    (set_attr "mode" "DI")])
2843 (define_insn "sse2_cvtsd2siq_2"
2844   [(set (match_operand:DI 0 "register_operand" "=r,r")
2845         (unspec:DI [(match_operand:DF 1 "nonimmediate_operand" "x,m")]
2846                    UNSPEC_FIX_NOTRUNC))]
2847   "TARGET_SSE2 && TARGET_64BIT"
2848   "%vcvtsd2siq\t{%1, %0|%0, %1}"
2849   [(set_attr "type" "sseicvt")
2850    (set_attr "athlon_decode" "double,vector")
2851    (set_attr "amdfam10_decode" "double,double")
2852    (set_attr "prefix_rep" "1")
2853    (set_attr "prefix" "maybe_vex")
2854    (set_attr "mode" "DI")])
2856 (define_insn "sse2_cvttsd2si"
2857   [(set (match_operand:SI 0 "register_operand" "=r,r")
2858         (fix:SI
2859           (vec_select:DF
2860             (match_operand:V2DF 1 "nonimmediate_operand" "x,m")
2861             (parallel [(const_int 0)]))))]
2862   "TARGET_SSE2"
2863   "%vcvttsd2si\t{%1, %0|%0, %1}"
2864   [(set_attr "type" "sseicvt")
2865    (set_attr "prefix_rep" "1")
2866    (set_attr "prefix" "maybe_vex")
2867    (set_attr "mode" "SI")
2868    (set_attr "athlon_decode" "double,vector")
2869    (set_attr "amdfam10_decode" "double,double")])
2871 (define_insn "sse2_cvttsd2siq"
2872   [(set (match_operand:DI 0 "register_operand" "=r,r")
2873         (fix:DI
2874           (vec_select:DF
2875             (match_operand:V2DF 1 "nonimmediate_operand" "x,m")
2876             (parallel [(const_int 0)]))))]
2877   "TARGET_SSE2 && TARGET_64BIT"
2878   "%vcvttsd2siq\t{%1, %0|%0, %1}"
2879   [(set_attr "type" "sseicvt")
2880    (set_attr "prefix_rep" "1")
2881    (set_attr "prefix" "maybe_vex")
2882    (set_attr "mode" "DI")
2883    (set_attr "athlon_decode" "double,vector")
2884    (set_attr "amdfam10_decode" "double,double")])
2886 (define_insn "avx_cvtdq2pd256"
2887   [(set (match_operand:V4DF 0 "register_operand" "=x")
2888         (float:V4DF (match_operand:V4SI 1 "nonimmediate_operand" "xm")))]
2889   "TARGET_AVX"
2890   "vcvtdq2pd\t{%1, %0|%0, %1}"
2891   [(set_attr "type" "ssecvt")
2892    (set_attr "prefix" "vex")
2893    (set_attr "mode" "V4DF")])
2895 (define_insn "sse2_cvtdq2pd"
2896   [(set (match_operand:V2DF 0 "register_operand" "=x")
2897         (float:V2DF
2898           (vec_select:V2SI
2899             (match_operand:V4SI 1 "nonimmediate_operand" "xm")
2900             (parallel [(const_int 0) (const_int 1)]))))]
2901   "TARGET_SSE2"
2902   "%vcvtdq2pd\t{%1, %0|%0, %1}"
2903   [(set_attr "type" "ssecvt")
2904    (set_attr "prefix" "maybe_vex")
2905    (set_attr "mode" "V2DF")])
2907 (define_insn "avx_cvtpd2dq256"
2908   [(set (match_operand:V4SI 0 "register_operand" "=x")
2909         (unspec:V4SI [(match_operand:V4DF 1 "nonimmediate_operand" "xm")]
2910                      UNSPEC_FIX_NOTRUNC))]
2911   "TARGET_AVX"
2912   "vcvtpd2dq{y}\t{%1, %0|%0, %1}"
2913   [(set_attr "type" "ssecvt")
2914    (set_attr "prefix" "vex")
2915    (set_attr "mode" "OI")])
2917 (define_expand "sse2_cvtpd2dq"
2918   [(set (match_operand:V4SI 0 "register_operand" "")
2919         (vec_concat:V4SI
2920           (unspec:V2SI [(match_operand:V2DF 1 "nonimmediate_operand" "")]
2921                        UNSPEC_FIX_NOTRUNC)
2922           (match_dup 2)))]
2923   "TARGET_SSE2"
2924   "operands[2] = CONST0_RTX (V2SImode);")
2926 (define_insn "*sse2_cvtpd2dq"
2927   [(set (match_operand:V4SI 0 "register_operand" "=x")
2928         (vec_concat:V4SI
2929           (unspec:V2SI [(match_operand:V2DF 1 "nonimmediate_operand" "xm")]
2930                        UNSPEC_FIX_NOTRUNC)
2931           (match_operand:V2SI 2 "const0_operand" "")))]
2932   "TARGET_SSE2"
2933   "* return TARGET_AVX ? \"vcvtpd2dq{x}\t{%1, %0|%0, %1}\"
2934                        : \"cvtpd2dq\t{%1, %0|%0, %1}\";"
2935   [(set_attr "type" "ssecvt")
2936    (set_attr "prefix_rep" "1")
2937    (set_attr "prefix_data16" "0")
2938    (set_attr "prefix" "maybe_vex")
2939    (set_attr "mode" "TI")
2940    (set_attr "amdfam10_decode" "double")])
2942 (define_insn "avx_cvttpd2dq256"
2943   [(set (match_operand:V4SI 0 "register_operand" "=x")
2944         (fix:V4SI (match_operand:V4DF 1 "nonimmediate_operand" "xm")))]
2945   "TARGET_AVX"
2946   "vcvttpd2dq{y}\t{%1, %0|%0, %1}"
2947   [(set_attr "type" "ssecvt")
2948    (set_attr "prefix" "vex")
2949    (set_attr "mode" "OI")])
2951 (define_expand "sse2_cvttpd2dq"
2952   [(set (match_operand:V4SI 0 "register_operand" "")
2953         (vec_concat:V4SI
2954           (fix:V2SI (match_operand:V2DF 1 "nonimmediate_operand" ""))
2955           (match_dup 2)))]
2956   "TARGET_SSE2"
2957   "operands[2] = CONST0_RTX (V2SImode);")
2959 (define_insn "*sse2_cvttpd2dq"
2960   [(set (match_operand:V4SI 0 "register_operand" "=x")
2961         (vec_concat:V4SI
2962           (fix:V2SI (match_operand:V2DF 1 "nonimmediate_operand" "xm"))
2963           (match_operand:V2SI 2 "const0_operand" "")))]
2964   "TARGET_SSE2"
2965   "* return TARGET_AVX ? \"vcvttpd2dq{x}\t{%1, %0|%0, %1}\"
2966                        : \"cvttpd2dq\t{%1, %0|%0, %1}\";"
2967   [(set_attr "type" "ssecvt")
2968    (set_attr "prefix" "maybe_vex")
2969    (set_attr "mode" "TI")
2970    (set_attr "amdfam10_decode" "double")])
2972 (define_insn "*avx_cvtsd2ss"
2973   [(set (match_operand:V4SF 0 "register_operand" "=x")
2974         (vec_merge:V4SF
2975           (vec_duplicate:V4SF
2976             (float_truncate:V2SF
2977               (match_operand:V2DF 2 "nonimmediate_operand" "xm")))
2978           (match_operand:V4SF 1 "register_operand" "x")
2979           (const_int 1)))]
2980   "TARGET_AVX"
2981   "vcvtsd2ss\t{%2, %1, %0|%0, %1, %2}"
2982   [(set_attr "type" "ssecvt")
2983    (set_attr "prefix" "vex")
2984    (set_attr "mode" "SF")])
2986 (define_insn "sse2_cvtsd2ss"
2987   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2988         (vec_merge:V4SF
2989           (vec_duplicate:V4SF
2990             (float_truncate:V2SF
2991               (match_operand:V2DF 2 "nonimmediate_operand" "x,m")))
2992           (match_operand:V4SF 1 "register_operand" "0,0")
2993           (const_int 1)))]
2994   "TARGET_SSE2"
2995   "cvtsd2ss\t{%2, %0|%0, %2}"
2996   [(set_attr "type" "ssecvt")
2997    (set_attr "athlon_decode" "vector,double")
2998    (set_attr "amdfam10_decode" "vector,double")
2999    (set_attr "mode" "SF")])
3001 (define_insn "*avx_cvtss2sd"
3002   [(set (match_operand:V2DF 0 "register_operand" "=x")
3003         (vec_merge:V2DF
3004           (float_extend:V2DF
3005             (vec_select:V2SF
3006               (match_operand:V4SF 2 "nonimmediate_operand" "xm")
3007               (parallel [(const_int 0) (const_int 1)])))
3008           (match_operand:V2DF 1 "register_operand" "x")
3009           (const_int 1)))]
3010   "TARGET_AVX"
3011   "vcvtss2sd\t{%2, %1, %0|%0, %1, %2}"
3012   [(set_attr "type" "ssecvt")
3013    (set_attr "prefix" "vex")
3014    (set_attr "mode" "DF")])
3016 (define_insn "sse2_cvtss2sd"
3017   [(set (match_operand:V2DF 0 "register_operand" "=x,x")
3018         (vec_merge:V2DF
3019           (float_extend:V2DF
3020             (vec_select:V2SF
3021               (match_operand:V4SF 2 "nonimmediate_operand" "x,m")
3022               (parallel [(const_int 0) (const_int 1)])))
3023           (match_operand:V2DF 1 "register_operand" "0,0")
3024           (const_int 1)))]
3025   "TARGET_SSE2"
3026   "cvtss2sd\t{%2, %0|%0, %2}"
3027   [(set_attr "type" "ssecvt")
3028    (set_attr "amdfam10_decode" "vector,double")
3029    (set_attr "mode" "DF")])
3031 (define_insn "avx_cvtpd2ps256"
3032   [(set (match_operand:V4SF 0 "register_operand" "=x")
3033         (float_truncate:V4SF
3034           (match_operand:V4DF 1 "nonimmediate_operand" "xm")))]
3035   "TARGET_AVX"
3036   "vcvtpd2ps{y}\t{%1, %0|%0, %1}"
3037   [(set_attr "type" "ssecvt")
3038    (set_attr "prefix" "vex")
3039    (set_attr "mode" "V4SF")])
3041 (define_expand "sse2_cvtpd2ps"
3042   [(set (match_operand:V4SF 0 "register_operand" "")
3043         (vec_concat:V4SF
3044           (float_truncate:V2SF
3045             (match_operand:V2DF 1 "nonimmediate_operand" ""))
3046           (match_dup 2)))]
3047   "TARGET_SSE2"
3048   "operands[2] = CONST0_RTX (V2SFmode);")
3050 (define_insn "*sse2_cvtpd2ps"
3051   [(set (match_operand:V4SF 0 "register_operand" "=x")
3052         (vec_concat:V4SF
3053           (float_truncate:V2SF
3054             (match_operand:V2DF 1 "nonimmediate_operand" "xm"))
3055           (match_operand:V2SF 2 "const0_operand" "")))]
3056   "TARGET_SSE2"
3057   "* return TARGET_AVX ? \"vcvtpd2ps{x}\t{%1, %0|%0, %1}\"
3058                        : \"cvtpd2ps\t{%1, %0|%0, %1}\";"
3059   [(set_attr "type" "ssecvt")
3060    (set_attr "prefix_data16" "1")
3061    (set_attr "prefix" "maybe_vex")
3062    (set_attr "mode" "V4SF")
3063    (set_attr "amdfam10_decode" "double")])
3065 (define_insn "avx_cvtps2pd256"
3066   [(set (match_operand:V4DF 0 "register_operand" "=x")
3067         (float_extend:V4DF
3068           (match_operand:V4SF 1 "nonimmediate_operand" "xm")))]
3069   "TARGET_AVX"
3070   "vcvtps2pd\t{%1, %0|%0, %1}"
3071   [(set_attr "type" "ssecvt")
3072    (set_attr "prefix" "vex")
3073    (set_attr "mode" "V4DF")])
3075 (define_insn "sse2_cvtps2pd"
3076   [(set (match_operand:V2DF 0 "register_operand" "=x")
3077         (float_extend:V2DF
3078           (vec_select:V2SF
3079             (match_operand:V4SF 1 "nonimmediate_operand" "xm")
3080             (parallel [(const_int 0) (const_int 1)]))))]
3081   "TARGET_SSE2"
3082   "%vcvtps2pd\t{%1, %0|%0, %1}"
3083   [(set_attr "type" "ssecvt")
3084    (set_attr "prefix" "maybe_vex")
3085    (set_attr "mode" "V2DF")
3086    (set_attr "prefix_data16" "0")
3087    (set_attr "amdfam10_decode" "direct")])
3089 (define_expand "vec_unpacks_hi_v4sf"
3090   [(set (match_dup 2)
3091    (vec_select:V4SF
3092      (vec_concat:V8SF
3093        (match_dup 2)
3094        (match_operand:V4SF 1 "nonimmediate_operand" ""))
3095      (parallel [(const_int 6)
3096                 (const_int 7)
3097                 (const_int 2)
3098                 (const_int 3)])))
3099   (set (match_operand:V2DF 0 "register_operand" "")
3100    (float_extend:V2DF
3101      (vec_select:V2SF
3102        (match_dup 2)
3103        (parallel [(const_int 0) (const_int 1)]))))]
3104   "TARGET_SSE2"
3105   "operands[2] = gen_reg_rtx (V4SFmode);")
3107 (define_expand "vec_unpacks_lo_v4sf"
3108   [(set (match_operand:V2DF 0 "register_operand" "")
3109         (float_extend:V2DF
3110           (vec_select:V2SF
3111             (match_operand:V4SF 1 "nonimmediate_operand" "")
3112             (parallel [(const_int 0) (const_int 1)]))))]
3113   "TARGET_SSE2")
3115 (define_expand "vec_unpacks_float_hi_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_unpacks_hi_v8hi (tmp, operands[1]));
3123   emit_insn (gen_sse2_cvtdq2ps (operands[0], tmp));
3124   DONE;
3127 (define_expand "vec_unpacks_float_lo_v8hi"
3128   [(match_operand:V4SF 0 "register_operand" "")
3129    (match_operand:V8HI 1 "register_operand" "")]
3130   "TARGET_SSE2"
3132   rtx tmp = gen_reg_rtx (V4SImode);
3134   emit_insn (gen_vec_unpacks_lo_v8hi (tmp, operands[1]));
3135   emit_insn (gen_sse2_cvtdq2ps (operands[0], tmp));
3136   DONE;
3139 (define_expand "vec_unpacku_float_hi_v8hi"
3140   [(match_operand:V4SF 0 "register_operand" "")
3141    (match_operand:V8HI 1 "register_operand" "")]
3142   "TARGET_SSE2"
3144   rtx tmp = gen_reg_rtx (V4SImode);
3146   emit_insn (gen_vec_unpacku_hi_v8hi (tmp, operands[1]));
3147   emit_insn (gen_sse2_cvtdq2ps (operands[0], tmp));
3148   DONE;
3151 (define_expand "vec_unpacku_float_lo_v8hi"
3152   [(match_operand:V4SF 0 "register_operand" "")
3153    (match_operand:V8HI 1 "register_operand" "")]
3154   "TARGET_SSE2"
3156   rtx tmp = gen_reg_rtx (V4SImode);
3158   emit_insn (gen_vec_unpacku_lo_v8hi (tmp, operands[1]));
3159   emit_insn (gen_sse2_cvtdq2ps (operands[0], tmp));
3160   DONE;
3163 (define_expand "vec_unpacks_float_hi_v4si"
3164   [(set (match_dup 2)
3165         (vec_select:V4SI
3166           (match_operand:V4SI 1 "nonimmediate_operand" "")
3167           (parallel [(const_int 2)
3168                      (const_int 3)
3169                      (const_int 2)
3170                      (const_int 3)])))
3171    (set (match_operand:V2DF 0 "register_operand" "")
3172         (float:V2DF
3173           (vec_select:V2SI
3174           (match_dup 2)
3175             (parallel [(const_int 0) (const_int 1)]))))]
3176   "TARGET_SSE2"
3177   "operands[2] = gen_reg_rtx (V4SImode);")
3179 (define_expand "vec_unpacks_float_lo_v4si"
3180   [(set (match_operand:V2DF 0 "register_operand" "")
3181         (float:V2DF
3182           (vec_select:V2SI
3183             (match_operand:V4SI 1 "nonimmediate_operand" "")
3184             (parallel [(const_int 0) (const_int 1)]))))]
3185   "TARGET_SSE2")
3187 (define_expand "vec_unpacku_float_hi_v4si"
3188   [(set (match_dup 5)
3189         (vec_select:V4SI
3190           (match_operand:V4SI 1 "nonimmediate_operand" "")
3191           (parallel [(const_int 2)
3192                      (const_int 3)
3193                      (const_int 2)
3194                      (const_int 3)])))
3195    (set (match_dup 6)
3196         (float:V2DF
3197           (vec_select:V2SI
3198           (match_dup 5)
3199             (parallel [(const_int 0) (const_int 1)]))))
3200    (set (match_dup 7)
3201         (lt:V2DF (match_dup 6) (match_dup 3)))
3202    (set (match_dup 8)
3203         (and:V2DF (match_dup 7) (match_dup 4)))
3204    (set (match_operand:V2DF 0 "register_operand" "")
3205         (plus:V2DF (match_dup 6) (match_dup 8)))]
3206   "TARGET_SSE2"
3208   REAL_VALUE_TYPE TWO32r;
3209   rtx x;
3210   int i;
3212   real_ldexp (&TWO32r, &dconst1, 32);
3213   x = const_double_from_real_value (TWO32r, DFmode);
3215   operands[3] = force_reg (V2DFmode, CONST0_RTX (V2DFmode));
3216   operands[4] = force_reg (V2DFmode, ix86_build_const_vector (DFmode, 1, x));
3218   operands[5] = gen_reg_rtx (V4SImode);
3220   for (i = 6; i < 9; i++)
3221     operands[i] = gen_reg_rtx (V2DFmode);
3224 (define_expand "vec_unpacku_float_lo_v4si"
3225   [(set (match_dup 5)
3226         (float:V2DF
3227           (vec_select:V2SI
3228             (match_operand:V4SI 1 "nonimmediate_operand" "")
3229             (parallel [(const_int 0) (const_int 1)]))))
3230    (set (match_dup 6)
3231         (lt:V2DF (match_dup 5) (match_dup 3)))
3232    (set (match_dup 7)
3233         (and:V2DF (match_dup 6) (match_dup 4)))
3234    (set (match_operand:V2DF 0 "register_operand" "")
3235         (plus:V2DF (match_dup 5) (match_dup 7)))]
3236   "TARGET_SSE2"
3238   REAL_VALUE_TYPE TWO32r;
3239   rtx x;
3240   int i;
3242   real_ldexp (&TWO32r, &dconst1, 32);
3243   x = const_double_from_real_value (TWO32r, DFmode);
3245   operands[3] = force_reg (V2DFmode, CONST0_RTX (V2DFmode));
3246   operands[4] = force_reg (V2DFmode, ix86_build_const_vector (DFmode, 1, x));
3248   for (i = 5; i < 8; i++)
3249     operands[i] = gen_reg_rtx (V2DFmode);
3252 (define_expand "vec_pack_trunc_v2df"
3253   [(match_operand:V4SF 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 (V4SFmode);
3261   r2 = gen_reg_rtx (V4SFmode);
3263   emit_insn (gen_sse2_cvtpd2ps (r1, operands[1]));
3264   emit_insn (gen_sse2_cvtpd2ps (r2, operands[2]));
3265   emit_insn (gen_sse_movlhps (operands[0], r1, r2));
3266   DONE;
3269 (define_expand "vec_pack_sfix_trunc_v2df"
3270   [(match_operand:V4SI 0 "register_operand" "")
3271    (match_operand:V2DF 1 "nonimmediate_operand" "")
3272    (match_operand:V2DF 2 "nonimmediate_operand" "")]
3273   "TARGET_SSE2"
3275   rtx r1, r2;
3277   r1 = gen_reg_rtx (V4SImode);
3278   r2 = gen_reg_rtx (V4SImode);
3280   emit_insn (gen_sse2_cvttpd2dq (r1, operands[1]));
3281   emit_insn (gen_sse2_cvttpd2dq (r2, operands[2]));
3282   emit_insn (gen_vec_interleave_lowv2di (gen_lowpart (V2DImode, operands[0]),
3283                                          gen_lowpart (V2DImode, r1),
3284                                          gen_lowpart (V2DImode, r2)));
3285   DONE;
3288 (define_expand "vec_pack_sfix_v2df"
3289   [(match_operand:V4SI 0 "register_operand" "")
3290    (match_operand:V2DF 1 "nonimmediate_operand" "")
3291    (match_operand:V2DF 2 "nonimmediate_operand" "")]
3292   "TARGET_SSE2"
3294   rtx r1, r2;
3296   r1 = gen_reg_rtx (V4SImode);
3297   r2 = gen_reg_rtx (V4SImode);
3299   emit_insn (gen_sse2_cvtpd2dq (r1, operands[1]));
3300   emit_insn (gen_sse2_cvtpd2dq (r2, operands[2]));
3301   emit_insn (gen_vec_interleave_lowv2di (gen_lowpart (V2DImode, operands[0]),
3302                                          gen_lowpart (V2DImode, r1),
3303                                          gen_lowpart (V2DImode, r2)));
3304   DONE;
3307 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3309 ;; Parallel single-precision floating point element swizzling
3311 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3313 (define_expand "sse_movhlps_exp"
3314   [(set (match_operand:V4SF 0 "nonimmediate_operand" "")
3315         (vec_select:V4SF
3316           (vec_concat:V8SF
3317             (match_operand:V4SF 1 "nonimmediate_operand" "")
3318             (match_operand:V4SF 2 "nonimmediate_operand" ""))
3319           (parallel [(const_int 6)
3320                      (const_int 7)
3321                      (const_int 2)
3322                      (const_int 3)])))]
3323   "TARGET_SSE"
3324   "ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);")
3326 (define_insn "*avx_movhlps"
3327   [(set (match_operand:V4SF 0 "nonimmediate_operand"     "=x,x,m")
3328         (vec_select:V4SF
3329           (vec_concat:V8SF
3330             (match_operand:V4SF 1 "nonimmediate_operand" " x,x,0")
3331             (match_operand:V4SF 2 "nonimmediate_operand" " x,o,x"))
3332           (parallel [(const_int 6)
3333                      (const_int 7)
3334                      (const_int 2)
3335                      (const_int 3)])))]
3336   "TARGET_AVX && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
3337   "@
3338    vmovhlps\t{%2, %1, %0|%0, %1, %2}
3339    vmovlps\t{%H2, %1, %0|%0, %1, %H2}
3340    vmovhps\t{%2, %0|%0, %2}"
3341   [(set_attr "type" "ssemov")
3342    (set_attr "prefix" "vex")
3343    (set_attr "mode" "V4SF,V2SF,V2SF")])
3345 (define_insn "sse_movhlps"
3346   [(set (match_operand:V4SF 0 "nonimmediate_operand"     "=x,x,m")
3347         (vec_select:V4SF
3348           (vec_concat:V8SF
3349             (match_operand:V4SF 1 "nonimmediate_operand" " 0,0,0")
3350             (match_operand:V4SF 2 "nonimmediate_operand" " x,o,x"))
3351           (parallel [(const_int 6)
3352                      (const_int 7)
3353                      (const_int 2)
3354                      (const_int 3)])))]
3355   "TARGET_SSE && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
3356   "@
3357    movhlps\t{%2, %0|%0, %2}
3358    movlps\t{%H2, %0|%0, %H2}
3359    movhps\t{%2, %0|%0, %2}"
3360   [(set_attr "type" "ssemov")
3361    (set_attr "mode" "V4SF,V2SF,V2SF")])
3363 (define_expand "sse_movlhps_exp"
3364   [(set (match_operand:V4SF 0 "nonimmediate_operand" "")
3365         (vec_select:V4SF
3366           (vec_concat:V8SF
3367             (match_operand:V4SF 1 "nonimmediate_operand" "")
3368             (match_operand:V4SF 2 "nonimmediate_operand" ""))
3369           (parallel [(const_int 0)
3370                      (const_int 1)
3371                      (const_int 4)
3372                      (const_int 5)])))]
3373   "TARGET_SSE"
3374   "ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);")
3376 (define_insn "*avx_movlhps"
3377   [(set (match_operand:V4SF 0 "nonimmediate_operand"     "=x,x,o")
3378         (vec_select:V4SF
3379           (vec_concat:V8SF
3380             (match_operand:V4SF 1 "nonimmediate_operand" " x,x,0")
3381             (match_operand:V4SF 2 "nonimmediate_operand" " x,m,x"))
3382           (parallel [(const_int 0)
3383                      (const_int 1)
3384                      (const_int 4)
3385                      (const_int 5)])))]
3386   "TARGET_AVX && ix86_binary_operator_ok (UNKNOWN, V4SFmode, operands)"
3387   "@
3388    vmovlhps\t{%2, %1, %0|%0, %1, %2}
3389    vmovhps\t{%2, %1, %0|%0, %1, %2}
3390    vmovlps\t{%2, %H0|%H0, %2}"
3391   [(set_attr "type" "ssemov")
3392    (set_attr "prefix" "vex")
3393    (set_attr "mode" "V4SF,V2SF,V2SF")])
3395 (define_insn "sse_movlhps"
3396   [(set (match_operand:V4SF 0 "nonimmediate_operand"     "=x,x,o")
3397         (vec_select:V4SF
3398           (vec_concat:V8SF
3399             (match_operand:V4SF 1 "nonimmediate_operand" " 0,0,0")
3400             (match_operand:V4SF 2 "nonimmediate_operand" " x,m,x"))
3401           (parallel [(const_int 0)
3402                      (const_int 1)
3403                      (const_int 4)
3404                      (const_int 5)])))]
3405   "TARGET_SSE && ix86_binary_operator_ok (UNKNOWN, V4SFmode, operands)"
3406   "@
3407    movlhps\t{%2, %0|%0, %2}
3408    movhps\t{%2, %0|%0, %2}
3409    movlps\t{%2, %H0|%H0, %2}"
3410   [(set_attr "type" "ssemov")
3411    (set_attr "mode" "V4SF,V2SF,V2SF")])
3413 ;; Recall that the 256-bit unpck insns only shuffle within their lanes.
3414 (define_insn "avx_unpckhps256"
3415   [(set (match_operand:V8SF 0 "register_operand" "=x")
3416         (vec_select:V8SF
3417           (vec_concat:V16SF
3418             (match_operand:V8SF 1 "register_operand" "x")
3419             (match_operand:V8SF 2 "nonimmediate_operand" "xm"))
3420           (parallel [(const_int 2) (const_int 10)
3421                      (const_int 3) (const_int 11)
3422                      (const_int 6) (const_int 14)
3423                      (const_int 7) (const_int 15)])))]
3424   "TARGET_AVX"
3425   "vunpckhps\t{%2, %1, %0|%0, %1, %2}"
3426   [(set_attr "type" "sselog")
3427    (set_attr "prefix" "vex")
3428    (set_attr "mode" "V8SF")])
3430 (define_insn "*avx_interleave_highv4sf"
3431   [(set (match_operand:V4SF 0 "register_operand" "=x")
3432         (vec_select:V4SF
3433           (vec_concat:V8SF
3434             (match_operand:V4SF 1 "register_operand" "x")
3435             (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
3436           (parallel [(const_int 2) (const_int 6)
3437                      (const_int 3) (const_int 7)])))]
3438   "TARGET_AVX"
3439   "vunpckhps\t{%2, %1, %0|%0, %1, %2}"
3440   [(set_attr "type" "sselog")
3441    (set_attr "prefix" "vex")
3442    (set_attr "mode" "V4SF")])
3444 (define_insn "vec_interleave_highv4sf"
3445   [(set (match_operand:V4SF 0 "register_operand" "=x")
3446         (vec_select:V4SF
3447           (vec_concat:V8SF
3448             (match_operand:V4SF 1 "register_operand" "0")
3449             (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
3450           (parallel [(const_int 2) (const_int 6)
3451                      (const_int 3) (const_int 7)])))]
3452   "TARGET_SSE"
3453   "unpckhps\t{%2, %0|%0, %2}"
3454   [(set_attr "type" "sselog")
3455    (set_attr "mode" "V4SF")])
3457 ;; Recall that the 256-bit unpck insns only shuffle within their lanes.
3458 (define_insn "avx_unpcklps256"
3459   [(set (match_operand:V8SF 0 "register_operand" "=x")
3460         (vec_select:V8SF
3461           (vec_concat:V16SF
3462             (match_operand:V8SF 1 "register_operand" "x")
3463             (match_operand:V8SF 2 "nonimmediate_operand" "xm"))
3464           (parallel [(const_int 0) (const_int 8)
3465                      (const_int 1) (const_int 9)
3466                      (const_int 4) (const_int 12)
3467                      (const_int 5) (const_int 13)])))]
3468   "TARGET_AVX"
3469   "vunpcklps\t{%2, %1, %0|%0, %1, %2}"
3470   [(set_attr "type" "sselog")
3471    (set_attr "prefix" "vex")
3472    (set_attr "mode" "V8SF")])
3474 (define_insn "*avx_interleave_lowv4sf"
3475   [(set (match_operand:V4SF 0 "register_operand" "=x")
3476         (vec_select:V4SF
3477           (vec_concat:V8SF
3478             (match_operand:V4SF 1 "register_operand" "x")
3479             (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
3480           (parallel [(const_int 0) (const_int 4)
3481                      (const_int 1) (const_int 5)])))]
3482   "TARGET_AVX"
3483   "vunpcklps\t{%2, %1, %0|%0, %1, %2}"
3484   [(set_attr "type" "sselog")
3485    (set_attr "prefix" "vex")
3486    (set_attr "mode" "V4SF")])
3488 (define_insn "vec_interleave_lowv4sf"
3489   [(set (match_operand:V4SF 0 "register_operand" "=x")
3490         (vec_select:V4SF
3491           (vec_concat:V8SF
3492             (match_operand:V4SF 1 "register_operand" "0")
3493             (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
3494           (parallel [(const_int 0) (const_int 4)
3495                      (const_int 1) (const_int 5)])))]
3496   "TARGET_SSE"
3497   "unpcklps\t{%2, %0|%0, %2}"
3498   [(set_attr "type" "sselog")
3499    (set_attr "mode" "V4SF")])
3501 ;; These are modeled with the same vec_concat as the others so that we
3502 ;; capture users of shufps that can use the new instructions
3503 (define_insn "avx_movshdup256"
3504   [(set (match_operand:V8SF 0 "register_operand" "=x")
3505         (vec_select:V8SF
3506           (vec_concat:V16SF
3507             (match_operand:V8SF 1 "nonimmediate_operand" "xm")
3508             (match_dup 1))
3509           (parallel [(const_int 1) (const_int 1)
3510                      (const_int 3) (const_int 3)
3511                      (const_int 5) (const_int 5)
3512                      (const_int 7) (const_int 7)])))]
3513   "TARGET_AVX"
3514   "vmovshdup\t{%1, %0|%0, %1}"
3515   [(set_attr "type" "sse")
3516    (set_attr "prefix" "vex")
3517    (set_attr "mode" "V8SF")])
3519 (define_insn "sse3_movshdup"
3520   [(set (match_operand:V4SF 0 "register_operand" "=x")
3521         (vec_select:V4SF
3522           (vec_concat:V8SF
3523             (match_operand:V4SF 1 "nonimmediate_operand" "xm")
3524             (match_dup 1))
3525           (parallel [(const_int 1)
3526                      (const_int 1)
3527                      (const_int 7)
3528                      (const_int 7)])))]
3529   "TARGET_SSE3"
3530   "%vmovshdup\t{%1, %0|%0, %1}"
3531   [(set_attr "type" "sse")
3532    (set_attr "prefix_rep" "1")
3533    (set_attr "prefix" "maybe_vex")
3534    (set_attr "mode" "V4SF")])
3536 (define_insn "avx_movsldup256"
3537   [(set (match_operand:V8SF 0 "register_operand" "=x")
3538         (vec_select:V8SF
3539           (vec_concat:V16SF
3540             (match_operand:V8SF 1 "nonimmediate_operand" "xm")
3541             (match_dup 1))
3542           (parallel [(const_int 0) (const_int 0)
3543                      (const_int 2) (const_int 2)
3544                      (const_int 4) (const_int 4)
3545                      (const_int 6) (const_int 6)])))]
3546   "TARGET_AVX"
3547   "vmovsldup\t{%1, %0|%0, %1}"
3548   [(set_attr "type" "sse")
3549    (set_attr "prefix" "vex")
3550    (set_attr "mode" "V8SF")])
3552 (define_insn "sse3_movsldup"
3553   [(set (match_operand:V4SF 0 "register_operand" "=x")
3554         (vec_select:V4SF
3555           (vec_concat:V8SF
3556             (match_operand:V4SF 1 "nonimmediate_operand" "xm")
3557             (match_dup 1))
3558           (parallel [(const_int 0)
3559                      (const_int 0)
3560                      (const_int 6)
3561                      (const_int 6)])))]
3562   "TARGET_SSE3"
3563   "%vmovsldup\t{%1, %0|%0, %1}"
3564   [(set_attr "type" "sse")
3565    (set_attr "prefix_rep" "1")
3566    (set_attr "prefix" "maybe_vex")
3567    (set_attr "mode" "V4SF")])
3569 (define_expand "avx_shufps256"
3570   [(match_operand:V8SF 0 "register_operand" "")
3571    (match_operand:V8SF 1 "register_operand" "")
3572    (match_operand:V8SF 2 "nonimmediate_operand" "")
3573    (match_operand:SI 3 "const_int_operand" "")]
3574   "TARGET_AVX"
3576   int mask = INTVAL (operands[3]);
3577   emit_insn (gen_avx_shufps256_1 (operands[0], operands[1], operands[2],
3578                                   GEN_INT ((mask >> 0) & 3),
3579                                   GEN_INT ((mask >> 2) & 3),
3580                                   GEN_INT (((mask >> 4) & 3) + 8),
3581                                   GEN_INT (((mask >> 6) & 3) + 8),
3582                                   GEN_INT (((mask >> 0) & 3) + 4),
3583                                   GEN_INT (((mask >> 2) & 3) + 4),
3584                                   GEN_INT (((mask >> 4) & 3) + 12),
3585                                   GEN_INT (((mask >> 6) & 3) + 12)));
3586   DONE;
3589 ;; One bit in mask selects 2 elements.
3590 (define_insn "avx_shufps256_1"
3591   [(set (match_operand:V8SF 0 "register_operand" "=x")
3592         (vec_select:V8SF
3593           (vec_concat:V16SF
3594             (match_operand:V8SF 1 "register_operand" "x")
3595             (match_operand:V8SF 2 "nonimmediate_operand" "xm"))
3596           (parallel [(match_operand 3  "const_0_to_3_operand"   "")
3597                      (match_operand 4  "const_0_to_3_operand"   "")
3598                      (match_operand 5  "const_8_to_11_operand"  "")
3599                      (match_operand 6  "const_8_to_11_operand"  "")
3600                      (match_operand 7  "const_4_to_7_operand"   "")
3601                      (match_operand 8  "const_4_to_7_operand"   "")
3602                      (match_operand 9  "const_12_to_15_operand" "")
3603                      (match_operand 10 "const_12_to_15_operand" "")])))]
3604   "TARGET_AVX
3605    && (INTVAL (operands[3]) == (INTVAL (operands[7]) - 4)
3606        && INTVAL (operands[4]) == (INTVAL (operands[8]) - 4)
3607        && INTVAL (operands[5]) == (INTVAL (operands[9]) - 4)
3608        && INTVAL (operands[6]) == (INTVAL (operands[10]) - 4))"
3610   int mask;
3611   mask = INTVAL (operands[3]);
3612   mask |= INTVAL (operands[4]) << 2;
3613   mask |= (INTVAL (operands[5]) - 8) << 4;
3614   mask |= (INTVAL (operands[6]) - 8) << 6;
3615   operands[3] = GEN_INT (mask);
3617   return "vshufps\t{%3, %2, %1, %0|%0, %1, %2, %3}";
3619   [(set_attr "type" "sselog")
3620    (set_attr "length_immediate" "1")
3621    (set_attr "prefix" "vex")
3622    (set_attr "mode" "V8SF")])
3624 (define_expand "sse_shufps"
3625   [(match_operand:V4SF 0 "register_operand" "")
3626    (match_operand:V4SF 1 "register_operand" "")
3627    (match_operand:V4SF 2 "nonimmediate_operand" "")
3628    (match_operand:SI 3 "const_int_operand" "")]
3629   "TARGET_SSE"
3631   int mask = INTVAL (operands[3]);
3632   emit_insn (gen_sse_shufps_v4sf (operands[0], operands[1], operands[2],
3633                                GEN_INT ((mask >> 0) & 3),
3634                                GEN_INT ((mask >> 2) & 3),
3635                                GEN_INT (((mask >> 4) & 3) + 4),
3636                                GEN_INT (((mask >> 6) & 3) + 4)));
3637   DONE;
3640 (define_insn "*avx_shufps_<mode>"
3641   [(set (match_operand:SSEMODE4S 0 "register_operand" "=x")
3642         (vec_select:SSEMODE4S
3643           (vec_concat:<ssedoublesizemode>
3644             (match_operand:SSEMODE4S 1 "register_operand" "x")
3645             (match_operand:SSEMODE4S 2 "nonimmediate_operand" "xm"))
3646           (parallel [(match_operand 3 "const_0_to_3_operand" "")
3647                      (match_operand 4 "const_0_to_3_operand" "")
3648                      (match_operand 5 "const_4_to_7_operand" "")
3649                      (match_operand 6 "const_4_to_7_operand" "")])))]
3650   "TARGET_AVX"
3652   int mask = 0;
3653   mask |= INTVAL (operands[3]) << 0;
3654   mask |= INTVAL (operands[4]) << 2;
3655   mask |= (INTVAL (operands[5]) - 4) << 4;
3656   mask |= (INTVAL (operands[6]) - 4) << 6;
3657   operands[3] = GEN_INT (mask);
3659   return "vshufps\t{%3, %2, %1, %0|%0, %1, %2, %3}";
3661   [(set_attr "type" "sselog")
3662    (set_attr "length_immediate" "1")
3663    (set_attr "prefix" "vex")
3664    (set_attr "mode" "V4SF")])
3666 (define_insn "sse_shufps_<mode>"
3667   [(set (match_operand:SSEMODE4S 0 "register_operand" "=x")
3668         (vec_select:SSEMODE4S
3669           (vec_concat:<ssedoublesizemode>
3670             (match_operand:SSEMODE4S 1 "register_operand" "0")
3671             (match_operand:SSEMODE4S 2 "nonimmediate_operand" "xm"))
3672           (parallel [(match_operand 3 "const_0_to_3_operand" "")
3673                      (match_operand 4 "const_0_to_3_operand" "")
3674                      (match_operand 5 "const_4_to_7_operand" "")
3675                      (match_operand 6 "const_4_to_7_operand" "")])))]
3676   "TARGET_SSE"
3678   int mask = 0;
3679   mask |= INTVAL (operands[3]) << 0;
3680   mask |= INTVAL (operands[4]) << 2;
3681   mask |= (INTVAL (operands[5]) - 4) << 4;
3682   mask |= (INTVAL (operands[6]) - 4) << 6;
3683   operands[3] = GEN_INT (mask);
3685   return "shufps\t{%3, %2, %0|%0, %2, %3}";
3687   [(set_attr "type" "sselog")
3688    (set_attr "length_immediate" "1")
3689    (set_attr "mode" "V4SF")])
3691 (define_insn "sse_storehps"
3692   [(set (match_operand:V2SF 0 "nonimmediate_operand" "=m,x,x")
3693         (vec_select:V2SF
3694           (match_operand:V4SF 1 "nonimmediate_operand" "x,x,o")
3695           (parallel [(const_int 2) (const_int 3)])))]
3696   "TARGET_SSE"
3697   "@
3698    %vmovhps\t{%1, %0|%0, %1}
3699    %vmovhlps\t{%1, %d0|%d0, %1}
3700    %vmovlps\t{%H1, %d0|%d0, %H1}"
3701   [(set_attr "type" "ssemov")
3702    (set_attr "prefix" "maybe_vex")
3703    (set_attr "mode" "V2SF,V4SF,V2SF")])
3705 (define_expand "sse_loadhps_exp"
3706   [(set (match_operand:V4SF 0 "nonimmediate_operand" "")
3707         (vec_concat:V4SF
3708           (vec_select:V2SF
3709             (match_operand:V4SF 1 "nonimmediate_operand" "")
3710             (parallel [(const_int 0) (const_int 1)]))
3711           (match_operand:V2SF 2 "nonimmediate_operand" "")))]
3712   "TARGET_SSE"
3713   "ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);")
3715 (define_insn "*avx_loadhps"
3716   [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,o")
3717         (vec_concat:V4SF
3718           (vec_select:V2SF
3719             (match_operand:V4SF 1 "nonimmediate_operand" "x,x,0")
3720             (parallel [(const_int 0) (const_int 1)]))
3721           (match_operand:V2SF 2 "nonimmediate_operand" "m,x,x")))]
3722   "TARGET_AVX"
3723   "@
3724    vmovhps\t{%2, %1, %0|%0, %1, %2}
3725    vmovlhps\t{%2, %1, %0|%0, %1, %2}
3726    vmovlps\t{%2, %H0|%H0, %2}"
3727   [(set_attr "type" "ssemov")
3728    (set_attr "prefix" "vex")
3729    (set_attr "mode" "V2SF,V4SF,V2SF")])
3731 (define_insn "sse_loadhps"
3732   [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,o")
3733         (vec_concat:V4SF
3734           (vec_select:V2SF
3735             (match_operand:V4SF 1 "nonimmediate_operand" "0,0,0")
3736             (parallel [(const_int 0) (const_int 1)]))
3737           (match_operand:V2SF 2 "nonimmediate_operand" "m,x,x")))]
3738   "TARGET_SSE"
3739   "@
3740    movhps\t{%2, %0|%0, %2}
3741    movlhps\t{%2, %0|%0, %2}
3742    movlps\t{%2, %H0|%H0, %2}"
3743   [(set_attr "type" "ssemov")
3744    (set_attr "mode" "V2SF,V4SF,V2SF")])
3746 (define_insn "*avx_storelps"
3747   [(set (match_operand:V2SF 0 "nonimmediate_operand" "=m,x,x")
3748         (vec_select:V2SF
3749           (match_operand:V4SF 1 "nonimmediate_operand" "x,x,m")
3750           (parallel [(const_int 0) (const_int 1)])))]
3751   "TARGET_AVX"
3752   "@
3753    vmovlps\t{%1, %0|%0, %1}
3754    vmovaps\t{%1, %0|%0, %1}
3755    vmovlps\t{%1, %0, %0|%0, %0, %1}"
3756   [(set_attr "type" "ssemov")
3757    (set_attr "prefix" "vex")
3758    (set_attr "mode" "V2SF,V2DF,V2SF")])
3760 (define_insn "sse_storelps"
3761   [(set (match_operand:V2SF 0 "nonimmediate_operand" "=m,x,x")
3762         (vec_select:V2SF
3763           (match_operand:V4SF 1 "nonimmediate_operand" "x,x,m")
3764           (parallel [(const_int 0) (const_int 1)])))]
3765   "TARGET_SSE"
3766   "@
3767    movlps\t{%1, %0|%0, %1}
3768    movaps\t{%1, %0|%0, %1}
3769    movlps\t{%1, %0|%0, %1}"
3770   [(set_attr "type" "ssemov")
3771    (set_attr "mode" "V2SF,V4SF,V2SF")])
3773 (define_expand "sse_loadlps_exp"
3774   [(set (match_operand:V4SF 0 "nonimmediate_operand" "")
3775         (vec_concat:V4SF
3776           (match_operand:V2SF 2 "nonimmediate_operand" "")
3777           (vec_select:V2SF
3778             (match_operand:V4SF 1 "nonimmediate_operand" "")
3779             (parallel [(const_int 2) (const_int 3)]))))]
3780   "TARGET_SSE"
3781   "ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);")
3783 (define_insn "*avx_loadlps"
3784   [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,m")
3785         (vec_concat:V4SF
3786           (match_operand:V2SF 2 "nonimmediate_operand" "x,m,x")
3787           (vec_select:V2SF
3788             (match_operand:V4SF 1 "nonimmediate_operand" "x,x,0")
3789             (parallel [(const_int 2) (const_int 3)]))))]
3790   "TARGET_AVX"
3791   "@
3792    shufps\t{$0xe4, %1, %2, %0|%0, %2, %1, 0xe4}
3793    vmovlps\t{%2, %1, %0|%0, %1, %2}
3794    vmovlps\t{%2, %0|%0, %2}"
3795   [(set_attr "type" "sselog,ssemov,ssemov")
3796    (set_attr "length_immediate" "1,*,*")
3797    (set_attr "prefix" "vex")
3798    (set_attr "mode" "V4SF,V2SF,V2SF")])
3800 (define_insn "sse_loadlps"
3801   [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,m")
3802         (vec_concat:V4SF
3803           (match_operand:V2SF 2 "nonimmediate_operand" "0,m,x")
3804           (vec_select:V2SF
3805             (match_operand:V4SF 1 "nonimmediate_operand" "x,0,0")
3806             (parallel [(const_int 2) (const_int 3)]))))]
3807   "TARGET_SSE"
3808   "@
3809    shufps\t{$0xe4, %1, %0|%0, %1, 0xe4}
3810    movlps\t{%2, %0|%0, %2}
3811    movlps\t{%2, %0|%0, %2}"
3812   [(set_attr "type" "sselog,ssemov,ssemov")
3813    (set_attr "length_immediate" "1,*,*")
3814    (set_attr "mode" "V4SF,V2SF,V2SF")])
3816 (define_insn "*avx_movss"
3817   [(set (match_operand:V4SF 0 "register_operand" "=x")
3818         (vec_merge:V4SF
3819           (match_operand:V4SF 2 "register_operand" "x")
3820           (match_operand:V4SF 1 "register_operand" "x")
3821           (const_int 1)))]
3822   "TARGET_AVX"
3823   "vmovss\t{%2, %1, %0|%0, %1, %2}"
3824   [(set_attr "type" "ssemov")
3825    (set_attr "prefix" "vex")
3826    (set_attr "mode" "SF")])
3828 (define_insn "sse_movss"
3829   [(set (match_operand:V4SF 0 "register_operand" "=x")
3830         (vec_merge:V4SF
3831           (match_operand:V4SF 2 "register_operand" "x")
3832           (match_operand:V4SF 1 "register_operand" "0")
3833           (const_int 1)))]
3834   "TARGET_SSE"
3835   "movss\t{%2, %0|%0, %2}"
3836   [(set_attr "type" "ssemov")
3837    (set_attr "mode" "SF")])
3839 (define_expand "vec_dupv4sf"
3840   [(set (match_operand:V4SF 0 "register_operand" "")
3841         (vec_duplicate:V4SF
3842           (match_operand:SF 1 "nonimmediate_operand" "")))]
3843   "TARGET_SSE"
3845   if (!TARGET_AVX)
3846     operands[1] = force_reg (V4SFmode, operands[1]);
3849 (define_insn "*vec_dupv4sf_avx"
3850   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
3851         (vec_duplicate:V4SF
3852           (match_operand:SF 1 "nonimmediate_operand" "x,m")))]
3853   "TARGET_AVX"
3854   "@
3855    vshufps\t{$0, %1, %1, %0|%0, %1, %1, 0}
3856    vbroadcastss\t{%1, %0|%0, %1}"
3857   [(set_attr "type" "sselog1,ssemov")
3858    (set_attr "length_immediate" "1,0")
3859    (set_attr "prefix_extra" "0,1")
3860    (set_attr "prefix" "vex")
3861    (set_attr "mode" "V4SF")])
3863 (define_insn "*vec_dupv4sf"
3864   [(set (match_operand:V4SF 0 "register_operand" "=x")
3865         (vec_duplicate:V4SF
3866           (match_operand:SF 1 "register_operand" "0")))]
3867   "TARGET_SSE"
3868   "shufps\t{$0, %0, %0|%0, %0, 0}"
3869   [(set_attr "type" "sselog1")
3870    (set_attr "length_immediate" "1")
3871    (set_attr "mode" "V4SF")])
3873 (define_insn "*vec_concatv2sf_avx"
3874   [(set (match_operand:V2SF 0 "register_operand"     "=x,x,x,*y ,*y")
3875         (vec_concat:V2SF
3876           (match_operand:SF 1 "nonimmediate_operand" " x,x,m, x , m")
3877           (match_operand:SF 2 "vector_move_operand"  " x,m,C,*ym, C")))]
3878   "TARGET_AVX"
3879   "@
3880    vunpcklps\t{%2, %1, %0|%0, %1, %2}
3881    vinsertps\t{$0x10, %2, %1, %0|%0, %1, %2, 0x10}
3882    vmovss\t{%1, %0|%0, %1}
3883    punpckldq\t{%2, %0|%0, %2}
3884    movd\t{%1, %0|%0, %1}"
3885   [(set_attr "type" "sselog,sselog,ssemov,mmxcvt,mmxmov")
3886    (set_attr "length_immediate" "*,1,*,*,*")
3887    (set_attr "prefix_extra" "*,1,*,*,*")
3888    (set (attr "prefix")
3889      (if_then_else (eq_attr "alternative" "3,4")
3890        (const_string "orig")
3891        (const_string "vex")))
3892    (set_attr "mode" "V4SF,V4SF,SF,DI,DI")])
3894 ;; Although insertps takes register source, we prefer
3895 ;; unpcklps with register source since it is shorter.
3896 (define_insn "*vec_concatv2sf_sse4_1"
3897   [(set (match_operand:V2SF 0 "register_operand"     "=x,x,x,*y ,*y")
3898         (vec_concat:V2SF
3899           (match_operand:SF 1 "nonimmediate_operand" " 0,0,m, 0 , m")
3900           (match_operand:SF 2 "vector_move_operand"  " x,m,C,*ym, C")))]
3901   "TARGET_SSE4_1"
3902   "@
3903    unpcklps\t{%2, %0|%0, %2}
3904    insertps\t{$0x10, %2, %0|%0, %2, 0x10}
3905    movss\t{%1, %0|%0, %1}
3906    punpckldq\t{%2, %0|%0, %2}
3907    movd\t{%1, %0|%0, %1}"
3908   [(set_attr "type" "sselog,sselog,ssemov,mmxcvt,mmxmov")
3909    (set_attr "prefix_data16" "*,1,*,*,*")
3910    (set_attr "prefix_extra" "*,1,*,*,*")
3911    (set_attr "length_immediate" "*,1,*,*,*")
3912    (set_attr "mode" "V4SF,V4SF,SF,DI,DI")])
3914 ;; ??? In theory we can match memory for the MMX alternative, but allowing
3915 ;; nonimmediate_operand for operand 2 and *not* allowing memory for the SSE
3916 ;; alternatives pretty much forces the MMX alternative to be chosen.
3917 (define_insn "*vec_concatv2sf_sse"
3918   [(set (match_operand:V2SF 0 "register_operand"     "=x,x,*y,*y")
3919         (vec_concat:V2SF
3920           (match_operand:SF 1 "nonimmediate_operand" " 0,m, 0, m")
3921           (match_operand:SF 2 "reg_or_0_operand"     " x,C,*y, C")))]
3922   "TARGET_SSE"
3923   "@
3924    unpcklps\t{%2, %0|%0, %2}
3925    movss\t{%1, %0|%0, %1}
3926    punpckldq\t{%2, %0|%0, %2}
3927    movd\t{%1, %0|%0, %1}"
3928   [(set_attr "type" "sselog,ssemov,mmxcvt,mmxmov")
3929    (set_attr "mode" "V4SF,SF,DI,DI")])
3931 (define_insn "*vec_concatv4sf_avx"
3932   [(set (match_operand:V4SF 0 "register_operand"   "=x,x")
3933         (vec_concat:V4SF
3934           (match_operand:V2SF 1 "register_operand" " x,x")
3935           (match_operand:V2SF 2 "nonimmediate_operand" " x,m")))]
3936   "TARGET_AVX"
3937   "@
3938    vmovlhps\t{%2, %1, %0|%0, %1, %2}
3939    vmovhps\t{%2, %1, %0|%0, %1, %2}"
3940   [(set_attr "type" "ssemov")
3941    (set_attr "prefix" "vex")
3942    (set_attr "mode" "V4SF,V2SF")])
3944 (define_insn "*vec_concatv4sf_sse"
3945   [(set (match_operand:V4SF 0 "register_operand"   "=x,x")
3946         (vec_concat:V4SF
3947           (match_operand:V2SF 1 "register_operand" " 0,0")
3948           (match_operand:V2SF 2 "nonimmediate_operand" " x,m")))]
3949   "TARGET_SSE"
3950   "@
3951    movlhps\t{%2, %0|%0, %2}
3952    movhps\t{%2, %0|%0, %2}"
3953   [(set_attr "type" "ssemov")
3954    (set_attr "mode" "V4SF,V2SF")])
3956 (define_expand "vec_init<mode>"
3957   [(match_operand:SSEMODE 0 "register_operand" "")
3958    (match_operand 1 "" "")]
3959   "TARGET_SSE"
3961   ix86_expand_vector_init (false, operands[0], operands[1]);
3962   DONE;
3965 (define_insn "*vec_set<mode>_0_avx"
3966   [(set (match_operand:SSEMODE4S 0 "nonimmediate_operand"  "=x,x, x,x,  x,m")
3967         (vec_merge:SSEMODE4S
3968           (vec_duplicate:SSEMODE4S
3969             (match_operand:<ssescalarmode> 2
3970               "general_operand"                            " x,m,*r,x,*rm,x*rfF"))
3971           (match_operand:SSEMODE4S 1 "vector_move_operand" " C,C, C,x,  x,0")
3972           (const_int 1)))]
3973   "TARGET_AVX"
3974   "@
3975    vinsertps\t{$0xe, %2, %2, %0|%0, %2, %2, 0xe}
3976    vmov<ssescalarmodesuffix>\t{%2, %0|%0, %2}
3977    vmovd\t{%2, %0|%0, %2}
3978    vmovss\t{%2, %1, %0|%0, %1, %2}
3979    vpinsrd\t{$0, %2, %1, %0|%0, %1, %2, 0}
3980    #"
3981   [(set_attr "type" "sselog,ssemov,ssemov,ssemov,sselog,*")
3982    (set_attr "prefix_extra" "*,*,*,*,1,*")
3983    (set_attr "length_immediate" "*,*,*,*,1,*")
3984    (set_attr "prefix" "vex")
3985    (set_attr "mode" "SF,<ssescalarmode>,SI,SF,TI,*")])
3987 (define_insn "*vec_set<mode>_0_sse4_1"
3988   [(set (match_operand:SSEMODE4S 0 "nonimmediate_operand"  "=x,x, x,x,  x,m")
3989         (vec_merge:SSEMODE4S
3990           (vec_duplicate:SSEMODE4S
3991             (match_operand:<ssescalarmode> 2
3992               "general_operand"                            " x,m,*r,x,*rm,*rfF"))
3993           (match_operand:SSEMODE4S 1 "vector_move_operand" " C,C, C,0,  0,0")
3994           (const_int 1)))]
3995   "TARGET_SSE4_1"
3996   "@
3997    insertps\t{$0xe, %2, %0|%0, %2, 0xe}
3998    mov<ssescalarmodesuffix>\t{%2, %0|%0, %2}
3999    movd\t{%2, %0|%0, %2}
4000    movss\t{%2, %0|%0, %2}
4001    pinsrd\t{$0, %2, %0|%0, %2, 0}
4002    #"
4003   [(set_attr "type" "sselog,ssemov,ssemov,ssemov,sselog,*")
4004    (set_attr "prefix_extra" "*,*,*,*,1,*")
4005    (set_attr "length_immediate" "*,*,*,*,1,*")
4006    (set_attr "mode" "SF,<ssescalarmode>,SI,SF,TI,*")])
4008 (define_insn "*vec_set<mode>_0_sse2"
4009   [(set (match_operand:SSEMODE4S 0 "nonimmediate_operand"  "=x, x,x,m")
4010         (vec_merge:SSEMODE4S
4011           (vec_duplicate:SSEMODE4S
4012             (match_operand:<ssescalarmode> 2
4013               "general_operand"                            " m,*r,x,x*rfF"))
4014           (match_operand:SSEMODE4S 1 "vector_move_operand" " C, C,0,0")
4015           (const_int 1)))]
4016   "TARGET_SSE2"
4017   "@
4018    mov<ssescalarmodesuffix>\t{%2, %0|%0, %2}
4019    movd\t{%2, %0|%0, %2}
4020    movss\t{%2, %0|%0, %2}
4021    #"
4022   [(set_attr "type" "ssemov")
4023    (set_attr "mode" "<ssescalarmode>,SI,SF,*")])
4025 (define_insn "vec_set<mode>_0"
4026   [(set (match_operand:SSEMODE4S 0 "nonimmediate_operand"  "=x,x,m")
4027         (vec_merge:SSEMODE4S
4028           (vec_duplicate:SSEMODE4S
4029             (match_operand:<ssescalarmode> 2
4030               "general_operand"                            " m,x,x*rfF"))
4031           (match_operand:SSEMODE4S 1 "vector_move_operand" " C,0,0")
4032           (const_int 1)))]
4033   "TARGET_SSE"
4034   "@
4035    movss\t{%2, %0|%0, %2}
4036    movss\t{%2, %0|%0, %2}
4037    #"
4038   [(set_attr "type" "ssemov")
4039    (set_attr "mode" "SF,SF,*")])
4041 ;; A subset is vec_setv4sf.
4042 (define_insn "*vec_setv4sf_avx"
4043   [(set (match_operand:V4SF 0 "register_operand" "=x")
4044         (vec_merge:V4SF
4045           (vec_duplicate:V4SF
4046             (match_operand:SF 2 "nonimmediate_operand" "xm"))
4047           (match_operand:V4SF 1 "register_operand" "x")
4048           (match_operand:SI 3 "const_pow2_1_to_8_operand" "n")))]
4049   "TARGET_AVX"
4051   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])) << 4);
4052   return "vinsertps\t{%3, %2, %1, %0|%0, %1, %2, %3}";
4054   [(set_attr "type" "sselog")
4055    (set_attr "prefix_extra" "1")
4056    (set_attr "length_immediate" "1")
4057    (set_attr "prefix" "vex")
4058    (set_attr "mode" "V4SF")])
4060 (define_insn "*vec_setv4sf_sse4_1"
4061   [(set (match_operand:V4SF 0 "register_operand" "=x")
4062         (vec_merge:V4SF
4063           (vec_duplicate:V4SF
4064             (match_operand:SF 2 "nonimmediate_operand" "xm"))
4065           (match_operand:V4SF 1 "register_operand" "0")
4066           (match_operand:SI 3 "const_pow2_1_to_8_operand" "n")))]
4067   "TARGET_SSE4_1"
4069   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])) << 4);
4070   return "insertps\t{%3, %2, %0|%0, %2, %3}";
4072   [(set_attr "type" "sselog")
4073    (set_attr "prefix_data16" "1")
4074    (set_attr "prefix_extra" "1")
4075    (set_attr "length_immediate" "1")
4076    (set_attr "mode" "V4SF")])
4078 (define_insn "*avx_insertps"
4079   [(set (match_operand:V4SF 0 "register_operand" "=x")
4080         (unspec:V4SF [(match_operand:V4SF 2 "nonimmediate_operand" "xm")
4081                       (match_operand:V4SF 1 "register_operand" "x")
4082                       (match_operand:SI 3 "const_0_to_255_operand" "n")]
4083                      UNSPEC_INSERTPS))]
4084   "TARGET_AVX"
4085   "vinsertps\t{%3, %2, %1, %0|%0, %1, %2, %3}";
4086   [(set_attr "type" "sselog")
4087    (set_attr "prefix" "vex")
4088    (set_attr "prefix_extra" "1")
4089    (set_attr "length_immediate" "1")
4090    (set_attr "mode" "V4SF")])
4092 (define_insn "sse4_1_insertps"
4093   [(set (match_operand:V4SF 0 "register_operand" "=x")
4094         (unspec:V4SF [(match_operand:V4SF 2 "register_operand" "x")
4095                       (match_operand:V4SF 1 "register_operand" "0")
4096                       (match_operand:SI 3 "const_0_to_255_operand" "n")]
4097                      UNSPEC_INSERTPS))]
4098   "TARGET_SSE4_1"
4099   "insertps\t{%3, %2, %0|%0, %2, %3}";
4100   [(set_attr "type" "sselog")
4101    (set_attr "prefix_data16" "1")
4102    (set_attr "prefix_extra" "1")
4103    (set_attr "length_immediate" "1")
4104    (set_attr "mode" "V4SF")])
4106 (define_split
4107   [(set (match_operand:SSEMODE4S 0 "memory_operand" "")
4108         (vec_merge:SSEMODE4S
4109           (vec_duplicate:SSEMODE4S
4110             (match_operand:<ssescalarmode> 1 "nonmemory_operand" ""))
4111           (match_dup 0)
4112           (const_int 1)))]
4113   "TARGET_SSE && reload_completed"
4114   [(const_int 0)]
4116   emit_move_insn (adjust_address (operands[0], <ssescalarmode>mode, 0),
4117                   operands[1]);
4118   DONE;
4121 (define_expand "vec_set<mode>"
4122   [(match_operand:SSEMODE 0 "register_operand" "")
4123    (match_operand:<ssescalarmode> 1 "register_operand" "")
4124    (match_operand 2 "const_int_operand" "")]
4125   "TARGET_SSE"
4127   ix86_expand_vector_set (false, operands[0], operands[1],
4128                           INTVAL (operands[2]));
4129   DONE;
4132 (define_insn_and_split "*vec_extractv4sf_0"
4133   [(set (match_operand:SF 0 "nonimmediate_operand" "=x,m,f,r")
4134         (vec_select:SF
4135           (match_operand:V4SF 1 "nonimmediate_operand" "xm,x,m,m")
4136           (parallel [(const_int 0)])))]
4137   "TARGET_SSE && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
4138   "#"
4139   "&& reload_completed"
4140   [(const_int 0)]
4142   rtx op1 = operands[1];
4143   if (REG_P (op1))
4144     op1 = gen_rtx_REG (SFmode, REGNO (op1));
4145   else
4146     op1 = gen_lowpart (SFmode, op1);
4147   emit_move_insn (operands[0], op1);
4148   DONE;
4151 (define_expand "avx_vextractf128<mode>"
4152   [(match_operand:<avxhalfvecmode> 0 "nonimmediate_operand" "")
4153    (match_operand:AVX256MODE 1 "register_operand" "")
4154    (match_operand:SI 2 "const_0_to_1_operand" "")]
4155   "TARGET_AVX"
4157   switch (INTVAL (operands[2]))
4158     {
4159     case 0:
4160       emit_insn (gen_vec_extract_lo_<mode> (operands[0], operands[1]));
4161       break;
4162     case 1:
4163       emit_insn (gen_vec_extract_hi_<mode> (operands[0], operands[1]));
4164       break;
4165     default:
4166       gcc_unreachable ();
4167     }
4168   DONE;
4171 (define_insn_and_split "vec_extract_lo_<mode>"
4172   [(set (match_operand:<avxhalfvecmode> 0 "nonimmediate_operand" "=x,m")
4173         (vec_select:<avxhalfvecmode>
4174           (match_operand:AVX256MODE4P 1 "nonimmediate_operand" "xm,x")
4175           (parallel [(const_int 0) (const_int 1)])))]
4176   "TARGET_AVX"
4177   "#"
4178   "&& reload_completed"
4179   [(const_int 0)]
4181   rtx op1 = operands[1];
4182   if (REG_P (op1))
4183     op1 = gen_rtx_REG (<avxhalfvecmode>mode, REGNO (op1));
4184   else
4185     op1 = gen_lowpart (<avxhalfvecmode>mode, op1);
4186   emit_move_insn (operands[0], op1);
4187   DONE;
4190 (define_insn "vec_extract_hi_<mode>"
4191   [(set (match_operand:<avxhalfvecmode> 0 "nonimmediate_operand" "=x,m")
4192         (vec_select:<avxhalfvecmode>
4193           (match_operand:AVX256MODE4P 1 "register_operand" "x,x")
4194           (parallel [(const_int 2) (const_int 3)])))]
4195   "TARGET_AVX"
4196   "vextractf128\t{$0x1, %1, %0|%0, %1, 0x1}"
4197   [(set_attr "type" "sselog")
4198    (set_attr "prefix_extra" "1")
4199    (set_attr "length_immediate" "1")
4200    (set_attr "memory" "none,store")
4201    (set_attr "prefix" "vex")
4202    (set_attr "mode" "V8SF")])
4204 (define_insn_and_split "vec_extract_lo_<mode>"
4205   [(set (match_operand:<avxhalfvecmode> 0 "nonimmediate_operand" "=x,m")
4206         (vec_select:<avxhalfvecmode>
4207           (match_operand:AVX256MODE8P 1 "nonimmediate_operand" "xm,x")
4208           (parallel [(const_int 0) (const_int 1)
4209                      (const_int 2) (const_int 3)])))]
4210   "TARGET_AVX"
4211   "#"
4212   "&& reload_completed"
4213   [(const_int 0)]
4215   rtx op1 = operands[1];
4216   if (REG_P (op1))
4217     op1 = gen_rtx_REG (<avxhalfvecmode>mode, REGNO (op1));
4218   else
4219     op1 = gen_lowpart (<avxhalfvecmode>mode, op1);
4220   emit_move_insn (operands[0], op1);
4221   DONE;
4224 (define_insn "vec_extract_hi_<mode>"
4225   [(set (match_operand:<avxhalfvecmode> 0 "nonimmediate_operand" "=x,m")
4226         (vec_select:<avxhalfvecmode>
4227           (match_operand:AVX256MODE8P 1 "register_operand" "x,x")
4228           (parallel [(const_int 4) (const_int 5)
4229                      (const_int 6) (const_int 7)])))]
4230   "TARGET_AVX"
4231   "vextractf128\t{$0x1, %1, %0|%0, %1, 0x1}"
4232   [(set_attr "type" "sselog")
4233    (set_attr "prefix_extra" "1")
4234    (set_attr "length_immediate" "1")
4235    (set_attr "memory" "none,store")
4236    (set_attr "prefix" "vex")
4237    (set_attr "mode" "V8SF")])
4239 (define_insn_and_split "vec_extract_lo_v16hi"
4240   [(set (match_operand:V8HI 0 "nonimmediate_operand" "=x,m")
4241         (vec_select:V8HI
4242           (match_operand:V16HI 1 "nonimmediate_operand" "xm,x")
4243           (parallel [(const_int 0) (const_int 1)
4244                      (const_int 2) (const_int 3)
4245                      (const_int 4) (const_int 5)
4246                      (const_int 6) (const_int 7)])))]
4247   "TARGET_AVX"
4248   "#"
4249   "&& reload_completed"
4250   [(const_int 0)]
4252   rtx op1 = operands[1];
4253   if (REG_P (op1))
4254     op1 = gen_rtx_REG (V8HImode, REGNO (op1));
4255   else
4256     op1 = gen_lowpart (V8HImode, op1);
4257   emit_move_insn (operands[0], op1);
4258   DONE;
4261 (define_insn "vec_extract_hi_v16hi"
4262   [(set (match_operand:V8HI 0 "nonimmediate_operand" "=x,m")
4263         (vec_select:V8HI
4264           (match_operand:V16HI 1 "register_operand" "x,x")
4265           (parallel [(const_int 8) (const_int 9)
4266                      (const_int 10) (const_int 11)
4267                      (const_int 12) (const_int 13)
4268                      (const_int 14) (const_int 15)])))]
4269   "TARGET_AVX"
4270   "vextractf128\t{$0x1, %1, %0|%0, %1, 0x1}"
4271   [(set_attr "type" "sselog")
4272    (set_attr "prefix_extra" "1")
4273    (set_attr "length_immediate" "1")
4274    (set_attr "memory" "none,store")
4275    (set_attr "prefix" "vex")
4276    (set_attr "mode" "V8SF")])
4278 (define_insn_and_split "vec_extract_lo_v32qi"
4279   [(set (match_operand:V16QI 0 "nonimmediate_operand" "=x,m")
4280         (vec_select:V16QI
4281           (match_operand:V32QI 1 "nonimmediate_operand" "xm,x")
4282           (parallel [(const_int 0) (const_int 1)
4283                      (const_int 2) (const_int 3)
4284                      (const_int 4) (const_int 5)
4285                      (const_int 6) (const_int 7)
4286                      (const_int 8) (const_int 9)
4287                      (const_int 10) (const_int 11)
4288                      (const_int 12) (const_int 13)
4289                      (const_int 14) (const_int 15)])))]
4290   "TARGET_AVX"
4291   "#"
4292   "&& reload_completed"
4293   [(const_int 0)]
4295   rtx op1 = operands[1];
4296   if (REG_P (op1))
4297     op1 = gen_rtx_REG (V16QImode, REGNO (op1));
4298   else
4299     op1 = gen_lowpart (V16QImode, op1);
4300   emit_move_insn (operands[0], op1);
4301   DONE;
4304 (define_insn "vec_extract_hi_v32qi"
4305   [(set (match_operand:V16QI 0 "nonimmediate_operand" "=x,m")
4306         (vec_select:V16QI
4307           (match_operand:V32QI 1 "register_operand" "x,x")
4308           (parallel [(const_int 16) (const_int 17)
4309                      (const_int 18) (const_int 19)
4310                      (const_int 20) (const_int 21)
4311                      (const_int 22) (const_int 23)
4312                      (const_int 24) (const_int 25)
4313                      (const_int 26) (const_int 27)
4314                      (const_int 28) (const_int 29)
4315                      (const_int 30) (const_int 31)])))]
4316   "TARGET_AVX"
4317   "vextractf128\t{$0x1, %1, %0|%0, %1, 0x1}"
4318   [(set_attr "type" "sselog")
4319    (set_attr "prefix_extra" "1")
4320    (set_attr "length_immediate" "1")
4321    (set_attr "memory" "none,store")
4322    (set_attr "prefix" "vex")
4323    (set_attr "mode" "V8SF")])
4325 (define_insn "*sse4_1_extractps"
4326   [(set (match_operand:SF 0 "nonimmediate_operand" "=rm")
4327         (vec_select:SF
4328           (match_operand:V4SF 1 "register_operand" "x")
4329           (parallel [(match_operand:SI 2 "const_0_to_3_operand" "n")])))]
4330   "TARGET_SSE4_1"
4331   "%vextractps\t{%2, %1, %0|%0, %1, %2}"
4332   [(set_attr "type" "sselog")
4333    (set_attr "prefix_data16" "1")
4334    (set_attr "prefix_extra" "1")
4335    (set_attr "length_immediate" "1")
4336    (set_attr "prefix" "maybe_vex")
4337    (set_attr "mode" "V4SF")])
4339 (define_insn_and_split "*vec_extract_v4sf_mem"
4340   [(set (match_operand:SF 0 "register_operand" "=x*rf")
4341        (vec_select:SF
4342          (match_operand:V4SF 1 "memory_operand" "o")
4343          (parallel [(match_operand 2 "const_0_to_3_operand" "n")])))]
4344   ""
4345   "#"
4346   "reload_completed"
4347   [(const_int 0)]
4349   int i = INTVAL (operands[2]);
4351   emit_move_insn (operands[0], adjust_address (operands[1], SFmode, i*4));
4352   DONE;
4355 (define_expand "vec_extract<mode>"
4356   [(match_operand:<ssescalarmode> 0 "register_operand" "")
4357    (match_operand:SSEMODE 1 "register_operand" "")
4358    (match_operand 2 "const_int_operand" "")]
4359   "TARGET_SSE"
4361   ix86_expand_vector_extract (false, operands[0], operands[1],
4362                               INTVAL (operands[2]));
4363   DONE;
4366 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4368 ;; Parallel double-precision floating point element swizzling
4370 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4372 ;; Recall that the 256-bit unpck insns only shuffle within their lanes.
4373 (define_insn "avx_unpckhpd256"
4374   [(set (match_operand:V4DF 0 "register_operand" "=x")
4375         (vec_select:V4DF
4376           (vec_concat:V8DF
4377             (match_operand:V4DF 1 "register_operand" "x")
4378             (match_operand:V4DF 2 "nonimmediate_operand" "xm"))
4379           (parallel [(const_int 1) (const_int 5)
4380                      (const_int 3) (const_int 7)])))]
4381   "TARGET_AVX"
4382   "vunpckhpd\t{%2, %1, %0|%0, %1, %2}"
4383   [(set_attr "type" "sselog")
4384    (set_attr "prefix" "vex")
4385    (set_attr "mode" "V4DF")])
4387 (define_expand "vec_interleave_highv2df"
4388   [(set (match_operand:V2DF 0 "register_operand" "")
4389         (vec_select:V2DF
4390           (vec_concat:V4DF
4391             (match_operand:V2DF 1 "nonimmediate_operand" "")
4392             (match_operand:V2DF 2 "nonimmediate_operand" ""))
4393           (parallel [(const_int 1)
4394                      (const_int 3)])))]
4395   "TARGET_SSE2"
4397   if (!ix86_vec_interleave_v2df_operator_ok (operands, 1))
4398     operands[2] = force_reg (V2DFmode, operands[2]);
4401 (define_insn "*avx_interleave_highv2df"
4402   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,x,x,m")
4403         (vec_select:V2DF
4404           (vec_concat:V4DF
4405             (match_operand:V2DF 1 "nonimmediate_operand" " x,o,o,x")
4406             (match_operand:V2DF 2 "nonimmediate_operand" " x,1,x,0"))
4407           (parallel [(const_int 1)
4408                      (const_int 3)])))]
4409   "TARGET_AVX && ix86_vec_interleave_v2df_operator_ok (operands, 1)"
4410   "@
4411    vunpckhpd\t{%2, %1, %0|%0, %1, %2}
4412    vmovddup\t{%H1, %0|%0, %H1}
4413    vmovlpd\t{%H1, %2, %0|%0, %2, %H1}
4414    vmovhpd\t{%1, %0|%0, %1}"
4415   [(set_attr "type" "sselog,sselog,ssemov,ssemov")
4416    (set_attr "prefix" "vex")
4417    (set_attr "mode" "V2DF,V2DF,V1DF,V1DF")])
4419 (define_insn "*sse3_interleave_highv2df"
4420   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,x,x,m")
4421         (vec_select:V2DF
4422           (vec_concat:V4DF
4423             (match_operand:V2DF 1 "nonimmediate_operand" " 0,o,o,x")
4424             (match_operand:V2DF 2 "nonimmediate_operand" " x,1,0,0"))
4425           (parallel [(const_int 1)
4426                      (const_int 3)])))]
4427   "TARGET_SSE3 && ix86_vec_interleave_v2df_operator_ok (operands, 1)"
4428   "@
4429    unpckhpd\t{%2, %0|%0, %2}
4430    movddup\t{%H1, %0|%0, %H1}
4431    movlpd\t{%H1, %0|%0, %H1}
4432    movhpd\t{%1, %0|%0, %1}"
4433   [(set_attr "type" "sselog,sselog,ssemov,ssemov")
4434    (set_attr "prefix_data16" "*,*,1,1")
4435    (set_attr "mode" "V2DF,V2DF,V1DF,V1DF")])
4437 (define_insn "*sse2_interleave_highv2df"
4438   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,x,m")
4439         (vec_select:V2DF
4440           (vec_concat:V4DF
4441             (match_operand:V2DF 1 "nonimmediate_operand" " 0,o,x")
4442             (match_operand:V2DF 2 "nonimmediate_operand" " x,0,0"))
4443           (parallel [(const_int 1)
4444                      (const_int 3)])))]
4445   "TARGET_SSE2 && ix86_vec_interleave_v2df_operator_ok (operands, 1)"
4446   "@
4447    unpckhpd\t{%2, %0|%0, %2}
4448    movlpd\t{%H1, %0|%0, %H1}
4449    movhpd\t{%1, %0|%0, %1}"
4450   [(set_attr "type" "sselog,ssemov,ssemov")
4451    (set_attr "prefix_data16" "*,1,1")
4452    (set_attr "mode" "V2DF,V1DF,V1DF")])
4454 ;; Recall that the 256-bit unpck insns only shuffle within their lanes.
4455 (define_expand "avx_movddup256"
4456   [(set (match_operand:V4DF 0 "register_operand" "")
4457         (vec_select:V4DF
4458           (vec_concat:V8DF
4459             (match_operand:V4DF 1 "nonimmediate_operand" "")
4460             (match_dup 1))
4461           (parallel [(const_int 0) (const_int 4)
4462                      (const_int 2) (const_int 6)])))]
4463   "TARGET_AVX")
4465 (define_expand "avx_unpcklpd256"
4466   [(set (match_operand:V4DF 0 "register_operand" "")
4467         (vec_select:V4DF
4468           (vec_concat:V8DF
4469             (match_operand:V4DF 1 "register_operand" "")
4470             (match_operand:V4DF 2 "nonimmediate_operand" ""))
4471           (parallel [(const_int 0) (const_int 4)
4472                      (const_int 2) (const_int 6)])))]
4473   "TARGET_AVX")
4475 (define_insn "*avx_unpcklpd256"
4476   [(set (match_operand:V4DF 0 "register_operand"         "=x,x")
4477         (vec_select:V4DF
4478           (vec_concat:V8DF
4479             (match_operand:V4DF 1 "nonimmediate_operand" "xm,x")
4480             (match_operand:V4DF 2 "nonimmediate_operand" " 1,xm"))
4481           (parallel [(const_int 0) (const_int 4)
4482                      (const_int 2) (const_int 6)])))]
4483   "TARGET_AVX
4484    && (!MEM_P (operands[1]) || rtx_equal_p (operands[1], operands[2]))"
4485   "@
4486    vmovddup\t{%1, %0|%0, %1}
4487    vunpcklpd\t{%2, %1, %0|%0, %1, %2}"
4488   [(set_attr "type" "sselog")
4489    (set_attr "prefix" "vex")
4490    (set_attr "mode" "V4DF")])
4492 (define_expand "vec_interleave_lowv2df"
4493   [(set (match_operand:V2DF 0 "register_operand" "")
4494         (vec_select:V2DF
4495           (vec_concat:V4DF
4496             (match_operand:V2DF 1 "nonimmediate_operand" "")
4497             (match_operand:V2DF 2 "nonimmediate_operand" ""))
4498           (parallel [(const_int 0)
4499                      (const_int 2)])))]
4500   "TARGET_SSE2"
4502   if (!ix86_vec_interleave_v2df_operator_ok (operands, 0))
4503     operands[1] = force_reg (V2DFmode, operands[1]);
4506 (define_insn "*avx_interleave_lowv2df"
4507   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,x,x,o")
4508         (vec_select:V2DF
4509           (vec_concat:V4DF
4510             (match_operand:V2DF 1 "nonimmediate_operand" " x,m,x,0")
4511             (match_operand:V2DF 2 "nonimmediate_operand" " x,1,m,x"))
4512           (parallel [(const_int 0)
4513                      (const_int 2)])))]
4514   "TARGET_AVX && ix86_vec_interleave_v2df_operator_ok (operands, 0)"
4515   "@
4516    vunpcklpd\t{%2, %1, %0|%0, %1, %2}
4517    vmovddup\t{%1, %0|%0, %1}
4518    vmovhpd\t{%2, %1, %0|%0, %1, %2}
4519    vmovlpd\t{%2, %H0|%H0, %2}"
4520   [(set_attr "type" "sselog,sselog,ssemov,ssemov")
4521    (set_attr "prefix" "vex")
4522    (set_attr "mode" "V2DF,V2DF,V1DF,V1DF")])
4524 (define_insn "*sse3_interleave_lowv2df"
4525   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,x,x,o")
4526         (vec_select:V2DF
4527           (vec_concat:V4DF
4528             (match_operand:V2DF 1 "nonimmediate_operand" " 0,m,0,0")
4529             (match_operand:V2DF 2 "nonimmediate_operand" " x,1,m,x"))
4530           (parallel [(const_int 0)
4531                      (const_int 2)])))]
4532   "TARGET_SSE3 && ix86_vec_interleave_v2df_operator_ok (operands, 0)"
4533   "@
4534    unpcklpd\t{%2, %0|%0, %2}
4535    movddup\t{%1, %0|%0, %1}
4536    movhpd\t{%2, %0|%0, %2}
4537    movlpd\t{%2, %H0|%H0, %2}"
4538   [(set_attr "type" "sselog,sselog,ssemov,ssemov")
4539    (set_attr "prefix_data16" "*,*,1,1")
4540    (set_attr "mode" "V2DF,V2DF,V1DF,V1DF")])
4542 (define_insn "*sse2_interleave_lowv2df"
4543   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,x,o")
4544         (vec_select:V2DF
4545           (vec_concat:V4DF
4546             (match_operand:V2DF 1 "nonimmediate_operand" " 0,0,0")
4547             (match_operand:V2DF 2 "nonimmediate_operand" " x,m,x"))
4548           (parallel [(const_int 0)
4549                      (const_int 2)])))]
4550   "TARGET_SSE2 && ix86_vec_interleave_v2df_operator_ok (operands, 0)"
4551   "@
4552    unpcklpd\t{%2, %0|%0, %2}
4553    movhpd\t{%2, %0|%0, %2}
4554    movlpd\t{%2, %H0|%H0, %2}"
4555   [(set_attr "type" "sselog,ssemov,ssemov")
4556    (set_attr "prefix_data16" "*,1,1")
4557    (set_attr "mode" "V2DF,V1DF,V1DF")])
4559 (define_split
4560   [(set (match_operand:V2DF 0 "memory_operand" "")
4561         (vec_select:V2DF
4562           (vec_concat:V4DF
4563             (match_operand:V2DF 1 "register_operand" "")
4564             (match_dup 1))
4565           (parallel [(const_int 0)
4566                      (const_int 2)])))]
4567   "TARGET_SSE3 && reload_completed"
4568   [(const_int 0)]
4570   rtx low = gen_rtx_REG (DFmode, REGNO (operands[1]));
4571   emit_move_insn (adjust_address (operands[0], DFmode, 0), low);
4572   emit_move_insn (adjust_address (operands[0], DFmode, 8), low);
4573   DONE;
4576 (define_split
4577   [(set (match_operand:V2DF 0 "register_operand" "")
4578         (vec_select:V2DF
4579           (vec_concat:V4DF
4580             (match_operand:V2DF 1 "memory_operand" "")
4581             (match_dup 1))
4582           (parallel [(match_operand:SI 2 "const_0_to_1_operand" "")
4583                      (match_operand:SI 3 "const_int_operand" "")])))]
4584   "TARGET_SSE3 && INTVAL (operands[2]) + 2 == INTVAL (operands[3])"
4585   [(set (match_dup 0) (vec_duplicate:V2DF (match_dup 1)))]
4587   operands[1] = adjust_address (operands[1], DFmode, INTVAL (operands[2]) * 8);
4590 (define_expand "avx_shufpd256"
4591   [(match_operand:V4DF 0 "register_operand" "")
4592    (match_operand:V4DF 1 "register_operand" "")
4593    (match_operand:V4DF 2 "nonimmediate_operand" "")
4594    (match_operand:SI 3 "const_int_operand" "")]
4595   "TARGET_AVX"
4597   int mask = INTVAL (operands[3]);
4598   emit_insn (gen_avx_shufpd256_1 (operands[0], operands[1], operands[2],
4599                                    GEN_INT (mask & 1),
4600                                    GEN_INT (mask & 2 ? 5 : 4),
4601                                    GEN_INT (mask & 4 ? 3 : 2),
4602                                    GEN_INT (mask & 8 ? 7 : 6)));
4603   DONE;
4606 (define_insn "avx_shufpd256_1"
4607   [(set (match_operand:V4DF 0 "register_operand" "=x")
4608         (vec_select:V4DF
4609           (vec_concat:V8DF
4610             (match_operand:V4DF 1 "register_operand" "x")
4611             (match_operand:V4DF 2 "nonimmediate_operand" "xm"))
4612           (parallel [(match_operand 3 "const_0_to_1_operand" "")
4613                      (match_operand 4 "const_4_to_5_operand" "")
4614                      (match_operand 5 "const_2_to_3_operand" "")
4615                      (match_operand 6 "const_6_to_7_operand" "")])))]
4616   "TARGET_AVX"
4618   int mask;
4619   mask = INTVAL (operands[3]);
4620   mask |= (INTVAL (operands[4]) - 4) << 1;
4621   mask |= (INTVAL (operands[5]) - 2) << 2;
4622   mask |= (INTVAL (operands[6]) - 6) << 3;
4623   operands[3] = GEN_INT (mask);
4625   return "vshufpd\t{%3, %2, %1, %0|%0, %1, %2, %3}";
4627   [(set_attr "type" "sselog")
4628    (set_attr "length_immediate" "1")
4629    (set_attr "prefix" "vex")
4630    (set_attr "mode" "V4DF")])
4632 (define_expand "sse2_shufpd"
4633   [(match_operand:V2DF 0 "register_operand" "")
4634    (match_operand:V2DF 1 "register_operand" "")
4635    (match_operand:V2DF 2 "nonimmediate_operand" "")
4636    (match_operand:SI 3 "const_int_operand" "")]
4637   "TARGET_SSE2"
4639   int mask = INTVAL (operands[3]);
4640   emit_insn (gen_sse2_shufpd_v2df (operands[0], operands[1], operands[2],
4641                                 GEN_INT (mask & 1),
4642                                 GEN_INT (mask & 2 ? 3 : 2)));
4643   DONE;
4646 (define_expand "vec_extract_even<mode>"
4647   [(match_operand:SSEMODE_EO 0 "register_operand" "")
4648    (match_operand:SSEMODE_EO 1 "register_operand" "")
4649    (match_operand:SSEMODE_EO 2 "register_operand" "")]
4650   ""
4652   ix86_expand_vec_extract_even_odd (operands[0], operands[1], operands[2], 0);
4653   DONE;
4656 (define_expand "vec_extract_odd<mode>"
4657   [(match_operand:SSEMODE_EO 0 "register_operand" "")
4658    (match_operand:SSEMODE_EO 1 "register_operand" "")
4659    (match_operand:SSEMODE_EO 2 "register_operand" "")]
4660   ""
4662   ix86_expand_vec_extract_even_odd (operands[0], operands[1], operands[2], 1);
4663   DONE;
4666 ;; punpcklqdq and punpckhqdq are shorter than shufpd.
4667 (define_insn "*avx_interleave_highv2di"
4668   [(set (match_operand:V2DI 0 "register_operand" "=x")
4669         (vec_select:V2DI
4670           (vec_concat:V4DI
4671             (match_operand:V2DI 1 "register_operand" "x")
4672             (match_operand:V2DI 2 "nonimmediate_operand" "xm"))
4673           (parallel [(const_int 1)
4674                      (const_int 3)])))]
4675   "TARGET_AVX"
4676   "vpunpckhqdq\t{%2, %1, %0|%0, %1, %2}"
4677   [(set_attr "type" "sselog")
4678    (set_attr "prefix" "vex")
4679    (set_attr "mode" "TI")])
4681 (define_insn "vec_interleave_highv2di"
4682   [(set (match_operand:V2DI 0 "register_operand" "=x")
4683         (vec_select:V2DI
4684           (vec_concat:V4DI
4685             (match_operand:V2DI 1 "register_operand" "0")
4686             (match_operand:V2DI 2 "nonimmediate_operand" "xm"))
4687           (parallel [(const_int 1)
4688                      (const_int 3)])))]
4689   "TARGET_SSE2"
4690   "punpckhqdq\t{%2, %0|%0, %2}"
4691   [(set_attr "type" "sselog")
4692    (set_attr "prefix_data16" "1")
4693    (set_attr "mode" "TI")])
4695 (define_insn "*avx_interleave_lowv2di"
4696   [(set (match_operand:V2DI 0 "register_operand" "=x")
4697         (vec_select:V2DI
4698           (vec_concat:V4DI
4699             (match_operand:V2DI 1 "register_operand" "x")
4700             (match_operand:V2DI 2 "nonimmediate_operand" "xm"))
4701           (parallel [(const_int 0)
4702                      (const_int 2)])))]
4703   "TARGET_AVX"
4704   "vpunpcklqdq\t{%2, %1, %0|%0, %1, %2}"
4705   [(set_attr "type" "sselog")
4706    (set_attr "prefix" "vex")
4707    (set_attr "mode" "TI")])
4709 (define_insn "vec_interleave_lowv2di"
4710   [(set (match_operand:V2DI 0 "register_operand" "=x")
4711         (vec_select:V2DI
4712           (vec_concat:V4DI
4713             (match_operand:V2DI 1 "register_operand" "0")
4714             (match_operand:V2DI 2 "nonimmediate_operand" "xm"))
4715           (parallel [(const_int 0)
4716                      (const_int 2)])))]
4717   "TARGET_SSE2"
4718   "punpcklqdq\t{%2, %0|%0, %2}"
4719   [(set_attr "type" "sselog")
4720    (set_attr "prefix_data16" "1")
4721    (set_attr "mode" "TI")])
4723 (define_insn "*avx_shufpd_<mode>"
4724   [(set (match_operand:SSEMODE2D 0 "register_operand" "=x")
4725         (vec_select:SSEMODE2D
4726           (vec_concat:<ssedoublesizemode>
4727             (match_operand:SSEMODE2D 1 "register_operand" "x")
4728             (match_operand:SSEMODE2D 2 "nonimmediate_operand" "xm"))
4729           (parallel [(match_operand 3 "const_0_to_1_operand" "")
4730                      (match_operand 4 "const_2_to_3_operand" "")])))]
4731   "TARGET_AVX"
4733   int mask;
4734   mask = INTVAL (operands[3]);
4735   mask |= (INTVAL (operands[4]) - 2) << 1;
4736   operands[3] = GEN_INT (mask);
4738   return "vshufpd\t{%3, %2, %1, %0|%0, %1, %2, %3}";
4740   [(set_attr "type" "sselog")
4741    (set_attr "length_immediate" "1")
4742    (set_attr "prefix" "vex")
4743    (set_attr "mode" "V2DF")])
4745 (define_insn "sse2_shufpd_<mode>"
4746   [(set (match_operand:SSEMODE2D 0 "register_operand" "=x")
4747         (vec_select:SSEMODE2D
4748           (vec_concat:<ssedoublesizemode>
4749             (match_operand:SSEMODE2D 1 "register_operand" "0")
4750             (match_operand:SSEMODE2D 2 "nonimmediate_operand" "xm"))
4751           (parallel [(match_operand 3 "const_0_to_1_operand" "")
4752                      (match_operand 4 "const_2_to_3_operand" "")])))]
4753   "TARGET_SSE2"
4755   int mask;
4756   mask = INTVAL (operands[3]);
4757   mask |= (INTVAL (operands[4]) - 2) << 1;
4758   operands[3] = GEN_INT (mask);
4760   return "shufpd\t{%3, %2, %0|%0, %2, %3}";
4762   [(set_attr "type" "sselog")
4763    (set_attr "length_immediate" "1")
4764    (set_attr "mode" "V2DF")])
4766 ;; Avoid combining registers from different units in a single alternative,
4767 ;; see comment above inline_secondary_memory_needed function in i386.c
4768 (define_insn "*avx_storehpd"
4769   [(set (match_operand:DF 0 "nonimmediate_operand"     "=m,x,x,*f,r")
4770         (vec_select:DF
4771           (match_operand:V2DF 1 "nonimmediate_operand" " x,x,o,o,o")
4772           (parallel [(const_int 1)])))]
4773   "TARGET_AVX && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
4774   "@
4775    vmovhpd\t{%1, %0|%0, %1}
4776    vunpckhpd\t{%1, %1, %0|%0, %1, %1}
4777    #
4778    #
4779    #"
4780   [(set_attr "type" "ssemov,sselog1,ssemov,fmov,imov")
4781    (set_attr "prefix" "vex")
4782    (set_attr "mode" "V1DF,V2DF,DF,DF,DF")])
4784 (define_insn "sse2_storehpd"
4785   [(set (match_operand:DF 0 "nonimmediate_operand"     "=m,x,x,*f,r")
4786         (vec_select:DF
4787           (match_operand:V2DF 1 "nonimmediate_operand" " x,0,o,o,o")
4788           (parallel [(const_int 1)])))]
4789   "TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
4790   "@
4791    movhpd\t{%1, %0|%0, %1}
4792    unpckhpd\t%0, %0
4793    #
4794    #
4795    #"
4796   [(set_attr "type" "ssemov,sselog1,ssemov,fmov,imov")
4797    (set_attr "prefix_data16" "1,*,*,*,*")
4798    (set_attr "mode" "V1DF,V2DF,DF,DF,DF")])
4800 (define_split
4801   [(set (match_operand:DF 0 "register_operand" "")
4802         (vec_select:DF
4803           (match_operand:V2DF 1 "memory_operand" "")
4804           (parallel [(const_int 1)])))]
4805   "TARGET_SSE2 && reload_completed"
4806   [(set (match_dup 0) (match_dup 1))]
4807   "operands[1] = adjust_address (operands[1], DFmode, 8);")
4809 ;; Avoid combining registers from different units in a single alternative,
4810 ;; see comment above inline_secondary_memory_needed function in i386.c
4811 (define_insn "sse2_storelpd"
4812   [(set (match_operand:DF 0 "nonimmediate_operand"     "=m,x,x,*f,r")
4813         (vec_select:DF
4814           (match_operand:V2DF 1 "nonimmediate_operand" " x,x,m,m,m")
4815           (parallel [(const_int 0)])))]
4816   "TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
4817   "@
4818    %vmovlpd\t{%1, %0|%0, %1}
4819    #
4820    #
4821    #
4822    #"
4823   [(set_attr "type" "ssemov,ssemov,ssemov,fmov,imov")
4824    (set_attr "prefix_data16" "1,*,*,*,*")
4825    (set_attr "prefix" "maybe_vex")
4826    (set_attr "mode" "V1DF,DF,DF,DF,DF")])
4828 (define_split
4829   [(set (match_operand:DF 0 "register_operand" "")
4830         (vec_select:DF
4831           (match_operand:V2DF 1 "nonimmediate_operand" "")
4832           (parallel [(const_int 0)])))]
4833   "TARGET_SSE2 && reload_completed"
4834   [(const_int 0)]
4836   rtx op1 = operands[1];
4837   if (REG_P (op1))
4838     op1 = gen_rtx_REG (DFmode, REGNO (op1));
4839   else
4840     op1 = gen_lowpart (DFmode, op1);
4841   emit_move_insn (operands[0], op1);
4842   DONE;
4845 (define_expand "sse2_loadhpd_exp"
4846   [(set (match_operand:V2DF 0 "nonimmediate_operand" "")
4847         (vec_concat:V2DF
4848           (vec_select:DF
4849             (match_operand:V2DF 1 "nonimmediate_operand" "")
4850             (parallel [(const_int 0)]))
4851           (match_operand:DF 2 "nonimmediate_operand" "")))]
4852   "TARGET_SSE2"
4853   "ix86_fixup_binary_operands (UNKNOWN, V2DFmode, operands);")
4855 ;; Avoid combining registers from different units in a single alternative,
4856 ;; see comment above inline_secondary_memory_needed function in i386.c
4857 (define_insn "*avx_loadhpd"
4858   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,x,o,o,o")
4859         (vec_concat:V2DF
4860           (vec_select:DF
4861             (match_operand:V2DF 1 "nonimmediate_operand" " x,x,0,0,0")
4862             (parallel [(const_int 0)]))
4863           (match_operand:DF 2 "nonimmediate_operand"     " m,x,x,*f,r")))]
4864   "TARGET_AVX && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
4865   "@
4866    vmovhpd\t{%2, %1, %0|%0, %1, %2}
4867    vunpcklpd\t{%2, %1, %0|%0, %1, %2}
4868    #
4869    #
4870    #"
4871   [(set_attr "type" "ssemov,sselog,ssemov,fmov,imov")
4872    (set_attr "prefix" "vex")
4873    (set_attr "mode" "V1DF,V2DF,DF,DF,DF")])
4875 (define_insn "sse2_loadhpd"
4876   [(set (match_operand:V2DF 0 "nonimmediate_operand"     "=x,x,x,o,o,o")
4877         (vec_concat:V2DF
4878           (vec_select:DF
4879             (match_operand:V2DF 1 "nonimmediate_operand" " 0,0,x,0,0,0")
4880             (parallel [(const_int 0)]))
4881           (match_operand:DF 2 "nonimmediate_operand"     " m,x,0,x,*f,r")))]
4882   "TARGET_SSE2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
4883   "@
4884    movhpd\t{%2, %0|%0, %2}
4885    unpcklpd\t{%2, %0|%0, %2}
4886    shufpd\t{$1, %1, %0|%0, %1, 1}
4887    #
4888    #
4889    #"
4890   [(set_attr "type" "ssemov,sselog,sselog,ssemov,fmov,imov")
4891    (set_attr "prefix_data16" "1,*,*,*,*,*")
4892    (set_attr "length_immediate" "*,*,1,*,*,*")
4893    (set_attr "mode" "V1DF,V2DF,V2DF,DF,DF,DF")])
4895 (define_split
4896   [(set (match_operand:V2DF 0 "memory_operand" "")
4897         (vec_concat:V2DF
4898           (vec_select:DF (match_dup 0) (parallel [(const_int 0)]))
4899           (match_operand:DF 1 "register_operand" "")))]
4900   "TARGET_SSE2 && reload_completed"
4901   [(set (match_dup 0) (match_dup 1))]
4902   "operands[0] = adjust_address (operands[0], DFmode, 8);")
4904 (define_expand "sse2_loadlpd_exp"
4905   [(set (match_operand:V2DF 0 "nonimmediate_operand" "")
4906         (vec_concat:V2DF
4907           (match_operand:DF 2 "nonimmediate_operand" "")
4908           (vec_select:DF
4909             (match_operand:V2DF 1 "nonimmediate_operand" "")
4910             (parallel [(const_int 1)]))))]
4911   "TARGET_SSE2"
4912   "ix86_fixup_binary_operands (UNKNOWN, V2DFmode, operands);")
4914 ;; Avoid combining registers from different units in a single alternative,
4915 ;; see comment above inline_secondary_memory_needed function in i386.c
4916 (define_insn "*avx_loadlpd"
4917   [(set (match_operand:V2DF 0 "nonimmediate_operand"    "=x,x,x,x,m,m,m")
4918         (vec_concat:V2DF
4919           (match_operand:DF 2 "nonimmediate_operand"    " m,m,x,x,x,*f,r")
4920           (vec_select:DF
4921             (match_operand:V2DF 1 "vector_move_operand" " C,x,x,o,0,0,0")
4922             (parallel [(const_int 1)]))))]
4923   "TARGET_AVX && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
4924   "@
4925    vmovsd\t{%2, %0|%0, %2}
4926    vmovlpd\t{%2, %1, %0|%0, %1, %2}
4927    vmovsd\t{%2, %1, %0|%0, %1, %2}
4928    vmovhpd\t{%H1, %2, %0|%0, %2, %H1}
4929    #
4930    #
4931    #"
4932   [(set_attr "type" "ssemov,ssemov,ssemov,ssemov,ssemov,fmov,imov")
4933    (set_attr "prefix" "vex")
4934    (set_attr "mode" "DF,V1DF,V1DF,V1DF,DF,DF,DF")])
4936 (define_insn "sse2_loadlpd"
4937   [(set (match_operand:V2DF 0 "nonimmediate_operand"    "=x,x,x,x,x,m,m,m")
4938         (vec_concat:V2DF
4939           (match_operand:DF 2 "nonimmediate_operand"    " m,m,x,0,0,x,*f,r")
4940           (vec_select:DF
4941             (match_operand:V2DF 1 "vector_move_operand" " C,0,0,x,o,0,0,0")
4942             (parallel [(const_int 1)]))))]
4943   "TARGET_SSE2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
4944   "@
4945    movsd\t{%2, %0|%0, %2}
4946    movlpd\t{%2, %0|%0, %2}
4947    movsd\t{%2, %0|%0, %2}
4948    shufpd\t{$2, %2, %0|%0, %2, 2}
4949    movhpd\t{%H1, %0|%0, %H1}
4950    #
4951    #
4952    #"
4953   [(set_attr "type" "ssemov,ssemov,ssemov,sselog,ssemov,ssemov,fmov,imov")
4954    (set_attr "prefix_data16" "*,1,*,*,1,*,*,*")
4955    (set_attr "length_immediate" "*,*,*,1,*,*,*,*")
4956    (set_attr "mode" "DF,V1DF,V1DF,V2DF,V1DF,DF,DF,DF")])
4958 (define_split
4959   [(set (match_operand:V2DF 0 "memory_operand" "")
4960         (vec_concat:V2DF
4961           (match_operand:DF 1 "register_operand" "")
4962           (vec_select:DF (match_dup 0) (parallel [(const_int 1)]))))]
4963   "TARGET_SSE2 && reload_completed"
4964   [(set (match_dup 0) (match_dup 1))]
4965   "operands[0] = adjust_address (operands[0], DFmode, 8);")
4967 ;; Not sure these two are ever used, but it doesn't hurt to have
4968 ;; them. -aoliva
4969 (define_insn "*vec_extractv2df_1_sse"
4970   [(set (match_operand:DF 0 "nonimmediate_operand" "=m,x,x")
4971         (vec_select:DF
4972           (match_operand:V2DF 1 "nonimmediate_operand" "x,x,o")
4973           (parallel [(const_int 1)])))]
4974   "!TARGET_SSE2 && TARGET_SSE
4975    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
4976   "@
4977    movhps\t{%1, %0|%0, %1}
4978    movhlps\t{%1, %0|%0, %1}
4979    movlps\t{%H1, %0|%0, %H1}"
4980   [(set_attr "type" "ssemov")
4981    (set_attr "mode" "V2SF,V4SF,V2SF")])
4983 (define_insn "*vec_extractv2df_0_sse"
4984   [(set (match_operand:DF 0 "nonimmediate_operand" "=m,x,x")
4985         (vec_select:DF
4986           (match_operand:V2DF 1 "nonimmediate_operand" "x,x,m")
4987           (parallel [(const_int 0)])))]
4988   "!TARGET_SSE2 && TARGET_SSE
4989    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
4990   "@
4991    movlps\t{%1, %0|%0, %1}
4992    movaps\t{%1, %0|%0, %1}
4993    movlps\t{%1, %0|%0, %1}"
4994   [(set_attr "type" "ssemov")
4995    (set_attr "mode" "V2SF,V4SF,V2SF")])
4997 (define_insn "*avx_movsd"
4998   [(set (match_operand:V2DF 0 "nonimmediate_operand"   "=x,x,m,x,o")
4999         (vec_merge:V2DF
5000           (match_operand:V2DF 2 "nonimmediate_operand" " x,m,x,x,0")
5001           (match_operand:V2DF 1 "nonimmediate_operand" " x,x,0,o,x")
5002           (const_int 1)))]
5003   "TARGET_AVX"
5004   "@
5005    vmovsd\t{%2, %1, %0|%0, %1, %2}
5006    vmovlpd\t{%2, %1, %0|%0, %1, %2}
5007    vmovlpd\t{%2, %0|%0, %2}
5008    vmovhps\t{%H1, %2, %0|%0, %2, %H1}
5009    vmovhps\t{%1, %H0|%H0, %1}"
5010   [(set_attr "type" "ssemov,ssemov,ssemov,ssemov,ssemov")
5011    (set_attr "prefix" "vex")
5012    (set_attr "mode" "DF,V1DF,V1DF,V1DF,V1DF")])
5014 (define_insn "sse2_movsd"
5015   [(set (match_operand:V2DF 0 "nonimmediate_operand"   "=x,x,m,x,x,o")
5016         (vec_merge:V2DF
5017           (match_operand:V2DF 2 "nonimmediate_operand" " x,m,x,0,0,0")
5018           (match_operand:V2DF 1 "nonimmediate_operand" " 0,0,0,x,o,x")
5019           (const_int 1)))]
5020   "TARGET_SSE2"
5021   "@
5022    movsd\t{%2, %0|%0, %2}
5023    movlpd\t{%2, %0|%0, %2}
5024    movlpd\t{%2, %0|%0, %2}
5025    shufpd\t{$2, %2, %0|%0, %2, 2}
5026    movhps\t{%H1, %0|%0, %H1}
5027    movhps\t{%1, %H0|%H0, %1}"
5028   [(set_attr "type" "ssemov,ssemov,ssemov,sselog,ssemov,ssemov")
5029    (set_attr "prefix_data16" "*,1,1,*,*,*")
5030    (set_attr "length_immediate" "*,*,*,1,*,*")
5031    (set_attr "mode" "DF,V1DF,V1DF,V2DF,V1DF,V1DF")])
5033 (define_insn "*vec_dupv2df_sse3"
5034   [(set (match_operand:V2DF 0 "register_operand" "=x")
5035         (vec_duplicate:V2DF
5036           (match_operand:DF 1 "nonimmediate_operand" "xm")))]
5037   "TARGET_SSE3"
5038   "%vmovddup\t{%1, %0|%0, %1}"
5039   [(set_attr "type" "sselog1")
5040    (set_attr "prefix" "maybe_vex")
5041    (set_attr "mode" "DF")])
5043 (define_insn "vec_dupv2df"
5044   [(set (match_operand:V2DF 0 "register_operand" "=x")
5045         (vec_duplicate:V2DF
5046           (match_operand:DF 1 "register_operand" "0")))]
5047   "TARGET_SSE2"
5048   "unpcklpd\t%0, %0"
5049   [(set_attr "type" "sselog1")
5050    (set_attr "mode" "V2DF")])
5052 (define_insn "*vec_concatv2df_sse3"
5053   [(set (match_operand:V2DF 0 "register_operand" "=x")
5054         (vec_concat:V2DF
5055           (match_operand:DF 1 "nonimmediate_operand" "xm")
5056           (match_dup 1)))]
5057   "TARGET_SSE3"
5058   "%vmovddup\t{%1, %0|%0, %1}"
5059   [(set_attr "type" "sselog1")
5060    (set_attr "prefix" "maybe_vex")
5061    (set_attr "mode" "DF")])
5063 (define_insn "*vec_concatv2df_avx"
5064   [(set (match_operand:V2DF 0 "register_operand"     "=x,x,x")
5065         (vec_concat:V2DF
5066           (match_operand:DF 1 "nonimmediate_operand" " x,x,m")
5067           (match_operand:DF 2 "vector_move_operand"  " x,m,C")))]
5068   "TARGET_AVX"
5069   "@
5070    vunpcklpd\t{%2, %1, %0|%0, %1, %2}
5071    vmovhpd\t{%2, %1, %0|%0, %1, %2}
5072    vmovsd\t{%1, %0|%0, %1}"
5073   [(set_attr "type" "ssemov")
5074    (set_attr "prefix" "vex")
5075    (set_attr "mode" "DF,V1DF,DF")])
5077 (define_insn "*vec_concatv2df"
5078   [(set (match_operand:V2DF 0 "register_operand"     "=Y2,Y2,Y2,x,x")
5079         (vec_concat:V2DF
5080           (match_operand:DF 1 "nonimmediate_operand" " 0 ,0 ,m ,0,0")
5081           (match_operand:DF 2 "vector_move_operand"  " Y2,m ,C ,x,m")))]
5082   "TARGET_SSE"
5083   "@
5084    unpcklpd\t{%2, %0|%0, %2}
5085    movhpd\t{%2, %0|%0, %2}
5086    movsd\t{%1, %0|%0, %1}
5087    movlhps\t{%2, %0|%0, %2}
5088    movhps\t{%2, %0|%0, %2}"
5089   [(set_attr "type" "sselog,ssemov,ssemov,ssemov,ssemov")
5090    (set_attr "prefix_data16" "*,1,*,*,*")
5091    (set_attr "mode" "V2DF,V1DF,DF,V4SF,V2SF")])
5093 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5095 ;; Parallel integral arithmetic
5097 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5099 (define_expand "neg<mode>2"
5100   [(set (match_operand:SSEMODEI 0 "register_operand" "")
5101         (minus:SSEMODEI
5102           (match_dup 2)
5103           (match_operand:SSEMODEI 1 "nonimmediate_operand" "")))]
5104   "TARGET_SSE2"
5105   "operands[2] = force_reg (<MODE>mode, CONST0_RTX (<MODE>mode));")
5107 (define_expand "<plusminus_insn><mode>3"
5108   [(set (match_operand:SSEMODEI 0 "register_operand" "")
5109         (plusminus:SSEMODEI
5110           (match_operand:SSEMODEI 1 "nonimmediate_operand" "")
5111           (match_operand:SSEMODEI 2 "nonimmediate_operand" "")))]
5112   "TARGET_SSE2"
5113   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
5115 (define_insn "*avx_<plusminus_insn><mode>3"
5116   [(set (match_operand:SSEMODEI 0 "register_operand" "=x")
5117         (plusminus:SSEMODEI
5118           (match_operand:SSEMODEI 1 "nonimmediate_operand" "<comm>x")
5119           (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))]
5120   "TARGET_AVX && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
5121   "vp<plusminus_mnemonic><ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
5122   [(set_attr "type" "sseiadd")
5123    (set_attr "prefix" "vex")
5124    (set_attr "mode" "TI")])
5126 (define_insn "*<plusminus_insn><mode>3"
5127   [(set (match_operand:SSEMODEI 0 "register_operand" "=x")
5128         (plusminus:SSEMODEI
5129           (match_operand:SSEMODEI 1 "nonimmediate_operand" "<comm>0")
5130           (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))]
5131   "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
5132   "p<plusminus_mnemonic><ssevecsize>\t{%2, %0|%0, %2}"
5133   [(set_attr "type" "sseiadd")
5134    (set_attr "prefix_data16" "1")
5135    (set_attr "mode" "TI")])
5137 (define_expand "sse2_<plusminus_insn><mode>3"
5138   [(set (match_operand:SSEMODE12 0 "register_operand" "")
5139         (sat_plusminus:SSEMODE12
5140           (match_operand:SSEMODE12 1 "nonimmediate_operand" "")
5141           (match_operand:SSEMODE12 2 "nonimmediate_operand" "")))]
5142   "TARGET_SSE2"
5143   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
5145 (define_insn "*avx_<plusminus_insn><mode>3"
5146   [(set (match_operand:SSEMODE12 0 "register_operand" "=x")
5147         (sat_plusminus:SSEMODE12
5148           (match_operand:SSEMODE12 1 "nonimmediate_operand" "<comm>x")
5149           (match_operand:SSEMODE12 2 "nonimmediate_operand" "xm")))]
5150   "TARGET_AVX && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
5151   "vp<plusminus_mnemonic><ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
5152   [(set_attr "type" "sseiadd")
5153    (set_attr "prefix" "vex")
5154    (set_attr "mode" "TI")])
5156 (define_insn "*sse2_<plusminus_insn><mode>3"
5157   [(set (match_operand:SSEMODE12 0 "register_operand" "=x")
5158         (sat_plusminus:SSEMODE12
5159           (match_operand:SSEMODE12 1 "nonimmediate_operand" "<comm>0")
5160           (match_operand:SSEMODE12 2 "nonimmediate_operand" "xm")))]
5161   "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
5162   "p<plusminus_mnemonic><ssevecsize>\t{%2, %0|%0, %2}"
5163   [(set_attr "type" "sseiadd")
5164    (set_attr "prefix_data16" "1")
5165    (set_attr "mode" "TI")])
5167 (define_insn_and_split "mulv16qi3"
5168   [(set (match_operand:V16QI 0 "register_operand" "")
5169         (mult:V16QI (match_operand:V16QI 1 "register_operand" "")
5170                     (match_operand:V16QI 2 "register_operand" "")))]
5171   "TARGET_SSE2
5172    && can_create_pseudo_p ()"
5173   "#"
5174   "&& 1"
5175   [(const_int 0)]
5177   rtx t[6];
5178   int i;
5180   for (i = 0; i < 6; ++i)
5181     t[i] = gen_reg_rtx (V16QImode);
5183   /* Unpack data such that we've got a source byte in each low byte of
5184      each word.  We don't care what goes into the high byte of each word.
5185      Rather than trying to get zero in there, most convenient is to let
5186      it be a copy of the low byte.  */
5187   emit_insn (gen_vec_interleave_highv16qi (t[0], operands[1], operands[1]));
5188   emit_insn (gen_vec_interleave_highv16qi (t[1], operands[2], operands[2]));
5189   emit_insn (gen_vec_interleave_lowv16qi (t[2], operands[1], operands[1]));
5190   emit_insn (gen_vec_interleave_lowv16qi (t[3], operands[2], operands[2]));
5192   /* Multiply words.  The end-of-line annotations here give a picture of what
5193      the output of that instruction looks like.  Dot means don't care; the
5194      letters are the bytes of the result with A being the most significant.  */
5195   emit_insn (gen_mulv8hi3 (gen_lowpart (V8HImode, t[4]), /* .A.B.C.D.E.F.G.H */
5196                            gen_lowpart (V8HImode, t[0]),
5197                            gen_lowpart (V8HImode, t[1])));
5198   emit_insn (gen_mulv8hi3 (gen_lowpart (V8HImode, t[5]), /* .I.J.K.L.M.N.O.P */
5199                            gen_lowpart (V8HImode, t[2]),
5200                            gen_lowpart (V8HImode, t[3])));
5202   /* Extract the even bytes and merge them back together.  */
5203   ix86_expand_vec_extract_even_odd (operands[0], t[5], t[4], 0);
5204   DONE;
5207 (define_expand "mulv8hi3"
5208   [(set (match_operand:V8HI 0 "register_operand" "")
5209         (mult:V8HI (match_operand:V8HI 1 "nonimmediate_operand" "")
5210                    (match_operand:V8HI 2 "nonimmediate_operand" "")))]
5211   "TARGET_SSE2"
5212   "ix86_fixup_binary_operands_no_copy (MULT, V8HImode, operands);")
5214 (define_insn "*avx_mulv8hi3"
5215   [(set (match_operand:V8HI 0 "register_operand" "=x")
5216         (mult:V8HI (match_operand:V8HI 1 "nonimmediate_operand" "%x")
5217                    (match_operand:V8HI 2 "nonimmediate_operand" "xm")))]
5218   "TARGET_AVX && ix86_binary_operator_ok (MULT, V8HImode, operands)"
5219   "vpmullw\t{%2, %1, %0|%0, %1, %2}"
5220   [(set_attr "type" "sseimul")
5221    (set_attr "prefix" "vex")
5222    (set_attr "mode" "TI")])
5224 (define_insn "*mulv8hi3"
5225   [(set (match_operand:V8HI 0 "register_operand" "=x")
5226         (mult:V8HI (match_operand:V8HI 1 "nonimmediate_operand" "%0")
5227                    (match_operand:V8HI 2 "nonimmediate_operand" "xm")))]
5228   "TARGET_SSE2 && ix86_binary_operator_ok (MULT, V8HImode, operands)"
5229   "pmullw\t{%2, %0|%0, %2}"
5230   [(set_attr "type" "sseimul")
5231    (set_attr "prefix_data16" "1")
5232    (set_attr "mode" "TI")])
5234 (define_expand "<s>mulv8hi3_highpart"
5235   [(set (match_operand:V8HI 0 "register_operand" "")
5236         (truncate:V8HI
5237           (lshiftrt:V8SI
5238             (mult:V8SI
5239               (any_extend:V8SI
5240                 (match_operand:V8HI 1 "nonimmediate_operand" ""))
5241               (any_extend:V8SI
5242                 (match_operand:V8HI 2 "nonimmediate_operand" "")))
5243             (const_int 16))))]
5244   "TARGET_SSE2"
5245   "ix86_fixup_binary_operands_no_copy (MULT, V8HImode, operands);")
5247 (define_insn "*avx_<s>mulv8hi3_highpart"
5248   [(set (match_operand:V8HI 0 "register_operand" "=x")
5249         (truncate:V8HI
5250           (lshiftrt:V8SI
5251             (mult:V8SI
5252               (any_extend:V8SI
5253                 (match_operand:V8HI 1 "nonimmediate_operand" "%x"))
5254               (any_extend:V8SI
5255                 (match_operand:V8HI 2 "nonimmediate_operand" "xm")))
5256             (const_int 16))))]
5257   "TARGET_AVX && ix86_binary_operator_ok (MULT, V8HImode, operands)"
5258   "vpmulh<u>w\t{%2, %1, %0|%0, %1, %2}"
5259   [(set_attr "type" "sseimul")
5260    (set_attr "prefix" "vex")
5261    (set_attr "mode" "TI")])
5263 (define_insn "*<s>mulv8hi3_highpart"
5264   [(set (match_operand:V8HI 0 "register_operand" "=x")
5265         (truncate:V8HI
5266           (lshiftrt:V8SI
5267             (mult:V8SI
5268               (any_extend:V8SI
5269                 (match_operand:V8HI 1 "nonimmediate_operand" "%0"))
5270               (any_extend:V8SI
5271                 (match_operand:V8HI 2 "nonimmediate_operand" "xm")))
5272             (const_int 16))))]
5273   "TARGET_SSE2 && ix86_binary_operator_ok (MULT, V8HImode, operands)"
5274   "pmulh<u>w\t{%2, %0|%0, %2}"
5275   [(set_attr "type" "sseimul")
5276    (set_attr "prefix_data16" "1")
5277    (set_attr "mode" "TI")])
5279 (define_expand "sse2_umulv2siv2di3"
5280   [(set (match_operand:V2DI 0 "register_operand" "")
5281         (mult:V2DI
5282           (zero_extend:V2DI
5283             (vec_select:V2SI
5284               (match_operand:V4SI 1 "nonimmediate_operand" "")
5285               (parallel [(const_int 0) (const_int 2)])))
5286           (zero_extend:V2DI
5287             (vec_select:V2SI
5288               (match_operand:V4SI 2 "nonimmediate_operand" "")
5289               (parallel [(const_int 0) (const_int 2)])))))]
5290   "TARGET_SSE2"
5291   "ix86_fixup_binary_operands_no_copy (MULT, V4SImode, operands);")
5293 (define_insn "*avx_umulv2siv2di3"
5294   [(set (match_operand:V2DI 0 "register_operand" "=x")
5295         (mult:V2DI
5296           (zero_extend:V2DI
5297             (vec_select:V2SI
5298               (match_operand:V4SI 1 "nonimmediate_operand" "%x")
5299               (parallel [(const_int 0) (const_int 2)])))
5300           (zero_extend:V2DI
5301             (vec_select:V2SI
5302               (match_operand:V4SI 2 "nonimmediate_operand" "xm")
5303               (parallel [(const_int 0) (const_int 2)])))))]
5304   "TARGET_AVX && ix86_binary_operator_ok (MULT, V4SImode, operands)"
5305   "vpmuludq\t{%2, %1, %0|%0, %1, %2}"
5306   [(set_attr "type" "sseimul")
5307    (set_attr "prefix" "vex")
5308    (set_attr "mode" "TI")])
5310 (define_insn "*sse2_umulv2siv2di3"
5311   [(set (match_operand:V2DI 0 "register_operand" "=x")
5312         (mult:V2DI
5313           (zero_extend:V2DI
5314             (vec_select:V2SI
5315               (match_operand:V4SI 1 "nonimmediate_operand" "%0")
5316               (parallel [(const_int 0) (const_int 2)])))
5317           (zero_extend:V2DI
5318             (vec_select:V2SI
5319               (match_operand:V4SI 2 "nonimmediate_operand" "xm")
5320               (parallel [(const_int 0) (const_int 2)])))))]
5321   "TARGET_SSE2 && ix86_binary_operator_ok (MULT, V4SImode, operands)"
5322   "pmuludq\t{%2, %0|%0, %2}"
5323   [(set_attr "type" "sseimul")
5324    (set_attr "prefix_data16" "1")
5325    (set_attr "mode" "TI")])
5327 (define_expand "sse4_1_mulv2siv2di3"
5328   [(set (match_operand:V2DI 0 "register_operand" "")
5329         (mult:V2DI
5330           (sign_extend:V2DI
5331             (vec_select:V2SI
5332               (match_operand:V4SI 1 "nonimmediate_operand" "")
5333               (parallel [(const_int 0) (const_int 2)])))
5334           (sign_extend:V2DI
5335             (vec_select:V2SI
5336               (match_operand:V4SI 2 "nonimmediate_operand" "")
5337               (parallel [(const_int 0) (const_int 2)])))))]
5338   "TARGET_SSE4_1"
5339   "ix86_fixup_binary_operands_no_copy (MULT, V4SImode, operands);")
5341 (define_insn "*avx_mulv2siv2di3"
5342   [(set (match_operand:V2DI 0 "register_operand" "=x")
5343         (mult:V2DI
5344           (sign_extend:V2DI
5345             (vec_select:V2SI
5346               (match_operand:V4SI 1 "nonimmediate_operand" "%x")
5347               (parallel [(const_int 0) (const_int 2)])))
5348           (sign_extend:V2DI
5349             (vec_select:V2SI
5350               (match_operand:V4SI 2 "nonimmediate_operand" "xm")
5351               (parallel [(const_int 0) (const_int 2)])))))]
5352   "TARGET_AVX && ix86_binary_operator_ok (MULT, V4SImode, operands)"
5353   "vpmuldq\t{%2, %1, %0|%0, %1, %2}"
5354   [(set_attr "type" "sseimul")
5355    (set_attr "prefix_extra" "1")
5356    (set_attr "prefix" "vex")
5357    (set_attr "mode" "TI")])
5359 (define_insn "*sse4_1_mulv2siv2di3"
5360   [(set (match_operand:V2DI 0 "register_operand" "=x")
5361         (mult:V2DI
5362           (sign_extend:V2DI
5363             (vec_select:V2SI
5364               (match_operand:V4SI 1 "nonimmediate_operand" "%0")
5365               (parallel [(const_int 0) (const_int 2)])))
5366           (sign_extend:V2DI
5367             (vec_select:V2SI
5368               (match_operand:V4SI 2 "nonimmediate_operand" "xm")
5369               (parallel [(const_int 0) (const_int 2)])))))]
5370   "TARGET_SSE4_1 && ix86_binary_operator_ok (MULT, V4SImode, operands)"
5371   "pmuldq\t{%2, %0|%0, %2}"
5372   [(set_attr "type" "sseimul")
5373    (set_attr "prefix_extra" "1")
5374    (set_attr "mode" "TI")])
5376 (define_expand "sse2_pmaddwd"
5377   [(set (match_operand:V4SI 0 "register_operand" "")
5378         (plus:V4SI
5379           (mult:V4SI
5380             (sign_extend:V4SI
5381               (vec_select:V4HI
5382                 (match_operand:V8HI 1 "nonimmediate_operand" "")
5383                 (parallel [(const_int 0)
5384                            (const_int 2)
5385                            (const_int 4)
5386                            (const_int 6)])))
5387             (sign_extend:V4SI
5388               (vec_select:V4HI
5389                 (match_operand:V8HI 2 "nonimmediate_operand" "")
5390                 (parallel [(const_int 0)
5391                            (const_int 2)
5392                            (const_int 4)
5393                            (const_int 6)]))))
5394           (mult:V4SI
5395             (sign_extend:V4SI
5396               (vec_select:V4HI (match_dup 1)
5397                 (parallel [(const_int 1)
5398                            (const_int 3)
5399                            (const_int 5)
5400                            (const_int 7)])))
5401             (sign_extend:V4SI
5402               (vec_select:V4HI (match_dup 2)
5403                 (parallel [(const_int 1)
5404                            (const_int 3)
5405                            (const_int 5)
5406                            (const_int 7)]))))))]
5407   "TARGET_SSE2"
5408   "ix86_fixup_binary_operands_no_copy (MULT, V8HImode, operands);")
5410 (define_insn "*avx_pmaddwd"
5411   [(set (match_operand:V4SI 0 "register_operand" "=x")
5412         (plus:V4SI
5413           (mult:V4SI
5414             (sign_extend:V4SI
5415               (vec_select:V4HI
5416                 (match_operand:V8HI 1 "nonimmediate_operand" "%x")
5417                 (parallel [(const_int 0)
5418                            (const_int 2)
5419                            (const_int 4)
5420                            (const_int 6)])))
5421             (sign_extend:V4SI
5422               (vec_select:V4HI
5423                 (match_operand:V8HI 2 "nonimmediate_operand" "xm")
5424                 (parallel [(const_int 0)
5425                            (const_int 2)
5426                            (const_int 4)
5427                            (const_int 6)]))))
5428           (mult:V4SI
5429             (sign_extend:V4SI
5430               (vec_select:V4HI (match_dup 1)
5431                 (parallel [(const_int 1)
5432                            (const_int 3)
5433                            (const_int 5)
5434                            (const_int 7)])))
5435             (sign_extend:V4SI
5436               (vec_select:V4HI (match_dup 2)
5437                 (parallel [(const_int 1)
5438                            (const_int 3)
5439                            (const_int 5)
5440                            (const_int 7)]))))))]
5441   "TARGET_AVX && ix86_binary_operator_ok (MULT, V8HImode, operands)"
5442   "vpmaddwd\t{%2, %1, %0|%0, %1, %2}"
5443   [(set_attr "type" "sseiadd")
5444    (set_attr "prefix" "vex")
5445    (set_attr "mode" "TI")])
5447 (define_insn "*sse2_pmaddwd"
5448   [(set (match_operand:V4SI 0 "register_operand" "=x")
5449         (plus:V4SI
5450           (mult:V4SI
5451             (sign_extend:V4SI
5452               (vec_select:V4HI
5453                 (match_operand:V8HI 1 "nonimmediate_operand" "%0")
5454                 (parallel [(const_int 0)
5455                            (const_int 2)
5456                            (const_int 4)
5457                            (const_int 6)])))
5458             (sign_extend:V4SI
5459               (vec_select:V4HI
5460                 (match_operand:V8HI 2 "nonimmediate_operand" "xm")
5461                 (parallel [(const_int 0)
5462                            (const_int 2)
5463                            (const_int 4)
5464                            (const_int 6)]))))
5465           (mult:V4SI
5466             (sign_extend:V4SI
5467               (vec_select:V4HI (match_dup 1)
5468                 (parallel [(const_int 1)
5469                            (const_int 3)
5470                            (const_int 5)
5471                            (const_int 7)])))
5472             (sign_extend:V4SI
5473               (vec_select:V4HI (match_dup 2)
5474                 (parallel [(const_int 1)
5475                            (const_int 3)
5476                            (const_int 5)
5477                            (const_int 7)]))))))]
5478   "TARGET_SSE2 && ix86_binary_operator_ok (MULT, V8HImode, operands)"
5479   "pmaddwd\t{%2, %0|%0, %2}"
5480   [(set_attr "type" "sseiadd")
5481    (set_attr "atom_unit" "simul")
5482    (set_attr "prefix_data16" "1")
5483    (set_attr "mode" "TI")])
5485 (define_expand "mulv4si3"
5486   [(set (match_operand:V4SI 0 "register_operand" "")
5487         (mult:V4SI (match_operand:V4SI 1 "register_operand" "")
5488                    (match_operand:V4SI 2 "register_operand" "")))]
5489   "TARGET_SSE2"
5491   if (TARGET_SSE4_1 || TARGET_AVX)
5492     ix86_fixup_binary_operands_no_copy (MULT, V4SImode, operands);
5495 (define_insn "*avx_mulv4si3"
5496   [(set (match_operand:V4SI 0 "register_operand" "=x")
5497         (mult:V4SI (match_operand:V4SI 1 "nonimmediate_operand" "%x")
5498                    (match_operand:V4SI 2 "nonimmediate_operand" "xm")))]
5499   "TARGET_AVX && ix86_binary_operator_ok (MULT, V4SImode, operands)"
5500   "vpmulld\t{%2, %1, %0|%0, %1, %2}"
5501   [(set_attr "type" "sseimul")
5502    (set_attr "prefix_extra" "1")
5503    (set_attr "prefix" "vex")
5504    (set_attr "mode" "TI")])
5506 (define_insn "*sse4_1_mulv4si3"
5507   [(set (match_operand:V4SI 0 "register_operand" "=x")
5508         (mult:V4SI (match_operand:V4SI 1 "nonimmediate_operand" "%0")
5509                    (match_operand:V4SI 2 "nonimmediate_operand" "xm")))]
5510   "TARGET_SSE4_1 && ix86_binary_operator_ok (MULT, V4SImode, operands)"
5511   "pmulld\t{%2, %0|%0, %2}"
5512   [(set_attr "type" "sseimul")
5513    (set_attr "prefix_extra" "1")
5514    (set_attr "mode" "TI")])
5516 (define_insn_and_split "*sse2_mulv4si3"
5517   [(set (match_operand:V4SI 0 "register_operand" "")
5518         (mult:V4SI (match_operand:V4SI 1 "register_operand" "")
5519                    (match_operand:V4SI 2 "register_operand" "")))]
5520   "TARGET_SSE2 && !TARGET_SSE4_1 && !TARGET_AVX
5521    && can_create_pseudo_p ()"
5522   "#"
5523   "&& 1"
5524   [(const_int 0)]
5526   rtx t1, t2, t3, t4, t5, t6, thirtytwo;
5527   rtx op0, op1, op2;
5529   op0 = operands[0];
5530   op1 = operands[1];
5531   op2 = operands[2];
5532   t1 = gen_reg_rtx (V4SImode);
5533   t2 = gen_reg_rtx (V4SImode);
5534   t3 = gen_reg_rtx (V4SImode);
5535   t4 = gen_reg_rtx (V4SImode);
5536   t5 = gen_reg_rtx (V4SImode);
5537   t6 = gen_reg_rtx (V4SImode);
5538   thirtytwo = GEN_INT (32);
5540   /* Multiply elements 2 and 0.  */
5541   emit_insn (gen_sse2_umulv2siv2di3 (gen_lowpart (V2DImode, t1),
5542                                      op1, op2));
5544   /* Shift both input vectors down one element, so that elements 3
5545      and 1 are now in the slots for elements 2 and 0.  For K8, at
5546      least, this is faster than using a shuffle.  */
5547   emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, t2),
5548                                  gen_lowpart (V1TImode, op1),
5549                                  thirtytwo));
5550   emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, t3),
5551                                  gen_lowpart (V1TImode, op2),
5552                                  thirtytwo));
5553   /* Multiply elements 3 and 1.  */
5554   emit_insn (gen_sse2_umulv2siv2di3 (gen_lowpart (V2DImode, t4),
5555                                      t2, t3));
5557   /* Move the results in element 2 down to element 1; we don't care
5558      what goes in elements 2 and 3.  */
5559   emit_insn (gen_sse2_pshufd_1 (t5, t1, const0_rtx, const2_rtx,
5560                                 const0_rtx, const0_rtx));
5561   emit_insn (gen_sse2_pshufd_1 (t6, t4, const0_rtx, const2_rtx,
5562                                 const0_rtx, const0_rtx));
5564   /* Merge the parts back together.  */
5565   emit_insn (gen_vec_interleave_lowv4si (op0, t5, t6));
5566   DONE;
5569 (define_insn_and_split "mulv2di3"
5570   [(set (match_operand:V2DI 0 "register_operand" "")
5571         (mult:V2DI (match_operand:V2DI 1 "register_operand" "")
5572                    (match_operand:V2DI 2 "register_operand" "")))]
5573   "TARGET_SSE2
5574    && can_create_pseudo_p ()"
5575   "#"
5576   "&& 1"
5577   [(const_int 0)]
5579   rtx t1, t2, t3, t4, t5, t6, thirtytwo;
5580   rtx op0, op1, op2;
5582   op0 = operands[0];
5583   op1 = operands[1];
5584   op2 = operands[2];
5586   if (TARGET_XOP)
5587     {
5588       /* op1: A,B,C,D, op2: E,F,G,H */
5589       op1 = gen_lowpart (V4SImode, op1);
5590       op2 = gen_lowpart (V4SImode, op2);
5592       t1 = gen_reg_rtx (V4SImode);
5593       t2 = gen_reg_rtx (V4SImode);
5594       t3 = gen_reg_rtx (V2DImode);
5595       t4 = gen_reg_rtx (V2DImode);
5597       /* t1: B,A,D,C */
5598       emit_insn (gen_sse2_pshufd_1 (t1, op1,
5599                                     GEN_INT (1),
5600                                     GEN_INT (0),
5601                                     GEN_INT (3),
5602                                     GEN_INT (2)));
5604       /* t2: (B*E),(A*F),(D*G),(C*H) */
5605       emit_insn (gen_mulv4si3 (t2, t1, op2));
5607       /* t4: (B*E)+(A*F), (D*G)+(C*H) */
5608       emit_insn (gen_xop_phadddq (t3, t2));
5610       /* t5: ((B*E)+(A*F))<<32, ((D*G)+(C*H))<<32 */
5611       emit_insn (gen_ashlv2di3 (t4, t3, GEN_INT (32)));
5613       /* op0: (((B*E)+(A*F))<<32)+(B*F), (((D*G)+(C*H))<<32)+(D*H) */
5614       emit_insn (gen_xop_pmacsdql (op0, op1, op2, t4));
5615     }
5616   else
5617     {
5618       t1 = gen_reg_rtx (V2DImode);
5619       t2 = gen_reg_rtx (V2DImode);
5620       t3 = gen_reg_rtx (V2DImode);
5621       t4 = gen_reg_rtx (V2DImode);
5622       t5 = gen_reg_rtx (V2DImode);
5623       t6 = gen_reg_rtx (V2DImode);
5624       thirtytwo = GEN_INT (32);
5626       /* Multiply low parts.  */
5627       emit_insn (gen_sse2_umulv2siv2di3 (t1, gen_lowpart (V4SImode, op1),
5628                                          gen_lowpart (V4SImode, op2)));
5630       /* Shift input vectors left 32 bits so we can multiply high parts.  */
5631       emit_insn (gen_lshrv2di3 (t2, op1, thirtytwo));
5632       emit_insn (gen_lshrv2di3 (t3, op2, thirtytwo));
5634       /* Multiply high parts by low parts.  */
5635       emit_insn (gen_sse2_umulv2siv2di3 (t4, gen_lowpart (V4SImode, op1),
5636                                          gen_lowpart (V4SImode, t3)));
5637       emit_insn (gen_sse2_umulv2siv2di3 (t5, gen_lowpart (V4SImode, op2),
5638                                          gen_lowpart (V4SImode, t2)));
5640       /* Shift them back.  */
5641       emit_insn (gen_ashlv2di3 (t4, t4, thirtytwo));
5642       emit_insn (gen_ashlv2di3 (t5, t5, thirtytwo));
5644       /* Add the three parts together.  */
5645       emit_insn (gen_addv2di3 (t6, t1, t4));
5646       emit_insn (gen_addv2di3 (op0, t6, t5));
5647     }
5648   DONE;
5651 (define_expand "vec_widen_smult_hi_v8hi"
5652   [(match_operand:V4SI 0 "register_operand" "")
5653    (match_operand:V8HI 1 "register_operand" "")
5654    (match_operand:V8HI 2 "register_operand" "")]
5655   "TARGET_SSE2"
5657   rtx op1, op2, t1, t2, dest;
5659   op1 = operands[1];
5660   op2 = operands[2];
5661   t1 = gen_reg_rtx (V8HImode);
5662   t2 = gen_reg_rtx (V8HImode);
5663   dest = gen_lowpart (V8HImode, operands[0]);
5665   emit_insn (gen_mulv8hi3 (t1, op1, op2));
5666   emit_insn (gen_smulv8hi3_highpart (t2, op1, op2));
5667   emit_insn (gen_vec_interleave_highv8hi (dest, t1, t2));
5668   DONE;
5671 (define_expand "vec_widen_smult_lo_v8hi"
5672   [(match_operand:V4SI 0 "register_operand" "")
5673    (match_operand:V8HI 1 "register_operand" "")
5674    (match_operand:V8HI 2 "register_operand" "")]
5675   "TARGET_SSE2"
5677   rtx op1, op2, t1, t2, dest;
5679   op1 = operands[1];
5680   op2 = operands[2];
5681   t1 = gen_reg_rtx (V8HImode);
5682   t2 = gen_reg_rtx (V8HImode);
5683   dest = gen_lowpart (V8HImode, operands[0]);
5685   emit_insn (gen_mulv8hi3 (t1, op1, op2));
5686   emit_insn (gen_smulv8hi3_highpart (t2, op1, op2));
5687   emit_insn (gen_vec_interleave_lowv8hi (dest, t1, t2));
5688   DONE;
5691 (define_expand "vec_widen_umult_hi_v8hi"
5692   [(match_operand:V4SI 0 "register_operand" "")
5693    (match_operand:V8HI 1 "register_operand" "")
5694    (match_operand:V8HI 2 "register_operand" "")]
5695   "TARGET_SSE2"
5697   rtx op1, op2, t1, t2, dest;
5699   op1 = operands[1];
5700   op2 = operands[2];
5701   t1 = gen_reg_rtx (V8HImode);
5702   t2 = gen_reg_rtx (V8HImode);
5703   dest = gen_lowpart (V8HImode, operands[0]);
5705   emit_insn (gen_mulv8hi3 (t1, op1, op2));
5706   emit_insn (gen_umulv8hi3_highpart (t2, op1, op2));
5707   emit_insn (gen_vec_interleave_highv8hi (dest, t1, t2));
5708   DONE;
5711 (define_expand "vec_widen_umult_lo_v8hi"
5712   [(match_operand:V4SI 0 "register_operand" "")
5713    (match_operand:V8HI 1 "register_operand" "")
5714    (match_operand:V8HI 2 "register_operand" "")]
5715   "TARGET_SSE2"
5717   rtx op1, op2, t1, t2, dest;
5719   op1 = operands[1];
5720   op2 = operands[2];
5721   t1 = gen_reg_rtx (V8HImode);
5722   t2 = gen_reg_rtx (V8HImode);
5723   dest = gen_lowpart (V8HImode, operands[0]);
5725   emit_insn (gen_mulv8hi3 (t1, op1, op2));
5726   emit_insn (gen_umulv8hi3_highpart (t2, op1, op2));
5727   emit_insn (gen_vec_interleave_lowv8hi (dest, t1, t2));
5728   DONE;
5731 (define_expand "vec_widen_smult_hi_v4si"
5732   [(match_operand:V2DI 0 "register_operand" "")
5733    (match_operand:V4SI 1 "register_operand" "")
5734    (match_operand:V4SI 2 "register_operand" "")]
5735   "TARGET_XOP"
5737   rtx t1, t2;
5739   t1 = gen_reg_rtx (V4SImode);
5740   t2 = gen_reg_rtx (V4SImode);
5742   emit_insn (gen_sse2_pshufd_1 (t1, operands[1],
5743                                 GEN_INT (0),
5744                                 GEN_INT (2),
5745                                 GEN_INT (1),
5746                                 GEN_INT (3)));
5747   emit_insn (gen_sse2_pshufd_1 (t2, operands[2],
5748                                 GEN_INT (0),
5749                                 GEN_INT (2),
5750                                 GEN_INT (1),
5751                                 GEN_INT (3)));
5752   emit_insn (gen_xop_mulv2div2di3_high (operands[0], t1, t2));
5753   DONE;
5756 (define_expand "vec_widen_smult_lo_v4si"
5757   [(match_operand:V2DI 0 "register_operand" "")
5758    (match_operand:V4SI 1 "register_operand" "")
5759    (match_operand:V4SI 2 "register_operand" "")]
5760   "TARGET_XOP"
5762   rtx t1, t2;
5764   t1 = gen_reg_rtx (V4SImode);
5765   t2 = gen_reg_rtx (V4SImode);
5767   emit_insn (gen_sse2_pshufd_1 (t1, operands[1],
5768                                 GEN_INT (0),
5769                                 GEN_INT (2),
5770                                 GEN_INT (1),
5771                                 GEN_INT (3)));
5772   emit_insn (gen_sse2_pshufd_1 (t2, operands[2],
5773                                 GEN_INT (0),
5774                                 GEN_INT (2),
5775                                 GEN_INT (1),
5776                                 GEN_INT (3)));
5777   emit_insn (gen_xop_mulv2div2di3_low (operands[0], t1, t2));
5778   DONE;
5781 (define_expand "vec_widen_umult_hi_v4si"
5782   [(match_operand:V2DI 0 "register_operand" "")
5783    (match_operand:V4SI 1 "register_operand" "")
5784    (match_operand:V4SI 2 "register_operand" "")]
5785   "TARGET_SSE2"
5787   rtx op1, op2, t1, t2;
5789   op1 = operands[1];
5790   op2 = operands[2];
5791   t1 = gen_reg_rtx (V4SImode);
5792   t2 = gen_reg_rtx (V4SImode);
5794   emit_insn (gen_vec_interleave_highv4si (t1, op1, op1));
5795   emit_insn (gen_vec_interleave_highv4si (t2, op2, op2));
5796   emit_insn (gen_sse2_umulv2siv2di3 (operands[0], t1, t2));
5797   DONE;
5800 (define_expand "vec_widen_umult_lo_v4si"
5801   [(match_operand:V2DI 0 "register_operand" "")
5802    (match_operand:V4SI 1 "register_operand" "")
5803    (match_operand:V4SI 2 "register_operand" "")]
5804   "TARGET_SSE2"
5806   rtx op1, op2, t1, t2;
5808   op1 = operands[1];
5809   op2 = operands[2];
5810   t1 = gen_reg_rtx (V4SImode);
5811   t2 = gen_reg_rtx (V4SImode);
5813   emit_insn (gen_vec_interleave_lowv4si (t1, op1, op1));
5814   emit_insn (gen_vec_interleave_lowv4si (t2, op2, op2));
5815   emit_insn (gen_sse2_umulv2siv2di3 (operands[0], t1, t2));
5816   DONE;
5819 (define_expand "sdot_prodv8hi"
5820   [(match_operand:V4SI 0 "register_operand" "")
5821    (match_operand:V8HI 1 "register_operand" "")
5822    (match_operand:V8HI 2 "register_operand" "")
5823    (match_operand:V4SI 3 "register_operand" "")]
5824   "TARGET_SSE2"
5826   rtx t = gen_reg_rtx (V4SImode);
5827   emit_insn (gen_sse2_pmaddwd (t, operands[1], operands[2]));
5828   emit_insn (gen_addv4si3 (operands[0], operands[3], t));
5829   DONE;
5832 (define_expand "udot_prodv4si"
5833   [(match_operand:V2DI 0 "register_operand" "")
5834    (match_operand:V4SI 1 "register_operand" "")
5835    (match_operand:V4SI 2 "register_operand" "")
5836    (match_operand:V2DI 3 "register_operand" "")]
5837   "TARGET_SSE2"
5839   rtx t1, t2, t3, t4;
5841   t1 = gen_reg_rtx (V2DImode);
5842   emit_insn (gen_sse2_umulv2siv2di3 (t1, operands[1], operands[2]));
5843   emit_insn (gen_addv2di3 (t1, t1, operands[3]));
5845   t2 = gen_reg_rtx (V4SImode);
5846   t3 = gen_reg_rtx (V4SImode);
5847   emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, t2),
5848                                  gen_lowpart (V1TImode, operands[1]),
5849                                  GEN_INT (32)));
5850   emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, t3),
5851                                  gen_lowpart (V1TImode, operands[2]),
5852                                  GEN_INT (32)));
5854   t4 = gen_reg_rtx (V2DImode);
5855   emit_insn (gen_sse2_umulv2siv2di3 (t4, t2, t3));
5857   emit_insn (gen_addv2di3 (operands[0], t1, t4));
5858   DONE;
5861 (define_insn "*avx_ashr<mode>3"
5862   [(set (match_operand:SSEMODE24 0 "register_operand" "=x")
5863         (ashiftrt:SSEMODE24
5864           (match_operand:SSEMODE24 1 "register_operand" "x")
5865           (match_operand:SI 2 "nonmemory_operand" "xN")))]
5866   "TARGET_AVX"
5867   "vpsra<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
5868   [(set_attr "type" "sseishft")
5869    (set_attr "prefix" "vex")
5870    (set (attr "length_immediate")
5871      (if_then_else (match_operand 2 "const_int_operand" "")
5872        (const_string "1")
5873        (const_string "0")))
5874    (set_attr "mode" "TI")])
5876 (define_insn "ashr<mode>3"
5877   [(set (match_operand:SSEMODE24 0 "register_operand" "=x")
5878         (ashiftrt:SSEMODE24
5879           (match_operand:SSEMODE24 1 "register_operand" "0")
5880           (match_operand:SI 2 "nonmemory_operand" "xN")))]
5881   "TARGET_SSE2"
5882   "psra<ssevecsize>\t{%2, %0|%0, %2}"
5883   [(set_attr "type" "sseishft")
5884    (set_attr "prefix_data16" "1")
5885    (set (attr "length_immediate")
5886      (if_then_else (match_operand 2 "const_int_operand" "")
5887        (const_string "1")
5888        (const_string "0")))
5889    (set_attr "mode" "TI")])
5891 (define_insn "*avx_lshrv1ti3"
5892   [(set (match_operand:V1TI 0 "register_operand" "=x")
5893         (lshiftrt:V1TI
5894          (match_operand:V1TI 1 "register_operand" "x")
5895          (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))]
5896   "TARGET_AVX"
5898   operands[2] = GEN_INT (INTVAL (operands[2]) / 8);
5899   return "vpsrldq\t{%2, %1, %0|%0, %1, %2}";
5901   [(set_attr "type" "sseishft")
5902    (set_attr "prefix" "vex")
5903    (set_attr "length_immediate" "1")
5904    (set_attr "mode" "TI")])
5906 (define_insn "*avx_lshr<mode>3"
5907   [(set (match_operand:SSEMODE248 0 "register_operand" "=x")
5908         (lshiftrt:SSEMODE248
5909           (match_operand:SSEMODE248 1 "register_operand" "x")
5910           (match_operand:SI 2 "nonmemory_operand" "xN")))]
5911   "TARGET_AVX"
5912   "vpsrl<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
5913   [(set_attr "type" "sseishft")
5914    (set_attr "prefix" "vex")
5915    (set (attr "length_immediate")
5916      (if_then_else (match_operand 2 "const_int_operand" "")
5917        (const_string "1")
5918        (const_string "0")))
5919    (set_attr "mode" "TI")])
5921 (define_insn "sse2_lshrv1ti3"
5922   [(set (match_operand:V1TI 0 "register_operand" "=x")
5923         (lshiftrt:V1TI
5924          (match_operand:V1TI 1 "register_operand" "0")
5925          (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))]
5926   "TARGET_SSE2"
5928   operands[2] = GEN_INT (INTVAL (operands[2]) / 8);
5929   return "psrldq\t{%2, %0|%0, %2}";
5931   [(set_attr "type" "sseishft")
5932    (set_attr "prefix_data16" "1")
5933    (set_attr "length_immediate" "1")
5934    (set_attr "atom_unit" "sishuf")
5935    (set_attr "mode" "TI")])
5937 (define_insn "lshr<mode>3"
5938   [(set (match_operand:SSEMODE248 0 "register_operand" "=x")
5939         (lshiftrt:SSEMODE248
5940           (match_operand:SSEMODE248 1 "register_operand" "0")
5941           (match_operand:SI 2 "nonmemory_operand" "xN")))]
5942   "TARGET_SSE2"
5943   "psrl<ssevecsize>\t{%2, %0|%0, %2}"
5944   [(set_attr "type" "sseishft")
5945    (set_attr "prefix_data16" "1")
5946    (set (attr "length_immediate")
5947      (if_then_else (match_operand 2 "const_int_operand" "")
5948        (const_string "1")
5949        (const_string "0")))
5950    (set_attr "mode" "TI")])
5952 (define_insn "*avx_ashlv1ti3"
5953   [(set (match_operand:V1TI 0 "register_operand" "=x")
5954         (ashift:V1TI (match_operand:V1TI 1 "register_operand" "x")
5955                      (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))]
5956   "TARGET_AVX"
5958   operands[2] = GEN_INT (INTVAL (operands[2]) / 8);
5959   return "vpslldq\t{%2, %1, %0|%0, %1, %2}";
5961   [(set_attr "type" "sseishft")
5962    (set_attr "prefix" "vex")
5963    (set_attr "length_immediate" "1")
5964    (set_attr "mode" "TI")])
5966 (define_insn "*avx_ashl<mode>3"
5967   [(set (match_operand:SSEMODE248 0 "register_operand" "=x")
5968         (ashift:SSEMODE248
5969           (match_operand:SSEMODE248 1 "register_operand" "x")
5970           (match_operand:SI 2 "nonmemory_operand" "xN")))]
5971   "TARGET_AVX"
5972   "vpsll<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
5973   [(set_attr "type" "sseishft")
5974    (set_attr "prefix" "vex")
5975    (set (attr "length_immediate")
5976      (if_then_else (match_operand 2 "const_int_operand" "")
5977        (const_string "1")
5978        (const_string "0")))
5979    (set_attr "mode" "TI")])
5981 (define_insn "sse2_ashlv1ti3"
5982   [(set (match_operand:V1TI 0 "register_operand" "=x")
5983         (ashift:V1TI (match_operand:V1TI 1 "register_operand" "0")
5984                      (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))]
5985   "TARGET_SSE2"
5987   operands[2] = GEN_INT (INTVAL (operands[2]) / 8);
5988   return "pslldq\t{%2, %0|%0, %2}";
5990   [(set_attr "type" "sseishft")
5991    (set_attr "prefix_data16" "1")
5992    (set_attr "length_immediate" "1")
5993    (set_attr "mode" "TI")])
5995 (define_insn "ashl<mode>3"
5996   [(set (match_operand:SSEMODE248 0 "register_operand" "=x")
5997         (ashift:SSEMODE248
5998           (match_operand:SSEMODE248 1 "register_operand" "0")
5999           (match_operand:SI 2 "nonmemory_operand" "xN")))]
6000   "TARGET_SSE2"
6001   "psll<ssevecsize>\t{%2, %0|%0, %2}"
6002   [(set_attr "type" "sseishft")
6003    (set_attr "prefix_data16" "1")
6004    (set (attr "length_immediate")
6005      (if_then_else (match_operand 2 "const_int_operand" "")
6006        (const_string "1")
6007        (const_string "0")))
6008    (set_attr "mode" "TI")])
6010 (define_expand "vec_shl_<mode>"
6011   [(set (match_operand:SSEMODEI 0 "register_operand" "")
6012         (ashift:V1TI
6013          (match_operand:SSEMODEI 1 "register_operand" "")
6014          (match_operand:SI 2 "const_0_to_255_mul_8_operand" "")))]
6015   "TARGET_SSE2"
6017   operands[0] = gen_lowpart (V1TImode, operands[0]);
6018   operands[1] = gen_lowpart (V1TImode, operands[1]);
6021 (define_expand "vec_shr_<mode>"
6022   [(set (match_operand:SSEMODEI 0 "register_operand" "")
6023         (lshiftrt:V1TI
6024          (match_operand:SSEMODEI 1 "register_operand" "")
6025          (match_operand:SI 2 "const_0_to_255_mul_8_operand" "")))]
6026   "TARGET_SSE2"
6028   operands[0] = gen_lowpart (V1TImode, operands[0]);
6029   operands[1] = gen_lowpart (V1TImode, operands[1]);
6032 (define_insn "*avx_<code><mode>3"
6033   [(set (match_operand:SSEMODE124 0 "register_operand" "=x")
6034         (maxmin:SSEMODE124
6035           (match_operand:SSEMODE124 1 "nonimmediate_operand" "%x")
6036           (match_operand:SSEMODE124 2 "nonimmediate_operand" "xm")))]
6037   "TARGET_AVX && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
6038   "vp<maxmin_int><ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
6039   [(set_attr "type" "sseiadd")
6040    (set (attr "prefix_extra")
6041      (if_then_else
6042        (ne (symbol_ref "<MODE>mode != ((<CODE> == SMAX || <CODE> == SMIN) ? V8HImode : V16QImode)")
6043            (const_int 0))
6044        (const_string "1")
6045        (const_string "0")))
6046    (set_attr "prefix" "vex")
6047    (set_attr "mode" "TI")])
6049 (define_expand "<code>v16qi3"
6050   [(set (match_operand:V16QI 0 "register_operand" "")
6051         (umaxmin:V16QI
6052           (match_operand:V16QI 1 "nonimmediate_operand" "")
6053           (match_operand:V16QI 2 "nonimmediate_operand" "")))]
6054   "TARGET_SSE2"
6055   "ix86_fixup_binary_operands_no_copy (<CODE>, V16QImode, operands);")
6057 (define_insn "*<code>v16qi3"
6058   [(set (match_operand:V16QI 0 "register_operand" "=x")
6059         (umaxmin:V16QI
6060           (match_operand:V16QI 1 "nonimmediate_operand" "%0")
6061           (match_operand:V16QI 2 "nonimmediate_operand" "xm")))]
6062   "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, V16QImode, operands)"
6063   "p<maxmin_int>b\t{%2, %0|%0, %2}"
6064   [(set_attr "type" "sseiadd")
6065    (set_attr "prefix_data16" "1")
6066    (set_attr "mode" "TI")])
6068 (define_expand "<code>v8hi3"
6069   [(set (match_operand:V8HI 0 "register_operand" "")
6070         (smaxmin:V8HI
6071           (match_operand:V8HI 1 "nonimmediate_operand" "")
6072           (match_operand:V8HI 2 "nonimmediate_operand" "")))]
6073   "TARGET_SSE2"
6074   "ix86_fixup_binary_operands_no_copy (<CODE>, V8HImode, operands);")
6076 (define_insn "*<code>v8hi3"
6077   [(set (match_operand:V8HI 0 "register_operand" "=x")
6078         (smaxmin:V8HI
6079           (match_operand:V8HI 1 "nonimmediate_operand" "%0")
6080           (match_operand:V8HI 2 "nonimmediate_operand" "xm")))]
6081   "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, V8HImode, operands)"
6082   "p<maxmin_int>w\t{%2, %0|%0, %2}"
6083   [(set_attr "type" "sseiadd")
6084    (set_attr "prefix_data16" "1")
6085    (set_attr "mode" "TI")])
6087 (define_expand "umaxv8hi3"
6088   [(set (match_operand:V8HI 0 "register_operand" "")
6089         (umax:V8HI (match_operand:V8HI 1 "register_operand" "")
6090                    (match_operand:V8HI 2 "nonimmediate_operand" "")))]
6091   "TARGET_SSE2"
6093   if (TARGET_SSE4_1)
6094     ix86_fixup_binary_operands_no_copy (UMAX, V8HImode, operands);
6095   else
6096     {
6097       rtx op0 = operands[0], op2 = operands[2], op3 = op0;
6098       if (rtx_equal_p (op3, op2))
6099         op3 = gen_reg_rtx (V8HImode);
6100       emit_insn (gen_sse2_ussubv8hi3 (op3, operands[1], op2));
6101       emit_insn (gen_addv8hi3 (op0, op3, op2));
6102       DONE;
6103     }
6106 (define_expand "smax<mode>3"
6107   [(set (match_operand:SSEMODE14 0 "register_operand" "")
6108         (smax:SSEMODE14 (match_operand:SSEMODE14 1 "register_operand" "")
6109                         (match_operand:SSEMODE14 2 "register_operand" "")))]
6110   "TARGET_SSE2"
6112   if (TARGET_SSE4_1)
6113     ix86_fixup_binary_operands_no_copy (SMAX, <MODE>mode, operands);
6114   else
6115     {
6116       rtx xops[6];
6117       bool ok;
6119       xops[0] = operands[0];
6120       xops[1] = operands[1];
6121       xops[2] = operands[2];
6122       xops[3] = gen_rtx_GT (VOIDmode, operands[1], operands[2]);
6123       xops[4] = operands[1];
6124       xops[5] = operands[2];
6125       ok = ix86_expand_int_vcond (xops);
6126       gcc_assert (ok);
6127       DONE;
6128     }
6131 (define_insn "*sse4_1_<code><mode>3"
6132   [(set (match_operand:SSEMODE14 0 "register_operand" "=x")
6133         (smaxmin:SSEMODE14
6134           (match_operand:SSEMODE14 1 "nonimmediate_operand" "%0")
6135           (match_operand:SSEMODE14 2 "nonimmediate_operand" "xm")))]
6136   "TARGET_SSE4_1 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
6137   "p<maxmin_int><ssevecsize>\t{%2, %0|%0, %2}"
6138   [(set_attr "type" "sseiadd")
6139    (set_attr "prefix_extra" "1")
6140    (set_attr "mode" "TI")])
6142 (define_expand "smaxv2di3"
6143   [(set (match_operand:V2DI 0 "register_operand" "")
6144         (smax:V2DI (match_operand:V2DI 1 "register_operand" "")
6145                    (match_operand:V2DI 2 "register_operand" "")))]
6146   "TARGET_SSE4_2"
6148   rtx xops[6];
6149   bool ok;
6151   xops[0] = operands[0];
6152   xops[1] = operands[1];
6153   xops[2] = operands[2];
6154   xops[3] = gen_rtx_GT (VOIDmode, operands[1], operands[2]);
6155   xops[4] = operands[1];
6156   xops[5] = operands[2];
6157   ok = ix86_expand_int_vcond (xops);
6158   gcc_assert (ok);
6159   DONE;
6162 (define_expand "umaxv4si3"
6163   [(set (match_operand:V4SI 0 "register_operand" "")
6164         (umax:V4SI (match_operand:V4SI 1 "register_operand" "")
6165                    (match_operand:V4SI 2 "register_operand" "")))]
6166   "TARGET_SSE2"
6168   if (TARGET_SSE4_1)
6169     ix86_fixup_binary_operands_no_copy (UMAX, V4SImode, operands);
6170   else
6171     {
6172       rtx xops[6];
6173       bool ok;
6175       xops[0] = operands[0];
6176       xops[1] = operands[1];
6177       xops[2] = operands[2];
6178       xops[3] = gen_rtx_GTU (VOIDmode, operands[1], operands[2]);
6179       xops[4] = operands[1];
6180       xops[5] = operands[2];
6181       ok = ix86_expand_int_vcond (xops);
6182       gcc_assert (ok);
6183       DONE;
6184     }
6187 (define_insn "*sse4_1_<code><mode>3"
6188   [(set (match_operand:SSEMODE24 0 "register_operand" "=x")
6189         (umaxmin:SSEMODE24
6190           (match_operand:SSEMODE24 1 "nonimmediate_operand" "%0")
6191           (match_operand:SSEMODE24 2 "nonimmediate_operand" "xm")))]
6192   "TARGET_SSE4_1 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
6193   "p<maxmin_int><ssevecsize>\t{%2, %0|%0, %2}"
6194   [(set_attr "type" "sseiadd")
6195    (set_attr "prefix_extra" "1")
6196    (set_attr "mode" "TI")])
6198 (define_expand "umaxv2di3"
6199   [(set (match_operand:V2DI 0 "register_operand" "")
6200         (umax:V2DI (match_operand:V2DI 1 "register_operand" "")
6201                    (match_operand:V2DI 2 "register_operand" "")))]
6202   "TARGET_SSE4_2"
6204   rtx xops[6];
6205   bool ok;
6207   xops[0] = operands[0];
6208   xops[1] = operands[1];
6209   xops[2] = operands[2];
6210   xops[3] = gen_rtx_GTU (VOIDmode, operands[1], operands[2]);
6211   xops[4] = operands[1];
6212   xops[5] = operands[2];
6213   ok = ix86_expand_int_vcond (xops);
6214   gcc_assert (ok);
6215   DONE;
6218 (define_expand "smin<mode>3"
6219   [(set (match_operand:SSEMODE14 0 "register_operand" "")
6220         (smin:SSEMODE14 (match_operand:SSEMODE14 1 "register_operand" "")
6221                         (match_operand:SSEMODE14 2 "register_operand" "")))]
6222   "TARGET_SSE2"
6224   if (TARGET_SSE4_1)
6225     ix86_fixup_binary_operands_no_copy (SMIN, <MODE>mode, operands);
6226   else
6227     {
6228       rtx xops[6];
6229       bool ok;
6231       xops[0] = operands[0];
6232       xops[1] = operands[2];
6233       xops[2] = operands[1];
6234       xops[3] = gen_rtx_GT (VOIDmode, operands[1], operands[2]);
6235       xops[4] = operands[1];
6236       xops[5] = operands[2];
6237       ok = ix86_expand_int_vcond (xops);
6238       gcc_assert (ok);
6239       DONE;
6240     }
6243 (define_expand "sminv2di3"
6244   [(set (match_operand:V2DI 0 "register_operand" "")
6245         (smin:V2DI (match_operand:V2DI 1 "register_operand" "")
6246                    (match_operand:V2DI 2 "register_operand" "")))]
6247   "TARGET_SSE4_2"
6249   rtx xops[6];
6250   bool ok;
6252   xops[0] = operands[0];
6253   xops[1] = operands[2];
6254   xops[2] = operands[1];
6255   xops[3] = gen_rtx_GT (VOIDmode, operands[1], operands[2]);
6256   xops[4] = operands[1];
6257   xops[5] = operands[2];
6258   ok = ix86_expand_int_vcond (xops);
6259   gcc_assert (ok);
6260   DONE;
6263 (define_expand "umin<mode>3"
6264   [(set (match_operand:SSEMODE24 0 "register_operand" "")
6265         (umin:SSEMODE24 (match_operand:SSEMODE24 1 "register_operand" "")
6266                         (match_operand:SSEMODE24 2 "register_operand" "")))]
6267   "TARGET_SSE2"
6269   if (TARGET_SSE4_1)
6270     ix86_fixup_binary_operands_no_copy (UMIN, <MODE>mode, operands);
6271   else
6272     {
6273       rtx xops[6];
6274       bool ok;
6276       xops[0] = operands[0];
6277       xops[1] = operands[2];
6278       xops[2] = operands[1];
6279       xops[3] = gen_rtx_GTU (VOIDmode, operands[1], operands[2]);
6280       xops[4] = operands[1];
6281       xops[5] = operands[2];
6282       ok = ix86_expand_int_vcond (xops);
6283       gcc_assert (ok);
6284       DONE;
6285     }
6288 (define_expand "uminv2di3"
6289   [(set (match_operand:V2DI 0 "register_operand" "")
6290         (umin:V2DI (match_operand:V2DI 1 "register_operand" "")
6291                    (match_operand:V2DI 2 "register_operand" "")))]
6292   "TARGET_SSE4_2"
6294   rtx xops[6];
6295   bool ok;
6297   xops[0] = operands[0];
6298   xops[1] = operands[2];
6299   xops[2] = operands[1];
6300   xops[3] = gen_rtx_GTU (VOIDmode, operands[1], operands[2]);
6301   xops[4] = operands[1];
6302   xops[5] = operands[2];
6303   ok = ix86_expand_int_vcond (xops);
6304   gcc_assert (ok);
6305   DONE;
6308 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6310 ;; Parallel integral comparisons
6312 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6314 (define_expand "sse2_eq<mode>3"
6315   [(set (match_operand:SSEMODE124 0 "register_operand" "")
6316         (eq:SSEMODE124
6317           (match_operand:SSEMODE124 1 "nonimmediate_operand" "")
6318           (match_operand:SSEMODE124 2 "nonimmediate_operand" "")))]
6319   "TARGET_SSE2 && !TARGET_XOP "
6320   "ix86_fixup_binary_operands_no_copy (EQ, <MODE>mode, operands);")
6322 (define_insn "*avx_eq<mode>3"
6323   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x")
6324         (eq:SSEMODE1248
6325           (match_operand:SSEMODE1248 1 "nonimmediate_operand" "%x")
6326           (match_operand:SSEMODE1248 2 "nonimmediate_operand" "xm")))]
6327   "TARGET_AVX && ix86_binary_operator_ok (EQ, <MODE>mode, operands)"
6328   "vpcmpeq<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
6329   [(set_attr "type" "ssecmp")
6330    (set (attr "prefix_extra")
6331      (if_then_else (match_operand:V2DI 0 "" "")
6332        (const_string "1")
6333        (const_string "*")))
6334    (set_attr "prefix" "vex")
6335    (set_attr "mode" "TI")])
6337 (define_insn "*sse2_eq<mode>3"
6338   [(set (match_operand:SSEMODE124 0 "register_operand" "=x")
6339         (eq:SSEMODE124
6340           (match_operand:SSEMODE124 1 "nonimmediate_operand" "%0")
6341           (match_operand:SSEMODE124 2 "nonimmediate_operand" "xm")))]
6342   "TARGET_SSE2 && !TARGET_XOP
6343    && ix86_binary_operator_ok (EQ, <MODE>mode, operands)"
6344   "pcmpeq<ssevecsize>\t{%2, %0|%0, %2}"
6345   [(set_attr "type" "ssecmp")
6346    (set_attr "prefix_data16" "1")
6347    (set_attr "mode" "TI")])
6349 (define_expand "sse4_1_eqv2di3"
6350   [(set (match_operand:V2DI 0 "register_operand" "")
6351         (eq:V2DI
6352           (match_operand:V2DI 1 "nonimmediate_operand" "")
6353           (match_operand:V2DI 2 "nonimmediate_operand" "")))]
6354   "TARGET_SSE4_1"
6355   "ix86_fixup_binary_operands_no_copy (EQ, V2DImode, operands);")
6357 (define_insn "*sse4_1_eqv2di3"
6358   [(set (match_operand:V2DI 0 "register_operand" "=x")
6359         (eq:V2DI
6360           (match_operand:V2DI 1 "nonimmediate_operand" "%0")
6361           (match_operand:V2DI 2 "nonimmediate_operand" "xm")))]
6362   "TARGET_SSE4_1 && ix86_binary_operator_ok (EQ, V2DImode, operands)"
6363   "pcmpeqq\t{%2, %0|%0, %2}"
6364   [(set_attr "type" "ssecmp")
6365    (set_attr "prefix_extra" "1")
6366    (set_attr "mode" "TI")])
6368 (define_insn "*avx_gt<mode>3"
6369   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x")
6370         (gt:SSEMODE1248
6371           (match_operand:SSEMODE1248 1 "register_operand" "x")
6372           (match_operand:SSEMODE1248 2 "nonimmediate_operand" "xm")))]
6373   "TARGET_AVX"
6374   "vpcmpgt<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
6375   [(set_attr "type" "ssecmp")
6376    (set (attr "prefix_extra")
6377      (if_then_else (match_operand:V2DI 0 "" "")
6378        (const_string "1")
6379        (const_string "*")))
6380    (set_attr "prefix" "vex")
6381    (set_attr "mode" "TI")])
6383 (define_insn "sse2_gt<mode>3"
6384   [(set (match_operand:SSEMODE124 0 "register_operand" "=x")
6385         (gt:SSEMODE124
6386           (match_operand:SSEMODE124 1 "register_operand" "0")
6387           (match_operand:SSEMODE124 2 "nonimmediate_operand" "xm")))]
6388   "TARGET_SSE2 && !TARGET_XOP"
6389   "pcmpgt<ssevecsize>\t{%2, %0|%0, %2}"
6390   [(set_attr "type" "ssecmp")
6391    (set_attr "prefix_data16" "1")
6392    (set_attr "mode" "TI")])
6394 (define_insn "sse4_2_gtv2di3"
6395   [(set (match_operand:V2DI 0 "register_operand" "=x")
6396         (gt:V2DI
6397           (match_operand:V2DI 1 "register_operand" "0")
6398           (match_operand:V2DI 2 "nonimmediate_operand" "xm")))]
6399   "TARGET_SSE4_2"
6400   "pcmpgtq\t{%2, %0|%0, %2}"
6401   [(set_attr "type" "ssecmp")
6402    (set_attr "prefix_extra" "1")
6403    (set_attr "mode" "TI")])
6405 (define_expand "vcond<mode>"
6406   [(set (match_operand:SSEMODE124C8 0 "register_operand" "")
6407         (if_then_else:SSEMODE124C8
6408           (match_operator 3 ""
6409             [(match_operand:SSEMODE124C8 4 "nonimmediate_operand" "")
6410              (match_operand:SSEMODE124C8 5 "nonimmediate_operand" "")])
6411           (match_operand:SSEMODE124C8 1 "general_operand" "")
6412           (match_operand:SSEMODE124C8 2 "general_operand" "")))]
6413   "TARGET_SSE2"
6415   bool ok = ix86_expand_int_vcond (operands);
6416   gcc_assert (ok);
6417   DONE;
6420 (define_expand "vcondu<mode>"
6421   [(set (match_operand:SSEMODE124C8 0 "register_operand" "")
6422         (if_then_else:SSEMODE124C8
6423           (match_operator 3 ""
6424             [(match_operand:SSEMODE124C8 4 "nonimmediate_operand" "")
6425              (match_operand:SSEMODE124C8 5 "nonimmediate_operand" "")])
6426           (match_operand:SSEMODE124C8 1 "general_operand" "")
6427           (match_operand:SSEMODE124C8 2 "general_operand" "")))]
6428   "TARGET_SSE2"
6430   bool ok = ix86_expand_int_vcond (operands);
6431   gcc_assert (ok);
6432   DONE;
6435 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6437 ;; Parallel bitwise logical operations
6439 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6441 (define_expand "one_cmpl<mode>2"
6442   [(set (match_operand:SSEMODEI 0 "register_operand" "")
6443         (xor:SSEMODEI (match_operand:SSEMODEI 1 "nonimmediate_operand" "")
6444                       (match_dup 2)))]
6445   "TARGET_SSE2"
6447   int i, n = GET_MODE_NUNITS (<MODE>mode);
6448   rtvec v = rtvec_alloc (n);
6450   for (i = 0; i < n; ++i)
6451     RTVEC_ELT (v, i) = constm1_rtx;
6453   operands[2] = force_reg (<MODE>mode, gen_rtx_CONST_VECTOR (<MODE>mode, v));
6456 (define_insn "*avx_andnot<mode>3"
6457   [(set (match_operand:AVX256MODEI 0 "register_operand" "=x")
6458         (and:AVX256MODEI
6459           (not:AVX256MODEI (match_operand:AVX256MODEI 1 "register_operand" "x"))
6460           (match_operand:AVX256MODEI 2 "nonimmediate_operand" "xm")))]
6461   "TARGET_AVX"
6462   "vandnps\t{%2, %1, %0|%0, %1, %2}"
6463   [(set_attr "type" "sselog")
6464    (set_attr "prefix" "vex")
6465    (set_attr "mode" "<avxvecpsmode>")])
6467 (define_insn "*sse_andnot<mode>3"
6468   [(set (match_operand:SSEMODEI 0 "register_operand" "=x")
6469         (and:SSEMODEI
6470           (not:SSEMODEI (match_operand:SSEMODEI 1 "register_operand" "0"))
6471           (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))]
6472   "(TARGET_SSE && !TARGET_SSE2)"
6473   "andnps\t{%2, %0|%0, %2}"
6474   [(set_attr "type" "sselog")
6475    (set_attr "mode" "V4SF")])
6477 (define_insn "*avx_andnot<mode>3"
6478   [(set (match_operand:SSEMODEI 0 "register_operand" "=x")
6479         (and:SSEMODEI
6480           (not:SSEMODEI (match_operand:SSEMODEI 1 "register_operand" "x"))
6481           (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))]
6482   "TARGET_AVX"
6483   "vpandn\t{%2, %1, %0|%0, %1, %2}"
6484   [(set_attr "type" "sselog")
6485    (set_attr "prefix" "vex")
6486    (set_attr "mode" "TI")])
6488 (define_insn "sse2_andnot<mode>3"
6489   [(set (match_operand:SSEMODEI 0 "register_operand" "=x")
6490         (and:SSEMODEI
6491           (not:SSEMODEI (match_operand:SSEMODEI 1 "register_operand" "0"))
6492           (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))]
6493   "TARGET_SSE2"
6494   "pandn\t{%2, %0|%0, %2}"
6495   [(set_attr "type" "sselog")
6496    (set_attr "prefix_data16" "1")
6497    (set_attr "mode" "TI")])
6499 (define_insn "*andnottf3"
6500   [(set (match_operand:TF 0 "register_operand" "=x")
6501         (and:TF
6502           (not:TF (match_operand:TF 1 "register_operand" "0"))
6503           (match_operand:TF 2 "nonimmediate_operand" "xm")))]
6504   "TARGET_SSE2"
6505   "pandn\t{%2, %0|%0, %2}"
6506   [(set_attr "type" "sselog")
6507    (set_attr "prefix_data16" "1")
6508    (set_attr "mode" "TI")])
6510 (define_expand "<code><mode>3"
6511   [(set (match_operand:SSEMODEI 0 "register_operand" "")
6512         (any_logic:SSEMODEI
6513           (match_operand:SSEMODEI 1 "nonimmediate_operand" "")
6514           (match_operand:SSEMODEI 2 "nonimmediate_operand" "")))]
6515   "TARGET_SSE"
6516   "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
6518 (define_insn "*avx_<code><mode>3"
6519   [(set (match_operand:AVX256MODEI 0 "register_operand" "=x")
6520         (any_logic:AVX256MODEI
6521           (match_operand:AVX256MODEI 1 "nonimmediate_operand" "%x")
6522           (match_operand:AVX256MODEI 2 "nonimmediate_operand" "xm")))]
6523   "TARGET_AVX
6524    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
6525   "v<logic>ps\t{%2, %1, %0|%0, %1, %2}"
6526   [(set_attr "type" "sselog")
6527    (set_attr "prefix" "vex")
6528    (set_attr "mode" "<avxvecpsmode>")])
6530 (define_insn "*sse_<code><mode>3"
6531   [(set (match_operand:SSEMODEI 0 "register_operand" "=x")
6532         (any_logic:SSEMODEI
6533           (match_operand:SSEMODEI 1 "nonimmediate_operand" "%0")
6534           (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))]
6535   "(TARGET_SSE && !TARGET_SSE2)
6536    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
6537   "<logic>ps\t{%2, %0|%0, %2}"
6538   [(set_attr "type" "sselog")
6539    (set_attr "mode" "V4SF")])
6541 (define_insn "*avx_<code><mode>3"
6542   [(set (match_operand:SSEMODEI 0 "register_operand" "=x")
6543         (any_logic:SSEMODEI
6544           (match_operand:SSEMODEI 1 "nonimmediate_operand" "%x")
6545           (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))]
6546   "TARGET_AVX
6547    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
6548   "vp<logic>\t{%2, %1, %0|%0, %1, %2}"
6549   [(set_attr "type" "sselog")
6550    (set_attr "prefix" "vex")
6551    (set_attr "mode" "TI")])
6553 (define_insn "*sse2_<code><mode>3"
6554   [(set (match_operand:SSEMODEI 0 "register_operand" "=x")
6555         (any_logic:SSEMODEI
6556           (match_operand:SSEMODEI 1 "nonimmediate_operand" "%0")
6557           (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))]
6558   "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
6559   "p<logic>\t{%2, %0|%0, %2}"
6560   [(set_attr "type" "sselog")
6561    (set_attr "prefix_data16" "1")
6562    (set_attr "mode" "TI")])
6564 (define_expand "<code>tf3"
6565   [(set (match_operand:TF 0 "register_operand" "")
6566         (any_logic:TF
6567           (match_operand:TF 1 "nonimmediate_operand" "")
6568           (match_operand:TF 2 "nonimmediate_operand" "")))]
6569   "TARGET_SSE2"
6570   "ix86_fixup_binary_operands_no_copy (<CODE>, TFmode, operands);")
6572 (define_insn "*<code>tf3"
6573   [(set (match_operand:TF 0 "register_operand" "=x")
6574         (any_logic:TF
6575           (match_operand:TF 1 "nonimmediate_operand" "%0")
6576           (match_operand:TF 2 "nonimmediate_operand" "xm")))]
6577   "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, TFmode, operands)"
6578   "p<logic>\t{%2, %0|%0, %2}"
6579   [(set_attr "type" "sselog")
6580    (set_attr "prefix_data16" "1")
6581    (set_attr "mode" "TI")])
6583 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6585 ;; Parallel integral element swizzling
6587 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6589 (define_expand "vec_pack_trunc_v8hi"
6590   [(match_operand:V16QI 0 "register_operand" "")
6591    (match_operand:V8HI 1 "register_operand" "")
6592    (match_operand:V8HI 2 "register_operand" "")]
6593   "TARGET_SSE2"
6595   rtx op1 = gen_lowpart (V16QImode, operands[1]);
6596   rtx op2 = gen_lowpart (V16QImode, operands[2]);
6597   ix86_expand_vec_extract_even_odd (operands[0], op1, op2, 0);
6598   DONE;
6601 (define_expand "vec_pack_trunc_v4si"
6602   [(match_operand:V8HI 0 "register_operand" "")
6603    (match_operand:V4SI 1 "register_operand" "")
6604    (match_operand:V4SI 2 "register_operand" "")]
6605   "TARGET_SSE2"
6607   rtx op1 = gen_lowpart (V8HImode, operands[1]);
6608   rtx op2 = gen_lowpart (V8HImode, operands[2]);
6609   ix86_expand_vec_extract_even_odd (operands[0], op1, op2, 0);
6610   DONE;
6613 (define_expand "vec_pack_trunc_v2di"
6614   [(match_operand:V4SI 0 "register_operand" "")
6615    (match_operand:V2DI 1 "register_operand" "")
6616    (match_operand:V2DI 2 "register_operand" "")]
6617   "TARGET_SSE2"
6619   rtx op1 = gen_lowpart (V4SImode, operands[1]);
6620   rtx op2 = gen_lowpart (V4SImode, operands[2]);
6621   ix86_expand_vec_extract_even_odd (operands[0], op1, op2, 0);
6622   DONE;
6625 (define_insn "*avx_packsswb"
6626   [(set (match_operand:V16QI 0 "register_operand" "=x")
6627         (vec_concat:V16QI
6628           (ss_truncate:V8QI
6629             (match_operand:V8HI 1 "register_operand" "x"))
6630           (ss_truncate:V8QI
6631             (match_operand:V8HI 2 "nonimmediate_operand" "xm"))))]
6632   "TARGET_AVX"
6633   "vpacksswb\t{%2, %1, %0|%0, %1, %2}"
6634   [(set_attr "type" "sselog")
6635    (set_attr "prefix" "vex")
6636    (set_attr "mode" "TI")])
6638 (define_insn "sse2_packsswb"
6639   [(set (match_operand:V16QI 0 "register_operand" "=x")
6640         (vec_concat:V16QI
6641           (ss_truncate:V8QI
6642             (match_operand:V8HI 1 "register_operand" "0"))
6643           (ss_truncate:V8QI
6644             (match_operand:V8HI 2 "nonimmediate_operand" "xm"))))]
6645   "TARGET_SSE2"
6646   "packsswb\t{%2, %0|%0, %2}"
6647   [(set_attr "type" "sselog")
6648    (set_attr "prefix_data16" "1")
6649    (set_attr "mode" "TI")])
6651 (define_insn "*avx_packssdw"
6652   [(set (match_operand:V8HI 0 "register_operand" "=x")
6653         (vec_concat:V8HI
6654           (ss_truncate:V4HI
6655             (match_operand:V4SI 1 "register_operand" "x"))
6656           (ss_truncate:V4HI
6657             (match_operand:V4SI 2 "nonimmediate_operand" "xm"))))]
6658   "TARGET_AVX"
6659   "vpackssdw\t{%2, %1, %0|%0, %1, %2}"
6660   [(set_attr "type" "sselog")
6661    (set_attr "prefix" "vex")
6662    (set_attr "mode" "TI")])
6664 (define_insn "sse2_packssdw"
6665   [(set (match_operand:V8HI 0 "register_operand" "=x")
6666         (vec_concat:V8HI
6667           (ss_truncate:V4HI
6668             (match_operand:V4SI 1 "register_operand" "0"))
6669           (ss_truncate:V4HI
6670             (match_operand:V4SI 2 "nonimmediate_operand" "xm"))))]
6671   "TARGET_SSE2"
6672   "packssdw\t{%2, %0|%0, %2}"
6673   [(set_attr "type" "sselog")
6674    (set_attr "prefix_data16" "1")
6675    (set_attr "mode" "TI")])
6677 (define_insn "*avx_packuswb"
6678   [(set (match_operand:V16QI 0 "register_operand" "=x")
6679         (vec_concat:V16QI
6680           (us_truncate:V8QI
6681             (match_operand:V8HI 1 "register_operand" "x"))
6682           (us_truncate:V8QI
6683             (match_operand:V8HI 2 "nonimmediate_operand" "xm"))))]
6684   "TARGET_AVX"
6685   "vpackuswb\t{%2, %1, %0|%0, %1, %2}"
6686   [(set_attr "type" "sselog")
6687    (set_attr "prefix" "vex")
6688    (set_attr "mode" "TI")])
6690 (define_insn "sse2_packuswb"
6691   [(set (match_operand:V16QI 0 "register_operand" "=x")
6692         (vec_concat:V16QI
6693           (us_truncate:V8QI
6694             (match_operand:V8HI 1 "register_operand" "0"))
6695           (us_truncate:V8QI
6696             (match_operand:V8HI 2 "nonimmediate_operand" "xm"))))]
6697   "TARGET_SSE2"
6698   "packuswb\t{%2, %0|%0, %2}"
6699   [(set_attr "type" "sselog")
6700    (set_attr "prefix_data16" "1")
6701    (set_attr "mode" "TI")])
6703 (define_insn "*avx_interleave_highv16qi"
6704   [(set (match_operand:V16QI 0 "register_operand" "=x")
6705         (vec_select:V16QI
6706           (vec_concat:V32QI
6707             (match_operand:V16QI 1 "register_operand" "x")
6708             (match_operand:V16QI 2 "nonimmediate_operand" "xm"))
6709           (parallel [(const_int 8)  (const_int 24)
6710                      (const_int 9)  (const_int 25)
6711                      (const_int 10) (const_int 26)
6712                      (const_int 11) (const_int 27)
6713                      (const_int 12) (const_int 28)
6714                      (const_int 13) (const_int 29)
6715                      (const_int 14) (const_int 30)
6716                      (const_int 15) (const_int 31)])))]
6717   "TARGET_AVX"
6718   "vpunpckhbw\t{%2, %1, %0|%0, %1, %2}"
6719   [(set_attr "type" "sselog")
6720    (set_attr "prefix" "vex")
6721    (set_attr "mode" "TI")])
6723 (define_insn "vec_interleave_highv16qi"
6724   [(set (match_operand:V16QI 0 "register_operand" "=x")
6725         (vec_select:V16QI
6726           (vec_concat:V32QI
6727             (match_operand:V16QI 1 "register_operand" "0")
6728             (match_operand:V16QI 2 "nonimmediate_operand" "xm"))
6729           (parallel [(const_int 8)  (const_int 24)
6730                      (const_int 9)  (const_int 25)
6731                      (const_int 10) (const_int 26)
6732                      (const_int 11) (const_int 27)
6733                      (const_int 12) (const_int 28)
6734                      (const_int 13) (const_int 29)
6735                      (const_int 14) (const_int 30)
6736                      (const_int 15) (const_int 31)])))]
6737   "TARGET_SSE2"
6738   "punpckhbw\t{%2, %0|%0, %2}"
6739   [(set_attr "type" "sselog")
6740    (set_attr "prefix_data16" "1")
6741    (set_attr "mode" "TI")])
6743 (define_insn "*avx_interleave_lowv16qi"
6744   [(set (match_operand:V16QI 0 "register_operand" "=x")
6745         (vec_select:V16QI
6746           (vec_concat:V32QI
6747             (match_operand:V16QI 1 "register_operand" "x")
6748             (match_operand:V16QI 2 "nonimmediate_operand" "xm"))
6749           (parallel [(const_int 0) (const_int 16)
6750                      (const_int 1) (const_int 17)
6751                      (const_int 2) (const_int 18)
6752                      (const_int 3) (const_int 19)
6753                      (const_int 4) (const_int 20)
6754                      (const_int 5) (const_int 21)
6755                      (const_int 6) (const_int 22)
6756                      (const_int 7) (const_int 23)])))]
6757   "TARGET_AVX"
6758   "vpunpcklbw\t{%2, %1, %0|%0, %1, %2}"
6759   [(set_attr "type" "sselog")
6760    (set_attr "prefix" "vex")
6761    (set_attr "mode" "TI")])
6763 (define_insn "vec_interleave_lowv16qi"
6764   [(set (match_operand:V16QI 0 "register_operand" "=x")
6765         (vec_select:V16QI
6766           (vec_concat:V32QI
6767             (match_operand:V16QI 1 "register_operand" "0")
6768             (match_operand:V16QI 2 "nonimmediate_operand" "xm"))
6769           (parallel [(const_int 0) (const_int 16)
6770                      (const_int 1) (const_int 17)
6771                      (const_int 2) (const_int 18)
6772                      (const_int 3) (const_int 19)
6773                      (const_int 4) (const_int 20)
6774                      (const_int 5) (const_int 21)
6775                      (const_int 6) (const_int 22)
6776                      (const_int 7) (const_int 23)])))]
6777   "TARGET_SSE2"
6778   "punpcklbw\t{%2, %0|%0, %2}"
6779   [(set_attr "type" "sselog")
6780    (set_attr "prefix_data16" "1")
6781    (set_attr "mode" "TI")])
6783 (define_insn "*avx_interleave_highv8hi"
6784   [(set (match_operand:V8HI 0 "register_operand" "=x")
6785         (vec_select:V8HI
6786           (vec_concat:V16HI
6787             (match_operand:V8HI 1 "register_operand" "x")
6788             (match_operand:V8HI 2 "nonimmediate_operand" "xm"))
6789           (parallel [(const_int 4) (const_int 12)
6790                      (const_int 5) (const_int 13)
6791                      (const_int 6) (const_int 14)
6792                      (const_int 7) (const_int 15)])))]
6793   "TARGET_AVX"
6794   "vpunpckhwd\t{%2, %1, %0|%0, %1, %2}"
6795   [(set_attr "type" "sselog")
6796    (set_attr "prefix" "vex")
6797    (set_attr "mode" "TI")])
6799 (define_insn "vec_interleave_highv8hi"
6800   [(set (match_operand:V8HI 0 "register_operand" "=x")
6801         (vec_select:V8HI
6802           (vec_concat:V16HI
6803             (match_operand:V8HI 1 "register_operand" "0")
6804             (match_operand:V8HI 2 "nonimmediate_operand" "xm"))
6805           (parallel [(const_int 4) (const_int 12)
6806                      (const_int 5) (const_int 13)
6807                      (const_int 6) (const_int 14)
6808                      (const_int 7) (const_int 15)])))]
6809   "TARGET_SSE2"
6810   "punpckhwd\t{%2, %0|%0, %2}"
6811   [(set_attr "type" "sselog")
6812    (set_attr "prefix_data16" "1")
6813    (set_attr "mode" "TI")])
6815 (define_insn "*avx_interleave_lowv8hi"
6816   [(set (match_operand:V8HI 0 "register_operand" "=x")
6817         (vec_select:V8HI
6818           (vec_concat:V16HI
6819             (match_operand:V8HI 1 "register_operand" "x")
6820             (match_operand:V8HI 2 "nonimmediate_operand" "xm"))
6821           (parallel [(const_int 0) (const_int 8)
6822                      (const_int 1) (const_int 9)
6823                      (const_int 2) (const_int 10)
6824                      (const_int 3) (const_int 11)])))]
6825   "TARGET_AVX"
6826   "vpunpcklwd\t{%2, %1, %0|%0, %1, %2}"
6827   [(set_attr "type" "sselog")
6828    (set_attr "prefix" "vex")
6829    (set_attr "mode" "TI")])
6831 (define_insn "vec_interleave_lowv8hi"
6832   [(set (match_operand:V8HI 0 "register_operand" "=x")
6833         (vec_select:V8HI
6834           (vec_concat:V16HI
6835             (match_operand:V8HI 1 "register_operand" "0")
6836             (match_operand:V8HI 2 "nonimmediate_operand" "xm"))
6837           (parallel [(const_int 0) (const_int 8)
6838                      (const_int 1) (const_int 9)
6839                      (const_int 2) (const_int 10)
6840                      (const_int 3) (const_int 11)])))]
6841   "TARGET_SSE2"
6842   "punpcklwd\t{%2, %0|%0, %2}"
6843   [(set_attr "type" "sselog")
6844    (set_attr "prefix_data16" "1")
6845    (set_attr "mode" "TI")])
6847 (define_insn "*avx_interleave_highv4si"
6848   [(set (match_operand:V4SI 0 "register_operand" "=x")
6849         (vec_select:V4SI
6850           (vec_concat:V8SI
6851             (match_operand:V4SI 1 "register_operand" "x")
6852             (match_operand:V4SI 2 "nonimmediate_operand" "xm"))
6853           (parallel [(const_int 2) (const_int 6)
6854                      (const_int 3) (const_int 7)])))]
6855   "TARGET_AVX"
6856   "vpunpckhdq\t{%2, %1, %0|%0, %1, %2}"
6857   [(set_attr "type" "sselog")
6858    (set_attr "prefix" "vex")
6859    (set_attr "mode" "TI")])
6861 (define_insn "vec_interleave_highv4si"
6862   [(set (match_operand:V4SI 0 "register_operand" "=x")
6863         (vec_select:V4SI
6864           (vec_concat:V8SI
6865             (match_operand:V4SI 1 "register_operand" "0")
6866             (match_operand:V4SI 2 "nonimmediate_operand" "xm"))
6867           (parallel [(const_int 2) (const_int 6)
6868                      (const_int 3) (const_int 7)])))]
6869   "TARGET_SSE2"
6870   "punpckhdq\t{%2, %0|%0, %2}"
6871   [(set_attr "type" "sselog")
6872    (set_attr "prefix_data16" "1")
6873    (set_attr "mode" "TI")])
6875 (define_insn "*avx_interleave_lowv4si"
6876   [(set (match_operand:V4SI 0 "register_operand" "=x")
6877         (vec_select:V4SI
6878           (vec_concat:V8SI
6879             (match_operand:V4SI 1 "register_operand" "x")
6880             (match_operand:V4SI 2 "nonimmediate_operand" "xm"))
6881           (parallel [(const_int 0) (const_int 4)
6882                      (const_int 1) (const_int 5)])))]
6883   "TARGET_AVX"
6884   "vpunpckldq\t{%2, %1, %0|%0, %1, %2}"
6885   [(set_attr "type" "sselog")
6886    (set_attr "prefix" "vex")
6887    (set_attr "mode" "TI")])
6889 (define_insn "vec_interleave_lowv4si"
6890   [(set (match_operand:V4SI 0 "register_operand" "=x")
6891         (vec_select:V4SI
6892           (vec_concat:V8SI
6893             (match_operand:V4SI 1 "register_operand" "0")
6894             (match_operand:V4SI 2 "nonimmediate_operand" "xm"))
6895           (parallel [(const_int 0) (const_int 4)
6896                      (const_int 1) (const_int 5)])))]
6897   "TARGET_SSE2"
6898   "punpckldq\t{%2, %0|%0, %2}"
6899   [(set_attr "type" "sselog")
6900    (set_attr "prefix_data16" "1")
6901    (set_attr "mode" "TI")])
6903 (define_insn "*avx_pinsr<ssevecsize>"
6904   [(set (match_operand:SSEMODE124 0 "register_operand" "=x")
6905         (vec_merge:SSEMODE124
6906           (vec_duplicate:SSEMODE124
6907             (match_operand:<avxscalarmode> 2 "nonimmediate_operand" "rm"))
6908           (match_operand:SSEMODE124 1 "register_operand" "x")
6909           (match_operand:SI 3 "const_pow2_1_to_<pinsrbits>_operand" "n")))]
6910   "TARGET_AVX"
6912   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
6913   if (MEM_P (operands[2]))
6914     return "vpinsr<ssevecsize>\t{%3, %2, %1, %0|%0, %1, %2, %3}";
6915   else
6916     return "vpinsr<ssevecsize>\t{%3, %k2, %1, %0|%0, %1, %k2, %3}";
6918   [(set_attr "type" "sselog")
6919    (set (attr "prefix_extra")
6920      (if_then_else (match_operand:V8HI 0 "register_operand" "")
6921        (const_string "0")
6922        (const_string "1")))
6923    (set_attr "length_immediate" "1")
6924    (set_attr "prefix" "vex")
6925    (set_attr "mode" "TI")])
6927 (define_insn "*sse4_1_pinsrb"
6928   [(set (match_operand:V16QI 0 "register_operand" "=x")
6929         (vec_merge:V16QI
6930           (vec_duplicate:V16QI
6931             (match_operand:QI 2 "nonimmediate_operand" "rm"))
6932           (match_operand:V16QI 1 "register_operand" "0")
6933           (match_operand:SI 3 "const_pow2_1_to_32768_operand" "n")))]
6934   "TARGET_SSE4_1"
6936   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
6937   if (MEM_P (operands[2]))
6938     return "pinsrb\t{%3, %2, %0|%0, %2, %3}";
6939   else
6940     return "pinsrb\t{%3, %k2, %0|%0, %k2, %3}";
6942   [(set_attr "type" "sselog")
6943    (set_attr "prefix_extra" "1")
6944    (set_attr "length_immediate" "1")
6945    (set_attr "mode" "TI")])
6947 (define_insn "*sse2_pinsrw"
6948   [(set (match_operand:V8HI 0 "register_operand" "=x")
6949         (vec_merge:V8HI
6950           (vec_duplicate:V8HI
6951             (match_operand:HI 2 "nonimmediate_operand" "rm"))
6952           (match_operand:V8HI 1 "register_operand" "0")
6953           (match_operand:SI 3 "const_pow2_1_to_128_operand" "n")))]
6954   "TARGET_SSE2"
6956   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
6957   if (MEM_P (operands[2]))
6958     return "pinsrw\t{%3, %2, %0|%0, %2, %3}";
6959   else
6960     return "pinsrw\t{%3, %k2, %0|%0, %k2, %3}";
6962   [(set_attr "type" "sselog")
6963    (set_attr "prefix_data16" "1")
6964    (set_attr "length_immediate" "1")
6965    (set_attr "mode" "TI")])
6967 ;; It must come before sse2_loadld since it is preferred.
6968 (define_insn "*sse4_1_pinsrd"
6969   [(set (match_operand:V4SI 0 "register_operand" "=x")
6970         (vec_merge:V4SI
6971           (vec_duplicate:V4SI
6972             (match_operand:SI 2 "nonimmediate_operand" "rm"))
6973           (match_operand:V4SI 1 "register_operand" "0")
6974           (match_operand:SI 3 "const_pow2_1_to_8_operand" "n")))]
6975   "TARGET_SSE4_1"
6977   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
6978   return "pinsrd\t{%3, %2, %0|%0, %2, %3}";
6980   [(set_attr "type" "sselog")
6981    (set_attr "prefix_extra" "1")
6982    (set_attr "length_immediate" "1")
6983    (set_attr "mode" "TI")])
6985 (define_insn "*avx_pinsrq"
6986   [(set (match_operand:V2DI 0 "register_operand" "=x")
6987         (vec_merge:V2DI
6988           (vec_duplicate:V2DI
6989             (match_operand:DI 2 "nonimmediate_operand" "rm"))
6990           (match_operand:V2DI 1 "register_operand" "x")
6991           (match_operand:SI 3 "const_pow2_1_to_2_operand" "n")))]
6992   "TARGET_AVX && TARGET_64BIT"
6994   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
6995   return "vpinsrq\t{%3, %2, %1, %0|%0, %1, %2, %3}";
6997   [(set_attr "type" "sselog")
6998    (set_attr "prefix_extra" "1")
6999    (set_attr "length_immediate" "1")
7000    (set_attr "prefix" "vex")
7001    (set_attr "mode" "TI")])
7003 (define_insn "*sse4_1_pinsrq"
7004   [(set (match_operand:V2DI 0 "register_operand" "=x")
7005         (vec_merge:V2DI
7006           (vec_duplicate:V2DI
7007             (match_operand:DI 2 "nonimmediate_operand" "rm"))
7008           (match_operand:V2DI 1 "register_operand" "0")
7009           (match_operand:SI 3 "const_pow2_1_to_2_operand" "n")))]
7010   "TARGET_SSE4_1 && TARGET_64BIT"
7012   operands[3] = GEN_INT (exact_log2 (INTVAL (operands[3])));
7013   return "pinsrq\t{%3, %2, %0|%0, %2, %3}";
7015   [(set_attr "type" "sselog")
7016    (set_attr "prefix_rex" "1")
7017    (set_attr "prefix_extra" "1")
7018    (set_attr "length_immediate" "1")
7019    (set_attr "mode" "TI")])
7021 (define_insn "*sse4_1_pextrb_<mode>"
7022   [(set (match_operand:SWI48 0 "register_operand" "=r")
7023         (zero_extend:SWI48
7024           (vec_select:QI
7025             (match_operand:V16QI 1 "register_operand" "x")
7026             (parallel [(match_operand:SI 2 "const_0_to_15_operand" "n")]))))]
7027   "TARGET_SSE4_1"
7028   "%vpextrb\t{%2, %1, %k0|%k0, %1, %2}"
7029   [(set_attr "type" "sselog")
7030    (set_attr "prefix_extra" "1")
7031    (set_attr "length_immediate" "1")
7032    (set_attr "prefix" "maybe_vex")
7033    (set_attr "mode" "TI")])
7035 (define_insn "*sse4_1_pextrb_memory"
7036   [(set (match_operand:QI 0 "memory_operand" "=m")
7037         (vec_select:QI
7038           (match_operand:V16QI 1 "register_operand" "x")
7039           (parallel [(match_operand:SI 2 "const_0_to_15_operand" "n")])))]
7040   "TARGET_SSE4_1"
7041   "%vpextrb\t{%2, %1, %0|%0, %1, %2}"
7042   [(set_attr "type" "sselog")
7043    (set_attr "prefix_extra" "1")
7044    (set_attr "length_immediate" "1")
7045    (set_attr "prefix" "maybe_vex")
7046    (set_attr "mode" "TI")])
7048 (define_insn "*sse2_pextrw_<mode>"
7049   [(set (match_operand:SWI48 0 "register_operand" "=r")
7050         (zero_extend:SWI48
7051           (vec_select:HI
7052             (match_operand:V8HI 1 "register_operand" "x")
7053             (parallel [(match_operand:SI 2 "const_0_to_7_operand" "n")]))))]
7054   "TARGET_SSE2"
7055   "%vpextrw\t{%2, %1, %k0|%k0, %1, %2}"
7056   [(set_attr "type" "sselog")
7057    (set_attr "prefix_data16" "1")
7058    (set_attr "length_immediate" "1")
7059    (set_attr "prefix" "maybe_vex")
7060    (set_attr "mode" "TI")])
7062 (define_insn "*sse4_1_pextrw_memory"
7063   [(set (match_operand:HI 0 "memory_operand" "=m")
7064         (vec_select:HI
7065           (match_operand:V8HI 1 "register_operand" "x")
7066           (parallel [(match_operand:SI 2 "const_0_to_7_operand" "n")])))]
7067   "TARGET_SSE4_1"
7068   "%vpextrw\t{%2, %1, %0|%0, %1, %2}"
7069   [(set_attr "type" "sselog")
7070    (set_attr "prefix_extra" "1")
7071    (set_attr "length_immediate" "1")
7072    (set_attr "prefix" "maybe_vex")
7073    (set_attr "mode" "TI")])
7075 (define_insn "*sse4_1_pextrd"
7076   [(set (match_operand:SI 0 "nonimmediate_operand" "=rm")
7077         (vec_select:SI
7078           (match_operand:V4SI 1 "register_operand" "x")
7079           (parallel [(match_operand:SI 2 "const_0_to_3_operand" "n")])))]
7080   "TARGET_SSE4_1"
7081   "%vpextrd\t{%2, %1, %0|%0, %1, %2}"
7082   [(set_attr "type" "sselog")
7083    (set_attr "prefix_extra" "1")
7084    (set_attr "length_immediate" "1")
7085    (set_attr "prefix" "maybe_vex")
7086    (set_attr "mode" "TI")])
7088 (define_insn "*sse4_1_pextrd_zext"
7089   [(set (match_operand:DI 0 "register_operand" "=r")
7090         (zero_extend:DI
7091           (vec_select:SI
7092             (match_operand:V4SI 1 "register_operand" "x")
7093             (parallel [(match_operand:SI 2 "const_0_to_3_operand" "n")]))))]
7094   "TARGET_64BIT && TARGET_SSE4_1"
7095   "%vpextrd\t{%2, %1, %k0|%k0, %1, %2}"
7096   [(set_attr "type" "sselog")
7097    (set_attr "prefix_extra" "1")
7098    (set_attr "length_immediate" "1")
7099    (set_attr "prefix" "maybe_vex")
7100    (set_attr "mode" "TI")])
7102 ;; It must come before *vec_extractv2di_1_sse since it is preferred.
7103 (define_insn "*sse4_1_pextrq"
7104   [(set (match_operand:DI 0 "nonimmediate_operand" "=rm")
7105         (vec_select:DI
7106           (match_operand:V2DI 1 "register_operand" "x")
7107           (parallel [(match_operand:SI 2 "const_0_to_1_operand" "n")])))]
7108   "TARGET_SSE4_1 && TARGET_64BIT"
7109   "%vpextrq\t{%2, %1, %0|%0, %1, %2}"
7110   [(set_attr "type" "sselog")
7111    (set_attr "prefix_rex" "1")
7112    (set_attr "prefix_extra" "1")
7113    (set_attr "length_immediate" "1")
7114    (set_attr "prefix" "maybe_vex")
7115    (set_attr "mode" "TI")])
7117 (define_expand "sse2_pshufd"
7118   [(match_operand:V4SI 0 "register_operand" "")
7119    (match_operand:V4SI 1 "nonimmediate_operand" "")
7120    (match_operand:SI 2 "const_int_operand" "")]
7121   "TARGET_SSE2"
7123   int mask = INTVAL (operands[2]);
7124   emit_insn (gen_sse2_pshufd_1 (operands[0], operands[1],
7125                                 GEN_INT ((mask >> 0) & 3),
7126                                 GEN_INT ((mask >> 2) & 3),
7127                                 GEN_INT ((mask >> 4) & 3),
7128                                 GEN_INT ((mask >> 6) & 3)));
7129   DONE;
7132 (define_insn "sse2_pshufd_1"
7133   [(set (match_operand:V4SI 0 "register_operand" "=x")
7134         (vec_select:V4SI
7135           (match_operand:V4SI 1 "nonimmediate_operand" "xm")
7136           (parallel [(match_operand 2 "const_0_to_3_operand" "")
7137                      (match_operand 3 "const_0_to_3_operand" "")
7138                      (match_operand 4 "const_0_to_3_operand" "")
7139                      (match_operand 5 "const_0_to_3_operand" "")])))]
7140   "TARGET_SSE2"
7142   int mask = 0;
7143   mask |= INTVAL (operands[2]) << 0;
7144   mask |= INTVAL (operands[3]) << 2;
7145   mask |= INTVAL (operands[4]) << 4;
7146   mask |= INTVAL (operands[5]) << 6;
7147   operands[2] = GEN_INT (mask);
7149   return "%vpshufd\t{%2, %1, %0|%0, %1, %2}";
7151   [(set_attr "type" "sselog1")
7152    (set_attr "prefix_data16" "1")
7153    (set_attr "prefix" "maybe_vex")
7154    (set_attr "length_immediate" "1")
7155    (set_attr "mode" "TI")])
7157 (define_expand "sse2_pshuflw"
7158   [(match_operand:V8HI 0 "register_operand" "")
7159    (match_operand:V8HI 1 "nonimmediate_operand" "")
7160    (match_operand:SI 2 "const_int_operand" "")]
7161   "TARGET_SSE2"
7163   int mask = INTVAL (operands[2]);
7164   emit_insn (gen_sse2_pshuflw_1 (operands[0], operands[1],
7165                                  GEN_INT ((mask >> 0) & 3),
7166                                  GEN_INT ((mask >> 2) & 3),
7167                                  GEN_INT ((mask >> 4) & 3),
7168                                  GEN_INT ((mask >> 6) & 3)));
7169   DONE;
7172 (define_insn "sse2_pshuflw_1"
7173   [(set (match_operand:V8HI 0 "register_operand" "=x")
7174         (vec_select:V8HI
7175           (match_operand:V8HI 1 "nonimmediate_operand" "xm")
7176           (parallel [(match_operand 2 "const_0_to_3_operand" "")
7177                      (match_operand 3 "const_0_to_3_operand" "")
7178                      (match_operand 4 "const_0_to_3_operand" "")
7179                      (match_operand 5 "const_0_to_3_operand" "")
7180                      (const_int 4)
7181                      (const_int 5)
7182                      (const_int 6)
7183                      (const_int 7)])))]
7184   "TARGET_SSE2"
7186   int mask = 0;
7187   mask |= INTVAL (operands[2]) << 0;
7188   mask |= INTVAL (operands[3]) << 2;
7189   mask |= INTVAL (operands[4]) << 4;
7190   mask |= INTVAL (operands[5]) << 6;
7191   operands[2] = GEN_INT (mask);
7193   return "%vpshuflw\t{%2, %1, %0|%0, %1, %2}";
7195   [(set_attr "type" "sselog")
7196    (set_attr "prefix_data16" "0")
7197    (set_attr "prefix_rep" "1")
7198    (set_attr "prefix" "maybe_vex")
7199    (set_attr "length_immediate" "1")
7200    (set_attr "mode" "TI")])
7202 (define_expand "sse2_pshufhw"
7203   [(match_operand:V8HI 0 "register_operand" "")
7204    (match_operand:V8HI 1 "nonimmediate_operand" "")
7205    (match_operand:SI 2 "const_int_operand" "")]
7206   "TARGET_SSE2"
7208   int mask = INTVAL (operands[2]);
7209   emit_insn (gen_sse2_pshufhw_1 (operands[0], operands[1],
7210                                  GEN_INT (((mask >> 0) & 3) + 4),
7211                                  GEN_INT (((mask >> 2) & 3) + 4),
7212                                  GEN_INT (((mask >> 4) & 3) + 4),
7213                                  GEN_INT (((mask >> 6) & 3) + 4)));
7214   DONE;
7217 (define_insn "sse2_pshufhw_1"
7218   [(set (match_operand:V8HI 0 "register_operand" "=x")
7219         (vec_select:V8HI
7220           (match_operand:V8HI 1 "nonimmediate_operand" "xm")
7221           (parallel [(const_int 0)
7222                      (const_int 1)
7223                      (const_int 2)
7224                      (const_int 3)
7225                      (match_operand 2 "const_4_to_7_operand" "")
7226                      (match_operand 3 "const_4_to_7_operand" "")
7227                      (match_operand 4 "const_4_to_7_operand" "")
7228                      (match_operand 5 "const_4_to_7_operand" "")])))]
7229   "TARGET_SSE2"
7231   int mask = 0;
7232   mask |= (INTVAL (operands[2]) - 4) << 0;
7233   mask |= (INTVAL (operands[3]) - 4) << 2;
7234   mask |= (INTVAL (operands[4]) - 4) << 4;
7235   mask |= (INTVAL (operands[5]) - 4) << 6;
7236   operands[2] = GEN_INT (mask);
7238   return "%vpshufhw\t{%2, %1, %0|%0, %1, %2}";
7240   [(set_attr "type" "sselog")
7241    (set_attr "prefix_rep" "1")
7242    (set_attr "prefix_data16" "0")
7243    (set_attr "prefix" "maybe_vex")
7244    (set_attr "length_immediate" "1")
7245    (set_attr "mode" "TI")])
7247 (define_expand "sse2_loadd"
7248   [(set (match_operand:V4SI 0 "register_operand" "")
7249         (vec_merge:V4SI
7250           (vec_duplicate:V4SI
7251             (match_operand:SI 1 "nonimmediate_operand" ""))
7252           (match_dup 2)
7253           (const_int 1)))]
7254   "TARGET_SSE"
7255   "operands[2] = CONST0_RTX (V4SImode);")
7257 (define_insn "*avx_loadld"
7258   [(set (match_operand:V4SI 0 "register_operand"       "=x,Yi,x")
7259         (vec_merge:V4SI
7260           (vec_duplicate:V4SI
7261             (match_operand:SI 2 "nonimmediate_operand" "m ,r ,x"))
7262           (match_operand:V4SI 1 "reg_or_0_operand"     "C ,C ,x")
7263           (const_int 1)))]
7264   "TARGET_AVX"
7265   "@
7266    vmovd\t{%2, %0|%0, %2}
7267    vmovd\t{%2, %0|%0, %2}
7268    vmovss\t{%2, %1, %0|%0, %1, %2}"
7269   [(set_attr "type" "ssemov")
7270    (set_attr "prefix" "vex")
7271    (set_attr "mode" "TI,TI,V4SF")])
7273 (define_insn "sse2_loadld"
7274   [(set (match_operand:V4SI 0 "register_operand"       "=Y2,Yi,x,x")
7275         (vec_merge:V4SI
7276           (vec_duplicate:V4SI
7277             (match_operand:SI 2 "nonimmediate_operand" "m  ,r ,m,x"))
7278           (match_operand:V4SI 1 "reg_or_0_operand"     "C  ,C ,C,0")
7279           (const_int 1)))]
7280   "TARGET_SSE"
7281   "@
7282    movd\t{%2, %0|%0, %2}
7283    movd\t{%2, %0|%0, %2}
7284    movss\t{%2, %0|%0, %2}
7285    movss\t{%2, %0|%0, %2}"
7286   [(set_attr "type" "ssemov")
7287    (set_attr "mode" "TI,TI,V4SF,SF")])
7289 (define_insn_and_split "sse2_stored"
7290   [(set (match_operand:SI 0 "nonimmediate_operand" "=mx,r")
7291         (vec_select:SI
7292           (match_operand:V4SI 1 "register_operand" "x,Yi")
7293           (parallel [(const_int 0)])))]
7294   "TARGET_SSE"
7295   "#"
7296   "&& reload_completed
7297    && (TARGET_INTER_UNIT_MOVES
7298        || MEM_P (operands [0])
7299        || !GENERAL_REGNO_P (true_regnum (operands [0])))"
7300   [(set (match_dup 0) (match_dup 1))]
7301   "operands[1] = gen_rtx_REG (SImode, REGNO (operands[1]));")
7303 (define_insn_and_split "*vec_ext_v4si_mem"
7304   [(set (match_operand:SI 0 "register_operand" "=r")
7305         (vec_select:SI
7306           (match_operand:V4SI 1 "memory_operand" "o")
7307           (parallel [(match_operand 2 "const_0_to_3_operand" "")])))]
7308   ""
7309   "#"
7310   "reload_completed"
7311   [(const_int 0)]
7313   int i = INTVAL (operands[2]);
7315   emit_move_insn (operands[0], adjust_address (operands[1], SImode, i*4));
7316   DONE;
7319 (define_expand "sse_storeq"
7320   [(set (match_operand:DI 0 "nonimmediate_operand" "")
7321         (vec_select:DI
7322           (match_operand:V2DI 1 "register_operand" "")
7323           (parallel [(const_int 0)])))]
7324   "TARGET_SSE")
7326 (define_insn "*sse2_storeq_rex64"
7327   [(set (match_operand:DI 0 "nonimmediate_operand" "=mx,*r,r")
7328         (vec_select:DI
7329           (match_operand:V2DI 1 "nonimmediate_operand" "x,Yi,o")
7330           (parallel [(const_int 0)])))]
7331   "TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
7332   "@
7333    #
7334    #
7335    %vmov{q}\t{%1, %0|%0, %1}"
7336   [(set_attr "type" "*,*,imov")
7337    (set_attr "prefix" "*,*,maybe_vex")
7338    (set_attr "mode" "*,*,DI")])
7340 (define_insn "*sse2_storeq"
7341   [(set (match_operand:DI 0 "nonimmediate_operand" "=mx")
7342         (vec_select:DI
7343           (match_operand:V2DI 1 "register_operand" "x")
7344           (parallel [(const_int 0)])))]
7345   "TARGET_SSE"
7346   "#")
7348 (define_split
7349   [(set (match_operand:DI 0 "nonimmediate_operand" "")
7350         (vec_select:DI
7351           (match_operand:V2DI 1 "register_operand" "")
7352           (parallel [(const_int 0)])))]
7353   "TARGET_SSE
7354    && reload_completed
7355    && (TARGET_INTER_UNIT_MOVES
7356        || MEM_P (operands [0])
7357        || !GENERAL_REGNO_P (true_regnum (operands [0])))"
7358   [(set (match_dup 0) (match_dup 1))]
7359   "operands[1] = gen_rtx_REG (DImode, REGNO (operands[1]));")
7361 (define_insn "*vec_extractv2di_1_rex64_avx"
7362   [(set (match_operand:DI 0 "nonimmediate_operand" "=m,x,x,r")
7363         (vec_select:DI
7364           (match_operand:V2DI 1 "nonimmediate_operand" "x,x,o,o")
7365           (parallel [(const_int 1)])))]
7366   "TARGET_64BIT
7367    && TARGET_AVX
7368    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
7369   "@
7370    vmovhps\t{%1, %0|%0, %1}
7371    vpsrldq\t{$8, %1, %0|%0, %1, 8}
7372    vmovq\t{%H1, %0|%0, %H1}
7373    vmov{q}\t{%H1, %0|%0, %H1}"
7374   [(set_attr "type" "ssemov,sseishft1,ssemov,imov")
7375    (set_attr "length_immediate" "*,1,*,*")
7376    (set_attr "memory" "*,none,*,*")
7377    (set_attr "prefix" "vex")
7378    (set_attr "mode" "V2SF,TI,TI,DI")])
7380 (define_insn "*vec_extractv2di_1_rex64"
7381   [(set (match_operand:DI 0 "nonimmediate_operand" "=m,x,x,r")
7382         (vec_select:DI
7383           (match_operand:V2DI 1 "nonimmediate_operand" "x,0,o,o")
7384           (parallel [(const_int 1)])))]
7385   "TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
7386   "@
7387    movhps\t{%1, %0|%0, %1}
7388    psrldq\t{$8, %0|%0, 8}
7389    movq\t{%H1, %0|%0, %H1}
7390    mov{q}\t{%H1, %0|%0, %H1}"
7391   [(set_attr "type" "ssemov,sseishft1,ssemov,imov")
7392    (set_attr "length_immediate" "*,1,*,*")
7393    (set_attr "memory" "*,none,*,*")
7394    (set_attr "mode" "V2SF,TI,TI,DI")])
7396 (define_insn "*vec_extractv2di_1_avx"
7397   [(set (match_operand:DI 0 "nonimmediate_operand" "=m,x,x")
7398         (vec_select:DI
7399           (match_operand:V2DI 1 "nonimmediate_operand" "x,x,o")
7400           (parallel [(const_int 1)])))]
7401   "!TARGET_64BIT
7402    && TARGET_AVX
7403    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
7404   "@
7405    vmovhps\t{%1, %0|%0, %1}
7406    vpsrldq\t{$8, %1, %0|%0, %1, 8}
7407    vmovq\t{%H1, %0|%0, %H1}"
7408   [(set_attr "type" "ssemov,sseishft1,ssemov")
7409    (set_attr "length_immediate" "*,1,*")
7410    (set_attr "memory" "*,none,*")
7411    (set_attr "prefix" "vex")
7412    (set_attr "mode" "V2SF,TI,TI")])
7414 (define_insn "*vec_extractv2di_1_sse2"
7415   [(set (match_operand:DI 0 "nonimmediate_operand" "=m,x,x")
7416         (vec_select:DI
7417           (match_operand:V2DI 1 "nonimmediate_operand" "x,0,o")
7418           (parallel [(const_int 1)])))]
7419   "!TARGET_64BIT
7420    && TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
7421   "@
7422    movhps\t{%1, %0|%0, %1}
7423    psrldq\t{$8, %0|%0, 8}
7424    movq\t{%H1, %0|%0, %H1}"
7425   [(set_attr "type" "ssemov,sseishft1,ssemov")
7426    (set_attr "length_immediate" "*,1,*")
7427    (set_attr "memory" "*,none,*")
7428    (set_attr "mode" "V2SF,TI,TI")])
7430 ;; Not sure this is ever used, but it doesn't hurt to have it. -aoliva
7431 (define_insn "*vec_extractv2di_1_sse"
7432   [(set (match_operand:DI 0 "nonimmediate_operand" "=m,x,x")
7433         (vec_select:DI
7434           (match_operand:V2DI 1 "nonimmediate_operand" "x,x,o")
7435           (parallel [(const_int 1)])))]
7436   "!TARGET_SSE2 && TARGET_SSE
7437    && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
7438   "@
7439    movhps\t{%1, %0|%0, %1}
7440    movhlps\t{%1, %0|%0, %1}
7441    movlps\t{%H1, %0|%0, %H1}"
7442   [(set_attr "type" "ssemov")
7443    (set_attr "mode" "V2SF,V4SF,V2SF")])
7445 (define_insn "*vec_dupv4si_avx"
7446   [(set (match_operand:V4SI 0 "register_operand" "=x,x")
7447         (vec_duplicate:V4SI
7448           (match_operand:SI 1 "register_operand" "x,m")))]
7449   "TARGET_AVX"
7450   "@
7451    vpshufd\t{$0, %1, %0|%0, %1, 0}
7452    vbroadcastss\t{%1, %0|%0, %1}"
7453   [(set_attr "type" "sselog1,ssemov")
7454    (set_attr "length_immediate" "1,0")
7455    (set_attr "prefix_extra" "0,1")
7456    (set_attr "prefix" "vex")
7457    (set_attr "mode" "TI,V4SF")])
7459 (define_insn "*vec_dupv4si"
7460   [(set (match_operand:V4SI 0 "register_operand" "=Y2,x")
7461         (vec_duplicate:V4SI
7462           (match_operand:SI 1 "register_operand" " Y2,0")))]
7463   "TARGET_SSE"
7464   "@
7465    %vpshufd\t{$0, %1, %0|%0, %1, 0}
7466    shufps\t{$0, %0, %0|%0, %0, 0}"
7467   [(set_attr "type" "sselog1")
7468    (set_attr "length_immediate" "1")
7469    (set_attr "mode" "TI,V4SF")])
7471 (define_insn "*vec_dupv2di_avx"
7472   [(set (match_operand:V2DI 0 "register_operand"     "=x,x")
7473         (vec_duplicate:V2DI
7474           (match_operand:DI 1 "nonimmediate_operand" " x,m")))]
7475   "TARGET_AVX"
7476   "@
7477    vpunpcklqdq\t{%1, %1, %0|%0, %1, %1}
7478    vmovddup\t{%1, %0|%0, %1}"
7479   [(set_attr "type" "sselog1")
7480    (set_attr "prefix" "vex")
7481    (set_attr "mode" "TI,DF")])
7483 (define_insn "*vec_dupv2di_sse3"
7484   [(set (match_operand:V2DI 0 "register_operand"     "=x,x")
7485         (vec_duplicate:V2DI
7486           (match_operand:DI 1 "nonimmediate_operand" " 0,m")))]
7487   "TARGET_SSE3"
7488   "@
7489    punpcklqdq\t%0, %0
7490    movddup\t{%1, %0|%0, %1}"
7491   [(set_attr "type" "sselog1")
7492    (set_attr "mode" "TI,DF")])
7494 (define_insn "*vec_dupv2di"
7495   [(set (match_operand:V2DI 0 "register_operand" "=Y2,x")
7496         (vec_duplicate:V2DI
7497           (match_operand:DI 1 "register_operand" " 0 ,0")))]
7498   "TARGET_SSE"
7499   "@
7500    punpcklqdq\t%0, %0
7501    movlhps\t%0, %0"
7502   [(set_attr "type" "sselog1,ssemov")
7503    (set_attr "mode" "TI,V4SF")])
7505 (define_insn "*vec_concatv2si_avx"
7506   [(set (match_operand:V2SI 0 "register_operand"     "=x,x,x ,*y ,*y")
7507         (vec_concat:V2SI
7508           (match_operand:SI 1 "nonimmediate_operand" "x ,x,rm, 0 ,rm")
7509           (match_operand:SI 2 "vector_move_operand"  "rm,x,C ,*ym,C")))]
7510   "TARGET_AVX"
7511   "@
7512    vpinsrd\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}
7513    vpunpckldq\t{%2, %1, %0|%0, %1, %2}
7514    vmovd\t{%1, %0|%0, %1}
7515    punpckldq\t{%2, %0|%0, %2}
7516    movd\t{%1, %0|%0, %1}"
7517   [(set_attr "type" "sselog,sselog,ssemov,mmxcvt,mmxmov")
7518    (set_attr "prefix_extra" "1,*,*,*,*")
7519    (set_attr "length_immediate" "1,*,*,*,*")
7520    (set (attr "prefix")
7521      (if_then_else (eq_attr "alternative" "3,4")
7522        (const_string "orig")
7523        (const_string "vex")))
7524    (set_attr "mode" "TI,TI,TI,DI,DI")])
7526 (define_insn "*vec_concatv2si_sse4_1"
7527   [(set (match_operand:V2SI 0 "register_operand"     "=x,x,x ,*y ,*y")
7528         (vec_concat:V2SI
7529           (match_operand:SI 1 "nonimmediate_operand" "0 ,0,rm, 0 ,rm")
7530           (match_operand:SI 2 "vector_move_operand"  "rm,x,C ,*ym,C")))]
7531   "TARGET_SSE4_1"
7532   "@
7533    pinsrd\t{$0x1, %2, %0|%0, %2, 0x1}
7534    punpckldq\t{%2, %0|%0, %2}
7535    movd\t{%1, %0|%0, %1}
7536    punpckldq\t{%2, %0|%0, %2}
7537    movd\t{%1, %0|%0, %1}"
7538   [(set_attr "type" "sselog,sselog,ssemov,mmxcvt,mmxmov")
7539    (set_attr "prefix_extra" "1,*,*,*,*")
7540    (set_attr "length_immediate" "1,*,*,*,*")
7541    (set_attr "mode" "TI,TI,TI,DI,DI")])
7543 ;; ??? In theory we can match memory for the MMX alternative, but allowing
7544 ;; nonimmediate_operand for operand 2 and *not* allowing memory for the SSE
7545 ;; alternatives pretty much forces the MMX alternative to be chosen.
7546 (define_insn "*vec_concatv2si_sse2"
7547   [(set (match_operand:V2SI 0 "register_operand"     "=x,x ,*y,*y")
7548         (vec_concat:V2SI
7549           (match_operand:SI 1 "nonimmediate_operand" " 0,rm, 0,rm")
7550           (match_operand:SI 2 "reg_or_0_operand"     " x,C ,*y, C")))]
7551   "TARGET_SSE2"
7552   "@
7553    punpckldq\t{%2, %0|%0, %2}
7554    movd\t{%1, %0|%0, %1}
7555    punpckldq\t{%2, %0|%0, %2}
7556    movd\t{%1, %0|%0, %1}"
7557   [(set_attr "type" "sselog,ssemov,mmxcvt,mmxmov")
7558    (set_attr "mode" "TI,TI,DI,DI")])
7560 (define_insn "*vec_concatv2si_sse"
7561   [(set (match_operand:V2SI 0 "register_operand"     "=x,x,*y,*y")
7562         (vec_concat:V2SI
7563           (match_operand:SI 1 "nonimmediate_operand" " 0,m, 0,*rm")
7564           (match_operand:SI 2 "reg_or_0_operand"     " x,C,*y,C")))]
7565   "TARGET_SSE"
7566   "@
7567    unpcklps\t{%2, %0|%0, %2}
7568    movss\t{%1, %0|%0, %1}
7569    punpckldq\t{%2, %0|%0, %2}
7570    movd\t{%1, %0|%0, %1}"
7571   [(set_attr "type" "sselog,ssemov,mmxcvt,mmxmov")
7572    (set_attr "mode" "V4SF,V4SF,DI,DI")])
7574 (define_insn "*vec_concatv4si_1_avx"
7575   [(set (match_operand:V4SI 0 "register_operand"       "=x,x")
7576         (vec_concat:V4SI
7577           (match_operand:V2SI 1 "register_operand"     " x,x")
7578           (match_operand:V2SI 2 "nonimmediate_operand" " x,m")))]
7579   "TARGET_AVX"
7580   "@
7581    vpunpcklqdq\t{%2, %1, %0|%0, %1, %2}
7582    vmovhps\t{%2, %1, %0|%0, %1, %2}"
7583   [(set_attr "type" "sselog,ssemov")
7584    (set_attr "prefix" "vex")
7585    (set_attr "mode" "TI,V2SF")])
7587 (define_insn "*vec_concatv4si_1"
7588   [(set (match_operand:V4SI 0 "register_operand"       "=Y2,x,x")
7589         (vec_concat:V4SI
7590           (match_operand:V2SI 1 "register_operand"     " 0 ,0,0")
7591           (match_operand:V2SI 2 "nonimmediate_operand" " Y2,x,m")))]
7592   "TARGET_SSE"
7593   "@
7594    punpcklqdq\t{%2, %0|%0, %2}
7595    movlhps\t{%2, %0|%0, %2}
7596    movhps\t{%2, %0|%0, %2}"
7597   [(set_attr "type" "sselog,ssemov,ssemov")
7598    (set_attr "mode" "TI,V4SF,V2SF")])
7600 (define_insn "*vec_concatv2di_avx"
7601   [(set (match_operand:V2DI 0 "register_operand"     "=x,?x,x,x")
7602         (vec_concat:V2DI
7603           (match_operand:DI 1 "nonimmediate_operand" " m,*y,x,x")
7604           (match_operand:DI 2 "vector_move_operand"  " C, C,x,m")))]
7605   "!TARGET_64BIT && TARGET_AVX"
7606   "@
7607    vmovq\t{%1, %0|%0, %1}
7608    movq2dq\t{%1, %0|%0, %1}
7609    vpunpcklqdq\t{%2, %1, %0|%0, %1, %2}
7610    vmovhps\t{%2, %1, %0|%0, %1, %2}"
7611   [(set_attr "type" "ssemov,ssemov,sselog,ssemov")
7612    (set (attr "prefix")
7613      (if_then_else (eq_attr "alternative" "1")
7614        (const_string "orig")
7615        (const_string "vex")))
7616    (set_attr "mode" "TI,TI,TI,V2SF")])
7618 (define_insn "vec_concatv2di"
7619   [(set (match_operand:V2DI 0 "register_operand"     "=Y2 ,?Y2,Y2,x,x")
7620         (vec_concat:V2DI
7621           (match_operand:DI 1 "nonimmediate_operand" " mY2,*y ,0 ,0,0")
7622           (match_operand:DI 2 "vector_move_operand"  " C  ,  C,Y2,x,m")))]
7623   "!TARGET_64BIT && TARGET_SSE"
7624   "@
7625    movq\t{%1, %0|%0, %1}
7626    movq2dq\t{%1, %0|%0, %1}
7627    punpcklqdq\t{%2, %0|%0, %2}
7628    movlhps\t{%2, %0|%0, %2}
7629    movhps\t{%2, %0|%0, %2}"
7630   [(set_attr "type" "ssemov,ssemov,sselog,ssemov,ssemov")
7631    (set_attr "mode" "TI,TI,TI,V4SF,V2SF")])
7633 (define_insn "*vec_concatv2di_rex64_avx"
7634   [(set (match_operand:V2DI 0 "register_operand"     "=x,x,Yi,!x,x,x")
7635         (vec_concat:V2DI
7636           (match_operand:DI 1 "nonimmediate_operand" " x,m,r ,*y,x,x")
7637           (match_operand:DI 2 "vector_move_operand"  "rm,C,C ,C ,x,m")))]
7638   "TARGET_64BIT && TARGET_AVX"
7639   "@
7640    vpinsrq\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}
7641    vmovq\t{%1, %0|%0, %1}
7642    vmovq\t{%1, %0|%0, %1}
7643    movq2dq\t{%1, %0|%0, %1}
7644    vpunpcklqdq\t{%2, %1, %0|%0, %1, %2}
7645    vmovhps\t{%2, %1, %0|%0, %1, %2}"
7646   [(set_attr "type" "sselog,ssemov,ssemov,ssemov,sselog,ssemov")
7647    (set_attr "prefix_extra" "1,*,*,*,*,*")
7648    (set_attr "length_immediate" "1,*,*,*,*,*")
7649    (set (attr "prefix")
7650      (if_then_else (eq_attr "alternative" "3")
7651        (const_string "orig")
7652        (const_string "vex")))
7653    (set_attr "mode" "TI,TI,TI,TI,TI,V2SF")])
7655 (define_insn "*vec_concatv2di_rex64_sse4_1"
7656   [(set (match_operand:V2DI 0 "register_operand"     "=x ,x ,Yi,!x,x,x,x")
7657         (vec_concat:V2DI
7658           (match_operand:DI 1 "nonimmediate_operand" " 0 ,mx,r ,*y,0,0,0")
7659           (match_operand:DI 2 "vector_move_operand"  " rm,C ,C ,C ,x,x,m")))]
7660   "TARGET_64BIT && TARGET_SSE4_1"
7661   "@
7662    pinsrq\t{$0x1, %2, %0|%0, %2, 0x1}
7663    movq\t{%1, %0|%0, %1}
7664    movq\t{%1, %0|%0, %1}
7665    movq2dq\t{%1, %0|%0, %1}
7666    punpcklqdq\t{%2, %0|%0, %2}
7667    movlhps\t{%2, %0|%0, %2}
7668    movhps\t{%2, %0|%0, %2}"
7669   [(set_attr "type" "sselog,ssemov,ssemov,ssemov,sselog,ssemov,ssemov")
7670    (set_attr "prefix_rex" "1,*,1,*,*,*,*")
7671    (set_attr "prefix_extra" "1,*,*,*,*,*,*")
7672    (set_attr "length_immediate" "1,*,*,*,*,*,*")
7673    (set_attr "mode" "TI,TI,TI,TI,TI,V4SF,V2SF")])
7675 (define_insn "*vec_concatv2di_rex64_sse"
7676   [(set (match_operand:V2DI 0 "register_operand"     "=Y2 ,Yi,!Y2,Y2,x,x")
7677         (vec_concat:V2DI
7678           (match_operand:DI 1 "nonimmediate_operand" " mY2,r ,*y ,0 ,0,0")
7679           (match_operand:DI 2 "vector_move_operand"  " C  ,C ,C  ,Y2,x,m")))]
7680   "TARGET_64BIT && TARGET_SSE"
7681   "@
7682    movq\t{%1, %0|%0, %1}
7683    movq\t{%1, %0|%0, %1}
7684    movq2dq\t{%1, %0|%0, %1}
7685    punpcklqdq\t{%2, %0|%0, %2}
7686    movlhps\t{%2, %0|%0, %2}
7687    movhps\t{%2, %0|%0, %2}"
7688   [(set_attr "type" "ssemov,ssemov,ssemov,sselog,ssemov,ssemov")
7689    (set_attr "prefix_rex" "*,1,*,*,*,*")
7690    (set_attr "mode" "TI,TI,TI,TI,V4SF,V2SF")])
7692 (define_expand "vec_unpacku_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, true, true);
7699   else
7700     ix86_expand_sse_unpack (operands, true, true);
7701   DONE;
7704 (define_expand "vec_unpacks_hi_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, false, true);
7711   else
7712     ix86_expand_sse_unpack (operands, false, true);
7713   DONE;
7716 (define_expand "vec_unpacku_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, true, false);
7723   else
7724     ix86_expand_sse_unpack (operands, true, false);
7725   DONE;
7728 (define_expand "vec_unpacks_lo_v16qi"
7729   [(match_operand:V8HI 0 "register_operand" "")
7730    (match_operand:V16QI 1 "register_operand" "")]
7731   "TARGET_SSE2"
7733   if (TARGET_SSE4_1)
7734     ix86_expand_sse4_unpack (operands, false, false);
7735   else
7736     ix86_expand_sse_unpack (operands, false, false);
7737   DONE;
7740 (define_expand "vec_unpacku_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, true, true);
7747   else
7748     ix86_expand_sse_unpack (operands, true, true);
7749   DONE;
7752 (define_expand "vec_unpacks_hi_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, false, true);
7759   else
7760     ix86_expand_sse_unpack (operands, false, true);
7761   DONE;
7764 (define_expand "vec_unpacku_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, true, false);
7771   else
7772     ix86_expand_sse_unpack (operands, true, false);
7773   DONE;
7776 (define_expand "vec_unpacks_lo_v8hi"
7777   [(match_operand:V4SI 0 "register_operand" "")
7778    (match_operand:V8HI 1 "register_operand" "")]
7779   "TARGET_SSE2"
7781   if (TARGET_SSE4_1)
7782     ix86_expand_sse4_unpack (operands, false, false);
7783   else
7784     ix86_expand_sse_unpack (operands, false, false);
7785   DONE;
7788 (define_expand "vec_unpacku_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, true, true);
7795   else
7796     ix86_expand_sse_unpack (operands, true, true);
7797   DONE;
7800 (define_expand "vec_unpacks_hi_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, false, true);
7807   else
7808     ix86_expand_sse_unpack (operands, false, true);
7809   DONE;
7812 (define_expand "vec_unpacku_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, true, false);
7819   else
7820     ix86_expand_sse_unpack (operands, true, false);
7821   DONE;
7824 (define_expand "vec_unpacks_lo_v4si"
7825   [(match_operand:V2DI 0 "register_operand" "")
7826    (match_operand:V4SI 1 "register_operand" "")]
7827   "TARGET_SSE2"
7829   if (TARGET_SSE4_1)
7830     ix86_expand_sse4_unpack (operands, false, false);
7831   else
7832     ix86_expand_sse_unpack (operands, false, false);
7833   DONE;
7836 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7838 ;; Miscellaneous
7840 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7842 (define_expand "sse2_uavgv16qi3"
7843   [(set (match_operand:V16QI 0 "register_operand" "")
7844         (truncate:V16QI
7845           (lshiftrt:V16HI
7846             (plus:V16HI
7847               (plus:V16HI
7848                 (zero_extend:V16HI
7849                   (match_operand:V16QI 1 "nonimmediate_operand" ""))
7850                 (zero_extend:V16HI
7851                   (match_operand:V16QI 2 "nonimmediate_operand" "")))
7852               (const_vector:V16QI [(const_int 1) (const_int 1)
7853                                    (const_int 1) (const_int 1)
7854                                    (const_int 1) (const_int 1)
7855                                    (const_int 1) (const_int 1)
7856                                    (const_int 1) (const_int 1)
7857                                    (const_int 1) (const_int 1)
7858                                    (const_int 1) (const_int 1)
7859                                    (const_int 1) (const_int 1)]))
7860             (const_int 1))))]
7861   "TARGET_SSE2"
7862   "ix86_fixup_binary_operands_no_copy (PLUS, V16QImode, operands);")
7864 (define_insn "*avx_uavgv16qi3"
7865   [(set (match_operand:V16QI 0 "register_operand" "=x")
7866         (truncate:V16QI
7867           (lshiftrt:V16HI
7868             (plus:V16HI
7869               (plus:V16HI
7870                 (zero_extend:V16HI
7871                   (match_operand:V16QI 1 "nonimmediate_operand" "%x"))
7872                 (zero_extend:V16HI
7873                   (match_operand:V16QI 2 "nonimmediate_operand" "xm")))
7874               (const_vector:V16QI [(const_int 1) (const_int 1)
7875                                    (const_int 1) (const_int 1)
7876                                    (const_int 1) (const_int 1)
7877                                    (const_int 1) (const_int 1)
7878                                    (const_int 1) (const_int 1)
7879                                    (const_int 1) (const_int 1)
7880                                    (const_int 1) (const_int 1)
7881                                    (const_int 1) (const_int 1)]))
7882             (const_int 1))))]
7883   "TARGET_AVX && ix86_binary_operator_ok (PLUS, V16QImode, operands)"
7884   "vpavgb\t{%2, %1, %0|%0, %1, %2}"
7885   [(set_attr "type" "sseiadd")
7886    (set_attr "prefix" "vex")
7887    (set_attr "mode" "TI")])
7889 (define_insn "*sse2_uavgv16qi3"
7890   [(set (match_operand:V16QI 0 "register_operand" "=x")
7891         (truncate:V16QI
7892           (lshiftrt:V16HI
7893             (plus:V16HI
7894               (plus:V16HI
7895                 (zero_extend:V16HI
7896                   (match_operand:V16QI 1 "nonimmediate_operand" "%0"))
7897                 (zero_extend:V16HI
7898                   (match_operand:V16QI 2 "nonimmediate_operand" "xm")))
7899               (const_vector:V16QI [(const_int 1) (const_int 1)
7900                                    (const_int 1) (const_int 1)
7901                                    (const_int 1) (const_int 1)
7902                                    (const_int 1) (const_int 1)
7903                                    (const_int 1) (const_int 1)
7904                                    (const_int 1) (const_int 1)
7905                                    (const_int 1) (const_int 1)
7906                                    (const_int 1) (const_int 1)]))
7907             (const_int 1))))]
7908   "TARGET_SSE2 && ix86_binary_operator_ok (PLUS, V16QImode, operands)"
7909   "pavgb\t{%2, %0|%0, %2}"
7910   [(set_attr "type" "sseiadd")
7911    (set_attr "prefix_data16" "1")
7912    (set_attr "mode" "TI")])
7914 (define_expand "sse2_uavgv8hi3"
7915   [(set (match_operand:V8HI 0 "register_operand" "")
7916         (truncate:V8HI
7917           (lshiftrt:V8SI
7918             (plus:V8SI
7919               (plus:V8SI
7920                 (zero_extend:V8SI
7921                   (match_operand:V8HI 1 "nonimmediate_operand" ""))
7922                 (zero_extend:V8SI
7923                   (match_operand:V8HI 2 "nonimmediate_operand" "")))
7924               (const_vector:V8HI [(const_int 1) (const_int 1)
7925                                   (const_int 1) (const_int 1)
7926                                   (const_int 1) (const_int 1)
7927                                   (const_int 1) (const_int 1)]))
7928             (const_int 1))))]
7929   "TARGET_SSE2"
7930   "ix86_fixup_binary_operands_no_copy (PLUS, V8HImode, operands);")
7932 (define_insn "*avx_uavgv8hi3"
7933   [(set (match_operand:V8HI 0 "register_operand" "=x")
7934         (truncate:V8HI
7935           (lshiftrt:V8SI
7936             (plus:V8SI
7937               (plus:V8SI
7938                 (zero_extend:V8SI
7939                   (match_operand:V8HI 1 "nonimmediate_operand" "%x"))
7940                 (zero_extend:V8SI
7941                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")))
7942               (const_vector:V8HI [(const_int 1) (const_int 1)
7943                                   (const_int 1) (const_int 1)
7944                                   (const_int 1) (const_int 1)
7945                                   (const_int 1) (const_int 1)]))
7946             (const_int 1))))]
7947   "TARGET_AVX && ix86_binary_operator_ok (PLUS, V8HImode, operands)"
7948   "vpavgw\t{%2, %1, %0|%0, %1, %2}"
7949   [(set_attr "type" "sseiadd")
7950    (set_attr "prefix" "vex")
7951    (set_attr "mode" "TI")])
7953 (define_insn "*sse2_uavgv8hi3"
7954   [(set (match_operand:V8HI 0 "register_operand" "=x")
7955         (truncate:V8HI
7956           (lshiftrt:V8SI
7957             (plus:V8SI
7958               (plus:V8SI
7959                 (zero_extend:V8SI
7960                   (match_operand:V8HI 1 "nonimmediate_operand" "%0"))
7961                 (zero_extend:V8SI
7962                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")))
7963               (const_vector:V8HI [(const_int 1) (const_int 1)
7964                                   (const_int 1) (const_int 1)
7965                                   (const_int 1) (const_int 1)
7966                                   (const_int 1) (const_int 1)]))
7967             (const_int 1))))]
7968   "TARGET_SSE2 && ix86_binary_operator_ok (PLUS, V8HImode, operands)"
7969   "pavgw\t{%2, %0|%0, %2}"
7970   [(set_attr "type" "sseiadd")
7971    (set_attr "prefix_data16" "1")
7972    (set_attr "mode" "TI")])
7974 ;; The correct representation for this is absolutely enormous, and
7975 ;; surely not generally useful.
7976 (define_insn "*avx_psadbw"
7977   [(set (match_operand:V2DI 0 "register_operand" "=x")
7978         (unspec:V2DI [(match_operand:V16QI 1 "register_operand" "x")
7979                       (match_operand:V16QI 2 "nonimmediate_operand" "xm")]
7980                      UNSPEC_PSADBW))]
7981   "TARGET_AVX"
7982   "vpsadbw\t{%2, %1, %0|%0, %1, %2}"
7983   [(set_attr "type" "sseiadd")
7984    (set_attr "prefix" "vex")
7985    (set_attr "mode" "TI")])
7987 (define_insn "sse2_psadbw"
7988   [(set (match_operand:V2DI 0 "register_operand" "=x")
7989         (unspec:V2DI [(match_operand:V16QI 1 "register_operand" "0")
7990                       (match_operand:V16QI 2 "nonimmediate_operand" "xm")]
7991                      UNSPEC_PSADBW))]
7992   "TARGET_SSE2"
7993   "psadbw\t{%2, %0|%0, %2}"
7994   [(set_attr "type" "sseiadd")
7995    (set_attr "atom_unit" "simul")
7996    (set_attr "prefix_data16" "1")
7997    (set_attr "mode" "TI")])
7999 (define_insn "avx_movmsk<ssemodesuffix>256"
8000   [(set (match_operand:SI 0 "register_operand" "=r")
8001         (unspec:SI
8002           [(match_operand:AVX256MODEF2P 1 "register_operand" "x")]
8003           UNSPEC_MOVMSK))]
8004   "AVX256_VEC_FLOAT_MODE_P (<MODE>mode)"
8005   "vmovmsk<ssemodesuffix>\t{%1, %0|%0, %1}"
8006   [(set_attr "type" "ssecvt")
8007    (set_attr "prefix" "vex")
8008    (set_attr "mode" "<MODE>")])
8010 (define_insn "<sse>_movmsk<ssemodesuffix>"
8011   [(set (match_operand:SI 0 "register_operand" "=r")
8012         (unspec:SI
8013           [(match_operand:SSEMODEF2P 1 "register_operand" "x")]
8014           UNSPEC_MOVMSK))]
8015   "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
8016   "%vmovmsk<ssemodesuffix>\t{%1, %0|%0, %1}"
8017   [(set_attr "type" "ssemov")
8018    (set_attr "prefix" "maybe_vex")
8019    (set_attr "mode" "<MODE>")])
8021 (define_insn "sse2_pmovmskb"
8022   [(set (match_operand:SI 0 "register_operand" "=r")
8023         (unspec:SI [(match_operand:V16QI 1 "register_operand" "x")]
8024                    UNSPEC_MOVMSK))]
8025   "TARGET_SSE2"
8026   "%vpmovmskb\t{%1, %0|%0, %1}"
8027   [(set_attr "type" "ssemov")
8028    (set_attr "prefix_data16" "1")
8029    (set_attr "prefix" "maybe_vex")
8030    (set_attr "mode" "SI")])
8032 (define_expand "sse2_maskmovdqu"
8033   [(set (match_operand:V16QI 0 "memory_operand" "")
8034         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "")
8035                        (match_operand:V16QI 2 "register_operand" "")
8036                        (match_dup 0)]
8037                       UNSPEC_MASKMOV))]
8038   "TARGET_SSE2")
8040 (define_insn "*sse2_maskmovdqu"
8041   [(set (mem:V16QI (match_operand:SI 0 "register_operand" "D"))
8042         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "x")
8043                        (match_operand:V16QI 2 "register_operand" "x")
8044                        (mem:V16QI (match_dup 0))]
8045                       UNSPEC_MASKMOV))]
8046   "TARGET_SSE2 && !TARGET_64BIT"
8047   ;; @@@ check ordering of operands in intel/nonintel syntax
8048   "%vmaskmovdqu\t{%2, %1|%1, %2}"
8049   [(set_attr "type" "ssemov")
8050    (set_attr "prefix_data16" "1")
8051    ;; The implicit %rdi operand confuses default length_vex computation.
8052    (set_attr "length_vex" "3")
8053    (set_attr "prefix" "maybe_vex")
8054    (set_attr "mode" "TI")])
8056 (define_insn "*sse2_maskmovdqu_rex64"
8057   [(set (mem:V16QI (match_operand:DI 0 "register_operand" "D"))
8058         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "x")
8059                        (match_operand:V16QI 2 "register_operand" "x")
8060                        (mem:V16QI (match_dup 0))]
8061                       UNSPEC_MASKMOV))]
8062   "TARGET_SSE2 && TARGET_64BIT"
8063   ;; @@@ check ordering of operands in intel/nonintel syntax
8064   "%vmaskmovdqu\t{%2, %1|%1, %2}"
8065   [(set_attr "type" "ssemov")
8066    (set_attr "prefix_data16" "1")
8067    ;; The implicit %rdi operand confuses default length_vex computation.
8068    (set (attr "length_vex")
8069      (symbol_ref ("REGNO (operands[2]) >= FIRST_REX_SSE_REG ? 3 + 1 : 2 + 1")))
8070    (set_attr "prefix" "maybe_vex")
8071    (set_attr "mode" "TI")])
8073 (define_insn "sse_ldmxcsr"
8074   [(unspec_volatile [(match_operand:SI 0 "memory_operand" "m")]
8075                     UNSPECV_LDMXCSR)]
8076   "TARGET_SSE"
8077   "%vldmxcsr\t%0"
8078   [(set_attr "type" "sse")
8079    (set_attr "atom_sse_attr" "mxcsr")
8080    (set_attr "prefix" "maybe_vex")
8081    (set_attr "memory" "load")])
8083 (define_insn "sse_stmxcsr"
8084   [(set (match_operand:SI 0 "memory_operand" "=m")
8085         (unspec_volatile:SI [(const_int 0)] UNSPECV_STMXCSR))]
8086   "TARGET_SSE"
8087   "%vstmxcsr\t%0"
8088   [(set_attr "type" "sse")
8089    (set_attr "atom_sse_attr" "mxcsr")
8090    (set_attr "prefix" "maybe_vex")
8091    (set_attr "memory" "store")])
8093 (define_expand "sse_sfence"
8094   [(set (match_dup 0)
8095         (unspec:BLK [(match_dup 0)] UNSPEC_SFENCE))]
8096   "TARGET_SSE || TARGET_3DNOW_A"
8098   operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
8099   MEM_VOLATILE_P (operands[0]) = 1;
8102 (define_insn "*sse_sfence"
8103   [(set (match_operand:BLK 0 "" "")
8104         (unspec:BLK [(match_dup 0)] UNSPEC_SFENCE))]
8105   "TARGET_SSE || TARGET_3DNOW_A"
8106   "sfence"
8107   [(set_attr "type" "sse")
8108    (set_attr "length_address" "0")
8109    (set_attr "atom_sse_attr" "fence")
8110    (set_attr "memory" "unknown")])
8112 (define_insn "sse2_clflush"
8113   [(unspec_volatile [(match_operand 0 "address_operand" "p")]
8114                     UNSPECV_CLFLUSH)]
8115   "TARGET_SSE2"
8116   "clflush\t%a0"
8117   [(set_attr "type" "sse")
8118    (set_attr "atom_sse_attr" "fence")
8119    (set_attr "memory" "unknown")])
8121 (define_expand "sse2_mfence"
8122   [(set (match_dup 0)
8123         (unspec:BLK [(match_dup 0)] UNSPEC_MFENCE))]
8124   "TARGET_SSE2"
8126   operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
8127   MEM_VOLATILE_P (operands[0]) = 1;
8130 (define_insn "*sse2_mfence"
8131   [(set (match_operand:BLK 0 "" "")
8132         (unspec:BLK [(match_dup 0)] UNSPEC_MFENCE))]
8133   "TARGET_64BIT || TARGET_SSE2"
8134   "mfence"
8135   [(set_attr "type" "sse")
8136    (set_attr "length_address" "0")
8137    (set_attr "atom_sse_attr" "fence")
8138    (set_attr "memory" "unknown")])
8140 (define_expand "sse2_lfence"
8141   [(set (match_dup 0)
8142         (unspec:BLK [(match_dup 0)] UNSPEC_LFENCE))]
8143   "TARGET_SSE2"
8145   operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
8146   MEM_VOLATILE_P (operands[0]) = 1;
8149 (define_insn "*sse2_lfence"
8150   [(set (match_operand:BLK 0 "" "")
8151         (unspec:BLK [(match_dup 0)] UNSPEC_LFENCE))]
8152   "TARGET_SSE2"
8153   "lfence"
8154   [(set_attr "type" "sse")
8155    (set_attr "length_address" "0")
8156    (set_attr "atom_sse_attr" "lfence")
8157    (set_attr "memory" "unknown")])
8159 (define_insn "sse3_mwait"
8160   [(unspec_volatile [(match_operand:SI 0 "register_operand" "a")
8161                      (match_operand:SI 1 "register_operand" "c")]
8162                     UNSPECV_MWAIT)]
8163   "TARGET_SSE3"
8164 ;; 64bit version is "mwait %rax,%rcx". But only lower 32bits are used.
8165 ;; Since 32bit register operands are implicitly zero extended to 64bit,
8166 ;; we only need to set up 32bit registers.
8167   "mwait"
8168   [(set_attr "length" "3")])
8170 (define_insn "sse3_monitor"
8171   [(unspec_volatile [(match_operand:SI 0 "register_operand" "a")
8172                      (match_operand:SI 1 "register_operand" "c")
8173                      (match_operand:SI 2 "register_operand" "d")]
8174                     UNSPECV_MONITOR)]
8175   "TARGET_SSE3 && !TARGET_64BIT"
8176   "monitor\t%0, %1, %2"
8177   [(set_attr "length" "3")])
8179 (define_insn "sse3_monitor64"
8180   [(unspec_volatile [(match_operand:DI 0 "register_operand" "a")
8181                      (match_operand:SI 1 "register_operand" "c")
8182                      (match_operand:SI 2 "register_operand" "d")]
8183                     UNSPECV_MONITOR)]
8184   "TARGET_SSE3 && TARGET_64BIT"
8185 ;; 64bit version is "monitor %rax,%rcx,%rdx". But only lower 32bits in
8186 ;; RCX and RDX are used.  Since 32bit register operands are implicitly
8187 ;; zero extended to 64bit, we only need to set up 32bit registers.
8188   "monitor"
8189   [(set_attr "length" "3")])
8191 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8193 ;; SSSE3 instructions
8195 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8197 (define_insn "*avx_phaddwv8hi3"
8198   [(set (match_operand:V8HI 0 "register_operand" "=x")
8199         (vec_concat:V8HI
8200           (vec_concat:V4HI
8201             (vec_concat:V2HI
8202               (plus:HI
8203                 (vec_select:HI
8204                   (match_operand:V8HI 1 "register_operand" "x")
8205                   (parallel [(const_int 0)]))
8206                 (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8207               (plus:HI
8208                 (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8209                 (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8210             (vec_concat:V2HI
8211               (plus:HI
8212                 (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
8213                 (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
8214               (plus:HI
8215                 (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
8216                 (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
8217           (vec_concat:V4HI
8218             (vec_concat:V2HI
8219               (plus:HI
8220                 (vec_select:HI
8221                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")
8222                   (parallel [(const_int 0)]))
8223                 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8224               (plus:HI
8225                 (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8226                 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
8227             (vec_concat:V2HI
8228               (plus:HI
8229                 (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
8230                 (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
8231               (plus:HI
8232                 (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
8233                 (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))))]
8234   "TARGET_AVX"
8235   "vphaddw\t{%2, %1, %0|%0, %1, %2}"
8236   [(set_attr "type" "sseiadd")
8237    (set_attr "prefix_extra" "1")
8238    (set_attr "prefix" "vex")
8239    (set_attr "mode" "TI")])
8241 (define_insn "ssse3_phaddwv8hi3"
8242   [(set (match_operand:V8HI 0 "register_operand" "=x")
8243         (vec_concat:V8HI
8244           (vec_concat:V4HI
8245             (vec_concat:V2HI
8246               (plus:HI
8247                 (vec_select:HI
8248                   (match_operand:V8HI 1 "register_operand" "0")
8249                   (parallel [(const_int 0)]))
8250                 (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8251               (plus:HI
8252                 (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8253                 (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8254             (vec_concat:V2HI
8255               (plus:HI
8256                 (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
8257                 (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
8258               (plus:HI
8259                 (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
8260                 (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
8261           (vec_concat:V4HI
8262             (vec_concat:V2HI
8263               (plus:HI
8264                 (vec_select:HI
8265                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")
8266                   (parallel [(const_int 0)]))
8267                 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8268               (plus:HI
8269                 (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8270                 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
8271             (vec_concat:V2HI
8272               (plus:HI
8273                 (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
8274                 (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
8275               (plus:HI
8276                 (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
8277                 (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))))]
8278   "TARGET_SSSE3"
8279   "phaddw\t{%2, %0|%0, %2}"
8280   [(set_attr "type" "sseiadd")
8281    (set_attr "atom_unit" "complex")
8282    (set_attr "prefix_data16" "1")
8283    (set_attr "prefix_extra" "1")
8284    (set_attr "mode" "TI")])
8286 (define_insn "ssse3_phaddwv4hi3"
8287   [(set (match_operand:V4HI 0 "register_operand" "=y")
8288         (vec_concat:V4HI
8289           (vec_concat:V2HI
8290             (plus:HI
8291               (vec_select:HI
8292                 (match_operand:V4HI 1 "register_operand" "0")
8293                 (parallel [(const_int 0)]))
8294               (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8295             (plus:HI
8296               (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8297               (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8298           (vec_concat:V2HI
8299             (plus:HI
8300               (vec_select:HI
8301                 (match_operand:V4HI 2 "nonimmediate_operand" "ym")
8302                 (parallel [(const_int 0)]))
8303               (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8304             (plus:HI
8305               (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8306               (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))))]
8307   "TARGET_SSSE3"
8308   "phaddw\t{%2, %0|%0, %2}"
8309   [(set_attr "type" "sseiadd")
8310    (set_attr "atom_unit" "complex")
8311    (set_attr "prefix_extra" "1")
8312    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
8313    (set_attr "mode" "DI")])
8315 (define_insn "*avx_phadddv4si3"
8316   [(set (match_operand:V4SI 0 "register_operand" "=x")
8317         (vec_concat:V4SI
8318           (vec_concat:V2SI
8319             (plus:SI
8320               (vec_select:SI
8321                 (match_operand:V4SI 1 "register_operand" "x")
8322                 (parallel [(const_int 0)]))
8323               (vec_select:SI (match_dup 1) (parallel [(const_int 1)])))
8324             (plus:SI
8325               (vec_select:SI (match_dup 1) (parallel [(const_int 2)]))
8326               (vec_select:SI (match_dup 1) (parallel [(const_int 3)]))))
8327           (vec_concat:V2SI
8328             (plus:SI
8329               (vec_select:SI
8330                 (match_operand:V4SI 2 "nonimmediate_operand" "xm")
8331                 (parallel [(const_int 0)]))
8332               (vec_select:SI (match_dup 2) (parallel [(const_int 1)])))
8333             (plus:SI
8334               (vec_select:SI (match_dup 2) (parallel [(const_int 2)]))
8335               (vec_select:SI (match_dup 2) (parallel [(const_int 3)]))))))]
8336   "TARGET_AVX"
8337   "vphaddd\t{%2, %1, %0|%0, %1, %2}"
8338   [(set_attr "type" "sseiadd")
8339    (set_attr "prefix_extra" "1")
8340    (set_attr "prefix" "vex")
8341    (set_attr "mode" "TI")])
8343 (define_insn "ssse3_phadddv4si3"
8344   [(set (match_operand:V4SI 0 "register_operand" "=x")
8345         (vec_concat:V4SI
8346           (vec_concat:V2SI
8347             (plus:SI
8348               (vec_select:SI
8349                 (match_operand:V4SI 1 "register_operand" "0")
8350                 (parallel [(const_int 0)]))
8351               (vec_select:SI (match_dup 1) (parallel [(const_int 1)])))
8352             (plus:SI
8353               (vec_select:SI (match_dup 1) (parallel [(const_int 2)]))
8354               (vec_select:SI (match_dup 1) (parallel [(const_int 3)]))))
8355           (vec_concat:V2SI
8356             (plus:SI
8357               (vec_select:SI
8358                 (match_operand:V4SI 2 "nonimmediate_operand" "xm")
8359                 (parallel [(const_int 0)]))
8360               (vec_select:SI (match_dup 2) (parallel [(const_int 1)])))
8361             (plus:SI
8362               (vec_select:SI (match_dup 2) (parallel [(const_int 2)]))
8363               (vec_select:SI (match_dup 2) (parallel [(const_int 3)]))))))]
8364   "TARGET_SSSE3"
8365   "phaddd\t{%2, %0|%0, %2}"
8366   [(set_attr "type" "sseiadd")
8367    (set_attr "atom_unit" "complex")
8368    (set_attr "prefix_data16" "1")
8369    (set_attr "prefix_extra" "1")
8370    (set_attr "mode" "TI")])
8372 (define_insn "ssse3_phadddv2si3"
8373   [(set (match_operand:V2SI 0 "register_operand" "=y")
8374         (vec_concat:V2SI
8375           (plus:SI
8376             (vec_select:SI
8377               (match_operand:V2SI 1 "register_operand" "0")
8378               (parallel [(const_int 0)]))
8379             (vec_select:SI (match_dup 1) (parallel [(const_int 1)])))
8380           (plus:SI
8381             (vec_select:SI
8382               (match_operand:V2SI 2 "nonimmediate_operand" "ym")
8383               (parallel [(const_int 0)]))
8384             (vec_select:SI (match_dup 2) (parallel [(const_int 1)])))))]
8385   "TARGET_SSSE3"
8386   "phaddd\t{%2, %0|%0, %2}"
8387   [(set_attr "type" "sseiadd")
8388    (set_attr "atom_unit" "complex")
8389    (set_attr "prefix_extra" "1")
8390    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
8391    (set_attr "mode" "DI")])
8393 (define_insn "*avx_phaddswv8hi3"
8394   [(set (match_operand:V8HI 0 "register_operand" "=x")
8395         (vec_concat:V8HI
8396           (vec_concat:V4HI
8397             (vec_concat:V2HI
8398               (ss_plus:HI
8399                 (vec_select:HI
8400                   (match_operand:V8HI 1 "register_operand" "x")
8401                   (parallel [(const_int 0)]))
8402                 (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8403               (ss_plus:HI
8404                 (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8405                 (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8406             (vec_concat:V2HI
8407               (ss_plus:HI
8408                 (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
8409                 (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
8410               (ss_plus:HI
8411                 (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
8412                 (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
8413           (vec_concat:V4HI
8414             (vec_concat:V2HI
8415               (ss_plus:HI
8416                 (vec_select:HI
8417                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")
8418                   (parallel [(const_int 0)]))
8419                 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8420               (ss_plus:HI
8421                 (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8422                 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
8423             (vec_concat:V2HI
8424               (ss_plus:HI
8425                 (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
8426                 (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
8427               (ss_plus:HI
8428                 (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
8429                 (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))))]
8430   "TARGET_AVX"
8431   "vphaddsw\t{%2, %1, %0|%0, %1, %2}"
8432   [(set_attr "type" "sseiadd")
8433    (set_attr "prefix_extra" "1")
8434    (set_attr "prefix" "vex")
8435    (set_attr "mode" "TI")])
8437 (define_insn "ssse3_phaddswv8hi3"
8438   [(set (match_operand:V8HI 0 "register_operand" "=x")
8439         (vec_concat:V8HI
8440           (vec_concat:V4HI
8441             (vec_concat:V2HI
8442               (ss_plus:HI
8443                 (vec_select:HI
8444                   (match_operand:V8HI 1 "register_operand" "0")
8445                   (parallel [(const_int 0)]))
8446                 (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8447               (ss_plus:HI
8448                 (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8449                 (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8450             (vec_concat:V2HI
8451               (ss_plus:HI
8452                 (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
8453                 (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
8454               (ss_plus:HI
8455                 (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
8456                 (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
8457           (vec_concat:V4HI
8458             (vec_concat:V2HI
8459               (ss_plus:HI
8460                 (vec_select:HI
8461                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")
8462                   (parallel [(const_int 0)]))
8463                 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8464               (ss_plus:HI
8465                 (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8466                 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
8467             (vec_concat:V2HI
8468               (ss_plus:HI
8469                 (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
8470                 (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
8471               (ss_plus:HI
8472                 (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
8473                 (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))))]
8474   "TARGET_SSSE3"
8475   "phaddsw\t{%2, %0|%0, %2}"
8476   [(set_attr "type" "sseiadd")
8477    (set_attr "atom_unit" "complex")
8478    (set_attr "prefix_data16" "1")
8479    (set_attr "prefix_extra" "1")
8480    (set_attr "mode" "TI")])
8482 (define_insn "ssse3_phaddswv4hi3"
8483   [(set (match_operand:V4HI 0 "register_operand" "=y")
8484         (vec_concat:V4HI
8485           (vec_concat:V2HI
8486             (ss_plus:HI
8487               (vec_select:HI
8488                 (match_operand:V4HI 1 "register_operand" "0")
8489                 (parallel [(const_int 0)]))
8490               (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8491             (ss_plus:HI
8492               (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8493               (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8494           (vec_concat:V2HI
8495             (ss_plus:HI
8496               (vec_select:HI
8497                 (match_operand:V4HI 2 "nonimmediate_operand" "ym")
8498                 (parallel [(const_int 0)]))
8499               (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8500             (ss_plus:HI
8501               (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8502               (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))))]
8503   "TARGET_SSSE3"
8504   "phaddsw\t{%2, %0|%0, %2}"
8505   [(set_attr "type" "sseiadd")
8506    (set_attr "atom_unit" "complex")
8507    (set_attr "prefix_extra" "1")
8508    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
8509    (set_attr "mode" "DI")])
8511 (define_insn "*avx_phsubwv8hi3"
8512   [(set (match_operand:V8HI 0 "register_operand" "=x")
8513         (vec_concat:V8HI
8514           (vec_concat:V4HI
8515             (vec_concat:V2HI
8516               (minus:HI
8517                 (vec_select:HI
8518                   (match_operand:V8HI 1 "register_operand" "x")
8519                   (parallel [(const_int 0)]))
8520                 (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8521               (minus:HI
8522                 (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8523                 (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8524             (vec_concat:V2HI
8525               (minus:HI
8526                 (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
8527                 (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
8528               (minus:HI
8529                 (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
8530                 (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
8531           (vec_concat:V4HI
8532             (vec_concat:V2HI
8533               (minus:HI
8534                 (vec_select:HI
8535                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")
8536                   (parallel [(const_int 0)]))
8537                 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8538               (minus:HI
8539                 (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8540                 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
8541             (vec_concat:V2HI
8542               (minus:HI
8543                 (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
8544                 (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
8545               (minus:HI
8546                 (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
8547                 (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))))]
8548   "TARGET_AVX"
8549   "vphsubw\t{%2, %1, %0|%0, %1, %2}"
8550   [(set_attr "type" "sseiadd")
8551    (set_attr "prefix_extra" "1")
8552    (set_attr "prefix" "vex")
8553    (set_attr "mode" "TI")])
8555 (define_insn "ssse3_phsubwv8hi3"
8556   [(set (match_operand:V8HI 0 "register_operand" "=x")
8557         (vec_concat:V8HI
8558           (vec_concat:V4HI
8559             (vec_concat:V2HI
8560               (minus:HI
8561                 (vec_select:HI
8562                   (match_operand:V8HI 1 "register_operand" "0")
8563                   (parallel [(const_int 0)]))
8564                 (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8565               (minus:HI
8566                 (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8567                 (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8568             (vec_concat:V2HI
8569               (minus:HI
8570                 (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
8571                 (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
8572               (minus:HI
8573                 (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
8574                 (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
8575           (vec_concat:V4HI
8576             (vec_concat:V2HI
8577               (minus:HI
8578                 (vec_select:HI
8579                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")
8580                   (parallel [(const_int 0)]))
8581                 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8582               (minus:HI
8583                 (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8584                 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
8585             (vec_concat:V2HI
8586               (minus:HI
8587                 (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
8588                 (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
8589               (minus:HI
8590                 (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
8591                 (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))))]
8592   "TARGET_SSSE3"
8593   "phsubw\t{%2, %0|%0, %2}"
8594   [(set_attr "type" "sseiadd")
8595    (set_attr "atom_unit" "complex")
8596    (set_attr "prefix_data16" "1")
8597    (set_attr "prefix_extra" "1")
8598    (set_attr "mode" "TI")])
8600 (define_insn "ssse3_phsubwv4hi3"
8601   [(set (match_operand:V4HI 0 "register_operand" "=y")
8602         (vec_concat:V4HI
8603           (vec_concat:V2HI
8604             (minus:HI
8605               (vec_select:HI
8606                 (match_operand:V4HI 1 "register_operand" "0")
8607                 (parallel [(const_int 0)]))
8608               (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8609             (minus:HI
8610               (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8611               (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8612           (vec_concat:V2HI
8613             (minus:HI
8614               (vec_select:HI
8615                 (match_operand:V4HI 2 "nonimmediate_operand" "ym")
8616                 (parallel [(const_int 0)]))
8617               (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8618             (minus:HI
8619               (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8620               (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))))]
8621   "TARGET_SSSE3"
8622   "phsubw\t{%2, %0|%0, %2}"
8623   [(set_attr "type" "sseiadd")
8624    (set_attr "atom_unit" "complex")
8625    (set_attr "prefix_extra" "1")
8626    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
8627    (set_attr "mode" "DI")])
8629 (define_insn "*avx_phsubdv4si3"
8630   [(set (match_operand:V4SI 0 "register_operand" "=x")
8631         (vec_concat:V4SI
8632           (vec_concat:V2SI
8633             (minus:SI
8634               (vec_select:SI
8635                 (match_operand:V4SI 1 "register_operand" "x")
8636                 (parallel [(const_int 0)]))
8637               (vec_select:SI (match_dup 1) (parallel [(const_int 1)])))
8638             (minus:SI
8639               (vec_select:SI (match_dup 1) (parallel [(const_int 2)]))
8640               (vec_select:SI (match_dup 1) (parallel [(const_int 3)]))))
8641           (vec_concat:V2SI
8642             (minus:SI
8643               (vec_select:SI
8644                 (match_operand:V4SI 2 "nonimmediate_operand" "xm")
8645                 (parallel [(const_int 0)]))
8646               (vec_select:SI (match_dup 2) (parallel [(const_int 1)])))
8647             (minus:SI
8648               (vec_select:SI (match_dup 2) (parallel [(const_int 2)]))
8649               (vec_select:SI (match_dup 2) (parallel [(const_int 3)]))))))]
8650   "TARGET_AVX"
8651   "vphsubd\t{%2, %1, %0|%0, %1, %2}"
8652   [(set_attr "type" "sseiadd")
8653    (set_attr "prefix_extra" "1")
8654    (set_attr "prefix" "vex")
8655    (set_attr "mode" "TI")])
8657 (define_insn "ssse3_phsubdv4si3"
8658   [(set (match_operand:V4SI 0 "register_operand" "=x")
8659         (vec_concat:V4SI
8660           (vec_concat:V2SI
8661             (minus:SI
8662               (vec_select:SI
8663                 (match_operand:V4SI 1 "register_operand" "0")
8664                 (parallel [(const_int 0)]))
8665               (vec_select:SI (match_dup 1) (parallel [(const_int 1)])))
8666             (minus:SI
8667               (vec_select:SI (match_dup 1) (parallel [(const_int 2)]))
8668               (vec_select:SI (match_dup 1) (parallel [(const_int 3)]))))
8669           (vec_concat:V2SI
8670             (minus:SI
8671               (vec_select:SI
8672                 (match_operand:V4SI 2 "nonimmediate_operand" "xm")
8673                 (parallel [(const_int 0)]))
8674               (vec_select:SI (match_dup 2) (parallel [(const_int 1)])))
8675             (minus:SI
8676               (vec_select:SI (match_dup 2) (parallel [(const_int 2)]))
8677               (vec_select:SI (match_dup 2) (parallel [(const_int 3)]))))))]
8678   "TARGET_SSSE3"
8679   "phsubd\t{%2, %0|%0, %2}"
8680   [(set_attr "type" "sseiadd")
8681    (set_attr "atom_unit" "complex")
8682    (set_attr "prefix_data16" "1")
8683    (set_attr "prefix_extra" "1")
8684    (set_attr "mode" "TI")])
8686 (define_insn "ssse3_phsubdv2si3"
8687   [(set (match_operand:V2SI 0 "register_operand" "=y")
8688         (vec_concat:V2SI
8689           (minus:SI
8690             (vec_select:SI
8691               (match_operand:V2SI 1 "register_operand" "0")
8692               (parallel [(const_int 0)]))
8693             (vec_select:SI (match_dup 1) (parallel [(const_int 1)])))
8694           (minus:SI
8695             (vec_select:SI
8696               (match_operand:V2SI 2 "nonimmediate_operand" "ym")
8697               (parallel [(const_int 0)]))
8698             (vec_select:SI (match_dup 2) (parallel [(const_int 1)])))))]
8699   "TARGET_SSSE3"
8700   "phsubd\t{%2, %0|%0, %2}"
8701   [(set_attr "type" "sseiadd")
8702    (set_attr "atom_unit" "complex")
8703    (set_attr "prefix_extra" "1")
8704    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
8705    (set_attr "mode" "DI")])
8707 (define_insn "*avx_phsubswv8hi3"
8708   [(set (match_operand:V8HI 0 "register_operand" "=x")
8709         (vec_concat:V8HI
8710           (vec_concat:V4HI
8711             (vec_concat:V2HI
8712               (ss_minus:HI
8713                 (vec_select:HI
8714                   (match_operand:V8HI 1 "register_operand" "x")
8715                   (parallel [(const_int 0)]))
8716                 (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8717               (ss_minus:HI
8718                 (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8719                 (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8720             (vec_concat:V2HI
8721               (ss_minus:HI
8722                 (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
8723                 (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
8724               (ss_minus:HI
8725                 (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
8726                 (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
8727           (vec_concat:V4HI
8728             (vec_concat:V2HI
8729               (ss_minus:HI
8730                 (vec_select:HI
8731                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")
8732                   (parallel [(const_int 0)]))
8733                 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8734               (ss_minus:HI
8735                 (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8736                 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
8737             (vec_concat:V2HI
8738               (ss_minus:HI
8739                 (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
8740                 (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
8741               (ss_minus:HI
8742                 (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
8743                 (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))))]
8744   "TARGET_AVX"
8745   "vphsubsw\t{%2, %1, %0|%0, %1, %2}"
8746   [(set_attr "type" "sseiadd")
8747    (set_attr "prefix_extra" "1")
8748    (set_attr "prefix" "vex")
8749    (set_attr "mode" "TI")])
8751 (define_insn "ssse3_phsubswv8hi3"
8752   [(set (match_operand:V8HI 0 "register_operand" "=x")
8753         (vec_concat:V8HI
8754           (vec_concat:V4HI
8755             (vec_concat:V2HI
8756               (ss_minus:HI
8757                 (vec_select:HI
8758                   (match_operand:V8HI 1 "register_operand" "0")
8759                   (parallel [(const_int 0)]))
8760                 (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8761               (ss_minus:HI
8762                 (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8763                 (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8764             (vec_concat:V2HI
8765               (ss_minus:HI
8766                 (vec_select:HI (match_dup 1) (parallel [(const_int 4)]))
8767                 (vec_select:HI (match_dup 1) (parallel [(const_int 5)])))
8768               (ss_minus:HI
8769                 (vec_select:HI (match_dup 1) (parallel [(const_int 6)]))
8770                 (vec_select:HI (match_dup 1) (parallel [(const_int 7)])))))
8771           (vec_concat:V4HI
8772             (vec_concat:V2HI
8773               (ss_minus:HI
8774                 (vec_select:HI
8775                   (match_operand:V8HI 2 "nonimmediate_operand" "xm")
8776                   (parallel [(const_int 0)]))
8777                 (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8778               (ss_minus:HI
8779                 (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8780                 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
8781             (vec_concat:V2HI
8782               (ss_minus:HI
8783                 (vec_select:HI (match_dup 2) (parallel [(const_int 4)]))
8784                 (vec_select:HI (match_dup 2) (parallel [(const_int 5)])))
8785               (ss_minus:HI
8786                 (vec_select:HI (match_dup 2) (parallel [(const_int 6)]))
8787                 (vec_select:HI (match_dup 2) (parallel [(const_int 7)])))))))]
8788   "TARGET_SSSE3"
8789   "phsubsw\t{%2, %0|%0, %2}"
8790   [(set_attr "type" "sseiadd")
8791    (set_attr "atom_unit" "complex")
8792    (set_attr "prefix_data16" "1")
8793    (set_attr "prefix_extra" "1")
8794    (set_attr "mode" "TI")])
8796 (define_insn "ssse3_phsubswv4hi3"
8797   [(set (match_operand:V4HI 0 "register_operand" "=y")
8798         (vec_concat:V4HI
8799           (vec_concat:V2HI
8800             (ss_minus:HI
8801               (vec_select:HI
8802                 (match_operand:V4HI 1 "register_operand" "0")
8803                 (parallel [(const_int 0)]))
8804               (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
8805             (ss_minus:HI
8806               (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
8807               (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))))
8808           (vec_concat:V2HI
8809             (ss_minus:HI
8810               (vec_select:HI
8811                 (match_operand:V4HI 2 "nonimmediate_operand" "ym")
8812                 (parallel [(const_int 0)]))
8813               (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))
8814             (ss_minus:HI
8815               (vec_select:HI (match_dup 2) (parallel [(const_int 2)]))
8816               (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))))]
8817   "TARGET_SSSE3"
8818   "phsubsw\t{%2, %0|%0, %2}"
8819   [(set_attr "type" "sseiadd")
8820    (set_attr "atom_unit" "complex")
8821    (set_attr "prefix_extra" "1")
8822    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
8823    (set_attr "mode" "DI")])
8825 (define_insn "*avx_pmaddubsw128"
8826   [(set (match_operand:V8HI 0 "register_operand" "=x")
8827         (ss_plus:V8HI
8828           (mult:V8HI
8829             (zero_extend:V8HI
8830               (vec_select:V4QI
8831                 (match_operand:V16QI 1 "register_operand" "x")
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             (sign_extend:V8HI
8841               (vec_select:V8QI
8842                 (match_operand:V16QI 2 "nonimmediate_operand" "xm")
8843                 (parallel [(const_int 0)
8844                            (const_int 2)
8845                            (const_int 4)
8846                            (const_int 6)
8847                            (const_int 8)
8848                            (const_int 10)
8849                            (const_int 12)
8850                            (const_int 14)]))))
8851           (mult:V8HI
8852             (zero_extend:V8HI
8853               (vec_select:V16QI (match_dup 1)
8854                 (parallel [(const_int 1)
8855                            (const_int 3)
8856                            (const_int 5)
8857                            (const_int 7)
8858                            (const_int 9)
8859                            (const_int 11)
8860                            (const_int 13)
8861                            (const_int 15)])))
8862             (sign_extend:V8HI
8863               (vec_select:V16QI (match_dup 2)
8864                 (parallel [(const_int 1)
8865                            (const_int 3)
8866                            (const_int 5)
8867                            (const_int 7)
8868                            (const_int 9)
8869                            (const_int 11)
8870                            (const_int 13)
8871                            (const_int 15)]))))))]
8872   "TARGET_AVX"
8873   "vpmaddubsw\t{%2, %1, %0|%0, %1, %2}"
8874   [(set_attr "type" "sseiadd")
8875    (set_attr "prefix_extra" "1")
8876    (set_attr "prefix" "vex")
8877    (set_attr "mode" "TI")])
8879 (define_insn "ssse3_pmaddubsw128"
8880   [(set (match_operand:V8HI 0 "register_operand" "=x")
8881         (ss_plus:V8HI
8882           (mult:V8HI
8883             (zero_extend:V8HI
8884               (vec_select:V4QI
8885                 (match_operand:V16QI 1 "register_operand" "0")
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             (sign_extend:V8HI
8895               (vec_select:V8QI
8896                 (match_operand:V16QI 2 "nonimmediate_operand" "xm")
8897                 (parallel [(const_int 0)
8898                            (const_int 2)
8899                            (const_int 4)
8900                            (const_int 6)
8901                            (const_int 8)
8902                            (const_int 10)
8903                            (const_int 12)
8904                            (const_int 14)]))))
8905           (mult:V8HI
8906             (zero_extend:V8HI
8907               (vec_select:V16QI (match_dup 1)
8908                 (parallel [(const_int 1)
8909                            (const_int 3)
8910                            (const_int 5)
8911                            (const_int 7)
8912                            (const_int 9)
8913                            (const_int 11)
8914                            (const_int 13)
8915                            (const_int 15)])))
8916             (sign_extend:V8HI
8917               (vec_select:V16QI (match_dup 2)
8918                 (parallel [(const_int 1)
8919                            (const_int 3)
8920                            (const_int 5)
8921                            (const_int 7)
8922                            (const_int 9)
8923                            (const_int 11)
8924                            (const_int 13)
8925                            (const_int 15)]))))))]
8926   "TARGET_SSSE3"
8927   "pmaddubsw\t{%2, %0|%0, %2}"
8928   [(set_attr "type" "sseiadd")
8929    (set_attr "atom_unit" "simul")
8930    (set_attr "prefix_data16" "1")
8931    (set_attr "prefix_extra" "1")
8932    (set_attr "mode" "TI")])
8934 (define_insn "ssse3_pmaddubsw"
8935   [(set (match_operand:V4HI 0 "register_operand" "=y")
8936         (ss_plus:V4HI
8937           (mult:V4HI
8938             (zero_extend:V4HI
8939               (vec_select:V4QI
8940                 (match_operand:V8QI 1 "register_operand" "0")
8941                 (parallel [(const_int 0)
8942                            (const_int 2)
8943                            (const_int 4)
8944                            (const_int 6)])))
8945             (sign_extend:V4HI
8946               (vec_select:V4QI
8947                 (match_operand:V8QI 2 "nonimmediate_operand" "ym")
8948                 (parallel [(const_int 0)
8949                            (const_int 2)
8950                            (const_int 4)
8951                            (const_int 6)]))))
8952           (mult:V4HI
8953             (zero_extend:V4HI
8954               (vec_select:V8QI (match_dup 1)
8955                 (parallel [(const_int 1)
8956                            (const_int 3)
8957                            (const_int 5)
8958                            (const_int 7)])))
8959             (sign_extend:V4HI
8960               (vec_select:V8QI (match_dup 2)
8961                 (parallel [(const_int 1)
8962                            (const_int 3)
8963                            (const_int 5)
8964                            (const_int 7)]))))))]
8965   "TARGET_SSSE3"
8966   "pmaddubsw\t{%2, %0|%0, %2}"
8967   [(set_attr "type" "sseiadd")
8968    (set_attr "atom_unit" "simul")
8969    (set_attr "prefix_extra" "1")
8970    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
8971    (set_attr "mode" "DI")])
8973 (define_expand "ssse3_pmulhrswv8hi3"
8974   [(set (match_operand:V8HI 0 "register_operand" "")
8975         (truncate:V8HI
8976           (lshiftrt:V8SI
8977             (plus:V8SI
8978               (lshiftrt:V8SI
8979                 (mult:V8SI
8980                   (sign_extend:V8SI
8981                     (match_operand:V8HI 1 "nonimmediate_operand" ""))
8982                   (sign_extend:V8SI
8983                     (match_operand:V8HI 2 "nonimmediate_operand" "")))
8984                 (const_int 14))
8985               (const_vector:V8HI [(const_int 1) (const_int 1)
8986                                   (const_int 1) (const_int 1)
8987                                   (const_int 1) (const_int 1)
8988                                   (const_int 1) (const_int 1)]))
8989             (const_int 1))))]
8990   "TARGET_SSSE3"
8991   "ix86_fixup_binary_operands_no_copy (MULT, V8HImode, operands);")
8993 (define_insn "*avx_pmulhrswv8hi3"
8994   [(set (match_operand:V8HI 0 "register_operand" "=x")
8995         (truncate:V8HI
8996           (lshiftrt:V8SI
8997             (plus:V8SI
8998               (lshiftrt:V8SI
8999                 (mult:V8SI
9000                   (sign_extend:V8SI
9001                     (match_operand:V8HI 1 "nonimmediate_operand" "%x"))
9002                   (sign_extend:V8SI
9003                     (match_operand:V8HI 2 "nonimmediate_operand" "xm")))
9004                 (const_int 14))
9005               (const_vector:V8HI [(const_int 1) (const_int 1)
9006                                   (const_int 1) (const_int 1)
9007                                   (const_int 1) (const_int 1)
9008                                   (const_int 1) (const_int 1)]))
9009             (const_int 1))))]
9010   "TARGET_AVX && ix86_binary_operator_ok (MULT, V8HImode, operands)"
9011   "vpmulhrsw\t{%2, %1, %0|%0, %1, %2}"
9012   [(set_attr "type" "sseimul")
9013    (set_attr "prefix_extra" "1")
9014    (set_attr "prefix" "vex")
9015    (set_attr "mode" "TI")])
9017 (define_insn "*ssse3_pmulhrswv8hi3"
9018   [(set (match_operand:V8HI 0 "register_operand" "=x")
9019         (truncate:V8HI
9020           (lshiftrt:V8SI
9021             (plus:V8SI
9022               (lshiftrt:V8SI
9023                 (mult:V8SI
9024                   (sign_extend:V8SI
9025                     (match_operand:V8HI 1 "nonimmediate_operand" "%0"))
9026                   (sign_extend:V8SI
9027                     (match_operand:V8HI 2 "nonimmediate_operand" "xm")))
9028                 (const_int 14))
9029               (const_vector:V8HI [(const_int 1) (const_int 1)
9030                                   (const_int 1) (const_int 1)
9031                                   (const_int 1) (const_int 1)
9032                                   (const_int 1) (const_int 1)]))
9033             (const_int 1))))]
9034   "TARGET_SSSE3 && ix86_binary_operator_ok (MULT, V8HImode, operands)"
9035   "pmulhrsw\t{%2, %0|%0, %2}"
9036   [(set_attr "type" "sseimul")
9037    (set_attr "prefix_data16" "1")
9038    (set_attr "prefix_extra" "1")
9039    (set_attr "mode" "TI")])
9041 (define_expand "ssse3_pmulhrswv4hi3"
9042   [(set (match_operand:V4HI 0 "register_operand" "")
9043         (truncate:V4HI
9044           (lshiftrt:V4SI
9045             (plus:V4SI
9046               (lshiftrt:V4SI
9047                 (mult:V4SI
9048                   (sign_extend:V4SI
9049                     (match_operand:V4HI 1 "nonimmediate_operand" ""))
9050                   (sign_extend:V4SI
9051                     (match_operand:V4HI 2 "nonimmediate_operand" "")))
9052                 (const_int 14))
9053               (const_vector:V4HI [(const_int 1) (const_int 1)
9054                                   (const_int 1) (const_int 1)]))
9055             (const_int 1))))]
9056   "TARGET_SSSE3"
9057   "ix86_fixup_binary_operands_no_copy (MULT, V4HImode, operands);")
9059 (define_insn "*ssse3_pmulhrswv4hi3"
9060   [(set (match_operand:V4HI 0 "register_operand" "=y")
9061         (truncate:V4HI
9062           (lshiftrt:V4SI
9063             (plus:V4SI
9064               (lshiftrt:V4SI
9065                 (mult:V4SI
9066                   (sign_extend:V4SI
9067                     (match_operand:V4HI 1 "nonimmediate_operand" "%0"))
9068                   (sign_extend:V4SI
9069                     (match_operand:V4HI 2 "nonimmediate_operand" "ym")))
9070                 (const_int 14))
9071               (const_vector:V4HI [(const_int 1) (const_int 1)
9072                                   (const_int 1) (const_int 1)]))
9073             (const_int 1))))]
9074   "TARGET_SSSE3 && ix86_binary_operator_ok (MULT, V4HImode, operands)"
9075   "pmulhrsw\t{%2, %0|%0, %2}"
9076   [(set_attr "type" "sseimul")
9077    (set_attr "prefix_extra" "1")
9078    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
9079    (set_attr "mode" "DI")])
9081 (define_insn "*avx_pshufbv16qi3"
9082   [(set (match_operand:V16QI 0 "register_operand" "=x")
9083         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "x")
9084                        (match_operand:V16QI 2 "nonimmediate_operand" "xm")]
9085                       UNSPEC_PSHUFB))]
9086   "TARGET_AVX"
9087   "vpshufb\t{%2, %1, %0|%0, %1, %2}";
9088   [(set_attr "type" "sselog1")
9089    (set_attr "prefix_extra" "1")
9090    (set_attr "prefix" "vex")
9091    (set_attr "mode" "TI")])
9093 (define_insn "ssse3_pshufbv16qi3"
9094   [(set (match_operand:V16QI 0 "register_operand" "=x")
9095         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "0")
9096                        (match_operand:V16QI 2 "nonimmediate_operand" "xm")]
9097                       UNSPEC_PSHUFB))]
9098   "TARGET_SSSE3"
9099   "pshufb\t{%2, %0|%0, %2}";
9100   [(set_attr "type" "sselog1")
9101    (set_attr "prefix_data16" "1")
9102    (set_attr "prefix_extra" "1")
9103    (set_attr "mode" "TI")])
9105 (define_insn "ssse3_pshufbv8qi3"
9106   [(set (match_operand:V8QI 0 "register_operand" "=y")
9107         (unspec:V8QI [(match_operand:V8QI 1 "register_operand" "0")
9108                       (match_operand:V8QI 2 "nonimmediate_operand" "ym")]
9109                      UNSPEC_PSHUFB))]
9110   "TARGET_SSSE3"
9111   "pshufb\t{%2, %0|%0, %2}";
9112   [(set_attr "type" "sselog1")
9113    (set_attr "prefix_extra" "1")
9114    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
9115    (set_attr "mode" "DI")])
9117 (define_insn "*avx_psign<mode>3"
9118   [(set (match_operand:SSEMODE124 0 "register_operand" "=x")
9119         (unspec:SSEMODE124
9120           [(match_operand:SSEMODE124 1 "register_operand" "x")
9121            (match_operand:SSEMODE124 2 "nonimmediate_operand" "xm")]
9122           UNSPEC_PSIGN))]
9123   "TARGET_AVX"
9124   "vpsign<ssevecsize>\t{%2, %1, %0|%0, %1, %2}";
9125   [(set_attr "type" "sselog1")
9126    (set_attr "prefix_extra" "1")
9127    (set_attr "prefix" "vex")
9128    (set_attr "mode" "TI")])
9130 (define_insn "ssse3_psign<mode>3"
9131   [(set (match_operand:SSEMODE124 0 "register_operand" "=x")
9132         (unspec:SSEMODE124
9133           [(match_operand:SSEMODE124 1 "register_operand" "0")
9134            (match_operand:SSEMODE124 2 "nonimmediate_operand" "xm")]
9135           UNSPEC_PSIGN))]
9136   "TARGET_SSSE3"
9137   "psign<ssevecsize>\t{%2, %0|%0, %2}";
9138   [(set_attr "type" "sselog1")
9139    (set_attr "prefix_data16" "1")
9140    (set_attr "prefix_extra" "1")
9141    (set_attr "mode" "TI")])
9143 (define_insn "ssse3_psign<mode>3"
9144   [(set (match_operand:MMXMODEI 0 "register_operand" "=y")
9145         (unspec:MMXMODEI
9146           [(match_operand:MMXMODEI 1 "register_operand" "0")
9147            (match_operand:MMXMODEI 2 "nonimmediate_operand" "ym")]
9148           UNSPEC_PSIGN))]
9149   "TARGET_SSSE3"
9150   "psign<mmxvecsize>\t{%2, %0|%0, %2}";
9151   [(set_attr "type" "sselog1")
9152    (set_attr "prefix_extra" "1")
9153    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
9154    (set_attr "mode" "DI")])
9156 (define_insn "*avx_palignrti"
9157   [(set (match_operand:TI 0 "register_operand" "=x")
9158         (unspec:TI [(match_operand:TI 1 "register_operand" "x")
9159                     (match_operand:TI 2 "nonimmediate_operand" "xm")
9160                     (match_operand:SI 3 "const_0_to_255_mul_8_operand" "n")]
9161                    UNSPEC_PALIGNR))]
9162   "TARGET_AVX"
9164   operands[3] = GEN_INT (INTVAL (operands[3]) / 8);
9165   return "vpalignr\t{%3, %2, %1, %0|%0, %1, %2, %3}";
9167   [(set_attr "type" "sseishft")
9168    (set_attr "prefix_extra" "1")
9169    (set_attr "length_immediate" "1")
9170    (set_attr "prefix" "vex")
9171    (set_attr "mode" "TI")])
9173 (define_insn "ssse3_palignrti"
9174   [(set (match_operand:TI 0 "register_operand" "=x")
9175         (unspec:TI [(match_operand:TI 1 "register_operand" "0")
9176                     (match_operand:TI 2 "nonimmediate_operand" "xm")
9177                     (match_operand:SI 3 "const_0_to_255_mul_8_operand" "n")]
9178                    UNSPEC_PALIGNR))]
9179   "TARGET_SSSE3"
9181   operands[3] = GEN_INT (INTVAL (operands[3]) / 8);
9182   return "palignr\t{%3, %2, %0|%0, %2, %3}";
9184   [(set_attr "type" "sseishft")
9185    (set_attr "atom_unit" "sishuf")
9186    (set_attr "prefix_data16" "1")
9187    (set_attr "prefix_extra" "1")
9188    (set_attr "length_immediate" "1")
9189    (set_attr "mode" "TI")])
9191 (define_insn "ssse3_palignrdi"
9192   [(set (match_operand:DI 0 "register_operand" "=y")
9193         (unspec:DI [(match_operand:DI 1 "register_operand" "0")
9194                     (match_operand:DI 2 "nonimmediate_operand" "ym")
9195                     (match_operand:SI 3 "const_0_to_255_mul_8_operand" "n")]
9196                    UNSPEC_PALIGNR))]
9197   "TARGET_SSSE3"
9199   operands[3] = GEN_INT (INTVAL (operands[3]) / 8);
9200   return "palignr\t{%3, %2, %0|%0, %2, %3}";
9202   [(set_attr "type" "sseishft")
9203    (set_attr "atom_unit" "sishuf")
9204    (set_attr "prefix_extra" "1")
9205    (set_attr "length_immediate" "1")
9206    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
9207    (set_attr "mode" "DI")])
9209 (define_insn "abs<mode>2"
9210   [(set (match_operand:SSEMODE124 0 "register_operand" "=x")
9211         (abs:SSEMODE124 (match_operand:SSEMODE124 1 "nonimmediate_operand" "xm")))]
9212   "TARGET_SSSE3"
9213   "%vpabs<ssevecsize>\t{%1, %0|%0, %1}"
9214   [(set_attr "type" "sselog1")
9215    (set_attr "prefix_data16" "1")
9216    (set_attr "prefix_extra" "1")
9217    (set_attr "prefix" "maybe_vex")
9218    (set_attr "mode" "TI")])
9220 (define_insn "abs<mode>2"
9221   [(set (match_operand:MMXMODEI 0 "register_operand" "=y")
9222         (abs:MMXMODEI (match_operand:MMXMODEI 1 "nonimmediate_operand" "ym")))]
9223   "TARGET_SSSE3"
9224   "pabs<mmxvecsize>\t{%1, %0|%0, %1}";
9225   [(set_attr "type" "sselog1")
9226    (set_attr "prefix_rep" "0")
9227    (set_attr "prefix_extra" "1")
9228    (set (attr "prefix_rex") (symbol_ref "x86_extended_reg_mentioned_p (insn)"))
9229    (set_attr "mode" "DI")])
9231 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9233 ;; AMD SSE4A instructions
9235 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9237 (define_insn "sse4a_movnt<mode>"
9238   [(set (match_operand:MODEF 0 "memory_operand" "=m")
9239         (unspec:MODEF
9240           [(match_operand:MODEF 1 "register_operand" "x")]
9241           UNSPEC_MOVNT))]
9242   "TARGET_SSE4A"
9243   "movnts<ssemodefsuffix>\t{%1, %0|%0, %1}"
9244   [(set_attr "type" "ssemov")
9245    (set_attr "mode" "<MODE>")])
9247 (define_insn "sse4a_vmmovnt<mode>"
9248   [(set (match_operand:<ssescalarmode> 0 "memory_operand" "=m")
9249         (unspec:<ssescalarmode>
9250           [(vec_select:<ssescalarmode>
9251              (match_operand:SSEMODEF2P 1 "register_operand" "x")
9252              (parallel [(const_int 0)]))]
9253           UNSPEC_MOVNT))]
9254   "TARGET_SSE4A"
9255   "movnt<ssescalarmodesuffix>\t{%1, %0|%0, %1}"
9256   [(set_attr "type" "ssemov")
9257    (set_attr "mode" "<ssescalarmode>")])
9259 (define_insn "sse4a_extrqi"
9260   [(set (match_operand:V2DI 0 "register_operand" "=x")
9261         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
9262                       (match_operand 2 "const_int_operand" "")
9263                       (match_operand 3 "const_int_operand" "")]
9264                      UNSPEC_EXTRQI))]
9265   "TARGET_SSE4A"
9266   "extrq\t{%3, %2, %0|%0, %2, %3}"
9267   [(set_attr "type" "sse")
9268    (set_attr "prefix_data16" "1")
9269    (set_attr "length_immediate" "2")
9270    (set_attr "mode" "TI")])
9272 (define_insn "sse4a_extrq"
9273   [(set (match_operand:V2DI 0 "register_operand" "=x")
9274         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
9275                       (match_operand:V16QI 2 "register_operand" "x")]
9276                      UNSPEC_EXTRQ))]
9277   "TARGET_SSE4A"
9278   "extrq\t{%2, %0|%0, %2}"
9279   [(set_attr "type" "sse")
9280    (set_attr "prefix_data16" "1")
9281    (set_attr "mode" "TI")])
9283 (define_insn "sse4a_insertqi"
9284   [(set (match_operand:V2DI 0 "register_operand" "=x")
9285         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
9286                       (match_operand:V2DI 2 "register_operand" "x")
9287                       (match_operand 3 "const_int_operand" "")
9288                       (match_operand 4 "const_int_operand" "")]
9289                      UNSPEC_INSERTQI))]
9290   "TARGET_SSE4A"
9291   "insertq\t{%4, %3, %2, %0|%0, %2, %3, %4}"
9292   [(set_attr "type" "sseins")
9293    (set_attr "prefix_data16" "0")
9294    (set_attr "prefix_rep" "1")
9295    (set_attr "length_immediate" "2")
9296    (set_attr "mode" "TI")])
9298 (define_insn "sse4a_insertq"
9299   [(set (match_operand:V2DI 0 "register_operand" "=x")
9300         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
9301                       (match_operand:V2DI 2 "register_operand" "x")]
9302                      UNSPEC_INSERTQ))]
9303   "TARGET_SSE4A"
9304   "insertq\t{%2, %0|%0, %2}"
9305   [(set_attr "type" "sseins")
9306    (set_attr "prefix_data16" "0")
9307    (set_attr "prefix_rep" "1")
9308    (set_attr "mode" "TI")])
9310 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9312 ;; Intel SSE4.1 instructions
9314 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9316 (define_insn "avx_blend<ssemodesuffix><avxmodesuffix>"
9317   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
9318         (vec_merge:AVXMODEF2P
9319           (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")
9320           (match_operand:AVXMODEF2P 1 "register_operand" "x")
9321           (match_operand:SI 3 "const_0_to_<blendbits>_operand" "n")))]
9322   "TARGET_AVX"
9323   "vblend<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
9324   [(set_attr "type" "ssemov")
9325    (set_attr "prefix_extra" "1")
9326    (set_attr "length_immediate" "1")
9327    (set_attr "prefix" "vex")
9328    (set_attr "mode" "<avxvecmode>")])
9330 (define_insn "avx_blendv<ssemodesuffix><avxmodesuffix>"
9331   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
9332         (unspec:AVXMODEF2P
9333           [(match_operand:AVXMODEF2P 1 "register_operand" "x")
9334            (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")
9335            (match_operand:AVXMODEF2P 3 "register_operand" "x")]
9336           UNSPEC_BLENDV))]
9337   "TARGET_AVX"
9338   "vblendv<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
9339   [(set_attr "type" "ssemov")
9340    (set_attr "prefix_extra" "1")
9341    (set_attr "length_immediate" "1")
9342    (set_attr "prefix" "vex")
9343    (set_attr "mode" "<avxvecmode>")])
9345 (define_insn "sse4_1_blend<ssemodesuffix>"
9346   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
9347         (vec_merge:SSEMODEF2P
9348           (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")
9349           (match_operand:SSEMODEF2P 1 "register_operand" "0")
9350           (match_operand:SI 3 "const_0_to_<blendbits>_operand" "n")))]
9351   "TARGET_SSE4_1"
9352   "blend<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}"
9353   [(set_attr "type" "ssemov")
9354    (set_attr "prefix_data16" "1")
9355    (set_attr "prefix_extra" "1")
9356    (set_attr "length_immediate" "1")
9357    (set_attr "mode" "<MODE>")])
9359 (define_insn "sse4_1_blendv<ssemodesuffix>"
9360   [(set (match_operand:SSEMODEF2P 0 "reg_not_xmm0_operand" "=x")
9361         (unspec:SSEMODEF2P
9362           [(match_operand:SSEMODEF2P 1 "reg_not_xmm0_operand" "0")
9363            (match_operand:SSEMODEF2P 2 "nonimm_not_xmm0_operand" "xm")
9364            (match_operand:SSEMODEF2P 3 "register_operand" "Yz")]
9365           UNSPEC_BLENDV))]
9366   "TARGET_SSE4_1"
9367   "blendv<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}"
9368   [(set_attr "type" "ssemov")
9369    (set_attr "prefix_data16" "1")
9370    (set_attr "prefix_extra" "1")
9371    (set_attr "mode" "<MODE>")])
9373 (define_insn "avx_dp<ssemodesuffix><avxmodesuffix>"
9374   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
9375         (unspec:AVXMODEF2P
9376           [(match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x")
9377            (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")
9378            (match_operand:SI 3 "const_0_to_255_operand" "n")]
9379           UNSPEC_DP))]
9380   "TARGET_AVX"
9381   "vdp<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
9382   [(set_attr "type" "ssemul")
9383    (set_attr "prefix" "vex")
9384    (set_attr "prefix_extra" "1")
9385    (set_attr "length_immediate" "1")
9386    (set_attr "mode" "<avxvecmode>")])
9388 (define_insn "sse4_1_dp<ssemodesuffix>"
9389   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
9390         (unspec:SSEMODEF2P
9391           [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%0")
9392            (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")
9393            (match_operand:SI 3 "const_0_to_255_operand" "n")]
9394           UNSPEC_DP))]
9395   "TARGET_SSE4_1"
9396   "dp<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}"
9397   [(set_attr "type" "ssemul")
9398    (set_attr "prefix_data16" "1")
9399    (set_attr "prefix_extra" "1")
9400    (set_attr "length_immediate" "1")
9401    (set_attr "mode" "<MODE>")])
9403 (define_insn "sse4_1_movntdqa"
9404   [(set (match_operand:V2DI 0 "register_operand" "=x")
9405         (unspec:V2DI [(match_operand:V2DI 1 "memory_operand" "m")]
9406                      UNSPEC_MOVNTDQA))]
9407   "TARGET_SSE4_1"
9408   "%vmovntdqa\t{%1, %0|%0, %1}"
9409   [(set_attr "type" "ssemov")
9410    (set_attr "prefix_extra" "1")
9411    (set_attr "prefix" "maybe_vex")
9412    (set_attr "mode" "TI")])
9414 (define_insn "*avx_mpsadbw"
9415   [(set (match_operand:V16QI 0 "register_operand" "=x")
9416         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "x")
9417                        (match_operand:V16QI 2 "nonimmediate_operand" "xm")
9418                        (match_operand:SI 3 "const_0_to_255_operand" "n")]
9419                       UNSPEC_MPSADBW))]
9420   "TARGET_AVX"
9421   "vmpsadbw\t{%3, %2, %1, %0|%0, %1, %2, %3}"
9422   [(set_attr "type" "sselog1")
9423    (set_attr "prefix" "vex")
9424    (set_attr "prefix_extra" "1")
9425    (set_attr "length_immediate" "1")
9426    (set_attr "mode" "TI")])
9428 (define_insn "sse4_1_mpsadbw"
9429   [(set (match_operand:V16QI 0 "register_operand" "=x")
9430         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "0")
9431                        (match_operand:V16QI 2 "nonimmediate_operand" "xm")
9432                        (match_operand:SI 3 "const_0_to_255_operand" "n")]
9433                       UNSPEC_MPSADBW))]
9434   "TARGET_SSE4_1"
9435   "mpsadbw\t{%3, %2, %0|%0, %2, %3}"
9436   [(set_attr "type" "sselog1")
9437    (set_attr "prefix_extra" "1")
9438    (set_attr "length_immediate" "1")
9439    (set_attr "mode" "TI")])
9441 (define_insn "*avx_packusdw"
9442   [(set (match_operand:V8HI 0 "register_operand" "=x")
9443         (vec_concat:V8HI
9444           (us_truncate:V4HI
9445             (match_operand:V4SI 1 "register_operand" "x"))
9446           (us_truncate:V4HI
9447             (match_operand:V4SI 2 "nonimmediate_operand" "xm"))))]
9448   "TARGET_AVX"
9449   "vpackusdw\t{%2, %1, %0|%0, %1, %2}"
9450   [(set_attr "type" "sselog")
9451    (set_attr "prefix_extra" "1")
9452    (set_attr "prefix" "vex")
9453    (set_attr "mode" "TI")])
9455 (define_insn "sse4_1_packusdw"
9456   [(set (match_operand:V8HI 0 "register_operand" "=x")
9457         (vec_concat:V8HI
9458           (us_truncate:V4HI
9459             (match_operand:V4SI 1 "register_operand" "0"))
9460           (us_truncate:V4HI
9461             (match_operand:V4SI 2 "nonimmediate_operand" "xm"))))]
9462   "TARGET_SSE4_1"
9463   "packusdw\t{%2, %0|%0, %2}"
9464   [(set_attr "type" "sselog")
9465    (set_attr "prefix_extra" "1")
9466    (set_attr "mode" "TI")])
9468 (define_insn "*avx_pblendvb"
9469   [(set (match_operand:V16QI 0 "register_operand" "=x")
9470         (unspec:V16QI [(match_operand:V16QI 1 "register_operand"  "x")
9471                        (match_operand:V16QI 2 "nonimmediate_operand" "xm")
9472                        (match_operand:V16QI 3 "register_operand" "x")]
9473                       UNSPEC_BLENDV))]
9474   "TARGET_AVX"
9475   "vpblendvb\t{%3, %2, %1, %0|%0, %1, %2, %3}"
9476   [(set_attr "type" "ssemov")
9477    (set_attr "prefix_extra" "1")
9478    (set_attr "length_immediate" "1")
9479    (set_attr "prefix" "vex")
9480    (set_attr "mode" "TI")])
9482 (define_insn "sse4_1_pblendvb"
9483   [(set (match_operand:V16QI 0 "reg_not_xmm0_operand" "=x")
9484         (unspec:V16QI [(match_operand:V16QI 1 "reg_not_xmm0_operand"  "0")
9485                        (match_operand:V16QI 2 "nonimm_not_xmm0_operand" "xm")
9486                        (match_operand:V16QI 3 "register_operand" "Yz")]
9487                       UNSPEC_BLENDV))]
9488   "TARGET_SSE4_1"
9489   "pblendvb\t{%3, %2, %0|%0, %2, %3}"
9490   [(set_attr "type" "ssemov")
9491    (set_attr "prefix_extra" "1")
9492    (set_attr "mode" "TI")])
9494 (define_insn "*avx_pblendw"
9495   [(set (match_operand:V8HI 0 "register_operand" "=x")
9496         (vec_merge:V8HI
9497           (match_operand:V8HI 2 "nonimmediate_operand" "xm")
9498           (match_operand:V8HI 1 "register_operand" "x")
9499           (match_operand:SI 3 "const_0_to_255_operand" "n")))]
9500   "TARGET_AVX"
9501   "vpblendw\t{%3, %2, %1, %0|%0, %1, %2, %3}"
9502   [(set_attr "type" "ssemov")
9503    (set_attr "prefix" "vex")
9504    (set_attr "prefix_extra" "1")
9505    (set_attr "length_immediate" "1")
9506    (set_attr "mode" "TI")])
9508 (define_insn "sse4_1_pblendw"
9509   [(set (match_operand:V8HI 0 "register_operand" "=x")
9510         (vec_merge:V8HI
9511           (match_operand:V8HI 2 "nonimmediate_operand" "xm")
9512           (match_operand:V8HI 1 "register_operand" "0")
9513           (match_operand:SI 3 "const_0_to_255_operand" "n")))]
9514   "TARGET_SSE4_1"
9515   "pblendw\t{%3, %2, %0|%0, %2, %3}"
9516   [(set_attr "type" "ssemov")
9517    (set_attr "prefix_extra" "1")
9518    (set_attr "length_immediate" "1")
9519    (set_attr "mode" "TI")])
9521 (define_insn "sse4_1_phminposuw"
9522   [(set (match_operand:V8HI 0 "register_operand" "=x")
9523         (unspec:V8HI [(match_operand:V8HI 1 "nonimmediate_operand" "xm")]
9524                      UNSPEC_PHMINPOSUW))]
9525   "TARGET_SSE4_1"
9526   "%vphminposuw\t{%1, %0|%0, %1}"
9527   [(set_attr "type" "sselog1")
9528    (set_attr "prefix_extra" "1")
9529    (set_attr "prefix" "maybe_vex")
9530    (set_attr "mode" "TI")])
9532 (define_insn "sse4_1_<code>v8qiv8hi2"
9533   [(set (match_operand:V8HI 0 "register_operand" "=x")
9534         (any_extend:V8HI
9535           (vec_select:V8QI
9536             (match_operand:V16QI 1 "nonimmediate_operand" "xm")
9537             (parallel [(const_int 0)
9538                        (const_int 1)
9539                        (const_int 2)
9540                        (const_int 3)
9541                        (const_int 4)
9542                        (const_int 5)
9543                        (const_int 6)
9544                        (const_int 7)]))))]
9545   "TARGET_SSE4_1"
9546   "%vpmov<extsuffix>bw\t{%1, %0|%0, %1}"
9547   [(set_attr "type" "ssemov")
9548    (set_attr "prefix_extra" "1")
9549    (set_attr "prefix" "maybe_vex")
9550    (set_attr "mode" "TI")])
9552 (define_insn "sse4_1_<code>v4qiv4si2"
9553   [(set (match_operand:V4SI 0 "register_operand" "=x")
9554         (any_extend:V4SI
9555           (vec_select:V4QI
9556             (match_operand:V16QI 1 "nonimmediate_operand" "xm")
9557             (parallel [(const_int 0)
9558                        (const_int 1)
9559                        (const_int 2)
9560                        (const_int 3)]))))]
9561   "TARGET_SSE4_1"
9562   "%vpmov<extsuffix>bd\t{%1, %0|%0, %1}"
9563   [(set_attr "type" "ssemov")
9564    (set_attr "prefix_extra" "1")
9565    (set_attr "prefix" "maybe_vex")
9566    (set_attr "mode" "TI")])
9568 (define_insn "sse4_1_<code>v4hiv4si2"
9569   [(set (match_operand:V4SI 0 "register_operand" "=x")
9570         (any_extend:V4SI
9571           (vec_select:V4HI
9572             (match_operand:V8HI 1 "nonimmediate_operand" "xm")
9573             (parallel [(const_int 0)
9574                        (const_int 1)
9575                        (const_int 2)
9576                        (const_int 3)]))))]
9577   "TARGET_SSE4_1"
9578   "%vpmov<extsuffix>wd\t{%1, %0|%0, %1}"
9579   [(set_attr "type" "ssemov")
9580    (set_attr "prefix_extra" "1")
9581    (set_attr "prefix" "maybe_vex")
9582    (set_attr "mode" "TI")])
9584 (define_insn "sse4_1_<code>v2qiv2di2"
9585   [(set (match_operand:V2DI 0 "register_operand" "=x")
9586         (any_extend:V2DI
9587           (vec_select:V2QI
9588             (match_operand:V16QI 1 "nonimmediate_operand" "xm")
9589             (parallel [(const_int 0)
9590                        (const_int 1)]))))]
9591   "TARGET_SSE4_1"
9592   "%vpmov<extsuffix>bq\t{%1, %0|%0, %1}"
9593   [(set_attr "type" "ssemov")
9594    (set_attr "prefix_extra" "1")
9595    (set_attr "prefix" "maybe_vex")
9596    (set_attr "mode" "TI")])
9598 (define_insn "sse4_1_<code>v2hiv2di2"
9599   [(set (match_operand:V2DI 0 "register_operand" "=x")
9600         (any_extend:V2DI
9601           (vec_select:V2HI
9602             (match_operand:V8HI 1 "nonimmediate_operand" "xm")
9603             (parallel [(const_int 0)
9604                        (const_int 1)]))))]
9605   "TARGET_SSE4_1"
9606   "%vpmov<extsuffix>wq\t{%1, %0|%0, %1}"
9607   [(set_attr "type" "ssemov")
9608    (set_attr "prefix_extra" "1")
9609    (set_attr "prefix" "maybe_vex")
9610    (set_attr "mode" "TI")])
9612 (define_insn "sse4_1_<code>v2siv2di2"
9613   [(set (match_operand:V2DI 0 "register_operand" "=x")
9614         (any_extend:V2DI
9615           (vec_select:V2SI
9616             (match_operand:V4SI 1 "nonimmediate_operand" "xm")
9617             (parallel [(const_int 0)
9618                        (const_int 1)]))))]
9619   "TARGET_SSE4_1"
9620   "%vpmov<extsuffix>dq\t{%1, %0|%0, %1}"
9621   [(set_attr "type" "ssemov")
9622    (set_attr "prefix_extra" "1")
9623    (set_attr "prefix" "maybe_vex")
9624    (set_attr "mode" "TI")])
9626 ;; ptestps/ptestpd are very similar to comiss and ucomiss when
9627 ;; setting FLAGS_REG. But it is not a really compare instruction.
9628 (define_insn "avx_vtest<ssemodesuffix><avxmodesuffix>"
9629   [(set (reg:CC FLAGS_REG)
9630         (unspec:CC [(match_operand:AVXMODEF2P 0 "register_operand" "x")
9631                     (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "xm")]
9632                    UNSPEC_VTESTP))]
9633   "TARGET_AVX"
9634   "vtest<ssemodesuffix>\t{%1, %0|%0, %1}"
9635   [(set_attr "type" "ssecomi")
9636    (set_attr "prefix_extra" "1")
9637    (set_attr "prefix" "vex")
9638    (set_attr "mode" "<MODE>")])
9640 ;; ptest is very similar to comiss and ucomiss when setting FLAGS_REG.
9641 ;; But it is not a really compare instruction.
9642 (define_insn "avx_ptest256"
9643   [(set (reg:CC FLAGS_REG)
9644         (unspec:CC [(match_operand:V4DI 0 "register_operand" "x")
9645                     (match_operand:V4DI 1 "nonimmediate_operand" "xm")]
9646                    UNSPEC_PTEST))]
9647   "TARGET_AVX"
9648   "vptest\t{%1, %0|%0, %1}"
9649   [(set_attr "type" "ssecomi")
9650    (set_attr "prefix_extra" "1")
9651    (set_attr "prefix" "vex")
9652    (set_attr "mode" "OI")])
9654 (define_insn "sse4_1_ptest"
9655   [(set (reg:CC FLAGS_REG)
9656         (unspec:CC [(match_operand:V2DI 0 "register_operand" "x")
9657                     (match_operand:V2DI 1 "nonimmediate_operand" "xm")]
9658                    UNSPEC_PTEST))]
9659   "TARGET_SSE4_1"
9660   "%vptest\t{%1, %0|%0, %1}"
9661   [(set_attr "type" "ssecomi")
9662    (set_attr "prefix_extra" "1")
9663    (set_attr "prefix" "maybe_vex")
9664    (set_attr "mode" "TI")])
9666 (define_insn "avx_round<ssemodesuffix>256"
9667   [(set (match_operand:AVX256MODEF2P 0 "register_operand" "=x")
9668         (unspec:AVX256MODEF2P
9669           [(match_operand:AVX256MODEF2P 1 "nonimmediate_operand" "xm")
9670            (match_operand:SI 2 "const_0_to_15_operand" "n")]
9671           UNSPEC_ROUND))]
9672   "TARGET_AVX"
9673   "vround<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
9674   [(set_attr "type" "ssecvt")
9675    (set_attr "prefix_extra" "1")
9676    (set_attr "length_immediate" "1")
9677    (set_attr "prefix" "vex")
9678    (set_attr "mode" "<MODE>")])
9680 (define_insn "sse4_1_round<ssemodesuffix>"
9681   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
9682         (unspec:SSEMODEF2P
9683           [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "xm")
9684            (match_operand:SI 2 "const_0_to_15_operand" "n")]
9685           UNSPEC_ROUND))]
9686   "TARGET_ROUND"
9687   "%vround<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
9688   [(set_attr "type" "ssecvt")
9689    (set_attr "prefix_data16" "1")
9690    (set_attr "prefix_extra" "1")
9691    (set_attr "length_immediate" "1")
9692    (set_attr "prefix" "maybe_vex")
9693    (set_attr "mode" "<MODE>")])
9695 (define_insn "*avx_round<ssescalarmodesuffix>"
9696   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
9697         (vec_merge:SSEMODEF2P
9698           (unspec:SSEMODEF2P
9699             [(match_operand:SSEMODEF2P 2 "register_operand" "x")
9700              (match_operand:SI 3 "const_0_to_15_operand" "n")]
9701             UNSPEC_ROUND)
9702           (match_operand:SSEMODEF2P 1 "register_operand" "x")
9703           (const_int 1)))]
9704   "TARGET_AVX"
9705   "vround<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
9706   [(set_attr "type" "ssecvt")
9707    (set_attr "prefix_extra" "1")
9708    (set_attr "length_immediate" "1")
9709    (set_attr "prefix" "vex")
9710    (set_attr "mode" "<MODE>")])
9712 (define_insn "sse4_1_round<ssescalarmodesuffix>"
9713   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
9714         (vec_merge:SSEMODEF2P
9715           (unspec:SSEMODEF2P
9716             [(match_operand:SSEMODEF2P 2 "register_operand" "x")
9717              (match_operand:SI 3 "const_0_to_15_operand" "n")]
9718             UNSPEC_ROUND)
9719           (match_operand:SSEMODEF2P 1 "register_operand" "0")
9720           (const_int 1)))]
9721   "TARGET_ROUND"
9722   "round<ssescalarmodesuffix>\t{%3, %2, %0|%0, %2, %3}"
9723   [(set_attr "type" "ssecvt")
9724    (set_attr "prefix_data16" "1")
9725    (set_attr "prefix_extra" "1")
9726    (set_attr "length_immediate" "1")
9727    (set_attr "mode" "<MODE>")])
9729 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9731 ;; Intel SSE4.2 string/text processing instructions
9733 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9735 (define_insn_and_split "sse4_2_pcmpestr"
9736   [(set (match_operand:SI 0 "register_operand" "=c,c")
9737         (unspec:SI
9738           [(match_operand:V16QI 2 "reg_not_xmm0_operand" "x,x")
9739            (match_operand:SI 3 "register_operand" "a,a")
9740            (match_operand:V16QI 4 "nonimm_not_xmm0_operand" "x,m")
9741            (match_operand:SI 5 "register_operand" "d,d")
9742            (match_operand:SI 6 "const_0_to_255_operand" "n,n")]
9743           UNSPEC_PCMPESTR))
9744    (set (match_operand:V16QI 1 "register_operand" "=Yz,Yz")
9745         (unspec:V16QI
9746           [(match_dup 2)
9747            (match_dup 3)
9748            (match_dup 4)
9749            (match_dup 5)
9750            (match_dup 6)]
9751           UNSPEC_PCMPESTR))
9752    (set (reg:CC FLAGS_REG)
9753         (unspec:CC
9754           [(match_dup 2)
9755            (match_dup 3)
9756            (match_dup 4)
9757            (match_dup 5)
9758            (match_dup 6)]
9759           UNSPEC_PCMPESTR))]
9760   "TARGET_SSE4_2
9761    && can_create_pseudo_p ()"
9762   "#"
9763   "&& 1"
9764   [(const_int 0)]
9766   int ecx = !find_regno_note (curr_insn, REG_UNUSED, REGNO (operands[0]));
9767   int xmm0 = !find_regno_note (curr_insn, REG_UNUSED, REGNO (operands[1]));
9768   int flags = !find_regno_note (curr_insn, REG_UNUSED, FLAGS_REG);
9770   if (ecx)
9771     emit_insn (gen_sse4_2_pcmpestri (operands[0], operands[2],
9772                                      operands[3], operands[4],
9773                                      operands[5], operands[6]));
9774   if (xmm0)
9775     emit_insn (gen_sse4_2_pcmpestrm (operands[1], operands[2],
9776                                      operands[3], operands[4],
9777                                      operands[5], operands[6]));
9778   if (flags && !(ecx || xmm0))
9779     emit_insn (gen_sse4_2_pcmpestr_cconly (NULL, NULL,
9780                                            operands[2], operands[3],
9781                                            operands[4], operands[5],
9782                                            operands[6]));
9783   DONE;
9785   [(set_attr "type" "sselog")
9786    (set_attr "prefix_data16" "1")
9787    (set_attr "prefix_extra" "1")
9788    (set_attr "length_immediate" "1")
9789    (set_attr "memory" "none,load")
9790    (set_attr "mode" "TI")])
9792 (define_insn "sse4_2_pcmpestri"
9793   [(set (match_operand:SI 0 "register_operand" "=c,c")
9794         (unspec:SI
9795           [(match_operand:V16QI 1 "register_operand" "x,x")
9796            (match_operand:SI 2 "register_operand" "a,a")
9797            (match_operand:V16QI 3 "nonimmediate_operand" "x,m")
9798            (match_operand:SI 4 "register_operand" "d,d")
9799            (match_operand:SI 5 "const_0_to_255_operand" "n,n")]
9800           UNSPEC_PCMPESTR))
9801    (set (reg:CC FLAGS_REG)
9802         (unspec:CC
9803           [(match_dup 1)
9804            (match_dup 2)
9805            (match_dup 3)
9806            (match_dup 4)
9807            (match_dup 5)]
9808           UNSPEC_PCMPESTR))]
9809   "TARGET_SSE4_2"
9810   "%vpcmpestri\t{%5, %3, %1|%1, %3, %5}"
9811   [(set_attr "type" "sselog")
9812    (set_attr "prefix_data16" "1")
9813    (set_attr "prefix_extra" "1")
9814    (set_attr "prefix" "maybe_vex")
9815    (set_attr "length_immediate" "1")
9816    (set_attr "memory" "none,load")
9817    (set_attr "mode" "TI")])
9819 (define_insn "sse4_2_pcmpestrm"
9820   [(set (match_operand:V16QI 0 "register_operand" "=Yz,Yz")
9821         (unspec:V16QI
9822           [(match_operand:V16QI 1 "register_operand" "x,x")
9823            (match_operand:SI 2 "register_operand" "a,a")
9824            (match_operand:V16QI 3 "nonimmediate_operand" "x,m")
9825            (match_operand:SI 4 "register_operand" "d,d")
9826            (match_operand:SI 5 "const_0_to_255_operand" "n,n")]
9827           UNSPEC_PCMPESTR))
9828    (set (reg:CC FLAGS_REG)
9829         (unspec:CC
9830           [(match_dup 1)
9831            (match_dup 2)
9832            (match_dup 3)
9833            (match_dup 4)
9834            (match_dup 5)]
9835           UNSPEC_PCMPESTR))]
9836   "TARGET_SSE4_2"
9837   "%vpcmpestrm\t{%5, %3, %1|%1, %3, %5}"
9838   [(set_attr "type" "sselog")
9839    (set_attr "prefix_data16" "1")
9840    (set_attr "prefix_extra" "1")
9841    (set_attr "length_immediate" "1")
9842    (set_attr "prefix" "maybe_vex")
9843    (set_attr "memory" "none,load")
9844    (set_attr "mode" "TI")])
9846 (define_insn "sse4_2_pcmpestr_cconly"
9847   [(set (reg:CC FLAGS_REG)
9848         (unspec:CC
9849           [(match_operand:V16QI 2 "register_operand" "x,x,x,x")
9850            (match_operand:SI 3 "register_operand" "a,a,a,a")
9851            (match_operand:V16QI 4 "nonimmediate_operand" "x,m,x,m")
9852            (match_operand:SI 5 "register_operand" "d,d,d,d")
9853            (match_operand:SI 6 "const_0_to_255_operand" "n,n,n,n")]
9854           UNSPEC_PCMPESTR))
9855    (clobber (match_scratch:V16QI 0 "=Yz,Yz,X,X"))
9856    (clobber (match_scratch:SI    1 "= X, X,c,c"))]
9857   "TARGET_SSE4_2"
9858   "@
9859    %vpcmpestrm\t{%6, %4, %2|%2, %4, %6}
9860    %vpcmpestrm\t{%6, %4, %2|%2, %4, %6}
9861    %vpcmpestri\t{%6, %4, %2|%2, %4, %6}
9862    %vpcmpestri\t{%6, %4, %2|%2, %4, %6}"
9863   [(set_attr "type" "sselog")
9864    (set_attr "prefix_data16" "1")
9865    (set_attr "prefix_extra" "1")
9866    (set_attr "length_immediate" "1")
9867    (set_attr "memory" "none,load,none,load")
9868    (set_attr "prefix" "maybe_vex")
9869    (set_attr "mode" "TI")])
9871 (define_insn_and_split "sse4_2_pcmpistr"
9872   [(set (match_operand:SI 0 "register_operand" "=c,c")
9873         (unspec:SI
9874           [(match_operand:V16QI 2 "reg_not_xmm0_operand" "x,x")
9875            (match_operand:V16QI 3 "nonimm_not_xmm0_operand" "x,m")
9876            (match_operand:SI 4 "const_0_to_255_operand" "n,n")]
9877           UNSPEC_PCMPISTR))
9878    (set (match_operand:V16QI 1 "register_operand" "=Yz,Yz")
9879         (unspec:V16QI
9880           [(match_dup 2)
9881            (match_dup 3)
9882            (match_dup 4)]
9883           UNSPEC_PCMPISTR))
9884    (set (reg:CC FLAGS_REG)
9885         (unspec:CC
9886           [(match_dup 2)
9887            (match_dup 3)
9888            (match_dup 4)]
9889           UNSPEC_PCMPISTR))]
9890   "TARGET_SSE4_2
9891    && can_create_pseudo_p ()"
9892   "#"
9893   "&& 1"
9894   [(const_int 0)]
9896   int ecx = !find_regno_note (curr_insn, REG_UNUSED, REGNO (operands[0]));
9897   int xmm0 = !find_regno_note (curr_insn, REG_UNUSED, REGNO (operands[1]));
9898   int flags = !find_regno_note (curr_insn, REG_UNUSED, FLAGS_REG);
9900   if (ecx)
9901     emit_insn (gen_sse4_2_pcmpistri (operands[0], operands[2],
9902                                      operands[3], operands[4]));
9903   if (xmm0)
9904     emit_insn (gen_sse4_2_pcmpistrm (operands[1], operands[2],
9905                                      operands[3], operands[4]));
9906   if (flags && !(ecx || xmm0))
9907     emit_insn (gen_sse4_2_pcmpistr_cconly (NULL, NULL,
9908                                            operands[2], operands[3],
9909                                            operands[4]));
9910   DONE;
9912   [(set_attr "type" "sselog")
9913    (set_attr "prefix_data16" "1")
9914    (set_attr "prefix_extra" "1")
9915    (set_attr "length_immediate" "1")
9916    (set_attr "memory" "none,load")
9917    (set_attr "mode" "TI")])
9919 (define_insn "sse4_2_pcmpistri"
9920   [(set (match_operand:SI 0 "register_operand" "=c,c")
9921         (unspec:SI
9922           [(match_operand:V16QI 1 "register_operand" "x,x")
9923            (match_operand:V16QI 2 "nonimmediate_operand" "x,m")
9924            (match_operand:SI 3 "const_0_to_255_operand" "n,n")]
9925           UNSPEC_PCMPISTR))
9926    (set (reg:CC FLAGS_REG)
9927         (unspec:CC
9928           [(match_dup 1)
9929            (match_dup 2)
9930            (match_dup 3)]
9931           UNSPEC_PCMPISTR))]
9932   "TARGET_SSE4_2"
9933   "%vpcmpistri\t{%3, %2, %1|%1, %2, %3}"
9934   [(set_attr "type" "sselog")
9935    (set_attr "prefix_data16" "1")
9936    (set_attr "prefix_extra" "1")
9937    (set_attr "length_immediate" "1")
9938    (set_attr "prefix" "maybe_vex")
9939    (set_attr "memory" "none,load")
9940    (set_attr "mode" "TI")])
9942 (define_insn "sse4_2_pcmpistrm"
9943   [(set (match_operand:V16QI 0 "register_operand" "=Yz,Yz")
9944         (unspec:V16QI
9945           [(match_operand:V16QI 1 "register_operand" "x,x")
9946            (match_operand:V16QI 2 "nonimmediate_operand" "x,m")
9947            (match_operand:SI 3 "const_0_to_255_operand" "n,n")]
9948           UNSPEC_PCMPISTR))
9949    (set (reg:CC FLAGS_REG)
9950         (unspec:CC
9951           [(match_dup 1)
9952            (match_dup 2)
9953            (match_dup 3)]
9954           UNSPEC_PCMPISTR))]
9955   "TARGET_SSE4_2"
9956   "%vpcmpistrm\t{%3, %2, %1|%1, %2, %3}"
9957   [(set_attr "type" "sselog")
9958    (set_attr "prefix_data16" "1")
9959    (set_attr "prefix_extra" "1")
9960    (set_attr "length_immediate" "1")
9961    (set_attr "prefix" "maybe_vex")
9962    (set_attr "memory" "none,load")
9963    (set_attr "mode" "TI")])
9965 (define_insn "sse4_2_pcmpistr_cconly"
9966   [(set (reg:CC FLAGS_REG)
9967         (unspec:CC
9968           [(match_operand:V16QI 2 "register_operand" "x,x,x,x")
9969            (match_operand:V16QI 3 "nonimmediate_operand" "x,m,x,m")
9970            (match_operand:SI 4 "const_0_to_255_operand" "n,n,n,n")]
9971           UNSPEC_PCMPISTR))
9972    (clobber (match_scratch:V16QI 0 "=Yz,Yz,X,X"))
9973    (clobber (match_scratch:SI    1 "= X, X,c,c"))]
9974   "TARGET_SSE4_2"
9975   "@
9976    %vpcmpistrm\t{%4, %3, %2|%2, %3, %4}
9977    %vpcmpistrm\t{%4, %3, %2|%2, %3, %4}
9978    %vpcmpistri\t{%4, %3, %2|%2, %3, %4}
9979    %vpcmpistri\t{%4, %3, %2|%2, %3, %4}"
9980   [(set_attr "type" "sselog")
9981    (set_attr "prefix_data16" "1")
9982    (set_attr "prefix_extra" "1")
9983    (set_attr "length_immediate" "1")
9984    (set_attr "memory" "none,load,none,load")
9985    (set_attr "prefix" "maybe_vex")
9986    (set_attr "mode" "TI")])
9988 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9990 ;; XOP instructions
9992 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9994 ;; XOP parallel integer multiply/add instructions.
9995 ;; Note the XOP multiply/add instructions
9996 ;;     a[i] = b[i] * c[i] + d[i];
9997 ;; do not allow the value being added to be a memory operation.
9998 (define_insn "xop_pmacsww"
9999   [(set (match_operand:V8HI 0 "register_operand" "=x")
10000         (plus:V8HI
10001          (mult:V8HI
10002           (match_operand:V8HI 1 "nonimmediate_operand" "%x")
10003           (match_operand:V8HI 2 "nonimmediate_operand" "xm"))
10004          (match_operand:V8HI 3 "nonimmediate_operand" "x")))]
10005   "TARGET_XOP"
10006   "vpmacsww\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10007   [(set_attr "type" "ssemuladd")
10008    (set_attr "mode" "TI")])
10010 (define_insn "xop_pmacssww"
10011   [(set (match_operand:V8HI 0 "register_operand" "=x")
10012         (ss_plus:V8HI
10013          (mult:V8HI (match_operand:V8HI 1 "nonimmediate_operand" "%x")
10014                     (match_operand:V8HI 2 "nonimmediate_operand" "xm"))
10015          (match_operand:V8HI 3 "nonimmediate_operand" "x")))]
10016   "TARGET_XOP"
10017   "vpmacssww\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10018   [(set_attr "type" "ssemuladd")
10019    (set_attr "mode" "TI")])
10021 (define_insn "xop_pmacsdd"
10022   [(set (match_operand:V4SI 0 "register_operand" "=x")
10023         (plus:V4SI
10024          (mult:V4SI
10025           (match_operand:V4SI 1 "nonimmediate_operand" "%x")
10026           (match_operand:V4SI 2 "nonimmediate_operand" "xm"))
10027          (match_operand:V4SI 3 "nonimmediate_operand" "x")))]
10028   "TARGET_XOP"
10029   "vpmacsdd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10030   [(set_attr "type" "ssemuladd")
10031    (set_attr "mode" "TI")])
10033 (define_insn "xop_pmacssdd"
10034   [(set (match_operand:V4SI 0 "register_operand" "=x")
10035         (ss_plus:V4SI
10036          (mult:V4SI (match_operand:V4SI 1 "nonimmediate_operand" "%x")
10037                     (match_operand:V4SI 2 "nonimmediate_operand" "xm"))
10038          (match_operand:V4SI 3 "nonimmediate_operand" "x")))]
10039   "TARGET_XOP"
10040   "vpmacssdd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10041   [(set_attr "type" "ssemuladd")
10042    (set_attr "mode" "TI")])
10044 (define_insn "xop_pmacssdql"
10045   [(set (match_operand:V2DI 0 "register_operand" "=x")
10046         (ss_plus:V2DI
10047          (mult:V2DI
10048           (sign_extend:V2DI
10049            (vec_select:V2SI
10050             (match_operand:V4SI 1 "nonimmediate_operand" "%x")
10051             (parallel [(const_int 1)
10052                        (const_int 3)])))
10053           (vec_select:V2SI
10054            (match_operand:V4SI 2 "nonimmediate_operand" "xm")
10055            (parallel [(const_int 1)
10056                       (const_int 3)])))
10057          (match_operand:V2DI 3 "nonimmediate_operand" "x")))]
10058   "TARGET_XOP"
10059   "vpmacssdql\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10060   [(set_attr "type" "ssemuladd")
10061    (set_attr "mode" "TI")])
10063 (define_insn "xop_pmacssdqh"
10064   [(set (match_operand:V2DI 0 "register_operand" "=x")
10065         (ss_plus:V2DI
10066          (mult:V2DI
10067           (sign_extend:V2DI
10068            (vec_select:V2SI
10069             (match_operand:V4SI 1 "nonimmediate_operand" "%x")
10070             (parallel [(const_int 0)
10071                        (const_int 2)])))
10072           (sign_extend:V2DI
10073            (vec_select:V2SI
10074             (match_operand:V4SI 2 "nonimmediate_operand" "xm")
10075             (parallel [(const_int 0)
10076                        (const_int 2)]))))
10077          (match_operand:V2DI 3 "nonimmediate_operand" "x")))]
10078   "TARGET_XOP"
10079   "vpmacssdqh\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10080   [(set_attr "type" "ssemuladd")
10081    (set_attr "mode" "TI")])
10083 (define_insn "xop_pmacsdql"
10084   [(set (match_operand:V2DI 0 "register_operand" "=x")
10085         (plus:V2DI
10086          (mult:V2DI
10087           (sign_extend:V2DI
10088            (vec_select:V2SI
10089             (match_operand:V4SI 1 "nonimmediate_operand" "%x")
10090             (parallel [(const_int 1)
10091                        (const_int 3)])))
10092           (sign_extend:V2DI
10093            (vec_select:V2SI
10094             (match_operand:V4SI 2 "nonimmediate_operand" "xm")
10095             (parallel [(const_int 1)
10096                        (const_int 3)]))))
10097          (match_operand:V2DI 3 "nonimmediate_operand" "x")))]
10098   "TARGET_XOP"
10099   "vpmacsdql\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10100   [(set_attr "type" "ssemuladd")
10101    (set_attr "mode" "TI")])
10103 ;; We don't have a straight 32-bit parallel multiply and extend on XOP, so
10104 ;; fake it with a multiply/add.  In general, we expect the define_split to
10105 ;; occur before register allocation, so we have to handle the corner case where
10106 ;; the target is the same as operands 1/2
10107 (define_insn_and_split "xop_mulv2div2di3_low"
10108   [(set (match_operand:V2DI 0 "register_operand" "=&x")
10109         (mult:V2DI
10110           (sign_extend:V2DI
10111             (vec_select:V2SI
10112               (match_operand:V4SI 1 "register_operand" "%x")
10113               (parallel [(const_int 1)
10114                          (const_int 3)])))
10115           (sign_extend:V2DI
10116             (vec_select:V2SI
10117               (match_operand:V4SI 2 "nonimmediate_operand" "xm")
10118               (parallel [(const_int 1)
10119                          (const_int 3)])))))]
10120   "TARGET_XOP"
10121   "#"
10122   "&& reload_completed"
10123   [(set (match_dup 0)
10124         (match_dup 3))
10125    (set (match_dup 0)
10126         (plus:V2DI
10127          (mult:V2DI
10128           (sign_extend:V2DI
10129            (vec_select:V2SI
10130             (match_dup 1)
10131             (parallel [(const_int 1)
10132                        (const_int 3)])))
10133           (sign_extend:V2DI
10134            (vec_select:V2SI
10135             (match_dup 2)
10136             (parallel [(const_int 1)
10137                        (const_int 3)]))))
10138          (match_dup 0)))]
10140   operands[3] = CONST0_RTX (V2DImode);
10142   [(set_attr "type" "ssemul")
10143    (set_attr "mode" "TI")])
10145 (define_insn "xop_pmacsdqh"
10146   [(set (match_operand:V2DI 0 "register_operand" "=x")
10147         (plus:V2DI
10148          (mult:V2DI
10149           (sign_extend:V2DI
10150            (vec_select:V2SI
10151             (match_operand:V4SI 1 "nonimmediate_operand" "%x")
10152             (parallel [(const_int 0)
10153                        (const_int 2)])))
10154           (sign_extend:V2DI
10155            (vec_select:V2SI
10156             (match_operand:V4SI 2 "nonimmediate_operand" "xm")
10157             (parallel [(const_int 0)
10158                        (const_int 2)]))))
10159          (match_operand:V2DI 3 "nonimmediate_operand" "x")))]
10160   "TARGET_XOP"
10161   "vpmacsdqh\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10162   [(set_attr "type" "ssemuladd")
10163    (set_attr "mode" "TI")])
10165 ;; We don't have a straight 32-bit parallel multiply and extend on XOP, so
10166 ;; fake it with a multiply/add.  In general, we expect the define_split to
10167 ;; occur before register allocation, so we have to handle the corner case where
10168 ;; the target is the same as either operands[1] or operands[2]
10169 (define_insn_and_split "xop_mulv2div2di3_high"
10170   [(set (match_operand:V2DI 0 "register_operand" "=&x")
10171         (mult:V2DI
10172           (sign_extend:V2DI
10173             (vec_select:V2SI
10174               (match_operand:V4SI 1 "register_operand" "%x")
10175               (parallel [(const_int 0)
10176                          (const_int 2)])))
10177           (sign_extend:V2DI
10178             (vec_select:V2SI
10179               (match_operand:V4SI 2 "nonimmediate_operand" "xm")
10180               (parallel [(const_int 0)
10181                          (const_int 2)])))))]
10182   "TARGET_XOP"
10183   "#"
10184   "&& reload_completed"
10185   [(set (match_dup 0)
10186         (match_dup 3))
10187    (set (match_dup 0)
10188         (plus:V2DI
10189          (mult:V2DI
10190           (sign_extend:V2DI
10191            (vec_select:V2SI
10192             (match_dup 1)
10193             (parallel [(const_int 0)
10194                        (const_int 2)])))
10195           (sign_extend:V2DI
10196            (vec_select:V2SI
10197             (match_dup 2)
10198             (parallel [(const_int 0)
10199                        (const_int 2)]))))
10200          (match_dup 0)))]
10202   operands[3] = CONST0_RTX (V2DImode);
10204   [(set_attr "type" "ssemul")
10205    (set_attr "mode" "TI")])
10207 ;; XOP parallel integer multiply/add instructions for the intrinisics
10208 (define_insn "xop_pmacsswd"
10209   [(set (match_operand:V4SI 0 "register_operand" "=x")
10210         (ss_plus:V4SI
10211          (mult:V4SI
10212           (sign_extend:V4SI
10213            (vec_select:V4HI
10214             (match_operand:V8HI 1 "nonimmediate_operand" "%x")
10215             (parallel [(const_int 1)
10216                        (const_int 3)
10217                        (const_int 5)
10218                        (const_int 7)])))
10219           (sign_extend:V4SI
10220            (vec_select:V4HI
10221             (match_operand:V8HI 2 "nonimmediate_operand" "xm")
10222             (parallel [(const_int 1)
10223                        (const_int 3)
10224                        (const_int 5)
10225                        (const_int 7)]))))
10226          (match_operand:V4SI 3 "nonimmediate_operand" "x")))]
10227   "TARGET_XOP"
10228   "vpmacsswd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10229   [(set_attr "type" "ssemuladd")
10230    (set_attr "mode" "TI")])
10232 (define_insn "xop_pmacswd"
10233   [(set (match_operand:V4SI 0 "register_operand" "=x")
10234         (plus:V4SI
10235          (mult:V4SI
10236           (sign_extend:V4SI
10237            (vec_select:V4HI
10238             (match_operand:V8HI 1 "nonimmediate_operand" "%x")
10239             (parallel [(const_int 1)
10240                        (const_int 3)
10241                        (const_int 5)
10242                        (const_int 7)])))
10243           (sign_extend:V4SI
10244            (vec_select:V4HI
10245             (match_operand:V8HI 2 "nonimmediate_operand" "xm")
10246             (parallel [(const_int 1)
10247                        (const_int 3)
10248                        (const_int 5)
10249                        (const_int 7)]))))
10250          (match_operand:V4SI 3 "nonimmediate_operand" "x")))]
10251   "TARGET_XOP"
10252   "vpmacswd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10253   [(set_attr "type" "ssemuladd")
10254    (set_attr "mode" "TI")])
10256 (define_insn "xop_pmadcsswd"
10257   [(set (match_operand:V4SI 0 "register_operand" "=x")
10258         (ss_plus:V4SI
10259          (plus:V4SI
10260           (mult:V4SI
10261            (sign_extend:V4SI
10262             (vec_select:V4HI
10263              (match_operand:V8HI 1 "nonimmediate_operand" "%x")
10264              (parallel [(const_int 0)
10265                         (const_int 2)
10266                         (const_int 4)
10267                         (const_int 6)])))
10268            (sign_extend:V4SI
10269             (vec_select:V4HI
10270              (match_operand:V8HI 2 "nonimmediate_operand" "xm")
10271              (parallel [(const_int 0)
10272                         (const_int 2)
10273                         (const_int 4)
10274                         (const_int 6)]))))
10275           (mult:V4SI
10276            (sign_extend:V4SI
10277             (vec_select:V4HI
10278              (match_dup 1)
10279              (parallel [(const_int 1)
10280                         (const_int 3)
10281                         (const_int 5)
10282                         (const_int 7)])))
10283            (sign_extend:V4SI
10284             (vec_select:V4HI
10285              (match_dup 2)
10286              (parallel [(const_int 1)
10287                         (const_int 3)
10288                         (const_int 5)
10289                         (const_int 7)])))))
10290          (match_operand:V4SI 3 "nonimmediate_operand" "x")))]
10291   "TARGET_XOP"
10292   "vpmadcsswd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10293   [(set_attr "type" "ssemuladd")
10294    (set_attr "mode" "TI")])
10296 (define_insn "xop_pmadcswd"
10297   [(set (match_operand:V4SI 0 "register_operand" "=x")
10298         (plus:V4SI
10299          (plus:V4SI
10300           (mult:V4SI
10301            (sign_extend:V4SI
10302             (vec_select:V4HI
10303              (match_operand:V8HI 1 "nonimmediate_operand" "%x")
10304              (parallel [(const_int 0)
10305                         (const_int 2)
10306                         (const_int 4)
10307                         (const_int 6)])))
10308            (sign_extend:V4SI
10309             (vec_select:V4HI
10310              (match_operand:V8HI 2 "nonimmediate_operand" "xm")
10311              (parallel [(const_int 0)
10312                         (const_int 2)
10313                         (const_int 4)
10314                         (const_int 6)]))))
10315           (mult:V4SI
10316            (sign_extend:V4SI
10317             (vec_select:V4HI
10318              (match_dup 1)
10319              (parallel [(const_int 1)
10320                         (const_int 3)
10321                         (const_int 5)
10322                         (const_int 7)])))
10323            (sign_extend:V4SI
10324             (vec_select:V4HI
10325              (match_dup 2)
10326              (parallel [(const_int 1)
10327                         (const_int 3)
10328                         (const_int 5)
10329                         (const_int 7)])))))
10330          (match_operand:V4SI 3 "nonimmediate_operand" "x")))]
10331   "TARGET_XOP"
10332   "vpmadcswd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10333   [(set_attr "type" "ssemuladd")
10334    (set_attr "mode" "TI")])
10336 ;; XOP parallel XMM conditional moves
10337 (define_insn "xop_pcmov_<mode>"
10338   [(set (match_operand:SSEMODE 0 "register_operand" "=x,x")
10339         (if_then_else:SSEMODE
10340           (match_operand:SSEMODE 3 "nonimmediate_operand" "x,m")
10341           (match_operand:SSEMODE 1 "vector_move_operand" "x,x")
10342           (match_operand:SSEMODE 2 "vector_move_operand" "xm,x")))]
10343   "TARGET_XOP"
10344   "vpcmov\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10345   [(set_attr "type" "sse4arg")])
10347 (define_insn "xop_pcmov_<mode>256"
10348   [(set (match_operand:AVX256MODE 0 "register_operand" "=x,x")
10349         (if_then_else:AVX256MODE
10350           (match_operand:AVX256MODE 3 "nonimmediate_operand" "x,m")
10351           (match_operand:AVX256MODE 1 "vector_move_operand" "x,x")
10352           (match_operand:AVX256MODE 2 "vector_move_operand" "xm,x")))]
10353   "TARGET_XOP"
10354   "vpcmov\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10355   [(set_attr "type" "sse4arg")])
10357 ;; XOP horizontal add/subtract instructions
10358 (define_insn "xop_phaddbw"
10359   [(set (match_operand:V8HI 0 "register_operand" "=x")
10360         (plus:V8HI
10361          (sign_extend:V8HI
10362           (vec_select:V8QI
10363            (match_operand:V16QI 1 "nonimmediate_operand" "xm")
10364            (parallel [(const_int 0)
10365                       (const_int 2)
10366                       (const_int 4)
10367                       (const_int 6)
10368                       (const_int 8)
10369                       (const_int 10)
10370                       (const_int 12)
10371                       (const_int 14)])))
10372          (sign_extend:V8HI
10373           (vec_select:V8QI
10374            (match_dup 1)
10375            (parallel [(const_int 1)
10376                       (const_int 3)
10377                       (const_int 5)
10378                       (const_int 7)
10379                       (const_int 9)
10380                       (const_int 11)
10381                       (const_int 13)
10382                       (const_int 15)])))))]
10383   "TARGET_XOP"
10384   "vphaddbw\t{%1, %0|%0, %1}"
10385   [(set_attr "type" "sseiadd1")])
10387 (define_insn "xop_phaddbd"
10388   [(set (match_operand:V4SI 0 "register_operand" "=x")
10389         (plus:V4SI
10390          (plus:V4SI
10391           (sign_extend:V4SI
10392            (vec_select:V4QI
10393             (match_operand:V16QI 1 "nonimmediate_operand" "xm")
10394             (parallel [(const_int 0)
10395                        (const_int 4)
10396                        (const_int 8)
10397                        (const_int 12)])))
10398           (sign_extend:V4SI
10399            (vec_select:V4QI
10400             (match_dup 1)
10401             (parallel [(const_int 1)
10402                        (const_int 5)
10403                        (const_int 9)
10404                        (const_int 13)]))))
10405          (plus:V4SI
10406           (sign_extend:V4SI
10407            (vec_select:V4QI
10408             (match_dup 1)
10409             (parallel [(const_int 2)
10410                        (const_int 6)
10411                        (const_int 10)
10412                        (const_int 14)])))
10413           (sign_extend:V4SI
10414            (vec_select:V4QI
10415             (match_dup 1)
10416             (parallel [(const_int 3)
10417                        (const_int 7)
10418                        (const_int 11)
10419                        (const_int 15)]))))))]
10420   "TARGET_XOP"
10421   "vphaddbd\t{%1, %0|%0, %1}"
10422   [(set_attr "type" "sseiadd1")])
10424 (define_insn "xop_phaddbq"
10425   [(set (match_operand:V2DI 0 "register_operand" "=x")
10426         (plus:V2DI
10427          (plus:V2DI
10428           (plus:V2DI
10429            (sign_extend:V2DI
10430             (vec_select:V2QI
10431              (match_operand:V16QI 1 "nonimmediate_operand" "xm")
10432              (parallel [(const_int 0)
10433                         (const_int 4)])))
10434            (sign_extend:V2DI
10435             (vec_select:V2QI
10436              (match_dup 1)
10437              (parallel [(const_int 1)
10438                         (const_int 5)]))))
10439           (plus:V2DI
10440            (sign_extend:V2DI
10441             (vec_select:V2QI
10442              (match_dup 1)
10443              (parallel [(const_int 2)
10444                         (const_int 6)])))
10445            (sign_extend:V2DI
10446             (vec_select:V2QI
10447              (match_dup 1)
10448              (parallel [(const_int 3)
10449                         (const_int 7)])))))
10450          (plus:V2DI
10451           (plus:V2DI
10452            (sign_extend:V2DI
10453             (vec_select:V2QI
10454              (match_dup 1)
10455              (parallel [(const_int 8)
10456                         (const_int 12)])))
10457            (sign_extend:V2DI
10458             (vec_select:V2QI
10459              (match_dup 1)
10460              (parallel [(const_int 9)
10461                         (const_int 13)]))))
10462           (plus:V2DI
10463            (sign_extend:V2DI
10464             (vec_select:V2QI
10465              (match_dup 1)
10466              (parallel [(const_int 10)
10467                         (const_int 14)])))
10468            (sign_extend:V2DI
10469             (vec_select:V2QI
10470              (match_dup 1)
10471              (parallel [(const_int 11)
10472                         (const_int 15)])))))))]
10473   "TARGET_XOP"
10474   "vphaddbq\t{%1, %0|%0, %1}"
10475   [(set_attr "type" "sseiadd1")])
10477 (define_insn "xop_phaddwd"
10478   [(set (match_operand:V4SI 0 "register_operand" "=x")
10479         (plus:V4SI
10480          (sign_extend:V4SI
10481           (vec_select:V4HI
10482            (match_operand:V8HI 1 "nonimmediate_operand" "xm")
10483            (parallel [(const_int 0)
10484                       (const_int 2)
10485                       (const_int 4)
10486                       (const_int 6)])))
10487          (sign_extend:V4SI
10488           (vec_select:V4HI
10489            (match_dup 1)
10490            (parallel [(const_int 1)
10491                       (const_int 3)
10492                       (const_int 5)
10493                       (const_int 7)])))))]
10494   "TARGET_XOP"
10495   "vphaddwd\t{%1, %0|%0, %1}"
10496   [(set_attr "type" "sseiadd1")])
10498 (define_insn "xop_phaddwq"
10499   [(set (match_operand:V2DI 0 "register_operand" "=x")
10500         (plus:V2DI
10501          (plus:V2DI
10502           (sign_extend:V2DI
10503            (vec_select:V2HI
10504             (match_operand:V8HI 1 "nonimmediate_operand" "xm")
10505             (parallel [(const_int 0)
10506                        (const_int 4)])))
10507           (sign_extend:V2DI
10508            (vec_select:V2HI
10509             (match_dup 1)
10510             (parallel [(const_int 1)
10511                        (const_int 5)]))))
10512          (plus:V2DI
10513           (sign_extend:V2DI
10514            (vec_select:V2HI
10515             (match_dup 1)
10516             (parallel [(const_int 2)
10517                        (const_int 6)])))
10518           (sign_extend:V2DI
10519            (vec_select:V2HI
10520             (match_dup 1)
10521             (parallel [(const_int 3)
10522                        (const_int 7)]))))))]
10523   "TARGET_XOP"
10524   "vphaddwq\t{%1, %0|%0, %1}"
10525   [(set_attr "type" "sseiadd1")])
10527 (define_insn "xop_phadddq"
10528   [(set (match_operand:V2DI 0 "register_operand" "=x")
10529         (plus:V2DI
10530          (sign_extend:V2DI
10531           (vec_select:V2SI
10532            (match_operand:V4SI 1 "nonimmediate_operand" "xm")
10533            (parallel [(const_int 0)
10534                       (const_int 2)])))
10535          (sign_extend:V2DI
10536           (vec_select:V2SI
10537            (match_dup 1)
10538            (parallel [(const_int 1)
10539                       (const_int 3)])))))]
10540   "TARGET_XOP"
10541   "vphadddq\t{%1, %0|%0, %1}"
10542   [(set_attr "type" "sseiadd1")])
10544 (define_insn "xop_phaddubw"
10545   [(set (match_operand:V8HI 0 "register_operand" "=x")
10546         (plus:V8HI
10547          (zero_extend:V8HI
10548           (vec_select:V8QI
10549            (match_operand:V16QI 1 "nonimmediate_operand" "xm")
10550            (parallel [(const_int 0)
10551                       (const_int 2)
10552                       (const_int 4)
10553                       (const_int 6)
10554                       (const_int 8)
10555                       (const_int 10)
10556                       (const_int 12)
10557                       (const_int 14)])))
10558          (zero_extend:V8HI
10559           (vec_select:V8QI
10560            (match_dup 1)
10561            (parallel [(const_int 1)
10562                       (const_int 3)
10563                       (const_int 5)
10564                       (const_int 7)
10565                       (const_int 9)
10566                       (const_int 11)
10567                       (const_int 13)
10568                       (const_int 15)])))))]
10569   "TARGET_XOP"
10570   "vphaddubw\t{%1, %0|%0, %1}"
10571   [(set_attr "type" "sseiadd1")])
10573 (define_insn "xop_phaddubd"
10574   [(set (match_operand:V4SI 0 "register_operand" "=x")
10575         (plus:V4SI
10576          (plus:V4SI
10577           (zero_extend:V4SI
10578            (vec_select:V4QI
10579             (match_operand:V16QI 1 "nonimmediate_operand" "xm")
10580             (parallel [(const_int 0)
10581                        (const_int 4)
10582                        (const_int 8)
10583                        (const_int 12)])))
10584           (zero_extend:V4SI
10585            (vec_select:V4QI
10586             (match_dup 1)
10587             (parallel [(const_int 1)
10588                        (const_int 5)
10589                        (const_int 9)
10590                        (const_int 13)]))))
10591          (plus:V4SI
10592           (zero_extend:V4SI
10593            (vec_select:V4QI
10594             (match_dup 1)
10595             (parallel [(const_int 2)
10596                        (const_int 6)
10597                        (const_int 10)
10598                        (const_int 14)])))
10599           (zero_extend:V4SI
10600            (vec_select:V4QI
10601             (match_dup 1)
10602             (parallel [(const_int 3)
10603                        (const_int 7)
10604                        (const_int 11)
10605                        (const_int 15)]))))))]
10606   "TARGET_XOP"
10607   "vphaddubd\t{%1, %0|%0, %1}"
10608   [(set_attr "type" "sseiadd1")])
10610 (define_insn "xop_phaddubq"
10611   [(set (match_operand:V2DI 0 "register_operand" "=x")
10612         (plus:V2DI
10613          (plus:V2DI
10614           (plus:V2DI
10615            (zero_extend:V2DI
10616             (vec_select:V2QI
10617              (match_operand:V16QI 1 "nonimmediate_operand" "xm")
10618              (parallel [(const_int 0)
10619                         (const_int 4)])))
10620            (sign_extend:V2DI
10621             (vec_select:V2QI
10622              (match_dup 1)
10623              (parallel [(const_int 1)
10624                         (const_int 5)]))))
10625           (plus:V2DI
10626            (zero_extend:V2DI
10627             (vec_select:V2QI
10628              (match_dup 1)
10629              (parallel [(const_int 2)
10630                         (const_int 6)])))
10631            (zero_extend:V2DI
10632             (vec_select:V2QI
10633              (match_dup 1)
10634              (parallel [(const_int 3)
10635                         (const_int 7)])))))
10636          (plus:V2DI
10637           (plus:V2DI
10638            (zero_extend:V2DI
10639             (vec_select:V2QI
10640              (match_dup 1)
10641              (parallel [(const_int 8)
10642                         (const_int 12)])))
10643            (sign_extend:V2DI
10644             (vec_select:V2QI
10645              (match_dup 1)
10646              (parallel [(const_int 9)
10647                         (const_int 13)]))))
10648           (plus:V2DI
10649            (zero_extend:V2DI
10650             (vec_select:V2QI
10651              (match_dup 1)
10652              (parallel [(const_int 10)
10653                         (const_int 14)])))
10654            (zero_extend:V2DI
10655             (vec_select:V2QI
10656              (match_dup 1)
10657              (parallel [(const_int 11)
10658                         (const_int 15)])))))))]
10659   "TARGET_XOP"
10660   "vphaddubq\t{%1, %0|%0, %1}"
10661   [(set_attr "type" "sseiadd1")])
10663 (define_insn "xop_phadduwd"
10664   [(set (match_operand:V4SI 0 "register_operand" "=x")
10665         (plus:V4SI
10666          (zero_extend:V4SI
10667           (vec_select:V4HI
10668            (match_operand:V8HI 1 "nonimmediate_operand" "xm")
10669            (parallel [(const_int 0)
10670                       (const_int 2)
10671                       (const_int 4)
10672                       (const_int 6)])))
10673          (zero_extend:V4SI
10674           (vec_select:V4HI
10675            (match_dup 1)
10676            (parallel [(const_int 1)
10677                       (const_int 3)
10678                       (const_int 5)
10679                       (const_int 7)])))))]
10680   "TARGET_XOP"
10681   "vphadduwd\t{%1, %0|%0, %1}"
10682   [(set_attr "type" "sseiadd1")])
10684 (define_insn "xop_phadduwq"
10685   [(set (match_operand:V2DI 0 "register_operand" "=x")
10686         (plus:V2DI
10687          (plus:V2DI
10688           (zero_extend:V2DI
10689            (vec_select:V2HI
10690             (match_operand:V8HI 1 "nonimmediate_operand" "xm")
10691             (parallel [(const_int 0)
10692                        (const_int 4)])))
10693           (zero_extend:V2DI
10694            (vec_select:V2HI
10695             (match_dup 1)
10696             (parallel [(const_int 1)
10697                        (const_int 5)]))))
10698          (plus:V2DI
10699           (zero_extend:V2DI
10700            (vec_select:V2HI
10701             (match_dup 1)
10702             (parallel [(const_int 2)
10703                        (const_int 6)])))
10704           (zero_extend:V2DI
10705            (vec_select:V2HI
10706             (match_dup 1)
10707             (parallel [(const_int 3)
10708                        (const_int 7)]))))))]
10709   "TARGET_XOP"
10710   "vphadduwq\t{%1, %0|%0, %1}"
10711   [(set_attr "type" "sseiadd1")])
10713 (define_insn "xop_phaddudq"
10714   [(set (match_operand:V2DI 0 "register_operand" "=x")
10715         (plus:V2DI
10716          (zero_extend:V2DI
10717           (vec_select:V2SI
10718            (match_operand:V4SI 1 "nonimmediate_operand" "xm")
10719            (parallel [(const_int 0)
10720                       (const_int 2)])))
10721          (zero_extend:V2DI
10722           (vec_select:V2SI
10723            (match_dup 1)
10724            (parallel [(const_int 1)
10725                       (const_int 3)])))))]
10726   "TARGET_XOP"
10727   "vphaddudq\t{%1, %0|%0, %1}"
10728   [(set_attr "type" "sseiadd1")])
10730 (define_insn "xop_phsubbw"
10731   [(set (match_operand:V8HI 0 "register_operand" "=x")
10732         (minus:V8HI
10733          (sign_extend:V8HI
10734           (vec_select:V8QI
10735            (match_operand:V16QI 1 "nonimmediate_operand" "xm")
10736            (parallel [(const_int 0)
10737                       (const_int 2)
10738                       (const_int 4)
10739                       (const_int 6)
10740                       (const_int 8)
10741                       (const_int 10)
10742                       (const_int 12)
10743                       (const_int 14)])))
10744          (sign_extend:V8HI
10745           (vec_select:V8QI
10746            (match_dup 1)
10747            (parallel [(const_int 1)
10748                       (const_int 3)
10749                       (const_int 5)
10750                       (const_int 7)
10751                       (const_int 9)
10752                       (const_int 11)
10753                       (const_int 13)
10754                       (const_int 15)])))))]
10755   "TARGET_XOP"
10756   "vphsubbw\t{%1, %0|%0, %1}"
10757   [(set_attr "type" "sseiadd1")])
10759 (define_insn "xop_phsubwd"
10760   [(set (match_operand:V4SI 0 "register_operand" "=x")
10761         (minus:V4SI
10762          (sign_extend:V4SI
10763           (vec_select:V4HI
10764            (match_operand:V8HI 1 "nonimmediate_operand" "xm")
10765            (parallel [(const_int 0)
10766                       (const_int 2)
10767                       (const_int 4)
10768                       (const_int 6)])))
10769          (sign_extend:V4SI
10770           (vec_select:V4HI
10771            (match_dup 1)
10772            (parallel [(const_int 1)
10773                       (const_int 3)
10774                       (const_int 5)
10775                       (const_int 7)])))))]
10776   "TARGET_XOP"
10777   "vphsubwd\t{%1, %0|%0, %1}"
10778   [(set_attr "type" "sseiadd1")])
10780 (define_insn "xop_phsubdq"
10781   [(set (match_operand:V2DI 0 "register_operand" "=x")
10782         (minus:V2DI
10783          (sign_extend:V2DI
10784           (vec_select:V2SI
10785            (match_operand:V4SI 1 "nonimmediate_operand" "xm")
10786            (parallel [(const_int 0)
10787                       (const_int 2)])))
10788          (sign_extend:V2DI
10789           (vec_select:V2SI
10790            (match_dup 1)
10791            (parallel [(const_int 1)
10792                       (const_int 3)])))))]
10793   "TARGET_XOP"
10794   "vphsubdq\t{%1, %0|%0, %1}"
10795   [(set_attr "type" "sseiadd1")])
10797 ;; XOP permute instructions
10798 (define_insn "xop_pperm"
10799   [(set (match_operand:V16QI 0 "register_operand" "=x,x")
10800         (unspec:V16QI
10801           [(match_operand:V16QI 1 "register_operand" "x,x")
10802            (match_operand:V16QI 2 "nonimmediate_operand" "x,m")
10803            (match_operand:V16QI 3 "nonimmediate_operand" "xm,x")]
10804           UNSPEC_XOP_PERMUTE))]
10805   "TARGET_XOP && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
10806   "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10807   [(set_attr "type" "sse4arg")
10808    (set_attr "mode" "TI")])
10810 ;; XOP pack instructions that combine two vectors into a smaller vector
10811 (define_insn "xop_pperm_pack_v2di_v4si"
10812   [(set (match_operand:V4SI 0 "register_operand" "=x,x")
10813         (vec_concat:V4SI
10814          (truncate:V2SI
10815           (match_operand:V2DI 1 "register_operand" "x,x"))
10816          (truncate:V2SI
10817           (match_operand:V2DI 2 "nonimmediate_operand" "x,m"))))
10818    (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x"))]
10819   "TARGET_XOP && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
10820   "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10821   [(set_attr "type" "sse4arg")
10822    (set_attr "mode" "TI")])
10824 (define_insn "xop_pperm_pack_v4si_v8hi"
10825   [(set (match_operand:V8HI 0 "register_operand" "=x,x")
10826         (vec_concat:V8HI
10827          (truncate:V4HI
10828           (match_operand:V4SI 1 "register_operand" "x,x"))
10829          (truncate:V4HI
10830           (match_operand:V4SI 2 "nonimmediate_operand" "x,m"))))
10831    (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x"))]
10832   "TARGET_XOP && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
10833   "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10834   [(set_attr "type" "sse4arg")
10835    (set_attr "mode" "TI")])
10837 (define_insn "xop_pperm_pack_v8hi_v16qi"
10838   [(set (match_operand:V16QI 0 "register_operand" "=x,x")
10839         (vec_concat:V16QI
10840          (truncate:V8QI
10841           (match_operand:V8HI 1 "register_operand" "x,x"))
10842          (truncate:V8QI
10843           (match_operand:V8HI 2 "nonimmediate_operand" "x,m"))))
10844    (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x"))]
10845   "TARGET_XOP && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
10846   "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
10847   [(set_attr "type" "sse4arg")
10848    (set_attr "mode" "TI")])
10850 ;; XOP packed rotate instructions
10851 (define_expand "rotl<mode>3"
10852   [(set (match_operand:SSEMODE1248 0 "register_operand" "")
10853         (rotate:SSEMODE1248
10854          (match_operand:SSEMODE1248 1 "nonimmediate_operand" "")
10855          (match_operand:SI 2 "general_operand")))]
10856   "TARGET_XOP"
10858   /* If we were given a scalar, convert it to parallel */
10859   if (! const_0_to_<sserotatemax>_operand (operands[2], SImode))
10860     {
10861       rtvec vs = rtvec_alloc (<ssescalarnum>);
10862       rtx par = gen_rtx_PARALLEL (<MODE>mode, vs);
10863       rtx reg = gen_reg_rtx (<MODE>mode);
10864       rtx op2 = operands[2];
10865       int i;
10867       if (GET_MODE (op2) != <ssescalarmode>mode)
10868         {
10869           op2 = gen_reg_rtx (<ssescalarmode>mode);
10870           convert_move (op2, operands[2], false);
10871         }
10873       for (i = 0; i < <ssescalarnum>; i++)
10874         RTVEC_ELT (vs, i) = op2;
10876       emit_insn (gen_vec_init<mode> (reg, par));
10877       emit_insn (gen_xop_vrotl<mode>3 (operands[0], operands[1], reg));
10878       DONE;
10879     }
10882 (define_expand "rotr<mode>3"
10883   [(set (match_operand:SSEMODE1248 0 "register_operand" "")
10884         (rotatert:SSEMODE1248
10885          (match_operand:SSEMODE1248 1 "nonimmediate_operand" "")
10886          (match_operand:SI 2 "general_operand")))]
10887   "TARGET_XOP"
10889   /* If we were given a scalar, convert it to parallel */
10890   if (! const_0_to_<sserotatemax>_operand (operands[2], SImode))
10891     {
10892       rtvec vs = rtvec_alloc (<ssescalarnum>);
10893       rtx par = gen_rtx_PARALLEL (<MODE>mode, vs);
10894       rtx neg = gen_reg_rtx (<MODE>mode);
10895       rtx reg = gen_reg_rtx (<MODE>mode);
10896       rtx op2 = operands[2];
10897       int i;
10899       if (GET_MODE (op2) != <ssescalarmode>mode)
10900         {
10901           op2 = gen_reg_rtx (<ssescalarmode>mode);
10902           convert_move (op2, operands[2], false);
10903         }
10905       for (i = 0; i < <ssescalarnum>; i++)
10906         RTVEC_ELT (vs, i) = op2;
10908       emit_insn (gen_vec_init<mode> (reg, par));
10909       emit_insn (gen_neg<mode>2 (neg, reg));
10910       emit_insn (gen_xop_vrotl<mode>3 (operands[0], operands[1], neg));
10911       DONE;
10912     }
10915 (define_insn "xop_rotl<mode>3"
10916   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x")
10917         (rotate:SSEMODE1248
10918          (match_operand:SSEMODE1248 1 "nonimmediate_operand" "xm")
10919          (match_operand:SI 2 "const_0_to_<sserotatemax>_operand" "n")))]
10920   "TARGET_XOP"
10921   "vprot<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
10922   [(set_attr "type" "sseishft")
10923    (set_attr "length_immediate" "1")
10924    (set_attr "mode" "TI")])
10926 (define_insn "xop_rotr<mode>3"
10927   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x")
10928         (rotatert:SSEMODE1248
10929          (match_operand:SSEMODE1248 1 "nonimmediate_operand" "xm")
10930          (match_operand:SI 2 "const_0_to_<sserotatemax>_operand" "n")))]
10931   "TARGET_XOP"
10933   operands[3] = GEN_INT ((<ssescalarnum> * 8) - INTVAL (operands[2]));
10934   return \"vprot<ssevecsize>\t{%3, %1, %0|%0, %1, %3}\";
10936   [(set_attr "type" "sseishft")
10937    (set_attr "length_immediate" "1")
10938    (set_attr "mode" "TI")])
10940 (define_expand "vrotr<mode>3"
10941   [(match_operand:SSEMODE1248 0 "register_operand" "")
10942    (match_operand:SSEMODE1248 1 "register_operand" "")
10943    (match_operand:SSEMODE1248 2 "register_operand" "")]
10944   "TARGET_XOP"
10946   rtx reg = gen_reg_rtx (<MODE>mode);
10947   emit_insn (gen_neg<mode>2 (reg, operands[2]));
10948   emit_insn (gen_xop_vrotl<mode>3 (operands[0], operands[1], reg));
10949   DONE;
10952 (define_expand "vrotl<mode>3"
10953   [(match_operand:SSEMODE1248 0 "register_operand" "")
10954    (match_operand:SSEMODE1248 1 "register_operand" "")
10955    (match_operand:SSEMODE1248 2 "register_operand" "")]
10956   "TARGET_XOP"
10958   emit_insn (gen_xop_vrotl<mode>3 (operands[0], operands[1], operands[2]));
10959   DONE;
10962 (define_insn "xop_vrotl<mode>3"
10963   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x,x")
10964         (if_then_else:SSEMODE1248
10965          (ge:SSEMODE1248
10966           (match_operand:SSEMODE1248 2 "nonimmediate_operand" "x,m")
10967           (const_int 0))
10968          (rotate:SSEMODE1248
10969           (match_operand:SSEMODE1248 1 "nonimmediate_operand" "xm,x")
10970           (match_dup 2))
10971          (rotatert:SSEMODE1248
10972           (match_dup 1)
10973           (neg:SSEMODE1248 (match_dup 2)))))]
10974   "TARGET_XOP && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
10975   "vprot<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
10976   [(set_attr "type" "sseishft")
10977    (set_attr "prefix_data16" "0")
10978    (set_attr "prefix_extra" "2")
10979    (set_attr "mode" "TI")])
10981 ;; XOP packed shift instructions.
10982 ;; FIXME: add V2DI back in
10983 (define_expand "vlshr<mode>3"
10984   [(match_operand:SSEMODE124 0 "register_operand" "")
10985    (match_operand:SSEMODE124 1 "register_operand" "")
10986    (match_operand:SSEMODE124 2 "register_operand" "")]
10987   "TARGET_XOP"
10989   rtx neg = gen_reg_rtx (<MODE>mode);
10990   emit_insn (gen_neg<mode>2 (neg, operands[2]));
10991   emit_insn (gen_xop_lshl<mode>3 (operands[0], operands[1], neg));
10992   DONE;
10995 (define_expand "vashr<mode>3"
10996   [(match_operand:SSEMODE124 0 "register_operand" "")
10997    (match_operand:SSEMODE124 1 "register_operand" "")
10998    (match_operand:SSEMODE124 2 "register_operand" "")]
10999   "TARGET_XOP"
11001   rtx neg = gen_reg_rtx (<MODE>mode);
11002   emit_insn (gen_neg<mode>2 (neg, operands[2]));
11003   emit_insn (gen_xop_ashl<mode>3 (operands[0], operands[1], neg));
11004   DONE;
11007 (define_expand "vashl<mode>3"
11008   [(match_operand:SSEMODE124 0 "register_operand" "")
11009    (match_operand:SSEMODE124 1 "register_operand" "")
11010    (match_operand:SSEMODE124 2 "register_operand" "")]
11011   "TARGET_XOP"
11013   emit_insn (gen_xop_ashl<mode>3 (operands[0], operands[1], operands[2]));
11014   DONE;
11017 (define_insn "xop_ashl<mode>3"
11018   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x,x")
11019         (if_then_else:SSEMODE1248
11020          (ge:SSEMODE1248
11021           (match_operand:SSEMODE1248 2 "nonimmediate_operand" "x,m")
11022           (const_int 0))
11023          (ashift:SSEMODE1248
11024           (match_operand:SSEMODE1248 1 "nonimmediate_operand" "xm,x")
11025           (match_dup 2))
11026          (ashiftrt:SSEMODE1248
11027           (match_dup 1)
11028           (neg:SSEMODE1248 (match_dup 2)))))]
11029   "TARGET_XOP && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11030   "vpsha<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
11031   [(set_attr "type" "sseishft")
11032    (set_attr "prefix_data16" "0")
11033    (set_attr "prefix_extra" "2")
11034    (set_attr "mode" "TI")])
11036 (define_insn "xop_lshl<mode>3"
11037   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x,x")
11038         (if_then_else:SSEMODE1248
11039          (ge:SSEMODE1248
11040           (match_operand:SSEMODE1248 2 "nonimmediate_operand" "x,m")
11041           (const_int 0))
11042          (ashift:SSEMODE1248
11043           (match_operand:SSEMODE1248 1 "nonimmediate_operand" "xm,x")
11044           (match_dup 2))
11045          (lshiftrt:SSEMODE1248
11046           (match_dup 1)
11047           (neg:SSEMODE1248 (match_dup 2)))))]
11048   "TARGET_XOP && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
11049   "vpshl<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
11050   [(set_attr "type" "sseishft")
11051    (set_attr "prefix_data16" "0")
11052    (set_attr "prefix_extra" "2")
11053    (set_attr "mode" "TI")])
11055 ;; SSE2 doesn't have some shift varients, so define versions for XOP
11056 (define_expand "ashlv16qi3"
11057   [(match_operand:V16QI 0 "register_operand" "")
11058    (match_operand:V16QI 1 "register_operand" "")
11059    (match_operand:SI 2 "nonmemory_operand" "")]
11060   "TARGET_XOP"
11062   rtvec vs = rtvec_alloc (16);
11063   rtx par = gen_rtx_PARALLEL (V16QImode, vs);
11064   rtx reg = gen_reg_rtx (V16QImode);
11065   int i;
11066   for (i = 0; i < 16; i++)
11067     RTVEC_ELT (vs, i) = operands[2];
11069   emit_insn (gen_vec_initv16qi (reg, par));
11070   emit_insn (gen_xop_ashlv16qi3 (operands[0], operands[1], reg));
11071   DONE;
11074 (define_expand "lshlv16qi3"
11075   [(match_operand:V16QI 0 "register_operand" "")
11076    (match_operand:V16QI 1 "register_operand" "")
11077    (match_operand:SI 2 "nonmemory_operand" "")]
11078   "TARGET_XOP"
11080   rtvec vs = rtvec_alloc (16);
11081   rtx par = gen_rtx_PARALLEL (V16QImode, vs);
11082   rtx reg = gen_reg_rtx (V16QImode);
11083   int i;
11084   for (i = 0; i < 16; i++)
11085     RTVEC_ELT (vs, i) = operands[2];
11087   emit_insn (gen_vec_initv16qi (reg, par));
11088   emit_insn (gen_xop_lshlv16qi3 (operands[0], operands[1], reg));
11089   DONE;
11092 (define_expand "ashrv16qi3"
11093   [(match_operand:V16QI 0 "register_operand" "")
11094    (match_operand:V16QI 1 "register_operand" "")
11095    (match_operand:SI 2 "nonmemory_operand" "")]
11096   "TARGET_XOP"
11098   rtvec vs = rtvec_alloc (16);
11099   rtx par = gen_rtx_PARALLEL (V16QImode, vs);
11100   rtx reg = gen_reg_rtx (V16QImode);
11101   int i;
11102   rtx ele = ((CONST_INT_P (operands[2]))
11103              ? GEN_INT (- INTVAL (operands[2]))
11104              : operands[2]);
11106   for (i = 0; i < 16; i++)
11107     RTVEC_ELT (vs, i) = ele;
11109   emit_insn (gen_vec_initv16qi (reg, par));
11111   if (!CONST_INT_P (operands[2]))
11112     {
11113       rtx neg = gen_reg_rtx (V16QImode);
11114       emit_insn (gen_negv16qi2 (neg, reg));
11115       emit_insn (gen_xop_ashlv16qi3 (operands[0], operands[1], neg));
11116     }
11117   else
11118     emit_insn (gen_xop_ashlv16qi3 (operands[0], operands[1], reg));
11120   DONE;
11123 (define_expand "ashrv2di3"
11124   [(match_operand:V2DI 0 "register_operand" "")
11125    (match_operand:V2DI 1 "register_operand" "")
11126    (match_operand:DI 2 "nonmemory_operand" "")]
11127   "TARGET_XOP"
11129   rtvec vs = rtvec_alloc (2);
11130   rtx par = gen_rtx_PARALLEL (V2DImode, vs);
11131   rtx reg = gen_reg_rtx (V2DImode);
11132   rtx ele;
11134   if (CONST_INT_P (operands[2]))
11135     ele = GEN_INT (- INTVAL (operands[2]));
11136   else if (GET_MODE (operands[2]) != DImode)
11137     {
11138       rtx move = gen_reg_rtx (DImode);
11139       ele = gen_reg_rtx (DImode);
11140       convert_move (move, operands[2], false);
11141       emit_insn (gen_negdi2 (ele, move));
11142     }
11143   else
11144     {
11145       ele = gen_reg_rtx (DImode);
11146       emit_insn (gen_negdi2 (ele, operands[2]));
11147     }
11149   RTVEC_ELT (vs, 0) = ele;
11150   RTVEC_ELT (vs, 1) = ele;
11151   emit_insn (gen_vec_initv2di (reg, par));
11152   emit_insn (gen_xop_ashlv2di3 (operands[0], operands[1], reg));
11153   DONE;
11156 ;; XOP FRCZ support
11157 ;; parallel insns
11158 (define_insn "xop_frcz<mode>2"
11159   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
11160         (unspec:SSEMODEF2P
11161          [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "xm")]
11162          UNSPEC_FRCZ))]
11163   "TARGET_XOP"
11164   "vfrcz<ssemodesuffix>\t{%1, %0|%0, %1}"
11165   [(set_attr "type" "ssecvt1")
11166    (set_attr "mode" "<MODE>")])
11168 ;; scalar insns
11169 (define_insn "xop_vmfrcz<mode>2"
11170   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
11171         (vec_merge:SSEMODEF2P
11172           (unspec:SSEMODEF2P
11173            [(match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")]
11174            UNSPEC_FRCZ)
11175           (match_operand:SSEMODEF2P 1 "register_operand" "0")
11176           (const_int 1)))]
11177   "TARGET_XOP"
11178   "vfrcz<ssescalarmodesuffix>\t{%2, %0|%0, %2}"
11179   [(set_attr "type" "ssecvt1")
11180    (set_attr "mode" "<MODE>")])
11182 (define_insn "xop_frcz<mode>2256"
11183   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x")
11184         (unspec:FMA4MODEF4
11185          [(match_operand:FMA4MODEF4 1 "nonimmediate_operand" "xm")]
11186          UNSPEC_FRCZ))]
11187   "TARGET_XOP"
11188   "vfrcz<ssemodesuffix>\t{%1, %0|%0, %1}"
11189   [(set_attr "type" "ssecvt1")
11190    (set_attr "mode" "<MODE>")])
11192 (define_insn "xop_maskcmp<mode>3"
11193   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x")
11194         (match_operator:SSEMODE1248 1 "ix86_comparison_int_operator"
11195          [(match_operand:SSEMODE1248 2 "register_operand" "x")
11196           (match_operand:SSEMODE1248 3 "nonimmediate_operand" "xm")]))]
11197   "TARGET_XOP"
11198   "vpcom%Y1<ssevecsize>\t{%3, %2, %0|%0, %2, %3}"
11199   [(set_attr "type" "sse4arg")
11200    (set_attr "prefix_data16" "0")
11201    (set_attr "prefix_rep" "0")
11202    (set_attr "prefix_extra" "2")
11203    (set_attr "length_immediate" "1")
11204    (set_attr "mode" "TI")])
11206 (define_insn "xop_maskcmp_uns<mode>3"
11207   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x")
11208         (match_operator:SSEMODE1248 1 "ix86_comparison_uns_operator"
11209          [(match_operand:SSEMODE1248 2 "register_operand" "x")
11210           (match_operand:SSEMODE1248 3 "nonimmediate_operand" "xm")]))]
11211   "TARGET_XOP"
11212   "vpcom%Y1u<ssevecsize>\t{%3, %2, %0|%0, %2, %3}"
11213   [(set_attr "type" "ssecmp")
11214    (set_attr "prefix_data16" "0")
11215    (set_attr "prefix_rep" "0")
11216    (set_attr "prefix_extra" "2")
11217    (set_attr "length_immediate" "1")
11218    (set_attr "mode" "TI")])
11220 ;; Version of pcom*u* that is called from the intrinsics that allows pcomequ*
11221 ;; and pcomneu* not to be converted to the signed ones in case somebody needs
11222 ;; the exact instruction generated for the intrinsic.
11223 (define_insn "xop_maskcmp_uns2<mode>3"
11224   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x")
11225         (unspec:SSEMODE1248
11226          [(match_operator:SSEMODE1248 1 "ix86_comparison_uns_operator"
11227           [(match_operand:SSEMODE1248 2 "register_operand" "x")
11228            (match_operand:SSEMODE1248 3 "nonimmediate_operand" "xm")])]
11229          UNSPEC_XOP_UNSIGNED_CMP))]
11230   "TARGET_XOP"
11231   "vpcom%Y1u<ssevecsize>\t{%3, %2, %0|%0, %2, %3}"
11232   [(set_attr "type" "ssecmp")
11233    (set_attr "prefix_data16" "0")
11234    (set_attr "prefix_extra" "2")
11235    (set_attr "length_immediate" "1")
11236    (set_attr "mode" "TI")])
11238 ;; Pcomtrue and pcomfalse support.  These are useless instructions, but are
11239 ;; being added here to be complete.
11240 (define_insn "xop_pcom_tf<mode>3"
11241   [(set (match_operand:SSEMODE1248 0 "register_operand" "=x")
11242         (unspec:SSEMODE1248
11243           [(match_operand:SSEMODE1248 1 "register_operand" "x")
11244            (match_operand:SSEMODE1248 2 "nonimmediate_operand" "xm")
11245            (match_operand:SI 3 "const_int_operand" "n")]
11246           UNSPEC_XOP_TRUEFALSE))]
11247   "TARGET_XOP"
11249   return ((INTVAL (operands[3]) != 0)
11250           ? "vpcomtrue<ssevecsize>\t{%2, %1, %0|%0, %1, %2}"
11251           : "vpcomfalse<ssevecsize>\t{%2, %1, %0|%0, %1, %2}");
11253   [(set_attr "type" "ssecmp")
11254    (set_attr "prefix_data16" "0")
11255    (set_attr "prefix_extra" "2")
11256    (set_attr "length_immediate" "1")
11257    (set_attr "mode" "TI")])
11259 (define_insn "xop_vpermil2<mode>3"
11260   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
11261         (unspec:AVXMODEF2P
11262           [(match_operand:AVXMODEF2P 1 "register_operand" "x")
11263            (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "%x")
11264            (match_operand:<avxpermvecmode> 3 "nonimmediate_operand" "xm")
11265            (match_operand:SI 4 "const_0_to_3_operand" "n")]
11266           UNSPEC_VPERMIL2))]
11267   "TARGET_XOP"
11268   "vpermil2<ssemodesuffix>\t{%4, %3, %2, %1, %0|%0, %1, %2, %3, %4}"
11269   [(set_attr "type" "sse4arg")
11270    (set_attr "length_immediate" "1")
11271    (set_attr "mode" "<MODE>")])
11273 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11274 (define_insn "*avx_aesenc"
11275   [(set (match_operand:V2DI 0 "register_operand" "=x")
11276         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "x")
11277                        (match_operand:V2DI 2 "nonimmediate_operand" "xm")]
11278                       UNSPEC_AESENC))]
11279   "TARGET_AES && TARGET_AVX"
11280   "vaesenc\t{%2, %1, %0|%0, %1, %2}"
11281   [(set_attr "type" "sselog1")
11282    (set_attr "prefix_extra" "1")
11283    (set_attr "prefix" "vex")
11284    (set_attr "mode" "TI")])
11286 (define_insn "aesenc"
11287   [(set (match_operand:V2DI 0 "register_operand" "=x")
11288         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
11289                        (match_operand:V2DI 2 "nonimmediate_operand" "xm")]
11290                       UNSPEC_AESENC))]
11291   "TARGET_AES"
11292   "aesenc\t{%2, %0|%0, %2}"
11293   [(set_attr "type" "sselog1")
11294    (set_attr "prefix_extra" "1")
11295    (set_attr "mode" "TI")])
11297 (define_insn "*avx_aesenclast"
11298   [(set (match_operand:V2DI 0 "register_operand" "=x")
11299         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "x")
11300                        (match_operand:V2DI 2 "nonimmediate_operand" "xm")]
11301                       UNSPEC_AESENCLAST))]
11302   "TARGET_AES && TARGET_AVX"
11303   "vaesenclast\t{%2, %1, %0|%0, %1, %2}"
11304   [(set_attr "type" "sselog1")
11305    (set_attr "prefix_extra" "1")
11306    (set_attr "prefix" "vex")
11307    (set_attr "mode" "TI")])
11309 (define_insn "aesenclast"
11310   [(set (match_operand:V2DI 0 "register_operand" "=x")
11311         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
11312                        (match_operand:V2DI 2 "nonimmediate_operand" "xm")]
11313                       UNSPEC_AESENCLAST))]
11314   "TARGET_AES"
11315   "aesenclast\t{%2, %0|%0, %2}"
11316   [(set_attr "type" "sselog1")
11317    (set_attr "prefix_extra" "1")
11318    (set_attr "mode" "TI")])
11320 (define_insn "*avx_aesdec"
11321   [(set (match_operand:V2DI 0 "register_operand" "=x")
11322         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "x")
11323                        (match_operand:V2DI 2 "nonimmediate_operand" "xm")]
11324                       UNSPEC_AESDEC))]
11325   "TARGET_AES && TARGET_AVX"
11326   "vaesdec\t{%2, %1, %0|%0, %1, %2}"
11327   [(set_attr "type" "sselog1")
11328    (set_attr "prefix_extra" "1")
11329    (set_attr "prefix" "vex")
11330    (set_attr "mode" "TI")])
11332 (define_insn "aesdec"
11333   [(set (match_operand:V2DI 0 "register_operand" "=x")
11334         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
11335                        (match_operand:V2DI 2 "nonimmediate_operand" "xm")]
11336                       UNSPEC_AESDEC))]
11337   "TARGET_AES"
11338   "aesdec\t{%2, %0|%0, %2}"
11339   [(set_attr "type" "sselog1")
11340    (set_attr "prefix_extra" "1")
11341    (set_attr "mode" "TI")])
11343 (define_insn "*avx_aesdeclast"
11344   [(set (match_operand:V2DI 0 "register_operand" "=x")
11345         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "x")
11346                        (match_operand:V2DI 2 "nonimmediate_operand" "xm")]
11347                       UNSPEC_AESDECLAST))]
11348   "TARGET_AES && TARGET_AVX"
11349   "vaesdeclast\t{%2, %1, %0|%0, %1, %2}"
11350   [(set_attr "type" "sselog1")
11351    (set_attr "prefix_extra" "1")
11352    (set_attr "prefix" "vex")
11353    (set_attr "mode" "TI")])
11355 (define_insn "aesdeclast"
11356   [(set (match_operand:V2DI 0 "register_operand" "=x")
11357         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
11358                        (match_operand:V2DI 2 "nonimmediate_operand" "xm")]
11359                       UNSPEC_AESDECLAST))]
11360   "TARGET_AES"
11361   "aesdeclast\t{%2, %0|%0, %2}"
11362   [(set_attr "type" "sselog1")
11363    (set_attr "prefix_extra" "1")
11364    (set_attr "mode" "TI")])
11366 (define_insn "aesimc"
11367   [(set (match_operand:V2DI 0 "register_operand" "=x")
11368         (unspec:V2DI [(match_operand:V2DI 1 "nonimmediate_operand" "xm")]
11369                       UNSPEC_AESIMC))]
11370   "TARGET_AES"
11371   "%vaesimc\t{%1, %0|%0, %1}"
11372   [(set_attr "type" "sselog1")
11373    (set_attr "prefix_extra" "1")
11374    (set_attr "prefix" "maybe_vex")
11375    (set_attr "mode" "TI")])
11377 (define_insn "aeskeygenassist"
11378   [(set (match_operand:V2DI 0 "register_operand" "=x")
11379         (unspec:V2DI [(match_operand:V2DI 1 "nonimmediate_operand" "xm")
11380                       (match_operand:SI 2 "const_0_to_255_operand" "n")]
11381                      UNSPEC_AESKEYGENASSIST))]
11382   "TARGET_AES"
11383   "%vaeskeygenassist\t{%2, %1, %0|%0, %1, %2}"
11384   [(set_attr "type" "sselog1")
11385    (set_attr "prefix_extra" "1")
11386    (set_attr "length_immediate" "1")
11387    (set_attr "prefix" "maybe_vex")
11388    (set_attr "mode" "TI")])
11390 (define_insn "*vpclmulqdq"
11391   [(set (match_operand:V2DI 0 "register_operand" "=x")
11392         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "x")
11393                       (match_operand:V2DI 2 "nonimmediate_operand" "xm")
11394                       (match_operand:SI 3 "const_0_to_255_operand" "n")]
11395                      UNSPEC_PCLMUL))]
11396   "TARGET_PCLMUL && TARGET_AVX"
11397   "vpclmulqdq\t{%3, %2, %1, %0|%0, %1, %2, %3}"
11398   [(set_attr "type" "sselog1")
11399    (set_attr "prefix_extra" "1")
11400    (set_attr "length_immediate" "1")
11401    (set_attr "prefix" "vex")
11402    (set_attr "mode" "TI")])
11404 (define_insn "pclmulqdq"
11405   [(set (match_operand:V2DI 0 "register_operand" "=x")
11406         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
11407                       (match_operand:V2DI 2 "nonimmediate_operand" "xm")
11408                       (match_operand:SI 3 "const_0_to_255_operand" "n")]
11409                      UNSPEC_PCLMUL))]
11410   "TARGET_PCLMUL"
11411   "pclmulqdq\t{%3, %2, %0|%0, %2, %3}"
11412   [(set_attr "type" "sselog1")
11413    (set_attr "prefix_extra" "1")
11414    (set_attr "length_immediate" "1")
11415    (set_attr "mode" "TI")])
11417 (define_expand "avx_vzeroall"
11418   [(match_par_dup 0 [(const_int 0)])]
11419   "TARGET_AVX"
11421   int nregs = TARGET_64BIT ? 16 : 8;
11422   int regno;
11424   operands[0] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nregs + 1));
11426   XVECEXP (operands[0], 0, 0)
11427     = gen_rtx_UNSPEC_VOLATILE (VOIDmode, gen_rtvec (1, const0_rtx),
11428                                UNSPECV_VZEROALL);
11430   for (regno = 0; regno < nregs; regno++)
11431     XVECEXP (operands[0], 0, regno + 1)
11432       = gen_rtx_SET (VOIDmode,
11433                      gen_rtx_REG (V8SImode, SSE_REGNO (regno)),
11434                      CONST0_RTX (V8SImode));
11437 (define_insn "*avx_vzeroall"
11438   [(match_parallel 0 "vzeroall_operation"
11439     [(unspec_volatile [(const_int 0)] UNSPECV_VZEROALL)])]
11440   "TARGET_AVX"
11441   "vzeroall"
11442   [(set_attr "type" "sse")
11443    (set_attr "modrm" "0")
11444    (set_attr "memory" "none")
11445    (set_attr "prefix" "vex")
11446    (set_attr "mode" "OI")])
11448 ;; vzeroupper clobbers the upper 128bits of AVX registers.
11449 (define_expand "avx_vzeroupper"
11450   [(match_par_dup 0 [(const_int 0)])]
11451   "TARGET_AVX"
11453   int nregs = TARGET_64BIT ? 16 : 8;
11454   int regno;
11456   operands[0] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nregs + 1));
11458   XVECEXP (operands[0], 0, 0)
11459     = gen_rtx_UNSPEC_VOLATILE (VOIDmode, gen_rtvec (1, const0_rtx),
11460                                UNSPECV_VZEROUPPER);
11462   for (regno = 0; regno < nregs; regno++)
11463     XVECEXP (operands[0], 0, regno + 1)
11464       = gen_rtx_CLOBBER (VOIDmode,
11465                          gen_rtx_REG (V8SImode, SSE_REGNO (regno)));
11468 (define_insn "*avx_vzeroupper"
11469   [(match_parallel 0 "vzeroupper_operation"
11470     [(unspec_volatile [(const_int 0)] UNSPECV_VZEROUPPER)])]
11471   "TARGET_AVX"
11472   "vzeroupper"
11473   [(set_attr "type" "sse")
11474    (set_attr "modrm" "0")
11475    (set_attr "memory" "none")
11476    (set_attr "prefix" "vex")
11477    (set_attr "mode" "OI")])
11479 (define_insn_and_split "vec_dup<mode>"
11480   [(set (match_operand:AVX256MODE24P 0 "register_operand" "=x,x")
11481         (vec_duplicate:AVX256MODE24P
11482           (match_operand:<avxscalarmode> 1 "nonimmediate_operand" "m,?x")))]
11483   "TARGET_AVX"
11484   "@
11485    vbroadcast<ssescalarmodesuffix>\t{%1, %0|%0, %1}
11486    #"
11487   "&& reload_completed && REG_P (operands[1])"
11488   [(set (match_dup 2) (vec_duplicate:<avxhalfvecmode> (match_dup 1)))
11489    (set (match_dup 0) (vec_concat:AVX256MODE24P (match_dup 2) (match_dup 2)))]
11490   "operands[2] = gen_rtx_REG (<avxhalfvecmode>mode, REGNO (operands[0]));"
11491   [(set_attr "type" "ssemov")
11492    (set_attr "prefix_extra" "1")
11493    (set_attr "prefix" "vex")
11494    (set_attr "mode" "V8SF")])
11496 (define_insn "avx_vbroadcastf128_<mode>"
11497   [(set (match_operand:AVX256MODE 0 "register_operand" "=x,x,x")
11498         (vec_concat:AVX256MODE
11499           (match_operand:<avxhalfvecmode> 1 "nonimmediate_operand" "m,0,?x")
11500           (match_dup 1)))]
11501   "TARGET_AVX"
11502   "@
11503    vbroadcastf128\t{%1, %0|%0, %1}
11504    vinsertf128\t{$1, %1, %0, %0|%0, %0, %1, 1}
11505    vperm2f128\t{$0, %t1, %t1, %0|%0, %t1, %t1, 0}"
11506   [(set_attr "type" "ssemov,sselog1,sselog1")
11507    (set_attr "prefix_extra" "1")
11508    (set_attr "length_immediate" "0,1,1")
11509    (set_attr "prefix" "vex")
11510    (set_attr "mode" "V4SF,V8SF,V8SF")])
11512 ;; Recognize broadcast as a vec_select as produced by builtin_vec_perm.
11513 ;; If it so happens that the input is in memory, use vbroadcast.
11514 ;; Otherwise use vpermilp (and in the case of 256-bit modes, vperm2f128).
11515 (define_insn "*avx_vperm_broadcast_v4sf"
11516   [(set (match_operand:V4SF 0 "register_operand" "=x,x,x")
11517         (vec_select:V4SF
11518           (match_operand:V4SF 1 "nonimmediate_operand" "m,o,x")
11519           (match_parallel 2 "avx_vbroadcast_operand"
11520             [(match_operand 3 "const_int_operand" "C,n,n")])))]
11521   "TARGET_AVX"
11523   int elt = INTVAL (operands[3]);
11524   switch (which_alternative)
11525     {
11526     case 0:
11527     case 1:
11528       operands[1] = adjust_address_nv (operands[1], SFmode, elt * 4);
11529       return "vbroadcastss\t{%1, %0|%0, %1}";
11530     case 2:
11531       operands[2] = GEN_INT (elt * 0x55);
11532       return "vpermilps\t{%2, %1, %0|%0, %1, %2}";
11533     default:
11534       gcc_unreachable ();
11535     }
11537   [(set_attr "type" "ssemov,ssemov,sselog1")
11538    (set_attr "prefix_extra" "1")
11539    (set_attr "length_immediate" "0,0,1")
11540    (set_attr "prefix" "vex")
11541    (set_attr "mode" "SF,SF,V4SF")])
11543 (define_insn_and_split "*avx_vperm_broadcast_<mode>"
11544   [(set (match_operand:AVX256MODEF2P 0 "register_operand" "=x,x,x")
11545         (vec_select:AVX256MODEF2P
11546           (match_operand:AVX256MODEF2P 1 "nonimmediate_operand" "m,o,?x")
11547           (match_parallel 2 "avx_vbroadcast_operand"
11548             [(match_operand 3 "const_int_operand" "C,n,n")])))]
11549   "TARGET_AVX"
11550   "#"
11551   "&& reload_completed"
11552   [(set (match_dup 0) (vec_duplicate:AVX256MODEF2P (match_dup 1)))]
11554   rtx op0 = operands[0], op1 = operands[1];
11555   int elt = INTVAL (operands[3]);
11557   if (REG_P (op1))
11558     {
11559       int mask;
11561       /* Shuffle element we care about into all elements of the 128-bit lane.
11562          The other lane gets shuffled too, but we don't care.  */
11563       if (<MODE>mode == V4DFmode)
11564         mask = (elt & 1 ? 15 : 0);
11565       else
11566         mask = (elt & 3) * 0x55;
11567       emit_insn (gen_avx_vpermil<mode> (op0, op1, GEN_INT (mask)));
11569       /* Shuffle the lane we care about into both lanes of the dest.  */
11570       mask = (elt / (<ssescalarnum> / 2)) * 0x11;
11571       emit_insn (gen_avx_vperm2f128<mode>3 (op0, op0, op0, GEN_INT (mask)));
11572       DONE;
11573     }
11575   operands[1] = adjust_address_nv (op1, <avxscalarmode>mode,
11576                                    elt * GET_MODE_SIZE (<avxscalarmode>mode));
11579 (define_expand "avx_vpermil<mode>"
11580   [(set (match_operand:AVXMODEFDP 0 "register_operand" "")
11581         (vec_select:AVXMODEFDP
11582           (match_operand:AVXMODEFDP 1 "nonimmediate_operand" "")
11583           (match_operand:SI 2 "const_0_to_255_operand" "")))]
11584   "TARGET_AVX"
11586   int mask = INTVAL (operands[2]);
11587   rtx perm[<ssescalarnum>];
11589   perm[0] = GEN_INT (mask & 1);
11590   perm[1] = GEN_INT ((mask >> 1) & 1);
11591   if (<MODE>mode == V4DFmode)
11592     {
11593       perm[2] = GEN_INT (((mask >> 2) & 1) + 2);
11594       perm[3] = GEN_INT (((mask >> 3) & 1) + 2);
11595     }
11597   operands[2]
11598     = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (<ssescalarnum>, perm));
11601 (define_expand "avx_vpermil<mode>"
11602   [(set (match_operand:AVXMODEFSP 0 "register_operand" "")
11603         (vec_select:AVXMODEFSP
11604           (match_operand:AVXMODEFSP 1 "nonimmediate_operand" "")
11605           (match_operand:SI 2 "const_0_to_255_operand" "")))]
11606   "TARGET_AVX"
11608   int mask = INTVAL (operands[2]);
11609   rtx perm[<ssescalarnum>];
11611   perm[0] = GEN_INT (mask & 3);
11612   perm[1] = GEN_INT ((mask >> 2) & 3);
11613   perm[2] = GEN_INT ((mask >> 4) & 3);
11614   perm[3] = GEN_INT ((mask >> 6) & 3);
11615   if (<MODE>mode == V8SFmode)
11616     {
11617       perm[4] = GEN_INT ((mask & 3) + 4);
11618       perm[5] = GEN_INT (((mask >> 2) & 3) + 4);
11619       perm[6] = GEN_INT (((mask >> 4) & 3) + 4);
11620       perm[7] = GEN_INT (((mask >> 6) & 3) + 4);
11621     }
11623   operands[2]
11624     = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (<ssescalarnum>, perm));
11627 (define_insn "*avx_vpermilp<mode>"
11628   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
11629         (vec_select:AVXMODEF2P
11630           (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "xm")
11631           (match_parallel 2 "avx_vpermilp_<mode>_operand"
11632             [(match_operand 3 "const_int_operand" "")])))]
11633   "TARGET_AVX"
11635   int mask = avx_vpermilp_parallel (operands[2], <MODE>mode) - 1;
11636   operands[2] = GEN_INT (mask);
11637   return "vpermil<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}";
11639   [(set_attr "type" "sselog")
11640    (set_attr "prefix_extra" "1")
11641    (set_attr "length_immediate" "1")
11642    (set_attr "prefix" "vex")
11643    (set_attr "mode" "<MODE>")])
11645 (define_insn "avx_vpermilvar<mode>3"
11646   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
11647         (unspec:AVXMODEF2P
11648           [(match_operand:AVXMODEF2P 1 "register_operand" "x")
11649            (match_operand:<avxpermvecmode> 2 "nonimmediate_operand" "xm")]
11650           UNSPEC_VPERMIL))]
11651   "TARGET_AVX"
11652   "vpermil<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
11653   [(set_attr "type" "sselog")
11654    (set_attr "prefix_extra" "1")
11655    (set_attr "prefix" "vex")
11656    (set_attr "mode" "<MODE>")])
11658 (define_expand "avx_vperm2f128<mode>3"
11659   [(set (match_operand:AVX256MODE2P 0 "register_operand" "")
11660         (unspec:AVX256MODE2P
11661           [(match_operand:AVX256MODE2P 1 "register_operand" "")
11662            (match_operand:AVX256MODE2P 2 "nonimmediate_operand" "")
11663            (match_operand:SI 3 "const_0_to_255_operand" "")]
11664           UNSPEC_VPERMIL2F128))]
11665   "TARGET_AVX"
11667   int mask = INTVAL (operands[3]);
11668   if ((mask & 0x88) == 0)
11669     {
11670       rtx perm[<ssescalarnum>], t1, t2;
11671       int i, base, nelt = <ssescalarnum>, nelt2 = nelt / 2;
11673       base = (mask & 3) * nelt2;
11674       for (i = 0; i < nelt2; ++i)
11675         perm[i] = GEN_INT (base + i);
11677       base = ((mask >> 4) & 3) * nelt2;
11678       for (i = 0; i < nelt2; ++i)
11679         perm[i + nelt2] = GEN_INT (base + i);
11681       t2 = gen_rtx_VEC_CONCAT (<ssedoublesizemode>mode,
11682                                operands[1], operands[2]);
11683       t1 = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelt, perm));
11684       t2 = gen_rtx_VEC_SELECT (<MODE>mode, t2, t1);
11685       t2 = gen_rtx_SET (VOIDmode, operands[0], t2);
11686       emit_insn (t2);
11687       DONE;
11688     }
11691 ;; Note that bits 7 and 3 of the imm8 allow lanes to be zeroed, which
11692 ;; means that in order to represent this properly in rtl we'd have to
11693 ;; nest *another* vec_concat with a zero operand and do the select from
11694 ;; a 4x wide vector.  That doesn't seem very nice.
11695 (define_insn "*avx_vperm2f128<mode>_full"
11696   [(set (match_operand:AVX256MODE2P 0 "register_operand" "=x")
11697         (unspec:AVX256MODE2P
11698           [(match_operand:AVX256MODE2P 1 "register_operand" "x")
11699            (match_operand:AVX256MODE2P 2 "nonimmediate_operand" "xm")
11700            (match_operand:SI 3 "const_0_to_255_operand" "n")]
11701           UNSPEC_VPERMIL2F128))]
11702   "TARGET_AVX"
11703   "vperm2f128\t{%3, %2, %1, %0|%0, %1, %2, %3}"
11704   [(set_attr "type" "sselog")
11705    (set_attr "prefix_extra" "1")
11706    (set_attr "length_immediate" "1")
11707    (set_attr "prefix" "vex")
11708    (set_attr "mode" "V8SF")])
11710 (define_insn "*avx_vperm2f128<mode>_nozero"
11711   [(set (match_operand:AVX256MODE2P 0 "register_operand" "=x")
11712         (vec_select:AVX256MODE2P
11713           (vec_concat:<ssedoublesizemode>
11714             (match_operand:AVX256MODE2P 1 "register_operand" "x")
11715             (match_operand:AVX256MODE2P 2 "nonimmediate_operand" "xm"))
11716           (match_parallel 3 "avx_vperm2f128_<mode>_operand"
11717             [(match_operand 4 "const_int_operand" "")])))]
11718   "TARGET_AVX"
11720   int mask = avx_vperm2f128_parallel (operands[3], <MODE>mode) - 1;
11721   operands[3] = GEN_INT (mask);
11722   return "vperm2f128\t{%3, %2, %1, %0|%0, %1, %2, %3}";
11724   [(set_attr "type" "sselog")
11725    (set_attr "prefix_extra" "1")
11726    (set_attr "length_immediate" "1")
11727    (set_attr "prefix" "vex")
11728    (set_attr "mode" "V8SF")])
11730 (define_expand "avx_vinsertf128<mode>"
11731   [(match_operand:AVX256MODE 0 "register_operand" "")
11732    (match_operand:AVX256MODE 1 "register_operand" "")
11733    (match_operand:<avxhalfvecmode> 2 "nonimmediate_operand" "")
11734    (match_operand:SI 3 "const_0_to_1_operand" "")]
11735   "TARGET_AVX"
11737   switch (INTVAL (operands[3]))
11738     {
11739     case 0:
11740       emit_insn (gen_vec_set_lo_<mode> (operands[0], operands[1],
11741                                         operands[2]));
11742       break;
11743     case 1:
11744       emit_insn (gen_vec_set_hi_<mode> (operands[0], operands[1],
11745                                         operands[2]));
11746       break;
11747     default:
11748       gcc_unreachable ();
11749     }
11750   DONE;
11753 (define_insn "vec_set_lo_<mode>"
11754   [(set (match_operand:AVX256MODE4P 0 "register_operand" "=x")
11755         (vec_concat:AVX256MODE4P
11756           (match_operand:<avxhalfvecmode> 2 "nonimmediate_operand" "xm")
11757           (vec_select:<avxhalfvecmode>
11758             (match_operand:AVX256MODE4P 1 "register_operand" "x")
11759             (parallel [(const_int 2) (const_int 3)]))))]
11760   "TARGET_AVX"
11761   "vinsertf128\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}"
11762   [(set_attr "type" "sselog")
11763    (set_attr "prefix_extra" "1")
11764    (set_attr "length_immediate" "1")
11765    (set_attr "prefix" "vex")
11766    (set_attr "mode" "V8SF")])
11768 (define_insn "vec_set_hi_<mode>"
11769   [(set (match_operand:AVX256MODE4P 0 "register_operand" "=x")
11770         (vec_concat:AVX256MODE4P
11771           (vec_select:<avxhalfvecmode>
11772             (match_operand:AVX256MODE4P 1 "register_operand" "x")
11773             (parallel [(const_int 0) (const_int 1)]))
11774           (match_operand:<avxhalfvecmode> 2 "nonimmediate_operand" "xm")))]
11775   "TARGET_AVX"
11776   "vinsertf128\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}"
11777   [(set_attr "type" "sselog")
11778    (set_attr "prefix_extra" "1")
11779    (set_attr "length_immediate" "1")
11780    (set_attr "prefix" "vex")
11781    (set_attr "mode" "V8SF")])
11783 (define_insn "vec_set_lo_<mode>"
11784   [(set (match_operand:AVX256MODE8P 0 "register_operand" "=x")
11785         (vec_concat:AVX256MODE8P
11786           (match_operand:<avxhalfvecmode> 2 "nonimmediate_operand" "xm")
11787           (vec_select:<avxhalfvecmode>
11788             (match_operand:AVX256MODE8P 1 "register_operand" "x")
11789             (parallel [(const_int 4) (const_int 5)
11790                        (const_int 6) (const_int 7)]))))]
11791   "TARGET_AVX"
11792   "vinsertf128\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}"
11793   [(set_attr "type" "sselog")
11794    (set_attr "prefix_extra" "1")
11795    (set_attr "length_immediate" "1")
11796    (set_attr "prefix" "vex")
11797    (set_attr "mode" "V8SF")])
11799 (define_insn "vec_set_hi_<mode>"
11800   [(set (match_operand:AVX256MODE8P 0 "register_operand" "=x")
11801         (vec_concat:AVX256MODE8P
11802           (vec_select:<avxhalfvecmode>
11803             (match_operand:AVX256MODE8P 1 "register_operand" "x")
11804             (parallel [(const_int 0) (const_int 1)
11805                        (const_int 2) (const_int 3)]))
11806           (match_operand:<avxhalfvecmode> 2 "nonimmediate_operand" "xm")))]
11807   "TARGET_AVX"
11808   "vinsertf128\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}"
11809   [(set_attr "type" "sselog")
11810    (set_attr "prefix_extra" "1")
11811    (set_attr "length_immediate" "1")
11812    (set_attr "prefix" "vex")
11813    (set_attr "mode" "V8SF")])
11815 (define_insn "vec_set_lo_v16hi"
11816   [(set (match_operand:V16HI 0 "register_operand" "=x")
11817         (vec_concat:V16HI
11818           (match_operand:V8HI 2 "nonimmediate_operand" "xm")
11819           (vec_select:V8HI
11820             (match_operand:V16HI 1 "register_operand" "x")
11821             (parallel [(const_int 8) (const_int 9)
11822                        (const_int 10) (const_int 11)
11823                        (const_int 12) (const_int 13)
11824                        (const_int 14) (const_int 15)]))))]
11825   "TARGET_AVX"
11826   "vinsertf128\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}"
11827   [(set_attr "type" "sselog")
11828    (set_attr "prefix_extra" "1")
11829    (set_attr "length_immediate" "1")
11830    (set_attr "prefix" "vex")
11831    (set_attr "mode" "V8SF")])
11833 (define_insn "vec_set_hi_v16hi"
11834   [(set (match_operand:V16HI 0 "register_operand" "=x")
11835         (vec_concat:V16HI
11836           (vec_select:V8HI
11837             (match_operand:V16HI 1 "register_operand" "x")
11838             (parallel [(const_int 0) (const_int 1)
11839                        (const_int 2) (const_int 3)
11840                        (const_int 4) (const_int 5)
11841                        (const_int 6) (const_int 7)]))
11842           (match_operand:V8HI 2 "nonimmediate_operand" "xm")))]
11843   "TARGET_AVX"
11844   "vinsertf128\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}"
11845   [(set_attr "type" "sselog")
11846    (set_attr "prefix_extra" "1")
11847    (set_attr "length_immediate" "1")
11848    (set_attr "prefix" "vex")
11849    (set_attr "mode" "V8SF")])
11851 (define_insn "vec_set_lo_v32qi"
11852   [(set (match_operand:V32QI 0 "register_operand" "=x")
11853         (vec_concat:V32QI
11854           (match_operand:V16QI 2 "nonimmediate_operand" "xm")
11855           (vec_select:V16QI
11856             (match_operand:V32QI 1 "register_operand" "x")
11857             (parallel [(const_int 16) (const_int 17)
11858                        (const_int 18) (const_int 19)
11859                        (const_int 20) (const_int 21)
11860                        (const_int 22) (const_int 23)
11861                        (const_int 24) (const_int 25)
11862                        (const_int 26) (const_int 27)
11863                        (const_int 28) (const_int 29)
11864                        (const_int 30) (const_int 31)]))))]
11865   "TARGET_AVX"
11866   "vinsertf128\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}"
11867   [(set_attr "type" "sselog")
11868    (set_attr "prefix_extra" "1")
11869    (set_attr "length_immediate" "1")
11870    (set_attr "prefix" "vex")
11871    (set_attr "mode" "V8SF")])
11873 (define_insn "vec_set_hi_v32qi"
11874   [(set (match_operand:V32QI 0 "register_operand" "=x")
11875         (vec_concat:V32QI
11876           (vec_select:V16QI
11877             (match_operand:V32QI 1 "register_operand" "x")
11878             (parallel [(const_int 0) (const_int 1)
11879                        (const_int 2) (const_int 3)
11880                        (const_int 4) (const_int 5)
11881                        (const_int 6) (const_int 7)
11882                        (const_int 8) (const_int 9)
11883                        (const_int 10) (const_int 11)
11884                        (const_int 12) (const_int 13)
11885                        (const_int 14) (const_int 15)]))
11886           (match_operand:V16QI 2 "nonimmediate_operand" "xm")))]
11887   "TARGET_AVX"
11888   "vinsertf128\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}"
11889   [(set_attr "type" "sselog")
11890    (set_attr "prefix_extra" "1")
11891    (set_attr "length_immediate" "1")
11892    (set_attr "prefix" "vex")
11893    (set_attr "mode" "V8SF")])
11895 (define_insn "avx_maskload<ssemodesuffix><avxmodesuffix>"
11896   [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
11897         (unspec:AVXMODEF2P
11898           [(match_operand:AVXMODEF2P 1 "memory_operand" "m")
11899            (match_operand:AVXMODEF2P 2 "register_operand" "x")
11900            (match_dup 0)]
11901           UNSPEC_MASKLOAD))]
11902   "TARGET_AVX"
11903   "vmaskmov<ssemodesuffix>\t{%1, %2, %0|%0, %2, %1}"
11904   [(set_attr "type" "sselog1")
11905    (set_attr "prefix_extra" "1")
11906    (set_attr "prefix" "vex")
11907    (set_attr "mode" "<MODE>")])
11909 (define_insn "avx_maskstore<ssemodesuffix><avxmodesuffix>"
11910   [(set (match_operand:AVXMODEF2P 0 "memory_operand" "=m")
11911         (unspec:AVXMODEF2P
11912           [(match_operand:AVXMODEF2P 1 "register_operand" "x")
11913            (match_operand:AVXMODEF2P 2 "register_operand" "x")
11914            (match_dup 0)]
11915           UNSPEC_MASKSTORE))]
11916   "TARGET_AVX"
11917   "vmaskmov<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
11918   [(set_attr "type" "sselog1")
11919    (set_attr "prefix_extra" "1")
11920    (set_attr "prefix" "vex")
11921    (set_attr "mode" "<MODE>")])
11923 (define_insn_and_split "avx_<avxmodesuffixp><avxmodesuffix>_<avxmodesuffixp>"
11924   [(set (match_operand:AVX256MODE2P 0 "nonimmediate_operand" "=x,m")
11925         (unspec:AVX256MODE2P
11926           [(match_operand:<avxhalfvecmode> 1 "nonimmediate_operand" "xm,x")]
11927           UNSPEC_CAST))]
11928   "TARGET_AVX"
11929   "#"
11930   "&& reload_completed"
11931   [(const_int 0)]
11933   rtx op1 = operands[1];
11934   if (REG_P (op1))
11935     op1 = gen_rtx_REG (<MODE>mode, REGNO (op1));
11936   else
11937     op1 = gen_lowpart (<MODE>mode, op1);
11938   emit_move_insn (operands[0], op1);
11939   DONE;
11942 (define_expand "vec_init<mode>"
11943   [(match_operand:AVX256MODE 0 "register_operand" "")
11944    (match_operand 1 "" "")]
11945   "TARGET_AVX"
11947   ix86_expand_vector_init (false, operands[0], operands[1]);
11948   DONE;
11951 (define_insn "*vec_concat<mode>_avx"
11952   [(set (match_operand:AVX256MODE 0 "register_operand"   "=x,x")
11953         (vec_concat:AVX256MODE
11954           (match_operand:<avxhalfvecmode> 1 "register_operand" "x,x")
11955           (match_operand:<avxhalfvecmode> 2 "vector_move_operand" "xm,C")))]
11956   "TARGET_AVX"
11958   switch (which_alternative)
11959     {
11960     case 0:
11961       return "vinsertf128\t{$0x1, %2, %t1, %0|%0, %t1, %2, 0x1}";
11962     case 1:
11963       switch (get_attr_mode (insn))
11964         {
11965         case MODE_V8SF:
11966           return "vmovaps\t{%1, %x0|%x0, %1}";
11967         case MODE_V4DF:
11968           return "vmovapd\t{%1, %x0|%x0, %1}";
11969         default:
11970           return "vmovdqa\t{%1, %x0|%x0, %1}";
11971         }
11972     default:
11973       gcc_unreachable ();
11974     }
11976   [(set_attr "type" "sselog,ssemov")
11977    (set_attr "prefix_extra" "1,*")
11978    (set_attr "length_immediate" "1,*")
11979    (set_attr "prefix" "vex")
11980    (set_attr "mode" "<avxvecmode>")])
11982 (define_insn "vcvtph2ps"
11983   [(set (match_operand:V4SF 0 "register_operand" "=x")
11984         (vec_select:V4SF
11985           (unspec:V8SF [(match_operand:V8HI 1 "register_operand" "x")]
11986                        UNSPEC_VCVTPH2PS)
11987           (parallel [(const_int 0) (const_int 1)
11988                      (const_int 1) (const_int 2)])))]
11989   "TARGET_F16C"
11990   "vcvtph2ps\t{%1, %0|%0, %1}"
11991   [(set_attr "type" "ssecvt")
11992    (set_attr "prefix" "vex")
11993    (set_attr "mode" "V4SF")])
11995 (define_insn "*vcvtph2ps_load"
11996   [(set (match_operand:V4SF 0 "register_operand" "=x")
11997         (unspec:V4SF [(match_operand:V4HI 1 "memory_operand" "m")]
11998                      UNSPEC_VCVTPH2PS))]
11999   "TARGET_F16C"
12000   "vcvtph2ps\t{%1, %0|%0, %1}"
12001   [(set_attr "type" "ssecvt")
12002    (set_attr "prefix" "vex")
12003    (set_attr "mode" "V8SF")])
12005 (define_insn "vcvtph2ps256"
12006   [(set (match_operand:V8SF 0 "register_operand" "=x")
12007         (unspec:V8SF [(match_operand:V8HI 1 "nonimmediate_operand" "xm")]
12008                      UNSPEC_VCVTPH2PS))]
12009   "TARGET_F16C"
12010   "vcvtph2ps\t{%1, %0|%0, %1}"
12011   [(set_attr "type" "ssecvt")
12012    (set_attr "prefix" "vex")
12013    (set_attr "mode" "V8SF")])
12015 (define_expand "vcvtps2ph"
12016   [(set (match_operand:V8HI 0 "register_operand" "")
12017         (vec_concat:V8HI
12018           (unspec:V4HI [(match_operand:V4SF 1 "register_operand" "")
12019                         (match_operand:SI 2 "immediate_operand" "")]
12020                        UNSPEC_VCVTPS2PH)
12021           (match_dup 3)))]
12022   "TARGET_F16C"
12023   "operands[3] = CONST0_RTX (V4HImode);")
12025 (define_insn "*vcvtps2ph"
12026   [(set (match_operand:V8HI 0 "register_operand" "=x")
12027         (vec_concat:V8HI
12028           (unspec:V4HI [(match_operand:V4SF 1 "register_operand" "x")
12029                         (match_operand:SI 2 "immediate_operand" "N")]
12030                        UNSPEC_VCVTPS2PH)
12031           (match_operand:V4HI 3 "const0_operand" "")))]
12032   "TARGET_F16C"
12033   "vcvtps2ph\t{%2, %1, %0|%0, %1, %2}"
12034   [(set_attr "type" "ssecvt")
12035    (set_attr "prefix" "vex")
12036    (set_attr "mode" "V4SF")])
12038 (define_insn "*vcvtps2ph_store"
12039   [(set (match_operand:V4HI 0 "memory_operand" "=m")
12040         (unspec:V4HI [(match_operand:V4SF 1 "register_operand" "x")
12041                       (match_operand:SI 2 "immediate_operand" "N")]
12042                      UNSPEC_VCVTPS2PH))]
12043   "TARGET_F16C"
12044   "vcvtps2ph\t{%2, %1, %0|%0, %1, %2}"
12045   [(set_attr "type" "ssecvt")
12046    (set_attr "prefix" "vex")
12047    (set_attr "mode" "V4SF")])
12049 (define_insn "vcvtps2ph256"
12050   [(set (match_operand:V8HI 0 "nonimmediate_operand" "=xm")
12051         (unspec:V8HI [(match_operand:V8SF 1 "register_operand" "x")
12052                       (match_operand:SI 2 "immediate_operand" "N")]
12053                      UNSPEC_VCVTPS2PH))]
12054   "TARGET_F16C"
12055   "vcvtps2ph\t{%2, %1, %0|%0, %1, %2}"
12056   [(set_attr "type" "ssecvt")
12057    (set_attr "prefix" "vex")
12058    (set_attr "mode" "V8SF")])