Home | History | Annotate | Line # | Download | only in avr
avr.md revision 1.1
      1  1.1  mrg ;; -*- Mode: Scheme -*-
      2  1.1  mrg ;;   Machine description for GNU compiler,
      3  1.1  mrg ;;   for ATMEL AVR micro controllers.
      4  1.1  mrg ;;   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008,
      5  1.1  mrg ;;   2009, 2010 Free Software Foundation, Inc.
      6  1.1  mrg ;;   Contributed by Denis Chertykov (chertykov (a] gmail.com)
      7  1.1  mrg 
      8  1.1  mrg ;; This file is part of GCC.
      9  1.1  mrg 
     10  1.1  mrg ;; GCC is free software; you can redistribute it and/or modify
     11  1.1  mrg ;; it under the terms of the GNU General Public License as published by
     12  1.1  mrg ;; the Free Software Foundation; either version 3, or (at your option)
     13  1.1  mrg ;; any later version.
     14  1.1  mrg 
     15  1.1  mrg ;; GCC is distributed in the hope that it will be useful,
     16  1.1  mrg ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
     17  1.1  mrg ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18  1.1  mrg ;; GNU General Public License for more details.
     19  1.1  mrg 
     20  1.1  mrg ;; You should have received a copy of the GNU General Public License
     21  1.1  mrg ;; along with GCC; see the file COPYING3.  If not see
     22  1.1  mrg ;; <http://www.gnu.org/licenses/>.
     23  1.1  mrg 
     24  1.1  mrg ;; Special characters after '%':
     25  1.1  mrg ;;  A  No effect (add 0).
     26  1.1  mrg ;;  B  Add 1 to REG number, MEM address or CONST_INT.
     27  1.1  mrg ;;  C  Add 2.
     28  1.1  mrg ;;  D  Add 3.
     29  1.1  mrg ;;  j  Branch condition.
     30  1.1  mrg ;;  k  Reverse branch condition.
     31  1.1  mrg ;;..m..Constant Direct Data memory address.
     32  1.1  mrg ;;  o  Displacement for (mem (plus (reg) (const_int))) operands.
     33  1.1  mrg ;;  p  POST_INC or PRE_DEC address as a pointer (X, Y, Z)
     34  1.1  mrg ;;  r  POST_INC or PRE_DEC address as a register (r26, r28, r30)
     35  1.1  mrg ;;..x..Constant Direct Program memory address.
     36  1.1  mrg ;;  ~  Output 'r' if not AVR_HAVE_JMP_CALL.
     37  1.1  mrg ;;  !  Output 'e' if AVR_HAVE_EIJMP_EICALL.
     38  1.1  mrg 
     39  1.1  mrg ;; UNSPEC usage:
     40  1.1  mrg ;;  0  Length of a string, see "strlenhi".
     41  1.1  mrg ;;  1  Jump by register pair Z or by table addressed by Z, see "casesi".
     42  1.1  mrg 
     43  1.1  mrg (define_constants
     44  1.1  mrg   [(REG_X	26)
     45  1.1  mrg    (REG_Y	28)
     46  1.1  mrg    (REG_Z	30)
     47  1.1  mrg    (REG_W	24)
     48  1.1  mrg    (REG_SP	32)
     49  1.1  mrg    (TMP_REGNO	0)	; temporary register r0
     50  1.1  mrg    (ZERO_REGNO	1)	; zero register r1
     51  1.1  mrg    
     52  1.1  mrg    (SREG_ADDR   0x5F)
     53  1.1  mrg    (RAMPZ_ADDR  0x5B)
     54  1.1  mrg    
     55  1.1  mrg    (UNSPEC_STRLEN	0)
     56  1.1  mrg    (UNSPEC_INDEX_JMP	1)
     57  1.1  mrg    (UNSPEC_SEI		2)
     58  1.1  mrg    (UNSPEC_CLI		3)
     59  1.1  mrg 
     60  1.1  mrg    (UNSPECV_PROLOGUE_SAVES	0)
     61  1.1  mrg    (UNSPECV_EPILOGUE_RESTORES	1)
     62  1.1  mrg    (UNSPECV_WRITE_SP_IRQ_ON	2)
     63  1.1  mrg    (UNSPECV_WRITE_SP_IRQ_OFF	3)
     64  1.1  mrg    (UNSPECV_GOTO_RECEIVER	4)])
     65  1.1  mrg 
     66  1.1  mrg (include "predicates.md")
     67  1.1  mrg (include "constraints.md")
     68  1.1  mrg   
     69  1.1  mrg ;; Condition code settings.
     70  1.1  mrg (define_attr "cc" "none,set_czn,set_zn,set_n,compare,clobber"
     71  1.1  mrg   (const_string "none"))
     72  1.1  mrg 
     73  1.1  mrg (define_attr "type" "branch,branch1,arith,xcall"
     74  1.1  mrg   (const_string "arith"))
     75  1.1  mrg 
     76  1.1  mrg (define_attr "mcu_have_movw" "yes,no"
     77  1.1  mrg   (const (if_then_else (symbol_ref "AVR_HAVE_MOVW")
     78  1.1  mrg 		       (const_string "yes")
     79  1.1  mrg 		       (const_string "no"))))
     80  1.1  mrg 
     81  1.1  mrg (define_attr "mcu_mega" "yes,no"
     82  1.1  mrg   (const (if_then_else (symbol_ref "AVR_HAVE_JMP_CALL")
     83  1.1  mrg 		       (const_string "yes")
     84  1.1  mrg 		       (const_string "no"))))
     85  1.1  mrg   
     86  1.1  mrg 
     87  1.1  mrg ;; The size of instructions in bytes.
     88  1.1  mrg ;; XXX may depend from "cc"
     89  1.1  mrg 
     90  1.1  mrg (define_attr "length" ""
     91  1.1  mrg   (cond [(eq_attr "type" "branch")
     92  1.1  mrg          (if_then_else (and (ge (minus (pc) (match_dup 0))
     93  1.1  mrg                                 (const_int -63))
     94  1.1  mrg                             (le (minus (pc) (match_dup 0))
     95  1.1  mrg                                 (const_int 62)))
     96  1.1  mrg                        (const_int 1)
     97  1.1  mrg                        (if_then_else (and (ge (minus (pc) (match_dup 0))
     98  1.1  mrg                                               (const_int -2045))
     99  1.1  mrg                                           (le (minus (pc) (match_dup 0))
    100  1.1  mrg                                               (const_int 2045)))
    101  1.1  mrg                                      (const_int 2)
    102  1.1  mrg                                      (const_int 3)))
    103  1.1  mrg          (eq_attr "type" "branch1")
    104  1.1  mrg          (if_then_else (and (ge (minus (pc) (match_dup 0))
    105  1.1  mrg                                 (const_int -62))
    106  1.1  mrg                             (le (minus (pc) (match_dup 0))
    107  1.1  mrg                                 (const_int 61)))
    108  1.1  mrg                        (const_int 2)
    109  1.1  mrg                        (if_then_else (and (ge (minus (pc) (match_dup 0))
    110  1.1  mrg                                               (const_int -2044))
    111  1.1  mrg                                           (le (minus (pc) (match_dup 0))
    112  1.1  mrg                                               (const_int 2043)))
    113  1.1  mrg                                      (const_int 3)
    114  1.1  mrg                                      (const_int 4)))
    115  1.1  mrg 	 (eq_attr "type" "xcall")
    116  1.1  mrg 	 (if_then_else (eq_attr "mcu_mega" "no")
    117  1.1  mrg 		       (const_int 1)
    118  1.1  mrg 		       (const_int 2))]
    119  1.1  mrg         (const_int 2)))
    120  1.1  mrg 
    121  1.1  mrg ;; Define mode iterator
    122  1.1  mrg (define_mode_iterator QISI [(QI "") (HI "") (SI "")])
    123  1.1  mrg (define_mode_iterator QIDI [(QI "") (HI "") (SI "") (DI "")])
    124  1.1  mrg (define_mode_iterator HIDI [(HI "") (SI "") (DI "")])
    125  1.1  mrg (define_mode_iterator HISI [(HI "") (SI "")])
    126  1.1  mrg 
    127  1.1  mrg ;;========================================================================
    128  1.1  mrg ;; The following is used by nonlocal_goto and setjmp.
    129  1.1  mrg ;; The receiver pattern will create no instructions since internally
    130  1.1  mrg ;; virtual_stack_vars = hard_frame_pointer + 1 so the RTL become R28=R28
    131  1.1  mrg ;; This avoids creating add/sub offsets in frame_pointer save/resore.
    132  1.1  mrg ;; The 'null' receiver also avoids  problems with optimisation
    133  1.1  mrg ;; not recognising incoming jmp and removing code that resets frame_pointer.
    134  1.1  mrg ;; The code derived from builtins.c.
    135  1.1  mrg 
    136  1.1  mrg (define_expand "nonlocal_goto_receiver"
    137  1.1  mrg   [(set (reg:HI REG_Y) 
    138  1.1  mrg 	(unspec_volatile:HI [(const_int 0)] UNSPECV_GOTO_RECEIVER))]
    139  1.1  mrg   ""
    140  1.1  mrg   {
    141  1.1  mrg     emit_move_insn (virtual_stack_vars_rtx, 
    142  1.1  mrg 		    gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx, 
    143  1.1  mrg 				  gen_int_mode (STARTING_FRAME_OFFSET,
    144  1.1  mrg 						Pmode)));
    145  1.1  mrg   /* This might change the hard frame pointer in ways that aren't
    146  1.1  mrg     apparent to early optimization passes, so force a clobber.  */
    147  1.1  mrg     emit_clobber (hard_frame_pointer_rtx);
    148  1.1  mrg     DONE;
    149  1.1  mrg   })
    150  1.1  mrg   
    151  1.1  mrg 
    152  1.1  mrg ;; Defining nonlocal_goto_receiver means we must also define this.
    153  1.1  mrg ;; even though its function is identical to that in builtins.c
    154  1.1  mrg 
    155  1.1  mrg (define_expand "nonlocal_goto"
    156  1.1  mrg   [
    157  1.1  mrg   (use (match_operand 0 "general_operand"))
    158  1.1  mrg   (use (match_operand 1 "general_operand"))
    159  1.1  mrg   (use (match_operand 2 "general_operand"))
    160  1.1  mrg   (use (match_operand 3 "general_operand"))
    161  1.1  mrg   ]
    162  1.1  mrg   ""
    163  1.1  mrg {
    164  1.1  mrg   rtx r_label = copy_to_reg (operands[1]);
    165  1.1  mrg   rtx r_fp = operands[3];
    166  1.1  mrg   rtx r_sp = operands[2];
    167  1.1  mrg 
    168  1.1  mrg   emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
    169  1.1  mrg 
    170  1.1  mrg   emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
    171  1.1  mrg 
    172  1.1  mrg   emit_move_insn (hard_frame_pointer_rtx, r_fp);
    173  1.1  mrg   emit_stack_restore (SAVE_NONLOCAL, r_sp, NULL_RTX);
    174  1.1  mrg 
    175  1.1  mrg   emit_use (hard_frame_pointer_rtx);
    176  1.1  mrg   emit_use (stack_pointer_rtx);
    177  1.1  mrg 
    178  1.1  mrg   emit_indirect_jump (r_label);
    179  1.1  mrg  
    180  1.1  mrg   DONE;
    181  1.1  mrg })
    182  1.1  mrg 
    183  1.1  mrg 
    184  1.1  mrg (define_insn "*pushqi"
    185  1.1  mrg   [(set (mem:QI (post_dec (reg:HI REG_SP)))
    186  1.1  mrg         (match_operand:QI 0 "reg_or_0_operand" "r,L"))]
    187  1.1  mrg   ""
    188  1.1  mrg   "@
    189  1.1  mrg 	push %0
    190  1.1  mrg 	push __zero_reg__"
    191  1.1  mrg   [(set_attr "length" "1,1")])
    192  1.1  mrg 
    193  1.1  mrg 
    194  1.1  mrg (define_insn "*pushhi"
    195  1.1  mrg   [(set (mem:HI (post_dec (reg:HI REG_SP)))
    196  1.1  mrg         (match_operand:HI 0 "reg_or_0_operand" "r,L"))]
    197  1.1  mrg   ""
    198  1.1  mrg   "@
    199  1.1  mrg 	push %B0\;push %A0
    200  1.1  mrg 	push __zero_reg__\;push __zero_reg__"
    201  1.1  mrg   [(set_attr "length" "2,2")])
    202  1.1  mrg 
    203  1.1  mrg (define_insn "*pushsi"
    204  1.1  mrg   [(set (mem:SI (post_dec (reg:HI REG_SP)))
    205  1.1  mrg         (match_operand:SI 0 "reg_or_0_operand" "r,L"))]
    206  1.1  mrg   ""
    207  1.1  mrg   "@
    208  1.1  mrg 	push %D0\;push %C0\;push %B0\;push %A0
    209  1.1  mrg 	push __zero_reg__\;push __zero_reg__\;push __zero_reg__\;push __zero_reg__"
    210  1.1  mrg   [(set_attr "length" "4,4")])
    211  1.1  mrg 
    212  1.1  mrg (define_insn "*pushsf"
    213  1.1  mrg   [(set (mem:SF (post_dec (reg:HI REG_SP)))
    214  1.1  mrg         (match_operand:SF 0 "register_operand" "r"))]
    215  1.1  mrg   ""
    216  1.1  mrg   "push %D0
    217  1.1  mrg 	push %C0
    218  1.1  mrg 	push %B0
    219  1.1  mrg 	push %A0"
    220  1.1  mrg   [(set_attr "length" "4")])
    221  1.1  mrg 
    222  1.1  mrg ;;========================================================================
    223  1.1  mrg ;; move byte
    224  1.1  mrg ;; The last alternative (any immediate constant to any register) is
    225  1.1  mrg ;; very expensive.  It should be optimized by peephole2 if a scratch
    226  1.1  mrg ;; register is available, but then that register could just as well be
    227  1.1  mrg ;; allocated for the variable we are loading.  But, most of NO_LD_REGS
    228  1.1  mrg ;; are call-saved registers, and most of LD_REGS are call-used registers,
    229  1.1  mrg ;; so this may still be a win for registers live across function calls.
    230  1.1  mrg 
    231  1.1  mrg (define_expand "movqi"
    232  1.1  mrg   [(set (match_operand:QI 0 "nonimmediate_operand" "")
    233  1.1  mrg 	(match_operand:QI 1 "general_operand" ""))]
    234  1.1  mrg   ""
    235  1.1  mrg   "/* One of the ops has to be in a register.  */
    236  1.1  mrg    if (!register_operand(operand0, QImode)
    237  1.1  mrg        && ! (register_operand(operand1, QImode) || const0_rtx == operand1))
    238  1.1  mrg        operands[1] = copy_to_mode_reg(QImode, operand1);
    239  1.1  mrg   ")
    240  1.1  mrg 
    241  1.1  mrg (define_insn "*movqi"
    242  1.1  mrg   [(set (match_operand:QI 0 "nonimmediate_operand" "=r,d,Qm,r,q,r,*r")
    243  1.1  mrg 	(match_operand:QI 1 "general_operand"       "rL,i,rL,Qm,r,q,i"))]
    244  1.1  mrg   "(register_operand (operands[0],QImode)
    245  1.1  mrg     || register_operand (operands[1], QImode) || const0_rtx == operands[1])"
    246  1.1  mrg   "* return output_movqi (insn, operands, NULL);"
    247  1.1  mrg   [(set_attr "length" "1,1,5,5,1,1,4")
    248  1.1  mrg    (set_attr "cc" "none,none,clobber,clobber,none,none,clobber")])
    249  1.1  mrg 
    250  1.1  mrg ;; This is used in peephole2 to optimize loading immediate constants
    251  1.1  mrg ;; if a scratch register from LD_REGS happens to be available.
    252  1.1  mrg 
    253  1.1  mrg (define_insn "*reload_inqi"
    254  1.1  mrg   [(set (match_operand:QI 0 "register_operand" "=l")
    255  1.1  mrg 	(match_operand:QI 1 "immediate_operand" "i"))
    256  1.1  mrg    (clobber (match_operand:QI 2 "register_operand" "=&d"))]
    257  1.1  mrg   "reload_completed"
    258  1.1  mrg   "ldi %2,lo8(%1)
    259  1.1  mrg 	mov %0,%2"
    260  1.1  mrg   [(set_attr "length" "2")
    261  1.1  mrg    (set_attr "cc" "none")])
    262  1.1  mrg 
    263  1.1  mrg (define_peephole2
    264  1.1  mrg   [(match_scratch:QI 2 "d")
    265  1.1  mrg    (set (match_operand:QI 0 "l_register_operand" "")
    266  1.1  mrg 	(match_operand:QI 1 "immediate_operand" ""))]
    267  1.1  mrg   "(operands[1] != const0_rtx
    268  1.1  mrg     && operands[1] != const1_rtx
    269  1.1  mrg     && operands[1] != constm1_rtx)"
    270  1.1  mrg   [(parallel [(set (match_dup 0) (match_dup 1))
    271  1.1  mrg 	      (clobber (match_dup 2))])]
    272  1.1  mrg   "")
    273  1.1  mrg 
    274  1.1  mrg ;;============================================================================
    275  1.1  mrg ;; move word (16 bit)
    276  1.1  mrg 
    277  1.1  mrg (define_expand "movhi"
    278  1.1  mrg   [(set (match_operand:HI 0 "nonimmediate_operand" "")
    279  1.1  mrg         (match_operand:HI 1 "general_operand"       ""))]
    280  1.1  mrg   ""
    281  1.1  mrg   "
    282  1.1  mrg {
    283  1.1  mrg    /* One of the ops has to be in a register.  */
    284  1.1  mrg   if (!register_operand(operand0, HImode)
    285  1.1  mrg       && !(register_operand(operand1, HImode) || const0_rtx == operands[1]))
    286  1.1  mrg     {
    287  1.1  mrg       operands[1] = copy_to_mode_reg(HImode, operand1);
    288  1.1  mrg     }
    289  1.1  mrg }")
    290  1.1  mrg 
    291  1.1  mrg (define_insn "*movhi_sp"
    292  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=q,r")
    293  1.1  mrg         (match_operand:HI 1 "register_operand"  "r,q"))]
    294  1.1  mrg   "((stack_register_operand(operands[0], HImode) && register_operand (operands[1], HImode))
    295  1.1  mrg     || (register_operand (operands[0], HImode) && stack_register_operand(operands[1], HImode)))"
    296  1.1  mrg   "* return output_movhi (insn, operands, NULL);"
    297  1.1  mrg   [(set_attr "length" "5,2")
    298  1.1  mrg    (set_attr "cc" "none,none")])
    299  1.1  mrg 
    300  1.1  mrg (define_insn "movhi_sp_r_irq_off"
    301  1.1  mrg   [(set (match_operand:HI 0 "stack_register_operand" "=q")
    302  1.1  mrg         (unspec_volatile:HI [(match_operand:HI 1 "register_operand"  "r")] 
    303  1.1  mrg 			    UNSPECV_WRITE_SP_IRQ_OFF))]
    304  1.1  mrg   ""
    305  1.1  mrg   "out __SP_H__, %B1
    306  1.1  mrg 	out __SP_L__, %A1"
    307  1.1  mrg   [(set_attr "length" "2")
    308  1.1  mrg    (set_attr "cc" "none")])
    309  1.1  mrg 
    310  1.1  mrg (define_insn "movhi_sp_r_irq_on"
    311  1.1  mrg   [(set (match_operand:HI 0 "stack_register_operand" "=q")
    312  1.1  mrg         (unspec_volatile:HI [(match_operand:HI 1 "register_operand"  "r")] 
    313  1.1  mrg 			    UNSPECV_WRITE_SP_IRQ_ON))]
    314  1.1  mrg   ""
    315  1.1  mrg   "cli
    316  1.1  mrg         out __SP_H__, %B1
    317  1.1  mrg 	sei
    318  1.1  mrg 	out __SP_L__, %A1"
    319  1.1  mrg   [(set_attr "length" "4")
    320  1.1  mrg    (set_attr "cc" "none")])
    321  1.1  mrg 
    322  1.1  mrg (define_peephole2
    323  1.1  mrg   [(match_scratch:QI 2 "d")
    324  1.1  mrg    (set (match_operand:HI 0 "l_register_operand" "")
    325  1.1  mrg         (match_operand:HI 1 "immediate_operand" ""))]
    326  1.1  mrg   "(operands[1] != const0_rtx 
    327  1.1  mrg     && operands[1] != constm1_rtx)"
    328  1.1  mrg   [(parallel [(set (match_dup 0) (match_dup 1))
    329  1.1  mrg 	      (clobber (match_dup 2))])]
    330  1.1  mrg   "")
    331  1.1  mrg 
    332  1.1  mrg ;; '*' because it is not used in rtl generation, only in above peephole
    333  1.1  mrg (define_insn "*reload_inhi"
    334  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=r")
    335  1.1  mrg         (match_operand:HI 1 "immediate_operand" "i"))
    336  1.1  mrg    (clobber (match_operand:QI 2 "register_operand" "=&d"))]
    337  1.1  mrg   "reload_completed"
    338  1.1  mrg   "* return output_reload_inhi (insn, operands, NULL);"
    339  1.1  mrg   [(set_attr "length" "4")
    340  1.1  mrg    (set_attr "cc" "none")])
    341  1.1  mrg 
    342  1.1  mrg (define_insn "*movhi"
    343  1.1  mrg   [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,m,d,*r,q,r")
    344  1.1  mrg         (match_operand:HI 1 "general_operand"       "rL,m,rL,i,i,r,q"))]
    345  1.1  mrg   "(register_operand (operands[0],HImode)
    346  1.1  mrg     || register_operand (operands[1],HImode) || const0_rtx == operands[1])"
    347  1.1  mrg   "* return output_movhi (insn, operands, NULL);"
    348  1.1  mrg   [(set_attr "length" "2,6,7,2,6,5,2")
    349  1.1  mrg    (set_attr "cc" "none,clobber,clobber,none,clobber,none,none")])
    350  1.1  mrg 
    351  1.1  mrg (define_peephole2 ; movw
    352  1.1  mrg   [(set (match_operand:QI 0 "even_register_operand" "")
    353  1.1  mrg         (match_operand:QI 1 "even_register_operand" ""))
    354  1.1  mrg    (set (match_operand:QI 2 "odd_register_operand" "")
    355  1.1  mrg         (match_operand:QI 3 "odd_register_operand" ""))]
    356  1.1  mrg   "(AVR_HAVE_MOVW
    357  1.1  mrg     && REGNO (operands[0]) == REGNO (operands[2]) - 1
    358  1.1  mrg     && REGNO (operands[1]) == REGNO (operands[3]) - 1)"
    359  1.1  mrg   [(set (match_dup 4) (match_dup 5))]
    360  1.1  mrg   {
    361  1.1  mrg     operands[4] = gen_rtx_REG (HImode, REGNO (operands[0]));
    362  1.1  mrg     operands[5] = gen_rtx_REG (HImode, REGNO (operands[1]));
    363  1.1  mrg   })
    364  1.1  mrg 
    365  1.1  mrg (define_peephole2 ; movw_r
    366  1.1  mrg   [(set (match_operand:QI 0 "odd_register_operand" "")
    367  1.1  mrg         (match_operand:QI 1 "odd_register_operand" ""))
    368  1.1  mrg    (set (match_operand:QI 2 "even_register_operand" "")
    369  1.1  mrg         (match_operand:QI 3 "even_register_operand" ""))]
    370  1.1  mrg   "(AVR_HAVE_MOVW
    371  1.1  mrg     && REGNO (operands[2]) == REGNO (operands[0]) - 1
    372  1.1  mrg     && REGNO (operands[3]) == REGNO (operands[1]) - 1)"
    373  1.1  mrg   [(set (match_dup 4) (match_dup 5))]
    374  1.1  mrg   {
    375  1.1  mrg     operands[4] = gen_rtx_REG (HImode, REGNO (operands[2]));
    376  1.1  mrg     operands[5] = gen_rtx_REG (HImode, REGNO (operands[3]));
    377  1.1  mrg   })
    378  1.1  mrg 
    379  1.1  mrg ;;==========================================================================
    380  1.1  mrg ;; move double word (32 bit)
    381  1.1  mrg 
    382  1.1  mrg (define_expand "movsi"
    383  1.1  mrg   [(set (match_operand:SI 0 "nonimmediate_operand" "")
    384  1.1  mrg         (match_operand:SI 1 "general_operand"  ""))]
    385  1.1  mrg   ""
    386  1.1  mrg   "
    387  1.1  mrg {
    388  1.1  mrg   /* One of the ops has to be in a register.  */
    389  1.1  mrg   if (!register_operand (operand0, SImode)
    390  1.1  mrg       && !(register_operand (operand1, SImode) || const0_rtx == operand1))
    391  1.1  mrg     {
    392  1.1  mrg       operands[1] = copy_to_mode_reg (SImode, operand1);
    393  1.1  mrg     }
    394  1.1  mrg }")
    395  1.1  mrg 
    396  1.1  mrg 
    397  1.1  mrg 
    398  1.1  mrg (define_peephole2 ; movsi_lreg_const
    399  1.1  mrg   [(match_scratch:QI 2 "d")
    400  1.1  mrg    (set (match_operand:SI 0 "l_register_operand" "")
    401  1.1  mrg         (match_operand:SI 1 "immediate_operand" ""))
    402  1.1  mrg    (match_dup 2)]
    403  1.1  mrg   "(operands[1] != const0_rtx
    404  1.1  mrg     && operands[1] != constm1_rtx)"
    405  1.1  mrg   [(parallel [(set (match_dup 0) (match_dup 1))
    406  1.1  mrg 	      (clobber (match_dup 2))])]
    407  1.1  mrg   "")
    408  1.1  mrg 
    409  1.1  mrg ;; '*' because it is not used in rtl generation.
    410  1.1  mrg (define_insn "*reload_insi"
    411  1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=r")
    412  1.1  mrg         (match_operand:SI 1 "immediate_operand" "i"))
    413  1.1  mrg    (clobber (match_operand:QI 2 "register_operand" "=&d"))]
    414  1.1  mrg   "reload_completed"
    415  1.1  mrg   "* return output_reload_insisf (insn, operands, NULL);"
    416  1.1  mrg   [(set_attr "length" "8")
    417  1.1  mrg    (set_attr "cc" "none")])
    418  1.1  mrg 
    419  1.1  mrg 
    420  1.1  mrg (define_insn "*movsi"
    421  1.1  mrg   [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,Qm,!d,r")
    422  1.1  mrg         (match_operand:SI 1 "general_operand"       "r,L,Qm,rL,i,i"))]
    423  1.1  mrg   "(register_operand (operands[0],SImode)
    424  1.1  mrg     || register_operand (operands[1],SImode) || const0_rtx == operands[1])"
    425  1.1  mrg   "* return output_movsisf (insn, operands, NULL);"
    426  1.1  mrg   [(set_attr "length" "4,4,8,9,4,10")
    427  1.1  mrg    (set_attr "cc" "none,set_zn,clobber,clobber,none,clobber")])
    428  1.1  mrg 
    429  1.1  mrg ;; fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    430  1.1  mrg ;; move floating point numbers (32 bit)
    431  1.1  mrg 
    432  1.1  mrg (define_expand "movsf"
    433  1.1  mrg   [(set (match_operand:SF 0 "nonimmediate_operand" "")
    434  1.1  mrg         (match_operand:SF 1 "general_operand"  ""))]
    435  1.1  mrg   ""
    436  1.1  mrg   "
    437  1.1  mrg {
    438  1.1  mrg   /* One of the ops has to be in a register.  */
    439  1.1  mrg   if (!register_operand (operand1, SFmode)
    440  1.1  mrg       && !register_operand (operand0, SFmode))
    441  1.1  mrg     {
    442  1.1  mrg       operands[1] = copy_to_mode_reg (SFmode, operand1);
    443  1.1  mrg     }
    444  1.1  mrg }")
    445  1.1  mrg 
    446  1.1  mrg (define_insn "*movsf"
    447  1.1  mrg   [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,r,Qm,!d,r")
    448  1.1  mrg         (match_operand:SF 1 "general_operand"       "r,G,Qm,r,F,F"))]
    449  1.1  mrg   "register_operand (operands[0], SFmode)
    450  1.1  mrg    || register_operand (operands[1], SFmode)"
    451  1.1  mrg   "* return output_movsisf (insn, operands, NULL);"
    452  1.1  mrg   [(set_attr "length" "4,4,8,9,4,10")
    453  1.1  mrg    (set_attr "cc" "none,set_zn,clobber,clobber,none,clobber")])
    454  1.1  mrg 
    455  1.1  mrg ;;=========================================================================
    456  1.1  mrg ;; move string (like memcpy)
    457  1.1  mrg ;; implement as RTL loop
    458  1.1  mrg 
    459  1.1  mrg (define_expand "movmemhi"
    460  1.1  mrg   [(parallel [(set (match_operand:BLK 0 "memory_operand" "")
    461  1.1  mrg           (match_operand:BLK 1 "memory_operand" ""))
    462  1.1  mrg           (use (match_operand:HI 2 "const_int_operand" ""))
    463  1.1  mrg           (use (match_operand:HI 3 "const_int_operand" ""))])]
    464  1.1  mrg   ""
    465  1.1  mrg   "{
    466  1.1  mrg   int prob;
    467  1.1  mrg   HOST_WIDE_INT count;
    468  1.1  mrg   enum machine_mode mode;
    469  1.1  mrg   rtx label = gen_label_rtx ();
    470  1.1  mrg   rtx loop_reg;
    471  1.1  mrg   rtx jump;
    472  1.1  mrg 
    473  1.1  mrg   /* Copy pointers into new psuedos - they will be changed.  */
    474  1.1  mrg   rtx addr0 = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
    475  1.1  mrg   rtx addr1 = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
    476  1.1  mrg 
    477  1.1  mrg   /* Create rtx for tmp register - we use this as scratch.  */
    478  1.1  mrg   rtx tmp_reg_rtx  = gen_rtx_REG (QImode, TMP_REGNO);
    479  1.1  mrg 
    480  1.1  mrg   if (GET_CODE (operands[2]) != CONST_INT)
    481  1.1  mrg     FAIL;
    482  1.1  mrg 
    483  1.1  mrg   count = INTVAL (operands[2]);
    484  1.1  mrg   if (count <= 0)
    485  1.1  mrg     FAIL;
    486  1.1  mrg 
    487  1.1  mrg   /* Work out branch probability for latter use.  */
    488  1.1  mrg   prob = REG_BR_PROB_BASE - REG_BR_PROB_BASE / count;
    489  1.1  mrg 
    490  1.1  mrg   /* See if constant fit 8 bits.  */
    491  1.1  mrg   mode = (count < 0x100) ? QImode : HImode;
    492  1.1  mrg   /* Create loop counter register.  */
    493  1.1  mrg   loop_reg = copy_to_mode_reg (mode, gen_int_mode (count, mode));
    494  1.1  mrg 
    495  1.1  mrg   /* Now create RTL code for move loop.  */
    496  1.1  mrg   /* Label at top of loop.  */
    497  1.1  mrg   emit_label (label);
    498  1.1  mrg 
    499  1.1  mrg   /* Move one byte into scratch and inc pointer.  */
    500  1.1  mrg   emit_move_insn (tmp_reg_rtx, gen_rtx_MEM (QImode, addr1));
    501  1.1  mrg   emit_move_insn (addr1, gen_rtx_PLUS (Pmode, addr1, const1_rtx));
    502  1.1  mrg 
    503  1.1  mrg   /* Move to mem and inc pointer.  */
    504  1.1  mrg   emit_move_insn (gen_rtx_MEM (QImode, addr0), tmp_reg_rtx);
    505  1.1  mrg   emit_move_insn (addr0, gen_rtx_PLUS (Pmode, addr0, const1_rtx));
    506  1.1  mrg 
    507  1.1  mrg   /* Decrement count.  */
    508  1.1  mrg   emit_move_insn (loop_reg, gen_rtx_PLUS (mode, loop_reg, constm1_rtx));
    509  1.1  mrg 
    510  1.1  mrg   /* Compare with zero and jump if not equal. */
    511  1.1  mrg   emit_cmp_and_jump_insns (loop_reg, const0_rtx, NE, NULL_RTX, mode, 1,
    512  1.1  mrg                            label);
    513  1.1  mrg   /* Set jump probability based on loop count.  */
    514  1.1  mrg   jump = get_last_insn ();
    515  1.1  mrg   add_reg_note (jump, REG_BR_PROB, GEN_INT (prob));
    516  1.1  mrg   DONE;
    517  1.1  mrg }")
    518  1.1  mrg 
    519  1.1  mrg ;; =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2
    520  1.1  mrg ;; memset (%0, %2, %1)
    521  1.1  mrg 
    522  1.1  mrg (define_expand "setmemhi"
    523  1.1  mrg   [(parallel [(set (match_operand:BLK 0 "memory_operand" "")
    524  1.1  mrg  		   (match_operand 2 "const_int_operand" ""))
    525  1.1  mrg 	      (use (match_operand:HI 1 "const_int_operand" ""))
    526  1.1  mrg 	      (use (match_operand:HI 3 "const_int_operand" "n"))
    527  1.1  mrg 	      (clobber (match_scratch:HI 4 ""))
    528  1.1  mrg 	      (clobber (match_dup 5))])]
    529  1.1  mrg   ""
    530  1.1  mrg   "{
    531  1.1  mrg   rtx addr0;
    532  1.1  mrg   int cnt8;
    533  1.1  mrg   enum machine_mode mode;
    534  1.1  mrg 
    535  1.1  mrg   /* If value to set is not zero, use the library routine.  */
    536  1.1  mrg   if (operands[2] != const0_rtx)
    537  1.1  mrg     FAIL;
    538  1.1  mrg 
    539  1.1  mrg   if (GET_CODE (operands[1]) != CONST_INT)
    540  1.1  mrg     FAIL;
    541  1.1  mrg 
    542  1.1  mrg   cnt8 = byte_immediate_operand (operands[1], GET_MODE (operands[1]));
    543  1.1  mrg   mode = cnt8 ? QImode : HImode;
    544  1.1  mrg   operands[5] = gen_rtx_SCRATCH (mode);
    545  1.1  mrg   operands[1] = copy_to_mode_reg (mode,
    546  1.1  mrg                                   gen_int_mode (INTVAL (operands[1]), mode));
    547  1.1  mrg   addr0 = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
    548  1.1  mrg   operands[0] = gen_rtx_MEM (BLKmode, addr0);
    549  1.1  mrg }")
    550  1.1  mrg 
    551  1.1  mrg (define_insn "*clrmemqi"
    552  1.1  mrg   [(set (mem:BLK (match_operand:HI 0 "register_operand" "e"))
    553  1.1  mrg 	(const_int 0))
    554  1.1  mrg    (use (match_operand:QI 1 "register_operand" "r"))
    555  1.1  mrg    (use (match_operand:QI 2 "const_int_operand" "n"))
    556  1.1  mrg    (clobber (match_scratch:HI 3 "=0"))
    557  1.1  mrg    (clobber (match_scratch:QI 4 "=&1"))]
    558  1.1  mrg   ""
    559  1.1  mrg   "st %a0+,__zero_reg__
    560  1.1  mrg         dec %1
    561  1.1  mrg 	brne .-6"
    562  1.1  mrg   [(set_attr "length" "3")
    563  1.1  mrg    (set_attr "cc" "clobber")])
    564  1.1  mrg 
    565  1.1  mrg (define_insn "*clrmemhi"
    566  1.1  mrg   [(set (mem:BLK (match_operand:HI 0 "register_operand" "e,e"))
    567  1.1  mrg 	(const_int 0))
    568  1.1  mrg    (use (match_operand:HI 1 "register_operand" "!w,d"))
    569  1.1  mrg    (use (match_operand:HI 2 "const_int_operand" "n,n"))
    570  1.1  mrg    (clobber (match_scratch:HI 3 "=0,0"))
    571  1.1  mrg    (clobber (match_scratch:HI 4 "=&1,&1"))]
    572  1.1  mrg   ""
    573  1.1  mrg   "*{
    574  1.1  mrg      if (which_alternative==0)
    575  1.1  mrg        return (AS2 (st,%a0+,__zero_reg__) CR_TAB
    576  1.1  mrg 	       AS2 (sbiw,%A1,1) CR_TAB
    577  1.1  mrg 	       AS1 (brne,.-6));
    578  1.1  mrg      else
    579  1.1  mrg        return (AS2 (st,%a0+,__zero_reg__) CR_TAB
    580  1.1  mrg 	       AS2 (subi,%A1,1) CR_TAB
    581  1.1  mrg 	       AS2 (sbci,%B1,0) CR_TAB
    582  1.1  mrg 	       AS1 (brne,.-8));
    583  1.1  mrg }"
    584  1.1  mrg   [(set_attr "length" "3,4")
    585  1.1  mrg    (set_attr "cc" "clobber,clobber")])
    586  1.1  mrg 
    587  1.1  mrg (define_expand "strlenhi"
    588  1.1  mrg     [(set (match_dup 4)
    589  1.1  mrg 	  (unspec:HI [(match_operand:BLK 1 "memory_operand" "")
    590  1.1  mrg 		      (match_operand:QI 2 "const_int_operand" "")
    591  1.1  mrg 		      (match_operand:HI 3 "immediate_operand" "")]
    592  1.1  mrg 		     UNSPEC_STRLEN))
    593  1.1  mrg      (set (match_dup 4) (plus:HI (match_dup 4)
    594  1.1  mrg 				 (const_int -1)))
    595  1.1  mrg      (set (match_operand:HI 0 "register_operand" "")
    596  1.1  mrg 	  (minus:HI (match_dup 4)
    597  1.1  mrg 		    (match_dup 5)))]
    598  1.1  mrg    ""
    599  1.1  mrg    "{
    600  1.1  mrg   rtx addr;
    601  1.1  mrg   if (! (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 0))
    602  1.1  mrg     FAIL;
    603  1.1  mrg   addr = copy_to_mode_reg (Pmode, XEXP (operands[1],0));
    604  1.1  mrg   operands[1] = gen_rtx_MEM (BLKmode, addr); 
    605  1.1  mrg   operands[5] = addr;
    606  1.1  mrg   operands[4] = gen_reg_rtx (HImode);
    607  1.1  mrg }")
    608  1.1  mrg 
    609  1.1  mrg (define_insn "*strlenhi"
    610  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=e")
    611  1.1  mrg 	(unspec:HI [(mem:BLK (match_operand:HI 1 "register_operand" "%0"))
    612  1.1  mrg 		    (const_int 0)
    613  1.1  mrg 		    (match_operand:HI 2 "immediate_operand" "i")]
    614  1.1  mrg 		   UNSPEC_STRLEN))]
    615  1.1  mrg   ""
    616  1.1  mrg   "ld __tmp_reg__,%a0+
    617  1.1  mrg 	tst __tmp_reg__
    618  1.1  mrg 	brne .-6"
    619  1.1  mrg   [(set_attr "length" "3")
    620  1.1  mrg    (set_attr "cc" "clobber")])
    621  1.1  mrg 
    622  1.1  mrg ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    623  1.1  mrg ; add bytes
    624  1.1  mrg 
    625  1.1  mrg (define_insn "addqi3"
    626  1.1  mrg   [(set (match_operand:QI 0 "register_operand" "=r,d,r,r")
    627  1.1  mrg         (plus:QI (match_operand:QI 1 "register_operand" "%0,0,0,0")
    628  1.1  mrg                  (match_operand:QI 2 "nonmemory_operand" "r,i,P,N")))]
    629  1.1  mrg   ""
    630  1.1  mrg   "@
    631  1.1  mrg 	add %0,%2
    632  1.1  mrg 	subi %0,lo8(-(%2))
    633  1.1  mrg 	inc %0
    634  1.1  mrg 	dec %0"
    635  1.1  mrg   [(set_attr "length" "1,1,1,1")
    636  1.1  mrg    (set_attr "cc" "set_czn,set_czn,set_zn,set_zn")])
    637  1.1  mrg 
    638  1.1  mrg 
    639  1.1  mrg (define_expand "addhi3"
    640  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "")
    641  1.1  mrg 	(plus:HI (match_operand:HI 1 "register_operand" "")
    642  1.1  mrg 		 (match_operand:HI 2 "nonmemory_operand" "")))]
    643  1.1  mrg   ""
    644  1.1  mrg   "
    645  1.1  mrg {
    646  1.1  mrg   if (GET_CODE (operands[2]) == CONST_INT)
    647  1.1  mrg     {
    648  1.1  mrg       short tmp = INTVAL (operands[2]);
    649  1.1  mrg       operands[2] = GEN_INT(tmp);
    650  1.1  mrg     }
    651  1.1  mrg }")
    652  1.1  mrg 
    653  1.1  mrg 
    654  1.1  mrg (define_insn "*addhi3_zero_extend"
    655  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=r")
    656  1.1  mrg 	(plus:HI (zero_extend:HI
    657  1.1  mrg 		  (match_operand:QI 1 "register_operand" "r"))
    658  1.1  mrg 		 (match_operand:HI 2 "register_operand" "0")))]
    659  1.1  mrg   ""
    660  1.1  mrg   "add %A0,%1
    661  1.1  mrg 	adc %B0,__zero_reg__"
    662  1.1  mrg   [(set_attr "length" "2")
    663  1.1  mrg    (set_attr "cc" "set_n")])
    664  1.1  mrg 
    665  1.1  mrg (define_insn "*addhi3_zero_extend1"
    666  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=r")
    667  1.1  mrg 	(plus:HI (match_operand:HI 1 "register_operand" "%0")
    668  1.1  mrg 		 (zero_extend:HI
    669  1.1  mrg 		  (match_operand:QI 2 "register_operand" "r"))))]
    670  1.1  mrg   ""
    671  1.1  mrg   "add %A0,%2
    672  1.1  mrg 	adc %B0,__zero_reg__"
    673  1.1  mrg   [(set_attr "length" "2")
    674  1.1  mrg    (set_attr "cc" "set_n")])
    675  1.1  mrg 
    676  1.1  mrg (define_insn "*addhi3_sp_R_pc2"
    677  1.1  mrg   [(set (match_operand:HI 1 "stack_register_operand" "=q")
    678  1.1  mrg         (plus:HI (match_operand:HI 2 "stack_register_operand" "q")
    679  1.1  mrg                  (match_operand:HI 0 "avr_sp_immediate_operand" "R")))]
    680  1.1  mrg   "AVR_2_BYTE_PC"
    681  1.1  mrg   "*{
    682  1.1  mrg       if (CONST_INT_P (operands[0]))
    683  1.1  mrg         {
    684  1.1  mrg 	  switch(INTVAL (operands[0]))
    685  1.1  mrg 	    {
    686  1.1  mrg 	    case -6: 
    687  1.1  mrg 	      return \"rcall .\" CR_TAB 
    688  1.1  mrg 	             \"rcall .\" CR_TAB 
    689  1.1  mrg 		     \"rcall .\";
    690  1.1  mrg 	    case -5: 
    691  1.1  mrg 	      return \"rcall .\" CR_TAB 
    692  1.1  mrg 	             \"rcall .\" CR_TAB 
    693  1.1  mrg 		     \"push __tmp_reg__\";
    694  1.1  mrg 	    case -4: 
    695  1.1  mrg 	      return \"rcall .\" CR_TAB 
    696  1.1  mrg 	             \"rcall .\";
    697  1.1  mrg 	    case -3: 
    698  1.1  mrg 	      return \"rcall .\" CR_TAB 
    699  1.1  mrg 	             \"push __tmp_reg__\";
    700  1.1  mrg 	    case -2: 
    701  1.1  mrg 	      return \"rcall .\";
    702  1.1  mrg 	    case -1: 
    703  1.1  mrg 	      return \"push __tmp_reg__\";
    704  1.1  mrg 	    case 0: 
    705  1.1  mrg 	      return \"\";
    706  1.1  mrg 	    case 1: 
    707  1.1  mrg 	      return \"pop __tmp_reg__\";
    708  1.1  mrg 	    case 2: 
    709  1.1  mrg 	      return \"pop __tmp_reg__\" CR_TAB 
    710  1.1  mrg 	             \"pop __tmp_reg__\";
    711  1.1  mrg 	    case 3: 
    712  1.1  mrg 	      return \"pop __tmp_reg__\" CR_TAB 
    713  1.1  mrg 	             \"pop __tmp_reg__\" CR_TAB 
    714  1.1  mrg 		     \"pop __tmp_reg__\";
    715  1.1  mrg 	    case 4: 
    716  1.1  mrg 	      return \"pop __tmp_reg__\" CR_TAB 
    717  1.1  mrg 	             \"pop __tmp_reg__\" CR_TAB 
    718  1.1  mrg 		     \"pop __tmp_reg__\" CR_TAB 
    719  1.1  mrg 		     \"pop __tmp_reg__\";
    720  1.1  mrg 	    case 5: 
    721  1.1  mrg 	      return \"pop __tmp_reg__\" CR_TAB 
    722  1.1  mrg 	             \"pop __tmp_reg__\" CR_TAB 
    723  1.1  mrg 		     \"pop __tmp_reg__\" CR_TAB 
    724  1.1  mrg 		     \"pop __tmp_reg__\" CR_TAB 
    725  1.1  mrg 		     \"pop __tmp_reg__\";
    726  1.1  mrg 	    }
    727  1.1  mrg         }
    728  1.1  mrg       return \"bug\";
    729  1.1  mrg     }"
    730  1.1  mrg   [(set (attr "length") 
    731  1.1  mrg         (cond [(eq (const_int -6) (symbol_ref "INTVAL (operands[0])")) (const_int 3)
    732  1.1  mrg                (eq (const_int -5) (symbol_ref "INTVAL (operands[0])")) (const_int 3)
    733  1.1  mrg                (eq (const_int -4) (symbol_ref "INTVAL (operands[0])")) (const_int 2)
    734  1.1  mrg                (eq (const_int -3) (symbol_ref "INTVAL (operands[0])")) (const_int 2)
    735  1.1  mrg                (eq (const_int -2) (symbol_ref "INTVAL (operands[0])")) (const_int 1)
    736  1.1  mrg                (eq (const_int -1) (symbol_ref "INTVAL (operands[0])")) (const_int 1)
    737  1.1  mrg                (eq (const_int  0) (symbol_ref "INTVAL (operands[0])")) (const_int 0)
    738  1.1  mrg                (eq (const_int  1) (symbol_ref "INTVAL (operands[0])")) (const_int 1)
    739  1.1  mrg                (eq (const_int  2) (symbol_ref "INTVAL (operands[0])")) (const_int 2)
    740  1.1  mrg                (eq (const_int  3) (symbol_ref "INTVAL (operands[0])")) (const_int 3)
    741  1.1  mrg                (eq (const_int  4) (symbol_ref "INTVAL (operands[0])")) (const_int 4)
    742  1.1  mrg                (eq (const_int  5) (symbol_ref "INTVAL (operands[0])")) (const_int 5)]
    743  1.1  mrg                (const_int 0)))])
    744  1.1  mrg 
    745  1.1  mrg (define_insn "*addhi3_sp_R_pc3"
    746  1.1  mrg   [(set (match_operand:HI 1 "stack_register_operand" "=q")
    747  1.1  mrg         (plus:HI (match_operand:HI 2 "stack_register_operand" "q")
    748  1.1  mrg                  (match_operand:QI 0 "avr_sp_immediate_operand" "R")))]
    749  1.1  mrg   "AVR_3_BYTE_PC"
    750  1.1  mrg   "*{
    751  1.1  mrg       if (CONST_INT_P (operands[0]))
    752  1.1  mrg         {
    753  1.1  mrg 	  switch(INTVAL (operands[0]))
    754  1.1  mrg 	    {
    755  1.1  mrg 	    case -6: 
    756  1.1  mrg 	      return \"rcall .\" CR_TAB 
    757  1.1  mrg 		     \"rcall .\";
    758  1.1  mrg 	    case -5: 
    759  1.1  mrg 	      return \"rcall .\" CR_TAB 
    760  1.1  mrg 	             \"push __tmp_reg__\" CR_TAB 
    761  1.1  mrg 		     \"push __tmp_reg__\";
    762  1.1  mrg 	    case -4: 
    763  1.1  mrg 	      return \"rcall .\" CR_TAB 
    764  1.1  mrg 	             \"push __tmp_reg__\";
    765  1.1  mrg 	    case -3: 
    766  1.1  mrg 	      return \"rcall .\";
    767  1.1  mrg 	    case -2: 
    768  1.1  mrg 	      return \"push __tmp_reg__\" CR_TAB 
    769  1.1  mrg 		     \"push __tmp_reg__\";
    770  1.1  mrg 	    case -1: 
    771  1.1  mrg 	      return \"push __tmp_reg__\";
    772  1.1  mrg 	    case 0: 
    773  1.1  mrg 	      return \"\";
    774  1.1  mrg 	    case 1: 
    775  1.1  mrg 	      return \"pop __tmp_reg__\";
    776  1.1  mrg 	    case 2: 
    777  1.1  mrg 	      return \"pop __tmp_reg__\" CR_TAB 
    778  1.1  mrg 	             \"pop __tmp_reg__\";
    779  1.1  mrg 	    case 3: 
    780  1.1  mrg 	      return \"pop __tmp_reg__\" CR_TAB 
    781  1.1  mrg 	             \"pop __tmp_reg__\" CR_TAB 
    782  1.1  mrg 		     \"pop __tmp_reg__\";
    783  1.1  mrg 	    case 4: 
    784  1.1  mrg 	      return \"pop __tmp_reg__\" CR_TAB 
    785  1.1  mrg 	             \"pop __tmp_reg__\" CR_TAB 
    786  1.1  mrg 		     \"pop __tmp_reg__\" CR_TAB 
    787  1.1  mrg 		     \"pop __tmp_reg__\";
    788  1.1  mrg 	    case 5: 
    789  1.1  mrg 	      return \"pop __tmp_reg__\" CR_TAB 
    790  1.1  mrg 	             \"pop __tmp_reg__\" CR_TAB 
    791  1.1  mrg 		     \"pop __tmp_reg__\" CR_TAB 
    792  1.1  mrg 		     \"pop __tmp_reg__\" CR_TAB 
    793  1.1  mrg 		     \"pop __tmp_reg__\";
    794  1.1  mrg 	    }
    795  1.1  mrg         }
    796  1.1  mrg       return \"bug\";
    797  1.1  mrg     }"
    798  1.1  mrg   [(set (attr "length") 
    799  1.1  mrg         (cond [(eq (const_int -6) (symbol_ref "INTVAL (operands[0])")) (const_int 2)
    800  1.1  mrg                (eq (const_int -5) (symbol_ref "INTVAL (operands[0])")) (const_int 3)
    801  1.1  mrg                (eq (const_int -4) (symbol_ref "INTVAL (operands[0])")) (const_int 2)
    802  1.1  mrg                (eq (const_int -3) (symbol_ref "INTVAL (operands[0])")) (const_int 1)
    803  1.1  mrg                (eq (const_int -2) (symbol_ref "INTVAL (operands[0])")) (const_int 2)
    804  1.1  mrg                (eq (const_int -1) (symbol_ref "INTVAL (operands[0])")) (const_int 1)
    805  1.1  mrg                (eq (const_int  0) (symbol_ref "INTVAL (operands[0])")) (const_int 0)
    806  1.1  mrg                (eq (const_int  1) (symbol_ref "INTVAL (operands[0])")) (const_int 1)
    807  1.1  mrg                (eq (const_int  2) (symbol_ref "INTVAL (operands[0])")) (const_int 2)
    808  1.1  mrg                (eq (const_int  3) (symbol_ref "INTVAL (operands[0])")) (const_int 3)
    809  1.1  mrg                (eq (const_int  4) (symbol_ref "INTVAL (operands[0])")) (const_int 4)
    810  1.1  mrg                (eq (const_int  5) (symbol_ref "INTVAL (operands[0])")) (const_int 5)]
    811  1.1  mrg                (const_int 0)))])
    812  1.1  mrg 
    813  1.1  mrg (define_insn "*addhi3"
    814  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=r,!w,!w,d,r,r")
    815  1.1  mrg  	(plus:HI
    816  1.1  mrg  	 (match_operand:HI 1 "register_operand" "%0,0,0,0,0,0")
    817  1.1  mrg  	 (match_operand:HI 2 "nonmemory_operand" "r,I,J,i,P,N")))]
    818  1.1  mrg   ""
    819  1.1  mrg   "@
    820  1.1  mrg  	add %A0,%A2\;adc %B0,%B2
    821  1.1  mrg  	adiw %A0,%2
    822  1.1  mrg  	sbiw %A0,%n2
    823  1.1  mrg  	subi %A0,lo8(-(%2))\;sbci %B0,hi8(-(%2))
    824  1.1  mrg  	sec\;adc %A0,__zero_reg__\;adc %B0,__zero_reg__
    825  1.1  mrg  	sec\;sbc %A0,__zero_reg__\;sbc %B0,__zero_reg__"
    826  1.1  mrg   [(set_attr "length" "2,1,1,2,3,3")
    827  1.1  mrg    (set_attr "cc" "set_n,set_czn,set_czn,set_czn,set_n,set_n")])
    828  1.1  mrg 
    829  1.1  mrg (define_insn "addsi3"
    830  1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=r,!w,!w,d,r,r")
    831  1.1  mrg 	  (plus:SI
    832  1.1  mrg 	   (match_operand:SI 1 "register_operand" "%0,0,0,0,0,0")
    833  1.1  mrg 	   (match_operand:SI 2 "nonmemory_operand" "r,I,J,i,P,N")))]
    834  1.1  mrg   ""
    835  1.1  mrg   "@
    836  1.1  mrg 	add %A0,%A2\;adc %B0,%B2\;adc %C0,%C2\;adc %D0,%D2
    837  1.1  mrg 	adiw %0,%2\;adc %C0,__zero_reg__\;adc %D0,__zero_reg__
    838  1.1  mrg 	sbiw %0,%n2\;sbc %C0,__zero_reg__\;sbc %D0,__zero_reg__
    839  1.1  mrg 	subi %0,lo8(-(%2))\;sbci %B0,hi8(-(%2))\;sbci %C0,hlo8(-(%2))\;sbci %D0,hhi8(-(%2))
    840  1.1  mrg 	sec\;adc %A0,__zero_reg__\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__\;adc %D0,__zero_reg__
    841  1.1  mrg 	sec\;sbc %A0,__zero_reg__\;sbc %B0,__zero_reg__\;sbc %C0,__zero_reg__\;sbc %D0,__zero_reg__"
    842  1.1  mrg   [(set_attr "length" "4,3,3,4,5,5")
    843  1.1  mrg    (set_attr "cc" "set_n,set_n,set_czn,set_czn,set_n,set_n")])
    844  1.1  mrg 
    845  1.1  mrg (define_insn "*addsi3_zero_extend"
    846  1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=r")
    847  1.1  mrg 	(plus:SI (zero_extend:SI
    848  1.1  mrg 		  (match_operand:QI 1 "register_operand" "r"))
    849  1.1  mrg 		 (match_operand:SI 2 "register_operand" "0")))]
    850  1.1  mrg   ""
    851  1.1  mrg   "add %A0,%1
    852  1.1  mrg 	adc %B0,__zero_reg__
    853  1.1  mrg 	adc %C0,__zero_reg__
    854  1.1  mrg 	adc %D0,__zero_reg__"
    855  1.1  mrg   [(set_attr "length" "4")
    856  1.1  mrg    (set_attr "cc" "set_n")])
    857  1.1  mrg 
    858  1.1  mrg ;-----------------------------------------------------------------------------
    859  1.1  mrg ; sub bytes
    860  1.1  mrg (define_insn "subqi3"
    861  1.1  mrg   [(set (match_operand:QI 0 "register_operand" "=r,d")
    862  1.1  mrg         (minus:QI (match_operand:QI 1 "register_operand" "0,0")
    863  1.1  mrg                   (match_operand:QI 2 "nonmemory_operand" "r,i")))]
    864  1.1  mrg   ""
    865  1.1  mrg   "@
    866  1.1  mrg 	sub %0,%2
    867  1.1  mrg 	subi %0,lo8(%2)"
    868  1.1  mrg   [(set_attr "length" "1,1")
    869  1.1  mrg    (set_attr "cc" "set_czn,set_czn")])
    870  1.1  mrg 
    871  1.1  mrg (define_insn "subhi3"
    872  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=r,d")
    873  1.1  mrg         (minus:HI (match_operand:HI 1 "register_operand" "0,0")
    874  1.1  mrg 		  (match_operand:HI 2 "nonmemory_operand" "r,i")))]
    875  1.1  mrg   ""
    876  1.1  mrg   "@
    877  1.1  mrg 	sub %A0,%A2\;sbc %B0,%B2
    878  1.1  mrg 	subi %A0,lo8(%2)\;sbci %B0,hi8(%2)"
    879  1.1  mrg   [(set_attr "length" "2,2")
    880  1.1  mrg    (set_attr "cc" "set_czn,set_czn")])
    881  1.1  mrg 
    882  1.1  mrg (define_insn "*subhi3_zero_extend1"
    883  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=r")
    884  1.1  mrg 	(minus:HI (match_operand:HI 1 "register_operand" "0")
    885  1.1  mrg 		  (zero_extend:HI
    886  1.1  mrg 		   (match_operand:QI 2 "register_operand" "r"))))]
    887  1.1  mrg   ""
    888  1.1  mrg   "sub %A0,%2
    889  1.1  mrg 	sbc %B0,__zero_reg__"
    890  1.1  mrg   [(set_attr "length" "2")
    891  1.1  mrg    (set_attr "cc" "set_n")])
    892  1.1  mrg 
    893  1.1  mrg (define_insn "subsi3"
    894  1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=r,d")
    895  1.1  mrg         (minus:SI (match_operand:SI 1 "register_operand" "0,0")
    896  1.1  mrg                  (match_operand:SI 2 "nonmemory_operand" "r,i")))]
    897  1.1  mrg   ""
    898  1.1  mrg   "@
    899  1.1  mrg 	sub %0,%2\;sbc %B0,%B2\;sbc %C0,%C2\;sbc %D0,%D2
    900  1.1  mrg 	subi %A0,lo8(%2)\;sbci %B0,hi8(%2)\;sbci %C0,hlo8(%2)\;sbci %D0,hhi8(%2)"
    901  1.1  mrg   [(set_attr "length" "4,4")
    902  1.1  mrg    (set_attr "cc" "set_czn,set_czn")])
    903  1.1  mrg 
    904  1.1  mrg (define_insn "*subsi3_zero_extend"
    905  1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=r")
    906  1.1  mrg 	(minus:SI (match_operand:SI 1 "register_operand" "0")
    907  1.1  mrg 		  (zero_extend:SI
    908  1.1  mrg 		   (match_operand:QI 2 "register_operand" "r"))))]
    909  1.1  mrg   ""
    910  1.1  mrg   "sub %A0,%2
    911  1.1  mrg 	sbc %B0,__zero_reg__
    912  1.1  mrg 	sbc %C0,__zero_reg__
    913  1.1  mrg 	sbc %D0,__zero_reg__"
    914  1.1  mrg   [(set_attr "length" "4")
    915  1.1  mrg    (set_attr "cc" "set_n")])
    916  1.1  mrg 
    917  1.1  mrg ;******************************************************************************
    918  1.1  mrg ; mul
    919  1.1  mrg 
    920  1.1  mrg (define_expand "mulqi3"
    921  1.1  mrg   [(set (match_operand:QI 0 "register_operand" "")
    922  1.1  mrg 	(mult:QI (match_operand:QI 1 "register_operand" "")
    923  1.1  mrg 		 (match_operand:QI 2 "register_operand" "")))]
    924  1.1  mrg   ""
    925  1.1  mrg   "{
    926  1.1  mrg   if (!AVR_HAVE_MUL)
    927  1.1  mrg     {
    928  1.1  mrg       emit_insn (gen_mulqi3_call (operands[0], operands[1], operands[2]));
    929  1.1  mrg       DONE;
    930  1.1  mrg     }
    931  1.1  mrg }")
    932  1.1  mrg 
    933  1.1  mrg (define_insn "*mulqi3_enh"
    934  1.1  mrg   [(set (match_operand:QI 0 "register_operand" "=r")
    935  1.1  mrg 	(mult:QI (match_operand:QI 1 "register_operand" "r")
    936  1.1  mrg 		 (match_operand:QI 2 "register_operand" "r")))]
    937  1.1  mrg   "AVR_HAVE_MUL"
    938  1.1  mrg   "mul %1,%2
    939  1.1  mrg 	mov %0,r0
    940  1.1  mrg 	clr r1"
    941  1.1  mrg   [(set_attr "length" "3")
    942  1.1  mrg    (set_attr "cc" "clobber")])
    943  1.1  mrg 
    944  1.1  mrg (define_expand "mulqi3_call"
    945  1.1  mrg   [(set (reg:QI 24) (match_operand:QI 1 "register_operand" ""))
    946  1.1  mrg    (set (reg:QI 22) (match_operand:QI 2 "register_operand" ""))
    947  1.1  mrg    (parallel [(set (reg:QI 24) (mult:QI (reg:QI 24) (reg:QI 22)))
    948  1.1  mrg 	      (clobber (reg:QI 22))])
    949  1.1  mrg    (set (match_operand:QI 0 "register_operand" "") (reg:QI 24))]
    950  1.1  mrg   ""
    951  1.1  mrg   "")
    952  1.1  mrg 
    953  1.1  mrg (define_insn "*mulqi3_call"
    954  1.1  mrg   [(set (reg:QI 24) (mult:QI (reg:QI 24) (reg:QI 22)))
    955  1.1  mrg    (clobber (reg:QI 22))]
    956  1.1  mrg   "!AVR_HAVE_MUL"
    957  1.1  mrg   "%~call __mulqi3"
    958  1.1  mrg   [(set_attr "type" "xcall")
    959  1.1  mrg    (set_attr "cc" "clobber")])
    960  1.1  mrg 
    961  1.1  mrg (define_insn "mulqihi3"
    962  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=r")
    963  1.1  mrg 	(mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "d"))
    964  1.1  mrg 		 (sign_extend:HI (match_operand:QI 2 "register_operand" "d"))))]
    965  1.1  mrg   "AVR_HAVE_MUL"
    966  1.1  mrg   "muls %1,%2
    967  1.1  mrg 	movw %0,r0
    968  1.1  mrg 	clr r1"
    969  1.1  mrg   [(set_attr "length" "3")
    970  1.1  mrg    (set_attr "cc" "clobber")])
    971  1.1  mrg 
    972  1.1  mrg (define_insn "umulqihi3"
    973  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=r")
    974  1.1  mrg 	(mult:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "r"))
    975  1.1  mrg 		 (zero_extend:HI (match_operand:QI 2 "register_operand" "r"))))]
    976  1.1  mrg   "AVR_HAVE_MUL"
    977  1.1  mrg   "mul %1,%2
    978  1.1  mrg 	movw %0,r0
    979  1.1  mrg 	clr r1"
    980  1.1  mrg   [(set_attr "length" "3")
    981  1.1  mrg    (set_attr "cc" "clobber")])
    982  1.1  mrg 
    983  1.1  mrg (define_expand "mulhi3"
    984  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "")
    985  1.1  mrg 	(mult:HI (match_operand:HI 1 "register_operand" "")
    986  1.1  mrg 		 (match_operand:HI 2 "register_operand" "")))]
    987  1.1  mrg   ""
    988  1.1  mrg   "
    989  1.1  mrg {
    990  1.1  mrg   if (!AVR_HAVE_MUL)
    991  1.1  mrg     {
    992  1.1  mrg       emit_insn (gen_mulhi3_call (operands[0], operands[1], operands[2]));
    993  1.1  mrg       DONE;
    994  1.1  mrg     }
    995  1.1  mrg }")
    996  1.1  mrg 
    997  1.1  mrg (define_insn "*mulhi3_enh"
    998  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=&r")
    999  1.1  mrg 	(mult:HI (match_operand:HI 1 "register_operand" "r")
   1000  1.1  mrg 		 (match_operand:HI 2 "register_operand" "r")))]
   1001  1.1  mrg   "AVR_HAVE_MUL"
   1002  1.1  mrg   "mul %A1,%A2
   1003  1.1  mrg 	movw %0,r0
   1004  1.1  mrg 	mul %A1,%B2
   1005  1.1  mrg 	add %B0,r0
   1006  1.1  mrg 	mul %B1,%A2
   1007  1.1  mrg 	add %B0,r0
   1008  1.1  mrg 	clr r1"
   1009  1.1  mrg   [(set_attr "length" "7")
   1010  1.1  mrg    (set_attr "cc" "clobber")])
   1011  1.1  mrg 
   1012  1.1  mrg (define_expand "mulhi3_call"
   1013  1.1  mrg   [(set (reg:HI 24) (match_operand:HI 1 "register_operand" ""))
   1014  1.1  mrg    (set (reg:HI 22) (match_operand:HI 2 "register_operand" ""))
   1015  1.1  mrg    (parallel [(set (reg:HI 24) (mult:HI (reg:HI 24) (reg:HI 22)))
   1016  1.1  mrg 	      (clobber (reg:HI 22))
   1017  1.1  mrg 	      (clobber (reg:QI 21))])
   1018  1.1  mrg    (set (match_operand:HI 0 "register_operand" "") (reg:HI 24))]
   1019  1.1  mrg   ""
   1020  1.1  mrg   "")
   1021  1.1  mrg 
   1022  1.1  mrg (define_insn "*mulhi3_call"
   1023  1.1  mrg   [(set (reg:HI 24) (mult:HI (reg:HI 24) (reg:HI 22)))
   1024  1.1  mrg    (clobber (reg:HI 22))
   1025  1.1  mrg    (clobber (reg:QI 21))]
   1026  1.1  mrg   "!AVR_HAVE_MUL"
   1027  1.1  mrg   "%~call __mulhi3"
   1028  1.1  mrg   [(set_attr "type" "xcall")
   1029  1.1  mrg    (set_attr "cc" "clobber")])
   1030  1.1  mrg 
   1031  1.1  mrg ;; Operand 2 (reg:SI 18) not clobbered on the enhanced core.
   1032  1.1  mrg ;; All call-used registers clobbered otherwise - normal library call.
   1033  1.1  mrg (define_expand "mulsi3"
   1034  1.1  mrg   [(set (reg:SI 22) (match_operand:SI 1 "register_operand" ""))
   1035  1.1  mrg    (set (reg:SI 18) (match_operand:SI 2 "register_operand" ""))
   1036  1.1  mrg    (parallel [(set (reg:SI 22) (mult:SI (reg:SI 22) (reg:SI 18)))
   1037  1.1  mrg 	      (clobber (reg:HI 26))
   1038  1.1  mrg 	      (clobber (reg:HI 30))])
   1039  1.1  mrg    (set (match_operand:SI 0 "register_operand" "") (reg:SI 22))]
   1040  1.1  mrg   "AVR_HAVE_MUL"
   1041  1.1  mrg   "")
   1042  1.1  mrg 
   1043  1.1  mrg (define_insn "*mulsi3_call"
   1044  1.1  mrg   [(set (reg:SI 22) (mult:SI (reg:SI 22) (reg:SI 18)))
   1045  1.1  mrg    (clobber (reg:HI 26))
   1046  1.1  mrg    (clobber (reg:HI 30))]
   1047  1.1  mrg   "AVR_HAVE_MUL"
   1048  1.1  mrg   "%~call __mulsi3"
   1049  1.1  mrg   [(set_attr "type" "xcall")
   1050  1.1  mrg    (set_attr "cc" "clobber")])
   1051  1.1  mrg 
   1052  1.1  mrg ; / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / %
   1053  1.1  mrg ; divmod
   1054  1.1  mrg 
   1055  1.1  mrg ;; Generate libgcc.S calls ourselves, because:
   1056  1.1  mrg ;;  - we know exactly which registers are clobbered (for QI and HI
   1057  1.1  mrg ;;    modes, some of the call-used registers are preserved)
   1058  1.1  mrg ;;  - we get both the quotient and the remainder at no extra cost
   1059  1.1  mrg ;;  - we split the patterns only after the first CSE passes because
   1060  1.1  mrg ;;    CSE has problems to operate on hard regs.
   1061  1.1  mrg ;; 
   1062  1.1  mrg (define_insn_and_split "divmodqi4"
   1063  1.1  mrg   [(parallel [(set (match_operand:QI 0 "pseudo_register_operand" "") 
   1064  1.1  mrg                    (div:QI (match_operand:QI 1 "pseudo_register_operand" "") 
   1065  1.1  mrg                            (match_operand:QI 2 "pseudo_register_operand" "")))
   1066  1.1  mrg               (set (match_operand:QI 3 "pseudo_register_operand" "") 
   1067  1.1  mrg                    (mod:QI (match_dup 1) (match_dup 2)))
   1068  1.1  mrg               (clobber (reg:QI 22)) 
   1069  1.1  mrg               (clobber (reg:QI 23)) 
   1070  1.1  mrg               (clobber (reg:QI 24)) 
   1071  1.1  mrg               (clobber (reg:QI 25))])]
   1072  1.1  mrg   ""
   1073  1.1  mrg   "this divmodqi4 pattern should have been splitted;"
   1074  1.1  mrg   ""
   1075  1.1  mrg   [(set (reg:QI 24) (match_dup 1))
   1076  1.1  mrg    (set (reg:QI 22) (match_dup 2))
   1077  1.1  mrg    (parallel [(set (reg:QI 24) (div:QI (reg:QI 24) (reg:QI 22)))
   1078  1.1  mrg 	      (set (reg:QI 25) (mod:QI (reg:QI 24) (reg:QI 22)))
   1079  1.1  mrg 	      (clobber (reg:QI 22))
   1080  1.1  mrg 	      (clobber (reg:QI 23))])
   1081  1.1  mrg    (set (match_dup 0) (reg:QI 24))
   1082  1.1  mrg    (set (match_dup 3) (reg:QI 25))]
   1083  1.1  mrg   "")
   1084  1.1  mrg 
   1085  1.1  mrg (define_insn "*divmodqi4_call"
   1086  1.1  mrg   [(set (reg:QI 24) (div:QI (reg:QI 24) (reg:QI 22)))
   1087  1.1  mrg    (set (reg:QI 25) (mod:QI (reg:QI 24) (reg:QI 22)))
   1088  1.1  mrg    (clobber (reg:QI 22))
   1089  1.1  mrg    (clobber (reg:QI 23))]
   1090  1.1  mrg   ""
   1091  1.1  mrg   "%~call __divmodqi4"
   1092  1.1  mrg   [(set_attr "type" "xcall")
   1093  1.1  mrg    (set_attr "cc" "clobber")])
   1094  1.1  mrg 
   1095  1.1  mrg (define_insn_and_split "udivmodqi4"
   1096  1.1  mrg  [(parallel [(set (match_operand:QI 0 "pseudo_register_operand" "") 
   1097  1.1  mrg                   (udiv:QI (match_operand:QI 1 "pseudo_register_operand" "") 
   1098  1.1  mrg                            (match_operand:QI 2 "pseudo_register_operand" "")))
   1099  1.1  mrg 	     (set (match_operand:QI 3 "pseudo_register_operand" "") 
   1100  1.1  mrg                   (umod:QI (match_dup 1) (match_dup 2)))
   1101  1.1  mrg              (clobber (reg:QI 22))
   1102  1.1  mrg              (clobber (reg:QI 23))
   1103  1.1  mrg              (clobber (reg:QI 24))
   1104  1.1  mrg              (clobber (reg:QI 25))])]
   1105  1.1  mrg   ""
   1106  1.1  mrg   "this udivmodqi4 pattern should have been splitted;"
   1107  1.1  mrg   "" 
   1108  1.1  mrg   [(set (reg:QI 24) (match_dup 1))
   1109  1.1  mrg    (set (reg:QI 22) (match_dup 2))
   1110  1.1  mrg    (parallel [(set (reg:QI 24) (udiv:QI (reg:QI 24) (reg:QI 22)))
   1111  1.1  mrg 	      (set (reg:QI 25) (umod:QI (reg:QI 24) (reg:QI 22)))
   1112  1.1  mrg 	      (clobber (reg:QI 23))])
   1113  1.1  mrg    (set (match_dup 0) (reg:QI 24))
   1114  1.1  mrg    (set (match_dup 3) (reg:QI 25))]
   1115  1.1  mrg   "")
   1116  1.1  mrg 
   1117  1.1  mrg (define_insn "*udivmodqi4_call"
   1118  1.1  mrg   [(set (reg:QI 24) (udiv:QI (reg:QI 24) (reg:QI 22)))
   1119  1.1  mrg    (set (reg:QI 25) (umod:QI (reg:QI 24) (reg:QI 22)))
   1120  1.1  mrg    (clobber (reg:QI 23))]
   1121  1.1  mrg   ""
   1122  1.1  mrg   "%~call __udivmodqi4"
   1123  1.1  mrg   [(set_attr "type" "xcall")
   1124  1.1  mrg    (set_attr "cc" "clobber")])
   1125  1.1  mrg 
   1126  1.1  mrg (define_insn_and_split "divmodhi4"
   1127  1.1  mrg   [(parallel [(set (match_operand:HI 0 "pseudo_register_operand" "") 
   1128  1.1  mrg                    (div:HI (match_operand:HI 1 "pseudo_register_operand" "") 
   1129  1.1  mrg                            (match_operand:HI 2 "pseudo_register_operand" "")))
   1130  1.1  mrg               (set (match_operand:HI 3 "pseudo_register_operand" "") 
   1131  1.1  mrg                    (mod:HI (match_dup 1) (match_dup 2)))
   1132  1.1  mrg               (clobber (reg:QI 21))
   1133  1.1  mrg               (clobber (reg:HI 22))
   1134  1.1  mrg               (clobber (reg:HI 24))
   1135  1.1  mrg               (clobber (reg:HI 26))])]
   1136  1.1  mrg   ""
   1137  1.1  mrg   "this should have been splitted;"
   1138  1.1  mrg   ""
   1139  1.1  mrg   [(set (reg:HI 24) (match_dup 1))
   1140  1.1  mrg    (set (reg:HI 22) (match_dup 2))
   1141  1.1  mrg    (parallel [(set (reg:HI 22) (div:HI (reg:HI 24) (reg:HI 22)))
   1142  1.1  mrg 	      (set (reg:HI 24) (mod:HI (reg:HI 24) (reg:HI 22)))
   1143  1.1  mrg 	      (clobber (reg:HI 26))
   1144  1.1  mrg 	      (clobber (reg:QI 21))])
   1145  1.1  mrg    (set (match_dup 0) (reg:HI 22))
   1146  1.1  mrg    (set (match_dup 3) (reg:HI 24))]
   1147  1.1  mrg   "") 
   1148  1.1  mrg 
   1149  1.1  mrg (define_insn "*divmodhi4_call"
   1150  1.1  mrg   [(set (reg:HI 22) (div:HI (reg:HI 24) (reg:HI 22)))
   1151  1.1  mrg    (set (reg:HI 24) (mod:HI (reg:HI 24) (reg:HI 22)))
   1152  1.1  mrg    (clobber (reg:HI 26))
   1153  1.1  mrg    (clobber (reg:QI 21))]
   1154  1.1  mrg   ""
   1155  1.1  mrg   "%~call __divmodhi4"
   1156  1.1  mrg   [(set_attr "type" "xcall")
   1157  1.1  mrg    (set_attr "cc" "clobber")])
   1158  1.1  mrg 
   1159  1.1  mrg (define_insn_and_split "udivmodhi4"
   1160  1.1  mrg   [(parallel [(set (match_operand:HI 0 "pseudo_register_operand" "") 
   1161  1.1  mrg                    (udiv:HI (match_operand:HI 1 "pseudo_register_operand" "")
   1162  1.1  mrg                             (match_operand:HI 2 "pseudo_register_operand" "")))
   1163  1.1  mrg 	      (set (match_operand:HI 3 "pseudo_register_operand" "") 
   1164  1.1  mrg                    (umod:HI (match_dup 1) (match_dup 2)))
   1165  1.1  mrg               (clobber (reg:QI 21))
   1166  1.1  mrg               (clobber (reg:HI 22))
   1167  1.1  mrg               (clobber (reg:HI 24))
   1168  1.1  mrg               (clobber (reg:HI 26))])]
   1169  1.1  mrg   ""
   1170  1.1  mrg   "this udivmodhi4 pattern should have been splitted.;"
   1171  1.1  mrg   ""
   1172  1.1  mrg   [(set (reg:HI 24) (match_dup 1))
   1173  1.1  mrg    (set (reg:HI 22) (match_dup 2))
   1174  1.1  mrg    (parallel [(set (reg:HI 22) (udiv:HI (reg:HI 24) (reg:HI 22)))
   1175  1.1  mrg 	      (set (reg:HI 24) (umod:HI (reg:HI 24) (reg:HI 22)))
   1176  1.1  mrg 	      (clobber (reg:HI 26))
   1177  1.1  mrg 	      (clobber (reg:QI 21))])
   1178  1.1  mrg    (set (match_dup 0) (reg:HI 22))
   1179  1.1  mrg    (set (match_dup 3) (reg:HI 24))]
   1180  1.1  mrg   "")
   1181  1.1  mrg 
   1182  1.1  mrg (define_insn "*udivmodhi4_call"
   1183  1.1  mrg   [(set (reg:HI 22) (udiv:HI (reg:HI 24) (reg:HI 22)))
   1184  1.1  mrg    (set (reg:HI 24) (umod:HI (reg:HI 24) (reg:HI 22)))
   1185  1.1  mrg    (clobber (reg:HI 26))
   1186  1.1  mrg    (clobber (reg:QI 21))]
   1187  1.1  mrg   ""
   1188  1.1  mrg   "%~call __udivmodhi4"
   1189  1.1  mrg   [(set_attr "type" "xcall")
   1190  1.1  mrg    (set_attr "cc" "clobber")])
   1191  1.1  mrg 
   1192  1.1  mrg (define_insn_and_split "divmodsi4"
   1193  1.1  mrg   [(parallel [(set (match_operand:SI 0 "pseudo_register_operand" "") 
   1194  1.1  mrg                    (div:SI (match_operand:SI 1 "pseudo_register_operand" "") 
   1195  1.1  mrg                            (match_operand:SI 2 "pseudo_register_operand" "")))
   1196  1.1  mrg               (set (match_operand:SI 3 "pseudo_register_operand" "") 
   1197  1.1  mrg                    (mod:SI (match_dup 1) (match_dup 2)))
   1198  1.1  mrg               (clobber (reg:SI 18))
   1199  1.1  mrg               (clobber (reg:SI 22))
   1200  1.1  mrg               (clobber (reg:HI 26))
   1201  1.1  mrg               (clobber (reg:HI 30))])]
   1202  1.1  mrg   ""
   1203  1.1  mrg   "this divmodsi4 pattern should have been splitted;" 
   1204  1.1  mrg   ""
   1205  1.1  mrg   [(set (reg:SI 22) (match_dup 1))
   1206  1.1  mrg    (set (reg:SI 18) (match_dup 2))
   1207  1.1  mrg    (parallel [(set (reg:SI 18) (div:SI (reg:SI 22) (reg:SI 18)))
   1208  1.1  mrg 	      (set (reg:SI 22) (mod:SI (reg:SI 22) (reg:SI 18)))
   1209  1.1  mrg 	      (clobber (reg:HI 26))
   1210  1.1  mrg 	      (clobber (reg:HI 30))])
   1211  1.1  mrg    (set (match_dup 0) (reg:SI 18))
   1212  1.1  mrg    (set (match_dup 3) (reg:SI 22))]
   1213  1.1  mrg   "")
   1214  1.1  mrg 
   1215  1.1  mrg (define_insn "*divmodsi4_call"
   1216  1.1  mrg   [(set (reg:SI 18) (div:SI (reg:SI 22) (reg:SI 18)))
   1217  1.1  mrg    (set (reg:SI 22) (mod:SI (reg:SI 22) (reg:SI 18)))
   1218  1.1  mrg    (clobber (reg:HI 26))
   1219  1.1  mrg    (clobber (reg:HI 30))]
   1220  1.1  mrg   ""
   1221  1.1  mrg   "%~call __divmodsi4"
   1222  1.1  mrg   [(set_attr "type" "xcall")
   1223  1.1  mrg    (set_attr "cc" "clobber")])
   1224  1.1  mrg 
   1225  1.1  mrg (define_insn_and_split "udivmodsi4"
   1226  1.1  mrg   [(parallel [(set (match_operand:SI 0 "pseudo_register_operand" "") 
   1227  1.1  mrg                    (udiv:SI (match_operand:SI 1 "pseudo_register_operand" "") 
   1228  1.1  mrg                            (match_operand:SI 2 "pseudo_register_operand" "")))
   1229  1.1  mrg               (set (match_operand:SI 3 "pseudo_register_operand" "") 
   1230  1.1  mrg                    (umod:SI (match_dup 1) (match_dup 2)))
   1231  1.1  mrg               (clobber (reg:SI 18))
   1232  1.1  mrg               (clobber (reg:SI 22))
   1233  1.1  mrg               (clobber (reg:HI 26))
   1234  1.1  mrg               (clobber (reg:HI 30))])]
   1235  1.1  mrg   ""
   1236  1.1  mrg   "this udivmodsi4 pattern should have been splitted;"
   1237  1.1  mrg   ""
   1238  1.1  mrg   [(set (reg:SI 22) (match_dup 1))
   1239  1.1  mrg    (set (reg:SI 18) (match_dup 2))
   1240  1.1  mrg    (parallel [(set (reg:SI 18) (udiv:SI (reg:SI 22) (reg:SI 18)))
   1241  1.1  mrg 	      (set (reg:SI 22) (umod:SI (reg:SI 22) (reg:SI 18)))
   1242  1.1  mrg 	      (clobber (reg:HI 26))
   1243  1.1  mrg 	      (clobber (reg:HI 30))])
   1244  1.1  mrg    (set (match_dup 0) (reg:SI 18))
   1245  1.1  mrg    (set (match_dup 3) (reg:SI 22))]
   1246  1.1  mrg   "")
   1247  1.1  mrg 
   1248  1.1  mrg (define_insn "*udivmodsi4_call"
   1249  1.1  mrg   [(set (reg:SI 18) (udiv:SI (reg:SI 22) (reg:SI 18)))
   1250  1.1  mrg    (set (reg:SI 22) (umod:SI (reg:SI 22) (reg:SI 18)))
   1251  1.1  mrg    (clobber (reg:HI 26))
   1252  1.1  mrg    (clobber (reg:HI 30))]
   1253  1.1  mrg   ""
   1254  1.1  mrg   "%~call __udivmodsi4"
   1255  1.1  mrg   [(set_attr "type" "xcall")
   1256  1.1  mrg    (set_attr "cc" "clobber")])
   1257  1.1  mrg 
   1258  1.1  mrg ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   1259  1.1  mrg ; and
   1260  1.1  mrg 
   1261  1.1  mrg (define_insn "andqi3"
   1262  1.1  mrg   [(set (match_operand:QI 0 "register_operand" "=r,d")
   1263  1.1  mrg         (and:QI (match_operand:QI 1 "register_operand" "%0,0")
   1264  1.1  mrg                 (match_operand:QI 2 "nonmemory_operand" "r,i")))]
   1265  1.1  mrg   ""
   1266  1.1  mrg   "@
   1267  1.1  mrg 	and %0,%2
   1268  1.1  mrg 	andi %0,lo8(%2)"
   1269  1.1  mrg   [(set_attr "length" "1,1")
   1270  1.1  mrg    (set_attr "cc" "set_zn,set_zn")])
   1271  1.1  mrg 
   1272  1.1  mrg (define_insn "andhi3"
   1273  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=r,d,r")
   1274  1.1  mrg 	  (and:HI (match_operand:HI 1 "register_operand" "%0,0,0")
   1275  1.1  mrg 		  (match_operand:HI 2 "nonmemory_operand" "r,i,M")))
   1276  1.1  mrg    (clobber (match_scratch:QI 3 "=X,X,&d"))]
   1277  1.1  mrg   ""
   1278  1.1  mrg {
   1279  1.1  mrg   if (which_alternative==0)
   1280  1.1  mrg     return ("and %A0,%A2" CR_TAB
   1281  1.1  mrg 	    "and %B0,%B2");
   1282  1.1  mrg   else if (which_alternative==1)
   1283  1.1  mrg     {
   1284  1.1  mrg       if (GET_CODE (operands[2]) == CONST_INT)
   1285  1.1  mrg         {
   1286  1.1  mrg 	  int mask = INTVAL (operands[2]);
   1287  1.1  mrg 	  if ((mask & 0xff) != 0xff)
   1288  1.1  mrg 	    output_asm_insn (AS2 (andi,%A0,lo8(%2)), operands);
   1289  1.1  mrg 	  if ((mask & 0xff00) != 0xff00)
   1290  1.1  mrg 	    output_asm_insn (AS2 (andi,%B0,hi8(%2)), operands);
   1291  1.1  mrg 	  return "";
   1292  1.1  mrg         }
   1293  1.1  mrg         return (AS2 (andi,%A0,lo8(%2)) CR_TAB
   1294  1.1  mrg 	        AS2 (andi,%B0,hi8(%2)));
   1295  1.1  mrg      }
   1296  1.1  mrg   return (AS2 (ldi,%3,lo8(%2)) CR_TAB
   1297  1.1  mrg           "and %A0,%3"         CR_TAB
   1298  1.1  mrg           AS1 (clr,%B0));
   1299  1.1  mrg }
   1300  1.1  mrg   [(set_attr "length" "2,2,3")
   1301  1.1  mrg    (set_attr "cc" "set_n,clobber,set_n")])
   1302  1.1  mrg 
   1303  1.1  mrg (define_insn "andsi3"
   1304  1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=r,d")
   1305  1.1  mrg 	(and:SI (match_operand:SI 1 "register_operand" "%0,0")
   1306  1.1  mrg 		(match_operand:SI 2 "nonmemory_operand" "r,i")))]
   1307  1.1  mrg   ""
   1308  1.1  mrg {
   1309  1.1  mrg   if (which_alternative==0)
   1310  1.1  mrg     return ("and %0,%2"   CR_TAB
   1311  1.1  mrg             "and %B0,%B2" CR_TAB
   1312  1.1  mrg             "and %C0,%C2" CR_TAB
   1313  1.1  mrg             "and %D0,%D2");
   1314  1.1  mrg   else if (which_alternative==1)
   1315  1.1  mrg     {
   1316  1.1  mrg       if (GET_CODE (operands[2]) == CONST_INT)
   1317  1.1  mrg         {
   1318  1.1  mrg 	  HOST_WIDE_INT mask = INTVAL (operands[2]);
   1319  1.1  mrg 	  if ((mask & 0xff) != 0xff)
   1320  1.1  mrg 	    output_asm_insn (AS2 (andi,%A0,lo8(%2)), operands);
   1321  1.1  mrg 	  if ((mask & 0xff00) != 0xff00)
   1322  1.1  mrg 	    output_asm_insn (AS2 (andi,%B0,hi8(%2)), operands);
   1323  1.1  mrg 	  if ((mask & 0xff0000L) != 0xff0000L)
   1324  1.1  mrg 	    output_asm_insn (AS2 (andi,%C0,hlo8(%2)), operands);
   1325  1.1  mrg 	  if ((mask & 0xff000000L) != 0xff000000L)
   1326  1.1  mrg 	    output_asm_insn (AS2 (andi,%D0,hhi8(%2)), operands);
   1327  1.1  mrg 	  return "";
   1328  1.1  mrg         }
   1329  1.1  mrg       return (AS2 (andi, %A0,lo8(%2))  CR_TAB
   1330  1.1  mrg               AS2 (andi, %B0,hi8(%2)) CR_TAB
   1331  1.1  mrg 	      AS2 (andi, %C0,hlo8(%2)) CR_TAB
   1332  1.1  mrg 	      AS2 (andi, %D0,hhi8(%2)));
   1333  1.1  mrg     }
   1334  1.1  mrg   return "bug";
   1335  1.1  mrg }
   1336  1.1  mrg   [(set_attr "length" "4,4")
   1337  1.1  mrg    (set_attr "cc" "set_n,clobber")])
   1338  1.1  mrg 
   1339  1.1  mrg (define_peephole2 ; andi
   1340  1.1  mrg   [(set (match_operand:QI 0 "d_register_operand" "")
   1341  1.1  mrg         (and:QI (match_dup 0)
   1342  1.1  mrg 	        (match_operand:QI 1 "const_int_operand" "")))
   1343  1.1  mrg    (set (match_dup 0)
   1344  1.1  mrg         (and:QI (match_dup 0)
   1345  1.1  mrg 	        (match_operand:QI 2 "const_int_operand" "")))]
   1346  1.1  mrg   ""
   1347  1.1  mrg   [(set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))]
   1348  1.1  mrg   {
   1349  1.1  mrg     operands[1] = GEN_INT (INTVAL (operands[1]) & INTVAL (operands[2]));
   1350  1.1  mrg   })
   1351  1.1  mrg 
   1352  1.1  mrg ;;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
   1353  1.1  mrg ;; ior
   1354  1.1  mrg 
   1355  1.1  mrg (define_insn "iorqi3"
   1356  1.1  mrg   [(set (match_operand:QI 0 "register_operand" "=r,d")
   1357  1.1  mrg         (ior:QI (match_operand:QI 1 "register_operand" "%0,0")
   1358  1.1  mrg                 (match_operand:QI 2 "nonmemory_operand" "r,i")))]
   1359  1.1  mrg   ""
   1360  1.1  mrg   "@
   1361  1.1  mrg 	or %0,%2
   1362  1.1  mrg 	ori %0,lo8(%2)"
   1363  1.1  mrg   [(set_attr "length" "1,1")
   1364  1.1  mrg    (set_attr "cc" "set_zn,set_zn")])
   1365  1.1  mrg 
   1366  1.1  mrg (define_insn "iorhi3"
   1367  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=r,d")
   1368  1.1  mrg 	(ior:HI (match_operand:HI 1 "register_operand" "%0,0")
   1369  1.1  mrg 		(match_operand:HI 2 "nonmemory_operand" "r,i")))]
   1370  1.1  mrg   ""
   1371  1.1  mrg {
   1372  1.1  mrg   if (which_alternative==0)
   1373  1.1  mrg     return ("or %A0,%A2" CR_TAB
   1374  1.1  mrg 	    "or %B0,%B2");
   1375  1.1  mrg   if (GET_CODE (operands[2]) == CONST_INT)
   1376  1.1  mrg      {
   1377  1.1  mrg 	int mask = INTVAL (operands[2]);
   1378  1.1  mrg 	if (mask & 0xff)
   1379  1.1  mrg 	  output_asm_insn (AS2 (ori,%A0,lo8(%2)), operands);
   1380  1.1  mrg 	if (mask & 0xff00)
   1381  1.1  mrg 	  output_asm_insn (AS2 (ori,%B0,hi8(%2)), operands);
   1382  1.1  mrg 	return "";
   1383  1.1  mrg       }
   1384  1.1  mrg    return (AS2 (ori,%0,lo8(%2)) CR_TAB
   1385  1.1  mrg 	   AS2 (ori,%B0,hi8(%2)));
   1386  1.1  mrg }
   1387  1.1  mrg   [(set_attr "length" "2,2")
   1388  1.1  mrg    (set_attr "cc" "set_n,clobber")])
   1389  1.1  mrg 
   1390  1.1  mrg (define_insn "*iorhi3_clobber"
   1391  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=r,r")
   1392  1.1  mrg 	(ior:HI (match_operand:HI 1 "register_operand" "%0,0")
   1393  1.1  mrg 		(match_operand:HI 2 "immediate_operand" "M,i")))
   1394  1.1  mrg    (clobber (match_scratch:QI 3 "=&d,&d"))]
   1395  1.1  mrg   ""
   1396  1.1  mrg   "@
   1397  1.1  mrg 	ldi %3,lo8(%2)\;or %A0,%3
   1398  1.1  mrg 	ldi %3,lo8(%2)\;or %A0,%3\;ldi %3,hi8(%2)\;or %B0,%3"
   1399  1.1  mrg   [(set_attr "length" "2,4")
   1400  1.1  mrg    (set_attr "cc" "clobber,set_n")])
   1401  1.1  mrg 
   1402  1.1  mrg (define_insn "iorsi3"
   1403  1.1  mrg   [(set (match_operand:SI 0 "register_operand"        "=r,d")
   1404  1.1  mrg 	(ior:SI (match_operand:SI 1 "register_operand" "%0,0")
   1405  1.1  mrg 		(match_operand:SI 2 "nonmemory_operand" "r,i")))]
   1406  1.1  mrg   ""
   1407  1.1  mrg {
   1408  1.1  mrg   if (which_alternative==0)
   1409  1.1  mrg     return ("or %0,%2"   CR_TAB
   1410  1.1  mrg 	    "or %B0,%B2" CR_TAB
   1411  1.1  mrg 	    "or %C0,%C2" CR_TAB
   1412  1.1  mrg 	    "or %D0,%D2");
   1413  1.1  mrg   if (GET_CODE (operands[2]) == CONST_INT)
   1414  1.1  mrg      {
   1415  1.1  mrg 	HOST_WIDE_INT mask = INTVAL (operands[2]);
   1416  1.1  mrg 	if (mask & 0xff)
   1417  1.1  mrg 	  output_asm_insn (AS2 (ori,%A0,lo8(%2)), operands);
   1418  1.1  mrg 	if (mask & 0xff00)
   1419  1.1  mrg 	  output_asm_insn (AS2 (ori,%B0,hi8(%2)), operands);
   1420  1.1  mrg 	if (mask & 0xff0000L)
   1421  1.1  mrg 	  output_asm_insn (AS2 (ori,%C0,hlo8(%2)), operands);
   1422  1.1  mrg 	if (mask & 0xff000000L)
   1423  1.1  mrg 	  output_asm_insn (AS2 (ori,%D0,hhi8(%2)), operands);
   1424  1.1  mrg 	return "";
   1425  1.1  mrg       }
   1426  1.1  mrg   return (AS2 (ori, %A0,lo8(%2))  CR_TAB
   1427  1.1  mrg 	  AS2 (ori, %B0,hi8(%2)) CR_TAB
   1428  1.1  mrg 	  AS2 (ori, %C0,hlo8(%2)) CR_TAB
   1429  1.1  mrg 	  AS2 (ori, %D0,hhi8(%2)));
   1430  1.1  mrg }
   1431  1.1  mrg   [(set_attr "length" "4,4")
   1432  1.1  mrg    (set_attr "cc" "set_n,clobber")])
   1433  1.1  mrg 
   1434  1.1  mrg (define_insn "*iorsi3_clobber"
   1435  1.1  mrg   [(set (match_operand:SI 0 "register_operand"        "=r,r")
   1436  1.1  mrg 	(ior:SI (match_operand:SI 1 "register_operand" "%0,0")
   1437  1.1  mrg 		(match_operand:SI 2 "immediate_operand" "M,i")))
   1438  1.1  mrg    (clobber (match_scratch:QI 3 "=&d,&d"))]
   1439  1.1  mrg   ""
   1440  1.1  mrg   "@
   1441  1.1  mrg 	ldi %3,lo8(%2)\;or %A0,%3
   1442  1.1  mrg 	ldi %3,lo8(%2)\;or %A0,%3\;ldi %3,hi8(%2)\;or %B0,%3\;ldi %3,hlo8(%2)\;or %C0,%3\;ldi %3,hhi8(%2)\;or %D0,%3"
   1443  1.1  mrg   [(set_attr "length" "2,8")
   1444  1.1  mrg    (set_attr "cc" "clobber,set_n")])
   1445  1.1  mrg 
   1446  1.1  mrg ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   1447  1.1  mrg ;; xor
   1448  1.1  mrg 
   1449  1.1  mrg (define_insn "xorqi3"
   1450  1.1  mrg   [(set (match_operand:QI 0 "register_operand" "=r")
   1451  1.1  mrg         (xor:QI (match_operand:QI 1 "register_operand" "%0")
   1452  1.1  mrg                 (match_operand:QI 2 "register_operand" "r")))]
   1453  1.1  mrg   ""
   1454  1.1  mrg   "eor %0,%2"
   1455  1.1  mrg   [(set_attr "length" "1")
   1456  1.1  mrg    (set_attr "cc" "set_zn")])
   1457  1.1  mrg 
   1458  1.1  mrg (define_insn "xorhi3"
   1459  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=r")
   1460  1.1  mrg         (xor:HI (match_operand:HI 1 "register_operand" "%0")
   1461  1.1  mrg                 (match_operand:HI 2 "register_operand" "r")))]
   1462  1.1  mrg   ""
   1463  1.1  mrg   "eor %0,%2
   1464  1.1  mrg 	eor %B0,%B2"
   1465  1.1  mrg   [(set_attr "length" "2")
   1466  1.1  mrg    (set_attr "cc" "set_n")])
   1467  1.1  mrg 
   1468  1.1  mrg (define_insn "xorsi3"
   1469  1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=r")
   1470  1.1  mrg         (xor:SI (match_operand:SI 1 "register_operand" "%0")
   1471  1.1  mrg                 (match_operand:SI 2 "register_operand" "r")))]
   1472  1.1  mrg   ""
   1473  1.1  mrg   "eor %0,%2
   1474  1.1  mrg 	eor %B0,%B2
   1475  1.1  mrg 	eor %C0,%C2
   1476  1.1  mrg 	eor %D0,%D2"
   1477  1.1  mrg   [(set_attr "length" "4")
   1478  1.1  mrg    (set_attr "cc" "set_n")])
   1479  1.1  mrg 
   1480  1.1  mrg ;; swap swap swap swap swap swap swap swap swap swap swap swap swap swap swap
   1481  1.1  mrg ;; swap
   1482  1.1  mrg 
   1483  1.1  mrg (define_expand "rotlqi3"
   1484  1.1  mrg   [(set (match_operand:QI 0 "register_operand" "")
   1485  1.1  mrg 	(rotate:QI (match_operand:QI 1 "register_operand" "")
   1486  1.1  mrg 		   (match_operand:QI 2 "const_int_operand" "")))]
   1487  1.1  mrg   ""
   1488  1.1  mrg   "
   1489  1.1  mrg {
   1490  1.1  mrg   if (!CONST_INT_P (operands[2]) || (INTVAL (operands[2]) != 4))
   1491  1.1  mrg     FAIL;
   1492  1.1  mrg }")
   1493  1.1  mrg 
   1494  1.1  mrg (define_insn "*rotlqi3_4"
   1495  1.1  mrg   [(set (match_operand:QI 0 "register_operand" "=r")
   1496  1.1  mrg 	(rotate:QI (match_operand:QI 1 "register_operand" "0")
   1497  1.1  mrg 		   (const_int 4)))]
   1498  1.1  mrg   ""
   1499  1.1  mrg   "swap %0"
   1500  1.1  mrg   [(set_attr "length" "1")
   1501  1.1  mrg    (set_attr "cc" "none")])
   1502  1.1  mrg 
   1503  1.1  mrg ;; Split all rotates of HI,SI and DImode registers where rotation is by
   1504  1.1  mrg ;; a whole number of bytes.  The split creates the appropriate moves and
   1505  1.1  mrg ;; considers all overlap situations.  DImode is split before reload.
   1506  1.1  mrg 
   1507  1.1  mrg ;; HImode does not need scratch.  Use attribute for this constraint.
   1508  1.1  mrg ;; Use QI scratch for DI mode as this is often split into byte sized operands.
   1509  1.1  mrg 
   1510  1.1  mrg (define_mode_attr rotx [(DI "&r,&r,X") (SI "&r,&r,X") (HI "X,X,X")])
   1511  1.1  mrg (define_mode_attr rotsmode [(DI "QI") (SI "HI") (HI "QI")])
   1512  1.1  mrg 
   1513  1.1  mrg (define_expand "rotl<mode>3"
   1514  1.1  mrg   [(parallel [(set (match_operand:HIDI 0 "register_operand" "")
   1515  1.1  mrg 		   (rotate:HIDI (match_operand:HIDI 1 "register_operand" "")
   1516  1.1  mrg 				(match_operand:VOID 2 "const_int_operand" "")))
   1517  1.1  mrg 		(clobber (match_operand 3 ""))])]
   1518  1.1  mrg   ""
   1519  1.1  mrg   "
   1520  1.1  mrg {
   1521  1.1  mrg   if (CONST_INT_P (operands[2]) && 0 == (INTVAL (operands[2]) % 8))
   1522  1.1  mrg   {
   1523  1.1  mrg   if (AVR_HAVE_MOVW && 0 == INTVAL (operands[2]) % 16)
   1524  1.1  mrg     operands[3] = gen_reg_rtx (<rotsmode>mode);
   1525  1.1  mrg   else
   1526  1.1  mrg     operands[3] = gen_reg_rtx (QImode);
   1527  1.1  mrg   }
   1528  1.1  mrg   else
   1529  1.1  mrg     FAIL;
   1530  1.1  mrg }")
   1531  1.1  mrg 
   1532  1.1  mrg 
   1533  1.1  mrg ;; Overlapping non-HImode registers often (but not always) need a scratch.
   1534  1.1  mrg ;; The best we can do is use early clobber alternative "#&r" so that
   1535  1.1  mrg ;; completely non-overlapping operands dont get a scratch but # so register
   1536  1.1  mrg ;; allocation does not prefer non-overlapping.
   1537  1.1  mrg 
   1538  1.1  mrg 
   1539  1.1  mrg ; Split word aligned rotates using scratch that is mode dependent.
   1540  1.1  mrg (define_insn_and_split "*rotw<mode>"
   1541  1.1  mrg   [(set (match_operand:HIDI 0 "register_operand" "=r,r,#&r")
   1542  1.1  mrg 	(rotate:HIDI (match_operand:HIDI 1 "register_operand" "0,r,r")
   1543  1.1  mrg 		     (match_operand 2 "immediate_operand" "n,n,n")))
   1544  1.1  mrg    (clobber (match_operand:<rotsmode> 3 "register_operand"  "=<rotx>" ))]
   1545  1.1  mrg   "(CONST_INT_P (operands[2]) &&
   1546  1.1  mrg      (0 == (INTVAL (operands[2]) % 16) && AVR_HAVE_MOVW))"
   1547  1.1  mrg   "#"
   1548  1.1  mrg   "&& (reload_completed || <MODE>mode == DImode)"
   1549  1.1  mrg   [(const_int 0)]
   1550  1.1  mrg   "avr_rotate_bytes (operands);
   1551  1.1  mrg   DONE;"
   1552  1.1  mrg )
   1553  1.1  mrg 
   1554  1.1  mrg 
   1555  1.1  mrg ; Split byte aligned rotates using scratch that is always QI mode.
   1556  1.1  mrg (define_insn_and_split "*rotb<mode>"
   1557  1.1  mrg   [(set (match_operand:HIDI 0 "register_operand" "=r,r,#&r")
   1558  1.1  mrg 	(rotate:HIDI (match_operand:HIDI 1 "register_operand" "0,r,r")
   1559  1.1  mrg 		     (match_operand 2 "immediate_operand" "n,n,n")))
   1560  1.1  mrg    (clobber (match_operand:QI 3 "register_operand" "=<rotx>" ))]
   1561  1.1  mrg   "(CONST_INT_P (operands[2]) &&
   1562  1.1  mrg      (8 == (INTVAL (operands[2]) % 16)
   1563  1.1  mrg      	|| (!AVR_HAVE_MOVW && 0 == (INTVAL (operands[2]) % 16))))"
   1564  1.1  mrg   "#"
   1565  1.1  mrg   "&& (reload_completed || <MODE>mode == DImode)"
   1566  1.1  mrg   [(const_int 0)]
   1567  1.1  mrg   "avr_rotate_bytes (operands);
   1568  1.1  mrg   DONE;"
   1569  1.1  mrg )
   1570  1.1  mrg 
   1571  1.1  mrg 
   1572  1.1  mrg ;;<< << << << << << << << << << << << << << << << << << << << << << << << << <<
   1573  1.1  mrg ;; arithmetic shift left
   1574  1.1  mrg 
   1575  1.1  mrg (define_expand "ashlqi3"
   1576  1.1  mrg   [(set (match_operand:QI 0 "register_operand"            "")
   1577  1.1  mrg 	(ashift:QI (match_operand:QI 1 "register_operand" "")
   1578  1.1  mrg 		   (match_operand:QI 2 "general_operand"  "")))]
   1579  1.1  mrg   ""
   1580  1.1  mrg   "")
   1581  1.1  mrg 
   1582  1.1  mrg (define_split ; ashlqi3_const4
   1583  1.1  mrg   [(set (match_operand:QI 0 "d_register_operand" "")
   1584  1.1  mrg 	(ashift:QI (match_dup 0)
   1585  1.1  mrg 		   (const_int 4)))]
   1586  1.1  mrg   ""
   1587  1.1  mrg   [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
   1588  1.1  mrg    (set (match_dup 0) (and:QI (match_dup 0) (const_int -16)))]
   1589  1.1  mrg   "")
   1590  1.1  mrg 
   1591  1.1  mrg (define_split ; ashlqi3_const5
   1592  1.1  mrg   [(set (match_operand:QI 0 "d_register_operand" "")
   1593  1.1  mrg 	(ashift:QI (match_dup 0)
   1594  1.1  mrg 		   (const_int 5)))]
   1595  1.1  mrg   ""
   1596  1.1  mrg   [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
   1597  1.1  mrg    (set (match_dup 0) (ashift:QI (match_dup 0) (const_int 1)))
   1598  1.1  mrg    (set (match_dup 0) (and:QI (match_dup 0) (const_int -32)))]
   1599  1.1  mrg   "")
   1600  1.1  mrg 
   1601  1.1  mrg (define_split ; ashlqi3_const6
   1602  1.1  mrg   [(set (match_operand:QI 0 "d_register_operand" "")
   1603  1.1  mrg 	(ashift:QI (match_dup 0)
   1604  1.1  mrg 		   (const_int 6)))]
   1605  1.1  mrg   ""
   1606  1.1  mrg   [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
   1607  1.1  mrg    (set (match_dup 0) (ashift:QI (match_dup 0) (const_int 2)))
   1608  1.1  mrg    (set (match_dup 0) (and:QI (match_dup 0) (const_int -64)))]
   1609  1.1  mrg   "")
   1610  1.1  mrg 
   1611  1.1  mrg (define_insn "*ashlqi3"
   1612  1.1  mrg   [(set (match_operand:QI 0 "register_operand"           "=r,r,r,r,!d,r,r")
   1613  1.1  mrg 	(ashift:QI (match_operand:QI 1 "register_operand" "0,0,0,0,0,0,0")
   1614  1.1  mrg 		   (match_operand:QI 2 "general_operand"  "r,L,P,K,n,n,Qm")))]
   1615  1.1  mrg   ""
   1616  1.1  mrg   "* return ashlqi3_out (insn, operands, NULL);"
   1617  1.1  mrg   [(set_attr "length" "5,0,1,2,4,6,9")
   1618  1.1  mrg    (set_attr "cc" "clobber,none,set_czn,set_czn,set_czn,set_czn,clobber")])
   1619  1.1  mrg 
   1620  1.1  mrg (define_insn "ashlhi3"
   1621  1.1  mrg   [(set (match_operand:HI 0 "register_operand"           "=r,r,r,r,r,r,r")
   1622  1.1  mrg 	(ashift:HI (match_operand:HI 1 "register_operand" "0,0,0,r,0,0,0")
   1623  1.1  mrg 		   (match_operand:QI 2 "general_operand"  "r,L,P,O,K,n,Qm")))]
   1624  1.1  mrg   ""
   1625  1.1  mrg   "* return ashlhi3_out (insn, operands, NULL);"
   1626  1.1  mrg   [(set_attr "length" "6,0,2,2,4,10,10")
   1627  1.1  mrg    (set_attr "cc" "clobber,none,set_n,clobber,set_n,clobber,clobber")])
   1628  1.1  mrg 
   1629  1.1  mrg (define_insn "ashlsi3"
   1630  1.1  mrg   [(set (match_operand:SI 0 "register_operand"           "=r,r,r,r,r,r,r")
   1631  1.1  mrg 	(ashift:SI (match_operand:SI 1 "register_operand" "0,0,0,r,0,0,0")
   1632  1.1  mrg 		   (match_operand:QI 2 "general_operand"  "r,L,P,O,K,n,Qm")))]
   1633  1.1  mrg   ""
   1634  1.1  mrg   "* return ashlsi3_out (insn, operands, NULL);"
   1635  1.1  mrg   [(set_attr "length" "8,0,4,4,8,10,12")
   1636  1.1  mrg    (set_attr "cc" "clobber,none,set_n,clobber,set_n,clobber,clobber")])
   1637  1.1  mrg 
   1638  1.1  mrg ;; Optimize if a scratch register from LD_REGS happens to be available.
   1639  1.1  mrg 
   1640  1.1  mrg (define_peephole2 ; ashlqi3_l_const4
   1641  1.1  mrg   [(set (match_operand:QI 0 "l_register_operand" "")
   1642  1.1  mrg 	(ashift:QI (match_dup 0)
   1643  1.1  mrg 		   (const_int 4)))
   1644  1.1  mrg    (match_scratch:QI 1 "d")]
   1645  1.1  mrg   ""
   1646  1.1  mrg   [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
   1647  1.1  mrg    (set (match_dup 1) (const_int -16))
   1648  1.1  mrg    (set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))]
   1649  1.1  mrg   "")
   1650  1.1  mrg 
   1651  1.1  mrg (define_peephole2 ; ashlqi3_l_const5
   1652  1.1  mrg   [(set (match_operand:QI 0 "l_register_operand" "")
   1653  1.1  mrg 	(ashift:QI (match_dup 0)
   1654  1.1  mrg 		   (const_int 5)))
   1655  1.1  mrg    (match_scratch:QI 1 "d")]
   1656  1.1  mrg   ""
   1657  1.1  mrg   [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
   1658  1.1  mrg    (set (match_dup 0) (ashift:QI (match_dup 0) (const_int 1)))
   1659  1.1  mrg    (set (match_dup 1) (const_int -32))
   1660  1.1  mrg    (set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))]
   1661  1.1  mrg   "")
   1662  1.1  mrg 
   1663  1.1  mrg (define_peephole2 ; ashlqi3_l_const6
   1664  1.1  mrg   [(set (match_operand:QI 0 "l_register_operand" "")
   1665  1.1  mrg 	(ashift:QI (match_dup 0)
   1666  1.1  mrg 		   (const_int 6)))
   1667  1.1  mrg    (match_scratch:QI 1 "d")]
   1668  1.1  mrg   ""
   1669  1.1  mrg   [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
   1670  1.1  mrg    (set (match_dup 0) (ashift:QI (match_dup 0) (const_int 2)))
   1671  1.1  mrg    (set (match_dup 1) (const_int -64))
   1672  1.1  mrg    (set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))]
   1673  1.1  mrg   "")
   1674  1.1  mrg 
   1675  1.1  mrg (define_peephole2
   1676  1.1  mrg   [(match_scratch:QI 3 "d")
   1677  1.1  mrg    (set (match_operand:HI 0 "register_operand" "")
   1678  1.1  mrg 	(ashift:HI (match_operand:HI 1 "register_operand" "")
   1679  1.1  mrg 		   (match_operand:QI 2 "const_int_operand" "")))]
   1680  1.1  mrg   ""
   1681  1.1  mrg   [(parallel [(set (match_dup 0) (ashift:HI (match_dup 1) (match_dup 2)))
   1682  1.1  mrg 	      (clobber (match_dup 3))])]
   1683  1.1  mrg   "")
   1684  1.1  mrg 
   1685  1.1  mrg (define_insn "*ashlhi3_const"
   1686  1.1  mrg   [(set (match_operand:HI 0 "register_operand"            "=r,r,r,r,r")
   1687  1.1  mrg 	(ashift:HI (match_operand:HI 1 "register_operand"  "0,0,r,0,0")
   1688  1.1  mrg 		   (match_operand:QI 2 "const_int_operand" "L,P,O,K,n")))
   1689  1.1  mrg    (clobber (match_scratch:QI 3 "=X,X,X,X,&d"))]
   1690  1.1  mrg   "reload_completed"
   1691  1.1  mrg   "* return ashlhi3_out (insn, operands, NULL);"
   1692  1.1  mrg   [(set_attr "length" "0,2,2,4,10")
   1693  1.1  mrg    (set_attr "cc" "none,set_n,clobber,set_n,clobber")])
   1694  1.1  mrg 
   1695  1.1  mrg (define_peephole2
   1696  1.1  mrg   [(match_scratch:QI 3 "d")
   1697  1.1  mrg    (set (match_operand:SI 0 "register_operand" "")
   1698  1.1  mrg 	(ashift:SI (match_operand:SI 1 "register_operand" "")
   1699  1.1  mrg 		   (match_operand:QI 2 "const_int_operand" "")))]
   1700  1.1  mrg   ""
   1701  1.1  mrg   [(parallel [(set (match_dup 0) (ashift:SI (match_dup 1) (match_dup 2)))
   1702  1.1  mrg 	      (clobber (match_dup 3))])]
   1703  1.1  mrg   "")
   1704  1.1  mrg 
   1705  1.1  mrg (define_insn "*ashlsi3_const"
   1706  1.1  mrg   [(set (match_operand:SI 0 "register_operand"            "=r,r,r,r")
   1707  1.1  mrg 	(ashift:SI (match_operand:SI 1 "register_operand"  "0,0,r,0")
   1708  1.1  mrg 		   (match_operand:QI 2 "const_int_operand" "L,P,O,n")))
   1709  1.1  mrg    (clobber (match_scratch:QI 3 "=X,X,X,&d"))]
   1710  1.1  mrg   "reload_completed"
   1711  1.1  mrg   "* return ashlsi3_out (insn, operands, NULL);"
   1712  1.1  mrg   [(set_attr "length" "0,4,4,10")
   1713  1.1  mrg    (set_attr "cc" "none,set_n,clobber,clobber")])
   1714  1.1  mrg 
   1715  1.1  mrg ;; >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
   1716  1.1  mrg ;; arithmetic shift right
   1717  1.1  mrg 
   1718  1.1  mrg (define_insn "ashrqi3"
   1719  1.1  mrg   [(set (match_operand:QI 0 "register_operand" "=r,r,r,r,r,r")
   1720  1.1  mrg 	(ashiftrt:QI (match_operand:QI 1 "register_operand" "0,0,0,0,0,0")
   1721  1.1  mrg 		     (match_operand:QI 2 "general_operand"  "r,L,P,K,n,Qm")))]
   1722  1.1  mrg   ""
   1723  1.1  mrg   "* return ashrqi3_out (insn, operands, NULL);"
   1724  1.1  mrg   [(set_attr "length" "5,0,1,2,5,9")
   1725  1.1  mrg    (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber")])
   1726  1.1  mrg 
   1727  1.1  mrg (define_insn "ashrhi3"
   1728  1.1  mrg   [(set (match_operand:HI 0 "register_operand"             "=r,r,r,r,r,r,r")
   1729  1.1  mrg 	(ashiftrt:HI (match_operand:HI 1 "register_operand" "0,0,0,r,0,0,0")
   1730  1.1  mrg 		     (match_operand:QI 2 "general_operand"  "r,L,P,O,K,n,Qm")))]
   1731  1.1  mrg   ""
   1732  1.1  mrg   "* return ashrhi3_out (insn, operands, NULL);"
   1733  1.1  mrg   [(set_attr "length" "6,0,2,4,4,10,10")
   1734  1.1  mrg    (set_attr "cc" "clobber,none,clobber,set_n,clobber,clobber,clobber")])
   1735  1.1  mrg 
   1736  1.1  mrg (define_insn "ashrsi3"
   1737  1.1  mrg   [(set (match_operand:SI 0 "register_operand"             "=r,r,r,r,r,r,r")
   1738  1.1  mrg 	(ashiftrt:SI (match_operand:SI 1 "register_operand" "0,0,0,r,0,0,0")
   1739  1.1  mrg 		     (match_operand:QI 2 "general_operand"  "r,L,P,O,K,n,Qm")))]
   1740  1.1  mrg   ""
   1741  1.1  mrg   "* return ashrsi3_out (insn, operands, NULL);"
   1742  1.1  mrg   [(set_attr "length" "8,0,4,6,8,10,12")
   1743  1.1  mrg    (set_attr "cc" "clobber,none,clobber,set_n,clobber,clobber,clobber")])
   1744  1.1  mrg 
   1745  1.1  mrg ;; Optimize if a scratch register from LD_REGS happens to be available.
   1746  1.1  mrg 
   1747  1.1  mrg (define_peephole2
   1748  1.1  mrg   [(match_scratch:QI 3 "d")
   1749  1.1  mrg    (set (match_operand:HI 0 "register_operand" "")
   1750  1.1  mrg 	(ashiftrt:HI (match_operand:HI 1 "register_operand" "")
   1751  1.1  mrg 		     (match_operand:QI 2 "const_int_operand" "")))]
   1752  1.1  mrg   ""
   1753  1.1  mrg   [(parallel [(set (match_dup 0) (ashiftrt:HI (match_dup 1) (match_dup 2)))
   1754  1.1  mrg 	      (clobber (match_dup 3))])]
   1755  1.1  mrg   "")
   1756  1.1  mrg 
   1757  1.1  mrg (define_insn "*ashrhi3_const"
   1758  1.1  mrg   [(set (match_operand:HI 0 "register_operand"              "=r,r,r,r,r")
   1759  1.1  mrg 	(ashiftrt:HI (match_operand:HI 1 "register_operand"  "0,0,r,0,0")
   1760  1.1  mrg 		     (match_operand:QI 2 "const_int_operand" "L,P,O,K,n")))
   1761  1.1  mrg    (clobber (match_scratch:QI 3 "=X,X,X,X,&d"))]
   1762  1.1  mrg   "reload_completed"
   1763  1.1  mrg   "* return ashrhi3_out (insn, operands, NULL);"
   1764  1.1  mrg   [(set_attr "length" "0,2,4,4,10")
   1765  1.1  mrg    (set_attr "cc" "none,clobber,set_n,clobber,clobber")])
   1766  1.1  mrg 
   1767  1.1  mrg (define_peephole2
   1768  1.1  mrg   [(match_scratch:QI 3 "d")
   1769  1.1  mrg    (set (match_operand:SI 0 "register_operand" "")
   1770  1.1  mrg 	(ashiftrt:SI (match_operand:SI 1 "register_operand" "")
   1771  1.1  mrg 		     (match_operand:QI 2 "const_int_operand" "")))]
   1772  1.1  mrg   ""
   1773  1.1  mrg   [(parallel [(set (match_dup 0) (ashiftrt:SI (match_dup 1) (match_dup 2)))
   1774  1.1  mrg 	      (clobber (match_dup 3))])]
   1775  1.1  mrg   "")
   1776  1.1  mrg 
   1777  1.1  mrg (define_insn "*ashrsi3_const"
   1778  1.1  mrg   [(set (match_operand:SI 0 "register_operand"              "=r,r,r,r")
   1779  1.1  mrg 	(ashiftrt:SI (match_operand:SI 1 "register_operand"  "0,0,r,0")
   1780  1.1  mrg 		     (match_operand:QI 2 "const_int_operand" "L,P,O,n")))
   1781  1.1  mrg    (clobber (match_scratch:QI 3 "=X,X,X,&d"))]
   1782  1.1  mrg   "reload_completed"
   1783  1.1  mrg   "* return ashrsi3_out (insn, operands, NULL);"
   1784  1.1  mrg   [(set_attr "length" "0,4,4,10")
   1785  1.1  mrg    (set_attr "cc" "none,clobber,set_n,clobber")])
   1786  1.1  mrg 
   1787  1.1  mrg ;; >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
   1788  1.1  mrg ;; logical shift right
   1789  1.1  mrg 
   1790  1.1  mrg (define_expand "lshrqi3"
   1791  1.1  mrg   [(set (match_operand:QI 0 "register_operand"              "")
   1792  1.1  mrg 	(lshiftrt:QI (match_operand:QI 1 "register_operand" "")
   1793  1.1  mrg 		     (match_operand:QI 2 "general_operand"  "")))]
   1794  1.1  mrg   ""
   1795  1.1  mrg   "")
   1796  1.1  mrg 
   1797  1.1  mrg (define_split	; lshrqi3_const4
   1798  1.1  mrg   [(set (match_operand:QI 0 "d_register_operand" "")
   1799  1.1  mrg 	(lshiftrt:QI (match_dup 0)
   1800  1.1  mrg 		     (const_int 4)))]
   1801  1.1  mrg   ""
   1802  1.1  mrg   [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
   1803  1.1  mrg    (set (match_dup 0) (and:QI (match_dup 0) (const_int 15)))]
   1804  1.1  mrg   "")
   1805  1.1  mrg 
   1806  1.1  mrg (define_split	; lshrqi3_const5
   1807  1.1  mrg   [(set (match_operand:QI 0 "d_register_operand" "")
   1808  1.1  mrg 	(lshiftrt:QI (match_dup 0)
   1809  1.1  mrg 		     (const_int 5)))]
   1810  1.1  mrg   ""
   1811  1.1  mrg   [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
   1812  1.1  mrg    (set (match_dup 0) (lshiftrt:QI (match_dup 0) (const_int 1)))
   1813  1.1  mrg    (set (match_dup 0) (and:QI (match_dup 0) (const_int 7)))]
   1814  1.1  mrg   "")
   1815  1.1  mrg 
   1816  1.1  mrg (define_split	; lshrqi3_const6
   1817  1.1  mrg   [(set (match_operand:QI 0 "d_register_operand" "")
   1818  1.1  mrg 	(lshiftrt:QI (match_dup 0)
   1819  1.1  mrg 		     (const_int 6)))]
   1820  1.1  mrg   ""
   1821  1.1  mrg   [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
   1822  1.1  mrg    (set (match_dup 0) (lshiftrt:QI (match_dup 0) (const_int 2)))
   1823  1.1  mrg    (set (match_dup 0) (and:QI (match_dup 0) (const_int 3)))]
   1824  1.1  mrg   "")
   1825  1.1  mrg 
   1826  1.1  mrg (define_insn "*lshrqi3"
   1827  1.1  mrg   [(set (match_operand:QI 0 "register_operand"             "=r,r,r,r,!d,r,r")
   1828  1.1  mrg 	(lshiftrt:QI (match_operand:QI 1 "register_operand" "0,0,0,0,0,0,0")
   1829  1.1  mrg 		     (match_operand:QI 2 "general_operand"  "r,L,P,K,n,n,Qm")))]
   1830  1.1  mrg   ""
   1831  1.1  mrg   "* return lshrqi3_out (insn, operands, NULL);"
   1832  1.1  mrg   [(set_attr "length" "5,0,1,2,4,6,9")
   1833  1.1  mrg    (set_attr "cc" "clobber,none,set_czn,set_czn,set_czn,set_czn,clobber")])
   1834  1.1  mrg 
   1835  1.1  mrg (define_insn "lshrhi3"
   1836  1.1  mrg   [(set (match_operand:HI 0 "register_operand"             "=r,r,r,r,r,r,r")
   1837  1.1  mrg 	(lshiftrt:HI (match_operand:HI 1 "register_operand" "0,0,0,r,0,0,0")
   1838  1.1  mrg 		     (match_operand:QI 2 "general_operand"  "r,L,P,O,K,n,Qm")))]
   1839  1.1  mrg   ""
   1840  1.1  mrg   "* return lshrhi3_out (insn, operands, NULL);"
   1841  1.1  mrg   [(set_attr "length" "6,0,2,2,4,10,10")
   1842  1.1  mrg    (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber,clobber")])
   1843  1.1  mrg 
   1844  1.1  mrg (define_insn "lshrsi3"
   1845  1.1  mrg   [(set (match_operand:SI 0 "register_operand"             "=r,r,r,r,r,r,r")
   1846  1.1  mrg 	(lshiftrt:SI (match_operand:SI 1 "register_operand" "0,0,0,r,0,0,0")
   1847  1.1  mrg 		     (match_operand:QI 2 "general_operand"  "r,L,P,O,K,n,Qm")))]
   1848  1.1  mrg   ""
   1849  1.1  mrg   "* return lshrsi3_out (insn, operands, NULL);"
   1850  1.1  mrg   [(set_attr "length" "8,0,4,4,8,10,12")
   1851  1.1  mrg    (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber,clobber")])
   1852  1.1  mrg 
   1853  1.1  mrg ;; Optimize if a scratch register from LD_REGS happens to be available.
   1854  1.1  mrg 
   1855  1.1  mrg (define_peephole2 ; lshrqi3_l_const4
   1856  1.1  mrg   [(set (match_operand:QI 0 "l_register_operand" "")
   1857  1.1  mrg 	(lshiftrt:QI (match_dup 0)
   1858  1.1  mrg 		     (const_int 4)))
   1859  1.1  mrg    (match_scratch:QI 1 "d")]
   1860  1.1  mrg   ""
   1861  1.1  mrg   [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
   1862  1.1  mrg    (set (match_dup 1) (const_int 15))
   1863  1.1  mrg    (set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))]
   1864  1.1  mrg   "")
   1865  1.1  mrg 
   1866  1.1  mrg (define_peephole2 ; lshrqi3_l_const5
   1867  1.1  mrg   [(set (match_operand:QI 0 "l_register_operand" "")
   1868  1.1  mrg 	(lshiftrt:QI (match_dup 0)
   1869  1.1  mrg 		     (const_int 5)))
   1870  1.1  mrg    (match_scratch:QI 1 "d")]
   1871  1.1  mrg   ""
   1872  1.1  mrg   [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
   1873  1.1  mrg    (set (match_dup 0) (lshiftrt:QI (match_dup 0) (const_int 1)))
   1874  1.1  mrg    (set (match_dup 1) (const_int 7))
   1875  1.1  mrg    (set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))]
   1876  1.1  mrg   "")
   1877  1.1  mrg 
   1878  1.1  mrg (define_peephole2 ; lshrqi3_l_const6
   1879  1.1  mrg   [(set (match_operand:QI 0 "l_register_operand" "")
   1880  1.1  mrg 	(lshiftrt:QI (match_dup 0)
   1881  1.1  mrg 		     (const_int 6)))
   1882  1.1  mrg    (match_scratch:QI 1 "d")]
   1883  1.1  mrg   ""
   1884  1.1  mrg   [(set (match_dup 0) (rotate:QI (match_dup 0) (const_int 4)))
   1885  1.1  mrg    (set (match_dup 0) (lshiftrt:QI (match_dup 0) (const_int 2)))
   1886  1.1  mrg    (set (match_dup 1) (const_int 3))
   1887  1.1  mrg    (set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))]
   1888  1.1  mrg   "")
   1889  1.1  mrg 
   1890  1.1  mrg (define_peephole2
   1891  1.1  mrg   [(match_scratch:QI 3 "d")
   1892  1.1  mrg    (set (match_operand:HI 0 "register_operand" "")
   1893  1.1  mrg 	(lshiftrt:HI (match_operand:HI 1 "register_operand" "")
   1894  1.1  mrg 		     (match_operand:QI 2 "const_int_operand" "")))]
   1895  1.1  mrg   ""
   1896  1.1  mrg   [(parallel [(set (match_dup 0) (lshiftrt:HI (match_dup 1) (match_dup 2)))
   1897  1.1  mrg 	      (clobber (match_dup 3))])]
   1898  1.1  mrg   "")
   1899  1.1  mrg 
   1900  1.1  mrg (define_insn "*lshrhi3_const"
   1901  1.1  mrg   [(set (match_operand:HI 0 "register_operand"              "=r,r,r,r,r")
   1902  1.1  mrg 	(lshiftrt:HI (match_operand:HI 1 "register_operand"  "0,0,r,0,0")
   1903  1.1  mrg 		     (match_operand:QI 2 "const_int_operand" "L,P,O,K,n")))
   1904  1.1  mrg    (clobber (match_scratch:QI 3 "=X,X,X,X,&d"))]
   1905  1.1  mrg   "reload_completed"
   1906  1.1  mrg   "* return lshrhi3_out (insn, operands, NULL);"
   1907  1.1  mrg   [(set_attr "length" "0,2,2,4,10")
   1908  1.1  mrg    (set_attr "cc" "none,clobber,clobber,clobber,clobber")])
   1909  1.1  mrg 
   1910  1.1  mrg (define_peephole2
   1911  1.1  mrg   [(match_scratch:QI 3 "d")
   1912  1.1  mrg    (set (match_operand:SI 0 "register_operand" "")
   1913  1.1  mrg 	(lshiftrt:SI (match_operand:SI 1 "register_operand" "")
   1914  1.1  mrg 		     (match_operand:QI 2 "const_int_operand" "")))]
   1915  1.1  mrg   ""
   1916  1.1  mrg   [(parallel [(set (match_dup 0) (lshiftrt:SI (match_dup 1) (match_dup 2)))
   1917  1.1  mrg 	      (clobber (match_dup 3))])]
   1918  1.1  mrg   "")
   1919  1.1  mrg 
   1920  1.1  mrg (define_insn "*lshrsi3_const"
   1921  1.1  mrg   [(set (match_operand:SI 0 "register_operand"              "=r,r,r,r")
   1922  1.1  mrg 	(lshiftrt:SI (match_operand:SI 1 "register_operand"  "0,0,r,0")
   1923  1.1  mrg 		     (match_operand:QI 2 "const_int_operand" "L,P,O,n")))
   1924  1.1  mrg    (clobber (match_scratch:QI 3 "=X,X,X,&d"))]
   1925  1.1  mrg   "reload_completed"
   1926  1.1  mrg   "* return lshrsi3_out (insn, operands, NULL);"
   1927  1.1  mrg   [(set_attr "length" "0,4,4,10")
   1928  1.1  mrg    (set_attr "cc" "none,clobber,clobber,clobber")])
   1929  1.1  mrg 
   1930  1.1  mrg ;; abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x)
   1931  1.1  mrg ;; abs
   1932  1.1  mrg 
   1933  1.1  mrg (define_insn "absqi2"
   1934  1.1  mrg   [(set (match_operand:QI 0 "register_operand" "=r")
   1935  1.1  mrg         (abs:QI (match_operand:QI 1 "register_operand" "0")))]
   1936  1.1  mrg   ""
   1937  1.1  mrg   "sbrc %0,7
   1938  1.1  mrg 	neg %0"
   1939  1.1  mrg   [(set_attr "length" "2")
   1940  1.1  mrg    (set_attr "cc" "clobber")])
   1941  1.1  mrg 
   1942  1.1  mrg 
   1943  1.1  mrg (define_insn "abssf2"
   1944  1.1  mrg   [(set (match_operand:SF 0 "register_operand" "=d,r")
   1945  1.1  mrg         (abs:SF (match_operand:SF 1 "register_operand" "0,0")))]
   1946  1.1  mrg   ""
   1947  1.1  mrg   "@
   1948  1.1  mrg 	andi %D0,0x7f
   1949  1.1  mrg 	clt\;bld %D0,7"
   1950  1.1  mrg   [(set_attr "length" "1,2")
   1951  1.1  mrg    (set_attr "cc" "set_n,clobber")])
   1952  1.1  mrg 
   1953  1.1  mrg ;; 0 - x  0 - x  0 - x  0 - x  0 - x  0 - x  0 - x  0 - x  0 - x  0 - x  0 - x
   1954  1.1  mrg ;; neg
   1955  1.1  mrg 
   1956  1.1  mrg (define_insn "negqi2"
   1957  1.1  mrg   [(set (match_operand:QI 0 "register_operand" "=r")
   1958  1.1  mrg         (neg:QI (match_operand:QI 1 "register_operand" "0")))]
   1959  1.1  mrg   ""
   1960  1.1  mrg   "neg %0"
   1961  1.1  mrg   [(set_attr "length" "1")
   1962  1.1  mrg    (set_attr "cc" "set_zn")])
   1963  1.1  mrg 
   1964  1.1  mrg (define_insn "neghi2"
   1965  1.1  mrg   [(set (match_operand:HI 0 "register_operand"       "=!d,r,&r")
   1966  1.1  mrg 	(neg:HI (match_operand:HI 1 "register_operand" "0,0,r")))]
   1967  1.1  mrg   ""
   1968  1.1  mrg   "@
   1969  1.1  mrg 	com %B0\;neg %A0\;sbci %B0,lo8(-1)
   1970  1.1  mrg 	com %B0\;neg %A0\;sbc %B0,__zero_reg__\;inc %B0
   1971  1.1  mrg 	clr %A0\;clr %B0\;sub %A0,%A1\;sbc %B0,%B1"
   1972  1.1  mrg   [(set_attr "length" "3,4,4")
   1973  1.1  mrg    (set_attr "cc" "set_czn,set_n,set_czn")])
   1974  1.1  mrg 
   1975  1.1  mrg (define_insn "negsi2"
   1976  1.1  mrg   [(set (match_operand:SI 0 "register_operand"       "=!d,r,&r")
   1977  1.1  mrg 	(neg:SI (match_operand:SI 1 "register_operand" "0,0,r")))]
   1978  1.1  mrg   ""
   1979  1.1  mrg   "@
   1980  1.1  mrg 	com %D0\;com %C0\;com %B0\;neg %A0\;sbci %B0,lo8(-1)\;sbci %C0,lo8(-1)\;sbci %D0,lo8(-1)
   1981  1.1  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__
   1982  1.1  mrg 	clr %A0\;clr %B0\;{clr %C0\;clr %D0|movw %C0,%A0}\;sub %A0,%A1\;sbc %B0,%B1\;sbc %C0,%C1\;sbc %D0,%D1"
   1983  1.1  mrg   [(set_attr_alternative "length"
   1984  1.1  mrg 			 [(const_int 7)
   1985  1.1  mrg 			  (const_int 8)
   1986  1.1  mrg 			  (if_then_else (eq_attr "mcu_have_movw" "yes")
   1987  1.1  mrg 					(const_int 7)
   1988  1.1  mrg 					(const_int 8))])
   1989  1.1  mrg    (set_attr "cc" "set_czn,set_n,set_czn")])
   1990  1.1  mrg 
   1991  1.1  mrg (define_insn "negsf2"
   1992  1.1  mrg   [(set (match_operand:SF 0 "register_operand" "=d,r")
   1993  1.1  mrg 	(neg:SF (match_operand:SF 1 "register_operand" "0,0")))]
   1994  1.1  mrg   ""
   1995  1.1  mrg   "@
   1996  1.1  mrg 	subi %D0,0x80
   1997  1.1  mrg 	bst %D0,7\;com %D0\;bld %D0,7\;com %D0"
   1998  1.1  mrg   [(set_attr "length" "1,4")
   1999  1.1  mrg    (set_attr "cc" "set_n,set_n")])
   2000  1.1  mrg 
   2001  1.1  mrg ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   2002  1.1  mrg ;; not
   2003  1.1  mrg 
   2004  1.1  mrg (define_insn "one_cmplqi2"
   2005  1.1  mrg   [(set (match_operand:QI 0 "register_operand" "=r")
   2006  1.1  mrg         (not:QI (match_operand:QI 1 "register_operand" "0")))]
   2007  1.1  mrg   ""
   2008  1.1  mrg   "com %0"
   2009  1.1  mrg   [(set_attr "length" "1")
   2010  1.1  mrg    (set_attr "cc" "set_czn")])
   2011  1.1  mrg 
   2012  1.1  mrg (define_insn "one_cmplhi2"
   2013  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=r")
   2014  1.1  mrg         (not:HI (match_operand:HI 1 "register_operand" "0")))]
   2015  1.1  mrg   ""
   2016  1.1  mrg   "com %0
   2017  1.1  mrg 	com %B0"
   2018  1.1  mrg   [(set_attr "length" "2")
   2019  1.1  mrg    (set_attr "cc" "set_n")])
   2020  1.1  mrg 
   2021  1.1  mrg (define_insn "one_cmplsi2"
   2022  1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=r")
   2023  1.1  mrg         (not:SI (match_operand:SI 1 "register_operand" "0")))]
   2024  1.1  mrg   ""
   2025  1.1  mrg   "com %0
   2026  1.1  mrg 	com %B0
   2027  1.1  mrg 	com %C0
   2028  1.1  mrg 	com %D0"
   2029  1.1  mrg   [(set_attr "length" "4")
   2030  1.1  mrg    (set_attr "cc" "set_n")])
   2031  1.1  mrg 
   2032  1.1  mrg ;; xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x
   2033  1.1  mrg ;; sign extend
   2034  1.1  mrg 
   2035  1.1  mrg (define_insn "extendqihi2"
   2036  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=r,r")
   2037  1.1  mrg         (sign_extend:HI (match_operand:QI 1 "register_operand" "0,*r")))]
   2038  1.1  mrg   ""
   2039  1.1  mrg   "@
   2040  1.1  mrg 	clr %B0\;sbrc %0,7\;com %B0
   2041  1.1  mrg 	mov %A0,%A1\;clr %B0\;sbrc %A0,7\;com %B0"
   2042  1.1  mrg   [(set_attr "length" "3,4")
   2043  1.1  mrg    (set_attr "cc" "set_n,set_n")])
   2044  1.1  mrg 
   2045  1.1  mrg (define_insn "extendqisi2"
   2046  1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=r,r")
   2047  1.1  mrg         (sign_extend:SI (match_operand:QI 1 "register_operand" "0,*r")))]
   2048  1.1  mrg   ""
   2049  1.1  mrg   "@
   2050  1.1  mrg 	clr %B0\;sbrc %A0,7\;com %B0\;mov %C0,%B0\;mov %D0,%B0
   2051  1.1  mrg 	mov %A0,%A1\;clr %B0\;sbrc %A0,7\;com %B0\;mov %C0,%B0\;mov %D0,%B0"
   2052  1.1  mrg   [(set_attr "length" "5,6")
   2053  1.1  mrg    (set_attr "cc" "set_n,set_n")])
   2054  1.1  mrg 
   2055  1.1  mrg (define_insn "extendhisi2"
   2056  1.1  mrg   [(set (match_operand:SI 0 "register_operand"               "=r,&r")
   2057  1.1  mrg         (sign_extend:SI (match_operand:HI 1 "register_operand" "0,*r")))]
   2058  1.1  mrg   ""
   2059  1.1  mrg   "@
   2060  1.1  mrg 	clr %C0\;sbrc %B0,7\;com %C0\;mov %D0,%C0
   2061  1.1  mrg 	{mov %A0,%A1\;mov %B0,%B1|movw %A0,%A1}\;clr %C0\;sbrc %B0,7\;com %C0\;mov %D0,%C0"
   2062  1.1  mrg   [(set_attr_alternative "length"
   2063  1.1  mrg 			 [(const_int 4)
   2064  1.1  mrg 			  (if_then_else (eq_attr "mcu_have_movw" "yes")
   2065  1.1  mrg 					(const_int 5)
   2066  1.1  mrg 					(const_int 6))])
   2067  1.1  mrg    (set_attr "cc" "set_n,set_n")])
   2068  1.1  mrg 
   2069  1.1  mrg ;; xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x
   2070  1.1  mrg ;; zero extend
   2071  1.1  mrg 
   2072  1.1  mrg (define_insn_and_split "zero_extendqihi2"
   2073  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=r")
   2074  1.1  mrg         (zero_extend:HI (match_operand:QI 1 "register_operand" "r")))]
   2075  1.1  mrg   ""
   2076  1.1  mrg   "#"
   2077  1.1  mrg   "reload_completed"
   2078  1.1  mrg   [(set (match_dup 2) (match_dup 1))
   2079  1.1  mrg    (set (match_dup 3) (const_int 0))]
   2080  1.1  mrg   "unsigned int low_off = subreg_lowpart_offset (QImode, HImode);
   2081  1.1  mrg    unsigned int high_off = subreg_highpart_offset (QImode, HImode);
   2082  1.1  mrg    
   2083  1.1  mrg    operands[2] = simplify_gen_subreg (QImode, operands[0], HImode, low_off);
   2084  1.1  mrg    operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, high_off);
   2085  1.1  mrg   ")
   2086  1.1  mrg 
   2087  1.1  mrg (define_insn_and_split "zero_extendqisi2"
   2088  1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=r")
   2089  1.1  mrg         (zero_extend:SI (match_operand:QI 1 "register_operand" "r")))]
   2090  1.1  mrg   ""
   2091  1.1  mrg   "#"
   2092  1.1  mrg   "reload_completed"
   2093  1.1  mrg   [(set (match_dup 2) (zero_extend:HI (match_dup 1)))
   2094  1.1  mrg    (set (match_dup 3) (const_int 0))]
   2095  1.1  mrg   "unsigned int low_off = subreg_lowpart_offset (HImode, SImode);
   2096  1.1  mrg    unsigned int high_off = subreg_highpart_offset (HImode, SImode);
   2097  1.1  mrg    
   2098  1.1  mrg    operands[2] = simplify_gen_subreg (HImode, operands[0], SImode, low_off);
   2099  1.1  mrg    operands[3] = simplify_gen_subreg (HImode, operands[0], SImode, high_off);
   2100  1.1  mrg   ")
   2101  1.1  mrg 
   2102  1.1  mrg (define_insn_and_split "zero_extendhisi2"
   2103  1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=r")
   2104  1.1  mrg         (zero_extend:SI (match_operand:HI 1 "register_operand" "r")))]
   2105  1.1  mrg   ""
   2106  1.1  mrg   "#"
   2107  1.1  mrg   "reload_completed"
   2108  1.1  mrg   [(set (match_dup 2) (match_dup 1))
   2109  1.1  mrg    (set (match_dup 3) (const_int 0))]
   2110  1.1  mrg   "unsigned int low_off = subreg_lowpart_offset (HImode, SImode);
   2111  1.1  mrg    unsigned int high_off = subreg_highpart_offset (HImode, SImode);
   2112  1.1  mrg    
   2113  1.1  mrg    operands[2] = simplify_gen_subreg (HImode, operands[0], SImode, low_off);
   2114  1.1  mrg    operands[3] = simplify_gen_subreg (HImode, operands[0], SImode, high_off);
   2115  1.1  mrg   ")
   2116  1.1  mrg 
   2117  1.1  mrg (define_insn_and_split "zero_extendqidi2"
   2118  1.1  mrg   [(set (match_operand:DI 0 "register_operand" "=r")
   2119  1.1  mrg         (zero_extend:DI (match_operand:QI 1 "register_operand" "r")))]
   2120  1.1  mrg   ""
   2121  1.1  mrg   "#"
   2122  1.1  mrg   "reload_completed"
   2123  1.1  mrg   [(set (match_dup 2) (zero_extend:SI (match_dup 1)))
   2124  1.1  mrg    (set (match_dup 3) (const_int 0))]
   2125  1.1  mrg   "unsigned int low_off = subreg_lowpart_offset (SImode, DImode);
   2126  1.1  mrg    unsigned int high_off = subreg_highpart_offset (SImode, DImode);
   2127  1.1  mrg    
   2128  1.1  mrg    operands[2] = simplify_gen_subreg (SImode, operands[0], DImode, low_off);
   2129  1.1  mrg    operands[3] = simplify_gen_subreg (SImode, operands[0], DImode, high_off);
   2130  1.1  mrg   ")
   2131  1.1  mrg 
   2132  1.1  mrg (define_insn_and_split "zero_extendhidi2"
   2133  1.1  mrg   [(set (match_operand:DI 0 "register_operand" "=r")
   2134  1.1  mrg         (zero_extend:DI (match_operand:HI 1 "register_operand" "r")))]
   2135  1.1  mrg   ""
   2136  1.1  mrg   "#"
   2137  1.1  mrg   "reload_completed"
   2138  1.1  mrg   [(set (match_dup 2) (zero_extend:SI (match_dup 1)))
   2139  1.1  mrg    (set (match_dup 3) (const_int 0))]
   2140  1.1  mrg   "unsigned int low_off = subreg_lowpart_offset (SImode, DImode);
   2141  1.1  mrg    unsigned int high_off = subreg_highpart_offset (SImode, DImode);
   2142  1.1  mrg    
   2143  1.1  mrg    operands[2] = simplify_gen_subreg (SImode, operands[0], DImode, low_off);
   2144  1.1  mrg    operands[3] = simplify_gen_subreg (SImode, operands[0], DImode, high_off);
   2145  1.1  mrg   ")
   2146  1.1  mrg 
   2147  1.1  mrg (define_insn_and_split "zero_extendsidi2"
   2148  1.1  mrg   [(set (match_operand:DI 0 "register_operand" "=r")
   2149  1.1  mrg         (zero_extend:DI (match_operand:SI 1 "register_operand" "r")))]
   2150  1.1  mrg   ""
   2151  1.1  mrg   "#"
   2152  1.1  mrg   "reload_completed"
   2153  1.1  mrg   [(set (match_dup 2) (match_dup 1))
   2154  1.1  mrg    (set (match_dup 3) (const_int 0))]
   2155  1.1  mrg   "unsigned int low_off = subreg_lowpart_offset (SImode, DImode);
   2156  1.1  mrg    unsigned int high_off = subreg_highpart_offset (SImode, DImode);
   2157  1.1  mrg    
   2158  1.1  mrg    operands[2] = simplify_gen_subreg (SImode, operands[0], DImode, low_off);
   2159  1.1  mrg    operands[3] = simplify_gen_subreg (SImode, operands[0], DImode, high_off);
   2160  1.1  mrg   ")
   2161  1.1  mrg 
   2162  1.1  mrg ;;<=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=>
   2163  1.1  mrg ;; compare
   2164  1.1  mrg 
   2165  1.1  mrg ; Optimize negated tests into reverse compare if overflow is undefined.
   2166  1.1  mrg (define_insn "*negated_tstqi"
   2167  1.1  mrg   [(set (cc0)
   2168  1.1  mrg         (compare (neg:QI (match_operand:QI 0 "register_operand" "r"))
   2169  1.1  mrg 		 (const_int 0)))]
   2170  1.1  mrg   "(!flag_wrapv && !flag_trapv && flag_strict_overflow)"
   2171  1.1  mrg   "cp __zero_reg__,%0"
   2172  1.1  mrg   [(set_attr "cc" "compare")
   2173  1.1  mrg    (set_attr "length" "1")])
   2174  1.1  mrg 
   2175  1.1  mrg (define_insn "*reversed_tstqi"
   2176  1.1  mrg   [(set (cc0)
   2177  1.1  mrg         (compare (const_int 0)
   2178  1.1  mrg 		 (match_operand:QI 0 "register_operand" "r")))]
   2179  1.1  mrg   ""
   2180  1.1  mrg   "cp __zero_reg__,%0"
   2181  1.1  mrg [(set_attr "cc" "compare")
   2182  1.1  mrg  (set_attr "length" "2")])
   2183  1.1  mrg 
   2184  1.1  mrg (define_insn "*negated_tsthi"
   2185  1.1  mrg   [(set (cc0)
   2186  1.1  mrg         (compare (neg:HI (match_operand:HI 0 "register_operand" "r"))
   2187  1.1  mrg 		 (const_int 0)))]
   2188  1.1  mrg   "(!flag_wrapv && !flag_trapv && flag_strict_overflow)"
   2189  1.1  mrg   "cp __zero_reg__,%A0
   2190  1.1  mrg 	cpc __zero_reg__,%B0"
   2191  1.1  mrg [(set_attr "cc" "compare")
   2192  1.1  mrg  (set_attr "length" "2")])
   2193  1.1  mrg 
   2194  1.1  mrg ;; Leave here the clobber used by the cmphi pattern for simplicity, even
   2195  1.1  mrg ;; though it is unused, because this pattern is synthesized by avr_reorg.
   2196  1.1  mrg (define_insn "*reversed_tsthi"
   2197  1.1  mrg   [(set (cc0)
   2198  1.1  mrg         (compare (const_int 0)
   2199  1.1  mrg 		 (match_operand:HI 0 "register_operand" "r")))
   2200  1.1  mrg    (clobber (match_scratch:QI 1 "=X"))]
   2201  1.1  mrg   ""
   2202  1.1  mrg   "cp __zero_reg__,%A0
   2203  1.1  mrg 	cpc __zero_reg__,%B0"
   2204  1.1  mrg [(set_attr "cc" "compare")
   2205  1.1  mrg  (set_attr "length" "2")])
   2206  1.1  mrg 
   2207  1.1  mrg (define_insn "*negated_tstsi"
   2208  1.1  mrg   [(set (cc0)
   2209  1.1  mrg         (compare (neg:SI (match_operand:SI 0 "register_operand" "r"))
   2210  1.1  mrg 		 (const_int 0)))]
   2211  1.1  mrg   "(!flag_wrapv && !flag_trapv && flag_strict_overflow)"
   2212  1.1  mrg   "cp __zero_reg__,%A0
   2213  1.1  mrg 	cpc __zero_reg__,%B0
   2214  1.1  mrg 	cpc __zero_reg__,%C0
   2215  1.1  mrg 	cpc __zero_reg__,%D0"
   2216  1.1  mrg   [(set_attr "cc" "compare")
   2217  1.1  mrg    (set_attr "length" "4")])
   2218  1.1  mrg 
   2219  1.1  mrg (define_insn "*reversed_tstsi"
   2220  1.1  mrg   [(set (cc0)
   2221  1.1  mrg         (compare (const_int 0)
   2222  1.1  mrg 		 (match_operand:SI 0 "register_operand" "r")))
   2223  1.1  mrg    (clobber (match_scratch:QI 1 "=X"))]
   2224  1.1  mrg   ""
   2225  1.1  mrg   "cp __zero_reg__,%A0
   2226  1.1  mrg 	cpc __zero_reg__,%B0
   2227  1.1  mrg 	cpc __zero_reg__,%C0
   2228  1.1  mrg 	cpc __zero_reg__,%D0"
   2229  1.1  mrg   [(set_attr "cc" "compare")
   2230  1.1  mrg    (set_attr "length" "4")])
   2231  1.1  mrg 
   2232  1.1  mrg 
   2233  1.1  mrg (define_insn "*cmpqi"
   2234  1.1  mrg   [(set (cc0)
   2235  1.1  mrg         (compare (match_operand:QI 0 "register_operand"  "r,r,d")
   2236  1.1  mrg 		 (match_operand:QI 1 "nonmemory_operand" "L,r,i")))]
   2237  1.1  mrg   ""
   2238  1.1  mrg   "@
   2239  1.1  mrg 	tst %0
   2240  1.1  mrg 	cp %0,%1
   2241  1.1  mrg 	cpi %0,lo8(%1)"
   2242  1.1  mrg   [(set_attr "cc" "compare,compare,compare")
   2243  1.1  mrg    (set_attr "length" "1,1,1")])
   2244  1.1  mrg 
   2245  1.1  mrg (define_insn "*cmpqi_sign_extend"
   2246  1.1  mrg   [(set (cc0)
   2247  1.1  mrg         (compare (sign_extend:HI
   2248  1.1  mrg 		  (match_operand:QI 0 "register_operand"  "d"))
   2249  1.1  mrg 		 (match_operand:HI 1 "const_int_operand" "n")))]
   2250  1.1  mrg   "INTVAL (operands[1]) >= -128 && INTVAL (operands[1]) <= 127"
   2251  1.1  mrg   "cpi %0,lo8(%1)"
   2252  1.1  mrg   [(set_attr "cc" "compare")
   2253  1.1  mrg    (set_attr "length" "1")])
   2254  1.1  mrg 
   2255  1.1  mrg (define_insn "*cmphi"
   2256  1.1  mrg   [(set (cc0)
   2257  1.1  mrg 	(compare (match_operand:HI 0 "register_operand"  "!w,r,r,d,d,r,r")
   2258  1.1  mrg 		 (match_operand:HI 1 "nonmemory_operand" "L,L,r,M,i,M,i")))
   2259  1.1  mrg    (clobber (match_scratch:QI 2 "=X,X,X,X,&d,&d,&d"))]
   2260  1.1  mrg   ""
   2261  1.1  mrg   "*{
   2262  1.1  mrg   switch (which_alternative)
   2263  1.1  mrg     {
   2264  1.1  mrg     case 0: case 1:
   2265  1.1  mrg       return out_tsthi (insn, operands[0], NULL);
   2266  1.1  mrg 
   2267  1.1  mrg     case 2:
   2268  1.1  mrg       return (AS2 (cp,%A0,%A1) CR_TAB
   2269  1.1  mrg               AS2 (cpc,%B0,%B1));
   2270  1.1  mrg     case 3:
   2271  1.1  mrg       if (reg_unused_after (insn, operands[0])
   2272  1.1  mrg           && INTVAL (operands[1]) >= 0 && INTVAL (operands[1]) <= 63
   2273  1.1  mrg           && test_hard_reg_class (ADDW_REGS, operands[0]))
   2274  1.1  mrg         return AS2 (sbiw,%0,%1);
   2275  1.1  mrg        else
   2276  1.1  mrg         return (AS2 (cpi,%0,%1) CR_TAB
   2277  1.1  mrg                 AS2 (cpc,%B0,__zero_reg__));
   2278  1.1  mrg     case 4:
   2279  1.1  mrg       if (reg_unused_after (insn, operands[0]))
   2280  1.1  mrg         return (AS2 (subi,%0,lo8(%1))  CR_TAB
   2281  1.1  mrg                 AS2 (sbci,%B0,hi8(%1)));
   2282  1.1  mrg       else
   2283  1.1  mrg         return (AS2 (ldi, %2,hi8(%1))  CR_TAB
   2284  1.1  mrg 	        AS2 (cpi, %A0,lo8(%1)) CR_TAB
   2285  1.1  mrg 	        AS2 (cpc, %B0,%2));
   2286  1.1  mrg    case 5:
   2287  1.1  mrg       return (AS2 (ldi, %2,lo8(%1))  CR_TAB
   2288  1.1  mrg 	      AS2 (cp, %A0,%2) CR_TAB
   2289  1.1  mrg 	      AS2 (cpc, %B0,__zero_reg__));
   2290  1.1  mrg 
   2291  1.1  mrg    case 6:
   2292  1.1  mrg       return (AS2 (ldi, %2,lo8(%1))  CR_TAB
   2293  1.1  mrg               AS2 (cp, %A0,%2)       CR_TAB
   2294  1.1  mrg               AS2 (ldi, %2,hi8(%1)) CR_TAB
   2295  1.1  mrg 	      AS2 (cpc, %B0,%2));
   2296  1.1  mrg     }
   2297  1.1  mrg   return \"bug\";
   2298  1.1  mrg }" 
   2299  1.1  mrg   [(set_attr "cc" "compare,compare,compare,compare,compare,compare,compare")
   2300  1.1  mrg    (set_attr "length" "1,2,2,2,3,3,4")])
   2301  1.1  mrg 
   2302  1.1  mrg 
   2303  1.1  mrg (define_insn "*cmpsi"
   2304  1.1  mrg   [(set (cc0)
   2305  1.1  mrg 	(compare (match_operand:SI 0 "register_operand"  "r,r,d,d,r,r")
   2306  1.1  mrg 		 (match_operand:SI 1 "nonmemory_operand" "L,r,M,i,M,i")))
   2307  1.1  mrg    (clobber (match_scratch:QI 2 "=X,X,X,&d,&d,&d"))]
   2308  1.1  mrg   ""
   2309  1.1  mrg   "*{
   2310  1.1  mrg   switch (which_alternative)
   2311  1.1  mrg     {
   2312  1.1  mrg     case 0:
   2313  1.1  mrg       return out_tstsi (insn, operands[0], NULL);
   2314  1.1  mrg 
   2315  1.1  mrg     case 1:
   2316  1.1  mrg       return (AS2 (cp,%A0,%A1) CR_TAB
   2317  1.1  mrg               AS2 (cpc,%B0,%B1) CR_TAB
   2318  1.1  mrg 	      AS2 (cpc,%C0,%C1) CR_TAB
   2319  1.1  mrg 	      AS2 (cpc,%D0,%D1));
   2320  1.1  mrg     case 2:
   2321  1.1  mrg       if (reg_unused_after (insn, operands[0])
   2322  1.1  mrg           && INTVAL (operands[1]) >= 0 && INTVAL (operands[1]) <= 63
   2323  1.1  mrg           && test_hard_reg_class (ADDW_REGS, operands[0]))
   2324  1.1  mrg         return (AS2 (sbiw,%0,%1) CR_TAB
   2325  1.1  mrg                 AS2 (cpc,%C0,__zero_reg__) CR_TAB
   2326  1.1  mrg                 AS2 (cpc,%D0,__zero_reg__));
   2327  1.1  mrg       else
   2328  1.1  mrg         return (AS2 (cpi,%A0,lo8(%1))  CR_TAB
   2329  1.1  mrg                 AS2 (cpc,%B0,__zero_reg__) CR_TAB
   2330  1.1  mrg                 AS2 (cpc,%C0,__zero_reg__) CR_TAB
   2331  1.1  mrg                 AS2 (cpc,%D0,__zero_reg__));
   2332  1.1  mrg     case 3:
   2333  1.1  mrg       if (reg_unused_after (insn, operands[0]))
   2334  1.1  mrg         return (AS2 (subi,%A0,lo8(%1))  CR_TAB
   2335  1.1  mrg                 AS2 (sbci,%B0,hi8(%1))  CR_TAB
   2336  1.1  mrg                 AS2 (sbci,%C0,hlo8(%1))  CR_TAB
   2337  1.1  mrg                 AS2 (sbci,%D0,hhi8(%1)));
   2338  1.1  mrg       else
   2339  1.1  mrg        return (AS2 (cpi, %A0,lo8(%1))   CR_TAB
   2340  1.1  mrg 	       AS2 (ldi, %2,hi8(%1))  CR_TAB
   2341  1.1  mrg 	       AS2 (cpc, %B0,%2)       CR_TAB
   2342  1.1  mrg 	       AS2 (ldi, %2,hlo8(%1))  CR_TAB
   2343  1.1  mrg 	       AS2 (cpc, %C0,%2)       CR_TAB
   2344  1.1  mrg 	       AS2 (ldi, %2,hhi8(%1)) CR_TAB
   2345  1.1  mrg 	       AS2 (cpc, %D0,%2));
   2346  1.1  mrg     case 4:
   2347  1.1  mrg         return (AS2 (ldi,%2,lo8(%1))        CR_TAB
   2348  1.1  mrg                 AS2 (cp,%A0,%2)            CR_TAB
   2349  1.1  mrg                 AS2 (cpc,%B0,__zero_reg__) CR_TAB
   2350  1.1  mrg                 AS2 (cpc,%C0,__zero_reg__) CR_TAB
   2351  1.1  mrg                 AS2 (cpc,%D0,__zero_reg__));
   2352  1.1  mrg     case 5:
   2353  1.1  mrg        return (AS2 (ldi, %2,lo8(%1))   CR_TAB
   2354  1.1  mrg                AS2 (cp, %A0,%2)        CR_TAB
   2355  1.1  mrg 	       AS2 (ldi, %2,hi8(%1))  CR_TAB
   2356  1.1  mrg 	       AS2 (cpc, %B0,%2)       CR_TAB
   2357  1.1  mrg 	       AS2 (ldi, %2,hlo8(%1))  CR_TAB
   2358  1.1  mrg 	       AS2 (cpc, %C0,%2)       CR_TAB
   2359  1.1  mrg 	       AS2 (ldi, %2,hhi8(%1)) CR_TAB
   2360  1.1  mrg 	       AS2 (cpc, %D0,%2));
   2361  1.1  mrg     }
   2362  1.1  mrg   return \"bug\";
   2363  1.1  mrg }"
   2364  1.1  mrg   [(set_attr "cc" "compare,compare,compare,compare,compare,compare")
   2365  1.1  mrg    (set_attr "length" "4,4,4,7,5,8")])
   2366  1.1  mrg 
   2367  1.1  mrg 
   2368  1.1  mrg ;; ----------------------------------------------------------------------
   2369  1.1  mrg ;; JUMP INSTRUCTIONS
   2370  1.1  mrg ;; ----------------------------------------------------------------------
   2371  1.1  mrg ;; Conditional jump instructions
   2372  1.1  mrg 
   2373  1.1  mrg (define_expand "cbranchsi4"
   2374  1.1  mrg   [(parallel [(set (cc0)
   2375  1.1  mrg 	           (compare (match_operand:SI 1 "register_operand" "")
   2376  1.1  mrg 	                    (match_operand:SI 2 "nonmemory_operand" "")))
   2377  1.1  mrg 	      (clobber (match_scratch:QI 4 ""))])
   2378  1.1  mrg    (set (pc)
   2379  1.1  mrg         (if_then_else
   2380  1.1  mrg               (match_operator 0 "ordered_comparison_operator" [(cc0)
   2381  1.1  mrg                                                                (const_int 0)])
   2382  1.1  mrg               (label_ref (match_operand 3 "" ""))
   2383  1.1  mrg               (pc)))]
   2384  1.1  mrg  "")
   2385  1.1  mrg 
   2386  1.1  mrg (define_expand "cbranchhi4"
   2387  1.1  mrg   [(parallel [(set (cc0)
   2388  1.1  mrg 	           (compare (match_operand:HI 1 "register_operand" "")
   2389  1.1  mrg 	                    (match_operand:HI 2 "nonmemory_operand" "")))
   2390  1.1  mrg 	      (clobber (match_scratch:QI 4 ""))])
   2391  1.1  mrg    (set (pc)
   2392  1.1  mrg         (if_then_else
   2393  1.1  mrg               (match_operator 0 "ordered_comparison_operator" [(cc0)
   2394  1.1  mrg                                                                (const_int 0)])
   2395  1.1  mrg               (label_ref (match_operand 3 "" ""))
   2396  1.1  mrg               (pc)))]
   2397  1.1  mrg  "")
   2398  1.1  mrg 
   2399  1.1  mrg (define_expand "cbranchqi4"
   2400  1.1  mrg   [(set (cc0)
   2401  1.1  mrg         (compare (match_operand:QI 1 "register_operand" "")
   2402  1.1  mrg                  (match_operand:QI 2 "nonmemory_operand" "")))
   2403  1.1  mrg    (set (pc)
   2404  1.1  mrg         (if_then_else
   2405  1.1  mrg               (match_operator 0 "ordered_comparison_operator" [(cc0)
   2406  1.1  mrg                                                                (const_int 0)])
   2407  1.1  mrg               (label_ref (match_operand 3 "" ""))
   2408  1.1  mrg               (pc)))]
   2409  1.1  mrg  "")
   2410  1.1  mrg 
   2411  1.1  mrg 
   2412  1.1  mrg ;; Test a single bit in a QI/HI/SImode register.
   2413  1.1  mrg ;; Combine will create zero extract patterns for single bit tests.
   2414  1.1  mrg ;; permit any mode in source pattern by using VOIDmode.
   2415  1.1  mrg 
   2416  1.1  mrg (define_insn "*sbrx_branch<mode>"
   2417  1.1  mrg   [(set (pc)
   2418  1.1  mrg         (if_then_else
   2419  1.1  mrg 	 (match_operator 0 "eqne_operator"
   2420  1.1  mrg 			 [(zero_extract:QIDI
   2421  1.1  mrg 			   (match_operand:VOID 1 "register_operand" "r")
   2422  1.1  mrg 			   (const_int 1)
   2423  1.1  mrg 			   (match_operand 2 "const_int_operand" "n"))
   2424  1.1  mrg 			  (const_int 0)])
   2425  1.1  mrg 	 (label_ref (match_operand 3 "" ""))
   2426  1.1  mrg 	 (pc)))]
   2427  1.1  mrg   ""
   2428  1.1  mrg   "* return avr_out_sbxx_branch (insn, operands);"
   2429  1.1  mrg   [(set (attr "length")
   2430  1.1  mrg 	(if_then_else (and (ge (minus (pc) (match_dup 3)) (const_int -2046))
   2431  1.1  mrg 			   (le (minus (pc) (match_dup 3)) (const_int 2046)))
   2432  1.1  mrg 		      (const_int 2)
   2433  1.1  mrg 		      (if_then_else (eq_attr "mcu_mega" "no")
   2434  1.1  mrg 				    (const_int 2)
   2435  1.1  mrg 				    (const_int 4))))
   2436  1.1  mrg    (set_attr "cc" "clobber")])
   2437  1.1  mrg 
   2438  1.1  mrg ;; Same test based on Bitwise AND RTL. Keep this incase gcc changes patterns.
   2439  1.1  mrg ;; or for old peepholes.
   2440  1.1  mrg ;; Fixme - bitwise Mask will not work for DImode
   2441  1.1  mrg 
   2442  1.1  mrg (define_insn "*sbrx_and_branch<mode>"
   2443  1.1  mrg   [(set (pc)
   2444  1.1  mrg         (if_then_else
   2445  1.1  mrg 	 (match_operator 0 "eqne_operator"
   2446  1.1  mrg 			 [(and:QISI
   2447  1.1  mrg 			   (match_operand:QISI 1 "register_operand" "r")
   2448  1.1  mrg 			   (match_operand:QISI 2 "single_one_operand" "n"))
   2449  1.1  mrg 			  (const_int 0)])
   2450  1.1  mrg 	 (label_ref (match_operand 3 "" ""))
   2451  1.1  mrg 	 (pc)))]
   2452  1.1  mrg   ""
   2453  1.1  mrg {
   2454  1.1  mrg     HOST_WIDE_INT bitnumber;
   2455  1.1  mrg     bitnumber = exact_log2 (GET_MODE_MASK (<MODE>mode) & INTVAL (operands[2]));
   2456  1.1  mrg     operands[2] = GEN_INT (bitnumber);
   2457  1.1  mrg     return avr_out_sbxx_branch (insn, operands);
   2458  1.1  mrg }
   2459  1.1  mrg   [(set (attr "length")
   2460  1.1  mrg 	(if_then_else (and (ge (minus (pc) (match_dup 3)) (const_int -2046))
   2461  1.1  mrg 			   (le (minus (pc) (match_dup 3)) (const_int 2046)))
   2462  1.1  mrg 		      (const_int 2)
   2463  1.1  mrg 		      (if_then_else (eq_attr "mcu_mega" "no")
   2464  1.1  mrg 				    (const_int 2)
   2465  1.1  mrg 				    (const_int 4))))
   2466  1.1  mrg    (set_attr "cc" "clobber")])
   2467  1.1  mrg 
   2468  1.1  mrg ;; Convert sign tests to bit 7/15/31 tests that match the above insns.
   2469  1.1  mrg (define_peephole2
   2470  1.1  mrg   [(set (cc0) (compare (match_operand:QI 0 "register_operand" "")
   2471  1.1  mrg 		       (const_int 0)))
   2472  1.1  mrg    (set (pc) (if_then_else (ge (cc0) (const_int 0))
   2473  1.1  mrg 			   (label_ref (match_operand 1 "" ""))
   2474  1.1  mrg 			   (pc)))]
   2475  1.1  mrg   ""
   2476  1.1  mrg   [(set (pc) (if_then_else (eq (zero_extract:HI (match_dup 0)
   2477  1.1  mrg 						(const_int 1)
   2478  1.1  mrg 						(const_int 7))
   2479  1.1  mrg 			       (const_int 0))
   2480  1.1  mrg 			   (label_ref (match_dup 1))
   2481  1.1  mrg 			   (pc)))]
   2482  1.1  mrg   "")
   2483  1.1  mrg 
   2484  1.1  mrg (define_peephole2
   2485  1.1  mrg   [(set (cc0) (compare (match_operand:QI 0 "register_operand" "")
   2486  1.1  mrg 		       (const_int 0)))
   2487  1.1  mrg    (set (pc) (if_then_else (lt (cc0) (const_int 0))
   2488  1.1  mrg 			   (label_ref (match_operand 1 "" ""))
   2489  1.1  mrg 			   (pc)))]
   2490  1.1  mrg   ""
   2491  1.1  mrg   [(set (pc) (if_then_else (ne (zero_extract:HI (match_dup 0)
   2492  1.1  mrg 						(const_int 1)
   2493  1.1  mrg 						(const_int 7))
   2494  1.1  mrg 			       (const_int 0))
   2495  1.1  mrg 			   (label_ref (match_dup 1))
   2496  1.1  mrg 			   (pc)))]
   2497  1.1  mrg   "")
   2498  1.1  mrg 
   2499  1.1  mrg (define_peephole2
   2500  1.1  mrg   [(parallel [(set (cc0) (compare (match_operand:HI 0 "register_operand" "")
   2501  1.1  mrg 			 	  (const_int 0)))
   2502  1.1  mrg 	      (clobber (match_operand:HI 2 ""))])
   2503  1.1  mrg    (set (pc) (if_then_else (ge (cc0) (const_int 0))
   2504  1.1  mrg 			   (label_ref (match_operand 1 "" ""))
   2505  1.1  mrg 			   (pc)))]
   2506  1.1  mrg   ""
   2507  1.1  mrg   [(set (pc) (if_then_else (eq (and:HI (match_dup 0) (const_int -32768))
   2508  1.1  mrg 			       (const_int 0))
   2509  1.1  mrg 			   (label_ref (match_dup 1))
   2510  1.1  mrg 			   (pc)))]
   2511  1.1  mrg   "")
   2512  1.1  mrg 
   2513  1.1  mrg (define_peephole2
   2514  1.1  mrg   [(parallel [(set (cc0) (compare (match_operand:HI 0 "register_operand" "")
   2515  1.1  mrg 			 	  (const_int 0)))
   2516  1.1  mrg 	      (clobber (match_operand:HI 2 ""))])
   2517  1.1  mrg    (set (pc) (if_then_else (lt (cc0) (const_int 0))
   2518  1.1  mrg 			   (label_ref (match_operand 1 "" ""))
   2519  1.1  mrg 			   (pc)))]
   2520  1.1  mrg   ""
   2521  1.1  mrg   [(set (pc) (if_then_else (ne (and:HI (match_dup 0) (const_int -32768))
   2522  1.1  mrg 			       (const_int 0))
   2523  1.1  mrg 			   (label_ref (match_dup 1))
   2524  1.1  mrg 			   (pc)))]
   2525  1.1  mrg   "")
   2526  1.1  mrg 
   2527  1.1  mrg (define_peephole2
   2528  1.1  mrg   [(parallel [(set (cc0) (compare (match_operand:SI 0 "register_operand" "")
   2529  1.1  mrg 			 	  (const_int 0)))
   2530  1.1  mrg 	      (clobber (match_operand:SI 2 ""))])
   2531  1.1  mrg    (set (pc) (if_then_else (ge (cc0) (const_int 0))
   2532  1.1  mrg 			   (label_ref (match_operand 1 "" ""))
   2533  1.1  mrg 			   (pc)))]
   2534  1.1  mrg   ""
   2535  1.1  mrg   [(set (pc) (if_then_else (eq (and:SI (match_dup 0) (match_dup 2))
   2536  1.1  mrg 			       (const_int 0))
   2537  1.1  mrg 			   (label_ref (match_dup 1))
   2538  1.1  mrg 			   (pc)))]
   2539  1.1  mrg   "operands[2] = GEN_INT (-2147483647 - 1);")
   2540  1.1  mrg 
   2541  1.1  mrg (define_peephole2
   2542  1.1  mrg   [(parallel [(set (cc0) (compare (match_operand:SI 0 "register_operand" "")
   2543  1.1  mrg 			 	  (const_int 0)))
   2544  1.1  mrg 	      (clobber (match_operand:SI 2 ""))])
   2545  1.1  mrg    (set (pc) (if_then_else (lt (cc0) (const_int 0))
   2546  1.1  mrg 			   (label_ref (match_operand 1 "" ""))
   2547  1.1  mrg 			   (pc)))]
   2548  1.1  mrg   ""
   2549  1.1  mrg   [(set (pc) (if_then_else (ne (and:SI (match_dup 0) (match_dup 2))
   2550  1.1  mrg 			       (const_int 0))
   2551  1.1  mrg 			   (label_ref (match_dup 1))
   2552  1.1  mrg 			   (pc)))]
   2553  1.1  mrg   "operands[2] = GEN_INT (-2147483647 - 1);")
   2554  1.1  mrg 
   2555  1.1  mrg ;; ************************************************************************
   2556  1.1  mrg ;; Implementation of conditional jumps here.
   2557  1.1  mrg ;;  Compare with 0 (test) jumps
   2558  1.1  mrg ;; ************************************************************************
   2559  1.1  mrg 
   2560  1.1  mrg (define_insn "branch"
   2561  1.1  mrg   [(set (pc)
   2562  1.1  mrg         (if_then_else (match_operator 1 "simple_comparison_operator"
   2563  1.1  mrg                         [(cc0)
   2564  1.1  mrg                          (const_int 0)])
   2565  1.1  mrg                       (label_ref (match_operand 0 "" ""))
   2566  1.1  mrg                       (pc)))]
   2567  1.1  mrg   ""
   2568  1.1  mrg   "*
   2569  1.1  mrg    return ret_cond_branch (operands[1], avr_jump_mode (operands[0],insn), 0);"
   2570  1.1  mrg   [(set_attr "type" "branch")
   2571  1.1  mrg    (set_attr "cc" "clobber")])
   2572  1.1  mrg 
   2573  1.1  mrg ;; ****************************************************************
   2574  1.1  mrg ;; AVR does not have following conditional jumps: LE,LEU,GT,GTU.
   2575  1.1  mrg ;; Convert them all to proper jumps.
   2576  1.1  mrg ;; ****************************************************************/
   2577  1.1  mrg 
   2578  1.1  mrg (define_insn "difficult_branch"
   2579  1.1  mrg   [(set (pc)
   2580  1.1  mrg         (if_then_else (match_operator 1 "difficult_comparison_operator"
   2581  1.1  mrg                         [(cc0)
   2582  1.1  mrg                          (const_int 0)])
   2583  1.1  mrg                       (label_ref (match_operand 0 "" ""))
   2584  1.1  mrg                       (pc)))]
   2585  1.1  mrg   ""
   2586  1.1  mrg   "*
   2587  1.1  mrg    return ret_cond_branch (operands[1], avr_jump_mode (operands[0],insn), 0);"
   2588  1.1  mrg   [(set_attr "type" "branch1")
   2589  1.1  mrg    (set_attr "cc" "clobber")])
   2590  1.1  mrg 
   2591  1.1  mrg ;; revers branch
   2592  1.1  mrg 
   2593  1.1  mrg (define_insn "rvbranch"
   2594  1.1  mrg   [(set (pc)
   2595  1.1  mrg         (if_then_else (match_operator 1 "simple_comparison_operator" 
   2596  1.1  mrg 	                [(cc0)
   2597  1.1  mrg                          (const_int 0)])
   2598  1.1  mrg                       (pc)
   2599  1.1  mrg                       (label_ref (match_operand 0 "" ""))))]
   2600  1.1  mrg   ""
   2601  1.1  mrg   "*
   2602  1.1  mrg    return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 1);"
   2603  1.1  mrg   [(set_attr "type" "branch1")
   2604  1.1  mrg    (set_attr "cc" "clobber")])
   2605  1.1  mrg 
   2606  1.1  mrg (define_insn "difficult_rvbranch"
   2607  1.1  mrg   [(set (pc)
   2608  1.1  mrg         (if_then_else (match_operator 1 "difficult_comparison_operator" 
   2609  1.1  mrg 	                [(cc0)
   2610  1.1  mrg                          (const_int 0)])
   2611  1.1  mrg                       (pc)
   2612  1.1  mrg                       (label_ref (match_operand 0 "" ""))))]
   2613  1.1  mrg   ""
   2614  1.1  mrg   "*
   2615  1.1  mrg    return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 1);"
   2616  1.1  mrg   [(set_attr "type" "branch")
   2617  1.1  mrg    (set_attr "cc" "clobber")])
   2618  1.1  mrg 
   2619  1.1  mrg ;; **************************************************************************
   2620  1.1  mrg ;; Unconditional and other jump instructions.
   2621  1.1  mrg 
   2622  1.1  mrg (define_insn "jump"
   2623  1.1  mrg   [(set (pc)
   2624  1.1  mrg         (label_ref (match_operand 0 "" "")))]
   2625  1.1  mrg   ""
   2626  1.1  mrg   "*{
   2627  1.1  mrg   if (AVR_HAVE_JMP_CALL && get_attr_length (insn) != 1)
   2628  1.1  mrg     return AS1 (jmp,%x0);
   2629  1.1  mrg   return AS1 (rjmp,%x0);
   2630  1.1  mrg }"
   2631  1.1  mrg   [(set (attr "length")
   2632  1.1  mrg 	(if_then_else (match_operand 0 "symbol_ref_operand" "")	
   2633  1.1  mrg 		(if_then_else (eq_attr "mcu_mega" "no")
   2634  1.1  mrg 			      (const_int 1)
   2635  1.1  mrg 			      (const_int 2))
   2636  1.1  mrg 		(if_then_else (and (ge (minus (pc) (match_dup 0)) (const_int -2047))
   2637  1.1  mrg 				   (le (minus (pc) (match_dup 0)) (const_int 2047)))
   2638  1.1  mrg 			      (const_int 1)
   2639  1.1  mrg 			      (const_int 2))))
   2640  1.1  mrg    (set_attr "cc" "none")])
   2641  1.1  mrg 
   2642  1.1  mrg ;; call
   2643  1.1  mrg 
   2644  1.1  mrg (define_expand "call"
   2645  1.1  mrg   [(call (match_operand:HI 0 "call_insn_operand" "")
   2646  1.1  mrg          (match_operand:HI 1 "general_operand" ""))]
   2647  1.1  mrg   ;; Operand 1 not used on the AVR.
   2648  1.1  mrg   ""
   2649  1.1  mrg   "")
   2650  1.1  mrg 
   2651  1.1  mrg ;; call value
   2652  1.1  mrg 
   2653  1.1  mrg (define_expand "call_value"
   2654  1.1  mrg   [(set (match_operand 0 "register_operand" "")
   2655  1.1  mrg         (call (match_operand:HI 1 "call_insn_operand" "")
   2656  1.1  mrg               (match_operand:HI 2 "general_operand" "")))]
   2657  1.1  mrg   ;; Operand 2 not used on the AVR.
   2658  1.1  mrg   ""
   2659  1.1  mrg   "")
   2660  1.1  mrg 
   2661  1.1  mrg (define_insn "call_insn"
   2662  1.1  mrg   [(call (mem:HI (match_operand:HI 0 "nonmemory_operand" "!z,*r,s,n"))
   2663  1.1  mrg          (match_operand:HI 1 "general_operand" "X,X,X,X"))]
   2664  1.1  mrg ;; We don't need in saving Z register because r30,r31 is a call used registers
   2665  1.1  mrg   ;; Operand 1 not used on the AVR.
   2666  1.1  mrg   "(register_operand (operands[0], HImode) || CONSTANT_P (operands[0]))"
   2667  1.1  mrg   "*{
   2668  1.1  mrg   if (which_alternative==0)
   2669  1.1  mrg      return \"%!icall\";
   2670  1.1  mrg   else if (which_alternative==1)
   2671  1.1  mrg     {
   2672  1.1  mrg       if (AVR_HAVE_MOVW)
   2673  1.1  mrg 	return (AS2 (movw, r30, %0) CR_TAB
   2674  1.1  mrg                \"%!icall\");
   2675  1.1  mrg       else
   2676  1.1  mrg 	return (AS2 (mov, r30, %A0) CR_TAB
   2677  1.1  mrg 		AS2 (mov, r31, %B0) CR_TAB
   2678  1.1  mrg 		\"%!icall\");
   2679  1.1  mrg     }
   2680  1.1  mrg   else if (which_alternative==2)
   2681  1.1  mrg     return AS1(%~call,%x0);
   2682  1.1  mrg   return (AS2 (ldi,r30,lo8(%0)) CR_TAB
   2683  1.1  mrg           AS2 (ldi,r31,hi8(%0)) CR_TAB
   2684  1.1  mrg           \"%!icall\");
   2685  1.1  mrg }"
   2686  1.1  mrg   [(set_attr "cc" "clobber,clobber,clobber,clobber")
   2687  1.1  mrg    (set_attr_alternative "length"
   2688  1.1  mrg 			 [(const_int 1)
   2689  1.1  mrg 			  (if_then_else (eq_attr "mcu_have_movw" "yes")
   2690  1.1  mrg 					(const_int 2)
   2691  1.1  mrg 					(const_int 3))
   2692  1.1  mrg 			  (if_then_else (eq_attr "mcu_mega" "yes")
   2693  1.1  mrg 					(const_int 2)
   2694  1.1  mrg 					(const_int 1))
   2695  1.1  mrg 			  (const_int 3)])])
   2696  1.1  mrg 
   2697  1.1  mrg (define_insn "call_value_insn"
   2698  1.1  mrg   [(set (match_operand 0 "register_operand" "=r,r,r,r")
   2699  1.1  mrg         (call (mem:HI (match_operand:HI 1 "nonmemory_operand" "!z,*r,s,n"))
   2700  1.1  mrg ;; We don't need in saving Z register because r30,r31 is a call used registers
   2701  1.1  mrg               (match_operand:HI 2 "general_operand" "X,X,X,X")))]
   2702  1.1  mrg   ;; Operand 2 not used on the AVR.
   2703  1.1  mrg   "(register_operand (operands[0], VOIDmode) || CONSTANT_P (operands[0]))"
   2704  1.1  mrg   "*{
   2705  1.1  mrg   if (which_alternative==0)
   2706  1.1  mrg      return \"%!icall\";
   2707  1.1  mrg   else if (which_alternative==1)
   2708  1.1  mrg     {
   2709  1.1  mrg       if (AVR_HAVE_MOVW)
   2710  1.1  mrg 	return (AS2 (movw, r30, %1) CR_TAB
   2711  1.1  mrg 		\"%!icall\");
   2712  1.1  mrg       else
   2713  1.1  mrg 	return (AS2 (mov, r30, %A1) CR_TAB
   2714  1.1  mrg 		AS2 (mov, r31, %B1) CR_TAB
   2715  1.1  mrg 		\"%!icall\");
   2716  1.1  mrg     }
   2717  1.1  mrg   else if (which_alternative==2)
   2718  1.1  mrg     return AS1(%~call,%x1);
   2719  1.1  mrg   return (AS2 (ldi, r30, lo8(%1)) CR_TAB
   2720  1.1  mrg           AS2 (ldi, r31, hi8(%1)) CR_TAB
   2721  1.1  mrg           \"%!icall\");
   2722  1.1  mrg }"
   2723  1.1  mrg   [(set_attr "cc" "clobber,clobber,clobber,clobber")
   2724  1.1  mrg    (set_attr_alternative "length"
   2725  1.1  mrg 			 [(const_int 1)
   2726  1.1  mrg 			  (if_then_else (eq_attr "mcu_have_movw" "yes")
   2727  1.1  mrg 					(const_int 2)
   2728  1.1  mrg 					(const_int 3))
   2729  1.1  mrg 			  (if_then_else (eq_attr "mcu_mega" "yes")
   2730  1.1  mrg 					(const_int 2)
   2731  1.1  mrg 					(const_int 1))
   2732  1.1  mrg 			  (const_int 3)])])
   2733  1.1  mrg 
   2734  1.1  mrg (define_insn "nop"
   2735  1.1  mrg   [(const_int 0)]
   2736  1.1  mrg   ""
   2737  1.1  mrg   "nop"
   2738  1.1  mrg   [(set_attr "cc" "none")
   2739  1.1  mrg    (set_attr "length" "1")])
   2740  1.1  mrg 
   2741  1.1  mrg ; indirect jump
   2742  1.1  mrg 
   2743  1.1  mrg (define_expand "indirect_jump"
   2744  1.1  mrg   [(set (pc) (match_operand:HI 0 "nonmemory_operand" ""))]
   2745  1.1  mrg   ""
   2746  1.1  mrg   " if ((!AVR_HAVE_JMP_CALL) && !register_operand(operand0, HImode))
   2747  1.1  mrg     {
   2748  1.1  mrg       operands[0] = copy_to_mode_reg(HImode, operand0);
   2749  1.1  mrg     }"
   2750  1.1  mrg )
   2751  1.1  mrg 
   2752  1.1  mrg ; indirect jump
   2753  1.1  mrg (define_insn "*jcindirect_jump"
   2754  1.1  mrg   [(set (pc) (match_operand:HI 0 "immediate_operand" "i"))]
   2755  1.1  mrg   ""
   2756  1.1  mrg   "@
   2757  1.1  mrg   	%~jmp %x0"
   2758  1.1  mrg   [(set_attr "length" "2")
   2759  1.1  mrg    (set_attr "cc" "none")])
   2760  1.1  mrg 
   2761  1.1  mrg ;;
   2762  1.1  mrg (define_insn "*njcindirect_jump"
   2763  1.1  mrg   [(set (pc) (match_operand:HI 0 "register_operand" "!z,*r"))]
   2764  1.1  mrg   "!AVR_HAVE_EIJMP_EICALL"
   2765  1.1  mrg   "@
   2766  1.1  mrg 	ijmp
   2767  1.1  mrg 	push %A0\;push %B0\;ret"
   2768  1.1  mrg   [(set_attr "length" "1,3")
   2769  1.1  mrg    (set_attr "cc" "none,none")])
   2770  1.1  mrg 
   2771  1.1  mrg (define_insn "*indirect_jump_avr6"
   2772  1.1  mrg   [(set (pc) (match_operand:HI 0 "register_operand" "z"))]
   2773  1.1  mrg   "AVR_HAVE_EIJMP_EICALL"
   2774  1.1  mrg   "eijmp"
   2775  1.1  mrg   [(set_attr "length" "1")
   2776  1.1  mrg    (set_attr "cc" "none")])
   2777  1.1  mrg 
   2778  1.1  mrg ;; table jump
   2779  1.1  mrg 
   2780  1.1  mrg ;; Table made from "rjmp" instructions for <=8K devices.
   2781  1.1  mrg (define_insn "*tablejump_rjmp"
   2782  1.1  mrg   [(set (pc) (unspec:HI [(match_operand:HI 0 "register_operand" "!z,*r")]
   2783  1.1  mrg 			UNSPEC_INDEX_JMP))
   2784  1.1  mrg    (use (label_ref (match_operand 1 "" "")))
   2785  1.1  mrg    (clobber (match_dup 0))]
   2786  1.1  mrg   "(!AVR_HAVE_JMP_CALL) && (!AVR_HAVE_EIJMP_EICALL)"
   2787  1.1  mrg   "@
   2788  1.1  mrg 	ijmp
   2789  1.1  mrg 	push %A0\;push %B0\;ret"
   2790  1.1  mrg   [(set_attr "length" "1,3")
   2791  1.1  mrg    (set_attr "cc" "none,none")])
   2792  1.1  mrg 
   2793  1.1  mrg ;; Not a prologue, but similar idea - move the common piece of code to libgcc.
   2794  1.1  mrg (define_insn "*tablejump_lib"
   2795  1.1  mrg   [(set (pc) (unspec:HI [(match_operand:HI 0 "register_operand" "z")]
   2796  1.1  mrg 			UNSPEC_INDEX_JMP))
   2797  1.1  mrg    (use (label_ref (match_operand 1 "" "")))
   2798  1.1  mrg    (clobber (match_dup 0))]
   2799  1.1  mrg   "AVR_HAVE_JMP_CALL && TARGET_CALL_PROLOGUES"
   2800  1.1  mrg   "%~jmp __tablejump2__"
   2801  1.1  mrg   [(set_attr "length" "2")
   2802  1.1  mrg    (set_attr "cc" "clobber")])
   2803  1.1  mrg 
   2804  1.1  mrg (define_insn "*tablejump_enh"
   2805  1.1  mrg   [(set (pc) (unspec:HI [(match_operand:HI 0 "register_operand" "z")]
   2806  1.1  mrg 			UNSPEC_INDEX_JMP))
   2807  1.1  mrg    (use (label_ref (match_operand 1 "" "")))
   2808  1.1  mrg    (clobber (match_dup 0))]
   2809  1.1  mrg   "AVR_HAVE_JMP_CALL && AVR_HAVE_LPMX"
   2810  1.1  mrg   "lsl r30
   2811  1.1  mrg 	rol r31
   2812  1.1  mrg 	lpm __tmp_reg__,Z+
   2813  1.1  mrg 	lpm r31,Z
   2814  1.1  mrg 	mov r30,__tmp_reg__
   2815  1.1  mrg 	%!ijmp"
   2816  1.1  mrg   [(set_attr "length" "6")
   2817  1.1  mrg    (set_attr "cc" "clobber")])
   2818  1.1  mrg 
   2819  1.1  mrg (define_insn "*tablejump"
   2820  1.1  mrg   [(set (pc) (unspec:HI [(match_operand:HI 0 "register_operand" "z")]
   2821  1.1  mrg 			UNSPEC_INDEX_JMP))
   2822  1.1  mrg    (use (label_ref (match_operand 1 "" "")))
   2823  1.1  mrg    (clobber (match_dup 0))]
   2824  1.1  mrg   "AVR_HAVE_JMP_CALL && !AVR_HAVE_EIJMP_EICALL"
   2825  1.1  mrg   "lsl r30
   2826  1.1  mrg 	rol r31
   2827  1.1  mrg 	lpm
   2828  1.1  mrg 	inc r30
   2829  1.1  mrg 	push r0
   2830  1.1  mrg 	lpm
   2831  1.1  mrg 	push r0
   2832  1.1  mrg 	ret"
   2833  1.1  mrg   [(set_attr "length" "8")
   2834  1.1  mrg    (set_attr "cc" "clobber")])
   2835  1.1  mrg 
   2836  1.1  mrg (define_expand "casesi"
   2837  1.1  mrg   [(set (match_dup 6)
   2838  1.1  mrg 	(minus:HI (subreg:HI (match_operand:SI 0 "register_operand" "") 0)
   2839  1.1  mrg 		  (match_operand:HI 1 "register_operand" "")))
   2840  1.1  mrg    (parallel [(set (cc0)
   2841  1.1  mrg 		   (compare (match_dup 6)
   2842  1.1  mrg 			    (match_operand:HI 2 "register_operand" "")))
   2843  1.1  mrg 	      (clobber (match_scratch:QI 9 ""))])
   2844  1.1  mrg    
   2845  1.1  mrg    (set (pc)
   2846  1.1  mrg 	(if_then_else (gtu (cc0)
   2847  1.1  mrg 			   (const_int 0))
   2848  1.1  mrg 		      (label_ref (match_operand 4 "" ""))
   2849  1.1  mrg 		      (pc)))
   2850  1.1  mrg 
   2851  1.1  mrg    (set (match_dup 6)
   2852  1.1  mrg 	(plus:HI (match_dup 6) (label_ref (match_operand:HI 3 "" ""))))
   2853  1.1  mrg 
   2854  1.1  mrg    (parallel [(set (pc) (unspec:HI [(match_dup 6)] UNSPEC_INDEX_JMP))
   2855  1.1  mrg 	      (use (label_ref (match_dup 3)))
   2856  1.1  mrg 	      (clobber (match_dup 6))])]
   2857  1.1  mrg   ""
   2858  1.1  mrg   "
   2859  1.1  mrg {
   2860  1.1  mrg   operands[6] = gen_reg_rtx (HImode);
   2861  1.1  mrg }")
   2862  1.1  mrg 
   2863  1.1  mrg 
   2864  1.1  mrg ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   2865  1.1  mrg ;; This instruction sets Z flag
   2866  1.1  mrg 
   2867  1.1  mrg (define_insn "sez"
   2868  1.1  mrg   [(set (cc0) (const_int 0))]
   2869  1.1  mrg   ""
   2870  1.1  mrg   "sez"
   2871  1.1  mrg   [(set_attr "length" "1")
   2872  1.1  mrg    (set_attr "cc" "compare")])
   2873  1.1  mrg 
   2874  1.1  mrg ;; Clear/set/test a single bit in I/O address space.
   2875  1.1  mrg 
   2876  1.1  mrg (define_insn "*cbi"
   2877  1.1  mrg   [(set (mem:QI (match_operand 0 "low_io_address_operand" "n"))
   2878  1.1  mrg 	(and:QI (mem:QI (match_dup 0))
   2879  1.1  mrg 		(match_operand:QI 1 "single_zero_operand" "n")))]
   2880  1.1  mrg   "(optimize > 0)"
   2881  1.1  mrg {
   2882  1.1  mrg   operands[2] = GEN_INT (exact_log2 (~INTVAL (operands[1]) & 0xff));
   2883  1.1  mrg   return AS2 (cbi,%m0-0x20,%2);
   2884  1.1  mrg }
   2885  1.1  mrg   [(set_attr "length" "1")
   2886  1.1  mrg    (set_attr "cc" "none")])
   2887  1.1  mrg 
   2888  1.1  mrg (define_insn "*sbi"
   2889  1.1  mrg   [(set (mem:QI (match_operand 0 "low_io_address_operand" "n"))
   2890  1.1  mrg 	(ior:QI (mem:QI (match_dup 0))
   2891  1.1  mrg 		(match_operand:QI 1 "single_one_operand" "n")))]
   2892  1.1  mrg   "(optimize > 0)"
   2893  1.1  mrg {
   2894  1.1  mrg   operands[2] = GEN_INT (exact_log2 (INTVAL (operands[1]) & 0xff));
   2895  1.1  mrg   return AS2 (sbi,%m0-0x20,%2);
   2896  1.1  mrg }
   2897  1.1  mrg   [(set_attr "length" "1")
   2898  1.1  mrg    (set_attr "cc" "none")])
   2899  1.1  mrg 
   2900  1.1  mrg ;; Lower half of the I/O space - use sbic/sbis directly.
   2901  1.1  mrg (define_insn "*sbix_branch"
   2902  1.1  mrg   [(set (pc)
   2903  1.1  mrg 	(if_then_else
   2904  1.1  mrg 	 (match_operator 0 "eqne_operator"
   2905  1.1  mrg 			 [(zero_extract:HI
   2906  1.1  mrg 			   (mem:QI (match_operand 1 "low_io_address_operand" "n"))
   2907  1.1  mrg 			   (const_int 1)
   2908  1.1  mrg 			   (match_operand 2 "const_int_operand" "n"))
   2909  1.1  mrg 			  (const_int 0)])
   2910  1.1  mrg 	 (label_ref (match_operand 3 "" ""))
   2911  1.1  mrg 	 (pc)))]
   2912  1.1  mrg   "(optimize > 0)"
   2913  1.1  mrg   "* return avr_out_sbxx_branch (insn, operands);"
   2914  1.1  mrg   [(set (attr "length")
   2915  1.1  mrg 	(if_then_else (and (ge (minus (pc) (match_dup 3)) (const_int -2046))
   2916  1.1  mrg 			   (le (minus (pc) (match_dup 3)) (const_int 2046)))
   2917  1.1  mrg 		      (const_int 2)
   2918  1.1  mrg 		      (if_then_else (eq_attr "mcu_mega" "no")
   2919  1.1  mrg 				    (const_int 2)
   2920  1.1  mrg 				    (const_int 4))))
   2921  1.1  mrg    (set_attr "cc" "clobber")])
   2922  1.1  mrg 
   2923  1.1  mrg ;; Tests of bit 7 are pessimized to sign tests, so we need this too...
   2924  1.1  mrg (define_insn "*sbix_branch_bit7"
   2925  1.1  mrg   [(set (pc)
   2926  1.1  mrg 	(if_then_else
   2927  1.1  mrg 	 (match_operator 0 "gelt_operator"
   2928  1.1  mrg 			 [(mem:QI (match_operand 1 "low_io_address_operand" "n"))
   2929  1.1  mrg 			  (const_int 0)])
   2930  1.1  mrg 	 (label_ref (match_operand 2 "" ""))
   2931  1.1  mrg 	 (pc)))]
   2932  1.1  mrg   "(optimize > 0)"
   2933  1.1  mrg {
   2934  1.1  mrg   operands[3] = operands[2];
   2935  1.1  mrg   operands[2] = GEN_INT (7);
   2936  1.1  mrg   return avr_out_sbxx_branch (insn, operands);
   2937  1.1  mrg }
   2938  1.1  mrg   [(set (attr "length")
   2939  1.1  mrg 	(if_then_else (and (ge (minus (pc) (match_dup 2)) (const_int -2046))
   2940  1.1  mrg 			   (le (minus (pc) (match_dup 2)) (const_int 2046)))
   2941  1.1  mrg 		      (const_int 2)
   2942  1.1  mrg 		      (if_then_else (eq_attr "mcu_mega" "no")
   2943  1.1  mrg 				    (const_int 2)
   2944  1.1  mrg 				    (const_int 4))))
   2945  1.1  mrg    (set_attr "cc" "clobber")])
   2946  1.1  mrg 
   2947  1.1  mrg ;; Upper half of the I/O space - read port to __tmp_reg__ and use sbrc/sbrs.
   2948  1.1  mrg (define_insn "*sbix_branch_tmp"
   2949  1.1  mrg   [(set (pc)
   2950  1.1  mrg 	(if_then_else
   2951  1.1  mrg 	 (match_operator 0 "eqne_operator"
   2952  1.1  mrg 			 [(zero_extract:HI
   2953  1.1  mrg 			   (mem:QI (match_operand 1 "high_io_address_operand" "n"))
   2954  1.1  mrg 			   (const_int 1)
   2955  1.1  mrg 			   (match_operand 2 "const_int_operand" "n"))
   2956  1.1  mrg 			  (const_int 0)])
   2957  1.1  mrg 	 (label_ref (match_operand 3 "" ""))
   2958  1.1  mrg 	 (pc)))]
   2959  1.1  mrg   "(optimize > 0)"
   2960  1.1  mrg   "* return avr_out_sbxx_branch (insn, operands);"
   2961  1.1  mrg   [(set (attr "length")
   2962  1.1  mrg 	(if_then_else (and (ge (minus (pc) (match_dup 3)) (const_int -2046))
   2963  1.1  mrg 			   (le (minus (pc) (match_dup 3)) (const_int 2045)))
   2964  1.1  mrg 		      (const_int 3)
   2965  1.1  mrg 		      (if_then_else (eq_attr "mcu_mega" "no")
   2966  1.1  mrg 				    (const_int 3)
   2967  1.1  mrg 				    (const_int 5))))
   2968  1.1  mrg    (set_attr "cc" "clobber")])
   2969  1.1  mrg 
   2970  1.1  mrg (define_insn "*sbix_branch_tmp_bit7"
   2971  1.1  mrg   [(set (pc)
   2972  1.1  mrg 	(if_then_else
   2973  1.1  mrg 	 (match_operator 0 "gelt_operator"
   2974  1.1  mrg 			 [(mem:QI (match_operand 1 "high_io_address_operand" "n"))
   2975  1.1  mrg 			  (const_int 0)])
   2976  1.1  mrg 	 (label_ref (match_operand 2 "" ""))
   2977  1.1  mrg 	 (pc)))]
   2978  1.1  mrg   "(optimize > 0)"
   2979  1.1  mrg {
   2980  1.1  mrg   operands[3] = operands[2];
   2981  1.1  mrg   operands[2] = GEN_INT (7);
   2982  1.1  mrg   return avr_out_sbxx_branch (insn, operands);
   2983  1.1  mrg }
   2984  1.1  mrg   [(set (attr "length")
   2985  1.1  mrg 	(if_then_else (and (ge (minus (pc) (match_dup 2)) (const_int -2046))
   2986  1.1  mrg 			   (le (minus (pc) (match_dup 2)) (const_int 2045)))
   2987  1.1  mrg 		      (const_int 3)
   2988  1.1  mrg 		      (if_then_else (eq_attr "mcu_mega" "no")
   2989  1.1  mrg 				    (const_int 3)
   2990  1.1  mrg 				    (const_int 5))))
   2991  1.1  mrg    (set_attr "cc" "clobber")])
   2992  1.1  mrg 
   2993  1.1  mrg ;; ************************* Peepholes ********************************
   2994  1.1  mrg 
   2995  1.1  mrg (define_peephole
   2996  1.1  mrg   [(set (match_operand:SI 0 "d_register_operand" "")
   2997  1.1  mrg         (plus:SI (match_dup 0)
   2998  1.1  mrg                  (const_int -1)))
   2999  1.1  mrg    (parallel
   3000  1.1  mrg     [(set (cc0)
   3001  1.1  mrg           (compare (match_dup 0)
   3002  1.1  mrg 		   (const_int -1)))
   3003  1.1  mrg      (clobber (match_operand:QI 1 "d_register_operand" ""))])
   3004  1.1  mrg    (set (pc)
   3005  1.1  mrg 	(if_then_else (ne (cc0) (const_int 0))
   3006  1.1  mrg 		      (label_ref (match_operand 2 "" ""))
   3007  1.1  mrg 		      (pc)))]
   3008  1.1  mrg   ""
   3009  1.1  mrg   "*
   3010  1.1  mrg {
   3011  1.1  mrg   CC_STATUS_INIT;
   3012  1.1  mrg   if (test_hard_reg_class (ADDW_REGS, operands[0]))
   3013  1.1  mrg     output_asm_insn (AS2 (sbiw,%0,1) CR_TAB
   3014  1.1  mrg 		     AS2 (sbc,%C0,__zero_reg__) CR_TAB
   3015  1.1  mrg 		     AS2 (sbc,%D0,__zero_reg__) \"\\n\", operands);
   3016  1.1  mrg   else
   3017  1.1  mrg     output_asm_insn (AS2 (subi,%A0,1) CR_TAB
   3018  1.1  mrg 		     AS2 (sbc,%B0,__zero_reg__) CR_TAB
   3019  1.1  mrg 		     AS2 (sbc,%C0,__zero_reg__) CR_TAB
   3020  1.1  mrg 		     AS2 (sbc,%D0,__zero_reg__) \"\\n\", operands);
   3021  1.1  mrg   switch (avr_jump_mode (operands[2],insn))
   3022  1.1  mrg   {
   3023  1.1  mrg     case 1:
   3024  1.1  mrg       return AS1 (brcc,%2);
   3025  1.1  mrg     case 2:
   3026  1.1  mrg       return (AS1 (brcs,.+2) CR_TAB
   3027  1.1  mrg               AS1 (rjmp,%2));
   3028  1.1  mrg   }
   3029  1.1  mrg   return (AS1 (brcs,.+4) CR_TAB
   3030  1.1  mrg           AS1 (jmp,%2));
   3031  1.1  mrg }")
   3032  1.1  mrg 
   3033  1.1  mrg (define_peephole
   3034  1.1  mrg   [(set (match_operand:HI 0 "d_register_operand" "")
   3035  1.1  mrg         (plus:HI (match_dup 0)
   3036  1.1  mrg                  (const_int -1)))
   3037  1.1  mrg    (parallel
   3038  1.1  mrg     [(set (cc0)
   3039  1.1  mrg           (compare (match_dup 0)
   3040  1.1  mrg 		   (const_int 65535)))
   3041  1.1  mrg      (clobber (match_operand:QI 1 "d_register_operand" ""))])
   3042  1.1  mrg    (set (pc)
   3043  1.1  mrg 	(if_then_else (ne (cc0) (const_int 0))
   3044  1.1  mrg 		      (label_ref (match_operand 2 "" ""))
   3045  1.1  mrg 		      (pc)))]
   3046  1.1  mrg   ""
   3047  1.1  mrg   "*
   3048  1.1  mrg {
   3049  1.1  mrg   CC_STATUS_INIT;
   3050  1.1  mrg   if (test_hard_reg_class (ADDW_REGS, operands[0]))
   3051  1.1  mrg     output_asm_insn (AS2 (sbiw,%0,1), operands);
   3052  1.1  mrg   else
   3053  1.1  mrg     output_asm_insn (AS2 (subi,%A0,1) CR_TAB
   3054  1.1  mrg 		     AS2 (sbc,%B0,__zero_reg__) \"\\n\", operands);
   3055  1.1  mrg   switch (avr_jump_mode (operands[2],insn))
   3056  1.1  mrg   {
   3057  1.1  mrg     case 1:
   3058  1.1  mrg       return AS1 (brcc,%2);
   3059  1.1  mrg     case 2:
   3060  1.1  mrg       return (AS1 (brcs,.+2) CR_TAB
   3061  1.1  mrg               AS1 (rjmp,%2));
   3062  1.1  mrg   }
   3063  1.1  mrg   return (AS1 (brcs,.+4) CR_TAB
   3064  1.1  mrg           AS1 (jmp,%2));
   3065  1.1  mrg }")
   3066  1.1  mrg 
   3067  1.1  mrg (define_peephole
   3068  1.1  mrg   [(set (match_operand:QI 0 "d_register_operand" "")
   3069  1.1  mrg         (plus:QI (match_dup 0)
   3070  1.1  mrg                  (const_int -1)))
   3071  1.1  mrg    (set (cc0)
   3072  1.1  mrg 	(compare (match_dup 0)
   3073  1.1  mrg 		 (const_int -1)))
   3074  1.1  mrg    (set (pc)
   3075  1.1  mrg 	(if_then_else (ne (cc0) (const_int 0))
   3076  1.1  mrg 		      (label_ref (match_operand 1 "" ""))
   3077  1.1  mrg 		      (pc)))]
   3078  1.1  mrg   ""
   3079  1.1  mrg   "*
   3080  1.1  mrg {
   3081  1.1  mrg   CC_STATUS_INIT;
   3082  1.1  mrg   cc_status.value1 = operands[0];
   3083  1.1  mrg   cc_status.flags |= CC_OVERFLOW_UNUSABLE;
   3084  1.1  mrg   output_asm_insn (AS2 (subi,%A0,1), operands);
   3085  1.1  mrg   switch (avr_jump_mode (operands[1],insn))
   3086  1.1  mrg   {
   3087  1.1  mrg     case 1:
   3088  1.1  mrg       return AS1 (brcc,%1);
   3089  1.1  mrg     case 2:
   3090  1.1  mrg       return (AS1 (brcs,.+2) CR_TAB
   3091  1.1  mrg               AS1 (rjmp,%1));
   3092  1.1  mrg   }
   3093  1.1  mrg   return (AS1 (brcs,.+4) CR_TAB
   3094  1.1  mrg           AS1 (jmp,%1));
   3095  1.1  mrg }")
   3096  1.1  mrg 
   3097  1.1  mrg (define_peephole
   3098  1.1  mrg   [(set (cc0)
   3099  1.1  mrg 	(compare (match_operand:QI 0 "register_operand" "")
   3100  1.1  mrg 		 (const_int 0)))
   3101  1.1  mrg    (set (pc)
   3102  1.1  mrg 	(if_then_else (eq (cc0) (const_int 0))
   3103  1.1  mrg 		      (label_ref (match_operand 1 "" ""))
   3104  1.1  mrg 		      (pc)))]
   3105  1.1  mrg   "jump_over_one_insn_p (insn, operands[1])"
   3106  1.1  mrg   "cpse %0,__zero_reg__")
   3107  1.1  mrg 
   3108  1.1  mrg (define_peephole
   3109  1.1  mrg   [(set (cc0)
   3110  1.1  mrg         (compare (match_operand:QI 0 "register_operand" "")
   3111  1.1  mrg 		 (match_operand:QI 1 "register_operand" "")))
   3112  1.1  mrg    (set (pc)
   3113  1.1  mrg 	(if_then_else (eq (cc0) (const_int 0))
   3114  1.1  mrg 		      (label_ref (match_operand 2 "" ""))
   3115  1.1  mrg 		      (pc)))]
   3116  1.1  mrg   "jump_over_one_insn_p (insn, operands[2])"
   3117  1.1  mrg   "cpse %0,%1")
   3118  1.1  mrg 
   3119  1.1  mrg ;;pppppppppppppppppppppppppppppppppppppppppppppppppppp
   3120  1.1  mrg ;;prologue/epilogue support instructions
   3121  1.1  mrg 
   3122  1.1  mrg (define_insn "popqi"
   3123  1.1  mrg   [(set (match_operand:QI 0 "register_operand" "=r")
   3124  1.1  mrg         (mem:QI (post_inc (reg:HI REG_SP))))]
   3125  1.1  mrg   ""
   3126  1.1  mrg   "pop %0"
   3127  1.1  mrg   [(set_attr "cc" "none")
   3128  1.1  mrg    (set_attr "length" "1")])
   3129  1.1  mrg 
   3130  1.1  mrg (define_insn "pophi"
   3131  1.1  mrg   [(set (match_operand:HI 0 "register_operand" "=r")
   3132  1.1  mrg         (mem:HI (post_inc (reg:HI REG_SP))))]
   3133  1.1  mrg   ""
   3134  1.1  mrg   "pop %A0\;pop %B0"
   3135  1.1  mrg   [(set_attr "cc" "none")
   3136  1.1  mrg    (set_attr "length" "2")])
   3137  1.1  mrg 
   3138  1.1  mrg ;; Enable Interrupts
   3139  1.1  mrg (define_insn "enable_interrupt"
   3140  1.1  mrg   [(unspec [(const_int 0)] UNSPEC_SEI)]
   3141  1.1  mrg   ""
   3142  1.1  mrg   "sei"
   3143  1.1  mrg   [(set_attr "length" "1")
   3144  1.1  mrg   (set_attr "cc" "none")
   3145  1.1  mrg   ])
   3146  1.1  mrg 
   3147  1.1  mrg ;; Disable Interrupts
   3148  1.1  mrg (define_insn "disable_interrupt"
   3149  1.1  mrg   [(unspec [(const_int 0)] UNSPEC_CLI)]
   3150  1.1  mrg   ""
   3151  1.1  mrg   "cli"
   3152  1.1  mrg   [(set_attr "length" "1")
   3153  1.1  mrg   (set_attr "cc" "none")
   3154  1.1  mrg   ])
   3155  1.1  mrg 
   3156  1.1  mrg ;;  Library prologue saves
   3157  1.1  mrg (define_insn "call_prologue_saves"
   3158  1.1  mrg   [(unspec_volatile:HI [(const_int 0)] UNSPECV_PROLOGUE_SAVES)
   3159  1.1  mrg    (match_operand:HI 0 "immediate_operand" "")
   3160  1.1  mrg    (set (reg:HI REG_SP) (minus:HI 
   3161  1.1  mrg                            (reg:HI REG_SP)
   3162  1.1  mrg                            (match_operand:HI 1 "immediate_operand" "")))
   3163  1.1  mrg    (use (reg:HI REG_X))
   3164  1.1  mrg    (clobber (reg:HI REG_Z))]
   3165  1.1  mrg   ""
   3166  1.1  mrg   "ldi r30,lo8(gs(1f))
   3167  1.1  mrg 	ldi r31,hi8(gs(1f))
   3168  1.1  mrg 	%~jmp __prologue_saves__+((18 - %0) * 2)
   3169  1.1  mrg 1:"
   3170  1.1  mrg   [(set_attr_alternative "length"
   3171  1.1  mrg 			 [(if_then_else (eq_attr "mcu_mega" "yes")
   3172  1.1  mrg 					(const_int 6)
   3173  1.1  mrg 					(const_int 5))])
   3174  1.1  mrg   (set_attr "cc" "clobber")
   3175  1.1  mrg   ])
   3176  1.1  mrg   
   3177  1.1  mrg ;  epilogue  restores using library
   3178  1.1  mrg (define_insn "epilogue_restores"
   3179  1.1  mrg   [(unspec_volatile:QI [(const_int 0)] UNSPECV_EPILOGUE_RESTORES)
   3180  1.1  mrg    (set (reg:HI REG_Y ) (plus:HI 
   3181  1.1  mrg                            (reg:HI REG_Y)
   3182  1.1  mrg                            (match_operand:HI 0 "immediate_operand" ""))) 
   3183  1.1  mrg    (set (reg:HI REG_SP) (reg:HI REG_Y))
   3184  1.1  mrg    (clobber  (reg:QI REG_Z))]
   3185  1.1  mrg   ""
   3186  1.1  mrg   "ldi r30, lo8(%0)
   3187  1.1  mrg 	%~jmp __epilogue_restores__ + ((18 - %0) * 2)"
   3188  1.1  mrg   [(set_attr_alternative "length"
   3189  1.1  mrg 			 [(if_then_else (eq_attr "mcu_mega" "yes")
   3190  1.1  mrg 					(const_int 3)
   3191  1.1  mrg 					(const_int 2))])
   3192  1.1  mrg   (set_attr "cc" "clobber")
   3193  1.1  mrg   ])
   3194  1.1  mrg   
   3195  1.1  mrg ; return
   3196  1.1  mrg (define_insn "return"
   3197  1.1  mrg   [(return)]
   3198  1.1  mrg   "reload_completed && avr_simple_epilogue ()"
   3199  1.1  mrg   "ret"
   3200  1.1  mrg   [(set_attr "cc" "none")
   3201  1.1  mrg    (set_attr "length" "1")])
   3202  1.1  mrg 
   3203  1.1  mrg (define_insn "return_from_epilogue"
   3204  1.1  mrg   [(return)]
   3205  1.1  mrg   "(reload_completed 
   3206  1.1  mrg     && cfun->machine 
   3207  1.1  mrg     && !(cfun->machine->is_interrupt || cfun->machine->is_signal)
   3208  1.1  mrg     && !cfun->machine->is_naked)"
   3209  1.1  mrg   "ret"
   3210  1.1  mrg   [(set_attr "cc" "none")
   3211  1.1  mrg    (set_attr "length" "1")])
   3212  1.1  mrg 
   3213  1.1  mrg (define_insn "return_from_interrupt_epilogue"
   3214  1.1  mrg   [(return)]
   3215  1.1  mrg   "(reload_completed 
   3216  1.1  mrg     && cfun->machine 
   3217  1.1  mrg     && (cfun->machine->is_interrupt || cfun->machine->is_signal)
   3218  1.1  mrg     && !cfun->machine->is_naked)"
   3219  1.1  mrg   "reti"
   3220  1.1  mrg   [(set_attr "cc" "none")
   3221  1.1  mrg    (set_attr "length" "1")])
   3222  1.1  mrg 
   3223  1.1  mrg (define_insn "return_from_naked_epilogue"
   3224  1.1  mrg   [(return)]
   3225  1.1  mrg   "(reload_completed 
   3226  1.1  mrg     && cfun->machine 
   3227  1.1  mrg     && cfun->machine->is_naked)"
   3228  1.1  mrg   ""
   3229  1.1  mrg   [(set_attr "cc" "none")
   3230  1.1  mrg    (set_attr "length" "0")])
   3231  1.1  mrg 
   3232  1.1  mrg (define_expand "prologue"
   3233  1.1  mrg   [(const_int 0)]
   3234  1.1  mrg   ""
   3235  1.1  mrg   "
   3236  1.1  mrg   {
   3237  1.1  mrg     expand_prologue (); 
   3238  1.1  mrg     DONE;
   3239  1.1  mrg   }")
   3240  1.1  mrg 
   3241  1.1  mrg (define_expand "epilogue"
   3242  1.1  mrg   [(const_int 0)]
   3243  1.1  mrg   ""
   3244  1.1  mrg   "
   3245  1.1  mrg   {
   3246  1.1  mrg     expand_epilogue (); 
   3247  1.1  mrg     DONE;
   3248  1.1  mrg   }")
   3249