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 ;; X -- don't print any sort of PIC '@' suffix for a symbol.
57 ;; & -- print some in-use local-dynamic symbol name.
58 ;; H -- print a memory address offset by 8; used for sse high-parts
59 ;; Y -- print condition for XOP pcom* instruction.
60 ;; + -- print a branch hint as 'cs' or 'ds' prefix
61 ;; ; -- print a semicolon (after prefixes due to bug in older gas).
62 ;; @ -- print a segment register of thread base pointer load
66 (define_c_enum "unspec" [
67 ;; Relocation specifiers
78 UNSPEC_MACHOPIC_OFFSET
88 UNSPEC_MEMORY_BLOCKAGE
98 ;; Other random patterns
107 UNSPEC_LD_MPIC ; load_macho_picbase
109 UNSPEC_DIV_ALREADY_SPLIT
110 UNSPEC_CALL_NEEDS_VZEROUPPER
113 ;; For SSE/MMX support:
131 UNSPEC_MS_TO_SYSV_CALL
133 ;; Generic math support
135 UNSPEC_IEEE_MIN ; not commutative
136 UNSPEC_IEEE_MAX ; not commutative
138 ;; x87 Floating point
154 UNSPEC_FRNDINT_MASK_PM
158 ;; x87 Double output FP
190 ;; For SSE4.1 support
200 ;; For SSE4.2 support
207 UNSPEC_XOP_UNSIGNED_CMP
218 UNSPEC_AESKEYGENASSIST
220 ;; For PCLMUL support
236 ;; For RDRAND support
240 (define_c_enum "unspecv" [
243 UNSPECV_PROBE_STACK_RANGE
263 UNSPECV_LLWP_INTRINSIC
264 UNSPECV_SLWP_INTRINSIC
265 UNSPECV_LWPVAL_INTRINSIC
266 UNSPECV_LWPINS_INTRINSIC
271 UNSPECV_SPLIT_STACK_RETURN
274 ;; Constants to represent rounding modes in the ROUND instruction
283 ;; Constants to represent pcomtrue/pcomfalse variants
293 ;; Constants used in the XOP pperm instruction
295 [(PPERM_SRC 0x00) /* copy source */
296 (PPERM_INVERT 0x20) /* invert source */
297 (PPERM_REVERSE 0x40) /* bit reverse source */
298 (PPERM_REV_INV 0x60) /* bit reverse & invert src */
299 (PPERM_ZERO 0x80) /* all 0's */
300 (PPERM_ONES 0xa0) /* all 1's */
301 (PPERM_SIGN 0xc0) /* propagate sign bit */
302 (PPERM_INV_SIGN 0xe0) /* invert & propagate sign */
303 (PPERM_SRC1 0x00) /* use first source byte */
304 (PPERM_SRC2 0x10) /* use second source byte */
307 ;; Registers by name.
360 ;; Insns whose names begin with "x86_" are emitted by gen_FOO calls
363 ;; In C guard expressions, put expressions which may be compile-time
364 ;; constants first. This allows for better optimization. For
365 ;; example, write "TARGET_64BIT && reload_completed", not
366 ;; "reload_completed && TARGET_64BIT".
370 (define_attr "cpu" "none,pentium,pentiumpro,geode,k6,athlon,k8,core2,corei7,
371 atom,generic64,amdfam10,bdver1,btver1"
372 (const (symbol_ref "ix86_schedule")))
374 ;; A basic instruction type. Refinements due to arguments to be
375 ;; provided in other attributes.
378 alu,alu1,negnot,imov,imovx,lea,
379 incdec,ishift,ishift1,rotate,rotate1,imul,idiv,
380 icmp,test,ibr,setcc,icmov,
381 push,pop,call,callv,leave,
383 fmov,fop,fsgn,fmul,fdiv,fpspc,fcmov,fcmp,fxch,fistp,fisttp,frndint,
384 sselog,sselog1,sseiadd,sseiadd1,sseishft,sseishft1,sseimul,
385 sse,ssemov,sseadd,ssemul,ssecmp,ssecomi,ssecvt,ssecvt1,sseicvt,ssediv,sseins,
386 ssemuladd,sse4arg,lwp,
387 mmx,mmxmov,mmxadd,mmxmul,mmxcmp,mmxcvt,mmxshft"
388 (const_string "other"))
390 ;; Main data type used by the insn
392 "unknown,none,QI,HI,SI,DI,TI,OI,SF,DF,XF,TF,V8SF,V4DF,V4SF,V2DF,V2SF,V1DF"
393 (const_string "unknown"))
395 ;; The CPU unit operations uses.
396 (define_attr "unit" "integer,i387,sse,mmx,unknown"
397 (cond [(eq_attr "type" "fmov,fop,fsgn,fmul,fdiv,fpspc,fcmov,fcmp,fxch,fistp,fisttp,frndint")
398 (const_string "i387")
399 (eq_attr "type" "sselog,sselog1,sseiadd,sseiadd1,sseishft,sseishft1,sseimul,
400 sse,ssemov,sseadd,ssemul,ssecmp,ssecomi,ssecvt,
401 ssecvt1,sseicvt,ssediv,sseins,ssemuladd,sse4arg")
403 (eq_attr "type" "mmx,mmxmov,mmxadd,mmxmul,mmxcmp,mmxcvt,mmxshft")
405 (eq_attr "type" "other")
406 (const_string "unknown")]
407 (const_string "integer")))
409 ;; The (bounding maximum) length of an instruction immediate.
410 (define_attr "length_immediate" ""
411 (cond [(eq_attr "type" "incdec,setcc,icmov,str,lea,other,multi,idiv,leave,
414 (eq_attr "unit" "i387,sse,mmx")
416 (eq_attr "type" "alu,alu1,negnot,imovx,ishift,rotate,ishift1,rotate1,
418 (symbol_ref "ix86_attr_length_immediate_default (insn, true)")
419 (eq_attr "type" "imov,test")
420 (symbol_ref "ix86_attr_length_immediate_default (insn, false)")
421 (eq_attr "type" "call")
422 (if_then_else (match_operand 0 "constant_call_address_operand" "")
425 (eq_attr "type" "callv")
426 (if_then_else (match_operand 1 "constant_call_address_operand" "")
429 ;; We don't know the size before shorten_branches. Expect
430 ;; the instruction to fit for better scheduling.
431 (eq_attr "type" "ibr")
434 (symbol_ref "/* Update immediate_length and other attributes! */
435 gcc_unreachable (),1")))
437 ;; The (bounding maximum) length of an instruction address.
438 (define_attr "length_address" ""
439 (cond [(eq_attr "type" "str,other,multi,fxch")
441 (and (eq_attr "type" "call")
442 (match_operand 0 "constant_call_address_operand" ""))
444 (and (eq_attr "type" "callv")
445 (match_operand 1 "constant_call_address_operand" ""))
448 (symbol_ref "ix86_attr_length_address_default (insn)")))
450 ;; Set when length prefix is used.
451 (define_attr "prefix_data16" ""
452 (cond [(eq_attr "type" "ssemuladd,sse4arg,sseiadd1,ssecvt1")
454 (eq_attr "mode" "HI")
456 (and (eq_attr "unit" "sse") (eq_attr "mode" "V2DF,TI"))
461 ;; Set when string REP prefix is used.
462 (define_attr "prefix_rep" ""
463 (cond [(eq_attr "type" "ssemuladd,sse4arg,sseiadd1,ssecvt1")
465 (and (eq_attr "unit" "sse") (eq_attr "mode" "SF,DF"))
470 ;; Set when 0f opcode prefix is used.
471 (define_attr "prefix_0f" ""
473 (ior (eq_attr "type" "imovx,setcc,icmov,bitmanip")
474 (eq_attr "unit" "sse,mmx"))
478 ;; Set when REX opcode prefix is used.
479 (define_attr "prefix_rex" ""
480 (cond [(eq (symbol_ref "TARGET_64BIT") (const_int 0))
482 (and (eq_attr "mode" "DI")
483 (and (eq_attr "type" "!push,pop,call,callv,leave,ibr")
484 (eq_attr "unit" "!mmx")))
486 (and (eq_attr "mode" "QI")
487 (ne (symbol_ref "x86_extended_QIreg_mentioned_p (insn)")
490 (ne (symbol_ref "x86_extended_reg_mentioned_p (insn)")
493 (and (eq_attr "type" "imovx")
494 (match_operand:QI 1 "ext_QIreg_operand" ""))
499 ;; There are also additional prefixes in 3DNOW, SSSE3.
500 ;; ssemuladd,sse4arg default to 0f24/0f25 and DREX byte,
501 ;; sseiadd1,ssecvt1 to 0f7a with no DREX byte.
502 ;; 3DNOW has 0f0f prefix, SSSE3 and SSE4_{1,2} 0f38/0f3a.
503 (define_attr "prefix_extra" ""
504 (cond [(eq_attr "type" "ssemuladd,sse4arg")
506 (eq_attr "type" "sseiadd1,ssecvt1")
511 ;; Prefix used: original, VEX or maybe VEX.
512 (define_attr "prefix" "orig,vex,maybe_vex"
513 (if_then_else (eq_attr "mode" "OI,V8SF,V4DF")
515 (const_string "orig")))
517 ;; VEX W bit is used.
518 (define_attr "prefix_vex_w" "" (const_int 0))
520 ;; The length of VEX prefix
521 ;; Only instructions with 0f prefix can have 2 byte VEX prefix,
522 ;; 0f38/0f3a prefixes can't. In i386.md 0f3[8a] is
523 ;; still prefix_0f 1, with prefix_extra 1.
524 (define_attr "length_vex" ""
525 (if_then_else (and (eq_attr "prefix_0f" "1")
526 (eq_attr "prefix_extra" "0"))
527 (if_then_else (eq_attr "prefix_vex_w" "1")
528 (symbol_ref "ix86_attr_length_vex_default (insn, true, true)")
529 (symbol_ref "ix86_attr_length_vex_default (insn, true, false)"))
530 (if_then_else (eq_attr "prefix_vex_w" "1")
531 (symbol_ref "ix86_attr_length_vex_default (insn, false, true)")
532 (symbol_ref "ix86_attr_length_vex_default (insn, false, false)"))))
534 ;; Set when modrm byte is used.
535 (define_attr "modrm" ""
536 (cond [(eq_attr "type" "str,leave")
538 (eq_attr "unit" "i387")
540 (and (eq_attr "type" "incdec")
541 (and (eq (symbol_ref "TARGET_64BIT") (const_int 0))
542 (ior (match_operand:SI 1 "register_operand" "")
543 (match_operand:HI 1 "register_operand" ""))))
545 (and (eq_attr "type" "push")
546 (not (match_operand 1 "memory_operand" "")))
548 (and (eq_attr "type" "pop")
549 (not (match_operand 0 "memory_operand" "")))
551 (and (eq_attr "type" "imov")
552 (and (not (eq_attr "mode" "DI"))
553 (ior (and (match_operand 0 "register_operand" "")
554 (match_operand 1 "immediate_operand" ""))
555 (ior (and (match_operand 0 "ax_reg_operand" "")
556 (match_operand 1 "memory_displacement_only_operand" ""))
557 (and (match_operand 0 "memory_displacement_only_operand" "")
558 (match_operand 1 "ax_reg_operand" ""))))))
560 (and (eq_attr "type" "call")
561 (match_operand 0 "constant_call_address_operand" ""))
563 (and (eq_attr "type" "callv")
564 (match_operand 1 "constant_call_address_operand" ""))
566 (and (eq_attr "type" "alu,alu1,icmp,test")
567 (match_operand 0 "ax_reg_operand" ""))
568 (symbol_ref "(get_attr_length_immediate (insn) <= (get_attr_mode (insn) != MODE_QI))")
572 ;; The (bounding maximum) length of an instruction in bytes.
573 ;; ??? fistp and frndint are in fact fldcw/{fistp,frndint}/fldcw sequences.
574 ;; Later we may want to split them and compute proper length as for
576 (define_attr "length" ""
577 (cond [(eq_attr "type" "other,multi,fistp,frndint")
579 (eq_attr "type" "fcmp")
581 (eq_attr "unit" "i387")
583 (plus (attr "prefix_data16")
584 (attr "length_address")))
585 (ior (eq_attr "prefix" "vex")
586 (and (eq_attr "prefix" "maybe_vex")
587 (ne (symbol_ref "TARGET_AVX") (const_int 0))))
588 (plus (attr "length_vex")
589 (plus (attr "length_immediate")
591 (attr "length_address"))))]
592 (plus (plus (attr "modrm")
593 (plus (attr "prefix_0f")
594 (plus (attr "prefix_rex")
595 (plus (attr "prefix_extra")
597 (plus (attr "prefix_rep")
598 (plus (attr "prefix_data16")
599 (plus (attr "length_immediate")
600 (attr "length_address")))))))
602 ;; The `memory' attribute is `none' if no memory is referenced, `load' or
603 ;; `store' if there is a simple memory reference therein, or `unknown'
604 ;; if the instruction is complex.
606 (define_attr "memory" "none,load,store,both,unknown"
607 (cond [(eq_attr "type" "other,multi,str,lwp")
608 (const_string "unknown")
609 (eq_attr "type" "lea,fcmov,fpspc")
610 (const_string "none")
611 (eq_attr "type" "fistp,leave")
612 (const_string "both")
613 (eq_attr "type" "frndint")
614 (const_string "load")
615 (eq_attr "type" "push")
616 (if_then_else (match_operand 1 "memory_operand" "")
617 (const_string "both")
618 (const_string "store"))
619 (eq_attr "type" "pop")
620 (if_then_else (match_operand 0 "memory_operand" "")
621 (const_string "both")
622 (const_string "load"))
623 (eq_attr "type" "setcc")
624 (if_then_else (match_operand 0 "memory_operand" "")
625 (const_string "store")
626 (const_string "none"))
627 (eq_attr "type" "icmp,test,ssecmp,ssecomi,mmxcmp,fcmp")
628 (if_then_else (ior (match_operand 0 "memory_operand" "")
629 (match_operand 1 "memory_operand" ""))
630 (const_string "load")
631 (const_string "none"))
632 (eq_attr "type" "ibr")
633 (if_then_else (match_operand 0 "memory_operand" "")
634 (const_string "load")
635 (const_string "none"))
636 (eq_attr "type" "call")
637 (if_then_else (match_operand 0 "constant_call_address_operand" "")
638 (const_string "none")
639 (const_string "load"))
640 (eq_attr "type" "callv")
641 (if_then_else (match_operand 1 "constant_call_address_operand" "")
642 (const_string "none")
643 (const_string "load"))
644 (and (eq_attr "type" "alu1,negnot,ishift1,sselog1")
645 (match_operand 1 "memory_operand" ""))
646 (const_string "both")
647 (and (match_operand 0 "memory_operand" "")
648 (match_operand 1 "memory_operand" ""))
649 (const_string "both")
650 (match_operand 0 "memory_operand" "")
651 (const_string "store")
652 (match_operand 1 "memory_operand" "")
653 (const_string "load")
655 "!alu1,negnot,ishift1,
656 imov,imovx,icmp,test,bitmanip,
658 sse,ssemov,ssecmp,ssecomi,ssecvt,ssecvt1,sseicvt,sselog1,
659 sseiadd1,mmx,mmxmov,mmxcmp,mmxcvt")
660 (match_operand 2 "memory_operand" ""))
661 (const_string "load")
662 (and (eq_attr "type" "icmov,ssemuladd,sse4arg")
663 (match_operand 3 "memory_operand" ""))
664 (const_string "load")
666 (const_string "none")))
668 ;; Indicates if an instruction has both an immediate and a displacement.
670 (define_attr "imm_disp" "false,true,unknown"
671 (cond [(eq_attr "type" "other,multi")
672 (const_string "unknown")
673 (and (eq_attr "type" "icmp,test,imov,alu1,ishift1,rotate1")
674 (and (match_operand 0 "memory_displacement_operand" "")
675 (match_operand 1 "immediate_operand" "")))
676 (const_string "true")
677 (and (eq_attr "type" "alu,ishift,rotate,imul,idiv")
678 (and (match_operand 0 "memory_displacement_operand" "")
679 (match_operand 2 "immediate_operand" "")))
680 (const_string "true")
682 (const_string "false")))
684 ;; Indicates if an FP operation has an integer source.
686 (define_attr "fp_int_src" "false,true"
687 (const_string "false"))
689 ;; Defines rounding mode of an FP operation.
691 (define_attr "i387_cw" "trunc,floor,ceil,mask_pm,uninitialized,any"
692 (const_string "any"))
694 ;; Define attribute to classify add/sub insns that consumes carry flag (CF)
695 (define_attr "use_carry" "0,1" (const_string "0"))
697 ;; Define attribute to indicate unaligned ssemov insns
698 (define_attr "movu" "0,1" (const_string "0"))
700 ;; Used to control the "enabled" attribute on a per-instruction basis.
701 (define_attr "isa" "base,noavx,avx"
702 (const_string "base"))
704 (define_attr "enabled" ""
705 (cond [(eq_attr "isa" "noavx") (symbol_ref "!TARGET_AVX")
706 (eq_attr "isa" "avx") (symbol_ref "TARGET_AVX")
710 ;; Describe a user's asm statement.
711 (define_asm_attributes
712 [(set_attr "length" "128")
713 (set_attr "type" "multi")])
715 (define_code_iterator plusminus [plus minus])
717 (define_code_iterator sat_plusminus [ss_plus us_plus ss_minus us_minus])
719 ;; Base name for define_insn
720 (define_code_attr plusminus_insn
721 [(plus "add") (ss_plus "ssadd") (us_plus "usadd")
722 (minus "sub") (ss_minus "sssub") (us_minus "ussub")])
724 ;; Base name for insn mnemonic.
725 (define_code_attr plusminus_mnemonic
726 [(plus "add") (ss_plus "adds") (us_plus "addus")
727 (minus "sub") (ss_minus "subs") (us_minus "subus")])
728 (define_code_attr plusminus_carry_mnemonic
729 [(plus "adc") (minus "sbb")])
731 ;; Mark commutative operators as such in constraints.
732 (define_code_attr comm [(plus "%") (ss_plus "%") (us_plus "%")
733 (minus "") (ss_minus "") (us_minus "")])
735 ;; Mapping of signed max and min
736 (define_code_iterator smaxmin [smax smin])
738 ;; Mapping of unsigned max and min
739 (define_code_iterator umaxmin [umax umin])
741 ;; Base name for integer and FP insn mnemonic
742 (define_code_attr maxmin_int [(smax "maxs") (smin "mins")
743 (umax "maxu") (umin "minu")])
744 (define_code_attr maxmin_float [(smax "max") (smin "min")])
746 ;; Mapping of logic operators
747 (define_code_iterator any_logic [and ior xor])
748 (define_code_iterator any_or [ior xor])
750 ;; Base name for insn mnemonic.
751 (define_code_attr logic [(and "and") (ior "or") (xor "xor")])
753 ;; Mapping of shift-right operators
754 (define_code_iterator any_shiftrt [lshiftrt ashiftrt])
756 ;; Base name for define_insn
757 (define_code_attr shiftrt_insn [(lshiftrt "lshr") (ashiftrt "ashr")])
759 ;; Base name for insn mnemonic.
760 (define_code_attr shiftrt [(lshiftrt "shr") (ashiftrt "sar")])
762 ;; Mapping of rotate operators
763 (define_code_iterator any_rotate [rotate rotatert])
765 ;; Base name for define_insn
766 (define_code_attr rotate_insn [(rotate "rotl") (rotatert "rotr")])
768 ;; Base name for insn mnemonic.
769 (define_code_attr rotate [(rotate "rol") (rotatert "ror")])
771 ;; Mapping of abs neg operators
772 (define_code_iterator absneg [abs neg])
774 ;; Base name for x87 insn mnemonic.
775 (define_code_attr absneg_mnemonic [(abs "abs") (neg "chs")])
777 ;; Used in signed and unsigned widening multiplications.
778 (define_code_iterator any_extend [sign_extend zero_extend])
780 ;; Various insn prefixes for signed and unsigned operations.
781 (define_code_attr u [(sign_extend "") (zero_extend "u")
782 (div "") (udiv "u")])
783 (define_code_attr s [(sign_extend "s") (zero_extend "u")])
785 ;; Used in signed and unsigned divisions.
786 (define_code_iterator any_div [div udiv])
788 ;; Instruction prefix for signed and unsigned operations.
789 (define_code_attr sgnprefix [(sign_extend "i") (zero_extend "")
790 (div "i") (udiv "")])
792 ;; 64bit single word integer modes.
793 (define_mode_iterator SWI1248x [QI HI SI DI])
795 ;; 64bit single word integer modes without QImode and HImode.
796 (define_mode_iterator SWI48x [SI DI])
798 ;; Single word integer modes.
799 (define_mode_iterator SWI [QI HI SI (DI "TARGET_64BIT")])
801 ;; Single word integer modes without SImode and DImode.
802 (define_mode_iterator SWI12 [QI HI])
804 ;; Single word integer modes without DImode.
805 (define_mode_iterator SWI124 [QI HI SI])
807 ;; Single word integer modes without QImode and DImode.
808 (define_mode_iterator SWI24 [HI SI])
810 ;; Single word integer modes without QImode.
811 (define_mode_iterator SWI248 [HI SI (DI "TARGET_64BIT")])
813 ;; Single word integer modes without QImode and HImode.
814 (define_mode_iterator SWI48 [SI (DI "TARGET_64BIT")])
816 ;; All math-dependant single and double word integer modes.
817 (define_mode_iterator SDWIM [(QI "TARGET_QIMODE_MATH")
818 (HI "TARGET_HIMODE_MATH")
819 SI DI (TI "TARGET_64BIT")])
821 ;; Math-dependant single word integer modes.
822 (define_mode_iterator SWIM [(QI "TARGET_QIMODE_MATH")
823 (HI "TARGET_HIMODE_MATH")
824 SI (DI "TARGET_64BIT")])
826 ;; Math-dependant single word integer modes without DImode.
827 (define_mode_iterator SWIM124 [(QI "TARGET_QIMODE_MATH")
828 (HI "TARGET_HIMODE_MATH")
831 ;; Math-dependant single word integer modes without QImode.
832 (define_mode_iterator SWIM248 [(HI "TARGET_HIMODE_MATH")
833 SI (DI "TARGET_64BIT")])
835 ;; Double word integer modes.
836 (define_mode_iterator DWI [(DI "!TARGET_64BIT")
837 (TI "TARGET_64BIT")])
839 ;; Double word integer modes as mode attribute.
840 (define_mode_attr DWI [(SI "DI") (DI "TI")])
841 (define_mode_attr dwi [(SI "di") (DI "ti")])
843 ;; Half mode for double word integer modes.
844 (define_mode_iterator DWIH [(SI "!TARGET_64BIT")
845 (DI "TARGET_64BIT")])
847 ;; Instruction suffix for integer modes.
848 (define_mode_attr imodesuffix [(QI "b") (HI "w") (SI "l") (DI "q")])
850 ;; Pointer size prefix for integer modes (Intel asm dialect)
851 (define_mode_attr iptrsize [(QI "BYTE")
856 ;; Register class for integer modes.
857 (define_mode_attr r [(QI "q") (HI "r") (SI "r") (DI "r")])
859 ;; Immediate operand constraint for integer modes.
860 (define_mode_attr i [(QI "n") (HI "n") (SI "i") (DI "e")])
862 ;; General operand constraint for word modes.
863 (define_mode_attr g [(QI "qmn") (HI "rmn") (SI "g") (DI "rme")])
865 ;; Immediate operand constraint for double integer modes.
866 (define_mode_attr di [(SI "iF") (DI "e")])
868 ;; Immediate operand constraint for shifts.
869 (define_mode_attr S [(QI "I") (HI "I") (SI "I") (DI "J") (TI "O")])
871 ;; General operand predicate for integer modes.
872 (define_mode_attr general_operand
873 [(QI "general_operand")
874 (HI "general_operand")
875 (SI "general_operand")
876 (DI "x86_64_general_operand")
877 (TI "x86_64_general_operand")])
879 ;; General sign/zero extend operand predicate for integer modes.
880 (define_mode_attr general_szext_operand
881 [(QI "general_operand")
882 (HI "general_operand")
883 (SI "general_operand")
884 (DI "x86_64_szext_general_operand")])
886 ;; Immediate operand predicate for integer modes.
887 (define_mode_attr immediate_operand
888 [(QI "immediate_operand")
889 (HI "immediate_operand")
890 (SI "immediate_operand")
891 (DI "x86_64_immediate_operand")])
893 ;; Nonmemory operand predicate for integer modes.
894 (define_mode_attr nonmemory_operand
895 [(QI "nonmemory_operand")
896 (HI "nonmemory_operand")
897 (SI "nonmemory_operand")
898 (DI "x86_64_nonmemory_operand")])
900 ;; Operand predicate for shifts.
901 (define_mode_attr shift_operand
902 [(QI "nonimmediate_operand")
903 (HI "nonimmediate_operand")
904 (SI "nonimmediate_operand")
905 (DI "shiftdi_operand")
906 (TI "register_operand")])
908 ;; Operand predicate for shift argument.
909 (define_mode_attr shift_immediate_operand
910 [(QI "const_1_to_31_operand")
911 (HI "const_1_to_31_operand")
912 (SI "const_1_to_31_operand")
913 (DI "const_1_to_63_operand")])
915 ;; Input operand predicate for arithmetic left shifts.
916 (define_mode_attr ashl_input_operand
917 [(QI "nonimmediate_operand")
918 (HI "nonimmediate_operand")
919 (SI "nonimmediate_operand")
920 (DI "ashldi_input_operand")
921 (TI "reg_or_pm1_operand")])
923 ;; SSE and x87 SFmode and DFmode floating point modes
924 (define_mode_iterator MODEF [SF DF])
926 ;; All x87 floating point modes
927 (define_mode_iterator X87MODEF [SF DF XF])
929 ;; All integer modes handled by x87 fisttp operator.
930 (define_mode_iterator X87MODEI [HI SI DI])
932 ;; All integer modes handled by integer x87 operators.
933 (define_mode_iterator X87MODEI12 [HI SI])
935 ;; All integer modes handled by SSE cvtts?2si* operators.
936 (define_mode_iterator SSEMODEI24 [SI DI])
938 ;; SSE instruction suffix for various modes
939 (define_mode_attr ssemodesuffix
941 (V8SF "ps") (V4DF "pd")
942 (V4SF "ps") (V2DF "pd")
943 (V16QI "b") (V8HI "w") (V4SI "d") (V2DI "q")
946 ;; SSE vector suffix for floating point modes
947 (define_mode_attr ssevecmodesuffix [(SF "ps") (DF "pd")])
949 ;; SSE vector mode corresponding to a scalar mode
950 (define_mode_attr ssevecmode
951 [(QI "V16QI") (HI "V8HI") (SI "V4SI") (DI "V2DI") (SF "V4SF") (DF "V2DF")])
953 ;; Instruction suffix for REX 64bit operators.
954 (define_mode_attr rex64suffix [(SI "") (DI "{q}")])
956 ;; This mode iterator allows :P to be used for patterns that operate on
957 ;; pointer-sized quantities. Exactly one of the two alternatives will match.
958 (define_mode_iterator P [(SI "Pmode == SImode") (DI "Pmode == DImode")])
960 ;; Scheduling descriptions
962 (include "pentium.md")
965 (include "athlon.md")
966 (include "bdver1.md")
972 ;; Operand and operator predicates and constraints
974 (include "predicates.md")
975 (include "constraints.md")
978 ;; Compare and branch/compare and store instructions.
980 (define_expand "cbranch<mode>4"
981 [(set (reg:CC FLAGS_REG)
982 (compare:CC (match_operand:SDWIM 1 "nonimmediate_operand" "")
983 (match_operand:SDWIM 2 "<general_operand>" "")))
984 (set (pc) (if_then_else
985 (match_operator 0 "ordered_comparison_operator"
986 [(reg:CC FLAGS_REG) (const_int 0)])
987 (label_ref (match_operand 3 "" ""))
991 if (MEM_P (operands[1]) && MEM_P (operands[2]))
992 operands[1] = force_reg (<MODE>mode, operands[1]);
993 ix86_expand_branch (GET_CODE (operands[0]),
994 operands[1], operands[2], operands[3]);
998 (define_expand "cstore<mode>4"
999 [(set (reg:CC FLAGS_REG)
1000 (compare:CC (match_operand:SWIM 2 "nonimmediate_operand" "")
1001 (match_operand:SWIM 3 "<general_operand>" "")))
1002 (set (match_operand:QI 0 "register_operand" "")
1003 (match_operator 1 "ordered_comparison_operator"
1004 [(reg:CC FLAGS_REG) (const_int 0)]))]
1007 if (MEM_P (operands[2]) && MEM_P (operands[3]))
1008 operands[2] = force_reg (<MODE>mode, operands[2]);
1009 ix86_expand_setcc (operands[0], GET_CODE (operands[1]),
1010 operands[2], operands[3]);
1014 (define_expand "cmp<mode>_1"
1015 [(set (reg:CC FLAGS_REG)
1016 (compare:CC (match_operand:SWI48 0 "nonimmediate_operand" "")
1017 (match_operand:SWI48 1 "<general_operand>" "")))])
1019 (define_insn "*cmp<mode>_ccno_1"
1020 [(set (reg FLAGS_REG)
1021 (compare (match_operand:SWI 0 "nonimmediate_operand" "<r>,?m<r>")
1022 (match_operand:SWI 1 "const0_operand" "")))]
1023 "ix86_match_ccmode (insn, CCNOmode)"
1025 test{<imodesuffix>}\t%0, %0
1026 cmp{<imodesuffix>}\t{%1, %0|%0, %1}"
1027 [(set_attr "type" "test,icmp")
1028 (set_attr "length_immediate" "0,1")
1029 (set_attr "mode" "<MODE>")])
1031 (define_insn "*cmp<mode>_1"
1032 [(set (reg FLAGS_REG)
1033 (compare (match_operand:SWI 0 "nonimmediate_operand" "<r>m,<r>")
1034 (match_operand:SWI 1 "<general_operand>" "<r><i>,<r>m")))]
1035 "ix86_match_ccmode (insn, CCmode)"
1036 "cmp{<imodesuffix>}\t{%1, %0|%0, %1}"
1037 [(set_attr "type" "icmp")
1038 (set_attr "mode" "<MODE>")])
1040 (define_insn "*cmp<mode>_minus_1"
1041 [(set (reg FLAGS_REG)
1043 (minus:SWI (match_operand:SWI 0 "nonimmediate_operand" "<r>m,<r>")
1044 (match_operand:SWI 1 "<general_operand>" "<r><i>,<r>m"))
1046 "ix86_match_ccmode (insn, CCGOCmode)"
1047 "cmp{<imodesuffix>}\t{%1, %0|%0, %1}"
1048 [(set_attr "type" "icmp")
1049 (set_attr "mode" "<MODE>")])
1051 (define_insn "*cmpqi_ext_1"
1052 [(set (reg FLAGS_REG)
1054 (match_operand:QI 0 "general_operand" "Qm")
1057 (match_operand 1 "ext_register_operand" "Q")
1059 (const_int 8)) 0)))]
1060 "!TARGET_64BIT && ix86_match_ccmode (insn, CCmode)"
1061 "cmp{b}\t{%h1, %0|%0, %h1}"
1062 [(set_attr "type" "icmp")
1063 (set_attr "mode" "QI")])
1065 (define_insn "*cmpqi_ext_1_rex64"
1066 [(set (reg FLAGS_REG)
1068 (match_operand:QI 0 "register_operand" "Q")
1071 (match_operand 1 "ext_register_operand" "Q")
1073 (const_int 8)) 0)))]
1074 "TARGET_64BIT && ix86_match_ccmode (insn, CCmode)"
1075 "cmp{b}\t{%h1, %0|%0, %h1}"
1076 [(set_attr "type" "icmp")
1077 (set_attr "mode" "QI")])
1079 (define_insn "*cmpqi_ext_2"
1080 [(set (reg FLAGS_REG)
1084 (match_operand 0 "ext_register_operand" "Q")
1087 (match_operand:QI 1 "const0_operand" "")))]
1088 "ix86_match_ccmode (insn, CCNOmode)"
1090 [(set_attr "type" "test")
1091 (set_attr "length_immediate" "0")
1092 (set_attr "mode" "QI")])
1094 (define_expand "cmpqi_ext_3"
1095 [(set (reg:CC FLAGS_REG)
1099 (match_operand 0 "ext_register_operand" "")
1102 (match_operand:QI 1 "immediate_operand" "")))])
1104 (define_insn "*cmpqi_ext_3_insn"
1105 [(set (reg FLAGS_REG)
1109 (match_operand 0 "ext_register_operand" "Q")
1112 (match_operand:QI 1 "general_operand" "Qmn")))]
1113 "!TARGET_64BIT && ix86_match_ccmode (insn, CCmode)"
1114 "cmp{b}\t{%1, %h0|%h0, %1}"
1115 [(set_attr "type" "icmp")
1116 (set_attr "modrm" "1")
1117 (set_attr "mode" "QI")])
1119 (define_insn "*cmpqi_ext_3_insn_rex64"
1120 [(set (reg FLAGS_REG)
1124 (match_operand 0 "ext_register_operand" "Q")
1127 (match_operand:QI 1 "nonmemory_operand" "Qn")))]
1128 "TARGET_64BIT && ix86_match_ccmode (insn, CCmode)"
1129 "cmp{b}\t{%1, %h0|%h0, %1}"
1130 [(set_attr "type" "icmp")
1131 (set_attr "modrm" "1")
1132 (set_attr "mode" "QI")])
1134 (define_insn "*cmpqi_ext_4"
1135 [(set (reg FLAGS_REG)
1139 (match_operand 0 "ext_register_operand" "Q")
1144 (match_operand 1 "ext_register_operand" "Q")
1146 (const_int 8)) 0)))]
1147 "ix86_match_ccmode (insn, CCmode)"
1148 "cmp{b}\t{%h1, %h0|%h0, %h1}"
1149 [(set_attr "type" "icmp")
1150 (set_attr "mode" "QI")])
1152 ;; These implement float point compares.
1153 ;; %%% See if we can get away with VOIDmode operands on the actual insns,
1154 ;; which would allow mix and match FP modes on the compares. Which is what
1155 ;; the old patterns did, but with many more of them.
1157 (define_expand "cbranchxf4"
1158 [(set (reg:CC FLAGS_REG)
1159 (compare:CC (match_operand:XF 1 "nonmemory_operand" "")
1160 (match_operand:XF 2 "nonmemory_operand" "")))
1161 (set (pc) (if_then_else
1162 (match_operator 0 "ix86_fp_comparison_operator"
1165 (label_ref (match_operand 3 "" ""))
1169 ix86_expand_branch (GET_CODE (operands[0]),
1170 operands[1], operands[2], operands[3]);
1174 (define_expand "cstorexf4"
1175 [(set (reg:CC FLAGS_REG)
1176 (compare:CC (match_operand:XF 2 "nonmemory_operand" "")
1177 (match_operand:XF 3 "nonmemory_operand" "")))
1178 (set (match_operand:QI 0 "register_operand" "")
1179 (match_operator 1 "ix86_fp_comparison_operator"
1184 ix86_expand_setcc (operands[0], GET_CODE (operands[1]),
1185 operands[2], operands[3]);
1189 (define_expand "cbranch<mode>4"
1190 [(set (reg:CC FLAGS_REG)
1191 (compare:CC (match_operand:MODEF 1 "cmp_fp_expander_operand" "")
1192 (match_operand:MODEF 2 "cmp_fp_expander_operand" "")))
1193 (set (pc) (if_then_else
1194 (match_operator 0 "ix86_fp_comparison_operator"
1197 (label_ref (match_operand 3 "" ""))
1199 "TARGET_80387 || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)"
1201 ix86_expand_branch (GET_CODE (operands[0]),
1202 operands[1], operands[2], operands[3]);
1206 (define_expand "cstore<mode>4"
1207 [(set (reg:CC FLAGS_REG)
1208 (compare:CC (match_operand:MODEF 2 "cmp_fp_expander_operand" "")
1209 (match_operand:MODEF 3 "cmp_fp_expander_operand" "")))
1210 (set (match_operand:QI 0 "register_operand" "")
1211 (match_operator 1 "ix86_fp_comparison_operator"
1214 "TARGET_80387 || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)"
1216 ix86_expand_setcc (operands[0], GET_CODE (operands[1]),
1217 operands[2], operands[3]);
1221 (define_expand "cbranchcc4"
1222 [(set (pc) (if_then_else
1223 (match_operator 0 "comparison_operator"
1224 [(match_operand 1 "flags_reg_operand" "")
1225 (match_operand 2 "const0_operand" "")])
1226 (label_ref (match_operand 3 "" ""))
1230 ix86_expand_branch (GET_CODE (operands[0]),
1231 operands[1], operands[2], operands[3]);
1235 (define_expand "cstorecc4"
1236 [(set (match_operand:QI 0 "register_operand" "")
1237 (match_operator 1 "comparison_operator"
1238 [(match_operand 2 "flags_reg_operand" "")
1239 (match_operand 3 "const0_operand" "")]))]
1242 ix86_expand_setcc (operands[0], GET_CODE (operands[1]),
1243 operands[2], operands[3]);
1248 ;; FP compares, step 1:
1249 ;; Set the FP condition codes.
1251 ;; CCFPmode compare with exceptions
1252 ;; CCFPUmode compare with no exceptions
1254 ;; We may not use "#" to split and emit these, since the REG_DEAD notes
1255 ;; used to manage the reg stack popping would not be preserved.
1257 (define_insn "*cmpfp_0"
1258 [(set (match_operand:HI 0 "register_operand" "=a")
1261 (match_operand 1 "register_operand" "f")
1262 (match_operand 2 "const0_operand" ""))]
1264 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1265 && GET_MODE (operands[1]) == GET_MODE (operands[2])"
1266 "* return output_fp_compare (insn, operands, false, false);"
1267 [(set_attr "type" "multi")
1268 (set_attr "unit" "i387")
1270 (cond [(match_operand:SF 1 "" "")
1272 (match_operand:DF 1 "" "")
1275 (const_string "XF")))])
1277 (define_insn_and_split "*cmpfp_0_cc"
1278 [(set (reg:CCFP FLAGS_REG)
1280 (match_operand 1 "register_operand" "f")
1281 (match_operand 2 "const0_operand" "")))
1282 (clobber (match_operand:HI 0 "register_operand" "=a"))]
1283 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1284 && TARGET_SAHF && !TARGET_CMOVE
1285 && GET_MODE (operands[1]) == GET_MODE (operands[2])"
1287 "&& reload_completed"
1290 [(compare:CCFP (match_dup 1)(match_dup 2))]
1292 (set (reg:CC FLAGS_REG)
1293 (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1295 [(set_attr "type" "multi")
1296 (set_attr "unit" "i387")
1298 (cond [(match_operand:SF 1 "" "")
1300 (match_operand:DF 1 "" "")
1303 (const_string "XF")))])
1305 (define_insn "*cmpfp_xf"
1306 [(set (match_operand:HI 0 "register_operand" "=a")
1309 (match_operand:XF 1 "register_operand" "f")
1310 (match_operand:XF 2 "register_operand" "f"))]
1313 "* return output_fp_compare (insn, operands, false, false);"
1314 [(set_attr "type" "multi")
1315 (set_attr "unit" "i387")
1316 (set_attr "mode" "XF")])
1318 (define_insn_and_split "*cmpfp_xf_cc"
1319 [(set (reg:CCFP FLAGS_REG)
1321 (match_operand:XF 1 "register_operand" "f")
1322 (match_operand:XF 2 "register_operand" "f")))
1323 (clobber (match_operand:HI 0 "register_operand" "=a"))]
1325 && TARGET_SAHF && !TARGET_CMOVE"
1327 "&& reload_completed"
1330 [(compare:CCFP (match_dup 1)(match_dup 2))]
1332 (set (reg:CC FLAGS_REG)
1333 (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1335 [(set_attr "type" "multi")
1336 (set_attr "unit" "i387")
1337 (set_attr "mode" "XF")])
1339 (define_insn "*cmpfp_<mode>"
1340 [(set (match_operand:HI 0 "register_operand" "=a")
1343 (match_operand:MODEF 1 "register_operand" "f")
1344 (match_operand:MODEF 2 "nonimmediate_operand" "fm"))]
1347 "* return output_fp_compare (insn, operands, false, false);"
1348 [(set_attr "type" "multi")
1349 (set_attr "unit" "i387")
1350 (set_attr "mode" "<MODE>")])
1352 (define_insn_and_split "*cmpfp_<mode>_cc"
1353 [(set (reg:CCFP FLAGS_REG)
1355 (match_operand:MODEF 1 "register_operand" "f")
1356 (match_operand:MODEF 2 "nonimmediate_operand" "fm")))
1357 (clobber (match_operand:HI 0 "register_operand" "=a"))]
1359 && TARGET_SAHF && !TARGET_CMOVE"
1361 "&& reload_completed"
1364 [(compare:CCFP (match_dup 1)(match_dup 2))]
1366 (set (reg:CC FLAGS_REG)
1367 (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1369 [(set_attr "type" "multi")
1370 (set_attr "unit" "i387")
1371 (set_attr "mode" "<MODE>")])
1373 (define_insn "*cmpfp_u"
1374 [(set (match_operand:HI 0 "register_operand" "=a")
1377 (match_operand 1 "register_operand" "f")
1378 (match_operand 2 "register_operand" "f"))]
1380 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1381 && GET_MODE (operands[1]) == GET_MODE (operands[2])"
1382 "* return output_fp_compare (insn, operands, false, true);"
1383 [(set_attr "type" "multi")
1384 (set_attr "unit" "i387")
1386 (cond [(match_operand:SF 1 "" "")
1388 (match_operand:DF 1 "" "")
1391 (const_string "XF")))])
1393 (define_insn_and_split "*cmpfp_u_cc"
1394 [(set (reg:CCFPU FLAGS_REG)
1396 (match_operand 1 "register_operand" "f")
1397 (match_operand 2 "register_operand" "f")))
1398 (clobber (match_operand:HI 0 "register_operand" "=a"))]
1399 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1400 && TARGET_SAHF && !TARGET_CMOVE
1401 && GET_MODE (operands[1]) == GET_MODE (operands[2])"
1403 "&& reload_completed"
1406 [(compare:CCFPU (match_dup 1)(match_dup 2))]
1408 (set (reg:CC FLAGS_REG)
1409 (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1411 [(set_attr "type" "multi")
1412 (set_attr "unit" "i387")
1414 (cond [(match_operand:SF 1 "" "")
1416 (match_operand:DF 1 "" "")
1419 (const_string "XF")))])
1421 (define_insn "*cmpfp_<mode>"
1422 [(set (match_operand:HI 0 "register_operand" "=a")
1425 (match_operand 1 "register_operand" "f")
1426 (match_operator 3 "float_operator"
1427 [(match_operand:X87MODEI12 2 "memory_operand" "m")]))]
1429 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1430 && (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))
1431 && (GET_MODE (operands [3]) == GET_MODE (operands[1]))"
1432 "* return output_fp_compare (insn, operands, false, false);"
1433 [(set_attr "type" "multi")
1434 (set_attr "unit" "i387")
1435 (set_attr "fp_int_src" "true")
1436 (set_attr "mode" "<MODE>")])
1438 (define_insn_and_split "*cmpfp_<mode>_cc"
1439 [(set (reg:CCFP FLAGS_REG)
1441 (match_operand 1 "register_operand" "f")
1442 (match_operator 3 "float_operator"
1443 [(match_operand:X87MODEI12 2 "memory_operand" "m")])))
1444 (clobber (match_operand:HI 0 "register_operand" "=a"))]
1445 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
1446 && TARGET_SAHF && !TARGET_CMOVE
1447 && (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))
1448 && (GET_MODE (operands [3]) == GET_MODE (operands[1]))"
1450 "&& reload_completed"
1455 (match_op_dup 3 [(match_dup 2)]))]
1457 (set (reg:CC FLAGS_REG)
1458 (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1460 [(set_attr "type" "multi")
1461 (set_attr "unit" "i387")
1462 (set_attr "fp_int_src" "true")
1463 (set_attr "mode" "<MODE>")])
1465 ;; FP compares, step 2
1466 ;; Move the fpsw to ax.
1468 (define_insn "x86_fnstsw_1"
1469 [(set (match_operand:HI 0 "register_operand" "=a")
1470 (unspec:HI [(reg:CCFP FPSR_REG)] UNSPEC_FNSTSW))]
1473 [(set (attr "length") (symbol_ref "ix86_attr_length_address_default (insn) + 2"))
1474 (set_attr "mode" "SI")
1475 (set_attr "unit" "i387")])
1477 ;; FP compares, step 3
1478 ;; Get ax into flags, general case.
1480 (define_insn "x86_sahf_1"
1481 [(set (reg:CC FLAGS_REG)
1482 (unspec:CC [(match_operand:HI 0 "register_operand" "a")]
1486 #ifndef HAVE_AS_IX86_SAHF
1488 return ASM_BYTE "0x9e";
1493 [(set_attr "length" "1")
1494 (set_attr "athlon_decode" "vector")
1495 (set_attr "amdfam10_decode" "direct")
1496 (set_attr "bdver1_decode" "direct")
1497 (set_attr "mode" "SI")])
1499 ;; Pentium Pro can do steps 1 through 3 in one go.
1500 ;; comi*, ucomi*, fcomi*, ficomi*,fucomi* (i387 instructions set condition codes)
1501 (define_insn "*cmpfp_i_mixed"
1502 [(set (reg:CCFP FLAGS_REG)
1503 (compare:CCFP (match_operand 0 "register_operand" "f,x")
1504 (match_operand 1 "nonimmediate_operand" "f,xm")))]
1505 "TARGET_MIX_SSE_I387
1506 && SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
1507 && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1508 "* return output_fp_compare (insn, operands, true, false);"
1509 [(set_attr "type" "fcmp,ssecomi")
1510 (set_attr "prefix" "orig,maybe_vex")
1512 (if_then_else (match_operand:SF 1 "" "")
1514 (const_string "DF")))
1515 (set (attr "prefix_rep")
1516 (if_then_else (eq_attr "type" "ssecomi")
1518 (const_string "*")))
1519 (set (attr "prefix_data16")
1520 (cond [(eq_attr "type" "fcmp")
1522 (eq_attr "mode" "DF")
1525 (const_string "0")))
1526 (set_attr "athlon_decode" "vector")
1527 (set_attr "amdfam10_decode" "direct")
1528 (set_attr "bdver1_decode" "double")])
1530 (define_insn "*cmpfp_i_sse"
1531 [(set (reg:CCFP FLAGS_REG)
1532 (compare:CCFP (match_operand 0 "register_operand" "x")
1533 (match_operand 1 "nonimmediate_operand" "xm")))]
1535 && SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
1536 && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1537 "* return output_fp_compare (insn, operands, true, false);"
1538 [(set_attr "type" "ssecomi")
1539 (set_attr "prefix" "maybe_vex")
1541 (if_then_else (match_operand:SF 1 "" "")
1543 (const_string "DF")))
1544 (set_attr "prefix_rep" "0")
1545 (set (attr "prefix_data16")
1546 (if_then_else (eq_attr "mode" "DF")
1548 (const_string "0")))
1549 (set_attr "athlon_decode" "vector")
1550 (set_attr "amdfam10_decode" "direct")
1551 (set_attr "bdver1_decode" "double")])
1553 (define_insn "*cmpfp_i_i387"
1554 [(set (reg:CCFP FLAGS_REG)
1555 (compare:CCFP (match_operand 0 "register_operand" "f")
1556 (match_operand 1 "register_operand" "f")))]
1557 "X87_FLOAT_MODE_P (GET_MODE (operands[0]))
1559 && !(SSE_FLOAT_MODE_P (GET_MODE (operands[0])) && TARGET_SSE_MATH)
1560 && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1561 "* return output_fp_compare (insn, operands, true, false);"
1562 [(set_attr "type" "fcmp")
1564 (cond [(match_operand:SF 1 "" "")
1566 (match_operand:DF 1 "" "")
1569 (const_string "XF")))
1570 (set_attr "athlon_decode" "vector")
1571 (set_attr "amdfam10_decode" "direct")
1572 (set_attr "bdver1_decode" "double")])
1574 (define_insn "*cmpfp_iu_mixed"
1575 [(set (reg:CCFPU FLAGS_REG)
1576 (compare:CCFPU (match_operand 0 "register_operand" "f,x")
1577 (match_operand 1 "nonimmediate_operand" "f,xm")))]
1578 "TARGET_MIX_SSE_I387
1579 && SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
1580 && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1581 "* return output_fp_compare (insn, operands, true, true);"
1582 [(set_attr "type" "fcmp,ssecomi")
1583 (set_attr "prefix" "orig,maybe_vex")
1585 (if_then_else (match_operand:SF 1 "" "")
1587 (const_string "DF")))
1588 (set (attr "prefix_rep")
1589 (if_then_else (eq_attr "type" "ssecomi")
1591 (const_string "*")))
1592 (set (attr "prefix_data16")
1593 (cond [(eq_attr "type" "fcmp")
1595 (eq_attr "mode" "DF")
1598 (const_string "0")))
1599 (set_attr "athlon_decode" "vector")
1600 (set_attr "amdfam10_decode" "direct")
1601 (set_attr "bdver1_decode" "double")])
1603 (define_insn "*cmpfp_iu_sse"
1604 [(set (reg:CCFPU FLAGS_REG)
1605 (compare:CCFPU (match_operand 0 "register_operand" "x")
1606 (match_operand 1 "nonimmediate_operand" "xm")))]
1608 && SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
1609 && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1610 "* return output_fp_compare (insn, operands, true, true);"
1611 [(set_attr "type" "ssecomi")
1612 (set_attr "prefix" "maybe_vex")
1614 (if_then_else (match_operand:SF 1 "" "")
1616 (const_string "DF")))
1617 (set_attr "prefix_rep" "0")
1618 (set (attr "prefix_data16")
1619 (if_then_else (eq_attr "mode" "DF")
1621 (const_string "0")))
1622 (set_attr "athlon_decode" "vector")
1623 (set_attr "amdfam10_decode" "direct")
1624 (set_attr "bdver1_decode" "double")])
1626 (define_insn "*cmpfp_iu_387"
1627 [(set (reg:CCFPU FLAGS_REG)
1628 (compare:CCFPU (match_operand 0 "register_operand" "f")
1629 (match_operand 1 "register_operand" "f")))]
1630 "X87_FLOAT_MODE_P (GET_MODE (operands[0]))
1632 && !(SSE_FLOAT_MODE_P (GET_MODE (operands[0])) && TARGET_SSE_MATH)
1633 && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1634 "* return output_fp_compare (insn, operands, true, true);"
1635 [(set_attr "type" "fcmp")
1637 (cond [(match_operand:SF 1 "" "")
1639 (match_operand:DF 1 "" "")
1642 (const_string "XF")))
1643 (set_attr "athlon_decode" "vector")
1644 (set_attr "amdfam10_decode" "direct")
1645 (set_attr "bdver1_decode" "direct")])
1647 ;; Push/pop instructions.
1649 (define_insn "*push<mode>2"
1650 [(set (match_operand:DWI 0 "push_operand" "=<")
1651 (match_operand:DWI 1 "general_no_elim_operand" "riF*m"))]
1656 [(set (match_operand:TI 0 "push_operand" "")
1657 (match_operand:TI 1 "general_operand" ""))]
1658 "TARGET_64BIT && reload_completed
1659 && !SSE_REG_P (operands[1])"
1661 "ix86_split_long_move (operands); DONE;")
1663 (define_insn "*pushdi2_rex64"
1664 [(set (match_operand:DI 0 "push_operand" "=<,!<")
1665 (match_operand:DI 1 "general_no_elim_operand" "re*m,n"))]
1670 [(set_attr "type" "push,multi")
1671 (set_attr "mode" "DI")])
1673 ;; Convert impossible pushes of immediate to existing instructions.
1674 ;; First try to get scratch register and go through it. In case this
1675 ;; fails, push sign extended lower part first and then overwrite
1676 ;; upper part by 32bit move.
1678 [(match_scratch:DI 2 "r")
1679 (set (match_operand:DI 0 "push_operand" "")
1680 (match_operand:DI 1 "immediate_operand" ""))]
1681 "TARGET_64BIT && !symbolic_operand (operands[1], DImode)
1682 && !x86_64_immediate_operand (operands[1], DImode)"
1683 [(set (match_dup 2) (match_dup 1))
1684 (set (match_dup 0) (match_dup 2))])
1686 ;; We need to define this as both peepholer and splitter for case
1687 ;; peephole2 pass is not run.
1688 ;; "&& 1" is needed to keep it from matching the previous pattern.
1690 [(set (match_operand:DI 0 "push_operand" "")
1691 (match_operand:DI 1 "immediate_operand" ""))]
1692 "TARGET_64BIT && !symbolic_operand (operands[1], DImode)
1693 && !x86_64_immediate_operand (operands[1], DImode) && 1"
1694 [(set (match_dup 0) (match_dup 1))
1695 (set (match_dup 2) (match_dup 3))]
1697 split_double_mode (DImode, &operands[1], 1, &operands[2], &operands[3]);
1699 operands[1] = gen_lowpart (DImode, operands[2]);
1700 operands[2] = gen_rtx_MEM (SImode, gen_rtx_PLUS (DImode, stack_pointer_rtx,
1705 [(set (match_operand:DI 0 "push_operand" "")
1706 (match_operand:DI 1 "immediate_operand" ""))]
1707 "TARGET_64BIT && ((optimize > 0 && flag_peephole2)
1708 ? epilogue_completed : reload_completed)
1709 && !symbolic_operand (operands[1], DImode)
1710 && !x86_64_immediate_operand (operands[1], DImode)"
1711 [(set (match_dup 0) (match_dup 1))
1712 (set (match_dup 2) (match_dup 3))]
1714 split_double_mode (DImode, &operands[1], 1, &operands[2], &operands[3]);
1716 operands[1] = gen_lowpart (DImode, operands[2]);
1717 operands[2] = gen_rtx_MEM (SImode, gen_rtx_PLUS (DImode, stack_pointer_rtx,
1722 [(set (match_operand:DI 0 "push_operand" "")
1723 (match_operand:DI 1 "general_operand" ""))]
1724 "!TARGET_64BIT && reload_completed
1725 && !(MMX_REG_P (operands[1]) || SSE_REG_P (operands[1]))"
1727 "ix86_split_long_move (operands); DONE;")
1729 (define_insn "*pushsi2"
1730 [(set (match_operand:SI 0 "push_operand" "=<")
1731 (match_operand:SI 1 "general_no_elim_operand" "ri*m"))]
1734 [(set_attr "type" "push")
1735 (set_attr "mode" "SI")])
1737 ;; emit_push_insn when it calls move_by_pieces requires an insn to
1738 ;; "push a byte/word". But actually we use pushl, which has the effect
1739 ;; of rounding the amount pushed up to a word.
1741 ;; For TARGET_64BIT we always round up to 8 bytes.
1742 (define_insn "*push<mode>2_rex64"
1743 [(set (match_operand:SWI124 0 "push_operand" "=X")
1744 (match_operand:SWI124 1 "nonmemory_no_elim_operand" "r<i>"))]
1747 [(set_attr "type" "push")
1748 (set_attr "mode" "DI")])
1750 (define_insn "*push<mode>2"
1751 [(set (match_operand:SWI12 0 "push_operand" "=X")
1752 (match_operand:SWI12 1 "nonmemory_no_elim_operand" "rn"))]
1755 [(set_attr "type" "push")
1756 (set_attr "mode" "SI")])
1758 (define_insn "*push<mode>2_prologue"
1759 [(set (match_operand:P 0 "push_operand" "=<")
1760 (match_operand:P 1 "general_no_elim_operand" "r<i>*m"))
1761 (clobber (mem:BLK (scratch)))]
1763 "push{<imodesuffix>}\t%1"
1764 [(set_attr "type" "push")
1765 (set_attr "mode" "<MODE>")])
1767 (define_insn "*pop<mode>1"
1768 [(set (match_operand:P 0 "nonimmediate_operand" "=r*m")
1769 (match_operand:P 1 "pop_operand" ">"))]
1771 "pop{<imodesuffix>}\t%0"
1772 [(set_attr "type" "pop")
1773 (set_attr "mode" "<MODE>")])
1775 (define_insn "*pop<mode>1_epilogue"
1776 [(set (match_operand:P 0 "nonimmediate_operand" "=r*m")
1777 (match_operand:P 1 "pop_operand" ">"))
1778 (clobber (mem:BLK (scratch)))]
1780 "pop{<imodesuffix>}\t%0"
1781 [(set_attr "type" "pop")
1782 (set_attr "mode" "<MODE>")])
1784 ;; Move instructions.
1786 (define_expand "movoi"
1787 [(set (match_operand:OI 0 "nonimmediate_operand" "")
1788 (match_operand:OI 1 "general_operand" ""))]
1790 "ix86_expand_move (OImode, operands); DONE;")
1792 (define_expand "movti"
1793 [(set (match_operand:TI 0 "nonimmediate_operand" "")
1794 (match_operand:TI 1 "nonimmediate_operand" ""))]
1795 "TARGET_64BIT || TARGET_SSE"
1798 ix86_expand_move (TImode, operands);
1799 else if (push_operand (operands[0], TImode))
1800 ix86_expand_push (TImode, operands[1]);
1802 ix86_expand_vector_move (TImode, operands);
1806 ;; This expands to what emit_move_complex would generate if we didn't
1807 ;; have a movti pattern. Having this avoids problems with reload on
1808 ;; 32-bit targets when SSE is present, but doesn't seem to be harmful
1809 ;; to have around all the time.
1810 (define_expand "movcdi"
1811 [(set (match_operand:CDI 0 "nonimmediate_operand" "")
1812 (match_operand:CDI 1 "general_operand" ""))]
1815 if (push_operand (operands[0], CDImode))
1816 emit_move_complex_push (CDImode, operands[0], operands[1]);
1818 emit_move_complex_parts (operands[0], operands[1]);
1822 (define_expand "mov<mode>"
1823 [(set (match_operand:SWI1248x 0 "nonimmediate_operand" "")
1824 (match_operand:SWI1248x 1 "general_operand" ""))]
1826 "ix86_expand_move (<MODE>mode, operands); DONE;")
1828 (define_insn "*mov<mode>_xor"
1829 [(set (match_operand:SWI48 0 "register_operand" "=r")
1830 (match_operand:SWI48 1 "const0_operand" ""))
1831 (clobber (reg:CC FLAGS_REG))]
1834 [(set_attr "type" "alu1")
1835 (set_attr "mode" "SI")
1836 (set_attr "length_immediate" "0")])
1838 (define_insn "*mov<mode>_or"
1839 [(set (match_operand:SWI48 0 "register_operand" "=r")
1840 (match_operand:SWI48 1 "const_int_operand" ""))
1841 (clobber (reg:CC FLAGS_REG))]
1843 && operands[1] == constm1_rtx"
1844 "or{<imodesuffix>}\t{%1, %0|%0, %1}"
1845 [(set_attr "type" "alu1")
1846 (set_attr "mode" "<MODE>")
1847 (set_attr "length_immediate" "1")])
1849 (define_insn "*movoi_internal_avx"
1850 [(set (match_operand:OI 0 "nonimmediate_operand" "=x,x,m")
1851 (match_operand:OI 1 "vector_move_operand" "C,xm,x"))]
1852 "TARGET_AVX && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
1854 switch (which_alternative)
1857 return "vxorps\t%0, %0, %0";
1860 if (misaligned_operand (operands[0], OImode)
1861 || misaligned_operand (operands[1], OImode))
1862 return "vmovdqu\t{%1, %0|%0, %1}";
1864 return "vmovdqa\t{%1, %0|%0, %1}";
1869 [(set_attr "type" "sselog1,ssemov,ssemov")
1870 (set_attr "prefix" "vex")
1871 (set_attr "mode" "OI")])
1873 (define_insn "*movti_internal_rex64"
1874 [(set (match_operand:TI 0 "nonimmediate_operand" "=!r,o,x,x,xm")
1875 (match_operand:TI 1 "general_operand" "riFo,riF,C,xm,x"))]
1876 "TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
1878 switch (which_alternative)
1884 if (get_attr_mode (insn) == MODE_V4SF)
1885 return "%vxorps\t%0, %d0";
1887 return "%vpxor\t%0, %d0";
1890 /* TDmode values are passed as TImode on the stack. Moving them
1891 to stack may result in unaligned memory access. */
1892 if (misaligned_operand (operands[0], TImode)
1893 || misaligned_operand (operands[1], TImode))
1895 if (get_attr_mode (insn) == MODE_V4SF)
1896 return "%vmovups\t{%1, %0|%0, %1}";
1898 return "%vmovdqu\t{%1, %0|%0, %1}";
1902 if (get_attr_mode (insn) == MODE_V4SF)
1903 return "%vmovaps\t{%1, %0|%0, %1}";
1905 return "%vmovdqa\t{%1, %0|%0, %1}";
1911 [(set_attr "type" "*,*,sselog1,ssemov,ssemov")
1912 (set_attr "prefix" "*,*,maybe_vex,maybe_vex,maybe_vex")
1914 (cond [(eq_attr "alternative" "2,3")
1916 (ne (symbol_ref "optimize_function_for_size_p (cfun)")
1918 (const_string "V4SF")
1919 (const_string "TI"))
1920 (eq_attr "alternative" "4")
1922 (ior (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
1924 (ne (symbol_ref "optimize_function_for_size_p (cfun)")
1926 (const_string "V4SF")
1927 (const_string "TI"))]
1928 (const_string "DI")))])
1931 [(set (match_operand:TI 0 "nonimmediate_operand" "")
1932 (match_operand:TI 1 "general_operand" ""))]
1934 && !SSE_REG_P (operands[0]) && !SSE_REG_P (operands[1])"
1936 "ix86_split_long_move (operands); DONE;")
1938 (define_insn "*movti_internal_sse"
1939 [(set (match_operand:TI 0 "nonimmediate_operand" "=x,x,m")
1940 (match_operand:TI 1 "vector_move_operand" "C,xm,x"))]
1941 "TARGET_SSE && !TARGET_64BIT
1942 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
1944 switch (which_alternative)
1947 if (get_attr_mode (insn) == MODE_V4SF)
1948 return "%vxorps\t%0, %d0";
1950 return "%vpxor\t%0, %d0";
1953 /* TDmode values are passed as TImode on the stack. Moving them
1954 to stack may result in unaligned memory access. */
1955 if (misaligned_operand (operands[0], TImode)
1956 || misaligned_operand (operands[1], TImode))
1958 if (get_attr_mode (insn) == MODE_V4SF)
1959 return "%vmovups\t{%1, %0|%0, %1}";
1961 return "%vmovdqu\t{%1, %0|%0, %1}";
1965 if (get_attr_mode (insn) == MODE_V4SF)
1966 return "%vmovaps\t{%1, %0|%0, %1}";
1968 return "%vmovdqa\t{%1, %0|%0, %1}";
1974 [(set_attr "type" "sselog1,ssemov,ssemov")
1975 (set_attr "prefix" "maybe_vex")
1977 (cond [(ior (eq (symbol_ref "TARGET_SSE2") (const_int 0))
1978 (ne (symbol_ref "optimize_function_for_size_p (cfun)")
1980 (const_string "V4SF")
1981 (and (eq_attr "alternative" "2")
1982 (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
1984 (const_string "V4SF")]
1985 (const_string "TI")))])
1987 (define_insn "*movdi_internal_rex64"
1988 [(set (match_operand:DI 0 "nonimmediate_operand"
1989 "=r,r ,r,m ,!m,*y,*y,?r ,m ,?*Ym,?*y,*x,*x,?r ,m,?*Yi,*x,?*x,?*Ym")
1990 (match_operand:DI 1 "general_operand"
1991 "Z ,rem,i,re,n ,C ,*y,*Ym,*y,r ,m ,C ,*x,*Yi,*x,r ,m ,*Ym,*x"))]
1992 "TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
1994 switch (get_attr_type (insn))
1997 if (SSE_REG_P (operands[0]))
1998 return "movq2dq\t{%1, %0|%0, %1}";
2000 return "movdq2q\t{%1, %0|%0, %1}";
2003 if (get_attr_mode (insn) == MODE_TI)
2004 return "%vmovdqa\t{%1, %0|%0, %1}";
2005 /* Handle broken assemblers that require movd instead of movq. */
2006 if (GENERAL_REG_P (operands[0]) || GENERAL_REG_P (operands[1]))
2007 return "%vmovd\t{%1, %0|%0, %1}";
2009 return "%vmovq\t{%1, %0|%0, %1}";
2012 /* Handle broken assemblers that require movd instead of movq. */
2013 if (GENERAL_REG_P (operands[0]) || GENERAL_REG_P (operands[1]))
2014 return "movd\t{%1, %0|%0, %1}";
2016 return "movq\t{%1, %0|%0, %1}";
2019 return "%vpxor\t%0, %d0";
2022 return "pxor\t%0, %0";
2028 return "lea{q}\t{%a1, %0|%0, %a1}";
2031 gcc_assert (!flag_pic || LEGITIMATE_PIC_OPERAND_P (operands[1]));
2032 if (get_attr_mode (insn) == MODE_SI)
2033 return "mov{l}\t{%k1, %k0|%k0, %k1}";
2034 else if (which_alternative == 2)
2035 return "movabs{q}\t{%1, %0|%0, %1}";
2037 return "mov{q}\t{%1, %0|%0, %1}";
2041 (cond [(eq_attr "alternative" "5")
2042 (const_string "mmx")
2043 (eq_attr "alternative" "6,7,8,9,10")
2044 (const_string "mmxmov")
2045 (eq_attr "alternative" "11")
2046 (const_string "sselog1")
2047 (eq_attr "alternative" "12,13,14,15,16")
2048 (const_string "ssemov")
2049 (eq_attr "alternative" "17,18")
2050 (const_string "ssecvt")
2051 (eq_attr "alternative" "4")
2052 (const_string "multi")
2053 (match_operand:DI 1 "pic_32bit_operand" "")
2054 (const_string "lea")
2056 (const_string "imov")))
2059 (and (eq_attr "alternative" "2") (eq_attr "type" "imov"))
2061 (const_string "*")))
2062 (set (attr "length_immediate")
2064 (and (eq_attr "alternative" "2") (eq_attr "type" "imov"))
2066 (const_string "*")))
2067 (set_attr "prefix_rex" "*,*,*,*,*,*,*,1,*,1,*,*,*,*,*,*,*,*,*")
2068 (set_attr "prefix_data16" "*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,1,*,*,*")
2069 (set (attr "prefix")
2070 (if_then_else (eq_attr "alternative" "11,12,13,14,15,16")
2071 (const_string "maybe_vex")
2072 (const_string "orig")))
2073 (set_attr "mode" "SI,DI,DI,DI,SI,DI,DI,DI,DI,DI,DI,TI,TI,DI,DI,DI,DI,DI,DI")])
2075 ;; Convert impossible stores of immediate to existing instructions.
2076 ;; First try to get scratch register and go through it. In case this
2077 ;; fails, move by 32bit parts.
2079 [(match_scratch:DI 2 "r")
2080 (set (match_operand:DI 0 "memory_operand" "")
2081 (match_operand:DI 1 "immediate_operand" ""))]
2082 "TARGET_64BIT && !symbolic_operand (operands[1], DImode)
2083 && !x86_64_immediate_operand (operands[1], DImode)"
2084 [(set (match_dup 2) (match_dup 1))
2085 (set (match_dup 0) (match_dup 2))])
2087 ;; We need to define this as both peepholer and splitter for case
2088 ;; peephole2 pass is not run.
2089 ;; "&& 1" is needed to keep it from matching the previous pattern.
2091 [(set (match_operand:DI 0 "memory_operand" "")
2092 (match_operand:DI 1 "immediate_operand" ""))]
2093 "TARGET_64BIT && !symbolic_operand (operands[1], DImode)
2094 && !x86_64_immediate_operand (operands[1], DImode) && 1"
2095 [(set (match_dup 2) (match_dup 3))
2096 (set (match_dup 4) (match_dup 5))]
2097 "split_double_mode (DImode, &operands[0], 2, &operands[2], &operands[4]);")
2100 [(set (match_operand:DI 0 "memory_operand" "")
2101 (match_operand:DI 1 "immediate_operand" ""))]
2102 "TARGET_64BIT && ((optimize > 0 && flag_peephole2)
2103 ? epilogue_completed : reload_completed)
2104 && !symbolic_operand (operands[1], DImode)
2105 && !x86_64_immediate_operand (operands[1], DImode)"
2106 [(set (match_dup 2) (match_dup 3))
2107 (set (match_dup 4) (match_dup 5))]
2108 "split_double_mode (DImode, &operands[0], 2, &operands[2], &operands[4]);")
2110 (define_insn "*movdi_internal"
2111 [(set (match_operand:DI 0 "nonimmediate_operand"
2112 "=r ,o ,*y,m*y,*y,*Y2,m ,*Y2,*Y2,*x,m ,*x,*x")
2113 (match_operand:DI 1 "general_operand"
2114 "riFo,riF,C ,*y ,m ,C ,*Y2,*Y2,m ,C ,*x,*x,m "))]
2115 "!TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
2120 movq\t{%1, %0|%0, %1}
2121 movq\t{%1, %0|%0, %1}
2123 %vmovq\t{%1, %0|%0, %1}
2124 %vmovdqa\t{%1, %0|%0, %1}
2125 %vmovq\t{%1, %0|%0, %1}
2127 movlps\t{%1, %0|%0, %1}
2128 movaps\t{%1, %0|%0, %1}
2129 movlps\t{%1, %0|%0, %1}"
2131 (if_then_else (eq_attr "alternative" "9,10,11,12")
2132 (const_string "noavx")
2133 (const_string "base")))
2134 (set_attr "type" "*,*,mmx,mmxmov,mmxmov,sselog1,ssemov,ssemov,ssemov,sselog1,ssemov,ssemov,ssemov")
2135 (set (attr "prefix")
2136 (if_then_else (eq_attr "alternative" "5,6,7,8")
2137 (const_string "maybe_vex")
2138 (const_string "orig")))
2139 (set_attr "mode" "DI,DI,DI,DI,DI,TI,DI,TI,DI,V4SF,V2SF,V4SF,V2SF")])
2142 [(set (match_operand:DI 0 "nonimmediate_operand" "")
2143 (match_operand:DI 1 "general_operand" ""))]
2144 "!TARGET_64BIT && reload_completed
2145 && !(MMX_REG_P (operands[0]) || SSE_REG_P (operands[0]))
2146 && !(MMX_REG_P (operands[1]) || SSE_REG_P (operands[1]))"
2148 "ix86_split_long_move (operands); DONE;")
2150 (define_insn "*movsi_internal"
2151 [(set (match_operand:SI 0 "nonimmediate_operand"
2152 "=r,m ,*y,*y,?rm,?*y,*x,*x,?r ,m ,?*Yi,*x")
2153 (match_operand:SI 1 "general_operand"
2154 "g ,ri,C ,*y,*y ,rm ,C ,*x,*Yi,*x,r ,m "))]
2155 "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
2157 switch (get_attr_type (insn))
2160 if (get_attr_mode (insn) == MODE_TI)
2161 return "%vpxor\t%0, %d0";
2162 return "%vxorps\t%0, %d0";
2165 switch (get_attr_mode (insn))
2168 return "%vmovdqa\t{%1, %0|%0, %1}";
2170 return "%vmovaps\t{%1, %0|%0, %1}";
2172 return "%vmovd\t{%1, %0|%0, %1}";
2174 return "%vmovss\t{%1, %0|%0, %1}";
2180 return "pxor\t%0, %0";
2183 if (get_attr_mode (insn) == MODE_DI)
2184 return "movq\t{%1, %0|%0, %1}";
2185 return "movd\t{%1, %0|%0, %1}";
2188 return "lea{l}\t{%a1, %0|%0, %a1}";
2191 gcc_assert (!flag_pic || LEGITIMATE_PIC_OPERAND_P (operands[1]));
2192 return "mov{l}\t{%1, %0|%0, %1}";
2196 (cond [(eq_attr "alternative" "2")
2197 (const_string "mmx")
2198 (eq_attr "alternative" "3,4,5")
2199 (const_string "mmxmov")
2200 (eq_attr "alternative" "6")
2201 (const_string "sselog1")
2202 (eq_attr "alternative" "7,8,9,10,11")
2203 (const_string "ssemov")
2204 (match_operand:DI 1 "pic_32bit_operand" "")
2205 (const_string "lea")
2207 (const_string "imov")))
2208 (set (attr "prefix")
2209 (if_then_else (eq_attr "alternative" "0,1,2,3,4,5")
2210 (const_string "orig")
2211 (const_string "maybe_vex")))
2212 (set (attr "prefix_data16")
2213 (if_then_else (and (eq_attr "type" "ssemov") (eq_attr "mode" "SI"))
2215 (const_string "*")))
2217 (cond [(eq_attr "alternative" "2,3")
2219 (eq_attr "alternative" "6,7")
2221 (eq (symbol_ref "TARGET_SSE2") (const_int 0))
2222 (const_string "V4SF")
2223 (const_string "TI"))
2224 (and (eq_attr "alternative" "8,9,10,11")
2225 (eq (symbol_ref "TARGET_SSE2") (const_int 0)))
2228 (const_string "SI")))])
2230 (define_insn "*movhi_internal"
2231 [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,r,m")
2232 (match_operand:HI 1 "general_operand" "r,rn,rm,rn"))]
2233 "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
2235 switch (get_attr_type (insn))
2238 /* movzwl is faster than movw on p2 due to partial word stalls,
2239 though not as fast as an aligned movl. */
2240 return "movz{wl|x}\t{%1, %k0|%k0, %1}";
2242 if (get_attr_mode (insn) == MODE_SI)
2243 return "mov{l}\t{%k1, %k0|%k0, %k1}";
2245 return "mov{w}\t{%1, %0|%0, %1}";
2249 (cond [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
2251 (const_string "imov")
2252 (and (eq_attr "alternative" "0")
2253 (ior (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
2255 (eq (symbol_ref "TARGET_HIMODE_MATH")
2257 (const_string "imov")
2258 (and (eq_attr "alternative" "1,2")
2259 (match_operand:HI 1 "aligned_operand" ""))
2260 (const_string "imov")
2261 (and (ne (symbol_ref "TARGET_MOVX")
2263 (eq_attr "alternative" "0,2"))
2264 (const_string "imovx")
2266 (const_string "imov")))
2268 (cond [(eq_attr "type" "imovx")
2270 (and (eq_attr "alternative" "1,2")
2271 (match_operand:HI 1 "aligned_operand" ""))
2273 (and (eq_attr "alternative" "0")
2274 (ior (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
2276 (eq (symbol_ref "TARGET_HIMODE_MATH")
2280 (const_string "HI")))])
2282 ;; Situation is quite tricky about when to choose full sized (SImode) move
2283 ;; over QImode moves. For Q_REG -> Q_REG move we use full size only for
2284 ;; partial register dependency machines (such as AMD Athlon), where QImode
2285 ;; moves issue extra dependency and for partial register stalls machines
2286 ;; that don't use QImode patterns (and QImode move cause stall on the next
2289 ;; For loads of Q_REG to NONQ_REG we use full sized moves except for partial
2290 ;; register stall machines with, where we use QImode instructions, since
2291 ;; partial register stall can be caused there. Then we use movzx.
2292 (define_insn "*movqi_internal"
2293 [(set (match_operand:QI 0 "nonimmediate_operand" "=q,q ,q ,r,r ,?r,m")
2294 (match_operand:QI 1 "general_operand" " q,qn,qm,q,rn,qm,qn"))]
2295 "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
2297 switch (get_attr_type (insn))
2300 gcc_assert (ANY_QI_REG_P (operands[1]) || MEM_P (operands[1]));
2301 return "movz{bl|x}\t{%1, %k0|%k0, %1}";
2303 if (get_attr_mode (insn) == MODE_SI)
2304 return "mov{l}\t{%k1, %k0|%k0, %k1}";
2306 return "mov{b}\t{%1, %0|%0, %1}";
2310 (cond [(and (eq_attr "alternative" "5")
2311 (not (match_operand:QI 1 "aligned_operand" "")))
2312 (const_string "imovx")
2313 (ne (symbol_ref "optimize_function_for_size_p (cfun)")
2315 (const_string "imov")
2316 (and (eq_attr "alternative" "3")
2317 (ior (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
2319 (eq (symbol_ref "TARGET_QIMODE_MATH")
2321 (const_string "imov")
2322 (eq_attr "alternative" "3,5")
2323 (const_string "imovx")
2324 (and (ne (symbol_ref "TARGET_MOVX")
2326 (eq_attr "alternative" "2"))
2327 (const_string "imovx")
2329 (const_string "imov")))
2331 (cond [(eq_attr "alternative" "3,4,5")
2333 (eq_attr "alternative" "6")
2335 (eq_attr "type" "imovx")
2337 (and (eq_attr "type" "imov")
2338 (and (eq_attr "alternative" "0,1")
2339 (and (ne (symbol_ref "TARGET_PARTIAL_REG_DEPENDENCY")
2341 (and (eq (symbol_ref "optimize_function_for_size_p (cfun)")
2343 (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
2346 ;; Avoid partial register stalls when not using QImode arithmetic
2347 (and (eq_attr "type" "imov")
2348 (and (eq_attr "alternative" "0,1")
2349 (and (ne (symbol_ref "TARGET_PARTIAL_REG_STALL")
2351 (eq (symbol_ref "TARGET_QIMODE_MATH")
2355 (const_string "QI")))])
2357 ;; Stores and loads of ax to arbitrary constant address.
2358 ;; We fake an second form of instruction to force reload to load address
2359 ;; into register when rax is not available
2360 (define_insn "*movabs<mode>_1"
2361 [(set (mem:SWI1248x (match_operand:DI 0 "x86_64_movabs_operand" "i,r"))
2362 (match_operand:SWI1248x 1 "nonmemory_operand" "a,er"))]
2363 "TARGET_64BIT && ix86_check_movabs (insn, 0)"
2365 movabs{<imodesuffix>}\t{%1, %P0|%P0, %1}
2366 mov{<imodesuffix>}\t{%1, %a0|%a0, %1}"
2367 [(set_attr "type" "imov")
2368 (set_attr "modrm" "0,*")
2369 (set_attr "length_address" "8,0")
2370 (set_attr "length_immediate" "0,*")
2371 (set_attr "memory" "store")
2372 (set_attr "mode" "<MODE>")])
2374 (define_insn "*movabs<mode>_2"
2375 [(set (match_operand:SWI1248x 0 "register_operand" "=a,r")
2376 (mem:SWI1248x (match_operand:DI 1 "x86_64_movabs_operand" "i,r")))]
2377 "TARGET_64BIT && ix86_check_movabs (insn, 1)"
2379 movabs{<imodesuffix>}\t{%P1, %0|%0, %P1}
2380 mov{<imodesuffix>}\t{%a1, %0|%0, %a1}"
2381 [(set_attr "type" "imov")
2382 (set_attr "modrm" "0,*")
2383 (set_attr "length_address" "8,0")
2384 (set_attr "length_immediate" "0")
2385 (set_attr "memory" "load")
2386 (set_attr "mode" "<MODE>")])
2388 (define_insn "*swap<mode>"
2389 [(set (match_operand:SWI48 0 "register_operand" "+r")
2390 (match_operand:SWI48 1 "register_operand" "+r"))
2394 "xchg{<imodesuffix>}\t%1, %0"
2395 [(set_attr "type" "imov")
2396 (set_attr "mode" "<MODE>")
2397 (set_attr "pent_pair" "np")
2398 (set_attr "athlon_decode" "vector")
2399 (set_attr "amdfam10_decode" "double")
2400 (set_attr "bdver1_decode" "double")])
2402 (define_insn "*swap<mode>_1"
2403 [(set (match_operand:SWI12 0 "register_operand" "+r")
2404 (match_operand:SWI12 1 "register_operand" "+r"))
2407 "!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)"
2409 [(set_attr "type" "imov")
2410 (set_attr "mode" "SI")
2411 (set_attr "pent_pair" "np")
2412 (set_attr "athlon_decode" "vector")
2413 (set_attr "amdfam10_decode" "double")
2414 (set_attr "bdver1_decode" "double")])
2416 ;; Not added amdfam10_decode since TARGET_PARTIAL_REG_STALL
2417 ;; is disabled for AMDFAM10
2418 (define_insn "*swap<mode>_2"
2419 [(set (match_operand:SWI12 0 "register_operand" "+<r>")
2420 (match_operand:SWI12 1 "register_operand" "+<r>"))
2423 "TARGET_PARTIAL_REG_STALL"
2424 "xchg{<imodesuffix>}\t%1, %0"
2425 [(set_attr "type" "imov")
2426 (set_attr "mode" "<MODE>")
2427 (set_attr "pent_pair" "np")
2428 (set_attr "athlon_decode" "vector")])
2430 (define_expand "movstrict<mode>"
2431 [(set (strict_low_part (match_operand:SWI12 0 "nonimmediate_operand" ""))
2432 (match_operand:SWI12 1 "general_operand" ""))]
2435 if (TARGET_PARTIAL_REG_STALL && optimize_function_for_speed_p (cfun))
2437 if (GET_CODE (operands[0]) == SUBREG
2438 && GET_MODE_CLASS (GET_MODE (SUBREG_REG (operands[0]))) != MODE_INT)
2440 /* Don't generate memory->memory moves, go through a register */
2441 if (MEM_P (operands[0]) && MEM_P (operands[1]))
2442 operands[1] = force_reg (<MODE>mode, operands[1]);
2445 (define_insn "*movstrict<mode>_1"
2446 [(set (strict_low_part
2447 (match_operand:SWI12 0 "nonimmediate_operand" "+<r>m,<r>"))
2448 (match_operand:SWI12 1 "general_operand" "<r>n,m"))]
2449 "(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
2450 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
2451 "mov{<imodesuffix>}\t{%1, %0|%0, %1}"
2452 [(set_attr "type" "imov")
2453 (set_attr "mode" "<MODE>")])
2455 (define_insn "*movstrict<mode>_xor"
2456 [(set (strict_low_part (match_operand:SWI12 0 "register_operand" "+<r>"))
2457 (match_operand:SWI12 1 "const0_operand" ""))
2458 (clobber (reg:CC FLAGS_REG))]
2460 "xor{<imodesuffix>}\t%0, %0"
2461 [(set_attr "type" "alu1")
2462 (set_attr "mode" "<MODE>")
2463 (set_attr "length_immediate" "0")])
2465 (define_insn "*mov<mode>_extv_1"
2466 [(set (match_operand:SWI24 0 "register_operand" "=R")
2467 (sign_extract:SWI24 (match_operand 1 "ext_register_operand" "Q")
2471 "movs{bl|x}\t{%h1, %k0|%k0, %h1}"
2472 [(set_attr "type" "imovx")
2473 (set_attr "mode" "SI")])
2475 (define_insn "*movqi_extv_1_rex64"
2476 [(set (match_operand:QI 0 "register_operand" "=Q,?R")
2477 (sign_extract:QI (match_operand 1 "ext_register_operand" "Q,Q")
2482 switch (get_attr_type (insn))
2485 return "movs{bl|x}\t{%h1, %k0|%k0, %h1}";
2487 return "mov{b}\t{%h1, %0|%0, %h1}";
2491 (if_then_else (ior (not (match_operand:QI 0 "QIreg_operand" ""))
2492 (ne (symbol_ref "TARGET_MOVX")
2494 (const_string "imovx")
2495 (const_string "imov")))
2497 (if_then_else (eq_attr "type" "imovx")
2499 (const_string "QI")))])
2501 (define_insn "*movqi_extv_1"
2502 [(set (match_operand:QI 0 "nonimmediate_operand" "=Qm,?r")
2503 (sign_extract:QI (match_operand 1 "ext_register_operand" "Q,Q")
2508 switch (get_attr_type (insn))
2511 return "movs{bl|x}\t{%h1, %k0|%k0, %h1}";
2513 return "mov{b}\t{%h1, %0|%0, %h1}";
2517 (if_then_else (and (match_operand:QI 0 "register_operand" "")
2518 (ior (not (match_operand:QI 0 "QIreg_operand" ""))
2519 (ne (symbol_ref "TARGET_MOVX")
2521 (const_string "imovx")
2522 (const_string "imov")))
2524 (if_then_else (eq_attr "type" "imovx")
2526 (const_string "QI")))])
2528 (define_insn "*mov<mode>_extzv_1"
2529 [(set (match_operand:SWI48 0 "register_operand" "=R")
2530 (zero_extract:SWI48 (match_operand 1 "ext_register_operand" "Q")
2534 "movz{bl|x}\t{%h1, %k0|%k0, %h1}"
2535 [(set_attr "type" "imovx")
2536 (set_attr "mode" "SI")])
2538 (define_insn "*movqi_extzv_2_rex64"
2539 [(set (match_operand:QI 0 "register_operand" "=Q,?R")
2541 (zero_extract:SI (match_operand 1 "ext_register_operand" "Q,Q")
2546 switch (get_attr_type (insn))
2549 return "movz{bl|x}\t{%h1, %k0|%k0, %h1}";
2551 return "mov{b}\t{%h1, %0|%0, %h1}";
2555 (if_then_else (ior (not (match_operand:QI 0 "QIreg_operand" ""))
2556 (ne (symbol_ref "TARGET_MOVX")
2558 (const_string "imovx")
2559 (const_string "imov")))
2561 (if_then_else (eq_attr "type" "imovx")
2563 (const_string "QI")))])
2565 (define_insn "*movqi_extzv_2"
2566 [(set (match_operand:QI 0 "nonimmediate_operand" "=Qm,?R")
2568 (zero_extract:SI (match_operand 1 "ext_register_operand" "Q,Q")
2573 switch (get_attr_type (insn))
2576 return "movz{bl|x}\t{%h1, %k0|%k0, %h1}";
2578 return "mov{b}\t{%h1, %0|%0, %h1}";
2582 (if_then_else (and (match_operand:QI 0 "register_operand" "")
2583 (ior (not (match_operand:QI 0 "QIreg_operand" ""))
2584 (ne (symbol_ref "TARGET_MOVX")
2586 (const_string "imovx")
2587 (const_string "imov")))
2589 (if_then_else (eq_attr "type" "imovx")
2591 (const_string "QI")))])
2593 (define_expand "mov<mode>_insv_1"
2594 [(set (zero_extract:SWI48 (match_operand 0 "ext_register_operand" "")
2597 (match_operand:SWI48 1 "nonmemory_operand" ""))])
2599 (define_insn "*mov<mode>_insv_1_rex64"
2600 [(set (zero_extract:SWI48x (match_operand 0 "ext_register_operand" "+Q")
2603 (match_operand:SWI48x 1 "nonmemory_operand" "Qn"))]
2605 "mov{b}\t{%b1, %h0|%h0, %b1}"
2606 [(set_attr "type" "imov")
2607 (set_attr "mode" "QI")])
2609 (define_insn "*movsi_insv_1"
2610 [(set (zero_extract:SI (match_operand 0 "ext_register_operand" "+Q")
2613 (match_operand:SI 1 "general_operand" "Qmn"))]
2615 "mov{b}\t{%b1, %h0|%h0, %b1}"
2616 [(set_attr "type" "imov")
2617 (set_attr "mode" "QI")])
2619 (define_insn "*movqi_insv_2"
2620 [(set (zero_extract:SI (match_operand 0 "ext_register_operand" "+Q")
2623 (lshiftrt:SI (match_operand:SI 1 "register_operand" "Q")
2626 "mov{b}\t{%h1, %h0|%h0, %h1}"
2627 [(set_attr "type" "imov")
2628 (set_attr "mode" "QI")])
2630 ;; Floating point push instructions.
2632 (define_insn "*pushtf"
2633 [(set (match_operand:TF 0 "push_operand" "=<,<,<")
2634 (match_operand:TF 1 "general_no_elim_operand" "x,Fo,*r"))]
2637 /* This insn should be already split before reg-stack. */
2640 [(set_attr "type" "multi")
2641 (set_attr "unit" "sse,*,*")
2642 (set_attr "mode" "TF,SI,SI")])
2645 [(set (match_operand:TF 0 "push_operand" "")
2646 (match_operand:TF 1 "sse_reg_operand" ""))]
2647 "TARGET_SSE2 && reload_completed"
2648 [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (const_int -16)))
2649 (set (mem:TF (reg:P SP_REG)) (match_dup 1))])
2652 [(set (match_operand:TF 0 "push_operand" "")
2653 (match_operand:TF 1 "general_operand" ""))]
2654 "TARGET_SSE2 && reload_completed
2655 && !SSE_REG_P (operands[1])"
2657 "ix86_split_long_move (operands); DONE;")
2659 (define_insn "*pushxf"
2660 [(set (match_operand:XF 0 "push_operand" "=<,<")
2661 (match_operand:XF 1 "general_no_elim_operand" "f,ro"))]
2662 "optimize_function_for_speed_p (cfun)"
2664 /* This insn should be already split before reg-stack. */
2667 [(set_attr "type" "multi")
2668 (set_attr "unit" "i387,*")
2669 (set_attr "mode" "XF,SI")])
2671 ;; Size of pushxf is 3 (for sub) + 2 (for fstp) + memory operand size.
2672 ;; Size of pushxf using integer instructions is 3+3*memory operand size
2673 ;; Pushing using integer instructions is longer except for constants
2674 ;; and direct memory references (assuming that any given constant is pushed
2675 ;; only once, but this ought to be handled elsewhere).
2677 (define_insn "*pushxf_nointeger"
2678 [(set (match_operand:XF 0 "push_operand" "=X,X,X")
2679 (match_operand:XF 1 "general_no_elim_operand" "f,Fo,*r"))]
2680 "optimize_function_for_size_p (cfun)"
2682 /* This insn should be already split before reg-stack. */
2685 [(set_attr "type" "multi")
2686 (set_attr "unit" "i387,*,*")
2687 (set_attr "mode" "XF,SI,SI")])
2690 [(set (match_operand:XF 0 "push_operand" "")
2691 (match_operand:XF 1 "fp_register_operand" ""))]
2693 [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
2694 (set (mem:XF (reg:P SP_REG)) (match_dup 1))]
2695 "operands[2] = GEN_INT (-GET_MODE_SIZE (XFmode));")
2698 [(set (match_operand:XF 0 "push_operand" "")
2699 (match_operand:XF 1 "general_operand" ""))]
2701 && !FP_REG_P (operands[1])"
2703 "ix86_split_long_move (operands); DONE;")
2705 ;; Size of pushdf is 3 (for sub) + 2 (for fstp) + memory operand size.
2706 ;; Size of pushdf using integer instructions is 2+2*memory operand size
2707 ;; On the average, pushdf using integers can be still shorter.
2709 (define_insn "*pushdf"
2710 [(set (match_operand:DF 0 "push_operand" "=<,<,<")
2711 (match_operand:DF 1 "general_no_elim_operand" "f,Yd*rFo,Y2"))]
2714 /* This insn should be already split before reg-stack. */
2717 [(set_attr "type" "multi")
2718 (set_attr "unit" "i387,*,*")
2719 (set_attr "mode" "DF,SI,DF")])
2721 ;; %%% Kill this when call knows how to work this out.
2723 [(set (match_operand:DF 0 "push_operand" "")
2724 (match_operand:DF 1 "any_fp_register_operand" ""))]
2726 [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (const_int -8)))
2727 (set (mem:DF (reg:P SP_REG)) (match_dup 1))])
2730 [(set (match_operand:DF 0 "push_operand" "")
2731 (match_operand:DF 1 "general_operand" ""))]
2733 && !ANY_FP_REG_P (operands[1])"
2735 "ix86_split_long_move (operands); DONE;")
2737 (define_insn "*pushsf_rex64"
2738 [(set (match_operand:SF 0 "push_operand" "=X,X,X")
2739 (match_operand:SF 1 "nonmemory_no_elim_operand" "f,rF,x"))]
2742 /* Anything else should be already split before reg-stack. */
2743 gcc_assert (which_alternative == 1);
2744 return "push{q}\t%q1";
2746 [(set_attr "type" "multi,push,multi")
2747 (set_attr "unit" "i387,*,*")
2748 (set_attr "mode" "SF,DI,SF")])
2750 (define_insn "*pushsf"
2751 [(set (match_operand:SF 0 "push_operand" "=<,<,<")
2752 (match_operand:SF 1 "general_no_elim_operand" "f,rFm,x"))]
2755 /* Anything else should be already split before reg-stack. */
2756 gcc_assert (which_alternative == 1);
2757 return "push{l}\t%1";
2759 [(set_attr "type" "multi,push,multi")
2760 (set_attr "unit" "i387,*,*")
2761 (set_attr "mode" "SF,SI,SF")])
2764 [(set (match_operand:SF 0 "push_operand" "")
2765 (match_operand:SF 1 "memory_operand" ""))]
2767 && MEM_P (operands[1])
2768 && (operands[2] = find_constant_src (insn))"
2772 ;; %%% Kill this when call knows how to work this out.
2774 [(set (match_operand:SF 0 "push_operand" "")
2775 (match_operand:SF 1 "any_fp_register_operand" ""))]
2777 [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
2778 (set (mem:SF (reg:P SP_REG)) (match_dup 1))]
2779 "operands[2] = GEN_INT (-GET_MODE_SIZE (<MODE>mode));")
2781 ;; Floating point move instructions.
2783 (define_expand "movtf"
2784 [(set (match_operand:TF 0 "nonimmediate_operand" "")
2785 (match_operand:TF 1 "nonimmediate_operand" ""))]
2788 ix86_expand_move (TFmode, operands);
2792 (define_expand "mov<mode>"
2793 [(set (match_operand:X87MODEF 0 "nonimmediate_operand" "")
2794 (match_operand:X87MODEF 1 "general_operand" ""))]
2796 "ix86_expand_move (<MODE>mode, operands); DONE;")
2798 (define_insn "*movtf_internal"
2799 [(set (match_operand:TF 0 "nonimmediate_operand" "=x,m,x,?r,?o")
2800 (match_operand:TF 1 "general_operand" "xm,x,C,roF,Fr"))]
2802 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
2804 switch (which_alternative)
2808 if (get_attr_mode (insn) == MODE_V4SF)
2809 return "%vmovaps\t{%1, %0|%0, %1}";
2811 return "%vmovdqa\t{%1, %0|%0, %1}";
2814 return standard_sse_constant_opcode (insn, operands[1]);
2824 [(set_attr "type" "ssemov,ssemov,sselog1,*,*")
2825 (set_attr "prefix" "maybe_vex,maybe_vex,maybe_vex,*,*")
2827 (cond [(eq_attr "alternative" "0,2")
2829 (ne (symbol_ref "optimize_function_for_size_p (cfun)")
2831 (const_string "V4SF")
2832 (const_string "TI"))
2833 (eq_attr "alternative" "1")
2835 (ior (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
2837 (ne (symbol_ref "optimize_function_for_size_p (cfun)")
2839 (const_string "V4SF")
2840 (const_string "TI"))]
2841 (const_string "DI")))])
2844 [(set (match_operand:TF 0 "nonimmediate_operand" "")
2845 (match_operand:TF 1 "general_operand" ""))]
2847 && !(SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]))"
2849 "ix86_split_long_move (operands); DONE;")
2851 (define_insn "*movxf_internal"
2852 [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f,Yx*r ,o")
2853 (match_operand:XF 1 "general_operand" "fm,f,G,Yx*roF,FYx*r"))]
2854 "!(MEM_P (operands[0]) && MEM_P (operands[1]))
2855 && (!can_create_pseudo_p ()
2856 || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
2857 || GET_CODE (operands[1]) != CONST_DOUBLE
2858 || (optimize_function_for_size_p (cfun)
2859 && standard_80387_constant_p (operands[1]) > 0)
2860 || memory_operand (operands[0], XFmode))"
2862 switch (which_alternative)
2866 return output_387_reg_move (insn, operands);
2869 return standard_80387_constant_opcode (operands[1]);
2877 [(set_attr "type" "fmov,fmov,fmov,multi,multi")
2878 (set_attr "mode" "XF,XF,XF,SI,SI")])
2881 [(set (match_operand:XF 0 "nonimmediate_operand" "")
2882 (match_operand:XF 1 "general_operand" ""))]
2884 && !(MEM_P (operands[0]) && MEM_P (operands[1]))
2885 && ! (FP_REG_P (operands[0]) ||
2886 (GET_CODE (operands[0]) == SUBREG
2887 && FP_REG_P (SUBREG_REG (operands[0]))))
2888 && ! (FP_REG_P (operands[1]) ||
2889 (GET_CODE (operands[1]) == SUBREG
2890 && FP_REG_P (SUBREG_REG (operands[1]))))"
2892 "ix86_split_long_move (operands); DONE;")
2894 (define_insn "*movdf_internal_rex64"
2895 [(set (match_operand:DF 0 "nonimmediate_operand"
2896 "=f,m,f,r ,m,!r,!m,Y2*x,Y2*x,Y2*x,m ,Yi,r ")
2897 (match_operand:DF 1 "general_operand"
2898 "fm,f,G,rm,r,F ,F ,C ,Y2*x,m ,Y2*x,r ,Yi"))]
2899 "TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))
2900 && (!can_create_pseudo_p ()
2901 || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
2902 || GET_CODE (operands[1]) != CONST_DOUBLE
2903 || (optimize_function_for_size_p (cfun)
2904 && ((!(TARGET_SSE2 && TARGET_SSE_MATH)
2905 && standard_80387_constant_p (operands[1]) > 0)
2906 || (TARGET_SSE2 && TARGET_SSE_MATH
2907 && standard_sse_constant_p (operands[1]))))
2908 || memory_operand (operands[0], DFmode))"
2910 switch (which_alternative)
2914 return output_387_reg_move (insn, operands);
2917 return standard_80387_constant_opcode (operands[1]);
2921 return "mov{q}\t{%1, %0|%0, %1}";
2924 return "movabs{q}\t{%1, %0|%0, %1}";
2930 return standard_sse_constant_opcode (insn, operands[1]);
2935 switch (get_attr_mode (insn))
2938 return "%vmovaps\t{%1, %0|%0, %1}";
2940 if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
2941 return "%vmovaps\t{%1, %0|%0, %1}";
2943 return "%vmovapd\t{%1, %0|%0, %1}";
2945 if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
2946 return "%vmovaps\t{%1, %0|%0, %1}";
2948 return "%vmovdqa\t{%1, %0|%0, %1}";
2950 return "%vmovq\t{%1, %0|%0, %1}";
2952 if (TARGET_AVX && REG_P (operands[0]) && REG_P (operands[1]))
2953 return "vmovsd\t{%1, %0, %0|%0, %0, %1}";
2955 return "%vmovsd\t{%1, %0|%0, %1}";
2957 return "%vmovlpd\t{%1, %d0|%d0, %1}";
2959 return "%vmovlps\t{%1, %d0|%d0, %1}";
2966 /* Handle broken assemblers that require movd instead of movq. */
2967 return "%vmovd\t{%1, %0|%0, %1}";
2973 [(set_attr "type" "fmov,fmov,fmov,imov,imov,imov,multi,sselog1,ssemov,ssemov,ssemov,ssemov,ssemov")
2976 (and (eq_attr "alternative" "5") (eq_attr "type" "imov"))
2978 (const_string "*")))
2979 (set (attr "length_immediate")
2981 (and (eq_attr "alternative" "5") (eq_attr "type" "imov"))
2983 (const_string "*")))
2984 (set (attr "prefix")
2985 (if_then_else (eq_attr "alternative" "0,1,2,3,4,5,6")
2986 (const_string "orig")
2987 (const_string "maybe_vex")))
2988 (set (attr "prefix_data16")
2989 (if_then_else (eq_attr "mode" "V1DF")
2991 (const_string "*")))
2993 (cond [(eq_attr "alternative" "0,1,2")
2995 (eq_attr "alternative" "3,4,5,6,11,12")
2998 /* For SSE1, we have many fewer alternatives. */
2999 (eq (symbol_ref "TARGET_SSE2") (const_int 0))
3000 (cond [(eq_attr "alternative" "7,8")
3001 (const_string "V4SF")
3003 (const_string "V2SF"))
3005 /* xorps is one byte shorter. */
3006 (eq_attr "alternative" "7")
3007 (cond [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
3009 (const_string "V4SF")
3010 (ne (symbol_ref "TARGET_SSE_LOAD0_BY_PXOR")
3014 (const_string "V2DF"))
3016 /* For architectures resolving dependencies on
3017 whole SSE registers use APD move to break dependency
3018 chains, otherwise use short move to avoid extra work.
3020 movaps encodes one byte shorter. */
3021 (eq_attr "alternative" "8")
3023 [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
3025 (const_string "V4SF")
3026 (ne (symbol_ref "TARGET_SSE_PARTIAL_REG_DEPENDENCY")
3028 (const_string "V2DF")
3030 (const_string "DF"))
3031 /* For architectures resolving dependencies on register
3032 parts we may avoid extra work to zero out upper part
3034 (eq_attr "alternative" "9")
3036 (ne (symbol_ref "TARGET_SSE_SPLIT_REGS")
3038 (const_string "V1DF")
3039 (const_string "DF"))
3041 (const_string "DF")))])
3043 ;; Possible store forwarding (partial memory) stall in alternative 4.
3044 (define_insn "*movdf_internal"
3045 [(set (match_operand:DF 0 "nonimmediate_operand"
3046 "=f,m,f,Yd*r ,o ,Y2*x,Y2*x,Y2*x,m ")
3047 (match_operand:DF 1 "general_operand"
3048 "fm,f,G,Yd*roF,FYd*r,C ,Y2*x,m ,Y2*x"))]
3049 "!TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))
3050 && (!can_create_pseudo_p ()
3051 || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
3052 || GET_CODE (operands[1]) != CONST_DOUBLE
3053 || (!TARGET_INTEGER_DFMODE_MOVES
3054 && ((!(TARGET_SSE2 && TARGET_SSE_MATH)
3055 && standard_80387_constant_p (operands[1]) > 0)
3056 || (TARGET_SSE2 && TARGET_SSE_MATH
3057 && standard_sse_constant_p (operands[1])))
3058 && !memory_operand (operands[0], DFmode))
3059 || ((TARGET_INTEGER_DFMODE_MOVES
3060 || !TARGET_MEMORY_MISMATCH_STALL)
3061 && memory_operand (operands[0], DFmode)))"
3063 switch (which_alternative)
3067 return output_387_reg_move (insn, operands);
3070 return standard_80387_constant_opcode (operands[1]);
3077 return standard_sse_constant_opcode (insn, operands[1]);
3082 switch (get_attr_mode (insn))
3085 return "%vmovaps\t{%1, %0|%0, %1}";
3087 if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
3088 return "%vmovaps\t{%1, %0|%0, %1}";
3090 return "%vmovapd\t{%1, %0|%0, %1}";
3092 if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
3093 return "%vmovaps\t{%1, %0|%0, %1}";
3095 return "%vmovdqa\t{%1, %0|%0, %1}";
3097 return "%vmovq\t{%1, %0|%0, %1}";
3099 if (TARGET_AVX && REG_P (operands[0]) && REG_P (operands[1]))
3100 return "vmovsd\t{%1, %0, %0|%0, %0, %1}";
3102 return "%vmovsd\t{%1, %0|%0, %1}";
3104 if (TARGET_AVX && REG_P (operands[0]))
3105 return "vmovlpd\t{%1, %0, %0|%0, %0, %1}";
3107 return "%vmovlpd\t{%1, %0|%0, %1}";
3109 if (TARGET_AVX && REG_P (operands[0]))
3110 return "vmovlps\t{%1, %0, %0|%0, %0, %1}";
3112 return "%vmovlps\t{%1, %0|%0, %1}";
3121 [(set_attr "type" "fmov,fmov,fmov,multi,multi,sselog1,ssemov,ssemov,ssemov")
3122 (set (attr "prefix")
3123 (if_then_else (eq_attr "alternative" "0,1,2,3,4")
3124 (const_string "orig")
3125 (const_string "maybe_vex")))
3126 (set (attr "prefix_data16")
3127 (if_then_else (eq_attr "mode" "V1DF")
3129 (const_string "*")))
3131 (cond [(eq_attr "alternative" "0,1,2")
3133 (eq_attr "alternative" "3,4")
3136 /* For SSE1, we have many fewer alternatives. */
3137 (eq (symbol_ref "TARGET_SSE2") (const_int 0))
3138 (cond [(eq_attr "alternative" "5,6")
3139 (const_string "V4SF")
3141 (const_string "V2SF"))
3143 /* xorps is one byte shorter. */
3144 (eq_attr "alternative" "5")
3145 (cond [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
3147 (const_string "V4SF")
3148 (ne (symbol_ref "TARGET_SSE_LOAD0_BY_PXOR")
3152 (const_string "V2DF"))
3154 /* For architectures resolving dependencies on
3155 whole SSE registers use APD move to break dependency
3156 chains, otherwise use short move to avoid extra work.
3158 movaps encodes one byte shorter. */
3159 (eq_attr "alternative" "6")
3161 [(ne (symbol_ref "optimize_function_for_size_p (cfun)")
3163 (const_string "V4SF")
3164 (ne (symbol_ref "TARGET_SSE_PARTIAL_REG_DEPENDENCY")
3166 (const_string "V2DF")
3168 (const_string "DF"))
3169 /* For architectures resolving dependencies on register
3170 parts we may avoid extra work to zero out upper part
3172 (eq_attr "alternative" "7")
3174 (ne (symbol_ref "TARGET_SSE_SPLIT_REGS")
3176 (const_string "V1DF")
3177 (const_string "DF"))
3179 (const_string "DF")))])
3182 [(set (match_operand:DF 0 "nonimmediate_operand" "")
3183 (match_operand:DF 1 "general_operand" ""))]
3185 && !(MEM_P (operands[0]) && MEM_P (operands[1]))
3186 && ! (ANY_FP_REG_P (operands[0]) ||
3187 (GET_CODE (operands[0]) == SUBREG
3188 && ANY_FP_REG_P (SUBREG_REG (operands[0]))))
3189 && ! (ANY_FP_REG_P (operands[1]) ||
3190 (GET_CODE (operands[1]) == SUBREG
3191 && ANY_FP_REG_P (SUBREG_REG (operands[1]))))"
3193 "ix86_split_long_move (operands); DONE;")
3195 (define_insn "*movsf_internal"
3196 [(set (match_operand:SF 0 "nonimmediate_operand"
3197 "=f,m,f,r ,m ,x,x,x ,m,!*y,!m,!*y,?Yi,?r,!*Ym,!r")
3198 (match_operand:SF 1 "general_operand"
3199 "fm,f,G,rmF,Fr,C,x,xm,x,m ,*y,*y ,r ,Yi,r ,*Ym"))]
3200 "!(MEM_P (operands[0]) && MEM_P (operands[1]))
3201 && (!can_create_pseudo_p ()
3202 || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
3203 || GET_CODE (operands[1]) != CONST_DOUBLE
3204 || (optimize_function_for_size_p (cfun)
3205 && ((!TARGET_SSE_MATH
3206 && standard_80387_constant_p (operands[1]) > 0)
3208 && standard_sse_constant_p (operands[1]))))
3209 || memory_operand (operands[0], SFmode))"
3211 switch (which_alternative)
3215 return output_387_reg_move (insn, operands);
3218 return standard_80387_constant_opcode (operands[1]);
3222 return "mov{l}\t{%1, %0|%0, %1}";
3225 return standard_sse_constant_opcode (insn, operands[1]);
3228 if (get_attr_mode (insn) == MODE_V4SF)
3229 return "%vmovaps\t{%1, %0|%0, %1}";
3231 return "%vmovss\t{%1, %d0|%d0, %1}";
3233 if (TARGET_AVX && REG_P (operands[1]))
3234 return "vmovss\t{%1, %0, %0|%0, %0, %1}";
3236 return "%vmovss\t{%1, %0|%0, %1}";
3238 return "%vmovss\t{%1, %0|%0, %1}";
3240 case 9: case 10: case 14: case 15:
3241 return "movd\t{%1, %0|%0, %1}";
3244 return "movq\t{%1, %0|%0, %1}";
3247 return "%vmovd\t{%1, %0|%0, %1}";
3253 [(set_attr "type" "fmov,fmov,fmov,imov,imov,sselog1,ssemov,ssemov,ssemov,mmxmov,mmxmov,mmxmov,ssemov,ssemov,mmxmov,mmxmov")
3254 (set (attr "prefix")
3255 (if_then_else (eq_attr "alternative" "5,6,7,8,12,13")
3256 (const_string "maybe_vex")
3257 (const_string "orig")))
3259 (cond [(eq_attr "alternative" "3,4,9,10")
3261 (eq_attr "alternative" "5")
3263 (and (and (ne (symbol_ref "TARGET_SSE_LOAD0_BY_PXOR")
3265 (ne (symbol_ref "TARGET_SSE2")
3267 (eq (symbol_ref "optimize_function_for_size_p (cfun)")
3270 (const_string "V4SF"))
3271 /* For architectures resolving dependencies on
3272 whole SSE registers use APS move to break dependency
3273 chains, otherwise use short move to avoid extra work.
3275 Do the same for architectures resolving dependencies on
3276 the parts. While in DF mode it is better to always handle
3277 just register parts, the SF mode is different due to lack
3278 of instructions to load just part of the register. It is
3279 better to maintain the whole registers in single format
3280 to avoid problems on using packed logical operations. */
3281 (eq_attr "alternative" "6")
3283 (ior (ne (symbol_ref "TARGET_SSE_PARTIAL_REG_DEPENDENCY")
3285 (ne (symbol_ref "TARGET_SSE_SPLIT_REGS")
3287 (const_string "V4SF")
3288 (const_string "SF"))
3289 (eq_attr "alternative" "11")
3290 (const_string "DI")]
3291 (const_string "SF")))])
3294 [(set (match_operand 0 "register_operand" "")
3295 (match_operand 1 "memory_operand" ""))]
3297 && MEM_P (operands[1])
3298 && (GET_MODE (operands[0]) == TFmode
3299 || GET_MODE (operands[0]) == XFmode
3300 || GET_MODE (operands[0]) == DFmode
3301 || GET_MODE (operands[0]) == SFmode)
3302 && (operands[2] = find_constant_src (insn))"
3303 [(set (match_dup 0) (match_dup 2))]
3305 rtx c = operands[2];
3306 rtx r = operands[0];
3308 if (GET_CODE (r) == SUBREG)
3313 if (!standard_sse_constant_p (c))
3316 else if (FP_REG_P (r))
3318 if (standard_80387_constant_p (c) < 1)
3321 else if (MMX_REG_P (r))
3326 [(set (match_operand 0 "register_operand" "")
3327 (float_extend (match_operand 1 "memory_operand" "")))]
3329 && MEM_P (operands[1])
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 rtx r = operands[0];
3340 if (GET_CODE (r) == SUBREG)
3345 if (!standard_sse_constant_p (c))
3348 else if (FP_REG_P (r))
3350 if (standard_80387_constant_p (c) < 1)
3353 else if (MMX_REG_P (r))
3357 ;; Split the load of -0.0 or -1.0 into fldz;fchs or fld1;fchs sequence
3359 [(set (match_operand:X87MODEF 0 "register_operand" "")
3360 (match_operand:X87MODEF 1 "immediate_operand" ""))]
3361 "reload_completed && FP_REGNO_P (REGNO (operands[0]))
3362 && (standard_80387_constant_p (operands[1]) == 8
3363 || standard_80387_constant_p (operands[1]) == 9)"
3364 [(set (match_dup 0)(match_dup 1))
3366 (neg:X87MODEF (match_dup 0)))]
3370 REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
3371 if (real_isnegzero (&r))
3372 operands[1] = CONST0_RTX (<MODE>mode);
3374 operands[1] = CONST1_RTX (<MODE>mode);
3377 (define_insn "swapxf"
3378 [(set (match_operand:XF 0 "register_operand" "+f")
3379 (match_operand:XF 1 "register_operand" "+f"))
3384 if (STACK_TOP_P (operands[0]))
3389 [(set_attr "type" "fxch")
3390 (set_attr "mode" "XF")])
3392 (define_insn "*swap<mode>"
3393 [(set (match_operand:MODEF 0 "fp_register_operand" "+f")
3394 (match_operand:MODEF 1 "fp_register_operand" "+f"))
3397 "TARGET_80387 || reload_completed"
3399 if (STACK_TOP_P (operands[0]))
3404 [(set_attr "type" "fxch")
3405 (set_attr "mode" "<MODE>")])
3407 ;; Zero extension instructions
3409 (define_expand "zero_extendsidi2"
3410 [(set (match_operand:DI 0 "nonimmediate_operand" "")
3411 (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "")))]
3416 emit_insn (gen_zero_extendsidi2_1 (operands[0], operands[1]));
3421 (define_insn "*zero_extendsidi2_rex64"
3422 [(set (match_operand:DI 0 "nonimmediate_operand" "=r,o,?*Ym,?*y,?*Yi,*Y2")
3424 (match_operand:SI 1 "nonimmediate_operand" "rm,0,r ,m ,r ,m")))]
3427 mov\t{%k1, %k0|%k0, %k1}
3429 movd\t{%1, %0|%0, %1}
3430 movd\t{%1, %0|%0, %1}
3431 %vmovd\t{%1, %0|%0, %1}
3432 %vmovd\t{%1, %0|%0, %1}"
3433 [(set_attr "type" "imovx,imov,mmxmov,mmxmov,ssemov,ssemov")
3434 (set_attr "prefix" "orig,*,orig,orig,maybe_vex,maybe_vex")
3435 (set_attr "prefix_0f" "0,*,*,*,*,*")
3436 (set_attr "mode" "SI,DI,DI,DI,TI,TI")])
3439 [(set (match_operand:DI 0 "memory_operand" "")
3440 (zero_extend:DI (match_dup 0)))]
3442 [(set (match_dup 4) (const_int 0))]
3443 "split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);")
3445 ;; %%% Kill me once multi-word ops are sane.
3446 (define_insn "zero_extendsidi2_1"
3447 [(set (match_operand:DI 0 "nonimmediate_operand" "=r,?r,?o,?*Ym,?*y,?*Yi,*Y2")
3449 (match_operand:SI 1 "nonimmediate_operand" "0,rm,r ,r ,m ,r ,m")))
3450 (clobber (reg:CC FLAGS_REG))]
3456 movd\t{%1, %0|%0, %1}
3457 movd\t{%1, %0|%0, %1}
3458 %vmovd\t{%1, %0|%0, %1}
3459 %vmovd\t{%1, %0|%0, %1}"
3460 [(set_attr "type" "multi,multi,multi,mmxmov,mmxmov,ssemov,ssemov")
3461 (set_attr "prefix" "*,*,*,orig,orig,maybe_vex,maybe_vex")
3462 (set_attr "mode" "SI,SI,SI,DI,DI,TI,TI")])
3465 [(set (match_operand:DI 0 "register_operand" "")
3466 (zero_extend:DI (match_operand:SI 1 "register_operand" "")))
3467 (clobber (reg:CC FLAGS_REG))]
3468 "!TARGET_64BIT && reload_completed
3469 && true_regnum (operands[0]) == true_regnum (operands[1])"
3470 [(set (match_dup 4) (const_int 0))]
3471 "split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);")
3474 [(set (match_operand:DI 0 "nonimmediate_operand" "")
3475 (zero_extend:DI (match_operand:SI 1 "general_operand" "")))
3476 (clobber (reg:CC FLAGS_REG))]
3477 "!TARGET_64BIT && reload_completed
3478 && !(MMX_REG_P (operands[0]) || SSE_REG_P (operands[0]))"
3479 [(set (match_dup 3) (match_dup 1))
3480 (set (match_dup 4) (const_int 0))]
3481 "split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);")
3483 (define_insn "zero_extend<mode>di2"
3484 [(set (match_operand:DI 0 "register_operand" "=r")
3486 (match_operand:SWI12 1 "nonimmediate_operand" "<r>m")))]
3488 "movz{<imodesuffix>l|x}\t{%1, %k0|%k0, %1}"
3489 [(set_attr "type" "imovx")
3490 (set_attr "mode" "SI")])
3492 (define_expand "zero_extendhisi2"
3493 [(set (match_operand:SI 0 "register_operand" "")
3494 (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "")))]
3497 if (TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun))
3499 operands[1] = force_reg (HImode, operands[1]);
3500 emit_insn (gen_zero_extendhisi2_and (operands[0], operands[1]));
3505 (define_insn_and_split "zero_extendhisi2_and"
3506 [(set (match_operand:SI 0 "register_operand" "=r")
3507 (zero_extend:SI (match_operand:HI 1 "register_operand" "0")))
3508 (clobber (reg:CC FLAGS_REG))]
3509 "TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun)"
3511 "&& reload_completed"
3512 [(parallel [(set (match_dup 0) (and:SI (match_dup 0) (const_int 65535)))
3513 (clobber (reg:CC FLAGS_REG))])]
3515 [(set_attr "type" "alu1")
3516 (set_attr "mode" "SI")])
3518 (define_insn "*zero_extendhisi2_movzwl"
3519 [(set (match_operand:SI 0 "register_operand" "=r")
3520 (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "rm")))]
3521 "!TARGET_ZERO_EXTEND_WITH_AND
3522 || optimize_function_for_size_p (cfun)"
3523 "movz{wl|x}\t{%1, %0|%0, %1}"
3524 [(set_attr "type" "imovx")
3525 (set_attr "mode" "SI")])
3527 (define_expand "zero_extendqi<mode>2"
3529 [(set (match_operand:SWI24 0 "register_operand" "")
3530 (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "")))
3531 (clobber (reg:CC FLAGS_REG))])])
3533 (define_insn "*zero_extendqi<mode>2_and"
3534 [(set (match_operand:SWI24 0 "register_operand" "=r,?&q")
3535 (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "0,qm")))
3536 (clobber (reg:CC FLAGS_REG))]
3537 "TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun)"
3539 [(set_attr "type" "alu1")
3540 (set_attr "mode" "<MODE>")])
3542 ;; When source and destination does not overlap, clear destination
3543 ;; first and then do the movb
3545 [(set (match_operand:SWI24 0 "register_operand" "")
3546 (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "")))
3547 (clobber (reg:CC FLAGS_REG))]
3549 && (TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun))
3550 && ANY_QI_REG_P (operands[0])
3551 && (ANY_QI_REG_P (operands[1]) || MEM_P (operands[1]))
3552 && !reg_overlap_mentioned_p (operands[0], operands[1])"
3553 [(set (strict_low_part (match_dup 2)) (match_dup 1))]
3555 operands[2] = gen_lowpart (QImode, operands[0]);
3556 ix86_expand_clear (operands[0]);
3559 (define_insn "*zero_extendqi<mode>2_movzbl_and"
3560 [(set (match_operand:SWI24 0 "register_operand" "=r,r")
3561 (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "qm,0")))
3562 (clobber (reg:CC FLAGS_REG))]
3563 "!TARGET_ZERO_EXTEND_WITH_AND || optimize_function_for_size_p (cfun)"
3565 [(set_attr "type" "imovx,alu1")
3566 (set_attr "mode" "<MODE>")])
3568 ;; For the movzbl case strip only the clobber
3570 [(set (match_operand:SWI24 0 "register_operand" "")
3571 (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "")))
3572 (clobber (reg:CC FLAGS_REG))]
3574 && (!TARGET_ZERO_EXTEND_WITH_AND || optimize_function_for_size_p (cfun))
3575 && (!REG_P (operands[1]) || ANY_QI_REG_P (operands[1]))"
3577 (zero_extend:SWI24 (match_dup 1)))])
3579 ; zero extend to SImode to avoid partial register stalls
3580 (define_insn "*zero_extendqi<mode>2_movzbl"
3581 [(set (match_operand:SWI24 0 "register_operand" "=r")
3582 (zero_extend:SWI24 (match_operand:QI 1 "nonimmediate_operand" "qm")))]
3584 && (!TARGET_ZERO_EXTEND_WITH_AND || optimize_function_for_size_p (cfun))"
3585 "movz{bl|x}\t{%1, %k0|%k0, %1}"
3586 [(set_attr "type" "imovx")
3587 (set_attr "mode" "SI")])
3589 ;; Rest is handled by single and.
3591 [(set (match_operand:SWI24 0 "register_operand" "")
3592 (zero_extend:SWI24 (match_operand:QI 1 "register_operand" "")))
3593 (clobber (reg:CC FLAGS_REG))]
3595 && true_regnum (operands[0]) == true_regnum (operands[1])"
3596 [(parallel [(set (match_dup 0) (and:SWI24 (match_dup 0) (const_int 255)))
3597 (clobber (reg:CC FLAGS_REG))])])
3599 ;; Sign extension instructions
3601 (define_expand "extendsidi2"
3602 [(set (match_operand:DI 0 "register_operand" "")
3603 (sign_extend:DI (match_operand:SI 1 "register_operand" "")))]
3608 emit_insn (gen_extendsidi2_1 (operands[0], operands[1]));
3613 (define_insn "*extendsidi2_rex64"
3614 [(set (match_operand:DI 0 "register_operand" "=*a,r")
3615 (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "*0,rm")))]
3619 movs{lq|x}\t{%1, %0|%0, %1}"
3620 [(set_attr "type" "imovx")
3621 (set_attr "mode" "DI")
3622 (set_attr "prefix_0f" "0")
3623 (set_attr "modrm" "0,1")])
3625 (define_insn "extendsidi2_1"
3626 [(set (match_operand:DI 0 "nonimmediate_operand" "=*A,r,?r,?*o")
3627 (sign_extend:DI (match_operand:SI 1 "register_operand" "0,0,r,r")))
3628 (clobber (reg:CC FLAGS_REG))
3629 (clobber (match_scratch:SI 2 "=X,X,X,&r"))]
3633 ;; Extend to memory case when source register does die.
3635 [(set (match_operand:DI 0 "memory_operand" "")
3636 (sign_extend:DI (match_operand:SI 1 "register_operand" "")))
3637 (clobber (reg:CC FLAGS_REG))
3638 (clobber (match_operand:SI 2 "register_operand" ""))]
3640 && dead_or_set_p (insn, operands[1])
3641 && !reg_mentioned_p (operands[1], operands[0]))"
3642 [(set (match_dup 3) (match_dup 1))
3643 (parallel [(set (match_dup 1) (ashiftrt:SI (match_dup 1) (const_int 31)))
3644 (clobber (reg:CC FLAGS_REG))])
3645 (set (match_dup 4) (match_dup 1))]
3646 "split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);")
3648 ;; Extend to memory case when source register does not die.
3650 [(set (match_operand:DI 0 "memory_operand" "")
3651 (sign_extend:DI (match_operand:SI 1 "register_operand" "")))
3652 (clobber (reg:CC FLAGS_REG))
3653 (clobber (match_operand:SI 2 "register_operand" ""))]
3657 split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);
3659 emit_move_insn (operands[3], operands[1]);
3661 /* Generate a cltd if possible and doing so it profitable. */
3662 if ((optimize_function_for_size_p (cfun) || TARGET_USE_CLTD)
3663 && true_regnum (operands[1]) == AX_REG
3664 && true_regnum (operands[2]) == DX_REG)
3666 emit_insn (gen_ashrsi3_cvt (operands[2], operands[1], GEN_INT (31)));
3670 emit_move_insn (operands[2], operands[1]);
3671 emit_insn (gen_ashrsi3_cvt (operands[2], operands[2], GEN_INT (31)));
3673 emit_move_insn (operands[4], operands[2]);
3677 ;; Extend to register case. Optimize case where source and destination
3678 ;; registers match and cases where we can use cltd.
3680 [(set (match_operand:DI 0 "register_operand" "")
3681 (sign_extend:DI (match_operand:SI 1 "register_operand" "")))
3682 (clobber (reg:CC FLAGS_REG))
3683 (clobber (match_scratch:SI 2 ""))]
3687 split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);
3689 if (true_regnum (operands[3]) != true_regnum (operands[1]))
3690 emit_move_insn (operands[3], operands[1]);
3692 /* Generate a cltd if possible and doing so it profitable. */
3693 if ((optimize_function_for_size_p (cfun) || TARGET_USE_CLTD)
3694 && true_regnum (operands[3]) == AX_REG
3695 && true_regnum (operands[4]) == DX_REG)
3697 emit_insn (gen_ashrsi3_cvt (operands[4], operands[3], GEN_INT (31)));
3701 if (true_regnum (operands[4]) != true_regnum (operands[1]))
3702 emit_move_insn (operands[4], operands[1]);
3704 emit_insn (gen_ashrsi3_cvt (operands[4], operands[4], GEN_INT (31)));
3708 (define_insn "extend<mode>di2"
3709 [(set (match_operand:DI 0 "register_operand" "=r")
3711 (match_operand:SWI12 1 "nonimmediate_operand" "<r>m")))]
3713 "movs{<imodesuffix>q|x}\t{%1, %0|%0, %1}"
3714 [(set_attr "type" "imovx")
3715 (set_attr "mode" "DI")])
3717 (define_insn "extendhisi2"
3718 [(set (match_operand:SI 0 "register_operand" "=*a,r")
3719 (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "*0,rm")))]
3722 switch (get_attr_prefix_0f (insn))
3725 return "{cwtl|cwde}";
3727 return "movs{wl|x}\t{%1, %0|%0, %1}";
3730 [(set_attr "type" "imovx")
3731 (set_attr "mode" "SI")
3732 (set (attr "prefix_0f")
3733 ;; movsx is short decodable while cwtl is vector decoded.
3734 (if_then_else (and (eq_attr "cpu" "!k6")
3735 (eq_attr "alternative" "0"))
3737 (const_string "1")))
3739 (if_then_else (eq_attr "prefix_0f" "0")
3741 (const_string "1")))])
3743 (define_insn "*extendhisi2_zext"
3744 [(set (match_operand:DI 0 "register_operand" "=*a,r")
3747 (match_operand:HI 1 "nonimmediate_operand" "*0,rm"))))]
3750 switch (get_attr_prefix_0f (insn))
3753 return "{cwtl|cwde}";
3755 return "movs{wl|x}\t{%1, %k0|%k0, %1}";
3758 [(set_attr "type" "imovx")
3759 (set_attr "mode" "SI")
3760 (set (attr "prefix_0f")
3761 ;; movsx is short decodable while cwtl is vector decoded.
3762 (if_then_else (and (eq_attr "cpu" "!k6")
3763 (eq_attr "alternative" "0"))
3765 (const_string "1")))
3767 (if_then_else (eq_attr "prefix_0f" "0")
3769 (const_string "1")))])
3771 (define_insn "extendqisi2"
3772 [(set (match_operand:SI 0 "register_operand" "=r")
3773 (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "qm")))]
3775 "movs{bl|x}\t{%1, %0|%0, %1}"
3776 [(set_attr "type" "imovx")
3777 (set_attr "mode" "SI")])
3779 (define_insn "*extendqisi2_zext"
3780 [(set (match_operand:DI 0 "register_operand" "=r")
3782 (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "qm"))))]
3784 "movs{bl|x}\t{%1, %k0|%k0, %1}"
3785 [(set_attr "type" "imovx")
3786 (set_attr "mode" "SI")])
3788 (define_insn "extendqihi2"
3789 [(set (match_operand:HI 0 "register_operand" "=*a,r")
3790 (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "*0,qm")))]
3793 switch (get_attr_prefix_0f (insn))
3796 return "{cbtw|cbw}";
3798 return "movs{bw|x}\t{%1, %0|%0, %1}";
3801 [(set_attr "type" "imovx")
3802 (set_attr "mode" "HI")
3803 (set (attr "prefix_0f")
3804 ;; movsx is short decodable while cwtl is vector decoded.
3805 (if_then_else (and (eq_attr "cpu" "!k6")
3806 (eq_attr "alternative" "0"))
3808 (const_string "1")))
3810 (if_then_else (eq_attr "prefix_0f" "0")
3812 (const_string "1")))])
3814 ;; Conversions between float and double.
3816 ;; These are all no-ops in the model used for the 80387.
3817 ;; So just emit moves.
3819 ;; %%% Kill these when call knows how to work out a DFmode push earlier.
3821 [(set (match_operand:DF 0 "push_operand" "")
3822 (float_extend:DF (match_operand:SF 1 "fp_register_operand" "")))]
3824 [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (const_int -8)))
3825 (set (mem:DF (reg:P SP_REG)) (float_extend:DF (match_dup 1)))])
3828 [(set (match_operand:XF 0 "push_operand" "")
3829 (float_extend:XF (match_operand:MODEF 1 "fp_register_operand" "")))]
3831 [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
3832 (set (mem:XF (reg:P SP_REG)) (float_extend:XF (match_dup 1)))]
3833 "operands[2] = GEN_INT (-GET_MODE_SIZE (XFmode));")
3835 (define_expand "extendsfdf2"
3836 [(set (match_operand:DF 0 "nonimmediate_operand" "")
3837 (float_extend:DF (match_operand:SF 1 "general_operand" "")))]
3838 "TARGET_80387 || (TARGET_SSE2 && TARGET_SSE_MATH)"
3840 /* ??? Needed for compress_float_constant since all fp constants
3841 are TARGET_LEGITIMATE_CONSTANT_P. */
3842 if (GET_CODE (operands[1]) == CONST_DOUBLE)
3844 if ((!TARGET_SSE2 || TARGET_MIX_SSE_I387)
3845 && standard_80387_constant_p (operands[1]) > 0)
3847 operands[1] = simplify_const_unary_operation
3848 (FLOAT_EXTEND, DFmode, operands[1], SFmode);
3849 emit_move_insn_1 (operands[0], operands[1]);
3852 operands[1] = validize_mem (force_const_mem (SFmode, operands[1]));
3856 /* For converting SF(xmm2) to DF(xmm1), use the following code instead of
3858 unpcklps xmm2,xmm2 ; packed conversion might crash on signaling NaNs
3860 We do the conversion post reload to avoid producing of 128bit spills
3861 that might lead to ICE on 32bit target. The sequence unlikely combine
3864 [(set (match_operand:DF 0 "register_operand" "")
3866 (match_operand:SF 1 "nonimmediate_operand" "")))]
3867 "TARGET_USE_VECTOR_FP_CONVERTS
3868 && optimize_insn_for_speed_p ()
3869 && reload_completed && SSE_REG_P (operands[0])"
3874 (parallel [(const_int 0) (const_int 1)]))))]
3876 operands[2] = simplify_gen_subreg (V2DFmode, operands[0], DFmode, 0);
3877 operands[3] = simplify_gen_subreg (V4SFmode, operands[0], DFmode, 0);
3878 /* Use movss for loading from memory, unpcklps reg, reg for registers.
3879 Try to avoid move when unpacking can be done in source. */
3880 if (REG_P (operands[1]))
3882 /* If it is unsafe to overwrite upper half of source, we need
3883 to move to destination and unpack there. */
3884 if ((ORIGINAL_REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
3885 || PSEUDO_REGNO_BYTES (ORIGINAL_REGNO (operands[1])) > 4)
3886 && true_regnum (operands[0]) != true_regnum (operands[1]))
3888 rtx tmp = gen_rtx_REG (SFmode, true_regnum (operands[0]));
3889 emit_move_insn (tmp, operands[1]);
3892 operands[3] = simplify_gen_subreg (V4SFmode, operands[1], SFmode, 0);
3893 emit_insn (gen_vec_interleave_lowv4sf (operands[3], operands[3],
3897 emit_insn (gen_vec_setv4sf_0 (operands[3],
3898 CONST0_RTX (V4SFmode), operands[1]));
3901 (define_insn "*extendsfdf2_mixed"
3902 [(set (match_operand:DF 0 "nonimmediate_operand" "=f,m,x")
3904 (match_operand:SF 1 "nonimmediate_operand" "fm,f,xm")))]
3905 "TARGET_SSE2 && TARGET_MIX_SSE_I387"
3907 switch (which_alternative)
3911 return output_387_reg_move (insn, operands);
3914 return "%vcvtss2sd\t{%1, %d0|%d0, %1}";
3920 [(set_attr "type" "fmov,fmov,ssecvt")
3921 (set_attr "prefix" "orig,orig,maybe_vex")
3922 (set_attr "mode" "SF,XF,DF")])
3924 (define_insn "*extendsfdf2_sse"
3925 [(set (match_operand:DF 0 "nonimmediate_operand" "=x")
3926 (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "xm")))]
3927 "TARGET_SSE2 && TARGET_SSE_MATH"
3928 "%vcvtss2sd\t{%1, %d0|%d0, %1}"
3929 [(set_attr "type" "ssecvt")
3930 (set_attr "prefix" "maybe_vex")
3931 (set_attr "mode" "DF")])
3933 (define_insn "*extendsfdf2_i387"
3934 [(set (match_operand:DF 0 "nonimmediate_operand" "=f,m")
3935 (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "fm,f")))]
3937 "* return output_387_reg_move (insn, operands);"
3938 [(set_attr "type" "fmov")
3939 (set_attr "mode" "SF,XF")])
3941 (define_expand "extend<mode>xf2"