1 ;; GCC machine description for IA-32 and x86-64.
2 ;; Copyright (C) 1988, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 ;; 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4 ;; Free Software Foundation, Inc.
5 ;; Mostly by William Schelter.
6 ;; x86_64 support added by Jan Hubicka
8 ;; This file is part of GCC.
10 ;; GCC is free software; you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 3, or (at your option)
15 ;; GCC is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;; GNU General Public License for more details.
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GCC; see the file COPYING3. If not see
22 ;; <http://www.gnu.org/licenses/>. */
24 ;; The original PO technology requires these to be ordered by speed,
25 ;; so that assigner will pick the fastest.
27 ;; See file "rtl.def" for documentation on define_insn, match_*, et. al.
29 ;; The special asm out single letter directives following a '%' are:
30 ;; L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
31 ;; C -- print opcode suffix for set/cmov insn.
32 ;; c -- like C, but print reversed condition
33 ;; F,f -- likewise, but for floating-point.
34 ;; O -- if HAVE_AS_IX86_CMOV_SUN_SYNTAX, expand to "w.", "l." or "q.",
36 ;; R -- print the prefix for register names.
37 ;; z -- print the opcode suffix for the size of the current operand.
38 ;; Z -- likewise, with special suffixes for x87 instructions.
39 ;; * -- print a star (in certain assembler syntax)
40 ;; A -- print an absolute memory reference.
41 ;; w -- print the operand as if it's a "word" (HImode) even if it isn't.
42 ;; s -- print a shift double count, followed by the assemblers argument
44 ;; b -- print the QImode name of the register for the indicated operand.
45 ;; %b0 would print %al if operands[0] is reg 0.
46 ;; w -- likewise, print the HImode name of the register.
47 ;; k -- likewise, print the SImode name of the register.
48 ;; q -- likewise, print the DImode name of the register.
49 ;; x -- likewise, print the V4SFmode name of the register.
50 ;; t -- likewise, print the V8SFmode name of the register.
51 ;; h -- print the QImode name for a "high" register, either ah, bh, ch or dh.
52 ;; y -- print "st(0)" instead of "st" as a register.
53 ;; d -- print duplicated register operand for AVX instruction.
54 ;; D -- print condition for SSE cmp instruction.
55 ;; P -- if PIC, print an @PLT suffix.
56 ;; p -- print raw symbol name.
57 ;; X -- don't print any sort of PIC '@' suffix for a symbol.
58 ;; & -- print some in-use local-dynamic symbol name.
59 ;; H -- print a memory address offset by 8; used for sse high-parts
60 ;; Y -- print condition for XOP pcom* instruction.
61 ;; + -- print a branch hint as 'cs' or 'ds' prefix
62 ;; ; -- print a semicolon (after prefixes due to bug in older gas).
63 ;; @ -- print a segment register of thread base pointer load
67 (define_c_enum "unspec" [
68 ;; Relocation specifiers
79 UNSPEC_MACHOPIC_OFFSET
89 UNSPEC_MEMORY_BLOCKAGE
99 ;; Other random patterns
108 UNSPEC_LD_MPIC ; load_macho_picbase
110 UNSPEC_DIV_ALREADY_SPLIT
111 UNSPEC_CALL_NEEDS_VZEROUPPER
114 ;; For SSE/MMX support:
132 UNSPEC_MS_TO_SYSV_CALL
134 ;; Generic math support
136 UNSPEC_IEEE_MIN ; not commutative
137 UNSPEC_IEEE_MAX ; not commutative
139 ;; x87 Floating point
155 UNSPEC_FRNDINT_MASK_PM
159 ;; x87 Double output FP
191 ;; For SSE4.1 support
201 ;; For SSE4.2 support
208 UNSPEC_XOP_UNSIGNED_CMP
219 UNSPEC_AESKEYGENASSIST
221 ;; For PCLMUL support
237 ;; For RDRAND support
241 (define_c_enum "unspecv" [
244 UNSPECV_PROBE_STACK_RANGE
264 UNSPECV_LLWP_INTRINSIC
265 UNSPECV_SLWP_INTRINSIC
266 UNSPECV_LWPVAL_INTRINSIC
267 UNSPECV_LWPINS_INTRINSIC
272 UNSPECV_SPLIT_STACK_RETURN
275 ;; Constants to represent rounding modes in the ROUND instruction
284 ;; Constants to represent pcomtrue/pcomfalse variants
294 ;; Constants used in the XOP pperm instruction
296 [(PPERM_SRC 0x00) /* copy source */
297 (PPERM_INVERT 0x20) /* invert source */
298 (PPERM_REVERSE 0x40) /* bit reverse source */
299 (PPERM_REV_INV 0x60) /* bit reverse & invert src */
300 (PPERM_ZERO 0x80) /* all 0's */
301 (PPERM_ONES 0xa0) /* all 1's */
302 (PPERM_SIGN 0xc0) /* propagate sign bit */
303 (PPERM_INV_SIGN 0xe0) /* invert & propagate sign */
304 (PPERM_SRC1 0x00) /* use first source byte */
305 (PPERM_SRC2 0x10) /* use second source byte */
308 ;; Registers by name.
361 ;; Insns whose names begin with "x86_" are emitted by gen_FOO calls
364 ;; In C guard expressions, put expressions which may be compile-time
365 ;; constants first. This allows for better optimization. For
366 ;; example, write "TARGET_64BIT && reload_completed", not
367 ;; "reload_completed && TARGET_64BIT".
371 (define_attr "cpu" "none,pentium,pentiumpro,geode,k6,athlon,k8,core2,corei7,
372 atom,generic64,amdfam10,bdver1,bdver2,btver1"
373 (const (symbol_ref "ix86_schedule")))
375 ;; A basic instruction type. Refinements due to arguments to be
376 ;; provided in other attributes.
379 alu,alu1,negnot,imov,imovx,lea,
380 incdec,ishift,ishift1,rotate,rotate1,imul,idiv,
381 icmp,test,ibr,setcc,icmov,
382 push,pop,call,callv,leave,
384 fmov,fop,fsgn,fmul,fdiv,fpspc,fcmov,fcmp,fxch,fistp,fisttp,frndint,
385 sselog,sselog1,sseiadd,sseiadd1,sseishft,sseishft1,sseimul,
386 sse,ssemov,sseadd,ssemul,ssecmp,ssecomi,ssecvt,ssecvt1,sseicvt,ssediv,sseins,
387 ssemuladd,sse4arg,lwp,
388 mmx,mmxmov,mmxadd,mmxmul,mmxcmp,mmxcvt,mmxshft"
389 (const_string "other"))
391 ;; Main data type used by the insn
393 "unknown,none,QI,HI,SI,DI,TI,OI,SF,DF,XF,TF,V8SF,V4DF,V4SF,V2DF,V2SF,V1DF"
394 (const_string "unknown"))
396 ;; The CPU unit operations uses.
397 (define_attr "unit" "integer,i387,sse,mmx,unknown"
398 (cond [(eq_attr "type" "fmov,fop,fsgn,fmul,fdiv,fpspc,fcmov,fcmp,fxch,fistp,fisttp,frndint")
399 (const_string "i387")
400 (eq_attr "type" "sselog,sselog1,sseiadd,sseiadd1,sseishft,sseishft1,sseimul,
401 sse,ssemov,sseadd,ssemul,ssecmp,ssecomi,ssecvt,
402 ssecvt1,sseicvt,ssediv,sseins,ssemuladd,sse4arg")
404 (eq_attr "type" "mmx,mmxmov,mmxadd,mmxmul,mmxcmp,mmxcvt,mmxshft")
406 (eq_attr "type" "other")
407 (const_string "unknown")]
408 (const_string "integer")))
410 ;; The (bounding maximum) length of an instruction immediate.
411 (define_attr "length_immediate" ""
412 (cond [(eq_attr "type" "incdec,setcc,icmov,str,lea,other,multi,idiv,leave,
415 (eq_attr "unit" "i387,sse,mmx")
417 (eq_attr "type" "alu,alu1,negnot,imovx,ishift,rotate,ishift1,rotate1,
419 (symbol_ref "ix86_attr_length_immediate_default (insn, true)")
420 (eq_attr "type" "imov,test")
421 (symbol_ref "ix86_attr_length_immediate_default (insn, false)")
422 (eq_attr "type" "call")
423 (if_then_else (match_operand 0 "constant_call_address_operand" "")
426 (eq_attr "type" "callv")
427 (if_then_else (match_operand 1 "constant_call_address_operand" "")
430 ;; We don't know the size before shorten_branches. Expect
431 ;; the instruction to fit for better scheduling.
432 (eq_attr "type" "ibr")
435 (symbol_ref "/* Update immediate_length and other attributes! */
436 gcc_unreachable (),1")))
438 ;; The (bounding maximum) length of an instruction address.
439 (define_attr "length_address" ""
440 (cond [(eq_attr "type" "str,other,multi,fxch")
442 (and (eq_attr "type" "call")
443 (match_operand 0 "constant_call_address_operand" ""))
445 (and (eq_attr "type" "callv")
446 (match_operand 1 "constant_call_address_operand" ""))
449 (symbol_ref "ix86_attr_length_address_default (insn)")))
451 ;; Set when length prefix is used.
452 (define_attr "prefix_data16" ""
453 (cond [(eq_attr "type" "ssemuladd,sse4arg,sseiadd1,ssecvt1")
455 (eq_attr "mode" "HI")
457 (and (eq_attr "unit" "sse") (eq_attr "mode" "V2DF,TI"))
462 ;; Set when string REP prefix is used.
463 (define_attr "prefix_rep" ""
464 (cond [(eq_attr "type" "ssemuladd,sse4arg,sseiadd1,ssecvt1")
466 (and (eq_attr "unit" "sse") (eq_attr "mode" "SF,DF"))
471 ;; Set when 0f opcode prefix is used.
472 (define_attr "prefix_0f" ""
474 (ior (eq_attr "type" "imovx,setcc,icmov,bitmanip")
475 (eq_attr "unit" "sse,mmx"))
479 ;; Set when REX opcode prefix is used.
480 (define_attr "prefix_rex" ""
481 (cond [(eq (symbol_ref "TARGET_64BIT") (const_int 0))
483 (and (eq_attr "mode" "DI")
484 (and (eq_attr "type" "!push,pop,call,callv,leave,ibr")
485 (eq_attr "unit" "!mmx")))
487 (and (eq_attr "mode" "QI")
488 (ne (symbol_ref "x86_extended_QIreg_mentioned_p (insn)")
491 (ne (symbol_ref "x86_extended_reg_mentioned_p (insn)")
494 (and (eq_attr "type" "imovx")
495 (match_operand:QI 1 "ext_QIreg_operand" ""))
500 ;; There are also additional prefixes in 3DNOW, SSSE3.
501 ;; ssemuladd,sse4arg default to 0f24/0f25 and DREX byte,
502 ;; sseiadd1,ssecvt1 to 0f7a with no DREX byte.
503 ;; 3DNOW has 0f0f prefix, SSSE3 and SSE4_{1,2} 0f38/0f3a.
504 (define_attr "prefix_extra" ""
505 (cond [(eq_attr "type" "ssemuladd,sse4arg")
507 (eq_attr "type" "sseiadd1,ssecvt1")
512 ;; Prefix used: original, VEX or maybe VEX.
513 (define_attr "prefix" "orig,vex,maybe_vex"
514 (if_then_else (eq_attr "mode" "OI,V8SF,V4DF")
516 (const_string "orig")))
518 ;; VEX W bit is used.
519 (define_attr "prefix_vex_w" "" (const_int 0))
521 ;; The length of VEX prefix
522 ;; Only instructions with 0f prefix can have 2 byte VEX prefix,
523 ;; 0f38/0f3a prefixes can't. In i386.md 0f3[8a] is
524 ;; still prefix_0f 1, with prefix_extra 1.
525 (define_attr "length_vex" ""
526 (if_then_else (and (eq_attr "prefix_0f" "1")
527 (eq_attr "prefix_extra" "0"))
528 (if_then_else (eq_attr "prefix_vex_w" "1")
529 (symbol_ref "ix86_attr_length_vex_default (insn, true, true)")
530 (symbol_ref "ix86_attr_length_vex_default (insn, true, false)"))
531 (if_then_else (eq_attr "prefix_vex_w" "1")
532 (symbol_ref "ix86_attr_length_vex_default (insn, false, true)")
533 (symbol_ref "ix86_attr_length_vex_default (insn, false, false)"))))
535 ;; Set when modrm byte is used.
536 (define_attr "modrm" ""
537 (cond [(eq_attr "type" "str,leave")
539 (eq_attr "unit" "i387")
541 (and (eq_attr "type" "incdec")
542 (and (eq (symbol_ref "TARGET_64BIT") (const_int 0))
543 (ior (match_operand:SI 1 "register_operand" "")
544 (match_operand:HI 1 "register_operand" ""))))
546 (and (eq_attr "type" "push")
547 (not (match_operand 1 "memory_operand" "")))
549 (and (eq_attr "type" "pop")
550 (not (match_operand 0 "memory_operand" "")))
552 (and (eq_attr "type" "imov")
553 (and (not (eq_attr "mode" "DI"))
554 (ior (and (match_operand 0 "register_operand" "")
555 (match_operand 1 "immediate_operand" ""))
556 (ior (and (match_operand 0 "ax_reg_operand" "")
557 (match_operand 1 "memory_displacement_only_operand" ""))
558 (and (match_operand 0 "memory_displacement_only_operand" "")
559 (match_operand 1 "ax_reg_operand" ""))))))
561 (and (eq_attr "type" "call")
562 (match_operand 0 "constant_call_address_operand" ""))
564 (and (eq_attr "type" "callv")
565 (match_operand 1 "constant_call_address_operand" ""))
567 (and (eq_attr "type" "alu,alu1,icmp,test")
568 (match_operand 0 "ax_reg_operand" ""))
569 (symbol_ref "(get_attr_length_immediate (insn) <= (get_attr_mode (insn) != MODE_QI))")
573 ;; The (bounding maximum) length of an instruction in bytes.
574 ;; ??? fistp and frndint are in fact fldcw/{fistp,frndint}/fldcw sequences.
575 ;; Later we may want to split them and compute proper length as for
577 (define_attr "length" ""
578 (cond [(eq_attr "type" "other,multi,fistp,frndint")
580 (eq_attr "type" "fcmp")
582 (eq_attr "unit" "i387")
584 (plus (attr "prefix_data16")
585 (attr "length_address")))
586 (ior (eq_attr "prefix" "vex")
587 (and (eq_attr "prefix" "maybe_vex")
588 (ne (symbol_ref "TARGET_AVX") (const_int 0))))
589 (plus (attr "length_vex")
590 (plus (attr "length_immediate")
592 (attr "length_address"))))]
593 (plus (plus (attr "modrm")
594 (plus (attr "prefix_0f")
595 (plus (attr "prefix_rex")
596 (plus (attr "prefix_extra")
598 (plus (attr "prefix_rep")
599 (plus (attr "prefix_data16")
600 (plus (attr "length_immediate")
601 (attr "length_address")))))))
603 ;; The `memory' attribute is `none' if no memory is referenced, `load' or
604 ;; `store' if there is a simple memory reference therein, or `unknown'
605 ;; if the instruction is complex.
607 (define_attr "memory" "none,load,store,both,unknown"
608 (cond [(eq_attr "type" "other,multi,str,lwp")
609 (const_string "unknown")
610 (eq_attr "type" "lea,fcmov,fpspc")
611 (const_string "none")
612 (eq_attr "type" "fistp,leave")
613 (const_string "both")
614 (eq_attr "type" "frndint")
615 (const_string "load")
616 (eq_attr "type" "push")
617 (if_then_else (match_operand 1 "memory_operand" "")
618 (const_string "both")
619 (const_string "store"))
620 (eq_attr "type" "pop")
621 (if_then_else (match_operand 0 "memory_operand" "")
622 (const_string "both")
623 (const_string "load"))
624 (eq_attr "type" "setcc")
625 (if_then_else (match_operand 0 "memory_operand" "")
626 (const_string "store")
627 (const_string "none"))
628 (eq_attr "type" "icmp,test,ssecmp,ssecomi,mmxcmp,fcmp")
629 (if_then_else (ior (match_operand 0 "memory_operand" "")
630 (match_operand 1 "memory_operand" ""))
631 (const_string "load")
632 (const_string "none"))
633 (eq_attr "type" "ibr")
634 (if_then_else (match_operand 0 "memory_operand" "")
635 (const_string "load")
636 (const_string "none"))
637 (eq_attr "type" "call")
638 (if_then_else (match_operand 0 "constant_call_address_operand" "")
639 (const_string "none")
640 (const_string "load"))
641 (eq_attr "type" "callv")
642 (if_then_else (match_operand 1 "constant_call_address_operand" "")
643 (const_string "none")
644 (const_string "load"))
645 (and (eq_attr "type" "alu1,negnot,ishift1,sselog1")
646 (match_operand 1 "memory_operand" ""))
647 (const_string "both")
648 (and (match_operand 0 "memory_operand" "")
649 (match_operand 1 "memory_operand" ""))
650 (const_string "both")
651 (match_operand 0 "memory_operand" "")
652 (const_string "store")
653 (match_operand 1 "memory_operand" "")
654 (const_string "load")
656 "!alu1,negnot,ishift1,
657 imov,imovx,icmp,test,bitmanip,
659 sse,ssemov,ssecmp,ssecomi,ssecvt,ssecvt1,sseicvt,sselog1,
660 sseiadd1,mmx,mmxmov,mmxcmp,mmxcvt")
661 (match_operand 2 "memory_operand" ""))
662 (const_string "load")
663 (and (eq_attr "type" "icmov,ssemuladd,sse4arg")
664 (match_operand 3 "memory_operand" ""))
665 (const_string "load")
667 (const_string "none")))
669 ;; Indicates if an instruction has both an immediate and a displacement.
671 (define_attr "imm_disp" "false,true,unknown"
672 (cond [(eq_attr "type" "other,multi")
673 (const_string "unknown")
674 (and (eq_attr "type" "icmp,test,imov,alu1,ishift1,rotate1")
675 (and (match_operand 0 "memory_displacement_operand" "")
676 (match_operand 1 "immediate_operand" "")))
677 (const_string "true")
678 (and (eq_attr "type" "alu,ishift,rotate,imul,idiv")
679 (and (match_operand 0 "memory_displacement_operand" "")
680 (match_operand 2 "immediate_operand" "")))
681 (const_string "true")
683 (const_string "false")))
685 ;; Indicates if an FP operation has an integer source.
687 (define_attr "fp_int_src" "false,true"
688 (const_string "false"))
690 ;; Defines rounding mode of an FP operation.
692 (define_attr "i387_cw" "trunc,floor,ceil,mask_pm,uninitialized,any"
693 (const_string "any"))
695 ;; Define attribute to classify add/sub insns that consumes carry flag (CF)
696 (define_attr "use_carry" "0,1" (const_string "0"))
698 ;; Define attribute to indicate unaligned ssemov insns
699 (define_attr "movu" "0,1" (const_string "0"))
701 ;; Used to control the "enabled" attribute on a per-instruction basis.
702 (define_attr "isa" "base,noavx,avx"
703 (const_string "base"))
705 (define_attr "enabled" ""
706 (cond [(eq_attr "isa" "noavx") (symbol_ref "!TARGET_AVX")
707 (eq_attr "isa" "avx") (symbol_ref "TARGET_AVX")
711 ;; Describe a user's asm statement.
712 (define_asm_attributes
713 [(set_attr "length" "128")
714 (set_attr "type" "multi")])
716 (define_code_iterator plusminus [plus minus])
718 (define_code_iterator sat_plusminus [ss_plus us_plus ss_minus us_minus])
720 ;; Base name for define_insn
721 (define_code_attr plusminus_insn
722 [(plus "add") (ss_plus "ssadd") (us_plus "usadd")
723 (minus "sub") (ss_minus "sssub") (us_minus "ussub")])
725 ;; Base name for insn mnemonic.
726 (define_code_attr plusminus_mnemonic
727 [(plus "add") (ss_plus "adds") (us_plus "addus")
728 (minus "sub") (ss_minus "subs") (us_minus "subus")])
729 (define_code_attr plusminus_carry_mnemonic
730 [(plus "adc") (minus "sbb")])
732 ;; Mark commutative operators as such in constraints.
733 (define_code_attr comm [(plus "%") (ss_plus "%") (us_plus "%")
734 (minus "") (ss_minus "") (us_minus "")])
736 ;; Mapping of signed max and min
737 (define_code_iterator smaxmin [smax smin])
739 ;; Mapping of unsigned max and min
740 (define_code_iterator umaxmin [umax umin])
742 ;; Base name for integer and FP insn mnemonic
743 (define_code_attr maxmin_int [(smax "maxs") (smin "mins")
744 (umax "maxu") (umin "minu")])
745 (define_code_attr maxmin_float [(smax "max") (smin "min")])
747 ;; Mapping of logic operators
748 (define_code_iterator any_logic [and ior xor])
749 (define_code_iterator any_or [ior xor])
751 ;; Base name for insn mnemonic.
752 (define_code_attr logic [(and "and") (ior "or") (xor "xor")])
754 ;; Mapping of shift-right operators
755 (define_code_iterator any_shiftrt [lshiftrt ashiftrt])
757 ;; Base name for define_insn
758 (define_code_attr shiftrt_insn [(lshiftrt "lshr") (ashiftrt "ashr")])
760 ;; Base name for insn mnemonic.
761 (define_code_attr shiftrt [(lshiftrt "shr") (ashiftrt "sar")])
763 ;; Mapping of rotate operators
764 (define_code_iterator any_rotate [rotate rotatert])
766 ;; Base name for define_insn
767 (define_code_attr rotate_insn [(rotate "rotl") (rotatert "rotr")])
769 ;; Base name for insn mnemonic.
770 (define_code_attr rotate [(rotate "rol") (rotatert "ror")])
772 ;; Mapping of abs neg operators
773 (define_code_iterator absneg [abs neg])
775 ;; Base name for x87 insn mnemonic.
776 (define_code_attr absneg_mnemonic [(abs "abs") (neg "chs")])
778 ;; Used in signed and unsigned widening multiplications.
779 (define_code_iterator any_extend [sign_extend zero_extend])
781 ;; Various insn prefixes for signed and unsigned operations.
782 (define_code_attr u [(sign_extend "") (zero_extend "u")
783 (div "") (udiv "u")])
784 (define_code_attr s [(sign_extend "s") (zero_extend "u")])
786 ;; Used in signed and unsigned divisions.
787 (define_code_iterator any_div [div udiv])
789 ;; Instruction prefix for signed and unsigned operations.
790 (define_code_attr sgnprefix [(sign_extend "i") (zero_extend "")
791 (div "i") (udiv "")])
793 ;; All integer modes.
794 (define_mode_iterator SWI1248x [QI HI SI DI])
796 ;; All integer modes without QImode.
797 (define_mode_iterator SWI248x [HI SI DI])
799 ;; All integer modes without QImode and HImode.
800 (define_mode_iterator SWI48x [SI DI])
802 ;; All integer modes without SImode and DImode.
803 (define_mode_iterator SWI12 [QI HI])
805 ;; All integer modes without DImode.
806 (define_mode_iterator SWI124 [QI HI SI])
808 ;; All integer modes without QImode and DImode.
809 (define_mode_iterator SWI24 [HI SI])
811 ;; Single word integer modes.
812 (define_mode_iterator SWI [QI HI SI (DI "TARGET_64BIT")])
814 ;; Single word integer modes without QImode.
815 (define_mode_iterator SWI248 [HI SI (DI "TARGET_64BIT")])
817 ;; Single word integer modes without QImode and HImode.
818 (define_mode_iterator SWI48 [SI (DI "TARGET_64BIT")])
820 ;; All math-dependant single and double word integer modes.
821 (define_mode_iterator SDWIM [(QI "TARGET_QIMODE_MATH")
822 (HI "TARGET_HIMODE_MATH")
823 SI DI (TI "TARGET_64BIT")])
825 ;; Math-dependant single word integer modes.
826 (define_mode_iterator SWIM [(QI "TARGET_QIMODE_MATH")
827 (HI "TARGET_HIMODE_MATH")
828 SI (DI "TARGET_64BIT")])
830 ;; Math-dependant integer modes without DImode.
831 (define_mode_iterator SWIM124 [(QI "TARGET_QIMODE_MATH")
832 (HI "TARGET_HIMODE_MATH")
835 ;; Math-dependant single word integer modes without QImode.
836 (define_mode_iterator SWIM248 [(HI "TARGET_HIMODE_MATH")
837 SI (DI "TARGET_64BIT")])
839 ;; Double word integer modes.
840 (define_mode_iterator DWI [(DI "!TARGET_64BIT")
841 (TI "TARGET_64BIT")])
843 ;; Double word integer modes as mode attribute.
844 (define_mode_attr DWI [(SI "DI") (DI "TI")])
845 (define_mode_attr dwi [(SI "di") (DI "ti")])
847 ;; Half mode for double word integer modes.
848 (define_mode_iterator DWIH [(SI "!TARGET_64BIT")
849 (DI "TARGET_64BIT")])
851 ;; Instruction suffix for integer modes.
852 (define_mode_attr imodesuffix [(QI "b") (HI "w") (SI "l") (DI "q")])
854 ;; Pointer size prefix for integer modes (Intel asm dialect)
855 (define_mode_attr iptrsize [(QI "BYTE")
860 ;; Register class for integer modes.
861 (define_mode_attr r [(QI "q") (HI "r") (SI "r") (DI "r")])
863 ;; Immediate operand constraint for integer modes.
864 (define_mode_attr i [(QI "n") (HI "n") (SI "e") (DI "e")])
866 ;; General operand constraint for word modes.
867 (define_mode_attr g [(QI "qmn") (HI "rmn") (SI "rme") (DI "rme")])
869 ;; Immediate operand constraint for double integer modes.
870 (define_mode_attr di [(SI "nF") (DI "e")])
872 ;; Immediate operand constraint for shifts.
873 (define_mode_attr S [(QI "I") (HI "I") (SI "I") (DI "J") (TI "O")])
875 ;; General operand predicate for integer modes.
876 (define_mode_attr general_operand
877 [(QI "general_operand")
878 (HI "general_operand")
879 (SI "x86_64_general_operand")
880 (DI "x86_64_general_operand")
881 (TI "x86_64_general_operand")])
883 ;; General sign/zero extend operand predicate for integer modes.
884 (define_mode_attr general_szext_operand
885 [(QI "general_operand")
886 (HI "general_operand")
887 (SI "x86_64_szext_general_operand")
888 (DI "x86_64_szext_general_operand")])
890 ;; Immediate operand predicate for integer modes.
891 (define_mode_attr immediate_operand
892 [(QI "immediate_operand")
893 (HI "immediate_operand")
894 (SI "x86_64_immediate_operand")
895 (DI "x86_64_immediate_operand")])
897 ;; Nonmemory operand predicate for integer modes.
898 (define_mode_attr nonmemory_operand
899 [(QI "nonmemory_operand")
900 (HI "nonmemory_operand")
901 (SI "x86_64_nonmemory_operand")
902 (DI "x86_64_nonmemory_operand")])
904 ;; Operand predicate for shifts.
905 (define_mode_attr shift_operand
906 [(QI "nonimmediate_operand")
907 (HI "nonimmediate_operand")
908 (SI "nonimmediate_operand")
909 (DI "shiftdi_operand")
910 (TI "register_operand")])
912 ;; Operand predicate for shift argument.
913 (define_mode_attr shift_immediate_operand
914 [(QI "const_1_to_31_operand")
915 (HI "const_1_to_31_operand")
916 (SI "const_1_to_31_operand")
917 (DI "const_1_to_63_operand")])
919 ;; Input operand predicate for arithmetic left shifts.
920 (define_mode_attr ashl_input_operand
921 [(QI "nonimmediate_operand")
922 (HI "nonimmediate_operand")
923 (SI "nonimmediate_operand")
924 (DI "ashldi_input_operand")
925 (TI "reg_or_pm1_operand")])
927 ;; SSE and x87 SFmode and DFmode floating point modes
928 (define_mode_iterator MODEF [SF DF])
930 ;; All x87 floating point modes
931 (define_mode_iterator X87MODEF [SF DF XF])
933 ;; SSE instruction suffix for various modes
934 (define_mode_attr ssemodesuffix
936 (V8SF "ps") (V4DF "pd")
937 (V4SF "ps") (V2DF "pd")
938 (V16QI "b") (V8HI "w") (V4SI "d") (V2DI "q")])
940 ;; SSE vector suffix for floating point modes
941 (define_mode_attr ssevecmodesuffix [(SF "ps") (DF "pd")])
943 ;; SSE vector mode corresponding to a scalar mode
944 (define_mode_attr ssevecmode
945 [(QI "V16QI") (HI "V8HI") (SI "V4SI") (DI "V2DI") (SF "V4SF") (DF "V2DF")])
947 ;; Instruction suffix for REX 64bit operators.
948 (define_mode_attr rex64suffix [(SI "") (DI "{q}")])
950 ;; This mode iterator allows :P to be used for patterns that operate on
951 ;; pointer-sized quantities. Exactly one of the two alternatives will match.
952 (define_mode_iterator P [(SI "Pmode == SImode") (DI "Pmode == DImode")])
954 ;; This mode iterator allows :PTR to be used for patterns that operate on
955 ;; ptr_mode sized quantities.
956 (define_mode_iterator PTR
957 [(SI "ptr_mode == SImode") (DI "ptr_mode == DImode")])
959 ;; Scheduling descriptions
961 (include "pentium.md")
964 (include "athlon.md")
965 (include "bdver1.md")
971 ;; Operand and operator predicates and constraints
973 (include "predicates.md")
974 (include "constraints.md")
977 ;; Compare and branch/compare and store instructions.
979 (define_expand "cbranch<mode>4"
980 [(set (reg:CC FLAGS_REG)
981 (compare:CC (match_operand:SDWIM 1 "nonimmediate_operand" "")
982 (match_operand:SDWIM 2 "<general_operand>" "")))
983 (set (pc) (if_then_else
984 (match_operator 0 "ordered_comparison_operator"
985 [(reg:CC FLAGS_REG) (const_int 0)])
986 (label_ref (match_operand 3 "" ""))
990 if (MEM_P (operands[1]) && MEM_P (operands[2]))
991 operands[1] = force_reg (<MODE>mode, operands[1]);
992 ix86_expand_branch (GET_CODE (operands[0]),
993 operands[1], operands[2], operands[3]);
997 (define_expand "cstore<mode>4"
998 [(set (reg:CC FLAGS_REG)
999 (compare:CC (match_operand:SWIM 2 "nonimmediate_operand" "")
1000 (match_operand:SWIM 3 "<general_operand>" "")))
1001 (set (match_operand:QI 0 "register_operand" "")
1002 (match_operator 1 "ordered_comparison_operator"
1003 [(reg:CC FLAGS_REG) (const_int 0)]))]
1006 if (MEM_P (operands[2]) && MEM_P (operands[3]))
1007 operands[2] = force_reg (<MODE>mode, operands[2]);
1008 ix86_expand_setcc (operands[0], GET_CODE (operands[1]),
1009 operands[2], operands[3]);
1013 (define_expand "cmp<mode>_1"
1014 [(set (reg:CC FLAGS_REG)
1015 (compare:CC (match_operand:SWI48 0 "nonimmediate_operand" "")
1016 (match_operand:SWI48 1 "<general_operand>" "")))])
1018 (define_insn "*cmp<mode>_ccno_1"
1019 [(set (reg FLAGS_REG)
1020 (compare (match_operand:SWI 0 "nonimmediate_operand" "<r>,?m<r>")
1021 (match_operand:SWI 1 "const0_operand" "")))]
1022 "ix86_match_ccmode (insn, CCNOmode)"
1024 test{<imodesuffix>}\t%0, %0
1025 cmp{<imodesuffix>}\t{%1, %0|%0, %1}"
1026 [(set_attr "type" "test,icmp")
1027 (set_attr "length_immediate" "0,1")
1028 (set_attr "mode" "<MODE>")])
1030 (define_insn "*cmp<mode>_1"
1031 [(set (reg FLAGS_REG)
1032 (compare (match_operand:SWI 0 "nonimmediate_operand" "<r>m,<r>")
1033 (match_operand:SWI 1 "<general_operand>" "<r><i>,<r>m")))]
1034 "ix86_match_ccmode (insn, CCmode)"
1035 "cmp{<imodesuffix>}\t{%1, %0|%0, %1}"
1036 [(set_attr "type" "icmp")
1037 (set_attr "mode" "<MODE>")])
1039 (define_insn "*cmp<mode>_minus_1"
1040 [(set (reg FLAGS_REG)
1042 (minus:SWI (match_operand:SWI 0 "nonimmediate_operand" "<r>m,<r>")
1043 (match_operand:SWI 1 "<general_operand>" "<r><i>,<r>m"))
1045 "ix86_match_ccmode (insn, CCGOCmode)"
1046 "cmp{<imodesuffix>}\t{%1, %0|%0, %1}"
1047 [(set_attr "type" "icmp")
1048 (set_attr "mode" "<MODE>")])
1050 (define_insn "*cmpqi_ext_1"
1051 [(set (reg FLAGS_REG)
1053 (match_operand:QI 0 "general_operand" "Qm")
1056 (match_operand 1 "ext_register_operand" "Q")
1058 (const_int 8)) 0)))]
1059 "!TARGET_64BIT && ix86_match_ccmode (insn, CCmode)"
1060 "cmp{b}\t{%h1, %0|%0, %h1}"
1061 [(set_attr "type" "icmp")
1062 (set_attr "mode" "QI")])
1064 (define_insn "*cmpqi_ext_1_rex64"
1065 [(set (reg FLAGS_REG)
1067 (match_operand:QI 0 "register_operand" "Q")
1070 (match_operand 1 "ext_register_operand" "Q")
1072 (const_int 8)) 0)))]
1073 "TARGET_64BIT && ix86_match_ccmode (insn, CCmode)"
1074 "cmp{b}\t{%h1, %0|%0, %h1}"
1075 [(set_attr "type" "icmp")
1076 (set_attr "mode" "QI")])
1078 (define_insn "*cmpqi_ext_2"
1079 [(set (reg FLAGS_REG)
1083 (match_operand 0 "ext_register_operand" "Q")
1086 (match_operand:QI 1 "const0_operand" "")))]
1087 "ix86_match_ccmode (insn, CCNOmode)"
1089 [(set_attr "type" "test")
1090 (set_attr "length_immediate" "0")
1091 (set_attr "mode" "QI")])
1093 (define_expand "cmpqi_ext_3"
1094 [(set (reg:CC FLAGS_REG)
1098 (match_operand 0 "ext_register_operand" "")
1101 (match_operand:QI 1 "immediate_operand" "")))])
1103 (define_insn "*cmpqi_ext_3_insn"
1104 [(set (reg FLAGS_REG)
1108 (match_operand 0 "ext_register_operand" "Q")
1111 (match_operand:QI 1 "general_operand" "Qmn")))]
1112 "!TARGET_64BIT && ix86_match_ccmode (insn, CCmode)"
1113 "cmp{b}\t{%1, %h0|%h0, %1}"
1114 [(set_attr "type" "icmp")
1115 (set_attr "modrm" "1")
1116 (set_attr "mode" "QI")])
1118 (define_insn "*cmpqi_ext_3_insn_rex64"
1119 [(set (reg FLAGS_REG)
1123 (match_operand 0 "ext_register_operand" "Q")
1126 (match_operand:QI 1 "nonmemory_operand" "Qn")))]
1127 "TARGET_64BIT && ix86_match_ccmode (insn, CCmode)"
1128 "cmp{b}\t{%1, %h0|%h0, %1}"
1129 [(set_attr "type" "icmp")
1130 (set_attr "modrm" "1")
1131 (set_attr "mode" "QI")])
1133 (define_insn "*cmpqi_ext_4"
1134 [(set (reg FLAGS_REG)
1138 (match_operand 0 "ext_register_operand" "Q")
1143 (match_operand 1 "ext_register_operand" "Q")
1145 (const_int 8)) 0)))]
1146 "ix86_match_ccmode (insn, CCmode)"
1147 "cmp{b}\t{%h1, %h0|%h0, %h1}"
1148 [(set_attr "type" "icmp")
1149 (set_attr "mode" "QI")])
1151 ;; These implement float point compares.
1152 ;; %%% See if we can get away with VOIDmode operands on the actual insns,
1153 ;; which would allow mix and match FP modes on the compares. Which is what
1154 ;; the old patterns did, but with many more of them.
1156 (define_expand "cbranchxf4"
1157 [(set (reg:CC FLAGS_REG)
1158 (compare:CC (match_operand:XF 1 "nonmemory_operand" "")
1159 (match_operand:XF 2 "nonmemory_operand" "")))
1160 (set (pc) (if_then_else
1161 (match_operator 0 "ix86_fp_comparison_operator"
1164 (label_ref (match_operand 3 "" ""))
1168 ix86_expand_branch (GET_CODE (operands[0]),
1169 operands[1], operands[2], operands[3]);
1173 (define_expand "cstorexf4"
1174 [(set (reg:CC FLAGS_REG)
1175 (compare:CC (match_operand:XF 2 "nonmemory_operand" "")
1176 (match_operand:XF 3 "nonmemory_operand" "")))
1177 (set (match_operand:QI 0 "register_operand" "")
1178 (match_operator 1 "ix86_fp_comparison_operator"
1183 ix86_expand_setcc (operands[0], GET_CODE (operands[1]),
1184 operands[2], operands[3]);
1188 (define_expand "cbranch<mode>4"
1189 [(set (reg:CC FLAGS_REG)
1190 (compare:CC (match_operand:MODEF 1 "cmp_fp_expander_operand" "")
1191 (match_operand:MODEF 2 "cmp_fp_expander_operand" "")))
1192 (set (pc) (if_then_else
1193 (match_operator 0 "ix86_fp_comparison_operator"
1196 (label_ref (match_operand 3 "" ""))
1198 "TARGET_80387 || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)"
1200 ix86_expand_branch (GET_CODE (operands[0]),
1201 operands[1], operands[2], operands[3]);
1205 (define_expand "cstore<mode>4"
1206 [(set (reg:CC FLAGS_REG)
1207 (compare:CC (match_operand:MODEF 2 "cmp_fp_expander_operand" "")
1208 (match_operand:MODEF 3 "cmp_fp_expander_operand" "")))
1209 (set (match_operand:QI 0 "register_operand" "")
1210 (match_operator 1 "ix86_fp_comparison_operator"
1213 "TARGET_80387 || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)"
1215 ix86_expand_setcc (operands[0], GET_CODE (operands[1]),
1216 operands[2], operands[3]);
1220 (define_expand "cbranchcc4"
1221 [(set (pc) (if_then_else
1222 (match_operator 0 "comparison_operator"
1223 [(match_operand 1 "flags_reg_operand" "")
1224 (match_operand 2 "const0_operand" "")])
1225 (label_ref (match_operand 3 "" ""))
1229 ix86_expand_branch (GET_CODE (operands[0]),
1230 operands[1], operands[2], operands[3]);
1234 (define_expand "cstorecc4"
1235 [(set (match_operand:QI 0 "register_operand" "")
1236 (match_operator 1 "comparison_operator"
1237 [(match_operand 2 "flags_reg_operand" "")
1238 (match_operand 3 "const0_operand" "")]))]
1241 ix86_expand_setcc (operands[0], GET_CODE (operands[1]),
1242 operands[2], operands[3]);
1247 ;; FP compares, step 1:
1248 ;; Set the FP condition codes.
1250 ;; CCFPmode compare with exceptions
1251 ;; CCFPUmode compare with no exceptions
1253 ;; We may not use "#" to split and emit these, since the REG_DEAD notes
1254 ;; used to manage the reg stack popping would not be preserved.
1256 (define_insn "*cmpfp_0"
1257 [(set (match_operand:HI 0 "register_operand" "=a")
1260 (match_operand 1 "register_operand" "f")
1261 (match_operand 2 "const0_operand" ""))]
1263 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1264 && GET_MODE (operands[1]) == GET_MODE (operands[2])"
1265 "* return output_fp_compare (insn, operands, false, false);"
1266 [(set_attr "type" "multi")
1267 (set_attr "unit" "i387")
1269 (cond [(match_operand:SF 1 "" "")
1271 (match_operand:DF 1 "" "")
1274 (const_string "XF")))])
1276 (define_insn_and_split "*cmpfp_0_cc"
1277 [(set (reg:CCFP FLAGS_REG)
1279 (match_operand 1 "register_operand" "f")
1280 (match_operand 2 "const0_operand" "")))
1281 (clobber (match_operand:HI 0 "register_operand" "=a"))]
1282 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1283 && TARGET_SAHF && !TARGET_CMOVE
1284 && GET_MODE (operands[1]) == GET_MODE (operands[2])"
1286 "&& reload_completed"
1289 [(compare:CCFP (match_dup 1)(match_dup 2))]
1291 (set (reg:CC FLAGS_REG)
1292 (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1294 [(set_attr "type" "multi")
1295 (set_attr "unit" "i387")
1297 (cond [(match_operand:SF 1 "" "")
1299 (match_operand:DF 1 "" "")
1302 (const_string "XF")))])
1304 (define_insn "*cmpfp_xf"
1305 [(set (match_operand:HI 0 "register_operand" "=a")
1308 (match_operand:XF 1 "register_operand" "f")
1309 (match_operand:XF 2 "register_operand" "f"))]
1312 "* return output_fp_compare (insn, operands, false, false);"
1313 [(set_attr "type" "multi")
1314 (set_attr "unit" "i387")
1315 (set_attr "mode" "XF")])
1317 (define_insn_and_split "*cmpfp_xf_cc"
1318 [(set (reg:CCFP FLAGS_REG)
1320 (match_operand:XF 1 "register_operand" "f")
1321 (match_operand:XF 2 "register_operand" "f")))
1322 (clobber (match_operand:HI 0 "register_operand" "=a"))]
1324 && TARGET_SAHF && !TARGET_CMOVE"
1326 "&& reload_completed"
1329 [(compare:CCFP (match_dup 1)(match_dup 2))]
1331 (set (reg:CC FLAGS_REG)
1332 (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1334 [(set_attr "type" "multi")
1335 (set_attr "unit" "i387")
1336 (set_attr "mode" "XF")])
1338 (define_insn "*cmpfp_<mode>"
1339 [(set (match_operand:HI 0 "register_operand" "=a")
1342 (match_operand:MODEF 1 "register_operand" "f")
1343 (match_operand:MODEF 2 "nonimmediate_operand" "fm"))]
1346 "* return output_fp_compare (insn, operands, false, false);"
1347 [(set_attr "type" "multi")
1348 (set_attr "unit" "i387")
1349 (set_attr "mode" "<MODE>")])
1351 (define_insn_and_split "*cmpfp_<mode>_cc"
1352 [(set (reg:CCFP FLAGS_REG)
1354 (match_operand:MODEF 1 "register_operand" "f")
1355 (match_operand:MODEF 2 "nonimmediate_operand" "fm")))
1356 (clobber (match_operand:HI 0 "register_operand" "=a"))]
1358 && TARGET_SAHF && !TARGET_CMOVE"
1360 "&& reload_completed"
1363 [(compare:CCFP (match_dup 1)(match_dup 2))]
1365 (set (reg:CC FLAGS_REG)
1366 (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1368 [(set_attr "type" "multi")
1369 (set_attr "unit" "i387")
1370 (set_attr "mode" "<MODE>")])
1372 (define_insn "*cmpfp_u"
1373 [(set (match_operand:HI 0 "register_operand" "=a")
1376 (match_operand 1 "register_operand" "f")
1377 (match_operand 2 "register_operand" "f"))]
1379 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1380 && GET_MODE (operands[1]) == GET_MODE (operands[2])"
1381 "* return output_fp_compare (insn, operands, false, true);"
1382 [(set_attr "type" "multi")
1383 (set_attr "unit" "i387")
1385 (cond [(match_operand:SF 1 "" "")
1387 (match_operand:DF 1 "" "")
1390 (const_string "XF")))])
1392 (define_insn_and_split "*cmpfp_u_cc"
1393 [(set (reg:CCFPU FLAGS_REG)
1395 (match_operand 1 "register_operand" "f")
1396 (match_operand 2 "register_operand" "f")))
1397 (clobber (match_operand:HI 0 "register_operand" "=a"))]
1398 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1399 && TARGET_SAHF && !TARGET_CMOVE
1400 && GET_MODE (operands[1]) == GET_MODE (operands[2])"
1402 "&& reload_completed"
1405 [(compare:CCFPU (match_dup 1)(match_dup 2))]
1407 (set (reg:CC FLAGS_REG)
1408 (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1410 [(set_attr "type" "multi")
1411 (set_attr "unit" "i387")
1413 (cond [(match_operand:SF 1 "" "")
1415 (match_operand:DF 1 "" "")
1418 (const_string "XF")))])
1420 (define_insn "*cmpfp_<mode>"
1421 [(set (match_operand:HI 0 "register_operand" "=a")
1424 (match_operand 1 "register_operand" "f")
1425 (match_operator 3 "float_operator"
1426 [(match_operand:SWI24 2 "memory_operand" "m")]))]
1428 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1429 && (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))
1430 && (GET_MODE (operands [3]) == GET_MODE (operands[1]))"
1431 "* return output_fp_compare (insn, operands, false, false);"
1432 [(set_attr "type" "multi")
1433 (set_attr "unit" "i387")
1434 (set_attr "fp_int_src" "true")
1435 (set_attr "mode" "<MODE>")])
1437 (define_insn_and_split "*cmpfp_<mode>_cc"
1438 [(set (reg:CCFP FLAGS_REG)
1440 (match_operand 1 "register_operand" "f")
1441 (match_operator 3 "float_operator"
1442 [(match_operand:SWI24 2 "memory_operand" "m")])))
1443 (clobber (match_operand:HI 0 "register_operand" "=a"))]
1444 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1445 && TARGET_SAHF && !TARGET_CMOVE
1446 && (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))
1447 && (GET_MODE (operands [3]) == GET_MODE (operands[1]))"
1449 "&& reload_completed"
1454 (match_op_dup 3 [(match_dup 2)]))]
1456 (set (reg:CC FLAGS_REG)
1457 (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1459 [(set_attr "type" "multi")
1460 (set_attr "unit" "i387")
1461 (set_attr "fp_int_src" "true")
1462 (set_attr "mode" "<MODE>")])
1464 ;; FP compares, step 2
1465 ;; Move the fpsw to ax.
1467 (define_insn "x86_fnstsw_1"
1468 [(set (match_operand:HI 0 "register_operand" "=a")
1469 (unspec:HI [(reg:CCFP FPSR_REG)] UNSPEC_FNSTSW))]
1472 [(set (attr "length") (symbol_ref "ix86_attr_length_address_default (insn) + 2"))
1473 (set_attr "mode" "SI")
1474 (set_attr "unit" "i387")])
1476 ;; FP compares, step 3
1477 ;; Get ax into flags, general case.
1479 (define_insn "x86_sahf_1"
1480 [(set (reg:CC FLAGS_REG)
1481 (unspec:CC [(match_operand:HI 0 "register_operand" "a")]
1485 #ifndef HAVE_AS_IX86_SAHF
1487 return ASM_BYTE "0x9e";
1492 [(set_attr "length" "1")
1493 (set_attr "athlon_decode" "vector")
1494 (set_attr "amdfam10_decode" "direct")
1495 (set_attr "bdver1_decode" "direct")
1496 (set_attr "mode" "SI")])
1498 ;; Pentium Pro can do steps 1 through 3 in one go.
1499 ;; comi*, ucomi*, fcomi*, ficomi*,fucomi* (i387 instructions set condition codes)
1500 (define_insn "*cmpfp_i_mixed"
1501 [(set (reg:CCFP FLAGS_REG)
1502 (compare:CCFP (match_operand 0 "register_operand" "f,x")
1503 (match_operand 1 "nonimmediate_operand" "f,xm")))]
1504 "TARGET_MIX_SSE_I387
1505 && SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
1506 && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1507 "* return output_fp_compare (insn, operands, true, false);"
1508 [(set_attr "type" "fcmp,ssecomi")
1509 (set_attr "prefix" "orig,maybe_vex")
1511 (if_then_else (match_operand:SF 1 "" "")
1513 (const_string "DF")))
1514 (set (attr "prefix_rep")
1515 (if_then_else (eq_attr "type" "ssecomi")
1517 (const_string "*")))
1518 (set (attr "prefix_data16")
1519 (cond [(eq_attr "type" "fcmp")
1521 (eq_attr "mode" "DF")
1524 (const_string "0")))
1525 (set_attr "athlon_decode" "vector")
1526 (set_attr "amdfam10_decode" "direct")
1527 (set_attr "bdver1_decode" "double")])
1529 (define_insn "*cmpfp_i_sse"
1530 [(set (reg:CCFP FLAGS_REG)
1531 (compare:CCFP (match_operand 0 "register_operand" "x")
1532 (match_operand 1 "nonimmediate_operand" "xm")))]
1534 && SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
1535 && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1536 "* return output_fp_compare (insn, operands, true, false);"
1537 [(set_attr "type" "ssecomi")
1538 (set_attr "prefix" "maybe_vex")
1540 (if_then_else (match_operand:SF 1 "" "")
1542 (const_string "DF")))
1543 (set_attr "prefix_rep" "0")
1544 (set (attr "prefix_data16")
1545 (if_then_else (eq_attr "mode" "DF")
1547 (const_string "0")))
1548 (set_attr "athlon_decode" "vector")
1549 (set_attr "amdfam10_decode" "direct")
1550 (set_attr "bdver1_decode" "double")])
1552 (define_insn "*cmpfp_i_i387"
1553 [(set (reg:CCFP FLAGS_REG)
1554 (compare:CCFP (match_operand 0 "register_operand" "f")
1555 (match_operand 1 "register_operand" "f")))]
1556 "X87_FLOAT_MODE_P (GET_MODE (operands[0]))
1558 && !(SSE_FLOAT_MODE_P (GET_MODE (operands[0])) && TARGET_SSE_MATH)
1559 && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1560 "* return output_fp_compare (insn, operands, true, false);"
1561 [(set_attr "type" "fcmp")
1563 (cond [(match_operand:SF 1 "" "")
1565 (match_operand:DF 1 "" "")
1568 (const_string "XF")))
1569 (set_attr "athlon_decode" "vector")
1570 (set_attr "amdfam10_decode" "direct")
1571 (set_attr "bdver1_decode" "double")])
1573 (define_insn "*cmpfp_iu_mixed"
1574 [(set (reg:CCFPU FLAGS_REG)
1575 (compare:CCFPU (match_operand 0 "register_operand" "f,x")
1576 (match_operand 1 "nonimmediate_operand" "f,xm")))]
1577 "TARGET_MIX_SSE_I387
1578 && SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
1579 && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1580 "* return output_fp_compare (insn, operands, true, true);"
1581 [(set_attr "type" "fcmp,ssecomi")
1582 (set_attr "prefix" "orig,maybe_vex")
1584 (if_then_else (match_operand:SF 1 "" "")
1586 (const_string "DF")))
1587 (set (attr "prefix_rep")
1588 (if_then_else (eq_attr "type" "ssecomi")
1590 (const_string "*")))
1591 (set (attr "prefix_data16")
1592 (cond [(eq_attr "type" "fcmp")
1594 (eq_attr "mode" "DF")
1597 (const_string "0")))
1598 (set_attr "athlon_decode" "vector")
1599 (set_attr "amdfam10_decode" "direct")
1600 (set_attr "bdver1_decode" "double")])
1602 (define_insn "*cmpfp_iu_sse"
1603 [(set (reg:CCFPU FLAGS_REG)
1604 (compare:CCFPU (match_operand 0 "register_operand" "x")
1605 (match_operand 1 "nonimmediate_operand" "xm")))]
1607 && SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
1608 && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1609 "* return output_fp_compare (insn, operands, true, true);"
1610 [(set_attr "type" "ssecomi")
1611 (set_attr "prefix" "maybe_vex")
1613 (if_then_else (match_operand:SF 1 "" "")
1615 (const_string "DF")))
1616 (set_attr "prefix_rep" "0")
1617 (set (attr "prefix_data16")
1618 (if_then_else (eq_attr "mode" "DF")
1620 (const_string "0")))
1621 (set_attr "athlon_decode" "vector")
1622 (set_attr "amdfam10_decode" "direct")
1623 (set_attr "bdver1_decode" "double")])
1625 (define_insn "*cmpfp_iu_387"
1626 [(set (reg:CCFPU FLAGS_REG)
1627 (compare:CCFPU (match_operand 0 "register_operand" "f")
1628 (match_operand 1 "register_operand" "f")))]
1629 "X87_FLOAT_MODE_P (GET_MODE (operands[0]))
1631 && !(SSE_FLOAT_MODE_P (GET_MODE (operands[0])) && TARGET_SSE_MATH)
1632 && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1633 "* return output_fp_compare (insn, operands, true, true);"
1634 [(set_attr "type" "fcmp")
1636 (cond [(match_operand:SF 1 "" "")
1638 (match_operand:DF 1 "" "")
1641 (const_string "XF")))
1642 (set_attr "athlon_decode" "vector")
1643 (set_attr "amdfam10_decode" "direct")
1644 (set_attr "bdver1_decode" "direct")])
1646 ;; Push/pop instructions.
1648 (define_insn "*push<mode>2"
1649 [(set (match_operand:DWI 0 "push_operand" "=<")
1650 (match_operand:DWI 1 "general_no_elim_operand" "riF*o"))]
1653 [(set_attr "type" "multi")
1654 (set_attr "mode" "<MODE>")])
1657 [(set (match_operand:TI 0 "push_operand" "")
1658 (match_operand:TI 1 "general_operand" ""))]
1659 "TARGET_64BIT && reload_completed
1660 && !SSE_REG_P (operands[1])"
1662 "ix86_split_long_move (operands); DONE;")
1664 (define_insn "*pushdi2_rex64"
1665 [(set (match_operand:DI 0 "push_operand" "=<,!<")
1666 (match_operand:DI 1 "general_no_elim_operand" "re*m,n"))]
1671 [(set_attr "type" "push,multi")
1672 (set_attr "mode" "DI")])
1674 ;; Convert impossible pushes of immediate to existing instructions.
1675 ;; First try to get scratch register and go through it. In case this
1676 ;; fails, push sign extended lower part first and then overwrite
1677 ;; upper part by 32bit move.
1679 [(match_scratch:DI 2 "r")
1680 (set (match_operand:DI 0 "push_operand" "")
1681 (match_operand:DI 1 "immediate_operand" ""))]
1682 "TARGET_64BIT && !symbolic_operand (operands[1], DImode)
1683 && !x86_64_immediate_operand (operands[1], DImode)"
1684 [(set (match_dup 2) (match_dup 1))
1685 (set (match_dup 0) (match_dup 2))])
1687 ;; We need to define this as both peepholer and splitter for case
1688 ;; peephole2 pass is not run.
1689 ;; "&& 1" is needed to keep it from matching the previous pattern.
1691 [(set (match_operand:DI 0 "push_operand" "")
1692 (match_operand:DI 1 "immediate_operand" ""))]
1693 "TARGET_64BIT && !symbolic_operand (operands[1], DImode)
1694 && !x86_64_immediate_operand (operands[1], DImode) && 1"
1695 [(set (match_dup 0) (match_dup 1))
1696 (set (match_dup 2) (match_dup 3))]
1698 split_double_mode (DImode, &operands[1], 1, &operands[2], &operands[3]);
1700 operands[1] = gen_lowpart (DImode, operands[2]);
1701 operands[2] = gen_rtx_MEM (SImode, gen_rtx_PLUS (DImode, stack_pointer_rtx,
1706 [(set (match_operand:DI 0 "push_operand" "")
1707 (match_operand:DI 1 "immediate_operand" ""))]
1708 "TARGET_64BIT && ((optimize > 0 && flag_peephole2)
1709 ? epilogue_completed : reload_completed)
1710 && !symbolic_operand (operands[1], DImode)
1711 && !x86_64_immediate_operand (operands[1], DImode)"
1712 [(set (match_dup 0) (match_dup 1))
1713 (set (match_dup 2) (match_dup 3))]
1715 split_double_mode (DImode, &operands[1], 1, &operands[2], &operands[3]);
1717 operands[1] = gen_lowpart (DImode, operands[2]);
1718 operands[2] = gen_rtx_MEM (SImode, gen_rtx_PLUS (DImode, stack_pointer_rtx,
1723 [(set (match_operand:DI 0 "push_operand" "")
1724 (match_operand:DI 1 "general_operand" ""))]
1725 "!TARGET_64BIT && reload_completed
1726 && !(MMX_REG_P (operands[1]) || SSE_REG_P (operands[1]))"
1728 "ix86_split_long_move (operands); DONE;")
1730 (define_insn "*pushsi2"
1731 [(set (match_operand:SI 0 "push_operand" "=<")
1732 (match_operand:SI 1 "general_no_elim_operand" "ri*m"))]
1735 [(set_attr "type" "push")
1736 (set_attr "mode" "SI")])
1738 ;; emit_push_insn when it calls move_by_pieces requires an insn to
1739 ;; "push a byte/word". But actually we use pushl, which has the effect
1740 ;; of rounding the amount pushed up to a word.
1742 ;; For TARGET_64BIT we always round up to 8 bytes.
1743 (define_insn "*push<mode>2_rex64"
1744 [(set (match_operand:SWI124 0 "push_operand" "=X")
1745 (match_operand:SWI124 1 "nonmemory_no_elim_operand" "r<i>"))]
1748 [(set_attr "type" "push")
1749 (set_attr "mode" "DI")])
1751 (define_insn "*push<mode>2"
1752 [(set (match_operand:SWI12 0 "push_operand" "=X")
1753 (match_operand:SWI12 1 "nonmemory_no_elim_operand" "rn"))]
1756 [(set_attr "type" "push")
1757 (set_attr "mode" "SI")])
1759 (define_insn "*push<mode>2_prologue"
1760 [(set (match_operand:P 0 "push_operand" "=<")
1761 (match_operand:P 1 "general_no_elim_operand" "r<i>*m"))
1762 (clobber (mem:BLK (scratch)))]
1764 "push{<imodesuffix>}\t%1"
1765 [(set_attr "type" "push")
1766 (set_attr "mode" "<MODE>")])
1768 (define_insn "*pop<mode>1"
1769 [(set (match_operand:P 0 "nonimmediate_operand" "=r*m")
1770 (match_operand:P 1 "pop_operand" ">"))]
1772 "pop{<imodesuffix>}\t%0"
1773 [(set_attr "type" "pop")
1774 (set_attr "mode" "<MODE>")])
1776 (define_insn "*pop<mode>1_epilogue"
1777 [(set (match_operand:P 0 "nonimmediate_operand" "=r*m")
1778 (match_operand:P 1 "pop_operand" ">"))
1779 (clobber (mem:BLK (scratch)))]
1781 "pop{<imodesuffix>}\t%0"
1782 [(set_attr "type" "pop")
1783 (set_attr "mode" "<MODE>")])
1785 ;; Move instructions.
1787 (define_expand "movoi"
1788 [(set (match_operand:OI 0 "nonimmediate_operand" "")
1789 (match_operand:OI 1 "general_operand" ""))]
1791 "ix86_expand_move (OImode, operands); DONE;")
1793 (define_expand "movti"
1794 [(set (match_operand:TI 0 "nonimmediate_operand" "")
1795 (match_operand:TI 1 "nonimmediate_operand" ""))]
1796 "TARGET_64BIT || TARGET_SSE"
1799 ix86_expand_move (TImode, operands);
1800 else if (push_operand (operands[0], TImode))
1801 ix86_expand_push (TImode, operands[1]);
1803 ix86_expand_vector_move (TImode, operands);
1807 ;; This expands to what emit_move_complex would generate if we didn't
1808 ;; have a movti pattern. Having this avoids problems with reload on
1809 ;; 32-bit targets when SSE is present, but doesn't seem to be harmful
1810 ;; to have around all the time.
1811 (define_expand "movcdi"
1812 [(set (match_operand:CDI 0 "nonimmediate_operand" "")
1813 (match_operand:CDI 1 "general_operand" ""))]
1816 if (push_operand (operands[0], CDImode))
1817 emit_move_complex_push (CDImode, operands[0], operands[1]);
1819 emit_move_complex_parts (operands[0], operands[1]);
1823 (define_expand "mov<mode>"
1824 [(set (match_operand:SWI1248x 0 "nonimmediate_operand" "")
1825 (match_operand:SWI1248x 1 "general_operand" ""))]
1827 "ix86_expand_move (<MODE>mode, operands); DONE;")
1829 (define_insn "*mov<mode>_xor"
1830 [(set (match_operand:SWI48 0 "register_operand" "=r")
1831 (match_operand:SWI48 1 "const0_operand" ""))
1832 (clobber (reg:CC FLAGS_REG))]
1835 [(set_attr "type" "alu1")
1836 (set_attr "mode" "SI")
1837 (set_attr "length_immediate" "0")])
1839 (define_insn "*mov<mode>_or"
1840 [(set (match_operand:SWI48 0 "register_operand" "=r")
1841 (match_operand:SWI48 1 "const_int_operand" ""))
1842 (clobber (reg:CC FLAGS_REG))]
1844 && operands[1] == constm1_rtx"
1845 "or{<imodesuffix>}\t{%1, %0|%0, %1}"
1846 [(set_attr "type" "alu1")
1847 (set_attr "mode" "<MODE>")
1848 (set_attr "length_immediate" "1")])
1850 (define_insn "*movoi_internal_avx"
1851 [(set (match_operand:OI 0 "nonimmediate_operand" "=x,x,m")
1852 (match_operand:OI 1 "vector_move_operand" "C,xm,x"))]
1853 "TARGET_AVX && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
1855 switch (which_alternative)
1858 return standard_sse_constant_opcode (insn, operands[1]);
1861 if (misaligned_operand (operands[0], OImode)
1862 || misaligned_operand (operands[1], OImode))
1863 return "vmovdqu\t{%1, %0|%0, %1}";
1865 return "vmovdqa\t{%1, %0|%0, %1}";
1870 [(set_attr "type" "sselog1,ssemov,ssemov")
1871 (set_attr "prefix" "vex")
1872 (set_attr "mode" "OI")])
1874 (define_insn "*movti_internal_rex64"
1875 [(set (match_operand:TI 0 "nonimmediate_operand" "=!r,o,x,x,xm")
1876 (match_operand:TI 1 "general_operand" "riFo,riF,C,xm,x"))]
1877 "TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
1879 switch (which_alternative)
1885 return standard_sse_constant_opcode (insn, operands[1]);
1888 /* TDmode values are passed as TImode on the stack. Moving them
1889 to stack may result in unaligned memory access. */
1890 if (misaligned_operand (operands[0], TImode)
1891 || misaligned_operand (operands[1], TImode))
1893 if (get_attr_mode (insn) == MODE_V4SF)
1894 return "%vmovups\t{%1, %0|%0, %1}";
1896 return "%vmovdqu\t{%1, %0|%0, %1}";
1900 if (get_attr_mode (insn) == MODE_V4SF)
1901 return "%vmovaps\t{%1, %0|%0, %1}";
1903 return "%vmovdqa\t{%1, %0|%0, %1}";
1909 [(set_attr "type" "*,*,sselog1,ssemov,ssemov")
1910 (set_attr "prefix" "*,*,maybe_vex,maybe_vex,maybe_vex")
1912 (cond [(eq_attr "alternative" "2,3")
1914 (ne (symbol_ref "optimize_function_for_size_p (cfun)")
1916 (const_string "V4SF")
1917 (const_string "TI"))
1918 (eq_attr "alternative" "4")
1920 (ior (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
1922 (ne (symbol_ref "optimize_function_for_size_p (cfun)")
1924 (const_string "V4SF")
1925 (const_string "TI"))]
1926 (const_string "DI")))])
1929 [(set (match_operand:TI 0 "nonimmediate_operand" "")
1930 (match_operand:TI 1 "general_operand" ""))]
1932 && !SSE_REG_P (operands[0]) && !SSE_REG_P (operands[1])"
1934 "ix86_split_long_move (operands); DONE;")
1936 (define_insn "*movti_internal_sse"
1937 [(set (match_operand:TI 0 "nonimmediate_operand" "=x,x,m")
1938 (match_operand:TI 1 "vector_move_operand" "C,xm,x"))]
1939 "TARGET_SSE && !TARGET_64BIT
1940 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
1942 switch (which_alternative)
1945 return standard_sse_constant_opcode (insn, operands[1]);
1948 /* TDmode values are passed as TImode on the stack. Moving them
1949 to stack may result in unaligned memory access. */
1950 if (misaligned_operand (operands[0], TImode)
1951 || misaligned_operand (operands[1], TImode))
1953 if (get_attr_mode (insn) == MODE_V4SF)
1954 return "%vmovups\t{%1, %0|%0, %1}";
1956 return "%vmovdqu\t{%1, %0|%0, %1}";
1960 if (get_attr_mode (insn) == MODE_V4SF)
1961 return "%vmovaps\t{%1, %0|%0, %1}";
1963 return "%vmovdqa\t{%1, %0|%0, %1}";
1969 [(set_attr "type" "sselog1,ssemov,ssemov")
1970 (set_attr "prefix" "maybe_vex")
1972 (cond [(ior (eq (symbol_ref "TARGET_SSE2") (const_int 0))
1973 (ne (symbol_ref "optimize_function_for_size_p (cfun)")
1975 (const_string "V4SF")
1976 (and (eq_attr "alternative" "2")
1977 (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
1979 (const_string "V4SF")]
1980 (const_string "TI")))])
1982 (define_insn "*movdi_internal_rex64"
1983 [(set (match_operand:DI 0 "nonimmediate_operand"
1984 "=r,r ,r,m ,!o,*y,m*y,?*y,?r ,?*Ym,*x,m ,*x,*x,?r ,?*Yi,?*x,?*Ym")
1985 (match_operand:DI 1 "general_operand"
1986 "Z ,rem,i,re,n ,C ,*y ,m ,*Ym,r ,C ,*x,*x,m ,*Yi,r ,*Ym,*x"))]
1987 "TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
1989 switch (get_attr_type (insn))
1992 if (SSE_REG_P (operands[0]))
1993 return "movq2dq\t{%1, %0|%0, %1}";
1995 return "movdq2q\t{%1, %0|%0, %1}";
1998 if (get_attr_mode (insn) == MODE_TI)
1999 return "%vmovdqa\t{%1, %0|%0, %1}";
2000 /* Handle broken assemblers that require movd instead of movq. */
2001 if (GENERAL_REG_P (operands[0]) || GENERAL_REG_P (operands[1]))
2002 return "%vmovd\t{%1, %0|%0, %1}";
2004 return "%vmovq\t{%1, %0|%0, %1}";
2007 /* Handle broken assemblers that require movd instead of movq. */
2008 if (GENERAL_REG_P (operands[0]) || GENERAL_REG_P (operands[1]))
2009 return "movd\t{%1, %0|%0, %1}";
2011 return "movq\t{%1, %0|%0, %1}";
2014 return standard_sse_constant_opcode (insn, operands[1]);
2017 return "pxor\t%0, %0";
2023 return "lea{q}\t{%a1, %0|%0, %a1}";
2026 gcc_assert (!flag_pic || LEGITIMATE_PIC_OPERAND_P (operands[1]));
2027 if (get_attr_mode (insn) == MODE_SI)
2028 return "mov{l}\t{%k1, %k0|%k0, %k1}";
2029 else if (which_alternative == 2)
2030 return "movabs{q}\t{%1, %0|%0, %1}";
2032 return "mov{q}\t{%1, %0|%0, %1}";
2036 (cond [(eq_attr "alternative" "4")
2037 (const_string "multi")
2038 (eq_attr "alternative" "5")
2039 (const_string "mmx")
2040 (eq_attr "alternative" "6,7,8,9")
2041 (const_string "mmxmov")
2042 (eq_attr "alternative" "10")
2043 (const_string "sselog1")
2044 (eq_attr "alternative" "11,12,13,14,15")
2045 (const_string "ssemov")
2046 (eq_attr "alternative" "16,17")
2047 (const_string "ssecvt")
2048 (match_operand 1 "pic_32bit_operand" "")
2049 (const_string "lea")
2051 (const_string "imov")))
2054 (and (eq_attr "alternative" "2") (eq_attr "type" "imov"))
2056 (const_string "*")))
2057 (set (attr "length_immediate")
2059 (and (eq_attr "alternative" "2") (eq_attr "type" "imov"))
2061 (const_string "*")))
2062 (set (attr "prefix_rex")
2063 (if_then_else (eq_attr "alternative" "8,9")
2065 (const_string "*")))
2066 (set (attr "prefix_data16")
2067 (if_then_else (eq_attr "alternative" "11")
2069 (const_string "*")))
2070 (set (attr "prefix")
2071 (if_then_else (eq_attr "alternative" "10,11,12,13,14,15")
2072 (const_string "maybe_vex")
2073 (const_string "orig")))
2074 (set_attr "mode" "SI,DI,DI,DI,SI,DI,DI,DI,DI,DI,TI,DI,TI,DI,DI,DI,DI,DI")])
2076 ;; Reload patterns to support multi-word load/store
2077 ;; with non-offsetable address.
2078 (define_expand "reload_noff_store"
2079 [(parallel [(match_operand 0 "memory_operand" "=m")
2080 (match_operand 1 "register_operand" "r")
2081 (match_operand:DI 2 "register_operand" "=&r")])]
2084 rtx mem = operands[0];
2085 rtx addr = XEXP (mem, 0);
2087 emit_move_insn (operands[2], addr);
2088 mem = replace_equiv_address_nv (mem, operands[2]);
2090 emit_insn (gen_rtx_SET (VOIDmode, mem, operands[1]));
2094 (define_expand "reload_noff_load"
2095 [(parallel [(match_operand 0 "register_operand" "=r")
2096 (match_operand 1 "memory_operand" "m")
2097 (match_operand:DI 2 "register_operand" "=r")])]
2100 rtx mem = operands[1];
2101 rtx addr = XEXP (mem, 0);
2103 emit_move_insn (operands[2], addr);
2104 mem = replace_equiv_address_nv (mem, operands[2]);
2106 emit_insn (gen_rtx_SET (VOIDmode, operands[0], mem));
2110 ;; Convert impossible stores of immediate to existing instructions.
2111 ;; First try to get scratch register and go through it. In case this
2112 ;; fails, move by 32bit parts.
2114 [(match_scratch:DI 2 "r")
2115 (set (match_operand:DI 0 "memory_operand" "")
2116 (match_operand:DI 1 "immediate_operand" ""))]
2117 "TARGET_64BIT && !symbolic_operand (operands[1], DImode)
2118 && !x86_64_immediate_operand (operands[1], DImode)"
2119 [(set (match_dup 2) (match_dup 1))
2120 (set (match_dup 0) (match_dup 2))])
2122 ;; We need to define this as both peepholer and splitter for case
2123 ;; peephole2 pass is not run.
2124 ;; "&& 1" is needed to keep it from matching the previous pattern.
2126 [(set (match_operand:DI 0 "memory_operand" "")
2127 (match_operand:DI 1 "immediate_operand" ""))]
2128 "TARGET_64BIT && !symbolic_operand (operands[1], DImode)
2129 && !x86_64_immediate_operand (operands[1], DImode) && 1"
2130 [(set (match_dup 2) (match_dup 3))
2131 (set (match_dup 4) (match_dup 5))]
2132 "split_double_mode (DImode, &operands[0], 2, &operands[2], &operands[4]);")
2135 [(set (match_operand:DI 0 "memory_operand" "")
2136 (match_operand:DI 1 "immediate_operand" ""))]
2137 "TARGET_64BIT && ((optimize > 0 && flag_peephole2)
2138 ? epilogue_completed : reload_completed)
2139 && !symbolic_operand (operands[1], DImode)
2140 && !x86_64_immediate_operand (operands[1], DImode)"
2141 [(set (match_dup 2) (match_dup 3))
2142 (set (match_dup 4) (match_dup 5))]
2143 "split_double_mode (DImode, &operands[0], 2, &operands[2], &operands[4]);")
2145 (define_insn "*movdi_internal"
2146 [(set (match_operand:DI 0 "nonimmediate_operand"
2147 "=r ,o ,*y,m*y,*y,*Y2,m ,*Y2,*Y2,*x,m ,*x,*x,?*Y2,?*Ym")
2148 (match_operand:DI 1 "general_operand"
2149 "riFo,riF,C ,*y ,m ,C ,*Y2,*Y2,m ,C ,*x,*x,m ,*Ym ,*Y2"))]
2150 "!TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
2152 switch (get_attr_type (insn))
2155 if (SSE_REG_P (operands[0]))
2156 return "movq2dq\t{%1, %0|%0, %1}";
2158 return "movdq2q\t{%1, %0|%0, %1}";
2161 switch (get_attr_mode (insn))
2164 return "%vmovdqa\t{%1, %0|%0, %1}";
2166 return "%vmovq\t{%1, %0|%0, %1}";
2168 return "movaps\t{%1, %0|%0, %1}";
2170 return "movlps\t{%1, %0|%0, %1}";
2176 return "movq\t{%1, %0|%0, %1}";
2179 return standard_sse_constant_opcode (insn, operands[1]);
2182 return "pxor\t%0, %0";
2192 (if_then_else (eq_attr "alternative" "9,10,11,12")
2193 (const_string "noavx")
2194 (const_string "*")))
2196 (cond [(eq_attr "alternative" "0,1")
2197 (const_string "multi")
2198 (eq_attr "alternative" "2")
2199 (const_string "mmx")
2200 (eq_attr "alternative" "3,4")
2201 (const_string "mmxmov")
2202 (eq_attr "alternative" "5,9")
2203 (const_string "sselog1")
2204 (eq_attr "alternative" "13,14")
2205 (const_string "ssecvt")
2207 (const_string "ssemov")))
2208 (set (attr "prefix")
2209 (if_then_else (eq_attr "alternative" "5,6,7,8")
2210 (const_string "maybe_vex")
2211 (const_string "orig")))
2212 (set_attr "mode" "DI,DI,DI,DI,DI,TI,DI,TI,DI,V4SF,V2SF,V4SF,V2SF,DI,DI")])
2215 [(set (match_operand:DI 0 "nonimmediate_operand" "")
2216 (match_operand:DI 1 "general_operand" ""))]
2217 "!TARGET_64BIT && reload_completed
2218 && !(MMX_REG_P (operands[0]) || SSE_REG_P (operands[0]))
2219 && !(MMX_REG_P (operands[1]) || SSE_REG_P (operands[1]))"
2221 "ix86_split_long_move (operands); DONE;")
2223 (define_insn "*movsi_internal"
2224 [(set (match_operand:SI 0 "nonimmediate_operand"
2225 "=r,m ,*y,*y,?rm,?*y,*x,*x,?r ,m ,?*Yi,*x")
2226 (match_operand:SI 1 "general_operand"
2227 "g ,re,C ,*y,*y ,rm ,C ,*x,*Yi,*x,r ,m "))]
2228 "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
2230 switch (get_attr_type (insn))
2233 return standard_sse_constant_opcode (insn, operands[1]);
2236 switch (get_attr_mode (insn))
2239 return "%vmovdqa\t{%1, %0|%0, %1}";
2241 return "%vmovaps\t{%1, %0|%0, %1}";
2243 return "%vmovd\t{%1, %0|%0, %1}";
2245 return "%vmovss\t{%1, %0|%0, %1}";
2251 return "pxor\t%0, %0";
2254 if (get_attr_mode (insn) == MODE_DI)
2255 return "movq\t{%1, %0|%0, %1}";
2256 return "movd\t{%1, %0|%0, %1}";
2259 return "lea{l}\t{%a1, %0|%0, %a1}";
2262 gcc_assert (!flag_pic || LEGITIMATE_PIC_OPERAND_P (operands[1]));
2263 return "mov{l}\t{%1, %0|%0, %1}";
2267 (cond [(eq_attr "alternative" "2")
2268 (const_string "mmx")
2269 (eq_attr "alternative" "3,4,5")
2270 (const_string "mmxmov")
2271 (eq_attr "alternative" "6")
2272 (const_string "sselog1")
2273 (eq_attr "alternative" "7,8,9,10,11")
2274 (const_string "ssemov")
2275 (match_operand 1 "pic_32bit_operand" "")
2276 (const_string "lea")
2278 (const_string "imov")))
2279 (set (attr "prefix")
2280 (if_then_else (eq_attr "alternative" "0,1,2,3,4,5")
2281 (const_string "orig")
2282 (const_string "maybe_vex")))
2283 (set (attr "prefix_data16")
2284 (if_then_else (and (eq_attr "type" "ssemov") (eq_attr "mode" "SI"))
2286 (const_string "*")))
2288 (cond [(eq_attr "alternative" "2,3")
2290 (eq_attr "alternative" "6,7")
2292 (eq (symbol_ref "TARGET_SSE2") (const_int 0))
2293 (const_string "V4SF")
2294 (const_string "TI"))
2295 (and (eq_attr "alternative" "8,9,10,11")
2296 (eq (symbol_ref "TARGET_SSE2") (const_int 0)))
2299 (const_string "SI")))])
2301 (define_insn "*movhi_internal"
2302 [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,r,m")
2303 (match_operand:HI 1 "general_operand" "r,rn,rm,rn"))]
2304 "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
2306 switch (get_attr_type (insn))
2309 /* movzwl is faster than movw on p2 due to partial word stalls,
2310 though not as fast as an aligned movl. */
2311 return "movz{wl|x}\t{%1, %k0|%k0, %1}";
2313 if (get_attr_mode (insn) == MODE_SI)
2314 return "mov{l}\t{%k1, %k0|%k0, %k1}";
2316 return "mov{w}\t{%1, %0|%0, %1}";
2320 (cond [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
2322 (const_string "imov")
2323 (and (eq_attr "alternative" "0")
2324 (ior (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
2326 (eq (symbol_ref "TARGET_HIMODE_MATH")
2328 (const_string "imov")
2329 (and (eq_attr "alternative" "1,2")
2330 (match_operand:HI 1 "aligned_operand" ""))
2331 (const_string "imov")
2332 (and (ne (symbol_ref "TARGET_MOVX")
2334 (eq_attr "alternative" "0,2"))
2335 (const_string "imovx")
2337 (const_string "imov")))
2339 (cond [(eq_attr "type" "imovx")
2341 (and (eq_attr "alternative" "1,2")
2342 (match_operand:HI 1 "aligned_operand" ""))
2344 (and (eq_attr "alternative" "0")
2345 (ior (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
2347 (eq (symbol_ref "TARGET_HIMODE_MATH")
2351 (const_string "HI")))])
2353 ;; Situation is quite tricky about when to choose full sized (SImode) move
2354 ;; over QImode moves. For Q_REG -> Q_REG move we use full size only for
2355 ;; partial register dependency machines (such as AMD Athlon), where QImode
2356 ;; moves issue extra dependency and for partial register stalls machines
2357 ;; that don't use QImode patterns (and QImode move cause stall on the next
2360 ;; For loads of Q_REG to NONQ_REG we use full sized moves except for partial
2361 ;; register stall machines with, where we use QImode instructions, since
2362 ;; partial register stall can be caused there. Then we use movzx.
2363 (define_insn "*movqi_internal"
2364 [(set (match_operand:QI 0 "nonimmediate_operand" "=q,q ,q ,r,r ,?r,m")
2365 (match_operand:QI 1 "general_operand" " q,qn,qm,q,rn,qm,qn"))]
2366 "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
2368 switch (get_attr_type (insn))
2371 gcc_assert (ANY_QI_REG_P (operands[1]) || MEM_P (operands[1]));
2372 return "movz{bl|x}\t{%1, %k0|%k0, %1}";
2374 if (get_attr_mode (insn) == MODE_SI)
2375 return "mov{l}\t{%k1, %k0|%k0, %k1}";
2377 return "mov{b}\t{%1, %0|%0, %1}";
2381 (cond [(and (eq_attr "alternative" "5")
2382 (not (match_operand:QI 1 "aligned_operand" "")))
2383 (const_string "imovx")
2384 (ne (symbol_ref "optimize_function_for_size_p (cfun)")
2386 (const_string "imov")
2387 (and (eq_attr "alternative" "3")
2388 (ior (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
2390 (eq (symbol_ref "TARGET_QIMODE_MATH")
2392 (const_string "imov")
2393 (eq_attr "alternative" "3,5")
2394 (const_string "imovx")
2395 (and (ne (symbol_ref "TARGET_MOVX")
2397 (eq_attr "alternative" "2"))
2398 (const_string "imovx")
2400 (const_string "imov")))
2402 (cond [(eq_attr "alternative" "3,4,5")
2404 (eq_attr "alternative" "6")
2406 (eq_attr "type" "imovx")
2408 (and (eq_attr "type" "imov")
2409 (and (eq_attr "alternative" "0,1")
2410 (and (ne (symbol_ref "TARGET_PARTIAL_REG_DEPENDENCY")
2412 (and (eq (symbol_ref "optimize_function_for_size_p (cfun)")
2414 (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
2417 ;; Avoid partial register stalls when not using QImode arithmetic
2418 (and (eq_attr "type" "imov")
2419 (and (eq_attr "alternative" "0,1")
2420 (and (ne (symbol_ref "TARGET_PARTIAL_REG_STALL")
2422 (eq (symbol_ref "TARGET_QIMODE_MATH")
2426 (const_string "QI")))])
2428 ;; Stores and loads of ax to arbitrary constant address.
2429 ;; We fake an second form of instruction to force reload to load address
2430 ;; into register when rax is not available
2431 (define_insn "*movabs<mode>_1"
2432 [(set (mem:SWI1248x (match_operand:DI 0 "x86_64_movabs_operand" "i,r"))
2433 (match_operand:SWI1248x 1 "nonmemory_operand" "a,er"))]
2434 "TARGET_64BIT && ix86_check_movabs (insn, 0)"
2436 movabs{<imodesuffix>}\t{%1, %P0|%P0, %1}
2437 mov{<imodesuffix>}\t{%1, %a0|%a0, %1}"
2438 [(set_attr "type" "imov")
2439 (set_attr "modrm" "0,*")
2440 (set_attr "length_address" "8,0")
2441 (set_attr "length_immediate" "0,*")
2442 (set_attr "memory" "store")
2443 (set_attr "mode" "<MODE>")])
2445 (define_insn "*movabs<mode>_2"
2446 [(set (match_operand:SWI1248x 0 "register_operand" "=a,r")
2447 (mem:SWI1248x (match_operand:DI 1 "x86_64_movabs_operand" "i,r")))]
2448 "TARGET_64BIT && ix86_check_movabs (insn, 1)"
2450 movabs{<imodesuffix>}\t{%P1, %0|%0, %P1}
2451 mov{<imodesuffix>}\t{%a1, %0|%0, %a1}"
2452 [(set_attr "type" "imov")
2453 (set_attr "modrm" "0,*")
2454 (set_attr "length_address" "8,0")
2455 (set_attr "length_immediate" "0")
2456 (set_attr "memory" "load")
2457 (set_attr "mode" "<MODE>")])
2459 (define_insn "*swap<mode>"
2460 [(set (match_operand:SWI48 0 "register_operand" "+r")
2461 (match_operand:SWI48 1 "register_operand" "+r"))
2465 "xchg{<imodesuffix>}\t%1, %0"
2466 [(set_attr "type" "imov")
2467 (set_attr "mode" "<MODE>")
2468 (set_attr "pent_pair" "np")
2469 (set_attr "athlon_decode" "vector")
2470 (set_attr "amdfam10_decode" "double")
2471 (set_attr "bdver1_decode" "double")])
2473 (define_insn "*swap<mode>_1"
2474 [(set (match_operand:SWI12 0 "register_operand" "+r")
2475 (match_operand:SWI12 1 "register_operand" "+r"))
2478 "!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)"
2480 [(set_attr "type" "imov")
2481 (set_attr "mode" "SI")
2482 (set_attr "pent_pair" "np")
2483 (set_attr "athlon_decode" "vector")
2484 (set_attr "amdfam10_decode" "double")
2485 (set_attr "bdver1_decode" "double")])
2487 ;; Not added amdfam10_decode since TARGET_PARTIAL_REG_STALL
2488 ;; is disabled for AMDFAM10
2489 (define_insn "*swap<mode>_2"
2490 [(set (match_operand:SWI12 0 "register_operand" "+<r>")
2491 (match_operand:SWI12 1 "register_operand" "+<r>"))
2494 "TARGET_PARTIAL_REG_STALL"
2495 "xchg{<imodesuffix>}\t%1, %0"
2496 [(set_attr "type" "imov")
2497 (set_attr "mode" "<MODE>")
2498 (set_attr "pent_pair" "np")
2499 (set_attr "athlon_decode" "vector")])
2501 (define_expand "movstrict<mode>"
2502 [(set (strict_low_part (match_operand:SWI12 0 "nonimmediate_operand" ""))
2503 (match_operand:SWI12 1 "general_operand" ""))]
2506 if (TARGET_PARTIAL_REG_STALL && optimize_function_for_speed_p (cfun))
2508 if (GET_CODE (operands[0]) == SUBREG
2509 && GET_MODE_CLASS (GET_MODE (SUBREG_REG (operands[0]))) != MODE_INT)
2511 /* Don't generate memory->memory moves, go through a register */
2512 if (MEM_P (operands[0]) && MEM_P (operands[1]))
2513 operands[1] = force_reg (<MODE>mode, operands[1]);
2516 (define_insn "*movstrict<mode>_1"
2517 [(set (strict_low_part
2518 (match_operand:SWI12 0 "nonimmediate_operand" "+<r>m,<r>"))
2519 (match_operand:SWI12 1 "general_operand" "<r>n,m"))]
2520 "(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
2521 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
2522 "mov{<imodesuffix>}\t{%1, %0|%0, %1}"
2523 [(set_attr "type" "imov")
2524 (set_attr "mode" "<MODE>")])
2526 (define_insn "*movstrict<mode>_xor"
2527 [(set (strict_low_part (match_operand:SWI12 0 "register_operand" "+<r>"))
2528 (match_operand:SWI12 1 "const0_operand" ""))
2529 (clobber (reg:CC FLAGS_REG))]
2531 "xor{<imodesuffix>}\t%0, %0"
2532 [(set_attr "type" "alu1")
2533 (set_attr "mode" "<MODE>")
2534 (set_attr "length_immediate" "0")])
2536 (define_insn "*mov<mode>_extv_1"
2537 [(set (match_operand:SWI24 0 "register_operand" "=R")
2538 (sign_extract:SWI24 (match_operand 1 "ext_register_operand" "Q")
2542 "movs{bl|x}\t{%h1, %k0|%k0, %h1}"
2543 [(set_attr "type" "imovx")
2544 (set_attr "mode" "SI")])
2546 (define_insn "*movqi_extv_1_rex64"
2547 [(set (match_operand:QI 0 "register_operand" "=Q,?R")
2548 (sign_extract:QI (match_operand 1 "ext_register_operand" "Q,Q")
2553 switch (get_attr_type (insn))
2556 return "movs{bl|x}\t{%h1, %k0|%k0, %h1}";
2558 return "mov{b}\t{%h1, %0|%0, %h1}";
2562 (if_then_else (ior (not (match_operand:QI 0 "QIreg_operand" ""))
2563 (ne (symbol_ref "TARGET_MOVX")
2565 (const_string "imovx")
2566 (const_string "imov")))
2568 (if_then_else (eq_attr "type" "imovx")
2570 (const_string "QI")))])
2572 (define_insn "*movqi_extv_1"
2573 [(set (match_operand:QI 0 "nonimmediate_operand" "=Qm,?r")
2574 (sign_extract:QI (match_operand 1 "ext_register_operand" "Q,Q")
2579 switch (get_attr_type (insn))
2582 return "movs{bl|x}\t{%h1, %k0|%k0, %h1}";
2584 return "mov{b}\t{%h1, %0|%0, %h1}";
2588 (if_then_else (and (match_operand:QI 0 "register_operand" "")
2589 (ior (not (match_operand:QI 0 "QIreg_operand" ""))
2590 (ne (symbol_ref "TARGET_MOVX")
2592 (const_string "imovx")
2593 (const_string "imov")))
2595 (if_then_else (eq_attr "type" "imovx")
2597 (const_string "QI")))])
2599 (define_insn "*mov<mode>_extzv_1"
2600 [(set (match_operand:SWI48 0 "register_operand" "=R")
2601 (zero_extract:SWI48 (match_operand 1 "ext_register_operand" "Q")
2605 "movz{bl|x}\t{%h1, %k0|%k0, %h1}"
2606 [(set_attr "type" "imovx")
2607 (set_attr "mode" "SI")])
2609 (define_insn "*movqi_extzv_2_rex64"
2610 [(set (match_operand:QI 0 "register_operand" "=Q,?R")
2612 (zero_extract:SI (match_operand 1 "ext_register_operand" "Q,Q")
2617 switch (get_attr_type (insn))
2620 return "movz{bl|x}\t{%h1, %k0|%k0, %h1}";
2622 return "mov{b}\t{%h1, %0|%0, %h1}";
2626 (if_then_else (ior (not (match_operand:QI 0 "QIreg_operand" ""))
2627 (ne (symbol_ref "TARGET_MOVX")
2629 (const_string "imovx")
2630 (const_string "imov")))
2632 (if_then_else (eq_attr "type" "imovx")
2634 (const_string "QI")))])
2636 (define_insn "*movqi_extzv_2"
2637 [(set (match_operand:QI 0 "nonimmediate_operand" "=Qm,?R")
2639 (zero_extract:SI (match_operand 1 "ext_register_operand" "Q,Q")
2644 switch (get_attr_type (insn))
2647 return "movz{bl|x}\t{%h1, %k0|%k0, %h1}";
2649 return "mov{b}\t{%h1, %0|%0, %h1}";
2653 (if_then_else (and (match_operand:QI 0 "register_operand" "")
2654 (ior (not (match_operand:QI 0 "QIreg_operand" ""))
2655 (ne (symbol_ref "TARGET_MOVX")
2657 (const_string "imovx")
2658 (const_string "imov")))
2660 (if_then_else (eq_attr "type" "imovx")
2662 (const_string "QI")))])
2664 (define_expand "mov<mode>_insv_1"
2665 [(set (zero_extract:SWI48 (match_operand 0 "ext_register_operand" "")
2668 (match_operand:SWI48 1 "nonmemory_operand" ""))])
2670 (define_insn "*mov<mode>_insv_1_rex64"
2671 [(set (zero_extract:SWI48x (match_operand 0 "ext_register_operand" "+Q")
2674 (match_operand:SWI48x 1 "nonmemory_operand" "Qn"))]
2676 "mov{b}\t{%b1, %h0|%h0, %b1}"
2677 [(set_attr "type" "imov")
2678 (set_attr "mode" "QI")])
2680 (define_insn "*movsi_insv_1"
2681 [(set (zero_extract:SI (match_operand 0 "ext_register_operand" "+Q")
2684 (match_operand:SI 1 "general_operand" "Qmn"))]
2686 "mov{b}\t{%b1, %h0|%h0, %b1}"
2687 [(set_attr "type" "imov")
2688 (set_attr "mode" "QI")])
2690 (define_insn "*movqi_insv_2"
2691 [(set (zero_extract:SI (match_operand 0 "ext_register_operand" "+Q")
2694 (lshiftrt:SI (match_operand:SI 1 "register_operand" "Q")
2697 "mov{b}\t{%h1, %h0|%h0, %h1}"
2698 [(set_attr "type" "imov")
2699 (set_attr "mode" "QI")])
2701 ;; Floating point push instructions.
2703 (define_insn "*pushtf"
2704 [(set (match_operand:TF 0 "push_operand" "=<,<,<")
2705 (match_operand:TF 1 "general_no_elim_operand" "x,Fo,*r"))]
2708 /* This insn should be already split before reg-stack. */
2711 [(set_attr "type" "multi")
2712 (set_attr "unit" "sse,*,*")
2713 (set_attr "mode" "TF,SI,SI")])
2715 ;; %%% Kill this when call knows how to work this out.
2717 [(set (match_operand:TF 0 "push_operand" "")
2718 (match_operand:TF 1 "sse_reg_operand" ""))]
2719 "TARGET_SSE2 && reload_completed"
2720 [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (const_int -16)))
2721 (set (mem:TF (reg:P SP_REG)) (match_dup 1))])
2723 (define_insn "*pushxf"
2724 [(set (match_operand:XF 0 "push_operand" "=<,<")
2725 (match_operand:XF 1 "general_no_elim_operand" "f,ro"))]
2726 "optimize_function_for_speed_p (cfun)"
2728 /* This insn should be already split before reg-stack. */
2731 [(set_attr "type" "multi")
2732 (set_attr "unit" "i387,*")
2733 (set_attr "mode" "XF,SI")])
2735 ;; Size of pushxf is 3 (for sub) + 2 (for fstp) + memory operand size.
2736 ;; Size of pushxf using integer instructions is 3+3*memory operand size
2737 ;; Pushing using integer instructions is longer except for constants
2738 ;; and direct memory references (assuming that any given constant is pushed
2739 ;; only once, but this ought to be handled elsewhere).
2741 (define_insn "*pushxf_nointeger"
2742 [(set (match_operand:XF 0 "push_operand" "=<,<")
2743 (match_operand:XF 1 "general_no_elim_operand" "f,*rFo"))]
2744 "optimize_function_for_size_p (cfun)"
2746 /* This insn should be already split before reg-stack. */
2749 [(set_attr "type" "multi")
2750 (set_attr "unit" "i387,*")
2751 (set_attr "mode" "XF,SI")])
2753 ;; %%% Kill this when call knows how to work this out.
2755 [(set (match_operand:XF 0 "push_operand" "")
2756 (match_operand:XF 1 "fp_register_operand" ""))]
2758 [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
2759 (set (mem:XF (reg:P SP_REG)) (match_dup 1))]
2760 "operands[2] = GEN_INT (-GET_MODE_SIZE (XFmode));")
2762 (define_insn "*pushdf_rex64"
2763 [(set (match_operand:DF 0 "push_operand" "=<,<,<")
2764 (match_operand:DF 1 "general_no_elim_operand" "f,Yd*rFm,Y2"))]
2767 /* This insn should be already split before reg-stack. */
2770 [(set_attr "type" "multi")
2771 (set_attr "unit" "i387,*,*")
2772 (set_attr "mode" "DF,DI,DF")])
2774 ;; Size of pushdf is 3 (for sub) + 2 (for fstp) + memory operand size.
2775 ;; Size of pushdf using integer instructions is 2+2*memory operand size
2776 ;; On the average, pushdf using integers can be still shorter.
2778 (define_insn "*pushdf"
2779 [(set (match_operand:DF 0 "push_operand" "=<,<,<")
2780 (match_operand:DF 1 "general_no_elim_operand" "f,Yd*rFo,Y2"))]
2783 /* This insn should be already split before reg-stack. */
2786 [(set_attr "type" "multi")
2787 (set_attr "unit" "i387,*,*")
2788 (set_attr "mode" "DF,DI,DF")])
2790 ;; %%% Kill this when call knows how to work this out.
2792 [(set (match_operand:DF 0 "push_operand" "")
2793 (match_operand:DF 1 "any_fp_register_operand" ""))]
2795 [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (const_int -8)))
2796 (set (mem:DF (reg:P SP_REG)) (match_dup 1))])
2798 (define_insn "*pushsf_rex64"
2799 [(set (match_operand:SF 0 "push_operand" "=X,X,X")
2800 (match_operand:SF 1 "nonmemory_no_elim_operand" "f,rF,x"))]
2803 /* Anything else should be already split before reg-stack. */
2804 gcc_assert (which_alternative == 1);
2805 return "push{q}\t%q1";
2807 [(set_attr "type" "multi,push,multi")
2808 (set_attr "unit" "i387,*,*")
2809 (set_attr "mode" "SF,DI,SF")])
2811 (define_insn "*pushsf"
2812 [(set (match_operand:SF 0 "push_operand" "=<,<,<")
2813 (match_operand:SF 1 "general_no_elim_operand" "f,rFm,x"))]
2816 /* Anything else should be already split before reg-stack. */
2817 gcc_assert (which_alternative == 1);
2818 return "push{l}\t%1";
2820 [(set_attr "type" "multi,push,multi")
2821 (set_attr "unit" "i387,*,*")
2822 (set_attr "mode" "SF,SI,SF")])
2824 ;; %%% Kill this when call knows how to work this out.
2826 [(set (match_operand:SF 0 "push_operand" "")
2827 (match_operand:SF 1 "any_fp_register_operand" ""))]
2829 [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
2830 (set (mem:SF (reg:P SP_REG)) (match_dup 1))]
2831 "operands[2] = GEN_INT (-GET_MODE_SIZE (<P:MODE>mode));")
2834 [(set (match_operand:SF 0 "push_operand" "")
2835 (match_operand:SF 1 "memory_operand" ""))]
2837 && (operands[2] = find_constant_src (insn))"
2838 [(set (match_dup 0) (match_dup 2))])
2841 [(set (match_operand 0 "push_operand" "")
2842 (match_operand 1 "general_operand" ""))]
2844 && (GET_MODE (operands[0]) == TFmode
2845 || GET_MODE (operands[0]) == XFmode
2846 || GET_MODE (operands[0]) == DFmode)
2847 && !ANY_FP_REG_P (operands[1])"
2849 "ix86_split_long_move (operands); DONE;")
2851 ;; Floating point move instructions.
2853 (define_expand "movtf"
2854 [(set (match_operand:TF 0 "nonimmediate_operand" "")
2855 (match_operand:TF 1 "nonimmediate_operand" ""))]
2858 ix86_expand_move (TFmode, operands);
2862 (define_expand "mov<mode>"
2863 [(set (match_operand:X87MODEF 0 "nonimmediate_operand" "")
2864 (match_operand:X87MODEF 1 "general_operand" ""))]
2866 "ix86_expand_move (<MODE>mode, operands); DONE;")
2868 (define_insn "*movtf_internal"
2869 [(set (match_operand:TF 0 "nonimmediate_operand" "=x,m,x,?*r ,!o")
2870 (match_operand:TF 1 "general_operand" "xm,x,C,*roF,F*r"))]
2872 && !(MEM_P (operands[0]) && MEM_P (operands[1]))
2873 && (!can_create_pseudo_p ()
2874 || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
2875 || GET_CODE (operands[1]) != CONST_DOUBLE
2876 || (optimize_function_for_size_p (cfun)
2877 && standard_sse_constant_p (operands[1])
2878 && !memory_operand (operands[0], TFmode))
2879 || (!TARGET_MEMORY_MISMATCH_STALL
2880 && memory_operand (operands[0], TFmode)))"
2882 switch (which_alternative)
2886 /* Handle misaligned load/store since we
2887 don't have movmisaligntf pattern. */
2888 if (misaligned_operand (operands[0], TFmode)
2889 || misaligned_operand (operands[1], TFmode))
2891 if (get_attr_mode (insn) == MODE_V4SF)
2892 return "%vmovups\t{%1, %0|%0, %1}";
2894 return "%vmovdqu\t{%1, %0|%0, %1}";
2898 if (get_attr_mode (insn) == MODE_V4SF)
2899 return "%vmovaps\t{%1, %0|%0, %1}";
2901 return "%vmovdqa\t{%1, %0|%0, %1}";
2905 return standard_sse_constant_opcode (insn, operands[1]);
2915 [(set_attr "type" "ssemov,ssemov,sselog1,*,*")
2916 (set_attr "prefix" "maybe_vex,maybe_vex,maybe_vex,*,*")
2918 (cond [(eq_attr "alternative" "0,2")
2920 (ne (symbol_ref "optimize_function_for_size_p (cfun)")
2922 (const_string "V4SF")
2923 (const_string "TI"))
2924 (eq_attr "alternative" "1")
2926 (ior (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
2928 (ne (symbol_ref "optimize_function_for_size_p (cfun)")
2930 (const_string "V4SF")
2931 (const_string "TI"))]
2932 (const_string "DI")))])
2934 ;; Possible store forwarding (partial memory) stall in alternative 4.
2935 (define_insn "*movxf_internal"
2936 [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f,?Yx*r ,!o")
2937 (match_operand:XF 1 "general_operand" "fm,f,G,Yx*roF,FYx*r"))]
2938 "!(MEM_P (operands[0]) && MEM_P (operands[1]))
2939 && (!can_create_pseudo_p ()
2940 || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
2941 || GET_CODE (operands[1]) != CONST_DOUBLE
2942 || (optimize_function_for_size_p (cfun)
2943 && standard_80387_constant_p (operands[1]) > 0
2944 && !memory_operand (operands[0], XFmode))
2945 || (!TARGET_MEMORY_MISMATCH_STALL
2946 && memory_operand (operands[0], XFmode)))"
2948 switch (which_alternative)
2952 return output_387_reg_move (insn, operands);
2955 return standard_80387_constant_opcode (operands[1]);
2965 [(set_attr "type" "fmov,fmov,fmov,multi,multi")
2966 (set_attr "mode" "XF,XF,XF,SI,SI")])
2968 (define_insn "*movdf_internal_rex64"
2969 [(set (match_operand:DF 0 "nonimmediate_operand"
2970 "=f,m,f,?r,?m,?r,!o,Y2*x,Y2*x,Y2*x,m ,Yi,r ")
2971 (match_operand:DF 1 "general_operand"
2972 "fm,f,G,rm,r ,F ,F ,C ,Y2*x,m ,Y2*x,r ,Yi"))]
2973 "TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))
2974 && (!can_create_pseudo_p ()
2975 || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
2976 || GET_CODE (operands[1]) != CONST_DOUBLE
2977 || (optimize_function_for_size_p (cfun)
2978 && ((!(TARGET_SSE2 && TARGET_SSE_MATH)
2979 && standard_80387_constant_p (operands[1]) > 0)
2980 || (TARGET_SSE2 && TARGET_SSE_MATH
2981 && standard_sse_constant_p (operands[1]))))
2982 || memory_operand (operands[0], DFmode))"
2984 switch (which_alternative)
2988 return output_387_reg_move (insn, operands);
2991 return standard_80387_constant_opcode (operands[1]);
2995 return "mov{q}\t{%1, %0|%0, %1}";
2998 return "movabs{q}\t{%1, %0|%0, %1}";
3004 return standard_sse_constant_opcode (insn, operands[1]);
3009 switch (get_attr_mode (insn))
3012 if (!TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
3013 return "%vmovapd\t{%1, %0|%0, %1}";
3015 return "%vmovaps\t{%1, %0|%0, %1}";
3018 return "%vmovq\t{%1, %0|%0, %1}";
3020 if (TARGET_AVX && REG_P (operands[0]) && REG_P (operands[1]))
3021 return "vmovsd\t{%1, %0, %0|%0, %0, %1}";
3022 return "%vmovsd\t{%1, %0|%0, %1}";
3024 return "%vmovlpd\t{%1, %d0|%d0, %1}";
3026 return "%vmovlps\t{%1, %d0|%d0, %1}";
3033 /* Handle broken assemblers that require movd instead of movq. */
3034 return "%vmovd\t{%1, %0|%0, %1}";
3040 [(set_attr "type" "fmov,fmov,fmov,imov,imov,imov,multi,sselog1,ssemov,ssemov,ssemov,ssemov,ssemov")
3043 (and (eq_attr "alternative" "5") (eq_attr "type" "imov"))
3045 (const_string "*")))
3046 (set (attr "length_immediate")
3048 (and (eq_attr "alternative" "5") (eq_attr "type" "imov"))
3050 (const_string "*")))
3051 (set (attr "prefix")
3052 (if_then_else (eq_attr "alternative" "0,1,2,3,4,5,6")
3053 (const_string "orig")
3054 (const_string "maybe_vex")))
3055 (set (attr "prefix_data16")
3056 (if_then_else (eq_attr "mode" "V1DF")
3058 (const_string "*")))
3060 (cond [(eq_attr "alternative" "0,1,2")
3062 (eq_attr "alternative" "3,4,5,6,11,12")
3065 /* xorps is one byte shorter. */
3066 (eq_attr "alternative" "7")
3067 (cond [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
3069 (const_string "V4SF")
3070 (ne (symbol_ref "TARGET_SSE_LOAD0_BY_PXOR")
3074 (const_string "V2DF"))
3076 /* For architectures resolving dependencies on
3077 whole SSE registers use APD move to break dependency
3078 chains, otherwise use short move to avoid extra work.
3080 movaps encodes one byte shorter. */
3081 (eq_attr "alternative" "8")
3083 [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
3085 (const_string "V4SF")
3086 (ne (symbol_ref "TARGET_SSE_PARTIAL_REG_DEPENDENCY")
3088 (const_string "V2DF")
3090 (const_string "DF"))
3091 /* For architectures resolving dependencies on register
3092 parts we may avoid extra work to zero out upper part
3094 (eq_attr "alternative" "9")
3096 (ne (symbol_ref "TARGET_SSE_SPLIT_REGS")
3098 (const_string "V1DF")
3099 (const_string "DF"))
3101 (const_string "DF")))])
3103 ;; Possible store forwarding (partial memory) stall in alternative 4.
3104 (define_insn "*movdf_internal"
3105 [(set (match_operand:DF 0 "nonimmediate_operand"
3106 "=f,m,f,?Yd*r ,!o ,Y2*x,Y2*x,Y2*x,m ")
3107 (match_operand:DF 1 "general_operand"
3108 "fm,f,G,Yd*roF,FYd*r,C ,Y2*x,m ,Y2*x"))]
3109 "!TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))
3110 && (!can_create_pseudo_p ()
3111 || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
3112 || GET_CODE (operands[1]) != CONST_DOUBLE
3113 || (optimize_function_for_size_p (cfun)
3114 && ((!(TARGET_SSE2 && TARGET_SSE_MATH)
3115 && standard_80387_constant_p (operands[1]) > 0)
3116 || (TARGET_SSE2 && TARGET_SSE_MATH
3117 && standard_sse_constant_p (operands[1])))
3118 && !memory_operand (operands[0], DFmode))
3119 || (!TARGET_MEMORY_MISMATCH_STALL
3120 && memory_operand (operands[0], DFmode)))"
3122 switch (which_alternative)
3126 return output_387_reg_move (insn, operands);
3129 return standard_80387_constant_opcode (operands[1]);
3136 return standard_sse_constant_opcode (insn, operands[1]);
3141 switch (get_attr_mode (insn))
3144 if (!TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
3145 return "%vmovapd\t{%1, %0|%0, %1}";
3147 return "%vmovaps\t{%1, %0|%0, %1}";
3150 return "%vmovq\t{%1, %0|%0, %1}";
3152 if (TARGET_AVX && REG_P (operands[0]) && REG_P (operands[1]))
3153 return "vmovsd\t{%1, %0, %0|%0, %0, %1}";
3154 return "%vmovsd\t{%1, %0|%0, %1}";
3156 return "%vmovlpd\t{%1, %d0|%d0, %1}";
3158 return "%vmovlps\t{%1, %d0|%d0, %1}";
3167 [(set_attr "type" "fmov,fmov,fmov,multi,multi,sselog1,ssemov,ssemov,ssemov")
3168 (set (attr "prefix")
3169 (if_then_else (eq_attr "alternative" "0,1,2,3,4")
3170 (const_string "orig")
3171 (const_string "maybe_vex")))
3172 (set (attr "prefix_data16")
3173 (if_then_else (eq_attr "mode" "V1DF")
3175 (const_string "*")))
3177 (cond [(eq_attr "alternative" "0,1,2")
3179 (eq_attr "alternative" "3,4")
3182 /* For SSE1, we have many fewer alternatives. */
3183 (eq (symbol_ref "TARGET_SSE2") (const_int 0))
3185 (eq_attr "alternative" "5,6")
3186 (const_string "V4SF")
3187 (const_string "V2SF"))
3189 /* xorps is one byte shorter. */
3190 (eq_attr "alternative" "5")
3191 (cond [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
3193 (const_string "V4SF")
3194 (ne (symbol_ref "TARGET_SSE_LOAD0_BY_PXOR")
3198 (const_string "V2DF"))
3200 /* For architectures resolving dependencies on
3201 whole SSE registers use APD move to break dependency
3202 chains, otherwise use short move to avoid extra work.
3204 movaps encodes one byte shorter. */
3205 (eq_attr "alternative" "6")
3207 [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
3209 (const_string "V4SF")
3210 (ne (symbol_ref "TARGET_SSE_PARTIAL_REG_DEPENDENCY")
3212 (const_string "V2DF")
3214 (const_string "DF"))
3215 /* For architectures resolving dependencies on register
3216 parts we may avoid extra work to zero out upper part
3218 (eq_attr "alternative" "7")
3220 (ne (symbol_ref "TARGET_SSE_SPLIT_REGS")
3222 (const_string "V1DF")
3223 (const_string "DF"))
3225 (const_string "DF")))])
3227 (define_insn "*movsf_internal"
3228 [(set (match_operand:SF 0 "nonimmediate_operand"
3229 "=f,m,f,?r ,?m,x,x,x,m,!*y,!m,!*y,?Yi,?r,!*Ym,!r")
3230 (match_operand:SF 1 "general_operand"
3231 "fm,f,G,rmF,Fr,C,x,m,x,m ,*y,*y ,r ,Yi,r ,*Ym"))]
3232 "!(MEM_P (operands[0]) && MEM_P (operands[1]))
3233 && (!can_create_pseudo_p ()
3234 || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
3235 || GET_CODE (operands[1]) != CONST_DOUBLE
3236 || (optimize_function_for_size_p (cfun)
3237 && ((!TARGET_SSE_MATH
3238 && standard_80387_constant_p (operands[1]) > 0)
3240 && standard_sse_constant_p (operands[1]))))
3241 || memory_operand (operands[0], SFmode))"
3243 switch (which_alternative)
3247 return output_387_reg_move (insn, operands);
3250 return standard_80387_constant_opcode (operands[1]);
3254 return "mov{l}\t{%1, %0|%0, %1}";
3257 return standard_sse_constant_opcode (insn, operands[1]);
3260 if (get_attr_mode (insn) == MODE_V4SF)
3261 return "%vmovaps\t{%1, %0|%0, %1}";
3263 return "vmovss\t{%1, %0, %0|%0, %0, %1}";
3267 return "%vmovss\t{%1, %0|%0, %1}";
3273 return "movd\t{%1, %0|%0, %1}";
3276 return "movq\t{%1, %0|%0, %1}";
3280 return "%vmovd\t{%1, %0|%0, %1}";
3286 [(set_attr "type" "fmov,fmov,fmov,imov,imov,sselog1,ssemov,ssemov,ssemov,mmxmov,mmxmov,mmxmov,ssemov,ssemov,mmxmov,mmxmov")
3287 (set (attr "prefix")
3288 (if_then_else (eq_attr "alternative" "5,6,7,8,12,13")
3289 (const_string "maybe_vex")
3290 (const_string "orig")))
3292 (cond [(eq_attr "alternative" "3,4,9,10")
3294 (eq_attr "alternative" "5")
3296 (and (and (ne (symbol_ref "TARGET_SSE_LOAD0_BY_PXOR")
3298 (ne (symbol_ref "TARGET_SSE2")
3300 (eq (symbol_ref "optimize_function_for_size_p (cfun)")
3303 (const_string "V4SF"))
3304 /* For architectures resolving dependencies on
3305 whole SSE registers use APS move to break dependency
3306 chains, otherwise use short move to avoid extra work.
3308 Do the same for architectures resolving dependencies on
3309 the parts. While in DF mode it is better to always handle
3310 just register parts, the SF mode is different due to lack
3311 of instructions to load just part of the register. It is
3312 better to maintain the whole registers in single format
3313 to avoid problems on using packed logical operations. */
3314 (eq_attr "alternative" "6")
3316 (ior (ne (symbol_ref "TARGET_SSE_PARTIAL_REG_DEPENDENCY")
3318 (ne (symbol_ref "TARGET_SSE_SPLIT_REGS")
3320 (const_string "V4SF")
3321 (const_string "SF"))
3322 (eq_attr "alternative" "11")
3323 (const_string "DI")]
3324 (const_string "SF")))])
3327 [(set (match_operand 0 "any_fp_register_operand" "")
3328 (match_operand 1 "memory_operand" ""))]
3330 && (GET_MODE (operands[0]) == TFmode
3331 || GET_MODE (operands[0]) == XFmode
3332 || GET_MODE (operands[0]) == DFmode
3333 || GET_MODE (operands[0]) == SFmode)
3334 && (operands[2] = find_constant_src (insn))"
3335 [(set (match_dup 0) (match_dup 2))]
3337 rtx c = operands[2];
3338 int r = REGNO (operands[0]);
3340 if ((SSE_REGNO_P (r) && !standard_sse_constant_p (c))
3341 || (FP_REGNO_P (r) && standard_80387_constant_p (c) < 1))
3346 [(set (match_operand 0 "any_fp_register_operand" "")
3347 (float_extend (match_operand 1 "memory_operand" "")))]
3349 && (GET_MODE (operands[0]) == TFmode
3350 || GET_MODE (operands[0]) == XFmode
3351 || GET_MODE (operands[0]) == DFmode)
3352 && (operands[2] = find_constant_src (insn))"
3353 [(set (match_dup 0) (match_dup 2))]
3355 rtx c = operands[2];
3356 int r = REGNO (operands[0]);
3358 if ((SSE_REGNO_P (r) && !standard_sse_constant_p (c))
3359 || (FP_REGNO_P (r) && standard_80387_constant_p (c) < 1))
3363 ;; Split the load of -0.0 or -1.0 into fldz;fchs or fld1;fchs sequence
3365 [(set (match_operand:X87MODEF 0 "fp_register_operand" "")
3366 (match_operand:X87MODEF 1 "immediate_operand" ""))]
3368 && (standard_80387_constant_p (operands[1]) == 8
3369 || standard_80387_constant_p (operands[1]) == 9)"
3370 [(set (match_dup 0)(match_dup 1))
3372 (neg:X87MODEF (match_dup 0)))]
3376 REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
3377 if (real_isnegzero (&r))
3378 operands[1] = CONST0_RTX (<MODE>mode);
3380 operands[1] = CONST1_RTX (<MODE>mode);
3384 [(set (match_operand 0 "nonimmediate_operand" "")
3385 (match_operand 1 "general_operand" ""))]
3387 && (GET_MODE (operands[0]) == TFmode
3388 || GET_MODE (operands[0]) == XFmode
3389 || GET_MODE (operands[0]) == DFmode)
3390 && !(ANY_FP_REG_P (operands[0]) || ANY_FP_REG_P (operands[1]))"
3392 "ix86_split_long_move (operands); DONE;")
3394 (define_insn "swapxf"
3395 [(set (match_operand:XF 0 "register_operand" "+f")
3396 (match_operand:XF 1 "register_operand" "+f"))
3401 if (STACK_TOP_P (operands[0]))
3406 [(set_attr "type" "fxch")
3407 (set_attr "mode" "XF")])
3409 (define_insn "*swap<mode>"
3410 [(set (match_operand:MODEF 0 "fp_register_operand" "+f")
3411 (match_operand:MODEF 1 "fp_register_operand" "+f"))
3414 "TARGET_80387 || reload_completed"
3416 if (STACK_TOP_P (operands[0]))
3421 [(set_attr "type" "fxch")
3422 (set_attr "mode" "<MODE>")])
3424 ;; Zero extension instructions
3426 (define_expand "zero_extendsidi2"
3427 [(set (match_operand:DI 0 "nonimmediate_operand" "")
3428 (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "")))]
3433 emit_insn (gen_zero_extendsidi2_1 (operands[0], operands[1]));
3438 (define_insn "*zero_extendsidi2_rex64"
3439 [(set (match_operand:DI 0 "nonimmediate_operand" "=r,o,?*Ym,?*y,?*Yi,*Y2")
3441 (match_operand:SI 1 "nonimmediate_operand" "rm,0,r ,m ,r ,m")))]
3444 mov\t{%k1, %k0|%k0, %k1}
3446 movd\t{%1, %0|%0, %1}
3447 movd\t{%1, %0|%0, %1}
3448 %vmovd\t{%1, %0|%0, %1}
3449 %vmovd\t{%1, %0|%0, %1}"
3450 [(set_attr "type" "imovx,imov,mmxmov,mmxmov,ssemov,ssemov")
3451 (set_attr "prefix" "orig,*,orig,orig,maybe_vex,maybe_vex")
3452 (set_attr "prefix_0f" "0,*,*,*,*,*")
3453 (set_attr "mode" "SI,DI,DI,DI,TI,TI")])
3456 [(set (match_operand:DI 0 "memory_operand" "")
3457 (zero_extend:DI (match_dup 0)))]
3459 [(set (match_dup 4) (const_int 0))]
3460 "split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);")
3462 ;; %%% Kill me once multi-word ops are sane.
3463 (define_insn "zero_extendsidi2_1"
3464 [(set (match_operand:DI 0 "nonimmediate_operand" "=r,?r,?o,?*Ym,?*y,?*Yi,*Y2")
3466 (match_operand:SI 1 "nonimmediate_operand" "0,rm,r ,r ,m ,r ,m")))
3467 (clobber (reg:CC FLAGS_REG))]
3473 movd\t{%1, %0|%0, %1}
3474 movd\t{%1, %0|%0, %1}
3475 %vmovd\t{%1, %0|%0, %1}
3476 %vmovd\t{%1, %0|%0, %1}"
3477 [(set_attr "type" "multi,multi,multi,mmxmov,mmxmov,ssemov,ssemov")
3478 (set_attr "prefix" "*,*,*,orig,orig,maybe_vex,maybe_vex")
3479 (set_attr "mode" "SI,SI,SI,DI,DI,TI,TI")])
3482 [(set (match_operand:DI 0 "register_operand" "")
3483 (zero_extend:DI (match_operand:SI 1 "register_operand" "")))
3484 (clobber (reg:CC FLAGS_REG))]
3485 "!TARGET_64BIT && reload_completed
3486 && true_regnum (operands[0]) == true_regnum (operands[1])"
3487 [(set (match_dup 4) (const_int 0))]
3488 "split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);")
3491 [(set (match_operand:DI 0 "nonimmediate_operand" "")
3492 (zero_extend:DI (match_operand:SI 1 "general_operand" "")))
3493 (clobber (reg:CC FLAGS_REG))]
3494 "!TARGET_64BIT && reload_completed
3495 && !(MMX_REG_P (operands[0]) || SSE_REG_P (operands[0]))"
3496 [(set (match_dup 3) (match_dup 1))
3497 (set (match_dup 4) (const_int 0))]
3498 "split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);")
3500 (define_insn "zero_extend<mode>di2"
3501 [(set (match_operand:DI 0 "register_operand" "=r")
3503 (match_operand:SWI12 1 "nonimmediate_operand" "<r>m")))]
3505 "movz{<imodesuffix>l|x}\t{%1, %k0|%k0, %1}"
3506 [(set_attr "type" "imovx")
3507 (set_attr "mode" "SI")])
3509 (define_expand "zero_extendhisi2"
3510 [(set (match_operand:SI 0 "register_operand" "")
3511 (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "")))]
3514 if (TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun))
3516 operands[1] = force_reg (HImode, operands[1]);
3517 emit_insn (gen_zero_extendhisi2_and (operands[0], operands[1]));
3522 (define_insn_and_split "zero_extendhisi2_and"
3523 [(set (match_operand:SI 0 "register_operand" "=r")
3524 (zero_extend:SI (match_operand:HI 1 "register_operand" "0")))
3525 (clobber (reg:CC FLAGS_REG))]
3526 "TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun)"
3528 "&& reload_completed"
3529 [(parallel [(set (match_dup 0) (and:SI (match_dup 0) (const_int 65535)))
3530 (clobber (reg:CC FLAGS_REG))])]
3532 [(set_attr "type" "alu1")
3533 (set_attr "mode" "SI")])
3535 (define_insn "*zero_extendhisi2_movzwl"
3536 [(set (match_operand:SI 0 "register_operand" "=r")
3537 (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "rm")))]
3538 "!TARGET_ZERO_EXTEND_WITH_AND
3539 || optimize_function_for_size_p (cfun)"
3540 "movz{wl|x}\t{%1, %0|%0, %1}"
3541 [(set_attr "type" "imovx")
3542 (set_attr "mode" "SI")])
3544 (define_expand "zero_extendqi<mode>2"
3546 [(set (match_operand:SWI24 0 "register_operand" "")
3547 (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "")))
3548 (clobber (reg:CC FLAGS_REG))])])
3550 (define_insn "*zero_extendqi<mode>2_and"
3551 [(set (match_operand:SWI24 0 "register_operand" "=r,?&q")
3552 (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "0,qm")))
3553 (clobber (reg:CC FLAGS_REG))]
3554 "TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun)"
3556 [(set_attr "type" "alu1")
3557 (set_attr "mode" "<MODE>")])
3559 ;; When source and destination does not overlap, clear destination
3560 ;; first and then do the movb
3562 [(set (match_operand:SWI24 0 "register_operand" "")
3563 (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "")))
3564 (clobber (reg:CC FLAGS_REG))]
3566 && (TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun))
3567 && ANY_QI_REG_P (operands[0])
3568 && (ANY_QI_REG_P (operands[1]) || MEM_P (operands[1]))
3569 && !reg_overlap_mentioned_p (operands[0], operands[1])"
3570 [(set (strict_low_part (match_dup 2)) (match_dup 1))]
3572 operands[2] = gen_lowpart (QImode, operands[0]);
3573 ix86_expand_clear (operands[0]);
3576 (define_insn "*zero_extendqi<mode>2_movzbl_and"
3577 [(set (match_operand:SWI24 0 "register_operand" "=r,r")
3578 (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "qm,0")))
3579 (clobber (reg:CC FLAGS_REG))]
3580 "!TARGET_ZERO_EXTEND_WITH_AND || optimize_function_for_size_p (cfun)"
3582 [(set_attr "type" "imovx,alu1")
3583 (set_attr "mode" "<MODE>")])
3585 ;; For the movzbl case strip only the clobber
3587 [(set (match_operand:SWI24 0 "register_operand" "")
3588 (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "")))
3589 (clobber (reg:CC FLAGS_REG))]
3591 && (!TARGET_ZERO_EXTEND_WITH_AND || optimize_function_for_size_p (cfun))
3592 && (!REG_P (operands[1]) || ANY_QI_REG_P (operands[1]))"
3594 (zero_extend:SWI24 (match_dup 1)))])
3596 ; zero extend to SImode to avoid partial register stalls
3597 (define_insn "*zero_extendqi<mode>2_movzbl"
3598 [(set (match_operand:SWI24 0 "register_operand" "=r")
3599 (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "qm")))]
3601 && (!TARGET_ZERO_EXTEND_WITH_AND || optimize_function_for_size_p (cfun))"
3602 "movz{bl|x}\t{%1, %k0|%k0, %1}"
3603 [(set_attr "type" "imovx")
3604 (set_attr "mode" "SI")])
3606 ;; Rest is handled by single and.
3608 [(set (match_operand:SWI24 0 "register_operand" "")
3609 (zero_extend:SWI24 (match_operand:QI 1 "register_operand" "")))
3610 (clobber (reg:CC FLAGS_REG))]
3612 && true_regnum (operands[0]) == true_regnum (operands[1])"
3613 [(parallel [(set (match_dup 0) (and:SWI24 (match_dup 0) (const_int 255)))
3614 (clobber (reg:CC FLAGS_REG))])])
3616 ;; Sign extension instructions
3618 (define_expand "extendsidi2"
3619 [(set (match_operand:DI 0 "register_operand" "")
3620 (sign_extend:DI (match_operand:SI 1 "register_operand" "")))]
3625 emit_insn (gen_extendsidi2_1 (operands[0], operands[1]));
3630 (define_insn "*extendsidi2_rex64"
3631 [(set (match_operand:DI 0 "register_operand" "=*a,r")
3632 (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "*0,rm")))]
3636 movs{lq|x}\t{%1, %0|%0, %1}"
3637 [(set_attr "type" "imovx")
3638 (set_attr "mode" "DI")
3639 (set_attr "prefix_0f" "0")
3640 (set_attr "modrm" "0,1")])
3642 (define_insn "extendsidi2_1"
3643 [(set (match_operand:DI 0 "nonimmediate_operand" "=*A,r,?r,?*o")
3644 (sign_extend:DI (match_operand:SI 1 "register_operand" "0,0,r,r")))
3645 (clobber (reg:CC FLAGS_REG))
3646 (clobber (match_scratch:SI 2 "=X,X,X,&r"))]
3650 ;; Extend to memory case when source register does die.
3652 [(set (match_operand:DI 0 "memory_operand" "")
3653 (sign_extend:DI (match_operand:SI 1 "register_operand" "")))
3654 (clobber (reg:CC FLAGS_REG))
3655 (clobber (match_operand:SI 2 "register_operand" ""))]
3657 && dead_or_set_p (insn, operands[1])
3658 && !reg_mentioned_p (operands[1], operands[0]))"
3659 [(set (match_dup 3) (match_dup 1))
3660 (parallel [(set (match_dup 1) (ashiftrt:SI (match_dup 1) (const_int 31)))
3661 (clobber (reg:CC FLAGS_REG))])
3662 (set (match_dup 4) (match_dup 1))]
3663 "split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);")
3665 ;; Extend to memory case when source register does not die.
3667 [(set (match_operand:DI 0 "memory_operand" "")
3668 (sign_extend:DI (match_operand:SI 1 "register_operand" "")))
3669 (clobber (reg:CC FLAGS_REG))
3670 (clobber (match_operand:SI 2 "register_operand" ""))]
3674 split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);
3676 emit_move_insn (operands[3], operands[1]);
3678 /* Generate a cltd if possible and doing so it profitable. */
3679 if ((optimize_function_for_size_p (cfun) || TARGET_USE_CLTD)
3680 && true_regnum (operands[1]) == AX_REG
3681 && true_regnum (operands[2]) == DX_REG)
3683 emit_insn (gen_ashrsi3_cvt (operands[2], operands[1], GEN_INT (31)));
3687 emit_move_insn (operands[2], operands[1]);
3688 emit_insn (gen_ashrsi3_cvt (operands[2], operands[2], GEN_INT (31)));
3690 emit_move_insn (operands[4], operands[2]);
3694 ;; Extend to register case. Optimize case where source and destination
3695 ;; registers match and cases where we can use cltd.
3697 [(set (match_operand:DI 0 "register_operand" "")
3698 (sign_extend:DI (match_operand:SI 1 "register_operand" "")))
3699 (clobber (reg:CC FLAGS_REG))
3700 (clobber (match_scratch:SI 2 ""))]
3704 split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);
3706 if (true_regnum (operands[3]) != true_regnum (operands[1]))
3707 emit_move_insn (operands[3], operands[1]);
3709 /* Generate a cltd if possible and doing so it profitable. */
3710 if ((optimize_function_for_size_p (cfun) || TARGET_USE_CLTD)
3711 && true_regnum (operands[3]) == AX_REG
3712 && true_regnum (operands[4]) == DX_REG)
3714 emit_insn (gen_ashrsi3_cvt (operands[4], operands[3], GEN_INT (31)));
3718 if (true_regnum (operands[4]) != true_regnum (operands[1]))
3719 emit_move_insn (operands[4], operands[1]);
3721 emit_insn (gen_ashrsi3_cvt (operands[4], operands[4], GEN_INT (31)));
3725 (define_insn "extend<mode>di2"
3726 [(set (match_operand:DI 0 "register_operand" "=r")
3728 (match_operand:SWI12 1 "nonimmediate_operand" "<r>m")))]
3730 "movs{<imodesuffix>q|x}\t{%1, %0|%0, %1}"
3731 [(set_attr "type" "imovx")
3732 (set_attr "mode" "DI")])
3734 (define_insn "extendhisi2"
3735 [(set (match_operand:SI 0 "register_operand" "=*a,r")
3736 (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "*0,rm")))]
3739 switch (get_attr_prefix_0f (insn))
3742 return "{cwtl|cwde}";
3744 return "movs{wl|x}\t{%1, %0|%0, %1}";
3747 [(set_attr "type" "imovx")
3748 (set_attr "mode" "SI")
3749 (set (attr "prefix_0f")
3750 ;; movsx is short decodable while cwtl is vector decoded.
3751 (if_then_else (and (eq_attr "cpu" "!k6")
3752 (eq_attr "alternative" "0"))
3754 (const_string "1")))
3756 (if_then_else (eq_attr "prefix_0f" "0")
3758 (const_string "1")))])
3760 (define_insn "*extendhisi2_zext"
3761 [(set (match_operand:DI 0 "register_operand" "=*a,r")
3764 (match_operand:HI 1 "nonimmediate_operand" "*0,rm"))))]
3767 switch (get_attr_prefix_0f (insn))
3770 return "{cwtl|cwde}";
3772 return "movs{wl|x}\t{%1, %k0|%k0, %1}";
3775 [(set_attr "type" "imovx")
3776 (set_attr "mode" "SI")
3777 (set (attr "prefix_0f")
3778 ;; movsx is short decodable while cwtl is vector decoded.
3779 (if_then_else (and (eq_attr "cpu" "!k6")
3780 (eq_attr "alternative" "0"))
3782 (const_string "1")))
3784 (if_then_else (eq_attr "prefix_0f" "0")
3786 (const_string "1")))])
3788 (define_insn "extendqisi2"
3789 [(set (match_operand:SI 0 "register_operand" "=r")
3790 (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "qm")))]
3792 "movs{bl|x}\t{%1, %0|%0, %1}"
3793 [(set_attr "type" "imovx")
3794 (set_attr "mode" "SI")])
3796 (define_insn "*extendqisi2_zext"
3797 [(set (match_operand:DI 0 "register_operand" "=r")
3799 (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "qm"))))]
3801 "movs{bl|x}\t{%1, %k0|%k0, %1}"
3802 [(set_attr "type" "imovx")
3803 (set_attr "mode" "SI")])
3805 (define_insn "extendqihi2"
3806 [(set (match_operand:HI 0 "register_operand" "=*a,r")
3807 (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "*0,qm")))]
3810 switch (get_attr_prefix_0f (insn))
3813 return "{cbtw|cbw}";
3815 return "movs{bw|x}\t{%1, %0|%0, %1}";
3818 [(set_attr "type" "imovx")
3819 (set_attr "mode" "HI")
3820 (set (attr "prefix_0f")
3821 ;; movsx is short decodable while cwtl is vector decoded.
3822 (if_then_else (and (eq_attr "cpu" "!k6")
3823 (eq_attr "alternative" "0"))
3825 (const_string "1")))
3827 (if_then_else (eq_attr "prefix_0f" "0")
3829 (const_string "1")))])
3831 ;; Conversions between float and double.
3833 ;; These are all no-ops in the model used for the 80387.
3834 ;; So just emit moves.
3836 ;; %%% Kill these when call knows how to work out a DFmode push earlier.
3838 [(set (match_operand:DF 0 "push_operand" "")
3839 (float_extend:DF (match_operand:SF 1 "fp_register_operand" "")))]
3841 [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (const_int -8)))
3842 (set (mem:DF (reg:P SP_REG)) (float_extend:DF (match_dup 1)))])
3845 [(set (match_operand:XF 0 "push_operand" "")
3846 (float_extend:XF (match_operand:MODEF 1 "fp_register_operand" "")))]
3848 [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
3849 (set (mem:XF (reg:P SP_REG)) (float_extend:XF (match_dup 1)))]
3850 "operands[2] = GEN_INT (-GET_MODE_SIZE (XFmode));")
3852 (define_expand "extendsfdf2"
3853 [(set (match_operand:DF 0 "nonimmediate_operand" "")
3854 (float_extend:DF (match_operand:SF 1 "general_operand" "")))]
3855 "TARGET_80387 || (TARGET_SSE2 && TARGET_SSE_MATH)"
3857 /* ??? Needed for compress_float_constant since all fp constants
3858 are TARGET_LEGITIMATE_CONSTANT_P. */
3859 if (GET_CODE (operands[1]) == CONST_DOUBLE)
3861 if ((!TARGET_SSE2 || TARGET_MIX_SSE_I387)
3862 && standard_80387_constant_p (operands[1]) > 0)
3864 operands[1] = simplify_const_unary_operation
3865 (FLOAT_EXTEND, DFmode, operands[1], SFmode);
3866 emit_move_insn_1 (operands[0], operands[1]);
3869 operands[1] = validize_mem (force_const_mem (SFmode, operands[1]));
3873 /* For converting SF(xmm2) to DF(xmm1), use the following code instead of
3875 unpcklps xmm2,xmm2 ; packed conversion might crash on signaling NaNs
3877 We do the conversion post reload to avoid producing of 128bit spills
3878 that might lead to ICE on 32bit target. The sequence unlikely combine
3881 [(set (match_operand:DF 0 "register_operand" "")
3883 (match_operand:SF 1 "nonimmediate_operand" "")))]
3884 "TARGET_USE_VECTOR_FP_CONVERTS
3885 && optimize_insn_for_speed_p ()
3886 && reload_completed && SSE_REG_P (operands[0])"
3891 (parallel [(const_int 0) (const_int 1)]))))]
3893 operands[2] = simplify_gen_subreg (V2DFmode, operands[0], DFmode, 0);
3894 operands[3] = simplify_gen_subreg (V4SFmode, operands[0], DFmode, 0);
3895 /* Use movss for loading from memory, unpcklps reg, reg for registers.
3896 Try to avoid move when unpacking can be done in source. */
3897 if (REG_P (operands[1]))
3899 /* If it is unsafe to overwrite upper half of source, we need
3900 to move to destination and unpack there. */
3901 if ((ORIGINAL_REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
3902 || PSEUDO_REGNO_BYTES (ORIGINAL_REGNO (operands[1])) > 4)
3903 && true_regnum (operands[0]) != true_regnum (operands[1]))
3905 rtx tmp = gen_rtx_REG (SFmode, true_regnum (operands[0]));
3906 emit_move_insn (tmp, operands[1]);
3909 operands[3] = simplify_gen_subreg (V4SFmode, operands[1], SFmode, 0);
3910 emit_insn (gen_vec_interleave_lowv4sf (operands[3], operands[3],
3914 emit_insn (gen_vec_setv4sf_0 (operands[3],
3915 CONST0_RTX (V4SFmode), operands[1]));
3918 (define_insn "*extendsfdf2_mixed"
3919 [(set (match_operand:DF 0 "nonimmediate_operand" "=f,m,x")
3921 (match_operand:SF 1 "nonimmediate_operand" "fm,f,xm")))]
3922 "TARGET_SSE2 && TARGET_MIX_SSE_I387"
3924 switch (which_alternative)
3928 return output_387_reg_move (insn, operands);
3931 return "%vcvtss2sd\t{%1, %d0|%d0, %1}";
3937 [(set_attr "type" "fmov,fmov,ssecvt")
3938 (set_attr "prefix" "orig,orig,maybe_vex")
3939 (set_attr "mode" "SF,XF,DF")])
3941 (define_insn "*extendsfdf2_sse"
3942 [(set (match_operand:DF 0 "nonimmediate_operand" "=x")
3943 (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "xm")))]