Home | History | Annotate | Line # | Download | only in c6x
c6x.md revision 1.1.1.7
      1      1.1  mrg ;; Machine description for TI C6X.
      2  1.1.1.7  mrg ;; Copyright (C) 2010-2020 Free Software Foundation, Inc.
      3      1.1  mrg ;; Contributed by Andrew Jenner <andrew (a] codesourcery.com>
      4      1.1  mrg ;; Contributed by Bernd Schmidt <bernds (a] codesourcery.com>
      5      1.1  mrg ;; Contributed by CodeSourcery.
      6      1.1  mrg ;;
      7      1.1  mrg ;; This file is part of GCC.
      8      1.1  mrg ;;
      9      1.1  mrg ;; GCC is free software; you can redistribute it and/or modify
     10      1.1  mrg ;; it under the terms of the GNU General Public License as published by
     11      1.1  mrg ;; the Free Software Foundation; either version 3, or (at your option)
     12      1.1  mrg ;; any later version.
     13      1.1  mrg ;;
     14      1.1  mrg ;; GCC is distributed in the hope that it will be useful,
     15      1.1  mrg ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
     16      1.1  mrg ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17      1.1  mrg ;; GNU General Public License for more details.
     18      1.1  mrg ;;
     19      1.1  mrg ;; You should have received a copy of the GNU General Public License
     20      1.1  mrg ;; along with GCC; see the file COPYING3.  If not see
     21      1.1  mrg ;; <http://www.gnu.org/licenses/>.
     22      1.1  mrg 
     23      1.1  mrg 
     24      1.1  mrg ;; Register names
     25      1.1  mrg 
     26      1.1  mrg (define_constants
     27      1.1  mrg   [(REG_A0 0)
     28      1.1  mrg    (REG_A1 1)
     29      1.1  mrg    (REG_A2 2)
     30      1.1  mrg    (REG_A3 3)
     31      1.1  mrg    (REG_A4 4)
     32      1.1  mrg    (REG_A5 5)
     33      1.1  mrg    (REG_A6 6)
     34      1.1  mrg    (REG_A7 7)
     35      1.1  mrg    (REG_A8 8)
     36      1.1  mrg    (REG_A9 9)
     37      1.1  mrg    (REG_A10 10)
     38      1.1  mrg    (REG_A11 11)
     39      1.1  mrg    (REG_A12 12)
     40      1.1  mrg    (REG_A13 13)
     41      1.1  mrg    (REG_A14 14)
     42      1.1  mrg    (REG_A15 15)
     43      1.1  mrg    (REG_A16 16)
     44      1.1  mrg    (REG_A17 17)
     45      1.1  mrg    (REG_A18 18)
     46      1.1  mrg    (REG_A19 19)
     47      1.1  mrg    (REG_A20 20)
     48      1.1  mrg    (REG_A21 21)
     49      1.1  mrg    (REG_A22 22)
     50      1.1  mrg    (REG_A23 23)
     51      1.1  mrg    (REG_A24 24)
     52      1.1  mrg    (REG_A25 25)
     53      1.1  mrg    (REG_A26 26)
     54      1.1  mrg    (REG_A27 27)
     55      1.1  mrg    (REG_A28 28)
     56      1.1  mrg    (REG_A29 29)
     57      1.1  mrg    (REG_A30 30)
     58      1.1  mrg    (REG_A31 31)
     59      1.1  mrg    (REG_B0 32)
     60      1.1  mrg    (REG_B1 33)
     61      1.1  mrg    (REG_B2 34)
     62      1.1  mrg    (REG_B3 35)
     63      1.1  mrg    (REG_B4 36)
     64      1.1  mrg    (REG_B5 37)
     65      1.1  mrg    (REG_B6 38)
     66      1.1  mrg    (REG_B7 39)
     67      1.1  mrg    (REG_B8 40)
     68      1.1  mrg    (REG_B9 41)
     69      1.1  mrg    (REG_B10 42)
     70      1.1  mrg    (REG_B11 43)
     71      1.1  mrg    (REG_B12 44)
     72      1.1  mrg    (REG_B13 45)
     73      1.1  mrg    (REG_B14 46)
     74      1.1  mrg    (REG_SP 47)
     75      1.1  mrg    (REG_B15 47)
     76      1.1  mrg    (REG_B16 48)
     77      1.1  mrg    (REG_B17 49)
     78      1.1  mrg    (REG_B18 50)
     79      1.1  mrg    (REG_B19 51)
     80      1.1  mrg    (REG_B20 52)
     81      1.1  mrg    (REG_B21 53)
     82      1.1  mrg    (REG_B22 54)
     83      1.1  mrg    (REG_B23 55)
     84      1.1  mrg    (REG_B24 56)
     85      1.1  mrg    (REG_B25 57)
     86      1.1  mrg    (REG_B26 58)
     87      1.1  mrg    (REG_B27 59)
     88      1.1  mrg    (REG_B28 60)
     89      1.1  mrg    (REG_B29 61)
     90      1.1  mrg    (REG_B30 62)
     91      1.1  mrg    (REG_B31 63)
     92      1.1  mrg    (REG_FRAME 64)
     93      1.1  mrg    (REG_ARGP 65)
     94      1.1  mrg    (REG_ILC 66)])
     95      1.1  mrg 
     96      1.1  mrg (define_c_enum "unspec" [
     97      1.1  mrg    UNSPEC_NOP
     98      1.1  mrg    UNSPEC_RCP
     99      1.1  mrg    UNSPEC_MISALIGNED_ACCESS
    100      1.1  mrg    UNSPEC_ADDKPC
    101      1.1  mrg    UNSPEC_SETUP_DSBT
    102      1.1  mrg    UNSPEC_LOAD_GOT
    103      1.1  mrg    UNSPEC_LOAD_SDATA
    104      1.1  mrg    UNSPEC_BITREV
    105      1.1  mrg    UNSPEC_GOTOFF
    106      1.1  mrg    UNSPEC_MVILC
    107      1.1  mrg    UNSPEC_REAL_JUMP
    108      1.1  mrg    UNSPEC_REAL_LOAD
    109      1.1  mrg    UNSPEC_REAL_MULT
    110      1.1  mrg    UNSPEC_JUMP_SHADOW
    111      1.1  mrg    UNSPEC_LOAD_SHADOW
    112      1.1  mrg    UNSPEC_MULT_SHADOW
    113      1.1  mrg    UNSPEC_EPILOGUE_BARRIER
    114      1.1  mrg    UNSPEC_ATOMIC
    115      1.1  mrg    UNSPEC_CLR
    116      1.1  mrg    UNSPEC_EXT
    117      1.1  mrg    UNSPEC_EXTU
    118      1.1  mrg    UNSPEC_SUBC
    119      1.1  mrg    UNSPEC_AVG
    120      1.1  mrg ])
    121      1.1  mrg 
    122      1.1  mrg (define_c_enum "unspecv" [
    123      1.1  mrg    UNSPECV_BLOCKAGE
    124      1.1  mrg    UNSPECV_SPLOOP
    125      1.1  mrg    UNSPECV_SPKERNEL
    126      1.1  mrg    UNSPECV_EH_RETURN
    127      1.1  mrg    UNSPECV_CAS
    128      1.1  mrg ])
    129      1.1  mrg 
    130      1.1  mrg ;; -------------------------------------------------------------------------
    131      1.1  mrg ;; Instruction attributes
    132      1.1  mrg ;; -------------------------------------------------------------------------
    133      1.1  mrg 
    134      1.1  mrg (define_attr "cpu"
    135      1.1  mrg   "c62x,c64x,c64xp,c67x,c67xp,c674x"
    136      1.1  mrg   (const (symbol_ref "(enum attr_cpu)c6x_arch")))
    137      1.1  mrg 
    138      1.1  mrg ;; Define a type for each insn which is used in the scheduling description.
    139      1.1  mrg ;; These correspond to the types defined in chapter 4 of the C674x manual.
    140      1.1  mrg (define_attr "type"
    141      1.1  mrg   "unknown,single,mpy2,store,storen,mpy4,load,loadn,branch,call,callp,dp2,fp4,
    142      1.1  mrg    intdp,cmpdp,adddp,mpy,mpyi,mpyid,mpydp,mpyspdp,mpysp2dp,spkernel,sploop,
    143      1.1  mrg    mvilc,blockage,shadow,load_shadow,mult_shadow,atomic"
    144      1.1  mrg   (const_string "single"))
    145      1.1  mrg 
    146      1.1  mrg ;; The register file used by an instruction's destination register.
    147      1.1  mrg ;; The function destreg_file computes this; instructions can override the
    148      1.1  mrg ;; attribute if they aren't a single_set.
    149      1.1  mrg (define_attr "dest_regfile"
    150      1.1  mrg   "unknown,any,a,b"
    151      1.1  mrg   (cond [(eq_attr "type" "single,load,mpy2,mpy4,dp2,fp4,intdp,cmpdp,adddp,mpy,mpyi,mpyid,mpydp,mpyspdp,mpysp2dp")
    152      1.1  mrg 	 (cond [(match_operand 0 "a_register" "") (const_string "a")
    153      1.1  mrg 		(match_operand 0 "b_register" "") (const_string "b")]
    154      1.1  mrg 	       (const_string "unknown"))
    155      1.1  mrg 	 (eq_attr "type" "store")
    156      1.1  mrg 		(cond [(match_operand 1 "a_register" "") (const_string "a")
    157      1.1  mrg 		       (match_operand 1 "b_register" "") (const_string "b")]
    158      1.1  mrg 	       (const_string "unknown"))]
    159      1.1  mrg 	(const_string "unknown")))
    160      1.1  mrg 
    161      1.1  mrg (define_attr "addr_regfile"
    162      1.1  mrg   "unknown,a,b"
    163      1.1  mrg   (const_string "unknown"))
    164      1.1  mrg 
    165      1.1  mrg (define_attr "cross"
    166      1.1  mrg   "n,y"
    167      1.1  mrg   (const_string "n"))
    168      1.1  mrg 
    169      1.1  mrg ;; This describes the relationship between operands and register files.
    170      1.1  mrg ;; For example, "sxs" means that operands 0 and 2 determine the side of
    171      1.1  mrg ;; the machine, and operand 1 can optionally use the cross path.  "dt" and
    172      1.1  mrg ;; "td" are used to describe loads and stores.
    173      1.1  mrg ;; Used for register renaming in loops for improving modulo scheduling.
    174      1.1  mrg (define_attr "op_pattern"
    175      1.1  mrg   "unknown,dt,td,sx,sxs,ssx"
    176      1.1  mrg   (cond [(eq_attr "type" "load") (const_string "td")
    177      1.1  mrg 	 (eq_attr "type" "store") (const_string "dt")]
    178      1.1  mrg 	(const_string "unknown")))
    179      1.1  mrg 
    180      1.1  mrg (define_attr "has_shadow"
    181      1.1  mrg   "n,y"
    182      1.1  mrg   (const_string "n"))
    183      1.1  mrg 
    184      1.1  mrg ;; The number of cycles the instruction takes to finish.  Any cycles above
    185      1.1  mrg ;; the first are delay slots.
    186      1.1  mrg (define_attr "cycles" ""
    187      1.1  mrg   (cond [(eq_attr "type" "branch,call") (const_int 6)
    188      1.1  mrg 	 (eq_attr "type" "load,loadn") (const_int 5)
    189      1.1  mrg 	 (eq_attr "type" "dp2") (const_int 2)
    190      1.1  mrg 	 (eq_attr "type" "mpy2") (const_int 2)
    191      1.1  mrg 	 (eq_attr "type" "mpy4") (const_int 4)
    192      1.1  mrg 	 (eq_attr "type" "fp4") (const_int 4)
    193      1.1  mrg 	 (eq_attr "type" "mvilc") (const_int 4)
    194      1.1  mrg 	 (eq_attr "type" "cmpdp") (const_int 2)
    195      1.1  mrg 	 (eq_attr "type" "intdp") (const_int 5)
    196      1.1  mrg 	 (eq_attr "type" "adddp") (const_int 7)
    197      1.1  mrg 	 (eq_attr "type" "mpydp") (const_int 10)
    198      1.1  mrg 	 (eq_attr "type" "mpyi") (const_int 9)
    199      1.1  mrg 	 (eq_attr "type" "mpyid") (const_int 10)
    200      1.1  mrg 	 (eq_attr "type" "mpyspdp") (const_int 7)
    201      1.1  mrg 	 (eq_attr "type" "mpysp2dp") (const_int 5)]
    202      1.1  mrg 	(const_int 1)))
    203      1.1  mrg 
    204      1.1  mrg ;; The number of cycles during which the instruction reserves functional
    205      1.1  mrg ;; units.
    206      1.1  mrg (define_attr "reserve_cycles" ""
    207      1.1  mrg   (cond [(eq_attr "type" "cmpdp") (const_int 2)
    208      1.1  mrg 	 (eq_attr "type" "adddp") (const_int 2)
    209      1.1  mrg 	 (eq_attr "type" "mpydp") (const_int 4)
    210      1.1  mrg 	 (eq_attr "type" "mpyi") (const_int 4)
    211      1.1  mrg 	 (eq_attr "type" "mpyid") (const_int 4)
    212      1.1  mrg 	 (eq_attr "type" "mpyspdp") (const_int 2)]
    213      1.1  mrg 	(const_int 1)))
    214      1.1  mrg 
    215      1.1  mrg (define_attr "predicable" "no,yes"
    216      1.1  mrg   (const_string "yes"))
    217      1.1  mrg 
    218      1.1  mrg (define_attr "enabled" "no,yes"
    219      1.1  mrg   (const_string "yes"))
    220      1.1  mrg 
    221      1.1  mrg ;; Specify which units can be used by a given instruction.  Normally,
    222      1.1  mrg ;; dest_regfile is used to select between the two halves of the machine.
    223      1.1  mrg ;; D_ADDR is for load/store instructions; they use the D unit and use
    224      1.1  mrg ;; addr_regfile to choose between D1 and D2.
    225      1.1  mrg 
    226      1.1  mrg (define_attr "units62"
    227      1.1  mrg   "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
    228      1.1  mrg   (const_string "unknown"))
    229      1.1  mrg 
    230      1.1  mrg (define_attr "units64"
    231      1.1  mrg   "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
    232      1.1  mrg   (const_string "unknown"))
    233      1.1  mrg 
    234      1.1  mrg (define_attr "units64p"
    235      1.1  mrg   "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
    236      1.1  mrg   (attr "units64"))
    237      1.1  mrg 
    238      1.1  mrg (define_attr "units67"
    239      1.1  mrg   "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
    240      1.1  mrg   (attr "units62"))
    241      1.1  mrg 
    242      1.1  mrg (define_attr "units67p"
    243      1.1  mrg   "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
    244      1.1  mrg   (attr "units67"))
    245      1.1  mrg 
    246      1.1  mrg (define_attr "units674"
    247      1.1  mrg   "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
    248      1.1  mrg   (attr "units64"))
    249      1.1  mrg 
    250      1.1  mrg (define_attr "units"
    251      1.1  mrg   "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
    252      1.1  mrg   (cond [(eq_attr "cpu" "c62x")
    253      1.1  mrg 	   (attr "units62")
    254      1.1  mrg 	 (eq_attr "cpu" "c67x")
    255      1.1  mrg 	   (attr "units67")
    256      1.1  mrg 	 (eq_attr "cpu" "c67xp")
    257      1.1  mrg 	   (attr "units67p")
    258      1.1  mrg 	 (eq_attr "cpu" "c64x")
    259      1.1  mrg 	   (attr "units64")
    260      1.1  mrg 	 (eq_attr "cpu" "c64xp")
    261      1.1  mrg 	   (attr "units64p")
    262      1.1  mrg 	 (eq_attr "cpu" "c674x")
    263      1.1  mrg 	   (attr "units674")
    264      1.1  mrg 	]
    265      1.1  mrg 	(const_string "unknown")))
    266      1.1  mrg 
    267      1.1  mrg (define_automaton "c6x_1,c6x_2,c6x_m1,c6x_m2,c6x_t1,c6x_t2,c6x_branch")
    268      1.1  mrg (automata_option "no-comb-vect")
    269      1.1  mrg (automata_option "ndfa")
    270      1.1  mrg (automata_option "collapse-ndfa")
    271      1.1  mrg 
    272      1.1  mrg (define_query_cpu_unit "d1,l1,s1" "c6x_1")
    273      1.1  mrg (define_cpu_unit "x1" "c6x_1")
    274      1.1  mrg (define_cpu_unit "l1w,s1w" "c6x_1")
    275      1.1  mrg (define_query_cpu_unit "m1" "c6x_m1")
    276      1.1  mrg (define_cpu_unit "m1w" "c6x_m1")
    277      1.1  mrg (define_cpu_unit "t1" "c6x_t1")
    278      1.1  mrg (define_query_cpu_unit "d2,l2,s2" "c6x_2")
    279      1.1  mrg (define_cpu_unit "x2" "c6x_2")
    280      1.1  mrg (define_cpu_unit "l2w,s2w" "c6x_2")
    281      1.1  mrg (define_query_cpu_unit "m2" "c6x_m2")
    282      1.1  mrg (define_cpu_unit "m2w" "c6x_m2")
    283      1.1  mrg (define_cpu_unit "t2" "c6x_t2")
    284      1.1  mrg ;; A special set of units used to identify specific reservations, rather than
    285      1.1  mrg ;; just units.
    286      1.1  mrg (define_query_cpu_unit "fps1,fpl1,adddps1,adddpl1" "c6x_1")
    287      1.1  mrg (define_query_cpu_unit "fps2,fpl2,adddps2,adddpl2" "c6x_2")
    288      1.1  mrg 
    289      1.1  mrg ;; There can be up to two branches in one cycle (on the .s1 and .s2
    290      1.1  mrg ;; units), but some instructions must not be scheduled in parallel
    291      1.1  mrg ;; with a branch.  We model this by reserving either br0 or br1 for a
    292      1.1  mrg ;; normal branch, and both of them for an insn such as callp.
    293      1.1  mrg ;; Another constraint is that two branches may only execute in parallel
    294      1.1  mrg ;; if one uses an offset, and the other a register.  We can distinguish
    295      1.1  mrg ;; these by the dest_regfile attribute; it is "any" iff the branch uses
    296      1.1  mrg ;; an offset.  br0 is reserved for these, while br1 is reserved for
    297      1.1  mrg ;; branches using a register.
    298      1.1  mrg (define_cpu_unit "br0,br1" "c6x_branch")
    299      1.1  mrg 
    300      1.1  mrg (include "c6x-sched.md")
    301      1.1  mrg 
    302      1.1  mrg ;; Some reservations which aren't generated from c6x-sched.md.in
    303      1.1  mrg 
    304      1.1  mrg (define_insn_reservation "branch_s1any" 6
    305      1.1  mrg   (and (eq_attr "type" "branch")
    306      1.1  mrg        (and (eq_attr "cross" "n")
    307      1.1  mrg 	    (and (eq_attr "units" "s")
    308      1.1  mrg 		 (eq_attr "dest_regfile" "any"))))
    309      1.1  mrg   "s1+s1w+br0")
    310      1.1  mrg 
    311      1.1  mrg ;; For calls, we also reserve the units needed in the following cycles
    312      1.1  mrg ;; to load the return address.  There are two options; using addkpc or
    313      1.1  mrg ;; mvkh/mvkl.  The code in c6x_reorg knows whether to use one of these
    314      1.1  mrg ;; or whether to use callp.  The actual insns are emitted only after
    315      1.1  mrg ;; the final scheduling pass is complete.
    316      1.1  mrg ;; We always reserve S2 for PC-relative call insns, since that allows
    317      1.1  mrg ;; us to turn them into callp insns later on.
    318      1.1  mrg (define_insn_reservation "call_addkpc_s1any" 6
    319      1.1  mrg   (and (eq_attr "type" "call")
    320      1.1  mrg        (and (ne (symbol_ref "TARGET_INSNS_64") (const_int 0))
    321      1.1  mrg 	    (and (eq_attr "cross" "n")
    322      1.1  mrg 		 (and (eq_attr "units" "s")
    323      1.1  mrg 		      (eq_attr "dest_regfile" "any")))))
    324      1.1  mrg   "s2+s2w+br0,s2+s2w+br0+br1")
    325      1.1  mrg 
    326      1.1  mrg (define_insn_reservation "call_mvk_s1any" 6
    327      1.1  mrg   (and (eq_attr "type" "call")
    328      1.1  mrg        (and (eq (symbol_ref "TARGET_INSNS_64") (const_int 0))
    329      1.1  mrg 	    (and (eq_attr "cross" "n")
    330      1.1  mrg 		 (and (eq_attr "units" "s")
    331      1.1  mrg 		      (eq_attr "dest_regfile" "any")))))
    332      1.1  mrg   "s2+s2w+br0,s2+s2w,s2+s2w")
    333      1.1  mrg 
    334      1.1  mrg (define_reservation "all" "s1+s2+d1+d2+l1+l2+m1+m2")
    335      1.1  mrg 
    336      1.1  mrg (define_insn_reservation "callp_s1" 1
    337      1.1  mrg   (and (eq_attr "type" "callp") (eq_attr "dest_regfile" "a"))
    338      1.1  mrg   "s1+s1w,all*5")
    339      1.1  mrg 
    340      1.1  mrg (define_insn_reservation "callp_s2" 1
    341      1.1  mrg   (and (eq_attr "type" "callp") (eq_attr "dest_regfile" "b"))
    342      1.1  mrg   "s2+s2w,all*5")
    343      1.1  mrg 
    344      1.1  mrg ;; Constraints
    345      1.1  mrg 
    346      1.1  mrg (include "constraints.md")
    347      1.1  mrg 
    348      1.1  mrg ;; Predicates
    349      1.1  mrg 
    350      1.1  mrg (include "predicates.md")
    351      1.1  mrg 
    352      1.1  mrg ;; General predication pattern.
    353      1.1  mrg 
    354      1.1  mrg (define_cond_exec
    355      1.1  mrg   [(match_operator 0 "eqne_operator"
    356      1.1  mrg     [(match_operand 1 "predicate_register" "AB")
    357      1.1  mrg      (const_int 0)])]
    358      1.1  mrg   ""
    359      1.1  mrg   "")
    360      1.1  mrg 
    361      1.1  mrg ;; -------------------------------------------------------------------------
    362      1.1  mrg ;; NOP instruction
    363      1.1  mrg ;; -------------------------------------------------------------------------
    364      1.1  mrg 
    365      1.1  mrg (define_insn "nop"
    366      1.1  mrg   [(const_int 0)]
    367      1.1  mrg   ""
    368      1.1  mrg   "nop")
    369      1.1  mrg 
    370      1.1  mrg (define_insn "nop_count"
    371      1.1  mrg   [(unspec [(match_operand 0 "const_int_operand" "n")] UNSPEC_NOP)]
    372      1.1  mrg   ""
    373      1.1  mrg   "%|%.\\tnop\\t%0")
    374      1.1  mrg 
    375      1.1  mrg ;; -------------------------------------------------------------------------
    376      1.1  mrg ;; Move instructions
    377      1.1  mrg ;; -------------------------------------------------------------------------
    378      1.1  mrg 
    379      1.1  mrg (define_mode_iterator QIHIM [QI HI])
    380      1.1  mrg (define_mode_iterator SIDIM [SI DI])
    381      1.1  mrg (define_mode_iterator SIDIVM [SI DI V2HI V4QI])
    382      1.1  mrg (define_mode_iterator VEC4M [V2HI V4QI])
    383      1.1  mrg (define_mode_iterator VEC8M [V2SI V4HI V8QI])
    384      1.1  mrg (define_mode_iterator SISFVM [SI SF V2HI V4QI])
    385      1.1  mrg (define_mode_iterator DIDFM [DI DF])
    386      1.1  mrg (define_mode_iterator DIDFVM [DI DF V2SI V4HI V8QI])
    387      1.1  mrg (define_mode_iterator SFDFM [SF DF])
    388      1.1  mrg (define_mode_iterator M32 [QI HI SI SF V2HI V4QI])
    389      1.1  mrg 
    390      1.1  mrg ;; The C6X LO_SUM and HIGH are backwards - HIGH sets the low bits, and
    391      1.1  mrg ;; LO_SUM adds in the high bits.  Fortunately these are opaque operations
    392      1.1  mrg ;; so this does not matter.
    393      1.1  mrg (define_insn "movsi_lo_sum"
    394      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=ab")
    395      1.1  mrg 	(lo_sum:SI (match_operand:SI 1 "register_operand" "0")
    396      1.1  mrg 		   (match_operand:SI 2 "const_int_or_symbolic_operand" "i")))]
    397      1.1  mrg   "reload_completed"
    398      1.1  mrg   "%|%.\\tmvkh\\t%$\\t%2, %0"
    399      1.1  mrg   [(set_attr "units" "s")])
    400      1.1  mrg 
    401      1.1  mrg (define_insn "movsi_high"
    402      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=ab")
    403      1.1  mrg 	(high:SI (match_operand:SI 1 "const_int_or_symbolic_operand" "i")))]
    404      1.1  mrg   "reload_completed"
    405      1.1  mrg   "%|%.\\tmvkl\\t%$\\t%1, %0"
    406      1.1  mrg   [(set_attr "units" "s")])
    407      1.1  mrg 
    408      1.1  mrg (define_insn "movsi_gotoff_lo_sum"
    409      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=ab")
    410      1.1  mrg 	(lo_sum:SI (match_operand:SI 1 "register_operand" "0")
    411      1.1  mrg 		   (unspec:SI [(match_operand:SI 2 "symbolic_operand" "S2")]
    412      1.1  mrg 			      UNSPEC_GOTOFF)))]
    413      1.1  mrg   "flag_pic == 2"
    414      1.1  mrg   "%|%.\\tmvkh\\t%$\\t$dpr_got%2, %0"
    415      1.1  mrg   [(set_attr "units" "s")])
    416      1.1  mrg 
    417      1.1  mrg (define_insn "movsi_gotoff_high"
    418      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=ab")
    419      1.1  mrg 	(high:SI (unspec:SI [(match_operand:SI 1 "symbolic_operand" "S2")]
    420      1.1  mrg 			    UNSPEC_GOTOFF)))]
    421      1.1  mrg   "flag_pic == 2"
    422      1.1  mrg   "%|%.\\tmvkl\\t%$\\t$dpr_got%1, %0"
    423      1.1  mrg   [(set_attr "units" "s")])
    424      1.1  mrg 
    425      1.1  mrg ;; Normally we'd represent this as a normal load insn, but we can't currently
    426      1.1  mrg ;; represent the addressing mode.
    427      1.1  mrg (define_insn "load_got_gotoff"
    428      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b")
    429      1.1  mrg 	(unspec:SI [(match_operand:SI 1 "register_operand" "Z,Z")
    430      1.1  mrg 		    (match_operand:SI 2 "register_operand" "b,b")]
    431      1.1  mrg 		   UNSPEC_GOTOFF))]
    432      1.1  mrg   "flag_pic == 2"
    433      1.1  mrg   "%|%.\\tldw\\t%$\\t*+%1[%2], %0"
    434      1.1  mrg   [(set_attr "type" "load")
    435      1.1  mrg    (set_attr "units" "d_addr")
    436      1.1  mrg    (set_attr "op_pattern" "unknown")
    437      1.1  mrg    (set_attr "dest_regfile" "a,b")
    438      1.1  mrg    (set_attr "addr_regfile" "b")])
    439      1.1  mrg 
    440      1.1  mrg (define_insn "*movstricthi_high"
    441      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "+ab")
    442      1.1  mrg 	(ior:SI (and:SI (match_dup 0) (const_int 65535))
    443      1.1  mrg 		(ashift:SI (match_operand:SI 1 "const_int_operand" "IuB")
    444      1.1  mrg 			   (const_int 16))))]
    445      1.1  mrg   "reload_completed"
    446      1.1  mrg   "%|%.\\tmvklh\\t%$\\t%1, %0"
    447      1.1  mrg   [(set_attr "units" "s")])
    448      1.1  mrg 
    449      1.1  mrg ;; Break up SImode loads of immediate operands.
    450      1.1  mrg 
    451      1.1  mrg (define_split
    452      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
    453      1.1  mrg 	(match_operand:SI 1 "const_int_operand" ""))]
    454      1.1  mrg   "reload_completed
    455      1.1  mrg    && !satisfies_constraint_IsB (operands[1])"
    456      1.1  mrg   [(set (match_dup 0) (match_dup 2))
    457      1.1  mrg    (set (match_dup 0) (ior:SI (and:SI (match_dup 0) (const_int 65535))
    458      1.1  mrg 			      (ashift:SI (match_dup 3) (const_int 16))))]
    459      1.1  mrg {
    460      1.1  mrg   HOST_WIDE_INT val = INTVAL (operands[1]);
    461      1.1  mrg   operands[2] = GEN_INT (trunc_int_for_mode (val, HImode));
    462      1.1  mrg   operands[3] = GEN_INT ((val >> 16) & 65535);
    463      1.1  mrg })
    464      1.1  mrg 
    465      1.1  mrg (define_split
    466      1.1  mrg   [(set (match_operand:VEC4M 0 "register_operand" "")
    467      1.1  mrg 	(match_operand:VEC4M 1 "const_vector_operand" ""))]
    468      1.1  mrg   "reload_completed"
    469      1.1  mrg   [(set (match_dup 2) (match_dup 3))]
    470      1.1  mrg {
    471      1.1  mrg   unsigned HOST_WIDE_INT mask, val;
    472  1.1.1.2  mrg   machine_mode inner_mode = GET_MODE_INNER (<MODE>mode);
    473      1.1  mrg   int i;
    474      1.1  mrg 
    475      1.1  mrg   val = 0;
    476      1.1  mrg   mask = GET_MODE_MASK (inner_mode);
    477      1.1  mrg   if (TARGET_BIG_ENDIAN)
    478      1.1  mrg     {
    479      1.1  mrg       for (i = 0; i < GET_MODE_NUNITS (<MODE>mode); i++)
    480      1.1  mrg 	{
    481      1.1  mrg 	  val <<= GET_MODE_BITSIZE (inner_mode);
    482      1.1  mrg 	  val |= INTVAL (CONST_VECTOR_ELT (operands[1], i)) & mask;
    483      1.1  mrg 	}
    484      1.1  mrg     }
    485      1.1  mrg   else
    486      1.1  mrg     {
    487      1.1  mrg       i = GET_MODE_NUNITS (<MODE>mode);
    488      1.1  mrg       while (i-- > 0)
    489      1.1  mrg 	{
    490      1.1  mrg 	  val <<= GET_MODE_BITSIZE (inner_mode);
    491      1.1  mrg 	  val |= INTVAL (CONST_VECTOR_ELT (operands[1], i)) & mask;
    492      1.1  mrg 	}
    493      1.1  mrg     }
    494      1.1  mrg   operands[2] = gen_rtx_REG (SImode, REGNO (operands[0]));
    495      1.1  mrg   operands[3] = GEN_INT (trunc_int_for_mode (val, SImode));
    496      1.1  mrg })
    497      1.1  mrg 
    498      1.1  mrg (define_split
    499      1.1  mrg   [(set (match_operand:VEC8M 0 "register_operand" "")
    500      1.1  mrg 	(match_operand:VEC8M 1 "const_vector_operand" ""))]
    501      1.1  mrg   "reload_completed"
    502      1.1  mrg   [(set (match_dup 2) (match_dup 3))
    503      1.1  mrg    (set (match_dup 4) (match_dup 5))]
    504      1.1  mrg {
    505      1.1  mrg   unsigned HOST_WIDE_INT mask;
    506      1.1  mrg   unsigned HOST_WIDE_INT val[2];
    507      1.1  mrg   rtx lo_half, hi_half;
    508  1.1.1.2  mrg   machine_mode inner_mode = GET_MODE_INNER (<MODE>mode);
    509      1.1  mrg   int i, j;
    510      1.1  mrg 
    511      1.1  mrg   split_di (operands, 1, &lo_half, &hi_half);
    512      1.1  mrg 
    513      1.1  mrg   val[0] = val[1] = 0;
    514      1.1  mrg   mask = GET_MODE_MASK (inner_mode);
    515      1.1  mrg   if (TARGET_BIG_ENDIAN)
    516      1.1  mrg     {
    517      1.1  mrg       for (i = 0, j = 1; i < GET_MODE_NUNITS (<MODE>mode); i++)
    518      1.1  mrg 	{
    519      1.1  mrg 	  if (i * 2 == GET_MODE_NUNITS (<MODE>mode))
    520      1.1  mrg 	    j--;
    521      1.1  mrg 	  val[j] <<= GET_MODE_BITSIZE (inner_mode);
    522      1.1  mrg 	  val[j] |= INTVAL (CONST_VECTOR_ELT (operands[1], i)) & mask;
    523      1.1  mrg 	}
    524      1.1  mrg     }
    525      1.1  mrg   else
    526      1.1  mrg     {
    527      1.1  mrg       i = GET_MODE_NUNITS (<MODE>mode);
    528      1.1  mrg       j = 1;
    529      1.1  mrg       while (i-- > 0)
    530      1.1  mrg         {
    531      1.1  mrg 	  val[j] <<= GET_MODE_BITSIZE (inner_mode);
    532      1.1  mrg 	  val[j] |= INTVAL (CONST_VECTOR_ELT (operands[1], i)) & mask;
    533      1.1  mrg 	  if (i * 2 == GET_MODE_NUNITS (<MODE>mode))
    534      1.1  mrg 	    j--;
    535      1.1  mrg 	}
    536      1.1  mrg     }
    537      1.1  mrg   operands[2] = lo_half;
    538      1.1  mrg   operands[3] = GEN_INT (trunc_int_for_mode (val[0], SImode));
    539      1.1  mrg   operands[4] = hi_half;
    540      1.1  mrg   operands[5] = GEN_INT (trunc_int_for_mode (val[1], SImode));
    541      1.1  mrg })
    542      1.1  mrg 
    543      1.1  mrg (define_split
    544      1.1  mrg   [(set (match_operand:SF 0 "register_operand" "")
    545      1.1  mrg 	(match_operand:SF 1 "immediate_operand" ""))]
    546      1.1  mrg   "reload_completed"
    547      1.1  mrg   [(set (match_dup 2) (match_dup 3))
    548      1.1  mrg    (set (match_dup 2) (ior:SI (and:SI (match_dup 2) (const_int 65535))
    549      1.1  mrg 			      (ashift:SI (match_dup 4) (const_int 16))))]
    550      1.1  mrg {
    551      1.1  mrg   long values;
    552      1.1  mrg 
    553      1.1  mrg   gcc_assert (GET_CODE (operands[1]) == CONST_DOUBLE);
    554      1.1  mrg 
    555  1.1.1.3  mrg   REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (operands[1]), values);
    556      1.1  mrg 
    557      1.1  mrg   operands[2] = gen_rtx_REG (SImode, true_regnum (operands[0]));
    558      1.1  mrg   operands[3] = GEN_INT (trunc_int_for_mode (values, HImode));
    559      1.1  mrg   if (values >= -32768 && values < 32768)
    560      1.1  mrg     {
    561      1.1  mrg       emit_move_insn (operands[2], operands[3]);
    562      1.1  mrg       DONE;
    563      1.1  mrg     }
    564      1.1  mrg   operands[4] = GEN_INT ((values >> 16) & 65535);
    565      1.1  mrg })
    566      1.1  mrg 
    567      1.1  mrg (define_split
    568      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
    569      1.1  mrg 	(match_operand:SI 1 "symbolic_operand" ""))]
    570      1.1  mrg   "reload_completed
    571      1.1  mrg    && (!TARGET_INSNS_64PLUS
    572      1.1  mrg        || !sdata_symbolic_operand (operands[1], SImode))"
    573      1.1  mrg   [(set (match_dup 0) (high:SI (match_dup 1)))
    574      1.1  mrg    (set (match_dup 0) (lo_sum:SI (match_dup 0) (match_dup 1)))]
    575      1.1  mrg   "")
    576      1.1  mrg 
    577      1.1  mrg ;; Normally, we represent the load of an sdata address as a normal
    578      1.1  mrg ;; move of a SYMBOL_REF.  In DSBT mode, B14 is not constant, so we
    579      1.1  mrg ;; should show the dependency.
    580      1.1  mrg (define_insn "load_sdata_pic"
    581      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b")
    582      1.1  mrg 	(plus:SI (match_operand:SI 1 "pic_register_operand" "Z,Z")
    583      1.1  mrg 		 (unspec:SI [(match_operand:SI 2 "sdata_symbolic_operand" "S0,S0")]
    584      1.1  mrg 			    UNSPEC_LOAD_SDATA)))]
    585      1.1  mrg   "flag_pic"
    586      1.1  mrg   "@
    587      1.1  mrg    %|%.\\tadda%D2\\t%$\\t%1, %2, %0
    588      1.1  mrg    %|%.\\tadda%D2\\t%$\\t%1, %2, %0"
    589      1.1  mrg   [(set_attr "units" "d")
    590      1.1  mrg    (set_attr "cross" "y,n")
    591      1.1  mrg    (set_attr "op_pattern" "unknown")
    592      1.1  mrg    (set_attr "predicable" "no")])
    593      1.1  mrg 
    594      1.1  mrg ;; Move instruction patterns
    595      1.1  mrg 
    596      1.1  mrg (define_mode_attr LDST_SUFFIX [(QI "b") (HI "h")
    597      1.1  mrg 			       (SI "w") (SF "w") (V2HI "w") (V4QI "w")
    598      1.1  mrg 			       (DI "dw") (V2SI "dw") (V4HI "dw") (V8QI "dw")])
    599      1.1  mrg 
    600      1.1  mrg (define_insn "mov<mode>_insn"
    601      1.1  mrg  [(set (match_operand:QIHIM 0 "nonimmediate_operand"
    602      1.1  mrg         "=a,b, a, b, ab, ab,a,?a, b,?b, Q, R, R, Q")
    603      1.1  mrg        (match_operand:QIHIM 1 "general_operand"
    604      1.1  mrg          "a,b,?b,?a,Is5,IsB,Q, R, R, Q, a,?a, b,?b"))]
    605      1.1  mrg   "GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) == REG"
    606      1.1  mrg  "@
    607      1.1  mrg   %|%.\\tmv\\t%$\\t%1, %0
    608      1.1  mrg   %|%.\\tmv\\t%$\\t%1, %0
    609      1.1  mrg   %|%.\\tmv\\t%$\\t%1, %0
    610      1.1  mrg   %|%.\\tmv\\t%$\\t%1, %0
    611      1.1  mrg   %|%.\\tmvk\\t%$\\t%1, %0
    612      1.1  mrg   %|%.\\tmvk\\t%$\\t%1, %0
    613      1.1  mrg   %|%.\\tld<LDST_SUFFIX>\\t%$\\t%1, %0
    614      1.1  mrg   %|%.\\tld<LDST_SUFFIX>\\t%$\\t%1, %0
    615      1.1  mrg   %|%.\\tld<LDST_SUFFIX>\\t%$\\t%1, %0
    616      1.1  mrg   %|%.\\tld<LDST_SUFFIX>\\t%$\\t%1, %0
    617      1.1  mrg   %|%.\\tst<LDST_SUFFIX>\\t%$\\t%1, %0
    618      1.1  mrg   %|%.\\tst<LDST_SUFFIX>\\t%$\\t%1, %0
    619      1.1  mrg   %|%.\\tst<LDST_SUFFIX>\\t%$\\t%1, %0
    620      1.1  mrg   %|%.\\tst<LDST_SUFFIX>\\t%$\\t%1, %0"
    621      1.1  mrg   [(set_attr "type" "*,*,*,*,*,*,load,load,load,load,store,store,store,store")
    622      1.1  mrg    (set_attr "units62" "dls,dls,ls,ls,s,s,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr")
    623      1.1  mrg    (set_attr "units64" "dls,dls,ls,ls,dl,s,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr")
    624      1.1  mrg    (set_attr "op_pattern" "sx,sx,sx,sx,*,*,*,*,*,*,*,*,*,*")
    625      1.1  mrg    (set_attr "addr_regfile" "*,*,*,*,*,*,a,b,b,a,a,b,b,a")
    626      1.1  mrg    (set_attr "dest_regfile" "*,*,*,*,*,*,a,a,b,b,a,a,b,b")
    627      1.1  mrg    (set_attr "cross" "n,n,y,y,n,n,n,y,n,y,n,y,n,y")])
    628      1.1  mrg 
    629      1.1  mrg (define_insn "mov<mode>_insn"
    630      1.1  mrg  [(set (match_operand:SISFVM 0 "nonimmediate_operand"
    631      1.1  mrg         "=a,b, a, b, ab, ab,a,b,ab,a,?a, b,?b, Q, R, R, Q")
    632      1.1  mrg        (match_operand:SISFVM 1 "general_operand"
    633      1.1  mrg          "a,b,?b,?a,Is5,IsB,S0,S0,Si,Q, R, R, Q, a,?a, b,?b"))]
    634      1.1  mrg   "(GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) == REG
    635      1.1  mrg     || (GET_CODE (operands[1]) == SUBREG && REG_P (SUBREG_REG (operands[1]))))"
    636      1.1  mrg  "@
    637      1.1  mrg   %|%.\\tmv\\t%$\\t%1, %0
    638      1.1  mrg   %|%.\\tmv\\t%$\\t%1, %0
    639      1.1  mrg   %|%.\\tmv\\t%$\\t%1, %0
    640      1.1  mrg   %|%.\\tmv\\t%$\\t%1, %0
    641      1.1  mrg   %|%.\\tmvk\\t%$\\t%1, %0
    642      1.1  mrg   %|%.\\tmvk\\t%$\\t%1, %0
    643      1.1  mrg   %|%.\\tadda%D1\\t%$\\tB14, %1, %0
    644      1.1  mrg   %|%.\\tadda%D1\\t%$\\tB14, %1, %0
    645      1.1  mrg   #
    646      1.1  mrg   %|%.\\tldw\\t%$\\t%1, %0
    647      1.1  mrg   %|%.\\tldw\\t%$\\t%1, %0
    648      1.1  mrg   %|%.\\tldw\\t%$\\t%1, %0
    649      1.1  mrg   %|%.\\tldw\\t%$\\t%1, %0
    650      1.1  mrg   %|%.\\tstw\\t%$\\t%1, %0
    651      1.1  mrg   %|%.\\tstw\\t%$\\t%1, %0
    652      1.1  mrg   %|%.\\tstw\\t%$\\t%1, %0
    653      1.1  mrg   %|%.\\tstw\\t%$\\t%1, %0"
    654      1.1  mrg   [(set_attr "type" "*,*,*,*,*,*,*,*,*,load,load,load,load,store,store,store,store")
    655      1.1  mrg    (set_attr "units62" "dls,dls,ls,ls,s,s,d,d,*,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr")
    656      1.1  mrg    (set_attr "units64" "dls,dls,ls,ls,dl,s,d,d,*,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr")
    657      1.1  mrg    (set_attr "op_pattern" "sx,sx,sx,sx,*,*,*,*,*,*,*,*,*,*,*,*,*")
    658      1.1  mrg    (set_attr "addr_regfile" "*,*,*,*,*,*,*,*,*,a,b,b,a,a,b,b,a")
    659      1.1  mrg    (set_attr "dest_regfile" "*,*,*,*,*,*,*,*,*,a,a,b,b,a,a,b,b")
    660      1.1  mrg    (set_attr "cross" "n,n,y,y,n,n,y,n,*,n,y,n,y,n,y,n,y")
    661      1.1  mrg    (set_attr "predicable" "yes,yes,yes,yes,yes,yes,no,no,yes,yes,yes,yes,yes,yes,yes,yes,yes")])
    662      1.1  mrg 
    663      1.1  mrg (define_insn "*mov<mode>_insn"
    664      1.1  mrg   [(set (match_operand:DIDFVM 0 "nonimmediate_operand"
    665      1.1  mrg          "=a,b, a, b,ab,a,?a, b,?b, Q, R, R, Q")
    666      1.1  mrg         (match_operand:DIDFVM 1 "general_operand"
    667      1.1  mrg           "a,b,?b,?a,iF,Q, R, R, Q, a,?a, b,?b"))]
    668      1.1  mrg   "(!MEM_P (operands[0]) || REG_P (operands[1])
    669      1.1  mrg     || (GET_CODE (operands[1]) == SUBREG && REG_P (SUBREG_REG (operands[1]))))"
    670      1.1  mrg {
    671      1.1  mrg   if (MEM_P (operands[1]) && TARGET_LDDW)
    672      1.1  mrg     return "%|%.\\tlddw\\t%$\\t%1, %0";
    673      1.1  mrg   if (MEM_P (operands[0]) && TARGET_STDW)
    674      1.1  mrg     return "%|%.\\tstdw\\t%$\\t%1, %0";
    675      1.1  mrg   if (TARGET_INSNS_64PLUS && REG_P (operands[0]) && REG_P (operands[1])
    676      1.1  mrg       && A_REGNO_P (REGNO (operands[0])) == A_REGNO_P (REGNO (operands[1])))
    677      1.1  mrg     return "%|%.\\tdmv\\t%$\\t%P1, %p1, %0";
    678      1.1  mrg   return "#";
    679      1.1  mrg }
    680      1.1  mrg   [(set_attr "units" "s,s,*,*,*,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr,d_addr")
    681      1.1  mrg    (set_attr "addr_regfile" "*,*,*,*,*,a,b,b,a,a,b,b,a")
    682      1.1  mrg    (set_attr "dest_regfile" "*,*,*,*,*,a,a,b,b,a,a,b,b")
    683      1.1  mrg    (set_attr "type" "*,*,*,*,*,load,load,load,load,store,store,store,store")
    684      1.1  mrg    (set_attr "cross" "n,n,y,y,*,n,y,n,y,n,y,n,y")])
    685      1.1  mrg 
    686      1.1  mrg (define_split
    687      1.1  mrg   [(set (match_operand:DIDFVM 0 "nonimmediate_operand" "")
    688      1.1  mrg   	(match_operand:DIDFVM 1 "general_operand" ""))]
    689      1.1  mrg   "reload_completed
    690      1.1  mrg    && !((MEM_P (operands[0]) && TARGET_STDW)
    691      1.1  mrg  	|| (MEM_P (operands[1]) && TARGET_LDDW))
    692      1.1  mrg    && !const_vector_operand (operands[1], <MODE>mode)
    693      1.1  mrg    && !(TARGET_INSNS_64PLUS && REG_P (operands[0]) && REG_P (operands[1])
    694      1.1  mrg 	&& A_REGNO_P (REGNO (operands[0])) == A_REGNO_P (REGNO (operands[1])))"
    695      1.1  mrg   [(set (match_dup 2) (match_dup 3))
    696      1.1  mrg    (set (match_dup 4) (match_dup 5))]
    697      1.1  mrg {
    698      1.1  mrg   rtx lo_half[2], hi_half[2];
    699      1.1  mrg   split_di (operands, 2, lo_half, hi_half);
    700      1.1  mrg 
    701      1.1  mrg   /* We can't have overlap for a register-register move, but if
    702      1.1  mrg      memory is involved, we have to make sure we don't clobber the
    703      1.1  mrg      address.  */
    704      1.1  mrg   if (reg_overlap_mentioned_p (lo_half[0], hi_half[1]))
    705      1.1  mrg     {
    706      1.1  mrg       operands[2] = hi_half[0];
    707      1.1  mrg       operands[3] = hi_half[1];
    708      1.1  mrg       operands[4] = lo_half[0];
    709      1.1  mrg       operands[5] = lo_half[1];
    710      1.1  mrg     }
    711      1.1  mrg   else
    712      1.1  mrg     {
    713      1.1  mrg       operands[2] = lo_half[0];
    714      1.1  mrg       operands[3] = lo_half[1];
    715      1.1  mrg       operands[4] = hi_half[0];
    716      1.1  mrg       operands[5] = hi_half[1];
    717      1.1  mrg     }
    718      1.1  mrg })
    719      1.1  mrg 
    720      1.1  mrg (define_insn "real_load<mode>"
    721      1.1  mrg   [(unspec [(match_operand 0 "const_int_operand" "JA,JA,JB,JB")
    722      1.1  mrg 	    (match_operand:M32 1 "memory_operand" "Q,R,R,Q")]
    723      1.1  mrg 	   UNSPEC_REAL_LOAD)]
    724      1.1  mrg   ""
    725      1.1  mrg   "%|%.\\tld<LDST_SUFFIX>\\t%$\\t%1, %k0"
    726      1.1  mrg   [(set_attr "type" "load")
    727      1.1  mrg    (set_attr "units" "d_addr")
    728      1.1  mrg    (set_attr "addr_regfile" "a,b,b,a")
    729      1.1  mrg    (set_attr "dest_regfile" "a,a,b,b")
    730      1.1  mrg    (set_attr "cross" "n,y,n,y")])
    731      1.1  mrg 
    732      1.1  mrg (define_insn "real_load<mode>"
    733      1.1  mrg   [(unspec [(match_operand 0 "const_int_operand" "JA,JA,JB,JB")
    734      1.1  mrg 	    (match_operand:DIDFVM 1 "memory_operand" "Q,R,R,Q")]
    735      1.1  mrg 	   UNSPEC_REAL_LOAD)]
    736      1.1  mrg   "TARGET_LDDW"
    737      1.1  mrg   "%|%.\\tlddw\\t%$\\t%1, %K0"
    738      1.1  mrg   [(set_attr "type" "load")
    739      1.1  mrg    (set_attr "units" "d_addr")
    740      1.1  mrg    (set_attr "addr_regfile" "a,b,b,a")
    741      1.1  mrg    (set_attr "dest_regfile" "a,a,b,b")
    742      1.1  mrg    (set_attr "cross" "n,y,n,y")])
    743      1.1  mrg 
    744      1.1  mrg (define_insn "load_shadow"
    745      1.1  mrg   [(set (match_operand 0 "register_operand" "=ab")
    746      1.1  mrg  	(unspec [(pc)] UNSPEC_LOAD_SHADOW))]
    747      1.1  mrg   ""
    748      1.1  mrg   ";; load to %0 occurs"
    749      1.1  mrg   [(set_attr "type" "load_shadow")])
    750      1.1  mrg 
    751      1.1  mrg (define_insn "mult_shadow"
    752      1.1  mrg   [(set (match_operand 0 "register_operand" "=ab")
    753      1.1  mrg  	(unspec [(pc)] UNSPEC_MULT_SHADOW))]
    754      1.1  mrg   ""
    755      1.1  mrg   ";; multiplication occurs and stores to %0"
    756      1.1  mrg   [(set_attr "type" "mult_shadow")])
    757      1.1  mrg 
    758      1.1  mrg 
    759      1.1  mrg (define_mode_iterator MOV [QI HI SI SF DI DF V2HI V4QI V2SI V4HI V8QI])
    760      1.1  mrg 
    761      1.1  mrg (define_expand "mov<mode>"
    762      1.1  mrg   [(set (match_operand:MOV 0 "nonimmediate_operand" "")
    763      1.1  mrg 	(match_operand:MOV 1 "general_operand" ""))]
    764      1.1  mrg   ""
    765      1.1  mrg {
    766      1.1  mrg   if (expand_move (operands, <MODE>mode))
    767      1.1  mrg     DONE;
    768      1.1  mrg })
    769      1.1  mrg 
    770      1.1  mrg (define_expand "movmisalign<mode>"
    771      1.1  mrg   [(set (match_operand:SIDIVM 0 "nonimmediate_operand"	      "")
    772      1.1  mrg 	(unspec:SIDIVM [(match_operand:SIDIVM 1 "nonimmediate_operand" "")]
    773      1.1  mrg 		       UNSPEC_MISALIGNED_ACCESS))]
    774      1.1  mrg   "TARGET_INSNS_64"
    775      1.1  mrg {
    776  1.1.1.2  mrg   if (MEM_P (operands[0]))
    777      1.1  mrg     {
    778      1.1  mrg       emit_insn (gen_movmisalign<mode>_store (operands[0], operands[1]));
    779      1.1  mrg       DONE;
    780      1.1  mrg     }
    781      1.1  mrg })
    782      1.1  mrg 
    783      1.1  mrg (define_insn_and_split "movmisalign<mode>_store"
    784      1.1  mrg   [(set (match_operand:SIDIVM 0 "memory_operand" "=W,Q,T,Q,T")
    785      1.1  mrg 	(unspec:SIDIVM [(match_operand:SIDIVM 1 "register_operand" "r,a,b,b,a")]
    786      1.1  mrg 		       UNSPEC_MISALIGNED_ACCESS))
    787      1.1  mrg    (clobber (match_scratch:SI 2 "=r,X,X,X,X"))]
    788      1.1  mrg   "TARGET_INSNS_64"
    789      1.1  mrg   "@
    790      1.1  mrg    #
    791      1.1  mrg    %|%.\\tstn<LDST_SUFFIX>\\t%$\\t%1, %0
    792      1.1  mrg    %|%.\\tstn<LDST_SUFFIX>\\t%$\\t%1, %0
    793      1.1  mrg    %|%.\\tstn<LDST_SUFFIX>\\t%$\\t%1, %0
    794      1.1  mrg    %|%.\\tstn<LDST_SUFFIX>\\t%$\\t%1, %0"
    795      1.1  mrg   "&& reload_completed && satisfies_constraint_W (operands[0])"
    796      1.1  mrg   [(parallel
    797      1.1  mrg     [(set (match_dup 3) (unspec:SIDIVM [(match_dup 1)] UNSPEC_MISALIGNED_ACCESS))
    798      1.1  mrg      (clobber (match_dup 4))])]
    799      1.1  mrg {
    800      1.1  mrg   rtx addr = XEXP (operands[0], 0);
    801      1.1  mrg   rtx tmpreg = operands[2];
    802      1.1  mrg 
    803      1.1  mrg   if (GET_CODE (addr) == PLUS && XEXP (addr, 0) == stack_pointer_rtx
    804      1.1  mrg       && GET_CODE (XEXP (addr, 1)) == CONST_INT)
    805      1.1  mrg     {
    806      1.1  mrg       unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
    807      1.1  mrg       val &= GET_MODE_SIZE (<MODE>mode) - 1;
    808      1.1  mrg       if (val == 0)
    809      1.1  mrg 	{
    810      1.1  mrg 	  emit_move_insn (operands[0], operands[1]);
    811      1.1  mrg 	  DONE;
    812      1.1  mrg 	}
    813      1.1  mrg     }
    814      1.1  mrg   operands[3] = change_address (operands[0], <MODE>mode, tmpreg);
    815      1.1  mrg   emit_move_insn (tmpreg, addr);
    816      1.1  mrg   operands[4] = gen_rtx_SCRATCH (SImode);
    817      1.1  mrg }
    818      1.1  mrg   [(set_attr "type" "storen")
    819      1.1  mrg    (set_attr "units" "d_addr")
    820      1.1  mrg    (set_attr "addr_regfile" "*,a,b,a,b")
    821      1.1  mrg    (set_attr "dest_regfile" "*,a,b,b,a")
    822      1.1  mrg    (set_attr "cross" "*,n,n,y,y")])
    823      1.1  mrg 
    824      1.1  mrg (define_insn_and_split "movmisalign<mode>_load"
    825      1.1  mrg   [(set (match_operand:SIDIVM 0 "register_operand" "=ab,a,b,b,a")
    826      1.1  mrg 	(unspec:SIDIVM [(match_operand:SIDIVM 1 "memory_operand" "W,Q,T,Q,T")]
    827      1.1  mrg 		       UNSPEC_MISALIGNED_ACCESS))]
    828      1.1  mrg   "TARGET_INSNS_64"
    829      1.1  mrg   "@
    830      1.1  mrg    #
    831      1.1  mrg    %|%.\\tldn<LDST_SUFFIX>\\t%$\\t%1, %0
    832      1.1  mrg    %|%.\\tldn<LDST_SUFFIX>\\t%$\\t%1, %0
    833      1.1  mrg    %|%.\\tldn<LDST_SUFFIX>\\t%$\\t%1, %0
    834      1.1  mrg    %|%.\\tldn<LDST_SUFFIX>\\t%$\\t%1, %0"
    835      1.1  mrg   "&& reload_completed && satisfies_constraint_W (operands[1])"
    836      1.1  mrg   [(set (match_dup 0) (unspec:SIDIVM [(match_dup 2)] UNSPEC_MISALIGNED_ACCESS))]
    837      1.1  mrg {
    838      1.1  mrg   rtx addr = XEXP (operands[1], 0);
    839      1.1  mrg   rtx tmpreg = (GET_MODE (operands[0]) == SImode ? operands[0]
    840      1.1  mrg 		: operand_subword_force (operands[0], 0, DImode));
    841      1.1  mrg 
    842      1.1  mrg   if (GET_CODE (addr) == PLUS && XEXP (addr, 0) == stack_pointer_rtx
    843      1.1  mrg       && GET_CODE (XEXP (addr, 1)) == CONST_INT)
    844      1.1  mrg     {
    845      1.1  mrg       unsigned HOST_WIDE_INT val = INTVAL (XEXP (addr, 1));
    846      1.1  mrg       val &= GET_MODE_SIZE (<MODE>mode) - 1;
    847      1.1  mrg       if (val == 0)
    848      1.1  mrg 	{
    849      1.1  mrg 	  emit_move_insn (operands[0], operands[1]);
    850      1.1  mrg 	  DONE;
    851      1.1  mrg 	}
    852      1.1  mrg     }
    853      1.1  mrg   operands[2] = change_address (operands[1], <MODE>mode, tmpreg);
    854      1.1  mrg   emit_move_insn (tmpreg, addr);
    855      1.1  mrg }
    856      1.1  mrg   [(set_attr "type" "loadn")
    857      1.1  mrg    (set_attr "units" "d_addr")
    858      1.1  mrg    (set_attr "addr_regfile" "*,a,b,a,b")
    859      1.1  mrg    (set_attr "dest_regfile" "*,a,b,b,a")
    860      1.1  mrg    (set_attr "cross" "*,n,n,y,y")])
    861      1.1  mrg 
    862      1.1  mrg ;;
    863      1.1  mrg 
    864      1.1  mrg ;; -------------------------------------------------------------------------
    865      1.1  mrg ;; Extensions/extractions
    866      1.1  mrg ;; -------------------------------------------------------------------------
    867      1.1  mrg 
    868      1.1  mrg (define_code_iterator any_extract [zero_extract sign_extract])
    869      1.1  mrg (define_code_iterator any_ext [zero_extend sign_extend])
    870      1.1  mrg 
    871      1.1  mrg (define_code_attr ext_name [(zero_extend "zero_extend") (sign_extend "sign_extend")])
    872      1.1  mrg 
    873      1.1  mrg (define_code_attr u [(zero_extend "u") (sign_extend "")])
    874      1.1  mrg 
    875      1.1  mrg (define_code_attr z [(zero_extract "z") (sign_extract "")])
    876      1.1  mrg (define_code_attr zu [(zero_extract "u") (sign_extract "")])
    877      1.1  mrg 
    878      1.1  mrg (define_mode_attr ext_shift [(QI "24") (HI "16")])
    879      1.1  mrg 
    880      1.1  mrg (define_insn "<ext_name><mode>si2"
    881      1.1  mrg  [(set (match_operand:SI 0 "register_operand" "=a,b,a,?a, b,?b")
    882      1.1  mrg        (any_ext:SI (match_operand:QIHIM 1 "nonimmediate_operand" "a,b,Q, R, R, Q")))]
    883      1.1  mrg   ""
    884      1.1  mrg  "@
    885      1.1  mrg   %|%.\\text<u>\\t%$\\t%1, <ext_shift>, <ext_shift>, %0
    886      1.1  mrg   %|%.\\text<u>\\t%$\\t%1, <ext_shift>, <ext_shift>, %0
    887      1.1  mrg   %|%.\\tld<LDST_SUFFIX><u>\\t%$\\t%1, %0
    888      1.1  mrg   %|%.\\tld<LDST_SUFFIX><u>\\t%$\\t%1, %0
    889      1.1  mrg   %|%.\\tld<LDST_SUFFIX><u>\\t%$\\t%1, %0
    890      1.1  mrg   %|%.\\tld<LDST_SUFFIX><u>\\t%$\\t%1, %0"
    891      1.1  mrg   [(set_attr "type" "*,*,load,load,load,load")
    892      1.1  mrg    (set_attr "units" "s,s,d_addr,d_addr,d_addr,d_addr")
    893      1.1  mrg    (set_attr "addr_regfile" "*,*,a,b,b,a")
    894      1.1  mrg    (set_attr "dest_regfile" "*,*,a,a,b,b")
    895      1.1  mrg    (set_attr "cross" "n,n,n,y,n,y")])
    896      1.1  mrg 
    897      1.1  mrg (define_insn "*ext<z>v_const"
    898      1.1  mrg   [(set (match_operand:SI 0 "nonimmediate_operand" "=a,b")
    899      1.1  mrg 	(any_extract:SI (match_operand:SI 1 "register_operand" "a,b")
    900      1.1  mrg 			(match_operand:SI 2 "const_int_operand" "n,n")
    901      1.1  mrg 			(match_operand:SI 3 "const_int_operand" "n,n")))]
    902      1.1  mrg   "INTVAL (operands[3]) >= 0
    903      1.1  mrg    && INTVAL (operands[2]) + INTVAL (operands[3]) <= 32"
    904      1.1  mrg {
    905      1.1  mrg   int pos = INTVAL (operands[3]);
    906      1.1  mrg   int len = INTVAL (operands[2]);
    907      1.1  mrg   rtx xop[4];
    908      1.1  mrg   xop[0] = operands[0];
    909      1.1  mrg   xop[1] = operands[1];
    910      1.1  mrg   xop[2] = GEN_INT (32 - pos - len);
    911      1.1  mrg   xop[3] = GEN_INT (32 - len);
    912      1.1  mrg 
    913      1.1  mrg   output_asm_insn ("%|%.\\text<zu>\\t%$\\t%1, %2, %3, %0", xop);
    914      1.1  mrg   return "";
    915      1.1  mrg }
    916      1.1  mrg   [(set_attr "units" "s")
    917      1.1  mrg    (set_attr "cross" "n")])
    918      1.1  mrg 
    919      1.1  mrg (define_expand "ext<z>v"
    920      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
    921      1.1  mrg 	(any_extract:SI (match_operand:SI 1 "register_operand" "")
    922      1.1  mrg 			(match_operand:SI 2 "const_int_operand" "")
    923      1.1  mrg 			(match_operand:SI 3 "const_int_operand" "")))]
    924      1.1  mrg   ""
    925      1.1  mrg {
    926      1.1  mrg    if (INTVAL (operands[2]) < 0
    927      1.1  mrg        || INTVAL (operands[2]) + INTVAL (operands[3]) > 32)
    928      1.1  mrg      FAIL;
    929      1.1  mrg })
    930      1.1  mrg 
    931      1.1  mrg (define_insn "real_<ext_name><mode>"
    932      1.1  mrg   [(unspec [(match_operand 0 "const_int_operand" "JA,JA,JB,JB")
    933      1.1  mrg 	    (any_ext:SI (match_operand:QIHIM 1 "memory_operand" "Q,R,R,Q"))]
    934      1.1  mrg 	   UNSPEC_REAL_LOAD)]
    935      1.1  mrg   ""
    936      1.1  mrg   "%|%.\\tld<LDST_SUFFIX><u>\\t%$\\t%1, %k0"
    937      1.1  mrg   [(set_attr "type" "load")
    938      1.1  mrg    (set_attr "units" "d_addr")
    939      1.1  mrg    (set_attr "addr_regfile" "a,b,b,a")
    940      1.1  mrg    (set_attr "dest_regfile" "a,a,b,b")
    941      1.1  mrg    (set_attr "cross" "n,y,n,y")])
    942      1.1  mrg 
    943      1.1  mrg (define_insn "clrr"
    944      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
    945      1.1  mrg 	(unspec:SI [(match_operand:SI 1 "register_operand" "0,0,0,0")
    946      1.1  mrg 		    (match_operand:SI 2 "register_operand" "a,b,?b,?a")
    947      1.1  mrg 		    (match_operand:SI 3 "reg_or_const_int_operand" "ai,bi,a,b")]
    948      1.1  mrg 		   UNSPEC_CLR))]
    949      1.1  mrg   ""
    950      1.1  mrg {
    951      1.1  mrg   if (CONST_INT_P (operands[2]))
    952      1.1  mrg     {
    953      1.1  mrg       rtx xops[4];
    954      1.1  mrg       int v1 = INTVAL (operands[2]);
    955      1.1  mrg       int v2 = (v1 >> 5) & 0x1f;
    956      1.1  mrg       v1 &= 0x1f;
    957      1.1  mrg       xops[0] = operands[0];
    958      1.1  mrg       xops[1] = operands[1];
    959      1.1  mrg       xops[2] = GEN_INT (v1);
    960      1.1  mrg       xops[3] = GEN_INT (v2);
    961      1.1  mrg       output_asm_insn ("%|%.\\tclr\\t%$\\t%1, %3, %2, %0", xops);
    962      1.1  mrg       return "";
    963      1.1  mrg     }
    964      1.1  mrg   return "%|%.\\tclr\\t%$\\t%2, %3, %0";
    965      1.1  mrg }
    966      1.1  mrg   [(set_attr "units" "s")
    967      1.1  mrg    (set_attr "cross" "n,n,y,y")])
    968      1.1  mrg 
    969      1.1  mrg (define_insn "extr"
    970      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
    971      1.1  mrg 	(unspec:SI [(match_operand:SI 1 "register_operand" "a,b,?b,?a")
    972      1.1  mrg 		    (match_operand:SI 2 "reg_or_const_int_operand" "ai,bi,a,b")]
    973      1.1  mrg 		   UNSPEC_EXT))]
    974      1.1  mrg   ""
    975      1.1  mrg {
    976      1.1  mrg   if (CONST_INT_P (operands[2]))
    977      1.1  mrg     {
    978      1.1  mrg       rtx xops[4];
    979      1.1  mrg       int v1 = INTVAL (operands[2]);
    980      1.1  mrg       int v2 = (v1 >> 5) & 0x1f;
    981      1.1  mrg       v1 &= 0x1f;
    982      1.1  mrg       xops[0] = operands[0];
    983      1.1  mrg       xops[1] = operands[1];
    984      1.1  mrg       xops[2] = GEN_INT (v1);
    985      1.1  mrg       xops[3] = GEN_INT (v2);
    986      1.1  mrg       output_asm_insn ("%|%.\\text\\t%$\\t%1, %3, %2, %0", xops);
    987      1.1  mrg       return "";
    988      1.1  mrg     }
    989      1.1  mrg   return "%|%.\\text\\t%$\\t%1, %2, %0";
    990      1.1  mrg }
    991      1.1  mrg   [(set_attr "units" "s")
    992      1.1  mrg    (set_attr "cross" "n,n,y,y")])
    993      1.1  mrg 
    994      1.1  mrg (define_insn "extru"
    995      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
    996      1.1  mrg 	(unspec:SI [(match_operand:SI 1 "register_operand" "a,b,?b,?a")
    997      1.1  mrg 		    (match_operand:SI 2 "reg_or_const_int_operand" "ai,bi,a,b")]
    998      1.1  mrg 		   UNSPEC_EXTU))]
    999      1.1  mrg   ""
   1000      1.1  mrg {
   1001      1.1  mrg   if (CONST_INT_P (operands[2]))
   1002      1.1  mrg     {
   1003      1.1  mrg       rtx xops[4];
   1004      1.1  mrg       int v1 = INTVAL (operands[2]);
   1005      1.1  mrg       int v2 = (v1 >> 5) & 0x1f;
   1006      1.1  mrg       v1 &= 0x1f;
   1007      1.1  mrg       xops[0] = operands[0];
   1008      1.1  mrg       xops[1] = operands[1];
   1009      1.1  mrg       xops[2] = GEN_INT (v1);
   1010      1.1  mrg       xops[3] = GEN_INT (v2);
   1011      1.1  mrg       output_asm_insn ("%|%.\\textu\\t%$\\t%1, %3, %2, %0", xops);
   1012      1.1  mrg       return "";
   1013      1.1  mrg     }
   1014      1.1  mrg   return "%|%.\\textu\\t%$\\t%1, %2, %0";
   1015      1.1  mrg }
   1016      1.1  mrg   [(set_attr "units" "s")
   1017      1.1  mrg    (set_attr "cross" "n,y,n,y")])
   1018      1.1  mrg 
   1019      1.1  mrg ;; -------------------------------------------------------------------------
   1020      1.1  mrg ;; Compare instructions
   1021      1.1  mrg ;; -------------------------------------------------------------------------
   1022      1.1  mrg 
   1023      1.1  mrg (define_insn "scmpsi_insn"
   1024      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=ab,a,b,a,b")
   1025      1.1  mrg 	(match_operator:SI 1 "eqltgt_operator"
   1026      1.1  mrg 	   [(match_operand:SI 2 "register_operand" "ab,a,b,?b,?a")
   1027      1.1  mrg 	    (match_operand:SI 3 "reg_or_scst5_operand" "Is5,aIs5,bIs5,aIs5,bIs5")]))]
   1028      1.1  mrg   ""
   1029      1.1  mrg   "%|%.\\tcmp%C1\\t%$\\t%3, %2, %0"
   1030      1.1  mrg   [(set_attr "units" "l")
   1031      1.1  mrg    (set (attr "cross")
   1032      1.1  mrg 	(symbol_ref "CROSS_OPERANDS (operands[0], operands[2])"))])
   1033      1.1  mrg 
   1034      1.1  mrg (define_insn "*ucmpsi_insn_64"
   1035      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=ab,a,b,a,b")
   1036      1.1  mrg 	(match_operator:SI 1 "ltugtu_operator"
   1037      1.1  mrg 	   [(match_operand:SI 2 "register_operand" "ab,a,b,?b,?a")
   1038      1.1  mrg 	    (match_operand:SI 3 "reg_or_ucst5_operand" "Iu5,aIu5,bIu5,aIu5,bIu5")]))]
   1039      1.1  mrg   "TARGET_INSNS_64"
   1040      1.1  mrg   "%|%.\\tcmp%C1\\t%$\\t%3, %2, %0"
   1041      1.1  mrg   [(set_attr "units" "l")
   1042      1.1  mrg    (set (attr "cross")
   1043      1.1  mrg 	(symbol_ref "CROSS_OPERANDS (operands[0], operands[2])"))])
   1044      1.1  mrg 
   1045      1.1  mrg (define_insn "*ucmpsi_insn"
   1046      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=ab,a,b,a,b")
   1047      1.1  mrg 	(match_operator:SI 1 "ltugtu_operator"
   1048      1.1  mrg 	   [(match_operand:SI 2 "register_operand" "ab,a,b,?b,?a")
   1049      1.1  mrg 	    (match_operand:SI 3 "reg_or_ucst4_operand" "Iu4,aIu4,bIu4,aIu4,bIu4")]))]
   1050      1.1  mrg   "!TARGET_INSNS_64"
   1051      1.1  mrg   "%|%.\\tcmp%C1\\t%$\\t%3, %2, %0"
   1052      1.1  mrg   [(set_attr "units" "l")
   1053      1.1  mrg    (set (attr "cross")
   1054      1.1  mrg 	(symbol_ref "CROSS_OPERANDS (operands[0], operands[2])"))])
   1055      1.1  mrg 
   1056      1.1  mrg (define_code_iterator andior_eqne [eq ne])
   1057      1.1  mrg (define_code_attr andior_name [(eq "and") (ne "ior")])
   1058      1.1  mrg (define_code_attr andior_condmod [(eq "") (ne "!")])
   1059      1.1  mrg 
   1060      1.1  mrg (define_insn "*scmpsi_<andior_name>_insn"
   1061      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=A,B,A,B")
   1062      1.1  mrg 	(if_then_else:SI
   1063      1.1  mrg 	 (andior_eqne:SI (match_operand:SI 4 "register_operand" "0,0,0,0")
   1064      1.1  mrg 			 (const_int 0))
   1065      1.1  mrg 	 (match_dup 4)
   1066      1.1  mrg 	 (match_operator:SI 1 "eqltgt_operator"
   1067      1.1  mrg 	  [(match_operand:SI 2 "register_operand" "a,b,?b,?a")
   1068      1.1  mrg 	   (match_operand:SI 3 "reg_or_scst5_operand" "aIs5,bIs5,aIs5,bIs5")])))]
   1069      1.1  mrg   ""
   1070      1.1  mrg   "%|[<andior_condmod>%4]\\tcmp%C1\\t%$\\t%3, %2, %0"
   1071      1.1  mrg   [(set_attr "units" "l")
   1072      1.1  mrg    (set_attr "cross" "n,n,y,y")
   1073      1.1  mrg    (set_attr "predicable" "no")])
   1074      1.1  mrg 
   1075      1.1  mrg (define_insn "*ucmpsi_<andior_name>_insn_64"
   1076      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=A,B,A,B")
   1077      1.1  mrg 	(if_then_else:SI
   1078      1.1  mrg 	 (andior_eqne:SI (match_operand:SI 4 "register_operand" "0,0,0,0")
   1079      1.1  mrg 			 (const_int 0))
   1080      1.1  mrg 	 (match_dup 4)
   1081      1.1  mrg 	 (match_operator:SI 1 "ltugtu_operator"
   1082      1.1  mrg 	  [(match_operand:SI 2 "register_operand" "a,b,?b,?a")
   1083      1.1  mrg 	   (match_operand:SI 3 "reg_or_ucst5_operand" "aIu5,bIu5,aIu5,bIu5")])))]
   1084      1.1  mrg   "TARGET_INSNS_64"
   1085      1.1  mrg   "%|[<andior_condmod>%4]\\tcmp%C1\\t%$\\t%3, %2, %0"
   1086      1.1  mrg   [(set_attr "units" "l")
   1087      1.1  mrg    (set_attr "cross" "n,n,y,y")
   1088      1.1  mrg    (set_attr "predicable" "no")])
   1089      1.1  mrg 
   1090      1.1  mrg (define_insn "*ucmpsi_<andior_name>_insn"
   1091      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=A,B,A,B")
   1092      1.1  mrg 	(if_then_else:SI
   1093      1.1  mrg 	 (andior_eqne:SI (match_operand:SI 4 "register_operand" "0,0,0,0")
   1094      1.1  mrg 			 (const_int 0))
   1095      1.1  mrg 	 (match_dup 4)
   1096      1.1  mrg 	 (match_operator:SI 1 "ltugtu_operator"
   1097      1.1  mrg 	  [(match_operand:SI 2 "register_operand" "a,b,?b,?a")
   1098      1.1  mrg 	   (match_operand:SI 3 "reg_or_ucst4_operand" "aIu4,bIu4,aIu4,bIu4")])))]
   1099      1.1  mrg   "!TARGET_INSNS_64"
   1100      1.1  mrg   "%|[<andior_condmod>%4]\\tcmp%C1\\t%$\\t%3, %2, %0"
   1101      1.1  mrg   [(set_attr "units" "l")
   1102      1.1  mrg    (set_attr "cross" "n,n,y,y")
   1103      1.1  mrg    (set_attr "predicable" "no")])
   1104      1.1  mrg 
   1105      1.1  mrg (define_expand "cmpsi_<andior_name>"
   1106      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
   1107      1.1  mrg 	(if_then_else:SI
   1108      1.1  mrg 	 (andior_eqne:SI (match_operand:SI 4 "register_operand" "0,0,0,0")
   1109      1.1  mrg 			 (const_int 0))
   1110      1.1  mrg 	 (match_dup 4)
   1111      1.1  mrg 	 (match_operator:SI 1 "c6x_comparison_operator"
   1112      1.1  mrg 	  [(match_operand:SI 2 "register_operand" "")
   1113      1.1  mrg 	   (match_operand:SI 3 "reg_or_const_int_operand" "")])))]
   1114      1.1  mrg   ""
   1115      1.1  mrg {
   1116      1.1  mrg   if (c6x_force_op_for_comparison_p (GET_CODE (operands[1]), operands[3]))
   1117      1.1  mrg     operands[3] = force_reg (SImode, operands[3]);
   1118      1.1  mrg })
   1119      1.1  mrg 
   1120      1.1  mrg (define_insn "*cmpsf_insn"
   1121      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
   1122      1.1  mrg 	(match_operator:SI 1 "eqltgt_operator"
   1123      1.1  mrg 	   [(match_operand:SF 2 "register_operand" "a,b,a,b")
   1124      1.1  mrg 	    (match_operand:SF 3 "register_operand" "a,b,?b,?a")]))]
   1125      1.1  mrg   "TARGET_FP"
   1126      1.1  mrg   "%|%.\\tcmp%c1sp\\t%$\\t%2, %3, %0"
   1127      1.1  mrg   [(set_attr "units" "s")
   1128      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   1129      1.1  mrg 
   1130      1.1  mrg (define_insn "*cmpdf_insn"
   1131      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
   1132      1.1  mrg 	(match_operator:SI 1 "eqltgt_operator"
   1133      1.1  mrg 	   [(match_operand:DF 2 "register_operand" "a,b,a,b")
   1134      1.1  mrg 	    (match_operand:DF 3 "register_operand" "a,b,?b,?a")]))]
   1135      1.1  mrg   "TARGET_FP"
   1136      1.1  mrg   "%|%.\\tcmp%c1dp\\t%$\\t%2, %3, %0"
   1137      1.1  mrg   [(set_attr "type" "cmpdp")
   1138      1.1  mrg    (set_attr "units" "s")
   1139      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   1140      1.1  mrg 
   1141      1.1  mrg (define_expand "cmp<mode>_<andior_name>"
   1142      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
   1143      1.1  mrg 	(if_then_else:SI
   1144      1.1  mrg 	 (andior_eqne:SI (match_operand:SI 4 "register_operand" "0,0,0,0")
   1145      1.1  mrg 			 (const_int 0))
   1146      1.1  mrg 	 (match_dup 4)
   1147      1.1  mrg 	 (match_operator:SI 1 "eqltgt_operator"
   1148      1.1  mrg 	   [(match_operand:SFDFM 2 "register_operand" "")
   1149      1.1  mrg 	    (match_operand:SFDFM 3 "register_operand" "")])))]
   1150      1.1  mrg   "TARGET_FP")
   1151      1.1  mrg 
   1152      1.1  mrg (define_insn "*cmpsf_<andior_name>_insn"
   1153      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=A,B,A,B")
   1154      1.1  mrg 	(if_then_else:SI
   1155      1.1  mrg 	 (andior_eqne:SI (match_operand:SI 4 "register_operand" "0,0,0,0")
   1156      1.1  mrg 			 (const_int 0))
   1157      1.1  mrg 	 (match_dup 4)
   1158      1.1  mrg 	 (match_operator:SI 1 "eqltgt_operator"
   1159      1.1  mrg 	   [(match_operand:SF 2 "register_operand" "a,b,a,b")
   1160      1.1  mrg 	    (match_operand:SF 3 "register_operand" "a,b,?b,?a")])))]
   1161      1.1  mrg   "TARGET_FP"
   1162      1.1  mrg   "%|[<andior_condmod>%4]\\tcmp%c1sp\\t%$\\t%2, %3, %0"
   1163      1.1  mrg   [(set_attr "units" "s")
   1164      1.1  mrg    (set_attr "cross" "n,n,y,y")
   1165      1.1  mrg    (set_attr "predicable" "no")])
   1166      1.1  mrg 
   1167      1.1  mrg ;; reload_reg_class_lower will ensure that two-word reloads are allocated first,
   1168      1.1  mrg ;; which could exhaust the predicate registers if we used just "a" and "b"
   1169      1.1  mrg ;; constraints on operands 2 and 3.
   1170      1.1  mrg (define_insn "*cmpdf_<andior_name>_insn"
   1171      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=A,B,A,B")
   1172      1.1  mrg 	(if_then_else:SI
   1173      1.1  mrg 	 (andior_eqne:SI (match_operand:SI 4 "register_operand" "0,0,0,0")
   1174      1.1  mrg 			 (const_int 0))
   1175      1.1  mrg 	 (match_dup 4)
   1176      1.1  mrg 	 (match_operator:SI 1 "eqltgt_operator"
   1177      1.1  mrg 	   [(match_operand:DF 2 "register_operand" "Da,Db,Da,Db")
   1178      1.1  mrg 	    (match_operand:DF 3 "register_operand" "Da,Db,?Db,?Da")])))]
   1179      1.1  mrg   "TARGET_FP"
   1180      1.1  mrg   "%|[<andior_condmod>%4]\\tcmp%c1dp\\t%$\\t%2, %3, %0"
   1181      1.1  mrg   [(set_attr "type" "cmpdp")
   1182      1.1  mrg    (set_attr "units" "s")
   1183      1.1  mrg    (set_attr "cross" "n,n,y,y")
   1184      1.1  mrg    (set_attr "predicable" "no")])
   1185      1.1  mrg 
   1186      1.1  mrg (define_split
   1187      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
   1188      1.1  mrg 	(ior:SI (match_operand 1 "c6x_any_comparison_operand" "")
   1189      1.1  mrg 		(match_operand 2 "c6x_any_comparison_operand" "")))]
   1190      1.1  mrg   "!reg_overlap_mentioned_p (operands[0], operands[2])"
   1191      1.1  mrg   [(set (match_dup 0) (match_dup 1))
   1192      1.1  mrg    (set (match_dup 0)
   1193      1.1  mrg 	(if_then_else:SI (ne:SI (match_dup 0) (const_int 0))
   1194      1.1  mrg 			 (match_dup 0)
   1195      1.1  mrg 			 (match_dup 2)))])
   1196      1.1  mrg 
   1197      1.1  mrg (define_split
   1198      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
   1199      1.1  mrg 	(and:SI (match_operand 1 "c6x_any_comparison_operand" "")
   1200      1.1  mrg 		(match_operand 2 "c6x_any_comparison_operand" "")))]
   1201      1.1  mrg   "!reg_overlap_mentioned_p (operands[0], operands[2])"
   1202      1.1  mrg   [(set (match_dup 0) (match_dup 1))
   1203      1.1  mrg    (set (match_dup 0)
   1204      1.1  mrg 	(if_then_else:SI (eq:SI (match_dup 0) (const_int 0))
   1205      1.1  mrg 			 (match_dup 0)
   1206      1.1  mrg 			 (match_dup 2)))])
   1207      1.1  mrg 
   1208      1.1  mrg 
   1209      1.1  mrg ;; -------------------------------------------------------------------------
   1210      1.1  mrg ;; setcc instructions
   1211      1.1  mrg ;; -------------------------------------------------------------------------
   1212      1.1  mrg 
   1213      1.1  mrg (define_expand "cstoresi4"
   1214      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
   1215      1.1  mrg 	(match_operator:SI 1 "comparison_operator"
   1216      1.1  mrg 	 [(match_operand:SI 2 "register_operand" "")
   1217      1.1  mrg 	  (match_operand:SI 3 "reg_or_ucst4_operand" "")]))]
   1218      1.1  mrg   ""
   1219      1.1  mrg {
   1220      1.1  mrg   if (!c6x_comparison_operator (operands[1], SImode))
   1221      1.1  mrg     {
   1222      1.1  mrg       rtx tmpreg = gen_reg_rtx (SImode);
   1223      1.1  mrg       rtx t = gen_rtx_fmt_ee (reverse_condition (GET_CODE (operands[1])),
   1224      1.1  mrg 			      SImode, operands[2], operands[3]);
   1225  1.1.1.3  mrg       emit_insn (gen_rtx_SET (tmpreg, t));
   1226      1.1  mrg       emit_insn (gen_scmpsi_insn (operands[0],
   1227      1.1  mrg 				  gen_rtx_fmt_ee (EQ, SImode, tmpreg, const0_rtx),
   1228      1.1  mrg 				  tmpreg, const0_rtx));
   1229      1.1  mrg       DONE;
   1230      1.1  mrg     }
   1231      1.1  mrg })
   1232      1.1  mrg 
   1233      1.1  mrg ;; -------------------------------------------------------------------------
   1234      1.1  mrg ;; Jump instructions
   1235      1.1  mrg ;; -------------------------------------------------------------------------
   1236      1.1  mrg 
   1237      1.1  mrg (define_insn "indirect_jump"
   1238      1.1  mrg   [(set (pc) (match_operand:SI 0 "register_operand" "a,b"))]
   1239      1.1  mrg   ""
   1240      1.1  mrg   "%|%.\\tb\\t%$\\t%0"
   1241      1.1  mrg   [(set_attr "type" "branch")
   1242      1.1  mrg    (set_attr "units" "s")
   1243      1.1  mrg    (set_attr "cross" "y,n")
   1244      1.1  mrg    (set_attr "dest_regfile" "b")])
   1245      1.1  mrg 
   1246      1.1  mrg (define_insn "jump"
   1247      1.1  mrg   [(set (pc)
   1248      1.1  mrg 	(label_ref (match_operand 0 "" "")))]
   1249      1.1  mrg   ""
   1250      1.1  mrg   "%|%.\\tb\\t%$\\t%l0"
   1251      1.1  mrg   [(set_attr "type" "branch")
   1252      1.1  mrg    (set_attr "units" "s")
   1253      1.1  mrg    (set_attr "dest_regfile" "any")])
   1254      1.1  mrg 
   1255      1.1  mrg (define_expand "tablejump"
   1256      1.1  mrg   [(parallel [(set (pc) (match_operand:SI 0 "register_operand" ""))
   1257      1.1  mrg               (use (label_ref (match_operand 1 "" "")))])]
   1258      1.1  mrg   "!flag_pic || !TARGET_INSNS_64"
   1259      1.1  mrg {
   1260      1.1  mrg })
   1261      1.1  mrg 
   1262      1.1  mrg (define_insn "*tablejump_internal"
   1263      1.1  mrg   [(set (pc) (match_operand:SI 0 "register_operand" "b"))
   1264      1.1  mrg    (use (label_ref (match_operand 1 "" "")))]
   1265      1.1  mrg   "!flag_pic || !TARGET_INSNS_64"
   1266      1.1  mrg   "%|\\tb\\t%$\\t%0"
   1267      1.1  mrg   [(set_attr "type" "branch")
   1268      1.1  mrg    (set_attr "predicable" "no")
   1269      1.1  mrg    (set_attr "units" "s")
   1270      1.1  mrg    (set_attr "dest_regfile" "b")])
   1271      1.1  mrg 
   1272      1.1  mrg ;; Implement switch statements when generating PIC code.  Switches are
   1273      1.1  mrg ;; implemented by `tablejump' when not using -fpic.
   1274      1.1  mrg 
   1275      1.1  mrg ;; Emit code here to do the range checking and make the index zero based.
   1276      1.1  mrg ;; operand 0 is the index
   1277      1.1  mrg ;; operand 1 is the lower bound
   1278      1.1  mrg ;; operand 2 is the range of indices (highest - lowest + 1)
   1279      1.1  mrg ;; operand 3 is the label that precedes the table itself
   1280      1.1  mrg ;; operand 4 is the fall through label
   1281      1.1  mrg 
   1282      1.1  mrg (define_expand "casesi"
   1283      1.1  mrg   [(use (match_operand:SI 0 "register_operand" ""))
   1284      1.1  mrg    (use (match_operand:SI 1 "const_int_operand" ""))
   1285      1.1  mrg    (use (match_operand:SI 2 "const_int_operand" ""))
   1286      1.1  mrg    (use (match_operand 3 "" ""))
   1287      1.1  mrg    (use (match_operand 4 "" ""))]
   1288      1.1  mrg   "flag_pic && TARGET_INSNS_64"
   1289      1.1  mrg {
   1290      1.1  mrg   rtx indx;
   1291      1.1  mrg   rtx low = operands[1];
   1292      1.1  mrg   rtx range = operands[2];
   1293      1.1  mrg   rtx table = operands[3];
   1294      1.1  mrg   rtx fail = operands[4];
   1295      1.1  mrg 
   1296      1.1  mrg   gcc_assert (GET_CODE (operands[1]) == CONST_INT);
   1297      1.1  mrg   gcc_assert (GET_CODE (operands[2]) == CONST_INT);
   1298      1.1  mrg 
   1299      1.1  mrg   if (!reg_or_ucst4_operand (range, SImode))
   1300      1.1  mrg     range = force_reg (SImode, range);
   1301      1.1  mrg 
   1302      1.1  mrg   /* If low bound is 0, we don't have to subtract it.  */
   1303      1.1  mrg   if (INTVAL (operands[1]) == 0)
   1304      1.1  mrg     indx = operands[0];
   1305      1.1  mrg   else
   1306      1.1  mrg     {
   1307      1.1  mrg       rtx offset = GEN_INT (-INTVAL (low));
   1308      1.1  mrg       indx = gen_reg_rtx (SImode);
   1309      1.1  mrg       if (!addsi_operand (offset, SImode))
   1310      1.1  mrg         offset = force_reg (SImode, offset);
   1311      1.1  mrg       emit_insn (gen_addsi3 (indx, operands[0], offset));
   1312      1.1  mrg     }
   1313      1.1  mrg   emit_cmp_and_jump_insns (indx, range, GTU, NULL_RTX, SImode, 1, fail);
   1314      1.1  mrg 
   1315      1.1  mrg   emit_jump_insn (gen_casesi_internal (indx, table));
   1316      1.1  mrg   DONE;
   1317      1.1  mrg })
   1318      1.1  mrg 
   1319      1.1  mrg ;; This is the only instance in this file where a pattern emits more than
   1320      1.1  mrg ;; one instruction.  The concern here is that the addkpc insn could otherwise
   1321      1.1  mrg ;; be scheduled too far away from the label.  A tablejump always ends an
   1322      1.1  mrg ;; extended basic block, so it shouldn't happen that the scheduler places
   1323      1.1  mrg ;; something in the delay slots.
   1324      1.1  mrg (define_insn "casesi_internal"
   1325      1.1  mrg   [(set (pc)
   1326      1.1  mrg 	(mem:SI (plus:SI (mult:SI (match_operand:SI 0 "register_operand" "b")
   1327      1.1  mrg 				  (const_int 4))
   1328      1.1  mrg 			 (label_ref (match_operand 1 "" "")))))
   1329      1.1  mrg    (clobber (match_scratch:SI 2 "=&b"))
   1330      1.1  mrg    (clobber (match_scratch:SI 3 "=b"))]
   1331      1.1  mrg   "flag_pic && TARGET_INSNS_64"
   1332      1.1  mrg   "addkpc\t.s2\t%l1,%2, 0\n\t\tldw\t.d2t2\t*+%2[%0], %3\n\t\tnop\t\t4\n\t\tadd\t.l2\t%2, %3, %3\n\t\tb\t.s2\t%3"
   1333      1.1  mrg   [(set_attr "type" "branch")
   1334      1.1  mrg    (set_attr "predicable" "no")
   1335      1.1  mrg    (set_attr "dest_regfile" "b")])
   1336      1.1  mrg 
   1337      1.1  mrg (define_expand "cbranch<mode>4"
   1338      1.1  mrg   [(set (pc)
   1339      1.1  mrg 	(if_then_else (match_operator 0 "comparison_operator"
   1340      1.1  mrg 		       [(match_operand:SIDIM 1 "register_operand" "")
   1341      1.1  mrg 			(match_operand:SIDIM 2 "reg_or_const_int_operand" "")])
   1342      1.1  mrg 		      (label_ref (match_operand 3 "" ""))
   1343      1.1  mrg 		      (pc)))]
   1344      1.1  mrg   ""
   1345      1.1  mrg {
   1346      1.1  mrg   rtx t = c6x_expand_compare (operands[0], VOIDmode);
   1347      1.1  mrg   operands[0] = t;
   1348      1.1  mrg   operands[1] = XEXP (t, 0);
   1349      1.1  mrg   operands[2] = XEXP (t, 1);
   1350      1.1  mrg })
   1351      1.1  mrg 
   1352      1.1  mrg (define_expand "cbranch<mode>4"
   1353      1.1  mrg   [(set (pc)
   1354      1.1  mrg 	(if_then_else (match_operator 0 "c6x_fp_comparison_operator"
   1355      1.1  mrg 		       [(match_operand:SFDFM 1 "register_operand" "")
   1356      1.1  mrg 			(match_operand:SFDFM 2 "register_operand" "")])
   1357      1.1  mrg 		      (label_ref (match_operand 3 "" ""))
   1358      1.1  mrg 		      (pc)))]
   1359      1.1  mrg   ""
   1360      1.1  mrg {
   1361      1.1  mrg   rtx t = c6x_expand_compare (operands[0], VOIDmode);
   1362      1.1  mrg   operands[0] = t;
   1363      1.1  mrg   operands[1] = XEXP (t, 0);
   1364      1.1  mrg   operands[2] = XEXP (t, 1);
   1365      1.1  mrg })
   1366      1.1  mrg 
   1367      1.1  mrg (define_insn "br_true"
   1368      1.1  mrg   [(set (pc)
   1369      1.1  mrg 	(if_then_else (match_operator 0 "predicate_operator"
   1370      1.1  mrg 			[(match_operand:SI 1 "register_operand" "AB")
   1371      1.1  mrg 			 (const_int 0)])
   1372      1.1  mrg 		      (label_ref (match_operand 2 "" ""))
   1373      1.1  mrg 		      (pc)))]
   1374      1.1  mrg   ""
   1375      1.1  mrg   "%|[%J0]\\tb\\t%$\\t%l2"
   1376      1.1  mrg   [(set_attr "type" "branch")
   1377      1.1  mrg    (set_attr "predicable" "no")
   1378      1.1  mrg    (set_attr "units" "s")
   1379      1.1  mrg    (set_attr "dest_regfile" "any")])
   1380      1.1  mrg 
   1381      1.1  mrg (define_insn "br_false"
   1382      1.1  mrg   [(set (pc)
   1383      1.1  mrg 	(if_then_else (match_operator 0 "predicate_operator"
   1384      1.1  mrg 			[(match_operand:SI 1 "register_operand" "AB")
   1385      1.1  mrg 			 (const_int 0)])
   1386      1.1  mrg 		      (pc)
   1387      1.1  mrg 		      (label_ref (match_operand 2 "" ""))))]
   1388      1.1  mrg   ""
   1389      1.1  mrg   "%|[%j0]\\tb\\t%$\\t%l2"
   1390      1.1  mrg   [(set_attr "type" "branch")
   1391      1.1  mrg    (set_attr "predicable" "no")
   1392      1.1  mrg    (set_attr "units" "s")
   1393      1.1  mrg    (set_attr "dest_regfile" "any")])
   1394      1.1  mrg 
   1395      1.1  mrg (define_expand "return"
   1396      1.1  mrg   [(parallel
   1397      1.1  mrg     [(return)
   1398      1.1  mrg      (use (reg:SI REG_B3))])]
   1399      1.1  mrg   "reload_completed && get_frame_size () == 0 && c6x_nsaved_regs () == 0")
   1400      1.1  mrg 
   1401      1.1  mrg ;; We can't expand this before we know where the link register is stored.
   1402      1.1  mrg (define_insn_and_split "eh_return"
   1403      1.1  mrg   [(unspec_volatile [(match_operand:SI 0 "register_operand" "ab")]
   1404      1.1  mrg 		    UNSPECV_EH_RETURN)
   1405      1.1  mrg    (clobber (match_scratch:SI 1 "=&ab"))]
   1406      1.1  mrg   ""
   1407      1.1  mrg   "#"
   1408      1.1  mrg   "&& reload_completed"
   1409      1.1  mrg   [(const_int 0)]
   1410      1.1  mrg   "
   1411      1.1  mrg   {
   1412      1.1  mrg     c6x_set_return_address (operands[0], operands[1]);
   1413      1.1  mrg     DONE;
   1414      1.1  mrg   }"
   1415      1.1  mrg )
   1416      1.1  mrg 
   1417      1.1  mrg ;; -------------------------------------------------------------------------
   1418      1.1  mrg ;; Doloop
   1419      1.1  mrg ;; -------------------------------------------------------------------------
   1420      1.1  mrg 
   1421      1.1  mrg ; operand 0 is the loop count pseudo register
   1422  1.1.1.2  mrg ; operand 1 is the label to jump to at the top of the loop
   1423      1.1  mrg (define_expand "doloop_end"
   1424      1.1  mrg   [(parallel [(set (pc) (if_then_else
   1425      1.1  mrg 			  (ne (match_operand:SI 0 "" "")
   1426      1.1  mrg 			      (const_int 1))
   1427  1.1.1.2  mrg 			  (label_ref (match_operand 1 "" ""))
   1428      1.1  mrg 			  (pc)))
   1429      1.1  mrg 	      (set (match_dup 0)
   1430      1.1  mrg 		   (plus:SI (match_dup 0)
   1431      1.1  mrg 			    (const_int -1)))
   1432  1.1.1.2  mrg 	      (clobber (match_dup 2))])] ; match_scratch
   1433      1.1  mrg   "TARGET_INSNS_64PLUS && optimize"
   1434      1.1  mrg {
   1435      1.1  mrg   /* The loop optimizer doesn't check the predicates... */
   1436      1.1  mrg   if (GET_MODE (operands[0]) != SImode)
   1437      1.1  mrg     FAIL;
   1438  1.1.1.2  mrg   operands[2] = gen_rtx_SCRATCH (SImode);
   1439      1.1  mrg })
   1440      1.1  mrg 
   1441      1.1  mrg (define_insn "mvilc"
   1442      1.1  mrg   [(set (reg:SI REG_ILC)
   1443      1.1  mrg 	(unspec [(match_operand:SI 0 "register_operand" "a,b")] UNSPEC_MVILC))]
   1444      1.1  mrg   "TARGET_INSNS_64PLUS"
   1445      1.1  mrg   "%|%.\\tmvc\\t%$\\t%0, ILC"
   1446      1.1  mrg   [(set_attr "predicable" "no")
   1447      1.1  mrg    (set_attr "cross" "y,n")
   1448      1.1  mrg    (set_attr "units" "s")
   1449      1.1  mrg    (set_attr "dest_regfile" "b")
   1450      1.1  mrg    (set_attr "type" "mvilc")])
   1451      1.1  mrg   
   1452      1.1  mrg (define_insn "sploop"
   1453      1.1  mrg   [(unspec_volatile [(match_operand:SI 0 "const_int_operand" "i")
   1454      1.1  mrg 		     (reg:SI REG_ILC)]
   1455      1.1  mrg 		    UNSPECV_SPLOOP)]
   1456      1.1  mrg   "TARGET_INSNS_64PLUS"
   1457      1.1  mrg   "%|%.\\tsploop\t%0"
   1458      1.1  mrg   [(set_attr "predicable" "no")
   1459      1.1  mrg    (set_attr "type" "sploop")])
   1460      1.1  mrg   
   1461      1.1  mrg (define_insn "spkernel"
   1462      1.1  mrg   [(set (pc)
   1463      1.1  mrg 	(if_then_else
   1464      1.1  mrg 	 (ne (unspec_volatile:SI
   1465      1.1  mrg 	      [(match_operand:SI 0 "const_int_operand" "i")
   1466      1.1  mrg 	       (match_operand:SI 1 "const_int_operand" "i")]
   1467      1.1  mrg 	      UNSPECV_SPKERNEL)
   1468      1.1  mrg 	     (const_int 1))
   1469      1.1  mrg 	 (label_ref (match_operand 2 "" ""))
   1470      1.1  mrg 	 (pc)))]
   1471      1.1  mrg   "TARGET_INSNS_64PLUS"
   1472      1.1  mrg   "%|%.\\tspkernel\t%0, %1"
   1473      1.1  mrg   [(set_attr "predicable" "no")
   1474      1.1  mrg    (set_attr "type" "spkernel")])
   1475      1.1  mrg   
   1476      1.1  mrg (define_insn "loop_end"
   1477      1.1  mrg   [(set (pc)
   1478      1.1  mrg 	(if_then_else (ne (match_operand:SI 3 "nonimmediate_operand" "0,0,0,*r")
   1479      1.1  mrg 			  (const_int 1))
   1480      1.1  mrg 		      (label_ref (match_operand 1 "" ""))
   1481      1.1  mrg 		      (pc)))
   1482      1.1  mrg    (set (match_operand:SI 0 "nonimmediate_operand" "=AB,*r,m,m")
   1483      1.1  mrg 	(plus:SI (match_dup 3)
   1484      1.1  mrg 		 (const_int -1)))
   1485      1.1  mrg    (clobber (match_scratch:SI 2 "=X,&AB,&AB,&AB"))]
   1486      1.1  mrg   "TARGET_INSNS_64PLUS && optimize"
   1487      1.1  mrg   "#"
   1488      1.1  mrg   [(set_attr "type" "spkernel")])
   1489      1.1  mrg 
   1490      1.1  mrg (define_split
   1491      1.1  mrg   [(set (pc)
   1492      1.1  mrg 	(if_then_else (ne (match_operand:SI 3 "nonimmediate_operand" "")
   1493      1.1  mrg 			  (const_int 1))
   1494      1.1  mrg 		      (label_ref (match_operand 1 "" ""))
   1495      1.1  mrg 		      (pc)))
   1496      1.1  mrg    (set (match_operand:SI 0 "memory_operand" "")
   1497      1.1  mrg 	(plus:SI (match_dup 3)
   1498      1.1  mrg 		 (const_int -1)))
   1499      1.1  mrg    (clobber (match_scratch 2))]
   1500      1.1  mrg   ""
   1501      1.1  mrg   [(set (match_dup 2) (plus:SI (match_dup 3) (const_int -1)))
   1502      1.1  mrg    (set (match_dup 0) (match_dup 2))
   1503      1.1  mrg    (set (pc)
   1504      1.1  mrg 	(if_then_else (ne (match_dup 2) (const_int 0))
   1505      1.1  mrg 		      (label_ref (match_dup 1))
   1506      1.1  mrg 		      (pc)))]
   1507      1.1  mrg {
   1508      1.1  mrg   if (!REG_P (operands[3]))
   1509      1.1  mrg     {
   1510      1.1  mrg       emit_move_insn (operands[2], operands[3]);
   1511      1.1  mrg       operands[3] = operands[2];
   1512      1.1  mrg     }
   1513      1.1  mrg })
   1514      1.1  mrg 
   1515      1.1  mrg ;; -------------------------------------------------------------------------
   1516      1.1  mrg ;; Delayed-branch real jumps and shadows
   1517      1.1  mrg ;; -------------------------------------------------------------------------
   1518      1.1  mrg 
   1519      1.1  mrg (define_insn "real_jump"
   1520  1.1.1.2  mrg   [(unspec [(match_operand 0 "c6x_jump_operand" "a,b,S3") (const_int 0)]
   1521      1.1  mrg 	   UNSPEC_REAL_JUMP)]
   1522      1.1  mrg   ""
   1523      1.1  mrg {
   1524      1.1  mrg   if (GET_CODE (operands[0]) == LABEL_REF)
   1525      1.1  mrg     return "%|%.\\tb\\t%$\\t%l0";
   1526      1.1  mrg   return "%|%.\\tb\\t%$\\t%0";
   1527      1.1  mrg }
   1528      1.1  mrg   [(set_attr "type" "branch")
   1529      1.1  mrg    (set_attr "has_shadow" "y")
   1530      1.1  mrg    (set_attr "units" "s")
   1531      1.1  mrg    (set_attr "cross" "y,n,n")
   1532      1.1  mrg    (set_attr "dest_regfile" "b,b,any")])
   1533      1.1  mrg 
   1534      1.1  mrg (define_insn "real_call"
   1535      1.1  mrg   [(unspec [(match_operand 0 "c6x_call_operand" "a,b,S1") (const_int 1)]
   1536      1.1  mrg 	   UNSPEC_REAL_JUMP)
   1537      1.1  mrg    (clobber (reg:SI REG_B3))]
   1538      1.1  mrg   ""
   1539      1.1  mrg   "%|%.\\tcall\\t%$\\t%0"
   1540      1.1  mrg   [(set_attr "type" "call")
   1541      1.1  mrg    (set_attr "has_shadow" "y")
   1542      1.1  mrg    (set_attr "predicable" "no")
   1543      1.1  mrg    (set_attr "units" "s")
   1544      1.1  mrg    (set_attr "cross" "y,n,n")
   1545      1.1  mrg    (set_attr "dest_regfile" "b,b,any")])
   1546      1.1  mrg 
   1547      1.1  mrg (define_insn "real_ret"
   1548      1.1  mrg   [(unspec [(match_operand 0 "register_operand" "a,b") (const_int 2)]
   1549      1.1  mrg 	   UNSPEC_REAL_JUMP)]
   1550      1.1  mrg   ""
   1551      1.1  mrg   "%|%.\\tret\\t%$\\t%0"
   1552      1.1  mrg   [(set_attr "type" "branch")
   1553      1.1  mrg    (set_attr "has_shadow" "y")
   1554      1.1  mrg    (set_attr "units" "s")
   1555      1.1  mrg    (set_attr "cross" "y,n")
   1556      1.1  mrg    (set_attr "dest_regfile" "b")])
   1557      1.1  mrg 
   1558      1.1  mrg ;; computed_jump_p returns true if it finds a constant; so use one in the
   1559      1.1  mrg ;; unspec.
   1560      1.1  mrg (define_insn "indirect_jump_shadow"
   1561      1.1  mrg   [(set (pc) (unspec [(const_int 1)] UNSPEC_JUMP_SHADOW))]
   1562      1.1  mrg   ""
   1563      1.1  mrg   ";; indirect jump occurs"
   1564      1.1  mrg   [(set_attr "type" "shadow")])
   1565      1.1  mrg 
   1566      1.1  mrg ;; Operand 0 may be a PARALLEL which isn't handled by output_operand, so
   1567      1.1  mrg ;; we don't try to print it.
   1568      1.1  mrg (define_insn "indirect_call_value_shadow"
   1569      1.1  mrg   [(set (match_operand 0 "" "")
   1570      1.1  mrg 	(call (unspec [(pc)] UNSPEC_JUMP_SHADOW)
   1571      1.1  mrg 	      (const_int 0)))]
   1572      1.1  mrg   ""
   1573      1.1  mrg   ";; indirect call occurs, with return value"
   1574      1.1  mrg   [(set_attr "type" "shadow")])
   1575      1.1  mrg 
   1576      1.1  mrg (define_insn "indirect_sibcall_shadow"
   1577      1.1  mrg   [(call (unspec [(pc)] UNSPEC_JUMP_SHADOW)
   1578      1.1  mrg 	 (const_int 0))]
   1579      1.1  mrg   "SIBLING_CALL_P (insn)"
   1580      1.1  mrg   ";; indirect sibcall occurs"
   1581      1.1  mrg   [(set_attr "type" "shadow")])
   1582      1.1  mrg 
   1583      1.1  mrg (define_insn "indirect_call_shadow"
   1584      1.1  mrg   [(call (unspec [(pc)] UNSPEC_JUMP_SHADOW)
   1585      1.1  mrg 	 (const_int 0))]
   1586      1.1  mrg   ""
   1587      1.1  mrg   ";; indirect call occurs"
   1588      1.1  mrg   [(set_attr "type" "shadow")])
   1589      1.1  mrg 
   1590      1.1  mrg (define_insn "call_value_shadow"
   1591      1.1  mrg   [(set (match_operand 0 "" "")
   1592      1.1  mrg 	(call (unspec [(match_operand 1 "" "")] UNSPEC_JUMP_SHADOW)
   1593      1.1  mrg 	      (const_int 0)))]
   1594      1.1  mrg   ""
   1595      1.1  mrg   ";; call to %1 occurs, with return value"
   1596      1.1  mrg   [(set_attr "type" "shadow")])
   1597      1.1  mrg 
   1598      1.1  mrg (define_insn "call_shadow"
   1599      1.1  mrg   [(call (unspec [(match_operand 0 "" "")] UNSPEC_JUMP_SHADOW)
   1600      1.1  mrg 	 (const_int 0))]
   1601      1.1  mrg   "!SIBLING_CALL_P (insn)"
   1602      1.1  mrg   ";; call to %0 occurs"
   1603      1.1  mrg   [(set_attr "type" "shadow")])
   1604      1.1  mrg 
   1605      1.1  mrg (define_insn "sibcall_shadow"
   1606      1.1  mrg   [(call (unspec [(match_operand 0 "" "")] UNSPEC_JUMP_SHADOW)
   1607      1.1  mrg 	 (const_int 0))]
   1608      1.1  mrg   "SIBLING_CALL_P (insn)"
   1609      1.1  mrg   ";; sibcall to %0 occurs"
   1610      1.1  mrg   [(set_attr "type" "shadow")])
   1611      1.1  mrg 
   1612      1.1  mrg (define_insn "jump_shadow"
   1613      1.1  mrg   [(set (pc) (unspec [(match_operand 0 "" "")] UNSPEC_JUMP_SHADOW))]
   1614      1.1  mrg   ""
   1615      1.1  mrg   ";; jump to %0 occurs"
   1616      1.1  mrg   [(set_attr "type" "shadow")])
   1617      1.1  mrg 
   1618      1.1  mrg (define_insn "condjump_shadow"
   1619      1.1  mrg   [(set (pc)
   1620      1.1  mrg 	(if_then_else (eq (unspec [(const_int 0)] UNSPEC_JUMP_SHADOW)
   1621      1.1  mrg 			  (const_int 0))
   1622      1.1  mrg 		      (match_operand 0 "" "")
   1623      1.1  mrg 		      (pc)))]
   1624      1.1  mrg   ""
   1625      1.1  mrg   ";; condjump to %0 occurs"
   1626      1.1  mrg   [(set_attr "type" "shadow")])
   1627      1.1  mrg 
   1628      1.1  mrg (define_insn "return_shadow"
   1629      1.1  mrg   [(unspec [(const_int 0)] UNSPEC_JUMP_SHADOW)
   1630      1.1  mrg    (return)]
   1631      1.1  mrg   ""
   1632      1.1  mrg   ";; return occurs"
   1633      1.1  mrg   [(set_attr "type" "shadow")])
   1634      1.1  mrg 
   1635      1.1  mrg ;; -------------------------------------------------------------------------
   1636      1.1  mrg ;; Add instructions
   1637      1.1  mrg ;; -------------------------------------------------------------------------
   1638      1.1  mrg 
   1639      1.1  mrg (define_insn "addsi3"
   1640      1.1  mrg   [(set (match_operand:SI 0 "register_operand"
   1641      1.1  mrg               "=a   ,b   , a, b, a, b,    a,    b, ab,  a,  b,  a,  b,ab")
   1642      1.1  mrg     (plus:SI (match_operand:SI 1 "register_operand"
   1643      1.1  mrg               "%a   ,b   , a, b, b, a,    b,    a,  0,  a,  b,  z,  z,0")
   1644      1.1  mrg   	     (match_operand:SI 2 "addsi_operand"
   1645      1.1  mrg                "aIs5,bIs5,?b,?a,?a,?b,?aIs5,?bIs5,I5x,I5x,I5x,Iux,Iux,IsB")))]
   1646      1.1  mrg   ""
   1647      1.1  mrg {
   1648      1.1  mrg   if (CONSTANT_P (operands[2]))
   1649      1.1  mrg     {
   1650      1.1  mrg       HOST_WIDE_INT val = INTVAL (operands[2]);
   1651      1.1  mrg 
   1652      1.1  mrg       if (c6x_get_unit_specifier (insn) == 'd')
   1653      1.1  mrg 	{
   1654      1.1  mrg 	  bool issp = (TARGET_INSNS_64PLUS
   1655      1.1  mrg 		       && operands[1] == stack_pointer_rtx
   1656      1.1  mrg 		       && GET_CODE (PATTERN (insn)) != COND_EXEC);
   1657      1.1  mrg 
   1658      1.1  mrg 	  if (get_attr_cross (insn) == CROSS_N)
   1659      1.1  mrg 	    {
   1660      1.1  mrg 	      if (satisfies_constraint_Iu5 (operands[2]))
   1661      1.1  mrg 		return "%|%.\\tadd\\t%$\\t%1, %2, %0";
   1662      1.1  mrg 	      else if (satisfies_constraint_In5 (operands[2]))
   1663      1.1  mrg 		return "%|%.\\tsub\\t%$\\t%1, %n2, %0";
   1664      1.1  mrg 	    }
   1665      1.1  mrg 
   1666      1.1  mrg 	  if (issp && val > 0 && val < 32768)
   1667      1.1  mrg 	    {
   1668      1.1  mrg 	      return "%|%.\\taddab\\t%$\\t%1, %2, %0";
   1669      1.1  mrg 	    }
   1670      1.1  mrg 	  if ((val & 1) == 0 && ((val >= -62 && val <= 62)
   1671      1.1  mrg 				 || (issp && val > 0 && val < 65536)))
   1672      1.1  mrg 	    {
   1673      1.1  mrg 	      if (val < 0)
   1674      1.1  mrg 		return "%|%.\\tsubah\\t%$\\t%1, %r2, %0";
   1675      1.1  mrg 	      else
   1676      1.1  mrg 		return "%|%.\\taddah\\t%$\\t%1, %r2, %0";
   1677      1.1  mrg 	    }
   1678      1.1  mrg 	  else if ((val & 3) == 0 && ((val >= -124 && val <= 124)
   1679      1.1  mrg 				       || (issp && val > 0 && val < 131072)))
   1680      1.1  mrg 	    {
   1681      1.1  mrg 	      if (val < 0)
   1682      1.1  mrg 		return "%|%.\\tsubaw\\t%$\\t%1, %R2, %0";
   1683      1.1  mrg 	      else
   1684      1.1  mrg 		return "%|%.\\taddaw\\t%$\\t%1, %R2, %0";
   1685      1.1  mrg 	    }
   1686      1.1  mrg 	  else if ((val & 7) == 0 && val > 0 && val <= 248)
   1687      1.1  mrg 	    {
   1688      1.1  mrg 	      rtx xop[3];
   1689      1.1  mrg 	      xop[0] = operands[0];
   1690      1.1  mrg 	      xop[1] = operands[1];
   1691      1.1  mrg 	      xop[2] = GEN_INT (val >> 3);
   1692      1.1  mrg 	      output_asm_insn ("%|%.\\taddad\\t%$\\t%1, %2, %0", xop);
   1693      1.1  mrg 	      return "";
   1694      1.1  mrg 	    }
   1695      1.1  mrg 	}
   1696      1.1  mrg       else
   1697      1.1  mrg         {
   1698      1.1  mrg 	  if (satisfies_constraint_Is5 (operands[2]))
   1699      1.1  mrg 	    return "%|%.\\tadd\\t%$\\t%2, %1, %0";
   1700      1.1  mrg 	}
   1701      1.1  mrg       gcc_assert (rtx_equal_p (operands[0], operands[1]));
   1702      1.1  mrg       return "%|%.\\taddk\\t%$\\t%2, %0";
   1703      1.1  mrg     }
   1704      1.1  mrg   if (which_alternative == 4 || which_alternative == 5)
   1705      1.1  mrg     return "%|%.\\tadd\\t%$\\t%2, %1, %0";
   1706      1.1  mrg   else
   1707      1.1  mrg     return "%|%.\\tadd\\t%$\\t%1, %2, %0";
   1708      1.1  mrg }
   1709      1.1  mrg   [(set_attr "units62" "dls,dls,ls,ls,ls,ls,ls,ls,s,d,d,*,*,s")
   1710      1.1  mrg    (set_attr "units67" "dls,dls,ls,ls,ls,ls,ls,ls,ds,d,d,*,*,s")
   1711      1.1  mrg    (set_attr "units64" "dls,dls,dls,dls,dls,dls,ls,ls,ds,d,d,d,d,s")
   1712      1.1  mrg    (set_attr "cross" "n,n,y,y,y,y,y,y,n,n,n,y,n,n")
   1713      1.1  mrg    (set_attr "predicable" "yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,no,no,yes")])
   1714      1.1  mrg 
   1715      1.1  mrg (define_insn "subsi3"
   1716      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b,a,b")
   1717      1.1  mrg 	(minus:SI (match_operand:SI 1 "reg_or_scst5_operand" "a,b,aIs5,bIs5,bIs5,aIs5")
   1718      1.1  mrg 		  (match_operand:SI 2 "register_operand" "a,b,a,b,?a,?b")))]
   1719      1.1  mrg   ""
   1720      1.1  mrg   "%|%.\\tsub\\t%$\\t%1, %2, %0"
   1721      1.1  mrg   [(set_attr "units62" "dls,dls,ls,ls,l,l")
   1722      1.1  mrg    (set_attr "units64" "dls,dls,ls,ls,ls,ls")
   1723      1.1  mrg    (set_attr "cross" "n,n,n,n,y,y")])
   1724      1.1  mrg 
   1725      1.1  mrg (define_insn "*addshiftsi"
   1726      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b")
   1727      1.1  mrg 	(plus:SI (mult:SI (match_operand:SI 2 "register_operand" "a,b")
   1728      1.1  mrg 			  (match_operand:SI 3 "adda_scale_operand" "n,n"))
   1729      1.1  mrg 		 (match_operand:SI 1 "register_operand" "a,b")))]
   1730      1.1  mrg   ""
   1731      1.1  mrg   "%|%.\\tadda%d3\\t%$\\t%1, %2, %0"
   1732      1.1  mrg   [(set_attr "units" "d")])
   1733      1.1  mrg 
   1734      1.1  mrg (define_insn "*subshiftsi"
   1735      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b")
   1736      1.1  mrg 	(minus:SI (match_operand:SI 1 "register_operand" "a,b")
   1737      1.1  mrg 		  (mult:SI (match_operand:SI 2 "register_operand" "a,b")
   1738      1.1  mrg 			   (match_operand:SI 3 "suba_scale_operand" "n,n"))))]
   1739      1.1  mrg   ""
   1740      1.1  mrg   "%|%.\\tsuba%d3\\t%$\\t%1, %2, %0"
   1741      1.1  mrg   [(set_attr "units" "d")])
   1742      1.1  mrg 
   1743      1.1  mrg (define_insn "addsidi3_widen"
   1744      1.1  mrg   [(set (match_operand:DI 0 "register_operand" "=a,b,a,b")
   1745      1.1  mrg 	(plus:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "%a,b,a,b"))
   1746      1.1  mrg 		 (zero_extend:DI (match_operand:SI 2 "register_operand" "a,b,?b,?a"))))]
   1747      1.1  mrg   ""
   1748      1.1  mrg   "%|%.\\taddu\\t%$\\t%1, %2, %0"
   1749      1.1  mrg   [(set_attr "units" "l")
   1750      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   1751      1.1  mrg 
   1752      1.1  mrg (define_expand "adddi3"
   1753      1.1  mrg   [(set (match_operand:DI 0 "register_operand" "")
   1754      1.1  mrg 	(plus:DI (match_operand:DI 1 "register_operand" "")
   1755      1.1  mrg 		 (match_operand:DI 2 "register_operand" "")))]
   1756      1.1  mrg   ""
   1757      1.1  mrg {
   1758      1.1  mrg   rtx tmp;
   1759      1.1  mrg   rtx lo_half[3], hi_half[3];
   1760      1.1  mrg   split_di (operands + 1, 2, lo_half + 1, hi_half + 1);
   1761      1.1  mrg   if (reg_overlap_mentioned_p (operands[0], hi_half[1])
   1762      1.1  mrg       || reg_overlap_mentioned_p (operands[0], hi_half[2]))
   1763      1.1  mrg     tmp = gen_reg_rtx (DImode);
   1764      1.1  mrg   else
   1765      1.1  mrg     tmp = operands[0];
   1766      1.1  mrg   split_di (&tmp, 1, lo_half, hi_half);
   1767      1.1  mrg   emit_insn (gen_addsidi3_widen (tmp, lo_half[1], lo_half[2]));
   1768      1.1  mrg   emit_insn (gen_addsi3 (hi_half[0], copy_rtx (hi_half[0]), hi_half[1]));
   1769      1.1  mrg   emit_insn (gen_addsi3 (copy_rtx (hi_half[0]),
   1770      1.1  mrg 			 copy_rtx (hi_half[0]), hi_half[2]));
   1771      1.1  mrg   if (tmp != operands[0])
   1772      1.1  mrg     emit_move_insn (operands[0], tmp);
   1773      1.1  mrg   DONE;
   1774      1.1  mrg })
   1775      1.1  mrg 
   1776      1.1  mrg (define_insn "addsf3"
   1777      1.1  mrg   [(set (match_operand:SF 0 "register_operand" "=a,b,a,b")
   1778      1.1  mrg 	(plus:SF (match_operand:SF 1 "register_operand" "%a,b,a,b")
   1779      1.1  mrg 		 (match_operand:SF 2 "register_operand" "a,b,?b,?a")))]
   1780      1.1  mrg   "TARGET_FP"
   1781      1.1  mrg   "%|%.\\taddsp\\t%$\\t%1, %2, %0"
   1782      1.1  mrg   [(set_attr "type" "fp4")
   1783      1.1  mrg    (set_attr "units67" "l")
   1784      1.1  mrg    (set_attr "units67p" "ls")
   1785      1.1  mrg    (set_attr "units674" "ls")
   1786      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   1787      1.1  mrg 
   1788      1.1  mrg (define_insn "adddf3"
   1789      1.1  mrg   [(set (match_operand:DF 0 "register_operand" "=a,b,a,b")
   1790      1.1  mrg 	(plus:DF (match_operand:DF 1 "register_operand" "%a,b,a,b")
   1791      1.1  mrg 		 (match_operand:DF 2 "register_operand" "a,b,?b,?a")))]
   1792      1.1  mrg   "TARGET_FP"
   1793      1.1  mrg   "%|%.\\tadddp\\t%$\\t%1, %2, %0"
   1794      1.1  mrg   [(set_attr "type" "adddp")
   1795      1.1  mrg    (set_attr "units67" "l")
   1796      1.1  mrg    (set_attr "units67p" "ls")
   1797      1.1  mrg    (set_attr "units674" "ls")
   1798      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   1799      1.1  mrg 
   1800      1.1  mrg (define_insn "subsf3"
   1801      1.1  mrg   [(set (match_operand:SF 0 "register_operand" "=a,b, a, b, a, b")
   1802      1.1  mrg 	(minus:SF (match_operand:SF 1 "register_operand" "a,b, b, a, a, b")
   1803      1.1  mrg 		  (match_operand:SF 2 "register_operand" "a,b,?a,?b,?b,?a")))]
   1804      1.1  mrg   "TARGET_FP"
   1805      1.1  mrg   "%|%.\\tsubsp\\t%$\\t%1, %2, %0"
   1806      1.1  mrg   [(set_attr "type" "fp4")
   1807      1.1  mrg    (set_attr "units67" "l")
   1808      1.1  mrg    (set_attr "units67p" "ls")
   1809      1.1  mrg    (set_attr "units674" "ls")
   1810      1.1  mrg    (set_attr "cross" "n,n,y,y,y,y")])
   1811      1.1  mrg 
   1812      1.1  mrg (define_insn "subdf3"
   1813      1.1  mrg   [(set (match_operand:DF 0 "register_operand" "=a,b, a, b, a, b")
   1814      1.1  mrg 	(minus:DF (match_operand:DF 1 "register_operand" "a,b, b, a, a, b")
   1815      1.1  mrg 		  (match_operand:DF 2 "register_operand" "a,b,?a,?b,?b,?a")))]
   1816      1.1  mrg   "TARGET_FP"
   1817      1.1  mrg   "%|%.\\tsubdp\\t%$\\t%1, %2, %0"
   1818      1.1  mrg   [(set_attr "type" "adddp")
   1819      1.1  mrg    (set_attr "units67" "l")
   1820      1.1  mrg    (set_attr "units67p" "ls")
   1821      1.1  mrg    (set_attr "units674" "ls")
   1822      1.1  mrg    (set_attr "cross" "n,n,y,y,y,y")])
   1823      1.1  mrg 
   1824      1.1  mrg ;; -------------------------------------------------------------------------
   1825      1.1  mrg ;; Logical instructions
   1826      1.1  mrg ;; -------------------------------------------------------------------------
   1827      1.1  mrg 
   1828      1.1  mrg (define_insn "andsi3"
   1829      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b,a,b")
   1830      1.1  mrg 	(and:SI (match_operand:SI 1 "register_operand" "%a,b,b,a,a,b")
   1831      1.1  mrg 		(match_operand:SI 2 "andsi_operand" "aIs5,bIs5,?aIs5,?bIs5,aJc,bJc")))]
   1832      1.1  mrg   ""
   1833      1.1  mrg {
   1834      1.1  mrg   if (which_alternative < 4)
   1835      1.1  mrg     return "%|%.\\tand\\t%$\\t%2, %1, %0";
   1836      1.1  mrg   else
   1837      1.1  mrg     return "%|%.\\tclr\\t%$\\t%1, %f2, %F2, %0";
   1838      1.1  mrg }
   1839      1.1  mrg   [(set_attr "units62" "ls,ls,ls,ls,s,s")
   1840      1.1  mrg    (set_attr "units64" "dls,dls,dls,dls,s,s")
   1841      1.1  mrg    (set_attr "cross" "n,n,y,y,n,n")])
   1842      1.1  mrg 
   1843      1.1  mrg (define_insn "iorsi3"
   1844      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b,a,b")
   1845      1.1  mrg 	(ior:SI (match_operand:SI 1 "register_operand" "%a,b,b,a,a,b")
   1846      1.1  mrg 		(match_operand:SI 2 "iorsi_operand" "aIs5,bIs5,?aIs5,?bIs5,aJs,bJs")))]
   1847      1.1  mrg   ""
   1848      1.1  mrg {
   1849      1.1  mrg   if (which_alternative < 4)
   1850      1.1  mrg     return "%|%.\\tor\\t%$\\t%2, %1, %0";
   1851      1.1  mrg   else
   1852      1.1  mrg     return "%|%.\\tset\\t%$\\t%1, %s2, %S2, %0";
   1853      1.1  mrg }
   1854      1.1  mrg   [(set_attr "units62" "ls,ls,ls,ls,s,s")
   1855      1.1  mrg    (set_attr "units64" "dls,dls,dls,dls,s,s")
   1856      1.1  mrg    (set_attr "cross" "n,n,y,y,n,n")])
   1857      1.1  mrg 
   1858      1.1  mrg (define_insn "xorsi3"
   1859      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
   1860      1.1  mrg 	(xor:SI (match_operand:SI 1 "register_operand" "%a,b,b,a")
   1861      1.1  mrg 		(match_operand:SI 2 "reg_or_scst5_operand" "aIs5,bIs5,?aIs5,?bIs5")))]
   1862      1.1  mrg   ""
   1863      1.1  mrg   "%|%.\\txor\\t%$\\t%2, %1, %0"
   1864      1.1  mrg   [(set_attr "units62" "ls")
   1865      1.1  mrg    (set_attr "units64" "dls")
   1866      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   1867      1.1  mrg 
   1868      1.1  mrg ;; -------------------------------------------------------------------------
   1869      1.1  mrg ;; Conversions
   1870      1.1  mrg ;; -------------------------------------------------------------------------
   1871      1.1  mrg 
   1872      1.1  mrg (define_insn "extendsfdf2"
   1873      1.1  mrg   [(set (match_operand:DF 0 "register_operand" "=a,b,a,b")
   1874      1.1  mrg 	(float_extend:DF (match_operand:SF 1 "register_operand" "a,b,?b,?a")))]
   1875      1.1  mrg   "TARGET_FP"
   1876      1.1  mrg   "%|%.\\tspdp\\t%$\\t%1,%0"
   1877      1.1  mrg   [(set_attr "type" "dp2")
   1878      1.1  mrg    (set_attr "units" "s")
   1879      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   1880      1.1  mrg 
   1881      1.1  mrg (define_insn "truncdfsf2"
   1882      1.1  mrg   [(set (match_operand:SF 0 "register_operand" "=a,b")
   1883      1.1  mrg 	(float_truncate:SF (match_operand:DF 1 "register_operand" "a,b")))]
   1884      1.1  mrg   "TARGET_FP"
   1885      1.1  mrg   "%|%.\\tdpsp\\t%$\\t%1,%0"
   1886      1.1  mrg   [(set_attr "type" "fp4")
   1887      1.1  mrg    (set_attr "units" "l")
   1888      1.1  mrg    (set_attr "cross" "n")])
   1889      1.1  mrg 
   1890      1.1  mrg ;;;; Convert between signed integer types and floating point.
   1891      1.1  mrg (define_insn "floatsisf2"
   1892      1.1  mrg   [(set (match_operand:SF 0 "register_operand" "=a,b,a,b")
   1893      1.1  mrg 	(float:SF (match_operand:SI 1 "register_operand" "a,b,?b,?a")))]
   1894      1.1  mrg   "TARGET_FP"
   1895      1.1  mrg   "%|%.\\tintsp\\t%$\\t%1,%0"
   1896      1.1  mrg   [(set_attr "type" "fp4")
   1897      1.1  mrg    (set_attr "units" "l")
   1898      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   1899      1.1  mrg 
   1900      1.1  mrg (define_insn "floatunssisf2"
   1901      1.1  mrg   [(set (match_operand:SF 0 "register_operand" "=a,b,a,b")
   1902      1.1  mrg 	(unsigned_float:SF (match_operand:SI 1 "register_operand" "a,b,?b,?a")))]
   1903      1.1  mrg   "TARGET_FP"
   1904      1.1  mrg   "%|%.\\tintspu\\t%$\\t%1,%0"
   1905      1.1  mrg   [(set_attr "type" "fp4")
   1906      1.1  mrg    (set_attr "units" "l")
   1907      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   1908      1.1  mrg 
   1909      1.1  mrg (define_insn "floatsidf2"
   1910      1.1  mrg   [(set (match_operand:DF 0 "register_operand" "=a,b,a,b")
   1911      1.1  mrg 	(float:DF (match_operand:SI 1 "register_operand" "a,b,?b,?a")))]
   1912      1.1  mrg   "TARGET_FP"
   1913      1.1  mrg   "%|%.\\tintdp\\t%$\\t%1,%0"
   1914      1.1  mrg   [(set_attr "type" "intdp")
   1915      1.1  mrg    (set_attr "units" "l")
   1916      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   1917      1.1  mrg 
   1918      1.1  mrg (define_insn "floatunssidf2"
   1919      1.1  mrg   [(set (match_operand:DF 0 "register_operand" "=a,b,a,b")
   1920      1.1  mrg 	(unsigned_float:DF (match_operand:SI 1 "register_operand" "a,b,?b,?a")))]
   1921      1.1  mrg   "TARGET_FP"
   1922      1.1  mrg   "%|%.\\tintdpu\\t%$\\t%1,%0"
   1923      1.1  mrg   [(set_attr "type" "intdp")
   1924      1.1  mrg    (set_attr "units" "l")
   1925      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   1926      1.1  mrg 
   1927      1.1  mrg (define_insn "fix_truncsfsi2"
   1928      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
   1929      1.1  mrg 	(fix:SI (match_operand:SF 1 "register_operand" "a,b,?b,?a")))]
   1930      1.1  mrg   "TARGET_FP"
   1931      1.1  mrg   "%|%.\\tsptrunc\\t%$\\t%1,%0"
   1932      1.1  mrg   [(set_attr "type" "fp4")
   1933      1.1  mrg    (set_attr "units" "l")
   1934      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   1935      1.1  mrg 
   1936      1.1  mrg (define_insn "fix_truncdfsi2"
   1937      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b")
   1938      1.1  mrg 	(fix:SI (match_operand:DF 1 "register_operand" "a,b")))]
   1939      1.1  mrg   "TARGET_FP"
   1940      1.1  mrg   "%|%.\\tdptrunc\\t%$\\t%1,%0"
   1941      1.1  mrg   [(set_attr "type" "fp4")
   1942      1.1  mrg    (set_attr "units" "l")
   1943      1.1  mrg    (set_attr "cross" "n")])
   1944      1.1  mrg 
   1945      1.1  mrg ;; -------------------------------------------------------------------------
   1946      1.1  mrg ;; Saturating arithmetic
   1947      1.1  mrg ;; -------------------------------------------------------------------------
   1948      1.1  mrg 
   1949      1.1  mrg (define_insn "saddsi3"
   1950      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b,a,b,a,b")
   1951      1.1  mrg 	(ss_plus:SI (match_operand:SI 1 "register_operand" "a,b,?b,?a,a,b,?b,?a")
   1952      1.1  mrg 		    (match_operand:SI 2 "reg_or_const_int_operand" "a,b,a,b,aIs5,bIs5,aIs5,bIs5")))]
   1953      1.1  mrg   ""
   1954      1.1  mrg   "%|%.\\tsadd\\t%$\\t%2, %1, %0"
   1955      1.1  mrg   [(set_attr "units" "ls,ls,ls,ls,l,l,l,l")
   1956      1.1  mrg    (set_attr "cross" "n,n,y,y,n,n,y,y")])
   1957      1.1  mrg 
   1958      1.1  mrg (define_insn "ssubsi3"
   1959      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
   1960      1.1  mrg 	(ss_minus:SI (match_operand:SI 1 "reg_or_scst5_operand" "aIs5,bIs5,?bIs5,?aIs5")
   1961      1.1  mrg 		     (match_operand:SI 2 "register_operand" "a,b,a,b")))]
   1962      1.1  mrg   ""
   1963      1.1  mrg   "%|%.\\tssub\\t%$\\t%1, %2, %0"
   1964      1.1  mrg   [(set_attr "units" "l")
   1965      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   1966      1.1  mrg 
   1967      1.1  mrg (define_insn "subcsi3"
   1968      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
   1969      1.1  mrg 	(unspec:SI
   1970      1.1  mrg 	 [(match_operand:SI 1 "register_operand" "a,b,a,b")
   1971      1.1  mrg 	  (match_operand:SI 2 "register_operand" "a,b,?b,?a")]
   1972      1.1  mrg 	 UNSPEC_SUBC))]
   1973      1.1  mrg   ""
   1974      1.1  mrg   "%|%.\\tsubc\\t%$\\t%1, %2, %0"
   1975      1.1  mrg   [(set_attr "units" "l")
   1976      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   1977      1.1  mrg 
   1978      1.1  mrg ;; -------------------------------------------------------------------------
   1979      1.1  mrg ;; Call instructions
   1980      1.1  mrg ;; -------------------------------------------------------------------------
   1981      1.1  mrg 
   1982      1.1  mrg (define_expand "call"
   1983      1.1  mrg  [(match_operand 0 "" "")]
   1984      1.1  mrg  ""
   1985      1.1  mrg {
   1986      1.1  mrg   c6x_expand_call (NULL_RTX, operands[0], false);
   1987      1.1  mrg   DONE;
   1988      1.1  mrg })
   1989      1.1  mrg 
   1990      1.1  mrg (define_expand "call_value"
   1991      1.1  mrg   [(match_operand 0 "" "")
   1992      1.1  mrg    (match_operand 1 "" "")]
   1993      1.1  mrg  ""
   1994      1.1  mrg {
   1995      1.1  mrg   c6x_expand_call (operands[0], operands[1], false);
   1996      1.1  mrg   DONE;
   1997      1.1  mrg })
   1998      1.1  mrg 
   1999      1.1  mrg (define_expand "sibcall"
   2000      1.1  mrg  [(match_operand 0 "" "")]
   2001      1.1  mrg  ""
   2002      1.1  mrg {
   2003      1.1  mrg   c6x_expand_call (NULL_RTX, operands[0], true);
   2004      1.1  mrg   cfun->machine->contains_sibcall = true;
   2005      1.1  mrg   DONE;
   2006      1.1  mrg })
   2007      1.1  mrg 
   2008      1.1  mrg (define_expand "sibcall_value"
   2009      1.1  mrg   [(match_operand 0 "" "")
   2010      1.1  mrg    (match_operand 1 "" "")]
   2011      1.1  mrg  ""
   2012      1.1  mrg {
   2013      1.1  mrg   c6x_expand_call (operands[0], operands[1], true);
   2014      1.1  mrg   cfun->machine->contains_sibcall = true;
   2015      1.1  mrg   DONE;
   2016      1.1  mrg })
   2017      1.1  mrg 
   2018      1.1  mrg (define_insn "call_internal"
   2019      1.1  mrg   [(call (mem (match_operand:SI 0 "c6x_call_operand" "S1,a,b"))
   2020      1.1  mrg 	 (const_int 0))]
   2021      1.1  mrg   "!SIBLING_CALL_P (insn)"
   2022      1.1  mrg   "%|%.\\tcall\\t%$\\t%0"
   2023      1.1  mrg   [(set_attr "type" "call")
   2024      1.1  mrg    (set_attr "predicable" "no")
   2025      1.1  mrg    (set_attr "units" "s")
   2026      1.1  mrg    (set_attr "dest_regfile" "any,b,b")
   2027      1.1  mrg    (set_attr "cross" "n,y,n")])
   2028      1.1  mrg 
   2029      1.1  mrg (define_insn "call_value_internal"
   2030      1.1  mrg   [(set (match_operand 0 "" "")
   2031      1.1  mrg 	(call (mem (match_operand:SI 1 "c6x_call_operand" "S1,a,b"))
   2032      1.1  mrg 	      (const_int 0)))]
   2033      1.1  mrg   ""
   2034      1.1  mrg   "%|%.\\tcall\\t%$\\t%1"
   2035      1.1  mrg   [(set_attr "type" "call")
   2036      1.1  mrg    (set_attr "predicable" "no")
   2037      1.1  mrg    (set_attr "units" "s")
   2038      1.1  mrg    (set_attr "dest_regfile" "any,b,b")
   2039      1.1  mrg    (set_attr "cross" "n,y,n")])
   2040      1.1  mrg 
   2041      1.1  mrg (define_insn "sibcall_internal"
   2042      1.1  mrg   [(call (mem (match_operand:SI 0 "c6x_call_operand" "S1,C"))
   2043      1.1  mrg 	 (const_int 0))]
   2044      1.1  mrg   "SIBLING_CALL_P (insn)"
   2045      1.1  mrg   "%|%.\\tb\\t%$\\t%0"
   2046      1.1  mrg   [(set_attr "type" "branch")
   2047      1.1  mrg    (set_attr "predicable" "no")
   2048      1.1  mrg    (set_attr "units" "s")
   2049      1.1  mrg    (set_attr "dest_regfile" "any,b")])
   2050      1.1  mrg 
   2051      1.1  mrg (define_insn "callp"
   2052      1.1  mrg   [(call (mem (match_operand:SI 0 "c6x_call_operand" "S1"))
   2053      1.1  mrg 	 (const_int 0))
   2054      1.1  mrg    (unspec [(const_int 6)] UNSPEC_NOP)]
   2055      1.1  mrg   "!SIBLING_CALL_P (insn)"
   2056      1.1  mrg   "%|%.\\tcallp\\t%$\\t%0, B3"
   2057      1.1  mrg   [(set_attr "type" "callp")
   2058      1.1  mrg    (set_attr "predicable" "no")
   2059      1.1  mrg    (set_attr "units" "s")
   2060      1.1  mrg    (set_attr "dest_regfile" "b")
   2061      1.1  mrg    (set_attr "cross" "n")])
   2062      1.1  mrg 
   2063      1.1  mrg (define_insn "callp_value"
   2064      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
   2065      1.1  mrg 	(call (mem (match_operand:SI 1 "c6x_call_operand" "S1"))
   2066      1.1  mrg 	      (const_int 0)))
   2067      1.1  mrg    (unspec [(const_int 6)] UNSPEC_NOP)]
   2068      1.1  mrg   "!SIBLING_CALL_P (insn)"
   2069      1.1  mrg   "%|%.\\tcallp\\t%$\\t%1, B3"
   2070      1.1  mrg   [(set_attr "type" "callp")
   2071      1.1  mrg    (set_attr "predicable" "no")
   2072      1.1  mrg    (set_attr "units" "s")
   2073      1.1  mrg    (set_attr "dest_regfile" "b")
   2074      1.1  mrg    (set_attr "cross" "n")])
   2075      1.1  mrg 
   2076      1.1  mrg (define_insn "return_internal"
   2077      1.1  mrg   [(return)
   2078      1.1  mrg    (use (match_operand:SI 0 "register_operand" "b"))]
   2079      1.1  mrg   "reload_completed"
   2080      1.1  mrg   "%|%.\\tret\\t%$\\t%0"
   2081      1.1  mrg   [(set_attr "type" "branch")
   2082      1.1  mrg    (set_attr "units" "s")
   2083      1.1  mrg    (set_attr "dest_regfile" "b")])
   2084      1.1  mrg 
   2085      1.1  mrg (define_insn "addkpc"
   2086      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=b")
   2087      1.1  mrg 	(unspec:SI [(match_operand 1 "" "")] UNSPEC_ADDKPC))
   2088      1.1  mrg    (unspec [(match_operand 2 "const_int_operand" "n")] UNSPEC_NOP)]
   2089      1.1  mrg   "TARGET_INSNS_64"
   2090      1.1  mrg   "%|%.\\taddkpc\\t%$\\t%l1, %0, %2"
   2091      1.1  mrg   [(set_attr "units" "s")
   2092      1.1  mrg    (set_attr "dest_regfile" "b")])
   2093      1.1  mrg 
   2094      1.1  mrg ;; -------------------------------------------------------------------------
   2095      1.1  mrg ;; Unary operations
   2096      1.1  mrg ;; -------------------------------------------------------------------------
   2097      1.1  mrg 
   2098      1.1  mrg (define_insn "negsi2"
   2099      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a, a, b, b")
   2100      1.1  mrg         (neg:SI (match_operand:SI 1 "register_operand" "a,?b, b,?a")))]
   2101      1.1  mrg   ""
   2102      1.1  mrg   "%|%.\\tneg\\t%$\\t%1, %0"
   2103      1.1  mrg   [(set_attr "units" "ls")
   2104      1.1  mrg    (set_attr "cross" "n,y,n,y")])
   2105      1.1  mrg 
   2106      1.1  mrg (define_insn "one_cmplsi2"
   2107      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a, a, b, b")
   2108      1.1  mrg 	(not:SI (match_operand:SI 1 "register_operand" "a,?b, b,?a")))]
   2109      1.1  mrg   ""
   2110      1.1  mrg   "%|%.\\tnot\\t%$\\t%1, %0"
   2111      1.1  mrg   [(set_attr "units" "ls")
   2112      1.1  mrg    (set_attr "cross" "n,y,n,y")])
   2113      1.1  mrg 
   2114      1.1  mrg (define_insn "clrsbsi2"
   2115      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a, a, b, b")
   2116      1.1  mrg 	(clrsb:SI (match_operand:SI 1 "register_operand" "a,?b, b,?a")))]
   2117      1.1  mrg   ""
   2118      1.1  mrg   "%|%.\\tnorm\\t%$\\t%1, %0"
   2119      1.1  mrg   [(set_attr "units" "l")
   2120      1.1  mrg    (set_attr "cross" "n,y,n,y")])
   2121      1.1  mrg 
   2122      1.1  mrg (define_insn "clzsi2"
   2123      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a, a, b, b")
   2124      1.1  mrg 	(clz:SI (match_operand:SI 1 "register_operand" "a,?b, b,?a")))]
   2125      1.1  mrg   ""
   2126      1.1  mrg   "%|%.\\tlmbd\\t%$\\t1, %1, %0"
   2127      1.1  mrg   [(set_attr "units" "l")
   2128      1.1  mrg    (set_attr "cross" "n,y,n,y")])
   2129      1.1  mrg 
   2130      1.1  mrg ;; bitrevsi2 is defined in c6x-mult.md.in.
   2131      1.1  mrg 
   2132      1.1  mrg (define_expand "ctzsi2"
   2133      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
   2134      1.1  mrg 	(ctz:SI (match_operand:SI 1 "register_operand" "")))]
   2135      1.1  mrg   "TARGET_INSNS_64"
   2136      1.1  mrg {
   2137      1.1  mrg   rtx tmpreg = gen_reg_rtx (SImode);
   2138      1.1  mrg   emit_insn (gen_bitrevsi2 (tmpreg, operands[1]));
   2139      1.1  mrg   emit_insn (gen_clzsi2 (operands[0], tmpreg));
   2140      1.1  mrg   DONE;
   2141      1.1  mrg })
   2142      1.1  mrg 
   2143      1.1  mrg (define_expand "ctzdi2"
   2144      1.1  mrg   [(set (match_operand:DI 0 "register_operand" "")
   2145      1.1  mrg 	(ctz:DI (match_operand:DI 1 "register_operand" "")))]
   2146      1.1  mrg   "TARGET_INSNS_64"
   2147      1.1  mrg {
   2148      1.1  mrg   rtx tmpreg = gen_reg_rtx (DImode);
   2149      1.1  mrg   rtx out;
   2150      1.1  mrg   emit_insn (gen_bitrevsi2 (gen_highpart (SImode, tmpreg),
   2151      1.1  mrg 			    gen_lowpart (SImode, operands[1])));
   2152      1.1  mrg   emit_insn (gen_bitrevsi2 (gen_lowpart (SImode, tmpreg),
   2153      1.1  mrg 			    gen_highpart (SImode, operands[1])));
   2154      1.1  mrg   out = expand_unop (DImode, clz_optab, tmpreg, operands[0], 1);
   2155      1.1  mrg   if (!rtx_equal_p (out, operands[0]))
   2156      1.1  mrg     emit_move_insn (operands[0], out);
   2157      1.1  mrg   DONE;
   2158      1.1  mrg })
   2159      1.1  mrg 
   2160      1.1  mrg (define_insn "ssabssi2"
   2161      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a, a, b, b")
   2162      1.1  mrg         (ss_abs:SI (match_operand:SI 1 "register_operand" "a,?b, b,?a")))]
   2163      1.1  mrg   ""
   2164      1.1  mrg   "%|%.\\tabs\\t%$\\t%1, %0"
   2165      1.1  mrg   [(set_attr "units" "l")
   2166      1.1  mrg    (set_attr "cross" "n,y,n,y")])
   2167      1.1  mrg 
   2168      1.1  mrg ;; -------------------------------------------------------------------------
   2169      1.1  mrg ;; Shift instructions
   2170      1.1  mrg ;; -------------------------------------------------------------------------
   2171      1.1  mrg 
   2172      1.1  mrg (define_code_iterator any_shift [ss_ashift ashift ashiftrt lshiftrt])
   2173      1.1  mrg (define_code_iterator any_rshift [ashiftrt lshiftrt])
   2174      1.1  mrg (define_code_attr shift_code [(ss_ashift "ss_ashl") (ashift "ashl")
   2175      1.1  mrg 			      (ashiftrt "ashr") (lshiftrt "lshr")])
   2176      1.1  mrg (define_code_attr shift_insn [(ss_ashift "sshl") (ashift "shl")
   2177      1.1  mrg 			      (ashiftrt "shr") (lshiftrt "shru")])
   2178      1.1  mrg 
   2179      1.1  mrg (define_insn "<shift_code>si3"
   2180      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
   2181      1.1  mrg         (any_shift:SI (match_operand:SI 1 "register_operand" "a,b,?b,?a")
   2182      1.1  mrg 		      (match_operand:SI 2 "reg_or_ucst5_operand" "aIu5,bIu5,aIu5,bIu5")))]
   2183      1.1  mrg   ""
   2184      1.1  mrg   "%|%.\\t<shift_insn>\\t%$\\t%1, %2, %0"
   2185      1.1  mrg   [(set_attr "units" "s")
   2186      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   2187      1.1  mrg 
   2188      1.1  mrg ;; See c6x-mult.md.in for the rotlsi3 pattern.
   2189      1.1  mrg 
   2190      1.1  mrg (define_insn "rotrdi3_16"
   2191      1.1  mrg   [(set (match_operand:DI 0 "register_operand" "=a,b")
   2192      1.1  mrg         (rotatert:DI (match_operand:DI 1 "register_operand" "a,b")
   2193      1.1  mrg 		     (const_int 16)))]
   2194      1.1  mrg   "TARGET_INSNS_64PLUS"
   2195      1.1  mrg   "%|%.\\tdpackx2\\t%$\\t%P1, %p1, %0"
   2196      1.1  mrg   [(set_attr "units" "l")
   2197      1.1  mrg    (set_attr "cross" "n")])
   2198      1.1  mrg 
   2199      1.1  mrg (define_insn "shlmbsi3"
   2200      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "=a,b,a,b")
   2201      1.1  mrg         (ior:SI (ashift:SI (match_operand:SI 1 "register_operand" "a,b,?b,?a")
   2202      1.1  mrg 			   (const_int 8))
   2203      1.1  mrg 		(lshiftrt:SI (match_operand:SI 2 "register_operand" "a,b,a,b")
   2204      1.1  mrg 			     (const_int 24))))]
   2205      1.1  mrg   "TARGET_INSNS_64"
   2206      1.1  mrg   "%|%.\\tshlmb\\t%$\\t%2, %1, %0"
   2207      1.1  mrg   [(set_attr "units" "ls")
   2208      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   2209      1.1  mrg 
   2210      1.1  mrg (define_expand "ashldi3"
   2211      1.1  mrg   [(set (match_operand:DI 0 "register_operand" "")
   2212      1.1  mrg         (ashift:DI (match_operand:DI 1 "register_operand" "")
   2213      1.1  mrg 		   (match_operand:SI 2 "const_int_operand" "")))]
   2214      1.1  mrg   "TARGET_INSNS_64"
   2215      1.1  mrg {
   2216      1.1  mrg   if (CONST_INT_P (operands[2]) && INTVAL (operands[2]) == 8)
   2217      1.1  mrg     {
   2218      1.1  mrg       rtx lo0, lo1, hi0, hi1, tmp;
   2219      1.1  mrg       lo0 = gen_lowpart (SImode, operands[0]);
   2220      1.1  mrg       hi0 = gen_highpart (SImode, operands[0]);
   2221      1.1  mrg       lo1 = gen_lowpart (SImode, operands[1]);
   2222      1.1  mrg       hi1 = gen_highpart (SImode, operands[1]);
   2223      1.1  mrg       if (reg_overlap_mentioned_p (hi0, lo1))
   2224      1.1  mrg         tmp = gen_reg_rtx (SImode);
   2225      1.1  mrg       else
   2226      1.1  mrg         tmp = hi0;
   2227      1.1  mrg       emit_insn (gen_shlmbsi3 (tmp, hi1, lo1));
   2228      1.1  mrg       emit_insn (gen_ashlsi3 (lo0, lo1, operands[2]));
   2229      1.1  mrg       if (tmp != hi0)
   2230      1.1  mrg         emit_move_insn (hi0, tmp);
   2231      1.1  mrg       DONE;
   2232      1.1  mrg     }
   2233      1.1  mrg   FAIL;
   2234      1.1  mrg })
   2235      1.1  mrg 
   2236      1.1  mrg (define_expand "rotrdi3"
   2237      1.1  mrg   [(set (match_operand:DI 0 "register_operand" "")
   2238      1.1  mrg         (rotatert:DI (match_operand:DI 1 "register_operand" "")
   2239      1.1  mrg 		     (match_operand:SI 2 "const_int_operand" "")))]
   2240      1.1  mrg   "TARGET_INSNS_64PLUS"
   2241      1.1  mrg {
   2242      1.1  mrg   if (CONST_INT_P (operands[2]) && INTVAL (operands[2]) == 16)
   2243      1.1  mrg     {
   2244      1.1  mrg       emit_insn (gen_rotrdi3_16 (operands[0], operands[1]));
   2245      1.1  mrg       DONE;
   2246      1.1  mrg     }
   2247      1.1  mrg   FAIL;
   2248      1.1  mrg })
   2249      1.1  mrg 
   2250      1.1  mrg (define_insn "bswapv2hi2"
   2251      1.1  mrg   [(set (match_operand:V2HI 0 "register_operand" "=a,b,a,b")
   2252      1.1  mrg         (bswap:V2HI (match_operand:V2HI 1 "register_operand" "a,b,?b,?a")))]
   2253      1.1  mrg   "TARGET_INSNS_64"
   2254      1.1  mrg   "%|%.\\tswap4\\t%$\\t%1, %0"
   2255      1.1  mrg   [(set_attr "units" "l")
   2256      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   2257      1.1  mrg 
   2258      1.1  mrg (define_expand "bswapsi2"
   2259      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
   2260      1.1  mrg 	(bswap:SI (match_operand:SI 1 "register_operand" "")))]
   2261      1.1  mrg   "TARGET_INSNS_64"
   2262      1.1  mrg {
   2263      1.1  mrg   rtx tmpreg = gen_reg_rtx (SImode);
   2264      1.1  mrg   rtx tmpv2 = gen_lowpart (V2HImode, tmpreg);
   2265      1.1  mrg   rtx op0v2 = gen_lowpart (V2HImode, operands[0]);
   2266      1.1  mrg   emit_insn (gen_rotlsi3 (tmpreg, operands[1], GEN_INT (16)));
   2267      1.1  mrg   emit_insn (gen_bswapv2hi2 (op0v2, tmpv2));
   2268      1.1  mrg   DONE;
   2269      1.1  mrg })
   2270      1.1  mrg 
   2271      1.1  mrg ;; -------------------------------------------------------------------------
   2272      1.1  mrg ;; Division
   2273      1.1  mrg ;; -------------------------------------------------------------------------
   2274      1.1  mrg 
   2275      1.1  mrg (define_insn "divsi3_insn"
   2276      1.1  mrg   [(set (reg:SI REG_A4) (div:SI (reg:SI REG_A4) (reg:SI REG_B4)))
   2277      1.1  mrg    (clobber (reg:SI REG_A0))
   2278      1.1  mrg    (clobber (reg:SI REG_A1))
   2279      1.1  mrg    (clobber (reg:SI REG_A2))
   2280      1.1  mrg    (clobber (reg:SI REG_A6))
   2281      1.1  mrg    (clobber (reg:SI REG_B0))
   2282      1.1  mrg    (clobber (reg:SI REG_B1))
   2283      1.1  mrg    (clobber (reg:SI REG_B2))
   2284      1.1  mrg    (clobber (reg:SI REG_B3))
   2285      1.1  mrg    (clobber (reg:SI REG_B4))
   2286      1.1  mrg    (clobber (reg:SI REG_B5))
   2287      1.1  mrg    (clobber (reg:SI REG_B30))
   2288      1.1  mrg    (clobber (reg:SI REG_B31))]
   2289      1.1  mrg   ""
   2290      1.1  mrg   "%|%.\\tcall\\t%$\\t__c6xabi_divi"
   2291      1.1  mrg   [(set_attr "type" "call")
   2292      1.1  mrg    (set_attr "dest_regfile" "any")
   2293      1.1  mrg    (set_attr "units" "s")
   2294      1.1  mrg    (set_attr "cross" "n")])
   2295      1.1  mrg 
   2296      1.1  mrg (define_insn "divsi3_insn_indcall"
   2297      1.1  mrg   [(set (reg:SI REG_A4) (div:SI (reg:SI REG_A4) (reg:SI REG_B4)))
   2298      1.1  mrg    (use (match_operand:SI 0 "register_operand" "b"))
   2299      1.1  mrg    (clobber (reg:SI REG_A0))
   2300      1.1  mrg    (clobber (reg:SI REG_A1))
   2301      1.1  mrg    (clobber (reg:SI REG_A2))
   2302      1.1  mrg    (clobber (reg:SI REG_A6))
   2303      1.1  mrg    (clobber (reg:SI REG_B0))
   2304      1.1  mrg    (clobber (reg:SI REG_B1))
   2305      1.1  mrg    (clobber (reg:SI REG_B2))
   2306      1.1  mrg    (clobber (reg:SI REG_B3))
   2307      1.1  mrg    (clobber (reg:SI REG_B4))
   2308      1.1  mrg    (clobber (reg:SI REG_B5))
   2309      1.1  mrg    (clobber (reg:SI REG_B30))
   2310      1.1  mrg    (clobber (reg:SI REG_B31))]
   2311      1.1  mrg   ""
   2312      1.1  mrg   "%|%.\\tcall\\t%$\\t%0"
   2313      1.1  mrg   [(set_attr "type" "call")
   2314      1.1  mrg    (set_attr "dest_regfile" "any")
   2315      1.1  mrg    (set_attr "units" "s")
   2316      1.1  mrg    (set_attr "cross" "n")])
   2317      1.1  mrg 
   2318      1.1  mrg (define_insn "udivsi3_insn"
   2319      1.1  mrg   [(set (reg:SI REG_A4) (udiv:SI (reg:SI REG_A4) (reg:SI REG_B4)))
   2320      1.1  mrg    (clobber (reg:SI REG_A0))
   2321      1.1  mrg    (clobber (reg:SI REG_A1))
   2322      1.1  mrg    (clobber (reg:SI REG_A2))
   2323      1.1  mrg    (clobber (reg:SI REG_A6))
   2324      1.1  mrg    (clobber (reg:SI REG_B0))
   2325      1.1  mrg    (clobber (reg:SI REG_B1))
   2326      1.1  mrg    (clobber (reg:SI REG_B2))
   2327      1.1  mrg    (clobber (reg:SI REG_B3))
   2328      1.1  mrg    (clobber (reg:SI REG_B4))
   2329      1.1  mrg    (clobber (reg:SI REG_B30))
   2330      1.1  mrg    (clobber (reg:SI REG_B31))]
   2331      1.1  mrg   ""
   2332      1.1  mrg   "%|%.\\tcall\\t%$\\t__c6xabi_divu"
   2333      1.1  mrg   [(set_attr "type" "call")
   2334      1.1  mrg    (set_attr "dest_regfile" "any")
   2335      1.1  mrg    (set_attr "units" "s")
   2336      1.1  mrg    (set_attr "cross" "n")])
   2337      1.1  mrg 
   2338      1.1  mrg (define_insn "udivsi3_insn_indcall"
   2339      1.1  mrg   [(set (reg:SI REG_A4) (udiv:SI (reg:SI REG_A4) (reg:SI REG_B4)))
   2340      1.1  mrg    (use (match_operand:SI 0 "register_operand" "b"))
   2341      1.1  mrg    (clobber (reg:SI REG_A0))
   2342      1.1  mrg    (clobber (reg:SI REG_A1))
   2343      1.1  mrg    (clobber (reg:SI REG_A2))
   2344      1.1  mrg    (clobber (reg:SI REG_A6))
   2345      1.1  mrg    (clobber (reg:SI REG_B0))
   2346      1.1  mrg    (clobber (reg:SI REG_B1))
   2347      1.1  mrg    (clobber (reg:SI REG_B2))
   2348      1.1  mrg    (clobber (reg:SI REG_B3))
   2349      1.1  mrg    (clobber (reg:SI REG_B4))
   2350      1.1  mrg    (clobber (reg:SI REG_B30))
   2351      1.1  mrg    (clobber (reg:SI REG_B31))]
   2352      1.1  mrg   ""
   2353      1.1  mrg   "%|%.\\tcall\\t%$\\t%0"
   2354      1.1  mrg   [(set_attr "type" "call")
   2355      1.1  mrg    (set_attr "dest_regfile" "any")
   2356      1.1  mrg    (set_attr "units" "s")
   2357      1.1  mrg    (set_attr "cross" "n")])
   2358      1.1  mrg 
   2359      1.1  mrg (define_insn "modsi3_insn"
   2360      1.1  mrg   [(set (reg:SI REG_A4) (mod:SI (reg:SI REG_A4) (reg:SI REG_B4)))
   2361      1.1  mrg    (clobber (reg:SI REG_A1))
   2362      1.1  mrg    (clobber (reg:SI REG_A2))
   2363      1.1  mrg    (clobber (reg:SI REG_A5))
   2364      1.1  mrg    (clobber (reg:SI REG_A6))
   2365      1.1  mrg    (clobber (reg:SI REG_B0))
   2366      1.1  mrg    (clobber (reg:SI REG_B1))
   2367      1.1  mrg    (clobber (reg:SI REG_B2))
   2368      1.1  mrg    (clobber (reg:SI REG_B3))
   2369      1.1  mrg    (clobber (reg:SI REG_B4))
   2370      1.1  mrg    (clobber (reg:SI REG_B30))
   2371      1.1  mrg    (clobber (reg:SI REG_B31))]
   2372      1.1  mrg   ""
   2373      1.1  mrg   "%|%.\\tcall\\t%$\\t__c6xabi_remi"
   2374      1.1  mrg   [(set_attr "type" "call")
   2375      1.1  mrg    (set_attr "dest_regfile" "any")
   2376      1.1  mrg    (set_attr "units" "s")
   2377      1.1  mrg    (set_attr "cross" "n")])
   2378      1.1  mrg 
   2379      1.1  mrg (define_insn "modsi3_insn_indcall"
   2380      1.1  mrg   [(set (reg:SI REG_A4) (mod:SI (reg:SI REG_A4) (reg:SI REG_B4)))
   2381      1.1  mrg    (use (match_operand:SI 0 "register_operand" "b"))
   2382      1.1  mrg    (clobber (reg:SI REG_A1))
   2383      1.1  mrg    (clobber (reg:SI REG_A2))
   2384      1.1  mrg    (clobber (reg:SI REG_A5))
   2385      1.1  mrg    (clobber (reg:SI REG_A6))
   2386      1.1  mrg    (clobber (reg:SI REG_B0))
   2387      1.1  mrg    (clobber (reg:SI REG_B1))
   2388      1.1  mrg    (clobber (reg:SI REG_B2))
   2389      1.1  mrg    (clobber (reg:SI REG_B3))
   2390      1.1  mrg    (clobber (reg:SI REG_B4))
   2391      1.1  mrg    (clobber (reg:SI REG_B30))
   2392      1.1  mrg    (clobber (reg:SI REG_B31))]
   2393      1.1  mrg   ""
   2394      1.1  mrg   "%|%.\\tcall\\t%$\\t%0"
   2395      1.1  mrg   [(set_attr "type" "call")
   2396      1.1  mrg    (set_attr "dest_regfile" "any")
   2397      1.1  mrg    (set_attr "units" "s")
   2398      1.1  mrg    (set_attr "cross" "n")])
   2399      1.1  mrg 
   2400      1.1  mrg (define_insn "divmodsi4_insn"
   2401      1.1  mrg   [(set (reg:SI REG_A4) (div:SI (reg:SI REG_A4) (reg:SI REG_B4)))
   2402      1.1  mrg    (set (reg:SI REG_A5) (mod:SI (reg:SI REG_A4) (reg:SI REG_B4)))
   2403      1.1  mrg    (clobber (reg:SI REG_A1))
   2404      1.1  mrg    (clobber (reg:SI REG_A2))
   2405      1.1  mrg    (clobber (reg:SI REG_A6))
   2406      1.1  mrg    (clobber (reg:SI REG_B0))
   2407      1.1  mrg    (clobber (reg:SI REG_B1))
   2408      1.1  mrg    (clobber (reg:SI REG_B2))
   2409      1.1  mrg    (clobber (reg:SI REG_B3))
   2410      1.1  mrg    (clobber (reg:SI REG_B4))
   2411      1.1  mrg    (clobber (reg:SI REG_B30))
   2412      1.1  mrg    (clobber (reg:SI REG_B31))]
   2413      1.1  mrg   ""
   2414      1.1  mrg   "%|%.\\tcall\\t%$\\t__c6xabi_divremi"
   2415      1.1  mrg   [(set_attr "type" "call")
   2416      1.1  mrg    (set_attr "dest_regfile" "any")
   2417      1.1  mrg    (set_attr "units" "s")
   2418      1.1  mrg    (set_attr "cross" "n")])
   2419      1.1  mrg 
   2420      1.1  mrg (define_insn "divmodsi4_insn_indcall"
   2421      1.1  mrg   [(set (reg:SI REG_A4) (div:SI (reg:SI REG_A4) (reg:SI REG_B4)))
   2422      1.1  mrg    (set (reg:SI REG_A5) (mod:SI (reg:SI REG_A4) (reg:SI REG_B4)))
   2423      1.1  mrg    (use (match_operand:SI 0 "register_operand" "b"))
   2424      1.1  mrg    (clobber (reg:SI REG_A1))
   2425      1.1  mrg    (clobber (reg:SI REG_A2))
   2426      1.1  mrg    (clobber (reg:SI REG_A5))
   2427      1.1  mrg    (clobber (reg:SI REG_A6))
   2428      1.1  mrg    (clobber (reg:SI REG_B0))
   2429      1.1  mrg    (clobber (reg:SI REG_B1))
   2430      1.1  mrg    (clobber (reg:SI REG_B2))
   2431      1.1  mrg    (clobber (reg:SI REG_B3))
   2432      1.1  mrg    (clobber (reg:SI REG_B4))
   2433      1.1  mrg    (clobber (reg:SI REG_B30))
   2434      1.1  mrg    (clobber (reg:SI REG_B31))]
   2435      1.1  mrg   ""
   2436      1.1  mrg   "%|%.\\tcall\\t%$\\t%0"
   2437      1.1  mrg   [(set_attr "type" "call")
   2438      1.1  mrg    (set_attr "dest_regfile" "any")
   2439      1.1  mrg    (set_attr "units" "s")
   2440      1.1  mrg    (set_attr "cross" "n")])
   2441      1.1  mrg 
   2442      1.1  mrg (define_insn "umodsi3_insn"
   2443      1.1  mrg   [(set (reg:SI REG_A4) (umod:SI (reg:SI REG_A4) (reg:SI REG_B4)))
   2444      1.1  mrg    (clobber (reg:SI REG_A1))
   2445      1.1  mrg    (clobber (reg:SI REG_A5))
   2446      1.1  mrg    (clobber (reg:SI REG_A7))
   2447      1.1  mrg    (clobber (reg:SI REG_B0))
   2448      1.1  mrg    (clobber (reg:SI REG_B1))
   2449      1.1  mrg    (clobber (reg:SI REG_B2))
   2450      1.1  mrg    (clobber (reg:SI REG_B3))
   2451      1.1  mrg    (clobber (reg:SI REG_B4))
   2452      1.1  mrg    (clobber (reg:SI REG_B30))
   2453      1.1  mrg    (clobber (reg:SI REG_B31))]
   2454      1.1  mrg   ""
   2455      1.1  mrg   "%|%.\\tcall\\t%$\\t__c6xabi_remu"
   2456      1.1  mrg   [(set_attr "type" "call")
   2457      1.1  mrg    (set_attr "dest_regfile" "any")
   2458      1.1  mrg    (set_attr "units" "s")
   2459      1.1  mrg    (set_attr "cross" "n")])
   2460      1.1  mrg 
   2461      1.1  mrg (define_insn "umodsi3_insn_indcall"
   2462      1.1  mrg   [(set (reg:SI REG_A4) (umod:SI (reg:SI REG_A4) (reg:SI REG_B4)))
   2463      1.1  mrg    (use (match_operand:SI 0 "register_operand" "b"))
   2464      1.1  mrg    (clobber (reg:SI REG_A1))
   2465      1.1  mrg    (clobber (reg:SI REG_A5))
   2466      1.1  mrg    (clobber (reg:SI REG_A7))
   2467      1.1  mrg    (clobber (reg:SI REG_B0))
   2468      1.1  mrg    (clobber (reg:SI REG_B1))
   2469      1.1  mrg    (clobber (reg:SI REG_B2))
   2470      1.1  mrg    (clobber (reg:SI REG_B3))
   2471      1.1  mrg    (clobber (reg:SI REG_B4))
   2472      1.1  mrg    (clobber (reg:SI REG_B30))
   2473      1.1  mrg    (clobber (reg:SI REG_B31))]
   2474      1.1  mrg   ""
   2475      1.1  mrg   "%|%.\\tcall\\t%$\\t%0"
   2476      1.1  mrg   [(set_attr "type" "call")
   2477      1.1  mrg    (set_attr "dest_regfile" "any")
   2478      1.1  mrg    (set_attr "units" "s")
   2479      1.1  mrg    (set_attr "cross" "n")])
   2480      1.1  mrg 
   2481      1.1  mrg (define_insn "udivmodsi4_insn"
   2482      1.1  mrg   [(set (reg:SI REG_A4) (udiv:SI (reg:SI REG_A4) (reg:SI REG_B4)))
   2483      1.1  mrg    (set (reg:SI REG_A5) (umod:SI (reg:SI REG_A4) (reg:SI REG_B4)))
   2484      1.1  mrg    (clobber (reg:SI REG_A0))
   2485      1.1  mrg    (clobber (reg:SI REG_A1))
   2486      1.1  mrg    (clobber (reg:SI REG_A2))
   2487      1.1  mrg    (clobber (reg:SI REG_A6))
   2488      1.1  mrg    (clobber (reg:SI REG_B0))
   2489      1.1  mrg    (clobber (reg:SI REG_B1))
   2490      1.1  mrg    (clobber (reg:SI REG_B2))
   2491      1.1  mrg    (clobber (reg:SI REG_B3))
   2492      1.1  mrg    (clobber (reg:SI REG_B4))
   2493      1.1  mrg    (clobber (reg:SI REG_B30))
   2494      1.1  mrg    (clobber (reg:SI REG_B31))]
   2495      1.1  mrg   ""
   2496      1.1  mrg   "%|%.\\tcall\\t%$\\t__c6xabi_divremu"
   2497      1.1  mrg   [(set_attr "type" "call")
   2498      1.1  mrg    (set_attr "dest_regfile" "any")
   2499      1.1  mrg    (set_attr "units" "s")
   2500      1.1  mrg    (set_attr "cross" "n")])
   2501      1.1  mrg 
   2502      1.1  mrg (define_insn "udivmodsi4_insn_indcall"
   2503      1.1  mrg   [(set (reg:SI REG_A4) (udiv:SI (reg:SI REG_A4) (reg:SI REG_B4)))
   2504      1.1  mrg    (set (reg:SI REG_A5) (umod:SI (reg:SI REG_A4) (reg:SI REG_B4)))
   2505      1.1  mrg    (use (match_operand:SI 0 "register_operand" "b"))
   2506      1.1  mrg    (clobber (reg:SI REG_A0))
   2507      1.1  mrg    (clobber (reg:SI REG_A1))
   2508      1.1  mrg    (clobber (reg:SI REG_A2))
   2509      1.1  mrg    (clobber (reg:SI REG_A6))
   2510      1.1  mrg    (clobber (reg:SI REG_B0))
   2511      1.1  mrg    (clobber (reg:SI REG_B1))
   2512      1.1  mrg    (clobber (reg:SI REG_B2))
   2513      1.1  mrg    (clobber (reg:SI REG_B3))
   2514      1.1  mrg    (clobber (reg:SI REG_B4))
   2515      1.1  mrg    (clobber (reg:SI REG_B30))
   2516      1.1  mrg    (clobber (reg:SI REG_B31))]
   2517      1.1  mrg   ""
   2518      1.1  mrg   "%|%.\\tcall\\t%$\\t%0"
   2519      1.1  mrg   [(set_attr "type" "call")
   2520      1.1  mrg    (set_attr "dest_regfile" "any")
   2521      1.1  mrg    (set_attr "units" "s")
   2522      1.1  mrg    (set_attr "cross" "n")])
   2523      1.1  mrg 
   2524      1.1  mrg (define_insn_and_split "divmodsi4"
   2525      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
   2526      1.1  mrg 	(div:SI (match_operand:SI 1 "register_operand" "")
   2527      1.1  mrg 		   (match_operand:SI 2 "register_operand" "")))
   2528      1.1  mrg    (set (match_operand:SI 3 "register_operand" "")
   2529      1.1  mrg 	(mod:SI (match_dup 1) (match_dup 2)))
   2530      1.1  mrg    (clobber (reg:SI REG_A0))
   2531      1.1  mrg    (clobber (reg:SI REG_A1))
   2532      1.1  mrg    (clobber (reg:SI REG_A2))
   2533      1.1  mrg    (clobber (reg:SI REG_A4))
   2534      1.1  mrg    (clobber (reg:SI REG_A5))
   2535      1.1  mrg    (clobber (reg:SI REG_A6))
   2536      1.1  mrg    (clobber (reg:SI REG_B0))
   2537      1.1  mrg    (clobber (reg:SI REG_B1))
   2538      1.1  mrg    (clobber (reg:SI REG_B2))
   2539      1.1  mrg    (clobber (reg:SI REG_B3))
   2540      1.1  mrg    (clobber (reg:SI REG_B4))
   2541      1.1  mrg    (clobber (reg:SI REG_B5))
   2542      1.1  mrg    (clobber (reg:SI REG_B30))
   2543      1.1  mrg    (clobber (reg:SI REG_B31))]
   2544      1.1  mrg   ""
   2545      1.1  mrg   "#"
   2546      1.1  mrg   ""
   2547      1.1  mrg   [(const_int 0)]
   2548      1.1  mrg {
   2549      1.1  mrg   rtx reg = NULL_RTX;
   2550      1.1  mrg 
   2551      1.1  mrg   if (TARGET_LONG_CALLS)
   2552      1.1  mrg     {
   2553      1.1  mrg       if (reload_completed)
   2554      1.1  mrg 	reg = gen_rtx_REG (SImode, REG_A6);
   2555      1.1  mrg       else
   2556      1.1  mrg         reg = gen_reg_rtx (SImode);
   2557      1.1  mrg     }
   2558      1.1  mrg   emit_move_insn (gen_rtx_REG (SImode, REG_A4), operands[1]);
   2559      1.1  mrg   emit_move_insn (gen_rtx_REG (SImode, REG_B4), operands[2]);
   2560      1.1  mrg   if (find_reg_note (curr_insn, REG_UNUSED, operands[3]))
   2561      1.1  mrg     {
   2562      1.1  mrg       if (TARGET_LONG_CALLS)
   2563      1.1  mrg 	{
   2564      1.1  mrg 	  emit_move_insn (reg, optab_libfunc (sdiv_optab, SImode));
   2565      1.1  mrg 	  emit_insn (gen_divsi3_insn_indcall (reg));
   2566      1.1  mrg 	}
   2567      1.1  mrg       else
   2568      1.1  mrg         emit_insn (gen_divsi3_insn ());
   2569      1.1  mrg       emit_move_insn (operands[0], gen_rtx_REG (SImode, REG_A4));
   2570      1.1  mrg     }
   2571      1.1  mrg   else if (find_reg_note (curr_insn, REG_UNUSED, operands[0]))
   2572      1.1  mrg     {
   2573      1.1  mrg       if (TARGET_LONG_CALLS)
   2574      1.1  mrg 	{
   2575      1.1  mrg 	  emit_move_insn (reg, optab_libfunc (smod_optab, SImode));
   2576      1.1  mrg 	  emit_insn (gen_modsi3_insn_indcall (reg));
   2577      1.1  mrg 	}
   2578      1.1  mrg       else
   2579      1.1  mrg         emit_insn (gen_modsi3_insn ());
   2580      1.1  mrg       emit_move_insn (operands[3], gen_rtx_REG (SImode, REG_A4));
   2581      1.1  mrg     }
   2582      1.1  mrg   else
   2583      1.1  mrg     {
   2584      1.1  mrg       if (TARGET_LONG_CALLS)
   2585      1.1  mrg 	{
   2586      1.1  mrg 	  emit_move_insn (reg, optab_libfunc (sdivmod_optab, SImode));
   2587      1.1  mrg 	  emit_insn (gen_divmodsi4_insn_indcall (reg));
   2588      1.1  mrg 	}
   2589      1.1  mrg       else
   2590      1.1  mrg         emit_insn (gen_divmodsi4_insn ());
   2591      1.1  mrg       emit_move_insn (operands[0], gen_rtx_REG (SImode, REG_A4));
   2592      1.1  mrg       emit_move_insn (operands[3], gen_rtx_REG (SImode, REG_A5));
   2593      1.1  mrg     }
   2594      1.1  mrg   DONE;
   2595      1.1  mrg })
   2596      1.1  mrg 
   2597      1.1  mrg (define_insn_and_split "udivmodsi4"
   2598      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
   2599      1.1  mrg 	(udiv:SI (match_operand:SI 1 "register_operand" "")
   2600      1.1  mrg 		   (match_operand:SI 2 "register_operand" "")))
   2601      1.1  mrg    (set (match_operand:SI 3 "register_operand" "")
   2602      1.1  mrg 	(umod:SI (match_dup 1) (match_dup 2)))
   2603      1.1  mrg    (clobber (reg:SI REG_A0))
   2604      1.1  mrg    (clobber (reg:SI REG_A1))
   2605      1.1  mrg    (clobber (reg:SI REG_A2))
   2606      1.1  mrg    (clobber (reg:SI REG_A4))
   2607      1.1  mrg    (clobber (reg:SI REG_A5))
   2608      1.1  mrg    (clobber (reg:SI REG_A6))
   2609      1.1  mrg    (clobber (reg:SI REG_A7))
   2610      1.1  mrg    (clobber (reg:SI REG_B0))
   2611      1.1  mrg    (clobber (reg:SI REG_B1))
   2612      1.1  mrg    (clobber (reg:SI REG_B2))
   2613      1.1  mrg    (clobber (reg:SI REG_B3))
   2614      1.1  mrg    (clobber (reg:SI REG_B4))
   2615      1.1  mrg    (clobber (reg:SI REG_B30))
   2616      1.1  mrg    (clobber (reg:SI REG_B31))]
   2617      1.1  mrg   ""
   2618      1.1  mrg   "#"
   2619      1.1  mrg   ""
   2620      1.1  mrg   [(const_int 0)]
   2621      1.1  mrg {
   2622      1.1  mrg   rtx reg = NULL_RTX;
   2623      1.1  mrg 
   2624      1.1  mrg   if (TARGET_LONG_CALLS)
   2625      1.1  mrg     {
   2626      1.1  mrg       if (reload_completed)
   2627      1.1  mrg 	reg = gen_rtx_REG (SImode, REG_A6);
   2628      1.1  mrg       else
   2629      1.1  mrg         reg = gen_reg_rtx (SImode);
   2630      1.1  mrg     }
   2631      1.1  mrg 
   2632      1.1  mrg   emit_move_insn (gen_rtx_REG (SImode, REG_A4), operands[1]);
   2633      1.1  mrg   emit_move_insn (gen_rtx_REG (SImode, REG_B4), operands[2]);
   2634      1.1  mrg   if (find_reg_note (curr_insn, REG_UNUSED, operands[3]))
   2635      1.1  mrg     {
   2636      1.1  mrg       if (TARGET_LONG_CALLS)
   2637      1.1  mrg 	{
   2638      1.1  mrg 	  emit_move_insn (reg, optab_libfunc (udiv_optab, SImode));
   2639      1.1  mrg 	  emit_insn (gen_udivsi3_insn_indcall (reg));
   2640      1.1  mrg 	}
   2641      1.1  mrg       else
   2642      1.1  mrg         emit_insn (gen_udivsi3_insn ());
   2643      1.1  mrg       emit_move_insn (operands[0], gen_rtx_REG (SImode, REG_A4));
   2644      1.1  mrg     }
   2645      1.1  mrg   else if (find_reg_note (curr_insn, REG_UNUSED, operands[0]))
   2646      1.1  mrg     {
   2647      1.1  mrg       if (TARGET_LONG_CALLS)
   2648      1.1  mrg 	{
   2649      1.1  mrg 	  emit_move_insn (reg, optab_libfunc (umod_optab, SImode));
   2650      1.1  mrg 	  emit_insn (gen_umodsi3_insn_indcall (reg));
   2651      1.1  mrg 	}
   2652      1.1  mrg       else
   2653      1.1  mrg         emit_insn (gen_umodsi3_insn ());
   2654      1.1  mrg       emit_move_insn (operands[3], gen_rtx_REG (SImode, REG_A4));
   2655      1.1  mrg     }
   2656      1.1  mrg   else
   2657      1.1  mrg     {
   2658      1.1  mrg       if (TARGET_LONG_CALLS)
   2659      1.1  mrg 	{
   2660      1.1  mrg 	  emit_move_insn (reg, optab_libfunc (udivmod_optab, SImode));
   2661      1.1  mrg 	  emit_insn (gen_udivmodsi4_insn_indcall (reg));
   2662      1.1  mrg 	}
   2663      1.1  mrg       else
   2664      1.1  mrg         emit_insn (gen_udivmodsi4_insn ());
   2665      1.1  mrg       emit_move_insn (operands[0], gen_rtx_REG (SImode, REG_A4));
   2666      1.1  mrg       emit_move_insn (operands[3], gen_rtx_REG (SImode, REG_A5));
   2667      1.1  mrg     }
   2668      1.1  mrg   DONE;
   2669      1.1  mrg })
   2670      1.1  mrg 
   2671      1.1  mrg ;; -------------------------------------------------------------------------
   2672      1.1  mrg ;; Multiplication
   2673      1.1  mrg ;; See c6x-mult.md.in for define_insn patterns.
   2674      1.1  mrg ;; -------------------------------------------------------------------------
   2675      1.1  mrg 
   2676      1.1  mrg (define_expand "mulhisi3"
   2677      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
   2678      1.1  mrg         (mult:SI (sign_extend:SI (match_operand:HI 1 "register_operand" ""))
   2679      1.1  mrg                  (sign_extend:SI (match_operand:HI 2 "reg_or_scst5_operand" ""))))]
   2680      1.1  mrg   ""
   2681      1.1  mrg {
   2682      1.1  mrg   if (CONSTANT_P (operands[2]))
   2683      1.1  mrg     {
   2684      1.1  mrg       emit_insn (gen_mulhisi3_const (operands[0], operands[1], operands[2]));
   2685      1.1  mrg       DONE;
   2686      1.1  mrg     }
   2687      1.1  mrg })
   2688      1.1  mrg 
   2689      1.1  mrg (define_expand "usmulhisi3"
   2690      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
   2691      1.1  mrg         (mult:SI (zero_extend:SI (match_operand:HI 1 "register_operand" ""))
   2692      1.1  mrg                  (sign_extend:SI (match_operand:HI 2 "reg_or_scst5_operand" ""))))]
   2693      1.1  mrg  ""
   2694      1.1  mrg {
   2695      1.1  mrg   if (CONSTANT_P (operands[2]))
   2696      1.1  mrg     {
   2697      1.1  mrg       emit_insn (gen_usmulhisi3_const (operands[0], operands[1], operands[2]));
   2698      1.1  mrg       DONE;
   2699      1.1  mrg     }
   2700      1.1  mrg })
   2701      1.1  mrg 
   2702      1.1  mrg (define_expand "mulsi3"
   2703      1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
   2704      1.1  mrg 	(mult:SI (match_operand:SI 1 "register_operand" "")
   2705      1.1  mrg 		 (match_operand:SI 2 "register_operand" "")))]
   2706      1.1  mrg   ""
   2707      1.1  mrg {
   2708      1.1  mrg   if (!TARGET_MPY32)
   2709      1.1  mrg     {
   2710      1.1  mrg       rtx lo1 = gen_lowpart (HImode, operands[1]);
   2711      1.1  mrg       rtx lo2 = gen_lowpart (HImode, operands[2]);
   2712      1.1  mrg       /*   (N * AH + AL) * (N * BH + BL)
   2713      1.1  mrg          = N*(AH * BL + BH * AL) + AL*BL  */
   2714      1.1  mrg       rtx tmp1 = gen_reg_rtx (SImode);
   2715      1.1  mrg       rtx tmp2 = gen_reg_rtx (SImode);
   2716      1.1  mrg       rtx tmp3 = gen_reg_rtx (SImode);
   2717      1.1  mrg       emit_insn (gen_umulhisi3 (tmp1, lo1, lo2));
   2718      1.1  mrg       emit_insn (gen_umulhisi3_lh (tmp2, lo1, operands[2]));
   2719      1.1  mrg       emit_insn (gen_umulhisi3_hl (tmp3, operands[1], lo2));
   2720      1.1  mrg       emit_insn (gen_addsi3 (tmp2, tmp2, tmp3));
   2721      1.1  mrg       emit_insn (gen_ashlsi3 (tmp2, tmp2, GEN_INT (16)));
   2722      1.1  mrg       emit_insn (gen_addsi3 (operands[0], tmp1, tmp2));
   2723      1.1  mrg       DONE;
   2724      1.1  mrg     }
   2725      1.1  mrg })
   2726      1.1  mrg 
   2727      1.1  mrg ;; -------------------------------------------------------------------------
   2728      1.1  mrg ;; Floating point multiplication
   2729      1.1  mrg ;; -------------------------------------------------------------------------
   2730      1.1  mrg 
   2731      1.1  mrg (define_insn "mulsf3"
   2732      1.1  mrg   [(set (match_operand:SF 0 "register_operand" "=a,b,a,b")
   2733      1.1  mrg 	(mult:SF (match_operand:SF 1 "register_operand" "%a,b,?a,?b")
   2734      1.1  mrg 		 (match_operand:SF 2 "register_operand" "a,b,b,a")))]
   2735      1.1  mrg   "TARGET_FP"
   2736      1.1  mrg   "%|%.\\tmpysp\\t%$\\t%1, %2, %0"
   2737      1.1  mrg  [(set_attr "type" "mpy4")
   2738      1.1  mrg   (set_attr "units" "m")
   2739      1.1  mrg   (set_attr "cross" "n,n,y,y")])
   2740      1.1  mrg 
   2741      1.1  mrg (define_insn "muldf3"
   2742      1.1  mrg   [(set (match_operand:DF 0 "register_operand" "=a,b")
   2743      1.1  mrg 	(mult:DF (match_operand:DF 1 "register_operand" "%a,b")
   2744      1.1  mrg 		 (match_operand:DF 2 "register_operand" "a,b")))]
   2745      1.1  mrg   "TARGET_FP"
   2746      1.1  mrg   "%|%.\\tmpydp\\t%$\\t%1, %2, %0"
   2747      1.1  mrg  [(set_attr "type" "mpydp")
   2748      1.1  mrg   (set_attr "units" "m")
   2749      1.1  mrg   (set_attr "cross" "n")])
   2750      1.1  mrg 
   2751      1.1  mrg ;; Note that mpyspdp and mpysp2dp are available on C67x, despite what the
   2752      1.1  mrg ;; manual says.
   2753      1.1  mrg (define_insn "*muldf_ext1"
   2754      1.1  mrg   [(set (match_operand:DF 0 "register_operand" "=a,b,a,b")
   2755      1.1  mrg 	(mult:DF (float_extend:DF (match_operand:SF 1 "register_operand" "a,b,a,b"))
   2756      1.1  mrg 		 (match_operand:DF 2 "register_operand" "a,b,?b,?a")))]
   2757      1.1  mrg   "TARGET_FP_EXT"
   2758      1.1  mrg   "%|%.\\tmpyspdp\\t%$\\t%1, %2, %0"
   2759      1.1  mrg  [(set_attr "type" "mpyspdp")
   2760      1.1  mrg   (set_attr "units" "m")
   2761      1.1  mrg   (set_attr "cross" "n,n,y,y")])
   2762      1.1  mrg 
   2763      1.1  mrg (define_insn "*muldf_ext2"
   2764      1.1  mrg   [(set (match_operand:DF 0 "register_operand" "=a,b,a,b")
   2765      1.1  mrg 	(mult:DF (float_extend:DF (match_operand:SF 1 "register_operand" "%a,b,a,b"))
   2766      1.1  mrg 		 (float_extend:DF (match_operand:SF 2 "register_operand" "a,b,?b,?a"))))]
   2767      1.1  mrg   "TARGET_FP_EXT"
   2768      1.1  mrg   "%|%.\\tmpysp2dp\\t%$\\t%1, %2, %0"
   2769      1.1  mrg  [(set_attr "type" "mpysp2dp")
   2770      1.1  mrg   (set_attr "units" "m")
   2771      1.1  mrg   (set_attr "cross" "n,n,y,y")])
   2772      1.1  mrg 
   2773      1.1  mrg ;; -------------------------------------------------------------------------
   2774      1.1  mrg ;; Floating point division
   2775      1.1  mrg ;; -------------------------------------------------------------------------
   2776      1.1  mrg 
   2777      1.1  mrg (define_insn "rcpsf2"
   2778      1.1  mrg   [(set (match_operand:SF 0 "register_operand" "=a,b,a,b")
   2779      1.1  mrg 	(unspec:SF [(match_operand:SF 1 "register_operand" "a,b,?b,?a")]
   2780      1.1  mrg 		   UNSPEC_RCP))]
   2781      1.1  mrg   "TARGET_FP"
   2782      1.1  mrg   "%|%.\\trcpsp\\t%$\\t%1, %0"
   2783      1.1  mrg  [(set_attr "units" "s")
   2784      1.1  mrg   (set_attr "cross" "n,n,y,y")])
   2785      1.1  mrg 
   2786      1.1  mrg (define_insn "rcpdf2"
   2787      1.1  mrg   [(set (match_operand:DF 0 "register_operand" "=a,b")
   2788      1.1  mrg 	(unspec:DF [(match_operand:DF 1 "register_operand" "a,b")]
   2789      1.1  mrg 		   UNSPEC_RCP))]
   2790      1.1  mrg   "TARGET_FP"
   2791      1.1  mrg   "%|%.\\trcpdp\\t%$\\t%1, %0"
   2792      1.1  mrg  [(set_attr "type" "dp2")
   2793      1.1  mrg   (set_attr "units" "s")
   2794      1.1  mrg   (set_attr "cross" "n")])
   2795      1.1  mrg 
   2796      1.1  mrg (define_expand "divsf3"
   2797      1.1  mrg   [(set (match_dup 4)
   2798      1.1  mrg 	(unspec:SF [(match_operand:SF 2 "register_operand" "")]
   2799      1.1  mrg 		   UNSPEC_RCP))
   2800      1.1  mrg    (set (match_dup 5) (mult:SF (match_dup 2) (match_dup 4)))
   2801      1.1  mrg    (set (match_dup 6) (minus:SF (match_dup 3) (match_dup 5)))
   2802      1.1  mrg    (set (match_dup 4) (mult:SF (match_dup 4) (match_dup 6)))
   2803      1.1  mrg    (set (match_dup 5) (mult:SF (match_dup 2) (match_dup 4)))
   2804      1.1  mrg    (set (match_dup 6) (minus:SF (match_dup 3) (match_dup 5)))
   2805      1.1  mrg    (set (match_dup 4) (mult:SF (match_dup 4) (match_dup 6)))
   2806      1.1  mrg    (set (match_operand:SF 0 "register_operand" "")
   2807      1.1  mrg 	(mult:SF (match_operand:SF 1 "register_operand")
   2808      1.1  mrg 		 (match_dup 4)))]
   2809      1.1  mrg   "TARGET_FP && flag_reciprocal_math"
   2810      1.1  mrg {
   2811      1.1  mrg   operands[3] = force_reg (SFmode,
   2812  1.1.1.3  mrg 			   const_double_from_real_value (dconst2, SFmode));
   2813      1.1  mrg   operands[4] = gen_reg_rtx (SFmode);
   2814      1.1  mrg   operands[5] = gen_reg_rtx (SFmode);
   2815      1.1  mrg   operands[6] = gen_reg_rtx (SFmode);
   2816      1.1  mrg })
   2817      1.1  mrg 
   2818      1.1  mrg (define_expand "divdf3"
   2819      1.1  mrg   [(set (match_dup 4)
   2820      1.1  mrg 	(unspec:DF [(match_operand:DF 2 "register_operand" "")]
   2821      1.1  mrg 		   UNSPEC_RCP))
   2822      1.1  mrg    (set (match_dup 5) (mult:DF (match_dup 2) (match_dup 4)))
   2823      1.1  mrg    (set (match_dup 6) (minus:DF (match_dup 3) (match_dup 5)))
   2824      1.1  mrg    (set (match_dup 4) (mult:DF (match_dup 4) (match_dup 6)))
   2825      1.1  mrg    (set (match_dup 5) (mult:DF (match_dup 2) (match_dup 4)))
   2826      1.1  mrg    (set (match_dup 6) (minus:DF (match_dup 3) (match_dup 5)))
   2827      1.1  mrg    (set (match_dup 4) (mult:DF (match_dup 4) (match_dup 6)))
   2828      1.1  mrg    (set (match_dup 5) (mult:DF (match_dup 2) (match_dup 4)))
   2829      1.1  mrg    (set (match_dup 6) (minus:DF (match_dup 3) (match_dup 5)))
   2830      1.1  mrg    (set (match_dup 4) (mult:DF (match_dup 4) (match_dup 6)))
   2831      1.1  mrg    (set (match_operand:DF 0 "register_operand" "")
   2832      1.1  mrg 	(mult:DF (match_operand:DF 1 "register_operand")
   2833      1.1  mrg 		 (match_dup 4)))]
   2834      1.1  mrg   "TARGET_FP && flag_reciprocal_math"
   2835      1.1  mrg {
   2836      1.1  mrg   operands[3] = force_reg (DFmode,
   2837  1.1.1.3  mrg 			   const_double_from_real_value (dconst2, DFmode));
   2838      1.1  mrg   operands[4] = gen_reg_rtx (DFmode);
   2839      1.1  mrg   operands[5] = gen_reg_rtx (DFmode);
   2840      1.1  mrg   operands[6] = gen_reg_rtx (DFmode);
   2841      1.1  mrg })
   2842      1.1  mrg 
   2843      1.1  mrg ;; -------------------------------------------------------------------------
   2844      1.1  mrg ;; Block moves
   2845      1.1  mrg ;; -------------------------------------------------------------------------
   2846      1.1  mrg 
   2847  1.1.1.7  mrg (define_expand "cpymemsi"
   2848      1.1  mrg   [(use (match_operand:BLK 0 "memory_operand" ""))
   2849      1.1  mrg    (use (match_operand:BLK 1 "memory_operand" ""))
   2850      1.1  mrg    (use (match_operand:SI 2 "nonmemory_operand" ""))
   2851      1.1  mrg    (use (match_operand:SI 3 "const_int_operand" ""))
   2852      1.1  mrg    (use (match_operand:SI 4 "const_int_operand" ""))
   2853      1.1  mrg    (use (match_operand:SI 5 "const_int_operand" ""))]
   2854      1.1  mrg   ""
   2855      1.1  mrg {
   2856  1.1.1.7  mrg  if (c6x_expand_cpymem (operands[0], operands[1], operands[2], operands[3],
   2857      1.1  mrg 			operands[4], operands[5]))
   2858      1.1  mrg    DONE;
   2859      1.1  mrg  else
   2860      1.1  mrg    FAIL;
   2861      1.1  mrg })
   2862      1.1  mrg 
   2863      1.1  mrg ;; -------------------------------------------------------------------------
   2864      1.1  mrg ;; Prologue and epilogue.
   2865      1.1  mrg ;; -------------------------------------------------------------------------
   2866      1.1  mrg 
   2867      1.1  mrg ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
   2868      1.1  mrg ;; all of memory.  This blocks insns from being moved across this point.
   2869      1.1  mrg 
   2870      1.1  mrg (define_insn "blockage"
   2871      1.1  mrg   [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)]
   2872      1.1  mrg   ""
   2873      1.1  mrg   ""
   2874      1.1  mrg   [(set_attr "type" "blockage")])
   2875      1.1  mrg 
   2876      1.1  mrg (define_insn "push_rts"
   2877      1.1  mrg   [(set (mem:SI (reg:SI REG_SP)) (reg:SI REG_B14))
   2878      1.1  mrg    (set (mem:DI (plus:SI (reg:SI REG_SP) (const_int -8))) (reg:DI REG_A14))
   2879      1.1  mrg    (set (mem:DI (plus:SI (reg:SI REG_SP) (const_int -16))) (reg:DI REG_B12))
   2880      1.1  mrg    (set (mem:DI (plus:SI (reg:SI REG_SP) (const_int -24))) (reg:DI REG_A12))
   2881      1.1  mrg    (set (mem:DI (plus:SI (reg:SI REG_SP) (const_int -32))) (reg:DI REG_B10))
   2882      1.1  mrg    (set (mem:DI (plus:SI (reg:SI REG_SP) (const_int -40))) (reg:DI REG_A10))
   2883      1.1  mrg    (set (mem:DI (plus:SI (reg:SI REG_SP) (const_int -48))) (reg:DI REG_B2))
   2884      1.1  mrg    (set (reg:SI REG_SP) (plus:SI (reg:SI REG_SP) (const_int -56)))
   2885      1.1  mrg    (unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
   2886      1.1  mrg    (clobber (reg:SI REG_A3))]
   2887      1.1  mrg   "TARGET_INSNS_64PLUS"
   2888      1.1  mrg   "%|%.\\tcallp\\t%$\\t__c6xabi_push_rts, a3"
   2889      1.1  mrg   [(set_attr "type" "callp")
   2890      1.1  mrg    (set_attr "dest_regfile" "a")
   2891      1.1  mrg    (set_attr "units" "s")
   2892      1.1  mrg    (set_attr "cross" "n")])
   2893      1.1  mrg 
   2894      1.1  mrg (define_insn "pop_rts"
   2895      1.1  mrg   [(set (reg:SI REG_B14) (mem:SI (plus:SI (reg:SI REG_SP) (const_int 56))))
   2896      1.1  mrg    (set (reg:DI REG_A14) (mem:DI (plus:SI (reg:SI REG_SP) (const_int 48))))
   2897      1.1  mrg    (set (reg:DI REG_B12) (mem:DI (plus:SI (reg:SI REG_SP) (const_int 40))))
   2898      1.1  mrg    (set (reg:DI REG_A12) (mem:DI (plus:SI (reg:SI REG_SP) (const_int 32))))
   2899      1.1  mrg    (set (reg:DI REG_B10) (mem:DI (plus:SI (reg:SI REG_SP) (const_int 24))))
   2900      1.1  mrg    (set (reg:DI REG_A10) (mem:DI (plus:SI (reg:SI REG_SP) (const_int 16))))
   2901      1.1  mrg    (set (reg:DI REG_B2) (mem:DI (plus:SI (reg:SI REG_SP) (const_int 8))))
   2902      1.1  mrg    (set (reg:SI REG_SP) (plus:SI (reg:SI REG_SP) (const_int 56)))
   2903      1.1  mrg    (clobber (reg:SI REG_A3))
   2904      1.1  mrg    (return)]
   2905      1.1  mrg   "TARGET_INSNS_64PLUS"
   2906      1.1  mrg   "%|%.\\tretp\\t%$\\t__c6xabi_pop_rts, a3"
   2907      1.1  mrg   [(set_attr "type" "callp")
   2908      1.1  mrg    (set_attr "dest_regfile" "a")
   2909      1.1  mrg    (set_attr "units" "s")
   2910      1.1  mrg    (set_attr "cross" "n")])
   2911      1.1  mrg 
   2912      1.1  mrg (define_expand "prologue"
   2913      1.1  mrg   [(const_int 1)]
   2914      1.1  mrg   ""
   2915      1.1  mrg   "c6x_expand_prologue (); DONE;")
   2916      1.1  mrg 
   2917      1.1  mrg (define_expand "epilogue"
   2918      1.1  mrg   [(const_int 1)]
   2919      1.1  mrg   ""
   2920      1.1  mrg   "c6x_expand_epilogue (false); DONE;")
   2921      1.1  mrg 
   2922      1.1  mrg (define_expand "sibcall_epilogue"
   2923      1.1  mrg   [(return)]
   2924      1.1  mrg   ""
   2925      1.1  mrg {
   2926      1.1  mrg   c6x_expand_epilogue (true);
   2927      1.1  mrg   DONE;
   2928      1.1  mrg })
   2929      1.1  mrg 
   2930      1.1  mrg (define_insn "setup_dsbt"
   2931      1.1  mrg   [(set (match_operand:SI 0 "pic_register_operand" "+Z")
   2932      1.1  mrg 	(unspec:SI [(match_dup 0)
   2933      1.1  mrg 		    (match_operand:SI 1 "symbolic_operand" "")]
   2934      1.1  mrg 		   UNSPEC_SETUP_DSBT))]
   2935      1.1  mrg   "TARGET_DSBT"
   2936      1.1  mrg   "%|%.\\tldw\\t%$\\t*+%0($DSBT_index%1), %0"
   2937      1.1  mrg   [(set_attr "type" "load")
   2938      1.1  mrg    (set_attr "units" "d_addr")
   2939      1.1  mrg    (set_attr "dest_regfile" "b")
   2940      1.1  mrg    (set_attr "addr_regfile" "b")])
   2941      1.1  mrg 
   2942      1.1  mrg 
   2943      1.1  mrg ;; A dummy use/set to prevent prologue and epiloge overlapping.
   2944      1.1  mrg ;; This can be caused by sched-ebb in the presence of multiple
   2945      1.1  mrg ;; exit sequences, and causes the unwinding table generation to explode.
   2946      1.1  mrg (define_insn "epilogue_barrier"
   2947      1.1  mrg  [(set (match_operand:SI 0 "register_operand" "")
   2948      1.1  mrg        (unspec:SI [(match_operand:SI 1 "register_operand" "")]
   2949      1.1  mrg 		  UNSPEC_EPILOGUE_BARRIER))]
   2950      1.1  mrg  ""
   2951      1.1  mrg  ""
   2952      1.1  mrg  [(set_attr "type" "blockage")])
   2953      1.1  mrg 
   2954      1.1  mrg ;; -------------------------------------------------------------------------
   2955      1.1  mrg ;; Vector insns
   2956      1.1  mrg ;; -------------------------------------------------------------------------
   2957      1.1  mrg 
   2958      1.1  mrg (define_code_iterator logical [and ior xor])
   2959      1.1  mrg (define_code_attr logical_insn [(and "and") (ior "ior") (xor "xor")])
   2960      1.1  mrg (define_code_attr logical_opcode [(and "and") (ior "or") (xor "xor")])
   2961      1.1  mrg (define_code_iterator plusminus [plus minus])
   2962      1.1  mrg (define_code_attr plusminus_insn [(plus "add") (minus "sub")])
   2963      1.1  mrg (define_code_iterator ss_plusminus [ss_plus ss_minus])
   2964      1.1  mrg (define_code_attr ss_plusminus_insn [(ss_plus "add") (ss_minus "sub")])
   2965      1.1  mrg 
   2966      1.1  mrg ;; Vector logical insns
   2967      1.1  mrg 
   2968      1.1  mrg (define_insn "<logical_insn><mode>3"
   2969      1.1  mrg   [(set (match_operand:VEC4M 0 "register_operand" "=a,b,a,b")
   2970      1.1  mrg 	(logical:VEC4M (match_operand:VEC4M 1 "register_operand" "a,b,a,b")
   2971      1.1  mrg 		      (match_operand:VEC4M 2 "register_operand" "a,b,?b,?a")))]
   2972      1.1  mrg   ""
   2973      1.1  mrg   "%|%.\\t<logical_opcode>\\t%$\\t%1, %2, %0"
   2974      1.1  mrg   [(set_attr "units62" "ls")
   2975      1.1  mrg    (set_attr "units64" "dls")
   2976      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   2977      1.1  mrg 
   2978      1.1  mrg ;; Vector add/subtract
   2979      1.1  mrg 
   2980      1.1  mrg (define_insn "<plusminus_insn>v2hi3"
   2981      1.1  mrg   [(set (match_operand:V2HI 0 "register_operand" "=a,b,a,b")
   2982      1.1  mrg 	(plusminus:V2HI (match_operand:V2HI 1 "register_operand" "a,b,a,b")
   2983      1.1  mrg 			(match_operand:V2HI 2 "register_operand" "a,b,?b,?a")))]
   2984      1.1  mrg   ""
   2985      1.1  mrg   "%|%.\\t<plusminus_insn>2\\t%$\\t%1, %2, %0"
   2986      1.1  mrg  [(set_attr "units62" "l")
   2987      1.1  mrg   (set_attr "units64" "dls")
   2988      1.1  mrg   (set_attr "cross" "n,n,y,y")])
   2989      1.1  mrg 
   2990      1.1  mrg (define_insn "<plusminus_insn>v4qi3"
   2991      1.1  mrg   [(set (match_operand:V4QI 0 "register_operand" "=a,b,a,b")
   2992      1.1  mrg 	(plusminus:V4QI (match_operand:V4QI 1 "register_operand" "a,b,a,b")
   2993      1.1  mrg 			(match_operand:V4QI 2 "register_operand" "a,b,?b,?a")))]
   2994      1.1  mrg   "TARGET_INSNS_64"
   2995      1.1  mrg   "%|%.\\t<plusminus_insn>4\\t%$\\t%1, %2, %0"
   2996      1.1  mrg  [(set_attr "units" "l")
   2997      1.1  mrg   (set_attr "cross" "n,n,y,y")])
   2998      1.1  mrg 
   2999      1.1  mrg (define_insn "ss_addv2hi3"
   3000      1.1  mrg   [(set (match_operand:V2HI 0 "register_operand" "=a,b,a,b")
   3001      1.1  mrg 	(ss_plus:V2HI (match_operand:V2HI 1 "register_operand" "a,b,a,b")
   3002      1.1  mrg 		      (match_operand:V2HI 2 "register_operand" "a,b,?b,?a")))]
   3003      1.1  mrg   "TARGET_INSNS_64"
   3004      1.1  mrg   "%|%.\\tsadd2\\t%$\\t%1, %2, %0"
   3005      1.1  mrg  [(set_attr "units" "s")
   3006      1.1  mrg   (set_attr "cross" "n,n,y,y")])
   3007      1.1  mrg 
   3008      1.1  mrg (define_insn "ss_subv2hi3"
   3009      1.1  mrg   [(set (match_operand:V2HI 0 "register_operand" "=a,b,a,b")
   3010      1.1  mrg 	(ss_minus:V2HI (match_operand:V2HI 1 "register_operand" "a,b,a,b")
   3011      1.1  mrg 		       (match_operand:V2HI 2 "register_operand" "a,b,?b,?a")))]
   3012      1.1  mrg   "TARGET_INSNS_64"
   3013      1.1  mrg   "%|%.\\tssub2\\t%$\\t%1, %2, %0"
   3014      1.1  mrg  [(set_attr "units" "l")
   3015      1.1  mrg   (set_attr "cross" "n,n,y,y")])
   3016      1.1  mrg 
   3017      1.1  mrg (define_insn "us_addv4qi3"
   3018      1.1  mrg   [(set (match_operand:V4QI 0 "register_operand" "=a,b,a,b")
   3019      1.1  mrg 	(ss_plus:V4QI (match_operand:V4QI 1 "register_operand" "a,b,a,b")
   3020      1.1  mrg 		      (match_operand:V4QI 2 "register_operand" "a,b,?b,?a")))]
   3021      1.1  mrg   "TARGET_INSNS_64"
   3022      1.1  mrg   "%|%.\\tsaddu4\\t%$\\t%1, %2, %0"
   3023      1.1  mrg  [(set_attr "units" "s")
   3024      1.1  mrg   (set_attr "cross" "n,n,y,y")])
   3025      1.1  mrg 
   3026      1.1  mrg ;; Vector/scalar min/max
   3027      1.1  mrg 
   3028      1.1  mrg (define_mode_iterator SMINMAX [HI V2HI])
   3029      1.1  mrg (define_mode_iterator UMINMAX [QI V4QI])
   3030      1.1  mrg 
   3031      1.1  mrg (define_insn "smax<mode>3"
   3032      1.1  mrg   [(set (match_operand:SMINMAX 0 "register_operand" "=a,b,a,b")
   3033      1.1  mrg 	(smax:SMINMAX (match_operand:SMINMAX 1 "register_operand" "a,b,a,b")
   3034      1.1  mrg 		      (match_operand:SMINMAX 2 "register_operand" "a,b,?b,?a")))]
   3035      1.1  mrg   "TARGET_INSNS_64"
   3036      1.1  mrg   "%|%.\\tmax2\\t%$\\t%1, %2, %0"
   3037      1.1  mrg   [(set_attr "units64" "l")
   3038      1.1  mrg    (set_attr "units64p" "ls")
   3039      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   3040      1.1  mrg 
   3041      1.1  mrg (define_insn "smin<mode>3"
   3042      1.1  mrg   [(set (match_operand:SMINMAX 0 "register_operand" "=a,b,a,b")
   3043      1.1  mrg 	(smin:SMINMAX (match_operand:SMINMAX 1 "register_operand" "a,b,a,b")
   3044      1.1  mrg 		      (match_operand:SMINMAX 2 "register_operand" "a,b,?b,?a")))]
   3045      1.1  mrg   "TARGET_INSNS_64"
   3046      1.1  mrg   "%|%.\\tmin2\\t%$\\t%1, %2, %0"
   3047      1.1  mrg   [(set_attr "units64" "l")
   3048      1.1  mrg    (set_attr "units64p" "ls")
   3049      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   3050      1.1  mrg 
   3051      1.1  mrg (define_insn "umax<mode>3"
   3052      1.1  mrg   [(set (match_operand:UMINMAX 0 "register_operand" "=a,b,a,b")
   3053      1.1  mrg 	(umax:UMINMAX (match_operand:UMINMAX 1 "register_operand" "a,b,a,b")
   3054      1.1  mrg 		      (match_operand:UMINMAX 2 "register_operand" "a,b,?b,?a")))]
   3055      1.1  mrg   "TARGET_INSNS_64"
   3056      1.1  mrg   "%|%.\\tmaxu4\\t%$\\t%1, %2, %0"
   3057      1.1  mrg   [(set_attr "units" "l")
   3058      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   3059      1.1  mrg 
   3060      1.1  mrg (define_insn "umin<mode>3"
   3061      1.1  mrg   [(set (match_operand:UMINMAX 0 "register_operand" "=a,b,a,b")
   3062      1.1  mrg 	(umin:UMINMAX (match_operand:UMINMAX 1 "register_operand" "a,b,a,b")
   3063      1.1  mrg 		      (match_operand:UMINMAX 2 "register_operand" "a,b,?b,?a")))]
   3064      1.1  mrg   "TARGET_INSNS_64"
   3065      1.1  mrg   "%|%.\\tminu4\\t%$\\t%1, %2, %0"
   3066      1.1  mrg   [(set_attr "units" "l")
   3067      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   3068      1.1  mrg 
   3069      1.1  mrg ;; Vector shifts
   3070      1.1  mrg 
   3071      1.1  mrg (define_insn "<shift_code>v2hi3"
   3072      1.1  mrg   [(set (match_operand:V2HI 0 "register_operand" "=a,b,a,b")
   3073      1.1  mrg         (any_rshift:V2HI (match_operand:V2HI 1 "register_operand" "a,b,?b,?a")
   3074      1.1  mrg 			 (match_operand:SI 2 "reg_or_ucst5_operand" "aIu5,bIu5,aIu5,bIu5")))]
   3075      1.1  mrg   "TARGET_INSNS_64"
   3076      1.1  mrg   "%|%.\\t<shift_insn>2\\t%$\\t%1, %2, %0"
   3077      1.1  mrg   [(set_attr "units" "s")
   3078      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   3079      1.1  mrg 
   3080      1.1  mrg ;; See c6x-mult.md.in for avg2/avgu4
   3081      1.1  mrg 
   3082      1.1  mrg ;; Widening vector multiply and dot product.
   3083      1.1  mrg ;; See c6x-mult.md.in for the define_insn patterns
   3084      1.1  mrg 
   3085      1.1  mrg (define_expand "sdot_prodv2hi"
   3086      1.1  mrg   [(match_operand:SI 0 "register_operand" "")
   3087      1.1  mrg    (match_operand:V2HI 1 "register_operand" "")
   3088      1.1  mrg    (match_operand:V2HI 2 "register_operand" "")
   3089      1.1  mrg    (match_operand:SI 3 "register_operand" "")]
   3090      1.1  mrg   "TARGET_INSNS_64"
   3091      1.1  mrg {
   3092      1.1  mrg   rtx t = gen_reg_rtx (SImode);
   3093      1.1  mrg   emit_insn (gen_dotv2hi (t, operands[1], operands[2]));
   3094      1.1  mrg   emit_insn (gen_addsi3 (operands[0], operands[3], t));
   3095      1.1  mrg   DONE;
   3096      1.1  mrg })
   3097      1.1  mrg 
   3098      1.1  mrg ;; Unary vector operations
   3099      1.1  mrg 
   3100      1.1  mrg (define_insn "ssabsv2hi2"
   3101      1.1  mrg   [(set (match_operand:V2HI 0 "register_operand" "=a, a, b, b")
   3102      1.1  mrg         (ss_abs:V2HI (match_operand:V2HI 1 "register_operand" "a,?b, b,?a")))]
   3103      1.1  mrg   "TARGET_INSNS_64"
   3104      1.1  mrg   "%|%.\\tabs2\\t%$\\t%1, %0"
   3105      1.1  mrg   [(set_attr "units" "l")
   3106      1.1  mrg    (set_attr "cross" "n,y,n,y")])
   3107      1.1  mrg 
   3108      1.1  mrg ;; Pack insns
   3109      1.1  mrg 
   3110      1.1  mrg (define_insn "*packv2hi_insv"
   3111      1.1  mrg   [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+a,b,a,b,ab")
   3112      1.1  mrg 			 (const_int 16)
   3113      1.1  mrg 			 (const_int 16))
   3114      1.1  mrg 	(match_operand:SI 1 "nonmemory_operand" "a,b,?b,?a,n"))]
   3115      1.1  mrg   "TARGET_INSNS_64"
   3116      1.1  mrg   "@
   3117      1.1  mrg    %|%.\\tpack2\\t%$\\t%1, %0, %0
   3118      1.1  mrg    %|%.\\tpack2\\t%$\\t%1, %0, %0
   3119      1.1  mrg    %|%.\\tpack2\\t%$\\t%1, %0, %0
   3120      1.1  mrg    %|%.\\tpack2\\t%$\\t%1, %0, %0
   3121      1.1  mrg    %|%.\\tmvklh\\t%$\\t%1, %0"
   3122      1.1  mrg   [(set_attr "units" "ls")
   3123      1.1  mrg    (set_attr "cross" "n,n,y,y,n")])
   3124      1.1  mrg 
   3125      1.1  mrg (define_insn "movstricthi"
   3126      1.1  mrg   [(set (strict_low_part (match_operand:HI 0 "register_operand" "+a,b,a,b"))
   3127      1.1  mrg 	(match_operand:HI 1 "register_operand" "a,b,?b,?a"))]
   3128      1.1  mrg   "TARGET_INSNS_64"
   3129      1.1  mrg   "%|%.\\tpackhl2\\t%$\\t%0, %1, %0"
   3130      1.1  mrg   [(set_attr "units" "ls")
   3131      1.1  mrg    (set_attr "cross" "n,n,y,y")])
   3132      1.1  mrg 
   3133      1.1  mrg (include "c6x-mult.md")
   3134      1.1  mrg (include "sync.md")
   3135