1 1.1 mrg ;; Machine description for TI C6X. 2 1.10 mrg ;; Copyright (C) 2010-2022 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.3 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.3 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.4 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.3 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.4 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.3 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.3 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.3 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.3 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.3 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.4 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.4 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.9 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.9 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