Home | History | Annotate | Line # | Download | only in avr
avr.md revision 1.1.1.12
      1       1.1    mrg ;;   Machine description for GNU compiler,
      2       1.1    mrg ;;   for ATMEL AVR micro controllers.
      3  1.1.1.12    mrg ;;   Copyright (C) 1998-2018 Free Software Foundation, Inc.
      4       1.1    mrg ;;   Contributed by Denis Chertykov (chertykov (a] gmail.com)
      5       1.1    mrg 
      6       1.1    mrg ;; This file is part of GCC.
      7       1.1    mrg 
      8       1.1    mrg ;; GCC is free software; you can redistribute it and/or modify
      9       1.1    mrg ;; it under the terms of the GNU General Public License as published by
     10       1.1    mrg ;; the Free Software Foundation; either version 3, or (at your option)
     11       1.1    mrg ;; any later version.
     12       1.1    mrg 
     13       1.1    mrg ;; GCC is distributed in the hope that it will be useful,
     14       1.1    mrg ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
     15       1.1    mrg ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16       1.1    mrg ;; GNU General Public License for more details.
     17       1.1    mrg 
     18       1.1    mrg ;; You should have received a copy of the GNU General Public License
     19       1.1    mrg ;; along with GCC; see the file COPYING3.  If not see
     20       1.1    mrg ;; <http://www.gnu.org/licenses/>.
     21       1.1    mrg 
     22       1.1    mrg ;; Special characters after '%':
     23       1.1    mrg ;;  A  No effect (add 0).
     24       1.1    mrg ;;  B  Add 1 to REG number, MEM address or CONST_INT.
     25       1.1    mrg ;;  C  Add 2.
     26       1.1    mrg ;;  D  Add 3.
     27   1.1.1.6    mrg ;;  E  reg number in XEXP(x, 0).
     28   1.1.1.6    mrg ;;  F  Add 1 to reg number.
     29   1.1.1.6    mrg ;;  I  reg number in XEXP(XEXP(x, 0), 0).
     30   1.1.1.6    mrg ;;  J  Add 1 to reg number.
     31       1.1    mrg ;;  j  Branch condition.
     32       1.1    mrg ;;  k  Reverse branch condition.
     33       1.1    mrg ;;..m..Constant Direct Data memory address.
     34   1.1.1.2    mrg ;;  i  Print the SFR address quivalent of a CONST_INT or a CONST_INT
     35   1.1.1.2    mrg ;;     RAM address.  The resulting address is suitable to be used in IN/OUT.
     36       1.1    mrg ;;  o  Displacement for (mem (plus (reg) (const_int))) operands.
     37       1.1    mrg ;;  p  POST_INC or PRE_DEC address as a pointer (X, Y, Z)
     38       1.1    mrg ;;  r  POST_INC or PRE_DEC address as a register (r26, r28, r30)
     39   1.1.1.6    mrg ;;  r  Print a REG without the register prefix 'r'.
     40   1.1.1.2    mrg ;; T/T Print operand suitable for BLD/BST instruction, i.e. register and
     41   1.1.1.2    mrg ;;     bit number.  This gets 2 operands: The first %T gets a REG_P and
     42   1.1.1.2    mrg ;;     just cashes the operand for the next %T.  The second %T gets
     43   1.1.1.2    mrg ;;     a CONST_INT that represents a bit position.
     44   1.1.1.2    mrg ;;     Example: With %0 = (reg:HI 18)  and  %1 = (const_int 13)
     45   1.1.1.2    mrg ;;              "%T0%T1" it will print "r19,5".
     46   1.1.1.2    mrg ;;     Notice that you must not write a comma between %T0 and %T1.
     47   1.1.1.2    mrg ;; T/t Similar to above, but don't print the comma and the bit number.
     48   1.1.1.2    mrg ;;     Example: With %0 = (reg:HI 18)  and  %1 = (const_int 13)
     49   1.1.1.2    mrg ;;              "%T0%t1" it will print "r19".
     50       1.1    mrg ;;..x..Constant Direct Program memory address.
     51       1.1    mrg ;;  ~  Output 'r' if not AVR_HAVE_JMP_CALL.
     52       1.1    mrg ;;  !  Output 'e' if AVR_HAVE_EIJMP_EICALL.
     53       1.1    mrg 
     54       1.1    mrg 
     55       1.1    mrg (define_constants
     56   1.1.1.2    mrg   [(REG_X       26)
     57   1.1.1.2    mrg    (REG_Y       28)
     58   1.1.1.2    mrg    (REG_Z       30)
     59   1.1.1.2    mrg    (REG_W       24)
     60   1.1.1.2    mrg    (REG_SP      32)
     61   1.1.1.2    mrg    (LPM_REGNO   0)      ; implicit target register of LPM
     62   1.1.1.2    mrg    (TMP_REGNO   0)      ; temporary register r0
     63   1.1.1.2    mrg    (ZERO_REGNO  1)      ; zero register r1
     64   1.1.1.2    mrg    ])
     65   1.1.1.2    mrg 
     66   1.1.1.6    mrg (define_constants
     67   1.1.1.6    mrg   [(TMP_REGNO_TINY  16) ; r16 is temp register for AVR_TINY
     68   1.1.1.6    mrg    (ZERO_REGNO_TINY 17) ; r17 is zero register for AVR_TINY
     69   1.1.1.6    mrg   ])
     70   1.1.1.6    mrg 
     71   1.1.1.2    mrg (define_c_enum "unspec"
     72   1.1.1.2    mrg   [UNSPEC_STRLEN
     73   1.1.1.2    mrg    UNSPEC_MOVMEM
     74   1.1.1.2    mrg    UNSPEC_INDEX_JMP
     75   1.1.1.2    mrg    UNSPEC_FMUL
     76   1.1.1.2    mrg    UNSPEC_FMULS
     77   1.1.1.2    mrg    UNSPEC_FMULSU
     78   1.1.1.2    mrg    UNSPEC_COPYSIGN
     79   1.1.1.2    mrg    UNSPEC_IDENTITY
     80   1.1.1.2    mrg    UNSPEC_INSERT_BITS
     81   1.1.1.2    mrg    UNSPEC_ROUND
     82   1.1.1.2    mrg    ])
     83   1.1.1.2    mrg 
     84   1.1.1.2    mrg (define_c_enum "unspecv"
     85   1.1.1.2    mrg   [UNSPECV_PROLOGUE_SAVES
     86   1.1.1.2    mrg    UNSPECV_EPILOGUE_RESTORES
     87   1.1.1.2    mrg    UNSPECV_WRITE_SP
     88  1.1.1.12    mrg    UNSPECV_GASISR
     89   1.1.1.2    mrg    UNSPECV_GOTO_RECEIVER
     90   1.1.1.2    mrg    UNSPECV_ENABLE_IRQS
     91   1.1.1.2    mrg    UNSPECV_MEMORY_BARRIER
     92   1.1.1.2    mrg    UNSPECV_NOP
     93   1.1.1.2    mrg    UNSPECV_SLEEP
     94   1.1.1.2    mrg    UNSPECV_WDR
     95   1.1.1.2    mrg    UNSPECV_DELAY_CYCLES
     96   1.1.1.2    mrg    ])
     97   1.1.1.2    mrg 
     98  1.1.1.12    mrg ;; Chunk numbers for __gcc_isr are hard-coded in GAS.
     99  1.1.1.12    mrg (define_constants
    100  1.1.1.12    mrg   [(GASISR_Prologue 1)
    101  1.1.1.12    mrg    (GASISR_Epilogue 2)
    102  1.1.1.12    mrg    (GASISR_Done     0)
    103  1.1.1.12    mrg    ])
    104       1.1    mrg 
    105       1.1    mrg (include "predicates.md")
    106       1.1    mrg (include "constraints.md")
    107   1.1.1.2    mrg 
    108       1.1    mrg ;; Condition code settings.
    109   1.1.1.3  skrll (define_attr "cc" "none,set_czn,set_zn,set_vzn,set_n,compare,clobber,
    110   1.1.1.2    mrg                    plus,ldi"
    111       1.1    mrg   (const_string "none"))
    112       1.1    mrg 
    113       1.1    mrg (define_attr "type" "branch,branch1,arith,xcall"
    114       1.1    mrg   (const_string "arith"))
    115       1.1    mrg 
    116       1.1    mrg ;; The size of instructions in bytes.
    117       1.1    mrg ;; XXX may depend from "cc"
    118       1.1    mrg 
    119       1.1    mrg (define_attr "length" ""
    120       1.1    mrg   (cond [(eq_attr "type" "branch")
    121       1.1    mrg          (if_then_else (and (ge (minus (pc) (match_dup 0))
    122   1.1.1.7    mrg                                 (const_int -62))
    123       1.1    mrg                             (le (minus (pc) (match_dup 0))
    124       1.1    mrg                                 (const_int 62)))
    125       1.1    mrg                        (const_int 1)
    126       1.1    mrg                        (if_then_else (and (ge (minus (pc) (match_dup 0))
    127   1.1.1.7    mrg                                               (const_int -2044))
    128       1.1    mrg                                           (le (minus (pc) (match_dup 0))
    129       1.1    mrg                                               (const_int 2045)))
    130       1.1    mrg                                      (const_int 2)
    131       1.1    mrg                                      (const_int 3)))
    132       1.1    mrg          (eq_attr "type" "branch1")
    133       1.1    mrg          (if_then_else (and (ge (minus (pc) (match_dup 0))
    134       1.1    mrg                                 (const_int -62))
    135       1.1    mrg                             (le (minus (pc) (match_dup 0))
    136       1.1    mrg                                 (const_int 61)))
    137       1.1    mrg                        (const_int 2)
    138       1.1    mrg                        (if_then_else (and (ge (minus (pc) (match_dup 0))
    139       1.1    mrg                                               (const_int -2044))
    140       1.1    mrg                                           (le (minus (pc) (match_dup 0))
    141       1.1    mrg                                               (const_int 2043)))
    142       1.1    mrg                                      (const_int 3)
    143       1.1    mrg                                      (const_int 4)))
    144   1.1.1.2    mrg          (eq_attr "type" "xcall")
    145   1.1.1.2    mrg          (if_then_else (match_test "!AVR_HAVE_JMP_CALL")
    146   1.1.1.2    mrg                        (const_int 1)
    147   1.1.1.2    mrg                        (const_int 2))]
    148       1.1    mrg         (const_int 2)))
    149       1.1    mrg 
    150   1.1.1.2    mrg ;; Lengths of several insns are adjusted in avr.c:adjust_insn_length().
    151   1.1.1.2    mrg ;; Following insn attribute tells if and how the adjustment has to be
    152   1.1.1.2    mrg ;; done:
    153   1.1.1.2    mrg ;;     no     No adjustment needed; attribute "length" is fine.
    154   1.1.1.2    mrg ;; Otherwise do special processing depending on the attribute.
    155   1.1.1.2    mrg 
    156   1.1.1.2    mrg (define_attr "adjust_len"
    157   1.1.1.6    mrg   "out_bitop, plus, addto_sp, sext,
    158   1.1.1.2    mrg    tsthi, tstpsi, tstsi, compare, compare64, call,
    159   1.1.1.2    mrg    mov8, mov16, mov24, mov32, reload_in16, reload_in24, reload_in32,
    160   1.1.1.2    mrg    ufract, sfract, round,
    161   1.1.1.9    mrg    xload, movmem,
    162   1.1.1.2    mrg    ashlqi, ashrqi, lshrqi,
    163   1.1.1.2    mrg    ashlhi, ashrhi, lshrhi,
    164   1.1.1.2    mrg    ashlsi, ashrsi, lshrsi,
    165   1.1.1.2    mrg    ashlpsi, ashrpsi, lshrpsi,
    166   1.1.1.9    mrg    insert_bits, insv_notbit, insv_notbit_0, insv_notbit_7,
    167   1.1.1.2    mrg    no"
    168   1.1.1.2    mrg   (const_string "no"))
    169   1.1.1.2    mrg 
    170   1.1.1.2    mrg ;; Flavours of instruction set architecture (ISA), used in enabled attribute
    171   1.1.1.2    mrg 
    172   1.1.1.2    mrg ;; mov  : ISA has no MOVW                movw  : ISA has MOVW
    173   1.1.1.2    mrg ;; rjmp : ISA has no CALL/JMP            jmp   : ISA has CALL/JMP
    174   1.1.1.2    mrg ;; ijmp : ISA has no EICALL/EIJMP        eijmp : ISA has EICALL/EIJMP
    175   1.1.1.2    mrg ;; lpm  : ISA has no LPMX                lpmx  : ISA has LPMX
    176   1.1.1.2    mrg ;; elpm : ISA has ELPM but no ELPMX      elpmx : ISA has ELPMX
    177   1.1.1.2    mrg ;; no_xmega: non-XMEGA core              xmega : XMEGA core
    178   1.1.1.6    mrg ;; no_tiny:  non-TINY core               tiny  : TINY core
    179   1.1.1.2    mrg 
    180   1.1.1.2    mrg (define_attr "isa"
    181   1.1.1.6    mrg   "mov,movw, rjmp,jmp, ijmp,eijmp, lpm,lpmx, elpm,elpmx, no_xmega,xmega, no_tiny,tiny,
    182   1.1.1.2    mrg    standard"
    183   1.1.1.2    mrg   (const_string "standard"))
    184   1.1.1.2    mrg 
    185   1.1.1.2    mrg (define_attr "enabled" ""
    186   1.1.1.2    mrg   (cond [(eq_attr "isa" "standard")
    187   1.1.1.2    mrg          (const_int 1)
    188   1.1.1.2    mrg 
    189   1.1.1.2    mrg          (and (eq_attr "isa" "mov")
    190   1.1.1.2    mrg               (match_test "!AVR_HAVE_MOVW"))
    191   1.1.1.2    mrg          (const_int 1)
    192   1.1.1.2    mrg 
    193   1.1.1.2    mrg          (and (eq_attr "isa" "movw")
    194   1.1.1.2    mrg               (match_test "AVR_HAVE_MOVW"))
    195   1.1.1.2    mrg          (const_int 1)
    196   1.1.1.2    mrg 
    197   1.1.1.2    mrg          (and (eq_attr "isa" "rjmp")
    198   1.1.1.2    mrg               (match_test "!AVR_HAVE_JMP_CALL"))
    199   1.1.1.2    mrg          (const_int 1)
    200   1.1.1.2    mrg 
    201   1.1.1.2    mrg          (and (eq_attr "isa" "jmp")
    202   1.1.1.2    mrg               (match_test "AVR_HAVE_JMP_CALL"))
    203   1.1.1.2    mrg          (const_int 1)
    204   1.1.1.2    mrg 
    205   1.1.1.2    mrg          (and (eq_attr "isa" "ijmp")
    206   1.1.1.2    mrg               (match_test "!AVR_HAVE_EIJMP_EICALL"))
    207   1.1.1.2    mrg          (const_int 1)
    208   1.1.1.2    mrg 
    209   1.1.1.2    mrg          (and (eq_attr "isa" "eijmp")
    210   1.1.1.2    mrg               (match_test "AVR_HAVE_EIJMP_EICALL"))
    211   1.1.1.2    mrg          (const_int 1)
    212   1.1.1.2    mrg 
    213   1.1.1.2    mrg          (and (eq_attr "isa" "lpm")
    214   1.1.1.2    mrg               (match_test "!AVR_HAVE_LPMX"))
    215   1.1.1.2    mrg          (const_int 1)
    216   1.1.1.2    mrg 
    217   1.1.1.2    mrg          (and (eq_attr "isa" "lpmx")
    218   1.1.1.2    mrg               (match_test "AVR_HAVE_LPMX"))
    219   1.1.1.2    mrg          (const_int 1)
    220   1.1.1.2    mrg 
    221   1.1.1.2    mrg          (and (eq_attr "isa" "elpm")
    222   1.1.1.2    mrg               (match_test "AVR_HAVE_ELPM && !AVR_HAVE_ELPMX"))
    223   1.1.1.2    mrg          (const_int 1)
    224   1.1.1.2    mrg 
    225   1.1.1.2    mrg          (and (eq_attr "isa" "elpmx")
    226   1.1.1.2    mrg               (match_test "AVR_HAVE_ELPMX"))
    227   1.1.1.2    mrg          (const_int 1)
    228   1.1.1.2    mrg 
    229   1.1.1.2    mrg          (and (eq_attr "isa" "xmega")
    230   1.1.1.2    mrg               (match_test "AVR_XMEGA"))
    231   1.1.1.2    mrg          (const_int 1)
    232   1.1.1.2    mrg 
    233   1.1.1.6    mrg          (and (eq_attr "isa" "tiny")
    234   1.1.1.6    mrg               (match_test "AVR_TINY"))
    235   1.1.1.6    mrg          (const_int 1)
    236   1.1.1.6    mrg 
    237   1.1.1.2    mrg          (and (eq_attr "isa" "no_xmega")
    238   1.1.1.2    mrg               (match_test "!AVR_XMEGA"))
    239   1.1.1.2    mrg          (const_int 1)
    240   1.1.1.6    mrg 
    241   1.1.1.6    mrg          (and (eq_attr "isa" "no_tiny")
    242   1.1.1.6    mrg               (match_test "!AVR_TINY"))
    243   1.1.1.6    mrg          (const_int 1)
    244   1.1.1.6    mrg 
    245   1.1.1.2    mrg          ] (const_int 0)))
    246   1.1.1.2    mrg 
    247   1.1.1.2    mrg 
    248   1.1.1.2    mrg ;; Define mode iterators
    249   1.1.1.2    mrg (define_mode_iterator QIHI  [QI HI])
    250   1.1.1.2    mrg (define_mode_iterator QIHI2 [QI HI])
    251   1.1.1.2    mrg (define_mode_iterator QISI  [QI HI PSI SI])
    252   1.1.1.2    mrg (define_mode_iterator QIDI  [QI HI PSI SI DI])
    253   1.1.1.2    mrg (define_mode_iterator HISI  [HI PSI SI])
    254   1.1.1.2    mrg 
    255   1.1.1.2    mrg (define_mode_iterator ALL1 [QI QQ UQQ])
    256   1.1.1.2    mrg (define_mode_iterator ALL2 [HI HQ UHQ HA UHA])
    257   1.1.1.2    mrg (define_mode_iterator ALL4 [SI SQ USQ SA USA])
    258   1.1.1.2    mrg 
    259   1.1.1.2    mrg ;; All supported move-modes
    260   1.1.1.2    mrg (define_mode_iterator MOVMODE [QI QQ UQQ
    261   1.1.1.2    mrg                                HI HQ UHQ HA UHA
    262   1.1.1.2    mrg                                SI SQ USQ SA USA
    263   1.1.1.2    mrg                                SF PSI])
    264   1.1.1.2    mrg 
    265   1.1.1.2    mrg ;; Supported ordered modes that are 2, 3, 4 bytes wide
    266   1.1.1.2    mrg (define_mode_iterator ORDERED234 [HI SI PSI
    267   1.1.1.2    mrg                                   HQ UHQ HA UHA
    268   1.1.1.2    mrg                                   SQ USQ SA USA])
    269   1.1.1.2    mrg 
    270   1.1.1.9    mrg ;; Post-reload split of 3, 4 bytes wide moves.
    271   1.1.1.9    mrg (define_mode_iterator SPLIT34 [SI SF PSI
    272   1.1.1.9    mrg                                SQ USQ SA USA])
    273   1.1.1.9    mrg 
    274   1.1.1.2    mrg ;; Define code iterators
    275   1.1.1.2    mrg ;; Define two incarnations so that we can build the cross product.
    276   1.1.1.2    mrg (define_code_iterator any_extend  [sign_extend zero_extend])
    277   1.1.1.2    mrg (define_code_iterator any_extend2 [sign_extend zero_extend])
    278   1.1.1.9    mrg (define_code_iterator any_extract [sign_extract zero_extract])
    279   1.1.1.9    mrg (define_code_iterator any_shiftrt [lshiftrt ashiftrt])
    280   1.1.1.2    mrg 
    281   1.1.1.9    mrg (define_code_iterator bitop [xor ior and])
    282   1.1.1.2    mrg (define_code_iterator xior [xor ior])
    283   1.1.1.2    mrg (define_code_iterator eqne [eq ne])
    284   1.1.1.2    mrg 
    285   1.1.1.2    mrg (define_code_iterator ss_addsub [ss_plus ss_minus])
    286   1.1.1.2    mrg (define_code_iterator us_addsub [us_plus us_minus])
    287   1.1.1.2    mrg (define_code_iterator ss_abs_neg [ss_abs ss_neg])
    288   1.1.1.2    mrg 
    289   1.1.1.2    mrg ;; Define code attributes
    290   1.1.1.2    mrg (define_code_attr extend_su
    291   1.1.1.2    mrg   [(sign_extend "s")
    292   1.1.1.2    mrg    (zero_extend "u")])
    293   1.1.1.2    mrg 
    294   1.1.1.2    mrg (define_code_attr extend_u
    295   1.1.1.2    mrg   [(sign_extend "")
    296   1.1.1.2    mrg    (zero_extend "u")])
    297   1.1.1.2    mrg 
    298   1.1.1.2    mrg (define_code_attr extend_s
    299   1.1.1.2    mrg   [(sign_extend "s")
    300   1.1.1.2    mrg    (zero_extend "")])
    301   1.1.1.2    mrg 
    302   1.1.1.2    mrg ;; Constrain input operand of widening multiply, i.e. MUL resp. MULS.
    303   1.1.1.2    mrg (define_code_attr mul_r_d
    304   1.1.1.2    mrg   [(zero_extend "r")
    305   1.1.1.2    mrg    (sign_extend "d")])
    306   1.1.1.2    mrg 
    307   1.1.1.2    mrg (define_code_attr abelian
    308   1.1.1.2    mrg   [(ss_minus "") (us_minus "")
    309   1.1.1.2    mrg    (ss_plus "%") (us_plus "%")])
    310   1.1.1.2    mrg 
    311   1.1.1.2    mrg ;; Map RTX code to its standard insn name
    312   1.1.1.2    mrg (define_code_attr code_stdname
    313   1.1.1.2    mrg   [(ashift   "ashl")
    314   1.1.1.2    mrg    (ashiftrt "ashr")
    315   1.1.1.2    mrg    (lshiftrt "lshr")
    316   1.1.1.2    mrg    (ior      "ior")
    317   1.1.1.2    mrg    (xor      "xor")
    318   1.1.1.2    mrg    (rotate   "rotl")
    319   1.1.1.2    mrg    (ss_plus  "ssadd")  (ss_minus "sssub")  (ss_neg "ssneg")  (ss_abs "ssabs")
    320   1.1.1.2    mrg    (us_plus  "usadd")  (us_minus "ussub")  (us_neg "usneg")
    321   1.1.1.2    mrg    ])
    322       1.1    mrg 
    323       1.1    mrg ;;========================================================================
    324       1.1    mrg ;; The following is used by nonlocal_goto and setjmp.
    325       1.1    mrg ;; The receiver pattern will create no instructions since internally
    326       1.1    mrg ;; virtual_stack_vars = hard_frame_pointer + 1 so the RTL become R28=R28
    327       1.1    mrg ;; This avoids creating add/sub offsets in frame_pointer save/resore.
    328       1.1    mrg ;; The 'null' receiver also avoids  problems with optimisation
    329       1.1    mrg ;; not recognising incoming jmp and removing code that resets frame_pointer.
    330       1.1    mrg ;; The code derived from builtins.c.
    331       1.1    mrg 
    332       1.1    mrg (define_expand "nonlocal_goto_receiver"
    333   1.1.1.2    mrg   [(set (reg:HI REG_Y)
    334   1.1.1.2    mrg         (unspec_volatile:HI [(const_int 0)] UNSPECV_GOTO_RECEIVER))]
    335       1.1    mrg   ""
    336       1.1    mrg   {
    337  1.1.1.12    mrg     rtx offset = gen_int_mode (targetm.starting_frame_offset (), Pmode);
    338   1.1.1.2    mrg     emit_move_insn (virtual_stack_vars_rtx,
    339  1.1.1.12    mrg                     gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx, offset));
    340   1.1.1.2    mrg     /* ; This might change the hard frame pointer in ways that aren't
    341   1.1.1.2    mrg        ; apparent to early optimization passes, so force a clobber.  */
    342       1.1    mrg     emit_clobber (hard_frame_pointer_rtx);
    343       1.1    mrg     DONE;
    344       1.1    mrg   })
    345   1.1.1.2    mrg 
    346       1.1    mrg 
    347       1.1    mrg ;; Defining nonlocal_goto_receiver means we must also define this.
    348       1.1    mrg ;; even though its function is identical to that in builtins.c
    349       1.1    mrg 
    350       1.1    mrg (define_expand "nonlocal_goto"
    351   1.1.1.2    mrg   [(use (match_operand 0 "general_operand"))
    352   1.1.1.2    mrg    (use (match_operand 1 "general_operand"))
    353   1.1.1.2    mrg    (use (match_operand 2 "general_operand"))
    354   1.1.1.2    mrg    (use (match_operand 3 "general_operand"))]
    355       1.1    mrg   ""
    356   1.1.1.2    mrg   {
    357   1.1.1.2    mrg     rtx r_label = copy_to_reg (operands[1]);
    358   1.1.1.2    mrg     rtx r_fp = operands[3];
    359   1.1.1.2    mrg     rtx r_sp = operands[2];
    360       1.1    mrg 
    361   1.1.1.2    mrg     emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
    362       1.1    mrg 
    363   1.1.1.2    mrg     emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
    364       1.1    mrg 
    365   1.1.1.2    mrg     emit_move_insn (hard_frame_pointer_rtx, r_fp);
    366   1.1.1.2    mrg     emit_stack_restore (SAVE_NONLOCAL, r_sp);
    367       1.1    mrg 
    368   1.1.1.2    mrg     emit_use (hard_frame_pointer_rtx);
    369   1.1.1.2    mrg     emit_use (stack_pointer_rtx);
    370       1.1    mrg 
    371   1.1.1.2    mrg     emit_indirect_jump (r_label);
    372       1.1    mrg 
    373   1.1.1.2    mrg     DONE;
    374   1.1.1.2    mrg   })
    375       1.1    mrg 
    376   1.1.1.2    mrg ;; "pushqi1"
    377   1.1.1.2    mrg ;; "pushqq1"  "pushuqq1"
    378   1.1.1.2    mrg (define_insn "push<mode>1"
    379   1.1.1.2    mrg   [(set (mem:ALL1 (post_dec:HI (reg:HI REG_SP)))
    380   1.1.1.2    mrg         (match_operand:ALL1 0 "reg_or_0_operand" "r,Y00"))]
    381       1.1    mrg   ""
    382       1.1    mrg   "@
    383       1.1    mrg 	push %0
    384       1.1    mrg 	push __zero_reg__"
    385       1.1    mrg   [(set_attr "length" "1,1")])
    386       1.1    mrg 
    387   1.1.1.5    mrg (define_insn "pushhi1_insn"
    388   1.1.1.5    mrg   [(set (mem:HI (post_dec:HI (reg:HI REG_SP)))
    389   1.1.1.5    mrg         (match_operand:HI 0 "register_operand" "r"))]
    390   1.1.1.5    mrg   ""
    391   1.1.1.5    mrg   "push %B0\;push %A0"
    392   1.1.1.5    mrg   [(set_attr "length" "2")])
    393   1.1.1.5    mrg 
    394   1.1.1.2    mrg ;; All modes for a multi-byte push.  We must include complex modes here too,
    395   1.1.1.2    mrg ;; lest emit_single_push_insn "helpfully" create the auto-inc itself.
    396   1.1.1.2    mrg (define_mode_iterator MPUSH
    397   1.1.1.2    mrg   [CQI
    398   1.1.1.2    mrg    HI CHI HA UHA HQ UHQ
    399   1.1.1.2    mrg    SI CSI SA USA SQ USQ
    400   1.1.1.2    mrg    DI CDI DA UDA DQ UDQ
    401   1.1.1.2    mrg    TA UTA
    402   1.1.1.2    mrg    SF SC
    403   1.1.1.2    mrg    PSI])
    404       1.1    mrg 
    405   1.1.1.2    mrg (define_expand "push<mode>1"
    406   1.1.1.2    mrg   [(match_operand:MPUSH 0 "" "")]
    407       1.1    mrg   ""
    408   1.1.1.2    mrg   {
    409   1.1.1.4    mrg     if (MEM_P (operands[0])
    410   1.1.1.4    mrg         && !ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (operands[0])))
    411   1.1.1.5    mrg       {
    412   1.1.1.5    mrg         // Avoid (subreg (mem)) for non-generic address spaces.  Because
    413   1.1.1.5    mrg         // of the poor addressing capabilities of these spaces it's better to
    414   1.1.1.5    mrg         // load them in one chunk.  And it avoids PR61443.
    415   1.1.1.5    mrg 
    416   1.1.1.5    mrg         operands[0] = copy_to_mode_reg (<MODE>mode, operands[0]);
    417   1.1.1.5    mrg       }
    418   1.1.1.5    mrg     else if (REG_P (operands[0])
    419   1.1.1.5    mrg              && IN_RANGE (REGNO (operands[0]), FIRST_VIRTUAL_REGISTER,
    420   1.1.1.5    mrg                           LAST_VIRTUAL_REGISTER))
    421   1.1.1.5    mrg       {
    422   1.1.1.5    mrg         // Byte-wise pushing of virtual regs might result in something like
    423   1.1.1.5    mrg         //
    424   1.1.1.5    mrg         //     (set (mem:QI (post_dec:HI (reg:HI 32 SP)))
    425   1.1.1.5    mrg         //          (subreg:QI (plus:HI (reg:HI 28)
    426   1.1.1.5    mrg         //                              (const_int 17)) 0))
    427   1.1.1.5    mrg         //
    428   1.1.1.5    mrg         // after elimination.  This cannot be handled by reload, cf. PR64452.
    429   1.1.1.5    mrg         // Reload virtuals in one chunk.  That way it's possible to reload
    430   1.1.1.5    mrg         // above situation and finally
    431   1.1.1.5    mrg         //
    432   1.1.1.5    mrg         //    (set (reg:HI **)
    433   1.1.1.5    mrg         //         (const_int 17))
    434   1.1.1.5    mrg         //    (set (reg:HI **)
    435   1.1.1.5    mrg         //         (plus:HI (reg:HI **)
    436   1.1.1.5    mrg         //                  (reg:HI 28)))
    437   1.1.1.5    mrg         //    (set (mem:HI (post_dec:HI (reg:HI 32 SP))
    438   1.1.1.5    mrg         //         (reg:HI **)))
    439   1.1.1.5    mrg  
    440   1.1.1.5    mrg         emit_insn (gen_pushhi1_insn (operands[0]));
    441   1.1.1.5    mrg         DONE;
    442   1.1.1.5    mrg       }
    443   1.1.1.4    mrg 
    444   1.1.1.5    mrg     for (int i = GET_MODE_SIZE (<MODE>mode) - 1; i >= 0; --i)
    445   1.1.1.2    mrg       {
    446   1.1.1.2    mrg         rtx part = simplify_gen_subreg (QImode, operands[0], <MODE>mode, i);
    447   1.1.1.2    mrg         if (part != const0_rtx)
    448   1.1.1.2    mrg           part = force_reg (QImode, part);
    449   1.1.1.2    mrg         emit_insn (gen_pushqi1 (part));
    450   1.1.1.2    mrg       }
    451   1.1.1.2    mrg     DONE;
    452   1.1.1.2    mrg   })
    453   1.1.1.2    mrg 
    454   1.1.1.2    mrg ;; Notice a special-case when adding N to SP where N results in a
    455   1.1.1.2    mrg ;; zero REG_ARGS_SIZE.  This is equivalent to a move from FP.
    456   1.1.1.2    mrg (define_split
    457   1.1.1.2    mrg   [(set (reg:HI REG_SP)
    458   1.1.1.2    mrg         (match_operand:HI 0 "register_operand" ""))]
    459   1.1.1.2    mrg   "reload_completed
    460   1.1.1.2    mrg    && frame_pointer_needed
    461   1.1.1.2    mrg    && !cfun->calls_alloca
    462   1.1.1.2    mrg    && find_reg_note (insn, REG_ARGS_SIZE, const0_rtx)"
    463   1.1.1.2    mrg   [(set (reg:HI REG_SP)
    464   1.1.1.2    mrg         (reg:HI REG_Y))])
    465   1.1.1.2    mrg 
    466   1.1.1.2    mrg ;;========================================================================
    467   1.1.1.2    mrg ;; Move stuff around
    468   1.1.1.2    mrg 
    469   1.1.1.2    mrg ;; "loadqi_libgcc"
    470   1.1.1.2    mrg ;; "loadhi_libgcc"
    471   1.1.1.2    mrg ;; "loadpsi_libgcc"
    472   1.1.1.2    mrg ;; "loadsi_libgcc"
    473   1.1.1.2    mrg ;; "loadsf_libgcc"
    474   1.1.1.2    mrg (define_expand "load<mode>_libgcc"
    475   1.1.1.2    mrg   [(set (match_dup 3)
    476   1.1.1.2    mrg         (match_dup 2))
    477   1.1.1.2    mrg    (set (reg:MOVMODE 22)
    478   1.1.1.2    mrg         (match_operand:MOVMODE 1 "memory_operand" ""))
    479   1.1.1.2    mrg    (set (match_operand:MOVMODE 0 "register_operand" "")
    480   1.1.1.2    mrg         (reg:MOVMODE 22))]
    481   1.1.1.2    mrg   "avr_load_libgcc_p (operands[1])"
    482   1.1.1.2    mrg   {
    483   1.1.1.2    mrg     operands[3] = gen_rtx_REG (HImode, REG_Z);
    484   1.1.1.2    mrg     operands[2] = force_operand (XEXP (operands[1], 0), NULL_RTX);
    485   1.1.1.2    mrg     operands[1] = replace_equiv_address (operands[1], operands[3]);
    486   1.1.1.2    mrg     set_mem_addr_space (operands[1], ADDR_SPACE_FLASH);
    487   1.1.1.2    mrg   })
    488   1.1.1.2    mrg 
    489   1.1.1.2    mrg ;; "load_qi_libgcc"
    490   1.1.1.2    mrg ;; "load_hi_libgcc"
    491   1.1.1.2    mrg ;; "load_psi_libgcc"
    492   1.1.1.2    mrg ;; "load_si_libgcc"
    493   1.1.1.2    mrg ;; "load_sf_libgcc"
    494   1.1.1.2    mrg (define_insn "load_<mode>_libgcc"
    495   1.1.1.2    mrg   [(set (reg:MOVMODE 22)
    496   1.1.1.2    mrg         (match_operand:MOVMODE 0 "memory_operand" "m,m"))]
    497   1.1.1.2    mrg   "avr_load_libgcc_p (operands[0])
    498   1.1.1.2    mrg    && REG_P (XEXP (operands[0], 0))
    499   1.1.1.2    mrg    && REG_Z == REGNO (XEXP (operands[0], 0))"
    500   1.1.1.2    mrg   {
    501   1.1.1.2    mrg     operands[0] = GEN_INT (GET_MODE_SIZE (<MODE>mode));
    502   1.1.1.2    mrg     return "%~call __load_%0";
    503   1.1.1.2    mrg   }
    504   1.1.1.2    mrg   [(set_attr "length" "1,2")
    505   1.1.1.2    mrg    (set_attr "isa" "rjmp,jmp")
    506   1.1.1.2    mrg    (set_attr "cc" "clobber")])
    507   1.1.1.2    mrg 
    508   1.1.1.2    mrg 
    509   1.1.1.2    mrg ;; "xload8qi_A"
    510   1.1.1.2    mrg ;; "xload8qq_A" "xload8uqq_A"
    511   1.1.1.2    mrg (define_insn_and_split "xload8<mode>_A"
    512   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "register_operand" "=r")
    513   1.1.1.2    mrg         (match_operand:ALL1 1 "memory_operand"    "m"))
    514   1.1.1.2    mrg    (clobber (reg:HI REG_Z))]
    515   1.1.1.2    mrg   "can_create_pseudo_p()
    516   1.1.1.2    mrg    && !avr_xload_libgcc_p (<MODE>mode)
    517   1.1.1.2    mrg    && avr_mem_memx_p (operands[1])
    518   1.1.1.2    mrg    && REG_P (XEXP (operands[1], 0))"
    519   1.1.1.2    mrg   { gcc_unreachable(); }
    520   1.1.1.2    mrg   "&& 1"
    521   1.1.1.2    mrg   [(clobber (const_int 0))]
    522   1.1.1.2    mrg   {
    523   1.1.1.2    mrg     /* ; Split away the high part of the address.  GCC's register allocator
    524   1.1.1.2    mrg        ; in not able to allocate segment registers and reload the resulting
    525   1.1.1.2    mrg        ; expressions.  Notice that no address register can hold a PSImode.  */
    526   1.1.1.2    mrg 
    527   1.1.1.6    mrg     rtx_insn *insn;
    528   1.1.1.6    mrg     rtx addr = XEXP (operands[1], 0);
    529   1.1.1.2    mrg     rtx hi8 = gen_reg_rtx (QImode);
    530   1.1.1.2    mrg     rtx reg_z = gen_rtx_REG (HImode, REG_Z);
    531   1.1.1.2    mrg 
    532   1.1.1.2    mrg     emit_move_insn (reg_z, simplify_gen_subreg (HImode, addr, PSImode, 0));
    533   1.1.1.2    mrg     emit_move_insn (hi8, simplify_gen_subreg (QImode, addr, PSImode, 2));
    534   1.1.1.2    mrg 
    535   1.1.1.2    mrg     insn = emit_insn (gen_xload<mode>_8 (operands[0], hi8));
    536   1.1.1.2    mrg     set_mem_addr_space (SET_SRC (single_set (insn)),
    537   1.1.1.2    mrg                                  MEM_ADDR_SPACE (operands[1]));
    538   1.1.1.2    mrg     DONE;
    539   1.1.1.2    mrg   })
    540   1.1.1.2    mrg 
    541   1.1.1.2    mrg ;; "xloadqi_A" "xloadqq_A" "xloaduqq_A"
    542   1.1.1.2    mrg ;; "xloadhi_A" "xloadhq_A" "xloaduhq_A" "xloadha_A" "xloaduha_A"
    543   1.1.1.2    mrg ;; "xloadsi_A" "xloadsq_A" "xloadusq_A" "xloadsa_A" "xloadusa_A"
    544   1.1.1.2    mrg ;; "xloadpsi_A"
    545   1.1.1.2    mrg ;; "xloadsf_A"
    546   1.1.1.2    mrg (define_insn_and_split "xload<mode>_A"
    547   1.1.1.2    mrg   [(set (match_operand:MOVMODE 0 "register_operand" "=r")
    548   1.1.1.2    mrg         (match_operand:MOVMODE 1 "memory_operand"    "m"))
    549   1.1.1.2    mrg    (clobber (reg:MOVMODE 22))
    550   1.1.1.2    mrg    (clobber (reg:QI 21))
    551   1.1.1.2    mrg    (clobber (reg:HI REG_Z))]
    552   1.1.1.2    mrg   "can_create_pseudo_p()
    553   1.1.1.2    mrg    && avr_mem_memx_p (operands[1])
    554   1.1.1.2    mrg    && REG_P (XEXP (operands[1], 0))"
    555   1.1.1.2    mrg   { gcc_unreachable(); }
    556   1.1.1.2    mrg   "&& 1"
    557   1.1.1.2    mrg   [(clobber (const_int 0))]
    558   1.1.1.2    mrg   {
    559   1.1.1.2    mrg     rtx addr = XEXP (operands[1], 0);
    560   1.1.1.2    mrg     rtx reg_z = gen_rtx_REG (HImode, REG_Z);
    561   1.1.1.2    mrg     rtx addr_hi8 = simplify_gen_subreg (QImode, addr, PSImode, 2);
    562   1.1.1.2    mrg     addr_space_t as = MEM_ADDR_SPACE (operands[1]);
    563   1.1.1.6    mrg     rtx_insn *insn;
    564   1.1.1.2    mrg 
    565   1.1.1.2    mrg     /* Split the address to R21:Z */
    566   1.1.1.2    mrg     emit_move_insn (reg_z, simplify_gen_subreg (HImode, addr, PSImode, 0));
    567   1.1.1.2    mrg     emit_move_insn (gen_rtx_REG (QImode, 21), addr_hi8);
    568   1.1.1.2    mrg 
    569   1.1.1.2    mrg     /* Load with code from libgcc */
    570   1.1.1.2    mrg     insn = emit_insn (gen_xload_<mode>_libgcc ());
    571   1.1.1.2    mrg     set_mem_addr_space (SET_SRC (single_set (insn)), as);
    572   1.1.1.2    mrg 
    573   1.1.1.2    mrg     /* Move to destination */
    574   1.1.1.2    mrg     emit_move_insn (operands[0], gen_rtx_REG (<MODE>mode, 22));
    575   1.1.1.2    mrg 
    576   1.1.1.2    mrg     DONE;
    577   1.1.1.2    mrg   })
    578   1.1.1.2    mrg 
    579   1.1.1.2    mrg ;; Move value from address space memx to a register
    580   1.1.1.2    mrg ;; These insns must be prior to respective generic move insn.
    581   1.1.1.2    mrg 
    582   1.1.1.2    mrg ;; "xloadqi_8"
    583   1.1.1.2    mrg ;; "xloadqq_8" "xloaduqq_8"
    584   1.1.1.2    mrg (define_insn "xload<mode>_8"
    585   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "register_operand"                   "=&r,r")
    586   1.1.1.2    mrg         (mem:ALL1 (lo_sum:PSI (match_operand:QI 1 "register_operand" "r,r")
    587   1.1.1.2    mrg                               (reg:HI REG_Z))))]
    588   1.1.1.2    mrg   "!avr_xload_libgcc_p (<MODE>mode)"
    589   1.1.1.2    mrg   {
    590   1.1.1.2    mrg     return avr_out_xload (insn, operands, NULL);
    591   1.1.1.2    mrg   }
    592   1.1.1.2    mrg   [(set_attr "length" "4,4")
    593   1.1.1.2    mrg    (set_attr "adjust_len" "*,xload")
    594   1.1.1.2    mrg    (set_attr "isa" "lpmx,lpm")
    595   1.1.1.2    mrg    (set_attr "cc" "none")])
    596   1.1.1.2    mrg 
    597   1.1.1.2    mrg ;; R21:Z : 24-bit source address
    598   1.1.1.2    mrg ;; R22   : 1-4 byte output
    599   1.1.1.2    mrg 
    600   1.1.1.2    mrg ;; "xload_qi_libgcc" "xload_qq_libgcc" "xload_uqq_libgcc"
    601   1.1.1.2    mrg ;; "xload_hi_libgcc" "xload_hq_libgcc" "xload_uhq_libgcc" "xload_ha_libgcc" "xload_uha_libgcc"
    602   1.1.1.2    mrg ;; "xload_si_libgcc" "xload_sq_libgcc" "xload_usq_libgcc" "xload_sa_libgcc" "xload_usa_libgcc"
    603   1.1.1.2    mrg ;; "xload_sf_libgcc"
    604   1.1.1.2    mrg ;; "xload_psi_libgcc"
    605   1.1.1.2    mrg (define_insn "xload_<mode>_libgcc"
    606   1.1.1.2    mrg   [(set (reg:MOVMODE 22)
    607   1.1.1.2    mrg         (mem:MOVMODE (lo_sum:PSI (reg:QI 21)
    608   1.1.1.2    mrg                                  (reg:HI REG_Z))))
    609   1.1.1.2    mrg    (clobber (reg:QI 21))
    610   1.1.1.2    mrg    (clobber (reg:HI REG_Z))]
    611   1.1.1.2    mrg   "avr_xload_libgcc_p (<MODE>mode)"
    612   1.1.1.2    mrg   {
    613   1.1.1.2    mrg     rtx x_bytes = GEN_INT (GET_MODE_SIZE (<MODE>mode));
    614   1.1.1.2    mrg 
    615   1.1.1.2    mrg     output_asm_insn ("%~call __xload_%0", &x_bytes);
    616   1.1.1.2    mrg     return "";
    617   1.1.1.2    mrg   }
    618   1.1.1.2    mrg   [(set_attr "type" "xcall")
    619   1.1.1.2    mrg    (set_attr "cc" "clobber")])
    620       1.1    mrg 
    621       1.1    mrg 
    622   1.1.1.2    mrg ;; General move expanders
    623   1.1.1.2    mrg 
    624   1.1.1.2    mrg ;; "movqi" "movqq" "movuqq"
    625   1.1.1.2    mrg ;; "movhi" "movhq" "movuhq" "movha" "movuha"
    626   1.1.1.2    mrg ;; "movsi" "movsq" "movusq" "movsa" "movusa"
    627   1.1.1.2    mrg ;; "movsf"
    628   1.1.1.2    mrg ;; "movpsi"
    629   1.1.1.2    mrg (define_expand "mov<mode>"
    630   1.1.1.2    mrg   [(set (match_operand:MOVMODE 0 "nonimmediate_operand" "")
    631   1.1.1.2    mrg         (match_operand:MOVMODE 1 "general_operand" ""))]
    632       1.1    mrg   ""
    633   1.1.1.2    mrg   {
    634   1.1.1.2    mrg     rtx dest = operands[0];
    635   1.1.1.6    mrg     rtx src  = avr_eval_addr_attrib (operands[1]);
    636   1.1.1.2    mrg 
    637   1.1.1.2    mrg     if (avr_mem_flash_p (dest))
    638   1.1.1.2    mrg       DONE;
    639   1.1.1.2    mrg 
    640   1.1.1.7    mrg     if (QImode == <MODE>mode
    641   1.1.1.7    mrg         && SUBREG_P (src)
    642   1.1.1.7    mrg         && CONSTANT_ADDRESS_P (SUBREG_REG (src))
    643   1.1.1.7    mrg         && can_create_pseudo_p())
    644   1.1.1.7    mrg       {
    645   1.1.1.7    mrg         // store_bitfield may want to store a SYMBOL_REF or CONST in a
    646   1.1.1.7    mrg         // structure that's represented as PSImode.  As the upper 16 bits
    647   1.1.1.7    mrg         // of PSImode cannot be expressed as an HImode subreg, the rhs is
    648   1.1.1.7    mrg         // decomposed into QImode (word_mode) subregs of SYMBOL_REF,
    649   1.1.1.7    mrg         // CONST or LABEL_REF; cf. PR71103.
    650   1.1.1.7    mrg 
    651   1.1.1.7    mrg         rtx const_addr = SUBREG_REG (src);
    652   1.1.1.7    mrg         operands[1] = src = copy_rtx (src);
    653   1.1.1.7    mrg         SUBREG_REG (src) = copy_to_mode_reg (GET_MODE (const_addr), const_addr);
    654   1.1.1.7    mrg       }
    655   1.1.1.7    mrg 
    656   1.1.1.2    mrg     /* One of the operands has to be in a register.  */
    657   1.1.1.2    mrg     if (!register_operand (dest, <MODE>mode)
    658   1.1.1.2    mrg         && !reg_or_0_operand (src, <MODE>mode))
    659   1.1.1.2    mrg       {
    660   1.1.1.2    mrg         operands[1] = src = copy_to_mode_reg (<MODE>mode, src);
    661   1.1.1.2    mrg       }
    662   1.1.1.2    mrg 
    663   1.1.1.2    mrg     if (avr_mem_memx_p (src))
    664   1.1.1.2    mrg       {
    665   1.1.1.2    mrg         rtx addr = XEXP (src, 0);
    666   1.1.1.2    mrg 
    667   1.1.1.2    mrg         if (!REG_P (addr))
    668   1.1.1.2    mrg           src = replace_equiv_address (src, copy_to_mode_reg (PSImode, addr));
    669   1.1.1.2    mrg 
    670   1.1.1.2    mrg         if (!avr_xload_libgcc_p (<MODE>mode))
    671   1.1.1.2    mrg           /* ; No <mode> here because gen_xload8<mode>_A only iterates over ALL1.
    672   1.1.1.2    mrg              ; insn-emit does not depend on the mode, it's all about operands.  */
    673   1.1.1.2    mrg           emit_insn (gen_xload8qi_A (dest, src));
    674   1.1.1.2    mrg         else
    675   1.1.1.2    mrg           emit_insn (gen_xload<mode>_A (dest, src));
    676   1.1.1.2    mrg 
    677   1.1.1.2    mrg         DONE;
    678   1.1.1.2    mrg       }
    679   1.1.1.2    mrg 
    680   1.1.1.2    mrg     if (avr_load_libgcc_p (src))
    681   1.1.1.2    mrg       {
    682   1.1.1.2    mrg         /* For the small devices, do loads per libgcc call.  */
    683   1.1.1.2    mrg         emit_insn (gen_load<mode>_libgcc (dest, src));
    684   1.1.1.2    mrg         DONE;
    685   1.1.1.2    mrg       }
    686   1.1.1.2    mrg   })
    687       1.1    mrg 
    688       1.1    mrg ;;========================================================================
    689       1.1    mrg ;; move byte
    690       1.1    mrg ;; The last alternative (any immediate constant to any register) is
    691       1.1    mrg ;; very expensive.  It should be optimized by peephole2 if a scratch
    692       1.1    mrg ;; register is available, but then that register could just as well be
    693       1.1    mrg ;; allocated for the variable we are loading.  But, most of NO_LD_REGS
    694       1.1    mrg ;; are call-saved registers, and most of LD_REGS are call-used registers,
    695       1.1    mrg ;; so this may still be a win for registers live across function calls.
    696       1.1    mrg 
    697   1.1.1.2    mrg ;; "movqi_insn"
    698   1.1.1.2    mrg ;; "movqq_insn" "movuqq_insn"
    699   1.1.1.2    mrg (define_insn "mov<mode>_insn"
    700   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "nonimmediate_operand" "=r    ,d    ,Qm   ,r ,q,r,*r")
    701   1.1.1.2    mrg         (match_operand:ALL1 1 "nox_general_operand"   "r Y00,n Ynn,r Y00,Qm,r,q,i"))]
    702   1.1.1.2    mrg   "register_operand (operands[0], <MODE>mode)
    703   1.1.1.6    mrg     || reg_or_0_operand (operands[1], <MODE>mode)"
    704   1.1.1.2    mrg   {
    705   1.1.1.2    mrg     return output_movqi (insn, operands, NULL);
    706   1.1.1.2    mrg   }
    707       1.1    mrg   [(set_attr "length" "1,1,5,5,1,1,4")
    708   1.1.1.2    mrg    (set_attr "adjust_len" "mov8")
    709   1.1.1.2    mrg    (set_attr "cc" "ldi,none,clobber,clobber,none,none,clobber")])
    710       1.1    mrg 
    711       1.1    mrg ;; This is used in peephole2 to optimize loading immediate constants
    712       1.1    mrg ;; if a scratch register from LD_REGS happens to be available.
    713       1.1    mrg 
    714   1.1.1.2    mrg ;; "*reload_inqi"
    715   1.1.1.2    mrg ;; "*reload_inqq" "*reload_inuqq"
    716   1.1.1.2    mrg (define_insn "*reload_in<mode>"
    717   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "register_operand"    "=l")
    718   1.1.1.2    mrg         (match_operand:ALL1 1 "const_operand"        "i"))
    719       1.1    mrg    (clobber (match_operand:QI 2 "register_operand" "=&d"))]
    720       1.1    mrg   "reload_completed"
    721       1.1    mrg   "ldi %2,lo8(%1)
    722       1.1    mrg 	mov %0,%2"
    723       1.1    mrg   [(set_attr "length" "2")
    724       1.1    mrg    (set_attr "cc" "none")])
    725       1.1    mrg 
    726       1.1    mrg (define_peephole2
    727       1.1    mrg   [(match_scratch:QI 2 "d")
    728   1.1.1.2    mrg    (set (match_operand:ALL1 0 "l_register_operand" "")
    729   1.1.1.2    mrg         (match_operand:ALL1 1 "const_operand" ""))]
    730   1.1.1.2    mrg   ; No need for a clobber reg for 0x0, 0x01 or 0xff
    731   1.1.1.2    mrg   "!satisfies_constraint_Y00 (operands[1])
    732   1.1.1.2    mrg    && !satisfies_constraint_Y01 (operands[1])
    733   1.1.1.2    mrg    && !satisfies_constraint_Ym1 (operands[1])"
    734   1.1.1.2    mrg   [(parallel [(set (match_dup 0)
    735   1.1.1.2    mrg                    (match_dup 1))
    736   1.1.1.2    mrg               (clobber (match_dup 2))])])
    737       1.1    mrg 
    738       1.1    mrg ;;============================================================================
    739       1.1    mrg ;; move word (16 bit)
    740       1.1    mrg 
    741   1.1.1.2    mrg ;; Move register $1 to the Stack Pointer register SP.
    742   1.1.1.2    mrg ;; This insn is emit during function prologue/epilogue generation.
    743   1.1.1.2    mrg ;;    $2 =  0: We know that IRQs are off
    744   1.1.1.2    mrg ;;    $2 =  1: We know that IRQs are on
    745   1.1.1.2    mrg ;;    $2 =  2: SP has 8 bits only, IRQ state does not matter
    746   1.1.1.2    mrg ;;    $2 = -1: We don't know anything about IRQ on/off
    747   1.1.1.2    mrg ;; Always write SP via unspec, see PR50063
    748   1.1.1.2    mrg 
    749   1.1.1.2    mrg (define_insn "movhi_sp_r"
    750   1.1.1.2    mrg   [(set (match_operand:HI 0 "stack_register_operand"                "=q,q,q,q,q")
    751   1.1.1.2    mrg         (unspec_volatile:HI [(match_operand:HI 1 "register_operand"  "r,r,r,r,r")
    752   1.1.1.2    mrg                              (match_operand:HI 2 "const_int_operand" "L,P,N,K,LPN")]
    753   1.1.1.2    mrg                             UNSPECV_WRITE_SP))]
    754       1.1    mrg   ""
    755   1.1.1.2    mrg   "@
    756   1.1.1.2    mrg 	out %B0,%B1\;out %A0,%A1
    757   1.1.1.2    mrg 	cli\;out %B0,%B1\;sei\;out %A0,%A1
    758   1.1.1.2    mrg 	in __tmp_reg__,__SREG__\;cli\;out %B0,%B1\;out __SREG__,__tmp_reg__\;out %A0,%A1
    759   1.1.1.2    mrg 	out %A0,%A1
    760   1.1.1.2    mrg 	out %A0,%A1\;out %B0,%B1"
    761   1.1.1.2    mrg   [(set_attr "length" "2,4,5,1,2")
    762   1.1.1.2    mrg    (set_attr "isa" "no_xmega,no_xmega,no_xmega,*,xmega")
    763       1.1    mrg    (set_attr "cc" "none")])
    764       1.1    mrg 
    765       1.1    mrg (define_peephole2
    766       1.1    mrg   [(match_scratch:QI 2 "d")
    767   1.1.1.2    mrg    (set (match_operand:ALL2 0 "l_register_operand" "")
    768   1.1.1.2    mrg         (match_operand:ALL2 1 "const_or_immediate_operand" ""))]
    769   1.1.1.2    mrg   "operands[1] != CONST0_RTX (<MODE>mode)"
    770   1.1.1.2    mrg   [(parallel [(set (match_dup 0)
    771   1.1.1.2    mrg                    (match_dup 1))
    772   1.1.1.2    mrg               (clobber (match_dup 2))])])
    773       1.1    mrg 
    774       1.1    mrg ;; '*' because it is not used in rtl generation, only in above peephole
    775   1.1.1.2    mrg ;; "*reload_inhi"
    776   1.1.1.2    mrg ;; "*reload_inhq" "*reload_inuhq"
    777   1.1.1.2    mrg ;; "*reload_inha" "*reload_inuha"
    778   1.1.1.2    mrg (define_insn "*reload_in<mode>"
    779   1.1.1.2    mrg   [(set (match_operand:ALL2 0 "l_register_operand"  "=l")
    780   1.1.1.2    mrg         (match_operand:ALL2 1 "immediate_operand"    "i"))
    781       1.1    mrg    (clobber (match_operand:QI 2 "register_operand" "=&d"))]
    782       1.1    mrg   "reload_completed"
    783   1.1.1.2    mrg   {
    784   1.1.1.2    mrg     return output_reload_inhi (operands, operands[2], NULL);
    785   1.1.1.2    mrg   }
    786       1.1    mrg   [(set_attr "length" "4")
    787   1.1.1.2    mrg    (set_attr "adjust_len" "reload_in16")
    788   1.1.1.2    mrg    (set_attr "cc" "clobber")])
    789       1.1    mrg 
    790   1.1.1.2    mrg ;; "*movhi"
    791   1.1.1.2    mrg ;; "*movhq" "*movuhq"
    792   1.1.1.2    mrg ;; "*movha" "*movuha"
    793   1.1.1.2    mrg (define_insn "*mov<mode>"
    794   1.1.1.2    mrg   [(set (match_operand:ALL2 0 "nonimmediate_operand" "=r,r  ,r,m    ,d,*r,q,r")
    795   1.1.1.2    mrg         (match_operand:ALL2 1 "nox_general_operand"   "r,Y00,m,r Y00,i,i ,r,q"))]
    796   1.1.1.2    mrg   "register_operand (operands[0], <MODE>mode)
    797   1.1.1.2    mrg    || reg_or_0_operand (operands[1], <MODE>mode)"
    798   1.1.1.2    mrg   {
    799   1.1.1.2    mrg     return output_movhi (insn, operands, NULL);
    800   1.1.1.2    mrg   }
    801   1.1.1.2    mrg   [(set_attr "length" "2,2,6,7,2,6,5,2")
    802   1.1.1.2    mrg    (set_attr "adjust_len" "mov16")
    803   1.1.1.2    mrg    (set_attr "cc" "none,none,clobber,clobber,none,clobber,none,none")])
    804       1.1    mrg 
    805       1.1    mrg (define_peephole2 ; movw
    806   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "even_register_operand" "")
    807   1.1.1.2    mrg         (match_operand:ALL1 1 "even_register_operand" ""))
    808   1.1.1.2    mrg    (set (match_operand:ALL1 2 "odd_register_operand" "")
    809   1.1.1.2    mrg         (match_operand:ALL1 3 "odd_register_operand" ""))]
    810   1.1.1.2    mrg   "AVR_HAVE_MOVW
    811   1.1.1.2    mrg    && REGNO (operands[0]) == REGNO (operands[2]) - 1
    812   1.1.1.2    mrg    && REGNO (operands[1]) == REGNO (operands[3]) - 1"
    813   1.1.1.2    mrg   [(set (match_dup 4)
    814   1.1.1.2    mrg         (match_dup 5))]
    815       1.1    mrg   {
    816       1.1    mrg     operands[4] = gen_rtx_REG (HImode, REGNO (operands[0]));
    817       1.1    mrg     operands[5] = gen_rtx_REG (HImode, REGNO (operands[1]));
    818       1.1    mrg   })
    819       1.1    mrg 
    820       1.1    mrg (define_peephole2 ; movw_r
    821   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "odd_register_operand" "")
    822   1.1.1.2    mrg         (match_operand:ALL1 1 "odd_register_operand" ""))
    823   1.1.1.2    mrg    (set (match_operand:ALL1 2 "even_register_operand" "")
    824   1.1.1.2    mrg         (match_operand:ALL1 3 "even_register_operand" ""))]
    825   1.1.1.2    mrg   "AVR_HAVE_MOVW
    826   1.1.1.2    mrg    && REGNO (operands[2]) == REGNO (operands[0]) - 1
    827   1.1.1.2    mrg    && REGNO (operands[3]) == REGNO (operands[1]) - 1"
    828   1.1.1.2    mrg   [(set (match_dup 4)
    829   1.1.1.2    mrg         (match_dup 5))]
    830       1.1    mrg   {
    831       1.1    mrg     operands[4] = gen_rtx_REG (HImode, REGNO (operands[2]));
    832       1.1    mrg     operands[5] = gen_rtx_REG (HImode, REGNO (operands[3]));
    833       1.1    mrg   })
    834       1.1    mrg 
    835   1.1.1.2    mrg ;; For LPM loads from AS1 we split
    836   1.1.1.2    mrg ;;    R = *Z
    837   1.1.1.2    mrg ;; to
    838   1.1.1.2    mrg ;;    R = *Z++
    839   1.1.1.2    mrg ;;    Z = Z - sizeof (R)
    840   1.1.1.2    mrg ;;
    841   1.1.1.2    mrg ;; so that the second instruction can be optimized out.
    842   1.1.1.2    mrg 
    843   1.1.1.2    mrg (define_split ; "split-lpmx"
    844   1.1.1.2    mrg   [(set (match_operand:HISI 0 "register_operand" "")
    845   1.1.1.2    mrg         (match_operand:HISI 1 "memory_operand" ""))]
    846   1.1.1.2    mrg   "reload_completed
    847   1.1.1.2    mrg    && AVR_HAVE_LPMX"
    848   1.1.1.2    mrg   [(set (match_dup 0)
    849   1.1.1.2    mrg         (match_dup 2))
    850   1.1.1.2    mrg    (set (match_dup 3)
    851   1.1.1.2    mrg         (plus:HI (match_dup 3)
    852   1.1.1.2    mrg                  (match_dup 4)))]
    853   1.1.1.2    mrg   {
    854   1.1.1.2    mrg      rtx addr = XEXP (operands[1], 0);
    855   1.1.1.2    mrg 
    856   1.1.1.2    mrg      if (!avr_mem_flash_p (operands[1])
    857   1.1.1.2    mrg          || !REG_P (addr)
    858   1.1.1.2    mrg          || reg_overlap_mentioned_p (addr, operands[0]))
    859   1.1.1.2    mrg        {
    860   1.1.1.2    mrg          FAIL;
    861   1.1.1.2    mrg        }
    862   1.1.1.2    mrg 
    863   1.1.1.2    mrg     operands[2] = replace_equiv_address (operands[1],
    864   1.1.1.2    mrg                                          gen_rtx_POST_INC (Pmode, addr));
    865   1.1.1.2    mrg     operands[3] = addr;
    866   1.1.1.2    mrg     operands[4] = gen_int_mode (-GET_MODE_SIZE (<MODE>mode), HImode);
    867   1.1.1.2    mrg   })
    868   1.1.1.2    mrg 
    869       1.1    mrg ;;==========================================================================
    870   1.1.1.2    mrg ;; xpointer move (24 bit)
    871   1.1.1.2    mrg 
    872   1.1.1.2    mrg (define_peephole2 ; *reload_inpsi
    873   1.1.1.2    mrg   [(match_scratch:QI 2 "d")
    874   1.1.1.2    mrg    (set (match_operand:PSI 0 "l_register_operand" "")
    875   1.1.1.2    mrg         (match_operand:PSI 1 "immediate_operand" ""))
    876   1.1.1.2    mrg    (match_dup 2)]
    877   1.1.1.2    mrg   "operands[1] != const0_rtx
    878   1.1.1.2    mrg    && operands[1] != constm1_rtx"
    879   1.1.1.2    mrg   [(parallel [(set (match_dup 0)
    880   1.1.1.2    mrg                    (match_dup 1))
    881   1.1.1.2    mrg               (clobber (match_dup 2))])])
    882       1.1    mrg 
    883   1.1.1.2    mrg ;; '*' because it is not used in rtl generation.
    884   1.1.1.2    mrg (define_insn "*reload_inpsi"
    885   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand" "=r")
    886   1.1.1.2    mrg         (match_operand:PSI 1 "immediate_operand" "i"))
    887   1.1.1.2    mrg    (clobber (match_operand:QI 2 "register_operand" "=&d"))]
    888   1.1.1.2    mrg   "reload_completed"
    889   1.1.1.2    mrg   {
    890   1.1.1.2    mrg     return avr_out_reload_inpsi (operands, operands[2], NULL);
    891   1.1.1.2    mrg   }
    892   1.1.1.2    mrg   [(set_attr "length" "6")
    893   1.1.1.2    mrg    (set_attr "adjust_len" "reload_in24")
    894   1.1.1.2    mrg    (set_attr "cc" "clobber")])
    895       1.1    mrg 
    896   1.1.1.2    mrg (define_insn "*movpsi"
    897   1.1.1.2    mrg   [(set (match_operand:PSI 0 "nonimmediate_operand" "=r,r,r ,Qm,!d,r")
    898   1.1.1.2    mrg         (match_operand:PSI 1 "nox_general_operand"   "r,L,Qm,rL,i ,i"))]
    899   1.1.1.2    mrg   "register_operand (operands[0], PSImode)
    900   1.1.1.2    mrg    || register_operand (operands[1], PSImode)
    901   1.1.1.2    mrg    || const0_rtx == operands[1]"
    902   1.1.1.2    mrg   {
    903   1.1.1.2    mrg     return avr_out_movpsi (insn, operands, NULL);
    904   1.1.1.2    mrg   }
    905   1.1.1.2    mrg   [(set_attr "length" "3,3,8,9,4,10")
    906   1.1.1.2    mrg    (set_attr "adjust_len" "mov24")
    907   1.1.1.2    mrg    (set_attr "cc" "none,none,clobber,clobber,none,clobber")])
    908       1.1    mrg 
    909   1.1.1.2    mrg ;;==========================================================================
    910   1.1.1.2    mrg ;; move double word (32 bit)
    911       1.1    mrg 
    912   1.1.1.2    mrg (define_peephole2 ; *reload_insi
    913       1.1    mrg   [(match_scratch:QI 2 "d")
    914   1.1.1.2    mrg    (set (match_operand:ALL4 0 "l_register_operand" "")
    915   1.1.1.2    mrg         (match_operand:ALL4 1 "immediate_operand" ""))
    916       1.1    mrg    (match_dup 2)]
    917   1.1.1.2    mrg   "operands[1] != CONST0_RTX (<MODE>mode)"
    918   1.1.1.2    mrg   [(parallel [(set (match_dup 0)
    919   1.1.1.2    mrg                    (match_dup 1))
    920   1.1.1.2    mrg               (clobber (match_dup 2))])])
    921       1.1    mrg 
    922       1.1    mrg ;; '*' because it is not used in rtl generation.
    923   1.1.1.2    mrg ;; "*reload_insi"
    924   1.1.1.2    mrg ;; "*reload_insq" "*reload_inusq"
    925   1.1.1.2    mrg ;; "*reload_insa" "*reload_inusa"
    926       1.1    mrg (define_insn "*reload_insi"
    927   1.1.1.2    mrg   [(set (match_operand:ALL4 0 "register_operand"   "=r")
    928   1.1.1.2    mrg         (match_operand:ALL4 1 "immediate_operand"   "n Ynn"))
    929       1.1    mrg    (clobber (match_operand:QI 2 "register_operand" "=&d"))]
    930       1.1    mrg   "reload_completed"
    931   1.1.1.2    mrg   {
    932   1.1.1.2    mrg     return output_reload_insisf (operands, operands[2], NULL);
    933   1.1.1.2    mrg   }
    934       1.1    mrg   [(set_attr "length" "8")
    935   1.1.1.2    mrg    (set_attr "adjust_len" "reload_in32")
    936   1.1.1.2    mrg    (set_attr "cc" "clobber")])
    937       1.1    mrg 
    938       1.1    mrg 
    939   1.1.1.2    mrg ;; "*movsi"
    940   1.1.1.2    mrg ;; "*movsq" "*movusq"
    941   1.1.1.2    mrg ;; "*movsa" "*movusa"
    942   1.1.1.2    mrg (define_insn "*mov<mode>"
    943   1.1.1.2    mrg   [(set (match_operand:ALL4 0 "nonimmediate_operand" "=r,r  ,r ,Qm   ,!d,r")
    944   1.1.1.2    mrg         (match_operand:ALL4 1 "nox_general_operand"   "r,Y00,Qm,r Y00,i ,i"))]
    945   1.1.1.2    mrg   "register_operand (operands[0], <MODE>mode)
    946   1.1.1.2    mrg    || reg_or_0_operand (operands[1], <MODE>mode)"
    947   1.1.1.2    mrg   {
    948   1.1.1.2    mrg     return output_movsisf (insn, operands, NULL);
    949   1.1.1.2    mrg   }
    950       1.1    mrg   [(set_attr "length" "4,4,8,9,4,10")
    951   1.1.1.2    mrg    (set_attr "adjust_len" "mov32")
    952   1.1.1.2    mrg    (set_attr "cc" "none,none,clobber,clobber,none,clobber")])
    953       1.1    mrg 
    954       1.1    mrg ;; fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    955       1.1    mrg ;; move floating point numbers (32 bit)
    956       1.1    mrg 
    957       1.1    mrg (define_insn "*movsf"
    958   1.1.1.2    mrg   [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,r ,Qm,!d,r")
    959   1.1.1.2    mrg         (match_operand:SF 1 "nox_general_operand"   "r,G,Qm,rG,F ,F"))]
    960       1.1    mrg   "register_operand (operands[0], SFmode)
    961   1.1.1.2    mrg    || reg_or_0_operand (operands[1], SFmode)"
    962   1.1.1.2    mrg   {
    963   1.1.1.2    mrg     return output_movsisf (insn, operands, NULL);
    964   1.1.1.2    mrg   }
    965       1.1    mrg   [(set_attr "length" "4,4,8,9,4,10")
    966   1.1.1.2    mrg    (set_attr "adjust_len" "mov32")
    967   1.1.1.2    mrg    (set_attr "cc" "none,none,clobber,clobber,none,clobber")])
    968   1.1.1.2    mrg 
    969   1.1.1.2    mrg (define_peephole2 ; *reload_insf
    970   1.1.1.2    mrg   [(match_scratch:QI 2 "d")
    971   1.1.1.2    mrg    (set (match_operand:SF 0 "l_register_operand" "")
    972   1.1.1.2    mrg         (match_operand:SF 1 "const_double_operand" ""))
    973   1.1.1.2    mrg    (match_dup 2)]
    974   1.1.1.2    mrg   "operands[1] != CONST0_RTX (SFmode)"
    975   1.1.1.2    mrg   [(parallel [(set (match_dup 0)
    976   1.1.1.2    mrg                    (match_dup 1))
    977   1.1.1.2    mrg               (clobber (match_dup 2))])])
    978   1.1.1.2    mrg 
    979   1.1.1.2    mrg ;; '*' because it is not used in rtl generation.
    980   1.1.1.2    mrg (define_insn "*reload_insf"
    981   1.1.1.2    mrg   [(set (match_operand:SF 0 "register_operand" "=r")
    982   1.1.1.2    mrg         (match_operand:SF 1 "const_double_operand" "F"))
    983   1.1.1.2    mrg    (clobber (match_operand:QI 2 "register_operand" "=&d"))]
    984   1.1.1.2    mrg   "reload_completed"
    985   1.1.1.2    mrg   {
    986   1.1.1.2    mrg     return output_reload_insisf (operands, operands[2], NULL);
    987   1.1.1.2    mrg   }
    988   1.1.1.2    mrg   [(set_attr "length" "8")
    989   1.1.1.2    mrg    (set_attr "adjust_len" "reload_in32")
    990   1.1.1.2    mrg    (set_attr "cc" "clobber")])
    991       1.1    mrg 
    992       1.1    mrg ;;=========================================================================
    993       1.1    mrg ;; move string (like memcpy)
    994       1.1    mrg 
    995       1.1    mrg (define_expand "movmemhi"
    996       1.1    mrg   [(parallel [(set (match_operand:BLK 0 "memory_operand" "")
    997   1.1.1.2    mrg                    (match_operand:BLK 1 "memory_operand" ""))
    998   1.1.1.2    mrg               (use (match_operand:HI 2 "const_int_operand" ""))
    999   1.1.1.2    mrg               (use (match_operand:HI 3 "const_int_operand" ""))])]
   1000   1.1.1.2    mrg   ""
   1001   1.1.1.2    mrg   {
   1002   1.1.1.2    mrg     if (avr_emit_movmemhi (operands))
   1003   1.1.1.2    mrg       DONE;
   1004       1.1    mrg 
   1005       1.1    mrg     FAIL;
   1006   1.1.1.2    mrg   })
   1007       1.1    mrg 
   1008   1.1.1.2    mrg (define_mode_attr MOVMEM_r_d [(QI "r")
   1009   1.1.1.2    mrg                               (HI "wd")])
   1010   1.1.1.2    mrg 
   1011   1.1.1.2    mrg ;; $0     : Address Space
   1012   1.1.1.2    mrg ;; $1, $2 : Loop register
   1013   1.1.1.2    mrg ;; R30    : source address
   1014   1.1.1.2    mrg ;; R26    : destination address
   1015   1.1.1.2    mrg 
   1016   1.1.1.2    mrg ;; "movmem_qi"
   1017   1.1.1.2    mrg ;; "movmem_hi"
   1018   1.1.1.2    mrg (define_insn "movmem_<mode>"
   1019   1.1.1.2    mrg   [(set (mem:BLK (reg:HI REG_X))
   1020   1.1.1.2    mrg         (mem:BLK (reg:HI REG_Z)))
   1021   1.1.1.2    mrg    (unspec [(match_operand:QI 0 "const_int_operand" "n")]
   1022   1.1.1.2    mrg            UNSPEC_MOVMEM)
   1023   1.1.1.2    mrg    (use (match_operand:QIHI 1 "register_operand" "<MOVMEM_r_d>"))
   1024   1.1.1.2    mrg    (clobber (reg:HI REG_X))
   1025   1.1.1.2    mrg    (clobber (reg:HI REG_Z))
   1026   1.1.1.2    mrg    (clobber (reg:QI LPM_REGNO))
   1027   1.1.1.2    mrg    (clobber (match_operand:QIHI 2 "register_operand" "=1"))]
   1028   1.1.1.2    mrg   ""
   1029   1.1.1.2    mrg   {
   1030   1.1.1.2    mrg     return avr_out_movmem (insn, operands, NULL);
   1031   1.1.1.2    mrg   }
   1032   1.1.1.2    mrg   [(set_attr "adjust_len" "movmem")
   1033   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   1034       1.1    mrg 
   1035       1.1    mrg 
   1036   1.1.1.2    mrg ;; $0    : Address Space
   1037   1.1.1.2    mrg ;; $1    : RAMPZ RAM address
   1038   1.1.1.2    mrg ;; R24   : #bytes and loop register
   1039   1.1.1.2    mrg ;; R23:Z : 24-bit source address
   1040   1.1.1.2    mrg ;; R26   : 16-bit destination address
   1041   1.1.1.2    mrg 
   1042   1.1.1.2    mrg ;; "movmemx_qi"
   1043   1.1.1.2    mrg ;; "movmemx_hi"
   1044   1.1.1.2    mrg (define_insn "movmemx_<mode>"
   1045   1.1.1.2    mrg   [(set (mem:BLK (reg:HI REG_X))
   1046   1.1.1.2    mrg         (mem:BLK (lo_sum:PSI (reg:QI 23)
   1047   1.1.1.2    mrg                              (reg:HI REG_Z))))
   1048   1.1.1.2    mrg    (unspec [(match_operand:QI 0 "const_int_operand" "n")]
   1049   1.1.1.2    mrg            UNSPEC_MOVMEM)
   1050   1.1.1.2    mrg    (use (reg:QIHI 24))
   1051   1.1.1.2    mrg    (clobber (reg:HI REG_X))
   1052   1.1.1.2    mrg    (clobber (reg:HI REG_Z))
   1053   1.1.1.2    mrg    (clobber (reg:QI LPM_REGNO))
   1054   1.1.1.2    mrg    (clobber (reg:HI 24))
   1055   1.1.1.2    mrg    (clobber (reg:QI 23))
   1056   1.1.1.2    mrg    (clobber (mem:QI (match_operand:QI 1 "io_address_operand" "n")))]
   1057   1.1.1.2    mrg   ""
   1058   1.1.1.2    mrg   "%~call __movmemx_<mode>"
   1059   1.1.1.2    mrg   [(set_attr "type" "xcall")
   1060   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   1061   1.1.1.2    mrg 
   1062       1.1    mrg 
   1063   1.1.1.2    mrg ;; =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2
   1064       1.1    mrg ;; memset (%0, %2, %1)
   1065       1.1    mrg 
   1066       1.1    mrg (define_expand "setmemhi"
   1067       1.1    mrg   [(parallel [(set (match_operand:BLK 0 "memory_operand" "")
   1068   1.1.1.2    mrg                    (match_operand 2 "const_int_operand" ""))
   1069   1.1.1.2    mrg               (use (match_operand:HI 1 "const_int_operand" ""))
   1070   1.1.1.2    mrg               (use (match_operand:HI 3 "const_int_operand" ""))
   1071   1.1.1.9    mrg               (clobber (match_scratch:HI 5 ""))
   1072   1.1.1.9    mrg               (clobber (match_dup 4))])]
   1073   1.1.1.2    mrg   ""
   1074   1.1.1.2    mrg   {
   1075   1.1.1.2    mrg     rtx addr0;
   1076   1.1.1.6    mrg     machine_mode mode;
   1077       1.1    mrg 
   1078   1.1.1.2    mrg     /* If value to set is not zero, use the library routine.  */
   1079   1.1.1.2    mrg     if (operands[2] != const0_rtx)
   1080   1.1.1.2    mrg       FAIL;
   1081   1.1.1.2    mrg 
   1082   1.1.1.2    mrg     if (!CONST_INT_P (operands[1]))
   1083   1.1.1.2    mrg       FAIL;
   1084   1.1.1.2    mrg 
   1085   1.1.1.2    mrg     mode = u8_operand (operands[1], VOIDmode) ? QImode : HImode;
   1086   1.1.1.9    mrg     operands[4] = gen_rtx_SCRATCH (mode);
   1087   1.1.1.2    mrg     operands[1] = copy_to_mode_reg (mode,
   1088   1.1.1.2    mrg                                     gen_int_mode (INTVAL (operands[1]), mode));
   1089   1.1.1.2    mrg     addr0 = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
   1090   1.1.1.2    mrg     operands[0] = gen_rtx_MEM (BLKmode, addr0);
   1091   1.1.1.2    mrg   })
   1092       1.1    mrg 
   1093       1.1    mrg 
   1094       1.1    mrg (define_insn "*clrmemqi"
   1095       1.1    mrg   [(set (mem:BLK (match_operand:HI 0 "register_operand" "e"))
   1096   1.1.1.2    mrg         (const_int 0))
   1097       1.1    mrg    (use (match_operand:QI 1 "register_operand" "r"))
   1098       1.1    mrg    (use (match_operand:QI 2 "const_int_operand" "n"))
   1099       1.1    mrg    (clobber (match_scratch:HI 3 "=0"))
   1100       1.1    mrg    (clobber (match_scratch:QI 4 "=&1"))]
   1101       1.1    mrg   ""
   1102   1.1.1.2    mrg   "0:\;st %a0+,__zero_reg__\;dec %1\;brne 0b"
   1103       1.1    mrg   [(set_attr "length" "3")
   1104       1.1    mrg    (set_attr "cc" "clobber")])
   1105       1.1    mrg 
   1106   1.1.1.2    mrg 
   1107       1.1    mrg (define_insn "*clrmemhi"
   1108       1.1    mrg   [(set (mem:BLK (match_operand:HI 0 "register_operand" "e,e"))
   1109   1.1.1.2    mrg         (const_int 0))
   1110       1.1    mrg    (use (match_operand:HI 1 "register_operand" "!w,d"))
   1111       1.1    mrg    (use (match_operand:HI 2 "const_int_operand" "n,n"))
   1112       1.1    mrg    (clobber (match_scratch:HI 3 "=0,0"))
   1113       1.1    mrg    (clobber (match_scratch:HI 4 "=&1,&1"))]
   1114       1.1    mrg   ""
   1115   1.1.1.2    mrg   "@
   1116   1.1.1.2    mrg 	0:\;st %a0+,__zero_reg__\;sbiw %A1,1\;brne 0b
   1117   1.1.1.2    mrg 	0:\;st %a0+,__zero_reg__\;subi %A1,1\;sbci %B1,0\;brne 0b"
   1118       1.1    mrg   [(set_attr "length" "3,4")
   1119       1.1    mrg    (set_attr "cc" "clobber,clobber")])
   1120       1.1    mrg 
   1121       1.1    mrg (define_expand "strlenhi"
   1122   1.1.1.2    mrg   [(set (match_dup 4)
   1123   1.1.1.2    mrg         (unspec:HI [(match_operand:BLK 1 "memory_operand" "")
   1124   1.1.1.2    mrg                     (match_operand:QI 2 "const_int_operand" "")
   1125   1.1.1.2    mrg                     (match_operand:HI 3 "immediate_operand" "")]
   1126   1.1.1.2    mrg                    UNSPEC_STRLEN))
   1127   1.1.1.2    mrg    (set (match_dup 4)
   1128   1.1.1.2    mrg         (plus:HI (match_dup 4)
   1129   1.1.1.2    mrg                  (const_int -1)))
   1130   1.1.1.2    mrg    (parallel [(set (match_operand:HI 0 "register_operand" "")
   1131   1.1.1.2    mrg                    (minus:HI (match_dup 4)
   1132   1.1.1.2    mrg                              (match_dup 5)))
   1133   1.1.1.2    mrg               (clobber (scratch:QI))])]
   1134   1.1.1.2    mrg   ""
   1135   1.1.1.2    mrg   {
   1136   1.1.1.2    mrg     rtx addr;
   1137   1.1.1.2    mrg     if (operands[2] != const0_rtx)
   1138   1.1.1.2    mrg       FAIL;
   1139   1.1.1.2    mrg     addr = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
   1140   1.1.1.2    mrg     operands[1] = gen_rtx_MEM (BLKmode, addr);
   1141   1.1.1.2    mrg     operands[5] = addr;
   1142   1.1.1.2    mrg     operands[4] = gen_reg_rtx (HImode);
   1143   1.1.1.2    mrg   })
   1144       1.1    mrg 
   1145       1.1    mrg (define_insn "*strlenhi"
   1146   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                      "=e")
   1147   1.1.1.2    mrg         (unspec:HI [(mem:BLK (match_operand:HI 1 "register_operand"  "0"))
   1148   1.1.1.2    mrg                     (const_int 0)
   1149   1.1.1.2    mrg                     (match_operand:HI 2 "immediate_operand"          "i")]
   1150   1.1.1.2    mrg                    UNSPEC_STRLEN))]
   1151   1.1.1.2    mrg   ""
   1152   1.1.1.2    mrg   "0:\;ld __tmp_reg__,%a0+\;tst __tmp_reg__\;brne 0b"
   1153       1.1    mrg   [(set_attr "length" "3")
   1154       1.1    mrg    (set_attr "cc" "clobber")])
   1155       1.1    mrg 
   1156       1.1    mrg ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   1157       1.1    mrg ; add bytes
   1158       1.1    mrg 
   1159   1.1.1.2    mrg ;; "addqi3"
   1160   1.1.1.2    mrg ;; "addqq3" "adduqq3"
   1161   1.1.1.2    mrg (define_insn "add<mode>3"
   1162   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "register_operand"            "=r,d    ,r  ,r  ,r  ,r")
   1163   1.1.1.2    mrg         (plus:ALL1 (match_operand:ALL1 1 "register_operand" "%0,0    ,0  ,0  ,0  ,0")
   1164   1.1.1.2    mrg                    (match_operand:ALL1 2 "nonmemory_operand" "r,n Ynn,Y01,Ym1,Y02,Ym2")))]
   1165       1.1    mrg   ""
   1166       1.1    mrg   "@
   1167       1.1    mrg 	add %0,%2
   1168       1.1    mrg 	subi %0,lo8(-(%2))
   1169       1.1    mrg 	inc %0
   1170   1.1.1.2    mrg 	dec %0
   1171   1.1.1.2    mrg 	inc %0\;inc %0
   1172   1.1.1.2    mrg 	dec %0\;dec %0"
   1173   1.1.1.2    mrg   [(set_attr "length" "1,1,1,1,2,2")
   1174   1.1.1.3  skrll    (set_attr "cc" "set_czn,set_czn,set_vzn,set_vzn,set_vzn,set_vzn")])
   1175   1.1.1.2    mrg 
   1176   1.1.1.2    mrg ;; "addhi3"
   1177   1.1.1.2    mrg ;; "addhq3" "adduhq3"
   1178   1.1.1.2    mrg ;; "addha3" "adduha3"
   1179   1.1.1.2    mrg (define_expand "add<mode>3"
   1180   1.1.1.2    mrg   [(set (match_operand:ALL2 0 "register_operand" "")
   1181   1.1.1.2    mrg         (plus:ALL2 (match_operand:ALL2 1 "register_operand" "")
   1182   1.1.1.2    mrg                    (match_operand:ALL2 2 "nonmemory_or_const_operand" "")))]
   1183       1.1    mrg   ""
   1184   1.1.1.2    mrg   {
   1185   1.1.1.2    mrg     if (CONST_INT_P (operands[2]))
   1186   1.1.1.2    mrg       {
   1187   1.1.1.2    mrg         operands[2] = gen_int_mode (INTVAL (operands[2]), HImode);
   1188   1.1.1.2    mrg 
   1189   1.1.1.2    mrg         if (can_create_pseudo_p()
   1190   1.1.1.2    mrg             && !stack_register_operand (operands[0], HImode)
   1191   1.1.1.2    mrg             && !stack_register_operand (operands[1], HImode)
   1192   1.1.1.2    mrg             && !d_register_operand (operands[0], HImode)
   1193   1.1.1.2    mrg             && !d_register_operand (operands[1], HImode))
   1194   1.1.1.2    mrg           {
   1195   1.1.1.2    mrg             emit_insn (gen_addhi3_clobber (operands[0], operands[1], operands[2]));
   1196   1.1.1.2    mrg             DONE;
   1197   1.1.1.2    mrg           }
   1198   1.1.1.2    mrg       }
   1199   1.1.1.2    mrg 
   1200   1.1.1.2    mrg     if (CONST_FIXED_P (operands[2]))
   1201   1.1.1.2    mrg       {
   1202   1.1.1.2    mrg         emit_insn (gen_add<mode>3_clobber (operands[0], operands[1], operands[2]));
   1203   1.1.1.2    mrg         DONE;
   1204   1.1.1.2    mrg       }
   1205   1.1.1.2    mrg   })
   1206       1.1    mrg 
   1207       1.1    mrg 
   1208       1.1    mrg (define_insn "*addhi3_zero_extend"
   1209   1.1.1.9    mrg   [(set (match_operand:HI 0 "register_operand"                         "=r,*?r")
   1210   1.1.1.9    mrg         (plus:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "r  ,0"))
   1211   1.1.1.9    mrg                  (match_operand:HI 2 "register_operand"                 "0  ,r")))]
   1212       1.1    mrg   ""
   1213   1.1.1.9    mrg   "@
   1214   1.1.1.9    mrg 	add %A0,%1\;adc %B0,__zero_reg__
   1215   1.1.1.9    mrg 	add %A0,%A2\;mov %B0,%B2\;adc %B0,__zero_reg__"
   1216   1.1.1.9    mrg   [(set_attr "length" "2,3")
   1217       1.1    mrg    (set_attr "cc" "set_n")])
   1218       1.1    mrg 
   1219       1.1    mrg (define_insn "*addhi3_zero_extend1"
   1220   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                         "=r")
   1221   1.1.1.2    mrg         (plus:HI (match_operand:HI 1 "register_operand"                 "0")
   1222   1.1.1.2    mrg                  (zero_extend:HI (match_operand:QI 2 "register_operand" "r"))))]
   1223       1.1    mrg   ""
   1224   1.1.1.2    mrg   "add %A0,%2\;adc %B0,__zero_reg__"
   1225       1.1    mrg   [(set_attr "length" "2")
   1226       1.1    mrg    (set_attr "cc" "set_n")])
   1227       1.1    mrg 
   1228   1.1.1.2    mrg (define_insn "*addhi3.sign_extend1"
   1229   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                         "=r")
   1230   1.1.1.2    mrg         (plus:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "r"))
   1231   1.1.1.2    mrg                  (match_operand:HI 2 "register_operand"                 "0")))]
   1232   1.1.1.2    mrg   ""
   1233   1.1.1.2    mrg   {
   1234   1.1.1.2    mrg     return reg_overlap_mentioned_p (operands[0], operands[1])
   1235   1.1.1.2    mrg       ? "mov __tmp_reg__,%1\;add %A0,%1\;adc %B0,__zero_reg__\;sbrc __tmp_reg__,7\;dec %B0"
   1236   1.1.1.2    mrg       : "add %A0,%1\;adc %B0,__zero_reg__\;sbrc %1,7\;dec %B0";
   1237   1.1.1.2    mrg   }
   1238   1.1.1.2    mrg   [(set_attr "length" "5")
   1239   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   1240       1.1    mrg 
   1241   1.1.1.9    mrg (define_insn "*addhi3_zero_extend.const"
   1242   1.1.1.9    mrg   [(set (match_operand:HI 0 "register_operand"                         "=d")
   1243   1.1.1.9    mrg         (plus:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "0"))
   1244   1.1.1.9    mrg                  (match_operand:HI 2 "const_m255_to_m1_operand"         "Cn8")))]
   1245   1.1.1.9    mrg   ""
   1246   1.1.1.9    mrg   "subi %A0,%n2\;sbc %B0,%B0"
   1247   1.1.1.9    mrg   [(set_attr "length" "2")
   1248   1.1.1.9    mrg    (set_attr "cc" "set_czn")])
   1249   1.1.1.9    mrg 
   1250   1.1.1.9    mrg (define_insn "*usum_widenqihi3"
   1251   1.1.1.9    mrg   [(set (match_operand:HI 0 "register_operand"                          "=r")
   1252   1.1.1.9    mrg         (plus:HI (zero_extend:HI (match_operand:QI 1 "register_operand"  "0"))
   1253   1.1.1.9    mrg                  (zero_extend:HI (match_operand:QI 2 "register_operand"  "r"))))]
   1254   1.1.1.9    mrg   ""
   1255   1.1.1.9    mrg   "add %A0,%2\;clr %B0\;rol %B0"
   1256   1.1.1.9    mrg   [(set_attr "length" "3")
   1257   1.1.1.9    mrg    (set_attr "cc" "clobber")])
   1258   1.1.1.9    mrg 
   1259   1.1.1.9    mrg (define_insn "*udiff_widenqihi3"
   1260   1.1.1.9    mrg   [(set (match_operand:HI 0 "register_operand"                           "=r")
   1261   1.1.1.9    mrg         (minus:HI (zero_extend:HI (match_operand:QI 1 "register_operand"  "0"))
   1262   1.1.1.9    mrg                   (zero_extend:HI (match_operand:QI 2 "register_operand"  "r"))))]
   1263   1.1.1.9    mrg   ""
   1264   1.1.1.9    mrg   "sub %A0,%2\;sbc %B0,%B0"
   1265   1.1.1.9    mrg   [(set_attr "length" "2")
   1266   1.1.1.9    mrg    (set_attr "cc" "set_czn")])
   1267   1.1.1.9    mrg     
   1268   1.1.1.2    mrg (define_insn "*addhi3_sp"
   1269   1.1.1.2    mrg   [(set (match_operand:HI 1 "stack_register_operand"           "=q")
   1270   1.1.1.2    mrg         (plus:HI (match_operand:HI 2 "stack_register_operand"   "q")
   1271   1.1.1.2    mrg                  (match_operand:HI 0 "avr_sp_immediate_operand" "Csp")))]
   1272   1.1.1.2    mrg   ""
   1273   1.1.1.2    mrg   {
   1274   1.1.1.2    mrg     return avr_out_addto_sp (operands, NULL);
   1275   1.1.1.2    mrg   }
   1276   1.1.1.2    mrg   [(set_attr "length" "6")
   1277   1.1.1.2    mrg    (set_attr "adjust_len" "addto_sp")])
   1278   1.1.1.2    mrg 
   1279   1.1.1.2    mrg ;; "*addhi3"
   1280   1.1.1.2    mrg ;; "*addhq3" "*adduhq3"
   1281   1.1.1.2    mrg ;; "*addha3" "*adduha3"
   1282   1.1.1.2    mrg (define_insn "*add<mode>3"
   1283   1.1.1.2    mrg   [(set (match_operand:ALL2 0 "register_operand"                   "=??r,d,!w    ,d")
   1284   1.1.1.2    mrg         (plus:ALL2 (match_operand:ALL2 1 "register_operand"          "%0,0,0     ,0")
   1285   1.1.1.2    mrg                    (match_operand:ALL2 2 "nonmemory_or_const_operand" "r,s,IJ YIJ,n Ynn")))]
   1286   1.1.1.2    mrg   ""
   1287   1.1.1.2    mrg   {
   1288   1.1.1.2    mrg     return avr_out_plus (insn, operands);
   1289   1.1.1.2    mrg   }
   1290   1.1.1.2    mrg   [(set_attr "length" "2")
   1291   1.1.1.2    mrg    (set_attr "adjust_len" "plus")
   1292   1.1.1.2    mrg    (set_attr "cc" "plus")])
   1293   1.1.1.2    mrg 
   1294   1.1.1.2    mrg ;; Adding a constant to NO_LD_REGS might have lead to a reload of
   1295   1.1.1.2    mrg ;; that constant to LD_REGS.  We don't add a scratch to *addhi3
   1296   1.1.1.2    mrg ;; itself because that insn is special to reload.
   1297   1.1.1.2    mrg 
   1298   1.1.1.2    mrg (define_peephole2 ; addhi3_clobber
   1299   1.1.1.2    mrg   [(set (match_operand:ALL2 0 "d_register_operand" "")
   1300   1.1.1.2    mrg         (match_operand:ALL2 1 "const_operand" ""))
   1301   1.1.1.2    mrg    (set (match_operand:ALL2 2 "l_register_operand" "")
   1302   1.1.1.2    mrg         (plus:ALL2 (match_dup 2)
   1303   1.1.1.2    mrg                    (match_dup 0)))]
   1304   1.1.1.2    mrg   "peep2_reg_dead_p (2, operands[0])"
   1305   1.1.1.2    mrg   [(parallel [(set (match_dup 2)
   1306   1.1.1.2    mrg                    (plus:ALL2 (match_dup 2)
   1307   1.1.1.2    mrg                               (match_dup 1)))
   1308   1.1.1.2    mrg               (clobber (match_dup 3))])]
   1309   1.1.1.2    mrg   {
   1310   1.1.1.2    mrg     operands[3] = simplify_gen_subreg (QImode, operands[0], <MODE>mode, 0);
   1311   1.1.1.2    mrg   })
   1312   1.1.1.2    mrg 
   1313   1.1.1.2    mrg ;; Same, but with reload to NO_LD_REGS
   1314   1.1.1.2    mrg ;; Combine *reload_inhi with *addhi3
   1315   1.1.1.2    mrg 
   1316   1.1.1.2    mrg (define_peephole2 ; addhi3_clobber
   1317   1.1.1.2    mrg   [(parallel [(set (match_operand:ALL2 0 "l_register_operand" "")
   1318   1.1.1.2    mrg                    (match_operand:ALL2 1 "const_operand" ""))
   1319   1.1.1.2    mrg               (clobber (match_operand:QI 2 "d_register_operand" ""))])
   1320   1.1.1.2    mrg    (set (match_operand:ALL2 3 "l_register_operand" "")
   1321   1.1.1.2    mrg         (plus:ALL2 (match_dup 3)
   1322   1.1.1.2    mrg                    (match_dup 0)))]
   1323   1.1.1.2    mrg   "peep2_reg_dead_p (2, operands[0])"
   1324   1.1.1.2    mrg   [(parallel [(set (match_dup 3)
   1325   1.1.1.2    mrg                    (plus:ALL2 (match_dup 3)
   1326   1.1.1.2    mrg                               (match_dup 1)))
   1327   1.1.1.2    mrg               (clobber (match_dup 2))])])
   1328   1.1.1.2    mrg 
   1329   1.1.1.2    mrg ;; "addhi3_clobber"
   1330   1.1.1.2    mrg ;; "addhq3_clobber" "adduhq3_clobber"
   1331   1.1.1.2    mrg ;; "addha3_clobber" "adduha3_clobber"
   1332   1.1.1.2    mrg (define_insn "add<mode>3_clobber"
   1333   1.1.1.2    mrg   [(set (match_operand:ALL2 0 "register_operand"            "=!w    ,d    ,r")
   1334   1.1.1.2    mrg         (plus:ALL2 (match_operand:ALL2 1 "register_operand"  "%0    ,0    ,0")
   1335   1.1.1.2    mrg                    (match_operand:ALL2 2 "const_operand"     "IJ YIJ,n Ynn,n Ynn")))
   1336   1.1.1.2    mrg    (clobber (match_scratch:QI 3                             "=X     ,X    ,&d"))]
   1337   1.1.1.2    mrg   ""
   1338   1.1.1.2    mrg   {
   1339   1.1.1.2    mrg     return avr_out_plus (insn, operands);
   1340   1.1.1.2    mrg   }
   1341       1.1    mrg   [(set_attr "length" "4")
   1342   1.1.1.2    mrg    (set_attr "adjust_len" "plus")
   1343   1.1.1.2    mrg    (set_attr "cc" "plus")])
   1344       1.1    mrg 
   1345   1.1.1.2    mrg 
   1346   1.1.1.2    mrg ;; "addsi3"
   1347   1.1.1.2    mrg ;; "addsq3" "addusq3"
   1348   1.1.1.2    mrg ;; "addsa3" "addusa3"
   1349   1.1.1.2    mrg (define_insn "add<mode>3"
   1350   1.1.1.2    mrg   [(set (match_operand:ALL4 0 "register_operand"          "=??r,d ,r")
   1351   1.1.1.2    mrg         (plus:ALL4 (match_operand:ALL4 1 "register_operand" "%0,0 ,0")
   1352   1.1.1.2    mrg                    (match_operand:ALL4 2 "nonmemory_operand" "r,i ,n Ynn")))
   1353   1.1.1.2    mrg    (clobber (match_scratch:QI 3                             "=X,X ,&d"))]
   1354       1.1    mrg   ""
   1355   1.1.1.2    mrg   {
   1356   1.1.1.2    mrg     return avr_out_plus (insn, operands);
   1357   1.1.1.2    mrg   }
   1358   1.1.1.2    mrg   [(set_attr "length" "4")
   1359   1.1.1.2    mrg    (set_attr "adjust_len" "plus")
   1360   1.1.1.2    mrg    (set_attr "cc" "plus")])
   1361       1.1    mrg 
   1362   1.1.1.2    mrg (define_insn "*addpsi3_zero_extend.qi"
   1363   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"                          "=r")
   1364   1.1.1.2    mrg         (plus:PSI (zero_extend:PSI (match_operand:QI 1 "register_operand" "r"))
   1365   1.1.1.2    mrg                   (match_operand:PSI 2 "register_operand"                 "0")))]
   1366       1.1    mrg   ""
   1367   1.1.1.2    mrg   "add %A0,%A1\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__"
   1368   1.1.1.2    mrg   [(set_attr "length" "3")
   1369   1.1.1.2    mrg    (set_attr "cc" "set_n")])
   1370       1.1    mrg 
   1371   1.1.1.2    mrg (define_insn "*addpsi3_zero_extend.hi"
   1372   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"                          "=r")
   1373   1.1.1.2    mrg         (plus:PSI (zero_extend:PSI (match_operand:HI 1 "register_operand" "r"))
   1374   1.1.1.2    mrg                   (match_operand:PSI 2 "register_operand"                 "0")))]
   1375       1.1    mrg   ""
   1376   1.1.1.2    mrg   "add %A0,%A1\;adc %B0,%B1\;adc %C0,__zero_reg__"
   1377   1.1.1.2    mrg   [(set_attr "length" "3")
   1378       1.1    mrg    (set_attr "cc" "set_n")])
   1379       1.1    mrg 
   1380   1.1.1.2    mrg (define_insn "*addpsi3_sign_extend.hi"
   1381   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"                          "=r")
   1382   1.1.1.2    mrg         (plus:PSI (sign_extend:PSI (match_operand:HI 1 "register_operand" "r"))
   1383   1.1.1.2    mrg                   (match_operand:PSI 2 "register_operand"                 "0")))]
   1384       1.1    mrg   ""
   1385   1.1.1.2    mrg   "add %A0,%1\;adc %B0,%B1\;adc %C0,__zero_reg__\;sbrc %B1,7\;dec %C0"
   1386   1.1.1.2    mrg   [(set_attr "length" "5")
   1387   1.1.1.2    mrg    (set_attr "cc" "set_n")])
   1388       1.1    mrg 
   1389   1.1.1.2    mrg (define_insn "*addsi3_zero_extend"
   1390   1.1.1.2    mrg   [(set (match_operand:SI 0 "register_operand"                         "=r")
   1391   1.1.1.2    mrg         (plus:SI (zero_extend:SI (match_operand:QI 1 "register_operand" "r"))
   1392   1.1.1.2    mrg                  (match_operand:SI 2 "register_operand"                 "0")))]
   1393   1.1.1.2    mrg   ""
   1394   1.1.1.2    mrg   "add %A0,%1\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__\;adc %D0,__zero_reg__"
   1395       1.1    mrg   [(set_attr "length" "4")
   1396       1.1    mrg    (set_attr "cc" "set_n")])
   1397       1.1    mrg 
   1398   1.1.1.2    mrg (define_insn "*addsi3_zero_extend.hi"
   1399   1.1.1.2    mrg   [(set (match_operand:SI 0 "register_operand"                         "=r")
   1400   1.1.1.2    mrg         (plus:SI (zero_extend:SI (match_operand:HI 1 "register_operand" "r"))
   1401   1.1.1.2    mrg                  (match_operand:SI 2 "register_operand"                 "0")))]
   1402       1.1    mrg   ""
   1403   1.1.1.2    mrg   "add %A0,%1\;adc %B0,%B1\;adc %C0,__zero_reg__\;adc %D0,__zero_reg__"
   1404   1.1.1.2    mrg   [(set_attr "length" "4")
   1405   1.1.1.2    mrg    (set_attr "cc" "set_n")])
   1406       1.1    mrg 
   1407   1.1.1.2    mrg (define_insn "addpsi3"
   1408   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"         "=??r,d ,d,r")
   1409   1.1.1.2    mrg         (plus:PSI (match_operand:PSI 1 "register_operand" "%0,0 ,0,0")
   1410   1.1.1.2    mrg                   (match_operand:PSI 2 "nonmemory_operand" "r,s ,n,n")))
   1411   1.1.1.2    mrg    (clobber (match_scratch:QI 3                           "=X,X ,X,&d"))]
   1412   1.1.1.2    mrg   ""
   1413   1.1.1.2    mrg   {
   1414   1.1.1.2    mrg     return avr_out_plus (insn, operands);
   1415   1.1.1.2    mrg   }
   1416       1.1    mrg   [(set_attr "length" "3")
   1417   1.1.1.2    mrg    (set_attr "adjust_len" "plus")
   1418   1.1.1.2    mrg    (set_attr "cc" "plus")])
   1419       1.1    mrg 
   1420   1.1.1.2    mrg (define_insn "subpsi3"
   1421   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"           "=r")
   1422   1.1.1.2    mrg         (minus:PSI (match_operand:PSI 1 "register_operand" "0")
   1423   1.1.1.2    mrg                    (match_operand:PSI 2 "register_operand" "r")))]
   1424       1.1    mrg   ""
   1425   1.1.1.2    mrg   "sub %0,%2\;sbc %B0,%B2\;sbc %C0,%C2"
   1426   1.1.1.2    mrg   [(set_attr "length" "3")
   1427   1.1.1.2    mrg    (set_attr "cc" "set_czn")])
   1428       1.1    mrg 
   1429   1.1.1.2    mrg (define_insn "*subpsi3_zero_extend.qi"
   1430   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"                           "=r")
   1431   1.1.1.2    mrg         (minus:PSI (match_operand:SI 1 "register_operand"                  "0")
   1432   1.1.1.2    mrg                    (zero_extend:PSI (match_operand:QI 2 "register_operand" "r"))))]
   1433   1.1.1.2    mrg   ""
   1434   1.1.1.2    mrg   "sub %A0,%2\;sbc %B0,__zero_reg__\;sbc %C0,__zero_reg__"
   1435       1.1    mrg   [(set_attr "length" "3")
   1436   1.1.1.2    mrg    (set_attr "cc" "set_czn")])
   1437       1.1    mrg 
   1438   1.1.1.2    mrg (define_insn "*subpsi3_zero_extend.hi"
   1439   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"                           "=r")
   1440   1.1.1.2    mrg         (minus:PSI (match_operand:PSI 1 "register_operand"                 "0")
   1441   1.1.1.2    mrg                    (zero_extend:PSI (match_operand:HI 2 "register_operand" "r"))))]
   1442   1.1.1.2    mrg   ""
   1443   1.1.1.2    mrg   "sub %A0,%2\;sbc %B0,%B2\;sbc %C0,__zero_reg__"
   1444       1.1    mrg   [(set_attr "length" "3")
   1445   1.1.1.2    mrg    (set_attr "cc" "set_czn")])
   1446   1.1.1.2    mrg 
   1447   1.1.1.2    mrg (define_insn "*subpsi3_sign_extend.hi"
   1448   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"                           "=r")
   1449   1.1.1.2    mrg         (minus:PSI (match_operand:PSI 1 "register_operand"                 "0")
   1450   1.1.1.2    mrg                    (sign_extend:PSI (match_operand:HI 2 "register_operand" "r"))))]
   1451   1.1.1.2    mrg   ""
   1452   1.1.1.2    mrg   "sub %A0,%A2\;sbc %B0,%B2\;sbc %C0,__zero_reg__\;sbrc %B2,7\;inc %C0"
   1453   1.1.1.2    mrg   [(set_attr "length" "5")
   1454   1.1.1.2    mrg    (set_attr "cc" "set_czn")])
   1455   1.1.1.2    mrg 
   1456   1.1.1.2    mrg ;-----------------------------------------------------------------------------
   1457   1.1.1.2    mrg ; sub bytes
   1458   1.1.1.2    mrg 
   1459   1.1.1.2    mrg ;; "subqi3"
   1460   1.1.1.2    mrg ;; "subqq3" "subuqq3"
   1461   1.1.1.2    mrg (define_insn "sub<mode>3"
   1462   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "register_operand"                    "=??r,d    ,r  ,r  ,r  ,r")
   1463   1.1.1.2    mrg         (minus:ALL1 (match_operand:ALL1 1 "register_operand"           "0,0    ,0  ,0  ,0  ,0")
   1464   1.1.1.2    mrg                     (match_operand:ALL1 2 "nonmemory_or_const_operand" "r,n Ynn,Y01,Ym1,Y02,Ym2")))]
   1465   1.1.1.2    mrg   ""
   1466   1.1.1.2    mrg   "@
   1467   1.1.1.2    mrg 	sub %0,%2
   1468   1.1.1.2    mrg 	subi %0,lo8(%2)
   1469   1.1.1.2    mrg 	dec %0
   1470   1.1.1.2    mrg 	inc %0
   1471   1.1.1.2    mrg 	dec %0\;dec %0
   1472   1.1.1.2    mrg 	inc %0\;inc %0"
   1473   1.1.1.2    mrg   [(set_attr "length" "1,1,1,1,2,2")
   1474   1.1.1.3  skrll    (set_attr "cc" "set_czn,set_czn,set_vzn,set_vzn,set_vzn,set_vzn")])
   1475   1.1.1.2    mrg 
   1476   1.1.1.2    mrg ;; "subhi3"
   1477   1.1.1.2    mrg ;; "subhq3" "subuhq3"
   1478   1.1.1.2    mrg ;; "subha3" "subuha3"
   1479   1.1.1.2    mrg (define_insn "sub<mode>3"
   1480   1.1.1.2    mrg   [(set (match_operand:ALL2 0 "register_operand"                    "=??r,d    ,*r")
   1481   1.1.1.2    mrg         (minus:ALL2 (match_operand:ALL2 1 "register_operand"           "0,0    ,0")
   1482   1.1.1.2    mrg                     (match_operand:ALL2 2 "nonmemory_or_const_operand" "r,i Ynn,Ynn")))
   1483   1.1.1.2    mrg    (clobber (match_scratch:QI 3                                       "=X,X    ,&d"))]
   1484   1.1.1.2    mrg   ""
   1485   1.1.1.2    mrg   {
   1486   1.1.1.2    mrg     return avr_out_plus (insn, operands);
   1487   1.1.1.2    mrg   }
   1488   1.1.1.2    mrg   [(set_attr "adjust_len" "plus")
   1489   1.1.1.2    mrg    (set_attr "cc" "plus")])
   1490   1.1.1.2    mrg 
   1491   1.1.1.2    mrg (define_insn "*subhi3_zero_extend1"
   1492   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                          "=r")
   1493   1.1.1.2    mrg         (minus:HI (match_operand:HI 1 "register_operand"                 "0")
   1494   1.1.1.2    mrg                   (zero_extend:HI (match_operand:QI 2 "register_operand" "r"))))]
   1495   1.1.1.2    mrg   ""
   1496   1.1.1.2    mrg   "sub %A0,%2\;sbc %B0,__zero_reg__"
   1497   1.1.1.2    mrg   [(set_attr "length" "2")
   1498   1.1.1.2    mrg    (set_attr "cc" "set_czn")])
   1499   1.1.1.2    mrg 
   1500   1.1.1.2    mrg (define_insn "*subhi3.sign_extend2"
   1501   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                          "=r")
   1502   1.1.1.2    mrg         (minus:HI (match_operand:HI 1 "register_operand"                 "0")
   1503   1.1.1.2    mrg                   (sign_extend:HI (match_operand:QI 2 "register_operand" "r"))))]
   1504   1.1.1.2    mrg   ""
   1505   1.1.1.2    mrg   {
   1506   1.1.1.2    mrg     return reg_overlap_mentioned_p (operands[0], operands[2])
   1507   1.1.1.2    mrg       ? "mov __tmp_reg__,%2\;sub %A0,%2\;sbc %B0,__zero_reg__\;sbrc __tmp_reg__,7\;inc %B0"
   1508   1.1.1.2    mrg       : "sub %A0,%2\;sbc %B0,__zero_reg__\;sbrc %2,7\;inc %B0";
   1509   1.1.1.2    mrg   }
   1510   1.1.1.2    mrg   [(set_attr "length" "5")
   1511       1.1    mrg    (set_attr "cc" "clobber")])
   1512       1.1    mrg 
   1513   1.1.1.2    mrg ;; "subsi3"
   1514   1.1.1.2    mrg ;; "subsq3" "subusq3"
   1515   1.1.1.2    mrg ;; "subsa3" "subusa3"
   1516   1.1.1.2    mrg (define_insn "sub<mode>3"
   1517   1.1.1.2    mrg   [(set (match_operand:ALL4 0 "register_operand"                    "=??r,d    ,r")
   1518   1.1.1.2    mrg         (minus:ALL4 (match_operand:ALL4 1 "register_operand"           "0,0    ,0")
   1519   1.1.1.2    mrg                     (match_operand:ALL4 2 "nonmemory_or_const_operand" "r,n Ynn,Ynn")))
   1520   1.1.1.2    mrg    (clobber (match_scratch:QI 3                                       "=X,X    ,&d"))]
   1521       1.1    mrg   ""
   1522   1.1.1.2    mrg   {
   1523   1.1.1.2    mrg     return avr_out_plus (insn, operands);
   1524   1.1.1.2    mrg   }
   1525   1.1.1.2    mrg   [(set_attr "adjust_len" "plus")
   1526   1.1.1.2    mrg    (set_attr "cc" "plus")])
   1527       1.1    mrg 
   1528   1.1.1.2    mrg (define_insn "*subsi3_zero_extend"
   1529   1.1.1.2    mrg   [(set (match_operand:SI 0 "register_operand"                          "=r")
   1530   1.1.1.2    mrg         (minus:SI (match_operand:SI 1 "register_operand"                 "0")
   1531   1.1.1.2    mrg                   (zero_extend:SI (match_operand:QI 2 "register_operand" "r"))))]
   1532   1.1.1.2    mrg   ""
   1533   1.1.1.2    mrg   "sub %A0,%2\;sbc %B0,__zero_reg__\;sbc %C0,__zero_reg__\;sbc %D0,__zero_reg__"
   1534   1.1.1.2    mrg   [(set_attr "length" "4")
   1535   1.1.1.2    mrg    (set_attr "cc" "set_czn")])
   1536   1.1.1.2    mrg 
   1537   1.1.1.2    mrg (define_insn "*subsi3_zero_extend.hi"
   1538   1.1.1.2    mrg   [(set (match_operand:SI 0 "register_operand"                          "=r")
   1539   1.1.1.2    mrg         (minus:SI (match_operand:SI 1 "register_operand"                 "0")
   1540   1.1.1.2    mrg                   (zero_extend:SI (match_operand:HI 2 "register_operand" "r"))))]
   1541   1.1.1.2    mrg   ""
   1542   1.1.1.2    mrg   "sub %A0,%2\;sbc %B0,%B2\;sbc %C0,__zero_reg__\;sbc %D0,__zero_reg__"
   1543   1.1.1.2    mrg   [(set_attr "length" "4")
   1544   1.1.1.2    mrg    (set_attr "cc" "set_czn")])
   1545   1.1.1.2    mrg 
   1546   1.1.1.2    mrg ;******************************************************************************
   1547   1.1.1.2    mrg ; mul
   1548   1.1.1.2    mrg 
   1549   1.1.1.2    mrg (define_expand "mulqi3"
   1550   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand" "")
   1551   1.1.1.2    mrg         (mult:QI (match_operand:QI 1 "register_operand" "")
   1552   1.1.1.2    mrg                  (match_operand:QI 2 "register_operand" "")))]
   1553   1.1.1.2    mrg   ""
   1554   1.1.1.2    mrg   {
   1555   1.1.1.2    mrg     if (!AVR_HAVE_MUL)
   1556   1.1.1.2    mrg       {
   1557   1.1.1.2    mrg         emit_insn (gen_mulqi3_call (operands[0], operands[1], operands[2]));
   1558   1.1.1.2    mrg         DONE;
   1559   1.1.1.2    mrg       }
   1560   1.1.1.2    mrg   })
   1561   1.1.1.2    mrg 
   1562   1.1.1.2    mrg (define_insn "*mulqi3_enh"
   1563   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand" "=r")
   1564   1.1.1.2    mrg         (mult:QI (match_operand:QI 1 "register_operand" "r")
   1565   1.1.1.2    mrg                  (match_operand:QI 2 "register_operand" "r")))]
   1566       1.1    mrg   "AVR_HAVE_MUL"
   1567   1.1.1.2    mrg   "mul %1,%2
   1568   1.1.1.2    mrg 	mov %0,r0
   1569       1.1    mrg 	clr r1"
   1570   1.1.1.2    mrg   [(set_attr "length" "3")
   1571       1.1    mrg    (set_attr "cc" "clobber")])
   1572       1.1    mrg 
   1573   1.1.1.2    mrg (define_expand "mulqi3_call"
   1574   1.1.1.2    mrg   [(set (reg:QI 24) (match_operand:QI 1 "register_operand" ""))
   1575   1.1.1.2    mrg    (set (reg:QI 22) (match_operand:QI 2 "register_operand" ""))
   1576   1.1.1.2    mrg    (parallel [(set (reg:QI 24) (mult:QI (reg:QI 24) (reg:QI 22)))
   1577   1.1.1.2    mrg               (clobber (reg:QI 22))])
   1578   1.1.1.6    mrg    (set (match_operand:QI 0 "register_operand" "") (reg:QI 24))]
   1579   1.1.1.6    mrg   ""
   1580   1.1.1.6    mrg   {
   1581   1.1.1.6    mrg     avr_fix_inputs (operands, 1 << 2, regmask (QImode, 24));
   1582   1.1.1.6    mrg   })
   1583       1.1    mrg 
   1584   1.1.1.2    mrg (define_insn "*mulqi3_call"
   1585   1.1.1.2    mrg   [(set (reg:QI 24) (mult:QI (reg:QI 24) (reg:QI 22)))
   1586   1.1.1.2    mrg    (clobber (reg:QI 22))]
   1587       1.1    mrg   "!AVR_HAVE_MUL"
   1588   1.1.1.2    mrg   "%~call __mulqi3"
   1589       1.1    mrg   [(set_attr "type" "xcall")
   1590       1.1    mrg    (set_attr "cc" "clobber")])
   1591       1.1    mrg 
   1592   1.1.1.2    mrg ;; "umulqi3_highpart"
   1593   1.1.1.2    mrg ;; "smulqi3_highpart"
   1594   1.1.1.2    mrg (define_insn "<extend_su>mulqi3_highpart"
   1595   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand"                                       "=r")
   1596   1.1.1.2    mrg         (truncate:QI
   1597   1.1.1.2    mrg          (lshiftrt:HI (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "<mul_r_d>"))
   1598   1.1.1.2    mrg                                (any_extend:HI (match_operand:QI 2 "register_operand" "<mul_r_d>")))
   1599   1.1.1.2    mrg                       (const_int 8))))]
   1600       1.1    mrg   "AVR_HAVE_MUL"
   1601   1.1.1.2    mrg   "mul<extend_s> %1,%2
   1602   1.1.1.2    mrg 	mov %0,r1
   1603   1.1.1.2    mrg 	clr __zero_reg__"
   1604   1.1.1.2    mrg   [(set_attr "length" "3")
   1605       1.1    mrg    (set_attr "cc" "clobber")])
   1606       1.1    mrg 
   1607       1.1    mrg 
   1608   1.1.1.2    mrg ;; Used when expanding div or mod inline for some special values
   1609   1.1.1.2    mrg (define_insn "*subqi3.ashiftrt7"
   1610   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand"                       "=r")
   1611   1.1.1.2    mrg         (minus:QI (match_operand:QI 1 "register_operand"              "0")
   1612   1.1.1.2    mrg                   (ashiftrt:QI (match_operand:QI 2 "register_operand" "r")
   1613   1.1.1.2    mrg                                (const_int 7))))]
   1614       1.1    mrg   ""
   1615   1.1.1.2    mrg   "sbrc %2,7\;inc %0"
   1616   1.1.1.2    mrg   [(set_attr "length" "2")
   1617   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   1618       1.1    mrg 
   1619   1.1.1.2    mrg (define_insn "*addqi3.lt0"
   1620   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand"                 "=r")
   1621   1.1.1.2    mrg         (plus:QI (lt:QI (match_operand:QI 1 "register_operand"  "r")
   1622   1.1.1.2    mrg                         (const_int 0))
   1623   1.1.1.2    mrg                  (match_operand:QI 2 "register_operand"         "0")))]
   1624       1.1    mrg   ""
   1625   1.1.1.2    mrg   "sbrc %1,7\;inc %0"
   1626   1.1.1.2    mrg   [(set_attr "length" "2")
   1627       1.1    mrg    (set_attr "cc" "clobber")])
   1628       1.1    mrg 
   1629   1.1.1.2    mrg (define_insn "*addhi3.lt0"
   1630   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                   "=w,r")
   1631   1.1.1.2    mrg         (plus:HI (lt:HI (match_operand:QI 1 "register_operand"    "r,r")
   1632   1.1.1.2    mrg                         (const_int 0))
   1633   1.1.1.2    mrg                  (match_operand:HI 2 "register_operand"           "0,0")))
   1634   1.1.1.2    mrg    (clobber (match_scratch:QI 3                                  "=X,&1"))]
   1635       1.1    mrg   ""
   1636   1.1.1.2    mrg   "@
   1637   1.1.1.2    mrg 	sbrc %1,7\;adiw %0,1
   1638   1.1.1.2    mrg 	lsl %1\;adc %A0,__zero_reg__\;adc %B0,__zero_reg__"
   1639   1.1.1.2    mrg   [(set_attr "length" "2,3")
   1640   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   1641       1.1    mrg 
   1642   1.1.1.2    mrg (define_insn "*addpsi3.lt0"
   1643   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"                         "=r")
   1644   1.1.1.2    mrg         (plus:PSI (lshiftrt:PSI (match_operand:PSI 1 "register_operand"  "r")
   1645   1.1.1.2    mrg                                 (const_int 23))
   1646   1.1.1.2    mrg                  (match_operand:PSI 2 "register_operand"                 "0")))]
   1647   1.1.1.2    mrg   ""
   1648   1.1.1.2    mrg   "mov __tmp_reg__,%C1\;lsl __tmp_reg__
   1649   1.1.1.2    mrg 	adc %A0,__zero_reg__\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__"
   1650   1.1.1.2    mrg   [(set_attr "length" "5")
   1651       1.1    mrg    (set_attr "cc" "clobber")])
   1652       1.1    mrg 
   1653   1.1.1.2    mrg (define_insn "*addsi3.lt0"
   1654   1.1.1.2    mrg   [(set (match_operand:SI 0 "register_operand"                       "=r")
   1655   1.1.1.2    mrg         (plus:SI (lshiftrt:SI (match_operand:SI 1 "register_operand"  "r")
   1656   1.1.1.2    mrg                               (const_int 31))
   1657   1.1.1.2    mrg                  (match_operand:SI 2 "register_operand"               "0")))]
   1658       1.1    mrg   ""
   1659   1.1.1.2    mrg   "mov __tmp_reg__,%D1\;lsl __tmp_reg__
   1660   1.1.1.2    mrg 	adc %A0,__zero_reg__\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__\;adc %D0,__zero_reg__"
   1661   1.1.1.2    mrg   [(set_attr "length" "6")
   1662   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   1663       1.1    mrg 
   1664   1.1.1.2    mrg (define_insn "*umulqihi3.call"
   1665   1.1.1.2    mrg   [(set (reg:HI 24)
   1666   1.1.1.2    mrg         (mult:HI (zero_extend:HI (reg:QI 22))
   1667   1.1.1.2    mrg                  (zero_extend:HI (reg:QI 24))))
   1668   1.1.1.2    mrg    (clobber (reg:QI 21))
   1669   1.1.1.2    mrg    (clobber (reg:HI 22))]
   1670   1.1.1.2    mrg   "!AVR_HAVE_MUL"
   1671   1.1.1.2    mrg   "%~call __umulqihi3"
   1672       1.1    mrg   [(set_attr "type" "xcall")
   1673       1.1    mrg    (set_attr "cc" "clobber")])
   1674       1.1    mrg 
   1675   1.1.1.2    mrg ;; "umulqihi3"
   1676   1.1.1.2    mrg ;; "mulqihi3"
   1677   1.1.1.2    mrg (define_insn "<extend_u>mulqihi3"
   1678   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                         "=r")
   1679   1.1.1.2    mrg         (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "<mul_r_d>"))
   1680   1.1.1.2    mrg                  (any_extend:HI (match_operand:QI 2 "register_operand" "<mul_r_d>"))))]
   1681   1.1.1.2    mrg   "AVR_HAVE_MUL"
   1682   1.1.1.2    mrg   "mul<extend_s> %1,%2
   1683   1.1.1.2    mrg 	movw %0,r0
   1684   1.1.1.2    mrg 	clr __zero_reg__"
   1685   1.1.1.2    mrg   [(set_attr "length" "3")
   1686   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   1687       1.1    mrg 
   1688   1.1.1.2    mrg (define_insn "usmulqihi3"
   1689   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                         "=r")
   1690   1.1.1.2    mrg         (mult:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "a"))
   1691   1.1.1.2    mrg                  (sign_extend:HI (match_operand:QI 2 "register_operand" "a"))))]
   1692   1.1.1.2    mrg   "AVR_HAVE_MUL"
   1693   1.1.1.2    mrg   "mulsu %2,%1
   1694   1.1.1.2    mrg 	movw %0,r0
   1695   1.1.1.2    mrg 	clr __zero_reg__"
   1696   1.1.1.2    mrg   [(set_attr "length" "3")
   1697       1.1    mrg    (set_attr "cc" "clobber")])
   1698       1.1    mrg 
   1699   1.1.1.2    mrg ;; Above insn is not canonicalized by insn combine, so here is a version with
   1700   1.1.1.2    mrg ;; operands swapped.
   1701       1.1    mrg 
   1702   1.1.1.2    mrg (define_insn "*sumulqihi3"
   1703   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                         "=r")
   1704   1.1.1.2    mrg         (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a"))
   1705   1.1.1.2    mrg                  (zero_extend:HI (match_operand:QI 2 "register_operand" "a"))))]
   1706   1.1.1.2    mrg   "AVR_HAVE_MUL"
   1707   1.1.1.2    mrg   "mulsu %1,%2
   1708   1.1.1.2    mrg 	movw %0,r0
   1709   1.1.1.2    mrg 	clr __zero_reg__"
   1710   1.1.1.2    mrg   [(set_attr "length" "3")
   1711       1.1    mrg    (set_attr "cc" "clobber")])
   1712       1.1    mrg 
   1713   1.1.1.2    mrg ;; One-extend operand 1
   1714       1.1    mrg 
   1715   1.1.1.2    mrg (define_insn "*osmulqihi3"
   1716   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                                        "=&r")
   1717   1.1.1.2    mrg         (mult:HI (not:HI (zero_extend:HI (not:QI (match_operand:QI 1 "register_operand" "a"))))
   1718   1.1.1.2    mrg                  (sign_extend:HI (match_operand:QI 2 "register_operand"                 "a"))))]
   1719   1.1.1.2    mrg   "AVR_HAVE_MUL"
   1720   1.1.1.2    mrg   "mulsu %2,%1
   1721   1.1.1.2    mrg 	movw %0,r0
   1722   1.1.1.2    mrg 	sub %B0,%2
   1723   1.1.1.2    mrg 	clr __zero_reg__"
   1724   1.1.1.2    mrg   [(set_attr "length" "4")
   1725       1.1    mrg    (set_attr "cc" "clobber")])
   1726       1.1    mrg 
   1727   1.1.1.2    mrg (define_insn "*oumulqihi3"
   1728   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                                        "=&r")
   1729   1.1.1.2    mrg         (mult:HI (not:HI (zero_extend:HI (not:QI (match_operand:QI 1 "register_operand" "r"))))
   1730   1.1.1.2    mrg                  (zero_extend:HI (match_operand:QI 2 "register_operand"                 "r"))))]
   1731   1.1.1.2    mrg   "AVR_HAVE_MUL"
   1732   1.1.1.2    mrg   "mul %2,%1
   1733   1.1.1.2    mrg 	movw %0,r0
   1734   1.1.1.2    mrg 	sub %B0,%2
   1735   1.1.1.2    mrg 	clr __zero_reg__"
   1736   1.1.1.2    mrg   [(set_attr "length" "4")
   1737   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   1738       1.1    mrg 
   1739   1.1.1.2    mrg ;******************************************************************************
   1740   1.1.1.2    mrg ; multiply-add/sub QI: $0 = $3 +/- $1*$2
   1741   1.1.1.2    mrg ;******************************************************************************
   1742       1.1    mrg 
   1743   1.1.1.2    mrg (define_insn "*maddqi4"
   1744   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand"                  "=r")
   1745   1.1.1.2    mrg         (plus:QI (mult:QI (match_operand:QI 1 "register_operand" "r")
   1746   1.1.1.2    mrg                           (match_operand:QI 2 "register_operand" "r"))
   1747   1.1.1.2    mrg                  (match_operand:QI 3 "register_operand"          "0")))]
   1748       1.1    mrg 
   1749   1.1.1.2    mrg   "AVR_HAVE_MUL"
   1750   1.1.1.2    mrg   "mul %1,%2
   1751   1.1.1.2    mrg 	add %A0,r0
   1752   1.1.1.2    mrg 	clr __zero_reg__"
   1753   1.1.1.2    mrg   [(set_attr "length" "4")
   1754   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   1755       1.1    mrg 
   1756   1.1.1.2    mrg (define_insn "*msubqi4"
   1757   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand"                   "=r")
   1758   1.1.1.2    mrg         (minus:QI (match_operand:QI 3 "register_operand"          "0")
   1759   1.1.1.2    mrg                   (mult:QI (match_operand:QI 1 "register_operand" "r")
   1760   1.1.1.2    mrg                            (match_operand:QI 2 "register_operand" "r"))))]
   1761   1.1.1.2    mrg   "AVR_HAVE_MUL"
   1762   1.1.1.2    mrg   "mul %1,%2
   1763   1.1.1.2    mrg 	sub %A0,r0
   1764   1.1.1.2    mrg 	clr __zero_reg__"
   1765   1.1.1.2    mrg   [(set_attr "length" "4")
   1766   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   1767   1.1.1.2    mrg 
   1768   1.1.1.2    mrg (define_insn_and_split "*maddqi4.const"
   1769   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand"                   "=r")
   1770   1.1.1.2    mrg         (plus:QI (mult:QI (match_operand:QI 1 "register_operand"  "r")
   1771   1.1.1.2    mrg                           (match_operand:QI 2 "const_int_operand" "n"))
   1772   1.1.1.2    mrg                  (match_operand:QI 3 "register_operand"           "0")))
   1773   1.1.1.2    mrg    (clobber (match_scratch:QI 4                                 "=&d"))]
   1774   1.1.1.2    mrg   "AVR_HAVE_MUL"
   1775   1.1.1.2    mrg   "#"
   1776   1.1.1.2    mrg   "&& reload_completed"
   1777   1.1.1.2    mrg   [(set (match_dup 4)
   1778   1.1.1.2    mrg         (match_dup 2))
   1779   1.1.1.2    mrg    ; *maddqi4
   1780       1.1    mrg    (set (match_dup 0)
   1781   1.1.1.2    mrg         (plus:QI (mult:QI (match_dup 1)
   1782   1.1.1.2    mrg                           (match_dup 4))
   1783   1.1.1.2    mrg                  (match_dup 3)))])
   1784   1.1.1.2    mrg 
   1785   1.1.1.2    mrg (define_insn_and_split "*msubqi4.const"
   1786   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand"                    "=r")
   1787   1.1.1.2    mrg         (minus:QI (match_operand:QI 3 "register_operand"           "0")
   1788   1.1.1.2    mrg                   (mult:QI (match_operand:QI 1 "register_operand"  "r")
   1789   1.1.1.2    mrg                            (match_operand:QI 2 "const_int_operand" "n"))))
   1790   1.1.1.2    mrg    (clobber (match_scratch:QI 4                                  "=&d"))]
   1791   1.1.1.2    mrg   "AVR_HAVE_MUL"
   1792   1.1.1.2    mrg   "#"
   1793   1.1.1.2    mrg   "&& reload_completed"
   1794   1.1.1.2    mrg   [(set (match_dup 4)
   1795   1.1.1.2    mrg         (match_dup 2))
   1796   1.1.1.2    mrg    ; *msubqi4
   1797   1.1.1.2    mrg    (set (match_dup 0)
   1798   1.1.1.2    mrg         (minus:QI (match_dup 3)
   1799   1.1.1.2    mrg                   (mult:QI (match_dup 1)
   1800   1.1.1.2    mrg                            (match_dup 4))))])
   1801       1.1    mrg 
   1802       1.1    mrg 
   1803   1.1.1.2    mrg ;******************************************************************************
   1804   1.1.1.2    mrg ; multiply-add/sub HI: $0 = $3 +/- $1*$2  with 8-bit values $1, $2
   1805   1.1.1.2    mrg ;******************************************************************************
   1806       1.1    mrg 
   1807   1.1.1.2    mrg ;; We don't use standard insns/expanders as they lead to cumbersome code for,
   1808   1.1.1.2    mrg ;; e.g,
   1809   1.1.1.2    mrg ;;
   1810   1.1.1.2    mrg ;;     int foo (unsigned char z)
   1811   1.1.1.2    mrg ;;     {
   1812   1.1.1.2    mrg ;;       extern int aInt[];
   1813   1.1.1.2    mrg ;;       return aInt[3*z+2];
   1814   1.1.1.2    mrg ;;     }
   1815   1.1.1.2    mrg ;;
   1816   1.1.1.2    mrg ;; because the constant +4 then is added explicitely instead of consuming it
   1817   1.1.1.2    mrg ;; with the aInt symbol.  Therefore, we rely on insn combine which takes costs
   1818   1.1.1.2    mrg ;; into account more accurately and doesn't do burte-force multiply-add/sub.
   1819   1.1.1.2    mrg ;; The implementational effort is the same so we are fine with that approach.
   1820       1.1    mrg 
   1821       1.1    mrg 
   1822   1.1.1.2    mrg ;; "*maddqihi4"
   1823   1.1.1.2    mrg ;; "*umaddqihi4"
   1824   1.1.1.2    mrg (define_insn "*<extend_u>maddqihi4"
   1825   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                                  "=r")
   1826   1.1.1.2    mrg         (plus:HI (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "<mul_r_d>"))
   1827   1.1.1.2    mrg                           (any_extend:HI (match_operand:QI 2 "register_operand" "<mul_r_d>")))
   1828   1.1.1.2    mrg                  (match_operand:HI 3 "register_operand"                         "0")))]
   1829       1.1    mrg 
   1830   1.1.1.2    mrg   "AVR_HAVE_MUL"
   1831   1.1.1.2    mrg   "mul<extend_s> %1,%2
   1832   1.1.1.2    mrg 	add %A0,r0
   1833   1.1.1.2    mrg 	adc %B0,r1
   1834   1.1.1.2    mrg 	clr __zero_reg__"
   1835   1.1.1.2    mrg   [(set_attr "length" "4")
   1836   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   1837       1.1    mrg 
   1838   1.1.1.2    mrg ;; "*msubqihi4"
   1839   1.1.1.2    mrg ;; "*umsubqihi4"
   1840   1.1.1.2    mrg (define_insn "*<extend_u>msubqihi4"
   1841   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                                  "=r")
   1842   1.1.1.2    mrg         (minus:HI (match_operand:HI 3 "register_operand"                         "0")
   1843   1.1.1.2    mrg                   (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "<mul_r_d>"))
   1844   1.1.1.2    mrg                            (any_extend:HI (match_operand:QI 2 "register_operand" "<mul_r_d>")))))]
   1845   1.1.1.2    mrg   "AVR_HAVE_MUL"
   1846   1.1.1.2    mrg   "mul<extend_s> %1,%2
   1847   1.1.1.2    mrg 	sub %A0,r0
   1848   1.1.1.2    mrg 	sbc %B0,r1
   1849   1.1.1.2    mrg 	clr __zero_reg__"
   1850   1.1.1.2    mrg   [(set_attr "length" "4")
   1851   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   1852       1.1    mrg 
   1853   1.1.1.2    mrg ;; "*usmaddqihi4"
   1854   1.1.1.2    mrg ;; "*sumaddqihi4"
   1855   1.1.1.2    mrg (define_insn "*<any_extend:extend_su><any_extend2:extend_su>msubqihi4"
   1856   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                                  "=r")
   1857   1.1.1.2    mrg         (plus:HI (mult:HI (any_extend:HI  (match_operand:QI 1 "register_operand" "a"))
   1858   1.1.1.2    mrg                           (any_extend2:HI (match_operand:QI 2 "register_operand" "a")))
   1859   1.1.1.2    mrg                  (match_operand:HI 3 "register_operand"                          "0")))]
   1860   1.1.1.2    mrg   "AVR_HAVE_MUL
   1861   1.1.1.2    mrg    && reload_completed
   1862   1.1.1.2    mrg    && <any_extend:CODE> != <any_extend2:CODE>"
   1863   1.1.1.2    mrg   {
   1864   1.1.1.2    mrg     output_asm_insn (<any_extend:CODE> == SIGN_EXTEND
   1865   1.1.1.2    mrg                      ? "mulsu %1,%2" : "mulsu %2,%1", operands);
   1866       1.1    mrg 
   1867   1.1.1.2    mrg     return "add %A0,r0\;adc %B0,r1\;clr __zero_reg__";
   1868   1.1.1.2    mrg   }
   1869   1.1.1.2    mrg   [(set_attr "length" "4")
   1870   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   1871       1.1    mrg 
   1872   1.1.1.2    mrg ;; "*usmsubqihi4"
   1873   1.1.1.2    mrg ;; "*sumsubqihi4"
   1874   1.1.1.2    mrg (define_insn "*<any_extend:extend_su><any_extend2:extend_su>msubqihi4"
   1875   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                                   "=r")
   1876   1.1.1.2    mrg         (minus:HI (match_operand:HI 3 "register_operand"                          "0")
   1877   1.1.1.2    mrg                   (mult:HI (any_extend:HI  (match_operand:QI 1 "register_operand" "a"))
   1878   1.1.1.2    mrg                            (any_extend2:HI (match_operand:QI 2 "register_operand" "a")))))]
   1879   1.1.1.2    mrg   "AVR_HAVE_MUL
   1880   1.1.1.2    mrg    && reload_completed
   1881   1.1.1.2    mrg    && <any_extend:CODE> != <any_extend2:CODE>"
   1882   1.1.1.2    mrg   {
   1883   1.1.1.2    mrg     output_asm_insn (<any_extend:CODE> == SIGN_EXTEND
   1884   1.1.1.2    mrg                      ? "mulsu %1,%2" : "mulsu %2,%1", operands);
   1885   1.1.1.2    mrg 
   1886   1.1.1.2    mrg     return "sub %A0,r0\;sbc %B0,r1\;clr __zero_reg__";
   1887   1.1.1.2    mrg   }
   1888       1.1    mrg   [(set_attr "length" "4")
   1889   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   1890       1.1    mrg 
   1891   1.1.1.2    mrg ;; Handle small constants
   1892       1.1    mrg 
   1893   1.1.1.2    mrg ;; Special case of a += 2*b as frequently seen with accesses to int arrays.
   1894   1.1.1.2    mrg ;; This is shorter, faster than MUL and has lower register pressure.
   1895       1.1    mrg 
   1896   1.1.1.2    mrg (define_insn_and_split "*umaddqihi4.2"
   1897   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                                  "=r")
   1898   1.1.1.2    mrg         (plus:HI (mult:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "r"))
   1899   1.1.1.2    mrg                           (const_int 2))
   1900   1.1.1.2    mrg                  (match_operand:HI 2 "register_operand"                          "r")))]
   1901   1.1.1.2    mrg   "!reload_completed
   1902   1.1.1.2    mrg    && !reg_overlap_mentioned_p (operands[0], operands[1])"
   1903   1.1.1.2    mrg   { gcc_unreachable(); }
   1904   1.1.1.2    mrg   "&& 1"
   1905   1.1.1.2    mrg   [(set (match_dup 0)
   1906   1.1.1.2    mrg         (match_dup 2))
   1907   1.1.1.2    mrg    ; *addhi3_zero_extend
   1908   1.1.1.2    mrg    (set (match_dup 0)
   1909   1.1.1.2    mrg         (plus:HI (zero_extend:HI (match_dup 1))
   1910   1.1.1.2    mrg                  (match_dup 0)))
   1911   1.1.1.2    mrg    ; *addhi3_zero_extend
   1912   1.1.1.2    mrg    (set (match_dup 0)
   1913   1.1.1.2    mrg         (plus:HI (zero_extend:HI (match_dup 1))
   1914   1.1.1.2    mrg                  (match_dup 0)))])
   1915       1.1    mrg 
   1916   1.1.1.2    mrg ;; "umaddqihi4.uconst"
   1917   1.1.1.2    mrg ;; "maddqihi4.sconst"
   1918   1.1.1.2    mrg (define_insn_and_split "*<extend_u>maddqihi4.<extend_su>const"
   1919   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                                  "=r")
   1920   1.1.1.2    mrg         (plus:HI (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "<mul_r_d>"))
   1921   1.1.1.2    mrg                           (match_operand:HI 2 "<extend_su>8_operand"             "n"))
   1922   1.1.1.2    mrg                  (match_operand:HI 3 "register_operand"                          "0")))
   1923   1.1.1.2    mrg    (clobber (match_scratch:QI 4                                                 "=&d"))]
   1924   1.1.1.2    mrg   "AVR_HAVE_MUL"
   1925   1.1.1.2    mrg   "#"
   1926   1.1.1.2    mrg   "&& reload_completed"
   1927   1.1.1.2    mrg   [(set (match_dup 4)
   1928   1.1.1.2    mrg         (match_dup 2))
   1929   1.1.1.2    mrg    ; *umaddqihi4 resp. *maddqihi4
   1930   1.1.1.2    mrg    (set (match_dup 0)
   1931   1.1.1.2    mrg         (plus:HI (mult:HI (any_extend:HI (match_dup 1))
   1932   1.1.1.2    mrg                           (any_extend:HI (match_dup 4)))
   1933   1.1.1.2    mrg                  (match_dup 3)))]
   1934   1.1.1.2    mrg   {
   1935   1.1.1.2    mrg     operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
   1936   1.1.1.2    mrg   })
   1937       1.1    mrg 
   1938   1.1.1.2    mrg ;; "*umsubqihi4.uconst"
   1939   1.1.1.2    mrg ;; "*msubqihi4.sconst"
   1940   1.1.1.2    mrg (define_insn_and_split "*<extend_u>msubqihi4.<extend_su>const"
   1941   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                                  "=r")
   1942   1.1.1.2    mrg         (minus:HI (match_operand:HI 3 "register_operand"                         "0")
   1943   1.1.1.2    mrg                   (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "<mul_r_d>"))
   1944   1.1.1.2    mrg                            (match_operand:HI 2 "<extend_su>8_operand"            "n"))))
   1945   1.1.1.2    mrg    (clobber (match_scratch:QI 4                                                 "=&d"))]
   1946   1.1.1.2    mrg   "AVR_HAVE_MUL"
   1947   1.1.1.2    mrg   "#"
   1948   1.1.1.2    mrg   "&& reload_completed"
   1949   1.1.1.2    mrg   [(set (match_dup 4)
   1950   1.1.1.2    mrg         (match_dup 2))
   1951   1.1.1.2    mrg    ; *umsubqihi4 resp. *msubqihi4
   1952   1.1.1.2    mrg    (set (match_dup 0)
   1953   1.1.1.2    mrg         (minus:HI (match_dup 3)
   1954   1.1.1.2    mrg                   (mult:HI (any_extend:HI (match_dup 1))
   1955   1.1.1.2    mrg                            (any_extend:HI (match_dup 4)))))]
   1956   1.1.1.2    mrg   {
   1957   1.1.1.2    mrg     operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
   1958   1.1.1.2    mrg   })
   1959       1.1    mrg 
   1960   1.1.1.2    mrg ;; Same as the insn above, but combiner tries versions canonicalized to ASHIFT
   1961   1.1.1.2    mrg ;; for MULT with power of 2 and skips trying MULT insn above.
   1962       1.1    mrg 
   1963   1.1.1.2    mrg (define_insn_and_split "*umsubqihi4.uconst.ashift"
   1964   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                                     "=r")
   1965   1.1.1.2    mrg         (minus:HI (match_operand:HI 3 "register_operand"                            "0")
   1966   1.1.1.2    mrg                   (ashift:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "r"))
   1967   1.1.1.2    mrg                              (match_operand:HI 2 "const_2_to_7_operand"             "n"))))
   1968   1.1.1.2    mrg    (clobber (match_scratch:QI 4                                                   "=&d"))]
   1969   1.1.1.2    mrg   "AVR_HAVE_MUL"
   1970   1.1.1.2    mrg   "#"
   1971   1.1.1.2    mrg   "&& reload_completed"
   1972   1.1.1.2    mrg   [(set (match_dup 4)
   1973   1.1.1.2    mrg         (match_dup 2))
   1974   1.1.1.2    mrg    ; *umsubqihi4
   1975   1.1.1.2    mrg    (set (match_dup 0)
   1976   1.1.1.2    mrg         (minus:HI (match_dup 3)
   1977   1.1.1.2    mrg                   (mult:HI (zero_extend:HI (match_dup 1))
   1978   1.1.1.2    mrg                            (zero_extend:HI (match_dup 4)))))]
   1979   1.1.1.2    mrg   {
   1980   1.1.1.2    mrg     operands[2] = gen_int_mode (1 << INTVAL (operands[2]), QImode);
   1981   1.1.1.2    mrg   })
   1982       1.1    mrg 
   1983   1.1.1.2    mrg ;; Same as the insn above, but combiner tries versions canonicalized to ASHIFT
   1984   1.1.1.2    mrg ;; for MULT with power of 2 and skips trying MULT insn above.  We omit 128
   1985   1.1.1.2    mrg ;; because this would require an extra pattern for just one value.
   1986   1.1.1.2    mrg 
   1987   1.1.1.2    mrg (define_insn_and_split "*msubqihi4.sconst.ashift"
   1988   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                                     "=r")
   1989   1.1.1.2    mrg         (minus:HI (match_operand:HI 3 "register_operand"                            "0")
   1990   1.1.1.2    mrg                   (ashift:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "d"))
   1991   1.1.1.2    mrg                              (match_operand:HI 2 "const_1_to_6_operand"             "M"))))
   1992   1.1.1.2    mrg    (clobber (match_scratch:QI 4                                                   "=&d"))]
   1993   1.1.1.2    mrg   "AVR_HAVE_MUL"
   1994   1.1.1.2    mrg   "#"
   1995   1.1.1.2    mrg   "&& reload_completed"
   1996   1.1.1.2    mrg   [(set (match_dup 4)
   1997   1.1.1.2    mrg         (match_dup 2))
   1998   1.1.1.2    mrg    ; *smsubqihi4
   1999   1.1.1.2    mrg    (set (match_dup 0)
   2000   1.1.1.2    mrg         (minus:HI (match_dup 3)
   2001   1.1.1.2    mrg                   (mult:HI (sign_extend:HI (match_dup 1))
   2002   1.1.1.2    mrg                            (sign_extend:HI (match_dup 4)))))]
   2003   1.1.1.2    mrg   {
   2004   1.1.1.2    mrg     operands[2] = gen_int_mode (1 << INTVAL (operands[2]), QImode);
   2005   1.1.1.2    mrg   })
   2006       1.1    mrg 
   2007   1.1.1.2    mrg ;; For signed/unsigned combinations that require narrow constraint "a"
   2008   1.1.1.2    mrg ;; just provide a pattern if signed/unsigned combination is actually needed.
   2009       1.1    mrg 
   2010   1.1.1.2    mrg (define_insn_and_split "*sumaddqihi4.uconst"
   2011   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                                  "=r")
   2012   1.1.1.2    mrg         (plus:HI (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a"))
   2013   1.1.1.2    mrg                           (match_operand:HI 2 "u8_operand"                       "M"))
   2014   1.1.1.2    mrg                  (match_operand:HI 3 "register_operand"                          "0")))
   2015   1.1.1.2    mrg    (clobber (match_scratch:QI 4                                                "=&a"))]
   2016   1.1.1.2    mrg   "AVR_HAVE_MUL
   2017   1.1.1.2    mrg    && !s8_operand (operands[2], VOIDmode)"
   2018   1.1.1.2    mrg   "#"
   2019   1.1.1.2    mrg   "&& reload_completed"
   2020   1.1.1.2    mrg   [(set (match_dup 4)
   2021   1.1.1.2    mrg         (match_dup 2))
   2022   1.1.1.2    mrg    ; *sumaddqihi4
   2023   1.1.1.2    mrg    (set (match_dup 0)
   2024   1.1.1.2    mrg         (plus:HI (mult:HI (sign_extend:HI (match_dup 1))
   2025   1.1.1.2    mrg                           (zero_extend:HI (match_dup 4)))
   2026   1.1.1.2    mrg                  (match_dup 3)))]
   2027   1.1.1.2    mrg   {
   2028   1.1.1.2    mrg     operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
   2029   1.1.1.2    mrg   })
   2030       1.1    mrg 
   2031   1.1.1.2    mrg (define_insn_and_split "*sumsubqihi4.uconst"
   2032   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                                   "=r")
   2033   1.1.1.2    mrg         (minus:HI (match_operand:HI 3 "register_operand"                          "0")
   2034   1.1.1.2    mrg                   (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a"))
   2035   1.1.1.2    mrg                            (match_operand:HI 2 "u8_operand"                       "M"))))
   2036   1.1.1.2    mrg    (clobber (match_scratch:QI 4                                                 "=&a"))]
   2037   1.1.1.2    mrg   "AVR_HAVE_MUL
   2038   1.1.1.2    mrg    && !s8_operand (operands[2], VOIDmode)"
   2039       1.1    mrg   "#"
   2040   1.1.1.2    mrg   "&& reload_completed"
   2041   1.1.1.2    mrg   [(set (match_dup 4)
   2042   1.1.1.2    mrg         (match_dup 2))
   2043   1.1.1.2    mrg    ; *sumsubqihi4
   2044   1.1.1.2    mrg    (set (match_dup 0)
   2045   1.1.1.2    mrg         (minus:HI (match_dup 3)
   2046   1.1.1.2    mrg                   (mult:HI (sign_extend:HI (match_dup 1))
   2047   1.1.1.2    mrg                            (zero_extend:HI (match_dup 4)))))]
   2048   1.1.1.2    mrg   {
   2049   1.1.1.2    mrg     operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
   2050   1.1.1.2    mrg   })
   2051       1.1    mrg 
   2052   1.1.1.2    mrg ;******************************************************************************
   2053   1.1.1.2    mrg ; mul HI: $1 = sign/zero-extend, $2 = small constant
   2054   1.1.1.2    mrg ;******************************************************************************
   2055       1.1    mrg 
   2056   1.1.1.2    mrg ;; "*muluqihi3.uconst"
   2057   1.1.1.2    mrg ;; "*mulsqihi3.sconst"
   2058   1.1.1.2    mrg (define_insn_and_split "*mul<extend_su>qihi3.<extend_su>const"
   2059   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                         "=r")
   2060   1.1.1.2    mrg         (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "<mul_r_d>"))
   2061   1.1.1.2    mrg                  (match_operand:HI 2 "<extend_su>8_operand"            "n")))
   2062   1.1.1.2    mrg    (clobber (match_scratch:QI 3                                       "=&d"))]
   2063   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2064       1.1    mrg   "#"
   2065   1.1.1.2    mrg   "&& reload_completed"
   2066   1.1.1.2    mrg   [(set (match_dup 3)
   2067   1.1.1.2    mrg         (match_dup 2))
   2068   1.1.1.2    mrg    ; umulqihi3 resp. mulqihi3
   2069   1.1.1.2    mrg    (set (match_dup 0)
   2070   1.1.1.2    mrg         (mult:HI (any_extend:HI (match_dup 1))
   2071   1.1.1.2    mrg                  (any_extend:HI (match_dup 3))))]
   2072   1.1.1.2    mrg   {
   2073   1.1.1.2    mrg     operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
   2074   1.1.1.2    mrg   })
   2075       1.1    mrg 
   2076   1.1.1.2    mrg (define_insn_and_split "*muluqihi3.sconst"
   2077   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                         "=r")
   2078   1.1.1.2    mrg         (mult:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "a"))
   2079   1.1.1.2    mrg                  (match_operand:HI 2 "s8_operand"                       "n")))
   2080   1.1.1.2    mrg    (clobber (match_scratch:QI 3                                       "=&a"))]
   2081   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2082   1.1.1.2    mrg   "#"
   2083   1.1.1.2    mrg   "&& reload_completed"
   2084   1.1.1.2    mrg   [(set (match_dup 3)
   2085   1.1.1.2    mrg         (match_dup 2))
   2086   1.1.1.2    mrg    ; usmulqihi3
   2087   1.1.1.2    mrg    (set (match_dup 0)
   2088   1.1.1.2    mrg         (mult:HI (zero_extend:HI (match_dup 1))
   2089   1.1.1.2    mrg                  (sign_extend:HI (match_dup 3))))]
   2090   1.1.1.2    mrg   {
   2091   1.1.1.2    mrg     operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
   2092   1.1.1.2    mrg   })
   2093       1.1    mrg 
   2094   1.1.1.2    mrg (define_insn_and_split "*mulsqihi3.uconst"
   2095   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                         "=r")
   2096   1.1.1.2    mrg         (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a"))
   2097   1.1.1.2    mrg                  (match_operand:HI 2 "u8_operand"                       "M")))
   2098   1.1.1.2    mrg    (clobber (match_scratch:QI 3                                       "=&a"))]
   2099   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2100   1.1.1.2    mrg   "#"
   2101   1.1.1.2    mrg   "&& reload_completed"
   2102   1.1.1.2    mrg   [(set (match_dup 3)
   2103   1.1.1.2    mrg         (match_dup 2))
   2104   1.1.1.2    mrg    ; usmulqihi3
   2105   1.1.1.2    mrg    (set (match_dup 0)
   2106   1.1.1.2    mrg         (mult:HI (zero_extend:HI (match_dup 3))
   2107   1.1.1.2    mrg                  (sign_extend:HI (match_dup 1))))]
   2108   1.1.1.2    mrg   {
   2109   1.1.1.2    mrg     operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
   2110   1.1.1.2    mrg   })
   2111       1.1    mrg 
   2112   1.1.1.2    mrg (define_insn_and_split "*mulsqihi3.oconst"
   2113   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                        "=&r")
   2114   1.1.1.2    mrg         (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a"))
   2115   1.1.1.2    mrg                  (match_operand:HI 2 "o8_operand"                       "n")))
   2116   1.1.1.2    mrg    (clobber (match_scratch:QI 3                                       "=&a"))]
   2117   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2118   1.1.1.2    mrg   "#"
   2119   1.1.1.2    mrg   "&& reload_completed"
   2120   1.1.1.2    mrg   [(set (match_dup 3)
   2121   1.1.1.2    mrg         (match_dup 2))
   2122   1.1.1.2    mrg    ; *osmulqihi3
   2123   1.1.1.2    mrg    (set (match_dup 0)
   2124   1.1.1.2    mrg         (mult:HI (not:HI (zero_extend:HI (not:QI (match_dup 3))))
   2125   1.1.1.2    mrg                  (sign_extend:HI (match_dup 1))))]
   2126   1.1.1.2    mrg   {
   2127   1.1.1.2    mrg     operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
   2128   1.1.1.2    mrg   })
   2129       1.1    mrg 
   2130   1.1.1.2    mrg ;; The EXTEND of $1 only appears in combine, we don't see it in expand so that
   2131   1.1.1.2    mrg ;; expand decides to use ASHIFT instead of MUL because ASHIFT costs are cheaper
   2132   1.1.1.2    mrg ;; at that time.  Fix that.
   2133   1.1.1.2    mrg 
   2134   1.1.1.2    mrg (define_insn "*ashiftqihi2.signx.1"
   2135   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                           "=r,*r")
   2136   1.1.1.2    mrg         (ashift:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "0,r"))
   2137   1.1.1.2    mrg                    (const_int 1)))]
   2138       1.1    mrg   ""
   2139   1.1.1.2    mrg   "@
   2140   1.1.1.2    mrg 	lsl %A0\;sbc %B0,%B0
   2141   1.1.1.2    mrg 	mov %A0,%1\;lsl %A0\;sbc %B0,%B0"
   2142   1.1.1.2    mrg   [(set_attr "length" "2,3")
   2143   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2144       1.1    mrg 
   2145   1.1.1.2    mrg (define_insn_and_split "*ashifthi3.signx.const"
   2146   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                           "=r")
   2147   1.1.1.2    mrg         (ashift:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "d"))
   2148   1.1.1.2    mrg                    (match_operand:HI 2 "const_2_to_6_operand"             "I")))
   2149   1.1.1.2    mrg    (clobber (match_scratch:QI 3                                         "=&d"))]
   2150   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2151   1.1.1.2    mrg   "#"
   2152   1.1.1.2    mrg   "&& reload_completed"
   2153   1.1.1.2    mrg   [(set (match_dup 3)
   2154   1.1.1.2    mrg         (match_dup 2))
   2155   1.1.1.2    mrg    ; mulqihi3
   2156   1.1.1.2    mrg    (set (match_dup 0)
   2157   1.1.1.2    mrg         (mult:HI (sign_extend:HI (match_dup 1))
   2158   1.1.1.2    mrg                  (sign_extend:HI (match_dup 3))))]
   2159   1.1.1.2    mrg   {
   2160   1.1.1.2    mrg     operands[2] = GEN_INT (1 << INTVAL (operands[2]));
   2161   1.1.1.2    mrg   })
   2162       1.1    mrg 
   2163   1.1.1.2    mrg (define_insn_and_split "*ashifthi3.signx.const7"
   2164   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                           "=r")
   2165   1.1.1.2    mrg         (ashift:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a"))
   2166   1.1.1.2    mrg                    (const_int 7)))
   2167   1.1.1.2    mrg    (clobber (match_scratch:QI 2                                         "=&a"))]
   2168   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2169   1.1.1.2    mrg   "#"
   2170   1.1.1.2    mrg   "&& reload_completed"
   2171   1.1.1.2    mrg   [(set (match_dup 2)
   2172   1.1.1.2    mrg         (match_dup 3))
   2173   1.1.1.2    mrg    ; usmulqihi3
   2174   1.1.1.2    mrg    (set (match_dup 0)
   2175   1.1.1.2    mrg         (mult:HI (zero_extend:HI (match_dup 2))
   2176   1.1.1.2    mrg                  (sign_extend:HI (match_dup 1))))]
   2177   1.1.1.2    mrg   {
   2178   1.1.1.2    mrg     operands[3] = gen_int_mode (1 << 7, QImode);
   2179   1.1.1.2    mrg   })
   2180       1.1    mrg 
   2181   1.1.1.2    mrg (define_insn_and_split "*ashifthi3.zerox.const"
   2182   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                           "=r")
   2183   1.1.1.2    mrg         (ashift:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "r"))
   2184   1.1.1.2    mrg                    (match_operand:HI 2 "const_2_to_7_operand"             "I")))
   2185   1.1.1.2    mrg    (clobber (match_scratch:QI 3                                         "=&d"))]
   2186   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2187   1.1.1.2    mrg   "#"
   2188   1.1.1.2    mrg   "&& reload_completed"
   2189   1.1.1.2    mrg   [(set (match_dup 3)
   2190   1.1.1.2    mrg         (match_dup 2))
   2191   1.1.1.2    mrg    ; umulqihi3
   2192   1.1.1.2    mrg    (set (match_dup 0)
   2193   1.1.1.2    mrg         (mult:HI (zero_extend:HI (match_dup 1))
   2194   1.1.1.2    mrg                  (zero_extend:HI (match_dup 3))))]
   2195   1.1.1.2    mrg   {
   2196   1.1.1.2    mrg     operands[2] = gen_int_mode (1 << INTVAL (operands[2]), QImode);
   2197   1.1.1.2    mrg   })
   2198       1.1    mrg 
   2199   1.1.1.2    mrg ;******************************************************************************
   2200   1.1.1.2    mrg ; mul HI: $1 = sign-/zero-/one-extend, $2 = reg
   2201   1.1.1.2    mrg ;******************************************************************************
   2202       1.1    mrg 
   2203   1.1.1.2    mrg (define_insn "mulsqihi3"
   2204   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                        "=&r")
   2205   1.1.1.2    mrg         (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a"))
   2206   1.1.1.2    mrg                  (match_operand:HI 2 "register_operand"                 "a")))]
   2207   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2208   1.1.1.2    mrg   "mulsu %1,%A2
   2209   1.1.1.2    mrg 	movw %0,r0
   2210   1.1.1.2    mrg 	mul %1,%B2
   2211   1.1.1.2    mrg 	add %B0,r0
   2212   1.1.1.2    mrg 	clr __zero_reg__"
   2213   1.1.1.2    mrg   [(set_attr "length" "5")
   2214   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2215       1.1    mrg 
   2216   1.1.1.2    mrg (define_insn "muluqihi3"
   2217   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                        "=&r")
   2218   1.1.1.2    mrg         (mult:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "r"))
   2219   1.1.1.2    mrg                  (match_operand:HI 2 "register_operand"                 "r")))]
   2220   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2221   1.1.1.2    mrg   "mul %1,%A2
   2222   1.1.1.2    mrg 	movw %0,r0
   2223   1.1.1.2    mrg 	mul %1,%B2
   2224   1.1.1.2    mrg 	add %B0,r0
   2225   1.1.1.2    mrg 	clr __zero_reg__"
   2226   1.1.1.2    mrg   [(set_attr "length" "5")
   2227   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2228       1.1    mrg 
   2229   1.1.1.2    mrg ;; one-extend operand 1
   2230       1.1    mrg 
   2231   1.1.1.2    mrg (define_insn "muloqihi3"
   2232   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                                        "=&r")
   2233   1.1.1.2    mrg         (mult:HI (not:HI (zero_extend:HI (not:QI (match_operand:QI 1 "register_operand" "r"))))
   2234   1.1.1.2    mrg                  (match_operand:HI 2 "register_operand"                                 "r")))]
   2235   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2236   1.1.1.2    mrg   "mul %1,%A2
   2237   1.1.1.2    mrg 	movw %0,r0
   2238   1.1.1.2    mrg 	mul %1,%B2
   2239   1.1.1.2    mrg 	add %B0,r0
   2240   1.1.1.2    mrg 	sub %B0,%A2
   2241   1.1.1.2    mrg 	clr __zero_reg__"
   2242   1.1.1.2    mrg   [(set_attr "length" "6")
   2243   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2244       1.1    mrg 
   2245   1.1.1.2    mrg ;******************************************************************************
   2246       1.1    mrg 
   2247   1.1.1.2    mrg (define_expand "mulhi3"
   2248   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand" "")
   2249   1.1.1.2    mrg         (mult:HI (match_operand:HI 1 "register_operand" "")
   2250   1.1.1.2    mrg                  (match_operand:HI 2 "register_or_s9_operand" "")))]
   2251       1.1    mrg   ""
   2252   1.1.1.2    mrg   {
   2253   1.1.1.2    mrg     if (!AVR_HAVE_MUL)
   2254   1.1.1.2    mrg       {
   2255   1.1.1.2    mrg         if (!register_operand (operands[2], HImode))
   2256   1.1.1.2    mrg           operands[2] = force_reg (HImode, operands[2]);
   2257       1.1    mrg 
   2258   1.1.1.2    mrg         emit_insn (gen_mulhi3_call (operands[0], operands[1], operands[2]));
   2259   1.1.1.2    mrg         DONE;
   2260   1.1.1.2    mrg       }
   2261       1.1    mrg 
   2262   1.1.1.6    mrg     /* ; For small constants we can do better by extending them on the fly.
   2263   1.1.1.6    mrg        ; The constant can be loaded in one instruction and the widening
   2264   1.1.1.6    mrg        ; multiplication is shorter.  First try the unsigned variant because it
   2265   1.1.1.6    mrg        ; allows constraint "d" instead of "a" for the signed version.  */
   2266   1.1.1.2    mrg 
   2267   1.1.1.2    mrg     if (s9_operand (operands[2], HImode))
   2268   1.1.1.2    mrg       {
   2269   1.1.1.2    mrg         rtx reg = force_reg (QImode, gen_int_mode (INTVAL (operands[2]), QImode));
   2270   1.1.1.2    mrg 
   2271   1.1.1.2    mrg         if (u8_operand (operands[2], HImode))
   2272   1.1.1.2    mrg           {
   2273   1.1.1.2    mrg             emit_insn (gen_muluqihi3 (operands[0], reg, operands[1]));
   2274   1.1.1.2    mrg           }
   2275   1.1.1.2    mrg         else if (s8_operand (operands[2], HImode))
   2276   1.1.1.2    mrg           {
   2277   1.1.1.2    mrg             emit_insn (gen_mulsqihi3 (operands[0], reg, operands[1]));
   2278   1.1.1.2    mrg           }
   2279   1.1.1.2    mrg         else
   2280   1.1.1.2    mrg           {
   2281   1.1.1.2    mrg             emit_insn (gen_muloqihi3 (operands[0], reg, operands[1]));
   2282   1.1.1.2    mrg           }
   2283       1.1    mrg 
   2284   1.1.1.2    mrg         DONE;
   2285   1.1.1.2    mrg       }
   2286       1.1    mrg 
   2287   1.1.1.2    mrg     if (!register_operand (operands[2], HImode))
   2288   1.1.1.2    mrg       operands[2] = force_reg (HImode, operands[2]);
   2289   1.1.1.2    mrg   })
   2290       1.1    mrg 
   2291   1.1.1.2    mrg (define_insn "*mulhi3_enh"
   2292   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand" "=&r")
   2293   1.1.1.2    mrg         (mult:HI (match_operand:HI 1 "register_operand" "r")
   2294   1.1.1.2    mrg                  (match_operand:HI 2 "register_operand" "r")))]
   2295   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2296   1.1.1.2    mrg   {
   2297   1.1.1.2    mrg     return REGNO (operands[1]) == REGNO (operands[2])
   2298   1.1.1.2    mrg            ? "mul %A1,%A1\;movw %0,r0\;mul %A1,%B1\;add %B0,r0\;add %B0,r0\;clr r1"
   2299   1.1.1.2    mrg            : "mul %A1,%A2\;movw %0,r0\;mul %A1,%B2\;add %B0,r0\;mul %B1,%A2\;add %B0,r0\;clr r1";
   2300   1.1.1.2    mrg   }
   2301   1.1.1.2    mrg   [(set_attr "length" "7")
   2302   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2303       1.1    mrg 
   2304   1.1.1.2    mrg (define_expand "mulhi3_call"
   2305   1.1.1.2    mrg   [(set (reg:HI 24) (match_operand:HI 1 "register_operand" ""))
   2306   1.1.1.2    mrg    (set (reg:HI 22) (match_operand:HI 2 "register_operand" ""))
   2307   1.1.1.2    mrg    (parallel [(set (reg:HI 24) (mult:HI (reg:HI 24) (reg:HI 22)))
   2308   1.1.1.2    mrg               (clobber (reg:HI 22))
   2309   1.1.1.2    mrg               (clobber (reg:QI 21))])
   2310   1.1.1.6    mrg    (set (match_operand:HI 0 "register_operand" "")
   2311   1.1.1.6    mrg         (reg:HI 24))]
   2312   1.1.1.6    mrg   ""
   2313   1.1.1.6    mrg   {
   2314   1.1.1.6    mrg     avr_fix_inputs (operands, (1 << 2), regmask (HImode, 24));
   2315   1.1.1.6    mrg   })
   2316   1.1.1.6    mrg 
   2317       1.1    mrg 
   2318   1.1.1.2    mrg (define_insn "*mulhi3_call"
   2319   1.1.1.2    mrg   [(set (reg:HI 24) (mult:HI (reg:HI 24) (reg:HI 22)))
   2320   1.1.1.2    mrg    (clobber (reg:HI 22))
   2321   1.1.1.2    mrg    (clobber (reg:QI 21))]
   2322   1.1.1.2    mrg   "!AVR_HAVE_MUL"
   2323   1.1.1.2    mrg   "%~call __mulhi3"
   2324   1.1.1.2    mrg   [(set_attr "type" "xcall")
   2325   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2326       1.1    mrg 
   2327   1.1.1.2    mrg ;; To support widening multiplication with constant we postpone
   2328   1.1.1.2    mrg ;; expanding to the implicit library call until post combine and
   2329   1.1.1.2    mrg ;; prior to register allocation.  Clobber all hard registers that
   2330   1.1.1.2    mrg ;; might be used by the (widening) multiply until it is split and
   2331   1.1.1.2    mrg ;; it's final register footprint is worked out.
   2332       1.1    mrg 
   2333   1.1.1.2    mrg (define_expand "mulsi3"
   2334   1.1.1.2    mrg   [(parallel [(set (match_operand:SI 0 "register_operand" "")
   2335   1.1.1.2    mrg                    (mult:SI (match_operand:SI 1 "register_operand" "")
   2336   1.1.1.2    mrg                             (match_operand:SI 2 "nonmemory_operand" "")))
   2337   1.1.1.2    mrg               (clobber (reg:HI 26))
   2338   1.1.1.2    mrg               (clobber (reg:DI 18))])]
   2339   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2340   1.1.1.2    mrg   {
   2341   1.1.1.2    mrg     if (u16_operand (operands[2], SImode))
   2342   1.1.1.2    mrg       {
   2343   1.1.1.2    mrg         operands[2] = force_reg (HImode, gen_int_mode (INTVAL (operands[2]), HImode));
   2344   1.1.1.2    mrg         emit_insn (gen_muluhisi3 (operands[0], operands[2], operands[1]));
   2345   1.1.1.2    mrg         DONE;
   2346   1.1.1.2    mrg       }
   2347       1.1    mrg 
   2348   1.1.1.2    mrg     if (o16_operand (operands[2], SImode))
   2349   1.1.1.2    mrg       {
   2350   1.1.1.2    mrg         operands[2] = force_reg (HImode, gen_int_mode (INTVAL (operands[2]), HImode));
   2351   1.1.1.2    mrg         emit_insn (gen_mulohisi3 (operands[0], operands[2], operands[1]));
   2352   1.1.1.2    mrg         DONE;
   2353   1.1.1.2    mrg       }
   2354   1.1.1.6    mrg 
   2355   1.1.1.6    mrg     if (avr_emit3_fix_outputs (gen_mulsi3, operands, 1 << 0,
   2356   1.1.1.6    mrg                                regmask (DImode, 18) | regmask (HImode, 26)))
   2357   1.1.1.6    mrg       DONE;
   2358   1.1.1.2    mrg   })
   2359       1.1    mrg 
   2360   1.1.1.2    mrg (define_insn_and_split "*mulsi3"
   2361   1.1.1.2    mrg   [(set (match_operand:SI 0 "pseudo_register_operand"                      "=r")
   2362   1.1.1.2    mrg         (mult:SI (match_operand:SI 1 "pseudo_register_operand"              "r")
   2363   1.1.1.2    mrg                  (match_operand:SI 2 "pseudo_register_or_const_int_operand" "rn")))
   2364   1.1.1.2    mrg    (clobber (reg:HI 26))
   2365   1.1.1.2    mrg    (clobber (reg:DI 18))]
   2366   1.1.1.2    mrg   "AVR_HAVE_MUL && !reload_completed"
   2367   1.1.1.2    mrg   { gcc_unreachable(); }
   2368   1.1.1.2    mrg   "&& 1"
   2369   1.1.1.2    mrg   [(set (reg:SI 18)
   2370   1.1.1.2    mrg         (match_dup 1))
   2371   1.1.1.2    mrg    (set (reg:SI 22)
   2372   1.1.1.2    mrg         (match_dup 2))
   2373   1.1.1.2    mrg    (parallel [(set (reg:SI 22)
   2374   1.1.1.2    mrg                    (mult:SI (reg:SI 22)
   2375   1.1.1.2    mrg                             (reg:SI 18)))
   2376   1.1.1.2    mrg               (clobber (reg:HI 26))])
   2377   1.1.1.2    mrg    (set (match_dup 0)
   2378   1.1.1.2    mrg         (reg:SI 22))]
   2379   1.1.1.2    mrg   {
   2380   1.1.1.2    mrg     if (u16_operand (operands[2], SImode))
   2381   1.1.1.2    mrg       {
   2382   1.1.1.2    mrg         operands[2] = force_reg (HImode, gen_int_mode (INTVAL (operands[2]), HImode));
   2383   1.1.1.2    mrg         emit_insn (gen_muluhisi3 (operands[0], operands[2], operands[1]));
   2384   1.1.1.2    mrg         DONE;
   2385   1.1.1.2    mrg       }
   2386       1.1    mrg 
   2387   1.1.1.2    mrg     if (o16_operand (operands[2], SImode))
   2388   1.1.1.2    mrg       {
   2389   1.1.1.2    mrg         operands[2] = force_reg (HImode, gen_int_mode (INTVAL (operands[2]), HImode));
   2390   1.1.1.2    mrg         emit_insn (gen_mulohisi3 (operands[0], operands[2], operands[1]));
   2391   1.1.1.2    mrg         DONE;
   2392   1.1.1.2    mrg       }
   2393   1.1.1.2    mrg   })
   2394       1.1    mrg 
   2395   1.1.1.2    mrg ;; "muluqisi3"
   2396   1.1.1.2    mrg ;; "muluhisi3"
   2397   1.1.1.6    mrg (define_expand "mulu<mode>si3"
   2398   1.1.1.6    mrg   [(parallel [(set (match_operand:SI 0 "pseudo_register_operand" "")
   2399   1.1.1.6    mrg                    (mult:SI (zero_extend:SI (match_operand:QIHI 1 "pseudo_register_operand" ""))
   2400   1.1.1.6    mrg                             (match_operand:SI 2 "pseudo_register_or_const_int_operand" "")))
   2401   1.1.1.6    mrg               (clobber (reg:HI 26))
   2402   1.1.1.6    mrg               (clobber (reg:DI 18))])]
   2403   1.1.1.6    mrg   "AVR_HAVE_MUL"
   2404   1.1.1.6    mrg   {
   2405   1.1.1.6    mrg     avr_fix_inputs (operands, (1 << 1) | (1 << 2), -1u);
   2406   1.1.1.6    mrg     if (avr_emit3_fix_outputs (gen_mulu<mode>si3, operands, 1 << 0,
   2407   1.1.1.6    mrg                                regmask (DImode, 18) | regmask (HImode, 26)))
   2408   1.1.1.6    mrg       DONE;
   2409   1.1.1.6    mrg   })
   2410   1.1.1.6    mrg 
   2411   1.1.1.6    mrg ;; "*muluqisi3"
   2412   1.1.1.6    mrg ;; "*muluhisi3"
   2413   1.1.1.6    mrg (define_insn_and_split "*mulu<mode>si3"
   2414   1.1.1.2    mrg   [(set (match_operand:SI 0 "pseudo_register_operand"                           "=r")
   2415   1.1.1.2    mrg         (mult:SI (zero_extend:SI (match_operand:QIHI 1 "pseudo_register_operand" "r"))
   2416   1.1.1.2    mrg                  (match_operand:SI 2 "pseudo_register_or_const_int_operand"      "rn")))
   2417   1.1.1.2    mrg    (clobber (reg:HI 26))
   2418   1.1.1.2    mrg    (clobber (reg:DI 18))]
   2419   1.1.1.2    mrg   "AVR_HAVE_MUL && !reload_completed"
   2420   1.1.1.2    mrg   { gcc_unreachable(); }
   2421   1.1.1.2    mrg   "&& 1"
   2422   1.1.1.2    mrg   [(set (reg:HI 26)
   2423   1.1.1.2    mrg         (match_dup 1))
   2424   1.1.1.2    mrg    (set (reg:SI 18)
   2425   1.1.1.2    mrg         (match_dup 2))
   2426   1.1.1.2    mrg    (set (reg:SI 22)
   2427   1.1.1.2    mrg         (mult:SI (zero_extend:SI (reg:HI 26))
   2428   1.1.1.2    mrg                  (reg:SI 18)))
   2429   1.1.1.2    mrg    (set (match_dup 0)
   2430   1.1.1.2    mrg         (reg:SI 22))]
   2431   1.1.1.2    mrg   {
   2432   1.1.1.2    mrg     /* Do the QI -> HI extension explicitely before the multiplication.  */
   2433   1.1.1.2    mrg     /* Do the HI -> SI extension implicitely and after the multiplication.  */
   2434       1.1    mrg 
   2435   1.1.1.2    mrg     if (QImode == <MODE>mode)
   2436   1.1.1.2    mrg       operands[1] = gen_rtx_ZERO_EXTEND (HImode, operands[1]);
   2437       1.1    mrg 
   2438   1.1.1.2    mrg     if (u16_operand (operands[2], SImode))
   2439   1.1.1.2    mrg       {
   2440   1.1.1.2    mrg         operands[1] = force_reg (HImode, operands[1]);
   2441   1.1.1.2    mrg         operands[2] = force_reg (HImode, gen_int_mode (INTVAL (operands[2]), HImode));
   2442   1.1.1.2    mrg         emit_insn (gen_umulhisi3 (operands[0], operands[1], operands[2]));
   2443   1.1.1.2    mrg         DONE;
   2444   1.1.1.2    mrg       }
   2445   1.1.1.2    mrg   })
   2446       1.1    mrg 
   2447   1.1.1.2    mrg ;; "mulsqisi3"
   2448   1.1.1.2    mrg ;; "mulshisi3"
   2449   1.1.1.6    mrg (define_expand "muls<mode>si3"
   2450   1.1.1.6    mrg   [(parallel [(set (match_operand:SI 0 "pseudo_register_operand" "")
   2451   1.1.1.6    mrg                    (mult:SI (sign_extend:SI (match_operand:QIHI 1 "pseudo_register_operand" ""))
   2452   1.1.1.6    mrg                             (match_operand:SI 2 "pseudo_register_or_const_int_operand" "")))
   2453   1.1.1.6    mrg               (clobber (reg:HI 26))
   2454   1.1.1.6    mrg               (clobber (reg:DI 18))])]
   2455   1.1.1.6    mrg   "AVR_HAVE_MUL"
   2456   1.1.1.6    mrg   {
   2457   1.1.1.6    mrg     avr_fix_inputs (operands, (1 << 1) | (1 << 2), -1u);
   2458   1.1.1.6    mrg     if (avr_emit3_fix_outputs (gen_muls<mode>si3, operands, 1 << 0,
   2459   1.1.1.6    mrg                                regmask (DImode, 18) | regmask (HImode, 26)))
   2460   1.1.1.6    mrg       DONE;
   2461   1.1.1.6    mrg   })
   2462   1.1.1.6    mrg 
   2463   1.1.1.6    mrg ;; "*mulsqisi3"
   2464   1.1.1.6    mrg ;; "*mulshisi3"
   2465   1.1.1.6    mrg (define_insn_and_split "*muls<mode>si3"
   2466   1.1.1.2    mrg   [(set (match_operand:SI 0 "pseudo_register_operand"                           "=r")
   2467   1.1.1.2    mrg         (mult:SI (sign_extend:SI (match_operand:QIHI 1 "pseudo_register_operand" "r"))
   2468   1.1.1.2    mrg                  (match_operand:SI 2 "pseudo_register_or_const_int_operand"      "rn")))
   2469   1.1.1.2    mrg    (clobber (reg:HI 26))
   2470   1.1.1.2    mrg    (clobber (reg:DI 18))]
   2471   1.1.1.2    mrg   "AVR_HAVE_MUL && !reload_completed"
   2472   1.1.1.2    mrg   { gcc_unreachable(); }
   2473   1.1.1.2    mrg   "&& 1"
   2474   1.1.1.2    mrg   [(set (reg:HI 26)
   2475   1.1.1.2    mrg         (match_dup 1))
   2476   1.1.1.2    mrg    (set (reg:SI 18)
   2477   1.1.1.2    mrg         (match_dup 2))
   2478   1.1.1.2    mrg    (set (reg:SI 22)
   2479   1.1.1.2    mrg         (mult:SI (sign_extend:SI (reg:HI 26))
   2480   1.1.1.2    mrg                  (reg:SI 18)))
   2481   1.1.1.2    mrg    (set (match_dup 0)
   2482   1.1.1.2    mrg         (reg:SI 22))]
   2483   1.1.1.2    mrg   {
   2484   1.1.1.2    mrg     /* Do the QI -> HI extension explicitely before the multiplication.  */
   2485   1.1.1.2    mrg     /* Do the HI -> SI extension implicitely and after the multiplication.  */
   2486       1.1    mrg 
   2487   1.1.1.2    mrg     if (QImode == <MODE>mode)
   2488   1.1.1.2    mrg       operands[1] = gen_rtx_SIGN_EXTEND (HImode, operands[1]);
   2489       1.1    mrg 
   2490   1.1.1.2    mrg     if (u16_operand (operands[2], SImode)
   2491   1.1.1.2    mrg         || s16_operand (operands[2], SImode))
   2492   1.1.1.2    mrg       {
   2493   1.1.1.2    mrg         rtx xop2 = force_reg (HImode, gen_int_mode (INTVAL (operands[2]), HImode));
   2494       1.1    mrg 
   2495   1.1.1.2    mrg         operands[1] = force_reg (HImode, operands[1]);
   2496       1.1    mrg 
   2497   1.1.1.2    mrg         if (u16_operand (operands[2], SImode))
   2498   1.1.1.2    mrg           emit_insn (gen_usmulhisi3 (operands[0], xop2, operands[1]));
   2499   1.1.1.2    mrg         else
   2500   1.1.1.2    mrg           emit_insn (gen_mulhisi3 (operands[0], operands[1], xop2));
   2501       1.1    mrg 
   2502   1.1.1.2    mrg         DONE;
   2503   1.1.1.2    mrg       }
   2504   1.1.1.2    mrg   })
   2505       1.1    mrg 
   2506   1.1.1.2    mrg ;; One-extend operand 1
   2507       1.1    mrg 
   2508   1.1.1.6    mrg (define_expand "mulohisi3"
   2509   1.1.1.6    mrg   [(parallel [(set (match_operand:SI 0 "pseudo_register_operand" "")
   2510   1.1.1.6    mrg                    (mult:SI (not:SI (zero_extend:SI
   2511   1.1.1.6    mrg                                      (not:HI (match_operand:HI 1 "pseudo_register_operand" ""))))
   2512   1.1.1.6    mrg                             (match_operand:SI 2 "pseudo_register_or_const_int_operand" "")))
   2513   1.1.1.6    mrg               (clobber (reg:HI 26))
   2514   1.1.1.6    mrg               (clobber (reg:DI 18))])]
   2515   1.1.1.6    mrg   "AVR_HAVE_MUL"
   2516   1.1.1.6    mrg   {
   2517   1.1.1.6    mrg     avr_fix_inputs (operands, (1 << 1) | (1 << 2), -1u);
   2518   1.1.1.6    mrg     if (avr_emit3_fix_outputs (gen_mulohisi3, operands, 1 << 0,
   2519   1.1.1.6    mrg                                regmask (DImode, 18) | regmask (HImode, 26)))
   2520   1.1.1.6    mrg       DONE;
   2521   1.1.1.6    mrg   })
   2522   1.1.1.6    mrg 
   2523   1.1.1.6    mrg (define_insn_and_split "*mulohisi3"
   2524   1.1.1.2    mrg   [(set (match_operand:SI 0 "pseudo_register_operand"                          "=r")
   2525   1.1.1.2    mrg         (mult:SI (not:SI (zero_extend:SI
   2526   1.1.1.2    mrg                           (not:HI (match_operand:HI 1 "pseudo_register_operand" "r"))))
   2527   1.1.1.2    mrg                  (match_operand:SI 2 "pseudo_register_or_const_int_operand"     "rn")))
   2528   1.1.1.2    mrg    (clobber (reg:HI 26))
   2529   1.1.1.2    mrg    (clobber (reg:DI 18))]
   2530   1.1.1.2    mrg   "AVR_HAVE_MUL && !reload_completed"
   2531   1.1.1.2    mrg   { gcc_unreachable(); }
   2532   1.1.1.2    mrg   "&& 1"
   2533   1.1.1.2    mrg   [(set (reg:HI 26)
   2534   1.1.1.2    mrg         (match_dup 1))
   2535   1.1.1.2    mrg    (set (reg:SI 18)
   2536   1.1.1.2    mrg         (match_dup 2))
   2537   1.1.1.2    mrg    (set (reg:SI 22)
   2538   1.1.1.2    mrg         (mult:SI (not:SI (zero_extend:SI (not:HI (reg:HI 26))))
   2539   1.1.1.2    mrg                  (reg:SI 18)))
   2540   1.1.1.2    mrg    (set (match_dup 0)
   2541   1.1.1.2    mrg         (reg:SI 22))])
   2542       1.1    mrg 
   2543   1.1.1.2    mrg ;; "mulhisi3"
   2544   1.1.1.2    mrg ;; "umulhisi3"
   2545   1.1.1.2    mrg (define_expand "<extend_u>mulhisi3"
   2546   1.1.1.2    mrg   [(parallel [(set (match_operand:SI 0 "register_operand" "")
   2547   1.1.1.2    mrg                    (mult:SI (any_extend:SI (match_operand:HI 1 "register_operand" ""))
   2548   1.1.1.2    mrg                             (any_extend:SI (match_operand:HI 2 "register_operand" ""))))
   2549   1.1.1.2    mrg               (clobber (reg:HI 26))
   2550   1.1.1.2    mrg               (clobber (reg:DI 18))])]
   2551   1.1.1.6    mrg   "AVR_HAVE_MUL"
   2552   1.1.1.6    mrg   {
   2553   1.1.1.6    mrg     if (avr_emit3_fix_outputs (gen_<extend_u>mulhisi3, operands, 1 << 0,
   2554   1.1.1.6    mrg                                regmask (DImode, 18) | regmask (HImode, 26)))
   2555   1.1.1.6    mrg       DONE;
   2556   1.1.1.6    mrg   })
   2557   1.1.1.2    mrg 
   2558   1.1.1.2    mrg (define_expand "usmulhisi3"
   2559   1.1.1.2    mrg   [(parallel [(set (match_operand:SI 0 "register_operand" "")
   2560   1.1.1.2    mrg                    (mult:SI (zero_extend:SI (match_operand:HI 1 "register_operand" ""))
   2561   1.1.1.2    mrg                             (sign_extend:SI (match_operand:HI 2 "register_operand" ""))))
   2562   1.1.1.2    mrg               (clobber (reg:HI 26))
   2563   1.1.1.2    mrg               (clobber (reg:DI 18))])]
   2564   1.1.1.6    mrg   "AVR_HAVE_MUL"
   2565   1.1.1.6    mrg   {
   2566   1.1.1.6    mrg     if (avr_emit3_fix_outputs (gen_usmulhisi3, operands, 1 << 0,
   2567   1.1.1.6    mrg                                regmask (DImode, 18) | regmask (HImode, 26)))
   2568   1.1.1.6    mrg       DONE;
   2569   1.1.1.6    mrg   })
   2570   1.1.1.2    mrg 
   2571   1.1.1.2    mrg ;; "*uumulqihisi3" "*uumulhiqisi3" "*uumulhihisi3" "*uumulqiqisi3"
   2572   1.1.1.2    mrg ;; "*usmulqihisi3" "*usmulhiqisi3" "*usmulhihisi3" "*usmulqiqisi3"
   2573   1.1.1.2    mrg ;; "*sumulqihisi3" "*sumulhiqisi3" "*sumulhihisi3" "*sumulqiqisi3"
   2574   1.1.1.2    mrg ;; "*ssmulqihisi3" "*ssmulhiqisi3" "*ssmulhihisi3" "*ssmulqiqisi3"
   2575   1.1.1.2    mrg (define_insn_and_split
   2576   1.1.1.2    mrg   "*<any_extend:extend_su><any_extend2:extend_su>mul<QIHI:mode><QIHI2:mode>si3"
   2577   1.1.1.2    mrg   [(set (match_operand:SI 0 "pseudo_register_operand"                            "=r")
   2578   1.1.1.2    mrg         (mult:SI (any_extend:SI (match_operand:QIHI 1 "pseudo_register_operand"   "r"))
   2579   1.1.1.2    mrg                  (any_extend2:SI (match_operand:QIHI2 2 "pseudo_register_operand" "r"))))
   2580   1.1.1.2    mrg    (clobber (reg:HI 26))
   2581   1.1.1.2    mrg    (clobber (reg:DI 18))]
   2582   1.1.1.2    mrg   "AVR_HAVE_MUL && !reload_completed"
   2583   1.1.1.2    mrg   { gcc_unreachable(); }
   2584   1.1.1.2    mrg   "&& 1"
   2585   1.1.1.2    mrg   [(set (reg:HI 18)
   2586   1.1.1.2    mrg         (match_dup 1))
   2587   1.1.1.2    mrg    (set (reg:HI 26)
   2588   1.1.1.2    mrg         (match_dup 2))
   2589   1.1.1.2    mrg    (set (reg:SI 22)
   2590   1.1.1.2    mrg         (mult:SI (match_dup 3)
   2591   1.1.1.2    mrg                  (match_dup 4)))
   2592   1.1.1.2    mrg    (set (match_dup 0)
   2593   1.1.1.2    mrg         (reg:SI 22))]
   2594   1.1.1.2    mrg   {
   2595   1.1.1.2    mrg     rtx xop1 = operands[1];
   2596   1.1.1.2    mrg     rtx xop2 = operands[2];
   2597   1.1.1.2    mrg 
   2598   1.1.1.2    mrg     /* Do the QI -> HI extension explicitely before the multiplication.  */
   2599   1.1.1.2    mrg     /* Do the HI -> SI extension implicitely and after the multiplication.  */
   2600   1.1.1.2    mrg 
   2601   1.1.1.2    mrg     if (QImode == <QIHI:MODE>mode)
   2602   1.1.1.2    mrg       xop1 = gen_rtx_fmt_e (<any_extend:CODE>, HImode, xop1);
   2603   1.1.1.2    mrg 
   2604   1.1.1.2    mrg     if (QImode == <QIHI2:MODE>mode)
   2605   1.1.1.2    mrg       xop2 = gen_rtx_fmt_e (<any_extend2:CODE>, HImode, xop2);
   2606   1.1.1.2    mrg 
   2607   1.1.1.2    mrg     if (<any_extend:CODE> == <any_extend2:CODE>
   2608   1.1.1.2    mrg         || <any_extend:CODE> == ZERO_EXTEND)
   2609   1.1.1.2    mrg       {
   2610   1.1.1.2    mrg         operands[1] = xop1;
   2611   1.1.1.2    mrg         operands[2] = xop2;
   2612   1.1.1.2    mrg         operands[3] = gen_rtx_fmt_e (<any_extend:CODE>, SImode, gen_rtx_REG (HImode, 18));
   2613   1.1.1.2    mrg         operands[4] = gen_rtx_fmt_e (<any_extend2:CODE>, SImode, gen_rtx_REG (HImode, 26));
   2614   1.1.1.2    mrg       }
   2615   1.1.1.2    mrg     else
   2616   1.1.1.2    mrg       {
   2617   1.1.1.2    mrg         /* <any_extend:CODE>  = SIGN_EXTEND */
   2618   1.1.1.2    mrg         /* <any_extend2:CODE> = ZERO_EXTEND */
   2619   1.1.1.2    mrg 
   2620   1.1.1.2    mrg         operands[1] = xop2;
   2621   1.1.1.2    mrg         operands[2] = xop1;
   2622   1.1.1.2    mrg         operands[3] = gen_rtx_ZERO_EXTEND (SImode, gen_rtx_REG (HImode, 18));
   2623   1.1.1.2    mrg         operands[4] = gen_rtx_SIGN_EXTEND (SImode, gen_rtx_REG (HImode, 26));
   2624   1.1.1.2    mrg       }
   2625   1.1.1.2    mrg   })
   2626   1.1.1.2    mrg 
   2627   1.1.1.2    mrg ;; "smulhi3_highpart"
   2628   1.1.1.2    mrg ;; "umulhi3_highpart"
   2629   1.1.1.2    mrg (define_expand "<extend_su>mulhi3_highpart"
   2630   1.1.1.2    mrg   [(set (reg:HI 18)
   2631   1.1.1.2    mrg         (match_operand:HI 1 "nonmemory_operand" ""))
   2632   1.1.1.2    mrg    (set (reg:HI 26)
   2633   1.1.1.2    mrg         (match_operand:HI 2 "nonmemory_operand" ""))
   2634   1.1.1.2    mrg    (parallel [(set (reg:HI 24)
   2635   1.1.1.2    mrg                    (truncate:HI (lshiftrt:SI (mult:SI (any_extend:SI (reg:HI 18))
   2636   1.1.1.2    mrg                                                       (any_extend:SI (reg:HI 26)))
   2637   1.1.1.2    mrg                                              (const_int 16))))
   2638   1.1.1.2    mrg               (clobber (reg:HI 22))])
   2639       1.1    mrg    (set (match_operand:HI 0 "register_operand" "")
   2640   1.1.1.2    mrg         (reg:HI 24))]
   2641   1.1.1.6    mrg   "AVR_HAVE_MUL"
   2642   1.1.1.6    mrg   {
   2643   1.1.1.6    mrg     avr_fix_inputs (operands, 1 << 2, regmask (HImode, 18));
   2644   1.1.1.6    mrg   })
   2645       1.1    mrg 
   2646       1.1    mrg 
   2647   1.1.1.2    mrg (define_insn "*mulsi3_call"
   2648   1.1.1.2    mrg   [(set (reg:SI 22)
   2649   1.1.1.2    mrg         (mult:SI (reg:SI 22)
   2650   1.1.1.2    mrg                  (reg:SI 18)))
   2651   1.1.1.2    mrg    (clobber (reg:HI 26))]
   2652   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2653   1.1.1.2    mrg   "%~call __mulsi3"
   2654   1.1.1.2    mrg   [(set_attr "type" "xcall")
   2655   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2656       1.1    mrg 
   2657   1.1.1.2    mrg ;; "*mulhisi3_call"
   2658   1.1.1.2    mrg ;; "*umulhisi3_call"
   2659   1.1.1.2    mrg (define_insn "*<extend_u>mulhisi3_call"
   2660   1.1.1.2    mrg   [(set (reg:SI 22)
   2661   1.1.1.2    mrg         (mult:SI (any_extend:SI (reg:HI 18))
   2662   1.1.1.2    mrg                  (any_extend:SI (reg:HI 26))))]
   2663   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2664   1.1.1.2    mrg   "%~call __<extend_u>mulhisi3"
   2665   1.1.1.2    mrg   [(set_attr "type" "xcall")
   2666   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2667       1.1    mrg 
   2668   1.1.1.2    mrg ;; "*umulhi3_highpart_call"
   2669   1.1.1.2    mrg ;; "*smulhi3_highpart_call"
   2670   1.1.1.2    mrg (define_insn "*<extend_su>mulhi3_highpart_call"
   2671   1.1.1.2    mrg   [(set (reg:HI 24)
   2672   1.1.1.2    mrg         (truncate:HI (lshiftrt:SI (mult:SI (any_extend:SI (reg:HI 18))
   2673   1.1.1.2    mrg                                            (any_extend:SI (reg:HI 26)))
   2674   1.1.1.2    mrg                                   (const_int 16))))
   2675   1.1.1.2    mrg    (clobber (reg:HI 22))]
   2676   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2677   1.1.1.2    mrg   "%~call __<extend_u>mulhisi3"
   2678   1.1.1.2    mrg   [(set_attr "type" "xcall")
   2679   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2680       1.1    mrg 
   2681   1.1.1.2    mrg (define_insn "*usmulhisi3_call"
   2682   1.1.1.2    mrg   [(set (reg:SI 22)
   2683   1.1.1.2    mrg         (mult:SI (zero_extend:SI (reg:HI 18))
   2684   1.1.1.2    mrg                  (sign_extend:SI (reg:HI 26))))]
   2685   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2686   1.1.1.2    mrg   "%~call __usmulhisi3"
   2687   1.1.1.2    mrg   [(set_attr "type" "xcall")
   2688       1.1    mrg    (set_attr "cc" "clobber")])
   2689       1.1    mrg 
   2690   1.1.1.2    mrg (define_insn "*mul<extend_su>hisi3_call"
   2691   1.1.1.2    mrg   [(set (reg:SI 22)
   2692   1.1.1.2    mrg         (mult:SI (any_extend:SI (reg:HI 26))
   2693   1.1.1.2    mrg                  (reg:SI 18)))]
   2694   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2695   1.1.1.2    mrg   "%~call __mul<extend_su>hisi3"
   2696   1.1.1.2    mrg   [(set_attr "type" "xcall")
   2697   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2698       1.1    mrg 
   2699   1.1.1.2    mrg (define_insn "*mulohisi3_call"
   2700   1.1.1.2    mrg   [(set (reg:SI 22)
   2701   1.1.1.2    mrg         (mult:SI (not:SI (zero_extend:SI (not:HI (reg:HI 26))))
   2702   1.1.1.2    mrg                  (reg:SI 18)))]
   2703   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2704   1.1.1.2    mrg   "%~call __mulohisi3"
   2705   1.1.1.2    mrg   [(set_attr "type" "xcall")
   2706   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2707       1.1    mrg 
   2708   1.1.1.2    mrg ; / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / %
   2709   1.1.1.2    mrg ; divmod
   2710       1.1    mrg 
   2711   1.1.1.2    mrg ;; Generate lib1funcs.S calls ourselves, because:
   2712   1.1.1.2    mrg ;;  - we know exactly which registers are clobbered (for QI and HI
   2713   1.1.1.2    mrg ;;    modes, some of the call-used registers are preserved)
   2714   1.1.1.2    mrg ;;  - we get both the quotient and the remainder at no extra cost
   2715   1.1.1.2    mrg ;;  - we split the patterns only after the first CSE passes because
   2716   1.1.1.2    mrg ;;    CSE has problems to operate on hard regs.
   2717   1.1.1.2    mrg ;;
   2718   1.1.1.2    mrg (define_insn_and_split "divmodqi4"
   2719   1.1.1.2    mrg   [(parallel [(set (match_operand:QI 0 "pseudo_register_operand" "")
   2720   1.1.1.2    mrg                    (div:QI (match_operand:QI 1 "pseudo_register_operand" "")
   2721   1.1.1.2    mrg                            (match_operand:QI 2 "pseudo_register_operand" "")))
   2722   1.1.1.2    mrg               (set (match_operand:QI 3 "pseudo_register_operand" "")
   2723   1.1.1.2    mrg                    (mod:QI (match_dup 1) (match_dup 2)))
   2724   1.1.1.2    mrg               (clobber (reg:QI 22))
   2725   1.1.1.2    mrg               (clobber (reg:QI 23))
   2726   1.1.1.2    mrg               (clobber (reg:QI 24))
   2727   1.1.1.2    mrg               (clobber (reg:QI 25))])]
   2728       1.1    mrg   ""
   2729   1.1.1.2    mrg   "this divmodqi4 pattern should have been splitted;"
   2730       1.1    mrg   ""
   2731   1.1.1.2    mrg   [(set (reg:QI 24) (match_dup 1))
   2732   1.1.1.2    mrg    (set (reg:QI 22) (match_dup 2))
   2733   1.1.1.2    mrg    (parallel [(set (reg:QI 24) (div:QI (reg:QI 24) (reg:QI 22)))
   2734   1.1.1.2    mrg               (set (reg:QI 25) (mod:QI (reg:QI 24) (reg:QI 22)))
   2735   1.1.1.2    mrg               (clobber (reg:QI 22))
   2736   1.1.1.2    mrg               (clobber (reg:QI 23))])
   2737   1.1.1.2    mrg    (set (match_dup 0) (reg:QI 24))
   2738   1.1.1.2    mrg    (set (match_dup 3) (reg:QI 25))])
   2739       1.1    mrg 
   2740   1.1.1.2    mrg (define_insn "*divmodqi4_call"
   2741   1.1.1.2    mrg   [(set (reg:QI 24) (div:QI (reg:QI 24) (reg:QI 22)))
   2742   1.1.1.2    mrg    (set (reg:QI 25) (mod:QI (reg:QI 24) (reg:QI 22)))
   2743   1.1.1.2    mrg    (clobber (reg:QI 22))
   2744   1.1.1.2    mrg    (clobber (reg:QI 23))]
   2745       1.1    mrg   ""
   2746   1.1.1.2    mrg   "%~call __divmodqi4"
   2747   1.1.1.2    mrg   [(set_attr "type" "xcall")
   2748   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2749       1.1    mrg 
   2750   1.1.1.2    mrg (define_insn_and_split "udivmodqi4"
   2751   1.1.1.2    mrg  [(parallel [(set (match_operand:QI 0 "pseudo_register_operand" "")
   2752   1.1.1.2    mrg                   (udiv:QI (match_operand:QI 1 "pseudo_register_operand" "")
   2753   1.1.1.2    mrg                            (match_operand:QI 2 "pseudo_register_operand" "")))
   2754   1.1.1.2    mrg              (set (match_operand:QI 3 "pseudo_register_operand" "")
   2755   1.1.1.2    mrg                   (umod:QI (match_dup 1) (match_dup 2)))
   2756   1.1.1.2    mrg              (clobber (reg:QI 22))
   2757   1.1.1.2    mrg              (clobber (reg:QI 23))
   2758   1.1.1.2    mrg              (clobber (reg:QI 24))
   2759   1.1.1.2    mrg              (clobber (reg:QI 25))])]
   2760       1.1    mrg   ""
   2761   1.1.1.2    mrg   "this udivmodqi4 pattern should have been splitted;"
   2762       1.1    mrg   ""
   2763   1.1.1.2    mrg   [(set (reg:QI 24) (match_dup 1))
   2764   1.1.1.2    mrg    (set (reg:QI 22) (match_dup 2))
   2765   1.1.1.2    mrg    (parallel [(set (reg:QI 24) (udiv:QI (reg:QI 24) (reg:QI 22)))
   2766   1.1.1.2    mrg               (set (reg:QI 25) (umod:QI (reg:QI 24) (reg:QI 22)))
   2767   1.1.1.2    mrg               (clobber (reg:QI 23))])
   2768   1.1.1.2    mrg    (set (match_dup 0) (reg:QI 24))
   2769   1.1.1.2    mrg    (set (match_dup 3) (reg:QI 25))])
   2770   1.1.1.2    mrg 
   2771   1.1.1.2    mrg (define_insn "*udivmodqi4_call"
   2772   1.1.1.2    mrg   [(set (reg:QI 24) (udiv:QI (reg:QI 24) (reg:QI 22)))
   2773   1.1.1.2    mrg    (set (reg:QI 25) (umod:QI (reg:QI 24) (reg:QI 22)))
   2774   1.1.1.2    mrg    (clobber (reg:QI 23))]
   2775   1.1.1.2    mrg   ""
   2776   1.1.1.2    mrg   "%~call __udivmodqi4"
   2777   1.1.1.2    mrg   [(set_attr "type" "xcall")
   2778   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2779   1.1.1.2    mrg 
   2780   1.1.1.2    mrg (define_insn_and_split "divmodhi4"
   2781   1.1.1.2    mrg   [(parallel [(set (match_operand:HI 0 "pseudo_register_operand" "")
   2782   1.1.1.2    mrg                    (div:HI (match_operand:HI 1 "pseudo_register_operand" "")
   2783   1.1.1.2    mrg                            (match_operand:HI 2 "pseudo_register_operand" "")))
   2784   1.1.1.2    mrg               (set (match_operand:HI 3 "pseudo_register_operand" "")
   2785   1.1.1.2    mrg                    (mod:HI (match_dup 1) (match_dup 2)))
   2786   1.1.1.2    mrg               (clobber (reg:QI 21))
   2787   1.1.1.2    mrg               (clobber (reg:HI 22))
   2788   1.1.1.2    mrg               (clobber (reg:HI 24))
   2789   1.1.1.2    mrg               (clobber (reg:HI 26))])]
   2790   1.1.1.2    mrg   ""
   2791   1.1.1.2    mrg   "this should have been splitted;"
   2792   1.1.1.2    mrg   ""
   2793   1.1.1.2    mrg   [(set (reg:HI 24) (match_dup 1))
   2794   1.1.1.2    mrg    (set (reg:HI 22) (match_dup 2))
   2795   1.1.1.2    mrg    (parallel [(set (reg:HI 22) (div:HI (reg:HI 24) (reg:HI 22)))
   2796   1.1.1.2    mrg               (set (reg:HI 24) (mod:HI (reg:HI 24) (reg:HI 22)))
   2797   1.1.1.2    mrg               (clobber (reg:HI 26))
   2798   1.1.1.2    mrg               (clobber (reg:QI 21))])
   2799   1.1.1.2    mrg    (set (match_dup 0) (reg:HI 22))
   2800   1.1.1.2    mrg    (set (match_dup 3) (reg:HI 24))])
   2801   1.1.1.2    mrg 
   2802   1.1.1.2    mrg (define_insn "*divmodhi4_call"
   2803   1.1.1.2    mrg   [(set (reg:HI 22) (div:HI (reg:HI 24) (reg:HI 22)))
   2804   1.1.1.2    mrg    (set (reg:HI 24) (mod:HI (reg:HI 24) (reg:HI 22)))
   2805   1.1.1.2    mrg    (clobber (reg:HI 26))
   2806   1.1.1.2    mrg    (clobber (reg:QI 21))]
   2807   1.1.1.2    mrg   ""
   2808   1.1.1.2    mrg   "%~call __divmodhi4"
   2809   1.1.1.2    mrg   [(set_attr "type" "xcall")
   2810   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2811   1.1.1.2    mrg 
   2812   1.1.1.2    mrg (define_insn_and_split "udivmodhi4"
   2813   1.1.1.2    mrg   [(parallel [(set (match_operand:HI 0 "pseudo_register_operand" "")
   2814   1.1.1.2    mrg                    (udiv:HI (match_operand:HI 1 "pseudo_register_operand" "")
   2815   1.1.1.2    mrg                             (match_operand:HI 2 "pseudo_register_operand" "")))
   2816   1.1.1.2    mrg               (set (match_operand:HI 3 "pseudo_register_operand" "")
   2817   1.1.1.2    mrg                    (umod:HI (match_dup 1) (match_dup 2)))
   2818   1.1.1.2    mrg               (clobber (reg:QI 21))
   2819   1.1.1.2    mrg               (clobber (reg:HI 22))
   2820   1.1.1.2    mrg               (clobber (reg:HI 24))
   2821   1.1.1.2    mrg               (clobber (reg:HI 26))])]
   2822   1.1.1.2    mrg   ""
   2823   1.1.1.2    mrg   "this udivmodhi4 pattern should have been splitted.;"
   2824   1.1.1.2    mrg   ""
   2825   1.1.1.2    mrg   [(set (reg:HI 24) (match_dup 1))
   2826   1.1.1.2    mrg    (set (reg:HI 22) (match_dup 2))
   2827   1.1.1.2    mrg    (parallel [(set (reg:HI 22) (udiv:HI (reg:HI 24) (reg:HI 22)))
   2828   1.1.1.2    mrg               (set (reg:HI 24) (umod:HI (reg:HI 24) (reg:HI 22)))
   2829   1.1.1.2    mrg               (clobber (reg:HI 26))
   2830   1.1.1.2    mrg               (clobber (reg:QI 21))])
   2831   1.1.1.2    mrg    (set (match_dup 0) (reg:HI 22))
   2832   1.1.1.2    mrg    (set (match_dup 3) (reg:HI 24))])
   2833   1.1.1.2    mrg 
   2834   1.1.1.2    mrg (define_insn "*udivmodhi4_call"
   2835   1.1.1.2    mrg   [(set (reg:HI 22) (udiv:HI (reg:HI 24) (reg:HI 22)))
   2836   1.1.1.2    mrg    (set (reg:HI 24) (umod:HI (reg:HI 24) (reg:HI 22)))
   2837   1.1.1.2    mrg    (clobber (reg:HI 26))
   2838   1.1.1.2    mrg    (clobber (reg:QI 21))]
   2839   1.1.1.2    mrg   ""
   2840   1.1.1.2    mrg   "%~call __udivmodhi4"
   2841   1.1.1.2    mrg   [(set_attr "type" "xcall")
   2842   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2843   1.1.1.2    mrg 
   2844   1.1.1.2    mrg ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   2845   1.1.1.2    mrg ;; 24-bit multiply
   2846   1.1.1.2    mrg 
   2847   1.1.1.2    mrg ;; To support widening multiplication with constant we postpone
   2848   1.1.1.2    mrg ;; expanding to the implicit library call until post combine and
   2849   1.1.1.2    mrg ;; prior to register allocation.  Clobber all hard registers that
   2850   1.1.1.2    mrg ;; might be used by the (widening) multiply until it is split and
   2851   1.1.1.2    mrg ;; it's final register footprint is worked out.
   2852   1.1.1.2    mrg 
   2853   1.1.1.2    mrg (define_expand "mulpsi3"
   2854   1.1.1.2    mrg   [(parallel [(set (match_operand:PSI 0 "register_operand" "")
   2855   1.1.1.2    mrg                    (mult:PSI (match_operand:PSI 1 "register_operand" "")
   2856   1.1.1.2    mrg                              (match_operand:PSI 2 "nonmemory_operand" "")))
   2857   1.1.1.2    mrg               (clobber (reg:HI 26))
   2858   1.1.1.2    mrg               (clobber (reg:DI 18))])]
   2859   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2860   1.1.1.2    mrg   {
   2861   1.1.1.2    mrg     if (s8_operand (operands[2], PSImode))
   2862   1.1.1.2    mrg       {
   2863   1.1.1.2    mrg         rtx reg = force_reg (QImode, gen_int_mode (INTVAL (operands[2]), QImode));
   2864   1.1.1.2    mrg         emit_insn (gen_mulsqipsi3 (operands[0], reg, operands[1]));
   2865   1.1.1.2    mrg         DONE;
   2866   1.1.1.2    mrg       }
   2867   1.1.1.6    mrg 
   2868   1.1.1.6    mrg     if (avr_emit3_fix_outputs (gen_mulpsi3, operands, 1u << 0,
   2869   1.1.1.6    mrg                                regmask (DImode, 18) | regmask (HImode, 26)))
   2870   1.1.1.6    mrg       DONE;
   2871   1.1.1.2    mrg   })
   2872   1.1.1.2    mrg 
   2873   1.1.1.2    mrg (define_insn "*umulqihipsi3"
   2874   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"                         "=&r")
   2875   1.1.1.2    mrg         (mult:PSI (zero_extend:PSI (match_operand:QI 1 "register_operand" "r"))
   2876   1.1.1.2    mrg                   (zero_extend:PSI (match_operand:HI 2 "register_operand" "r"))))]
   2877   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2878   1.1.1.2    mrg   "mul %1,%A2
   2879   1.1.1.2    mrg 	movw %A0,r0
   2880   1.1.1.2    mrg 	mul %1,%B2
   2881   1.1.1.2    mrg 	clr %C0
   2882   1.1.1.2    mrg 	add %B0,r0
   2883   1.1.1.2    mrg 	adc %C0,r1
   2884   1.1.1.2    mrg 	clr __zero_reg__"
   2885   1.1.1.2    mrg   [(set_attr "length" "7")
   2886   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2887   1.1.1.2    mrg 
   2888   1.1.1.2    mrg (define_insn "*umulhiqipsi3"
   2889   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"                         "=&r")
   2890   1.1.1.2    mrg         (mult:PSI (zero_extend:PSI (match_operand:HI 2 "register_operand" "r"))
   2891   1.1.1.2    mrg                   (zero_extend:PSI (match_operand:QI 1 "register_operand" "r"))))]
   2892   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2893   1.1.1.2    mrg   "mul %1,%A2
   2894   1.1.1.2    mrg 	movw %A0,r0
   2895   1.1.1.2    mrg 	mul %1,%B2
   2896   1.1.1.2    mrg 	add %B0,r0
   2897   1.1.1.2    mrg 	mov %C0,r1
   2898   1.1.1.2    mrg 	clr __zero_reg__
   2899   1.1.1.2    mrg 	adc %C0,__zero_reg__"
   2900   1.1.1.2    mrg   [(set_attr "length" "7")
   2901   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2902   1.1.1.2    mrg 
   2903   1.1.1.6    mrg (define_expand "mulsqipsi3"
   2904   1.1.1.6    mrg   [(parallel [(set (match_operand:PSI 0 "pseudo_register_operand" "")
   2905   1.1.1.6    mrg                    (mult:PSI (sign_extend:PSI (match_operand:QI 1 "pseudo_register_operand" ""))
   2906   1.1.1.6    mrg                              (match_operand:PSI 2 "pseudo_register_or_const_int_operand""")))
   2907   1.1.1.6    mrg               (clobber (reg:HI 26))
   2908   1.1.1.6    mrg               (clobber (reg:DI 18))])]
   2909   1.1.1.6    mrg   "AVR_HAVE_MUL"
   2910   1.1.1.6    mrg   {
   2911   1.1.1.6    mrg     avr_fix_inputs (operands, (1 << 1) | (1 << 2), -1u);
   2912   1.1.1.6    mrg     if (avr_emit3_fix_outputs (gen_mulsqipsi3, operands, 1 << 0,
   2913   1.1.1.6    mrg                                regmask (DImode, 18) | regmask (HImode, 26)))
   2914   1.1.1.6    mrg       DONE;
   2915   1.1.1.6    mrg   })
   2916   1.1.1.6    mrg 
   2917   1.1.1.6    mrg (define_insn_and_split "*mulsqipsi3"
   2918   1.1.1.2    mrg   [(set (match_operand:PSI 0 "pseudo_register_operand"                          "=r")
   2919   1.1.1.2    mrg         (mult:PSI (sign_extend:PSI (match_operand:QI 1 "pseudo_register_operand" "r"))
   2920   1.1.1.2    mrg                   (match_operand:PSI 2 "pseudo_register_or_const_int_operand"    "rn")))
   2921   1.1.1.2    mrg    (clobber (reg:HI 26))
   2922   1.1.1.2    mrg    (clobber (reg:DI 18))]
   2923   1.1.1.2    mrg   "AVR_HAVE_MUL && !reload_completed"
   2924   1.1.1.2    mrg   { gcc_unreachable(); }
   2925   1.1.1.2    mrg   "&& 1"
   2926   1.1.1.2    mrg   [(set (reg:QI 25)
   2927   1.1.1.2    mrg         (match_dup 1))
   2928   1.1.1.2    mrg    (set (reg:PSI 22)
   2929   1.1.1.2    mrg         (match_dup 2))
   2930   1.1.1.2    mrg    (set (reg:PSI 18)
   2931   1.1.1.2    mrg         (mult:PSI (sign_extend:PSI (reg:QI 25))
   2932   1.1.1.2    mrg                   (reg:PSI 22)))
   2933   1.1.1.2    mrg    (set (match_dup 0)
   2934   1.1.1.2    mrg         (reg:PSI 18))])
   2935   1.1.1.2    mrg 
   2936   1.1.1.2    mrg (define_insn_and_split "*mulpsi3"
   2937   1.1.1.2    mrg   [(set (match_operand:PSI 0 "pseudo_register_operand"                       "=r")
   2938   1.1.1.2    mrg         (mult:PSI (match_operand:PSI 1 "pseudo_register_operand"              "r")
   2939   1.1.1.2    mrg                   (match_operand:PSI 2 "pseudo_register_or_const_int_operand" "rn")))
   2940   1.1.1.2    mrg    (clobber (reg:HI 26))
   2941   1.1.1.2    mrg    (clobber (reg:DI 18))]
   2942   1.1.1.2    mrg   "AVR_HAVE_MUL && !reload_completed"
   2943   1.1.1.2    mrg   { gcc_unreachable(); }
   2944   1.1.1.2    mrg   "&& 1"
   2945   1.1.1.2    mrg   [(set (reg:PSI 18)
   2946   1.1.1.2    mrg         (match_dup 1))
   2947   1.1.1.2    mrg    (set (reg:PSI 22)
   2948   1.1.1.2    mrg         (match_dup 2))
   2949   1.1.1.2    mrg    (parallel [(set (reg:PSI 22)
   2950   1.1.1.2    mrg                    (mult:PSI (reg:PSI 22)
   2951   1.1.1.2    mrg                              (reg:PSI 18)))
   2952   1.1.1.2    mrg               (clobber (reg:QI 21))
   2953   1.1.1.2    mrg               (clobber (reg:QI 25))
   2954   1.1.1.2    mrg               (clobber (reg:HI 26))])
   2955   1.1.1.2    mrg    (set (match_dup 0)
   2956   1.1.1.2    mrg         (reg:PSI 22))]
   2957   1.1.1.2    mrg   {
   2958   1.1.1.2    mrg     if (s8_operand (operands[2], PSImode))
   2959   1.1.1.2    mrg       {
   2960   1.1.1.2    mrg         rtx reg = force_reg (QImode, gen_int_mode (INTVAL (operands[2]), QImode));
   2961   1.1.1.2    mrg         emit_insn (gen_mulsqipsi3 (operands[0], reg, operands[1]));
   2962   1.1.1.2    mrg         DONE;
   2963   1.1.1.2    mrg       }
   2964   1.1.1.2    mrg   })
   2965   1.1.1.2    mrg 
   2966   1.1.1.2    mrg (define_insn "*mulsqipsi3.libgcc"
   2967   1.1.1.2    mrg   [(set (reg:PSI 18)
   2968   1.1.1.2    mrg         (mult:PSI (sign_extend:PSI (reg:QI 25))
   2969   1.1.1.2    mrg                   (reg:PSI 22)))]
   2970   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2971   1.1.1.2    mrg   "%~call __mulsqipsi3"
   2972   1.1.1.2    mrg   [(set_attr "type" "xcall")
   2973   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2974   1.1.1.2    mrg 
   2975   1.1.1.2    mrg (define_insn "*mulpsi3.libgcc"
   2976   1.1.1.2    mrg   [(set (reg:PSI 22)
   2977   1.1.1.2    mrg         (mult:PSI (reg:PSI 22)
   2978   1.1.1.2    mrg                   (reg:PSI 18)))
   2979   1.1.1.2    mrg    (clobber (reg:QI 21))
   2980   1.1.1.2    mrg    (clobber (reg:QI 25))
   2981   1.1.1.2    mrg    (clobber (reg:HI 26))]
   2982   1.1.1.2    mrg   "AVR_HAVE_MUL"
   2983   1.1.1.2    mrg   "%~call __mulpsi3"
   2984   1.1.1.2    mrg   [(set_attr "type" "xcall")
   2985   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   2986   1.1.1.2    mrg 
   2987   1.1.1.2    mrg 
   2988   1.1.1.2    mrg ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   2989   1.1.1.2    mrg ;; 24-bit signed/unsigned division and modulo.
   2990   1.1.1.2    mrg ;; Notice that the libgcc implementation return the quotient in R22
   2991   1.1.1.2    mrg ;; and the remainder in R18 whereas the 32-bit [u]divmodsi4
   2992   1.1.1.2    mrg ;; implementation works the other way round.
   2993   1.1.1.2    mrg 
   2994   1.1.1.2    mrg (define_insn_and_split "divmodpsi4"
   2995   1.1.1.2    mrg   [(parallel [(set (match_operand:PSI 0 "pseudo_register_operand" "")
   2996   1.1.1.2    mrg                    (div:PSI (match_operand:PSI 1 "pseudo_register_operand" "")
   2997   1.1.1.2    mrg                             (match_operand:PSI 2 "pseudo_register_operand" "")))
   2998   1.1.1.2    mrg               (set (match_operand:PSI 3 "pseudo_register_operand" "")
   2999   1.1.1.2    mrg                    (mod:PSI (match_dup 1)
   3000   1.1.1.2    mrg                             (match_dup 2)))
   3001   1.1.1.2    mrg               (clobber (reg:DI 18))
   3002   1.1.1.2    mrg               (clobber (reg:QI 26))])]
   3003   1.1.1.2    mrg   ""
   3004   1.1.1.2    mrg   { gcc_unreachable(); }
   3005   1.1.1.2    mrg   ""
   3006   1.1.1.2    mrg   [(set (reg:PSI 22) (match_dup 1))
   3007   1.1.1.2    mrg    (set (reg:PSI 18) (match_dup 2))
   3008   1.1.1.2    mrg    (parallel [(set (reg:PSI 22) (div:PSI (reg:PSI 22) (reg:PSI 18)))
   3009   1.1.1.2    mrg               (set (reg:PSI 18) (mod:PSI (reg:PSI 22) (reg:PSI 18)))
   3010   1.1.1.2    mrg               (clobber (reg:QI 21))
   3011   1.1.1.2    mrg               (clobber (reg:QI 25))
   3012   1.1.1.2    mrg               (clobber (reg:QI 26))])
   3013   1.1.1.2    mrg    (set (match_dup 0) (reg:PSI 22))
   3014   1.1.1.2    mrg    (set (match_dup 3) (reg:PSI 18))])
   3015   1.1.1.2    mrg 
   3016   1.1.1.2    mrg (define_insn "*divmodpsi4_call"
   3017   1.1.1.2    mrg   [(set (reg:PSI 22) (div:PSI (reg:PSI 22) (reg:PSI 18)))
   3018   1.1.1.2    mrg    (set (reg:PSI 18) (mod:PSI (reg:PSI 22) (reg:PSI 18)))
   3019   1.1.1.2    mrg    (clobber (reg:QI 21))
   3020   1.1.1.2    mrg    (clobber (reg:QI 25))
   3021   1.1.1.2    mrg    (clobber (reg:QI 26))]
   3022   1.1.1.2    mrg   ""
   3023   1.1.1.2    mrg   "%~call __divmodpsi4"
   3024   1.1.1.2    mrg   [(set_attr "type" "xcall")
   3025   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   3026   1.1.1.2    mrg 
   3027   1.1.1.2    mrg (define_insn_and_split "udivmodpsi4"
   3028   1.1.1.2    mrg   [(parallel [(set (match_operand:PSI 0 "pseudo_register_operand" "")
   3029   1.1.1.2    mrg                    (udiv:PSI (match_operand:PSI 1 "pseudo_register_operand" "")
   3030   1.1.1.2    mrg                              (match_operand:PSI 2 "pseudo_register_operand" "")))
   3031   1.1.1.2    mrg               (set (match_operand:PSI 3 "pseudo_register_operand" "")
   3032   1.1.1.2    mrg                    (umod:PSI (match_dup 1)
   3033   1.1.1.2    mrg                              (match_dup 2)))
   3034   1.1.1.2    mrg               (clobber (reg:DI 18))
   3035   1.1.1.2    mrg               (clobber (reg:QI 26))])]
   3036   1.1.1.2    mrg   ""
   3037   1.1.1.2    mrg   { gcc_unreachable(); }
   3038   1.1.1.2    mrg   ""
   3039   1.1.1.2    mrg   [(set (reg:PSI 22) (match_dup 1))
   3040   1.1.1.2    mrg    (set (reg:PSI 18) (match_dup 2))
   3041   1.1.1.2    mrg    (parallel [(set (reg:PSI 22) (udiv:PSI (reg:PSI 22) (reg:PSI 18)))
   3042   1.1.1.2    mrg               (set (reg:PSI 18) (umod:PSI (reg:PSI 22) (reg:PSI 18)))
   3043   1.1.1.2    mrg               (clobber (reg:QI 21))
   3044   1.1.1.2    mrg               (clobber (reg:QI 25))
   3045   1.1.1.2    mrg               (clobber (reg:QI 26))])
   3046   1.1.1.2    mrg    (set (match_dup 0) (reg:PSI 22))
   3047   1.1.1.2    mrg    (set (match_dup 3) (reg:PSI 18))])
   3048   1.1.1.2    mrg 
   3049   1.1.1.2    mrg (define_insn "*udivmodpsi4_call"
   3050   1.1.1.2    mrg   [(set (reg:PSI 22) (udiv:PSI (reg:PSI 22) (reg:PSI 18)))
   3051   1.1.1.2    mrg    (set (reg:PSI 18) (umod:PSI (reg:PSI 22) (reg:PSI 18)))
   3052   1.1.1.2    mrg    (clobber (reg:QI 21))
   3053   1.1.1.2    mrg    (clobber (reg:QI 25))
   3054   1.1.1.2    mrg    (clobber (reg:QI 26))]
   3055   1.1.1.2    mrg   ""
   3056   1.1.1.2    mrg   "%~call __udivmodpsi4"
   3057   1.1.1.2    mrg   [(set_attr "type" "xcall")
   3058   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   3059   1.1.1.2    mrg 
   3060   1.1.1.2    mrg ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   3061   1.1.1.2    mrg 
   3062   1.1.1.2    mrg (define_insn_and_split "divmodsi4"
   3063   1.1.1.2    mrg   [(parallel [(set (match_operand:SI 0 "pseudo_register_operand" "")
   3064   1.1.1.2    mrg                    (div:SI (match_operand:SI 1 "pseudo_register_operand" "")
   3065   1.1.1.2    mrg                            (match_operand:SI 2 "pseudo_register_operand" "")))
   3066   1.1.1.2    mrg               (set (match_operand:SI 3 "pseudo_register_operand" "")
   3067   1.1.1.2    mrg                    (mod:SI (match_dup 1) (match_dup 2)))
   3068   1.1.1.2    mrg               (clobber (reg:SI 18))
   3069   1.1.1.2    mrg               (clobber (reg:SI 22))
   3070   1.1.1.2    mrg               (clobber (reg:HI 26))
   3071   1.1.1.2    mrg               (clobber (reg:HI 30))])]
   3072   1.1.1.2    mrg   ""
   3073   1.1.1.2    mrg   "this divmodsi4 pattern should have been splitted;"
   3074   1.1.1.2    mrg   ""
   3075   1.1.1.2    mrg   [(set (reg:SI 22) (match_dup 1))
   3076   1.1.1.2    mrg    (set (reg:SI 18) (match_dup 2))
   3077   1.1.1.2    mrg    (parallel [(set (reg:SI 18) (div:SI (reg:SI 22) (reg:SI 18)))
   3078   1.1.1.2    mrg               (set (reg:SI 22) (mod:SI (reg:SI 22) (reg:SI 18)))
   3079   1.1.1.2    mrg               (clobber (reg:HI 26))
   3080   1.1.1.2    mrg               (clobber (reg:HI 30))])
   3081   1.1.1.2    mrg    (set (match_dup 0) (reg:SI 18))
   3082   1.1.1.2    mrg    (set (match_dup 3) (reg:SI 22))])
   3083   1.1.1.2    mrg 
   3084   1.1.1.2    mrg (define_insn "*divmodsi4_call"
   3085   1.1.1.2    mrg   [(set (reg:SI 18) (div:SI (reg:SI 22) (reg:SI 18)))
   3086   1.1.1.2    mrg    (set (reg:SI 22) (mod:SI (reg:SI 22) (reg:SI 18)))
   3087   1.1.1.2    mrg    (clobber (reg:HI 26))
   3088   1.1.1.2    mrg    (clobber (reg:HI 30))]
   3089   1.1.1.2    mrg   ""
   3090   1.1.1.2    mrg   "%~call __divmodsi4"
   3091   1.1.1.2    mrg   [(set_attr "type" "xcall")
   3092   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   3093   1.1.1.2    mrg 
   3094   1.1.1.2    mrg (define_insn_and_split "udivmodsi4"
   3095   1.1.1.2    mrg   [(parallel [(set (match_operand:SI 0 "pseudo_register_operand" "")
   3096   1.1.1.2    mrg                    (udiv:SI (match_operand:SI 1 "pseudo_register_operand" "")
   3097   1.1.1.2    mrg                            (match_operand:SI 2 "pseudo_register_operand" "")))
   3098   1.1.1.2    mrg               (set (match_operand:SI 3 "pseudo_register_operand" "")
   3099   1.1.1.2    mrg                    (umod:SI (match_dup 1) (match_dup 2)))
   3100   1.1.1.2    mrg               (clobber (reg:SI 18))
   3101   1.1.1.2    mrg               (clobber (reg:SI 22))
   3102   1.1.1.2    mrg               (clobber (reg:HI 26))
   3103   1.1.1.2    mrg               (clobber (reg:HI 30))])]
   3104   1.1.1.2    mrg   ""
   3105   1.1.1.2    mrg   "this udivmodsi4 pattern should have been splitted;"
   3106   1.1.1.2    mrg   ""
   3107   1.1.1.2    mrg   [(set (reg:SI 22) (match_dup 1))
   3108   1.1.1.2    mrg    (set (reg:SI 18) (match_dup 2))
   3109   1.1.1.2    mrg    (parallel [(set (reg:SI 18) (udiv:SI (reg:SI 22) (reg:SI 18)))
   3110   1.1.1.2    mrg               (set (reg:SI 22) (umod:SI (reg:SI 22) (reg:SI 18)))
   3111   1.1.1.2    mrg               (clobber (reg:HI 26))
   3112   1.1.1.2    mrg               (clobber (reg:HI 30))])
   3113   1.1.1.2    mrg    (set (match_dup 0) (reg:SI 18))
   3114   1.1.1.2    mrg    (set (match_dup 3) (reg:SI 22))])
   3115   1.1.1.2    mrg 
   3116   1.1.1.2    mrg (define_insn "*udivmodsi4_call"
   3117   1.1.1.2    mrg   [(set (reg:SI 18) (udiv:SI (reg:SI 22) (reg:SI 18)))
   3118   1.1.1.2    mrg    (set (reg:SI 22) (umod:SI (reg:SI 22) (reg:SI 18)))
   3119   1.1.1.2    mrg    (clobber (reg:HI 26))
   3120   1.1.1.2    mrg    (clobber (reg:HI 30))]
   3121   1.1.1.2    mrg   ""
   3122   1.1.1.2    mrg   "%~call __udivmodsi4"
   3123   1.1.1.2    mrg   [(set_attr "type" "xcall")
   3124   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   3125   1.1.1.2    mrg 
   3126   1.1.1.2    mrg ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   3127   1.1.1.2    mrg ; and
   3128   1.1.1.2    mrg 
   3129   1.1.1.2    mrg (define_insn "andqi3"
   3130   1.1.1.9    mrg   [(set (match_operand:QI 0 "register_operand"       "=??r,d,*l")
   3131   1.1.1.9    mrg         (and:QI (match_operand:QI 1 "register_operand" "%0,0,0")
   3132   1.1.1.9    mrg                 (match_operand:QI 2 "nonmemory_operand" "r,i,Ca1")))]
   3133   1.1.1.2    mrg   ""
   3134   1.1.1.2    mrg   "@
   3135   1.1.1.2    mrg 	and %0,%2
   3136   1.1.1.9    mrg 	andi %0,lo8(%2)
   3137   1.1.1.9    mrg 	* return avr_out_bitop (insn, operands, NULL);"
   3138   1.1.1.9    mrg   [(set_attr "length" "1,1,2")
   3139   1.1.1.9    mrg    (set_attr "cc" "set_zn,set_zn,none")])
   3140   1.1.1.2    mrg 
   3141   1.1.1.2    mrg (define_insn "andhi3"
   3142   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"       "=??r,d,d,r  ,r")
   3143   1.1.1.2    mrg         (and:HI (match_operand:HI 1 "register_operand" "%0,0,0,0  ,0")
   3144   1.1.1.2    mrg                 (match_operand:HI 2 "nonmemory_operand" "r,s,n,Ca2,n")))
   3145   1.1.1.2    mrg    (clobber (match_scratch:QI 3                        "=X,X,X,X  ,&d"))]
   3146   1.1.1.2    mrg   ""
   3147   1.1.1.2    mrg   {
   3148   1.1.1.2    mrg     if (which_alternative == 0)
   3149   1.1.1.2    mrg       return "and %A0,%A2\;and %B0,%B2";
   3150   1.1.1.2    mrg     else if (which_alternative == 1)
   3151   1.1.1.2    mrg       return "andi %A0,lo8(%2)\;andi %B0,hi8(%2)";
   3152   1.1.1.2    mrg 
   3153   1.1.1.2    mrg     return avr_out_bitop (insn, operands, NULL);
   3154   1.1.1.2    mrg   }
   3155   1.1.1.2    mrg   [(set_attr "length" "2,2,2,4,4")
   3156   1.1.1.2    mrg    (set_attr "adjust_len" "*,*,out_bitop,out_bitop,out_bitop")
   3157   1.1.1.2    mrg    (set_attr "cc" "set_n,set_n,clobber,clobber,clobber")])
   3158   1.1.1.2    mrg 
   3159   1.1.1.2    mrg (define_insn "andpsi3"
   3160   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"        "=??r,d,r  ,r")
   3161   1.1.1.2    mrg         (and:PSI (match_operand:PSI 1 "register_operand" "%0,0,0  ,0")
   3162   1.1.1.2    mrg                  (match_operand:PSI 2 "nonmemory_operand" "r,n,Ca3,n")))
   3163   1.1.1.2    mrg    (clobber (match_scratch:QI 3                          "=X,X,X  ,&d"))]
   3164   1.1.1.2    mrg   ""
   3165   1.1.1.2    mrg   {
   3166   1.1.1.2    mrg     if (which_alternative == 0)
   3167   1.1.1.2    mrg       return "and %A0,%A2" CR_TAB
   3168   1.1.1.2    mrg              "and %B0,%B2" CR_TAB
   3169   1.1.1.2    mrg              "and %C0,%C2";
   3170   1.1.1.2    mrg 
   3171   1.1.1.2    mrg     return avr_out_bitop (insn, operands, NULL);
   3172   1.1.1.2    mrg   }
   3173   1.1.1.2    mrg   [(set_attr "length" "3,3,6,6")
   3174   1.1.1.2    mrg    (set_attr "adjust_len" "*,out_bitop,out_bitop,out_bitop")
   3175   1.1.1.2    mrg    (set_attr "cc" "set_n,clobber,clobber,clobber")])
   3176   1.1.1.2    mrg 
   3177   1.1.1.2    mrg (define_insn "andsi3"
   3178   1.1.1.2    mrg   [(set (match_operand:SI 0 "register_operand"       "=??r,d,r  ,r")
   3179   1.1.1.2    mrg         (and:SI (match_operand:SI 1 "register_operand" "%0,0,0  ,0")
   3180   1.1.1.2    mrg                 (match_operand:SI 2 "nonmemory_operand" "r,n,Ca4,n")))
   3181   1.1.1.2    mrg    (clobber (match_scratch:QI 3                        "=X,X,X  ,&d"))]
   3182   1.1.1.2    mrg   ""
   3183   1.1.1.2    mrg   {
   3184   1.1.1.2    mrg     if (which_alternative == 0)
   3185   1.1.1.2    mrg       return "and %0,%2"   CR_TAB
   3186   1.1.1.2    mrg              "and %B0,%B2" CR_TAB
   3187   1.1.1.2    mrg              "and %C0,%C2" CR_TAB
   3188   1.1.1.2    mrg              "and %D0,%D2";
   3189   1.1.1.2    mrg 
   3190   1.1.1.2    mrg     return avr_out_bitop (insn, operands, NULL);
   3191   1.1.1.2    mrg   }
   3192   1.1.1.2    mrg   [(set_attr "length" "4,4,8,8")
   3193   1.1.1.2    mrg    (set_attr "adjust_len" "*,out_bitop,out_bitop,out_bitop")
   3194   1.1.1.2    mrg    (set_attr "cc" "set_n,clobber,clobber,clobber")])
   3195   1.1.1.2    mrg 
   3196   1.1.1.2    mrg (define_peephole2 ; andi
   3197   1.1.1.2    mrg   [(set (match_operand:QI 0 "d_register_operand" "")
   3198   1.1.1.2    mrg         (and:QI (match_dup 0)
   3199   1.1.1.2    mrg                 (match_operand:QI 1 "const_int_operand" "")))
   3200   1.1.1.2    mrg    (set (match_dup 0)
   3201   1.1.1.2    mrg         (and:QI (match_dup 0)
   3202   1.1.1.2    mrg                 (match_operand:QI 2 "const_int_operand" "")))]
   3203   1.1.1.2    mrg   ""
   3204   1.1.1.2    mrg   [(set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))]
   3205   1.1.1.2    mrg   {
   3206   1.1.1.2    mrg     operands[1] = GEN_INT (INTVAL (operands[1]) & INTVAL (operands[2]));
   3207   1.1.1.2    mrg   })
   3208   1.1.1.2    mrg 
   3209   1.1.1.2    mrg ;;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
   3210   1.1.1.2    mrg ;; ior
   3211   1.1.1.2    mrg 
   3212   1.1.1.2    mrg (define_insn "iorqi3"
   3213   1.1.1.9    mrg   [(set (match_operand:QI 0 "register_operand"       "=??r,d,*l")
   3214   1.1.1.9    mrg         (ior:QI (match_operand:QI 1 "register_operand" "%0,0,0")
   3215   1.1.1.9    mrg                 (match_operand:QI 2 "nonmemory_operand" "r,i,Co1")))]
   3216   1.1.1.2    mrg   ""
   3217   1.1.1.2    mrg   "@
   3218   1.1.1.2    mrg 	or %0,%2
   3219   1.1.1.9    mrg 	ori %0,lo8(%2)
   3220   1.1.1.9    mrg         * return avr_out_bitop (insn, operands, NULL);"
   3221   1.1.1.9    mrg   [(set_attr "length" "1,1,2")
   3222   1.1.1.9    mrg    (set_attr "cc" "set_zn,set_zn,none")])
   3223   1.1.1.2    mrg 
   3224   1.1.1.2    mrg (define_insn "iorhi3"
   3225   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"       "=??r,d,d,r  ,r")
   3226   1.1.1.2    mrg         (ior:HI (match_operand:HI 1 "register_operand" "%0,0,0,0  ,0")
   3227   1.1.1.2    mrg                 (match_operand:HI 2 "nonmemory_operand" "r,s,n,Co2,n")))
   3228   1.1.1.2    mrg    (clobber (match_scratch:QI 3                        "=X,X,X,X  ,&d"))]
   3229   1.1.1.2    mrg   ""
   3230   1.1.1.2    mrg   {
   3231   1.1.1.2    mrg     if (which_alternative == 0)
   3232   1.1.1.2    mrg       return "or %A0,%A2\;or %B0,%B2";
   3233   1.1.1.2    mrg     else if (which_alternative == 1)
   3234   1.1.1.2    mrg       return "ori %A0,lo8(%2)\;ori %B0,hi8(%2)";
   3235   1.1.1.2    mrg 
   3236   1.1.1.2    mrg     return avr_out_bitop (insn, operands, NULL);
   3237   1.1.1.2    mrg   }
   3238   1.1.1.2    mrg   [(set_attr "length" "2,2,2,4,4")
   3239   1.1.1.2    mrg    (set_attr "adjust_len" "*,*,out_bitop,out_bitop,out_bitop")
   3240   1.1.1.2    mrg    (set_attr "cc" "set_n,set_n,clobber,clobber,clobber")])
   3241   1.1.1.2    mrg 
   3242   1.1.1.2    mrg (define_insn "iorpsi3"
   3243   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"        "=??r,d,r  ,r")
   3244   1.1.1.2    mrg         (ior:PSI (match_operand:PSI 1 "register_operand" "%0,0,0  ,0")
   3245   1.1.1.2    mrg                  (match_operand:PSI 2 "nonmemory_operand" "r,n,Co3,n")))
   3246   1.1.1.2    mrg    (clobber (match_scratch:QI 3                          "=X,X,X  ,&d"))]
   3247   1.1.1.2    mrg   ""
   3248   1.1.1.2    mrg   {
   3249   1.1.1.2    mrg     if (which_alternative == 0)
   3250   1.1.1.2    mrg       return "or %A0,%A2" CR_TAB
   3251   1.1.1.2    mrg              "or %B0,%B2" CR_TAB
   3252   1.1.1.2    mrg              "or %C0,%C2";
   3253   1.1.1.2    mrg 
   3254   1.1.1.2    mrg     return avr_out_bitop (insn, operands, NULL);
   3255   1.1.1.2    mrg   }
   3256   1.1.1.2    mrg   [(set_attr "length" "3,3,6,6")
   3257   1.1.1.2    mrg    (set_attr "adjust_len" "*,out_bitop,out_bitop,out_bitop")
   3258   1.1.1.2    mrg    (set_attr "cc" "set_n,clobber,clobber,clobber")])
   3259   1.1.1.2    mrg 
   3260   1.1.1.2    mrg (define_insn "iorsi3"
   3261   1.1.1.2    mrg   [(set (match_operand:SI 0 "register_operand"       "=??r,d,r  ,r")
   3262   1.1.1.2    mrg         (ior:SI (match_operand:SI 1 "register_operand" "%0,0,0  ,0")
   3263   1.1.1.2    mrg                 (match_operand:SI 2 "nonmemory_operand" "r,n,Co4,n")))
   3264   1.1.1.2    mrg    (clobber (match_scratch:QI 3                        "=X,X,X  ,&d"))]
   3265   1.1.1.2    mrg   ""
   3266   1.1.1.2    mrg   {
   3267   1.1.1.2    mrg     if (which_alternative == 0)
   3268   1.1.1.2    mrg       return "or %0,%2"   CR_TAB
   3269   1.1.1.2    mrg              "or %B0,%B2" CR_TAB
   3270   1.1.1.2    mrg              "or %C0,%C2" CR_TAB
   3271   1.1.1.2    mrg              "or %D0,%D2";
   3272   1.1.1.2    mrg 
   3273   1.1.1.2    mrg     return avr_out_bitop (insn, operands, NULL);
   3274   1.1.1.2    mrg   }
   3275   1.1.1.2    mrg   [(set_attr "length" "4,4,8,8")
   3276   1.1.1.2    mrg    (set_attr "adjust_len" "*,out_bitop,out_bitop,out_bitop")
   3277   1.1.1.2    mrg    (set_attr "cc" "set_n,clobber,clobber,clobber")])
   3278   1.1.1.2    mrg 
   3279   1.1.1.2    mrg ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   3280   1.1.1.2    mrg ;; xor
   3281   1.1.1.2    mrg 
   3282   1.1.1.2    mrg (define_insn "xorqi3"
   3283   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand" "=r")
   3284   1.1.1.2    mrg         (xor:QI (match_operand:QI 1 "register_operand" "%0")
   3285   1.1.1.2    mrg                 (match_operand:QI 2 "register_operand" "r")))]
   3286   1.1.1.2    mrg   ""
   3287   1.1.1.2    mrg   "eor %0,%2"
   3288   1.1.1.2    mrg   [(set_attr "length" "1")
   3289   1.1.1.2    mrg    (set_attr "cc" "set_zn")])
   3290   1.1.1.2    mrg 
   3291   1.1.1.2    mrg (define_insn "xorhi3"
   3292   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"       "=??r,r  ,r")
   3293   1.1.1.2    mrg         (xor:HI (match_operand:HI 1 "register_operand" "%0,0  ,0")
   3294   1.1.1.2    mrg                 (match_operand:HI 2 "nonmemory_operand" "r,Cx2,n")))
   3295   1.1.1.2    mrg    (clobber (match_scratch:QI 3                        "=X,X  ,&d"))]
   3296   1.1.1.2    mrg   ""
   3297   1.1.1.2    mrg   {
   3298   1.1.1.2    mrg     if (which_alternative == 0)
   3299   1.1.1.2    mrg       return "eor %A0,%A2\;eor %B0,%B2";
   3300   1.1.1.2    mrg 
   3301   1.1.1.2    mrg     return avr_out_bitop (insn, operands, NULL);
   3302   1.1.1.2    mrg   }
   3303   1.1.1.2    mrg   [(set_attr "length" "2,2,4")
   3304   1.1.1.2    mrg    (set_attr "adjust_len" "*,out_bitop,out_bitop")
   3305   1.1.1.2    mrg    (set_attr "cc" "set_n,clobber,clobber")])
   3306   1.1.1.2    mrg 
   3307   1.1.1.2    mrg (define_insn "xorpsi3"
   3308   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"        "=??r,r  ,r")
   3309   1.1.1.2    mrg         (xor:PSI (match_operand:PSI 1 "register_operand" "%0,0  ,0")
   3310   1.1.1.2    mrg                  (match_operand:PSI 2 "nonmemory_operand" "r,Cx3,n")))
   3311   1.1.1.2    mrg    (clobber (match_scratch:QI 3                          "=X,X  ,&d"))]
   3312   1.1.1.2    mrg   ""
   3313   1.1.1.2    mrg   {
   3314   1.1.1.2    mrg     if (which_alternative == 0)
   3315   1.1.1.2    mrg       return "eor %A0,%A2" CR_TAB
   3316   1.1.1.2    mrg              "eor %B0,%B2" CR_TAB
   3317   1.1.1.2    mrg              "eor %C0,%C2";
   3318   1.1.1.2    mrg 
   3319   1.1.1.2    mrg     return avr_out_bitop (insn, operands, NULL);
   3320   1.1.1.2    mrg   }
   3321   1.1.1.2    mrg   [(set_attr "length" "3,6,6")
   3322   1.1.1.2    mrg    (set_attr "adjust_len" "*,out_bitop,out_bitop")
   3323   1.1.1.2    mrg    (set_attr "cc" "set_n,clobber,clobber")])
   3324   1.1.1.2    mrg 
   3325   1.1.1.2    mrg (define_insn "xorsi3"
   3326   1.1.1.2    mrg   [(set (match_operand:SI 0 "register_operand"       "=??r,r  ,r")
   3327   1.1.1.2    mrg         (xor:SI (match_operand:SI 1 "register_operand" "%0,0  ,0")
   3328   1.1.1.2    mrg                 (match_operand:SI 2 "nonmemory_operand" "r,Cx4,n")))
   3329   1.1.1.2    mrg    (clobber (match_scratch:QI 3                        "=X,X  ,&d"))]
   3330   1.1.1.2    mrg   ""
   3331   1.1.1.2    mrg   {
   3332   1.1.1.2    mrg     if (which_alternative == 0)
   3333   1.1.1.2    mrg       return "eor %0,%2"   CR_TAB
   3334   1.1.1.2    mrg              "eor %B0,%B2" CR_TAB
   3335   1.1.1.2    mrg              "eor %C0,%C2" CR_TAB
   3336   1.1.1.2    mrg              "eor %D0,%D2";
   3337   1.1.1.2    mrg 
   3338   1.1.1.2    mrg     return avr_out_bitop (insn, operands, NULL);
   3339   1.1.1.2    mrg   }
   3340   1.1.1.2    mrg   [(set_attr "length" "4,8,8")
   3341   1.1.1.2    mrg    (set_attr "adjust_len" "*,out_bitop,out_bitop")
   3342   1.1.1.2    mrg    (set_attr "cc" "set_n,clobber,clobber")])
   3343   1.1.1.2    mrg 
   3344   1.1.1.9    mrg 
   3345   1.1.1.9    mrg (define_split
   3346   1.1.1.9    mrg   [(set (match_operand:SPLIT34 0 "register_operand")
   3347   1.1.1.9    mrg         (match_operand:SPLIT34 1 "register_operand"))]
   3348   1.1.1.9    mrg   "optimize
   3349   1.1.1.9    mrg    && reload_completed"
   3350   1.1.1.9    mrg   [(set (match_dup 2) (match_dup 3))
   3351   1.1.1.9    mrg    (set (match_dup 4) (match_dup 5))]
   3352   1.1.1.9    mrg   {
   3353   1.1.1.9    mrg     machine_mode mode_hi = 4 == GET_MODE_SIZE (<MODE>mode) ? HImode : QImode;
   3354   1.1.1.9    mrg     bool lo_first = REGNO (operands[0]) < REGNO (operands[1]);
   3355   1.1.1.9    mrg     rtx dst_lo = simplify_gen_subreg (HImode, operands[0], <MODE>mode, 0);
   3356   1.1.1.9    mrg     rtx src_lo = simplify_gen_subreg (HImode, operands[1], <MODE>mode, 0);
   3357   1.1.1.9    mrg     rtx dst_hi = simplify_gen_subreg (mode_hi, operands[0], <MODE>mode, 2);
   3358   1.1.1.9    mrg     rtx src_hi = simplify_gen_subreg (mode_hi, operands[1], <MODE>mode, 2);
   3359   1.1.1.9    mrg 
   3360   1.1.1.9    mrg     operands[2] = lo_first ? dst_lo : dst_hi;
   3361   1.1.1.9    mrg     operands[3] = lo_first ? src_lo : src_hi;
   3362   1.1.1.9    mrg     operands[4] = lo_first ? dst_hi : dst_lo;
   3363   1.1.1.9    mrg     operands[5] = lo_first ? src_hi : src_lo;
   3364   1.1.1.9    mrg   })
   3365   1.1.1.9    mrg   
   3366   1.1.1.9    mrg (define_split
   3367   1.1.1.9    mrg   [(set (match_operand:HI 0 "register_operand")
   3368   1.1.1.9    mrg         (match_operand:HI 1 "reg_or_0_operand"))]
   3369   1.1.1.9    mrg   "optimize
   3370   1.1.1.9    mrg    && reload_completed
   3371   1.1.1.9    mrg    && GENERAL_REG_P (operands[0])
   3372   1.1.1.9    mrg    && (operands[1] == const0_rtx || GENERAL_REG_P (operands[1]))
   3373   1.1.1.9    mrg    && (!AVR_HAVE_MOVW
   3374   1.1.1.9    mrg        || const0_rtx == operands[1])"
   3375   1.1.1.9    mrg   [(set (match_dup 2) (match_dup 3))
   3376   1.1.1.9    mrg    (set (match_dup 4) (match_dup 5))]
   3377   1.1.1.9    mrg   {
   3378   1.1.1.9    mrg     operands[2] = simplify_gen_subreg (QImode, operands[0], HImode, 1);
   3379   1.1.1.9    mrg     operands[3] = simplify_gen_subreg (QImode, operands[1], HImode, 1);
   3380   1.1.1.9    mrg     operands[4] = simplify_gen_subreg (QImode, operands[0], HImode, 0);
   3381   1.1.1.9    mrg     operands[5] = simplify_gen_subreg (QImode, operands[1], HImode, 0);
   3382   1.1.1.9    mrg   })
   3383   1.1.1.9    mrg 
   3384   1.1.1.9    mrg ;; Split andhi3, andpsi3, andsi3.
   3385   1.1.1.9    mrg ;; Split iorhi3, iorpsi3, iorsi3.
   3386   1.1.1.9    mrg ;; Split xorhi3, xorpsi3, xorsi3.
   3387   1.1.1.9    mrg (define_split
   3388   1.1.1.9    mrg   [(parallel [(set (match_operand:HISI 0 "register_operand")
   3389   1.1.1.9    mrg                    (bitop:HISI (match_dup 0)
   3390   1.1.1.9    mrg                                (match_operand:HISI 1 "register_operand")))
   3391   1.1.1.9    mrg               (clobber (scratch:QI))])]
   3392   1.1.1.9    mrg   "optimize
   3393   1.1.1.9    mrg    && reload_completed"
   3394   1.1.1.9    mrg   [(const_int 1)]
   3395   1.1.1.9    mrg   {
   3396   1.1.1.9    mrg     for (int i = 0; i < GET_MODE_SIZE (<MODE>mode); i++)
   3397   1.1.1.9    mrg       {
   3398   1.1.1.9    mrg         rtx dst = simplify_gen_subreg (QImode, operands[0], <MODE>mode, i);
   3399   1.1.1.9    mrg         rtx src = simplify_gen_subreg (QImode, operands[1], <MODE>mode, i);
   3400   1.1.1.9    mrg         emit_insn (gen_<code>qi3 (dst, dst, src));
   3401   1.1.1.9    mrg       }
   3402   1.1.1.9    mrg     DONE;
   3403   1.1.1.9    mrg   })
   3404   1.1.1.9    mrg 
   3405   1.1.1.9    mrg 
   3406   1.1.1.2    mrg ;; swap swap swap swap swap swap swap swap swap swap swap swap swap swap swap
   3407   1.1.1.2    mrg ;; swap
   3408   1.1.1.2    mrg 
   3409   1.1.1.2    mrg (define_expand "rotlqi3"
   3410   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand" "")
   3411   1.1.1.2    mrg         (rotate:QI (match_operand:QI 1 "register_operand" "")
   3412   1.1.1.2    mrg                    (match_operand:QI 2 "const_0_to_7_operand" "")))]
   3413   1.1.1.2    mrg   ""
   3414   1.1.1.2    mrg   {
   3415   1.1.1.2    mrg     if (!CONST_INT_P (operands[2]))
   3416   1.1.1.2    mrg       FAIL;
   3417   1.1.1.2    mrg 
   3418   1.1.1.2    mrg     operands[2] = gen_int_mode (INTVAL (operands[2]) & 7, QImode);
   3419   1.1.1.2    mrg   })
   3420   1.1.1.2    mrg 
   3421   1.1.1.2    mrg ;; Expander used by __builtin_avr_swap
   3422   1.1.1.2    mrg (define_expand "rotlqi3_4"
   3423   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand" "")
   3424   1.1.1.2    mrg         (rotate:QI (match_operand:QI 1 "register_operand" "")
   3425   1.1.1.2    mrg                    (const_int 4)))])
   3426   1.1.1.2    mrg 
   3427   1.1.1.2    mrg (define_insn "*rotlqi3"
   3428   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand"               "=r,r,r  ,r  ,r  ,r  ,r  ,r")
   3429   1.1.1.2    mrg         (rotate:QI (match_operand:QI 1 "register_operand"     "0,0,0  ,0  ,0  ,0  ,0  ,0")
   3430   1.1.1.2    mrg                    (match_operand:QI 2 "const_0_to_7_operand" "P,K,C03,C04,C05,C06,C07,L")))]
   3431   1.1.1.2    mrg   ""
   3432   1.1.1.2    mrg   "@
   3433   1.1.1.2    mrg 	lsl %0\;adc %0,__zero_reg__
   3434   1.1.1.2    mrg 	lsl %0\;adc %0,__zero_reg__\;lsl %0\;adc %0,__zero_reg__
   3435   1.1.1.2    mrg 	swap %0\;bst %0,0\;ror %0\;bld %0,7
   3436   1.1.1.2    mrg 	swap %0
   3437   1.1.1.2    mrg 	swap %0\;lsl %0\;adc %0,__zero_reg__
   3438   1.1.1.2    mrg 	swap %0\;lsl %0\;adc %0,__zero_reg__\;lsl %0\;adc %0,__zero_reg__
   3439   1.1.1.2    mrg 	bst %0,0\;ror %0\;bld %0,7
   3440   1.1.1.6    mrg 	" ; empty
   3441   1.1.1.2    mrg   [(set_attr "length" "2,4,4,1,3,5,3,0")
   3442   1.1.1.2    mrg    (set_attr "cc" "set_n,set_n,clobber,none,set_n,set_n,clobber,none")])
   3443   1.1.1.2    mrg 
   3444   1.1.1.2    mrg ;; Split all rotates of HI,SI and PSImode registers where rotation is by
   3445   1.1.1.2    mrg ;; a whole number of bytes.  The split creates the appropriate moves and
   3446   1.1.1.2    mrg ;; considers all overlap situations.
   3447   1.1.1.2    mrg 
   3448   1.1.1.2    mrg ;; HImode does not need scratch.  Use attribute for this constraint.
   3449   1.1.1.2    mrg 
   3450   1.1.1.2    mrg (define_mode_attr rotx [(SI "&r,&r,X") (PSI "&r,&r,X") (HI "X,X,X")])
   3451   1.1.1.2    mrg (define_mode_attr rotsmode [(SI "HI") (PSI "QI") (HI "QI")])
   3452   1.1.1.2    mrg 
   3453   1.1.1.2    mrg ;; "rotlhi3"
   3454   1.1.1.2    mrg ;; "rotlpsi3"
   3455   1.1.1.2    mrg ;; "rotlsi3"
   3456   1.1.1.2    mrg (define_expand "rotl<mode>3"
   3457   1.1.1.2    mrg   [(parallel [(set (match_operand:HISI 0 "register_operand" "")
   3458   1.1.1.2    mrg                    (rotate:HISI (match_operand:HISI 1 "register_operand" "")
   3459   1.1.1.8    mrg                                 (match_operand:HISI 2 "const_int_operand" "")))
   3460   1.1.1.2    mrg               (clobber (match_dup 3))])]
   3461   1.1.1.2    mrg   ""
   3462   1.1.1.2    mrg   {
   3463   1.1.1.2    mrg     int offset;
   3464   1.1.1.2    mrg 
   3465   1.1.1.2    mrg     if (!CONST_INT_P (operands[2]))
   3466   1.1.1.2    mrg       FAIL;
   3467   1.1.1.2    mrg 
   3468   1.1.1.2    mrg     offset = INTVAL (operands[2]);
   3469   1.1.1.2    mrg 
   3470   1.1.1.2    mrg     if (0 == offset % 8)
   3471   1.1.1.2    mrg       {
   3472   1.1.1.2    mrg         if (AVR_HAVE_MOVW && 0 == offset % 16)
   3473   1.1.1.2    mrg           operands[3] = gen_rtx_SCRATCH (<rotsmode>mode);
   3474   1.1.1.2    mrg         else
   3475   1.1.1.2    mrg           operands[3] = gen_rtx_SCRATCH (QImode);
   3476   1.1.1.2    mrg       }
   3477   1.1.1.2    mrg     else if (offset == 1
   3478   1.1.1.2    mrg              || offset == GET_MODE_BITSIZE (<MODE>mode) -1)
   3479   1.1.1.2    mrg       {
   3480   1.1.1.2    mrg         /*; Support rotate left/right by 1  */
   3481   1.1.1.2    mrg 
   3482   1.1.1.2    mrg         emit_move_insn (operands[0],
   3483   1.1.1.2    mrg                         gen_rtx_ROTATE (<MODE>mode, operands[1], operands[2]));
   3484   1.1.1.2    mrg         DONE;
   3485   1.1.1.2    mrg       }
   3486   1.1.1.2    mrg     else
   3487   1.1.1.2    mrg       FAIL;
   3488   1.1.1.2    mrg   })
   3489   1.1.1.2    mrg 
   3490   1.1.1.2    mrg (define_insn "*rotlhi2.1"
   3491   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"           "=r")
   3492   1.1.1.2    mrg         (rotate:HI (match_operand:HI 1 "register_operand" "0")
   3493   1.1.1.2    mrg                    (const_int 1)))]
   3494   1.1.1.2    mrg   ""
   3495   1.1.1.2    mrg   "lsl %A0\;rol %B0\;adc %A0,__zero_reg__"
   3496   1.1.1.2    mrg   [(set_attr "length" "3")
   3497   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   3498   1.1.1.2    mrg 
   3499   1.1.1.2    mrg (define_insn "*rotlhi2.15"
   3500   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"           "=r")
   3501   1.1.1.2    mrg         (rotate:HI (match_operand:HI 1 "register_operand" "0")
   3502   1.1.1.2    mrg                    (const_int 15)))]
   3503   1.1.1.2    mrg   ""
   3504   1.1.1.2    mrg   "bst %A0,0\;ror %B0\;ror %A0\;bld %B0,7"
   3505   1.1.1.2    mrg   [(set_attr "length" "4")
   3506   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   3507   1.1.1.2    mrg 
   3508   1.1.1.2    mrg (define_insn "*rotlpsi2.1"
   3509   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"            "=r")
   3510   1.1.1.2    mrg         (rotate:PSI (match_operand:PSI 1 "register_operand" "0")
   3511   1.1.1.2    mrg                     (const_int 1)))]
   3512   1.1.1.2    mrg   ""
   3513   1.1.1.2    mrg   "lsl %A0\;rol %B0\;rol %C0\;adc %A0,__zero_reg__"
   3514   1.1.1.2    mrg   [(set_attr "length" "4")
   3515   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   3516   1.1.1.2    mrg 
   3517   1.1.1.2    mrg (define_insn "*rotlpsi2.23"
   3518   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"            "=r")
   3519   1.1.1.2    mrg         (rotate:PSI (match_operand:PSI 1 "register_operand" "0")
   3520   1.1.1.2    mrg                     (const_int 23)))]
   3521   1.1.1.2    mrg   ""
   3522   1.1.1.2    mrg   "bst %A0,0\;ror %C0\;ror %B0\;ror %A0\;bld %C0,7"
   3523   1.1.1.2    mrg   [(set_attr "length" "5")
   3524   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   3525   1.1.1.2    mrg 
   3526   1.1.1.2    mrg (define_insn "*rotlsi2.1"
   3527   1.1.1.2    mrg   [(set (match_operand:SI 0 "register_operand"           "=r")
   3528   1.1.1.2    mrg         (rotate:SI (match_operand:SI 1 "register_operand" "0")
   3529   1.1.1.2    mrg                    (const_int 1)))]
   3530   1.1.1.2    mrg   ""
   3531   1.1.1.2    mrg   "lsl %A0\;rol %B0\;rol %C0\;rol %D0\;adc %A0,__zero_reg__"
   3532   1.1.1.2    mrg   [(set_attr "length" "5")
   3533   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   3534   1.1.1.2    mrg 
   3535   1.1.1.2    mrg (define_insn "*rotlsi2.31"
   3536   1.1.1.2    mrg   [(set (match_operand:SI 0 "register_operand"           "=r")
   3537   1.1.1.2    mrg         (rotate:SI (match_operand:SI 1 "register_operand" "0")
   3538   1.1.1.2    mrg                    (const_int 31)))]
   3539   1.1.1.2    mrg   ""
   3540   1.1.1.2    mrg   "bst %A0,0\;ror %D0\;ror %C0\;ror %B0\;ror %A0\;bld %D0,7"
   3541   1.1.1.2    mrg   [(set_attr "length" "6")
   3542   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   3543   1.1.1.2    mrg 
   3544   1.1.1.2    mrg ;; Overlapping non-HImode registers often (but not always) need a scratch.
   3545   1.1.1.2    mrg ;; The best we can do is use early clobber alternative "#&r" so that
   3546   1.1.1.2    mrg ;; completely non-overlapping operands dont get a scratch but # so register
   3547   1.1.1.2    mrg ;; allocation does not prefer non-overlapping.
   3548   1.1.1.2    mrg 
   3549   1.1.1.2    mrg 
   3550   1.1.1.2    mrg ;; Split word aligned rotates using scratch that is mode dependent.
   3551   1.1.1.2    mrg 
   3552   1.1.1.2    mrg ;; "*rotwhi"
   3553   1.1.1.2    mrg ;; "*rotwsi"
   3554   1.1.1.2    mrg (define_insn_and_split "*rotw<mode>"
   3555   1.1.1.2    mrg   [(set (match_operand:HISI 0 "register_operand"             "=r,r,#&r")
   3556   1.1.1.2    mrg         (rotate:HISI (match_operand:HISI 1 "register_operand" "0,r,r")
   3557   1.1.1.2    mrg                      (match_operand 2 "const_int_operand"     "n,n,n")))
   3558   1.1.1.2    mrg    (clobber (match_scratch:<rotsmode> 3 "=<rotx>"))]
   3559   1.1.1.2    mrg   "AVR_HAVE_MOVW
   3560   1.1.1.2    mrg    && CONST_INT_P (operands[2])
   3561   1.1.1.2    mrg    && GET_MODE_SIZE (<MODE>mode) % 2 == 0
   3562   1.1.1.2    mrg    && 0 == INTVAL (operands[2]) % 16"
   3563   1.1.1.2    mrg   "#"
   3564   1.1.1.2    mrg   "&& reload_completed"
   3565   1.1.1.2    mrg   [(const_int 0)]
   3566   1.1.1.2    mrg   {
   3567   1.1.1.2    mrg     avr_rotate_bytes (operands);
   3568   1.1.1.2    mrg     DONE;
   3569   1.1.1.2    mrg   })
   3570   1.1.1.2    mrg 
   3571   1.1.1.2    mrg 
   3572   1.1.1.2    mrg ;; Split byte aligned rotates using scratch that is always QI mode.
   3573   1.1.1.2    mrg 
   3574   1.1.1.2    mrg ;; "*rotbhi"
   3575   1.1.1.2    mrg ;; "*rotbpsi"
   3576   1.1.1.2    mrg ;; "*rotbsi"
   3577   1.1.1.2    mrg (define_insn_and_split "*rotb<mode>"
   3578   1.1.1.2    mrg   [(set (match_operand:HISI 0 "register_operand"             "=r,r,#&r")
   3579   1.1.1.2    mrg         (rotate:HISI (match_operand:HISI 1 "register_operand" "0,r,r")
   3580   1.1.1.2    mrg                      (match_operand 2 "const_int_operand"     "n,n,n")))
   3581   1.1.1.2    mrg    (clobber (match_scratch:QI 3 "=<rotx>"))]
   3582   1.1.1.2    mrg   "CONST_INT_P (operands[2])
   3583   1.1.1.2    mrg    && (8 == INTVAL (operands[2]) % 16
   3584   1.1.1.2    mrg        || ((!AVR_HAVE_MOVW
   3585   1.1.1.2    mrg             || GET_MODE_SIZE (<MODE>mode) % 2 != 0)
   3586   1.1.1.2    mrg            && 0 == INTVAL (operands[2]) % 16))"
   3587   1.1.1.2    mrg   "#"
   3588   1.1.1.2    mrg   "&& reload_completed"
   3589   1.1.1.2    mrg   [(const_int 0)]
   3590   1.1.1.2    mrg   {
   3591   1.1.1.2    mrg     avr_rotate_bytes (operands);
   3592   1.1.1.2    mrg     DONE;
   3593   1.1.1.2    mrg   })
   3594   1.1.1.2    mrg 
   3595   1.1.1.2    mrg 
   3596   1.1.1.2    mrg ;;<< << << << << << << << << << << << << << << << << << << << << << << << << <<
   3597   1.1.1.2    mrg ;; arithmetic shift left
   3598   1.1.1.2    mrg 
   3599   1.1.1.2    mrg ;; "ashlqi3"
   3600   1.1.1.2    mrg ;; "ashlqq3"  "ashluqq3"
   3601   1.1.1.2    mrg (define_expand "ashl<mode>3"
   3602   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "register_operand" "")
   3603   1.1.1.2    mrg         (ashift:ALL1 (match_operand:ALL1 1 "register_operand" "")
   3604   1.1.1.2    mrg                      (match_operand:QI 2 "nop_general_operand" "")))])
   3605   1.1.1.2    mrg 
   3606   1.1.1.2    mrg (define_split ; ashlqi3_const4
   3607   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "d_register_operand" "")
   3608   1.1.1.2    mrg         (ashift:ALL1 (match_dup 0)
   3609   1.1.1.2    mrg                      (const_int 4)))]
   3610   1.1.1.2    mrg   ""
   3611   1.1.1.2    mrg   [(set (match_dup 1)
   3612   1.1.1.2    mrg         (rotate:QI (match_dup 1)
   3613   1.1.1.2    mrg                    (const_int 4)))
   3614   1.1.1.2    mrg    (set (match_dup 1)
   3615   1.1.1.2    mrg         (and:QI (match_dup 1)
   3616   1.1.1.2    mrg                 (const_int -16)))]
   3617   1.1.1.2    mrg   {
   3618   1.1.1.2    mrg     operands[1] = avr_to_int_mode (operands[0]);
   3619   1.1.1.2    mrg   })
   3620   1.1.1.2    mrg 
   3621   1.1.1.2    mrg (define_split ; ashlqi3_const5
   3622   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "d_register_operand" "")
   3623   1.1.1.2    mrg         (ashift:ALL1 (match_dup 0)
   3624   1.1.1.2    mrg                      (const_int 5)))]
   3625   1.1.1.2    mrg   ""
   3626   1.1.1.2    mrg   [(set (match_dup 1) (rotate:QI (match_dup 1) (const_int 4)))
   3627   1.1.1.2    mrg    (set (match_dup 1) (ashift:QI (match_dup 1) (const_int 1)))
   3628   1.1.1.2    mrg    (set (match_dup 1) (and:QI (match_dup 1) (const_int -32)))]
   3629   1.1.1.2    mrg   {
   3630   1.1.1.2    mrg     operands[1] = avr_to_int_mode (operands[0]);
   3631   1.1.1.2    mrg   })
   3632   1.1.1.2    mrg 
   3633   1.1.1.2    mrg (define_split ; ashlqi3_const6
   3634   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "d_register_operand" "")
   3635   1.1.1.2    mrg         (ashift:ALL1 (match_dup 0)
   3636   1.1.1.2    mrg                      (const_int 6)))]
   3637   1.1.1.2    mrg   ""
   3638   1.1.1.2    mrg   [(set (match_dup 1) (rotate:QI (match_dup 1) (const_int 4)))
   3639   1.1.1.2    mrg    (set (match_dup 1) (ashift:QI (match_dup 1) (const_int 2)))
   3640   1.1.1.2    mrg    (set (match_dup 1) (and:QI (match_dup 1) (const_int -64)))]
   3641   1.1.1.2    mrg   {
   3642   1.1.1.2    mrg     operands[1] = avr_to_int_mode (operands[0]);
   3643   1.1.1.2    mrg   })
   3644   1.1.1.2    mrg 
   3645   1.1.1.2    mrg ;; "*ashlqi3"
   3646   1.1.1.2    mrg ;; "*ashlqq3"  "*ashluqq3"
   3647   1.1.1.2    mrg (define_insn "*ashl<mode>3"
   3648   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "register_operand"              "=r,r,r,r,!d,r,r")
   3649   1.1.1.2    mrg         (ashift:ALL1 (match_operand:ALL1 1 "register_operand"  "0,0,0,0,0 ,0,0")
   3650   1.1.1.2    mrg                      (match_operand:QI 2 "nop_general_operand" "r,L,P,K,n ,n,Qm")))]
   3651   1.1.1.2    mrg   ""
   3652   1.1.1.2    mrg   {
   3653   1.1.1.2    mrg     return ashlqi3_out (insn, operands, NULL);
   3654   1.1.1.2    mrg   }
   3655   1.1.1.2    mrg   [(set_attr "length" "5,0,1,2,4,6,9")
   3656   1.1.1.2    mrg    (set_attr "adjust_len" "ashlqi")
   3657   1.1.1.2    mrg    (set_attr "cc" "clobber,none,set_czn,set_czn,set_czn,set_czn,clobber")])
   3658   1.1.1.2    mrg 
   3659   1.1.1.2    mrg (define_insn "ashl<mode>3"
   3660   1.1.1.2    mrg   [(set (match_operand:ALL2 0 "register_operand"              "=r,r,r,r,r,r,r")
   3661   1.1.1.2    mrg         (ashift:ALL2 (match_operand:ALL2 1 "register_operand"  "0,0,0,r,0,0,0")
   3662   1.1.1.2    mrg                      (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm")))]
   3663   1.1.1.2    mrg   ""
   3664   1.1.1.2    mrg   {
   3665   1.1.1.2    mrg     return ashlhi3_out (insn, operands, NULL);
   3666   1.1.1.2    mrg   }
   3667   1.1.1.2    mrg   [(set_attr "length" "6,0,2,2,4,10,10")
   3668   1.1.1.2    mrg    (set_attr "adjust_len" "ashlhi")
   3669   1.1.1.2    mrg    (set_attr "cc" "clobber,none,set_n,clobber,set_n,clobber,clobber")])
   3670   1.1.1.2    mrg 
   3671   1.1.1.2    mrg 
   3672   1.1.1.2    mrg ;; Insns like the following are generated when (implicitly) extending 8-bit shifts
   3673   1.1.1.2    mrg ;; like char1 = char2 << char3.  Only the low-byte is needed in that situation.
   3674   1.1.1.2    mrg 
   3675   1.1.1.2    mrg ;; "*ashluqihiqi3"
   3676   1.1.1.2    mrg ;; "*ashlsqihiqi3"
   3677   1.1.1.2    mrg (define_insn_and_split "*ashl<extend_su>qihiqi3"
   3678   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand"                                     "=r")
   3679   1.1.1.2    mrg         (subreg:QI (ashift:HI (any_extend:HI (match_operand:QI 1 "register_operand" "0"))
   3680   1.1.1.2    mrg                               (match_operand:QI 2 "register_operand"                "r"))
   3681   1.1.1.2    mrg                    0))]
   3682   1.1.1.2    mrg   ""
   3683   1.1.1.2    mrg   "#"
   3684   1.1.1.2    mrg   ""
   3685   1.1.1.2    mrg   [(set (match_dup 0)
   3686   1.1.1.2    mrg         (ashift:QI (match_dup 1)
   3687   1.1.1.2    mrg                    (match_dup 2)))])
   3688   1.1.1.2    mrg 
   3689   1.1.1.2    mrg ;; ??? Combiner does not recognize that it could split the following insn;
   3690   1.1.1.2    mrg ;;     presumably because he has no register handy?
   3691   1.1.1.2    mrg 
   3692   1.1.1.2    mrg ;; "*ashluqihiqi3.mem"
   3693   1.1.1.2    mrg ;; "*ashlsqihiqi3.mem"
   3694   1.1.1.2    mrg (define_insn_and_split "*ashl<extend_su>qihiqi3.mem"
   3695   1.1.1.2    mrg   [(set (match_operand:QI 0 "memory_operand" "=m")
   3696   1.1.1.2    mrg         (subreg:QI (ashift:HI (any_extend:HI (match_operand:QI 1 "register_operand" "r"))
   3697   1.1.1.2    mrg                               (match_operand:QI 2 "register_operand" "r"))
   3698   1.1.1.2    mrg                    0))]
   3699   1.1.1.2    mrg   "!reload_completed"
   3700   1.1.1.2    mrg   { gcc_unreachable(); }
   3701   1.1.1.2    mrg   "&& 1"
   3702   1.1.1.2    mrg   [(set (match_dup 3)
   3703   1.1.1.2    mrg         (ashift:QI (match_dup 1)
   3704   1.1.1.2    mrg                    (match_dup 2)))
   3705   1.1.1.2    mrg    (set (match_dup 0)
   3706   1.1.1.2    mrg         (match_dup 3))]
   3707   1.1.1.2    mrg   {
   3708   1.1.1.2    mrg     operands[3] = gen_reg_rtx (QImode);
   3709   1.1.1.2    mrg   })
   3710   1.1.1.2    mrg 
   3711   1.1.1.2    mrg ;; Similar.
   3712   1.1.1.2    mrg 
   3713   1.1.1.2    mrg (define_insn_and_split "*ashlhiqi3"
   3714   1.1.1.2    mrg   [(set (match_operand:QI 0 "nonimmediate_operand" "=r")
   3715   1.1.1.2    mrg         (subreg:QI (ashift:HI (match_operand:HI 1 "register_operand" "0")
   3716   1.1.1.2    mrg                               (match_operand:QI 2 "register_operand" "r")) 0))]
   3717   1.1.1.2    mrg   "!reload_completed"
   3718   1.1.1.2    mrg   { gcc_unreachable(); }
   3719   1.1.1.2    mrg   "&& 1"
   3720   1.1.1.2    mrg   [(set (match_dup 4)
   3721   1.1.1.2    mrg         (ashift:QI (match_dup 3)
   3722   1.1.1.2    mrg                    (match_dup 2)))
   3723   1.1.1.2    mrg    (set (match_dup 0)
   3724   1.1.1.2    mrg         (match_dup 4))]
   3725   1.1.1.2    mrg   {
   3726   1.1.1.2    mrg     operands[3] = simplify_gen_subreg (QImode, operands[1], HImode, 0);
   3727   1.1.1.2    mrg     operands[4] = gen_reg_rtx (QImode);
   3728   1.1.1.2    mrg   })
   3729   1.1.1.2    mrg 
   3730   1.1.1.2    mrg ;; High part of 16-bit shift is unused after the instruction:
   3731   1.1.1.2    mrg ;; No need to compute it, map to 8-bit shift.
   3732   1.1.1.2    mrg 
   3733   1.1.1.2    mrg (define_peephole2
   3734   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand" "")
   3735   1.1.1.2    mrg         (ashift:HI (match_dup 0)
   3736   1.1.1.2    mrg                    (match_operand:QI 1 "register_operand" "")))]
   3737   1.1.1.2    mrg   ""
   3738   1.1.1.2    mrg   [(set (match_dup 2)
   3739   1.1.1.2    mrg         (ashift:QI (match_dup 2)
   3740   1.1.1.2    mrg                    (match_dup 1)))
   3741   1.1.1.2    mrg    (clobber (match_dup 3))]
   3742   1.1.1.2    mrg   {
   3743   1.1.1.2    mrg     operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, 1);
   3744   1.1.1.2    mrg 
   3745   1.1.1.2    mrg     if (!peep2_reg_dead_p (1, operands[3]))
   3746   1.1.1.2    mrg       FAIL;
   3747   1.1.1.2    mrg 
   3748   1.1.1.2    mrg     operands[2] = simplify_gen_subreg (QImode, operands[0], HImode, 0);
   3749   1.1.1.2    mrg   })
   3750   1.1.1.2    mrg 
   3751   1.1.1.2    mrg 
   3752   1.1.1.2    mrg ;; "ashlsi3"
   3753   1.1.1.2    mrg ;; "ashlsq3"  "ashlusq3"
   3754   1.1.1.2    mrg ;; "ashlsa3"  "ashlusa3"
   3755   1.1.1.2    mrg (define_insn "ashl<mode>3"
   3756   1.1.1.2    mrg   [(set (match_operand:ALL4 0 "register_operand"                "=r,r,r,r,r,r,r")
   3757   1.1.1.2    mrg         (ashift:ALL4 (match_operand:ALL4 1 "register_operand"    "0,0,0,r,0,0,0")
   3758   1.1.1.2    mrg                      (match_operand:QI 2 "nop_general_operand"   "r,L,P,O,K,n,Qm")))]
   3759   1.1.1.2    mrg   ""
   3760   1.1.1.2    mrg   {
   3761   1.1.1.2    mrg     return ashlsi3_out (insn, operands, NULL);
   3762   1.1.1.2    mrg   }
   3763   1.1.1.2    mrg   [(set_attr "length" "8,0,4,4,8,10,12")
   3764   1.1.1.2    mrg    (set_attr "adjust_len" "ashlsi")
   3765   1.1.1.2    mrg    (set_attr "cc" "clobber,none,set_n,clobber,set_n,clobber,clobber")])
   3766   1.1.1.2    mrg 
   3767   1.1.1.2    mrg ;; Optimize if a scratch register from LD_REGS happens to be available.
   3768   1.1.1.2    mrg 
   3769   1.1.1.2    mrg (define_peephole2 ; ashlqi3_l_const4
   3770   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "l_register_operand" "")
   3771   1.1.1.2    mrg         (ashift:ALL1 (match_dup 0)
   3772   1.1.1.2    mrg                      (const_int 4)))
   3773   1.1.1.2    mrg    (match_scratch:QI 1 "d")]
   3774   1.1.1.2    mrg   ""
   3775   1.1.1.2    mrg   [(set (match_dup 2) (rotate:QI (match_dup 2) (const_int 4)))
   3776   1.1.1.2    mrg    (set (match_dup 1) (const_int -16))
   3777   1.1.1.2    mrg    (set (match_dup 2) (and:QI (match_dup 2) (match_dup 1)))]
   3778   1.1.1.2    mrg   {
   3779   1.1.1.2    mrg     operands[2] = avr_to_int_mode (operands[0]);
   3780   1.1.1.2    mrg   })
   3781   1.1.1.2    mrg 
   3782   1.1.1.2    mrg (define_peephole2 ; ashlqi3_l_const5
   3783   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "l_register_operand" "")
   3784   1.1.1.2    mrg         (ashift:ALL1 (match_dup 0)
   3785   1.1.1.2    mrg                      (const_int 5)))
   3786   1.1.1.2    mrg    (match_scratch:QI 1 "d")]
   3787   1.1.1.2    mrg   ""
   3788   1.1.1.2    mrg   [(set (match_dup 2) (rotate:QI (match_dup 2) (const_int 4)))
   3789   1.1.1.2    mrg    (set (match_dup 2) (ashift:QI (match_dup 2) (const_int 1)))
   3790   1.1.1.2    mrg    (set (match_dup 1) (const_int -32))
   3791   1.1.1.2    mrg    (set (match_dup 2) (and:QI (match_dup 2) (match_dup 1)))]
   3792   1.1.1.2    mrg   {
   3793   1.1.1.2    mrg     operands[2] = avr_to_int_mode (operands[0]);
   3794   1.1.1.2    mrg   })
   3795   1.1.1.2    mrg 
   3796   1.1.1.2    mrg (define_peephole2 ; ashlqi3_l_const6
   3797   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "l_register_operand" "")
   3798   1.1.1.2    mrg         (ashift:ALL1 (match_dup 0)
   3799   1.1.1.2    mrg                      (const_int 6)))
   3800   1.1.1.2    mrg    (match_scratch:QI 1 "d")]
   3801   1.1.1.2    mrg   ""
   3802   1.1.1.2    mrg   [(set (match_dup 2) (rotate:QI (match_dup 2) (const_int 4)))
   3803   1.1.1.2    mrg    (set (match_dup 2) (ashift:QI (match_dup 2) (const_int 2)))
   3804   1.1.1.2    mrg    (set (match_dup 1) (const_int -64))
   3805   1.1.1.2    mrg    (set (match_dup 2) (and:QI (match_dup 2) (match_dup 1)))]
   3806   1.1.1.2    mrg   {
   3807   1.1.1.2    mrg     operands[2] = avr_to_int_mode (operands[0]);
   3808   1.1.1.2    mrg   })
   3809   1.1.1.2    mrg 
   3810   1.1.1.2    mrg (define_peephole2
   3811   1.1.1.2    mrg   [(match_scratch:QI 3 "d")
   3812   1.1.1.2    mrg    (set (match_operand:ALL2 0 "register_operand" "")
   3813   1.1.1.2    mrg         (ashift:ALL2 (match_operand:ALL2 1 "register_operand" "")
   3814   1.1.1.2    mrg                      (match_operand:QI 2 "const_int_operand" "")))]
   3815   1.1.1.2    mrg   ""
   3816   1.1.1.2    mrg   [(parallel [(set (match_dup 0)
   3817   1.1.1.2    mrg                    (ashift:ALL2 (match_dup 1)
   3818   1.1.1.2    mrg                                 (match_dup 2)))
   3819   1.1.1.2    mrg               (clobber (match_dup 3))])])
   3820   1.1.1.2    mrg 
   3821   1.1.1.2    mrg ;; "*ashlhi3_const"
   3822   1.1.1.2    mrg ;; "*ashlhq3_const"  "*ashluhq3_const"
   3823   1.1.1.2    mrg ;; "*ashlha3_const"  "*ashluha3_const"
   3824   1.1.1.2    mrg (define_insn "*ashl<mode>3_const"
   3825   1.1.1.2    mrg   [(set (match_operand:ALL2 0 "register_operand"              "=r,r,r,r,r")
   3826   1.1.1.2    mrg         (ashift:ALL2 (match_operand:ALL2 1 "register_operand"  "0,0,r,0,0")
   3827   1.1.1.2    mrg                      (match_operand:QI 2 "const_int_operand"   "L,P,O,K,n")))
   3828   1.1.1.2    mrg    (clobber (match_scratch:QI 3                               "=X,X,X,X,&d"))]
   3829   1.1.1.2    mrg   "reload_completed"
   3830   1.1.1.2    mrg   {
   3831   1.1.1.2    mrg     return ashlhi3_out (insn, operands, NULL);
   3832   1.1.1.2    mrg   }
   3833   1.1.1.2    mrg   [(set_attr "length" "0,2,2,4,10")
   3834   1.1.1.2    mrg    (set_attr "adjust_len" "ashlhi")
   3835   1.1.1.2    mrg    (set_attr "cc" "none,set_n,clobber,set_n,clobber")])
   3836   1.1.1.2    mrg 
   3837   1.1.1.2    mrg (define_peephole2
   3838   1.1.1.2    mrg   [(match_scratch:QI 3 "d")
   3839   1.1.1.2    mrg    (set (match_operand:ALL4 0 "register_operand" "")
   3840   1.1.1.2    mrg         (ashift:ALL4 (match_operand:ALL4 1 "register_operand" "")
   3841   1.1.1.2    mrg                      (match_operand:QI 2 "const_int_operand" "")))]
   3842   1.1.1.2    mrg   ""
   3843   1.1.1.2    mrg   [(parallel [(set (match_dup 0)
   3844   1.1.1.2    mrg                    (ashift:ALL4 (match_dup 1)
   3845   1.1.1.2    mrg                                 (match_dup 2)))
   3846   1.1.1.2    mrg               (clobber (match_dup 3))])])
   3847   1.1.1.2    mrg 
   3848   1.1.1.2    mrg ;; "*ashlsi3_const"
   3849   1.1.1.2    mrg ;; "*ashlsq3_const"  "*ashlusq3_const"
   3850   1.1.1.2    mrg ;; "*ashlsa3_const"  "*ashlusa3_const"
   3851   1.1.1.2    mrg (define_insn "*ashl<mode>3_const"
   3852   1.1.1.2    mrg   [(set (match_operand:ALL4 0 "register_operand"              "=r,r,r,r")
   3853   1.1.1.2    mrg         (ashift:ALL4 (match_operand:ALL4 1 "register_operand"  "0,0,r,0")
   3854   1.1.1.2    mrg                      (match_operand:QI 2 "const_int_operand"   "L,P,O,n")))
   3855   1.1.1.2    mrg    (clobber (match_scratch:QI 3                               "=X,X,X,&d"))]
   3856   1.1.1.2    mrg   "reload_completed"
   3857   1.1.1.2    mrg   {
   3858   1.1.1.2    mrg     return ashlsi3_out (insn, operands, NULL);
   3859   1.1.1.2    mrg   }
   3860   1.1.1.2    mrg   [(set_attr "length" "0,4,4,10")
   3861   1.1.1.2    mrg    (set_attr "adjust_len" "ashlsi")
   3862   1.1.1.2    mrg    (set_attr "cc" "none,set_n,clobber,clobber")])
   3863   1.1.1.2    mrg 
   3864   1.1.1.2    mrg (define_expand "ashlpsi3"
   3865   1.1.1.2    mrg   [(parallel [(set (match_operand:PSI 0 "register_operand"             "")
   3866   1.1.1.2    mrg                    (ashift:PSI (match_operand:PSI 1 "register_operand" "")
   3867   1.1.1.2    mrg                                (match_operand:QI 2 "nonmemory_operand" "")))
   3868   1.1.1.2    mrg               (clobber (scratch:QI))])]
   3869   1.1.1.2    mrg   ""
   3870   1.1.1.2    mrg   {
   3871   1.1.1.2    mrg     if (AVR_HAVE_MUL
   3872   1.1.1.2    mrg         && CONST_INT_P (operands[2]))
   3873   1.1.1.2    mrg       {
   3874   1.1.1.2    mrg         if (IN_RANGE (INTVAL (operands[2]), 3, 6))
   3875   1.1.1.2    mrg           {
   3876   1.1.1.2    mrg             rtx xoffset = force_reg (QImode, gen_int_mode (1 << INTVAL (operands[2]), QImode));
   3877   1.1.1.2    mrg             emit_insn (gen_mulsqipsi3 (operands[0], xoffset, operands[1]));
   3878   1.1.1.2    mrg             DONE;
   3879   1.1.1.2    mrg           }
   3880   1.1.1.2    mrg         else if (optimize_insn_for_speed_p ()
   3881   1.1.1.2    mrg                  && INTVAL (operands[2]) != 16
   3882   1.1.1.2    mrg                  && IN_RANGE (INTVAL (operands[2]), 9, 22))
   3883   1.1.1.2    mrg           {
   3884   1.1.1.2    mrg             rtx xoffset = force_reg (PSImode, gen_int_mode (1 << INTVAL (operands[2]), PSImode));
   3885   1.1.1.2    mrg             emit_insn (gen_mulpsi3 (operands[0], operands[1], xoffset));
   3886   1.1.1.2    mrg             DONE;
   3887   1.1.1.2    mrg           }
   3888   1.1.1.2    mrg       }
   3889   1.1.1.2    mrg   })
   3890   1.1.1.2    mrg 
   3891   1.1.1.2    mrg (define_insn "*ashlpsi3"
   3892   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"             "=r,r,r,r")
   3893   1.1.1.2    mrg         (ashift:PSI (match_operand:PSI 1 "register_operand"  "0,0,r,0")
   3894   1.1.1.2    mrg                     (match_operand:QI 2 "nonmemory_operand"  "r,P,O,n")))
   3895   1.1.1.2    mrg    (clobber (match_scratch:QI 3                             "=X,X,X,&d"))]
   3896   1.1.1.2    mrg   ""
   3897   1.1.1.2    mrg   {
   3898   1.1.1.2    mrg     return avr_out_ashlpsi3 (insn, operands, NULL);
   3899   1.1.1.2    mrg   }
   3900   1.1.1.2    mrg   [(set_attr "adjust_len" "ashlpsi")
   3901   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   3902   1.1.1.2    mrg 
   3903   1.1.1.2    mrg ;; >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
   3904   1.1.1.2    mrg ;; arithmetic shift right
   3905   1.1.1.2    mrg 
   3906   1.1.1.2    mrg ;; "ashrqi3"
   3907   1.1.1.2    mrg ;; "ashrqq3"  "ashruqq3"
   3908   1.1.1.2    mrg (define_insn "ashr<mode>3"
   3909   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "register_operand"                  "=r,r,r,r,r          ,r      ,r")
   3910   1.1.1.2    mrg         (ashiftrt:ALL1 (match_operand:ALL1 1 "register_operand"    "0,0,0,0,0          ,0      ,0")
   3911   1.1.1.2    mrg                        (match_operand:QI 2 "nop_general_operand"   "r,L,P,K,C03 C04 C05,C06 C07,Qm")))]
   3912   1.1.1.2    mrg   ""
   3913   1.1.1.2    mrg   {
   3914   1.1.1.2    mrg     return ashrqi3_out (insn, operands, NULL);
   3915   1.1.1.2    mrg   }
   3916   1.1.1.2    mrg   [(set_attr "length" "5,0,1,2,5,4,9")
   3917   1.1.1.2    mrg    (set_attr "adjust_len" "ashrqi")
   3918   1.1.1.2    mrg    (set_attr "cc" "clobber,none,set_czn,set_czn,set_czn,clobber,clobber")])
   3919   1.1.1.2    mrg 
   3920   1.1.1.2    mrg ;; "ashrhi3"
   3921   1.1.1.2    mrg ;; "ashrhq3"  "ashruhq3"
   3922   1.1.1.2    mrg ;; "ashrha3"  "ashruha3"
   3923   1.1.1.2    mrg (define_insn "ashr<mode>3"
   3924   1.1.1.2    mrg   [(set (match_operand:ALL2 0 "register_operand"                "=r,r,r,r,r,r,r")
   3925   1.1.1.2    mrg         (ashiftrt:ALL2 (match_operand:ALL2 1 "register_operand"  "0,0,0,r,0,0,0")
   3926   1.1.1.2    mrg                        (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm")))]
   3927   1.1.1.2    mrg   ""
   3928   1.1.1.2    mrg   {
   3929   1.1.1.2    mrg     return ashrhi3_out (insn, operands, NULL);
   3930   1.1.1.2    mrg   }
   3931   1.1.1.2    mrg   [(set_attr "length" "6,0,2,4,4,10,10")
   3932   1.1.1.2    mrg    (set_attr "adjust_len" "ashrhi")
   3933   1.1.1.2    mrg    (set_attr "cc" "clobber,none,clobber,set_n,clobber,clobber,clobber")])
   3934   1.1.1.2    mrg 
   3935   1.1.1.2    mrg (define_insn "ashrpsi3"
   3936   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"                 "=r,r,r,r,r")
   3937   1.1.1.2    mrg         (ashiftrt:PSI (match_operand:PSI 1 "register_operand"    "0,0,0,r,0")
   3938   1.1.1.2    mrg                       (match_operand:QI 2 "nonmemory_operand"    "r,P,K,O,n")))
   3939   1.1.1.2    mrg    (clobber (match_scratch:QI 3                                 "=X,X,X,X,&d"))]
   3940   1.1.1.2    mrg   ""
   3941   1.1.1.2    mrg   {
   3942   1.1.1.2    mrg     return avr_out_ashrpsi3 (insn, operands, NULL);
   3943   1.1.1.2    mrg   }
   3944   1.1.1.2    mrg   [(set_attr "adjust_len" "ashrpsi")
   3945   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   3946   1.1.1.2    mrg 
   3947   1.1.1.2    mrg ;; "ashrsi3"
   3948   1.1.1.2    mrg ;; "ashrsq3"  "ashrusq3"
   3949   1.1.1.2    mrg ;; "ashrsa3"  "ashrusa3"
   3950   1.1.1.2    mrg (define_insn "ashr<mode>3"
   3951   1.1.1.2    mrg   [(set (match_operand:ALL4 0 "register_operand"                  "=r,r,r,r,r,r,r")
   3952   1.1.1.2    mrg         (ashiftrt:ALL4 (match_operand:ALL4 1 "register_operand"    "0,0,0,r,0,0,0")
   3953   1.1.1.2    mrg                        (match_operand:QI 2 "nop_general_operand"   "r,L,P,O,K,n,Qm")))]
   3954   1.1.1.2    mrg   ""
   3955   1.1.1.2    mrg   {
   3956   1.1.1.2    mrg     return ashrsi3_out (insn, operands, NULL);
   3957   1.1.1.2    mrg   }
   3958   1.1.1.2    mrg   [(set_attr "length" "8,0,4,6,8,10,12")
   3959   1.1.1.2    mrg    (set_attr "adjust_len" "ashrsi")
   3960   1.1.1.2    mrg    (set_attr "cc" "clobber,none,clobber,set_n,clobber,clobber,clobber")])
   3961   1.1.1.2    mrg 
   3962   1.1.1.2    mrg ;; Optimize if a scratch register from LD_REGS happens to be available.
   3963   1.1.1.2    mrg 
   3964   1.1.1.2    mrg (define_peephole2
   3965   1.1.1.2    mrg   [(match_scratch:QI 3 "d")
   3966   1.1.1.2    mrg    (set (match_operand:ALL2 0 "register_operand" "")
   3967   1.1.1.2    mrg         (ashiftrt:ALL2 (match_operand:ALL2 1 "register_operand" "")
   3968   1.1.1.2    mrg                        (match_operand:QI 2 "const_int_operand" "")))]
   3969   1.1.1.2    mrg   ""
   3970   1.1.1.2    mrg   [(parallel [(set (match_dup 0)
   3971   1.1.1.2    mrg                    (ashiftrt:ALL2 (match_dup 1)
   3972   1.1.1.2    mrg                                   (match_dup 2)))
   3973   1.1.1.2    mrg               (clobber (match_dup 3))])])
   3974   1.1.1.2    mrg 
   3975   1.1.1.2    mrg ;; "*ashrhi3_const"
   3976   1.1.1.2    mrg ;; "*ashrhq3_const"  "*ashruhq3_const"
   3977   1.1.1.2    mrg ;; "*ashrha3_const"  "*ashruha3_const"
   3978   1.1.1.2    mrg (define_insn "*ashr<mode>3_const"
   3979   1.1.1.2    mrg   [(set (match_operand:ALL2 0 "register_operand"                "=r,r,r,r,r")
   3980   1.1.1.2    mrg         (ashiftrt:ALL2 (match_operand:ALL2 1 "register_operand"  "0,0,r,0,0")
   3981   1.1.1.2    mrg                        (match_operand:QI 2 "const_int_operand"   "L,P,O,K,n")))
   3982   1.1.1.2    mrg    (clobber (match_scratch:QI 3                                 "=X,X,X,X,&d"))]
   3983   1.1.1.2    mrg   "reload_completed"
   3984   1.1.1.2    mrg   {
   3985   1.1.1.2    mrg     return ashrhi3_out (insn, operands, NULL);
   3986   1.1.1.2    mrg   }
   3987   1.1.1.2    mrg   [(set_attr "length" "0,2,4,4,10")
   3988   1.1.1.2    mrg    (set_attr "adjust_len" "ashrhi")
   3989   1.1.1.2    mrg    (set_attr "cc" "none,clobber,set_n,clobber,clobber")])
   3990   1.1.1.2    mrg 
   3991   1.1.1.2    mrg (define_peephole2
   3992   1.1.1.2    mrg   [(match_scratch:QI 3 "d")
   3993   1.1.1.2    mrg    (set (match_operand:ALL4 0 "register_operand" "")
   3994   1.1.1.2    mrg         (ashiftrt:ALL4 (match_operand:ALL4 1 "register_operand" "")
   3995   1.1.1.2    mrg                        (match_operand:QI 2 "const_int_operand" "")))]
   3996   1.1.1.2    mrg   ""
   3997   1.1.1.2    mrg   [(parallel [(set (match_dup 0)
   3998   1.1.1.2    mrg                    (ashiftrt:ALL4 (match_dup 1)
   3999   1.1.1.2    mrg                                   (match_dup 2)))
   4000   1.1.1.2    mrg               (clobber (match_dup 3))])])
   4001   1.1.1.2    mrg 
   4002   1.1.1.2    mrg ;; "*ashrsi3_const"
   4003   1.1.1.2    mrg ;; "*ashrsq3_const"  "*ashrusq3_const"
   4004   1.1.1.2    mrg ;; "*ashrsa3_const"  "*ashrusa3_const"
   4005   1.1.1.2    mrg (define_insn "*ashr<mode>3_const"
   4006   1.1.1.2    mrg   [(set (match_operand:ALL4 0 "register_operand"                "=r,r,r,r")
   4007   1.1.1.2    mrg         (ashiftrt:ALL4 (match_operand:ALL4 1 "register_operand"  "0,0,r,0")
   4008   1.1.1.2    mrg                        (match_operand:QI 2 "const_int_operand"   "L,P,O,n")))
   4009   1.1.1.2    mrg    (clobber (match_scratch:QI 3                                 "=X,X,X,&d"))]
   4010   1.1.1.2    mrg   "reload_completed"
   4011   1.1.1.2    mrg   {
   4012   1.1.1.2    mrg     return ashrsi3_out (insn, operands, NULL);
   4013   1.1.1.2    mrg   }
   4014   1.1.1.2    mrg   [(set_attr "length" "0,4,4,10")
   4015   1.1.1.2    mrg    (set_attr "adjust_len" "ashrsi")
   4016   1.1.1.2    mrg    (set_attr "cc" "none,clobber,set_n,clobber")])
   4017   1.1.1.2    mrg 
   4018   1.1.1.2    mrg ;; >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
   4019   1.1.1.2    mrg ;; logical shift right
   4020   1.1.1.2    mrg 
   4021   1.1.1.2    mrg ;; "lshrqi3"
   4022   1.1.1.9    mrg ;; "lshrqq3" "lshruqq3"
   4023   1.1.1.2    mrg (define_expand "lshr<mode>3"
   4024   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "register_operand" "")
   4025   1.1.1.2    mrg         (lshiftrt:ALL1 (match_operand:ALL1 1 "register_operand" "")
   4026   1.1.1.2    mrg                        (match_operand:QI 2 "nop_general_operand" "")))])
   4027   1.1.1.2    mrg 
   4028   1.1.1.2    mrg (define_split	; lshrqi3_const4
   4029   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "d_register_operand" "")
   4030   1.1.1.2    mrg         (lshiftrt:ALL1 (match_dup 0)
   4031   1.1.1.2    mrg                        (const_int 4)))]
   4032   1.1.1.2    mrg   ""
   4033   1.1.1.2    mrg   [(set (match_dup 1)
   4034   1.1.1.2    mrg         (rotate:QI (match_dup 1)
   4035   1.1.1.2    mrg                    (const_int 4)))
   4036   1.1.1.2    mrg    (set (match_dup 1)
   4037   1.1.1.2    mrg         (and:QI (match_dup 1)
   4038   1.1.1.2    mrg                 (const_int 15)))]
   4039   1.1.1.2    mrg   {
   4040   1.1.1.2    mrg     operands[1] = avr_to_int_mode (operands[0]);
   4041   1.1.1.2    mrg   })
   4042   1.1.1.2    mrg 
   4043   1.1.1.2    mrg (define_split	; lshrqi3_const5
   4044   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "d_register_operand" "")
   4045   1.1.1.2    mrg         (lshiftrt:ALL1 (match_dup 0)
   4046   1.1.1.2    mrg                        (const_int 5)))]
   4047   1.1.1.2    mrg   ""
   4048   1.1.1.2    mrg   [(set (match_dup 1) (rotate:QI (match_dup 1) (const_int 4)))
   4049   1.1.1.2    mrg    (set (match_dup 1) (lshiftrt:QI (match_dup 1) (const_int 1)))
   4050   1.1.1.2    mrg    (set (match_dup 1) (and:QI (match_dup 1) (const_int 7)))]
   4051   1.1.1.2    mrg   {
   4052   1.1.1.2    mrg     operands[1] = avr_to_int_mode (operands[0]);
   4053   1.1.1.2    mrg   })
   4054   1.1.1.2    mrg 
   4055   1.1.1.2    mrg (define_split	; lshrqi3_const6
   4056   1.1.1.2    mrg   [(set (match_operand:QI 0 "d_register_operand" "")
   4057   1.1.1.2    mrg         (lshiftrt:QI (match_dup 0)
   4058   1.1.1.2    mrg                      (const_int 6)))]
   4059   1.1.1.2    mrg   ""
   4060   1.1.1.2    mrg   [(set (match_dup 1) (rotate:QI (match_dup 1) (const_int 4)))
   4061   1.1.1.2    mrg    (set (match_dup 1) (lshiftrt:QI (match_dup 1) (const_int 2)))
   4062   1.1.1.2    mrg    (set (match_dup 1) (and:QI (match_dup 1) (const_int 3)))]
   4063   1.1.1.2    mrg   {
   4064   1.1.1.2    mrg     operands[1] = avr_to_int_mode (operands[0]);
   4065   1.1.1.2    mrg   })
   4066   1.1.1.2    mrg 
   4067   1.1.1.2    mrg ;; "*lshrqi3"
   4068   1.1.1.2    mrg ;; "*lshrqq3"
   4069   1.1.1.2    mrg ;; "*lshruqq3"
   4070   1.1.1.2    mrg (define_insn "*lshr<mode>3"
   4071   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "register_operand"                  "=r,r,r,r,!d,r,r")
   4072   1.1.1.2    mrg         (lshiftrt:ALL1 (match_operand:ALL1 1 "register_operand"    "0,0,0,0,0 ,0,0")
   4073   1.1.1.2    mrg                        (match_operand:QI 2 "nop_general_operand"   "r,L,P,K,n ,n,Qm")))]
   4074   1.1.1.2    mrg   ""
   4075   1.1.1.2    mrg   {
   4076   1.1.1.2    mrg     return lshrqi3_out (insn, operands, NULL);
   4077   1.1.1.2    mrg   }
   4078   1.1.1.2    mrg   [(set_attr "length" "5,0,1,2,4,6,9")
   4079   1.1.1.2    mrg    (set_attr "adjust_len" "lshrqi")
   4080   1.1.1.2    mrg    (set_attr "cc" "clobber,none,set_czn,set_czn,set_czn,set_czn,clobber")])
   4081   1.1.1.2    mrg 
   4082   1.1.1.2    mrg ;; "lshrhi3"
   4083   1.1.1.2    mrg ;; "lshrhq3"  "lshruhq3"
   4084   1.1.1.2    mrg ;; "lshrha3"  "lshruha3"
   4085   1.1.1.2    mrg (define_insn "lshr<mode>3"
   4086   1.1.1.2    mrg   [(set (match_operand:ALL2 0 "register_operand"                "=r,r,r,r,r,r,r")
   4087   1.1.1.2    mrg         (lshiftrt:ALL2 (match_operand:ALL2 1 "register_operand"    "0,0,0,r,0,0,0")
   4088   1.1.1.2    mrg                        (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm")))]
   4089   1.1.1.2    mrg   ""
   4090   1.1.1.2    mrg   {
   4091   1.1.1.2    mrg     return lshrhi3_out (insn, operands, NULL);
   4092   1.1.1.2    mrg   }
   4093   1.1.1.2    mrg   [(set_attr "length" "6,0,2,2,4,10,10")
   4094   1.1.1.2    mrg    (set_attr "adjust_len" "lshrhi")
   4095   1.1.1.2    mrg    (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber,clobber")])
   4096   1.1.1.2    mrg 
   4097   1.1.1.2    mrg (define_insn "lshrpsi3"
   4098   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"                 "=r,r,r,r,r")
   4099   1.1.1.2    mrg         (lshiftrt:PSI (match_operand:PSI 1 "register_operand"    "0,0,r,0,0")
   4100   1.1.1.2    mrg                       (match_operand:QI 2 "nonmemory_operand"    "r,P,O,K,n")))
   4101   1.1.1.2    mrg    (clobber (match_scratch:QI 3                                 "=X,X,X,X,&d"))]
   4102   1.1.1.2    mrg   ""
   4103   1.1.1.2    mrg   {
   4104   1.1.1.2    mrg     return avr_out_lshrpsi3 (insn, operands, NULL);
   4105   1.1.1.2    mrg   }
   4106   1.1.1.2    mrg   [(set_attr "adjust_len" "lshrpsi")
   4107   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   4108   1.1.1.2    mrg 
   4109   1.1.1.2    mrg ;; "lshrsi3"
   4110   1.1.1.2    mrg ;; "lshrsq3"  "lshrusq3"
   4111   1.1.1.2    mrg ;; "lshrsa3"  "lshrusa3"
   4112   1.1.1.2    mrg (define_insn "lshr<mode>3"
   4113   1.1.1.2    mrg   [(set (match_operand:ALL4 0 "register_operand"                  "=r,r,r,r,r,r,r")
   4114   1.1.1.2    mrg         (lshiftrt:ALL4 (match_operand:ALL4 1 "register_operand"    "0,0,0,r,0,0,0")
   4115   1.1.1.2    mrg                        (match_operand:QI 2 "nop_general_operand"   "r,L,P,O,K,n,Qm")))]
   4116   1.1.1.2    mrg   ""
   4117   1.1.1.2    mrg   {
   4118   1.1.1.2    mrg     return lshrsi3_out (insn, operands, NULL);
   4119   1.1.1.2    mrg   }
   4120   1.1.1.2    mrg   [(set_attr "length" "8,0,4,4,8,10,12")
   4121   1.1.1.2    mrg    (set_attr "adjust_len" "lshrsi")
   4122   1.1.1.2    mrg    (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber,clobber")])
   4123   1.1.1.2    mrg 
   4124   1.1.1.2    mrg ;; Optimize if a scratch register from LD_REGS happens to be available.
   4125   1.1.1.2    mrg 
   4126   1.1.1.2    mrg (define_peephole2 ; lshrqi3_l_const4
   4127   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "l_register_operand" "")
   4128   1.1.1.2    mrg         (lshiftrt:ALL1 (match_dup 0)
   4129   1.1.1.2    mrg                        (const_int 4)))
   4130   1.1.1.2    mrg    (match_scratch:QI 1 "d")]
   4131   1.1.1.2    mrg   ""
   4132   1.1.1.2    mrg   [(set (match_dup 2) (rotate:QI (match_dup 2) (const_int 4)))
   4133   1.1.1.2    mrg    (set (match_dup 1) (const_int 15))
   4134   1.1.1.2    mrg    (set (match_dup 2) (and:QI (match_dup 2) (match_dup 1)))]
   4135   1.1.1.2    mrg   {
   4136   1.1.1.2    mrg     operands[2] = avr_to_int_mode (operands[0]);
   4137   1.1.1.2    mrg   })
   4138   1.1.1.2    mrg 
   4139   1.1.1.2    mrg (define_peephole2 ; lshrqi3_l_const5
   4140   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "l_register_operand" "")
   4141   1.1.1.2    mrg         (lshiftrt:ALL1 (match_dup 0)
   4142   1.1.1.2    mrg                        (const_int 5)))
   4143   1.1.1.2    mrg    (match_scratch:QI 1 "d")]
   4144   1.1.1.2    mrg   ""
   4145   1.1.1.2    mrg   [(set (match_dup 2) (rotate:QI (match_dup 2) (const_int 4)))
   4146   1.1.1.2    mrg    (set (match_dup 2) (lshiftrt:QI (match_dup 2) (const_int 1)))
   4147   1.1.1.2    mrg    (set (match_dup 1) (const_int 7))
   4148   1.1.1.2    mrg    (set (match_dup 2) (and:QI (match_dup 2) (match_dup 1)))]
   4149   1.1.1.2    mrg   {
   4150   1.1.1.2    mrg     operands[2] = avr_to_int_mode (operands[0]);
   4151   1.1.1.2    mrg   })
   4152   1.1.1.2    mrg 
   4153   1.1.1.2    mrg (define_peephole2 ; lshrqi3_l_const6
   4154   1.1.1.2    mrg   [(set (match_operand:ALL1 0 "l_register_operand" "")
   4155   1.1.1.2    mrg         (lshiftrt:ALL1 (match_dup 0)
   4156   1.1.1.2    mrg                        (const_int 6)))
   4157   1.1.1.2    mrg    (match_scratch:QI 1 "d")]
   4158   1.1.1.2    mrg   ""
   4159   1.1.1.2    mrg   [(set (match_dup 2) (rotate:QI (match_dup 2) (const_int 4)))
   4160   1.1.1.2    mrg    (set (match_dup 2) (lshiftrt:QI (match_dup 2) (const_int 2)))
   4161   1.1.1.2    mrg    (set (match_dup 1) (const_int 3))
   4162   1.1.1.2    mrg    (set (match_dup 2) (and:QI (match_dup 2) (match_dup 1)))]
   4163   1.1.1.2    mrg   {
   4164   1.1.1.2    mrg     operands[2] = avr_to_int_mode (operands[0]);
   4165   1.1.1.2    mrg   })
   4166   1.1.1.2    mrg 
   4167   1.1.1.2    mrg (define_peephole2
   4168   1.1.1.2    mrg   [(match_scratch:QI 3 "d")
   4169   1.1.1.2    mrg    (set (match_operand:ALL2 0 "register_operand" "")
   4170   1.1.1.2    mrg         (lshiftrt:ALL2 (match_operand:ALL2 1 "register_operand" "")
   4171   1.1.1.2    mrg                        (match_operand:QI 2 "const_int_operand" "")))]
   4172   1.1.1.2    mrg   ""
   4173   1.1.1.2    mrg   [(parallel [(set (match_dup 0)
   4174   1.1.1.2    mrg                    (lshiftrt:ALL2 (match_dup 1)
   4175   1.1.1.2    mrg                                   (match_dup 2)))
   4176   1.1.1.2    mrg               (clobber (match_dup 3))])])
   4177   1.1.1.2    mrg 
   4178   1.1.1.2    mrg ;; "*lshrhi3_const"
   4179   1.1.1.2    mrg ;; "*lshrhq3_const"  "*lshruhq3_const"
   4180   1.1.1.2    mrg ;; "*lshrha3_const"  "*lshruha3_const"
   4181   1.1.1.2    mrg (define_insn "*lshr<mode>3_const"
   4182   1.1.1.2    mrg   [(set (match_operand:ALL2 0 "register_operand"                "=r,r,r,r,r")
   4183   1.1.1.2    mrg         (lshiftrt:ALL2 (match_operand:ALL2 1 "register_operand"  "0,0,r,0,0")
   4184   1.1.1.2    mrg                        (match_operand:QI 2 "const_int_operand"   "L,P,O,K,n")))
   4185   1.1.1.2    mrg    (clobber (match_scratch:QI 3                                 "=X,X,X,X,&d"))]
   4186   1.1.1.2    mrg   "reload_completed"
   4187   1.1.1.2    mrg   {
   4188   1.1.1.2    mrg     return lshrhi3_out (insn, operands, NULL);
   4189   1.1.1.2    mrg   }
   4190   1.1.1.2    mrg   [(set_attr "length" "0,2,2,4,10")
   4191   1.1.1.2    mrg    (set_attr "adjust_len" "lshrhi")
   4192   1.1.1.2    mrg    (set_attr "cc" "none,clobber,clobber,clobber,clobber")])
   4193   1.1.1.2    mrg 
   4194   1.1.1.2    mrg (define_peephole2
   4195   1.1.1.2    mrg   [(match_scratch:QI 3 "d")
   4196   1.1.1.2    mrg    (set (match_operand:ALL4 0 "register_operand" "")
   4197   1.1.1.2    mrg         (lshiftrt:ALL4 (match_operand:ALL4 1 "register_operand" "")
   4198   1.1.1.2    mrg                        (match_operand:QI 2 "const_int_operand" "")))]
   4199   1.1.1.2    mrg   ""
   4200   1.1.1.2    mrg   [(parallel [(set (match_dup 0)
   4201   1.1.1.2    mrg                    (lshiftrt:ALL4 (match_dup 1)
   4202   1.1.1.2    mrg                                   (match_dup 2)))
   4203   1.1.1.2    mrg               (clobber (match_dup 3))])])
   4204   1.1.1.2    mrg 
   4205   1.1.1.2    mrg ;; "*lshrsi3_const"
   4206   1.1.1.2    mrg ;; "*lshrsq3_const"  "*lshrusq3_const"
   4207   1.1.1.2    mrg ;; "*lshrsa3_const"  "*lshrusa3_const"
   4208   1.1.1.2    mrg (define_insn "*lshr<mode>3_const"
   4209   1.1.1.2    mrg   [(set (match_operand:ALL4 0 "register_operand"               "=r,r,r,r")
   4210   1.1.1.2    mrg         (lshiftrt:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,r,0")
   4211   1.1.1.2    mrg                        (match_operand:QI 2 "const_int_operand"  "L,P,O,n")))
   4212   1.1.1.2    mrg    (clobber (match_scratch:QI 3                                "=X,X,X,&d"))]
   4213   1.1.1.2    mrg   "reload_completed"
   4214   1.1.1.2    mrg   {
   4215   1.1.1.2    mrg     return lshrsi3_out (insn, operands, NULL);
   4216   1.1.1.2    mrg   }
   4217   1.1.1.2    mrg   [(set_attr "length" "0,4,4,10")
   4218   1.1.1.2    mrg    (set_attr "adjust_len" "lshrsi")
   4219   1.1.1.2    mrg    (set_attr "cc" "none,clobber,clobber,clobber")])
   4220   1.1.1.2    mrg 
   4221   1.1.1.2    mrg ;; abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x)
   4222   1.1.1.2    mrg ;; abs
   4223   1.1.1.2    mrg 
   4224   1.1.1.2    mrg (define_insn "absqi2"
   4225   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand" "=r")
   4226   1.1.1.2    mrg         (abs:QI (match_operand:QI 1 "register_operand" "0")))]
   4227   1.1.1.2    mrg   ""
   4228   1.1.1.2    mrg   "sbrc %0,7
   4229   1.1.1.2    mrg 	neg %0"
   4230   1.1.1.2    mrg   [(set_attr "length" "2")
   4231   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   4232   1.1.1.2    mrg 
   4233   1.1.1.2    mrg 
   4234   1.1.1.2    mrg (define_insn "abssf2"
   4235   1.1.1.2    mrg   [(set (match_operand:SF 0 "register_operand" "=d,r")
   4236   1.1.1.2    mrg         (abs:SF (match_operand:SF 1 "register_operand" "0,0")))]
   4237   1.1.1.2    mrg   ""
   4238   1.1.1.2    mrg   "@
   4239   1.1.1.2    mrg 	andi %D0,0x7f
   4240   1.1.1.2    mrg 	clt\;bld %D0,7"
   4241   1.1.1.2    mrg   [(set_attr "length" "1,2")
   4242   1.1.1.2    mrg    (set_attr "cc" "set_n,clobber")])
   4243   1.1.1.2    mrg 
   4244   1.1.1.2    mrg ;; 0 - x  0 - x  0 - x  0 - x  0 - x  0 - x  0 - x  0 - x  0 - x  0 - x  0 - x
   4245   1.1.1.2    mrg ;; neg
   4246   1.1.1.2    mrg 
   4247   1.1.1.2    mrg (define_insn "negqi2"
   4248   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand" "=r")
   4249   1.1.1.2    mrg         (neg:QI (match_operand:QI 1 "register_operand" "0")))]
   4250   1.1.1.2    mrg   ""
   4251   1.1.1.2    mrg   "neg %0"
   4252   1.1.1.2    mrg   [(set_attr "length" "1")
   4253   1.1.1.3  skrll    (set_attr "cc" "set_vzn")])
   4254   1.1.1.2    mrg 
   4255   1.1.1.2    mrg (define_insn "*negqihi2"
   4256   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                        "=r")
   4257   1.1.1.2    mrg         (neg:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "0"))))]
   4258   1.1.1.2    mrg   ""
   4259   1.1.1.2    mrg   "clr %B0\;neg %A0\;brge .+2\;com %B0"
   4260   1.1.1.2    mrg   [(set_attr "length" "4")
   4261   1.1.1.2    mrg    (set_attr "cc" "set_n")])
   4262   1.1.1.2    mrg 
   4263   1.1.1.2    mrg (define_insn "neghi2"
   4264   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"        "=r,&r")
   4265   1.1.1.2    mrg         (neg:HI (match_operand:HI 1 "register_operand" "0,r")))]
   4266   1.1.1.2    mrg   ""
   4267   1.1.1.2    mrg   "@
   4268   1.1.1.2    mrg 	neg %B0\;neg %A0\;sbc %B0,__zero_reg__
   4269   1.1.1.2    mrg 	clr %A0\;clr %B0\;sub %A0,%A1\;sbc %B0,%B1"
   4270   1.1.1.2    mrg   [(set_attr "length" "3,4")
   4271   1.1.1.2    mrg    (set_attr "cc" "set_czn")])
   4272   1.1.1.2    mrg 
   4273   1.1.1.2    mrg (define_insn "negpsi2"
   4274   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"        "=!d,r,&r")
   4275   1.1.1.2    mrg         (neg:PSI (match_operand:PSI 1 "register_operand" "0,0,r")))]
   4276   1.1.1.2    mrg   ""
   4277   1.1.1.2    mrg   "@
   4278   1.1.1.2    mrg 	com %C0\;com %B0\;neg %A0\;sbci %B0,-1\;sbci %C0,-1
   4279   1.1.1.2    mrg 	com %C0\;com %B0\;com %A0\;adc %A0,__zero_reg__\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__
   4280   1.1.1.2    mrg 	clr %A0\;clr %B0\;clr %C0\;sub %A0,%A1\;sbc %B0,%B1\;sbc %C0,%C1"
   4281   1.1.1.2    mrg   [(set_attr "length" "5,6,6")
   4282   1.1.1.2    mrg    (set_attr "cc" "set_czn,set_n,set_czn")])
   4283   1.1.1.2    mrg 
   4284   1.1.1.2    mrg (define_insn "negsi2"
   4285   1.1.1.2    mrg   [(set (match_operand:SI 0 "register_operand"       "=!d,r,&r,&r")
   4286   1.1.1.2    mrg         (neg:SI (match_operand:SI 1 "register_operand" "0,0,r ,r")))]
   4287   1.1.1.2    mrg   ""
   4288   1.1.1.2    mrg   "@
   4289   1.1.1.2    mrg 	com %D0\;com %C0\;com %B0\;neg %A0\;sbci %B0,lo8(-1)\;sbci %C0,lo8(-1)\;sbci %D0,lo8(-1)
   4290   1.1.1.2    mrg 	com %D0\;com %C0\;com %B0\;com %A0\;adc %A0,__zero_reg__\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__\;adc %D0,__zero_reg__
   4291   1.1.1.2    mrg 	clr %A0\;clr %B0\;clr %C0\;clr %D0\;sub %A0,%A1\;sbc %B0,%B1\;sbc %C0,%C1\;sbc %D0,%D1
   4292   1.1.1.2    mrg 	clr %A0\;clr %B0\;movw %C0,%A0\;sub %A0,%A1\;sbc %B0,%B1\;sbc %C0,%C1\;sbc %D0,%D1"
   4293   1.1.1.2    mrg   [(set_attr "length" "7,8,8,7")
   4294   1.1.1.2    mrg    (set_attr "isa"    "*,*,mov,movw")
   4295   1.1.1.2    mrg    (set_attr "cc" "set_czn,set_n,set_czn,set_czn")])
   4296   1.1.1.2    mrg 
   4297   1.1.1.2    mrg (define_insn "negsf2"
   4298   1.1.1.2    mrg   [(set (match_operand:SF 0 "register_operand" "=d,r")
   4299   1.1.1.2    mrg 	(neg:SF (match_operand:SF 1 "register_operand" "0,0")))]
   4300   1.1.1.2    mrg   ""
   4301   1.1.1.2    mrg   "@
   4302   1.1.1.2    mrg 	subi %D0,0x80
   4303   1.1.1.2    mrg 	bst %D0,7\;com %D0\;bld %D0,7\;com %D0"
   4304   1.1.1.2    mrg   [(set_attr "length" "1,4")
   4305   1.1.1.2    mrg    (set_attr "cc" "set_n,set_n")])
   4306   1.1.1.2    mrg 
   4307   1.1.1.2    mrg ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   4308   1.1.1.2    mrg ;; not
   4309   1.1.1.2    mrg 
   4310   1.1.1.2    mrg (define_insn "one_cmplqi2"
   4311   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand" "=r")
   4312   1.1.1.2    mrg         (not:QI (match_operand:QI 1 "register_operand" "0")))]
   4313   1.1.1.2    mrg   ""
   4314   1.1.1.2    mrg   "com %0"
   4315   1.1.1.2    mrg   [(set_attr "length" "1")
   4316   1.1.1.2    mrg    (set_attr "cc" "set_czn")])
   4317       1.1    mrg 
   4318       1.1    mrg (define_insn "one_cmplhi2"
   4319       1.1    mrg   [(set (match_operand:HI 0 "register_operand" "=r")
   4320       1.1    mrg         (not:HI (match_operand:HI 1 "register_operand" "0")))]
   4321       1.1    mrg   ""
   4322   1.1.1.2    mrg   "com %0
   4323   1.1.1.2    mrg 	com %B0"
   4324   1.1.1.2    mrg   [(set_attr "length" "2")
   4325   1.1.1.2    mrg    (set_attr "cc" "set_n")])
   4326   1.1.1.2    mrg 
   4327   1.1.1.2    mrg (define_insn "one_cmplpsi2"
   4328   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand" "=r")
   4329   1.1.1.2    mrg         (not:PSI (match_operand:PSI 1 "register_operand" "0")))]
   4330   1.1.1.2    mrg   ""
   4331   1.1.1.2    mrg   "com %0\;com %B0\;com %C0"
   4332   1.1.1.2    mrg   [(set_attr "length" "3")
   4333   1.1.1.2    mrg    (set_attr "cc" "set_n")])
   4334   1.1.1.2    mrg 
   4335   1.1.1.2    mrg (define_insn "one_cmplsi2"
   4336   1.1.1.2    mrg   [(set (match_operand:SI 0 "register_operand" "=r")
   4337   1.1.1.2    mrg         (not:SI (match_operand:SI 1 "register_operand" "0")))]
   4338   1.1.1.2    mrg   ""
   4339   1.1.1.2    mrg   "com %0
   4340   1.1.1.2    mrg 	com %B0
   4341   1.1.1.2    mrg 	com %C0
   4342   1.1.1.2    mrg 	com %D0"
   4343   1.1.1.2    mrg   [(set_attr "length" "4")
   4344   1.1.1.2    mrg    (set_attr "cc" "set_n")])
   4345   1.1.1.2    mrg 
   4346   1.1.1.2    mrg ;; xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x
   4347   1.1.1.2    mrg ;; sign extend
   4348   1.1.1.2    mrg 
   4349   1.1.1.2    mrg ;; We keep combiner from inserting hard registers into the input of sign- and
   4350   1.1.1.2    mrg ;; zero-extends.  A hard register in the input operand is not wanted because
   4351   1.1.1.2    mrg ;; 32-bit multiply patterns clobber some hard registers and extends with a
   4352   1.1.1.2    mrg ;; hard register that overlaps these clobbers won't be combined to a widening
   4353   1.1.1.2    mrg ;; multiplication.  There is no need for combine to propagate hard registers,
   4354   1.1.1.2    mrg ;; register allocation can do it just as well.
   4355   1.1.1.2    mrg 
   4356   1.1.1.2    mrg (define_insn "extendqihi2"
   4357   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand" "=r,r")
   4358   1.1.1.2    mrg         (sign_extend:HI (match_operand:QI 1 "combine_pseudo_register_operand" "0,*r")))]
   4359   1.1.1.2    mrg   ""
   4360   1.1.1.6    mrg   {
   4361   1.1.1.6    mrg     return avr_out_sign_extend (insn, operands, NULL);
   4362   1.1.1.6    mrg   }
   4363   1.1.1.2    mrg   [(set_attr "length" "3,4")
   4364   1.1.1.6    mrg    (set_attr "adjust_len" "sext")
   4365   1.1.1.6    mrg    (set_attr "cc" "set_n")])
   4366   1.1.1.2    mrg 
   4367   1.1.1.2    mrg (define_insn "extendqipsi2"
   4368   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand" "=r,r")
   4369   1.1.1.2    mrg         (sign_extend:PSI (match_operand:QI 1 "combine_pseudo_register_operand" "0,*r")))]
   4370   1.1.1.2    mrg   ""
   4371   1.1.1.6    mrg   {
   4372   1.1.1.6    mrg     return avr_out_sign_extend (insn, operands, NULL);
   4373   1.1.1.6    mrg   }
   4374   1.1.1.2    mrg   [(set_attr "length" "4,5")
   4375   1.1.1.6    mrg    (set_attr "adjust_len" "sext")
   4376   1.1.1.6    mrg    (set_attr "cc" "set_n")])
   4377   1.1.1.2    mrg 
   4378   1.1.1.2    mrg (define_insn "extendqisi2"
   4379   1.1.1.2    mrg   [(set (match_operand:SI 0 "register_operand" "=r,r")
   4380   1.1.1.2    mrg         (sign_extend:SI (match_operand:QI 1 "combine_pseudo_register_operand" "0,*r")))]
   4381   1.1.1.2    mrg   ""
   4382   1.1.1.6    mrg   {
   4383   1.1.1.6    mrg     return avr_out_sign_extend (insn, operands, NULL);
   4384   1.1.1.6    mrg   }
   4385   1.1.1.2    mrg   [(set_attr "length" "5,6")
   4386   1.1.1.6    mrg    (set_attr "adjust_len" "sext")
   4387   1.1.1.6    mrg    (set_attr "cc" "set_n")])
   4388   1.1.1.2    mrg 
   4389   1.1.1.2    mrg (define_insn "extendhipsi2"
   4390   1.1.1.6    mrg   [(set (match_operand:PSI 0 "register_operand"                               "=r,r")
   4391   1.1.1.6    mrg         (sign_extend:PSI (match_operand:HI 1 "combine_pseudo_register_operand" "0,*r")))]
   4392   1.1.1.2    mrg   ""
   4393   1.1.1.6    mrg   {
   4394   1.1.1.6    mrg     return avr_out_sign_extend (insn, operands, NULL);
   4395   1.1.1.6    mrg   }
   4396   1.1.1.6    mrg   [(set_attr "length" "3,5")
   4397   1.1.1.6    mrg    (set_attr "adjust_len" "sext")
   4398   1.1.1.2    mrg    (set_attr "cc" "set_n")])
   4399   1.1.1.2    mrg 
   4400   1.1.1.2    mrg (define_insn "extendhisi2"
   4401   1.1.1.6    mrg   [(set (match_operand:SI 0 "register_operand"                               "=r,r")
   4402   1.1.1.6    mrg         (sign_extend:SI (match_operand:HI 1 "combine_pseudo_register_operand" "0,*r")))]
   4403   1.1.1.2    mrg   ""
   4404   1.1.1.6    mrg   {
   4405   1.1.1.6    mrg     return avr_out_sign_extend (insn, operands, NULL);
   4406   1.1.1.6    mrg   }
   4407   1.1.1.6    mrg   [(set_attr "length" "4,6")
   4408   1.1.1.6    mrg    (set_attr "adjust_len" "sext")
   4409   1.1.1.2    mrg    (set_attr "cc" "set_n")])
   4410   1.1.1.2    mrg 
   4411   1.1.1.2    mrg (define_insn "extendpsisi2"
   4412   1.1.1.2    mrg   [(set (match_operand:SI 0 "register_operand"                                "=r")
   4413   1.1.1.2    mrg         (sign_extend:SI (match_operand:PSI 1 "combine_pseudo_register_operand" "0")))]
   4414   1.1.1.2    mrg   ""
   4415   1.1.1.6    mrg   {
   4416   1.1.1.6    mrg     return avr_out_sign_extend (insn, operands, NULL);
   4417   1.1.1.6    mrg   }
   4418   1.1.1.2    mrg   [(set_attr "length" "3")
   4419   1.1.1.6    mrg    (set_attr "adjust_len" "sext")
   4420   1.1.1.2    mrg    (set_attr "cc" "set_n")])
   4421   1.1.1.2    mrg 
   4422   1.1.1.2    mrg ;; xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x
   4423   1.1.1.2    mrg ;; zero extend
   4424   1.1.1.2    mrg 
   4425   1.1.1.2    mrg (define_insn_and_split "zero_extendqihi2"
   4426   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand" "=r")
   4427   1.1.1.2    mrg         (zero_extend:HI (match_operand:QI 1 "combine_pseudo_register_operand" "r")))]
   4428   1.1.1.2    mrg   ""
   4429   1.1.1.2    mrg   "#"
   4430   1.1.1.2    mrg   "reload_completed"
   4431   1.1.1.2    mrg   [(set (match_dup 2) (match_dup 1))
   4432   1.1.1.2    mrg    (set (match_dup 3) (const_int 0))]
   4433   1.1.1.2    mrg   {
   4434   1.1.1.2    mrg     unsigned int low_off = subreg_lowpart_offset (QImode, HImode);
   4435   1.1.1.2    mrg     unsigned int high_off = subreg_highpart_offset (QImode, HImode);
   4436   1.1.1.2    mrg 
   4437   1.1.1.2    mrg     operands[2] = simplify_gen_subreg (QImode, operands[0], HImode, low_off);
   4438   1.1.1.2    mrg     operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, high_off);
   4439   1.1.1.2    mrg   })
   4440   1.1.1.2    mrg 
   4441   1.1.1.2    mrg (define_insn_and_split "zero_extendqipsi2"
   4442   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand" "=r")
   4443   1.1.1.2    mrg         (zero_extend:PSI (match_operand:QI 1 "combine_pseudo_register_operand" "r")))]
   4444   1.1.1.2    mrg   ""
   4445   1.1.1.2    mrg   "#"
   4446   1.1.1.2    mrg   "reload_completed"
   4447   1.1.1.2    mrg   [(set (match_dup 2) (match_dup 1))
   4448   1.1.1.2    mrg    (set (match_dup 3) (const_int 0))
   4449   1.1.1.2    mrg    (set (match_dup 4) (const_int 0))]
   4450   1.1.1.2    mrg   {
   4451   1.1.1.2    mrg     operands[2] = simplify_gen_subreg (QImode, operands[0], PSImode, 0);
   4452   1.1.1.2    mrg     operands[3] = simplify_gen_subreg (QImode, operands[0], PSImode, 1);
   4453   1.1.1.2    mrg     operands[4] = simplify_gen_subreg (QImode, operands[0], PSImode, 2);
   4454   1.1.1.2    mrg   })
   4455   1.1.1.2    mrg 
   4456   1.1.1.2    mrg (define_insn_and_split "zero_extendqisi2"
   4457   1.1.1.2    mrg   [(set (match_operand:SI 0 "register_operand" "=r")
   4458   1.1.1.2    mrg         (zero_extend:SI (match_operand:QI 1 "combine_pseudo_register_operand" "r")))]
   4459   1.1.1.2    mrg   ""
   4460   1.1.1.2    mrg   "#"
   4461   1.1.1.2    mrg   "reload_completed"
   4462   1.1.1.2    mrg   [(set (match_dup 2) (zero_extend:HI (match_dup 1)))
   4463   1.1.1.2    mrg    (set (match_dup 3) (const_int 0))]
   4464   1.1.1.2    mrg   {
   4465   1.1.1.2    mrg     unsigned int low_off = subreg_lowpart_offset (HImode, SImode);
   4466   1.1.1.2    mrg     unsigned int high_off = subreg_highpart_offset (HImode, SImode);
   4467   1.1.1.2    mrg 
   4468   1.1.1.2    mrg     operands[2] = simplify_gen_subreg (HImode, operands[0], SImode, low_off);
   4469   1.1.1.2    mrg     operands[3] = simplify_gen_subreg (HImode, operands[0], SImode, high_off);
   4470   1.1.1.2    mrg   })
   4471   1.1.1.2    mrg 
   4472   1.1.1.2    mrg (define_insn_and_split "zero_extendhipsi2"
   4473   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"                               "=r")
   4474   1.1.1.2    mrg         (zero_extend:PSI (match_operand:HI 1 "combine_pseudo_register_operand" "r")))]
   4475   1.1.1.2    mrg   ""
   4476   1.1.1.2    mrg   "#"
   4477   1.1.1.2    mrg   "reload_completed"
   4478   1.1.1.2    mrg   [(set (match_dup 2) (match_dup 1))
   4479   1.1.1.2    mrg    (set (match_dup 3) (const_int 0))]
   4480   1.1.1.2    mrg   {
   4481   1.1.1.2    mrg     operands[2] = simplify_gen_subreg (HImode, operands[0], PSImode, 0);
   4482   1.1.1.2    mrg     operands[3] = simplify_gen_subreg (QImode, operands[0], PSImode, 2);
   4483   1.1.1.2    mrg   })
   4484   1.1.1.2    mrg 
   4485   1.1.1.2    mrg (define_insn_and_split "n_extendhipsi2"
   4486   1.1.1.2    mrg   [(set (match_operand:PSI 0 "register_operand"            "=r,r,d,r")
   4487   1.1.1.2    mrg         (lo_sum:PSI (match_operand:QI 1 "const_int_operand" "L,P,n,n")
   4488   1.1.1.2    mrg                     (match_operand:HI 2 "register_operand"  "r,r,r,r")))
   4489   1.1.1.2    mrg    (clobber (match_scratch:QI 3                            "=X,X,X,&d"))]
   4490   1.1.1.2    mrg   ""
   4491   1.1.1.2    mrg   "#"
   4492   1.1.1.2    mrg   "reload_completed"
   4493   1.1.1.2    mrg   [(set (match_dup 4) (match_dup 2))
   4494   1.1.1.2    mrg    (set (match_dup 3) (match_dup 6))
   4495   1.1.1.2    mrg    ; no-op move in the case where no scratch is needed
   4496   1.1.1.2    mrg    (set (match_dup 5) (match_dup 3))]
   4497   1.1.1.2    mrg   {
   4498   1.1.1.2    mrg     operands[4] = simplify_gen_subreg (HImode, operands[0], PSImode, 0);
   4499   1.1.1.2    mrg     operands[5] = simplify_gen_subreg (QImode, operands[0], PSImode, 2);
   4500   1.1.1.2    mrg     operands[6] = operands[1];
   4501   1.1.1.2    mrg 
   4502   1.1.1.2    mrg     if (GET_CODE (operands[3]) == SCRATCH)
   4503   1.1.1.2    mrg       operands[3] = operands[5];
   4504   1.1.1.2    mrg   })
   4505   1.1.1.2    mrg 
   4506   1.1.1.2    mrg (define_insn_and_split "zero_extendhisi2"
   4507   1.1.1.2    mrg   [(set (match_operand:SI 0 "register_operand"                               "=r")
   4508   1.1.1.2    mrg         (zero_extend:SI (match_operand:HI 1 "combine_pseudo_register_operand" "r")))]
   4509   1.1.1.2    mrg   ""
   4510   1.1.1.2    mrg   "#"
   4511   1.1.1.2    mrg   "reload_completed"
   4512   1.1.1.2    mrg   [(set (match_dup 2) (match_dup 1))
   4513   1.1.1.2    mrg    (set (match_dup 3) (const_int 0))]
   4514   1.1.1.2    mrg   {
   4515   1.1.1.2    mrg     unsigned int low_off = subreg_lowpart_offset (HImode, SImode);
   4516   1.1.1.2    mrg     unsigned int high_off = subreg_highpart_offset (HImode, SImode);
   4517   1.1.1.2    mrg 
   4518   1.1.1.2    mrg     operands[2] = simplify_gen_subreg (HImode, operands[0], SImode, low_off);
   4519   1.1.1.2    mrg     operands[3] = simplify_gen_subreg (HImode, operands[0], SImode, high_off);
   4520   1.1.1.2    mrg   })
   4521   1.1.1.2    mrg 
   4522   1.1.1.2    mrg (define_insn_and_split "zero_extendpsisi2"
   4523   1.1.1.2    mrg   [(set (match_operand:SI 0 "register_operand"                                "=r")
   4524   1.1.1.2    mrg         (zero_extend:SI (match_operand:PSI 1 "combine_pseudo_register_operand" "r")))]
   4525   1.1.1.2    mrg   ""
   4526   1.1.1.2    mrg   "#"
   4527   1.1.1.2    mrg   "reload_completed"
   4528   1.1.1.2    mrg   [(set (match_dup 2) (match_dup 1))
   4529   1.1.1.2    mrg    (set (match_dup 3) (const_int 0))]
   4530   1.1.1.2    mrg   {
   4531   1.1.1.2    mrg     operands[2] = simplify_gen_subreg (PSImode, operands[0], SImode, 0);
   4532   1.1.1.2    mrg     operands[3] = simplify_gen_subreg (QImode, operands[0], SImode, 3);
   4533   1.1.1.2    mrg   })
   4534   1.1.1.2    mrg 
   4535   1.1.1.2    mrg (define_insn_and_split "zero_extendqidi2"
   4536   1.1.1.2    mrg   [(set (match_operand:DI 0 "register_operand" "=r")
   4537   1.1.1.2    mrg         (zero_extend:DI (match_operand:QI 1 "register_operand" "r")))]
   4538   1.1.1.2    mrg   ""
   4539   1.1.1.2    mrg   "#"
   4540   1.1.1.2    mrg   "reload_completed"
   4541   1.1.1.2    mrg   [(set (match_dup 2) (zero_extend:SI (match_dup 1)))
   4542   1.1.1.2    mrg    (set (match_dup 3) (const_int 0))]
   4543   1.1.1.2    mrg   {
   4544   1.1.1.2    mrg     unsigned int low_off = subreg_lowpart_offset (SImode, DImode);
   4545   1.1.1.2    mrg     unsigned int high_off = subreg_highpart_offset (SImode, DImode);
   4546   1.1.1.2    mrg 
   4547   1.1.1.2    mrg     operands[2] = simplify_gen_subreg (SImode, operands[0], DImode, low_off);
   4548   1.1.1.2    mrg     operands[3] = simplify_gen_subreg (SImode, operands[0], DImode, high_off);
   4549   1.1.1.2    mrg   })
   4550   1.1.1.2    mrg 
   4551   1.1.1.2    mrg (define_insn_and_split "zero_extendhidi2"
   4552   1.1.1.2    mrg   [(set (match_operand:DI 0 "register_operand" "=r")
   4553   1.1.1.2    mrg         (zero_extend:DI (match_operand:HI 1 "register_operand" "r")))]
   4554   1.1.1.2    mrg   ""
   4555   1.1.1.2    mrg   "#"
   4556   1.1.1.2    mrg   "reload_completed"
   4557   1.1.1.2    mrg   [(set (match_dup 2) (zero_extend:SI (match_dup 1)))
   4558   1.1.1.2    mrg    (set (match_dup 3) (const_int 0))]
   4559   1.1.1.2    mrg   {
   4560   1.1.1.2    mrg     unsigned int low_off = subreg_lowpart_offset (SImode, DImode);
   4561   1.1.1.2    mrg     unsigned int high_off = subreg_highpart_offset (SImode, DImode);
   4562   1.1.1.2    mrg 
   4563   1.1.1.2    mrg     operands[2] = simplify_gen_subreg (SImode, operands[0], DImode, low_off);
   4564   1.1.1.2    mrg     operands[3] = simplify_gen_subreg (SImode, operands[0], DImode, high_off);
   4565   1.1.1.2    mrg   })
   4566   1.1.1.2    mrg 
   4567   1.1.1.2    mrg (define_insn_and_split "zero_extendsidi2"
   4568   1.1.1.2    mrg   [(set (match_operand:DI 0 "register_operand" "=r")
   4569   1.1.1.2    mrg         (zero_extend:DI (match_operand:SI 1 "register_operand" "r")))]
   4570   1.1.1.2    mrg   ""
   4571   1.1.1.2    mrg   "#"
   4572   1.1.1.2    mrg   "reload_completed"
   4573   1.1.1.2    mrg   [(set (match_dup 2) (match_dup 1))
   4574   1.1.1.2    mrg    (set (match_dup 3) (const_int 0))]
   4575   1.1.1.2    mrg   {
   4576   1.1.1.2    mrg     unsigned int low_off = subreg_lowpart_offset (SImode, DImode);
   4577   1.1.1.2    mrg     unsigned int high_off = subreg_highpart_offset (SImode, DImode);
   4578   1.1.1.2    mrg 
   4579   1.1.1.2    mrg     operands[2] = simplify_gen_subreg (SImode, operands[0], DImode, low_off);
   4580   1.1.1.2    mrg     operands[3] = simplify_gen_subreg (SImode, operands[0], DImode, high_off);
   4581   1.1.1.2    mrg   })
   4582   1.1.1.2    mrg 
   4583   1.1.1.2    mrg ;;<=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=>
   4584   1.1.1.2    mrg ;; compare
   4585   1.1.1.2    mrg 
   4586   1.1.1.2    mrg ; Optimize negated tests into reverse compare if overflow is undefined.
   4587   1.1.1.2    mrg (define_insn "*negated_tstqi"
   4588   1.1.1.2    mrg   [(set (cc0)
   4589   1.1.1.2    mrg         (compare (neg:QI (match_operand:QI 0 "register_operand" "r"))
   4590   1.1.1.2    mrg                  (const_int 0)))]
   4591  1.1.1.12    mrg   "!flag_wrapv && !flag_trapv"
   4592   1.1.1.2    mrg   "cp __zero_reg__,%0"
   4593   1.1.1.2    mrg   [(set_attr "cc" "compare")
   4594   1.1.1.2    mrg    (set_attr "length" "1")])
   4595   1.1.1.2    mrg 
   4596   1.1.1.2    mrg (define_insn "*reversed_tstqi"
   4597   1.1.1.2    mrg   [(set (cc0)
   4598   1.1.1.2    mrg         (compare (const_int 0)
   4599   1.1.1.2    mrg                  (match_operand:QI 0 "register_operand" "r")))]
   4600   1.1.1.2    mrg   ""
   4601   1.1.1.2    mrg   "cp __zero_reg__,%0"
   4602   1.1.1.2    mrg [(set_attr "cc" "compare")
   4603   1.1.1.2    mrg  (set_attr "length" "2")])
   4604   1.1.1.2    mrg 
   4605   1.1.1.2    mrg (define_insn "*negated_tsthi"
   4606   1.1.1.2    mrg   [(set (cc0)
   4607   1.1.1.2    mrg         (compare (neg:HI (match_operand:HI 0 "register_operand" "r"))
   4608   1.1.1.2    mrg                  (const_int 0)))]
   4609  1.1.1.12    mrg   "!flag_wrapv && !flag_trapv"
   4610   1.1.1.2    mrg   "cp __zero_reg__,%A0
   4611   1.1.1.2    mrg 	cpc __zero_reg__,%B0"
   4612   1.1.1.2    mrg [(set_attr "cc" "compare")
   4613   1.1.1.2    mrg  (set_attr "length" "2")])
   4614   1.1.1.2    mrg 
   4615   1.1.1.2    mrg ;; Leave here the clobber used by the cmphi pattern for simplicity, even
   4616   1.1.1.2    mrg ;; though it is unused, because this pattern is synthesized by avr_reorg.
   4617   1.1.1.2    mrg (define_insn "*reversed_tsthi"
   4618   1.1.1.2    mrg   [(set (cc0)
   4619   1.1.1.2    mrg         (compare (const_int 0)
   4620   1.1.1.2    mrg                  (match_operand:HI 0 "register_operand" "r")))
   4621   1.1.1.2    mrg    (clobber (match_scratch:QI 1 "=X"))]
   4622   1.1.1.2    mrg   ""
   4623   1.1.1.2    mrg   "cp __zero_reg__,%A0
   4624   1.1.1.2    mrg 	cpc __zero_reg__,%B0"
   4625   1.1.1.2    mrg [(set_attr "cc" "compare")
   4626   1.1.1.2    mrg  (set_attr "length" "2")])
   4627   1.1.1.2    mrg 
   4628   1.1.1.2    mrg (define_insn "*negated_tstpsi"
   4629   1.1.1.2    mrg   [(set (cc0)
   4630   1.1.1.2    mrg         (compare (neg:PSI (match_operand:PSI 0 "register_operand" "r"))
   4631   1.1.1.2    mrg                  (const_int 0)))]
   4632  1.1.1.12    mrg   "!flag_wrapv && !flag_trapv"
   4633   1.1.1.2    mrg   "cp __zero_reg__,%A0\;cpc __zero_reg__,%B0\;cpc __zero_reg__,%C0"
   4634   1.1.1.2    mrg   [(set_attr "cc" "compare")
   4635   1.1.1.2    mrg    (set_attr "length" "3")])
   4636   1.1.1.2    mrg 
   4637   1.1.1.2    mrg (define_insn "*reversed_tstpsi"
   4638   1.1.1.2    mrg   [(set (cc0)
   4639   1.1.1.2    mrg         (compare (const_int 0)
   4640   1.1.1.2    mrg                  (match_operand:PSI 0 "register_operand" "r")))
   4641   1.1.1.2    mrg    (clobber (match_scratch:QI 1 "=X"))]
   4642   1.1.1.2    mrg   ""
   4643   1.1.1.2    mrg   "cp __zero_reg__,%A0\;cpc __zero_reg__,%B0\;cpc __zero_reg__,%C0"
   4644   1.1.1.2    mrg   [(set_attr "cc" "compare")
   4645   1.1.1.2    mrg    (set_attr "length" "3")])
   4646   1.1.1.2    mrg 
   4647   1.1.1.2    mrg (define_insn "*negated_tstsi"
   4648   1.1.1.2    mrg   [(set (cc0)
   4649   1.1.1.2    mrg         (compare (neg:SI (match_operand:SI 0 "register_operand" "r"))
   4650   1.1.1.2    mrg                  (const_int 0)))]
   4651  1.1.1.12    mrg   "!flag_wrapv && !flag_trapv"
   4652   1.1.1.2    mrg   "cp __zero_reg__,%A0
   4653   1.1.1.2    mrg 	cpc __zero_reg__,%B0
   4654   1.1.1.2    mrg 	cpc __zero_reg__,%C0
   4655   1.1.1.2    mrg 	cpc __zero_reg__,%D0"
   4656   1.1.1.2    mrg   [(set_attr "cc" "compare")
   4657   1.1.1.2    mrg    (set_attr "length" "4")])
   4658   1.1.1.2    mrg 
   4659   1.1.1.2    mrg ;; "*reversed_tstsi"
   4660   1.1.1.2    mrg ;; "*reversed_tstsq" "*reversed_tstusq"
   4661   1.1.1.2    mrg ;; "*reversed_tstsa" "*reversed_tstusa"
   4662   1.1.1.2    mrg (define_insn "*reversed_tst<mode>"
   4663   1.1.1.2    mrg   [(set (cc0)
   4664   1.1.1.2    mrg         (compare (match_operand:ALL4 0 "const0_operand"   "Y00")
   4665   1.1.1.2    mrg                  (match_operand:ALL4 1 "register_operand" "r")))
   4666   1.1.1.2    mrg    (clobber (match_scratch:QI 2 "=X"))]
   4667   1.1.1.2    mrg   ""
   4668   1.1.1.2    mrg   "cp __zero_reg__,%A1
   4669   1.1.1.2    mrg 	cpc __zero_reg__,%B1
   4670   1.1.1.2    mrg 	cpc __zero_reg__,%C1
   4671   1.1.1.2    mrg 	cpc __zero_reg__,%D1"
   4672   1.1.1.2    mrg   [(set_attr "cc" "compare")
   4673   1.1.1.2    mrg    (set_attr "length" "4")])
   4674   1.1.1.2    mrg 
   4675   1.1.1.2    mrg 
   4676   1.1.1.9    mrg ;; "cmpqi3"
   4677   1.1.1.9    mrg ;; "cmpqq3" "cmpuqq3"
   4678   1.1.1.9    mrg (define_insn "cmp<mode>3"
   4679   1.1.1.2    mrg   [(set (cc0)
   4680   1.1.1.2    mrg         (compare (match_operand:ALL1 0 "register_operand"  "r  ,r,d")
   4681   1.1.1.2    mrg                  (match_operand:ALL1 1 "nonmemory_operand" "Y00,r,i")))]
   4682   1.1.1.2    mrg   ""
   4683   1.1.1.2    mrg   "@
   4684   1.1.1.2    mrg 	tst %0
   4685   1.1.1.2    mrg 	cp %0,%1
   4686   1.1.1.2    mrg 	cpi %0,lo8(%1)"
   4687   1.1.1.2    mrg   [(set_attr "cc" "compare,compare,compare")
   4688   1.1.1.2    mrg    (set_attr "length" "1,1,1")])
   4689   1.1.1.2    mrg 
   4690   1.1.1.2    mrg (define_insn "*cmpqi_sign_extend"
   4691   1.1.1.2    mrg   [(set (cc0)
   4692   1.1.1.2    mrg         (compare (sign_extend:HI (match_operand:QI 0 "register_operand" "d"))
   4693   1.1.1.2    mrg                  (match_operand:HI 1 "s8_operand"                       "n")))]
   4694   1.1.1.2    mrg   ""
   4695   1.1.1.2    mrg   "cpi %0,lo8(%1)"
   4696   1.1.1.2    mrg   [(set_attr "cc" "compare")
   4697   1.1.1.2    mrg    (set_attr "length" "1")])
   4698   1.1.1.2    mrg 
   4699   1.1.1.9    mrg 
   4700   1.1.1.9    mrg (define_insn "*cmphi.zero-extend.0"
   4701   1.1.1.9    mrg   [(set (cc0)
   4702   1.1.1.9    mrg         (compare (zero_extend:HI (match_operand:QI 0 "register_operand" "r"))
   4703   1.1.1.9    mrg                  (match_operand:HI 1 "register_operand" "r")))]
   4704   1.1.1.9    mrg   ""
   4705   1.1.1.9    mrg   "cp %0,%A1\;cpc __zero_reg__,%B1"
   4706   1.1.1.9    mrg   [(set_attr "cc" "compare")
   4707   1.1.1.9    mrg    (set_attr "length" "2")])
   4708   1.1.1.9    mrg 
   4709   1.1.1.9    mrg (define_insn "*cmphi.zero-extend.1"
   4710   1.1.1.9    mrg   [(set (cc0)
   4711   1.1.1.9    mrg         (compare (match_operand:HI 0 "register_operand" "r")
   4712   1.1.1.9    mrg                  (zero_extend:HI (match_operand:QI 1 "register_operand" "r"))))]
   4713   1.1.1.9    mrg   ""
   4714   1.1.1.9    mrg   "cp %A0,%1\;cpc %B0,__zero_reg__"
   4715   1.1.1.9    mrg   [(set_attr "cc" "compare")
   4716   1.1.1.9    mrg    (set_attr "length" "2")])
   4717   1.1.1.9    mrg 
   4718   1.1.1.9    mrg ;; "cmphi3"
   4719   1.1.1.9    mrg ;; "cmphq3" "cmpuhq3"
   4720   1.1.1.9    mrg ;; "cmpha3" "cmpuha3"
   4721   1.1.1.9    mrg (define_insn "cmp<mode>3"
   4722   1.1.1.2    mrg   [(set (cc0)
   4723   1.1.1.2    mrg         (compare (match_operand:ALL2 0 "register_operand"  "!w  ,r  ,r,d ,r  ,d,r")
   4724   1.1.1.2    mrg                  (match_operand:ALL2 1 "nonmemory_operand"  "Y00,Y00,r,s ,s  ,M,n Ynn")))
   4725   1.1.1.2    mrg    (clobber (match_scratch:QI 2                            "=X  ,X  ,X,&d,&d ,X,&d"))]
   4726   1.1.1.2    mrg   ""
   4727   1.1.1.2    mrg   {
   4728   1.1.1.2    mrg     switch (which_alternative)
   4729   1.1.1.2    mrg       {
   4730   1.1.1.2    mrg       case 0:
   4731   1.1.1.2    mrg       case 1:
   4732   1.1.1.2    mrg         return avr_out_tsthi (insn, operands, NULL);
   4733   1.1.1.2    mrg 
   4734   1.1.1.2    mrg       case 2:
   4735   1.1.1.2    mrg         return "cp %A0,%A1\;cpc %B0,%B1";
   4736   1.1.1.2    mrg 
   4737   1.1.1.2    mrg       case 3:
   4738   1.1.1.2    mrg         if (<MODE>mode != HImode)
   4739   1.1.1.2    mrg           break;
   4740   1.1.1.2    mrg         return reg_unused_after (insn, operands[0])
   4741   1.1.1.2    mrg                ? "subi %A0,lo8(%1)\;sbci %B0,hi8(%1)"
   4742   1.1.1.2    mrg                : "ldi %2,hi8(%1)\;cpi %A0,lo8(%1)\;cpc %B0,%2";
   4743   1.1.1.2    mrg 
   4744   1.1.1.2    mrg       case 4:
   4745   1.1.1.2    mrg         if (<MODE>mode != HImode)
   4746   1.1.1.2    mrg           break;
   4747   1.1.1.2    mrg         return "ldi %2,lo8(%1)\;cp %A0,%2\;ldi %2,hi8(%1)\;cpc %B0,%2";
   4748   1.1.1.2    mrg       }
   4749   1.1.1.2    mrg 
   4750   1.1.1.2    mrg     return avr_out_compare (insn, operands, NULL);
   4751   1.1.1.2    mrg   }
   4752   1.1.1.2    mrg   [(set_attr "cc" "compare")
   4753   1.1.1.2    mrg    (set_attr "length" "1,2,2,3,4,2,4")
   4754   1.1.1.2    mrg    (set_attr "adjust_len" "tsthi,tsthi,*,*,*,compare,compare")])
   4755   1.1.1.2    mrg 
   4756   1.1.1.2    mrg (define_insn "*cmppsi"
   4757   1.1.1.2    mrg   [(set (cc0)
   4758   1.1.1.2    mrg         (compare (match_operand:PSI 0 "register_operand"  "r,r,d ,r  ,d,r")
   4759   1.1.1.2    mrg                  (match_operand:PSI 1 "nonmemory_operand" "L,r,s ,s  ,M,n")))
   4760   1.1.1.2    mrg    (clobber (match_scratch:QI 2                          "=X,X,&d,&d ,X,&d"))]
   4761   1.1.1.2    mrg   ""
   4762   1.1.1.2    mrg   {
   4763   1.1.1.2    mrg     switch (which_alternative)
   4764   1.1.1.2    mrg       {
   4765   1.1.1.2    mrg       case 0:
   4766   1.1.1.2    mrg         return avr_out_tstpsi (insn, operands, NULL);
   4767   1.1.1.2    mrg 
   4768   1.1.1.2    mrg       case 1:
   4769   1.1.1.2    mrg         return "cp %A0,%A1\;cpc %B0,%B1\;cpc %C0,%C1";
   4770   1.1.1.2    mrg 
   4771   1.1.1.2    mrg       case 2:
   4772   1.1.1.2    mrg         return reg_unused_after (insn, operands[0])
   4773   1.1.1.2    mrg                ? "subi %A0,lo8(%1)\;sbci %B0,hi8(%1)\;sbci %C0,hh8(%1)"
   4774   1.1.1.2    mrg                : "cpi %A0,lo8(%1)\;ldi %2,hi8(%1)\;cpc %B0,%2\;ldi %2,hh8(%1)\;cpc %C0,%2";
   4775   1.1.1.2    mrg 
   4776   1.1.1.2    mrg       case 3:
   4777   1.1.1.2    mrg         return "ldi %2,lo8(%1)\;cp %A0,%2\;ldi %2,hi8(%1)\;cpc %B0,%2\;ldi %2,hh8(%1)\;cpc %C0,%2";
   4778   1.1.1.2    mrg       }
   4779   1.1.1.2    mrg 
   4780   1.1.1.2    mrg     return avr_out_compare (insn, operands, NULL);
   4781   1.1.1.2    mrg   }
   4782   1.1.1.2    mrg   [(set_attr "cc" "compare")
   4783   1.1.1.2    mrg    (set_attr "length" "3,3,5,6,3,7")
   4784   1.1.1.2    mrg    (set_attr "adjust_len" "tstpsi,*,*,*,compare,compare")])
   4785   1.1.1.2    mrg 
   4786   1.1.1.2    mrg ;; "*cmpsi"
   4787   1.1.1.2    mrg ;; "*cmpsq" "*cmpusq"
   4788   1.1.1.2    mrg ;; "*cmpsa" "*cmpusa"
   4789   1.1.1.2    mrg (define_insn "*cmp<mode>"
   4790   1.1.1.2    mrg   [(set (cc0)
   4791   1.1.1.2    mrg         (compare (match_operand:ALL4 0 "register_operand"  "r  ,r ,d,r ,r")
   4792   1.1.1.2    mrg                  (match_operand:ALL4 1 "nonmemory_operand" "Y00,r ,M,M ,n Ynn")))
   4793   1.1.1.2    mrg    (clobber (match_scratch:QI 2                           "=X  ,X ,X,&d,&d"))]
   4794   1.1.1.2    mrg   ""
   4795   1.1.1.2    mrg   {
   4796   1.1.1.2    mrg     if (0 == which_alternative)
   4797   1.1.1.2    mrg       return avr_out_tstsi (insn, operands, NULL);
   4798   1.1.1.2    mrg     else if (1 == which_alternative)
   4799   1.1.1.2    mrg       return "cp %A0,%A1\;cpc %B0,%B1\;cpc %C0,%C1\;cpc %D0,%D1";
   4800   1.1.1.2    mrg 
   4801   1.1.1.2    mrg     return avr_out_compare (insn, operands, NULL);
   4802   1.1.1.2    mrg   }
   4803   1.1.1.2    mrg   [(set_attr "cc" "compare")
   4804   1.1.1.2    mrg    (set_attr "length" "4,4,4,5,8")
   4805   1.1.1.2    mrg    (set_attr "adjust_len" "tstsi,*,compare,compare,compare")])
   4806   1.1.1.2    mrg 
   4807   1.1.1.2    mrg 
   4808   1.1.1.2    mrg ;; ----------------------------------------------------------------------
   4809   1.1.1.2    mrg ;; JUMP INSTRUCTIONS
   4810   1.1.1.2    mrg ;; ----------------------------------------------------------------------
   4811   1.1.1.2    mrg ;; Conditional jump instructions
   4812   1.1.1.2    mrg 
   4813   1.1.1.2    mrg ;; "cbranchqi4"
   4814   1.1.1.2    mrg ;; "cbranchqq4"  "cbranchuqq4"
   4815   1.1.1.2    mrg (define_expand "cbranch<mode>4"
   4816   1.1.1.2    mrg   [(set (cc0)
   4817   1.1.1.2    mrg         (compare (match_operand:ALL1 1 "register_operand" "")
   4818   1.1.1.2    mrg                  (match_operand:ALL1 2 "nonmemory_operand" "")))
   4819   1.1.1.2    mrg    (set (pc)
   4820   1.1.1.2    mrg         (if_then_else
   4821   1.1.1.2    mrg          (match_operator 0 "ordered_comparison_operator" [(cc0)
   4822   1.1.1.2    mrg                                                           (const_int 0)])
   4823   1.1.1.2    mrg          (label_ref (match_operand 3 "" ""))
   4824   1.1.1.2    mrg          (pc)))])
   4825   1.1.1.2    mrg 
   4826   1.1.1.2    mrg ;; "cbranchhi4"  "cbranchhq4"  "cbranchuhq4"  "cbranchha4"  "cbranchuha4"
   4827   1.1.1.2    mrg ;; "cbranchsi4"  "cbranchsq4"  "cbranchusq4"  "cbranchsa4"  "cbranchusa4"
   4828   1.1.1.2    mrg ;; "cbranchpsi4"
   4829   1.1.1.2    mrg (define_expand "cbranch<mode>4"
   4830   1.1.1.2    mrg   [(parallel [(set (cc0)
   4831   1.1.1.2    mrg                    (compare (match_operand:ORDERED234 1 "register_operand" "")
   4832   1.1.1.2    mrg                             (match_operand:ORDERED234 2 "nonmemory_operand" "")))
   4833   1.1.1.2    mrg               (clobber (match_scratch:QI 4 ""))])
   4834   1.1.1.2    mrg    (set (pc)
   4835   1.1.1.2    mrg         (if_then_else
   4836   1.1.1.2    mrg          (match_operator 0 "ordered_comparison_operator" [(cc0)
   4837   1.1.1.2    mrg                                                           (const_int 0)])
   4838   1.1.1.2    mrg          (label_ref (match_operand 3 "" ""))
   4839   1.1.1.2    mrg          (pc)))])
   4840   1.1.1.2    mrg 
   4841   1.1.1.2    mrg 
   4842   1.1.1.2    mrg ;; Test a single bit in a QI/HI/SImode register.
   4843   1.1.1.2    mrg ;; Combine will create zero extract patterns for single bit tests.
   4844   1.1.1.2    mrg ;; permit any mode in source pattern by using VOIDmode.
   4845   1.1.1.2    mrg 
   4846   1.1.1.2    mrg (define_insn "*sbrx_branch<mode>"
   4847   1.1.1.2    mrg   [(set (pc)
   4848   1.1.1.2    mrg         (if_then_else
   4849   1.1.1.2    mrg          (match_operator 0 "eqne_operator"
   4850   1.1.1.2    mrg                          [(zero_extract:QIDI
   4851   1.1.1.2    mrg                            (match_operand:VOID 1 "register_operand" "r")
   4852   1.1.1.2    mrg                            (const_int 1)
   4853   1.1.1.2    mrg                            (match_operand 2 "const_int_operand" "n"))
   4854   1.1.1.2    mrg                           (const_int 0)])
   4855   1.1.1.2    mrg          (label_ref (match_operand 3 "" ""))
   4856   1.1.1.2    mrg          (pc)))]
   4857   1.1.1.2    mrg   ""
   4858   1.1.1.2    mrg   {
   4859   1.1.1.2    mrg     return avr_out_sbxx_branch (insn, operands);
   4860   1.1.1.2    mrg   }
   4861   1.1.1.2    mrg   [(set (attr "length")
   4862   1.1.1.2    mrg         (if_then_else (and (ge (minus (pc) (match_dup 3)) (const_int -2046))
   4863   1.1.1.2    mrg                            (le (minus (pc) (match_dup 3)) (const_int 2046)))
   4864   1.1.1.2    mrg                       (const_int 2)
   4865   1.1.1.2    mrg                       (if_then_else (match_test "!AVR_HAVE_JMP_CALL")
   4866   1.1.1.2    mrg                                     (const_int 2)
   4867   1.1.1.2    mrg                                     (const_int 4))))
   4868   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   4869   1.1.1.2    mrg 
   4870   1.1.1.2    mrg ;; Same test based on bitwise AND.  Keep this in case gcc changes patterns.
   4871   1.1.1.2    mrg ;; or for old peepholes.
   4872   1.1.1.2    mrg ;; Fixme - bitwise Mask will not work for DImode
   4873   1.1.1.2    mrg 
   4874   1.1.1.2    mrg (define_insn "*sbrx_and_branch<mode>"
   4875   1.1.1.2    mrg   [(set (pc)
   4876   1.1.1.2    mrg         (if_then_else
   4877   1.1.1.2    mrg          (match_operator 0 "eqne_operator"
   4878   1.1.1.2    mrg                          [(and:QISI
   4879   1.1.1.2    mrg                            (match_operand:QISI 1 "register_operand" "r")
   4880   1.1.1.2    mrg                            (match_operand:QISI 2 "single_one_operand" "n"))
   4881   1.1.1.2    mrg                           (const_int 0)])
   4882   1.1.1.2    mrg          (label_ref (match_operand 3 "" ""))
   4883   1.1.1.2    mrg          (pc)))]
   4884   1.1.1.2    mrg   ""
   4885   1.1.1.2    mrg   {
   4886   1.1.1.2    mrg     HOST_WIDE_INT bitnumber;
   4887   1.1.1.2    mrg     bitnumber = exact_log2 (GET_MODE_MASK (<MODE>mode) & INTVAL (operands[2]));
   4888   1.1.1.2    mrg     operands[2] = GEN_INT (bitnumber);
   4889   1.1.1.2    mrg     return avr_out_sbxx_branch (insn, operands);
   4890   1.1.1.2    mrg   }
   4891   1.1.1.2    mrg   [(set (attr "length")
   4892   1.1.1.2    mrg         (if_then_else (and (ge (minus (pc) (match_dup 3)) (const_int -2046))
   4893   1.1.1.2    mrg                            (le (minus (pc) (match_dup 3)) (const_int 2046)))
   4894   1.1.1.2    mrg                       (const_int 2)
   4895   1.1.1.2    mrg                       (if_then_else (match_test "!AVR_HAVE_JMP_CALL")
   4896   1.1.1.2    mrg                                     (const_int 2)
   4897   1.1.1.2    mrg                                     (const_int 4))))
   4898   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   4899   1.1.1.2    mrg 
   4900   1.1.1.2    mrg ;; Convert sign tests to bit 7/15/31 tests that match the above insns.
   4901   1.1.1.2    mrg (define_peephole2
   4902   1.1.1.2    mrg   [(set (cc0) (compare (match_operand:QI 0 "register_operand" "")
   4903   1.1.1.2    mrg                        (const_int 0)))
   4904   1.1.1.2    mrg    (set (pc) (if_then_else (ge (cc0) (const_int 0))
   4905   1.1.1.2    mrg                            (label_ref (match_operand 1 "" ""))
   4906   1.1.1.2    mrg                            (pc)))]
   4907   1.1.1.2    mrg   ""
   4908   1.1.1.2    mrg   [(set (pc) (if_then_else (eq (zero_extract:HI (match_dup 0)
   4909   1.1.1.2    mrg                                                 (const_int 1)
   4910   1.1.1.2    mrg                                                 (const_int 7))
   4911   1.1.1.2    mrg                                (const_int 0))
   4912   1.1.1.2    mrg                            (label_ref (match_dup 1))
   4913   1.1.1.2    mrg                            (pc)))])
   4914   1.1.1.2    mrg 
   4915   1.1.1.2    mrg (define_peephole2
   4916   1.1.1.2    mrg   [(set (cc0) (compare (match_operand:QI 0 "register_operand" "")
   4917   1.1.1.2    mrg                        (const_int 0)))
   4918   1.1.1.2    mrg    (set (pc) (if_then_else (lt (cc0) (const_int 0))
   4919   1.1.1.2    mrg                            (label_ref (match_operand 1 "" ""))
   4920   1.1.1.2    mrg                            (pc)))]
   4921   1.1.1.2    mrg   ""
   4922   1.1.1.2    mrg   [(set (pc) (if_then_else (ne (zero_extract:HI (match_dup 0)
   4923   1.1.1.2    mrg                                                 (const_int 1)
   4924   1.1.1.2    mrg                                                 (const_int 7))
   4925   1.1.1.2    mrg                                (const_int 0))
   4926   1.1.1.2    mrg                            (label_ref (match_dup 1))
   4927   1.1.1.2    mrg                            (pc)))])
   4928   1.1.1.2    mrg 
   4929   1.1.1.2    mrg (define_peephole2
   4930   1.1.1.2    mrg   [(parallel [(set (cc0) (compare (match_operand:HI 0 "register_operand" "")
   4931   1.1.1.2    mrg                                   (const_int 0)))
   4932   1.1.1.2    mrg               (clobber (match_operand:HI 2 ""))])
   4933   1.1.1.2    mrg    (set (pc) (if_then_else (ge (cc0) (const_int 0))
   4934   1.1.1.2    mrg                            (label_ref (match_operand 1 "" ""))
   4935   1.1.1.2    mrg                            (pc)))]
   4936   1.1.1.2    mrg   ""
   4937   1.1.1.2    mrg   [(set (pc) (if_then_else (eq (and:HI (match_dup 0) (const_int -32768))
   4938   1.1.1.2    mrg                                (const_int 0))
   4939   1.1.1.2    mrg                            (label_ref (match_dup 1))
   4940   1.1.1.2    mrg                            (pc)))])
   4941   1.1.1.2    mrg 
   4942   1.1.1.2    mrg (define_peephole2
   4943   1.1.1.2    mrg   [(parallel [(set (cc0) (compare (match_operand:HI 0 "register_operand" "")
   4944   1.1.1.2    mrg                                   (const_int 0)))
   4945   1.1.1.2    mrg               (clobber (match_operand:HI 2 ""))])
   4946   1.1.1.2    mrg    (set (pc) (if_then_else (lt (cc0) (const_int 0))
   4947   1.1.1.2    mrg                            (label_ref (match_operand 1 "" ""))
   4948   1.1.1.2    mrg                            (pc)))]
   4949   1.1.1.2    mrg   ""
   4950   1.1.1.2    mrg   [(set (pc) (if_then_else (ne (and:HI (match_dup 0) (const_int -32768))
   4951   1.1.1.2    mrg                                (const_int 0))
   4952   1.1.1.2    mrg                            (label_ref (match_dup 1))
   4953   1.1.1.2    mrg                            (pc)))])
   4954   1.1.1.2    mrg 
   4955   1.1.1.2    mrg (define_peephole2
   4956   1.1.1.2    mrg   [(parallel [(set (cc0) (compare (match_operand:SI 0 "register_operand" "")
   4957   1.1.1.2    mrg                                   (const_int 0)))
   4958   1.1.1.2    mrg               (clobber (match_operand:SI 2 ""))])
   4959   1.1.1.2    mrg    (set (pc) (if_then_else (ge (cc0) (const_int 0))
   4960   1.1.1.2    mrg                            (label_ref (match_operand 1 "" ""))
   4961   1.1.1.2    mrg                            (pc)))]
   4962   1.1.1.2    mrg   ""
   4963   1.1.1.2    mrg   [(set (pc) (if_then_else (eq (and:SI (match_dup 0) (match_dup 2))
   4964   1.1.1.2    mrg                                (const_int 0))
   4965   1.1.1.2    mrg                            (label_ref (match_dup 1))
   4966   1.1.1.2    mrg                            (pc)))]
   4967   1.1.1.2    mrg   "operands[2] = gen_int_mode (-2147483647 - 1, SImode);")
   4968   1.1.1.2    mrg 
   4969   1.1.1.2    mrg (define_peephole2
   4970   1.1.1.2    mrg   [(parallel [(set (cc0) (compare (match_operand:SI 0 "register_operand" "")
   4971   1.1.1.2    mrg                                   (const_int 0)))
   4972   1.1.1.2    mrg               (clobber (match_operand:SI 2 ""))])
   4973   1.1.1.2    mrg    (set (pc) (if_then_else (lt (cc0) (const_int 0))
   4974   1.1.1.2    mrg                            (label_ref (match_operand 1 "" ""))
   4975   1.1.1.2    mrg                            (pc)))]
   4976   1.1.1.2    mrg   ""
   4977   1.1.1.2    mrg   [(set (pc) (if_then_else (ne (and:SI (match_dup 0) (match_dup 2))
   4978   1.1.1.2    mrg                                (const_int 0))
   4979   1.1.1.2    mrg                            (label_ref (match_dup 1))
   4980   1.1.1.2    mrg                            (pc)))]
   4981   1.1.1.2    mrg   "operands[2] = gen_int_mode (-2147483647 - 1, SImode);")
   4982   1.1.1.2    mrg 
   4983   1.1.1.2    mrg ;; ************************************************************************
   4984   1.1.1.2    mrg ;; Implementation of conditional jumps here.
   4985   1.1.1.2    mrg ;;  Compare with 0 (test) jumps
   4986   1.1.1.2    mrg ;; ************************************************************************
   4987   1.1.1.2    mrg 
   4988   1.1.1.2    mrg (define_insn "branch"
   4989   1.1.1.2    mrg   [(set (pc)
   4990   1.1.1.2    mrg         (if_then_else (match_operator 1 "simple_comparison_operator"
   4991   1.1.1.2    mrg                                       [(cc0)
   4992   1.1.1.2    mrg                                        (const_int 0)])
   4993   1.1.1.2    mrg                       (label_ref (match_operand 0 "" ""))
   4994   1.1.1.2    mrg                       (pc)))]
   4995   1.1.1.2    mrg   ""
   4996   1.1.1.2    mrg   {
   4997   1.1.1.2    mrg     return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 0);
   4998   1.1.1.2    mrg   }
   4999   1.1.1.2    mrg   [(set_attr "type" "branch")
   5000   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   5001   1.1.1.2    mrg 
   5002   1.1.1.2    mrg 
   5003   1.1.1.2    mrg ;; Same as above but wrap SET_SRC so that this branch won't be transformed
   5004   1.1.1.2    mrg ;; or optimized in the remainder.
   5005   1.1.1.2    mrg 
   5006   1.1.1.2    mrg (define_insn "branch_unspec"
   5007   1.1.1.2    mrg   [(set (pc)
   5008   1.1.1.2    mrg         (unspec [(if_then_else (match_operator 1 "simple_comparison_operator"
   5009   1.1.1.2    mrg                                                [(cc0)
   5010   1.1.1.2    mrg                                                 (const_int 0)])
   5011   1.1.1.2    mrg                                (label_ref (match_operand 0 "" ""))
   5012   1.1.1.2    mrg                                (pc))
   5013   1.1.1.2    mrg                  ] UNSPEC_IDENTITY))]
   5014   1.1.1.2    mrg   ""
   5015   1.1.1.2    mrg   {
   5016   1.1.1.2    mrg     return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 0);
   5017   1.1.1.2    mrg   }
   5018   1.1.1.2    mrg   [(set_attr "type" "branch")
   5019   1.1.1.2    mrg    (set_attr "cc" "none")])
   5020   1.1.1.2    mrg 
   5021   1.1.1.2    mrg ;; ****************************************************************
   5022   1.1.1.2    mrg ;; AVR does not have following conditional jumps: LE,LEU,GT,GTU.
   5023   1.1.1.2    mrg ;; Convert them all to proper jumps.
   5024   1.1.1.2    mrg ;; ****************************************************************/
   5025   1.1.1.2    mrg 
   5026   1.1.1.2    mrg (define_insn "difficult_branch"
   5027   1.1.1.2    mrg   [(set (pc)
   5028   1.1.1.2    mrg         (if_then_else (match_operator 1 "difficult_comparison_operator"
   5029   1.1.1.2    mrg                         [(cc0)
   5030   1.1.1.2    mrg                          (const_int 0)])
   5031   1.1.1.2    mrg                       (label_ref (match_operand 0 "" ""))
   5032   1.1.1.2    mrg                       (pc)))]
   5033   1.1.1.2    mrg   ""
   5034   1.1.1.2    mrg   {
   5035   1.1.1.2    mrg     return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 0);
   5036   1.1.1.2    mrg   }
   5037   1.1.1.2    mrg   [(set_attr "type" "branch1")
   5038   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   5039   1.1.1.2    mrg 
   5040   1.1.1.2    mrg ;; revers branch
   5041   1.1.1.2    mrg 
   5042   1.1.1.2    mrg (define_insn "rvbranch"
   5043   1.1.1.2    mrg   [(set (pc)
   5044   1.1.1.2    mrg         (if_then_else (match_operator 1 "simple_comparison_operator"
   5045   1.1.1.2    mrg                                       [(cc0)
   5046   1.1.1.2    mrg                                        (const_int 0)])
   5047   1.1.1.2    mrg                       (pc)
   5048   1.1.1.2    mrg                       (label_ref (match_operand 0 "" ""))))]
   5049   1.1.1.2    mrg   ""
   5050   1.1.1.2    mrg   {
   5051   1.1.1.2    mrg     return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 1);
   5052   1.1.1.2    mrg   }
   5053   1.1.1.2    mrg   [(set_attr "type" "branch1")
   5054   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   5055   1.1.1.2    mrg 
   5056   1.1.1.2    mrg (define_insn "difficult_rvbranch"
   5057   1.1.1.2    mrg   [(set (pc)
   5058   1.1.1.2    mrg         (if_then_else (match_operator 1 "difficult_comparison_operator"
   5059   1.1.1.2    mrg                                       [(cc0)
   5060   1.1.1.2    mrg                                        (const_int 0)])
   5061   1.1.1.2    mrg                       (pc)
   5062   1.1.1.2    mrg                       (label_ref (match_operand 0 "" ""))))]
   5063   1.1.1.2    mrg   ""
   5064   1.1.1.2    mrg   {
   5065   1.1.1.2    mrg     return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 1);
   5066   1.1.1.2    mrg   }
   5067   1.1.1.2    mrg   [(set_attr "type" "branch")
   5068   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   5069   1.1.1.2    mrg 
   5070   1.1.1.2    mrg ;; **************************************************************************
   5071   1.1.1.2    mrg ;; Unconditional and other jump instructions.
   5072   1.1.1.2    mrg 
   5073   1.1.1.2    mrg (define_insn "jump"
   5074   1.1.1.2    mrg   [(set (pc)
   5075   1.1.1.2    mrg         (label_ref (match_operand 0 "" "")))]
   5076   1.1.1.2    mrg   ""
   5077   1.1.1.2    mrg   {
   5078   1.1.1.2    mrg     return AVR_HAVE_JMP_CALL && get_attr_length (insn) != 1
   5079   1.1.1.2    mrg            ? "jmp %x0"
   5080   1.1.1.2    mrg            : "rjmp %x0";
   5081   1.1.1.2    mrg   }
   5082   1.1.1.2    mrg   [(set (attr "length")
   5083   1.1.1.2    mrg         (if_then_else (match_operand 0 "symbol_ref_operand" "")	
   5084   1.1.1.2    mrg                       (if_then_else (match_test "!AVR_HAVE_JMP_CALL")
   5085   1.1.1.2    mrg                                     (const_int 1)
   5086   1.1.1.2    mrg                                     (const_int 2))
   5087   1.1.1.2    mrg                       (if_then_else (and (ge (minus (pc) (match_dup 0)) (const_int -2047))
   5088   1.1.1.2    mrg                                          (le (minus (pc) (match_dup 0)) (const_int 2047)))
   5089   1.1.1.2    mrg                                     (const_int 1)
   5090   1.1.1.2    mrg                                     (const_int 2))))
   5091   1.1.1.2    mrg    (set_attr "cc" "none")])
   5092   1.1.1.2    mrg 
   5093   1.1.1.2    mrg ;; call
   5094   1.1.1.2    mrg 
   5095   1.1.1.2    mrg ;; Operand 1 not used on the AVR.
   5096   1.1.1.2    mrg ;; Operand 2 is 1 for tail-call, 0 otherwise.
   5097   1.1.1.2    mrg (define_expand "call"
   5098   1.1.1.2    mrg   [(parallel[(call (match_operand:HI 0 "call_insn_operand" "")
   5099   1.1.1.2    mrg                    (match_operand:HI 1 "general_operand" ""))
   5100   1.1.1.2    mrg              (use (const_int 0))])])
   5101   1.1.1.2    mrg 
   5102   1.1.1.2    mrg ;; Operand 1 not used on the AVR.
   5103   1.1.1.2    mrg ;; Operand 2 is 1 for tail-call, 0 otherwise.
   5104   1.1.1.2    mrg (define_expand "sibcall"
   5105   1.1.1.2    mrg   [(parallel[(call (match_operand:HI 0 "call_insn_operand" "")
   5106   1.1.1.2    mrg                    (match_operand:HI 1 "general_operand" ""))
   5107   1.1.1.2    mrg              (use (const_int 1))])])
   5108   1.1.1.2    mrg 
   5109   1.1.1.2    mrg ;; call value
   5110   1.1.1.2    mrg 
   5111   1.1.1.2    mrg ;; Operand 2 not used on the AVR.
   5112   1.1.1.2    mrg ;; Operand 3 is 1 for tail-call, 0 otherwise.
   5113   1.1.1.2    mrg (define_expand "call_value"
   5114   1.1.1.2    mrg   [(parallel[(set (match_operand 0 "register_operand" "")
   5115   1.1.1.2    mrg                   (call (match_operand:HI 1 "call_insn_operand" "")
   5116   1.1.1.2    mrg                         (match_operand:HI 2 "general_operand" "")))
   5117   1.1.1.2    mrg              (use (const_int 0))])])
   5118   1.1.1.2    mrg 
   5119   1.1.1.2    mrg ;; Operand 2 not used on the AVR.
   5120   1.1.1.2    mrg ;; Operand 3 is 1 for tail-call, 0 otherwise.
   5121   1.1.1.2    mrg (define_expand "sibcall_value"
   5122   1.1.1.2    mrg   [(parallel[(set (match_operand 0 "register_operand" "")
   5123   1.1.1.2    mrg                   (call (match_operand:HI 1 "call_insn_operand" "")
   5124   1.1.1.2    mrg                         (match_operand:HI 2 "general_operand" "")))
   5125   1.1.1.2    mrg              (use (const_int 1))])])
   5126   1.1.1.2    mrg 
   5127   1.1.1.2    mrg (define_insn "call_insn"
   5128   1.1.1.2    mrg   [(parallel[(call (mem:HI (match_operand:HI 0 "nonmemory_operand" "z,s,z,s"))
   5129   1.1.1.2    mrg                    (match_operand:HI 1 "general_operand"           "X,X,X,X"))
   5130   1.1.1.2    mrg              (use (match_operand:HI 2 "const_int_operand"          "L,L,P,P"))])]
   5131   1.1.1.2    mrg   ;; Operand 1 not used on the AVR.
   5132   1.1.1.2    mrg   ;; Operand 2 is 1 for tail-call, 0 otherwise.
   5133   1.1.1.2    mrg   ""
   5134   1.1.1.2    mrg   "@
   5135   1.1.1.2    mrg     %!icall
   5136   1.1.1.2    mrg     %~call %x0
   5137   1.1.1.2    mrg     %!ijmp
   5138   1.1.1.2    mrg     %~jmp %x0"
   5139   1.1.1.2    mrg   [(set_attr "cc" "clobber")
   5140   1.1.1.2    mrg    (set_attr "length" "1,*,1,*")
   5141   1.1.1.2    mrg    (set_attr "adjust_len" "*,call,*,call")])
   5142   1.1.1.2    mrg 
   5143   1.1.1.2    mrg (define_insn "call_value_insn"
   5144   1.1.1.2    mrg   [(parallel[(set (match_operand 0 "register_operand"                   "=r,r,r,r")
   5145   1.1.1.2    mrg                   (call (mem:HI (match_operand:HI 1 "nonmemory_operand"  "z,s,z,s"))
   5146   1.1.1.2    mrg                         (match_operand:HI 2 "general_operand"            "X,X,X,X")))
   5147   1.1.1.2    mrg              (use (match_operand:HI 3 "const_int_operand"                "L,L,P,P"))])]
   5148   1.1.1.2    mrg   ;; Operand 2 not used on the AVR.
   5149   1.1.1.2    mrg   ;; Operand 3 is 1 for tail-call, 0 otherwise.
   5150   1.1.1.2    mrg   ""
   5151   1.1.1.2    mrg   "@
   5152   1.1.1.2    mrg     %!icall
   5153   1.1.1.2    mrg     %~call %x1
   5154   1.1.1.2    mrg     %!ijmp
   5155   1.1.1.2    mrg     %~jmp %x1"
   5156   1.1.1.2    mrg   [(set_attr "cc" "clobber")
   5157   1.1.1.2    mrg    (set_attr "length" "1,*,1,*")
   5158   1.1.1.2    mrg    (set_attr "adjust_len" "*,call,*,call")])
   5159   1.1.1.2    mrg 
   5160   1.1.1.2    mrg (define_insn "nop"
   5161   1.1.1.2    mrg   [(const_int 0)]
   5162   1.1.1.2    mrg   ""
   5163   1.1.1.2    mrg   "nop"
   5164   1.1.1.2    mrg   [(set_attr "cc" "none")
   5165   1.1.1.2    mrg    (set_attr "length" "1")])
   5166   1.1.1.2    mrg 
   5167   1.1.1.2    mrg ; indirect jump
   5168   1.1.1.2    mrg 
   5169   1.1.1.2    mrg (define_expand "indirect_jump"
   5170   1.1.1.2    mrg   [(set (pc)
   5171   1.1.1.2    mrg         (match_operand:HI 0 "nonmemory_operand" ""))]
   5172   1.1.1.2    mrg   ""
   5173   1.1.1.2    mrg   {
   5174   1.1.1.2    mrg     if (!AVR_HAVE_JMP_CALL && !register_operand (operands[0], HImode))
   5175   1.1.1.2    mrg       {
   5176   1.1.1.2    mrg         operands[0] = copy_to_mode_reg (HImode, operands[0]);
   5177   1.1.1.2    mrg       }
   5178   1.1.1.2    mrg   })
   5179   1.1.1.2    mrg 
   5180   1.1.1.2    mrg ; indirect jump
   5181   1.1.1.2    mrg (define_insn "*indirect_jump"
   5182   1.1.1.2    mrg   [(set (pc)
   5183   1.1.1.2    mrg         (match_operand:HI 0 "nonmemory_operand" "i,i,!z,*r,z"))]
   5184   1.1.1.2    mrg   ""
   5185   1.1.1.2    mrg   "@
   5186   1.1.1.2    mrg 	rjmp %x0
   5187   1.1.1.2    mrg 	jmp %x0
   5188   1.1.1.2    mrg 	ijmp
   5189   1.1.1.2    mrg 	push %A0\;push %B0\;ret
   5190   1.1.1.2    mrg 	eijmp"
   5191   1.1.1.2    mrg   [(set_attr "length" "1,2,1,3,1")
   5192   1.1.1.2    mrg    (set_attr "isa" "rjmp,jmp,ijmp,ijmp,eijmp")
   5193   1.1.1.2    mrg    (set_attr "cc" "none")])
   5194   1.1.1.2    mrg 
   5195   1.1.1.2    mrg ;; table jump
   5196  1.1.1.12    mrg ;; For entries in jump table see avr_output_addr_vec.
   5197   1.1.1.2    mrg 
   5198   1.1.1.2    mrg ;; Table made from
   5199   1.1.1.2    mrg ;;    "rjmp .L<n>"   instructions for <= 8K devices
   5200   1.1.1.2    mrg ;;    ".word gs(.L<n>)" addresses for >  8K devices
   5201   1.1.1.2    mrg (define_insn "*tablejump"
   5202   1.1.1.2    mrg   [(set (pc)
   5203   1.1.1.2    mrg         (unspec:HI [(match_operand:HI 0 "register_operand" "!z,*r,z")]
   5204   1.1.1.2    mrg                    UNSPEC_INDEX_JMP))
   5205   1.1.1.2    mrg    (use (label_ref (match_operand 1 "" "")))
   5206   1.1.1.6    mrg    (clobber (match_dup 0))
   5207   1.1.1.6    mrg    (clobber (const_int 0))]
   5208   1.1.1.6    mrg   "!AVR_HAVE_EIJMP_EICALL"
   5209   1.1.1.2    mrg   "@
   5210   1.1.1.2    mrg 	ijmp
   5211   1.1.1.2    mrg 	push %A0\;push %B0\;ret
   5212   1.1.1.2    mrg 	jmp __tablejump2__"
   5213   1.1.1.2    mrg   [(set_attr "length" "1,3,2")
   5214   1.1.1.2    mrg    (set_attr "isa" "rjmp,rjmp,jmp")
   5215   1.1.1.2    mrg    (set_attr "cc" "none,none,clobber")])
   5216   1.1.1.2    mrg 
   5217   1.1.1.6    mrg (define_insn "*tablejump.3byte-pc"
   5218   1.1.1.6    mrg   [(set (pc)
   5219   1.1.1.6    mrg         (unspec:HI [(reg:HI REG_Z)]
   5220   1.1.1.6    mrg                    UNSPEC_INDEX_JMP))
   5221   1.1.1.6    mrg    (use (label_ref (match_operand 0 "" "")))
   5222   1.1.1.6    mrg    (clobber (reg:HI REG_Z))
   5223   1.1.1.6    mrg    (clobber (reg:QI 24))]
   5224   1.1.1.6    mrg   "AVR_HAVE_EIJMP_EICALL"
   5225   1.1.1.6    mrg   "clr r24\;subi r30,pm_lo8(-(%0))\;sbci r31,pm_hi8(-(%0))\;sbci r24,pm_hh8(-(%0))\;jmp __tablejump2__"
   5226   1.1.1.6    mrg   [(set_attr "length" "6")
   5227   1.1.1.6    mrg    (set_attr "isa" "eijmp")
   5228   1.1.1.6    mrg    (set_attr "cc" "clobber")])
   5229   1.1.1.6    mrg 
   5230   1.1.1.2    mrg 
   5231   1.1.1.9    mrg ;; FIXME: casesi comes up with an SImode switch value $0 which
   5232   1.1.1.9    mrg ;;   is quite some overhead because most code would use HI or
   5233   1.1.1.9    mrg ;;   even QI.  We add an AVR specific pass .avr-casesi which
   5234   1.1.1.9    mrg ;;   tries to recover from the superfluous extension to SImode.
   5235   1.1.1.9    mrg ;;
   5236   1.1.1.9    mrg ;;   Using "tablejump" could be a way out, but this also does
   5237   1.1.1.9    mrg ;;   not perform in a satisfying manner as the middle end will
   5238   1.1.1.9    mrg ;;   already multiply the table index by 2.  Note that this
   5239   1.1.1.9    mrg ;;   multiplication is performed by libgcc's __tablejump2__.
   5240   1.1.1.9    mrg ;;   The multiplication there, however, runs *after* the table
   5241   1.1.1.9    mrg ;;   start (a byte address) has been added, not before it like
   5242   1.1.1.9    mrg ;;   "tablejump" will do.
   5243   1.1.1.9    mrg ;;
   5244   1.1.1.9    mrg ;;   The preferred solution would be to let the middle ends pass
   5245   1.1.1.9    mrg ;;   down information on the index as an additional casesi operand.
   5246   1.1.1.9    mrg ;;
   5247   1.1.1.9    mrg ;;   If this expander is changed, you'll likely have to go through
   5248   1.1.1.9    mrg ;;   "casesi_<mode>_sequence" (used to recog + extract casesi
   5249   1.1.1.9    mrg ;;   sequences in pass .avr-casesi) and propagate all adjustments
   5250   1.1.1.9    mrg ;;   also to that pattern and the code of the extra pass.
   5251   1.1.1.9    mrg   
   5252   1.1.1.2    mrg (define_expand "casesi"
   5253   1.1.1.9    mrg   [(parallel [(set (match_dup 5)
   5254   1.1.1.9    mrg                    (plus:SI (match_operand:SI 0 "register_operand")
   5255   1.1.1.9    mrg                             (match_operand:SI 1 "const_int_operand")))
   5256   1.1.1.2    mrg               (clobber (scratch:QI))])
   5257   1.1.1.2    mrg    (parallel [(set (cc0)
   5258   1.1.1.9    mrg                    (compare (match_dup 5)
   5259   1.1.1.9    mrg                             (match_operand:SI 2 "const_int_operand")))
   5260   1.1.1.9    mrg               (clobber (scratch:QI))])
   5261   1.1.1.2    mrg 
   5262   1.1.1.2    mrg    (set (pc)
   5263   1.1.1.2    mrg         (if_then_else (gtu (cc0)
   5264   1.1.1.2    mrg                            (const_int 0))
   5265   1.1.1.9    mrg                       (label_ref (match_operand 4))
   5266   1.1.1.2    mrg                       (pc)))
   5267   1.1.1.2    mrg 
   5268   1.1.1.9    mrg    (set (match_dup 7)
   5269   1.1.1.9    mrg         (match_dup 6))
   5270   1.1.1.2    mrg 
   5271   1.1.1.6    mrg    (parallel [(set (pc)
   5272   1.1.1.9    mrg                    (unspec:HI [(match_dup 7)] UNSPEC_INDEX_JMP))
   5273   1.1.1.2    mrg               (use (label_ref (match_dup 3)))
   5274   1.1.1.9    mrg               (clobber (match_dup 7))
   5275   1.1.1.6    mrg               (clobber (match_dup 8))])]
   5276   1.1.1.2    mrg   ""
   5277   1.1.1.2    mrg   {
   5278   1.1.1.9    mrg     operands[1] = simplify_unary_operation (NEG, SImode, operands[1], SImode);
   5279   1.1.1.9    mrg     operands[5] = gen_reg_rtx (SImode);
   5280   1.1.1.9    mrg     operands[6] = simplify_gen_subreg (HImode, operands[5], SImode, 0);
   5281   1.1.1.6    mrg 
   5282   1.1.1.6    mrg     if (AVR_HAVE_EIJMP_EICALL)
   5283   1.1.1.6    mrg       {
   5284   1.1.1.9    mrg         operands[7] = gen_rtx_REG (HImode, REG_Z);
   5285   1.1.1.6    mrg         operands[8] = all_regs_rtx[24];
   5286   1.1.1.6    mrg       }
   5287   1.1.1.6    mrg     else
   5288   1.1.1.6    mrg       {
   5289   1.1.1.9    mrg         operands[6] = gen_rtx_PLUS (HImode, operands[6],
   5290   1.1.1.6    mrg                                     gen_rtx_LABEL_REF (VOIDmode, operands[3]));
   5291   1.1.1.9    mrg         operands[7] = gen_reg_rtx (HImode);
   5292   1.1.1.6    mrg         operands[8] = const0_rtx;
   5293   1.1.1.6    mrg       }
   5294   1.1.1.2    mrg   })
   5295       1.1    mrg 
   5296   1.1.1.2    mrg 
   5297   1.1.1.9    mrg ;; This insn is used only for easy operand extraction.
   5298   1.1.1.9    mrg ;; The elements must match an extension to SImode plus
   5299   1.1.1.9    mrg ;; a sequence generated by casesi above.
   5300   1.1.1.9    mrg 
   5301   1.1.1.9    mrg ;; "casesi_qi_sequence"
   5302   1.1.1.9    mrg ;; "casesi_hi_sequence"
   5303   1.1.1.9    mrg (define_insn "casesi_<mode>_sequence"
   5304   1.1.1.9    mrg   [(set (match_operand:SI 0 "register_operand")
   5305   1.1.1.9    mrg         (match_operator:SI 9 "extend_operator"
   5306   1.1.1.9    mrg                            [(match_operand:QIHI 10 "register_operand")]))
   5307   1.1.1.9    mrg 
   5308   1.1.1.9    mrg    ;; What follows is a matcher for code from casesi.
   5309   1.1.1.9    mrg    ;; We keep the same operand numbering (except for $9 and $10
   5310   1.1.1.9    mrg    ;; which don't appear in casesi).
   5311   1.1.1.9    mrg    (parallel [(set (match_operand:SI 5 "register_operand")
   5312   1.1.1.9    mrg                    (plus:SI (match_dup 0)
   5313   1.1.1.9    mrg                             (match_operand:SI 1 "const_int_operand")))
   5314   1.1.1.9    mrg               (clobber (scratch:QI))])
   5315   1.1.1.9    mrg    (parallel [(set (cc0)
   5316   1.1.1.9    mrg                    (compare (match_dup 5)
   5317   1.1.1.9    mrg                             (match_operand:SI 2 "const_int_operand")))
   5318   1.1.1.9    mrg               (clobber (scratch:QI))])
   5319   1.1.1.9    mrg 
   5320   1.1.1.9    mrg    (set (pc)
   5321   1.1.1.9    mrg         (if_then_else (gtu (cc0)
   5322   1.1.1.9    mrg                            (const_int 0))
   5323   1.1.1.9    mrg                       (label_ref (match_operand 4))
   5324   1.1.1.9    mrg                       (pc)))
   5325   1.1.1.9    mrg 
   5326   1.1.1.9    mrg    (set (match_operand:HI 7 "register_operand")
   5327   1.1.1.9    mrg         (match_operand:HI 6))
   5328   1.1.1.9    mrg 
   5329   1.1.1.9    mrg    (parallel [(set (pc)
   5330   1.1.1.9    mrg                    (unspec:HI [(match_dup 7)] UNSPEC_INDEX_JMP))
   5331   1.1.1.9    mrg               (use (label_ref (match_operand 3)))
   5332   1.1.1.9    mrg               (clobber (match_dup 7))
   5333   1.1.1.9    mrg               (clobber (match_operand:QI 8))])]
   5334   1.1.1.9    mrg   "optimize
   5335   1.1.1.9    mrg    && avr_casei_sequence_check_operands (operands)"
   5336   1.1.1.9    mrg   { gcc_unreachable(); }
   5337   1.1.1.9    mrg   )
   5338   1.1.1.9    mrg 
   5339   1.1.1.9    mrg 
   5340   1.1.1.2    mrg ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   5341   1.1.1.2    mrg ;; This instruction sets Z flag
   5342   1.1.1.2    mrg 
   5343   1.1.1.2    mrg (define_insn "sez"
   5344   1.1.1.2    mrg   [(set (cc0) (const_int 0))]
   5345       1.1    mrg   ""
   5346   1.1.1.2    mrg   "sez"
   5347   1.1.1.2    mrg   [(set_attr "length" "1")
   5348   1.1.1.2    mrg    (set_attr "cc" "compare")])
   5349       1.1    mrg 
   5350   1.1.1.2    mrg ;; Clear/set/test a single bit in I/O address space.
   5351       1.1    mrg 
   5352   1.1.1.2    mrg (define_insn "*cbi"
   5353   1.1.1.6    mrg   [(set (mem:QI (match_operand 0 "low_io_address_operand" "i"))
   5354   1.1.1.2    mrg         (and:QI (mem:QI (match_dup 0))
   5355   1.1.1.2    mrg                 (match_operand:QI 1 "single_zero_operand" "n")))]
   5356       1.1    mrg   ""
   5357   1.1.1.2    mrg   {
   5358   1.1.1.2    mrg     operands[2] = GEN_INT (exact_log2 (~INTVAL (operands[1]) & 0xff));
   5359   1.1.1.2    mrg     return "cbi %i0,%2";
   5360   1.1.1.2    mrg   }
   5361   1.1.1.2    mrg   [(set_attr "length" "1")
   5362   1.1.1.2    mrg    (set_attr "cc" "none")])
   5363       1.1    mrg 
   5364   1.1.1.2    mrg (define_insn "*sbi"
   5365   1.1.1.6    mrg   [(set (mem:QI (match_operand 0 "low_io_address_operand" "i"))
   5366   1.1.1.2    mrg         (ior:QI (mem:QI (match_dup 0))
   5367   1.1.1.2    mrg                 (match_operand:QI 1 "single_one_operand" "n")))]
   5368       1.1    mrg   ""
   5369   1.1.1.2    mrg   {
   5370   1.1.1.2    mrg     operands[2] = GEN_INT (exact_log2 (INTVAL (operands[1]) & 0xff));
   5371   1.1.1.2    mrg     return "sbi %i0,%2";
   5372   1.1.1.2    mrg   }
   5373   1.1.1.2    mrg   [(set_attr "length" "1")
   5374   1.1.1.2    mrg    (set_attr "cc" "none")])
   5375       1.1    mrg 
   5376   1.1.1.2    mrg ;; Lower half of the I/O space - use sbic/sbis directly.
   5377   1.1.1.2    mrg (define_insn "*sbix_branch"
   5378   1.1.1.2    mrg   [(set (pc)
   5379   1.1.1.2    mrg         (if_then_else
   5380   1.1.1.2    mrg          (match_operator 0 "eqne_operator"
   5381   1.1.1.2    mrg                          [(zero_extract:QIHI
   5382   1.1.1.6    mrg                            (mem:QI (match_operand 1 "low_io_address_operand" "i"))
   5383   1.1.1.2    mrg                            (const_int 1)
   5384   1.1.1.2    mrg                            (match_operand 2 "const_int_operand" "n"))
   5385   1.1.1.2    mrg                           (const_int 0)])
   5386   1.1.1.2    mrg          (label_ref (match_operand 3 "" ""))
   5387   1.1.1.2    mrg          (pc)))]
   5388   1.1.1.2    mrg   ""
   5389   1.1.1.2    mrg   {
   5390   1.1.1.2    mrg     return avr_out_sbxx_branch (insn, operands);
   5391   1.1.1.2    mrg   }
   5392   1.1.1.2    mrg   [(set (attr "length")
   5393   1.1.1.2    mrg         (if_then_else (and (ge (minus (pc) (match_dup 3)) (const_int -2046))
   5394   1.1.1.2    mrg                            (le (minus (pc) (match_dup 3)) (const_int 2046)))
   5395   1.1.1.2    mrg                       (const_int 2)
   5396   1.1.1.2    mrg                       (if_then_else (match_test "!AVR_HAVE_JMP_CALL")
   5397   1.1.1.2    mrg                                     (const_int 2)
   5398   1.1.1.2    mrg                                     (const_int 4))))
   5399   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   5400   1.1.1.2    mrg 
   5401   1.1.1.2    mrg ;; Tests of bit 7 are pessimized to sign tests, so we need this too...
   5402   1.1.1.2    mrg (define_insn "*sbix_branch_bit7"
   5403   1.1.1.2    mrg   [(set (pc)
   5404   1.1.1.2    mrg         (if_then_else
   5405   1.1.1.2    mrg          (match_operator 0 "gelt_operator"
   5406   1.1.1.6    mrg                          [(mem:QI (match_operand 1 "low_io_address_operand" "i"))
   5407   1.1.1.2    mrg                           (const_int 0)])
   5408   1.1.1.2    mrg          (label_ref (match_operand 2 "" ""))
   5409   1.1.1.2    mrg          (pc)))]
   5410   1.1.1.2    mrg   ""
   5411   1.1.1.2    mrg   {
   5412   1.1.1.2    mrg     operands[3] = operands[2];
   5413   1.1.1.2    mrg     operands[2] = GEN_INT (7);
   5414   1.1.1.2    mrg     return avr_out_sbxx_branch (insn, operands);
   5415   1.1.1.2    mrg   }
   5416   1.1.1.2    mrg   [(set (attr "length")
   5417   1.1.1.2    mrg         (if_then_else (and (ge (minus (pc) (match_dup 2)) (const_int -2046))
   5418   1.1.1.2    mrg                            (le (minus (pc) (match_dup 2)) (const_int 2046)))
   5419   1.1.1.2    mrg                       (const_int 2)
   5420   1.1.1.2    mrg                       (if_then_else (match_test "!AVR_HAVE_JMP_CALL")
   5421   1.1.1.2    mrg                                     (const_int 2)
   5422   1.1.1.2    mrg                                     (const_int 4))))
   5423   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   5424   1.1.1.2    mrg 
   5425   1.1.1.2    mrg ;; Upper half of the I/O space - read port to __tmp_reg__ and use sbrc/sbrs.
   5426   1.1.1.2    mrg (define_insn "*sbix_branch_tmp"
   5427   1.1.1.2    mrg   [(set (pc)
   5428   1.1.1.2    mrg         (if_then_else
   5429   1.1.1.2    mrg          (match_operator 0 "eqne_operator"
   5430   1.1.1.2    mrg                          [(zero_extract:QIHI
   5431   1.1.1.2    mrg                            (mem:QI (match_operand 1 "high_io_address_operand" "n"))
   5432   1.1.1.2    mrg                            (const_int 1)
   5433   1.1.1.2    mrg                            (match_operand 2 "const_int_operand" "n"))
   5434   1.1.1.2    mrg                           (const_int 0)])
   5435   1.1.1.2    mrg          (label_ref (match_operand 3 "" ""))
   5436   1.1.1.2    mrg          (pc)))]
   5437   1.1.1.2    mrg   ""
   5438   1.1.1.2    mrg   {
   5439   1.1.1.2    mrg     return avr_out_sbxx_branch (insn, operands);
   5440   1.1.1.2    mrg   }
   5441   1.1.1.2    mrg   [(set (attr "length")
   5442   1.1.1.2    mrg         (if_then_else (and (ge (minus (pc) (match_dup 3)) (const_int -2046))
   5443   1.1.1.2    mrg                            (le (minus (pc) (match_dup 3)) (const_int 2045)))
   5444   1.1.1.2    mrg                       (const_int 3)
   5445   1.1.1.2    mrg                       (if_then_else (match_test "!AVR_HAVE_JMP_CALL")
   5446   1.1.1.2    mrg                                     (const_int 3)
   5447   1.1.1.2    mrg                                     (const_int 5))))
   5448   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   5449   1.1.1.2    mrg 
   5450   1.1.1.2    mrg (define_insn "*sbix_branch_tmp_bit7"
   5451   1.1.1.2    mrg   [(set (pc)
   5452   1.1.1.2    mrg         (if_then_else
   5453   1.1.1.2    mrg          (match_operator 0 "gelt_operator"
   5454   1.1.1.2    mrg                          [(mem:QI (match_operand 1 "high_io_address_operand" "n"))
   5455   1.1.1.2    mrg                           (const_int 0)])
   5456   1.1.1.2    mrg          (label_ref (match_operand 2 "" ""))
   5457   1.1.1.2    mrg          (pc)))]
   5458   1.1.1.2    mrg   ""
   5459   1.1.1.2    mrg   {
   5460   1.1.1.2    mrg     operands[3] = operands[2];
   5461   1.1.1.2    mrg     operands[2] = GEN_INT (7);
   5462   1.1.1.2    mrg     return avr_out_sbxx_branch (insn, operands);
   5463   1.1.1.2    mrg   }
   5464   1.1.1.2    mrg   [(set (attr "length")
   5465   1.1.1.2    mrg         (if_then_else (and (ge (minus (pc) (match_dup 2)) (const_int -2046))
   5466   1.1.1.2    mrg                            (le (minus (pc) (match_dup 2)) (const_int 2045)))
   5467   1.1.1.2    mrg                       (const_int 3)
   5468   1.1.1.2    mrg                       (if_then_else (match_test "!AVR_HAVE_JMP_CALL")
   5469   1.1.1.2    mrg                                     (const_int 3)
   5470   1.1.1.2    mrg                                     (const_int 5))))
   5471   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   5472   1.1.1.2    mrg 
   5473   1.1.1.2    mrg ;; ************************* Peepholes ********************************
   5474   1.1.1.2    mrg 
   5475   1.1.1.2    mrg (define_peephole ; "*dec-and-branchsi!=-1.d.clobber"
   5476   1.1.1.2    mrg   [(parallel [(set (match_operand:SI 0 "d_register_operand" "")
   5477   1.1.1.2    mrg                    (plus:SI (match_dup 0)
   5478   1.1.1.2    mrg                             (const_int -1)))
   5479   1.1.1.2    mrg               (clobber (scratch:QI))])
   5480   1.1.1.2    mrg    (parallel [(set (cc0)
   5481   1.1.1.2    mrg                    (compare (match_dup 0)
   5482   1.1.1.2    mrg                             (const_int -1)))
   5483   1.1.1.2    mrg               (clobber (match_operand:QI 1 "d_register_operand" ""))])
   5484   1.1.1.2    mrg    (set (pc)
   5485   1.1.1.2    mrg         (if_then_else (eqne (cc0)
   5486   1.1.1.2    mrg                             (const_int 0))
   5487   1.1.1.2    mrg                       (label_ref (match_operand 2 "" ""))
   5488   1.1.1.2    mrg                       (pc)))]
   5489   1.1.1.2    mrg   ""
   5490   1.1.1.2    mrg   {
   5491   1.1.1.2    mrg     const char *op;
   5492   1.1.1.2    mrg     int jump_mode;
   5493   1.1.1.2    mrg     CC_STATUS_INIT;
   5494   1.1.1.2    mrg     if (test_hard_reg_class (ADDW_REGS, operands[0]))
   5495   1.1.1.2    mrg       output_asm_insn ("sbiw %0,1" CR_TAB
   5496   1.1.1.2    mrg                        "sbc %C0,__zero_reg__" CR_TAB
   5497   1.1.1.2    mrg                        "sbc %D0,__zero_reg__", operands);
   5498   1.1.1.2    mrg     else
   5499   1.1.1.2    mrg       output_asm_insn ("subi %A0,1" CR_TAB
   5500   1.1.1.2    mrg                        "sbc %B0,__zero_reg__" CR_TAB
   5501   1.1.1.2    mrg                        "sbc %C0,__zero_reg__" CR_TAB
   5502   1.1.1.2    mrg                        "sbc %D0,__zero_reg__", operands);
   5503   1.1.1.2    mrg 
   5504   1.1.1.2    mrg     jump_mode = avr_jump_mode (operands[2], insn);
   5505   1.1.1.2    mrg     op = ((EQ == <CODE>) ^ (jump_mode == 1)) ? "brcc" : "brcs";
   5506   1.1.1.2    mrg     operands[1] = gen_rtx_CONST_STRING (VOIDmode, op);
   5507   1.1.1.2    mrg 
   5508   1.1.1.2    mrg     switch (jump_mode)
   5509   1.1.1.2    mrg       {
   5510   1.1.1.2    mrg       case 1: return "%1 %2";
   5511   1.1.1.2    mrg       case 2: return "%1 .+2\;rjmp %2";
   5512   1.1.1.2    mrg       case 3: return "%1 .+4\;jmp %2";
   5513   1.1.1.2    mrg       }
   5514   1.1.1.2    mrg 
   5515   1.1.1.2    mrg     gcc_unreachable();
   5516   1.1.1.2    mrg     return "";
   5517   1.1.1.2    mrg   })
   5518   1.1.1.2    mrg 
   5519   1.1.1.2    mrg (define_peephole ; "*dec-and-branchhi!=-1"
   5520   1.1.1.2    mrg   [(set (match_operand:HI 0 "d_register_operand" "")
   5521   1.1.1.2    mrg         (plus:HI (match_dup 0)
   5522   1.1.1.2    mrg                  (const_int -1)))
   5523   1.1.1.2    mrg    (parallel [(set (cc0)
   5524   1.1.1.2    mrg                    (compare (match_dup 0)
   5525   1.1.1.2    mrg                             (const_int -1)))
   5526   1.1.1.2    mrg               (clobber (match_operand:QI 1 "d_register_operand" ""))])
   5527   1.1.1.2    mrg    (set (pc)
   5528   1.1.1.2    mrg         (if_then_else (eqne (cc0)
   5529   1.1.1.2    mrg                             (const_int 0))
   5530   1.1.1.2    mrg                       (label_ref (match_operand 2 "" ""))
   5531   1.1.1.2    mrg                       (pc)))]
   5532   1.1.1.2    mrg   ""
   5533   1.1.1.2    mrg   {
   5534   1.1.1.2    mrg     const char *op;
   5535   1.1.1.2    mrg     int jump_mode;
   5536   1.1.1.2    mrg     CC_STATUS_INIT;
   5537   1.1.1.2    mrg     if (test_hard_reg_class (ADDW_REGS, operands[0]))
   5538   1.1.1.2    mrg       output_asm_insn ("sbiw %0,1", operands);
   5539   1.1.1.2    mrg     else
   5540   1.1.1.2    mrg       output_asm_insn ("subi %A0,1" CR_TAB
   5541   1.1.1.2    mrg                        "sbc %B0,__zero_reg__", operands);
   5542   1.1.1.2    mrg 
   5543   1.1.1.2    mrg     jump_mode = avr_jump_mode (operands[2], insn);
   5544   1.1.1.2    mrg     op = ((EQ == <CODE>) ^ (jump_mode == 1)) ? "brcc" : "brcs";
   5545   1.1.1.2    mrg     operands[1] = gen_rtx_CONST_STRING (VOIDmode, op);
   5546   1.1.1.2    mrg 
   5547   1.1.1.2    mrg     switch (jump_mode)
   5548   1.1.1.2    mrg       {
   5549   1.1.1.2    mrg       case 1: return "%1 %2";
   5550   1.1.1.2    mrg       case 2: return "%1 .+2\;rjmp %2";
   5551   1.1.1.2    mrg       case 3: return "%1 .+4\;jmp %2";
   5552   1.1.1.2    mrg       }
   5553   1.1.1.2    mrg 
   5554   1.1.1.2    mrg     gcc_unreachable();
   5555   1.1.1.2    mrg     return "";
   5556   1.1.1.2    mrg   })
   5557   1.1.1.2    mrg 
   5558   1.1.1.2    mrg ;; Same as above but with clobber flavour of addhi3
   5559   1.1.1.2    mrg (define_peephole ; "*dec-and-branchhi!=-1.d.clobber"
   5560   1.1.1.2    mrg   [(parallel [(set (match_operand:HI 0 "d_register_operand" "")
   5561   1.1.1.2    mrg                    (plus:HI (match_dup 0)
   5562   1.1.1.2    mrg                             (const_int -1)))
   5563   1.1.1.2    mrg               (clobber (scratch:QI))])
   5564   1.1.1.2    mrg    (parallel [(set (cc0)
   5565   1.1.1.2    mrg                    (compare (match_dup 0)
   5566   1.1.1.2    mrg                             (const_int -1)))
   5567   1.1.1.2    mrg               (clobber (match_operand:QI 1 "d_register_operand" ""))])
   5568   1.1.1.2    mrg    (set (pc)
   5569   1.1.1.2    mrg         (if_then_else (eqne (cc0)
   5570   1.1.1.2    mrg                             (const_int 0))
   5571   1.1.1.2    mrg                       (label_ref (match_operand 2 "" ""))
   5572   1.1.1.2    mrg                       (pc)))]
   5573   1.1.1.2    mrg   ""
   5574   1.1.1.2    mrg   {
   5575   1.1.1.2    mrg     const char *op;
   5576   1.1.1.2    mrg     int jump_mode;
   5577   1.1.1.2    mrg     CC_STATUS_INIT;
   5578   1.1.1.2    mrg     if (test_hard_reg_class (ADDW_REGS, operands[0]))
   5579   1.1.1.2    mrg       output_asm_insn ("sbiw %0,1", operands);
   5580   1.1.1.2    mrg     else
   5581   1.1.1.2    mrg       output_asm_insn ("subi %A0,1" CR_TAB
   5582   1.1.1.2    mrg                        "sbc %B0,__zero_reg__", operands);
   5583   1.1.1.2    mrg 
   5584   1.1.1.2    mrg     jump_mode = avr_jump_mode (operands[2], insn);
   5585   1.1.1.2    mrg     op = ((EQ == <CODE>) ^ (jump_mode == 1)) ? "brcc" : "brcs";
   5586   1.1.1.2    mrg     operands[1] = gen_rtx_CONST_STRING (VOIDmode, op);
   5587   1.1.1.2    mrg 
   5588   1.1.1.2    mrg     switch (jump_mode)
   5589   1.1.1.2    mrg       {
   5590   1.1.1.2    mrg       case 1: return "%1 %2";
   5591   1.1.1.2    mrg       case 2: return "%1 .+2\;rjmp %2";
   5592   1.1.1.2    mrg       case 3: return "%1 .+4\;jmp %2";
   5593   1.1.1.2    mrg       }
   5594   1.1.1.2    mrg 
   5595   1.1.1.2    mrg     gcc_unreachable();
   5596   1.1.1.2    mrg     return "";
   5597   1.1.1.2    mrg   })
   5598   1.1.1.2    mrg 
   5599   1.1.1.2    mrg ;; Same as above but with clobber flavour of addhi3
   5600   1.1.1.2    mrg (define_peephole ; "*dec-and-branchhi!=-1.l.clobber"
   5601   1.1.1.2    mrg   [(parallel [(set (match_operand:HI 0 "l_register_operand" "")
   5602   1.1.1.2    mrg                    (plus:HI (match_dup 0)
   5603   1.1.1.2    mrg                             (const_int -1)))
   5604   1.1.1.2    mrg               (clobber (match_operand:QI 3 "d_register_operand" ""))])
   5605   1.1.1.2    mrg    (parallel [(set (cc0)
   5606   1.1.1.2    mrg                    (compare (match_dup 0)
   5607   1.1.1.2    mrg                             (const_int -1)))
   5608   1.1.1.2    mrg               (clobber (match_operand:QI 1 "d_register_operand" ""))])
   5609   1.1.1.2    mrg    (set (pc)
   5610   1.1.1.2    mrg         (if_then_else (eqne (cc0)
   5611   1.1.1.2    mrg                             (const_int 0))
   5612   1.1.1.2    mrg                       (label_ref (match_operand 2 "" ""))
   5613   1.1.1.2    mrg                       (pc)))]
   5614   1.1.1.2    mrg   ""
   5615   1.1.1.2    mrg   {
   5616   1.1.1.2    mrg     const char *op;
   5617   1.1.1.2    mrg     int jump_mode;
   5618   1.1.1.2    mrg     CC_STATUS_INIT;
   5619   1.1.1.2    mrg     output_asm_insn ("ldi %3,1"   CR_TAB
   5620   1.1.1.2    mrg                      "sub %A0,%3" CR_TAB
   5621   1.1.1.2    mrg                      "sbc %B0,__zero_reg__", operands);
   5622   1.1.1.2    mrg 
   5623   1.1.1.2    mrg     jump_mode = avr_jump_mode (operands[2], insn);
   5624   1.1.1.2    mrg     op = ((EQ == <CODE>) ^ (jump_mode == 1)) ? "brcc" : "brcs";
   5625   1.1.1.2    mrg     operands[1] = gen_rtx_CONST_STRING (VOIDmode, op);
   5626   1.1.1.2    mrg 
   5627   1.1.1.2    mrg     switch (jump_mode)
   5628   1.1.1.2    mrg       {
   5629   1.1.1.2    mrg       case 1: return "%1 %2";
   5630   1.1.1.2    mrg       case 2: return "%1 .+2\;rjmp %2";
   5631   1.1.1.2    mrg       case 3: return "%1 .+4\;jmp %2";
   5632   1.1.1.2    mrg       }
   5633   1.1.1.2    mrg 
   5634   1.1.1.2    mrg     gcc_unreachable();
   5635   1.1.1.2    mrg     return "";
   5636   1.1.1.2    mrg   })
   5637   1.1.1.2    mrg 
   5638   1.1.1.2    mrg (define_peephole ; "*dec-and-branchqi!=-1"
   5639   1.1.1.2    mrg   [(set (match_operand:QI 0 "d_register_operand" "")
   5640   1.1.1.2    mrg         (plus:QI (match_dup 0)
   5641   1.1.1.2    mrg                  (const_int -1)))
   5642   1.1.1.2    mrg    (set (cc0)
   5643   1.1.1.2    mrg         (compare (match_dup 0)
   5644   1.1.1.2    mrg                  (const_int -1)))
   5645   1.1.1.2    mrg    (set (pc)
   5646   1.1.1.2    mrg         (if_then_else (eqne (cc0)
   5647   1.1.1.2    mrg                             (const_int 0))
   5648   1.1.1.2    mrg                       (label_ref (match_operand 1 "" ""))
   5649   1.1.1.2    mrg                       (pc)))]
   5650       1.1    mrg   ""
   5651   1.1.1.2    mrg   {
   5652   1.1.1.2    mrg     const char *op;
   5653   1.1.1.2    mrg     int jump_mode;
   5654   1.1.1.2    mrg     CC_STATUS_INIT;
   5655   1.1.1.2    mrg     cc_status.value1 = operands[0];
   5656   1.1.1.2    mrg     cc_status.flags |= CC_OVERFLOW_UNUSABLE;
   5657   1.1.1.2    mrg 
   5658   1.1.1.2    mrg     output_asm_insn ("subi %A0,1", operands);
   5659   1.1.1.2    mrg 
   5660   1.1.1.2    mrg     jump_mode = avr_jump_mode (operands[1], insn);
   5661   1.1.1.2    mrg     op = ((EQ == <CODE>) ^ (jump_mode == 1)) ? "brcc" : "brcs";
   5662   1.1.1.2    mrg     operands[0] = gen_rtx_CONST_STRING (VOIDmode, op);
   5663   1.1.1.2    mrg 
   5664   1.1.1.2    mrg     switch (jump_mode)
   5665   1.1.1.2    mrg       {
   5666   1.1.1.2    mrg       case 1: return "%0 %1";
   5667   1.1.1.2    mrg       case 2: return "%0 .+2\;rjmp %1";
   5668   1.1.1.2    mrg       case 3: return "%0 .+4\;jmp %1";
   5669   1.1.1.2    mrg       }
   5670   1.1.1.2    mrg 
   5671   1.1.1.2    mrg     gcc_unreachable();
   5672   1.1.1.2    mrg     return "";
   5673   1.1.1.2    mrg   })
   5674   1.1.1.2    mrg 
   5675   1.1.1.2    mrg 
   5676   1.1.1.2    mrg (define_peephole ; "*cpse.eq"
   5677   1.1.1.2    mrg   [(set (cc0)
   5678   1.1.1.2    mrg         (compare (match_operand:ALL1 1 "register_operand" "r,r")
   5679   1.1.1.2    mrg                  (match_operand:ALL1 2 "reg_or_0_operand" "r,Y00")))
   5680   1.1.1.2    mrg    (set (pc)
   5681   1.1.1.2    mrg         (if_then_else (eq (cc0)
   5682   1.1.1.2    mrg                           (const_int 0))
   5683   1.1.1.2    mrg                       (label_ref (match_operand 0 "" ""))
   5684   1.1.1.2    mrg                       (pc)))]
   5685   1.1.1.2    mrg   "jump_over_one_insn_p (insn, operands[0])"
   5686       1.1    mrg   "@
   5687   1.1.1.2    mrg 	cpse %1,%2
   5688   1.1.1.2    mrg 	cpse %1,__zero_reg__")
   5689       1.1    mrg 
   5690   1.1.1.2    mrg ;; This peephole avoids code like
   5691   1.1.1.2    mrg ;;
   5692   1.1.1.9    mrg ;;     TST   Rn     ; cmpqi3
   5693   1.1.1.2    mrg ;;     BREQ  .+2    ; branch
   5694   1.1.1.2    mrg ;;     RJMP  .Lm
   5695   1.1.1.2    mrg ;;
   5696   1.1.1.2    mrg ;; Notice that the peephole is always shorter than cmpqi + branch.
   5697   1.1.1.2    mrg ;; The reason to write it as peephole is that sequences like
   5698   1.1.1.2    mrg ;;
   5699   1.1.1.2    mrg ;;     AND   Rm, Rn
   5700   1.1.1.2    mrg ;;     BRNE  .La
   5701   1.1.1.2    mrg ;;
   5702   1.1.1.2    mrg ;; shall not be superseeded.  With a respective combine pattern
   5703   1.1.1.2    mrg ;; the latter sequence would be
   5704   1.1.1.2    mrg ;;
   5705   1.1.1.2    mrg ;;     AND   Rm, Rn
   5706   1.1.1.2    mrg ;;     CPSE  Rm, __zero_reg__
   5707   1.1.1.2    mrg ;;     RJMP  .La
   5708   1.1.1.2    mrg ;;
   5709   1.1.1.2    mrg ;; and thus longer and slower and not easy to be rolled back.
   5710       1.1    mrg 
   5711   1.1.1.2    mrg (define_peephole ; "*cpse.ne"
   5712   1.1.1.2    mrg   [(set (cc0)
   5713   1.1.1.2    mrg         (compare (match_operand:ALL1 1 "register_operand" "")
   5714   1.1.1.2    mrg                  (match_operand:ALL1 2 "reg_or_0_operand" "")))
   5715   1.1.1.2    mrg    (set (pc)
   5716   1.1.1.2    mrg         (if_then_else (ne (cc0)
   5717   1.1.1.2    mrg                           (const_int 0))
   5718   1.1.1.2    mrg                       (label_ref (match_operand 0 "" ""))
   5719   1.1.1.2    mrg                       (pc)))]
   5720   1.1.1.2    mrg   "!AVR_HAVE_JMP_CALL
   5721   1.1.1.6    mrg    || !TARGET_SKIP_BUG"
   5722   1.1.1.2    mrg   {
   5723   1.1.1.2    mrg     if (operands[2] == CONST0_RTX (<MODE>mode))
   5724   1.1.1.2    mrg       operands[2] = zero_reg_rtx;
   5725   1.1.1.2    mrg 
   5726   1.1.1.2    mrg     return 3 == avr_jump_mode (operands[0], insn)
   5727   1.1.1.2    mrg       ? "cpse %1,%2\;jmp %0"
   5728   1.1.1.2    mrg       : "cpse %1,%2\;rjmp %0";
   5729   1.1.1.2    mrg   })
   5730   1.1.1.2    mrg 
   5731   1.1.1.2    mrg ;;pppppppppppppppppppppppppppppppppppppppppppppppppppp
   5732   1.1.1.2    mrg ;;prologue/epilogue support instructions
   5733   1.1.1.2    mrg 
   5734   1.1.1.2    mrg (define_insn "popqi"
   5735   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand" "=r")
   5736   1.1.1.2    mrg         (mem:QI (pre_inc:HI (reg:HI REG_SP))))]
   5737       1.1    mrg   ""
   5738   1.1.1.2    mrg   "pop %0"
   5739   1.1.1.2    mrg   [(set_attr "cc" "none")
   5740   1.1.1.2    mrg    (set_attr "length" "1")])
   5741       1.1    mrg 
   5742   1.1.1.2    mrg ;; Enable Interrupts
   5743   1.1.1.2    mrg (define_expand "enable_interrupt"
   5744   1.1.1.2    mrg   [(clobber (const_int 0))]
   5745       1.1    mrg   ""
   5746   1.1.1.2    mrg   {
   5747   1.1.1.2    mrg     rtx mem = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
   5748   1.1.1.2    mrg     MEM_VOLATILE_P (mem) = 1;
   5749   1.1.1.2    mrg     emit_insn (gen_cli_sei (const1_rtx, mem));
   5750   1.1.1.2    mrg     DONE;
   5751   1.1.1.2    mrg   })
   5752       1.1    mrg 
   5753   1.1.1.2    mrg ;; Disable Interrupts
   5754   1.1.1.2    mrg (define_expand "disable_interrupt"
   5755   1.1.1.2    mrg   [(clobber (const_int 0))]
   5756       1.1    mrg   ""
   5757   1.1.1.2    mrg   {
   5758   1.1.1.2    mrg     rtx mem = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
   5759   1.1.1.2    mrg     MEM_VOLATILE_P (mem) = 1;
   5760   1.1.1.2    mrg     emit_insn (gen_cli_sei (const0_rtx, mem));
   5761   1.1.1.2    mrg     DONE;
   5762   1.1.1.2    mrg   })
   5763       1.1    mrg 
   5764   1.1.1.2    mrg (define_insn "cli_sei"
   5765   1.1.1.2    mrg   [(unspec_volatile [(match_operand:QI 0 "const_int_operand" "L,P")]
   5766   1.1.1.2    mrg                     UNSPECV_ENABLE_IRQS)
   5767   1.1.1.2    mrg    (set (match_operand:BLK 1 "" "")
   5768   1.1.1.2    mrg 	(unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER))]
   5769       1.1    mrg   ""
   5770   1.1.1.2    mrg   "@
   5771   1.1.1.2    mrg 	cli
   5772   1.1.1.2    mrg 	sei"
   5773   1.1.1.2    mrg   [(set_attr "length" "1")
   5774   1.1.1.2    mrg    (set_attr "cc" "none")])
   5775       1.1    mrg 
   5776   1.1.1.2    mrg ;;  Library prologue saves
   5777   1.1.1.2    mrg (define_insn "call_prologue_saves"
   5778   1.1.1.2    mrg   [(unspec_volatile:HI [(const_int 0)] UNSPECV_PROLOGUE_SAVES)
   5779   1.1.1.2    mrg    (match_operand:HI 0 "immediate_operand" "i,i")
   5780   1.1.1.2    mrg    (set (reg:HI REG_SP)
   5781   1.1.1.2    mrg         (minus:HI (reg:HI REG_SP)
   5782   1.1.1.2    mrg                   (match_operand:HI 1 "immediate_operand" "i,i")))
   5783   1.1.1.2    mrg    (use (reg:HI REG_X))
   5784   1.1.1.2    mrg    (clobber (reg:HI REG_Z))]
   5785       1.1    mrg   ""
   5786   1.1.1.2    mrg   "ldi r30,lo8(gs(1f))
   5787   1.1.1.2    mrg 	ldi r31,hi8(gs(1f))
   5788   1.1.1.2    mrg 	%~jmp __prologue_saves__+((18 - %0) * 2)
   5789   1.1.1.2    mrg 1:"
   5790   1.1.1.2    mrg   [(set_attr "length" "5,6")
   5791   1.1.1.2    mrg    (set_attr "cc" "clobber")
   5792   1.1.1.2    mrg    (set_attr "isa" "rjmp,jmp")])
   5793       1.1    mrg 
   5794   1.1.1.2    mrg ;  epilogue  restores using library
   5795   1.1.1.2    mrg (define_insn "epilogue_restores"
   5796   1.1.1.2    mrg   [(unspec_volatile:QI [(const_int 0)] UNSPECV_EPILOGUE_RESTORES)
   5797   1.1.1.2    mrg    (set (reg:HI REG_Y)
   5798   1.1.1.2    mrg         (plus:HI (reg:HI REG_Y)
   5799   1.1.1.2    mrg                  (match_operand:HI 0 "immediate_operand" "i,i")))
   5800   1.1.1.2    mrg    (set (reg:HI REG_SP)
   5801   1.1.1.2    mrg         (plus:HI (reg:HI REG_Y)
   5802   1.1.1.2    mrg                  (match_dup 0)))
   5803   1.1.1.2    mrg    (clobber (reg:QI REG_Z))]
   5804       1.1    mrg   ""
   5805   1.1.1.2    mrg   "ldi r30, lo8(%0)
   5806   1.1.1.2    mrg 	%~jmp __epilogue_restores__ + ((18 - %0) * 2)"
   5807   1.1.1.2    mrg   [(set_attr "length" "2,3")
   5808   1.1.1.2    mrg    (set_attr "cc" "clobber")
   5809   1.1.1.2    mrg    (set_attr "isa" "rjmp,jmp")])
   5810   1.1.1.2    mrg 
   5811  1.1.1.12    mrg 
   5812  1.1.1.12    mrg ;; $0 = Chunk: 1 = Prologue,  2 = Epilogue
   5813  1.1.1.12    mrg ;; $1 = Register as printed by chunk 0 (Done) in final postscan.
   5814  1.1.1.12    mrg (define_expand "gasisr"
   5815  1.1.1.12    mrg   [(parallel [(unspec_volatile [(match_operand:QI 0 "const_int_operand")
   5816  1.1.1.12    mrg                                 (match_operand:QI 1 "const_int_operand")]
   5817  1.1.1.12    mrg                                UNSPECV_GASISR)
   5818  1.1.1.12    mrg               (set (reg:HI REG_SP)
   5819  1.1.1.12    mrg                    (unspec_volatile:HI [(reg:HI REG_SP)] UNSPECV_GASISR))
   5820  1.1.1.12    mrg               (set (match_dup 2)
   5821  1.1.1.12    mrg                    (unspec_volatile:BLK [(match_dup 2)]
   5822  1.1.1.12    mrg                                         UNSPECV_MEMORY_BARRIER))])]
   5823  1.1.1.12    mrg   "avr_gasisr_prologues"
   5824  1.1.1.12    mrg   {
   5825  1.1.1.12    mrg     operands[2] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
   5826  1.1.1.12    mrg     MEM_VOLATILE_P (operands[2]) = 1;
   5827  1.1.1.12    mrg   })
   5828  1.1.1.12    mrg 
   5829  1.1.1.12    mrg (define_insn "*gasisr"
   5830  1.1.1.12    mrg   [(unspec_volatile [(match_operand:QI 0 "const_int_operand" "P,K")
   5831  1.1.1.12    mrg                      (match_operand:QI 1 "const_int_operand" "n,n")]
   5832  1.1.1.12    mrg                     UNSPECV_GASISR)
   5833  1.1.1.12    mrg    (set (reg:HI REG_SP)
   5834  1.1.1.12    mrg         (unspec_volatile:HI [(reg:HI REG_SP)] UNSPECV_GASISR))
   5835  1.1.1.12    mrg    (set (match_operand:BLK 2)
   5836  1.1.1.12    mrg         (unspec_volatile:BLK [(match_dup 2)] UNSPECV_MEMORY_BARRIER))]
   5837  1.1.1.12    mrg   "avr_gasisr_prologues"
   5838  1.1.1.12    mrg   "__gcc_isr %0"
   5839  1.1.1.12    mrg   [(set_attr "length" "6,5")
   5840  1.1.1.12    mrg    (set_attr "cc" "clobber")])
   5841  1.1.1.12    mrg 
   5842  1.1.1.12    mrg 
   5843   1.1.1.2    mrg ; return
   5844   1.1.1.2    mrg (define_insn "return"
   5845   1.1.1.2    mrg   [(return)]
   5846   1.1.1.2    mrg   "reload_completed && avr_simple_epilogue ()"
   5847   1.1.1.2    mrg   "ret"
   5848   1.1.1.2    mrg   [(set_attr "cc" "none")
   5849   1.1.1.2    mrg    (set_attr "length" "1")])
   5850       1.1    mrg 
   5851   1.1.1.2    mrg (define_insn "return_from_epilogue"
   5852   1.1.1.2    mrg   [(return)]
   5853   1.1.1.2    mrg   "reload_completed
   5854   1.1.1.2    mrg    && cfun->machine
   5855   1.1.1.2    mrg    && !(cfun->machine->is_interrupt || cfun->machine->is_signal)
   5856   1.1.1.2    mrg    && !cfun->machine->is_naked"
   5857   1.1.1.2    mrg   "ret"
   5858   1.1.1.2    mrg   [(set_attr "cc" "none")
   5859   1.1.1.2    mrg    (set_attr "length" "1")])
   5860       1.1    mrg 
   5861   1.1.1.2    mrg (define_insn "return_from_interrupt_epilogue"
   5862   1.1.1.2    mrg   [(return)]
   5863   1.1.1.2    mrg   "reload_completed
   5864   1.1.1.2    mrg    && cfun->machine
   5865   1.1.1.2    mrg    && (cfun->machine->is_interrupt || cfun->machine->is_signal)
   5866   1.1.1.2    mrg    && !cfun->machine->is_naked"
   5867   1.1.1.2    mrg   "reti"
   5868   1.1.1.2    mrg   [(set_attr "cc" "none")
   5869       1.1    mrg    (set_attr "length" "1")])
   5870       1.1    mrg 
   5871   1.1.1.2    mrg (define_insn "return_from_naked_epilogue"
   5872   1.1.1.2    mrg   [(return)]
   5873   1.1.1.2    mrg   "reload_completed
   5874   1.1.1.2    mrg    && cfun->machine
   5875   1.1.1.2    mrg    && cfun->machine->is_naked"
   5876       1.1    mrg   ""
   5877   1.1.1.2    mrg   [(set_attr "cc" "none")
   5878   1.1.1.2    mrg    (set_attr "length" "0")])
   5879       1.1    mrg 
   5880   1.1.1.2    mrg (define_expand "prologue"
   5881   1.1.1.2    mrg   [(const_int 0)]
   5882       1.1    mrg   ""
   5883   1.1.1.2    mrg   {
   5884   1.1.1.2    mrg     avr_expand_prologue ();
   5885   1.1.1.2    mrg     DONE;
   5886   1.1.1.2    mrg   })
   5887       1.1    mrg 
   5888   1.1.1.2    mrg (define_expand "epilogue"
   5889   1.1.1.2    mrg   [(const_int 0)]
   5890   1.1.1.2    mrg   ""
   5891   1.1.1.2    mrg   {
   5892   1.1.1.2    mrg     avr_expand_epilogue (false /* sibcall_p */);
   5893   1.1.1.2    mrg     DONE;
   5894   1.1.1.2    mrg   })
   5895       1.1    mrg 
   5896   1.1.1.2    mrg (define_expand "sibcall_epilogue"
   5897   1.1.1.2    mrg   [(const_int 0)]
   5898       1.1    mrg   ""
   5899   1.1.1.2    mrg   {
   5900   1.1.1.2    mrg     avr_expand_epilogue (true /* sibcall_p */);
   5901   1.1.1.2    mrg     DONE;
   5902   1.1.1.2    mrg   })
   5903       1.1    mrg 
   5904   1.1.1.2    mrg ;; Some instructions resp. instruction sequences available
   5905   1.1.1.2    mrg ;; via builtins.
   5906       1.1    mrg 
   5907   1.1.1.2    mrg (define_insn "delay_cycles_1"
   5908   1.1.1.2    mrg   [(unspec_volatile [(match_operand:QI 0 "const_int_operand" "n")
   5909   1.1.1.2    mrg                      (const_int 1)]
   5910   1.1.1.2    mrg                     UNSPECV_DELAY_CYCLES)
   5911   1.1.1.2    mrg    (set (match_operand:BLK 1 "" "")
   5912   1.1.1.2    mrg 	(unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER))
   5913   1.1.1.2    mrg    (clobber (match_scratch:QI 2 "=&d"))]
   5914   1.1.1.2    mrg   ""
   5915   1.1.1.2    mrg   "ldi %2,lo8(%0)
   5916   1.1.1.6    mrg 1:	dec %2
   5917   1.1.1.2    mrg 	brne 1b"
   5918   1.1.1.2    mrg   [(set_attr "length" "3")
   5919   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   5920       1.1    mrg 
   5921   1.1.1.2    mrg (define_insn "delay_cycles_2"
   5922   1.1.1.6    mrg   [(unspec_volatile [(match_operand:HI 0 "const_int_operand" "n,n")
   5923   1.1.1.2    mrg                      (const_int 2)]
   5924   1.1.1.2    mrg                     UNSPECV_DELAY_CYCLES)
   5925   1.1.1.2    mrg    (set (match_operand:BLK 1 "" "")
   5926   1.1.1.2    mrg 	(unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER))
   5927   1.1.1.6    mrg    (clobber (match_scratch:HI 2 "=&w,&d"))]
   5928   1.1.1.2    mrg   ""
   5929   1.1.1.6    mrg   "@
   5930   1.1.1.6    mrg 	ldi %A2,lo8(%0)\;ldi %B2,hi8(%0)\n1:	sbiw %A2,1\;brne 1b
   5931   1.1.1.6    mrg 	ldi %A2,lo8(%0)\;ldi %B2,hi8(%0)\n1:	subi %A2,1\;sbci %B2,0\;brne 1b"
   5932   1.1.1.6    mrg   [(set_attr "length" "4,5")
   5933   1.1.1.6    mrg    (set_attr "isa" "no_tiny,tiny")
   5934   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   5935       1.1    mrg 
   5936   1.1.1.2    mrg (define_insn "delay_cycles_3"
   5937   1.1.1.2    mrg   [(unspec_volatile [(match_operand:SI 0 "const_int_operand" "n")
   5938   1.1.1.2    mrg                      (const_int 3)]
   5939   1.1.1.2    mrg                     UNSPECV_DELAY_CYCLES)
   5940   1.1.1.2    mrg    (set (match_operand:BLK 1 "" "")
   5941   1.1.1.2    mrg 	(unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER))
   5942   1.1.1.2    mrg    (clobber (match_scratch:QI 2 "=&d"))
   5943   1.1.1.2    mrg    (clobber (match_scratch:QI 3 "=&d"))
   5944   1.1.1.2    mrg    (clobber (match_scratch:QI 4 "=&d"))]
   5945   1.1.1.2    mrg   ""
   5946   1.1.1.2    mrg   "ldi %2,lo8(%0)
   5947   1.1.1.2    mrg 	ldi %3,hi8(%0)
   5948   1.1.1.2    mrg 	ldi %4,hlo8(%0)
   5949   1.1.1.6    mrg 1:	subi %2,1
   5950   1.1.1.2    mrg 	sbci %3,0
   5951   1.1.1.2    mrg 	sbci %4,0
   5952   1.1.1.2    mrg 	brne 1b"
   5953   1.1.1.2    mrg   [(set_attr "length" "7")
   5954   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   5955       1.1    mrg 
   5956   1.1.1.2    mrg (define_insn "delay_cycles_4"
   5957   1.1.1.2    mrg   [(unspec_volatile [(match_operand:SI 0 "const_int_operand" "n")
   5958   1.1.1.2    mrg                      (const_int 4)]
   5959   1.1.1.2    mrg                     UNSPECV_DELAY_CYCLES)
   5960   1.1.1.2    mrg    (set (match_operand:BLK 1 "" "")
   5961   1.1.1.2    mrg 	(unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER))
   5962   1.1.1.2    mrg    (clobber (match_scratch:QI 2 "=&d"))
   5963   1.1.1.2    mrg    (clobber (match_scratch:QI 3 "=&d"))
   5964   1.1.1.2    mrg    (clobber (match_scratch:QI 4 "=&d"))
   5965   1.1.1.2    mrg    (clobber (match_scratch:QI 5 "=&d"))]
   5966   1.1.1.2    mrg   ""
   5967   1.1.1.2    mrg   "ldi %2,lo8(%0)
   5968   1.1.1.2    mrg 	ldi %3,hi8(%0)
   5969   1.1.1.2    mrg 	ldi %4,hlo8(%0)
   5970   1.1.1.2    mrg 	ldi %5,hhi8(%0)
   5971   1.1.1.6    mrg 1:	subi %2,1
   5972   1.1.1.2    mrg 	sbci %3,0
   5973   1.1.1.2    mrg 	sbci %4,0
   5974   1.1.1.2    mrg 	sbci %5,0
   5975   1.1.1.2    mrg 	brne 1b"
   5976   1.1.1.2    mrg   [(set_attr "length" "9")
   5977   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   5978       1.1    mrg 
   5979       1.1    mrg 
   5980   1.1.1.2    mrg ;; __builtin_avr_insert_bits
   5981       1.1    mrg 
   5982   1.1.1.2    mrg (define_insn "insert_bits"
   5983   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand"              "=r  ,d  ,r")
   5984   1.1.1.2    mrg         (unspec:QI [(match_operand:SI 1 "const_int_operand"  "C0f,Cxf,C0f")
   5985   1.1.1.2    mrg                     (match_operand:QI 2 "register_operand"   "r  ,r  ,r")
   5986   1.1.1.2    mrg                     (match_operand:QI 3 "nonmemory_operand"  "n  ,0  ,0")]
   5987   1.1.1.2    mrg                    UNSPEC_INSERT_BITS))]
   5988   1.1.1.2    mrg   ""
   5989   1.1.1.2    mrg   {
   5990   1.1.1.2    mrg     return avr_out_insert_bits (operands, NULL);
   5991   1.1.1.2    mrg   }
   5992   1.1.1.2    mrg   [(set_attr "adjust_len" "insert_bits")
   5993   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   5994       1.1    mrg 
   5995       1.1    mrg 
   5996   1.1.1.2    mrg ;; __builtin_avr_flash_segment
   5997       1.1    mrg 
   5998   1.1.1.2    mrg ;; Just a helper for the next "official" expander.
   5999   1.1.1.2    mrg 
   6000   1.1.1.2    mrg (define_expand "flash_segment1"
   6001   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand" "")
   6002   1.1.1.2    mrg         (subreg:QI (match_operand:PSI 1 "register_operand" "")
   6003   1.1.1.2    mrg                    2))
   6004   1.1.1.2    mrg    (set (cc0)
   6005   1.1.1.2    mrg         (compare (match_dup 0)
   6006   1.1.1.2    mrg                  (const_int 0)))
   6007       1.1    mrg    (set (pc)
   6008   1.1.1.2    mrg         (if_then_else (ge (cc0)
   6009   1.1.1.2    mrg                           (const_int 0))
   6010   1.1.1.2    mrg                       (label_ref (match_operand 2 "" ""))
   6011   1.1.1.2    mrg                       (pc)))
   6012   1.1.1.2    mrg    (set (match_dup 0)
   6013   1.1.1.2    mrg         (const_int -1))])
   6014   1.1.1.2    mrg 
   6015   1.1.1.2    mrg (define_expand "flash_segment"
   6016   1.1.1.2    mrg   [(parallel [(match_operand:QI 0 "register_operand" "")
   6017   1.1.1.2    mrg               (match_operand:PSI 1 "register_operand" "")])]
   6018   1.1.1.2    mrg   ""
   6019   1.1.1.2    mrg   {
   6020   1.1.1.2    mrg     rtx label = gen_label_rtx ();
   6021   1.1.1.2    mrg     emit (gen_flash_segment1 (operands[0], operands[1], label));
   6022   1.1.1.2    mrg     emit_label (label);
   6023   1.1.1.2    mrg     DONE;
   6024   1.1.1.2    mrg   })
   6025       1.1    mrg 
   6026   1.1.1.2    mrg ;; Actually, it's too late now to work out address spaces known at compiletime.
   6027   1.1.1.2    mrg ;; Best place would be to fold ADDR_SPACE_CONVERT_EXPR in avr_fold_builtin.
   6028   1.1.1.2    mrg ;; However, avr_addr_space_convert can add some built-in knowledge for PSTR
   6029   1.1.1.2    mrg ;; so that ADDR_SPACE_CONVERT_EXPR in the built-in must not be resolved.
   6030   1.1.1.2    mrg 
   6031   1.1.1.2    mrg (define_insn_and_split "*split.flash_segment"
   6032   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand"                        "=d")
   6033   1.1.1.2    mrg         (subreg:QI (lo_sum:PSI (match_operand:QI 1 "nonmemory_operand" "ri")
   6034   1.1.1.2    mrg                                (match_operand:HI 2 "register_operand"  "r"))
   6035   1.1.1.2    mrg                    2))]
   6036   1.1.1.2    mrg   ""
   6037   1.1.1.2    mrg   { gcc_unreachable(); }
   6038   1.1.1.2    mrg   ""
   6039   1.1.1.2    mrg   [(set (match_dup 0)
   6040   1.1.1.2    mrg         (match_dup 1))])
   6041   1.1.1.2    mrg 
   6042   1.1.1.2    mrg 
   6043   1.1.1.2    mrg ;; Parity
   6044   1.1.1.2    mrg 
   6045   1.1.1.2    mrg ;; Postpone expansion of 16-bit parity to libgcc call until after combine for
   6046   1.1.1.2    mrg ;; better 8-bit parity recognition.
   6047   1.1.1.2    mrg 
   6048   1.1.1.2    mrg (define_expand "parityhi2"
   6049   1.1.1.2    mrg   [(parallel [(set (match_operand:HI 0 "register_operand" "")
   6050   1.1.1.2    mrg                    (parity:HI (match_operand:HI 1 "register_operand" "")))
   6051   1.1.1.2    mrg               (clobber (reg:HI 24))])])
   6052   1.1.1.2    mrg 
   6053   1.1.1.2    mrg (define_insn_and_split "*parityhi2"
   6054   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"           "=r")
   6055   1.1.1.2    mrg         (parity:HI (match_operand:HI 1 "register_operand" "r")))
   6056   1.1.1.2    mrg    (clobber (reg:HI 24))]
   6057   1.1.1.2    mrg   "!reload_completed"
   6058   1.1.1.2    mrg   { gcc_unreachable(); }
   6059   1.1.1.2    mrg   "&& 1"
   6060   1.1.1.2    mrg   [(set (reg:HI 24)
   6061   1.1.1.2    mrg         (match_dup 1))
   6062   1.1.1.2    mrg    (set (reg:HI 24)
   6063   1.1.1.2    mrg         (parity:HI (reg:HI 24)))
   6064   1.1.1.2    mrg    (set (match_dup 0)
   6065   1.1.1.2    mrg         (reg:HI 24))])
   6066       1.1    mrg 
   6067   1.1.1.2    mrg (define_insn_and_split "*parityqihi2"
   6068   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"           "=r")
   6069   1.1.1.2    mrg         (parity:HI (match_operand:QI 1 "register_operand" "r")))
   6070   1.1.1.2    mrg    (clobber (reg:HI 24))]
   6071   1.1.1.2    mrg   "!reload_completed"
   6072   1.1.1.2    mrg   { gcc_unreachable(); }
   6073   1.1.1.2    mrg   "&& 1"
   6074   1.1.1.2    mrg   [(set (reg:QI 24)
   6075   1.1.1.2    mrg         (match_dup 1))
   6076   1.1.1.2    mrg    (set (reg:HI 24)
   6077   1.1.1.2    mrg         (zero_extend:HI (parity:QI (reg:QI 24))))
   6078   1.1.1.2    mrg    (set (match_dup 0)
   6079   1.1.1.2    mrg         (reg:HI 24))])
   6080       1.1    mrg 
   6081   1.1.1.2    mrg (define_expand "paritysi2"
   6082   1.1.1.2    mrg   [(set (reg:SI 22)
   6083   1.1.1.2    mrg         (match_operand:SI 1 "register_operand" ""))
   6084   1.1.1.2    mrg    (set (reg:HI 24)
   6085   1.1.1.2    mrg         (truncate:HI (parity:SI (reg:SI 22))))
   6086   1.1.1.2    mrg    (set (match_dup 2)
   6087   1.1.1.2    mrg         (reg:HI 24))
   6088   1.1.1.2    mrg    (set (match_operand:SI 0 "register_operand" "")
   6089   1.1.1.2    mrg         (zero_extend:SI (match_dup 2)))]
   6090       1.1    mrg   ""
   6091   1.1.1.2    mrg   {
   6092   1.1.1.2    mrg     operands[2] = gen_reg_rtx (HImode);
   6093   1.1.1.2    mrg   })
   6094       1.1    mrg 
   6095   1.1.1.2    mrg (define_insn "*parityhi2.libgcc"
   6096   1.1.1.2    mrg   [(set (reg:HI 24)
   6097   1.1.1.2    mrg         (parity:HI (reg:HI 24)))]
   6098       1.1    mrg   ""
   6099   1.1.1.2    mrg   "%~call __parityhi2"
   6100   1.1.1.2    mrg   [(set_attr "type" "xcall")
   6101       1.1    mrg    (set_attr "cc" "clobber")])
   6102       1.1    mrg 
   6103   1.1.1.2    mrg (define_insn "*parityqihi2.libgcc"
   6104   1.1.1.2    mrg   [(set (reg:HI 24)
   6105   1.1.1.2    mrg         (zero_extend:HI (parity:QI (reg:QI 24))))]
   6106       1.1    mrg   ""
   6107   1.1.1.2    mrg   "%~call __parityqi2"
   6108   1.1.1.2    mrg   [(set_attr "type" "xcall")
   6109   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   6110       1.1    mrg 
   6111   1.1.1.2    mrg (define_insn "*paritysihi2.libgcc"
   6112   1.1.1.2    mrg   [(set (reg:HI 24)
   6113   1.1.1.2    mrg         (truncate:HI (parity:SI (reg:SI 22))))]
   6114       1.1    mrg   ""
   6115   1.1.1.2    mrg   "%~call __paritysi2"
   6116   1.1.1.2    mrg   [(set_attr "type" "xcall")
   6117   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   6118       1.1    mrg 
   6119       1.1    mrg 
   6120   1.1.1.2    mrg ;; Popcount
   6121   1.1.1.2    mrg 
   6122   1.1.1.2    mrg (define_expand "popcounthi2"
   6123   1.1.1.2    mrg   [(set (reg:HI 24)
   6124   1.1.1.2    mrg         (match_operand:HI 1 "register_operand" ""))
   6125   1.1.1.2    mrg    (set (reg:HI 24)
   6126   1.1.1.2    mrg         (popcount:HI (reg:HI 24)))
   6127   1.1.1.2    mrg    (set (match_operand:HI 0 "register_operand" "")
   6128   1.1.1.2    mrg         (reg:HI 24))]
   6129       1.1    mrg   ""
   6130       1.1    mrg   "")
   6131       1.1    mrg 
   6132   1.1.1.2    mrg (define_expand "popcountsi2"
   6133   1.1.1.2    mrg   [(set (reg:SI 22)
   6134   1.1.1.2    mrg         (match_operand:SI 1 "register_operand" ""))
   6135   1.1.1.2    mrg    (set (reg:HI 24)
   6136   1.1.1.2    mrg         (truncate:HI (popcount:SI (reg:SI 22))))
   6137   1.1.1.2    mrg    (set (match_dup 2)
   6138   1.1.1.2    mrg         (reg:HI 24))
   6139   1.1.1.2    mrg    (set (match_operand:SI 0 "register_operand" "")
   6140   1.1.1.2    mrg         (zero_extend:SI (match_dup 2)))]
   6141       1.1    mrg   ""
   6142   1.1.1.2    mrg   {
   6143   1.1.1.2    mrg     operands[2] = gen_reg_rtx (HImode);
   6144   1.1.1.2    mrg   })
   6145       1.1    mrg 
   6146   1.1.1.2    mrg (define_insn "*popcounthi2.libgcc"
   6147   1.1.1.2    mrg   [(set (reg:HI 24)
   6148   1.1.1.2    mrg         (popcount:HI (reg:HI 24)))]
   6149       1.1    mrg   ""
   6150   1.1.1.2    mrg   "%~call __popcounthi2"
   6151   1.1.1.2    mrg   [(set_attr "type" "xcall")
   6152   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   6153       1.1    mrg 
   6154   1.1.1.2    mrg (define_insn "*popcountsi2.libgcc"
   6155   1.1.1.2    mrg   [(set (reg:HI 24)
   6156   1.1.1.2    mrg         (truncate:HI (popcount:SI (reg:SI 22))))]
   6157       1.1    mrg   ""
   6158   1.1.1.2    mrg   "%~call __popcountsi2"
   6159   1.1.1.2    mrg   [(set_attr "type" "xcall")
   6160       1.1    mrg    (set_attr "cc" "clobber")])
   6161       1.1    mrg 
   6162   1.1.1.2    mrg (define_insn "*popcountqi2.libgcc"
   6163   1.1.1.2    mrg   [(set (reg:QI 24)
   6164   1.1.1.2    mrg         (popcount:QI (reg:QI 24)))]
   6165       1.1    mrg   ""
   6166   1.1.1.2    mrg   "%~call __popcountqi2"
   6167   1.1.1.2    mrg   [(set_attr "type" "xcall")
   6168       1.1    mrg    (set_attr "cc" "clobber")])
   6169       1.1    mrg 
   6170   1.1.1.2    mrg (define_insn_and_split "*popcountqihi2.libgcc"
   6171   1.1.1.2    mrg   [(set (reg:HI 24)
   6172   1.1.1.2    mrg         (zero_extend:HI (popcount:QI (reg:QI 24))))]
   6173   1.1.1.2    mrg   ""
   6174   1.1.1.2    mrg   "#"
   6175   1.1.1.2    mrg   ""
   6176   1.1.1.2    mrg   [(set (reg:QI 24)
   6177   1.1.1.2    mrg         (popcount:QI (reg:QI 24)))
   6178   1.1.1.2    mrg    (set (reg:QI 25)
   6179   1.1.1.2    mrg         (const_int 0))])
   6180   1.1.1.2    mrg 
   6181   1.1.1.2    mrg ;; Count Leading Zeros
   6182   1.1.1.2    mrg 
   6183   1.1.1.2    mrg (define_expand "clzhi2"
   6184   1.1.1.2    mrg   [(set (reg:HI 24)
   6185   1.1.1.2    mrg         (match_operand:HI 1 "register_operand" ""))
   6186   1.1.1.2    mrg    (parallel [(set (reg:HI 24)
   6187   1.1.1.2    mrg                    (clz:HI (reg:HI 24)))
   6188   1.1.1.2    mrg               (clobber (reg:QI 26))])
   6189   1.1.1.2    mrg    (set (match_operand:HI 0 "register_operand" "")
   6190   1.1.1.2    mrg         (reg:HI 24))])
   6191       1.1    mrg 
   6192   1.1.1.2    mrg (define_expand "clzsi2"
   6193   1.1.1.2    mrg   [(set (reg:SI 22)
   6194   1.1.1.2    mrg         (match_operand:SI 1 "register_operand" ""))
   6195   1.1.1.2    mrg    (parallel [(set (reg:HI 24)
   6196   1.1.1.2    mrg                    (truncate:HI (clz:SI (reg:SI 22))))
   6197   1.1.1.2    mrg               (clobber (reg:QI 26))])
   6198   1.1.1.2    mrg    (set (match_dup 2)
   6199   1.1.1.2    mrg         (reg:HI 24))
   6200   1.1.1.2    mrg    (set (match_operand:SI 0 "register_operand" "")
   6201   1.1.1.2    mrg         (zero_extend:SI (match_dup 2)))]
   6202       1.1    mrg   ""
   6203   1.1.1.2    mrg   {
   6204   1.1.1.2    mrg     operands[2] = gen_reg_rtx (HImode);
   6205   1.1.1.2    mrg   })
   6206       1.1    mrg 
   6207   1.1.1.2    mrg (define_insn "*clzhi2.libgcc"
   6208   1.1.1.2    mrg   [(set (reg:HI 24)
   6209   1.1.1.2    mrg         (clz:HI (reg:HI 24)))
   6210   1.1.1.2    mrg    (clobber (reg:QI 26))]
   6211       1.1    mrg   ""
   6212   1.1.1.2    mrg   "%~call __clzhi2"
   6213   1.1.1.2    mrg   [(set_attr "type" "xcall")
   6214       1.1    mrg    (set_attr "cc" "clobber")])
   6215       1.1    mrg 
   6216   1.1.1.2    mrg (define_insn "*clzsihi2.libgcc"
   6217   1.1.1.2    mrg   [(set (reg:HI 24)
   6218   1.1.1.2    mrg         (truncate:HI (clz:SI (reg:SI 22))))
   6219   1.1.1.2    mrg    (clobber (reg:QI 26))]
   6220       1.1    mrg   ""
   6221   1.1.1.2    mrg   "%~call __clzsi2"
   6222   1.1.1.2    mrg   [(set_attr "type" "xcall")
   6223   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   6224       1.1    mrg 
   6225   1.1.1.2    mrg ;; Count Trailing Zeros
   6226   1.1.1.2    mrg 
   6227   1.1.1.2    mrg (define_expand "ctzhi2"
   6228   1.1.1.2    mrg   [(set (reg:HI 24)
   6229   1.1.1.2    mrg         (match_operand:HI 1 "register_operand" ""))
   6230   1.1.1.2    mrg    (parallel [(set (reg:HI 24)
   6231   1.1.1.2    mrg                    (ctz:HI (reg:HI 24)))
   6232   1.1.1.2    mrg               (clobber (reg:QI 26))])
   6233   1.1.1.2    mrg    (set (match_operand:HI 0 "register_operand" "")
   6234   1.1.1.2    mrg         (reg:HI 24))])
   6235       1.1    mrg 
   6236   1.1.1.2    mrg (define_expand "ctzsi2"
   6237   1.1.1.2    mrg   [(set (reg:SI 22)
   6238   1.1.1.2    mrg         (match_operand:SI 1 "register_operand" ""))
   6239   1.1.1.2    mrg    (parallel [(set (reg:HI 24)
   6240   1.1.1.2    mrg                    (truncate:HI (ctz:SI (reg:SI 22))))
   6241   1.1.1.2    mrg               (clobber (reg:QI 22))
   6242   1.1.1.2    mrg               (clobber (reg:QI 26))])
   6243   1.1.1.2    mrg    (set (match_dup 2)
   6244   1.1.1.2    mrg         (reg:HI 24))
   6245   1.1.1.2    mrg    (set (match_operand:SI 0 "register_operand" "")
   6246   1.1.1.2    mrg         (zero_extend:SI (match_dup 2)))]
   6247       1.1    mrg   ""
   6248   1.1.1.2    mrg   {
   6249   1.1.1.2    mrg     operands[2] = gen_reg_rtx (HImode);
   6250   1.1.1.2    mrg   })
   6251       1.1    mrg 
   6252   1.1.1.2    mrg (define_insn "*ctzhi2.libgcc"
   6253   1.1.1.2    mrg   [(set (reg:HI 24)
   6254   1.1.1.2    mrg         (ctz:HI (reg:HI 24)))
   6255   1.1.1.2    mrg    (clobber (reg:QI 26))]
   6256   1.1.1.2    mrg   ""
   6257   1.1.1.2    mrg   "%~call __ctzhi2"
   6258   1.1.1.2    mrg   [(set_attr "type" "xcall")
   6259   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   6260       1.1    mrg 
   6261   1.1.1.2    mrg (define_insn "*ctzsihi2.libgcc"
   6262   1.1.1.2    mrg   [(set (reg:HI 24)
   6263   1.1.1.2    mrg         (truncate:HI (ctz:SI (reg:SI 22))))
   6264   1.1.1.2    mrg    (clobber (reg:QI 22))
   6265   1.1.1.2    mrg    (clobber (reg:QI 26))]
   6266       1.1    mrg   ""
   6267   1.1.1.2    mrg   "%~call __ctzsi2"
   6268   1.1.1.2    mrg   [(set_attr "type" "xcall")
   6269   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   6270       1.1    mrg 
   6271   1.1.1.2    mrg ;; Find First Set
   6272       1.1    mrg 
   6273   1.1.1.2    mrg (define_expand "ffshi2"
   6274   1.1.1.2    mrg   [(set (reg:HI 24)
   6275   1.1.1.2    mrg         (match_operand:HI 1 "register_operand" ""))
   6276   1.1.1.2    mrg    (parallel [(set (reg:HI 24)
   6277   1.1.1.2    mrg                    (ffs:HI (reg:HI 24)))
   6278   1.1.1.2    mrg               (clobber (reg:QI 26))])
   6279   1.1.1.2    mrg    (set (match_operand:HI 0 "register_operand" "")
   6280   1.1.1.2    mrg         (reg:HI 24))])
   6281       1.1    mrg 
   6282   1.1.1.2    mrg (define_expand "ffssi2"
   6283   1.1.1.2    mrg   [(set (reg:SI 22)
   6284   1.1.1.2    mrg         (match_operand:SI 1 "register_operand" ""))
   6285   1.1.1.2    mrg    (parallel [(set (reg:HI 24)
   6286   1.1.1.2    mrg                    (truncate:HI (ffs:SI (reg:SI 22))))
   6287   1.1.1.2    mrg               (clobber (reg:QI 22))
   6288   1.1.1.2    mrg               (clobber (reg:QI 26))])
   6289   1.1.1.2    mrg    (set (match_dup 2)
   6290   1.1.1.2    mrg         (reg:HI 24))
   6291   1.1.1.2    mrg    (set (match_operand:SI 0 "register_operand" "")
   6292   1.1.1.2    mrg         (zero_extend:SI (match_dup 2)))]
   6293       1.1    mrg   ""
   6294   1.1.1.2    mrg   {
   6295   1.1.1.2    mrg     operands[2] = gen_reg_rtx (HImode);
   6296   1.1.1.2    mrg   })
   6297       1.1    mrg 
   6298   1.1.1.2    mrg (define_insn "*ffshi2.libgcc"
   6299   1.1.1.2    mrg   [(set (reg:HI 24)
   6300   1.1.1.2    mrg         (ffs:HI (reg:HI 24)))
   6301   1.1.1.2    mrg    (clobber (reg:QI 26))]
   6302   1.1.1.2    mrg   ""
   6303   1.1.1.2    mrg   "%~call __ffshi2"
   6304   1.1.1.2    mrg   [(set_attr "type" "xcall")
   6305   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   6306       1.1    mrg 
   6307   1.1.1.2    mrg (define_insn "*ffssihi2.libgcc"
   6308   1.1.1.2    mrg   [(set (reg:HI 24)
   6309   1.1.1.2    mrg         (truncate:HI (ffs:SI (reg:SI 22))))
   6310   1.1.1.2    mrg    (clobber (reg:QI 22))
   6311   1.1.1.2    mrg    (clobber (reg:QI 26))]
   6312       1.1    mrg   ""
   6313   1.1.1.2    mrg   "%~call __ffssi2"
   6314   1.1.1.2    mrg   [(set_attr "type" "xcall")
   6315   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   6316       1.1    mrg 
   6317   1.1.1.2    mrg ;; Copysign
   6318   1.1.1.2    mrg 
   6319   1.1.1.2    mrg (define_insn "copysignsf3"
   6320   1.1.1.2    mrg   [(set (match_operand:SF 0 "register_operand"             "=r")
   6321   1.1.1.2    mrg         (unspec:SF [(match_operand:SF 1 "register_operand"  "0")
   6322   1.1.1.2    mrg                     (match_operand:SF 2 "register_operand"  "r")]
   6323   1.1.1.2    mrg                    UNSPEC_COPYSIGN))]
   6324       1.1    mrg   ""
   6325   1.1.1.2    mrg   "bst %D2,7\;bld %D0,7"
   6326       1.1    mrg   [(set_attr "length" "2")
   6327       1.1    mrg    (set_attr "cc" "none")])
   6328       1.1    mrg 
   6329   1.1.1.9    mrg ;; Swap Bytes (change byte-endianness)
   6330       1.1    mrg 
   6331   1.1.1.2    mrg (define_expand "bswapsi2"
   6332   1.1.1.2    mrg   [(set (reg:SI 22)
   6333   1.1.1.2    mrg         (match_operand:SI 1 "register_operand" ""))
   6334   1.1.1.2    mrg    (set (reg:SI 22)
   6335   1.1.1.2    mrg         (bswap:SI (reg:SI 22)))
   6336   1.1.1.2    mrg    (set (match_operand:SI 0 "register_operand" "")
   6337   1.1.1.2    mrg         (reg:SI 22))])
   6338       1.1    mrg 
   6339   1.1.1.2    mrg (define_insn "*bswapsi2.libgcc"
   6340   1.1.1.2    mrg   [(set (reg:SI 22)
   6341   1.1.1.2    mrg         (bswap:SI (reg:SI 22)))]
   6342   1.1.1.2    mrg   ""
   6343   1.1.1.2    mrg   "%~call __bswapsi2"
   6344   1.1.1.2    mrg   [(set_attr "type" "xcall")
   6345       1.1    mrg    (set_attr "cc" "clobber")])
   6346       1.1    mrg 
   6347       1.1    mrg 
   6348   1.1.1.2    mrg ;; CPU instructions
   6349       1.1    mrg 
   6350   1.1.1.2    mrg ;; NOP taking 1 or 2 Ticks
   6351   1.1.1.2    mrg (define_expand "nopv"
   6352   1.1.1.2    mrg   [(parallel [(unspec_volatile [(match_operand:SI 0 "const_int_operand" "")]
   6353   1.1.1.2    mrg                                UNSPECV_NOP)
   6354   1.1.1.2    mrg               (set (match_dup 1)
   6355   1.1.1.2    mrg                    (unspec_volatile:BLK [(match_dup 1)]
   6356   1.1.1.2    mrg                                         UNSPECV_MEMORY_BARRIER))])]
   6357       1.1    mrg   ""
   6358   1.1.1.2    mrg   {
   6359   1.1.1.2    mrg     operands[1] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
   6360   1.1.1.2    mrg     MEM_VOLATILE_P (operands[1]) = 1;
   6361   1.1.1.2    mrg   })
   6362       1.1    mrg 
   6363   1.1.1.2    mrg (define_insn "*nopv"
   6364   1.1.1.2    mrg   [(unspec_volatile [(match_operand:SI 0 "const_int_operand" "P,K")]
   6365   1.1.1.2    mrg                     UNSPECV_NOP)
   6366   1.1.1.2    mrg    (set (match_operand:BLK 1 "" "")
   6367   1.1.1.2    mrg 	(unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER))]
   6368       1.1    mrg   ""
   6369   1.1.1.2    mrg   "@
   6370   1.1.1.2    mrg 	nop
   6371   1.1.1.2    mrg 	rjmp ."
   6372       1.1    mrg   [(set_attr "length" "1")
   6373   1.1.1.2    mrg    (set_attr "cc" "none")])
   6374       1.1    mrg 
   6375   1.1.1.2    mrg ;; SLEEP
   6376   1.1.1.2    mrg (define_expand "sleep"
   6377   1.1.1.2    mrg   [(parallel [(unspec_volatile [(const_int 0)] UNSPECV_SLEEP)
   6378   1.1.1.2    mrg               (set (match_dup 0)
   6379   1.1.1.2    mrg                    (unspec_volatile:BLK [(match_dup 0)]
   6380   1.1.1.2    mrg                                         UNSPECV_MEMORY_BARRIER))])]
   6381   1.1.1.2    mrg   ""
   6382   1.1.1.2    mrg   {
   6383   1.1.1.2    mrg     operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
   6384   1.1.1.2    mrg     MEM_VOLATILE_P (operands[0]) = 1;
   6385   1.1.1.2    mrg   })
   6386       1.1    mrg 
   6387   1.1.1.2    mrg (define_insn "*sleep"
   6388   1.1.1.2    mrg   [(unspec_volatile [(const_int 0)] UNSPECV_SLEEP)
   6389   1.1.1.2    mrg    (set (match_operand:BLK 0 "" "")
   6390   1.1.1.2    mrg 	(unspec_volatile:BLK [(match_dup 0)] UNSPECV_MEMORY_BARRIER))]
   6391   1.1.1.2    mrg   ""
   6392   1.1.1.2    mrg   "sleep"
   6393       1.1    mrg   [(set_attr "length" "1")
   6394       1.1    mrg    (set_attr "cc" "none")])
   6395       1.1    mrg 
   6396   1.1.1.2    mrg ;; WDR
   6397   1.1.1.2    mrg (define_expand "wdr"
   6398   1.1.1.2    mrg   [(parallel [(unspec_volatile [(const_int 0)] UNSPECV_WDR)
   6399   1.1.1.2    mrg               (set (match_dup 0)
   6400   1.1.1.2    mrg                    (unspec_volatile:BLK [(match_dup 0)]
   6401   1.1.1.2    mrg                                         UNSPECV_MEMORY_BARRIER))])]
   6402   1.1.1.2    mrg   ""
   6403   1.1.1.2    mrg   {
   6404   1.1.1.2    mrg     operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
   6405   1.1.1.2    mrg     MEM_VOLATILE_P (operands[0]) = 1;
   6406   1.1.1.2    mrg   })
   6407   1.1.1.2    mrg 
   6408   1.1.1.2    mrg (define_insn "*wdr"
   6409   1.1.1.2    mrg   [(unspec_volatile [(const_int 0)] UNSPECV_WDR)
   6410   1.1.1.2    mrg    (set (match_operand:BLK 0 "" "")
   6411   1.1.1.2    mrg 	(unspec_volatile:BLK [(match_dup 0)] UNSPECV_MEMORY_BARRIER))]
   6412   1.1.1.2    mrg   ""
   6413   1.1.1.2    mrg   "wdr"
   6414       1.1    mrg   [(set_attr "length" "1")
   6415       1.1    mrg    (set_attr "cc" "none")])
   6416       1.1    mrg 
   6417   1.1.1.2    mrg ;; FMUL
   6418   1.1.1.2    mrg (define_expand "fmul"
   6419   1.1.1.2    mrg   [(set (reg:QI 24)
   6420   1.1.1.2    mrg         (match_operand:QI 1 "register_operand" ""))
   6421   1.1.1.2    mrg    (set (reg:QI 25)
   6422   1.1.1.2    mrg         (match_operand:QI 2 "register_operand" ""))
   6423   1.1.1.2    mrg    (parallel [(set (reg:HI 22)
   6424   1.1.1.2    mrg                    (unspec:HI [(reg:QI 24)
   6425   1.1.1.2    mrg                                (reg:QI 25)] UNSPEC_FMUL))
   6426   1.1.1.2    mrg               (clobber (reg:HI 24))])
   6427   1.1.1.2    mrg    (set (match_operand:HI 0 "register_operand" "")
   6428   1.1.1.2    mrg         (reg:HI 22))]
   6429   1.1.1.2    mrg   ""
   6430   1.1.1.2    mrg   {
   6431   1.1.1.2    mrg     if (AVR_HAVE_MUL)
   6432   1.1.1.2    mrg       {
   6433   1.1.1.2    mrg         emit_insn (gen_fmul_insn (operand0, operand1, operand2));
   6434   1.1.1.2    mrg         DONE;
   6435   1.1.1.2    mrg       }
   6436   1.1.1.6    mrg     avr_fix_inputs (operands, 1 << 2, regmask (QImode, 24));
   6437   1.1.1.2    mrg   })
   6438       1.1    mrg 
   6439   1.1.1.2    mrg (define_insn "fmul_insn"
   6440   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand" "=r")
   6441   1.1.1.2    mrg         (unspec:HI [(match_operand:QI 1 "register_operand" "a")
   6442   1.1.1.2    mrg                     (match_operand:QI 2 "register_operand" "a")]
   6443   1.1.1.2    mrg                    UNSPEC_FMUL))]
   6444   1.1.1.2    mrg   "AVR_HAVE_MUL"
   6445   1.1.1.2    mrg   "fmul %1,%2
   6446   1.1.1.2    mrg 	movw %0,r0
   6447   1.1.1.2    mrg 	clr __zero_reg__"
   6448   1.1.1.2    mrg   [(set_attr "length" "3")
   6449       1.1    mrg    (set_attr "cc" "clobber")])
   6450       1.1    mrg 
   6451   1.1.1.2    mrg (define_insn "*fmul.call"
   6452   1.1.1.2    mrg   [(set (reg:HI 22)
   6453   1.1.1.2    mrg         (unspec:HI [(reg:QI 24)
   6454   1.1.1.2    mrg                     (reg:QI 25)] UNSPEC_FMUL))
   6455   1.1.1.2    mrg    (clobber (reg:HI 24))]
   6456   1.1.1.2    mrg   "!AVR_HAVE_MUL"
   6457   1.1.1.2    mrg   "%~call __fmul"
   6458   1.1.1.2    mrg   [(set_attr "type" "xcall")
   6459       1.1    mrg    (set_attr "cc" "clobber")])
   6460       1.1    mrg 
   6461   1.1.1.2    mrg ;; FMULS
   6462   1.1.1.2    mrg (define_expand "fmuls"
   6463   1.1.1.2    mrg   [(set (reg:QI 24)
   6464   1.1.1.2    mrg         (match_operand:QI 1 "register_operand" ""))
   6465   1.1.1.2    mrg    (set (reg:QI 25)
   6466   1.1.1.2    mrg         (match_operand:QI 2 "register_operand" ""))
   6467   1.1.1.2    mrg    (parallel [(set (reg:HI 22)
   6468   1.1.1.2    mrg                    (unspec:HI [(reg:QI 24)
   6469   1.1.1.2    mrg                                (reg:QI 25)] UNSPEC_FMULS))
   6470   1.1.1.2    mrg               (clobber (reg:HI 24))])
   6471   1.1.1.2    mrg    (set (match_operand:HI 0 "register_operand" "")
   6472   1.1.1.2    mrg         (reg:HI 22))]
   6473   1.1.1.2    mrg   ""
   6474   1.1.1.2    mrg   {
   6475   1.1.1.2    mrg     if (AVR_HAVE_MUL)
   6476   1.1.1.2    mrg       {
   6477   1.1.1.2    mrg         emit_insn (gen_fmuls_insn (operand0, operand1, operand2));
   6478   1.1.1.2    mrg         DONE;
   6479   1.1.1.2    mrg       }
   6480   1.1.1.6    mrg     avr_fix_inputs (operands, 1 << 2, regmask (QImode, 24));
   6481   1.1.1.2    mrg   })
   6482       1.1    mrg 
   6483   1.1.1.2    mrg (define_insn "fmuls_insn"
   6484   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand" "=r")
   6485   1.1.1.2    mrg         (unspec:HI [(match_operand:QI 1 "register_operand" "a")
   6486   1.1.1.2    mrg                     (match_operand:QI 2 "register_operand" "a")]
   6487   1.1.1.2    mrg                    UNSPEC_FMULS))]
   6488   1.1.1.2    mrg   "AVR_HAVE_MUL"
   6489   1.1.1.2    mrg   "fmuls %1,%2
   6490   1.1.1.2    mrg 	movw %0,r0
   6491   1.1.1.2    mrg 	clr __zero_reg__"
   6492   1.1.1.2    mrg   [(set_attr "length" "3")
   6493   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   6494       1.1    mrg 
   6495   1.1.1.2    mrg (define_insn "*fmuls.call"
   6496   1.1.1.2    mrg   [(set (reg:HI 22)
   6497   1.1.1.2    mrg         (unspec:HI [(reg:QI 24)
   6498   1.1.1.2    mrg                     (reg:QI 25)] UNSPEC_FMULS))
   6499   1.1.1.2    mrg    (clobber (reg:HI 24))]
   6500   1.1.1.2    mrg   "!AVR_HAVE_MUL"
   6501   1.1.1.2    mrg   "%~call __fmuls"
   6502   1.1.1.2    mrg   [(set_attr "type" "xcall")
   6503   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   6504       1.1    mrg 
   6505   1.1.1.2    mrg ;; FMULSU
   6506   1.1.1.2    mrg (define_expand "fmulsu"
   6507   1.1.1.2    mrg   [(set (reg:QI 24)
   6508   1.1.1.2    mrg         (match_operand:QI 1 "register_operand" ""))
   6509   1.1.1.2    mrg    (set (reg:QI 25)
   6510   1.1.1.2    mrg         (match_operand:QI 2 "register_operand" ""))
   6511   1.1.1.2    mrg    (parallel [(set (reg:HI 22)
   6512   1.1.1.2    mrg                    (unspec:HI [(reg:QI 24)
   6513   1.1.1.2    mrg                                (reg:QI 25)] UNSPEC_FMULSU))
   6514   1.1.1.2    mrg               (clobber (reg:HI 24))])
   6515   1.1.1.2    mrg    (set (match_operand:HI 0 "register_operand" "")
   6516   1.1.1.2    mrg         (reg:HI 22))]
   6517   1.1.1.2    mrg   ""
   6518   1.1.1.2    mrg   {
   6519   1.1.1.2    mrg     if (AVR_HAVE_MUL)
   6520   1.1.1.2    mrg       {
   6521   1.1.1.2    mrg         emit_insn (gen_fmulsu_insn (operand0, operand1, operand2));
   6522   1.1.1.2    mrg         DONE;
   6523   1.1.1.2    mrg       }
   6524   1.1.1.6    mrg     avr_fix_inputs (operands, 1 << 2, regmask (QImode, 24));
   6525   1.1.1.2    mrg   })
   6526       1.1    mrg 
   6527   1.1.1.2    mrg (define_insn "fmulsu_insn"
   6528   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand" "=r")
   6529   1.1.1.2    mrg         (unspec:HI [(match_operand:QI 1 "register_operand" "a")
   6530   1.1.1.2    mrg                     (match_operand:QI 2 "register_operand" "a")]
   6531   1.1.1.2    mrg                    UNSPEC_FMULSU))]
   6532   1.1.1.2    mrg   "AVR_HAVE_MUL"
   6533   1.1.1.2    mrg   "fmulsu %1,%2
   6534   1.1.1.2    mrg 	movw %0,r0
   6535   1.1.1.2    mrg 	clr __zero_reg__"
   6536   1.1.1.2    mrg   [(set_attr "length" "3")
   6537   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   6538       1.1    mrg 
   6539   1.1.1.2    mrg (define_insn "*fmulsu.call"
   6540   1.1.1.2    mrg   [(set (reg:HI 22)
   6541   1.1.1.2    mrg         (unspec:HI [(reg:QI 24)
   6542   1.1.1.2    mrg                     (reg:QI 25)] UNSPEC_FMULSU))
   6543   1.1.1.2    mrg    (clobber (reg:HI 24))]
   6544   1.1.1.2    mrg   "!AVR_HAVE_MUL"
   6545   1.1.1.2    mrg   "%~call __fmulsu"
   6546   1.1.1.2    mrg   [(set_attr "type" "xcall")
   6547   1.1.1.2    mrg    (set_attr "cc" "clobber")])
   6548       1.1    mrg 
   6549   1.1.1.2    mrg 
   6551   1.1.1.2    mrg ;; Some combiner patterns dealing with bits.
   6552   1.1.1.2    mrg ;; See PR42210
   6553   1.1.1.2    mrg 
   6554   1.1.1.2    mrg ;; Move bit $3.0 into bit $0.$4
   6555   1.1.1.2    mrg (define_insn "*movbitqi.1-6.a"
   6556   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand"                               "=r")
   6557   1.1.1.2    mrg         (ior:QI (and:QI (match_operand:QI 1 "register_operand"                "0")
   6558   1.1.1.2    mrg                         (match_operand:QI 2 "single_zero_operand"             "n"))
   6559   1.1.1.2    mrg                 (and:QI (ashift:QI (match_operand:QI 3 "register_operand"     "r")
   6560   1.1.1.2    mrg                                    (match_operand:QI 4 "const_0_to_7_operand" "n"))
   6561   1.1.1.2    mrg                         (match_operand:QI 5 "single_one_operand"              "n"))))]
   6562   1.1.1.2    mrg   "INTVAL(operands[4]) == exact_log2 (~INTVAL(operands[2]) & GET_MODE_MASK (QImode))
   6563   1.1.1.2    mrg    && INTVAL(operands[4]) == exact_log2 (INTVAL(operands[5]) & GET_MODE_MASK (QImode))"
   6564   1.1.1.2    mrg   "bst %3,0\;bld %0,%4"
   6565   1.1.1.2    mrg   [(set_attr "length" "2")
   6566       1.1    mrg    (set_attr "cc" "none")])
   6567   1.1.1.2    mrg 
   6568   1.1.1.2    mrg ;; Move bit $3.0 into bit $0.$4
   6569   1.1.1.2    mrg ;; Variation of above. Unfortunately, there is no canonicalized representation
   6570   1.1.1.2    mrg ;; of moving around bits.  So what we see here depends on how user writes down
   6571   1.1.1.2    mrg ;; bit manipulations.
   6572   1.1.1.2    mrg (define_insn "*movbitqi.1-6.b"
   6573   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand"                            "=r")
   6574   1.1.1.2    mrg         (ior:QI (and:QI (match_operand:QI 1 "register_operand"             "0")
   6575   1.1.1.2    mrg                         (match_operand:QI 2 "single_zero_operand"          "n"))
   6576   1.1.1.2    mrg                 (ashift:QI (and:QI (match_operand:QI 3 "register_operand"  "r")
   6577   1.1.1.2    mrg                                    (const_int 1))
   6578   1.1.1.2    mrg                            (match_operand:QI 4 "const_0_to_7_operand"      "n"))))]
   6579   1.1.1.2    mrg   "INTVAL(operands[4]) == exact_log2 (~INTVAL(operands[2]) & GET_MODE_MASK (QImode))"
   6580   1.1.1.2    mrg   "bst %3,0\;bld %0,%4"
   6581   1.1.1.2    mrg   [(set_attr "length" "2")
   6582       1.1    mrg    (set_attr "cc" "none")])
   6583   1.1.1.2    mrg 
   6584   1.1.1.2    mrg ;; Move bit $3.0 into bit $0.0.
   6585   1.1.1.2    mrg ;; For bit 0, combiner generates slightly different pattern.
   6586   1.1.1.2    mrg (define_insn "*movbitqi.0"
   6587   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand"                     "=r")
   6588   1.1.1.2    mrg         (ior:QI (and:QI (match_operand:QI 1 "register_operand"      "0")
   6589   1.1.1.2    mrg                         (match_operand:QI 2 "single_zero_operand"   "n"))
   6590   1.1.1.2    mrg                 (and:QI (match_operand:QI 3 "register_operand"      "r")
   6591   1.1.1.2    mrg                         (const_int 1))))]
   6592   1.1.1.2    mrg   "0 == exact_log2 (~INTVAL(operands[2]) & GET_MODE_MASK (QImode))"
   6593   1.1.1.2    mrg   "bst %3,0\;bld %0,0"
   6594   1.1.1.2    mrg   [(set_attr "length" "2")
   6595       1.1    mrg    (set_attr "cc" "none")])
   6596   1.1.1.2    mrg 
   6597   1.1.1.2    mrg ;; Move bit $2.0 into bit $0.7.
   6598   1.1.1.2    mrg ;; For bit 7, combiner generates slightly different pattern
   6599   1.1.1.2    mrg (define_insn "*movbitqi.7"
   6600   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand"                      "=r")
   6601   1.1.1.2    mrg         (ior:QI (and:QI (match_operand:QI 1 "register_operand"       "0")
   6602   1.1.1.2    mrg                         (const_int 127))
   6603   1.1.1.2    mrg                 (ashift:QI (match_operand:QI 2 "register_operand"    "r")
   6604       1.1    mrg                            (const_int 7))))]
   6605   1.1.1.2    mrg   ""
   6606   1.1.1.2    mrg   "bst %2,0\;bld %0,7"
   6607   1.1.1.2    mrg   [(set_attr "length" "2")
   6608       1.1    mrg    (set_attr "cc" "none")])
   6609   1.1.1.2    mrg 
   6610   1.1.1.2    mrg ;; Combiner transforms above four pattern into ZERO_EXTRACT if it sees MEM
   6611   1.1.1.2    mrg ;; and input/output match.  We provide a special pattern for this, because
   6612   1.1.1.2    mrg ;; in contrast to a IN/BST/BLD/OUT sequence we need less registers and the
   6613   1.1.1.2    mrg ;; operation on I/O is atomic.
   6614   1.1.1.6    mrg (define_insn "*insv.io"
   6615   1.1.1.2    mrg   [(set (zero_extract:QI (mem:QI (match_operand 0 "low_io_address_operand" "i,i,i"))
   6616   1.1.1.2    mrg                          (const_int 1)
   6617   1.1.1.2    mrg                          (match_operand:QI 1 "const_0_to_7_operand"        "n,n,n"))
   6618       1.1    mrg         (match_operand:QI 2 "nonmemory_operand"                            "L,P,r"))]
   6619   1.1.1.2    mrg   ""
   6620   1.1.1.2    mrg   "@
   6621   1.1.1.2    mrg 	cbi %i0,%1
   6622   1.1.1.2    mrg 	sbi %i0,%1
   6623   1.1.1.2    mrg 	sbrc %2,0\;sbi %i0,%1\;sbrs %2,0\;cbi %i0,%1"
   6624   1.1.1.2    mrg   [(set_attr "length" "1,1,4")
   6625       1.1    mrg    (set_attr "cc" "none")])
   6626   1.1.1.2    mrg 
   6627   1.1.1.6    mrg (define_insn "*insv.not.io"
   6628   1.1.1.2    mrg   [(set (zero_extract:QI (mem:QI (match_operand 0 "low_io_address_operand" "i"))
   6629   1.1.1.2    mrg                          (const_int 1)
   6630   1.1.1.2    mrg                          (match_operand:QI 1 "const_0_to_7_operand"        "n"))
   6631       1.1    mrg         (not:QI (match_operand:QI 2 "register_operand"                     "r")))]
   6632   1.1.1.2    mrg   ""
   6633   1.1.1.2    mrg   "sbrs %2,0\;sbi %i0,%1\;sbrc %2,0\;cbi %i0,%1"
   6634   1.1.1.2    mrg   [(set_attr "length" "4")
   6635       1.1    mrg    (set_attr "cc" "none")])
   6636   1.1.1.2    mrg 
   6637   1.1.1.2    mrg ;; The insv expander.
   6638   1.1.1.2    mrg ;; We only support 1-bit inserts
   6639   1.1.1.2    mrg (define_expand "insv"
   6640   1.1.1.2    mrg   [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "")
   6641   1.1.1.2    mrg                          (match_operand:QI 1 "const1_operand" "")        ; width
   6642   1.1.1.2    mrg                          (match_operand:QI 2 "const_0_to_7_operand" "")) ; pos
   6643   1.1.1.2    mrg         (match_operand:QI 3 "nonmemory_operand" ""))]
   6644   1.1.1.2    mrg   "optimize")
   6645   1.1.1.9    mrg 
   6646   1.1.1.9    mrg ;; Some more patterns to support moving around one bit which can be accomplished
   6647   1.1.1.9    mrg ;; by BST + BLD in most situations.  Unfortunately, there is no canonical
   6648   1.1.1.9    mrg ;; representation, and we just implement some more cases that are not too
   6649   1.1.1.9    mrg ;; complicated.
   6650   1.1.1.2    mrg 
   6651   1.1.1.2    mrg ;; Insert bit $2.0 into $0.$1
   6652   1.1.1.2    mrg (define_insn "*insv.reg"
   6653   1.1.1.2    mrg   [(set (zero_extract:QI (match_operand:QI 0 "register_operand"    "+r,d,d,l,l")
   6654   1.1.1.2    mrg                          (const_int 1)
   6655   1.1.1.2    mrg                          (match_operand:QI 1 "const_0_to_7_operand" "n,n,n,n,n"))
   6656       1.1    mrg         (match_operand:QI 2 "nonmemory_operand"                     "r,L,P,L,P"))]
   6657   1.1.1.2    mrg   ""
   6658   1.1.1.2    mrg   "@
   6659   1.1.1.2    mrg 	bst %2,0\;bld %0,%1
   6660   1.1.1.2    mrg 	andi %0,lo8(~(1<<%1))
   6661   1.1.1.2    mrg 	ori %0,lo8(1<<%1)
   6662   1.1.1.2    mrg 	clt\;bld %0,%1
   6663   1.1.1.2    mrg 	set\;bld %0,%1"
   6664   1.1.1.2    mrg   [(set_attr "length" "2,1,1,2,2")
   6665   1.1.1.2    mrg    (set_attr "cc" "none,set_zn,set_zn,none,none")])
   6666   1.1.1.9    mrg 
   6667   1.1.1.9    mrg ;; Insert bit $2.$3 into $0.$1
   6668   1.1.1.9    mrg (define_insn "*insv.extract"
   6669   1.1.1.9    mrg   [(set (zero_extract:QI (match_operand:QI 0 "register_operand"    "+r")
   6670   1.1.1.9    mrg                          (const_int 1)
   6671   1.1.1.9    mrg                          (match_operand:QI 1 "const_0_to_7_operand" "n"))
   6672   1.1.1.9    mrg         (any_extract:QI (match_operand:QI 2 "register_operand"      "r")
   6673   1.1.1.9    mrg                         (const_int 1)
   6674   1.1.1.9    mrg                         (match_operand:QI 3 "const_0_to_7_operand"  "n")))]
   6675   1.1.1.9    mrg   ""
   6676   1.1.1.9    mrg   "bst %2,%3\;bld %0,%1"
   6677   1.1.1.9    mrg   [(set_attr "length" "2")
   6678   1.1.1.9    mrg    (set_attr "cc" "none")])
   6679   1.1.1.9    mrg 
   6680   1.1.1.9    mrg ;; Insert bit $2.$3 into $0.$1
   6681   1.1.1.9    mrg (define_insn "*insv.shiftrt"
   6682   1.1.1.9    mrg   [(set (zero_extract:QI (match_operand:QI 0 "register_operand"    "+r")
   6683   1.1.1.9    mrg                          (const_int 1)
   6684   1.1.1.9    mrg                          (match_operand:QI 1 "const_0_to_7_operand" "n"))
   6685   1.1.1.9    mrg         (any_shiftrt:QI (match_operand:QI 2 "register_operand"      "r")
   6686   1.1.1.9    mrg                         (match_operand:QI 3 "const_0_to_7_operand"  "n")))]
   6687   1.1.1.9    mrg   ""
   6688   1.1.1.9    mrg   "bst %2,%3\;bld %0,%1"
   6689   1.1.1.9    mrg   [(set_attr "length" "2")
   6690   1.1.1.9    mrg    (set_attr "cc" "none")])
   6691   1.1.1.9    mrg 
   6692   1.1.1.9    mrg ;; Same, but with a NOT inverting the source bit.
   6693   1.1.1.9    mrg ;; Insert bit ~$2.$3 into $0.$1
   6694   1.1.1.9    mrg (define_insn "*insv.not-shiftrt"
   6695   1.1.1.9    mrg   [(set (zero_extract:QI (match_operand:QI 0 "register_operand"           "+r")
   6696   1.1.1.9    mrg                          (const_int 1)
   6697   1.1.1.9    mrg                          (match_operand:QI 1 "const_0_to_7_operand"        "n"))
   6698   1.1.1.9    mrg         (not:QI (any_shiftrt:QI (match_operand:QI 2 "register_operand"     "r")
   6699   1.1.1.9    mrg                                 (match_operand:QI 3 "const_0_to_7_operand" "n"))))]
   6700   1.1.1.9    mrg   ""
   6701   1.1.1.9    mrg   {
   6702   1.1.1.9    mrg     return avr_out_insert_notbit (insn, operands, NULL_RTX, NULL);
   6703   1.1.1.9    mrg   }
   6704   1.1.1.9    mrg   [(set_attr "adjust_len" "insv_notbit")
   6705   1.1.1.9    mrg    (set_attr "cc" "clobber")])
   6706   1.1.1.9    mrg 
   6707   1.1.1.9    mrg ;; Insert bit ~$2.0 into $0.$1
   6708   1.1.1.9    mrg (define_insn "*insv.xor1-bit.0"
   6709   1.1.1.9    mrg   [(set (zero_extract:QI (match_operand:QI 0 "register_operand"    "+r")
   6710   1.1.1.9    mrg                          (const_int 1)
   6711   1.1.1.9    mrg                          (match_operand:QI 1 "const_0_to_7_operand" "n"))
   6712   1.1.1.9    mrg         (xor:QI (match_operand:QI 2 "register_operand"              "r")
   6713   1.1.1.9    mrg                 (const_int 1)))]
   6714   1.1.1.9    mrg   ""
   6715   1.1.1.9    mrg   {
   6716   1.1.1.9    mrg     return avr_out_insert_notbit (insn, operands, const0_rtx, NULL);
   6717   1.1.1.9    mrg   }
   6718   1.1.1.9    mrg   [(set_attr "adjust_len" "insv_notbit_0")
   6719   1.1.1.9    mrg    (set_attr "cc" "clobber")])
   6720   1.1.1.9    mrg 
   6721   1.1.1.9    mrg ;; Insert bit ~$2.0 into $0.$1
   6722   1.1.1.9    mrg (define_insn "*insv.not-bit.0"
   6723   1.1.1.9    mrg   [(set (zero_extract:QI (match_operand:QI 0 "register_operand"    "+r")
   6724   1.1.1.9    mrg                          (const_int 1)
   6725   1.1.1.9    mrg                          (match_operand:QI 1 "const_0_to_7_operand" "n"))
   6726   1.1.1.9    mrg         (not:QI (match_operand:QI 2 "register_operand"              "r")))]
   6727   1.1.1.9    mrg   ""
   6728   1.1.1.9    mrg   {
   6729   1.1.1.9    mrg     return avr_out_insert_notbit (insn, operands, const0_rtx, NULL);
   6730   1.1.1.9    mrg   }
   6731   1.1.1.9    mrg   [(set_attr "adjust_len" "insv_notbit_0")
   6732   1.1.1.9    mrg    (set_attr "cc" "clobber")])
   6733   1.1.1.9    mrg 
   6734   1.1.1.9    mrg ;; Insert bit ~$2.7 into $0.$1
   6735   1.1.1.9    mrg (define_insn "*insv.not-bit.7"
   6736   1.1.1.9    mrg   [(set (zero_extract:QI (match_operand:QI 0 "register_operand"    "+r")
   6737   1.1.1.9    mrg                          (const_int 1)
   6738   1.1.1.9    mrg                          (match_operand:QI 1 "const_0_to_7_operand" "n"))
   6739   1.1.1.9    mrg         (ge:QI (match_operand:QI 2 "register_operand"               "r")
   6740   1.1.1.9    mrg                (const_int 0)))]
   6741   1.1.1.9    mrg   ""
   6742   1.1.1.9    mrg   {
   6743   1.1.1.9    mrg     return avr_out_insert_notbit (insn, operands, GEN_INT (7), NULL);
   6744   1.1.1.9    mrg   }
   6745   1.1.1.9    mrg   [(set_attr "adjust_len" "insv_notbit_7")
   6746   1.1.1.9    mrg    (set_attr "cc" "clobber")])
   6747   1.1.1.9    mrg 
   6748   1.1.1.9    mrg ;; Insert bit ~$2.$3 into $0.$1
   6749   1.1.1.9    mrg (define_insn "*insv.xor-extract"
   6750   1.1.1.9    mrg   [(set (zero_extract:QI (match_operand:QI 0 "register_operand"        "+r")
   6751   1.1.1.9    mrg                          (const_int 1)
   6752   1.1.1.9    mrg                          (match_operand:QI 1 "const_0_to_7_operand"     "n"))
   6753   1.1.1.9    mrg         (any_extract:QI (xor:QI (match_operand:QI 2 "register_operand"  "r")
   6754   1.1.1.9    mrg                                 (match_operand:QI 4 "const_int_operand" "n"))
   6755   1.1.1.9    mrg                         (const_int 1)
   6756   1.1.1.9    mrg                         (match_operand:QI 3 "const_0_to_7_operand"      "n")))]
   6757   1.1.1.9    mrg   "INTVAL (operands[4]) & (1 << INTVAL (operands[3]))"
   6758   1.1.1.9    mrg   {
   6759   1.1.1.9    mrg     return avr_out_insert_notbit (insn, operands, NULL_RTX, NULL);
   6760   1.1.1.9    mrg   }
   6761   1.1.1.9    mrg   [(set_attr "adjust_len" "insv_notbit")
   6762   1.1.1.9    mrg    (set_attr "cc" "clobber")])
   6763   1.1.1.2    mrg 
   6764   1.1.1.2    mrg 
   6766   1.1.1.2    mrg ;; Some combine patterns that try to fix bad code when a value is composed
   6767   1.1.1.2    mrg ;; from byte parts like in PR27663.
   6768   1.1.1.2    mrg ;; The patterns give some release but the code still is not optimal,
   6769   1.1.1.2    mrg ;; in particular when subreg lowering (-fsplit-wide-types) is turned on.
   6770   1.1.1.2    mrg ;; That switch obfuscates things here and in many other places.
   6771   1.1.1.2    mrg 
   6772   1.1.1.2    mrg ;; "*iorhiqi.byte0"   "*iorpsiqi.byte0"   "*iorsiqi.byte0"
   6773   1.1.1.2    mrg ;; "*xorhiqi.byte0"   "*xorpsiqi.byte0"   "*xorsiqi.byte0"
   6774   1.1.1.2    mrg (define_insn_and_split "*<code_stdname><mode>qi.byte0"
   6775   1.1.1.2    mrg   [(set (match_operand:HISI 0 "register_operand"                 "=r")
   6776   1.1.1.2    mrg         (xior:HISI
   6777       1.1    mrg          (zero_extend:HISI (match_operand:QI 1 "register_operand" "r"))
   6778   1.1.1.2    mrg          (match_operand:HISI 2 "register_operand"                 "0")))]
   6779   1.1.1.2    mrg   ""
   6780   1.1.1.2    mrg   "#"
   6781   1.1.1.2    mrg   "reload_completed"
   6782   1.1.1.2    mrg   [(set (match_dup 3)
   6783   1.1.1.2    mrg         (xior:QI (match_dup 3)
   6784   1.1.1.2    mrg                  (match_dup 1)))]
   6785   1.1.1.2    mrg   {
   6786       1.1    mrg     operands[3] = simplify_gen_subreg (QImode, operands[0], <MODE>mode, 0);
   6787   1.1.1.2    mrg   })
   6788   1.1.1.2    mrg 
   6789   1.1.1.2    mrg ;; "*iorhiqi.byte1-3"  "*iorpsiqi.byte1-3"  "*iorsiqi.byte1-3"
   6790   1.1.1.2    mrg ;; "*xorhiqi.byte1-3"  "*xorpsiqi.byte1-3"  "*xorsiqi.byte1-3"
   6791   1.1.1.2    mrg (define_insn_and_split "*<code_stdname><mode>qi.byte1-3"
   6792   1.1.1.2    mrg   [(set (match_operand:HISI 0 "register_operand"                              "=r")
   6793   1.1.1.2    mrg         (xior:HISI
   6794   1.1.1.2    mrg          (ashift:HISI (zero_extend:HISI (match_operand:QI 1 "register_operand" "r"))
   6795   1.1.1.2    mrg                       (match_operand:QI 2 "const_8_16_24_operand"              "n"))
   6796   1.1.1.2    mrg          (match_operand:HISI 3 "register_operand"                              "0")))]
   6797   1.1.1.2    mrg   "INTVAL(operands[2]) < GET_MODE_BITSIZE (<MODE>mode)"
   6798   1.1.1.2    mrg   "#"
   6799   1.1.1.2    mrg   "&& reload_completed"
   6800   1.1.1.2    mrg   [(set (match_dup 4)
   6801   1.1.1.2    mrg         (xior:QI (match_dup 4)
   6802   1.1.1.2    mrg                  (match_dup 1)))]
   6803   1.1.1.2    mrg   {
   6804   1.1.1.2    mrg     int byteno = INTVAL(operands[2]) / BITS_PER_UNIT;
   6805       1.1    mrg     operands[4] = simplify_gen_subreg (QImode, operands[0], <MODE>mode, byteno);
   6806   1.1.1.9    mrg   })
   6807   1.1.1.9    mrg 
   6808  1.1.1.12    mrg 
   6809   1.1.1.9    mrg (define_insn_and_split "*iorhi3.ashift8-ext.zerox"
   6810  1.1.1.12    mrg   [(set (match_operand:HI 0 "register_operand"                        "=r,r")
   6811   1.1.1.9    mrg         (ior:HI (ashift:HI (any_extend:HI
   6812  1.1.1.12    mrg                             (match_operand:QI 1 "register_operand"     "r,r"))
   6813   1.1.1.9    mrg                            (const_int 8))
   6814   1.1.1.9    mrg                 (zero_extend:HI (match_operand:QI 2 "register_operand" "0,r"))))]
   6815   1.1.1.9    mrg   "optimize"
   6816   1.1.1.9    mrg   { gcc_unreachable(); }
   6817   1.1.1.9    mrg   "&& reload_completed"
   6818   1.1.1.9    mrg   [(set (match_dup 1) (xor:QI (match_dup 1) (match_dup 2)))
   6819   1.1.1.9    mrg    (set (match_dup 2) (xor:QI (match_dup 2) (match_dup 1)))
   6820   1.1.1.9    mrg    (set (match_dup 1) (xor:QI (match_dup 1) (match_dup 2)))]
   6821   1.1.1.9    mrg   {
   6822   1.1.1.9    mrg     rtx hi = simplify_gen_subreg (QImode, operands[0], HImode, 1);
   6823   1.1.1.9    mrg     rtx lo = simplify_gen_subreg (QImode, operands[0], HImode, 0);
   6824   1.1.1.9    mrg 
   6825   1.1.1.9    mrg     if (!reg_overlap_mentioned_p (hi, operands[2]))
   6826   1.1.1.9    mrg       {
   6827   1.1.1.9    mrg         emit_move_insn (hi, operands[1]);
   6828   1.1.1.9    mrg         emit_move_insn (lo, operands[2]);
   6829   1.1.1.9    mrg         DONE;
   6830   1.1.1.9    mrg       }
   6831   1.1.1.9    mrg     else if (!reg_overlap_mentioned_p (lo, operands[1]))
   6832   1.1.1.9    mrg       {
   6833   1.1.1.9    mrg         emit_move_insn (lo, operands[2]);
   6834   1.1.1.9    mrg         emit_move_insn (hi, operands[1]);
   6835   1.1.1.9    mrg         DONE;
   6836   1.1.1.9    mrg       }
   6837   1.1.1.9    mrg 
   6838   1.1.1.9    mrg     gcc_assert (REGNO (operands[1]) == REGNO (operands[0]));
   6839   1.1.1.9    mrg     gcc_assert (REGNO (operands[2]) == 1 + REGNO (operands[0]));
   6840   1.1.1.9    mrg   })
   6841   1.1.1.9    mrg 
   6842   1.1.1.9    mrg (define_insn_and_split "*iorhi3.ashift8-ext.reg"
   6843   1.1.1.9    mrg   [(set (match_operand:HI 0 "register_operand"                    "=r")
   6844   1.1.1.9    mrg         (ior:HI (ashift:HI (any_extend:HI
   6845   1.1.1.9    mrg                             (match_operand:QI 1 "register_operand" "r"))
   6846   1.1.1.9    mrg                            (const_int 8))
   6847   1.1.1.9    mrg                 (match_operand:HI 2 "register_operand"             "0")))]
   6848   1.1.1.9    mrg   "optimize"
   6849   1.1.1.9    mrg   { gcc_unreachable(); }
   6850   1.1.1.9    mrg   "&& reload_completed"
   6851   1.1.1.9    mrg   [(set (match_dup 3)
   6852   1.1.1.9    mrg         (ior:QI (match_dup 4)
   6853   1.1.1.9    mrg                 (match_dup 1)))]
   6854   1.1.1.9    mrg   {
   6855   1.1.1.9    mrg     operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, 1);
   6856   1.1.1.9    mrg     operands[4] = simplify_gen_subreg (QImode, operands[2], HImode, 1);
   6857   1.1.1.9    mrg   })
   6858   1.1.1.9    mrg 
   6859   1.1.1.9    mrg (define_insn_and_split "*iorhi3.ashift8-reg.zerox"
   6860   1.1.1.9    mrg   [(set (match_operand:HI 0 "register_operand"                        "=r")
   6861   1.1.1.9    mrg         (ior:HI (ashift:HI (match_operand:HI 1 "register_operand"      "r")
   6862   1.1.1.9    mrg                            (const_int 8))
   6863   1.1.1.9    mrg                 (zero_extend:HI (match_operand:QI 2 "register_operand" "0"))))]
   6864   1.1.1.9    mrg   "optimize"
   6865   1.1.1.9    mrg   { gcc_unreachable(); }
   6866   1.1.1.9    mrg   "&& reload_completed"
   6867   1.1.1.9    mrg   [(set (match_dup 3)
   6868   1.1.1.9    mrg         (match_dup 4))]
   6869   1.1.1.9    mrg   {
   6870   1.1.1.9    mrg     operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, 1);
   6871   1.1.1.9    mrg     operands[4] = simplify_gen_subreg (QImode, operands[1], HImode, 0);
   6872   1.1.1.9    mrg   })
   6873   1.1.1.9    mrg 
   6874   1.1.1.9    mrg 
   6875   1.1.1.9    mrg (define_peephole2
   6876   1.1.1.9    mrg   [(set (match_operand:QI 0 "register_operand")
   6877   1.1.1.9    mrg         (const_int 0))
   6878   1.1.1.9    mrg    (set (match_dup 0)
   6879   1.1.1.9    mrg         (ior:QI (match_dup 0)
   6880   1.1.1.9    mrg                 (match_operand:QI 1 "register_operand")))]
   6881   1.1.1.9    mrg   ""
   6882   1.1.1.9    mrg   [(set (match_dup 0)
   6883   1.1.1.9    mrg         (match_dup 1))])
   6884   1.1.1.2    mrg 
   6885   1.1.1.2    mrg 
   6886   1.1.1.2    mrg (define_expand "extzv"
   6887   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand" "")
   6888   1.1.1.2    mrg         (zero_extract:QI (match_operand:QI 1 "register_operand"  "")
   6889   1.1.1.2    mrg                          (match_operand:QI 2 "const1_operand" "")
   6890   1.1.1.2    mrg                          (match_operand:QI 3 "const_0_to_7_operand" "")))])
   6891   1.1.1.2    mrg 
   6892   1.1.1.2    mrg (define_insn "*extzv"
   6893   1.1.1.2    mrg   [(set (match_operand:QI 0 "register_operand"                   "=*d,*d,*d,*d,r")
   6894   1.1.1.2    mrg         (zero_extract:QI (match_operand:QI 1 "register_operand"     "0,r,0,0,r")
   6895       1.1    mrg                          (const_int 1)
   6896   1.1.1.2    mrg                          (match_operand:QI 2 "const_0_to_7_operand" "L,L,P,C04,n")))]
   6897   1.1.1.2    mrg   ""
   6898   1.1.1.2    mrg   "@
   6899   1.1.1.2    mrg 	andi %0,1
   6900   1.1.1.2    mrg 	mov %0,%1\;andi %0,1
   6901   1.1.1.2    mrg 	lsr %0\;andi %0,1
   6902   1.1.1.2    mrg 	swap %0\;andi %0,1
   6903   1.1.1.2    mrg 	bst %1,%2\;clr %0\;bld %0,0"
   6904   1.1.1.2    mrg   [(set_attr "length" "1,2,2,2,3")
   6905   1.1.1.2    mrg    (set_attr "cc" "set_zn,set_zn,set_zn,set_zn,clobber")])
   6906   1.1.1.2    mrg 
   6907   1.1.1.2    mrg (define_insn_and_split "*extzv.qihi1"
   6908   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                     "=r")
   6909   1.1.1.2    mrg         (zero_extract:HI (match_operand:QI 1 "register_operand"     "r")
   6910       1.1    mrg                          (const_int 1)
   6911   1.1.1.2    mrg                          (match_operand:QI 2 "const_0_to_7_operand" "n")))]
   6912   1.1.1.2    mrg   ""
   6913   1.1.1.2    mrg   "#"
   6914   1.1.1.2    mrg   ""
   6915   1.1.1.2    mrg   [(set (match_dup 3)
   6916   1.1.1.2    mrg         (zero_extract:QI (match_dup 1)
   6917   1.1.1.2    mrg                          (const_int 1)
   6918   1.1.1.2    mrg                          (match_dup 2)))
   6919       1.1    mrg    (set (match_dup 4)
   6920   1.1.1.2    mrg         (const_int 0))]
   6921   1.1.1.2    mrg   {
   6922   1.1.1.2    mrg     operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, 0);
   6923       1.1    mrg     operands[4] = simplify_gen_subreg (QImode, operands[0], HImode, 1);
   6924   1.1.1.2    mrg   })
   6925   1.1.1.2    mrg 
   6926   1.1.1.2    mrg (define_insn_and_split "*extzv.qihi2"
   6927   1.1.1.2    mrg   [(set (match_operand:HI 0 "register_operand"                      "=r")
   6928   1.1.1.2    mrg         (zero_extend:HI
   6929   1.1.1.2    mrg          (zero_extract:QI (match_operand:QI 1 "register_operand"     "r")
   6930   1.1.1.2    mrg                           (const_int 1)
   6931   1.1.1.2    mrg                           (match_operand:QI 2 "const_0_to_7_operand" "n"))))]
   6932       1.1    mrg   ""
   6933   1.1.1.2    mrg   "#"
   6934   1.1.1.2    mrg   ""
   6935   1.1.1.2    mrg   [(set (match_dup 3)
   6936   1.1.1.2    mrg         (zero_extract:QI (match_dup 1)
   6937   1.1.1.2    mrg                          (const_int 1)
   6938   1.1.1.2    mrg                          (match_dup 2)))
   6939       1.1    mrg    (set (match_dup 4)
   6940   1.1.1.2    mrg         (const_int 0))]
   6941   1.1.1.2    mrg   {
   6942   1.1.1.2    mrg     operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, 0);
   6943   1.1.1.2    mrg     operands[4] = simplify_gen_subreg (QImode, operands[0], HImode, 1);
   6944   1.1.1.9    mrg   })
   6945   1.1.1.9    mrg 
   6946   1.1.1.9    mrg ;; ??? do_store_flag emits a hard-coded right shift to extract a bit without
   6947   1.1.1.9    mrg ;; even considering rtx_costs, extzv, or a bit-test.  See PR 55181 for an example.
   6948   1.1.1.9    mrg (define_insn_and_split "*extract.subreg.bit"
   6949   1.1.1.9    mrg   [(set (match_operand:QI 0 "register_operand"                                       "=r")
   6950   1.1.1.9    mrg         (and:QI (subreg:QI (any_shiftrt:HISI (match_operand:HISI 1 "register_operand" "r")
   6951   1.1.1.9    mrg                                              (match_operand:QI 2 "const_int_operand"  "n"))
   6952   1.1.1.9    mrg                            0)
   6953   1.1.1.9    mrg                 (const_int 1)))]
   6954   1.1.1.9    mrg   "INTVAL (operands[2]) < GET_MODE_BITSIZE (<MODE>mode)"
   6955   1.1.1.9    mrg   { gcc_unreachable(); }
   6956   1.1.1.9    mrg   "&& reload_completed"
   6957   1.1.1.9    mrg   [;; "*extzv"
   6958   1.1.1.9    mrg    (set (match_dup 0)
   6959   1.1.1.9    mrg         (zero_extract:QI (match_dup 3)
   6960   1.1.1.9    mrg                          (const_int 1)
   6961   1.1.1.9    mrg                          (match_dup 4)))]
   6962   1.1.1.9    mrg   {
   6963   1.1.1.9    mrg     int bitno = INTVAL (operands[2]);
   6964   1.1.1.9    mrg     operands[3] = simplify_gen_subreg (QImode, operands[1], <MODE>mode, bitno / 8);
   6965   1.1.1.9    mrg     operands[4] = GEN_INT (bitno % 8);
   6966   1.1.1.2    mrg   })
   6967   1.1.1.2    mrg 
   6968   1.1.1.2    mrg 
   6970   1.1.1.2    mrg ;; Fixed-point instructions
   6971   1.1.1.2    mrg (include "avr-fixed.md")
   6972                  
   6973                  ;; Operations on 64-bit registers
   6974                  (include "avr-dimode.md")
   6975