Home | History | Annotate | Line # | Download | only in vax
vax.md revision 1.1.1.1.4.2
      1  1.1.1.1.4.2  yamt ;; Machine description for GNU compiler, VAX Version
      2  1.1.1.1.4.2  yamt ;; Copyright (C) 1987, 1988, 1991, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
      3  1.1.1.1.4.2  yamt ;; 2002, 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
      4  1.1.1.1.4.2  yamt 
      5  1.1.1.1.4.2  yamt ;; This file is part of GCC.
      6  1.1.1.1.4.2  yamt 
      7  1.1.1.1.4.2  yamt ;; GCC is free software; you can redistribute it and/or modify
      8  1.1.1.1.4.2  yamt ;; it under the terms of the GNU General Public License as published by
      9  1.1.1.1.4.2  yamt ;; the Free Software Foundation; either version 3, or (at your option)
     10  1.1.1.1.4.2  yamt ;; any later version.
     11  1.1.1.1.4.2  yamt 
     12  1.1.1.1.4.2  yamt ;; GCC is distributed in the hope that it will be useful,
     13  1.1.1.1.4.2  yamt ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1.1.1.4.2  yamt ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15  1.1.1.1.4.2  yamt ;; GNU General Public License for more details.
     16  1.1.1.1.4.2  yamt 
     17  1.1.1.1.4.2  yamt ;; You should have received a copy of the GNU General Public License
     18  1.1.1.1.4.2  yamt ;; along with GCC; see the file COPYING3.  If not see
     19  1.1.1.1.4.2  yamt ;; <http://www.gnu.org/licenses/>.
     20  1.1.1.1.4.2  yamt 
     21  1.1.1.1.4.2  yamt 
     22  1.1.1.1.4.2  yamt ;;- Instruction patterns.  When multiple patterns apply,
     23  1.1.1.1.4.2  yamt ;;- the first one in the file is chosen.
     24  1.1.1.1.4.2  yamt ;;-
     25  1.1.1.1.4.2  yamt ;;- See file "rtl.def" for documentation on define_insn, match_*, et al.
     26  1.1.1.1.4.2  yamt ;;-
     27  1.1.1.1.4.2  yamt ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code
     28  1.1.1.1.4.2  yamt ;;- updates for most instructions.
     29  1.1.1.1.4.2  yamt 
     30  1.1.1.1.4.2  yamt ;; UNSPEC_VOLATILE usage:
     31  1.1.1.1.4.2  yamt 
     32  1.1.1.1.4.2  yamt (define_constants
     33  1.1.1.1.4.2  yamt   [(VUNSPEC_BLOCKAGE 0)	    ; `blockage' insn to prevent scheduling across an
     34  1.1.1.1.4.2  yamt 			    ; insn in the code.
     35  1.1.1.1.4.2  yamt    (VUNSPEC_SYNC_ISTREAM 1) ; sequence of insns to sync the I-stream
     36  1.1.1.1.4.2  yamt    (VAX_AP_REGNUM 12)	    ; Register 12 contains the argument pointer
     37  1.1.1.1.4.2  yamt    (VAX_FP_REGNUM 13)	    ; Register 13 contains the frame pointer
     38  1.1.1.1.4.2  yamt    (VAX_SP_REGNUM 14)	    ; Register 14 contains the stack pointer
     39  1.1.1.1.4.2  yamt    (VAX_PC_REGNUM 15)	    ; Register 15 contains the program counter
     40  1.1.1.1.4.2  yamt   ]
     41  1.1.1.1.4.2  yamt )
     42  1.1.1.1.4.2  yamt 
     43  1.1.1.1.4.2  yamt ;; Integer modes supported on VAX, with a mapping from machine mode
     44  1.1.1.1.4.2  yamt ;; to mnemonic suffix.  DImode is always a special case.
     45  1.1.1.1.4.2  yamt (define_mode_iterator VAXint [QI HI SI])
     46  1.1.1.1.4.2  yamt (define_mode_iterator VAXintQH [QI HI])
     47  1.1.1.1.4.2  yamt (define_mode_iterator VAXintQHSD [QI HI SI DI])
     48  1.1.1.1.4.2  yamt (define_mode_attr  isfx [(QI "b") (HI "w") (SI "l") (DI "q")])
     49  1.1.1.1.4.2  yamt 
     50  1.1.1.1.4.2  yamt ;; Similar for float modes supported on VAX.
     51  1.1.1.1.4.2  yamt (define_mode_iterator VAXfp [SF DF])
     52  1.1.1.1.4.2  yamt (define_mode_attr  fsfx [(SF "f") (DF "%#")])
     53  1.1.1.1.4.2  yamt 
     54  1.1.1.1.4.2  yamt ;; Some output patterns want integer immediates with a prefix...
     55  1.1.1.1.4.2  yamt (define_mode_attr  iprefx [(QI "B") (HI "H") (SI "N")])
     56  1.1.1.1.4.2  yamt 
     57  1.1.1.1.4.2  yamt ;;
     58  1.1.1.1.4.2  yamt (include "constraints.md")
     59  1.1.1.1.4.2  yamt (include "predicates.md")
     60  1.1.1.1.4.2  yamt 
     61  1.1.1.1.4.2  yamt (define_insn "*cmp<mode>"
     62  1.1.1.1.4.2  yamt   [(set (cc0)
     63  1.1.1.1.4.2  yamt 	(compare (match_operand:VAXint 0 "nonimmediate_operand" "nrmT,nrmT")
     64  1.1.1.1.4.2  yamt 		 (match_operand:VAXint 1 "general_operand" "I,nrmT")))]
     65  1.1.1.1.4.2  yamt   ""
     66  1.1.1.1.4.2  yamt   "@
     67  1.1.1.1.4.2  yamt    tst<VAXint:isfx> %0
     68  1.1.1.1.4.2  yamt    cmp<VAXint:isfx> %0,%1")
     69  1.1.1.1.4.2  yamt 
     70  1.1.1.1.4.2  yamt (define_insn "*cmp<mode>"
     71  1.1.1.1.4.2  yamt   [(set (cc0)
     72  1.1.1.1.4.2  yamt 	(compare (match_operand:VAXfp 0 "general_operand" "gF,gF")
     73  1.1.1.1.4.2  yamt 		 (match_operand:VAXfp 1 "general_operand" "G,gF")))]
     74  1.1.1.1.4.2  yamt   ""
     75  1.1.1.1.4.2  yamt   "@
     76  1.1.1.1.4.2  yamt    tst<VAXfp:fsfx> %0
     77  1.1.1.1.4.2  yamt    cmp<VAXfp:fsfx> %0,%1")
     78  1.1.1.1.4.2  yamt 
     79  1.1.1.1.4.2  yamt (define_insn "*bit<mode>"
     80  1.1.1.1.4.2  yamt   [(set (cc0)
     81  1.1.1.1.4.2  yamt 	(compare (and:VAXint (match_operand:VAXint 0 "general_operand" "nrmT")
     82  1.1.1.1.4.2  yamt 			     (match_operand:VAXint 1 "general_operand" "nrmT"))
     83  1.1.1.1.4.2  yamt 		 (const_int 0)))]
     84  1.1.1.1.4.2  yamt   ""
     85  1.1.1.1.4.2  yamt   "bit<VAXint:isfx> %0,%1")
     86  1.1.1.1.4.2  yamt 
     87  1.1.1.1.4.2  yamt ;; The VAX has no sCOND insns.  It does have add/subtract with carry
     88  1.1.1.1.4.2  yamt ;; which could be used to implement the sltu and sgeu patterns.  However,
     89  1.1.1.1.4.2  yamt ;; to do this properly requires a complete rewrite of the compare insns
     90  1.1.1.1.4.2  yamt ;; to keep them together with the sltu/sgeu insns until after the
     91  1.1.1.1.4.2  yamt ;; reload pass is complete.  The previous implementation didn't do this
     92  1.1.1.1.4.2  yamt ;; and has been deleted.
     93  1.1.1.1.4.2  yamt 
     94  1.1.1.1.4.2  yamt 
     96  1.1.1.1.4.2  yamt (define_insn "mov<mode>"
     97  1.1.1.1.4.2  yamt   [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g,g")
     98  1.1.1.1.4.2  yamt 	(match_operand:VAXfp 1 "general_operand" "G,gF"))]
     99  1.1.1.1.4.2  yamt   ""
    100  1.1.1.1.4.2  yamt   "@
    101  1.1.1.1.4.2  yamt    clr<VAXfp:fsfx> %0
    102  1.1.1.1.4.2  yamt    mov<VAXfp:fsfx> %1,%0")
    103  1.1.1.1.4.2  yamt 
    104  1.1.1.1.4.2  yamt ;; Some VAXen don't support this instruction.
    105  1.1.1.1.4.2  yamt ;;(define_insn "movti"
    106  1.1.1.1.4.2  yamt ;;  [(set (match_operand:TI 0 "general_operand" "=g")
    107  1.1.1.1.4.2  yamt ;;	(match_operand:TI 1 "general_operand" "g"))]
    108  1.1.1.1.4.2  yamt ;;  ""
    109  1.1.1.1.4.2  yamt ;;  "movh %1,%0")
    110  1.1.1.1.4.2  yamt 
    111  1.1.1.1.4.2  yamt (define_insn "movdi"
    112  1.1.1.1.4.2  yamt   [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
    113  1.1.1.1.4.2  yamt 	(match_operand:DI 1 "general_operand" "g"))]
    114  1.1.1.1.4.2  yamt   ""
    115  1.1.1.1.4.2  yamt   "* return vax_output_int_move (insn, operands, DImode);")
    116  1.1.1.1.4.2  yamt 
    117  1.1.1.1.4.2  yamt ;; The VAX move instructions have space-time tradeoffs.  On a MicroVAX
    118  1.1.1.1.4.2  yamt ;; register-register mov instructions take 3 bytes and 2 CPU cycles.  clrl
    119  1.1.1.1.4.2  yamt ;; takes 2 bytes and 3 cycles.  mov from constant to register takes 2 cycles
    120  1.1.1.1.4.2  yamt ;; if the constant is smaller than 4 bytes, 3 cycles for a longword
    121  1.1.1.1.4.2  yamt ;; constant.  movz, mneg, and mcom are as fast as mov, so movzwl is faster
    122  1.1.1.1.4.2  yamt ;; than movl for positive constants that fit in 16 bits but not 6 bits.  cvt
    123  1.1.1.1.4.2  yamt ;; instructions take 4 cycles.  inc takes 3 cycles.  The machine description
    124  1.1.1.1.4.2  yamt ;; is willing to trade 1 byte for 1 cycle (clrl instead of movl $0; cvtwl
    125  1.1.1.1.4.2  yamt ;; instead of movl).
    126  1.1.1.1.4.2  yamt 
    127  1.1.1.1.4.2  yamt ;; Cycle counts for other models may vary (on a VAX 750 they are similar,
    128  1.1.1.1.4.2  yamt ;; but on a VAX 9000 most move and add instructions with one constant
    129  1.1.1.1.4.2  yamt ;; operand take 1 cycle).
    130  1.1.1.1.4.2  yamt 
    131  1.1.1.1.4.2  yamt ;;  Loads of constants between 64 and 128 used to be done with
    132  1.1.1.1.4.2  yamt ;; "addl3 $63,#,dst" but this is slower than movzbl and takes as much space.
    133  1.1.1.1.4.2  yamt 
    134  1.1.1.1.4.2  yamt (define_expand "movsi"
    135  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "")
    136  1.1.1.1.4.2  yamt 	(match_operand:SI 1 "general_operand" ""))]
    137  1.1.1.1.4.2  yamt   ""
    138  1.1.1.1.4.2  yamt   "
    139  1.1.1.1.4.2  yamt {
    140  1.1.1.1.4.2  yamt #ifdef NO_EXTERNAL_INDIRECT_ADDRESS
    141  1.1.1.1.4.2  yamt   if (flag_pic
    142  1.1.1.1.4.2  yamt       && GET_CODE (operands[1]) == CONST
    143  1.1.1.1.4.2  yamt       && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF
    144  1.1.1.1.4.2  yamt       && !SYMBOL_REF_LOCAL_P (XEXP (XEXP (operands[1], 0), 0)))
    145  1.1.1.1.4.2  yamt     {
    146  1.1.1.1.4.2  yamt       rtx symbol_ref = XEXP (XEXP (operands[1], 0), 0);
    147  1.1.1.1.4.2  yamt       rtx const_int = XEXP (XEXP (operands[1], 0), 1);
    148  1.1.1.1.4.2  yamt       rtx temp = reload_in_progress ? operands[0] : gen_reg_rtx (Pmode);
    149  1.1.1.1.4.2  yamt       emit_move_insn (temp, symbol_ref);
    150  1.1.1.1.4.2  yamt       emit_move_insn (operands[0], gen_rtx_PLUS (SImode, temp, const_int));
    151  1.1.1.1.4.2  yamt       DONE;
    152  1.1.1.1.4.2  yamt     }
    153  1.1.1.1.4.2  yamt #endif
    154  1.1.1.1.4.2  yamt }")
    155  1.1.1.1.4.2  yamt 
    156  1.1.1.1.4.2  yamt (define_insn "movsi_2"
    157  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    158  1.1.1.1.4.2  yamt 	(match_operand:SI 1 "nonsymbolic_operand" "nrmT"))]
    159  1.1.1.1.4.2  yamt   ""
    160  1.1.1.1.4.2  yamt   "* return vax_output_int_move (insn, operands, SImode);")
    161  1.1.1.1.4.2  yamt 
    162  1.1.1.1.4.2  yamt (define_insn "mov<mode>"
    163  1.1.1.1.4.2  yamt   [(set (match_operand:VAXintQH 0 "nonimmediate_operand" "=g")
    164  1.1.1.1.4.2  yamt 	(match_operand:VAXintQH 1 "general_operand" "g"))]
    165  1.1.1.1.4.2  yamt   ""
    166  1.1.1.1.4.2  yamt   "* return vax_output_int_move (insn, operands, <MODE>mode);")
    167  1.1.1.1.4.2  yamt 
    168  1.1.1.1.4.2  yamt (define_insn "movstricthi"
    169  1.1.1.1.4.2  yamt   [(set (strict_low_part (match_operand:HI 0 "register_operand" "+g"))
    170  1.1.1.1.4.2  yamt 	(match_operand:HI 1 "general_operand" "g"))]
    171  1.1.1.1.4.2  yamt   ""
    172  1.1.1.1.4.2  yamt   "*
    173  1.1.1.1.4.2  yamt {
    174  1.1.1.1.4.2  yamt   if (CONST_INT_P (operands[1]))
    175  1.1.1.1.4.2  yamt     {
    176  1.1.1.1.4.2  yamt       int i = INTVAL (operands[1]);
    177  1.1.1.1.4.2  yamt       if (i == 0)
    178  1.1.1.1.4.2  yamt 	return \"clrw %0\";
    179  1.1.1.1.4.2  yamt       else if ((unsigned int)i < 64)
    180  1.1.1.1.4.2  yamt 	return \"movw %1,%0\";
    181  1.1.1.1.4.2  yamt       else if ((unsigned int)~i < 64)
    182  1.1.1.1.4.2  yamt 	return \"mcomw %H1,%0\";
    183  1.1.1.1.4.2  yamt       else if ((unsigned int)i < 256)
    184  1.1.1.1.4.2  yamt 	return \"movzbw %1,%0\";
    185  1.1.1.1.4.2  yamt     }
    186  1.1.1.1.4.2  yamt   return \"movw %1,%0\";
    187  1.1.1.1.4.2  yamt }")
    188  1.1.1.1.4.2  yamt 
    189  1.1.1.1.4.2  yamt (define_insn "movstrictqi"
    190  1.1.1.1.4.2  yamt   [(set (strict_low_part (match_operand:QI 0 "register_operand" "+g"))
    191  1.1.1.1.4.2  yamt 	(match_operand:QI 1 "general_operand" "g"))]
    192  1.1.1.1.4.2  yamt   ""
    193  1.1.1.1.4.2  yamt   "*
    194  1.1.1.1.4.2  yamt {
    195  1.1.1.1.4.2  yamt   if (CONST_INT_P (operands[1]))
    196  1.1.1.1.4.2  yamt     {
    197  1.1.1.1.4.2  yamt       int i = INTVAL (operands[1]);
    198  1.1.1.1.4.2  yamt       if (i == 0)
    199  1.1.1.1.4.2  yamt 	return \"clrb %0\";
    200  1.1.1.1.4.2  yamt       else if ((unsigned int)~i < 64)
    201  1.1.1.1.4.2  yamt 	return \"mcomb %B1,%0\";
    202  1.1.1.1.4.2  yamt     }
    203  1.1.1.1.4.2  yamt   return \"movb %1,%0\";
    204  1.1.1.1.4.2  yamt }")
    205  1.1.1.1.4.2  yamt 
    206  1.1.1.1.4.2  yamt ;; This is here to accept 4 arguments and pass the first 3 along
    207  1.1.1.1.4.2  yamt ;; to the movmemhi1 pattern that really does the work.
    208  1.1.1.1.4.2  yamt (define_expand "movmemhi"
    209  1.1.1.1.4.2  yamt   [(set (match_operand:BLK 0 "general_operand" "=g")
    210  1.1.1.1.4.2  yamt 	(match_operand:BLK 1 "general_operand" "g"))
    211  1.1.1.1.4.2  yamt    (use (match_operand:HI 2 "general_operand" "g"))
    212  1.1.1.1.4.2  yamt    (match_operand 3 "" "")]
    213  1.1.1.1.4.2  yamt   ""
    214  1.1.1.1.4.2  yamt   "
    215  1.1.1.1.4.2  yamt {
    216  1.1.1.1.4.2  yamt   if (CONST_INT_P (operands[2]) && INTVAL (operands[2]) <= 48)
    217  1.1.1.1.4.2  yamt     {
    218  1.1.1.1.4.2  yamt       emit_insn (gen_movmemsi1_2 (operands[0], operands[1], operands[2]));
    219  1.1.1.1.4.2  yamt       DONE;
    220  1.1.1.1.4.2  yamt     }
    221  1.1.1.1.4.2  yamt   emit_insn (gen_movmemhi1 (operands[0], operands[1], operands[2]));
    222  1.1.1.1.4.2  yamt   DONE;
    223  1.1.1.1.4.2  yamt }")
    224  1.1.1.1.4.2  yamt 
    225  1.1.1.1.4.2  yamt ;; The definition of this insn does not really explain what it does,
    226  1.1.1.1.4.2  yamt ;; but it should suffice
    227  1.1.1.1.4.2  yamt ;; that anything generated as this insn will be recognized as one
    228  1.1.1.1.4.2  yamt ;; and that it won't successfully combine with anything.
    229  1.1.1.1.4.2  yamt 
    230  1.1.1.1.4.2  yamt (define_insn "movmemsi1_2"
    231  1.1.1.1.4.2  yamt   [(set (match_operand:BLK 0 "memory_operand" "=B")
    232  1.1.1.1.4.2  yamt 	(match_operand:BLK 1 "memory_operand" "B"))
    233  1.1.1.1.4.2  yamt    (use (match_operand:SI 2 "const_int_operand" "g"))]
    234  1.1.1.1.4.2  yamt   "INTVAL (operands[2]) <= 48"
    235  1.1.1.1.4.2  yamt   "* return vax_output_movmemsi (insn, operands);")
    236  1.1.1.1.4.2  yamt 
    237  1.1.1.1.4.2  yamt (define_insn "movmemhi1"
    238  1.1.1.1.4.2  yamt   [(set (match_operand:BLK 0 "memory_operand" "=o")
    239  1.1.1.1.4.2  yamt 	(match_operand:BLK 1 "memory_operand" "o"))
    240  1.1.1.1.4.2  yamt    (use (match_operand:HI 2 "general_operand" "g"))
    241  1.1.1.1.4.2  yamt    (clobber (reg:SI 0))
    242  1.1.1.1.4.2  yamt    (clobber (reg:SI 1))
    243  1.1.1.1.4.2  yamt    (clobber (reg:SI 2))
    244  1.1.1.1.4.2  yamt    (clobber (reg:SI 3))
    245  1.1.1.1.4.2  yamt    (clobber (reg:SI 4))
    246  1.1.1.1.4.2  yamt    (clobber (reg:SI 5))]
    247  1.1.1.1.4.2  yamt   ""
    248  1.1.1.1.4.2  yamt   "movc3 %2,%1,%0")
    249  1.1.1.1.4.2  yamt 
    251  1.1.1.1.4.2  yamt ;; Extension and truncation insns.
    252  1.1.1.1.4.2  yamt 
    253  1.1.1.1.4.2  yamt (define_insn "truncsiqi2"
    254  1.1.1.1.4.2  yamt   [(set (match_operand:QI 0 "nonimmediate_operand" "=g")
    255  1.1.1.1.4.2  yamt 	(truncate:QI (match_operand:SI 1 "nonimmediate_operand" "nrmT")))]
    256  1.1.1.1.4.2  yamt   ""
    257  1.1.1.1.4.2  yamt   "cvtlb %1,%0")
    258  1.1.1.1.4.2  yamt 
    259  1.1.1.1.4.2  yamt (define_insn "truncsihi2"
    260  1.1.1.1.4.2  yamt   [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
    261  1.1.1.1.4.2  yamt 	(truncate:HI (match_operand:SI 1 "nonimmediate_operand" "nrmT")))]
    262  1.1.1.1.4.2  yamt   ""
    263  1.1.1.1.4.2  yamt   "cvtlw %1,%0")
    264  1.1.1.1.4.2  yamt 
    265  1.1.1.1.4.2  yamt (define_insn "trunchiqi2"
    266  1.1.1.1.4.2  yamt   [(set (match_operand:QI 0 "nonimmediate_operand" "=g")
    267  1.1.1.1.4.2  yamt 	(truncate:QI (match_operand:HI 1 "nonimmediate_operand" "g")))]
    268  1.1.1.1.4.2  yamt   ""
    269  1.1.1.1.4.2  yamt   "cvtwb %1,%0")
    270  1.1.1.1.4.2  yamt 
    271  1.1.1.1.4.2  yamt (define_insn "extendhisi2"
    272  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    273  1.1.1.1.4.2  yamt 	(sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "g")))]
    274  1.1.1.1.4.2  yamt   ""
    275  1.1.1.1.4.2  yamt   "cvtwl %1,%0")
    276  1.1.1.1.4.2  yamt 
    277  1.1.1.1.4.2  yamt (define_insn "extendqihi2"
    278  1.1.1.1.4.2  yamt   [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
    279  1.1.1.1.4.2  yamt 	(sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "g")))]
    280  1.1.1.1.4.2  yamt   ""
    281  1.1.1.1.4.2  yamt   "cvtbw %1,%0")
    282  1.1.1.1.4.2  yamt 
    283  1.1.1.1.4.2  yamt (define_insn "extendqisi2"
    284  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    285  1.1.1.1.4.2  yamt 	(sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "g")))]
    286  1.1.1.1.4.2  yamt   ""
    287  1.1.1.1.4.2  yamt   "cvtbl %1,%0")
    288  1.1.1.1.4.2  yamt 
    289  1.1.1.1.4.2  yamt (define_insn "extendsfdf2"
    290  1.1.1.1.4.2  yamt   [(set (match_operand:DF 0 "nonimmediate_operand" "=g")
    291  1.1.1.1.4.2  yamt 	(float_extend:DF (match_operand:SF 1 "general_operand" "gF")))]
    292  1.1.1.1.4.2  yamt   ""
    293  1.1.1.1.4.2  yamt   "cvtf%# %1,%0")
    294  1.1.1.1.4.2  yamt 
    295  1.1.1.1.4.2  yamt (define_insn "truncdfsf2"
    296  1.1.1.1.4.2  yamt   [(set (match_operand:SF 0 "nonimmediate_operand" "=g")
    297  1.1.1.1.4.2  yamt 	(float_truncate:SF (match_operand:DF 1 "general_operand" "gF")))]
    298  1.1.1.1.4.2  yamt   ""
    299  1.1.1.1.4.2  yamt   "cvt%#f %1,%0")
    300  1.1.1.1.4.2  yamt 
    301  1.1.1.1.4.2  yamt (define_insn "zero_extendhisi2"
    302  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    303  1.1.1.1.4.2  yamt 	(zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "g")))]
    304  1.1.1.1.4.2  yamt   ""
    305  1.1.1.1.4.2  yamt   "movzwl %1,%0")
    306  1.1.1.1.4.2  yamt 
    307  1.1.1.1.4.2  yamt (define_insn "zero_extendqihi2"
    308  1.1.1.1.4.2  yamt   [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
    309  1.1.1.1.4.2  yamt 	(zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "g")))]
    310  1.1.1.1.4.2  yamt   ""
    311  1.1.1.1.4.2  yamt   "movzbw %1,%0")
    312  1.1.1.1.4.2  yamt 
    313  1.1.1.1.4.2  yamt (define_insn "zero_extendqisi2"
    314  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    315  1.1.1.1.4.2  yamt 	(zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "g")))]
    316  1.1.1.1.4.2  yamt   ""
    317  1.1.1.1.4.2  yamt   "movzbl %1,%0")
    318  1.1.1.1.4.2  yamt 
    320  1.1.1.1.4.2  yamt ;; Fix-to-float conversion insns.
    321  1.1.1.1.4.2  yamt 
    322  1.1.1.1.4.2  yamt (define_insn "float<VAXint:mode><VAXfp:mode>2"
    323  1.1.1.1.4.2  yamt   [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g")
    324  1.1.1.1.4.2  yamt 	(float:VAXfp (match_operand:VAXint 1 "nonimmediate_operand" "g")))]
    325  1.1.1.1.4.2  yamt   ""
    326  1.1.1.1.4.2  yamt   "cvt<VAXint:isfx><VAXfp:fsfx> %1,%0")
    327  1.1.1.1.4.2  yamt 
    328  1.1.1.1.4.2  yamt ;; Float-to-fix conversion insns.
    329  1.1.1.1.4.2  yamt 
    330  1.1.1.1.4.2  yamt (define_insn "fix_trunc<VAXfp:mode><VAXint:mode>2"
    331  1.1.1.1.4.2  yamt   [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g")
    332  1.1.1.1.4.2  yamt 	(fix:VAXint (fix:VAXfp (match_operand:VAXfp 1 "general_operand" "gF"))))]
    333  1.1.1.1.4.2  yamt   ""
    334  1.1.1.1.4.2  yamt   "cvt<VAXfp:fsfx><VAXint:isfx> %1,%0")
    335  1.1.1.1.4.2  yamt 
    337  1.1.1.1.4.2  yamt ;;- All kinds of add instructions.
    338  1.1.1.1.4.2  yamt 
    339  1.1.1.1.4.2  yamt (define_insn "add<mode>3"
    340  1.1.1.1.4.2  yamt   [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g,g,g")
    341  1.1.1.1.4.2  yamt 	(plus:VAXfp (match_operand:VAXfp 1 "general_operand" "0,gF,gF")
    342  1.1.1.1.4.2  yamt 		    (match_operand:VAXfp 2 "general_operand" "gF,0,gF")))]
    343  1.1.1.1.4.2  yamt   ""
    344  1.1.1.1.4.2  yamt   "@
    345  1.1.1.1.4.2  yamt    add<VAXfp:fsfx>2 %2,%0
    346  1.1.1.1.4.2  yamt    add<VAXfp:fsfx>2 %1,%0
    347  1.1.1.1.4.2  yamt    add<VAXfp:fsfx>3 %1,%2,%0")
    348  1.1.1.1.4.2  yamt 
    349  1.1.1.1.4.2  yamt (define_insn "pushlclsymreg"
    350  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "push_operand" "=g")
    351  1.1.1.1.4.2  yamt 	(plus:SI (match_operand:SI 1 "register_operand" "%r")
    352  1.1.1.1.4.2  yamt 		 (match_operand:SI 2 "local_symbolic_operand" "i")))]
    353  1.1.1.1.4.2  yamt   "flag_pic"
    354  1.1.1.1.4.2  yamt   "pushab %a2[%1]")
    355  1.1.1.1.4.2  yamt 
    356  1.1.1.1.4.2  yamt (define_insn "pushextsymreg"
    357  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "push_operand" "=g")
    358  1.1.1.1.4.2  yamt 	(plus:SI (match_operand:SI 1 "register_operand" "%r")
    359  1.1.1.1.4.2  yamt 		 (match_operand:SI 2 "external_symbolic_operand" "i")))]
    360  1.1.1.1.4.2  yamt   "flag_pic"
    361  1.1.1.1.4.2  yamt   "pushab %a2[%1]")
    362  1.1.1.1.4.2  yamt 
    363  1.1.1.1.4.2  yamt (define_insn "movlclsymreg"
    364  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    365  1.1.1.1.4.2  yamt 	(plus:SI (match_operand:SI 1 "register_operand" "%r")
    366  1.1.1.1.4.2  yamt 		 (match_operand:SI 2 "local_symbolic_operand" "i")))]
    367  1.1.1.1.4.2  yamt   "flag_pic"
    368  1.1.1.1.4.2  yamt   "movab %a2[%1],%0")
    369  1.1.1.1.4.2  yamt 
    370  1.1.1.1.4.2  yamt (define_insn "movextsymreg"
    371  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    372  1.1.1.1.4.2  yamt 	(plus:SI (match_operand:SI 1 "register_operand" "%r")
    373  1.1.1.1.4.2  yamt 		 (match_operand:SI 2 "external_symbolic_operand" "i")))]
    374  1.1.1.1.4.2  yamt   "flag_pic"
    375  1.1.1.1.4.2  yamt   "movab %a2[%1],%0")
    376  1.1.1.1.4.2  yamt 
    377  1.1.1.1.4.2  yamt (define_insn "add<mode>3"
    378  1.1.1.1.4.2  yamt   [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g")
    379  1.1.1.1.4.2  yamt 	(plus:VAXint (match_operand:VAXint 1 "general_operand" "nrmT")
    380  1.1.1.1.4.2  yamt 		    (match_operand:VAXint 2 "general_operand" "nrmT")))]
    381  1.1.1.1.4.2  yamt   ""
    382  1.1.1.1.4.2  yamt   "* return vax_output_int_add (insn, operands, <MODE>mode);")
    383  1.1.1.1.4.2  yamt 
    384  1.1.1.1.4.2  yamt (define_expand "adddi3"
    385  1.1.1.1.4.2  yamt   [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
    386  1.1.1.1.4.2  yamt 	(plus:DI (match_operand:DI 1 "general_operand" "g")
    387  1.1.1.1.4.2  yamt 		 (match_operand:DI 2 "general_operand" "g")))]
    388  1.1.1.1.4.2  yamt   "!reload_in_progress"
    389  1.1.1.1.4.2  yamt   "vax_expand_addsub_di_operands (operands, PLUS); DONE;")
    390  1.1.1.1.4.2  yamt 
    391  1.1.1.1.4.2  yamt (define_insn "adcdi3"
    392  1.1.1.1.4.2  yamt   [(set (match_operand:DI 0 "nonimmediate_addsub_di_operand" "=Rr")
    393  1.1.1.1.4.2  yamt 	(plus:DI (match_operand:DI 1 "general_addsub_di_operand" "%0")
    394  1.1.1.1.4.2  yamt 		 (match_operand:DI 2 "general_addsub_di_operand" "nRr")))]
    395  1.1.1.1.4.2  yamt   "TARGET_QMATH"
    396  1.1.1.1.4.2  yamt   "* return vax_output_int_add (insn, operands, DImode);")
    397  1.1.1.1.4.2  yamt 
    398  1.1.1.1.4.2  yamt ;; The add-with-carry (adwc) instruction only accepts two operands.
    399  1.1.1.1.4.2  yamt (define_insn "adddi3_old"
    400  1.1.1.1.4.2  yamt   [(set (match_operand:DI 0 "nonimmediate_operand" "=ro>,ro>")
    401  1.1.1.1.4.2  yamt 	(plus:DI (match_operand:DI 1 "general_operand" "%0,ro>")
    402  1.1.1.1.4.2  yamt 		 (match_operand:DI 2 "general_operand" "Fsro,Fs")))]
    403  1.1.1.1.4.2  yamt   "!TARGET_QMATH"
    404  1.1.1.1.4.2  yamt   "* return vax_output_int_add (insn, operands, DImode);")
    405  1.1.1.1.4.2  yamt 
    407  1.1.1.1.4.2  yamt ;;- All kinds of subtract instructions.
    408  1.1.1.1.4.2  yamt 
    409  1.1.1.1.4.2  yamt (define_insn "sub<mode>3"
    410  1.1.1.1.4.2  yamt   [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g,g")
    411  1.1.1.1.4.2  yamt 	(minus:VAXfp (match_operand:VAXfp 1 "general_operand" "0,gF")
    412  1.1.1.1.4.2  yamt 		     (match_operand:VAXfp 2 "general_operand" "gF,gF")))]
    413  1.1.1.1.4.2  yamt   ""
    414  1.1.1.1.4.2  yamt   "@
    415  1.1.1.1.4.2  yamt    sub<VAXfp:fsfx>2 %2,%0
    416  1.1.1.1.4.2  yamt    sub<VAXfp:fsfx>3 %2,%1,%0")
    417  1.1.1.1.4.2  yamt 
    418  1.1.1.1.4.2  yamt (define_insn "sub<mode>3"
    419  1.1.1.1.4.2  yamt   [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g")
    420  1.1.1.1.4.2  yamt 	(minus:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT")
    421  1.1.1.1.4.2  yamt 		     (match_operand:VAXint 2 "general_operand" "nrmT,nrmT")))]
    422  1.1.1.1.4.2  yamt   ""
    423  1.1.1.1.4.2  yamt   "@
    424  1.1.1.1.4.2  yamt    sub<VAXint:isfx>2 %2,%0
    425  1.1.1.1.4.2  yamt    sub<VAXint:isfx>3 %2,%1,%0")
    426  1.1.1.1.4.2  yamt 
    427  1.1.1.1.4.2  yamt (define_expand "subdi3"
    428  1.1.1.1.4.2  yamt   [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
    429  1.1.1.1.4.2  yamt 	(minus:DI (match_operand:DI 1 "general_operand" "g")
    430  1.1.1.1.4.2  yamt 		  (match_operand:DI 2 "general_operand" "g")))]
    431  1.1.1.1.4.2  yamt   "!reload_in_progress"
    432  1.1.1.1.4.2  yamt   "vax_expand_addsub_di_operands (operands, MINUS); DONE;")
    433  1.1.1.1.4.2  yamt 
    434  1.1.1.1.4.2  yamt (define_insn "sbcdi3"
    435  1.1.1.1.4.2  yamt   [(set (match_operand:DI 0 "nonimmediate_addsub_di_operand" "=Rr,=Rr")
    436  1.1.1.1.4.2  yamt 	(minus:DI (match_operand:DI 1 "general_addsub_di_operand" "0,I")
    437  1.1.1.1.4.2  yamt 		  (match_operand:DI 2 "general_addsub_di_operand" "nRr,Rr")))]
    438  1.1.1.1.4.2  yamt   "TARGET_QMATH"
    439  1.1.1.1.4.2  yamt   "* return vax_output_int_subtract (insn, operands, DImode);")
    440  1.1.1.1.4.2  yamt 
    441  1.1.1.1.4.2  yamt ;; The subtract-with-carry (sbwc) instruction only takes two operands.
    442  1.1.1.1.4.2  yamt (define_insn "subdi3_old"
    443  1.1.1.1.4.2  yamt   [(set (match_operand:DI 0 "nonimmediate_operand" "=or>,or>")
    444  1.1.1.1.4.2  yamt 	(minus:DI (match_operand:DI 1 "general_operand" "0,or>")
    445  1.1.1.1.4.2  yamt 		  (match_operand:DI 2 "general_operand" "Fsor,Fs")))]
    446  1.1.1.1.4.2  yamt   "!TARGET_QMATH"
    447  1.1.1.1.4.2  yamt   "* return vax_output_int_subtract (insn, operands, DImode);")
    448  1.1.1.1.4.2  yamt 
    450  1.1.1.1.4.2  yamt ;;- Multiply instructions.
    451  1.1.1.1.4.2  yamt 
    452  1.1.1.1.4.2  yamt (define_insn "mul<mode>3"
    453  1.1.1.1.4.2  yamt   [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g,g,g")
    454  1.1.1.1.4.2  yamt 	(mult:VAXfp (match_operand:VAXfp 1 "general_operand" "0,gF,gF")
    455  1.1.1.1.4.2  yamt 		    (match_operand:VAXfp 2 "general_operand" "gF,0,gF")))]
    456  1.1.1.1.4.2  yamt   ""
    457  1.1.1.1.4.2  yamt   "@
    458  1.1.1.1.4.2  yamt    mul<VAXfp:fsfx>2 %2,%0
    459  1.1.1.1.4.2  yamt    mul<VAXfp:fsfx>2 %1,%0
    460  1.1.1.1.4.2  yamt    mul<VAXfp:fsfx>3 %1,%2,%0")
    461  1.1.1.1.4.2  yamt 
    462  1.1.1.1.4.2  yamt (define_insn "mul<mode>3"
    463  1.1.1.1.4.2  yamt   [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g,g")
    464  1.1.1.1.4.2  yamt 	(mult:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT,nrmT")
    465  1.1.1.1.4.2  yamt 		    (match_operand:VAXint 2 "general_operand" "nrmT,0,nrmT")))]
    466  1.1.1.1.4.2  yamt   ""
    467  1.1.1.1.4.2  yamt   "@
    468  1.1.1.1.4.2  yamt    mul<VAXint:isfx>2 %2,%0
    469  1.1.1.1.4.2  yamt    mul<VAXint:isfx>2 %1,%0
    470  1.1.1.1.4.2  yamt    mul<VAXint:isfx>3 %1,%2,%0")
    471  1.1.1.1.4.2  yamt 
    472  1.1.1.1.4.2  yamt (define_insn "mulsidi3"
    473  1.1.1.1.4.2  yamt   [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
    474  1.1.1.1.4.2  yamt 	(mult:DI (sign_extend:DI
    475  1.1.1.1.4.2  yamt 		  (match_operand:SI 1 "nonimmediate_operand" "nrmT"))
    476  1.1.1.1.4.2  yamt 		 (sign_extend:DI
    477  1.1.1.1.4.2  yamt 		  (match_operand:SI 2 "nonimmediate_operand" "nrmT"))))]
    478  1.1.1.1.4.2  yamt   ""
    479  1.1.1.1.4.2  yamt   "emul %1,%2,$0,%0")
    480  1.1.1.1.4.2  yamt 
    481  1.1.1.1.4.2  yamt (define_insn ""
    482  1.1.1.1.4.2  yamt   [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
    483  1.1.1.1.4.2  yamt 	(plus:DI
    484  1.1.1.1.4.2  yamt 	 (mult:DI (sign_extend:DI
    485  1.1.1.1.4.2  yamt 		   (match_operand:SI 1 "nonimmediate_operand" "nrmT"))
    486  1.1.1.1.4.2  yamt 		  (sign_extend:DI
    487  1.1.1.1.4.2  yamt 		   (match_operand:SI 2 "nonimmediate_operand" "nrmT")))
    488  1.1.1.1.4.2  yamt 	 (sign_extend:DI (match_operand:SI 3 "nonimmediate_operand" "g"))))]
    489  1.1.1.1.4.2  yamt   ""
    490  1.1.1.1.4.2  yamt   "emul %1,%2,%3,%0")
    491  1.1.1.1.4.2  yamt 
    492  1.1.1.1.4.2  yamt ;; 'F' constraint means type CONST_DOUBLE
    493  1.1.1.1.4.2  yamt (define_insn ""
    494  1.1.1.1.4.2  yamt   [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
    495  1.1.1.1.4.2  yamt 	(plus:DI
    496  1.1.1.1.4.2  yamt 	 (mult:DI (sign_extend:DI
    497  1.1.1.1.4.2  yamt 		   (match_operand:SI 1 "nonimmediate_operand" "nrmT"))
    498  1.1.1.1.4.2  yamt 		  (sign_extend:DI
    499  1.1.1.1.4.2  yamt 		   (match_operand:SI 2 "nonimmediate_operand" "nrmT")))
    500  1.1.1.1.4.2  yamt 	 (match_operand:DI 3 "immediate_operand" "F")))]
    501  1.1.1.1.4.2  yamt   "GET_CODE (operands[3]) == CONST_DOUBLE
    502  1.1.1.1.4.2  yamt     && CONST_DOUBLE_HIGH (operands[3]) == (CONST_DOUBLE_LOW (operands[3]) >> 31)"
    503  1.1.1.1.4.2  yamt   "*
    504  1.1.1.1.4.2  yamt {
    505  1.1.1.1.4.2  yamt   if (CONST_DOUBLE_HIGH (operands[3]))
    506  1.1.1.1.4.2  yamt     operands[3] = GEN_INT (CONST_DOUBLE_LOW (operands[3]));
    507  1.1.1.1.4.2  yamt   return \"emul %1,%2,%3,%0\";
    508  1.1.1.1.4.2  yamt }")
    509  1.1.1.1.4.2  yamt 
    511  1.1.1.1.4.2  yamt ;;- Divide instructions.
    512  1.1.1.1.4.2  yamt 
    513  1.1.1.1.4.2  yamt (define_insn "div<mode>3"
    514  1.1.1.1.4.2  yamt   [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g,g")
    515  1.1.1.1.4.2  yamt 	(div:VAXfp (match_operand:VAXfp 1 "general_operand" "0,gF")
    516  1.1.1.1.4.2  yamt 		   (match_operand:VAXfp 2 "general_operand" "gF,gF")))]
    517  1.1.1.1.4.2  yamt   ""
    518  1.1.1.1.4.2  yamt   "@
    519  1.1.1.1.4.2  yamt    div<VAXfp:fsfx>2 %2,%0
    520  1.1.1.1.4.2  yamt    div<VAXfp:fsfx>3 %2,%1,%0")
    521  1.1.1.1.4.2  yamt 
    522  1.1.1.1.4.2  yamt (define_insn "div<mode>3"
    523  1.1.1.1.4.2  yamt   [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g")
    524  1.1.1.1.4.2  yamt 	(div:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT")
    525  1.1.1.1.4.2  yamt 		   (match_operand:VAXint 2 "general_operand" "nrmT,nrmT")))]
    526  1.1.1.1.4.2  yamt   ""
    527  1.1.1.1.4.2  yamt   "@
    528  1.1.1.1.4.2  yamt    div<VAXint:isfx>2 %2,%0
    529  1.1.1.1.4.2  yamt    div<VAXint:isfx>3 %2,%1,%0")
    530  1.1.1.1.4.2  yamt 
    531  1.1.1.1.4.2  yamt ;This is left out because it is very slow;
    532  1.1.1.1.4.2  yamt ;we are better off programming around the "lack" of this insn.
    533  1.1.1.1.4.2  yamt ;(define_insn "divmoddisi4"
    534  1.1.1.1.4.2  yamt ;  [(set (match_operand:SI 0 "general_operand" "=g")
    535  1.1.1.1.4.2  yamt ;	(div:SI (match_operand:DI 1 "general_operand" "g")
    536  1.1.1.1.4.2  yamt ;		(match_operand:SI 2 "general_operand" "g")))
    537  1.1.1.1.4.2  yamt ;   (set (match_operand:SI 3 "general_operand" "=g")
    538  1.1.1.1.4.2  yamt ;	(mod:SI (match_operand:DI 1 "general_operand" "g")
    539  1.1.1.1.4.2  yamt ;		(match_operand:SI 2 "general_operand" "g")))]
    540  1.1.1.1.4.2  yamt ;  ""
    541  1.1.1.1.4.2  yamt ;  "ediv %2,%1,%0,%3")
    542  1.1.1.1.4.2  yamt 
    544  1.1.1.1.4.2  yamt ;; Bit-and on the VAX is done with a clear-bits insn.
    545  1.1.1.1.4.2  yamt (define_expand "and<mode>3"
    546  1.1.1.1.4.2  yamt   [(set (match_operand:VAXint 0 "nonimmediate_operand" "")
    547  1.1.1.1.4.2  yamt 	(and:VAXint (not:VAXint (match_operand:VAXint 1 "general_operand" ""))
    548  1.1.1.1.4.2  yamt 		   (match_operand:VAXint 2 "general_operand" "")))]
    549  1.1.1.1.4.2  yamt   ""
    550  1.1.1.1.4.2  yamt   "
    551  1.1.1.1.4.2  yamt {
    552  1.1.1.1.4.2  yamt   rtx op1 = operands[1];
    553  1.1.1.1.4.2  yamt 
    554  1.1.1.1.4.2  yamt   /* If there is a constant argument, complement that one.  */
    555  1.1.1.1.4.2  yamt   if (CONST_INT_P (operands[2]) && ! CONST_INT_P (op1))
    556  1.1.1.1.4.2  yamt     {
    557  1.1.1.1.4.2  yamt       operands[1] = operands[2];
    558  1.1.1.1.4.2  yamt       operands[2] = op1;
    559  1.1.1.1.4.2  yamt       op1 = operands[1];
    560  1.1.1.1.4.2  yamt     }
    561  1.1.1.1.4.2  yamt 
    562  1.1.1.1.4.2  yamt   if (CONST_INT_P (op1))
    563  1.1.1.1.4.2  yamt     operands[1] = GEN_INT (~INTVAL (op1));
    564  1.1.1.1.4.2  yamt   else
    565  1.1.1.1.4.2  yamt     operands[1] = expand_unop (<MODE>mode, one_cmpl_optab, op1, 0, 1);
    566  1.1.1.1.4.2  yamt }")
    567  1.1.1.1.4.2  yamt 
    568  1.1.1.1.4.2  yamt (define_insn "*and<mode>"
    569  1.1.1.1.4.2  yamt   [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g")
    570  1.1.1.1.4.2  yamt 	(and:VAXint (not:VAXint (match_operand:VAXint 1 "general_operand" "nrmT,nrmT"))
    571  1.1.1.1.4.2  yamt 		    (match_operand:VAXint 2 "general_operand" "0,nrmT")))]
    572  1.1.1.1.4.2  yamt   ""
    573  1.1.1.1.4.2  yamt   "@
    574  1.1.1.1.4.2  yamt    bic<VAXint:isfx>2 %1,%0
    575  1.1.1.1.4.2  yamt    bic<VAXint:isfx>3 %1,%2,%0")
    576  1.1.1.1.4.2  yamt 
    577  1.1.1.1.4.2  yamt ;; The following used to be needed because constant propagation can
    578  1.1.1.1.4.2  yamt ;; create them starting from the bic insn patterns above.  This is no
    579  1.1.1.1.4.2  yamt ;; longer a problem.  However, having these patterns allows optimization
    580  1.1.1.1.4.2  yamt ;; opportunities in combine.c.
    581  1.1.1.1.4.2  yamt 
    582  1.1.1.1.4.2  yamt (define_insn "*and<mode>_const_int"
    583  1.1.1.1.4.2  yamt   [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g")
    584  1.1.1.1.4.2  yamt 	(and:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT")
    585  1.1.1.1.4.2  yamt 		   (match_operand:VAXint 2 "const_int_operand" "n,n")))]
    586  1.1.1.1.4.2  yamt   ""
    587  1.1.1.1.4.2  yamt   "@
    588  1.1.1.1.4.2  yamt    bic<VAXint:isfx>2 %<VAXint:iprefx>2,%0
    589  1.1.1.1.4.2  yamt    bic<VAXint:isfx>3 %<VAXint:iprefx>2,%1,%0")
    590  1.1.1.1.4.2  yamt 
    591  1.1.1.1.4.2  yamt 
    593  1.1.1.1.4.2  yamt ;;- Bit set instructions.
    594  1.1.1.1.4.2  yamt 
    595  1.1.1.1.4.2  yamt (define_insn "ior<mode>3"
    596  1.1.1.1.4.2  yamt   [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g,g")
    597  1.1.1.1.4.2  yamt 	(ior:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT,nrmT")
    598  1.1.1.1.4.2  yamt 		   (match_operand:VAXint 2 "general_operand" "nrmT,0,nrmT")))]
    599  1.1.1.1.4.2  yamt   ""
    600  1.1.1.1.4.2  yamt   "@
    601  1.1.1.1.4.2  yamt    bis<VAXint:isfx>2 %2,%0
    602  1.1.1.1.4.2  yamt    bis<VAXint:isfx>2 %1,%0
    603  1.1.1.1.4.2  yamt    bis<VAXint:isfx>3 %2,%1,%0")
    604  1.1.1.1.4.2  yamt 
    605  1.1.1.1.4.2  yamt ;;- xor instructions.
    606  1.1.1.1.4.2  yamt 
    607  1.1.1.1.4.2  yamt (define_insn "xor<mode>3"
    608  1.1.1.1.4.2  yamt   [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g,g,g")
    609  1.1.1.1.4.2  yamt 	(xor:VAXint (match_operand:VAXint 1 "general_operand" "0,nrmT,nrmT")
    610  1.1.1.1.4.2  yamt 		   (match_operand:VAXint 2 "general_operand" "nrmT,0,nrmT")))]
    611  1.1.1.1.4.2  yamt   ""
    612  1.1.1.1.4.2  yamt   "@
    613  1.1.1.1.4.2  yamt    xor<VAXint:isfx>2 %2,%0
    614  1.1.1.1.4.2  yamt    xor<VAXint:isfx>2 %1,%0
    615  1.1.1.1.4.2  yamt    xor<VAXint:isfx>3 %2,%1,%0")
    616  1.1.1.1.4.2  yamt 
    617  1.1.1.1.4.2  yamt 
    619  1.1.1.1.4.2  yamt (define_insn "neg<mode>2"
    620  1.1.1.1.4.2  yamt   [(set (match_operand:VAXfp 0 "nonimmediate_operand" "=g")
    621  1.1.1.1.4.2  yamt 	(neg:VAXfp (match_operand:VAXfp 1 "general_operand" "gF")))]
    622  1.1.1.1.4.2  yamt   ""
    623  1.1.1.1.4.2  yamt   "mneg<VAXfp:fsfx> %1,%0")
    624  1.1.1.1.4.2  yamt 
    625  1.1.1.1.4.2  yamt (define_insn "neg<mode>2"
    626  1.1.1.1.4.2  yamt   [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g")
    627  1.1.1.1.4.2  yamt 	(neg:VAXint (match_operand:VAXint 1 "general_operand" "nrmT")))]
    628  1.1.1.1.4.2  yamt   ""
    629  1.1.1.1.4.2  yamt   "mneg<VAXint:isfx> %1,%0")
    630  1.1.1.1.4.2  yamt 
    631  1.1.1.1.4.2  yamt (define_insn "one_cmpl<mode>2"
    632  1.1.1.1.4.2  yamt   [(set (match_operand:VAXint 0 "nonimmediate_operand" "=g")
    633  1.1.1.1.4.2  yamt 	(not:VAXint (match_operand:VAXint 1 "general_operand" "nrmT")))]
    634  1.1.1.1.4.2  yamt   ""
    635  1.1.1.1.4.2  yamt   "mcom<VAXint:isfx> %1,%0")
    636  1.1.1.1.4.2  yamt 
    637  1.1.1.1.4.2  yamt 
    639  1.1.1.1.4.2  yamt ;; Arithmetic right shift on the VAX works by negating the shift count,
    640  1.1.1.1.4.2  yamt ;; then emitting a right shift with the shift count negated.  This means
    641  1.1.1.1.4.2  yamt ;; that all actual shift counts in the RTL will be positive.  This
    642  1.1.1.1.4.2  yamt ;; prevents converting shifts to ZERO_EXTRACTs with negative positions,
    643  1.1.1.1.4.2  yamt ;; which isn't valid.
    644  1.1.1.1.4.2  yamt (define_expand "ashrsi3"
    645  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "general_operand" "=g")
    646  1.1.1.1.4.2  yamt 	(ashiftrt:SI (match_operand:SI 1 "general_operand" "g")
    647  1.1.1.1.4.2  yamt 		   (match_operand:QI 2 "general_operand" "g")))]
    648  1.1.1.1.4.2  yamt   ""
    649  1.1.1.1.4.2  yamt   "
    650  1.1.1.1.4.2  yamt {
    651  1.1.1.1.4.2  yamt   if (! CONST_INT_P (operands[2]))
    652  1.1.1.1.4.2  yamt     operands[2] = gen_rtx_NEG (QImode, negate_rtx (QImode, operands[2]));
    653  1.1.1.1.4.2  yamt }")
    654  1.1.1.1.4.2  yamt 
    655  1.1.1.1.4.2  yamt (define_insn ""
    656  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    657  1.1.1.1.4.2  yamt 	(ashiftrt:SI (match_operand:SI 1 "general_operand" "nrmT")
    658  1.1.1.1.4.2  yamt 		     (match_operand:QI 2 "const_int_operand" "n")))]
    659  1.1.1.1.4.2  yamt   ""
    660  1.1.1.1.4.2  yamt   "ashl $%n2,%1,%0")
    661  1.1.1.1.4.2  yamt 
    662  1.1.1.1.4.2  yamt (define_insn ""
    663  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    664  1.1.1.1.4.2  yamt 	(ashiftrt:SI (match_operand:SI 1 "general_operand" "nrmT")
    665  1.1.1.1.4.2  yamt 		     (neg:QI (match_operand:QI 2 "general_operand" "g"))))]
    666  1.1.1.1.4.2  yamt   ""
    667  1.1.1.1.4.2  yamt   "ashl %2,%1,%0")
    668  1.1.1.1.4.2  yamt 
    669  1.1.1.1.4.2  yamt (define_insn "ashlsi3"
    670  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    671  1.1.1.1.4.2  yamt 	(ashift:SI (match_operand:SI 1 "general_operand" "nrmT")
    672  1.1.1.1.4.2  yamt 		   (match_operand:QI 2 "general_operand" "g")))]
    673  1.1.1.1.4.2  yamt   ""
    674  1.1.1.1.4.2  yamt   "*
    675  1.1.1.1.4.2  yamt {
    676  1.1.1.1.4.2  yamt   if (operands[2] == const1_rtx && rtx_equal_p (operands[0], operands[1]))
    677  1.1.1.1.4.2  yamt     return \"addl2 %0,%0\";
    678  1.1.1.1.4.2  yamt   if (REG_P (operands[1]) && CONST_INT_P (operands[2]))
    679  1.1.1.1.4.2  yamt     {
    680  1.1.1.1.4.2  yamt       int i = INTVAL (operands[2]);
    681  1.1.1.1.4.2  yamt       if (i == 1)
    682  1.1.1.1.4.2  yamt 	return \"addl3 %1,%1,%0\";
    683  1.1.1.1.4.2  yamt       if (i == 2 && !optimize_size)
    684  1.1.1.1.4.2  yamt 	{
    685  1.1.1.1.4.2  yamt 	  if (push_operand (operands[0], SImode))
    686  1.1.1.1.4.2  yamt 	    return \"pushal 0[%1]\";
    687  1.1.1.1.4.2  yamt 	  return \"moval 0[%1],%0\";
    688  1.1.1.1.4.2  yamt 	}
    689  1.1.1.1.4.2  yamt       if (i == 3 && !optimize_size)
    690  1.1.1.1.4.2  yamt 	{
    691  1.1.1.1.4.2  yamt 	  if (push_operand (operands[0], SImode))
    692  1.1.1.1.4.2  yamt 	    return \"pushaq 0[%1]\";
    693  1.1.1.1.4.2  yamt 	  return \"movaq 0[%1],%0\";
    694  1.1.1.1.4.2  yamt 	}
    695  1.1.1.1.4.2  yamt     }
    696  1.1.1.1.4.2  yamt   return \"ashl %2,%1,%0\";
    697  1.1.1.1.4.2  yamt }")
    698  1.1.1.1.4.2  yamt 
    699  1.1.1.1.4.2  yamt ;; Arithmetic right shift on the VAX works by negating the shift count.
    700  1.1.1.1.4.2  yamt (define_expand "ashrdi3"
    701  1.1.1.1.4.2  yamt   [(set (match_operand:DI 0 "general_operand" "=g")
    702  1.1.1.1.4.2  yamt 	(ashiftrt:DI (match_operand:DI 1 "general_operand" "g")
    703  1.1.1.1.4.2  yamt 		     (match_operand:QI 2 "general_operand" "g")))]
    704  1.1.1.1.4.2  yamt   ""
    705  1.1.1.1.4.2  yamt   "
    706  1.1.1.1.4.2  yamt {
    707  1.1.1.1.4.2  yamt   operands[2] = gen_rtx_NEG (QImode, negate_rtx (QImode, operands[2]));
    708  1.1.1.1.4.2  yamt }")
    709  1.1.1.1.4.2  yamt 
    710  1.1.1.1.4.2  yamt (define_insn "ashldi3"
    711  1.1.1.1.4.2  yamt   [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
    712  1.1.1.1.4.2  yamt 	(ashift:DI (match_operand:DI 1 "general_operand" "g")
    713  1.1.1.1.4.2  yamt 		   (match_operand:QI 2 "general_operand" "g")))]
    714  1.1.1.1.4.2  yamt   ""
    715  1.1.1.1.4.2  yamt   "ashq %2,%D1,%0")
    716  1.1.1.1.4.2  yamt 
    717  1.1.1.1.4.2  yamt (define_insn ""
    718  1.1.1.1.4.2  yamt   [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
    719  1.1.1.1.4.2  yamt 	(ashiftrt:DI (match_operand:DI 1 "general_operand" "g")
    720  1.1.1.1.4.2  yamt 		     (neg:QI (match_operand:QI 2 "general_operand" "g"))))]
    721  1.1.1.1.4.2  yamt   ""
    722  1.1.1.1.4.2  yamt   "ashq %2,%D1,%0")
    723  1.1.1.1.4.2  yamt 
    724  1.1.1.1.4.2  yamt ;; We used to have expand_shift handle logical right shifts by using extzv,
    725  1.1.1.1.4.2  yamt ;; but this make it very difficult to do lshrdi3.  Since the VAX is the
    726  1.1.1.1.4.2  yamt ;; only machine with this kludge, it's better to just do this with a
    727  1.1.1.1.4.2  yamt ;; define_expand and remove that case from expand_shift.
    728  1.1.1.1.4.2  yamt 
    729  1.1.1.1.4.2  yamt (define_expand "lshrsi3"
    730  1.1.1.1.4.2  yamt   [(set (match_dup 3)
    731  1.1.1.1.4.2  yamt 	(minus:QI (const_int 32)
    732  1.1.1.1.4.2  yamt 		  (match_dup 4)))
    733  1.1.1.1.4.2  yamt    (set (match_operand:SI 0 "nonimmediate_operand" "=g")
    734  1.1.1.1.4.2  yamt 	(zero_extract:SI (match_operand:SI 1 "register_operand" "r")
    735  1.1.1.1.4.2  yamt 			 (match_dup 3)
    736  1.1.1.1.4.2  yamt 			 (match_operand:SI 2 "register_operand" "g")))]
    737  1.1.1.1.4.2  yamt   ""
    738  1.1.1.1.4.2  yamt   "
    739  1.1.1.1.4.2  yamt {
    740  1.1.1.1.4.2  yamt   operands[3] = gen_reg_rtx (QImode);
    741  1.1.1.1.4.2  yamt   operands[4] = gen_lowpart (QImode, operands[2]);
    742  1.1.1.1.4.2  yamt }")
    743  1.1.1.1.4.2  yamt 
    744  1.1.1.1.4.2  yamt ;; Rotate right on the VAX works by negating the shift count.
    745  1.1.1.1.4.2  yamt (define_expand "rotrsi3"
    746  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "general_operand" "=g")
    747  1.1.1.1.4.2  yamt 	(rotatert:SI (match_operand:SI 1 "general_operand" "g")
    748  1.1.1.1.4.2  yamt 		     (match_operand:QI 2 "general_operand" "g")))]
    749  1.1.1.1.4.2  yamt   ""
    750  1.1.1.1.4.2  yamt   "
    751  1.1.1.1.4.2  yamt {
    752  1.1.1.1.4.2  yamt   if (! CONST_INT_P (operands[2]))
    753  1.1.1.1.4.2  yamt     operands[2] = gen_rtx_NEG (QImode, negate_rtx (QImode, operands[2]));
    754  1.1.1.1.4.2  yamt }")
    755  1.1.1.1.4.2  yamt 
    756  1.1.1.1.4.2  yamt (define_insn "rotlsi3"
    757  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    758  1.1.1.1.4.2  yamt 	(rotate:SI (match_operand:SI 1 "general_operand" "nrmT")
    759  1.1.1.1.4.2  yamt 		   (match_operand:QI 2 "general_operand" "g")))]
    760  1.1.1.1.4.2  yamt   ""
    761  1.1.1.1.4.2  yamt   "rotl %2,%1,%0")
    762  1.1.1.1.4.2  yamt 
    763  1.1.1.1.4.2  yamt (define_insn ""
    764  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    765  1.1.1.1.4.2  yamt 	(rotatert:SI (match_operand:SI 1 "general_operand" "nrmT")
    766  1.1.1.1.4.2  yamt 		     (match_operand:QI 2 "const_int_operand" "n")))]
    767  1.1.1.1.4.2  yamt   ""
    768  1.1.1.1.4.2  yamt   "rotl %R2,%1,%0")
    769  1.1.1.1.4.2  yamt 
    770  1.1.1.1.4.2  yamt (define_insn ""
    771  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    772  1.1.1.1.4.2  yamt 	(rotatert:SI (match_operand:SI 1 "general_operand" "nrmT")
    773  1.1.1.1.4.2  yamt 		     (neg:QI (match_operand:QI 2 "general_operand" "g"))))]
    774  1.1.1.1.4.2  yamt   ""
    775  1.1.1.1.4.2  yamt   "rotl %2,%1,%0")
    776  1.1.1.1.4.2  yamt 
    777  1.1.1.1.4.2  yamt ;This insn is probably slower than a multiply and an add.
    778  1.1.1.1.4.2  yamt ;(define_insn ""
    779  1.1.1.1.4.2  yamt ;  [(set (match_operand:SI 0 "general_operand" "=g")
    780  1.1.1.1.4.2  yamt ;	(mult:SI (plus:SI (match_operand:SI 1 "general_operand" "g")
    781  1.1.1.1.4.2  yamt ;			  (match_operand:SI 2 "general_operand" "g"))
    782  1.1.1.1.4.2  yamt ;		 (match_operand:SI 3 "general_operand" "g")))]
    783  1.1.1.1.4.2  yamt ;  ""
    784  1.1.1.1.4.2  yamt ;  "index %1,$0x80000000,$0x7fffffff,%3,%2,%0")
    785  1.1.1.1.4.2  yamt 
    787  1.1.1.1.4.2  yamt ;; Special cases of bit-field insns which we should
    788  1.1.1.1.4.2  yamt ;; recognize in preference to the general case.
    789  1.1.1.1.4.2  yamt ;; These handle aligned 8-bit and 16-bit fields,
    790  1.1.1.1.4.2  yamt ;; which can usually be done with move instructions.
    791  1.1.1.1.4.2  yamt 
    792  1.1.1.1.4.2  yamt (define_insn ""
    793  1.1.1.1.4.2  yamt   [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+ro")
    794  1.1.1.1.4.2  yamt 			 (match_operand:QI 1 "const_int_operand" "n")
    795  1.1.1.1.4.2  yamt 			 (match_operand:SI 2 "const_int_operand" "n"))
    796  1.1.1.1.4.2  yamt 	(match_operand:SI 3 "general_operand" "g"))]
    797  1.1.1.1.4.2  yamt    "(INTVAL (operands[1]) == 8 || INTVAL (operands[1]) == 16)
    798  1.1.1.1.4.2  yamt    && INTVAL (operands[2]) % INTVAL (operands[1]) == 0
    799  1.1.1.1.4.2  yamt    && (REG_P (operands[0])
    800  1.1.1.1.4.2  yamt        || ! mode_dependent_address_p (XEXP (operands[0], 0)))"
    801  1.1.1.1.4.2  yamt   "*
    802  1.1.1.1.4.2  yamt {
    803  1.1.1.1.4.2  yamt   if (REG_P (operands[0]))
    804  1.1.1.1.4.2  yamt     {
    805  1.1.1.1.4.2  yamt       if (INTVAL (operands[2]) != 0)
    806  1.1.1.1.4.2  yamt 	return \"insv %3,%2,%1,%0\";
    807  1.1.1.1.4.2  yamt     }
    808  1.1.1.1.4.2  yamt   else
    809  1.1.1.1.4.2  yamt     operands[0]
    810  1.1.1.1.4.2  yamt       = adjust_address (operands[0],
    811  1.1.1.1.4.2  yamt 			INTVAL (operands[1]) == 8 ? QImode : HImode,
    812  1.1.1.1.4.2  yamt 			INTVAL (operands[2]) / 8);
    813  1.1.1.1.4.2  yamt 
    814  1.1.1.1.4.2  yamt   CC_STATUS_INIT;
    815  1.1.1.1.4.2  yamt   if (INTVAL (operands[1]) == 8)
    816  1.1.1.1.4.2  yamt     return \"movb %3,%0\";
    817  1.1.1.1.4.2  yamt   return \"movw %3,%0\";
    818  1.1.1.1.4.2  yamt }")
    819  1.1.1.1.4.2  yamt 
    820  1.1.1.1.4.2  yamt (define_insn ""
    821  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=&g")
    822  1.1.1.1.4.2  yamt 	(zero_extract:SI (match_operand:SI 1 "register_operand" "ro")
    823  1.1.1.1.4.2  yamt 			 (match_operand:QI 2 "const_int_operand" "n")
    824  1.1.1.1.4.2  yamt 			 (match_operand:SI 3 "const_int_operand" "n")))]
    825  1.1.1.1.4.2  yamt   "(INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
    826  1.1.1.1.4.2  yamt    && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
    827  1.1.1.1.4.2  yamt    && (REG_P (operands[1])
    828  1.1.1.1.4.2  yamt        || ! mode_dependent_address_p (XEXP (operands[1], 0)))"
    829  1.1.1.1.4.2  yamt   "*
    830  1.1.1.1.4.2  yamt {
    831  1.1.1.1.4.2  yamt   if (REG_P (operands[1]))
    832  1.1.1.1.4.2  yamt     {
    833  1.1.1.1.4.2  yamt       if (INTVAL (operands[3]) != 0)
    834  1.1.1.1.4.2  yamt 	return \"extzv %3,%2,%1,%0\";
    835  1.1.1.1.4.2  yamt     }
    836  1.1.1.1.4.2  yamt   else
    837  1.1.1.1.4.2  yamt     operands[1]
    838  1.1.1.1.4.2  yamt       = adjust_address (operands[1],
    839  1.1.1.1.4.2  yamt 			INTVAL (operands[2]) == 8 ? QImode : HImode,
    840  1.1.1.1.4.2  yamt 			INTVAL (operands[3]) / 8);
    841  1.1.1.1.4.2  yamt 
    842  1.1.1.1.4.2  yamt   if (INTVAL (operands[2]) == 8)
    843  1.1.1.1.4.2  yamt     return \"movzbl %1,%0\";
    844  1.1.1.1.4.2  yamt   return \"movzwl %1,%0\";
    845  1.1.1.1.4.2  yamt }")
    846  1.1.1.1.4.2  yamt 
    847  1.1.1.1.4.2  yamt (define_insn ""
    848  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    849  1.1.1.1.4.2  yamt 	(sign_extract:SI (match_operand:SI 1 "register_operand" "ro")
    850  1.1.1.1.4.2  yamt 			 (match_operand:QI 2 "const_int_operand" "n")
    851  1.1.1.1.4.2  yamt 			 (match_operand:SI 3 "const_int_operand" "n")))]
    852  1.1.1.1.4.2  yamt   "(INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
    853  1.1.1.1.4.2  yamt    && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
    854  1.1.1.1.4.2  yamt    && (REG_P (operands[1])
    855  1.1.1.1.4.2  yamt        || ! mode_dependent_address_p (XEXP (operands[1], 0)))"
    856  1.1.1.1.4.2  yamt   "*
    857  1.1.1.1.4.2  yamt {
    858  1.1.1.1.4.2  yamt   if (REG_P (operands[1]))
    859  1.1.1.1.4.2  yamt     {
    860  1.1.1.1.4.2  yamt       if (INTVAL (operands[3]) != 0)
    861  1.1.1.1.4.2  yamt 	return \"extv %3,%2,%1,%0\";
    862  1.1.1.1.4.2  yamt     }
    863  1.1.1.1.4.2  yamt   else
    864  1.1.1.1.4.2  yamt     operands[1]
    865  1.1.1.1.4.2  yamt       = adjust_address (operands[1],
    866  1.1.1.1.4.2  yamt 			INTVAL (operands[2]) == 8 ? QImode : HImode,
    867  1.1.1.1.4.2  yamt 			INTVAL (operands[3]) / 8);
    868  1.1.1.1.4.2  yamt 
    869  1.1.1.1.4.2  yamt   if (INTVAL (operands[2]) == 8)
    870  1.1.1.1.4.2  yamt     return \"cvtbl %1,%0\";
    871  1.1.1.1.4.2  yamt   return \"cvtwl %1,%0\";
    872  1.1.1.1.4.2  yamt }")
    873  1.1.1.1.4.2  yamt 
    875  1.1.1.1.4.2  yamt ;; Register-only SImode cases of bit-field insns.
    876  1.1.1.1.4.2  yamt 
    877  1.1.1.1.4.2  yamt (define_insn ""
    878  1.1.1.1.4.2  yamt   [(set (cc0)
    879  1.1.1.1.4.2  yamt 	(compare
    880  1.1.1.1.4.2  yamt 	 (sign_extract:SI (match_operand:SI 0 "register_operand" "r")
    881  1.1.1.1.4.2  yamt 			  (match_operand:QI 1 "general_operand" "g")
    882  1.1.1.1.4.2  yamt 			  (match_operand:SI 2 "general_operand" "nrmT"))
    883  1.1.1.1.4.2  yamt 	 (match_operand:SI 3 "general_operand" "nrmT")))]
    884  1.1.1.1.4.2  yamt   ""
    885  1.1.1.1.4.2  yamt   "cmpv %2,%1,%0,%3")
    886  1.1.1.1.4.2  yamt 
    887  1.1.1.1.4.2  yamt (define_insn ""
    888  1.1.1.1.4.2  yamt   [(set (cc0)
    889  1.1.1.1.4.2  yamt 	(compare
    890  1.1.1.1.4.2  yamt 	 (zero_extract:SI (match_operand:SI 0 "register_operand" "r")
    891  1.1.1.1.4.2  yamt 			  (match_operand:QI 1 "general_operand" "g")
    892  1.1.1.1.4.2  yamt 			  (match_operand:SI 2 "general_operand" "nrmT"))
    893  1.1.1.1.4.2  yamt 	 (match_operand:SI 3 "general_operand" "nrmT")))]
    894  1.1.1.1.4.2  yamt   ""
    895  1.1.1.1.4.2  yamt   "cmpzv %2,%1,%0,%3")
    896  1.1.1.1.4.2  yamt 
    897  1.1.1.1.4.2  yamt ;; When the field position and size are constant and the destination
    898  1.1.1.1.4.2  yamt ;; is a register, extv and extzv are much slower than a rotate followed
    899  1.1.1.1.4.2  yamt ;; by a bicl or sign extension.  Because we might end up choosing ext[z]v
    900  1.1.1.1.4.2  yamt ;; anyway, we can't allow immediate values for the primary source operand.
    901  1.1.1.1.4.2  yamt 
    902  1.1.1.1.4.2  yamt (define_insn ""
    903  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    904  1.1.1.1.4.2  yamt 	(sign_extract:SI (match_operand:SI 1 "register_operand" "ro")
    905  1.1.1.1.4.2  yamt 			 (match_operand:QI 2 "general_operand" "g")
    906  1.1.1.1.4.2  yamt 			 (match_operand:SI 3 "general_operand" "nrmT")))]
    907  1.1.1.1.4.2  yamt   ""
    908  1.1.1.1.4.2  yamt   "*
    909  1.1.1.1.4.2  yamt {
    910  1.1.1.1.4.2  yamt   if (! CONST_INT_P (operands[3]) || ! CONST_INT_P (operands[2])
    911  1.1.1.1.4.2  yamt       || ! REG_P (operands[0])
    912  1.1.1.1.4.2  yamt       || (INTVAL (operands[2]) != 8 && INTVAL (operands[2]) != 16))
    913  1.1.1.1.4.2  yamt     return \"extv %3,%2,%1,%0\";
    914  1.1.1.1.4.2  yamt   if (INTVAL (operands[2]) == 8)
    915  1.1.1.1.4.2  yamt     return \"rotl %R3,%1,%0\;cvtbl %0,%0\";
    916  1.1.1.1.4.2  yamt   return \"rotl %R3,%1,%0\;cvtwl %0,%0\";
    917  1.1.1.1.4.2  yamt }")
    918  1.1.1.1.4.2  yamt 
    919  1.1.1.1.4.2  yamt (define_insn ""
    920  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    921  1.1.1.1.4.2  yamt 	(zero_extract:SI (match_operand:SI 1 "register_operand" "ro")
    922  1.1.1.1.4.2  yamt 			 (match_operand:QI 2 "general_operand" "g")
    923  1.1.1.1.4.2  yamt 			 (match_operand:SI 3 "general_operand" "nrmT")))]
    924  1.1.1.1.4.2  yamt   ""
    925  1.1.1.1.4.2  yamt   "*
    926  1.1.1.1.4.2  yamt {
    927  1.1.1.1.4.2  yamt   if (! CONST_INT_P (operands[3]) || ! CONST_INT_P (operands[2])
    928  1.1.1.1.4.2  yamt       || ! REG_P (operands[0]))
    929  1.1.1.1.4.2  yamt     return \"extzv %3,%2,%1,%0\";
    930  1.1.1.1.4.2  yamt   if (INTVAL (operands[2]) == 8)
    931  1.1.1.1.4.2  yamt     return \"rotl %R3,%1,%0\;movzbl %0,%0\";
    932  1.1.1.1.4.2  yamt   if (INTVAL (operands[2]) == 16)
    933  1.1.1.1.4.2  yamt     return \"rotl %R3,%1,%0\;movzwl %0,%0\";
    934  1.1.1.1.4.2  yamt   if (INTVAL (operands[3]) & 31)
    935  1.1.1.1.4.2  yamt     return \"rotl %R3,%1,%0\;bicl2 %M2,%0\";
    936  1.1.1.1.4.2  yamt   if (rtx_equal_p (operands[0], operands[1]))
    937  1.1.1.1.4.2  yamt     return \"bicl2 %M2,%0\";
    938  1.1.1.1.4.2  yamt   return \"bicl3 %M2,%1,%0\";
    939  1.1.1.1.4.2  yamt }")
    940  1.1.1.1.4.2  yamt 
    941  1.1.1.1.4.2  yamt ;; Non-register cases.
    942  1.1.1.1.4.2  yamt ;; nonimmediate_operand is used to make sure that mode-ambiguous cases
    943  1.1.1.1.4.2  yamt ;; don't match these (and therefore match the cases above instead).
    944  1.1.1.1.4.2  yamt 
    945  1.1.1.1.4.2  yamt (define_insn ""
    946  1.1.1.1.4.2  yamt   [(set (cc0)
    947  1.1.1.1.4.2  yamt 	(compare
    948  1.1.1.1.4.2  yamt 	 (sign_extract:SI (match_operand:QI 0 "memory_operand" "m")
    949  1.1.1.1.4.2  yamt 			  (match_operand:QI 1 "general_operand" "g")
    950  1.1.1.1.4.2  yamt 			  (match_operand:SI 2 "general_operand" "nrmT"))
    951  1.1.1.1.4.2  yamt 	 (match_operand:SI 3 "general_operand" "nrmT")))]
    952  1.1.1.1.4.2  yamt   ""
    953  1.1.1.1.4.2  yamt   "cmpv %2,%1,%0,%3")
    954  1.1.1.1.4.2  yamt 
    955  1.1.1.1.4.2  yamt (define_insn ""
    956  1.1.1.1.4.2  yamt   [(set (cc0)
    957  1.1.1.1.4.2  yamt 	(compare
    958  1.1.1.1.4.2  yamt 	 (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "rm")
    959  1.1.1.1.4.2  yamt 			  (match_operand:QI 1 "general_operand" "g")
    960  1.1.1.1.4.2  yamt 			  (match_operand:SI 2 "general_operand" "nrmT"))
    961  1.1.1.1.4.2  yamt 	 (match_operand:SI 3 "general_operand" "nrmT")))]
    962  1.1.1.1.4.2  yamt   ""
    963  1.1.1.1.4.2  yamt   "cmpzv %2,%1,%0,%3")
    964  1.1.1.1.4.2  yamt 
    965  1.1.1.1.4.2  yamt (define_insn "extv"
    966  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    967  1.1.1.1.4.2  yamt 	(sign_extract:SI (match_operand:QI 1 "memory_operand" "m")
    968  1.1.1.1.4.2  yamt 			 (match_operand:QI 2 "general_operand" "g")
    969  1.1.1.1.4.2  yamt 			 (match_operand:SI 3 "general_operand" "nrmT")))]
    970  1.1.1.1.4.2  yamt   ""
    971  1.1.1.1.4.2  yamt   "*
    972  1.1.1.1.4.2  yamt {
    973  1.1.1.1.4.2  yamt   if (! REG_P (operands[0]) || ! CONST_INT_P (operands[2])
    974  1.1.1.1.4.2  yamt       || ! CONST_INT_P (operands[3])
    975  1.1.1.1.4.2  yamt       || (INTVAL (operands[2]) != 8 && INTVAL (operands[2]) != 16)
    976  1.1.1.1.4.2  yamt       || INTVAL (operands[2]) + INTVAL (operands[3]) > 32
    977  1.1.1.1.4.2  yamt       || side_effects_p (operands[1])
    978  1.1.1.1.4.2  yamt       || (MEM_P (operands[1])
    979  1.1.1.1.4.2  yamt 	  && mode_dependent_address_p (XEXP (operands[1], 0))))
    980  1.1.1.1.4.2  yamt     return \"extv %3,%2,%1,%0\";
    981  1.1.1.1.4.2  yamt   if (INTVAL (operands[2]) == 8)
    982  1.1.1.1.4.2  yamt     return \"rotl %R3,%1,%0\;cvtbl %0,%0\";
    983  1.1.1.1.4.2  yamt   return \"rotl %R3,%1,%0\;cvtwl %0,%0\";
    984  1.1.1.1.4.2  yamt }")
    985  1.1.1.1.4.2  yamt 
    986  1.1.1.1.4.2  yamt (define_expand "extzv"
    987  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "general_operand" "")
    988  1.1.1.1.4.2  yamt 	(zero_extract:SI (match_operand:SI 1 "general_operand" "")
    989  1.1.1.1.4.2  yamt 			 (match_operand:QI 2 "general_operand" "")
    990  1.1.1.1.4.2  yamt 			 (match_operand:SI 3 "general_operand" "")))]
    991  1.1.1.1.4.2  yamt   ""
    992  1.1.1.1.4.2  yamt   "")
    993  1.1.1.1.4.2  yamt 
    994  1.1.1.1.4.2  yamt (define_insn ""
    995  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
    996  1.1.1.1.4.2  yamt 	(zero_extract:SI (match_operand:QI 1 "memory_operand" "m")
    997  1.1.1.1.4.2  yamt 			 (match_operand:QI 2 "general_operand" "g")
    998  1.1.1.1.4.2  yamt 			 (match_operand:SI 3 "general_operand" "nrmT")))]
    999  1.1.1.1.4.2  yamt   ""
   1000  1.1.1.1.4.2  yamt   "*
   1001  1.1.1.1.4.2  yamt {
   1002  1.1.1.1.4.2  yamt   if (! REG_P (operands[0]) || ! CONST_INT_P (operands[2])
   1003  1.1.1.1.4.2  yamt       || ! CONST_INT_P (operands[3])
   1004  1.1.1.1.4.2  yamt       || INTVAL (operands[2]) + INTVAL (operands[3]) > 32
   1005  1.1.1.1.4.2  yamt       || side_effects_p (operands[1])
   1006  1.1.1.1.4.2  yamt       || (MEM_P (operands[1])
   1007  1.1.1.1.4.2  yamt 	  && mode_dependent_address_p (XEXP (operands[1], 0))))
   1008  1.1.1.1.4.2  yamt     return \"extzv %3,%2,%1,%0\";
   1009  1.1.1.1.4.2  yamt   if (INTVAL (operands[2]) == 8)
   1010  1.1.1.1.4.2  yamt     return \"rotl %R3,%1,%0\;movzbl %0,%0\";
   1011  1.1.1.1.4.2  yamt   if (INTVAL (operands[2]) == 16)
   1012  1.1.1.1.4.2  yamt     return \"rotl %R3,%1,%0\;movzwl %0,%0\";
   1013  1.1.1.1.4.2  yamt   if (MEM_P (operands[1])
   1014  1.1.1.1.4.2  yamt       && GET_CODE (XEXP (operands[1], 0)) == PLUS
   1015  1.1.1.1.4.2  yamt       && REG_P (XEXP (XEXP (operands[1], 0), 0))
   1016  1.1.1.1.4.2  yamt       && CONST_INT_P (XEXP (XEXP (operands[1], 0), 1))
   1017  1.1.1.1.4.2  yamt       && CONST_INT_P (operands[2])
   1018  1.1.1.1.4.2  yamt       && CONST_INT_P (operands[3]))
   1019  1.1.1.1.4.2  yamt     {
   1020  1.1.1.1.4.2  yamt       HOST_WIDE_INT o = INTVAL (XEXP (XEXP (operands[1], 0), 1));
   1021  1.1.1.1.4.2  yamt       HOST_WIDE_INT l = INTVAL (operands[2]);
   1022  1.1.1.1.4.2  yamt       HOST_WIDE_INT v = INTVAL (operands[3]);
   1023  1.1.1.1.4.2  yamt       if ((o & 3) && (o & 3) * 8 + v + l <= 32)
   1024  1.1.1.1.4.2  yamt 	{
   1025  1.1.1.1.4.2  yamt 	  rtx tmp;
   1026  1.1.1.1.4.2  yamt 	  tmp = XEXP (XEXP (operands[1], 0), 0);
   1027  1.1.1.1.4.2  yamt 	  if (o & ~3)
   1028  1.1.1.1.4.2  yamt 	    tmp = gen_rtx_PLUS (SImode, tmp, GEN_INT (o & ~3));
   1029  1.1.1.1.4.2  yamt 	  operands[1] = gen_rtx_MEM (QImode, tmp);
   1030  1.1.1.1.4.2  yamt 	  operands[3] = GEN_INT (v + (o & 3) * 8);
   1031  1.1.1.1.4.2  yamt 	}
   1032  1.1.1.1.4.2  yamt       if (optimize_size)
   1033  1.1.1.1.4.2  yamt 	return \"extzv %3,%2,%1,%0\";
   1034  1.1.1.1.4.2  yamt     }
   1035  1.1.1.1.4.2  yamt   return \"rotl %R3,%1,%0\;bicl2 %M2,%0\";
   1036  1.1.1.1.4.2  yamt }")
   1037  1.1.1.1.4.2  yamt 
   1038  1.1.1.1.4.2  yamt (define_expand "insv"
   1039  1.1.1.1.4.2  yamt   [(set (zero_extract:SI (match_operand:SI 0 "general_operand" "")
   1040  1.1.1.1.4.2  yamt 			 (match_operand:QI 1 "general_operand" "")
   1041  1.1.1.1.4.2  yamt 			 (match_operand:SI 2 "general_operand" ""))
   1042  1.1.1.1.4.2  yamt 	(match_operand:SI 3 "general_operand" ""))]
   1043  1.1.1.1.4.2  yamt   ""
   1044  1.1.1.1.4.2  yamt   "")
   1045  1.1.1.1.4.2  yamt 
   1046  1.1.1.1.4.2  yamt (define_insn ""
   1047  1.1.1.1.4.2  yamt   [(set (zero_extract:SI (match_operand:QI 0 "memory_operand" "+g")
   1048  1.1.1.1.4.2  yamt 			 (match_operand:QI 1 "general_operand" "g")
   1049  1.1.1.1.4.2  yamt 			 (match_operand:SI 2 "general_operand" "nrmT"))
   1050  1.1.1.1.4.2  yamt 	(match_operand:SI 3 "general_operand" "nrmT"))]
   1051  1.1.1.1.4.2  yamt   ""
   1052  1.1.1.1.4.2  yamt   "*
   1053  1.1.1.1.4.2  yamt {
   1054  1.1.1.1.4.2  yamt   if (MEM_P (operands[0])
   1055  1.1.1.1.4.2  yamt       && GET_CODE (XEXP (operands[0], 0)) == PLUS
   1056  1.1.1.1.4.2  yamt       && REG_P (XEXP (XEXP (operands[0], 0), 0))
   1057  1.1.1.1.4.2  yamt       && CONST_INT_P (XEXP (XEXP (operands[0], 0), 1))
   1058  1.1.1.1.4.2  yamt       && CONST_INT_P (operands[1])
   1059  1.1.1.1.4.2  yamt       && CONST_INT_P (operands[2]))
   1060  1.1.1.1.4.2  yamt     {
   1061  1.1.1.1.4.2  yamt       HOST_WIDE_INT o = INTVAL (XEXP (XEXP (operands[0], 0), 1));
   1062  1.1.1.1.4.2  yamt       HOST_WIDE_INT v = INTVAL (operands[2]);
   1063  1.1.1.1.4.2  yamt       HOST_WIDE_INT l = INTVAL (operands[1]);
   1064  1.1.1.1.4.2  yamt       if ((o & 3) && (o & 3) * 8 + v + l <= 32)
   1065  1.1.1.1.4.2  yamt 	{
   1066  1.1.1.1.4.2  yamt 	  rtx tmp;
   1067  1.1.1.1.4.2  yamt 	  tmp = XEXP (XEXP (operands[0], 0), 0);
   1068  1.1.1.1.4.2  yamt 	  if (o & ~3)
   1069  1.1.1.1.4.2  yamt 	    tmp = gen_rtx_PLUS (SImode, tmp, GEN_INT (o & ~3));
   1070  1.1.1.1.4.2  yamt 	  operands[0] = gen_rtx_MEM (QImode, tmp);
   1071  1.1.1.1.4.2  yamt 	  operands[2] = GEN_INT (v + (o & 3) * 8);
   1072  1.1.1.1.4.2  yamt 	}
   1073  1.1.1.1.4.2  yamt     }
   1074  1.1.1.1.4.2  yamt   return \"insv %3,%2,%1,%0\";
   1075  1.1.1.1.4.2  yamt }")
   1076  1.1.1.1.4.2  yamt 
   1077  1.1.1.1.4.2  yamt (define_insn ""
   1078  1.1.1.1.4.2  yamt   [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r")
   1079  1.1.1.1.4.2  yamt 			 (match_operand:QI 1 "general_operand" "g")
   1080  1.1.1.1.4.2  yamt 			 (match_operand:SI 2 "general_operand" "nrmT"))
   1081  1.1.1.1.4.2  yamt 	(match_operand:SI 3 "general_operand" "nrmT"))]
   1082  1.1.1.1.4.2  yamt   ""
   1083  1.1.1.1.4.2  yamt   "insv %3,%2,%1,%0")
   1084  1.1.1.1.4.2  yamt 
   1086  1.1.1.1.4.2  yamt ;; Unconditional jump
   1087  1.1.1.1.4.2  yamt (define_insn "jump"
   1088  1.1.1.1.4.2  yamt   [(set (pc)
   1089  1.1.1.1.4.2  yamt 	(label_ref (match_operand 0 "" "")))]
   1090  1.1.1.1.4.2  yamt   ""
   1091  1.1.1.1.4.2  yamt   "jbr %l0")
   1092  1.1.1.1.4.2  yamt 
   1093  1.1.1.1.4.2  yamt ;; Conditional jumps
   1094  1.1.1.1.4.2  yamt 
   1095  1.1.1.1.4.2  yamt (define_expand "cbranch<mode>4"
   1096  1.1.1.1.4.2  yamt   [(set (cc0)
   1097  1.1.1.1.4.2  yamt         (compare (match_operand:VAXint 1 "nonimmediate_operand" "")
   1098  1.1.1.1.4.2  yamt                  (match_operand:VAXint 2 "general_operand" "")))
   1099  1.1.1.1.4.2  yamt    (set (pc)
   1100  1.1.1.1.4.2  yamt         (if_then_else
   1101  1.1.1.1.4.2  yamt               (match_operator 0 "ordered_comparison_operator" [(cc0)
   1102  1.1.1.1.4.2  yamt                                                                (const_int 0)])
   1103  1.1.1.1.4.2  yamt               (label_ref (match_operand 3 "" ""))
   1104  1.1.1.1.4.2  yamt               (pc)))]
   1105  1.1.1.1.4.2  yamt  "")
   1106  1.1.1.1.4.2  yamt 
   1107  1.1.1.1.4.2  yamt (define_expand "cbranch<mode>4"
   1108  1.1.1.1.4.2  yamt   [(set (cc0)
   1109  1.1.1.1.4.2  yamt         (compare (match_operand:VAXfp 1 "general_operand" "")
   1110  1.1.1.1.4.2  yamt                  (match_operand:VAXfp 2 "general_operand" "")))
   1111  1.1.1.1.4.2  yamt    (set (pc)
   1112  1.1.1.1.4.2  yamt         (if_then_else
   1113  1.1.1.1.4.2  yamt               (match_operator 0 "ordered_comparison_operator" [(cc0)
   1114  1.1.1.1.4.2  yamt                                                                (const_int 0)])
   1115  1.1.1.1.4.2  yamt               (label_ref (match_operand 3 "" ""))
   1116  1.1.1.1.4.2  yamt               (pc)))]
   1117  1.1.1.1.4.2  yamt  "")
   1118  1.1.1.1.4.2  yamt 
   1119  1.1.1.1.4.2  yamt (define_insn "*branch"
   1120  1.1.1.1.4.2  yamt   [(set (pc)
   1121  1.1.1.1.4.2  yamt 	(if_then_else (match_operator 0 "ordered_comparison_operator"
   1122  1.1.1.1.4.2  yamt 				      [(cc0)
   1123  1.1.1.1.4.2  yamt 				       (const_int 0)])
   1124  1.1.1.1.4.2  yamt 		      (label_ref (match_operand 1 "" ""))
   1125  1.1.1.1.4.2  yamt 		      (pc)))]
   1126  1.1.1.1.4.2  yamt   ""
   1127  1.1.1.1.4.2  yamt   "j%c0 %l1")
   1128  1.1.1.1.4.2  yamt 
   1129  1.1.1.1.4.2  yamt ;; Recognize reversed jumps.
   1130  1.1.1.1.4.2  yamt (define_insn "*branch_reversed"
   1131  1.1.1.1.4.2  yamt   [(set (pc)
   1132  1.1.1.1.4.2  yamt 	(if_then_else (match_operator 0 "ordered_comparison_operator"
   1133  1.1.1.1.4.2  yamt 				      [(cc0)
   1134  1.1.1.1.4.2  yamt 				       (const_int 0)])
   1135  1.1.1.1.4.2  yamt 		      (pc)
   1136  1.1.1.1.4.2  yamt 		      (label_ref (match_operand 1 "" ""))))]
   1137  1.1.1.1.4.2  yamt   ""
   1138  1.1.1.1.4.2  yamt   "j%C0 %l1") ; %C0 negates condition
   1139  1.1.1.1.4.2  yamt 
   1141  1.1.1.1.4.2  yamt ;; Recognize jbs, jlbs, jbc and jlbc instructions.  Note that the operand
   1142  1.1.1.1.4.2  yamt ;; of jlbs and jlbc insns are SImode in the hardware.  However, if it is
   1143  1.1.1.1.4.2  yamt ;; memory, we use QImode in the insn.  So we can't use those instructions
   1144  1.1.1.1.4.2  yamt ;; for mode-dependent addresses.
   1145  1.1.1.1.4.2  yamt 
   1146  1.1.1.1.4.2  yamt (define_insn ""
   1147  1.1.1.1.4.2  yamt   [(set (pc)
   1148  1.1.1.1.4.2  yamt 	(if_then_else
   1149  1.1.1.1.4.2  yamt 	 (ne (zero_extract:SI (match_operand:QI 0 "memory_operand" "Q,g")
   1150  1.1.1.1.4.2  yamt 			      (const_int 1)
   1151  1.1.1.1.4.2  yamt 			      (match_operand:SI 1 "general_operand" "I,nrmT"))
   1152  1.1.1.1.4.2  yamt 	     (const_int 0))
   1153  1.1.1.1.4.2  yamt 	 (label_ref (match_operand 2 "" ""))
   1154  1.1.1.1.4.2  yamt 	 (pc)))]
   1155  1.1.1.1.4.2  yamt   ""
   1156  1.1.1.1.4.2  yamt   "@
   1157  1.1.1.1.4.2  yamt    jlbs %0,%l2
   1158  1.1.1.1.4.2  yamt    jbs %1,%0,%l2")
   1159  1.1.1.1.4.2  yamt 
   1160  1.1.1.1.4.2  yamt (define_insn ""
   1161  1.1.1.1.4.2  yamt   [(set (pc)
   1162  1.1.1.1.4.2  yamt 	(if_then_else
   1163  1.1.1.1.4.2  yamt 	 (eq (zero_extract:SI (match_operand:QI 0 "memory_operand" "Q,g")
   1164  1.1.1.1.4.2  yamt 			      (const_int 1)
   1165  1.1.1.1.4.2  yamt 			      (match_operand:SI 1 "general_operand" "I,nrmT"))
   1166  1.1.1.1.4.2  yamt 	     (const_int 0))
   1167  1.1.1.1.4.2  yamt 	 (label_ref (match_operand 2 "" ""))
   1168  1.1.1.1.4.2  yamt 	 (pc)))]
   1169  1.1.1.1.4.2  yamt   ""
   1170  1.1.1.1.4.2  yamt   "@
   1171  1.1.1.1.4.2  yamt    jlbc %0,%l2
   1172  1.1.1.1.4.2  yamt    jbc %1,%0,%l2")
   1173  1.1.1.1.4.2  yamt 
   1174  1.1.1.1.4.2  yamt (define_insn ""
   1175  1.1.1.1.4.2  yamt   [(set (pc)
   1176  1.1.1.1.4.2  yamt 	(if_then_else
   1177  1.1.1.1.4.2  yamt 	 (ne (zero_extract:SI (match_operand:SI 0 "register_operand" "r,r")
   1178  1.1.1.1.4.2  yamt 			      (const_int 1)
   1179  1.1.1.1.4.2  yamt 			      (match_operand:SI 1 "general_operand" "I,nrmT"))
   1180  1.1.1.1.4.2  yamt 	     (const_int 0))
   1181  1.1.1.1.4.2  yamt 	 (label_ref (match_operand 2 "" ""))
   1182  1.1.1.1.4.2  yamt 	 (pc)))]
   1183  1.1.1.1.4.2  yamt   ""
   1184  1.1.1.1.4.2  yamt   "@
   1185  1.1.1.1.4.2  yamt    jlbs %0,%l2
   1186  1.1.1.1.4.2  yamt    jbs %1,%0,%l2")
   1187  1.1.1.1.4.2  yamt 
   1188  1.1.1.1.4.2  yamt (define_insn ""
   1189  1.1.1.1.4.2  yamt   [(set (pc)
   1190  1.1.1.1.4.2  yamt 	(if_then_else
   1191  1.1.1.1.4.2  yamt 	 (eq (zero_extract:SI (match_operand:SI 0 "register_operand" "r,r")
   1192  1.1.1.1.4.2  yamt 			      (const_int 1)
   1193  1.1.1.1.4.2  yamt 			      (match_operand:SI 1 "general_operand" "I,nrmT"))
   1194  1.1.1.1.4.2  yamt 	     (const_int 0))
   1195  1.1.1.1.4.2  yamt 	 (label_ref (match_operand 2 "" ""))
   1196  1.1.1.1.4.2  yamt 	 (pc)))]
   1197  1.1.1.1.4.2  yamt   ""
   1198  1.1.1.1.4.2  yamt   "@
   1199  1.1.1.1.4.2  yamt    jlbc %0,%l2
   1200  1.1.1.1.4.2  yamt    jbc %1,%0,%l2")
   1201  1.1.1.1.4.2  yamt 
   1203  1.1.1.1.4.2  yamt ;; Subtract-and-jump and Add-and-jump insns.
   1204  1.1.1.1.4.2  yamt ;; These are not used when output is for the Unix assembler
   1205  1.1.1.1.4.2  yamt ;; because it does not know how to modify them to reach far.
   1206  1.1.1.1.4.2  yamt 
   1207  1.1.1.1.4.2  yamt ;; Normal sob insns.
   1208  1.1.1.1.4.2  yamt 
   1209  1.1.1.1.4.2  yamt (define_insn ""
   1210  1.1.1.1.4.2  yamt   [(set (pc)
   1211  1.1.1.1.4.2  yamt 	(if_then_else
   1212  1.1.1.1.4.2  yamt 	 (gt (plus:SI (match_operand:SI 0 "nonimmediate_operand" "+g")
   1213  1.1.1.1.4.2  yamt 		      (const_int -1))
   1214  1.1.1.1.4.2  yamt 	     (const_int 0))
   1215  1.1.1.1.4.2  yamt 	 (label_ref (match_operand 1 "" ""))
   1216  1.1.1.1.4.2  yamt 	 (pc)))
   1217  1.1.1.1.4.2  yamt    (set (match_dup 0)
   1218  1.1.1.1.4.2  yamt 	(plus:SI (match_dup 0)
   1219  1.1.1.1.4.2  yamt 		 (const_int -1)))]
   1220  1.1.1.1.4.2  yamt   "!TARGET_UNIX_ASM"
   1221  1.1.1.1.4.2  yamt   "jsobgtr %0,%l1")
   1222  1.1.1.1.4.2  yamt 
   1223  1.1.1.1.4.2  yamt (define_insn ""
   1224  1.1.1.1.4.2  yamt   [(set (pc)
   1225  1.1.1.1.4.2  yamt 	(if_then_else
   1226  1.1.1.1.4.2  yamt 	 (ge (plus:SI (match_operand:SI 0 "nonimmediate_operand" "+g")
   1227  1.1.1.1.4.2  yamt 		      (const_int -1))
   1228  1.1.1.1.4.2  yamt 	     (const_int 0))
   1229  1.1.1.1.4.2  yamt 	 (label_ref (match_operand 1 "" ""))
   1230  1.1.1.1.4.2  yamt 	 (pc)))
   1231  1.1.1.1.4.2  yamt    (set (match_dup 0)
   1232  1.1.1.1.4.2  yamt 	(plus:SI (match_dup 0)
   1233  1.1.1.1.4.2  yamt 		 (const_int -1)))]
   1234  1.1.1.1.4.2  yamt   "!TARGET_UNIX_ASM"
   1235  1.1.1.1.4.2  yamt   "jsobgeq %0,%l1")
   1236  1.1.1.1.4.2  yamt 
   1237  1.1.1.1.4.2  yamt ;; Normal aob insns.  Define a version for when operands[1] is a constant.
   1238  1.1.1.1.4.2  yamt (define_insn ""
   1239  1.1.1.1.4.2  yamt   [(set (pc)
   1240  1.1.1.1.4.2  yamt 	(if_then_else
   1241  1.1.1.1.4.2  yamt 	 (lt (plus:SI (match_operand:SI 0 "nonimmediate_operand" "+g")
   1242  1.1.1.1.4.2  yamt 		      (const_int 1))
   1243  1.1.1.1.4.2  yamt 	     (match_operand:SI 1 "general_operand" "nrmT"))
   1244  1.1.1.1.4.2  yamt 	 (label_ref (match_operand 2 "" ""))
   1245  1.1.1.1.4.2  yamt 	 (pc)))
   1246  1.1.1.1.4.2  yamt    (set (match_dup 0)
   1247  1.1.1.1.4.2  yamt 	(plus:SI (match_dup 0)
   1248  1.1.1.1.4.2  yamt 		 (const_int 1)))]
   1249  1.1.1.1.4.2  yamt   "!TARGET_UNIX_ASM"
   1250  1.1.1.1.4.2  yamt   "jaoblss %1,%0,%l2")
   1251  1.1.1.1.4.2  yamt 
   1252  1.1.1.1.4.2  yamt (define_insn ""
   1253  1.1.1.1.4.2  yamt   [(set (pc)
   1254  1.1.1.1.4.2  yamt 	(if_then_else
   1255  1.1.1.1.4.2  yamt 	 (lt (match_operand:SI 0 "nonimmediate_operand" "+g")
   1256  1.1.1.1.4.2  yamt 	     (match_operand:SI 1 "general_operand" "nrmT"))
   1257  1.1.1.1.4.2  yamt 	 (label_ref (match_operand 2 "" ""))
   1258  1.1.1.1.4.2  yamt 	 (pc)))
   1259  1.1.1.1.4.2  yamt    (set (match_dup 0)
   1260  1.1.1.1.4.2  yamt 	(plus:SI (match_dup 0)
   1261  1.1.1.1.4.2  yamt 		 (const_int 1)))]
   1262  1.1.1.1.4.2  yamt   "!TARGET_UNIX_ASM && CONST_INT_P (operands[1])"
   1263  1.1.1.1.4.2  yamt   "jaoblss %P1,%0,%l2")
   1264  1.1.1.1.4.2  yamt 
   1265  1.1.1.1.4.2  yamt (define_insn ""
   1266  1.1.1.1.4.2  yamt   [(set (pc)
   1267  1.1.1.1.4.2  yamt 	(if_then_else
   1268  1.1.1.1.4.2  yamt 	 (le (plus:SI (match_operand:SI 0 "nonimmediate_operand" "+g")
   1269  1.1.1.1.4.2  yamt 		      (const_int 1))
   1270  1.1.1.1.4.2  yamt 	     (match_operand:SI 1 "general_operand" "nrmT"))
   1271  1.1.1.1.4.2  yamt 	 (label_ref (match_operand 2 "" ""))
   1272  1.1.1.1.4.2  yamt 	 (pc)))
   1273  1.1.1.1.4.2  yamt    (set (match_dup 0)
   1274  1.1.1.1.4.2  yamt 	(plus:SI (match_dup 0)
   1275  1.1.1.1.4.2  yamt 		 (const_int 1)))]
   1276  1.1.1.1.4.2  yamt   "!TARGET_UNIX_ASM"
   1277  1.1.1.1.4.2  yamt   "jaobleq %1,%0,%l2")
   1278  1.1.1.1.4.2  yamt 
   1279  1.1.1.1.4.2  yamt (define_insn ""
   1280  1.1.1.1.4.2  yamt   [(set (pc)
   1281  1.1.1.1.4.2  yamt 	(if_then_else
   1282  1.1.1.1.4.2  yamt 	 (le (match_operand:SI 0 "nonimmediate_operand" "+g")
   1283  1.1.1.1.4.2  yamt 	     (match_operand:SI 1 "general_operand" "nrmT"))
   1284  1.1.1.1.4.2  yamt 	 (label_ref (match_operand 2 "" ""))
   1285  1.1.1.1.4.2  yamt 	 (pc)))
   1286  1.1.1.1.4.2  yamt    (set (match_dup 0)
   1287  1.1.1.1.4.2  yamt 	(plus:SI (match_dup 0)
   1288  1.1.1.1.4.2  yamt 		 (const_int 1)))]
   1289  1.1.1.1.4.2  yamt   "!TARGET_UNIX_ASM && CONST_INT_P (operands[1])"
   1290  1.1.1.1.4.2  yamt   "jaobleq %P1,%0,%l2")
   1291  1.1.1.1.4.2  yamt 
   1292  1.1.1.1.4.2  yamt ;; Something like a sob insn, but compares against -1.
   1293  1.1.1.1.4.2  yamt ;; This finds `while (foo--)' which was changed to `while (--foo != -1)'.
   1294  1.1.1.1.4.2  yamt 
   1295  1.1.1.1.4.2  yamt (define_insn ""
   1296  1.1.1.1.4.2  yamt   [(set (pc)
   1297  1.1.1.1.4.2  yamt 	(if_then_else
   1298  1.1.1.1.4.2  yamt 	 (ne (match_operand:SI 0 "nonimmediate_operand" "+g")
   1299  1.1.1.1.4.2  yamt 	     (const_int 0))
   1300  1.1.1.1.4.2  yamt 	 (label_ref (match_operand 1 "" ""))
   1301  1.1.1.1.4.2  yamt 	 (pc)))
   1302  1.1.1.1.4.2  yamt    (set (match_dup 0)
   1303  1.1.1.1.4.2  yamt 	(plus:SI (match_dup 0)
   1304  1.1.1.1.4.2  yamt 		 (const_int -1)))]
   1305  1.1.1.1.4.2  yamt   ""
   1306  1.1.1.1.4.2  yamt   "decl %0\;jgequ %l1")
   1307  1.1.1.1.4.2  yamt 
   1309  1.1.1.1.4.2  yamt (define_expand "call_pop"
   1310  1.1.1.1.4.2  yamt   [(parallel [(call (match_operand:QI 0 "memory_operand" "")
   1311  1.1.1.1.4.2  yamt 		    (match_operand:SI 1 "const_int_operand" ""))
   1312  1.1.1.1.4.2  yamt 	      (set (reg:SI VAX_SP_REGNUM)
   1313  1.1.1.1.4.2  yamt 		   (plus:SI (reg:SI VAX_SP_REGNUM)
   1314  1.1.1.1.4.2  yamt 			    (match_operand:SI 3 "immediate_operand" "")))])]
   1315  1.1.1.1.4.2  yamt   ""
   1316  1.1.1.1.4.2  yamt {
   1317  1.1.1.1.4.2  yamt   gcc_assert (INTVAL (operands[3]) <= 255 * 4 && INTVAL (operands[3]) % 4 == 0);
   1318  1.1.1.1.4.2  yamt 
   1319  1.1.1.1.4.2  yamt   /* Operand 1 is the number of bytes to be popped by DW_CFA_GNU_args_size
   1320  1.1.1.1.4.2  yamt      during EH unwinding.  We must include the argument count pushed by
   1321  1.1.1.1.4.2  yamt      the calls instruction.  */
   1322  1.1.1.1.4.2  yamt   operands[1] = GEN_INT (INTVAL (operands[3]) + 4);
   1323  1.1.1.1.4.2  yamt })
   1324  1.1.1.1.4.2  yamt 
   1325  1.1.1.1.4.2  yamt (define_insn "*call_pop"
   1326  1.1.1.1.4.2  yamt   [(call (match_operand:QI 0 "memory_operand" "m")
   1327  1.1.1.1.4.2  yamt 	 (match_operand:SI 1 "const_int_operand" "n"))
   1328  1.1.1.1.4.2  yamt    (set (reg:SI VAX_SP_REGNUM) (plus:SI (reg:SI VAX_SP_REGNUM)
   1329  1.1.1.1.4.2  yamt 					(match_operand:SI 2 "immediate_operand" "i")))]
   1330  1.1.1.1.4.2  yamt   ""
   1331  1.1.1.1.4.2  yamt {
   1332  1.1.1.1.4.2  yamt   operands[1] = GEN_INT ((INTVAL (operands[1]) - 4) / 4);
   1333  1.1.1.1.4.2  yamt   return "calls %1,%0";
   1334  1.1.1.1.4.2  yamt })
   1335  1.1.1.1.4.2  yamt 
   1336  1.1.1.1.4.2  yamt (define_expand "call_value_pop"
   1337  1.1.1.1.4.2  yamt   [(parallel [(set (match_operand 0 "" "")
   1338  1.1.1.1.4.2  yamt 		   (call (match_operand:QI 1 "memory_operand" "")
   1339  1.1.1.1.4.2  yamt 			 (match_operand:SI 2 "const_int_operand" "")))
   1340  1.1.1.1.4.2  yamt 	      (set (reg:SI VAX_SP_REGNUM)
   1341  1.1.1.1.4.2  yamt 		   (plus:SI (reg:SI VAX_SP_REGNUM)
   1342  1.1.1.1.4.2  yamt 			    (match_operand:SI 4 "immediate_operand" "")))])]
   1343  1.1.1.1.4.2  yamt   ""
   1344  1.1.1.1.4.2  yamt {
   1345  1.1.1.1.4.2  yamt   gcc_assert (INTVAL (operands[4]) <= 255 * 4 && INTVAL (operands[4]) % 4 == 0);
   1346  1.1.1.1.4.2  yamt 
   1347  1.1.1.1.4.2  yamt   /* Operand 2 is the number of bytes to be popped by DW_CFA_GNU_args_size
   1348  1.1.1.1.4.2  yamt      during EH unwinding.  We must include the argument count pushed by
   1349  1.1.1.1.4.2  yamt      the calls instruction.  */
   1350  1.1.1.1.4.2  yamt   operands[2] = GEN_INT (INTVAL (operands[4]) + 4);
   1351  1.1.1.1.4.2  yamt })
   1352  1.1.1.1.4.2  yamt 
   1353  1.1.1.1.4.2  yamt (define_insn "*call_value_pop"
   1354  1.1.1.1.4.2  yamt   [(set (match_operand 0 "" "")
   1355  1.1.1.1.4.2  yamt 	(call (match_operand:QI 1 "memory_operand" "m")
   1356  1.1.1.1.4.2  yamt 	      (match_operand:SI 2 "const_int_operand" "n")))
   1357  1.1.1.1.4.2  yamt    (set (reg:SI VAX_SP_REGNUM) (plus:SI (reg:SI VAX_SP_REGNUM)
   1358  1.1.1.1.4.2  yamt 					(match_operand:SI 3 "immediate_operand" "i")))]
   1359  1.1.1.1.4.2  yamt   ""
   1360  1.1.1.1.4.2  yamt   "*
   1361  1.1.1.1.4.2  yamt {
   1362  1.1.1.1.4.2  yamt   operands[2] = GEN_INT ((INTVAL (operands[2]) - 4) / 4);
   1363  1.1.1.1.4.2  yamt   return \"calls %2,%1\";
   1364  1.1.1.1.4.2  yamt }")
   1365  1.1.1.1.4.2  yamt 
   1366  1.1.1.1.4.2  yamt (define_expand "call"
   1367  1.1.1.1.4.2  yamt   [(call (match_operand:QI 0 "memory_operand" "")
   1368  1.1.1.1.4.2  yamt       (match_operand:SI 1 "const_int_operand" ""))]
   1369  1.1.1.1.4.2  yamt   ""
   1370  1.1.1.1.4.2  yamt   "
   1371  1.1.1.1.4.2  yamt {
   1372  1.1.1.1.4.2  yamt   /* Operand 1 is the number of bytes to be popped by DW_CFA_GNU_args_size
   1373  1.1.1.1.4.2  yamt      during EH unwinding.  We must include the argument count pushed by
   1374  1.1.1.1.4.2  yamt      the calls instruction.  */
   1375  1.1.1.1.4.2  yamt   operands[1] = GEN_INT (INTVAL (operands[1]) + 4);
   1376  1.1.1.1.4.2  yamt }")
   1377  1.1.1.1.4.2  yamt 
   1378  1.1.1.1.4.2  yamt (define_insn "*call"
   1379  1.1.1.1.4.2  yamt    [(call (match_operand:QI 0 "memory_operand" "m")
   1380  1.1.1.1.4.2  yamt        (match_operand:SI 1 "const_int_operand" ""))]
   1381  1.1.1.1.4.2  yamt   ""
   1382  1.1.1.1.4.2  yamt   "calls $0,%0")
   1383  1.1.1.1.4.2  yamt 
   1384  1.1.1.1.4.2  yamt (define_expand "call_value"
   1385  1.1.1.1.4.2  yamt   [(set (match_operand 0 "" "")
   1386  1.1.1.1.4.2  yamt       (call (match_operand:QI 1 "memory_operand" "")
   1387  1.1.1.1.4.2  yamt 	    (match_operand:SI 2 "const_int_operand" "")))]
   1388  1.1.1.1.4.2  yamt   ""
   1389  1.1.1.1.4.2  yamt   "
   1390  1.1.1.1.4.2  yamt {
   1391  1.1.1.1.4.2  yamt   /* Operand 2 is the number of bytes to be popped by DW_CFA_GNU_args_size
   1392  1.1.1.1.4.2  yamt      during EH unwinding.  We must include the argument count pushed by
   1393  1.1.1.1.4.2  yamt      the calls instruction.  */
   1394  1.1.1.1.4.2  yamt   operands[2] = GEN_INT (INTVAL (operands[2]) + 4);
   1395  1.1.1.1.4.2  yamt }")
   1396  1.1.1.1.4.2  yamt 
   1397  1.1.1.1.4.2  yamt (define_insn "*call_value"
   1398  1.1.1.1.4.2  yamt   [(set (match_operand 0 "" "")
   1399  1.1.1.1.4.2  yamt 	(call (match_operand:QI 1 "memory_operand" "m")
   1400  1.1.1.1.4.2  yamt 	      (match_operand:SI 2 "const_int_operand" "")))]
   1401  1.1.1.1.4.2  yamt   ""
   1402  1.1.1.1.4.2  yamt   "calls $0,%1")
   1403  1.1.1.1.4.2  yamt 
   1404  1.1.1.1.4.2  yamt ;; Call subroutine returning any type.
   1405  1.1.1.1.4.2  yamt 
   1406  1.1.1.1.4.2  yamt (define_expand "untyped_call"
   1407  1.1.1.1.4.2  yamt   [(parallel [(call (match_operand 0 "" "")
   1408  1.1.1.1.4.2  yamt 	      (const_int 0))
   1409  1.1.1.1.4.2  yamt 	      (match_operand 1 "" "")
   1410  1.1.1.1.4.2  yamt 	      (match_operand 2 "" "")])]
   1411  1.1.1.1.4.2  yamt   ""
   1412  1.1.1.1.4.2  yamt   "
   1413  1.1.1.1.4.2  yamt {
   1414  1.1.1.1.4.2  yamt   int i;
   1415  1.1.1.1.4.2  yamt 
   1416  1.1.1.1.4.2  yamt   emit_call_insn (gen_call_pop (operands[0], const0_rtx, NULL, const0_rtx));
   1417  1.1.1.1.4.2  yamt 
   1418  1.1.1.1.4.2  yamt   for (i = 0; i < XVECLEN (operands[2], 0); i++)
   1419  1.1.1.1.4.2  yamt     {
   1420  1.1.1.1.4.2  yamt       rtx set = XVECEXP (operands[2], 0, i);
   1421  1.1.1.1.4.2  yamt       emit_move_insn (SET_DEST (set), SET_SRC (set));
   1422  1.1.1.1.4.2  yamt     }
   1423  1.1.1.1.4.2  yamt 
   1424  1.1.1.1.4.2  yamt   /* The optimizer does not know that the call sets the function value
   1425  1.1.1.1.4.2  yamt      registers we stored in the result block.  We avoid problems by
   1426  1.1.1.1.4.2  yamt      claiming that all hard registers are used and clobbered at this
   1427  1.1.1.1.4.2  yamt      point.  */
   1428  1.1.1.1.4.2  yamt   emit_insn (gen_blockage ());
   1429  1.1.1.1.4.2  yamt 
   1430  1.1.1.1.4.2  yamt   DONE;
   1431  1.1.1.1.4.2  yamt }")
   1432  1.1.1.1.4.2  yamt 
   1433  1.1.1.1.4.2  yamt ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
   1434  1.1.1.1.4.2  yamt ;; all of memory.  This blocks insns from being moved across this point.
   1435  1.1.1.1.4.2  yamt 
   1436  1.1.1.1.4.2  yamt (define_insn "blockage"
   1437  1.1.1.1.4.2  yamt   [(unspec_volatile [(const_int 0)] VUNSPEC_BLOCKAGE)]
   1438  1.1.1.1.4.2  yamt   ""
   1439  1.1.1.1.4.2  yamt   "")
   1440  1.1.1.1.4.2  yamt 
   1441  1.1.1.1.4.2  yamt (define_insn "return"
   1442  1.1.1.1.4.2  yamt   [(return)]
   1443  1.1.1.1.4.2  yamt   ""
   1444  1.1.1.1.4.2  yamt   "ret")
   1445  1.1.1.1.4.2  yamt 
   1446  1.1.1.1.4.2  yamt (define_expand "epilogue"
   1447  1.1.1.1.4.2  yamt   [(return)]
   1448  1.1.1.1.4.2  yamt   ""
   1449  1.1.1.1.4.2  yamt   "
   1450  1.1.1.1.4.2  yamt {
   1451  1.1.1.1.4.2  yamt   emit_jump_insn (gen_return ());
   1452  1.1.1.1.4.2  yamt   DONE;
   1453  1.1.1.1.4.2  yamt }")
   1454  1.1.1.1.4.2  yamt 
   1455  1.1.1.1.4.2  yamt (define_insn "nop"
   1456  1.1.1.1.4.2  yamt   [(const_int 0)]
   1457  1.1.1.1.4.2  yamt   ""
   1458  1.1.1.1.4.2  yamt   "nop")
   1459  1.1.1.1.4.2  yamt 
   1460  1.1.1.1.4.2  yamt ;; This had a wider constraint once, and it had trouble.
   1461  1.1.1.1.4.2  yamt ;; If you are tempted to try `g', please don't--it's not worth
   1462  1.1.1.1.4.2  yamt ;; the risk we will reopen the same bug.
   1463  1.1.1.1.4.2  yamt (define_insn "indirect_jump"
   1464  1.1.1.1.4.2  yamt   [(set (pc) (match_operand:SI 0 "register_operand" "r"))]
   1465  1.1.1.1.4.2  yamt   ""
   1466  1.1.1.1.4.2  yamt   "jmp (%0)")
   1467  1.1.1.1.4.2  yamt 
   1468  1.1.1.1.4.2  yamt ;; This is here to accept 5 arguments (as passed by expand_end_case)
   1469  1.1.1.1.4.2  yamt ;; and pass the first 4 along to the casesi1 pattern that really does
   1470  1.1.1.1.4.2  yamt ;; the actual casesi work.  We emit a jump here to the default label
   1471  1.1.1.1.4.2  yamt ;; _before_ the casesi so that we can be sure that the casesi never
   1472  1.1.1.1.4.2  yamt ;; drops through.
   1473  1.1.1.1.4.2  yamt ;; This is suboptimal perhaps, but so is much of the rest of this
   1474  1.1.1.1.4.2  yamt ;; machine description.  For what it's worth, HPPA uses the same trick.
   1475  1.1.1.1.4.2  yamt ;;
   1476  1.1.1.1.4.2  yamt ;; operand 0 is index
   1477  1.1.1.1.4.2  yamt ;; operand 1 is the minimum bound (a const_int)
   1478  1.1.1.1.4.2  yamt ;; operand 2 is the maximum bound - minimum bound + 1 (also a const_int)
   1479  1.1.1.1.4.2  yamt ;; operand 3 is CODE_LABEL for the table;
   1480  1.1.1.1.4.2  yamt ;; operand 4 is the CODE_LABEL to go to if index out of range (ie. default).
   1481  1.1.1.1.4.2  yamt ;;
   1482  1.1.1.1.4.2  yamt ;; We emit:
   1483  1.1.1.1.4.2  yamt ;;	i = index - minimum_bound
   1484  1.1.1.1.4.2  yamt ;;	if (i > (maximum_bound - minimum_bound + 1) goto default;
   1485  1.1.1.1.4.2  yamt ;;	casesi (i, 0, table);
   1486  1.1.1.1.4.2  yamt ;;
   1487  1.1.1.1.4.2  yamt (define_expand "casesi"
   1488  1.1.1.1.4.2  yamt   [(match_operand:SI 0 "general_operand" "")
   1489  1.1.1.1.4.2  yamt    (match_operand:SI 1 "general_operand" "")
   1490  1.1.1.1.4.2  yamt    (match_operand:SI 2 "general_operand" "")
   1491  1.1.1.1.4.2  yamt    (match_operand 3 "" "")
   1492  1.1.1.1.4.2  yamt    (match_operand 4 "" "")]
   1493  1.1.1.1.4.2  yamt   ""
   1494  1.1.1.1.4.2  yamt {
   1495  1.1.1.1.4.2  yamt   rtx test;
   1496  1.1.1.1.4.2  yamt 
   1497  1.1.1.1.4.2  yamt   /* i = index - minimum_bound;
   1498  1.1.1.1.4.2  yamt      But only if the lower bound is not already zero.  */
   1499  1.1.1.1.4.2  yamt   if (operands[1] != const0_rtx)
   1500  1.1.1.1.4.2  yamt     {
   1501  1.1.1.1.4.2  yamt       rtx index = gen_reg_rtx (SImode);
   1502  1.1.1.1.4.2  yamt       emit_insn (gen_addsi3 (index,
   1503  1.1.1.1.4.2  yamt 			     operands[0],
   1504  1.1.1.1.4.2  yamt 			     GEN_INT (-INTVAL (operands[1]))));
   1505  1.1.1.1.4.2  yamt       operands[0] = index;
   1506  1.1.1.1.4.2  yamt     }
   1507  1.1.1.1.4.2  yamt 
   1508  1.1.1.1.4.2  yamt   /* if (i > (maximum_bound - minimum_bound + 1)) goto default;  */
   1509  1.1.1.1.4.2  yamt   test = gen_rtx_fmt_ee (GTU, VOIDmode, operands[0], operands[2]);
   1510  1.1.1.1.4.2  yamt   emit_jump_insn (gen_cbranchsi4 (test, operands[0], operands[2], operands[4]));
   1511  1.1.1.1.4.2  yamt 
   1512  1.1.1.1.4.2  yamt   /* casesi (i, 0, table);  */
   1513  1.1.1.1.4.2  yamt   emit_jump_insn (gen_casesi1 (operands[0], operands[2], operands[3]));
   1514  1.1.1.1.4.2  yamt   DONE;
   1515  1.1.1.1.4.2  yamt })
   1516  1.1.1.1.4.2  yamt 
   1517  1.1.1.1.4.2  yamt ;; This insn is a bit of a lier.  It actually falls through if no case
   1518  1.1.1.1.4.2  yamt ;; matches.  But, we prevent that from ever happening by emitting a jump
   1519  1.1.1.1.4.2  yamt ;; before this, see the define_expand above.
   1520  1.1.1.1.4.2  yamt (define_insn "casesi1"
   1521  1.1.1.1.4.2  yamt   [(match_operand:SI 1 "const_int_operand" "n")
   1522  1.1.1.1.4.2  yamt    (set (pc)
   1523  1.1.1.1.4.2  yamt 	(plus:SI (sign_extend:SI
   1524  1.1.1.1.4.2  yamt 		  (mem:HI (plus:SI (mult:SI (match_operand:SI 0 "general_operand" "nrmT")
   1525  1.1.1.1.4.2  yamt 					    (const_int 2))
   1526  1.1.1.1.4.2  yamt 			  (pc))))
   1527  1.1.1.1.4.2  yamt 		 (label_ref:SI (match_operand 2 "" ""))))]
   1528  1.1.1.1.4.2  yamt   ""
   1529  1.1.1.1.4.2  yamt   "casel %0,$0,%1")
   1530  1.1.1.1.4.2  yamt 
   1532  1.1.1.1.4.2  yamt (define_insn "pushextsym"
   1533  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "push_operand" "=g")
   1534  1.1.1.1.4.2  yamt 	(match_operand:SI 1 "external_symbolic_operand" "i"))]
   1535  1.1.1.1.4.2  yamt   ""
   1536  1.1.1.1.4.2  yamt   "pushab %a1")
   1537  1.1.1.1.4.2  yamt 
   1538  1.1.1.1.4.2  yamt (define_insn "movextsym"
   1539  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
   1540  1.1.1.1.4.2  yamt 	(match_operand:SI 1 "external_symbolic_operand" "i"))]
   1541  1.1.1.1.4.2  yamt   ""
   1542  1.1.1.1.4.2  yamt   "movab %a1,%0")
   1543  1.1.1.1.4.2  yamt 
   1544  1.1.1.1.4.2  yamt (define_insn "pushlclsym"
   1545  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "push_operand" "=g")
   1546  1.1.1.1.4.2  yamt 	(match_operand:SI 1 "local_symbolic_operand" "i"))]
   1547  1.1.1.1.4.2  yamt   ""
   1548  1.1.1.1.4.2  yamt   "pushab %a1")
   1549  1.1.1.1.4.2  yamt 
   1550  1.1.1.1.4.2  yamt (define_insn "movlclsym"
   1551  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
   1552  1.1.1.1.4.2  yamt 	(match_operand:SI 1 "local_symbolic_operand" "i"))]
   1553  1.1.1.1.4.2  yamt   ""
   1554  1.1.1.1.4.2  yamt   "movab %a1,%0")
   1555  1.1.1.1.4.2  yamt 
   1557  1.1.1.1.4.2  yamt ;;- load or push effective address
   1558  1.1.1.1.4.2  yamt ;; These come after the move and add/sub patterns
   1559  1.1.1.1.4.2  yamt ;; because we don't want pushl $1 turned into pushad 1.
   1560  1.1.1.1.4.2  yamt ;; or addl3 r1,r2,r3 turned into movab 0(r1)[r2],r3.
   1561  1.1.1.1.4.2  yamt 
   1562  1.1.1.1.4.2  yamt ;; It does not work to use constraints to distinguish pushes from moves,
   1563  1.1.1.1.4.2  yamt ;; because < matches any autodecrement, not just a push.
   1564  1.1.1.1.4.2  yamt 
   1565  1.1.1.1.4.2  yamt (define_insn "pushaddr<mode>"
   1566  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "push_operand" "=g")
   1567  1.1.1.1.4.2  yamt 	(match_operand:VAXintQHSD 1 "address_operand" "p"))]
   1568  1.1.1.1.4.2  yamt   ""
   1569  1.1.1.1.4.2  yamt   "pusha<VAXintQHSD:isfx> %a1")
   1570  1.1.1.1.4.2  yamt 
   1571  1.1.1.1.4.2  yamt (define_insn "movaddr<mode>"
   1572  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
   1573  1.1.1.1.4.2  yamt 	(match_operand:VAXintQHSD 1 "address_operand" "p"))]
   1574  1.1.1.1.4.2  yamt   ""
   1575  1.1.1.1.4.2  yamt   "mova<VAXintQHSD:isfx> %a1,%0")
   1576  1.1.1.1.4.2  yamt 
   1577  1.1.1.1.4.2  yamt (define_insn "pushaddr<mode>"
   1578  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "push_operand" "=g")
   1579  1.1.1.1.4.2  yamt 	(match_operand:VAXfp 1 "address_operand" "p"))]
   1580  1.1.1.1.4.2  yamt   ""
   1581  1.1.1.1.4.2  yamt   "pusha<VAXfp:fsfx> %a1")
   1582  1.1.1.1.4.2  yamt 
   1583  1.1.1.1.4.2  yamt (define_insn "movaddr<mode>"
   1584  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
   1585  1.1.1.1.4.2  yamt 	(match_operand:VAXfp 1 "address_operand" "p"))]
   1586  1.1.1.1.4.2  yamt   ""
   1587  1.1.1.1.4.2  yamt   "mova<VAXfp:fsfx> %a1,%0")
   1588  1.1.1.1.4.2  yamt 
   1590  1.1.1.1.4.2  yamt ;; These used to be peepholes, but it is more straightforward to do them
   1591  1.1.1.1.4.2  yamt ;; as single insns.  However, we must force the output to be a register
   1592  1.1.1.1.4.2  yamt ;; if it is not an offsettable address so that we know that we can assign
   1593  1.1.1.1.4.2  yamt ;; to it twice.
   1594  1.1.1.1.4.2  yamt 
   1595  1.1.1.1.4.2  yamt ;; If we had a good way of evaluating the relative costs, these could be
   1596  1.1.1.1.4.2  yamt ;; machine-independent.
   1597  1.1.1.1.4.2  yamt 
   1598  1.1.1.1.4.2  yamt ;; Optimize   extzv ...,z;    andl2 ...,z
   1599  1.1.1.1.4.2  yamt ;; or	      ashl ...,z;     andl2 ...,z
   1600  1.1.1.1.4.2  yamt ;; with other operands constant.  This is what the combiner converts the
   1601  1.1.1.1.4.2  yamt ;; above sequences to before attempting to recognize the new insn.
   1602  1.1.1.1.4.2  yamt 
   1603  1.1.1.1.4.2  yamt (define_insn ""
   1604  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=ro")
   1605  1.1.1.1.4.2  yamt 	(and:SI (ashiftrt:SI (match_operand:SI 1 "general_operand" "nrmT")
   1606  1.1.1.1.4.2  yamt 			     (match_operand:QI 2 "const_int_operand" "n"))
   1607  1.1.1.1.4.2  yamt 		(match_operand:SI 3 "const_int_operand" "n")))]
   1608  1.1.1.1.4.2  yamt   "(INTVAL (operands[3]) & ~((1 << (32 - INTVAL (operands[2]))) - 1)) == 0"
   1609  1.1.1.1.4.2  yamt   "*
   1610  1.1.1.1.4.2  yamt {
   1611  1.1.1.1.4.2  yamt   unsigned long mask1 = INTVAL (operands[3]);
   1612  1.1.1.1.4.2  yamt   unsigned long mask2 = (1 << (32 - INTVAL (operands[2]))) - 1;
   1613  1.1.1.1.4.2  yamt 
   1614  1.1.1.1.4.2  yamt   if ((mask1 & mask2) != mask1)
   1615  1.1.1.1.4.2  yamt     operands[3] = GEN_INT (mask1 & mask2);
   1616  1.1.1.1.4.2  yamt 
   1617  1.1.1.1.4.2  yamt   return \"rotl %R2,%1,%0\;bicl2 %N3,%0\";
   1618  1.1.1.1.4.2  yamt }")
   1619  1.1.1.1.4.2  yamt 
   1620  1.1.1.1.4.2  yamt ;; left-shift and mask
   1621  1.1.1.1.4.2  yamt ;; The only case where `ashl' is better is if the mask only turns off
   1622  1.1.1.1.4.2  yamt ;; bits that the ashl would anyways, in which case it should have been
   1623  1.1.1.1.4.2  yamt ;; optimized away.
   1624  1.1.1.1.4.2  yamt 
   1625  1.1.1.1.4.2  yamt (define_insn ""
   1626  1.1.1.1.4.2  yamt   [(set (match_operand:SI 0 "nonimmediate_operand" "=ro")
   1627  1.1.1.1.4.2  yamt 	(and:SI (ashift:SI (match_operand:SI 1 "general_operand" "nrmT")
   1628  1.1.1.1.4.2  yamt 			   (match_operand:QI 2 "const_int_operand" "n"))
   1629  1.1.1.1.4.2  yamt 		(match_operand:SI 3 "const_int_operand" "n")))]
   1630  1.1.1.1.4.2  yamt   ""
   1631  1.1.1.1.4.2  yamt   "*
   1632  1.1.1.1.4.2  yamt {
   1633  1.1.1.1.4.2  yamt   operands[3]
   1634  1.1.1.1.4.2  yamt     = GEN_INT (INTVAL (operands[3]) & ~((1 << INTVAL (operands[2])) - 1));
   1635  1.1.1.1.4.2  yamt   return \"rotl %2,%1,%0\;bicl2 %N3,%0\";
   1636  1.1.1.1.4.2  yamt }")
   1637  1.1.1.1.4.2  yamt 
   1638  1.1.1.1.4.2  yamt ;; Instruction sequence to sync the VAX instruction stream.
   1639  1.1.1.1.4.2  yamt (define_insn "sync_istream"
   1640  1.1.1.1.4.2  yamt   [(unspec_volatile [(const_int 0)] VUNSPEC_SYNC_ISTREAM)]
   1641  1.1.1.1.4.2  yamt   ""
   1642  1.1.1.1.4.2  yamt   "movpsl -(%|sp)\;pushal 1(%|pc)\;rei")
   1643  1.1.1.1.4.2  yamt 
   1644  1.1.1.1.4.2  yamt (define_expand "nonlocal_goto"
   1645  1.1.1.1.4.2  yamt   [(use (match_operand 0 "general_operand" ""))
   1646  1.1.1.1.4.2  yamt    (use (match_operand 1 "general_operand" ""))
   1647  1.1.1.1.4.2  yamt    (use (match_operand 2 "general_operand" ""))
   1648  1.1.1.1.4.2  yamt    (use (match_operand 3 "general_operand" ""))]
   1649  1.1.1.1.4.2  yamt   ""
   1650  1.1.1.1.4.2  yamt {
   1651                      rtx lab = operands[1];
   1652                      rtx stack = operands[2];
   1653                      rtx fp = operands[3];
   1654                    
   1655                      emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
   1656                      emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
   1657                    
   1658                      emit_move_insn (hard_frame_pointer_rtx, fp);
   1659                      emit_stack_restore (SAVE_NONLOCAL, stack, NULL_RTX);
   1660                    
   1661                      emit_use (hard_frame_pointer_rtx);
   1662                      emit_use (stack_pointer_rtx);
   1663                    
   1664                      /* We'll convert this to direct jump via a peephole optimization.  */
   1665                      emit_indirect_jump (copy_to_reg (lab));
   1666                      emit_barrier ();
   1667                      DONE;
   1668                    })
   1669                    
   1670                    (include "builtins.md")
   1671