1 ;; GCC machine description for SSE instructions
2 ;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
3 ;; Free Software Foundation, Inc.
5 ;; This file is part of GCC.
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)
12 ;; GCC is distributed in the hope that it will be useful,
13 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 ;; GNU General Public License for more details.
17 ;; You should have received a copy of the GNU General Public License
18 ;; along with GCC; see the file COPYING3. If not see
19 ;; <http://www.gnu.org/licenses/>.
22 ;; 16 byte integral modes handled by SSE
23 (define_mode_iterator SSEMODEI [V16QI V8HI V4SI V2DI])
25 ;; All 16-byte vector modes handled by SSE
26 (define_mode_iterator SSEMODE [V16QI V8HI V4SI V2DI V4SF V2DF])
27 (define_mode_iterator SSEMODE16 [V16QI V8HI V4SI V2DI V1TI V4SF V2DF])
29 ;; 32 byte integral vector modes handled by AVX
30 (define_mode_iterator AVX256MODEI [V32QI V16HI V8SI V4DI])
32 ;; All 32-byte vector modes handled by AVX
33 (define_mode_iterator AVX256MODE [V32QI V16HI V8SI V4DI V8SF V4DF])
35 ;; All QI vector modes handled by AVX
36 (define_mode_iterator AVXMODEQI [V32QI V16QI])
38 ;; All DI vector modes handled by AVX
39 (define_mode_iterator AVXMODEDI [V4DI V2DI])
41 ;; All vector modes handled by AVX
42 (define_mode_iterator AVXMODE
43 [V16QI V8HI V4SI V2DI V4SF V2DF V32QI V16HI V8SI V4DI V8SF V4DF])
44 (define_mode_iterator AVXMODE16
45 [V16QI V8HI V4SI V2DI V1TI V4SF V2DF V32QI V16HI V8SI V4DI V8SF V4DF])
48 (define_mode_iterator SSEMODE12 [V16QI V8HI])
49 (define_mode_iterator SSEMODE24 [V8HI V4SI])
50 (define_mode_iterator SSEMODE14 [V16QI V4SI])
51 (define_mode_iterator SSEMODE124 [V16QI V8HI V4SI])
52 (define_mode_iterator SSEMODE248 [V8HI V4SI V2DI])
53 (define_mode_iterator SSEMODE1248 [V16QI V8HI V4SI V2DI])
54 (define_mode_iterator SSEMODEF4 [SF DF V4SF V2DF])
55 (define_mode_iterator FMA4MODEF4 [V8SF V4DF])
56 (define_mode_iterator SSEMODEF2P [V4SF V2DF])
58 (define_mode_iterator AVX256MODEF2P [V8SF V4DF])
59 (define_mode_iterator AVX256MODE2P [V8SI V8SF V4DF])
60 (define_mode_iterator AVX256MODE24P [V8SI V8SF V4DI V4DF])
61 (define_mode_iterator AVX256MODE4P [V4DI V4DF])
62 (define_mode_iterator AVX256MODE8P [V8SI V8SF])
63 (define_mode_iterator AVXMODEF2P [V4SF V2DF V8SF V4DF])
64 (define_mode_iterator AVXMODEF4P [V4SF V4DF])
65 (define_mode_iterator AVXMODEFDP [V2DF V4DF])
66 (define_mode_iterator AVXMODEFSP [V4SF V8SF])
67 (define_mode_iterator AVXMODEDCVTDQ2PS [V4SF V8SF])
68 (define_mode_iterator AVXMODEDCVTPS2DQ [V4SI V8SI])
70 ;; Int-float size matches
71 (define_mode_iterator SSEMODE4S [V4SF V4SI])
72 (define_mode_iterator SSEMODE2D [V2DF V2DI])
74 ;; Modes handled by integer vcond pattern
75 (define_mode_iterator SSEMODE124C8 [V16QI V8HI V4SI
76 (V2DI "TARGET_SSE4_2")])
78 ;; Modes handled by vec_extract_even/odd pattern.
79 (define_mode_iterator SSEMODE_EO
82 (V2DI "TARGET_SSE2") (V4SI "TARGET_SSE2")
83 (V8HI "TARGET_SSE2") (V16QI "TARGET_SSE2")
84 (V4DF "TARGET_AVX") (V8SF "TARGET_AVX")])
86 ;; Mapping from float mode to required SSE level
87 (define_mode_attr sse [(SF "sse") (DF "sse2") (V4SF "sse") (V2DF "sse2")])
89 ;; Mapping from integer vector mode to mnemonic suffix
90 (define_mode_attr ssevecsize [(V16QI "b") (V8HI "w") (V4SI "d") (V2DI "q")])
92 ;; Mapping of the fma4 suffix
93 (define_mode_attr fma4modesuffixf4 [(V8SF "ps") (V4DF "pd")])
94 (define_mode_attr ssemodesuffixf2s [(SF "ss") (DF "sd")
95 (V4SF "ss") (V2DF "sd")])
97 ;; Mapping of the avx suffix
98 (define_mode_attr ssemodesuffixf4 [(SF "ss") (DF "sd")
99 (V4SF "ps") (V2DF "pd")])
101 (define_mode_attr ssemodesuffixf2c [(V4SF "s") (V2DF "d")])
103 (define_mode_attr ssescalarmodesuffix2s [(V4SF "ss") (V4SI "d")])
105 ;; Mapping of the max integer size for xop rotate immediate constraint
106 (define_mode_attr sserotatemax [(V16QI "7") (V8HI "15") (V4SI "31") (V2DI "63")])
108 ;; Mapping of vector modes back to the scalar modes
109 (define_mode_attr ssescalarmode [(V4SF "SF") (V2DF "DF")
110 (V16QI "QI") (V8HI "HI")
111 (V4SI "SI") (V2DI "DI")])
113 ;; Mapping of vector modes to a vector mode of double size
114 (define_mode_attr ssedoublesizemode
115 [(V2DF "V4DF") (V2DI "V4DI") (V4SF "V8SF") (V4SI "V8SI")
116 (V8HI "V16HI") (V16QI "V32QI")
117 (V4DF "V8DF") (V8SF "V16SF")
118 (V4DI "V8DI") (V8SI "V16SI") (V16HI "V32HI") (V32QI "V64QI")])
120 ;; Number of scalar elements in each vector type
121 (define_mode_attr ssescalarnum
122 [(V4SF "4") (V2DF "2") (V16QI "16") (V8HI "8") (V4SI "4") (V2DI "2")
123 (V8SF "8") (V4DF "4") (V32QI "32") (V16HI "16") (V8SI "8") (V4DI "4")])
126 (define_mode_attr avxvecmode
127 [(V16QI "TI") (V8HI "TI") (V4SI "TI") (V2DI "TI") (V1TI "TI")
128 (V4SF "V4SF") (V8SF "V8SF") (V2DF "V2DF") (V4DF "V4DF")
129 (V32QI "OI") (V16HI "OI") (V8SI "OI") (V4DI "OI")])
130 (define_mode_attr avxvecpsmode
131 [(V16QI "V4SF") (V8HI "V4SF") (V4SI "V4SF") (V2DI "V4SF")
132 (V32QI "V8SF") (V16HI "V8SF") (V8SI "V8SF") (V4DI "V8SF")])
133 (define_mode_attr avxhalfvecmode
134 [(V32QI "V16QI") (V16HI "V8HI") (V8SI "V4SI") (V4DI "V2DI")
135 (V8SF "V4SF") (V4DF "V2DF")
136 (V16QI "V8QI") (V8HI "V4HI") (V4SI "V2SI") (V4SF "V2SF")])
137 (define_mode_attr avxscalarmode
138 [(V16QI "QI") (V8HI "HI") (V4SI "SI") (V2DI "DI") (V4SF "SF") (V2DF "DF")
139 (V32QI "QI") (V16HI "HI") (V8SI "SI") (V4DI "DI") (V8SF "SF") (V4DF "DF")])
140 (define_mode_attr avxcvtvecmode
141 [(V4SF "V4SI") (V8SF "V8SI") (V4SI "V4SF") (V8SI "V8SF")])
142 (define_mode_attr avxpermvecmode
143 [(V2DF "V2DI") (V4SF "V4SI") (V4DF "V4DI") (V8SF "V8SI")])
144 (define_mode_attr avxmodesuffixf2c
145 [(V4SF "s") (V2DF "d") (V8SI "s") (V8SF "s") (V4DI "d") (V4DF "d")])
146 (define_mode_attr avxmodesuffixp
147 [(V2DF "pd") (V4SI "si") (V4SF "ps") (V8SF "ps") (V8SI "si")
149 (define_mode_attr avxmodesuffix
150 [(V16QI "") (V32QI "256") (V4SI "") (V4SF "") (V2DF "")
151 (V8SI "256") (V8SF "256") (V4DF "256")])
153 ;; Mapping of immediate bits for blend instructions
154 (define_mode_attr blendbits
155 [(V8SF "255") (V4SF "15") (V4DF "15") (V2DF "3")])
157 ;; Mapping of immediate bits for pinsr instructions
158 (define_mode_attr pinsrbits [(V16QI "32768") (V8HI "128") (V4SI "8")])
160 ;; Patterns whose name begins with "sse{,2,3}_" are invoked by intrinsics.
162 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
166 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
168 (define_expand "mov<mode>"
169 [(set (match_operand:AVX256MODE 0 "nonimmediate_operand" "")
170 (match_operand:AVX256MODE 1 "nonimmediate_operand" ""))]
173 ix86_expand_vector_move (<MODE>mode, operands);
177 (define_insn "*avx_mov<mode>_internal"
178 [(set (match_operand:AVXMODE16 0 "nonimmediate_operand" "=x,x ,m")
179 (match_operand:AVXMODE16 1 "nonimmediate_or_sse_const_operand" "C ,xm,x"))]
181 && (register_operand (operands[0], <MODE>mode)
182 || register_operand (operands[1], <MODE>mode))"
184 switch (which_alternative)
187 return standard_sse_constant_opcode (insn, operands[1]);
190 switch (get_attr_mode (insn))
194 return "vmovaps\t{%1, %0|%0, %1}";
197 return "vmovapd\t{%1, %0|%0, %1}";
199 return "vmovdqa\t{%1, %0|%0, %1}";
205 [(set_attr "type" "sselog1,ssemov,ssemov")
206 (set_attr "prefix" "vex")
207 (set_attr "mode" "<avxvecmode>")])
209 ;; All of these patterns are enabled for SSE1 as well as SSE2.
210 ;; This is essential for maintaining stable calling conventions.
212 (define_expand "mov<mode>"
213 [(set (match_operand:SSEMODE16 0 "nonimmediate_operand" "")
214 (match_operand:SSEMODE16 1 "nonimmediate_operand" ""))]
217 ix86_expand_vector_move (<MODE>mode, operands);
221 (define_insn "*mov<mode>_internal"
222 [(set (match_operand:SSEMODE16 0 "nonimmediate_operand" "=x,x ,m")
223 (match_operand:SSEMODE16 1 "nonimmediate_or_sse_const_operand" "C ,xm,x"))]
225 && (register_operand (operands[0], <MODE>mode)
226 || register_operand (operands[1], <MODE>mode))"
228 switch (which_alternative)
231 return standard_sse_constant_opcode (insn, operands[1]);
234 switch (get_attr_mode (insn))
237 return "movaps\t{%1, %0|%0, %1}";
239 return "movapd\t{%1, %0|%0, %1}";
241 return "movdqa\t{%1, %0|%0, %1}";
247 [(set_attr "type" "sselog1,ssemov,ssemov")
249 (cond [(ior (ior (ne (symbol_ref "optimize_function_for_size_p (cfun)") (const_int 0))
250 (eq (symbol_ref "TARGET_SSE2") (const_int 0)))
251 (and (eq_attr "alternative" "2")
252 (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
254 (const_string "V4SF")
255 (eq (const_string "<MODE>mode") (const_string "V4SFmode"))
256 (const_string "V4SF")
257 (eq (const_string "<MODE>mode") (const_string "V2DFmode"))
258 (const_string "V2DF")
260 (const_string "TI")))])
262 ;; Move a DI from a 32-bit register pair (e.g. %edx:%eax) to an xmm.
263 ;; We'd rather avoid this entirely; if the 32-bit reg pair was loaded
264 ;; from memory, we'd prefer to load the memory directly into the %xmm
265 ;; register. To facilitate this happy circumstance, this pattern won't
266 ;; split until after register allocation. If the 64-bit value didn't
267 ;; come from memory, this is the best we can do. This is much better
268 ;; than storing %edx:%eax into a stack temporary and loading an %xmm
271 (define_insn_and_split "movdi_to_sse"
273 [(set (match_operand:V4SI 0 "register_operand" "=?x,x")
274 (subreg:V4SI (match_operand:DI 1 "nonimmediate_operand" "r,m") 0))
275 (clobber (match_scratch:V4SI 2 "=&x,X"))])]
276 "!TARGET_64BIT && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES"
278 "&& reload_completed"
281 if (register_operand (operands[1], DImode))
283 /* The DImode arrived in a pair of integral registers (e.g. %edx:%eax).
284 Assemble the 64-bit DImode value in an xmm register. */
285 emit_insn (gen_sse2_loadld (operands[0], CONST0_RTX (V4SImode),
286 gen_rtx_SUBREG (SImode, operands[1], 0)));
287 emit_insn (gen_sse2_loadld (operands[2], CONST0_RTX (V4SImode),
288 gen_rtx_SUBREG (SImode, operands[1], 4)));
289 emit_insn (gen_vec_interleave_lowv4si (operands[0], operands[0],
292 else if (memory_operand (operands[1], DImode))
293 emit_insn (gen_vec_concatv2di (gen_lowpart (V2DImode, operands[0]),
294 operands[1], const0_rtx));
300 [(set (match_operand:V4SF 0 "register_operand" "")
301 (match_operand:V4SF 1 "zero_extended_scalar_load_operand" ""))]
302 "TARGET_SSE && reload_completed"
305 (vec_duplicate:V4SF (match_dup 1))
309 operands[1] = simplify_gen_subreg (SFmode, operands[1], V4SFmode, 0);
310 operands[2] = CONST0_RTX (V4SFmode);
314 [(set (match_operand:V2DF 0 "register_operand" "")
315 (match_operand:V2DF 1 "zero_extended_scalar_load_operand" ""))]
316 "TARGET_SSE2 && reload_completed"
317 [(set (match_dup 0) (vec_concat:V2DF (match_dup 1) (match_dup 2)))]
319 operands[1] = simplify_gen_subreg (DFmode, operands[1], V2DFmode, 0);
320 operands[2] = CONST0_RTX (DFmode);
323 (define_expand "push<mode>1"
324 [(match_operand:AVX256MODE 0 "register_operand" "")]
327 ix86_expand_push (<MODE>mode, operands[0]);
331 (define_expand "push<mode>1"
332 [(match_operand:SSEMODE16 0 "register_operand" "")]
335 ix86_expand_push (<MODE>mode, operands[0]);
339 (define_expand "movmisalign<mode>"
340 [(set (match_operand:AVX256MODE 0 "nonimmediate_operand" "")
341 (match_operand:AVX256MODE 1 "nonimmediate_operand" ""))]
344 ix86_expand_vector_move_misalign (<MODE>mode, operands);
348 (define_expand "movmisalign<mode>"
349 [(set (match_operand:SSEMODE16 0 "nonimmediate_operand" "")
350 (match_operand:SSEMODE16 1 "nonimmediate_operand" ""))]
353 ix86_expand_vector_move_misalign (<MODE>mode, operands);
357 (define_insn "avx_movup<avxmodesuffixf2c><avxmodesuffix>"
358 [(set (match_operand:AVXMODEF2P 0 "nonimmediate_operand" "=x,m")
360 [(match_operand:AVXMODEF2P 1 "nonimmediate_operand" "xm,x")]
362 "AVX_VEC_FLOAT_MODE_P (<MODE>mode)
363 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
364 "vmovup<avxmodesuffixf2c>\t{%1, %0|%0, %1}"
365 [(set_attr "type" "ssemov")
366 (set_attr "movu" "1")
367 (set_attr "prefix" "vex")
368 (set_attr "mode" "<MODE>")])
370 (define_insn "sse2_movq128"
371 [(set (match_operand:V2DI 0 "register_operand" "=x")
374 (match_operand:V2DI 1 "nonimmediate_operand" "xm")
375 (parallel [(const_int 0)]))
378 "%vmovq\t{%1, %0|%0, %1}"
379 [(set_attr "type" "ssemov")
380 (set_attr "prefix" "maybe_vex")
381 (set_attr "mode" "TI")])
383 (define_insn "<sse>_movup<ssemodesuffixf2c>"
384 [(set (match_operand:SSEMODEF2P 0 "nonimmediate_operand" "=x,m")
386 [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "xm,x")]
388 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)
389 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
390 "movup<ssemodesuffixf2c>\t{%1, %0|%0, %1}"
391 [(set_attr "type" "ssemov")
392 (set_attr "movu" "1")
393 (set_attr "mode" "<MODE>")])
395 (define_insn "avx_movdqu<avxmodesuffix>"
396 [(set (match_operand:AVXMODEQI 0 "nonimmediate_operand" "=x,m")
398 [(match_operand:AVXMODEQI 1 "nonimmediate_operand" "xm,x")]
400 "TARGET_AVX && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
401 "vmovdqu\t{%1, %0|%0, %1}"
402 [(set_attr "type" "ssemov")
403 (set_attr "movu" "1")
404 (set_attr "prefix" "vex")
405 (set_attr "mode" "<avxvecmode>")])
407 (define_insn "sse2_movdqu"
408 [(set (match_operand:V16QI 0 "nonimmediate_operand" "=x,m")
409 (unspec:V16QI [(match_operand:V16QI 1 "nonimmediate_operand" "xm,x")]
411 "TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
412 "movdqu\t{%1, %0|%0, %1}"
413 [(set_attr "type" "ssemov")
414 (set_attr "movu" "1")
415 (set_attr "prefix_data16" "1")
416 (set_attr "mode" "TI")])
418 (define_insn "avx_movnt<mode>"
419 [(set (match_operand:AVXMODEF2P 0 "memory_operand" "=m")
421 [(match_operand:AVXMODEF2P 1 "register_operand" "x")]
423 "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
424 "vmovntp<avxmodesuffixf2c>\t{%1, %0|%0, %1}"
425 [(set_attr "type" "ssemov")
426 (set_attr "prefix" "vex")
427 (set_attr "mode" "<MODE>")])
429 (define_insn "<sse>_movnt<mode>"
430 [(set (match_operand:SSEMODEF2P 0 "memory_operand" "=m")
432 [(match_operand:SSEMODEF2P 1 "register_operand" "x")]
434 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
435 "movntp<ssemodesuffixf2c>\t{%1, %0|%0, %1}"
436 [(set_attr "type" "ssemov")
437 (set_attr "mode" "<MODE>")])
439 (define_insn "avx_movnt<mode>"
440 [(set (match_operand:AVXMODEDI 0 "memory_operand" "=m")
442 [(match_operand:AVXMODEDI 1 "register_operand" "x")]
445 "vmovntdq\t{%1, %0|%0, %1}"
446 [(set_attr "type" "ssecvt")
447 (set_attr "prefix" "vex")
448 (set_attr "mode" "<avxvecmode>")])
450 (define_insn "sse2_movntv2di"
451 [(set (match_operand:V2DI 0 "memory_operand" "=m")
452 (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "x")]
455 "movntdq\t{%1, %0|%0, %1}"
456 [(set_attr "type" "ssemov")
457 (set_attr "prefix_data16" "1")
458 (set_attr "mode" "TI")])
460 (define_insn "sse2_movntsi"
461 [(set (match_operand:SI 0 "memory_operand" "=m")
462 (unspec:SI [(match_operand:SI 1 "register_operand" "r")]
465 "movnti\t{%1, %0|%0, %1}"
466 [(set_attr "type" "ssemov")
467 (set_attr "prefix_data16" "0")
468 (set_attr "mode" "V2DF")])
470 (define_insn "avx_lddqu<avxmodesuffix>"
471 [(set (match_operand:AVXMODEQI 0 "register_operand" "=x")
473 [(match_operand:AVXMODEQI 1 "memory_operand" "m")]
476 "vlddqu\t{%1, %0|%0, %1}"
477 [(set_attr "type" "ssecvt")
478 (set_attr "movu" "1")
479 (set_attr "prefix" "vex")
480 (set_attr "mode" "<avxvecmode>")])
482 (define_insn "sse3_lddqu"
483 [(set (match_operand:V16QI 0 "register_operand" "=x")
484 (unspec:V16QI [(match_operand:V16QI 1 "memory_operand" "m")]
487 "lddqu\t{%1, %0|%0, %1}"
488 [(set_attr "type" "ssemov")
489 (set_attr "movu" "1")
490 (set_attr "prefix_data16" "0")
491 (set_attr "prefix_rep" "1")
492 (set_attr "mode" "TI")])
494 ; Expand patterns for non-temporal stores. At the moment, only those
495 ; that directly map to insns are defined; it would be possible to
496 ; define patterns for other modes that would expand to several insns.
498 (define_expand "storent<mode>"
499 [(set (match_operand:SSEMODEF2P 0 "memory_operand" "")
501 [(match_operand:SSEMODEF2P 1 "register_operand" "")]
503 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
506 (define_expand "storent<mode>"
507 [(set (match_operand:MODEF 0 "memory_operand" "")
509 [(match_operand:MODEF 1 "register_operand" "")]
514 (define_expand "storentv2di"
515 [(set (match_operand:V2DI 0 "memory_operand" "")
516 (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "")]
521 (define_expand "storentsi"
522 [(set (match_operand:SI 0 "memory_operand" "")
523 (unspec:SI [(match_operand:SI 1 "register_operand" "")]
528 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
530 ;; Parallel floating point arithmetic
532 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
534 (define_expand "<code><mode>2"
535 [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
537 (match_operand:SSEMODEF2P 1 "register_operand" "")))]
538 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
539 "ix86_expand_fp_absneg_operator (<CODE>, <MODE>mode, operands); DONE;")
541 (define_expand "<plusminus_insn><mode>3"
542 [(set (match_operand:AVX256MODEF2P 0 "register_operand" "")
543 (plusminus:AVX256MODEF2P
544 (match_operand:AVX256MODEF2P 1 "nonimmediate_operand" "")
545 (match_operand:AVX256MODEF2P 2 "nonimmediate_operand" "")))]
546 "AVX256_VEC_FLOAT_MODE_P (<MODE>mode)"
547 "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
549 (define_insn "*avx_<plusminus_insn><mode>3"
550 [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
551 (plusminus:AVXMODEF2P
552 (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "<comm>x")
553 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
554 "AVX_VEC_FLOAT_MODE_P (<MODE>mode)
555 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
556 "v<plusminus_mnemonic>p<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
557 [(set_attr "type" "sseadd")
558 (set_attr "prefix" "vex")
559 (set_attr "mode" "<avxvecmode>")])
561 (define_expand "<plusminus_insn><mode>3"
562 [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
563 (plusminus:SSEMODEF2P
564 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "")
565 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "")))]
566 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
567 "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
569 (define_insn "*<plusminus_insn><mode>3"
570 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
571 (plusminus:SSEMODEF2P
572 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "<comm>0")
573 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
574 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)
575 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
576 "<plusminus_mnemonic>p<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
577 [(set_attr "type" "sseadd")
578 (set_attr "mode" "<MODE>")])
580 (define_insn "*avx_vm<plusminus_insn><mode>3"
581 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
582 (vec_merge:SSEMODEF2P
583 (plusminus:SSEMODEF2P
584 (match_operand:SSEMODEF2P 1 "register_operand" "x")
585 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
588 "AVX128_VEC_FLOAT_MODE_P (<MODE>mode)"
589 "v<plusminus_mnemonic>s<ssemodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
590 [(set_attr "type" "sseadd")
591 (set_attr "prefix" "vex")
592 (set_attr "mode" "<ssescalarmode>")])
594 (define_insn "<sse>_vm<plusminus_insn><mode>3"
595 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
596 (vec_merge:SSEMODEF2P
597 (plusminus:SSEMODEF2P
598 (match_operand:SSEMODEF2P 1 "register_operand" "0")
599 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
602 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
603 "<plusminus_mnemonic>s<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
604 [(set_attr "type" "sseadd")
605 (set_attr "mode" "<ssescalarmode>")])
607 (define_expand "mul<mode>3"
608 [(set (match_operand:AVX256MODEF2P 0 "register_operand" "")
610 (match_operand:AVX256MODEF2P 1 "nonimmediate_operand" "")
611 (match_operand:AVX256MODEF2P 2 "nonimmediate_operand" "")))]
612 "AVX256_VEC_FLOAT_MODE_P (<MODE>mode)"
613 "ix86_fixup_binary_operands_no_copy (MULT, <MODE>mode, operands);")
615 (define_insn "*avx_mul<mode>3"
616 [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
618 (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x")
619 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
620 "AVX_VEC_FLOAT_MODE_P (<MODE>mode)
621 && ix86_binary_operator_ok (MULT, <MODE>mode, operands)"
622 "vmulp<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
623 [(set_attr "type" "ssemul")
624 (set_attr "prefix" "vex")
625 (set_attr "mode" "<avxvecmode>")])
627 (define_expand "mul<mode>3"
628 [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
630 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "")
631 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "")))]
632 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
633 "ix86_fixup_binary_operands_no_copy (MULT, <MODE>mode, operands);")
635 (define_insn "*mul<mode>3"
636 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
638 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%0")
639 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
640 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)
641 && ix86_binary_operator_ok (MULT, <MODE>mode, operands)"
642 "mulp<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
643 [(set_attr "type" "ssemul")
644 (set_attr "mode" "<MODE>")])
646 (define_insn "*avx_vmmul<mode>3"
647 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
648 (vec_merge:SSEMODEF2P
650 (match_operand:SSEMODEF2P 1 "register_operand" "x")
651 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
654 "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
655 "vmuls<ssemodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
656 [(set_attr "type" "ssemul")
657 (set_attr "prefix" "vex")
658 (set_attr "mode" "<ssescalarmode>")])
660 (define_insn "<sse>_vmmul<mode>3"
661 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
662 (vec_merge:SSEMODEF2P
664 (match_operand:SSEMODEF2P 1 "register_operand" "0")
665 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
668 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
669 "muls<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
670 [(set_attr "type" "ssemul")
671 (set_attr "mode" "<ssescalarmode>")])
673 (define_expand "divv8sf3"
674 [(set (match_operand:V8SF 0 "register_operand" "")
675 (div:V8SF (match_operand:V8SF 1 "register_operand" "")
676 (match_operand:V8SF 2 "nonimmediate_operand" "")))]
679 ix86_fixup_binary_operands_no_copy (DIV, V8SFmode, operands);
681 if (TARGET_SSE_MATH && TARGET_RECIP && !optimize_insn_for_size_p ()
682 && flag_finite_math_only && !flag_trapping_math
683 && flag_unsafe_math_optimizations)
685 ix86_emit_swdivsf (operands[0], operands[1],
686 operands[2], V8SFmode);
691 (define_expand "divv4df3"
692 [(set (match_operand:V4DF 0 "register_operand" "")
693 (div:V4DF (match_operand:V4DF 1 "register_operand" "")
694 (match_operand:V4DF 2 "nonimmediate_operand" "")))]
696 "ix86_fixup_binary_operands_no_copy (DIV, V4DFmode, operands);")
698 (define_insn "avx_div<mode>3"
699 [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
701 (match_operand:AVXMODEF2P 1 "register_operand" "x")
702 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
703 "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
704 "vdivp<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
705 [(set_attr "type" "ssediv")
706 (set_attr "prefix" "vex")
707 (set_attr "mode" "<MODE>")])
709 (define_expand "divv4sf3"
710 [(set (match_operand:V4SF 0 "register_operand" "")
711 (div:V4SF (match_operand:V4SF 1 "register_operand" "")
712 (match_operand:V4SF 2 "nonimmediate_operand" "")))]
715 if (TARGET_SSE_MATH && TARGET_RECIP && optimize_insn_for_speed_p ()
716 && flag_finite_math_only && !flag_trapping_math
717 && flag_unsafe_math_optimizations)
719 ix86_emit_swdivsf (operands[0], operands[1],
720 operands[2], V4SFmode);
725 (define_expand "divv2df3"
726 [(set (match_operand:V2DF 0 "register_operand" "")
727 (div:V2DF (match_operand:V2DF 1 "register_operand" "")
728 (match_operand:V2DF 2 "nonimmediate_operand" "")))]
732 (define_insn "*avx_div<mode>3"
733 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
735 (match_operand:SSEMODEF2P 1 "register_operand" "x")
736 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
737 "AVX128_VEC_FLOAT_MODE_P (<MODE>mode)"
738 "vdivp<ssemodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
739 [(set_attr "type" "ssediv")
740 (set_attr "prefix" "vex")
741 (set_attr "mode" "<MODE>")])
743 (define_insn "<sse>_div<mode>3"
744 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
746 (match_operand:SSEMODEF2P 1 "register_operand" "0")
747 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
748 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
749 "divp<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
750 [(set_attr "type" "ssediv")
751 (set_attr "mode" "<MODE>")])
753 (define_insn "*avx_vmdiv<mode>3"
754 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
755 (vec_merge:SSEMODEF2P
757 (match_operand:SSEMODEF2P 1 "register_operand" "x")
758 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
761 "AVX128_VEC_FLOAT_MODE_P (<MODE>mode)"
762 "vdivs<ssemodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
763 [(set_attr "type" "ssediv")
764 (set_attr "prefix" "vex")
765 (set_attr "mode" "<ssescalarmode>")])
767 (define_insn "<sse>_vmdiv<mode>3"
768 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
769 (vec_merge:SSEMODEF2P
771 (match_operand:SSEMODEF2P 1 "register_operand" "0")
772 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
775 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
776 "divs<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
777 [(set_attr "type" "ssediv")
778 (set_attr "mode" "<ssescalarmode>")])
780 (define_insn "avx_rcpv8sf2"
781 [(set (match_operand:V8SF 0 "register_operand" "=x")
783 [(match_operand:V8SF 1 "nonimmediate_operand" "xm")] UNSPEC_RCP))]
785 "vrcpps\t{%1, %0|%0, %1}"
786 [(set_attr "type" "sse")
787 (set_attr "prefix" "vex")
788 (set_attr "mode" "V8SF")])
790 (define_insn "sse_rcpv4sf2"
791 [(set (match_operand:V4SF 0 "register_operand" "=x")
793 [(match_operand:V4SF 1 "nonimmediate_operand" "xm")] UNSPEC_RCP))]
795 "%vrcpps\t{%1, %0|%0, %1}"
796 [(set_attr "type" "sse")
797 (set_attr "atom_sse_attr" "rcp")
798 (set_attr "prefix" "maybe_vex")
799 (set_attr "mode" "V4SF")])
801 (define_insn "*avx_vmrcpv4sf2"
802 [(set (match_operand:V4SF 0 "register_operand" "=x")
804 (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
806 (match_operand:V4SF 2 "register_operand" "x")
809 "vrcpss\t{%1, %2, %0|%0, %2, %1}"
810 [(set_attr "type" "sse")
811 (set_attr "prefix" "vex")
812 (set_attr "mode" "SF")])
814 (define_insn "sse_vmrcpv4sf2"
815 [(set (match_operand:V4SF 0 "register_operand" "=x")
817 (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
819 (match_operand:V4SF 2 "register_operand" "0")
822 "rcpss\t{%1, %0|%0, %1}"
823 [(set_attr "type" "sse")
824 (set_attr "atom_sse_attr" "rcp")
825 (set_attr "mode" "SF")])
827 (define_expand "sqrtv8sf2"
828 [(set (match_operand:V8SF 0 "register_operand" "")
829 (sqrt:V8SF (match_operand:V8SF 1 "nonimmediate_operand" "")))]
832 if (TARGET_SSE_MATH && TARGET_RECIP && !optimize_insn_for_size_p ()
833 && flag_finite_math_only && !flag_trapping_math
834 && flag_unsafe_math_optimizations)
836 ix86_emit_swsqrtsf (operands[0], operands[1], V8SFmode, 0);
841 (define_insn "avx_sqrtv8sf2"
842 [(set (match_operand:V8SF 0 "register_operand" "=x")
843 (sqrt:V8SF (match_operand:V8SF 1 "nonimmediate_operand" "xm")))]
845 "vsqrtps\t{%1, %0|%0, %1}"
846 [(set_attr "type" "sse")
847 (set_attr "prefix" "vex")
848 (set_attr "mode" "V8SF")])
850 (define_expand "sqrtv4sf2"
851 [(set (match_operand:V4SF 0 "register_operand" "")
852 (sqrt:V4SF (match_operand:V4SF 1 "nonimmediate_operand" "")))]
855 if (TARGET_SSE_MATH && TARGET_RECIP && optimize_insn_for_speed_p ()
856 && flag_finite_math_only && !flag_trapping_math
857 && flag_unsafe_math_optimizations)
859 ix86_emit_swsqrtsf (operands[0], operands[1], V4SFmode, 0);
864 (define_insn "sse_sqrtv4sf2"
865 [(set (match_operand:V4SF 0 "register_operand" "=x")
866 (sqrt:V4SF (match_operand:V4SF 1 "nonimmediate_operand" "xm")))]
868 "%vsqrtps\t{%1, %0|%0, %1}"
869 [(set_attr "type" "sse")
870 (set_attr "atom_sse_attr" "sqrt")
871 (set_attr "prefix" "maybe_vex")
872 (set_attr "mode" "V4SF")])
874 (define_insn "sqrtv4df2"
875 [(set (match_operand:V4DF 0 "register_operand" "=x")
876 (sqrt:V4DF (match_operand:V4DF 1 "nonimmediate_operand" "xm")))]
878 "vsqrtpd\t{%1, %0|%0, %1}"
879 [(set_attr "type" "sse")
880 (set_attr "prefix" "vex")
881 (set_attr "mode" "V4DF")])
883 (define_insn "sqrtv2df2"
884 [(set (match_operand:V2DF 0 "register_operand" "=x")
885 (sqrt:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "xm")))]
887 "%vsqrtpd\t{%1, %0|%0, %1}"
888 [(set_attr "type" "sse")
889 (set_attr "prefix" "maybe_vex")
890 (set_attr "mode" "V2DF")])
892 (define_insn "*avx_vmsqrt<mode>2"
893 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
894 (vec_merge:SSEMODEF2P
896 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "xm"))
897 (match_operand:SSEMODEF2P 2 "register_operand" "x")
899 "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
900 "vsqrts<ssemodesuffixf2c>\t{%1, %2, %0|%0, %2, %1}"
901 [(set_attr "type" "sse")
902 (set_attr "prefix" "vex")
903 (set_attr "mode" "<ssescalarmode>")])
905 (define_insn "<sse>_vmsqrt<mode>2"
906 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
907 (vec_merge:SSEMODEF2P
909 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "xm"))
910 (match_operand:SSEMODEF2P 2 "register_operand" "0")
912 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
913 "sqrts<ssemodesuffixf2c>\t{%1, %0|%0, %1}"
914 [(set_attr "type" "sse")
915 (set_attr "atom_sse_attr" "sqrt")
916 (set_attr "mode" "<ssescalarmode>")])
918 (define_expand "rsqrtv8sf2"
919 [(set (match_operand:V8SF 0 "register_operand" "")
921 [(match_operand:V8SF 1 "nonimmediate_operand" "")] UNSPEC_RSQRT))]
922 "TARGET_AVX && TARGET_SSE_MATH"
924 ix86_emit_swsqrtsf (operands[0], operands[1], V8SFmode, 1);
928 (define_insn "avx_rsqrtv8sf2"
929 [(set (match_operand:V8SF 0 "register_operand" "=x")
931 [(match_operand:V8SF 1 "nonimmediate_operand" "xm")] UNSPEC_RSQRT))]
933 "vrsqrtps\t{%1, %0|%0, %1}"
934 [(set_attr "type" "sse")
935 (set_attr "prefix" "vex")
936 (set_attr "mode" "V8SF")])
938 (define_expand "rsqrtv4sf2"
939 [(set (match_operand:V4SF 0 "register_operand" "")
941 [(match_operand:V4SF 1 "nonimmediate_operand" "")] UNSPEC_RSQRT))]
944 ix86_emit_swsqrtsf (operands[0], operands[1], V4SFmode, 1);
948 (define_insn "sse_rsqrtv4sf2"
949 [(set (match_operand:V4SF 0 "register_operand" "=x")
951 [(match_operand:V4SF 1 "nonimmediate_operand" "xm")] UNSPEC_RSQRT))]
953 "%vrsqrtps\t{%1, %0|%0, %1}"
954 [(set_attr "type" "sse")
955 (set_attr "prefix" "maybe_vex")
956 (set_attr "mode" "V4SF")])
958 (define_insn "*avx_vmrsqrtv4sf2"
959 [(set (match_operand:V4SF 0 "register_operand" "=x")
961 (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
963 (match_operand:V4SF 2 "register_operand" "x")
966 "vrsqrtss\t{%1, %2, %0|%0, %2, %1}"
967 [(set_attr "type" "sse")
968 (set_attr "prefix" "vex")
969 (set_attr "mode" "SF")])
971 (define_insn "sse_vmrsqrtv4sf2"
972 [(set (match_operand:V4SF 0 "register_operand" "=x")
974 (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
976 (match_operand:V4SF 2 "register_operand" "0")
979 "rsqrtss\t{%1, %0|%0, %1}"
980 [(set_attr "type" "sse")
981 (set_attr "mode" "SF")])
983 ;; ??? For !flag_finite_math_only, the representation with SMIN/SMAX
984 ;; isn't really correct, as those rtl operators aren't defined when
985 ;; applied to NaNs. Hopefully the optimizers won't get too smart on us.
987 (define_expand "<code><mode>3"
988 [(set (match_operand:AVX256MODEF2P 0 "register_operand" "")
989 (smaxmin:AVX256MODEF2P
990 (match_operand:AVX256MODEF2P 1 "nonimmediate_operand" "")
991 (match_operand:AVX256MODEF2P 2 "nonimmediate_operand" "")))]
992 "AVX256_VEC_FLOAT_MODE_P (<MODE>mode)"
994 if (!flag_finite_math_only)
995 operands[1] = force_reg (<MODE>mode, operands[1]);
996 ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);
999 (define_expand "<code><mode>3"
1000 [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
1002 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "")
1003 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "")))]
1004 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1006 if (!flag_finite_math_only)
1007 operands[1] = force_reg (<MODE>mode, operands[1]);
1008 ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);
1011 (define_insn "*avx_<code><mode>3_finite"
1012 [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1014 (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x")
1015 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
1016 "AVX_VEC_FLOAT_MODE_P (<MODE>mode) && flag_finite_math_only
1017 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
1018 "v<maxmin_float>p<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
1019 [(set_attr "type" "sseadd")
1020 (set_attr "prefix" "vex")
1021 (set_attr "mode" "<MODE>")])
1023 (define_insn "*<code><mode>3_finite"
1024 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1026 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%0")
1027 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
1028 "SSE_VEC_FLOAT_MODE_P (<MODE>mode) && flag_finite_math_only
1029 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
1030 "<maxmin_float>p<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
1031 [(set_attr "type" "sseadd")
1032 (set_attr "mode" "<MODE>")])
1034 (define_insn "*avx_<code><mode>3"
1035 [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1037 (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x")
1038 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
1039 "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
1040 "v<maxmin_float>p<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
1041 [(set_attr "type" "sseadd")
1042 (set_attr "prefix" "vex")
1043 (set_attr "mode" "<avxvecmode>")])
1045 (define_insn "*<code><mode>3"
1046 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1048 (match_operand:SSEMODEF2P 1 "register_operand" "0")
1049 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
1050 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1051 "<maxmin_float>p<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
1052 [(set_attr "type" "sseadd")
1053 (set_attr "mode" "<MODE>")])
1055 (define_insn "*avx_vm<code><mode>3"
1056 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1057 (vec_merge:SSEMODEF2P
1059 (match_operand:SSEMODEF2P 1 "register_operand" "x")
1060 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
1063 "AVX128_VEC_FLOAT_MODE_P (<MODE>mode)"
1064 "v<maxmin_float>s<ssemodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
1065 [(set_attr "type" "sse")
1066 (set_attr "prefix" "vex")
1067 (set_attr "mode" "<ssescalarmode>")])
1069 (define_insn "<sse>_vm<code><mode>3"
1070 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1071 (vec_merge:SSEMODEF2P
1073 (match_operand:SSEMODEF2P 1 "register_operand" "0")
1074 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm"))
1077 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1078 "<maxmin_float>s<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
1079 [(set_attr "type" "sseadd")
1080 (set_attr "mode" "<ssescalarmode>")])
1082 ;; These versions of the min/max patterns implement exactly the operations
1083 ;; min = (op1 < op2 ? op1 : op2)
1084 ;; max = (!(op1 < op2) ? op1 : op2)
1085 ;; Their operands are not commutative, and thus they may be used in the
1086 ;; presence of -0.0 and NaN.
1088 (define_insn "*avx_ieee_smin<mode>3"
1089 [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1091 [(match_operand:AVXMODEF2P 1 "register_operand" "x")
1092 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")]
1094 "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
1095 "vminp<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
1096 [(set_attr "type" "sseadd")
1097 (set_attr "prefix" "vex")
1098 (set_attr "mode" "<avxvecmode>")])
1100 (define_insn "*avx_ieee_smax<mode>3"
1101 [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1103 [(match_operand:AVXMODEF2P 1 "register_operand" "x")
1104 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")]
1106 "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
1107 "vmaxp<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
1108 [(set_attr "type" "sseadd")
1109 (set_attr "prefix" "vex")
1110 (set_attr "mode" "<avxvecmode>")])
1112 (define_insn "*ieee_smin<mode>3"
1113 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1115 [(match_operand:SSEMODEF2P 1 "register_operand" "0")
1116 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")]
1118 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1119 "minp<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
1120 [(set_attr "type" "sseadd")
1121 (set_attr "mode" "<MODE>")])
1123 (define_insn "*ieee_smax<mode>3"
1124 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1126 [(match_operand:SSEMODEF2P 1 "register_operand" "0")
1127 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")]
1129 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1130 "maxp<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
1131 [(set_attr "type" "sseadd")
1132 (set_attr "mode" "<MODE>")])
1134 (define_insn "avx_addsubv8sf3"
1135 [(set (match_operand:V8SF 0 "register_operand" "=x")
1138 (match_operand:V8SF 1 "register_operand" "x")
1139 (match_operand:V8SF 2 "nonimmediate_operand" "xm"))
1140 (minus:V8SF (match_dup 1) (match_dup 2))
1143 "vaddsubps\t{%2, %1, %0|%0, %1, %2}"
1144 [(set_attr "type" "sseadd")
1145 (set_attr "prefix" "vex")
1146 (set_attr "mode" "V8SF")])
1148 (define_insn "avx_addsubv4df3"
1149 [(set (match_operand:V4DF 0 "register_operand" "=x")
1152 (match_operand:V4DF 1 "register_operand" "x")
1153 (match_operand:V4DF 2 "nonimmediate_operand" "xm"))
1154 (minus:V4DF (match_dup 1) (match_dup 2))
1157 "vaddsubpd\t{%2, %1, %0|%0, %1, %2}"
1158 [(set_attr "type" "sseadd")
1159 (set_attr "prefix" "vex")
1160 (set_attr "mode" "V4DF")])
1162 (define_insn "*avx_addsubv4sf3"
1163 [(set (match_operand:V4SF 0 "register_operand" "=x")
1166 (match_operand:V4SF 1 "register_operand" "x")
1167 (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
1168 (minus:V4SF (match_dup 1) (match_dup 2))
1171 "vaddsubps\t{%2, %1, %0|%0, %1, %2}"
1172 [(set_attr "type" "sseadd")
1173 (set_attr "prefix" "vex")
1174 (set_attr "mode" "V4SF")])
1176 (define_insn "sse3_addsubv4sf3"
1177 [(set (match_operand:V4SF 0 "register_operand" "=x")
1180 (match_operand:V4SF 1 "register_operand" "0")
1181 (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
1182 (minus:V4SF (match_dup 1) (match_dup 2))
1185 "addsubps\t{%2, %0|%0, %2}"
1186 [(set_attr "type" "sseadd")
1187 (set_attr "prefix_rep" "1")
1188 (set_attr "mode" "V4SF")])
1190 (define_insn "*avx_addsubv2df3"
1191 [(set (match_operand:V2DF 0 "register_operand" "=x")
1194 (match_operand:V2DF 1 "register_operand" "x")
1195 (match_operand:V2DF 2 "nonimmediate_operand" "xm"))
1196 (minus:V2DF (match_dup 1) (match_dup 2))
1199 "vaddsubpd\t{%2, %1, %0|%0, %1, %2}"
1200 [(set_attr "type" "sseadd")
1201 (set_attr "prefix" "vex")
1202 (set_attr "mode" "V2DF")])
1204 (define_insn "sse3_addsubv2df3"
1205 [(set (match_operand:V2DF 0 "register_operand" "=x")
1208 (match_operand:V2DF 1 "register_operand" "0")
1209 (match_operand:V2DF 2 "nonimmediate_operand" "xm"))
1210 (minus:V2DF (match_dup 1) (match_dup 2))
1213 "addsubpd\t{%2, %0|%0, %2}"
1214 [(set_attr "type" "sseadd")
1215 (set_attr "atom_unit" "complex")
1216 (set_attr "mode" "V2DF")])
1218 (define_insn "avx_h<plusminus_insn>v4df3"
1219 [(set (match_operand:V4DF 0 "register_operand" "=x")
1224 (match_operand:V4DF 1 "register_operand" "x")
1225 (parallel [(const_int 0)]))
1226 (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
1228 (vec_select:DF (match_dup 1) (parallel [(const_int 2)]))
1229 (vec_select:DF (match_dup 1) (parallel [(const_int 3)]))))
1233 (match_operand:V4DF 2 "nonimmediate_operand" "xm")
1234 (parallel [(const_int 0)]))
1235 (vec_select:DF (match_dup 2) (parallel [(const_int 1)])))
1237 (vec_select:DF (match_dup 2) (parallel [(const_int 2)]))
1238 (vec_select:DF (match_dup 2) (parallel [(const_int 3)]))))))]
1240 "vh<plusminus_mnemonic>pd\t{%2, %1, %0|%0, %1, %2}"
1241 [(set_attr "type" "sseadd")
1242 (set_attr "prefix" "vex")
1243 (set_attr "mode" "V4DF")])
1245 (define_insn "avx_h<plusminus_insn>v8sf3"
1246 [(set (match_operand:V8SF 0 "register_operand" "=x")
1252 (match_operand:V8SF 1 "register_operand" "x")
1253 (parallel [(const_int 0)]))
1254 (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))
1256 (vec_select:SF (match_dup 1) (parallel [(const_int 2)]))
1257 (vec_select:SF (match_dup 1) (parallel [(const_int 3)]))))
1261 (match_operand:V8SF 2 "nonimmediate_operand" "xm")
1262 (parallel [(const_int 0)]))
1263 (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))
1265 (vec_select:SF (match_dup 2) (parallel [(const_int 2)]))
1266 (vec_select:SF (match_dup 2) (parallel [(const_int 3)])))))
1270 (vec_select:SF (match_dup 1) (parallel [(const_int 4)]))
1271 (vec_select:SF (match_dup 1) (parallel [(const_int 5)])))
1273 (vec_select:SF (match_dup 1) (parallel [(const_int 6)]))
1274 (vec_select:SF (match_dup 1) (parallel [(const_int 7)]))))
1277 (vec_select:SF (match_dup 2) (parallel [(const_int 4)]))
1278 (vec_select:SF (match_dup 2) (parallel [(const_int 5)])))
1280 (vec_select:SF (match_dup 2) (parallel [(const_int 6)]))
1281 (vec_select:SF (match_dup 2) (parallel [(const_int 7)])))))))]
1283 "vh<plusminus_mnemonic>ps\t{%2, %1, %0|%0, %1, %2}"
1284 [(set_attr "type" "sseadd")
1285 (set_attr "prefix" "vex")
1286 (set_attr "mode" "V8SF")])
1288 (define_insn "*avx_h<plusminus_insn>v4sf3"
1289 [(set (match_operand:V4SF 0 "register_operand" "=x")
1294 (match_operand:V4SF 1 "register_operand" "x")
1295 (parallel [(const_int 0)]))
1296 (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))
1298 (vec_select:SF (match_dup 1) (parallel [(const_int 2)]))
1299 (vec_select:SF (match_dup 1) (parallel [(const_int 3)]))))
1303 (match_operand:V4SF 2 "nonimmediate_operand" "xm")
1304 (parallel [(const_int 0)]))
1305 (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))
1307 (vec_select:SF (match_dup 2) (parallel [(const_int 2)]))
1308 (vec_select:SF (match_dup 2) (parallel [(const_int 3)]))))))]
1310 "vh<plusminus_mnemonic>ps\t{%2, %1, %0|%0, %1, %2}"
1311 [(set_attr "type" "sseadd")
1312 (set_attr "prefix" "vex")
1313 (set_attr "mode" "V4SF")])
1315 (define_insn "sse3_h<plusminus_insn>v4sf3"
1316 [(set (match_operand:V4SF 0 "register_operand" "=x")
1321 (match_operand:V4SF 1 "register_operand" "0")
1322 (parallel [(const_int 0)]))
1323 (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))
1325 (vec_select:SF (match_dup 1) (parallel [(const_int 2)]))
1326 (vec_select:SF (match_dup 1) (parallel [(const_int 3)]))))
1330 (match_operand:V4SF 2 "nonimmediate_operand" "xm")
1331 (parallel [(const_int 0)]))
1332 (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))
1334 (vec_select:SF (match_dup 2) (parallel [(const_int 2)]))
1335 (vec_select:SF (match_dup 2) (parallel [(const_int 3)]))))))]
1337 "h<plusminus_mnemonic>ps\t{%2, %0|%0, %2}"
1338 [(set_attr "type" "sseadd")
1339 (set_attr "atom_unit" "complex")
1340 (set_attr "prefix_rep" "1")
1341 (set_attr "mode" "V4SF")])
1343 (define_insn "*avx_h<plusminus_insn>v2df3"
1344 [(set (match_operand:V2DF 0 "register_operand" "=x")
1348 (match_operand:V2DF 1 "register_operand" "x")
1349 (parallel [(const_int 0)]))
1350 (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
1353 (match_operand:V2DF 2 "nonimmediate_operand" "xm")
1354 (parallel [(const_int 0)]))
1355 (vec_select:DF (match_dup 2) (parallel [(const_int 1)])))))]
1357 "vh<plusminus_mnemonic>pd\t{%2, %1, %0|%0, %1, %2}"
1358 [(set_attr "type" "sseadd")
1359 (set_attr "prefix" "vex")
1360 (set_attr "mode" "V2DF")])
1362 (define_insn "sse3_h<plusminus_insn>v2df3"
1363 [(set (match_operand:V2DF 0 "register_operand" "=x")
1367 (match_operand:V2DF 1 "register_operand" "0")
1368 (parallel [(const_int 0)]))
1369 (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
1372 (match_operand:V2DF 2 "nonimmediate_operand" "xm")
1373 (parallel [(const_int 0)]))
1374 (vec_select:DF (match_dup 2) (parallel [(const_int 1)])))))]
1376 "h<plusminus_mnemonic>pd\t{%2, %0|%0, %2}"
1377 [(set_attr "type" "sseadd")
1378 (set_attr "mode" "V2DF")])
1380 (define_expand "reduc_splus_v4sf"
1381 [(match_operand:V4SF 0 "register_operand" "")
1382 (match_operand:V4SF 1 "register_operand" "")]
1387 rtx tmp = gen_reg_rtx (V4SFmode);
1388 emit_insn (gen_sse3_haddv4sf3 (tmp, operands[1], operands[1]));
1389 emit_insn (gen_sse3_haddv4sf3 (operands[0], tmp, tmp));
1392 ix86_expand_reduc_v4sf (gen_addv4sf3, operands[0], operands[1]);
1396 (define_expand "reduc_splus_v2df"
1397 [(match_operand:V2DF 0 "register_operand" "")
1398 (match_operand:V2DF 1 "register_operand" "")]
1401 emit_insn (gen_sse3_haddv2df3 (operands[0], operands[1], operands[1]));
1405 (define_expand "reduc_smax_v4sf"
1406 [(match_operand:V4SF 0 "register_operand" "")
1407 (match_operand:V4SF 1 "register_operand" "")]
1410 ix86_expand_reduc_v4sf (gen_smaxv4sf3, operands[0], operands[1]);
1414 (define_expand "reduc_smin_v4sf"
1415 [(match_operand:V4SF 0 "register_operand" "")
1416 (match_operand:V4SF 1 "register_operand" "")]
1419 ix86_expand_reduc_v4sf (gen_sminv4sf3, operands[0], operands[1]);
1423 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1425 ;; Parallel floating point comparisons
1427 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1429 (define_insn "avx_cmpp<avxmodesuffixf2c><mode>3"
1430 [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1432 [(match_operand:AVXMODEF2P 1 "register_operand" "x")
1433 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")
1434 (match_operand:SI 3 "const_0_to_31_operand" "n")]
1437 "vcmpp<avxmodesuffixf2c>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1438 [(set_attr "type" "ssecmp")
1439 (set_attr "length_immediate" "1")
1440 (set_attr "prefix" "vex")
1441 (set_attr "mode" "<MODE>")])
1443 (define_insn "avx_cmps<ssemodesuffixf2c><mode>3"
1444 [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
1445 (vec_merge:SSEMODEF2P
1447 [(match_operand:SSEMODEF2P 1 "register_operand" "x")
1448 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")
1449 (match_operand:SI 3 "const_0_to_31_operand" "n")]
1454 "vcmps<ssemodesuffixf2c>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1455 [(set_attr "type" "ssecmp")
1456 (set_attr "length_immediate" "1")
1457 (set_attr "prefix" "vex")
1458 (set_attr "mode" "<ssescalarmode>")])
1460 ;; We don't promote 128bit vector compare intrinsics. But vectorizer
1461 ;; may generate 256bit vector compare instructions.
1462 (define_insn "*avx_maskcmp<mode>3"
1463 [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1464 (match_operator:AVXMODEF2P 3 "avx_comparison_float_operator"
1465 [(match_operand:AVXMODEF2P 1 "register_operand" "x")
1466 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")]))]
1467 "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
1468 "vcmp%D3p<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
1469 [(set_attr "type" "ssecmp")
1470 (set_attr "prefix" "vex")
1471 (set_attr "length_immediate" "1")
1472 (set_attr "mode" "<avxvecmode>")])
1474 (define_insn "<sse>_maskcmp<mode>3"
1475 [(set (match_operand:SSEMODEF4 0 "register_operand" "=x")
1476 (match_operator:SSEMODEF4 3 "sse_comparison_operator"
1477 [(match_operand:SSEMODEF4 1 "register_operand" "0")
1478 (match_operand:SSEMODEF4 2 "nonimmediate_operand" "xm")]))]
1480 && (SSE_FLOAT_MODE_P (<MODE>mode) || SSE_VEC_FLOAT_MODE_P (<MODE>mode))"
1481 "cmp%D3<ssemodesuffixf4>\t{%2, %0|%0, %2}"
1482 [(set_attr "type" "ssecmp")
1483 (set_attr "length_immediate" "1")
1484 (set_attr "mode" "<MODE>")])
1486 (define_insn "<sse>_vmmaskcmp<mode>3"
1487 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1488 (vec_merge:SSEMODEF2P
1489 (match_operator:SSEMODEF2P 3 "sse_comparison_operator"
1490 [(match_operand:SSEMODEF2P 1 "register_operand" "0")
1491 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")])
1494 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1495 "cmp%D3s<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
1496 [(set_attr "type" "ssecmp")
1497 (set_attr "length_immediate" "1")
1498 (set_attr "mode" "<ssescalarmode>")])
1500 (define_insn "<sse>_comi"
1501 [(set (reg:CCFP FLAGS_REG)
1504 (match_operand:<ssevecmode> 0 "register_operand" "x")
1505 (parallel [(const_int 0)]))
1507 (match_operand:<ssevecmode> 1 "nonimmediate_operand" "xm")
1508 (parallel [(const_int 0)]))))]
1509 "SSE_FLOAT_MODE_P (<MODE>mode)"
1510 "%vcomis<ssemodefsuffix>\t{%1, %0|%0, %1}"
1511 [(set_attr "type" "ssecomi")
1512 (set_attr "prefix" "maybe_vex")
1513 (set_attr "prefix_rep" "0")
1514 (set (attr "prefix_data16")
1515 (if_then_else (eq_attr "mode" "DF")
1517 (const_string "0")))
1518 (set_attr "mode" "<MODE>")])
1520 (define_insn "<sse>_ucomi"
1521 [(set (reg:CCFPU FLAGS_REG)
1524 (match_operand:<ssevecmode> 0 "register_operand" "x")
1525 (parallel [(const_int 0)]))
1527 (match_operand:<ssevecmode> 1 "nonimmediate_operand" "xm")
1528 (parallel [(const_int 0)]))))]
1529 "SSE_FLOAT_MODE_P (<MODE>mode)"
1530 "%vucomis<ssemodefsuffix>\t{%1, %0|%0, %1}"
1531 [(set_attr "type" "ssecomi")
1532 (set_attr "prefix" "maybe_vex")
1533 (set_attr "prefix_rep" "0")
1534 (set (attr "prefix_data16")
1535 (if_then_else (eq_attr "mode" "DF")
1537 (const_string "0")))
1538 (set_attr "mode" "<MODE>")])
1540 (define_expand "vcond<mode>"
1541 [(set (match_operand:AVXMODEF2P 0 "register_operand" "")
1542 (if_then_else:AVXMODEF2P
1543 (match_operator 3 ""
1544 [(match_operand:AVXMODEF2P 4 "nonimmediate_operand" "")
1545 (match_operand:AVXMODEF2P 5 "nonimmediate_operand" "")])
1546 (match_operand:AVXMODEF2P 1 "general_operand" "")
1547 (match_operand:AVXMODEF2P 2 "general_operand" "")))]
1548 "(SSE_VEC_FLOAT_MODE_P (<MODE>mode)
1549 || AVX_VEC_FLOAT_MODE_P (<MODE>mode))"
1551 bool ok = ix86_expand_fp_vcond (operands);
1556 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1558 ;; Parallel floating point logical operations
1560 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1562 (define_insn "avx_andnot<mode>3"
1563 [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1566 (match_operand:AVXMODEF2P 1 "register_operand" "x"))
1567 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
1568 "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
1569 "vandnp<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
1570 [(set_attr "type" "sselog")
1571 (set_attr "prefix" "vex")
1572 (set_attr "mode" "<avxvecmode>")])
1574 (define_insn "<sse>_andnot<mode>3"
1575 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1578 (match_operand:SSEMODEF2P 1 "register_operand" "0"))
1579 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
1580 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1581 "andnp<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
1582 [(set_attr "type" "sselog")
1583 (set_attr "mode" "<MODE>")])
1585 (define_expand "<code><mode>3"
1586 [(set (match_operand:AVX256MODEF2P 0 "register_operand" "")
1587 (any_logic:AVX256MODEF2P
1588 (match_operand:AVX256MODEF2P 1 "nonimmediate_operand" "")
1589 (match_operand:AVX256MODEF2P 2 "nonimmediate_operand" "")))]
1590 "AVX256_VEC_FLOAT_MODE_P (<MODE>mode)"
1591 "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
1593 (define_insn "*avx_<code><mode>3"
1594 [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x")
1595 (any_logic:AVXMODEF2P
1596 (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x")
1597 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))]
1598 "AVX_VEC_FLOAT_MODE_P (<MODE>mode)
1599 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
1600 "v<logic>p<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"
1601 [(set_attr "type" "sselog")
1602 (set_attr "prefix" "vex")
1603 (set_attr "mode" "<avxvecmode>")])
1605 (define_expand "<code><mode>3"
1606 [(set (match_operand:SSEMODEF2P 0 "register_operand" "")
1607 (any_logic:SSEMODEF2P
1608 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "")
1609 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "")))]
1610 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1611 "ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
1613 (define_insn "*<code><mode>3"
1614 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x")
1615 (any_logic:SSEMODEF2P
1616 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%0")
1617 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))]
1618 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)
1619 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
1620 "<logic>p<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
1621 [(set_attr "type" "sselog")
1622 (set_attr "mode" "<MODE>")])
1624 (define_expand "copysign<mode>3"
1627 (not:SSEMODEF2P (match_dup 3))
1628 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "")))
1630 (and:SSEMODEF2P (match_dup 3)
1631 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "")))
1632 (set (match_operand:SSEMODEF2P 0 "register_operand" "")
1633 (ior:SSEMODEF2P (match_dup 4) (match_dup 5)))]
1634 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
1636 operands[3] = ix86_build_signbit_mask (<ssescalarmode>mode, 1, 0);
1638 operands[4] = gen_reg_rtx (<MODE>mode);
1639 operands[5] = gen_reg_rtx (<MODE>mode);
1642 ;; Also define scalar versions. These are used for abs, neg, and
1643 ;; conditional move. Using subregs into vector modes causes register
1644 ;; allocation lossage. These patterns do not allow memory operands
1645 ;; because the native instructions read the full 128-bits.
1647 (define_insn "*avx_andnot<mode>3"
1648 [(set (match_operand:MODEF 0 "register_operand" "=x")
1651 (match_operand:MODEF 1 "register_operand" "x"))
1652 (match_operand:MODEF 2 "register_operand" "x")))]
1653 "AVX_FLOAT_MODE_P (<MODE>mode)"
1654 "vandnp<ssemodefsuffix>\t{%2, %1, %0|%0, %1, %2}"
1655 [(set_attr "type" "sselog")
1656 (set_attr "prefix" "vex")
1657 (set_attr "mode" "<ssevecmode>")])
1659 (define_insn "*andnot<mode>3"
1660 [(set (match_operand:MODEF 0 "register_operand" "=x")
1663 (match_operand:MODEF 1 "register_operand" "0"))
1664 (match_operand:MODEF 2 "register_operand" "x")))]
1665 "SSE_FLOAT_MODE_P (<MODE>mode)"
1666 "andnp<ssemodefsuffix>\t{%2, %0|%0, %2}"
1667 [(set_attr "type" "sselog")
1668 (set_attr "mode" "<ssevecmode>")])
1670 (define_insn "*avx_<code><mode>3"
1671 [(set (match_operand:MODEF 0 "register_operand" "=x")
1673 (match_operand:MODEF 1 "register_operand" "x")
1674 (match_operand:MODEF 2 "register_operand" "x")))]
1675 "AVX_FLOAT_MODE_P (<MODE>mode)"
1676 "v<logic>p<ssemodefsuffix>\t{%2, %1, %0|%0, %1, %2}"
1677 [(set_attr "type" "sselog")
1678 (set_attr "prefix" "vex")
1679 (set_attr "mode" "<ssevecmode>")])
1681 (define_insn "*<code><mode>3"
1682 [(set (match_operand:MODEF 0 "register_operand" "=x")
1684 (match_operand:MODEF 1 "register_operand" "0")
1685 (match_operand:MODEF 2 "register_operand" "x")))]
1686 "SSE_FLOAT_MODE_P (<MODE>mode)"
1687 "<logic>p<ssemodefsuffix>\t{%2, %0|%0, %2}"
1688 [(set_attr "type" "sselog")
1689 (set_attr "mode" "<ssevecmode>")])
1691 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1693 ;; FMA4 floating point multiply/accumulate instructions. This
1694 ;; includes the scalar version of the instructions as well as the
1697 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1699 ;; In order to match (*a * *b) + *c, particularly when vectorizing, allow
1700 ;; combine to generate a multiply/add with two memory references. We then
1701 ;; split this insn, into loading up the destination register with one of the
1702 ;; memory operations. If we don't manage to split the insn, reload will
1703 ;; generate the appropriate moves. The reason this is needed, is that combine
1704 ;; has already folded one of the memory references into both the multiply and
1705 ;; add insns, and it can't generate a new pseudo. I.e.:
1706 ;; (set (reg1) (mem (addr1)))
1707 ;; (set (reg2) (mult (reg1) (mem (addr2))))
1708 ;; (set (reg3) (plus (reg2) (mem (addr3))))
1710 (define_insn "fma4_fmadd<mode>4256"
1711 [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1714 (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1715 (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1716 (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x")))]
1717 "TARGET_FMA4 && TARGET_FUSED_MADD"
1718 "vfmadd<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1719 [(set_attr "type" "ssemuladd")
1720 (set_attr "mode" "<MODE>")])
1722 ;; Floating multiply and subtract.
1723 (define_insn "fma4_fmsub<mode>4256"
1724 [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1727 (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1728 (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1729 (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x")))]
1730 "TARGET_FMA4 && TARGET_FUSED_MADD"
1731 "vfmsub<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1732 [(set_attr "type" "ssemuladd")
1733 (set_attr "mode" "<MODE>")])
1735 ;; Floating point negative multiply and add.
1736 ;; Rewrite (- (a * b) + c) into the canonical form: c - (a * b).
1737 (define_insn "fma4_fnmadd<mode>4256"
1738 [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1740 (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x")
1742 (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1743 (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))))]
1744 "TARGET_FMA4 && TARGET_FUSED_MADD"
1745 "vfnmadd<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1746 [(set_attr "type" "ssemuladd")
1747 (set_attr "mode" "<MODE>")])
1749 ;; Floating point negative multiply and subtract.
1750 (define_insn "fma4_fnmsub<mode>4256"
1751 [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1755 (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x"))
1756 (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1757 (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x")))]
1758 "TARGET_FMA4 && TARGET_FUSED_MADD"
1759 "vfnmsub<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1760 [(set_attr "type" "ssemuladd")
1761 (set_attr "mode" "<MODE>")])
1763 (define_insn "fma4_fmadd<mode>4"
1764 [(set (match_operand:SSEMODEF4 0 "register_operand" "=x,x")
1767 (match_operand:SSEMODEF4 1 "nonimmediate_operand" "%x,x")
1768 (match_operand:SSEMODEF4 2 "nonimmediate_operand" "x,m"))
1769 (match_operand:SSEMODEF4 3 "nonimmediate_operand" "xm,x")))]
1770 "TARGET_FMA4 && TARGET_FUSED_MADD"
1771 "vfmadd<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1772 [(set_attr "type" "ssemuladd")
1773 (set_attr "mode" "<MODE>")])
1775 ;; For the scalar operations, use operand1 for the upper words that aren't
1776 ;; modified, so restrict the forms that are generated.
1777 ;; Scalar version of fmadd.
1778 (define_insn "fma4_vmfmadd<mode>4"
1779 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1780 (vec_merge:SSEMODEF2P
1783 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
1784 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
1785 (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
1788 "TARGET_FMA4 && TARGET_FUSED_MADD"
1789 "vfmadd<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1790 [(set_attr "type" "ssemuladd")
1791 (set_attr "mode" "<MODE>")])
1793 ;; Floating multiply and subtract.
1794 ;; Allow two memory operands the same as fmadd.
1795 (define_insn "fma4_fmsub<mode>4"
1796 [(set (match_operand:SSEMODEF4 0 "register_operand" "=x,x")
1799 (match_operand:SSEMODEF4 1 "nonimmediate_operand" "%x,x")
1800 (match_operand:SSEMODEF4 2 "nonimmediate_operand" "x,m"))
1801 (match_operand:SSEMODEF4 3 "nonimmediate_operand" "xm,x")))]
1802 "TARGET_FMA4 && TARGET_FUSED_MADD"
1803 "vfmsub<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1804 [(set_attr "type" "ssemuladd")
1805 (set_attr "mode" "<MODE>")])
1807 ;; For the scalar operations, use operand1 for the upper words that aren't
1808 ;; modified, so restrict the forms that are generated.
1809 ;; Scalar version of fmsub.
1810 (define_insn "fma4_vmfmsub<mode>4"
1811 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1812 (vec_merge:SSEMODEF2P
1815 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
1816 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
1817 (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
1820 "TARGET_FMA4 && TARGET_FUSED_MADD"
1821 "vfmsub<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1822 [(set_attr "type" "ssemuladd")
1823 (set_attr "mode" "<MODE>")])
1825 ;; Floating point negative multiply and add.
1826 ;; Rewrite (- (a * b) + c) into the canonical form: c - (a * b).
1827 (define_insn "fma4_fnmadd<mode>4"
1828 [(set (match_operand:SSEMODEF4 0 "register_operand" "=x,x")
1830 (match_operand:SSEMODEF4 3 "nonimmediate_operand" "xm,x")
1832 (match_operand:SSEMODEF4 1 "nonimmediate_operand" "%x,x")
1833 (match_operand:SSEMODEF4 2 "nonimmediate_operand" "x,m"))))]
1834 "TARGET_FMA4 && TARGET_FUSED_MADD"
1835 "vfnmadd<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1836 [(set_attr "type" "ssemuladd")
1837 (set_attr "mode" "<MODE>")])
1839 ;; For the scalar operations, use operand1 for the upper words that aren't
1840 ;; modified, so restrict the forms that are generated.
1841 ;; Scalar version of fnmadd.
1842 (define_insn "fma4_vmfnmadd<mode>4"
1843 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1844 (vec_merge:SSEMODEF2P
1846 (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x")
1848 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
1849 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m")))
1852 "TARGET_FMA4 && TARGET_FUSED_MADD"
1853 "vfnmadd<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1854 [(set_attr "type" "ssemuladd")
1855 (set_attr "mode" "<MODE>")])
1857 ;; Floating point negative multiply and subtract.
1858 ;; Rewrite (- (a * b) - c) into the canonical form: ((-a) * b) - c.
1859 (define_insn "fma4_fnmsub<mode>4"
1860 [(set (match_operand:SSEMODEF4 0 "register_operand" "=x,x")
1864 (match_operand:SSEMODEF4 1 "nonimmediate_operand" "%x,x"))
1865 (match_operand:SSEMODEF4 2 "nonimmediate_operand" "x,m"))
1866 (match_operand:SSEMODEF4 3 "nonimmediate_operand" "xm,x")))]
1867 "TARGET_FMA4 && TARGET_FUSED_MADD"
1868 "vfnmsub<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1869 [(set_attr "type" "ssemuladd")
1870 (set_attr "mode" "<MODE>")])
1872 ;; For the scalar operations, use operand1 for the upper words that aren't
1873 ;; modified, so restrict the forms that are generated.
1874 ;; Scalar version of fnmsub.
1875 (define_insn "fma4_vmfnmsub<mode>4"
1876 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1877 (vec_merge:SSEMODEF2P
1881 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x"))
1882 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
1883 (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
1886 "TARGET_FMA4 && TARGET_FUSED_MADD"
1887 "vfnmsub<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1888 [(set_attr "type" "ssemuladd")
1889 (set_attr "mode" "<MODE>")])
1891 (define_insn "fma4i_fmadd<mode>4256"
1892 [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1896 (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1897 (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1898 (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x"))]
1899 UNSPEC_FMA4_INTRINSIC))]
1900 "TARGET_FMA4 && TARGET_FUSED_MADD"
1901 "vfmadd<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1902 [(set_attr "type" "ssemuladd")
1903 (set_attr "mode" "<MODE>")])
1905 (define_insn "fma4i_fmsub<mode>4256"
1906 [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1910 (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1911 (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1912 (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x"))]
1913 UNSPEC_FMA4_INTRINSIC))]
1914 "TARGET_FMA4 && TARGET_FUSED_MADD"
1915 "vfmsub<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1916 [(set_attr "type" "ssemuladd")
1917 (set_attr "mode" "<MODE>")])
1919 (define_insn "fma4i_fnmadd<mode>4256"
1920 [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1923 (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x")
1925 (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
1926 (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m")))]
1927 UNSPEC_FMA4_INTRINSIC))]
1928 "TARGET_FMA4 && TARGET_FUSED_MADD"
1929 "vfnmadd<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1930 [(set_attr "type" "ssemuladd")
1931 (set_attr "mode" "<MODE>")])
1933 (define_insn "fma4i_fnmsub<mode>4256"
1934 [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
1939 (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x"))
1940 (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
1941 (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x"))]
1942 UNSPEC_FMA4_INTRINSIC))]
1943 "TARGET_FMA4 && TARGET_FUSED_MADD"
1944 "vfnmsub<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1945 [(set_attr "type" "ssemuladd")
1946 (set_attr "mode" "<MODE>")])
1948 (define_insn "fma4i_fmadd<mode>4"
1949 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1953 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
1954 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
1955 (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))]
1956 UNSPEC_FMA4_INTRINSIC))]
1957 "TARGET_FMA4 && TARGET_FUSED_MADD"
1958 "vfmadd<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1959 [(set_attr "type" "ssemuladd")
1960 (set_attr "mode" "<MODE>")])
1962 (define_insn "fma4i_fmsub<mode>4"
1963 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1967 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
1968 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
1969 (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))]
1970 UNSPEC_FMA4_INTRINSIC))]
1971 "TARGET_FMA4 && TARGET_FUSED_MADD"
1972 "vfmsub<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1973 [(set_attr "type" "ssemuladd")
1974 (set_attr "mode" "<MODE>")])
1976 (define_insn "fma4i_fnmadd<mode>4"
1977 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1980 (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x")
1982 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
1983 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m")))]
1984 UNSPEC_FMA4_INTRINSIC))]
1985 "TARGET_FMA4 && TARGET_FUSED_MADD"
1986 "vfnmadd<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
1987 [(set_attr "type" "ssemuladd")
1988 (set_attr "mode" "<MODE>")])
1990 (define_insn "fma4i_fnmsub<mode>4"
1991 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
1996 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x"))
1997 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
1998 (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))]
1999 UNSPEC_FMA4_INTRINSIC))]
2000 "TARGET_FMA4 && TARGET_FUSED_MADD"
2001 "vfnmsub<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2002 [(set_attr "type" "ssemuladd")
2003 (set_attr "mode" "<MODE>")])
2005 ;; For the scalar operations, use operand1 for the upper words that aren't
2006 ;; modified, so restrict the forms that are accepted.
2007 (define_insn "fma4i_vmfmadd<mode>4"
2008 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
2010 [(vec_merge:SSEMODEF2P
2013 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
2014 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
2015 (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
2018 UNSPEC_FMA4_INTRINSIC))]
2019 "TARGET_FMA4 && TARGET_FUSED_MADD"
2020 "vfmadd<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2021 [(set_attr "type" "ssemuladd")
2022 (set_attr "mode" "<ssescalarmode>")])
2024 (define_insn "fma4i_vmfmsub<mode>4"
2025 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
2027 [(vec_merge:SSEMODEF2P
2030 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
2031 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
2032 (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
2035 UNSPEC_FMA4_INTRINSIC))]
2036 "TARGET_FMA4 && TARGET_FUSED_MADD"
2037 "vfmsub<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2038 [(set_attr "type" "ssemuladd")
2039 (set_attr "mode" "<ssescalarmode>")])
2041 (define_insn "fma4i_vmfnmadd<mode>4"
2042 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
2044 [(vec_merge:SSEMODEF2P
2046 (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x")
2048 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
2049 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m")))
2052 UNSPEC_FMA4_INTRINSIC))]
2053 "TARGET_FMA4 && TARGET_FUSED_MADD"
2054 "vfnmadd<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2055 [(set_attr "type" "ssemuladd")
2056 (set_attr "mode" "<ssescalarmode>")])
2058 (define_insn "fma4i_vmfnmsub<mode>4"
2059 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
2061 [(vec_merge:SSEMODEF2P
2065 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x"))
2066 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
2067 (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
2070 UNSPEC_FMA4_INTRINSIC))]
2071 "TARGET_FMA4 && TARGET_FUSED_MADD"
2072 "vfnmsub<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2073 [(set_attr "type" "ssemuladd")
2074 (set_attr "mode" "<ssescalarmode>")])
2076 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2078 ;; FMA4 Parallel floating point multiply addsub and subadd operations.
2080 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2082 (define_insn "fma4_fmaddsubv8sf4"
2083 [(set (match_operand:V8SF 0 "register_operand" "=x,x")
2087 (match_operand:V8SF 1 "nonimmediate_operand" "%x,x")
2088 (match_operand:V8SF 2 "nonimmediate_operand" "x,m"))
2089 (match_operand:V8SF 3 "nonimmediate_operand" "xm,x"))
2096 "TARGET_FMA4 && TARGET_FUSED_MADD"
2097 "vfmaddsubps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2098 [(set_attr "type" "ssemuladd")
2099 (set_attr "mode" "V8SF")])
2101 (define_insn "fma4_fmaddsubv4df4"
2102 [(set (match_operand:V4DF 0 "register_operand" "=x,x")
2106 (match_operand:V4DF 1 "nonimmediate_operand" "%x,x")
2107 (match_operand:V4DF 2 "nonimmediate_operand" "x,m"))
2108 (match_operand:V4DF 3 "nonimmediate_operand" "xm,x"))
2115 "TARGET_FMA4 && TARGET_FUSED_MADD"
2116 "vfmaddsubpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2117 [(set_attr "type" "ssemuladd")
2118 (set_attr "mode" "V4DF")])
2120 (define_insn "fma4_fmaddsubv4sf4"
2121 [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2125 (match_operand:V4SF 1 "nonimmediate_operand" "%x,x")
2126 (match_operand:V4SF 2 "nonimmediate_operand" "x,m"))
2127 (match_operand:V4SF 3 "nonimmediate_operand" "xm,x"))
2134 "TARGET_FMA4 && TARGET_FUSED_MADD"
2135 "vfmaddsubps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2136 [(set_attr "type" "ssemuladd")
2137 (set_attr "mode" "V4SF")])
2139 (define_insn "fma4_fmaddsubv2df4"
2140 [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2144 (match_operand:V2DF 1 "nonimmediate_operand" "%x,x")
2145 (match_operand:V2DF 2 "nonimmediate_operand" "x,m"))
2146 (match_operand:V2DF 3 "nonimmediate_operand" "xm,x"))
2153 "TARGET_FMA4 && TARGET_FUSED_MADD"
2154 "vfmaddsubpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2155 [(set_attr "type" "ssemuladd")
2156 (set_attr "mode" "V2DF")])
2158 (define_insn "fma4_fmsubaddv8sf4"
2159 [(set (match_operand:V8SF 0 "register_operand" "=x,x")
2163 (match_operand:V8SF 1 "nonimmediate_operand" "%x,x")
2164 (match_operand:V8SF 2 "nonimmediate_operand" "x,m"))
2165 (match_operand:V8SF 3 "nonimmediate_operand" "xm,x"))
2172 "TARGET_FMA4 && TARGET_FUSED_MADD"
2173 "vfmsubaddps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2174 [(set_attr "type" "ssemuladd")
2175 (set_attr "mode" "V8SF")])
2177 (define_insn "fma4_fmsubaddv4df4"
2178 [(set (match_operand:V4DF 0 "register_operand" "=x,x")
2182 (match_operand:V4DF 1 "nonimmediate_operand" "%x,x")
2183 (match_operand:V4DF 2 "nonimmediate_operand" "x,m"))
2184 (match_operand:V4DF 3 "nonimmediate_operand" "xm,x"))
2191 "TARGET_FMA4 && TARGET_FUSED_MADD"
2192 "vfmsubaddpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2193 [(set_attr "type" "ssemuladd")
2194 (set_attr "mode" "V4DF")])
2196 (define_insn "fma4_fmsubaddv4sf4"
2197 [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2201 (match_operand:V4SF 1 "nonimmediate_operand" "%x,x")
2202 (match_operand:V4SF 2 "nonimmediate_operand" "x,m"))
2203 (match_operand:V4SF 3 "nonimmediate_operand" "xm,x"))
2210 "TARGET_FMA4 && TARGET_FUSED_MADD"
2211 "vfmsubaddps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2212 [(set_attr "type" "ssemuladd")
2213 (set_attr "mode" "V4SF")])
2215 (define_insn "fma4_fmsubaddv2df4"
2216 [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2220 (match_operand:V2DF 1 "nonimmediate_operand" "%x,x")
2221 (match_operand:V2DF 2 "nonimmediate_operand" "x,m"))
2222 (match_operand:V2DF 3 "nonimmediate_operand" "xm,x"))
2229 "TARGET_FMA4 && TARGET_FUSED_MADD"
2230 "vfmsubaddpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2231 [(set_attr "type" "ssemuladd")
2232 (set_attr "mode" "V2DF")])
2234 (define_insn "fma4i_fmaddsubv8sf4"
2235 [(set (match_operand:V8SF 0 "register_operand" "=x,x")
2240 (match_operand:V8SF 1 "nonimmediate_operand" "%x,x")
2241 (match_operand:V8SF 2 "nonimmediate_operand" "x,m"))
2242 (match_operand:V8SF 3 "nonimmediate_operand" "xm,x"))
2249 UNSPEC_FMA4_INTRINSIC))]
2250 "TARGET_FMA4 && TARGET_FUSED_MADD"
2251 "vfmaddsubps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2252 [(set_attr "type" "ssemuladd")
2253 (set_attr "mode" "V8SF")])
2255 (define_insn "fma4i_fmaddsubv4df4"
2256 [(set (match_operand:V4DF 0 "register_operand" "=x,x")
2261 (match_operand:V4DF 1 "nonimmediate_operand" "%x,x")
2262 (match_operand:V4DF 2 "nonimmediate_operand" "x,m"))
2263 (match_operand:V4DF 3 "nonimmediate_operand" "xm,x"))
2270 UNSPEC_FMA4_INTRINSIC))]
2271 "TARGET_FMA4 && TARGET_FUSED_MADD"
2272 "vfmaddsubpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2273 [(set_attr "type" "ssemuladd")
2274 (set_attr "mode" "V4DF")])
2276 (define_insn "fma4i_fmaddsubv4sf4"
2277 [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2282 (match_operand:V4SF 1 "nonimmediate_operand" "%x,x")
2283 (match_operand:V4SF 2 "nonimmediate_operand" "x,m"))
2284 (match_operand:V4SF 3 "nonimmediate_operand" "xm,x"))
2291 UNSPEC_FMA4_INTRINSIC))]
2292 "TARGET_FMA4 && TARGET_FUSED_MADD"
2293 "vfmaddsubps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2294 [(set_attr "type" "ssemuladd")
2295 (set_attr "mode" "V4SF")])
2297 (define_insn "fma4i_fmaddsubv2df4"
2298 [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2303 (match_operand:V2DF 1 "nonimmediate_operand" "%x,x")
2304 (match_operand:V2DF 2 "nonimmediate_operand" "x,m"))
2305 (match_operand:V2DF 3 "nonimmediate_operand" "xm,x"))
2312 UNSPEC_FMA4_INTRINSIC))]
2313 "TARGET_FMA4 && TARGET_FUSED_MADD"
2314 "vfmaddsubpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2315 [(set_attr "type" "ssemuladd")
2316 (set_attr "mode" "V2DF")])
2318 (define_insn "fma4i_fmsubaddv8sf4"
2319 [(set (match_operand:V8SF 0 "register_operand" "=x,x")
2324 (match_operand:V8SF 1 "nonimmediate_operand" "%x,x")
2325 (match_operand:V8SF 2 "nonimmediate_operand" "x,m"))
2326 (match_operand:V8SF 3 "nonimmediate_operand" "xm,x"))
2333 UNSPEC_FMA4_INTRINSIC))]
2334 "TARGET_FMA4 && TARGET_FUSED_MADD"
2335 "vfmsubaddps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2336 [(set_attr "type" "ssemuladd")
2337 (set_attr "mode" "V8SF")])
2339 (define_insn "fma4i_fmsubaddv4df4"
2340 [(set (match_operand:V4DF 0 "register_operand" "=x,x")
2345 (match_operand:V4DF 1 "nonimmediate_operand" "%x,x")
2346 (match_operand:V4DF 2 "nonimmediate_operand" "x,m"))
2347 (match_operand:V4DF 3 "nonimmediate_operand" "xm,x"))
2354 UNSPEC_FMA4_INTRINSIC))]
2355 "TARGET_FMA4 && TARGET_FUSED_MADD"
2356 "vfmsubaddpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2357 [(set_attr "type" "ssemuladd")
2358 (set_attr "mode" "V4DF")])
2360 (define_insn "fma4i_fmsubaddv4sf4"
2361 [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2366 (match_operand:V4SF 1 "nonimmediate_operand" "%x,x")
2367 (match_operand:V4SF 2 "nonimmediate_operand" "x,m"))
2368 (match_operand:V4SF 3 "nonimmediate_operand" "xm,x"))
2375 UNSPEC_FMA4_INTRINSIC))]
2376 "TARGET_FMA4 && TARGET_FUSED_MADD"
2377 "vfmsubaddps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2378 [(set_attr "type" "ssemuladd")
2379 (set_attr "mode" "V4SF")])
2381 (define_insn "fma4i_fmsubaddv2df4"
2382 [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2387 (match_operand:V2DF 1 "nonimmediate_operand" "%x,x")
2388 (match_operand:V2DF 2 "nonimmediate_operand" "x,m"))
2389 (match_operand:V2DF 3 "nonimmediate_operand" "xm,x"))
2396 UNSPEC_FMA4_INTRINSIC))]
2397 "TARGET_FMA4 && TARGET_FUSED_MADD"
2398 "vfmsubaddpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
2399 [(set_attr "type" "ssemuladd")
2400 (set_attr "mode" "V2DF")])
2402 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2404 ;; Parallel single-precision floating point conversion operations
2406 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2408 (define_insn "sse_cvtpi2ps"
2409 [(set (match_operand:V4SF 0 "register_operand" "=x")
2412 (float:V2SF (match_operand:V2SI 2 "nonimmediate_operand" "ym")))
2413 (match_operand:V4SF 1 "register_operand" "0")
2416 "cvtpi2ps\t{%2, %0|%0, %2}"
2417 [(set_attr "type" "ssecvt")
2418 (set_attr "mode" "V4SF")])
2420 (define_insn "sse_cvtps2pi"
2421 [(set (match_operand:V2SI 0 "register_operand" "=y")
2423 (unspec:V4SI [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
2425 (parallel [(const_int 0) (const_int 1)])))]
2427 "cvtps2pi\t{%1, %0|%0, %1}"
2428 [(set_attr "type" "ssecvt")
2429 (set_attr "unit" "mmx")
2430 (set_attr "mode" "DI")])
2432 (define_insn "sse_cvttps2pi"
2433 [(set (match_operand:V2SI 0 "register_operand" "=y")
2435 (fix:V4SI (match_operand:V4SF 1 "nonimmediate_operand" "xm"))
2436 (parallel [(const_int 0) (const_int 1)])))]
2438 "cvttps2pi\t{%1, %0|%0, %1}"
2439 [(set_attr "type" "ssecvt")
2440 (set_attr "unit" "mmx")
2441 (set_attr "prefix_rep" "0")
2442 (set_attr "mode" "SF")])
2444 (define_insn "*avx_cvtsi2ss"
2445 [(set (match_operand:V4SF 0 "register_operand" "=x")
2448 (float:SF (match_operand:SI 2 "nonimmediate_operand" "rm")))
2449 (match_operand:V4SF 1 "register_operand" "x")
2452 "vcvtsi2ss\t{%2, %1, %0|%0, %1, %2}"
2453 [(set_attr "type" "sseicvt")
2454 (set_attr "prefix" "vex")
2455 (set_attr "mode" "SF")])
2457 (define_insn "sse_cvtsi2ss"
2458 [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2461 (float:SF (match_operand:SI 2 "nonimmediate_operand" "r,m")))
2462 (match_operand:V4SF 1 "register_operand" "0,0")
2465 "cvtsi2ss\t{%2, %0|%0, %2}"
2466 [(set_attr "type" "sseicvt")
2467 (set_attr "athlon_decode" "vector,double")
2468 (set_attr "amdfam10_decode" "vector,double")
2469 (set_attr "mode" "SF")])
2471 (define_insn "*avx_cvtsi2ssq"
2472 [(set (match_operand:V4SF 0 "register_operand" "=x")
2475 (float:SF (match_operand:DI 2 "nonimmediate_operand" "rm")))
2476 (match_operand:V4SF 1 "register_operand" "x")
2478 "TARGET_AVX && TARGET_64BIT"
2479 "vcvtsi2ssq\t{%2, %1, %0|%0, %1, %2}"
2480 [(set_attr "type" "sseicvt")
2481 (set_attr "length_vex" "4")
2482 (set_attr "prefix" "vex")
2483 (set_attr "mode" "SF")])
2485 (define_insn "sse_cvtsi2ssq"
2486 [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2489 (float:SF (match_operand:DI 2 "nonimmediate_operand" "r,rm")))
2490 (match_operand:V4SF 1 "register_operand" "0,0")
2492 "TARGET_SSE && TARGET_64BIT"
2493 "cvtsi2ssq\t{%2, %0|%0, %2}"
2494 [(set_attr "type" "sseicvt")
2495 (set_attr "prefix_rex" "1")
2496 (set_attr "athlon_decode" "vector,double")
2497 (set_attr "amdfam10_decode" "vector,double")
2498 (set_attr "mode" "SF")])
2500 (define_insn "sse_cvtss2si"
2501 [(set (match_operand:SI 0 "register_operand" "=r,r")
2504 (match_operand:V4SF 1 "nonimmediate_operand" "x,m")
2505 (parallel [(const_int 0)]))]
2506 UNSPEC_FIX_NOTRUNC))]
2508 "%vcvtss2si\t{%1, %0|%0, %1}"
2509 [(set_attr "type" "sseicvt")
2510 (set_attr "athlon_decode" "double,vector")
2511 (set_attr "prefix_rep" "1")
2512 (set_attr "prefix" "maybe_vex")
2513 (set_attr "mode" "SI")])
2515 (define_insn "sse_cvtss2si_2"
2516 [(set (match_operand:SI 0 "register_operand" "=r,r")
2517 (unspec:SI [(match_operand:SF 1 "nonimmediate_operand" "x,m")]
2518 UNSPEC_FIX_NOTRUNC))]
2520 "%vcvtss2si\t{%1, %0|%0, %1}"
2521 [(set_attr "type" "sseicvt")
2522 (set_attr "athlon_decode" "double,vector")
2523 (set_attr "amdfam10_decode" "double,double")
2524 (set_attr "prefix_rep" "1")
2525 (set_attr "prefix" "maybe_vex")
2526 (set_attr "mode" "SI")])
2528 (define_insn "sse_cvtss2siq"
2529 [(set (match_operand:DI 0 "register_operand" "=r,r")
2532 (match_operand:V4SF 1 "nonimmediate_operand" "x,m")
2533 (parallel [(const_int 0)]))]
2534 UNSPEC_FIX_NOTRUNC))]
2535 "TARGET_SSE && TARGET_64BIT"
2536 "%vcvtss2si{q}\t{%1, %0|%0, %1}"
2537 [(set_attr "type" "sseicvt")
2538 (set_attr "athlon_decode" "double,vector")
2539 (set_attr "prefix_rep" "1")
2540 (set_attr "prefix" "maybe_vex")
2541 (set_attr "mode" "DI")])
2543 (define_insn "sse_cvtss2siq_2"
2544 [(set (match_operand:DI 0 "register_operand" "=r,r")
2545 (unspec:DI [(match_operand:SF 1 "nonimmediate_operand" "x,m")]
2546 UNSPEC_FIX_NOTRUNC))]
2547 "TARGET_SSE && TARGET_64BIT"
2548 "%vcvtss2si{q}\t{%1, %0|%0, %1}"
2549 [(set_attr "type" "sseicvt")
2550 (set_attr "athlon_decode" "double,vector")
2551 (set_attr "amdfam10_decode" "double,double")
2552 (set_attr "prefix_rep" "1")
2553 (set_attr "prefix" "maybe_vex")
2554 (set_attr "mode" "DI")])
2556 (define_insn "sse_cvttss2si"
2557 [(set (match_operand:SI 0 "register_operand" "=r,r")
2560 (match_operand:V4SF 1 "nonimmediate_operand" "x,m")
2561 (parallel [(const_int 0)]))))]
2563 "%vcvttss2si\t{%1, %0|%0, %1}"
2564 [(set_attr "type" "sseicvt")
2565 (set_attr "athlon_decode" "double,vector")
2566 (set_attr "amdfam10_decode" "double,double")
2567 (set_attr "prefix_rep" "1")
2568 (set_attr "prefix" "maybe_vex")
2569 (set_attr "mode" "SI")])
2571 (define_insn "sse_cvttss2siq"
2572 [(set (match_operand:DI 0 "register_operand" "=r,r")
2575 (match_operand:V4SF 1 "nonimmediate_operand" "x,m")
2576 (parallel [(const_int 0)]))))]
2577 "TARGET_SSE && TARGET_64BIT"
2578 "%vcvttss2si{q}\t{%1, %0|%0, %1}"
2579 [(set_attr "type" "sseicvt")
2580 (set_attr "athlon_decode" "double,vector")
2581 (set_attr "amdfam10_decode" "double,double")
2582 (set_attr "prefix_rep" "1")
2583 (set_attr "prefix" "maybe_vex")
2584 (set_attr "mode" "DI")])
2586 (define_insn "avx_cvtdq2ps<avxmodesuffix>"
2587 [(set (match_operand:AVXMODEDCVTDQ2PS 0 "register_operand" "=x")
2588 (float:AVXMODEDCVTDQ2PS
2589 (match_operand:<avxcvtvecmode> 1 "nonimmediate_operand" "xm")))]
2591 "vcvtdq2ps\t{%1, %0|%0, %1}"
2592 [(set_attr "type" "ssecvt")
2593 (set_attr "prefix" "vex")
2594 (set_attr "mode" "<avxvecmode>")])
2596 (define_insn "sse2_cvtdq2ps"
2597 [(set (match_operand:V4SF 0 "register_operand" "=x")
2598 (float:V4SF (match_operand:V4SI 1 "nonimmediate_operand" "xm")))]
2600 "cvtdq2ps\t{%1, %0|%0, %1}"
2601 [(set_attr "type" "ssecvt")
2602 (set_attr "mode" "V4SF")])
2604 (define_expand "sse2_cvtudq2ps"
2606 (float:V4SF (match_operand:V4SI 1 "nonimmediate_operand" "")))
2608 (lt:V4SF (match_dup 5) (match_dup 3)))
2610 (and:V4SF (match_dup 6) (match_dup 4)))
2611 (set (match_operand:V4SF 0 "register_operand" "")
2612 (plus:V4SF (match_dup 5) (match_dup 7)))]
2615 REAL_VALUE_TYPE TWO32r;
2619 real_ldexp (&TWO32r, &dconst1, 32);
2620 x = const_double_from_real_value (TWO32r, SFmode);
2622 operands[3] = force_reg (V4SFmode, CONST0_RTX (V4SFmode));
2623 operands[4] = force_reg (V4SFmode, ix86_build_const_vector (SFmode, 1, x));
2625 for (i = 5; i < 8; i++)
2626 operands[i] = gen_reg_rtx (V4SFmode);
2629 (define_insn "avx_cvtps2dq<avxmodesuffix>"
2630 [(set (match_operand:AVXMODEDCVTPS2DQ 0 "register_operand" "=x")
2631 (unspec:AVXMODEDCVTPS2DQ
2632 [(match_operand:<avxcvtvecmode> 1 "nonimmediate_operand" "xm")]
2633 UNSPEC_FIX_NOTRUNC))]
2635 "vcvtps2dq\t{%1, %0|%0, %1}"
2636 [(set_attr "type" "ssecvt")
2637 (set_attr "prefix" "vex")
2638 (set_attr "mode" "<avxvecmode>")])
2640 (define_insn "sse2_cvtps2dq"
2641 [(set (match_operand:V4SI 0 "register_operand" "=x")
2642 (unspec:V4SI [(match_operand:V4SF 1 "nonimmediate_operand" "xm")]
2643 UNSPEC_FIX_NOTRUNC))]
2645 "cvtps2dq\t{%1, %0|%0, %1}"
2646 [(set_attr "type" "ssecvt")
2647 (set_attr "prefix_data16" "1")
2648 (set_attr "mode" "TI")])
2650 (define_insn "avx_cvttps2dq<avxmodesuffix>"
2651 [(set (match_operand:AVXMODEDCVTPS2DQ 0 "register_operand" "=x")
2652 (fix:AVXMODEDCVTPS2DQ
2653 (match_operand:<avxcvtvecmode> 1 "nonimmediate_operand" "xm")))]
2655 "vcvttps2dq\t{%1, %0|%0, %1}"
2656 [(set_attr "type" "ssecvt")
2657 (set_attr "prefix" "vex")
2658 (set_attr "mode" "<avxvecmode>")])
2660 (define_insn "sse2_cvttps2dq"
2661 [(set (match_operand:V4SI 0 "register_operand" "=x")
2662 (fix:V4SI (match_operand:V4SF 1 "nonimmediate_operand" "xm")))]
2664 "cvttps2dq\t{%1, %0|%0, %1}"
2665 [(set_attr "type" "ssecvt")
2666 (set_attr "prefix_rep" "1")
2667 (set_attr "prefix_data16" "0")
2668 (set_attr "mode" "TI")])
2670 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2672 ;; Parallel double-precision floating point conversion operations
2674 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2676 (define_insn "sse2_cvtpi2pd"
2677 [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2678 (float:V2DF (match_operand:V2SI 1 "nonimmediate_operand" "y,m")))]
2680 "cvtpi2pd\t{%1, %0|%0, %1}"
2681 [(set_attr "type" "ssecvt")
2682 (set_attr "unit" "mmx,*")
2683 (set_attr "prefix_data16" "1,*")
2684 (set_attr "mode" "V2DF")])
2686 (define_insn "sse2_cvtpd2pi"
2687 [(set (match_operand:V2SI 0 "register_operand" "=y")
2688 (unspec:V2SI [(match_operand:V2DF 1 "nonimmediate_operand" "xm")]
2689 UNSPEC_FIX_NOTRUNC))]
2691 "cvtpd2pi\t{%1, %0|%0, %1}"
2692 [(set_attr "type" "ssecvt")
2693 (set_attr "unit" "mmx")
2694 (set_attr "prefix_data16" "1")
2695 (set_attr "mode" "DI")])
2697 (define_insn "sse2_cvttpd2pi"
2698 [(set (match_operand:V2SI 0 "register_operand" "=y")
2699 (fix:V2SI (match_operand:V2DF 1 "nonimmediate_operand" "xm")))]
2701 "cvttpd2pi\t{%1, %0|%0, %1}"
2702 [(set_attr "type" "ssecvt")
2703 (set_attr "unit" "mmx")
2704 (set_attr "prefix_data16" "1")
2705 (set_attr "mode" "TI")])
2707 (define_insn "*avx_cvtsi2sd"
2708 [(set (match_operand:V2DF 0 "register_operand" "=x")
2711 (float:DF (match_operand:SI 2 "nonimmediate_operand" "rm")))
2712 (match_operand:V2DF 1 "register_operand" "x")
2715 "vcvtsi2sd\t{%2, %1, %0|%0, %1, %2}"
2716 [(set_attr "type" "sseicvt")
2717 (set_attr "prefix" "vex")
2718 (set_attr "mode" "DF")])
2720 (define_insn "sse2_cvtsi2sd"
2721 [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2724 (float:DF (match_operand:SI 2 "nonimmediate_operand" "r,m")))
2725 (match_operand:V2DF 1 "register_operand" "0,0")
2728 "cvtsi2sd\t{%2, %0|%0, %2}"
2729 [(set_attr "type" "sseicvt")
2730 (set_attr "mode" "DF")
2731 (set_attr "athlon_decode" "double,direct")
2732 (set_attr "amdfam10_decode" "vector,double")])
2734 (define_insn "*avx_cvtsi2sdq"
2735 [(set (match_operand:V2DF 0 "register_operand" "=x")
2738 (float:DF (match_operand:DI 2 "nonimmediate_operand" "rm")))
2739 (match_operand:V2DF 1 "register_operand" "x")
2741 "TARGET_AVX && TARGET_64BIT"
2742 "vcvtsi2sdq\t{%2, %1, %0|%0, %1, %2}"
2743 [(set_attr "type" "sseicvt")
2744 (set_attr "length_vex" "4")
2745 (set_attr "prefix" "vex")
2746 (set_attr "mode" "DF")])
2748 (define_insn "sse2_cvtsi2sdq"
2749 [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2752 (float:DF (match_operand:DI 2 "nonimmediate_operand" "r,m")))
2753 (match_operand:V2DF 1 "register_operand" "0,0")
2755 "TARGET_SSE2 && TARGET_64BIT"
2756 "cvtsi2sdq\t{%2, %0|%0, %2}"
2757 [(set_attr "type" "sseicvt")
2758 (set_attr "prefix_rex" "1")
2759 (set_attr "mode" "DF")
2760 (set_attr "athlon_decode" "double,direct")
2761 (set_attr "amdfam10_decode" "vector,double")])
2763 (define_insn "sse2_cvtsd2si"
2764 [(set (match_operand:SI 0 "register_operand" "=r,r")
2767 (match_operand:V2DF 1 "nonimmediate_operand" "x,m")
2768 (parallel [(const_int 0)]))]
2769 UNSPEC_FIX_NOTRUNC))]
2771 "%vcvtsd2si\t{%1, %0|%0, %1}"
2772 [(set_attr "type" "sseicvt")
2773 (set_attr "athlon_decode" "double,vector")
2774 (set_attr "prefix_rep" "1")
2775 (set_attr "prefix" "maybe_vex")
2776 (set_attr "mode" "SI")])
2778 (define_insn "sse2_cvtsd2si_2"
2779 [(set (match_operand:SI 0 "register_operand" "=r,r")
2780 (unspec:SI [(match_operand:DF 1 "nonimmediate_operand" "x,m")]
2781 UNSPEC_FIX_NOTRUNC))]
2783 "%vcvtsd2si\t{%1, %0|%0, %1}"
2784 [(set_attr "type" "sseicvt")
2785 (set_attr "athlon_decode" "double,vector")
2786 (set_attr "amdfam10_decode" "double,double")
2787 (set_attr "prefix_rep" "1")
2788 (set_attr "prefix" "maybe_vex")
2789 (set_attr "mode" "SI")])
2791 (define_insn "sse2_cvtsd2siq"
2792 [(set (match_operand:DI 0 "register_operand" "=r,r")
2795 (match_operand:V2DF 1 "nonimmediate_operand" "x,m")
2796 (parallel [(const_int 0)]))]
2797 UNSPEC_FIX_NOTRUNC))]
2798 "TARGET_SSE2 && TARGET_64BIT"
2799 "%vcvtsd2siq\t{%1, %0|%0, %1}"
2800 [(set_attr "type" "sseicvt")
2801 (set_attr "athlon_decode" "double,vector")
2802 (set_attr "prefix_rep" "1")
2803 (set_attr "prefix" "maybe_vex")
2804 (set_attr "mode" "DI")])
2806 (define_insn "sse2_cvtsd2siq_2"
2807 [(set (match_operand:DI 0 "register_operand" "=r,r")
2808 (unspec:DI [(match_operand:DF 1 "nonimmediate_operand" "x,m")]
2809 UNSPEC_FIX_NOTRUNC))]
2810 "TARGET_SSE2 && TARGET_64BIT"
2811 "%vcvtsd2siq\t{%1, %0|%0, %1}"
2812 [(set_attr "type" "sseicvt")
2813 (set_attr "athlon_decode" "double,vector")
2814 (set_attr "amdfam10_decode" "double,double")
2815 (set_attr "prefix_rep" "1")
2816 (set_attr "prefix" "maybe_vex")
2817 (set_attr "mode" "DI")])
2819 (define_insn "sse2_cvttsd2si"
2820 [(set (match_operand:SI 0 "register_operand" "=r,r")
2823 (match_operand:V2DF 1 "nonimmediate_operand" "x,m")
2824 (parallel [(const_int 0)]))))]
2826 "%vcvttsd2si\t{%1, %0|%0, %1}"
2827 [(set_attr "type" "sseicvt")
2828 (set_attr "prefix_rep" "1")
2829 (set_attr "prefix" "maybe_vex")
2830 (set_attr "mode" "SI")
2831 (set_attr "athlon_decode" "double,vector")
2832 (set_attr "amdfam10_decode" "double,double")])
2834 (define_insn "sse2_cvttsd2siq"
2835 [(set (match_operand:DI 0 "register_operand" "=r,r")
2838 (match_operand:V2DF 1 "nonimmediate_operand" "x,m")
2839 (parallel [(const_int 0)]))))]
2840 "TARGET_SSE2 && TARGET_64BIT"
2841 "%vcvttsd2siq\t{%1, %0|%0, %1}"
2842 [(set_attr "type" "sseicvt")
2843 (set_attr "prefix_rep" "1")
2844 (set_attr "prefix" "maybe_vex")
2845 (set_attr "mode" "DI")
2846 (set_attr "athlon_decode" "double,vector")
2847 (set_attr "amdfam10_decode" "double,double")])
2849 (define_insn "avx_cvtdq2pd256"
2850 [(set (match_operand:V4DF 0 "register_operand" "=x")
2851 (float:V4DF (match_operand:V4SI 1 "nonimmediate_operand" "xm")))]
2853 "vcvtdq2pd\t{%1, %0|%0, %1}"
2854 [(set_attr "type" "ssecvt")
2855 (set_attr "prefix" "vex")
2856 (set_attr "mode" "V4DF")])
2858 (define_insn "sse2_cvtdq2pd"
2859 [(set (match_operand:V2DF 0 "register_operand" "=x")
2862 (match_operand:V4SI 1 "nonimmediate_operand" "xm")
2863 (parallel [(const_int 0) (const_int 1)]))))]
2865 "%vcvtdq2pd\t{%1, %0|%0, %1}"
2866 [(set_attr "type" "ssecvt")
2867 (set_attr "prefix" "maybe_vex")
2868 (set_attr "mode" "V2DF")])
2870 (define_insn "avx_cvtpd2dq256"
2871 [(set (match_operand:V4SI 0 "register_operand" "=x")
2872 (unspec:V4SI [(match_operand:V4DF 1 "nonimmediate_operand" "xm")]
2873 UNSPEC_FIX_NOTRUNC))]
2875 "vcvtpd2dq{y}\t{%1, %0|%0, %1}"
2876 [(set_attr "type" "ssecvt")
2877 (set_attr "prefix" "vex")
2878 (set_attr "mode" "OI")])
2880 (define_expand "sse2_cvtpd2dq"
2881 [(set (match_operand:V4SI 0 "register_operand" "")
2883 (unspec:V2SI [(match_operand:V2DF 1 "nonimmediate_operand" "")]
2887 "operands[2] = CONST0_RTX (V2SImode);")
2889 (define_insn "*sse2_cvtpd2dq"
2890 [(set (match_operand:V4SI 0 "register_operand" "=x")
2892 (unspec:V2SI [(match_operand:V2DF 1 "nonimmediate_operand" "xm")]
2894 (match_operand:V2SI 2 "const0_operand" "")))]
2896 "* return TARGET_AVX ? \"vcvtpd2dq{x}\t{%1, %0|%0, %1}\"
2897 : \"cvtpd2dq\t{%1, %0|%0, %1}\";"
2898 [(set_attr "type" "ssecvt")
2899 (set_attr "prefix_rep" "1")
2900 (set_attr "prefix_data16" "0")
2901 (set_attr "prefix" "maybe_vex")
2902 (set_attr "mode" "TI")
2903 (set_attr "amdfam10_decode" "double")])
2905 (define_insn "avx_cvttpd2dq256"
2906 [(set (match_operand:V4SI 0 "register_operand" "=x")
2907 (fix:V4SI (match_operand:V4DF 1 "nonimmediate_operand" "xm")))]
2909 "vcvttpd2dq{y}\t{%1, %0|%0, %1}"
2910 [(set_attr "type" "ssecvt")
2911 (set_attr "prefix" "vex")
2912 (set_attr "mode" "OI")])
2914 (define_expand "sse2_cvttpd2dq"
2915 [(set (match_operand:V4SI 0 "register_operand" "")
2917 (fix:V2SI (match_operand:V2DF 1 "nonimmediate_operand" ""))
2920 "operands[2] = CONST0_RTX (V2SImode);")
2922 (define_insn "*sse2_cvttpd2dq"
2923 [(set (match_operand:V4SI 0 "register_operand" "=x")
2925 (fix:V2SI (match_operand:V2DF 1 "nonimmediate_operand" "xm"))
2926 (match_operand:V2SI 2 "const0_operand" "")))]
2928 "* return TARGET_AVX ? \"vcvttpd2dq{x}\t{%1, %0|%0, %1}\"
2929 : \"cvttpd2dq\t{%1, %0|%0, %1}\";"
2930 [(set_attr "type" "ssecvt")
2931 (set_attr "prefix" "maybe_vex")
2932 (set_attr "mode" "TI")
2933 (set_attr "amdfam10_decode" "double")])
2935 (define_insn "*avx_cvtsd2ss"
2936 [(set (match_operand:V4SF 0 "register_operand" "=x")
2939 (float_truncate:V2SF
2940 (match_operand:V2DF 2 "nonimmediate_operand" "xm")))
2941 (match_operand:V4SF 1 "register_operand" "x")
2944 "vcvtsd2ss\t{%2, %1, %0|%0, %1, %2}"
2945 [(set_attr "type" "ssecvt")
2946 (set_attr "prefix" "vex")
2947 (set_attr "mode" "SF")])
2949 (define_insn "sse2_cvtsd2ss"
2950 [(set (match_operand:V4SF 0 "register_operand" "=x,x")
2953 (float_truncate:V2SF
2954 (match_operand:V2DF 2 "nonimmediate_operand" "x,m")))
2955 (match_operand:V4SF 1 "register_operand" "0,0")
2958 "cvtsd2ss\t{%2, %0|%0, %2}"
2959 [(set_attr "type" "ssecvt")
2960 (set_attr "athlon_decode" "vector,double")
2961 (set_attr "amdfam10_decode" "vector,double")
2962 (set_attr "mode" "SF")])
2964 (define_insn "*avx_cvtss2sd"
2965 [(set (match_operand:V2DF 0 "register_operand" "=x")
2969 (match_operand:V4SF 2 "nonimmediate_operand" "xm")
2970 (parallel [(const_int 0) (const_int 1)])))
2971 (match_operand:V2DF 1 "register_operand" "x")
2974 "vcvtss2sd\t{%2, %1, %0|%0, %1, %2}"
2975 [(set_attr "type" "ssecvt")
2976 (set_attr "prefix" "vex")
2977 (set_attr "mode" "DF")])
2979 (define_insn "sse2_cvtss2sd"
2980 [(set (match_operand:V2DF 0 "register_operand" "=x,x")
2984 (match_operand:V4SF 2 "nonimmediate_operand" "x,m")
2985 (parallel [(const_int 0) (const_int 1)])))
2986 (match_operand:V2DF 1 "register_operand" "0,0")
2989 "cvtss2sd\t{%2, %0|%0, %2}"
2990 [(set_attr "type" "ssecvt")
2991 (set_attr "amdfam10_decode" "vector,double")
2992 (set_attr "mode" "DF")])
2994 (define_insn "avx_cvtpd2ps256"
2995 [(set (match_operand:V4SF 0 "register_operand" "=x")
2996 (float_truncate:V4SF
2997 (match_operand:V4DF 1 "nonimmediate_operand" "xm")))]
2999 "vcvtpd2ps{y}\t{%1, %0|%0, %1}"
3000 [(set_attr "type" "ssecvt")
3001 (set_attr "prefix" "vex")
3002 (set_attr "mode" "V4SF")])
3004 (define_expand "sse2_cvtpd2ps"
3005 [(set (match_operand:V4SF 0 "register_operand" "")
3007 (float_truncate:V2SF
3008 (match_operand:V2DF 1 "nonimmediate_operand" ""))
3011 "operands[2] = CONST0_RTX (V2SFmode);")
3013 (define_insn "*sse2_cvtpd2ps"
3014 [(set (match_operand:V4SF 0 "register_operand" "=x")
3016 (float_truncate:V2SF
3017 (match_operand:V2DF 1 "nonimmediate_operand" "xm"))
3018 (match_operand:V2SF 2 "const0_operand" "")))]
3020 "* return TARGET_AVX ? \"vcvtpd2ps{x}\t{%1, %0|%0, %1}\"
3021 : \"cvtpd2ps\t{%1, %0|%0, %1}\";"
3022 [(set_attr "type" "ssecvt")
3023 (set_attr "prefix_data16" "1")
3024 (set_attr "prefix" "maybe_vex")
3025 (set_attr "mode" "V4SF")
3026 (set_attr "amdfam10_decode" "double")])
3028 (define_insn "avx_cvtps2pd256"
3029 [(set (match_operand:V4DF 0 "register_operand" "=x")
3031 (match_operand:V4SF 1 "nonimmediate_operand" "xm")))]
3033 "vcvtps2pd\t{%1, %0|%0, %1}"
3034 [(set_attr "type" "ssecvt")
3035 (set_attr "prefix" "vex")
3036 (set_attr "mode" "V4DF")])
3038 (define_insn "sse2_cvtps2pd"
3039 [(set (match_operand:V2DF 0 "register_operand" "=x")
3042 (match_operand:V4SF 1 "nonimmediate_operand" "xm")
3043 (parallel [(const_int 0) (const_int 1)]))))]
3045 "%vcvtps2pd\t{%1, %0|%0, %1}"
3046 [(set_attr "type" "ssecvt")
3047 (set_attr "prefix" "maybe_vex")
3048 (set_attr "mode" "V2DF")
3049 (set_attr "prefix_data16" "0")
3050 (set_attr "amdfam10_decode" "direct")])
3052 (define_expand "vec_unpacks_hi_v4sf"
3057 (match_operand:V4SF 1 "nonimmediate_operand" ""))
3058 (parallel [(const_int 6)
3062 (set (match_operand:V2DF 0 "register_operand" "")
3066 (parallel [(const_int 0) (const_int 1)]))))]
3069 operands[2] = gen_reg_rtx (V4SFmode);
3072 (define_expand "vec_unpacks_lo_v4sf"
3073 [(set (match_operand:V2DF 0 "register_operand" "")
3076 (match_operand:V4SF 1 "nonimmediate_operand" "")
3077 (parallel [(const_int 0) (const_int 1)]))))]
3080 (define_expand "vec_unpacks_float_hi_v8hi"
3081 [(match_operand:V4SF 0 "register_operand" "")
3082 (match_operand:V8HI 1 "register_operand" "")]
3085 rtx tmp = gen_reg_rtx (V4SImode);
3087 emit_insn (gen_vec_unpacks_hi_v8hi (tmp, operands[1]));
3088 emit_insn (gen_sse2_cvtdq2ps (operands[0], tmp));
3092 (define_expand "vec_unpacks_float_lo_v8hi"
3093 [(match_operand:V4SF 0 "register_operand" "")
3094 (match_operand:V8HI 1 "register_operand" "")]
3097 rtx tmp = gen_reg_rtx (V4SImode);
3099 emit_insn (gen_vec_unpacks_lo_v8hi (tmp, operands[1]));
3100 emit_insn (gen_sse2_cvtdq2ps (operands[0], tmp));
3104 (define_expand "vec_unpacku_float_hi_v8hi"
3105 [(match_operand:V4SF 0 "register_operand" "")
3106 (match_operand:V8HI 1 "register_operand" "")]
3109 rtx tmp = gen_reg_rtx (V4SImode);
3111 emit_insn (gen_vec_unpacku_hi_v8hi (tmp, operands[1]));
3112 emit_insn (gen_sse2_cvtdq2ps (operands[0], tmp));
3116 (define_expand "vec_unpacku_float_lo_v8hi"
3117 [(match_operand:V4SF 0 "register_operand" "")
3118 (match_operand:V8HI 1 "register_operand" "")]
3121 rtx tmp = gen_reg_rtx (V4SImode);
3123 emit_insn (gen_vec_unpacku_lo_v8hi (tmp, operands[1]));
3124 emit_insn (gen_sse2_cvtdq2ps (operands[0], tmp));
3128 (define_expand "vec_unpacks_float_hi_v4si"
3131 (match_operand:V4SI 1 "nonimmediate_operand" "")
3132 (parallel [(const_int 2)
3136 (set (match_operand:V2DF 0 "register_operand" "")
3140 (parallel [(const_int 0) (const_int 1)]))))]
3142 "operands[2] = gen_reg_rtx (V4SImode);")
3144 (define_expand "vec_unpacks_float_lo_v4si"
3145 [(set (match_operand:V2DF 0 "register_operand" "")
3148 (match_operand:V4SI 1 "nonimmediate_operand" "")
3149 (parallel [(const_int 0) (const_int 1)]))))]
3152 (define_expand "vec_unpacku_float_hi_v4si"
3155 (match_operand:V4SI 1 "nonimmediate_operand" "")
3156 (parallel [(const_int 2)
3164 (parallel [(const_int 0) (const_int 1)]))))
3166 (lt:V2DF (match_dup 6) (match_dup 3)))
3168 (and:V2DF (match_dup 7) (match_dup 4)))
3169 (set (match_operand:V2DF 0 "register_operand" "")
3170 (plus:V2DF (match_dup 6) (match_dup 8)))]
3173 REAL_VALUE_TYPE TWO32r;
3177 real_ldexp (&TWO32r, &dconst1, 32);
3178 x = const_double_from_real_value (TWO32r, DFmode);
3180 operands[3] = force_reg (V2DFmode, CONST0_RTX (V2DFmode));
3181 operands[4] = force_reg (V2DFmode, ix86_build_const_vector (DFmode, 1, x));
3183 operands[5] = gen_reg_rtx (V4SImode);
3185 for (i = 6; i < 9; i++)
3186 operands[i] = gen_reg_rtx (V2DFmode);
3189 (define_expand "vec_unpacku_float_lo_v4si"
3193 (match_operand:V4SI 1 "nonimmediate_operand" "")
3194 (parallel [(const_int 0) (const_int 1)]))))
3196 (lt:V2DF (match_dup 5) (match_dup 3)))
3198 (and:V2DF (match_dup 6) (match_dup 4)))
3199 (set (match_operand:V2DF 0 "register_operand" "")
3200 (plus:V2DF (match_dup 5) (match_dup 7)))]
3203 REAL_VALUE_TYPE TWO32r;
3207 real_ldexp (&TWO32r, &dconst1, 32);
3208 x = const_double_from_real_value (TWO32r, DFmode);
3210 operands[3] = force_reg (V2DFmode, CONST0_RTX (V2DFmode));
3211 operands[4] = force_reg (V2DFmode, ix86_build_const_vector (DFmode, 1, x));
3213 for (i = 5; i < 8; i++)
3214 operands[i] = gen_reg_rtx (V2DFmode);
3217 (define_expand "vec_pack_trunc_v2df"
3218 [(match_operand:V4SF 0 "register_operand" "")
3219 (match_operand:V2DF 1 "nonimmediate_operand" "")
3220 (match_operand:V2DF 2 "nonimmediate_operand" "")]
3225 r1 = gen_reg_rtx (V4SFmode);
3226 r2 = gen_reg_rtx (V4SFmode);
3228 emit_insn (gen_sse2_cvtpd2ps (r1, operands[1]));
3229 emit_insn (gen_sse2_cvtpd2ps (r2, operands[2]));
3230 emit_insn (gen_sse_movlhps (operands[0], r1, r2));
3234 (define_expand "vec_pack_sfix_trunc_v2df"
3235 [(match_operand:V4SI 0 "register_operand" "")
3236 (match_operand:V2DF 1 "nonimmediate_operand" "")
3237 (match_operand:V2DF 2 "nonimmediate_operand" "")]
3242 r1 = gen_reg_rtx (V4SImode);
3243 r2 = gen_reg_rtx (V4SImode);
3245 emit_insn (gen_sse2_cvttpd2dq (r1, operands[1]));
3246 emit_insn (gen_sse2_cvttpd2dq (r2, operands[2]));
3247 emit_insn (gen_vec_interleave_lowv2di (gen_lowpart (V2DImode, operands[0]),
3248 gen_lowpart (V2DImode, r1),
3249 gen_lowpart (V2DImode, r2)));
3253 (define_expand "vec_pack_sfix_v2df"
3254 [(match_operand:V4SI 0 "register_operand" "")
3255 (match_operand:V2DF 1 "nonimmediate_operand" "")
3256 (match_operand:V2DF 2 "nonimmediate_operand" "")]
3261 r1 = gen_reg_rtx (V4SImode);
3262 r2 = gen_reg_rtx (V4SImode);
3264 emit_insn (gen_sse2_cvtpd2dq (r1, operands[1]));
3265 emit_insn (gen_sse2_cvtpd2dq (r2, operands[2]));
3266 emit_insn (gen_vec_interleave_lowv2di (gen_lowpart (V2DImode, operands[0]),
3267 gen_lowpart (V2DImode, r1),
3268 gen_lowpart (V2DImode, r2)));
3272 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3274 ;; Parallel single-precision floating point element swizzling
3276 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3278 (define_expand "sse_movhlps_exp"
3279 [(set (match_operand:V4SF 0 "nonimmediate_operand" "")
3282 (match_operand:V4SF 1 "nonimmediate_operand" "")
3283 (match_operand:V4SF 2 "nonimmediate_operand" ""))
3284 (parallel [(const_int 6)
3289 "ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);")
3291 (define_insn "*avx_movhlps"
3292 [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,m")
3295 (match_operand:V4SF 1 "nonimmediate_operand" " x,x,0")
3296 (match_operand:V4SF 2 "nonimmediate_operand" " x,o,x"))
3297 (parallel [(const_int 6)
3301 "TARGET_AVX && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
3303 vmovhlps\t{%2, %1, %0|%0, %1, %2}
3304 vmovlps\t{%H2, %1, %0|%0, %1, %H2}
3305 vmovhps\t{%2, %0|%0, %2}"
3306 [(set_attr "type" "ssemov")
3307 (set_attr "prefix" "vex")
3308 (set_attr "mode" "V4SF,V2SF,V2SF")])
3310 (define_insn "sse_movhlps"
3311 [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,m")
3314 (match_operand:V4SF 1 "nonimmediate_operand" " 0,0,0")
3315 (match_operand:V4SF 2 "nonimmediate_operand" " x,o,x"))
3316 (parallel [(const_int 6)
3320 "TARGET_SSE && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
3322 movhlps\t{%2, %0|%0, %2}
3323 movlps\t{%H2, %0|%0, %H2}
3324 movhps\t{%2, %0|%0, %2}"
3325 [(set_attr "type" "ssemov")
3326 (set_attr "mode" "V4SF,V2SF,V2SF")])
3328 (define_expand "sse_movlhps_exp"
3329 [(set (match_operand:V4SF 0 "nonimmediate_operand" "")
3332 (match_operand:V4SF 1 "nonimmediate_operand" "")
3333 (match_operand:V4SF 2 "nonimmediate_operand" ""))
3334 (parallel [(const_int 0)
3339 "ix86_fixup_binary_operands (UNKNOWN, V4SFmode, operands);")
3341 (define_insn "*avx_movlhps"
3342 [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,o")
3345 (match_operand:V4SF 1 "nonimmediate_operand" " x,x,0")
3346 (match_operand:V4SF 2 "nonimmediate_operand" " x,m,x"))
3347 (parallel [(const_int 0)
3351 "TARGET_AVX && ix86_binary_operator_ok (UNKNOWN, V4SFmode, operands)"
3353 vmovlhps\t{%2, %1, %0|%0, %1, %2}
3354 vmovhps\t{%2, %1, %0|%0, %1, %2}
3355 vmovlps\t{%2, %H0|%H0, %2}"
3356 [(set_attr "type" "ssemov")
3357 (set_attr "prefix" "vex")
3358 (set_attr "mode" "V4SF,V2SF,V2SF")])
3360 (define_insn "sse_movlhps"
3361 [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,o")
3364 (match_operand:V4SF 1 "nonimmediate_operand" " 0,0,0")
3365 (match_operand:V4SF 2 "nonimmediate_operand" " x,m,x"))
3366 (parallel [(const_int 0)
3370 "TARGET_SSE && ix86_binary_operator_ok (UNKNOWN, V4SFmode, operands)"
3372 movlhps\t{%2, %0|%0, %2}
3373 movhps\t{%2, %0|%0, %2}
3374 movlps\t{%2, %H0|%H0, %2}"
3375 [(set_attr "type" "ssemov")
3376 (set_attr "mode" "V4SF,V2SF,V2SF")])
3378 ;; Recall that the 256-bit unpck insns only shuffle within their lanes.
3379 (define_insn "avx_unpckhps256"
3380 [(set (match_operand:V8SF 0 "register_operand" "=x")
3383 (match_operand:V8SF 1 "register_operand" "x")
3384 (match_operand:V8SF&nb