1;; GCC machine description for CRIS cpu cores. 2;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 3;; 2008, 2009 Free Software Foundation, Inc. 4;; Contributed by Axis Communications. 5 6;; This file is part of GCC. 7;; 8;; GCC is free software; you can redistribute it and/or modify 9;; it under the terms of the GNU General Public License as published by 10;; the Free Software Foundation; either version 3, or (at your option) 11;; any later version. 12;; 13;; GCC is distributed in the hope that it will be useful, 14;; but WITHOUT ANY WARRANTY; without even the implied warranty of 15;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16;; GNU General Public License for more details. 17;; 18;; You should have received a copy of the GNU General Public License 19;; along with GCC; see the file COPYING3. If not see 20;; <http://www.gnu.org/licenses/>. 21 22;; The original PO technology requires these to be ordered by speed, 23;; so that assigner will pick the fastest. 24 25;; See files "md.texi" and "rtl.def" for documentation on define_insn, 26;; match_*, et. al. 27;; 28;; The function cris_notice_update_cc in cris.c handles condition code 29;; updates for most instructions, helped by the "cc" attribute. 30 31;; There are several instructions that are orthogonal in size, and seems 32;; they could be matched by a single pattern without a specified size 33;; for the operand that is orthogonal. However, this did not work on 34;; gcc-2.7.2 (and probably not on gcc-2.8.1), relating to that when a 35;; constant is substituted into an operand, the actual mode must be 36;; deduced from the pattern. There is reasonable hope that that has been 37;; fixed, so FIXME: try again. 38 39;; You will notice that three-operand alternatives ("=r", "r", "!To") 40;; are marked with a "!" constraint modifier to avoid being reloaded 41;; into. This is because gcc would otherwise prefer to use the constant 42;; pool and its offsettable address instead of reloading to an 43;; ("=r", "0", "i") alternative. Also, the constant-pool support was not 44;; only suboptimal but also buggy in 2.7.2, ??? maybe only in 2.6.3. 45 46;; All insns that look like (set (...) (plus (...) (reg:SI 8))) 47;; get problems when reloading r8 (frame pointer) to r14 + offs (stack 48;; pointer). Thus the instructions that get into trouble have specific 49;; checks against matching frame_pointer_rtx. 50;; ??? But it should be re-checked for gcc > 2.7.2 51;; FIXME: This changed some time ago (from 2000-03-16) for gcc-2.9x. 52 53;; FIXME: When PIC, all [rX=rY+S] could be enabled to match 54;; [rX=gotless_symbol]. 55;; The movsi for a gotless symbol could be split (post reload). 56 57 58(define_constants 59 [ 60 ;; PLT reference from call expansion: operand 0 is the address, 61 ;; the mode is VOIDmode. Always wrapped in CONST. 62 ;; The value is relative to the GOT. 63 (CRIS_UNSPEC_PLT_GOTREL 0) 64 65 ;; PLT reference from call expansion: operand 0 is the address, 66 ;; the mode is VOIDmode. Always wrapped in CONST. 67 ;; The value is relative to the PC. It's arch-dependent whether 68 ;; the offset counts from the start or the end of the current item. 69 (CRIS_UNSPEC_PLT_PCREL 1) 70 71 ;; The address of the global offset table as a source operand. 72 (CRIS_UNSPEC_GOT 2) 73 74 ;; The offset from the global offset table to the operand. 75 (CRIS_UNSPEC_GOTREL 3) 76 77 ;; The PC-relative offset to the operand. It's arch-dependent whether 78 ;; the offset counts from the start or the end of the current item. 79 (CRIS_UNSPEC_PCREL 4) 80 81 ;; The index into the global offset table of a symbol, while 82 ;; also generating a GOT entry for the symbol. 83 (CRIS_UNSPEC_GOTREAD 5) 84 85 ;; Similar to CRIS_UNSPEC_GOTREAD, but also generating a PLT entry. 86 (CRIS_UNSPEC_PLTGOTREAD 6) 87 88 ;; Condition for v32 casesi jump, since it needs to have if_then_else 89 ;; form with register as one branch and default label as other. 90 ;; Operand 0 is const_int 0. 91 (CRIS_UNSPEC_CASESI 7) 92 93 ;; Stack frame deallocation barrier. 94 (CRIS_UNSPEC_FRAME_DEALLOC 8) 95 96 ;; Swap all 32 bits of the operand; 31 <=> 0, 30 <=> 1... 97 (CRIS_UNSPEC_SWAP_BITS 9) 98 ]) 99 100;; Register numbers. 101(define_constants 102 [(CRIS_GOT_REGNUM 0) 103 (CRIS_STATIC_CHAIN_REGNUM 7) 104 (CRIS_FP_REGNUM 8) 105 (CRIS_SP_REGNUM 14) 106 (CRIS_ACR_REGNUM 15) 107 (CRIS_SRP_REGNUM 16) 108 (CRIS_MOF_REGNUM 17) 109 (CRIS_AP_REGNUM 18) 110 (CRIS_CC0_REGNUM 19)] 111) 112 113;; We need an attribute to define whether an instruction can be put in 114;; a branch-delay slot or not, and whether it has a delay slot. 115;; 116;; Branches and return instructions have a delay slot, and cannot 117;; themselves be put in a delay slot. This has changed *for short 118;; branches only* between architecture variants, but the possible win 119;; is presumed negligible compared to the added complexity of the machine 120;; description: one would have to add always-correct infrastructure to 121;; distinguish short branches. 122;; 123;; Whether an instruction can be put in a delay slot depends on the 124;; instruction (all short instructions except jumps and branches) 125;; and the addressing mode (must not be prefixed or referring to pc). 126;; In short, any "slottable" instruction must be 16 bit and not refer 127;; to pc, or alter it. 128;; 129;; The possible values are "yes", "no", "has_slot", "has_return_slot" 130;; and "has_call_slot". 131;; Yes/no tells whether the insn is slottable or not. Has_call_slot means 132;; that the insn is a call insn, which for CRIS v32 has a delay-slot. 133;; Of special concern is that no RTX_FRAME_RELATED insn must go in that 134;; call delay slot, as it's located in the address *after* the call insn, 135;; and the unwind machinery doesn't know about delay slots. 136;; Has_slot means that the insn is a branch insn (which are 137;; not considered slottable since that is generally true). Having the 138;; seemingly illogical value "has_slot" means we do not have to add 139;; another attribute just to say that an insn has a delay-slot, since it 140;; also infers that it is not slottable. Better names for the attribute 141;; were found to be longer and not add readability to the machine 142;; description. 143;; Has_return_slot is similar, for the return insn. 144;; 145;; The default that is defined here for this attribute is "no", not 146;; slottable, not having a delay-slot, so there's no need to worry about 147;; it being wrong for non-branch and return instructions. 148;; The default could depend on the kind of insn and the addressing 149;; mode, but that would need more attributes and hairier, more error 150;; prone code. 151;; 152;; There is an extra memory constraint, 'Q', which recognizes an indirect 153;; register. The constraints 'Q' and '>' together match all possible 154;; memory operands that are slottable. 155;; For other operands, you need to check if it has a valid "slottable" 156;; quick-immediate operand, where the particular signedness-variation 157;; may match the constraints 'I' or 'J'.), and include it in the 158;; constraint pattern for the slottable pattern. An alternative using 159;; only "r" constraints is most often slottable. 160 161(define_attr "slottable" "no,yes,has_slot,has_return_slot,has_call_slot" 162 (const_string "no")) 163 164;; We also need attributes to sanely determine the condition code 165;; state. See cris_notice_update_cc for how this is used. 166 167(define_attr "cc" "none,clobber,normal,noov32,rev" (const_string "normal")) 168 169;; At the moment, this attribute is just used to help bb-reorder do its 170;; work; the default 0 doesn't help it. Many insns have other lengths, 171;; though none are shorter. 172(define_attr "length" "" (const_int 2)) 173 174;; A branch has one delay-slot. The instruction in the 175;; delay-slot is always executed, independent of whether the branch is 176;; taken or not. Note that besides setting "slottable" to "has_slot", 177;; there also has to be a "%#" at the end of a "delayed" instruction 178;; output pattern (for "jump" this means "ba %l0%#"), so print_operand can 179;; catch it and print a "nop" if necessary. This method was stolen from 180;; sparc.md. 181 182(define_delay (eq_attr "slottable" "has_slot") 183 [(eq_attr "slottable" "yes") (nil) (nil)]) 184 185;; We can't put prologue insns in call-insn delay-slots when 186;; DWARF2 unwind info is emitted, because the unwinder matches the 187;; address after the insn. It must see the return address of a call at 188;; a position at least *one byte after* the insn, or it'll think that 189;; the insn hasn't been executed. If the insn is in a delay-slot of a 190;; call, it's just *exactly* after the insn. 191 192(define_delay (eq_attr "slottable" "has_call_slot") 193 [(and (eq_attr "slottable" "yes") 194 (ior (eq (symbol_ref "RTX_FRAME_RELATED_P (insn)") 195 (const_int 0)) 196 (eq (symbol_ref "flag_exceptions") 197 (const_int 0)))) 198 (nil) (nil)]) 199 200;; The insn in the return insn slot must not be the 201;; return-address-register restore. FIXME: Use has_slot and express 202;; as a parallel with a use of the return-address-register (currently 203;; only SRP). However, this requires an amount of fixing tests for 204;; naked RETURN in middle-end. 205(define_delay (eq_attr "slottable" "has_return_slot") 206 [(and (eq_attr "slottable" "yes") 207 (eq (symbol_ref "dead_or_set_regno_p (insn, CRIS_SRP_REGNUM)") 208 (const_int 0))) 209 (nil) (nil)]) 210 211 212;; Iterator definitions. 213 214;; For the "usual" pattern size alternatives. 215(define_mode_iterator BWD [SI HI QI]) 216(define_mode_iterator WD [SI HI]) 217(define_mode_iterator BW [HI QI]) 218(define_mode_attr S [(SI "HI") (HI "QI")]) 219(define_mode_attr s [(SI "hi") (HI "qi")]) 220(define_mode_attr m [(SI ".d") (HI ".w") (QI ".b")]) 221(define_mode_attr mm [(SI ".w") (HI ".b")]) 222(define_mode_attr nbitsm1 [(SI "31") (HI "15") (QI "7")]) 223 224;; For the sign_extend+zero_extend variants. 225(define_code_iterator szext [sign_extend zero_extend]) 226(define_code_attr u [(sign_extend "") (zero_extend "u")]) 227(define_code_attr su [(sign_extend "s") (zero_extend "u")]) 228 229;; For the shift variants. 230(define_code_iterator shift [ashiftrt lshiftrt ashift]) 231(define_code_iterator shiftrt [ashiftrt lshiftrt]) 232(define_code_attr shlr [(ashiftrt "ashr") (lshiftrt "lshr") (ashift "ashl")]) 233(define_code_attr slr [(ashiftrt "asr") (lshiftrt "lsr") (ashift "lsl")]) 234 235(define_code_iterator ncond [eq ne gtu ltu geu leu]) 236(define_code_iterator ocond [gt le]) 237(define_code_iterator rcond [lt ge]) 238(define_code_attr CC [(eq "eq") (ne "ne") (gt "gt") (gtu "hi") (lt "lt") 239 (ltu "lo") (ge "ge") (geu "hs") (le "le") (leu "ls")]) 240(define_code_attr rCC [(eq "ne") (ne "eq") (gt "le") (gtu "ls") (lt "ge") 241 (ltu "hs") (ge "lt") (geu "lo") (le "gt") (leu "hi")]) 242(define_code_attr oCC [(lt "mi") (ge "pl")]) 243(define_code_attr roCC [(lt "pl") (ge "mi")]) 244 245;; Operand and operator predicates. 246 247(include "predicates.md") 248 249;; Test insns. 250 251;; No test insns with side-effect on the mem addressing. 252;; 253;; See note on cmp-insns with side-effects (or lack of them) 254 255;; Normal named test patterns from SI on. 256 257(define_insn "*tstsi" 258 [(set (cc0) 259 (compare (match_operand:SI 0 "nonimmediate_operand" "r,Q>,m") 260 (const_int 0)))] 261 "" 262{ 263 if (which_alternative == 0 && TARGET_V32) 264 return "cmpq 0,%0"; 265 return "test.d %0"; 266} 267 [(set_attr "slottable" "yes,yes,no")]) 268 269(define_insn "*tst<mode>_cmp" 270 [(set (cc0) 271 (compare (match_operand:BW 0 "nonimmediate_operand" "r,Q>,m") 272 (const_int 0)))] 273 "cris_cc0_user_requires_cmp (insn)" 274 "@ 275 cmp<m> 0,%0 276 test<m> %0 277 test<m> %0" 278 [(set_attr "slottable" "no,yes,no")]) 279 280(define_insn "*tst<mode>_non_cmp" 281 [(set (cc0) 282 (compare (match_operand:BW 0 "nonimmediate_operand" "r,Q>,m") 283 (const_int 0)))] 284 "!cris_cc0_user_requires_cmp (insn)" 285 "@ 286 move<m> %0,%0 287 test<m> %0 288 test<m> %0" 289 [(set_attr "slottable" "yes,yes,no") 290 (set_attr "cc" "noov32,*,*")]) 291 292;; It seems that the position of the sign-bit and the fact that 0.0 is 293;; all 0-bits would make "tstsf" a straight-forward implementation; 294;; either "test.d" it for positive/negative or "btstq 30,r" it for 295;; zeroness. 296;; 297;; FIXME: Do that some time; check next_cc0_user to determine if 298;; zero or negative is tested for. 299 300;; Compare insns. 301 302;; We could optimize the sizes of the immediate operands for various 303;; cases, but that is not worth it because of the very little usage of 304;; DImode for anything else but a structure/block-mode. Just do the 305;; obvious stuff for the straight-forward constraint letters. 306 307(define_insn "*cmpdi_non_v32" 308 [(set (cc0) 309 (compare (match_operand:DI 0 "nonimmediate_operand" "rm,r,r,r,r,r,r,o") 310 (match_operand:DI 1 "general_operand" "M,Kc,I,P,n,r,o,r")))] 311 "!TARGET_V32" 312 "@ 313 test.d %M0\;ax\;test.d %H0 314 cmpq %1,%M0\;ax\;cmpq 0,%H0 315 cmpq %1,%M0\;ax\;cmpq -1,%H0 316 cmp%e1.%z1 %1,%M0\;ax\;cmpq %H1,%H0 317 cmp.d %M1,%M0\;ax\;cmp.d %H1,%H0 318 cmp.d %M1,%M0\;ax\;cmp.d %H1,%H0 319 cmp.d %M1,%M0\;ax\;cmp.d %H1,%H0 320 cmp.d %M0,%M1\;ax\;cmp.d %H0,%H1") 321 322(define_insn "*cmpdi_v32" 323 [(set (cc0) 324 (compare (match_operand:DI 0 "register_operand" "r,r,r,r,r") 325 (match_operand:DI 1 "nonmemory_operand" "Kc,I,P,n,r")))] 326 "TARGET_V32" 327 "@ 328 cmpq %1,%M0\;ax\;cmpq 0,%H0 329 cmpq %1,%M0\;ax\;cmpq -1,%H0 330 cmp%e1.%z1 %1,%M0\;ax\;cmpq %H1,%H0 331 cmp.d %M1,%M0\;ax\;cmp.d %H1,%H0 332 cmp.d %M1,%M0\;ax\;cmp.d %H1,%H0") 333 334;; Note that compare insns with side effect addressing mode (e.g.): 335;; 336;; cmp.S [rx=ry+i],rz; 337;; cmp.S [%3=%1+%2],%0 338;; 339;; are *not* usable for gcc since the reloader *does not accept* 340;; cc0-changing insns with side-effects other than setting the condition 341;; codes. The reason is that the reload stage *may* cause another insn to 342;; be output after the main instruction, in turn invalidating cc0 for the 343;; insn using the test. (This does not apply to the CRIS case, since a 344;; reload for output -- move to memory -- does not change the condition 345;; code. Unfortunately we have no way to describe that at the moment. I 346;; think code would improve being in the order of one percent faster. 347 348;; We have cmps and cmpu (compare reg w. sign/zero extended mem). 349;; These are mostly useful for compares in SImode, using 8 or 16-bit 350;; constants, but sometimes gcc will find its way to use it for other 351;; (memory) operands. Avoid side-effect patterns, though (see above). 352 353(define_insn "*cmp_ext<mode>" 354 [(set (cc0) 355 (compare 356 (match_operand:SI 0 "register_operand" "r,r") 357 (match_operator:SI 2 "cris_extend_operator" 358 [(match_operand:BW 1 "memory_operand" "Q>,m")])))] 359 "" 360 "cmp%e2<m> %1,%0" 361 [(set_attr "slottable" "yes,no")]) 362 363;; Swap operands; it seems the canonical look (if any) is not enforced. 364;; 365;; FIXME: Investigate that. 366 367(define_insn "*cmp_swapext<mode>" 368 [(set (cc0) 369 (compare 370 (match_operator:SI 2 "cris_extend_operator" 371 [(match_operand:BW 0 "memory_operand" "Q>,m")]) 372 (match_operand:SI 1 "register_operand" "r,r")))] 373 "" 374 "cmp%e2<m> %0,%1" 375 [(set_attr "slottable" "yes,no") 376 (set_attr "cc" "rev")]) 377 378;; The "normal" compare patterns, from SI on. Special-cases with zero 379;; are covered above. 380 381(define_insn "*cmpsi" 382 [(set (cc0) 383 (compare 384 (match_operand:SI 0 "nonimmediate_operand" "r,r,r, Q>,r,r,m") 385 (match_operand:SI 1 "general_operand" "I,r,Q>,r, P,g,r")))] 386 "" 387 "@ 388 cmpq %1,%0 389 cmp.d %1,%0 390 cmp.d %1,%0 391 cmp.d %0,%1 392 cmp%e1.%z1 %1,%0 393 cmp.d %1,%0 394 cmp.d %0,%1" 395 [(set_attr "slottable" "yes,yes,yes,yes,no,no,no") 396 (set_attr "cc" "normal,normal,normal,rev,normal,normal,rev")]) 397 398(define_insn "*cmp<mode>" 399 [(set (cc0) 400 (compare (match_operand:BW 0 "nonimmediate_operand" "r,r, Q>,r,m") 401 (match_operand:BW 1 "general_operand" "r,Q>,r, g,r")))] 402 "" 403 "@ 404 cmp<m> %1,%0 405 cmp<m> %1,%0 406 cmp<m> %0,%1 407 cmp<m> %1,%0 408 cmp<m> %0,%1" 409 [(set_attr "slottable" "yes,yes,yes,no,no") 410 (set_attr "cc" "normal,normal,rev,normal,rev")]) 411 412;; Pattern matching the BTST insn. 413;; It is useful for "if (i & val)" constructs, where val is an exact 414;; power of 2, or if val + 1 is a power of two, where we check for a bunch 415;; of zeros starting at bit 0). 416 417;; SImode. This mode is the only one needed, since gcc automatically 418;; extends subregs for lower-size modes. FIXME: Add testcase. 419(define_insn "*btst" 420 [(set (cc0) 421 (compare 422 (zero_extract:SI 423 (match_operand:SI 0 "nonmemory_operand" "r, r,r, r,r, r,Kp") 424 (match_operand:SI 1 "const_int_operand" "Kc,n,Kc,n,Kc,n,n") 425 (match_operand:SI 2 "nonmemory_operand" "M, M,Kc,n,r, r,r")) 426 (const_int 0)))] 427 ;; Either it is a single bit, or consecutive ones starting at 0. 428 ;; The btst ones depend on stuff in NOTICE_UPDATE_CC. 429 "CONST_INT_P (operands[1]) 430 && (operands[1] == const1_rtx || operands[2] == const0_rtx) 431 && (REG_S_P (operands[0]) 432 || (operands[1] == const1_rtx 433 && REG_S_P (operands[2]) 434 && CONST_INT_P (operands[0]) 435 && exact_log2 (INTVAL (operands[0])) >= 0)) 436 && !TARGET_CCINIT" 437 438;; The next-to-last "&&" condition above should be caught by some kind of 439;; canonicalization in gcc, but we can easily help with it here. 440;; It results from expressions of the type 441;; "power_of_2_value & (1 << y)". 442;; 443;; Since there may be codes with tests in on bits (in constant position) 444;; beyond the size of a word, handle that by assuming those bits are 0. 445;; GCC should handle that, but it's a matter of easily-added belts while 446;; having suspenders. 447 448 "@ 449 btstq (%1-1),%0 450 cmpq 0,%0 451 btstq %2,%0 452 clearf nz 453 btst %2,%0 454 clearf nz 455 cmpq %p0,%2" 456 [(set_attr "slottable" "yes") 457 (set_attr "cc" "noov32")]) 458 459;; Move insns. 460 461;; The whole mandatory movdi family is here; expander, "anonymous" 462;; recognizer and splitter. We're forced to have a movdi pattern, 463;; although GCC should be able to split it up itself. Normally it can, 464;; but if other insns have DI operands (as is the case here), reload 465;; must be able to generate or match a movdi. many testcases fail at 466;; -O3 or -fssa if we don't have this. FIXME: Fix GCC... See 467;; <URL:http://gcc.gnu.org/ml/gcc-patches/2000-04/msg00104.html>. 468;; However, a patch from Richard Kenner (similar to the cause of 469;; discussion at the URL above), indicates otherwise. See 470;; <URL:http://gcc.gnu.org/ml/gcc-patches/2000-04/msg00554.html>. 471;; The truth has IMO is not been decided yet, so check from time to 472;; time by disabling the movdi patterns. 473 474;; To appease testcase gcc.c-torture/execute/920501-2.c (and others) at 475;; -O0, we need a movdi as a temporary measure. Here's how things fail: 476;; A cmpdi RTX needs reloading (global): 477;; (insn 185 326 186 (set (cc0) 478;; (compare (mem/f:DI (reg/v:SI 22) 0) 479;; (const_int 1 [0x1]))) 4 {cmpdi} (nil) 480;; (nil)) 481;; Now, reg 22 is reloaded for input address, and the mem is also moved 482;; out of the instruction (into a register), since one of the operands 483;; must be a register. Reg 22 is reloaded (into reg 10), and the mem is 484;; moved out and synthesized in SImode parts (reg 9, reg 10 - should be ok 485;; wrt. overlap). The bad things happen with the synthesis in 486;; emit_move_insn_1; the location where to substitute reg 10 is lost into 487;; two new RTX:es, both still having reg 22. Later on, the left-over reg 488;; 22 is recognized to have an equivalent in memory which is substituted 489;; straight in, and we end up with an unrecognizable insn: 490;; (insn 325 324 326 (set (reg:SI 9 r9) 491;; (mem/f:SI (mem:SI (plus:SI (reg:SI 8 r8) 492;; (const_int -84 [0xffffffac])) 0) 0)) -1 (nil) 493;; (nil)) 494;; which is the first part of the reloaded synthesized "movdi". 495;; The right thing would be to add equivalent replacement locations for 496;; insn with pseudos that need more reloading. The question is where. 497 498(define_expand "movdi" 499 [(set (match_operand:DI 0 "nonimmediate_operand" "") 500 (match_operand:DI 1 "general_operand" ""))] 501 "" 502{ 503 if (MEM_P (operands[0]) 504 && operands[1] != const0_rtx 505 && (!TARGET_V32 || (!REG_P (operands[1]) && can_create_pseudo_p ()))) 506 operands[1] = copy_to_mode_reg (DImode, operands[1]); 507 508 /* Some other ports (as of 2001-09-10 for example mcore and romp) also 509 prefer to split up constants early, like this. The testcase in 510 gcc.c-torture/execute/961213-1.c shows that CSE2 gets confused by the 511 resulting subreg sets when using the construct from mcore (as of FSF 512 CVS, version -r 1.5), and it believes that the high part (the last one 513 emitted) is the final value. */ 514 if ((CONST_INT_P (operands[1]) || GET_CODE (operands[1]) == CONST_DOUBLE) 515 && ! reload_completed 516 && ! reload_in_progress) 517 { 518 rtx insns; 519 rtx op0 = operands[0]; 520 rtx op1 = operands[1]; 521 522 start_sequence (); 523 emit_move_insn (operand_subword (op0, 0, 1, DImode), 524 operand_subword (op1, 0, 1, DImode)); 525 emit_move_insn (operand_subword (op0, 1, 1, DImode), 526 operand_subword (op1, 1, 1, DImode)); 527 insns = get_insns (); 528 end_sequence (); 529 530 emit_insn (insns); 531 DONE; 532 } 533}) 534 535(define_insn_and_split "*movdi_insn_non_v32" 536 [(set (match_operand:DI 0 "nonimmediate_operand" "=r,rx,m") 537 (match_operand:DI 1 "general_operand" "rx,g,rxM"))] 538 "(register_operand (operands[0], DImode) 539 || register_operand (operands[1], DImode) 540 || operands[1] == const0_rtx) 541 && !TARGET_V32" 542 "#" 543 "&& reload_completed" 544 [(match_dup 2)] 545 "operands[2] = cris_split_movdx (operands);") 546 547;; Overlapping (but non-identical) source memory address and destination 548;; register would be a compiler bug, so we don't have to specify that. 549(define_insn "*movdi_v32" 550 [(set 551 (match_operand:DI 0 "nonimmediate_operand" "=r,rx,&r,>, m,r,x,m") 552 (match_operand:DI 1 "general_operand" "rxi,r>,m, rx,r,m,m,x"))] 553 "TARGET_V32" 554{ 555 switch (which_alternative) 556 { 557 /* FIXME: 1) Use autoincrement where possible. 2) Have peephole2, 558 particularly for cases where the address register is dead. */ 559 case 5: 560 if (REGNO (operands[0]) == REGNO (XEXP (operands[1], 0))) 561 return "addq 4,%L1\;move.d %1,%H0\;subq 4,%L1\;move.d %1,%M0"; 562 gcc_assert (REGNO (operands[0]) + 1 == REGNO (XEXP (operands[1], 0))); 563 return "move.d [%L1+],%M0\;move.d [%L1],%H0"; 564 case 2: 565 /* We could do away with the addq if we knew the address-register 566 isn't ACR. If we knew the address-register is dead, we could do 567 away with the subq too. */ 568 return "move.d [%L1],%M0\;addq 4,%L1\;move.d [%L1],%H0\;subq 4,%L1"; 569 case 4: 570 return "move.d %M1,[%L0]\;addq 4,%L0\;move.d %H1,[%L0]\;subq 4,%L0"; 571 case 6: 572 return "move [%L1],%M0\;addq 4,%L1\;move [%L1],%H0\;subq 4,%L1"; 573 case 7: 574 return "move %M1,[%L0]\;addq 4,%L0\;move %H1,[%L0]\;subq 4,%L0"; 575 576 default: 577 return "#"; 578 } 579} 580 ;; The non-split cases clobber cc0 because of their adds and subs. 581 ;; Beware that NOTICE_UPDATE_CC is called before the forced split happens. 582 [(set_attr "cc" "*,*,clobber,*,clobber,clobber,*,*")]) 583 584;; Much like "*movdi_insn_non_v32". Overlapping registers and constants 585;; is handled so much better in cris_split_movdx. 586(define_split 587 [(set (match_operand:DI 0 "nonimmediate_operand" "") 588 (match_operand:DI 1 "general_operand" ""))] 589 "TARGET_V32 590 && reload_completed 591 && (!MEM_P (operands[0]) || !REG_P (XEXP (operands[0], 0))) 592 && (!MEM_P (operands[1]) || !REG_P (XEXP (operands[1], 0)))" 593 [(match_dup 2)] 594 "operands[2] = cris_split_movdx (operands);") 595 596;; Side-effect patterns for move.S1 [rx=ry+rx.S2],rw 597;; and move.S1 [rx=ry+i],rz 598;; Then movs.S1 and movu.S1 for both modes. 599;; 600;; move.S1 [rx=ry+rz.S],rw avoiding when rx is ry, or rw is rx 601;; FIXME: These could have anonymous mode for operand 0. 602;; FIXME: Special registers' alternatives too. 603 604(define_insn "*mov_side<mode>_biap" 605 [(set (match_operand:BW 0 "register_operand" "=r,r") 606 (mem:BW (plus:SI 607 (mult:SI (match_operand:SI 1 "register_operand" "r,r") 608 (match_operand:SI 2 "const_int_operand" "n,n")) 609 (match_operand:SI 3 "register_operand" "r,r")))) 610 (set (match_operand:SI 4 "register_operand" "=*3,r") 611 (plus:SI (mult:SI (match_dup 1) 612 (match_dup 2)) 613 (match_dup 3)))] 614 "cris_side_effect_mode_ok (MULT, operands, 4, 3, 1, 2, 0)" 615 "@ 616 # 617 move<m> [%4=%3+%1%T2],%0") 618 619(define_insn "*mov_sidesisf_biap" 620 [(set (match_operand 0 "register_operand" "=r,r,x,x") 621 (mem (plus:SI 622 (mult:SI (match_operand:SI 1 "register_operand" "r,r,r,r") 623 (match_operand:SI 2 "const_int_operand" "n,n,n,n")) 624 (match_operand:SI 3 "register_operand" "r,r,r,r")))) 625 (set (match_operand:SI 4 "register_operand" "=*3,r,*3,r") 626 (plus:SI (mult:SI (match_dup 1) 627 (match_dup 2)) 628 (match_dup 3)))] 629 "GET_MODE_SIZE (GET_MODE (operands[0])) == UNITS_PER_WORD 630 && cris_side_effect_mode_ok (MULT, operands, 4, 3, 1, 2, 0)" 631 "@ 632 # 633 move.%s0 [%4=%3+%1%T2],%0 634 # 635 move [%4=%3+%1%T2],%0") 636 637;; move.S1 [rx=ry+i],rz 638;; avoiding move.S1 [ry=ry+i],rz 639;; and move.S1 [rz=ry+i],rz 640;; Note that "i" is allowed to be a register. 641 642(define_insn "*mov_side<mode>" 643 [(set (match_operand:BW 0 "register_operand" "=r,r,r,r,r") 644 (mem:BW 645 (plus:SI (match_operand:SI 1 "cris_bdap_operand" "%r,r,r,R,R") 646 (match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))) 647 (set (match_operand:SI 3 "register_operand" "=*1,r,r,*2,r") 648 (plus:SI (match_dup 1) 649 (match_dup 2)))] 650 "cris_side_effect_mode_ok (PLUS, operands, 3, 1, 2, -1, 0)" 651{ 652 if ((which_alternative == 0 || which_alternative == 3) 653 && (!CONST_INT_P (operands[2]) 654 || INTVAL (operands[2]) > 127 655 || INTVAL (operands[2]) < -128 656 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N') 657 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))) 658 return "#"; 659 if (which_alternative == 4) 660 return "move<m> [%3=%2%S1],%0"; 661 return "move<m> [%3=%1%S2],%0"; 662}) 663 664(define_insn "*mov_sidesisf" 665 [(set (match_operand 0 "register_operand" "=r,r,r,x,x,x,r,r,x,x") 666 (mem 667 (plus:SI 668 (match_operand:SI 1 "cris_bdap_operand" "%r,r,r,r,r,r,R,R,R,R") 669 (match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn,r>Rn,r,>Rn,r,r,r,r")))) 670 (set (match_operand:SI 3 "register_operand" "=*1,r,r,*1,r,r,*2,r,*2,r") 671 (plus:SI (match_dup 1) 672 (match_dup 2)))] 673 "GET_MODE_SIZE (GET_MODE (operands[0])) == UNITS_PER_WORD 674 && cris_side_effect_mode_ok (PLUS, operands, 3, 1, 2, -1, 0)" 675{ 676 if ((which_alternative == 0 677 || which_alternative == 3 678 || which_alternative == 6 679 || which_alternative == 8) 680 && (!CONST_INT_P (operands[2]) 681 || INTVAL (operands[2]) > 127 682 || INTVAL (operands[2]) < -128 683 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N') 684 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))) 685 return "#"; 686 if (which_alternative < 3) 687 return "move.%s0 [%3=%1%S2],%0"; 688 if (which_alternative == 7) 689 return "move.%s0 [%3=%2%S1],%0"; 690 if (which_alternative == 9) 691 return "move [%3=%2%S1],%0"; 692 return "move [%3=%1%S2],%0"; 693}) 694 695;; Other way around; move to memory. 696 697;; Note that the condition (which for side-effect patterns is usually a 698;; call to cris_side_effect_mode_ok), isn't consulted for register 699;; allocation preferences -- constraints is the method for that. The 700;; drawback is that we can't exclude register allocation to cause 701;; "move.s rw,[rx=ry+rz.S]" when rw==rx without also excluding rx==ry or 702;; rx==rz if we use an earlyclobber modifier for the constraint for rx. 703;; Instead of that, we recognize and split the cases where dangerous 704;; register combinations are spotted: where a register is set in the 705;; side-effect, and used in the main insn. We don't handle the case where 706;; the set in the main insn overlaps the set in the side-effect; that case 707;; must be handled in gcc. We handle just the case where the set in the 708;; side-effect overlaps the input operand of the main insn (i.e. just 709;; moves to memory). 710 711;; 712;; move.s rz,[ry=rx+rw.S] 713 714(define_insn "*mov_side<mode>_biap_mem" 715 [(set (mem:BW (plus:SI 716 (mult:SI (match_operand:SI 0 "register_operand" "r,r,r") 717 (match_operand:SI 1 "const_int_operand" "n,n,n")) 718 (match_operand:SI 2 "register_operand" "r,r,r"))) 719 (match_operand:BW 3 "register_operand" "r,r,r")) 720 (set (match_operand:SI 4 "register_operand" "=*2,!3,r") 721 (plus:SI (mult:SI (match_dup 0) 722 (match_dup 1)) 723 (match_dup 2)))] 724 "cris_side_effect_mode_ok (MULT, operands, 4, 2, 0, 1, 3)" 725 "@ 726 # 727 # 728 move<m> %3,[%4=%2+%0%T1]") 729 730(define_insn "*mov_sidesisf_biap_mem" 731 [(set (mem (plus:SI 732 (mult:SI (match_operand:SI 0 "register_operand" "r,r,r,r,r,r") 733 (match_operand:SI 1 "const_int_operand" "n,n,n,n,n,n")) 734 (match_operand:SI 2 "register_operand" "r,r,r,r,r,r"))) 735 (match_operand 3 "register_operand" "r,r,r,x,x,x")) 736 (set (match_operand:SI 4 "register_operand" "=*2,!3,r,*2,!3,r") 737 (plus:SI (mult:SI (match_dup 0) 738 (match_dup 1)) 739 (match_dup 2)))] 740 "GET_MODE_SIZE (GET_MODE (operands[3])) == UNITS_PER_WORD 741 && cris_side_effect_mode_ok (MULT, operands, 4, 2, 0, 1, 3)" 742 "@ 743 # 744 # 745 move.%s3 %3,[%4=%2+%0%T1] 746 # 747 # 748 move %3,[%4=%2+%0%T1]") 749 750;; Split for the case above where we're out of luck with register 751;; allocation (again, the condition isn't checked for that), and we end up 752;; with the set in the side-effect getting the same register as the input 753;; register. 754 755(define_split 756 [(parallel 757 [(set (match_operator 758 6 "cris_mem_op" 759 [(plus:SI 760 (mult:SI (match_operand:SI 0 "register_operand" "") 761 (match_operand:SI 1 "const_int_operand" "")) 762 (match_operand:SI 2 "register_operand" ""))]) 763 (match_operand 3 "register_operand" "")) 764 (set (match_operand:SI 4 "register_operand" "") 765 (plus:SI (mult:SI (match_dup 0) 766 (match_dup 1)) 767 (match_dup 2)))])] 768 "reload_completed && reg_overlap_mentioned_p (operands[4], operands[3])" 769 [(set (match_dup 5) (match_dup 3)) 770 (set (match_dup 4) (match_dup 2)) 771 (set (match_dup 4) 772 (plus:SI (mult:SI (match_dup 0) 773 (match_dup 1)) 774 (match_dup 4)))] 775 "operands[5] 776 = replace_equiv_address (operands[6], 777 gen_rtx_PLUS (SImode, 778 gen_rtx_MULT (SImode, 779 operands[0], 780 operands[1]), 781 operands[2]));") 782 783;; move.s rx,[ry=rz+i] 784;; FIXME: These could have anonymous mode for operand 2. 785 786;; QImode 787 788(define_insn "*mov_side<mode>_mem" 789 [(set (mem:BW 790 (plus:SI (match_operand:SI 0 "cris_bdap_operand" "%r,r,r,r,R,R,R") 791 (match_operand:SI 1 "cris_bdap_operand" "r>Rn,r>Rn,r,>Rn,r,r,r"))) 792 (match_operand:BW 2 "register_operand" "r,r,r,r,r,r,r")) 793 (set (match_operand:SI 3 "register_operand" "=*0,!*2,r,r,*1,!*2,r") 794 (plus:SI (match_dup 0) 795 (match_dup 1)))] 796 "cris_side_effect_mode_ok (PLUS, operands, 3, 0, 1, -1, 2)" 797{ 798 if ((which_alternative == 0 || which_alternative == 4) 799 && (!CONST_INT_P (operands[1]) 800 || INTVAL (operands[1]) > 127 801 || INTVAL (operands[1]) < -128 802 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'N') 803 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'J'))) 804 return "#"; 805 if (which_alternative == 1 || which_alternative == 5) 806 return "#"; 807 if (which_alternative == 6) 808 return "move.%s2 %2,[%3=%1%S0]"; 809 return "move<m> %2,[%3=%0%S1]"; 810}) 811 812;; SImode 813 814(define_insn "*mov_sidesisf_mem" 815 [(set (mem 816 (plus:SI 817 (match_operand:SI 818 0 "cris_bdap_operand" 819 "%r, r, r,r, r, r,r, R,R, R,R, R") 820 (match_operand:SI 821 1 "cris_bdap_operand" 822 "r>Rn,r>Rn,r,>Rn,r>Rn,r,>Rn,r,r, r,r, r"))) 823 (match_operand 2 "register_operand" 824 "r, r, r,r, x, x,x, r,r, r,x, x")) 825 (set (match_operand:SI 3 "register_operand" 826 "=*0,!2, r,r, *0, r,r, *1,!*2,r,*1,r") 827 (plus:SI (match_dup 0) 828 (match_dup 1)))] 829 "GET_MODE_SIZE (GET_MODE (operands[2])) == UNITS_PER_WORD 830 && cris_side_effect_mode_ok (PLUS, operands, 3, 0, 1, -1, 2)" 831{ 832 if ((which_alternative == 0 || which_alternative == 4) 833 && (!CONST_INT_P (operands[1]) 834 || INTVAL (operands[1]) > 127 835 || INTVAL (operands[1]) < -128 836 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'N') 837 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'J'))) 838 return "#"; 839 if (which_alternative == 1 840 || which_alternative == 7 841 || which_alternative == 8 842 || which_alternative == 10) 843 return "#"; 844 if (which_alternative < 4) 845 return "move.%s2 %2,[%3=%0%S1]"; 846 if (which_alternative == 9) 847 return "move.%s2 %2,[%3=%1%S0]"; 848 if (which_alternative == 11) 849 return "move %2,[%3=%1%S0]"; 850 return "move %2,[%3=%0%S1]"; 851}) 852 853;; Like the biap case, a split where the set in the side-effect gets the 854;; same register as the input register to the main insn, since the 855;; condition isn't checked at register allocation. 856 857(define_split 858 [(parallel 859 [(set (match_operator 860 4 "cris_mem_op" 861 [(plus:SI 862 (match_operand:SI 0 "cris_bdap_operand" "") 863 (match_operand:SI 1 "cris_bdap_operand" ""))]) 864 (match_operand 2 "register_operand" "")) 865 (set (match_operand:SI 3 "register_operand" "") 866 (plus:SI (match_dup 0) (match_dup 1)))])] 867 "reload_completed && reg_overlap_mentioned_p (operands[3], operands[2])" 868 [(set (match_dup 4) (match_dup 2)) 869 (set (match_dup 3) (match_dup 0)) 870 (set (match_dup 3) (plus:SI (match_dup 3) (match_dup 1)))] 871 "") 872 873;; Clear memory side-effect patterns. It is hard to get to the mode if 874;; the MEM was anonymous, so there will be one for each mode. 875 876;; clear.[bwd] [ry=rx+rw.s2] 877 878(define_insn "*clear_side<mode>_biap" 879 [(set (mem:BWD (plus:SI 880 (mult:SI (match_operand:SI 0 "register_operand" "r,r") 881 (match_operand:SI 1 "const_int_operand" "n,n")) 882 (match_operand:SI 2 "register_operand" "r,r"))) 883 (const_int 0)) 884 (set (match_operand:SI 3 "register_operand" "=*2,r") 885 (plus:SI (mult:SI (match_dup 0) 886 (match_dup 1)) 887 (match_dup 2)))] 888 "cris_side_effect_mode_ok (MULT, operands, 3, 2, 0, 1, -1)" 889 "@ 890 # 891 clear<m> [%3=%2+%0%T1]") 892 893;; clear.[bwd] [ry=rz+i] 894 895(define_insn "*clear_side<mode>" 896 [(set (mem:BWD 897 (plus:SI (match_operand:SI 0 "cris_bdap_operand" "%r,r,r,R,R") 898 (match_operand:SI 1 "cris_bdap_operand" "r>Rn,r,>Rn,r,r"))) 899 (const_int 0)) 900 (set (match_operand:SI 2 "register_operand" "=*0,r,r,*1,r") 901 (plus:SI (match_dup 0) 902 (match_dup 1)))] 903 "cris_side_effect_mode_ok (PLUS, operands, 2, 0, 1, -1, -1)" 904{ 905 if ((which_alternative == 0 || which_alternative == 3) 906 && (!CONST_INT_P (operands[1]) 907 || INTVAL (operands[1]) > 127 908 || INTVAL (operands[1]) < -128 909 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'N') 910 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'J'))) 911 return "#"; 912 if (which_alternative == 4) 913 return "clear<m> [%2=%1%S0]"; 914 return "clear<m> [%2=%0%S1]"; 915}) 916 917;; Normal move patterns from SI on. 918 919(define_expand "movsi" 920 [(set 921 (match_operand:SI 0 "nonimmediate_operand" "") 922 (match_operand:SI 1 "cris_general_operand_or_symbol" ""))] 923 "" 924{ 925 /* If the output goes to a MEM, make sure we have zero or a register as 926 input. */ 927 if (MEM_P (operands[0]) 928 && ! REG_S_P (operands[1]) 929 && operands[1] != const0_rtx 930 && can_create_pseudo_p ()) 931 operands[1] = force_reg (SImode, operands[1]); 932 933 /* If we're generating PIC and have an incoming symbol, validize it to a 934 general operand or something that will match a special pattern. 935 936 FIXME: Do we *have* to recognize anything that would normally be a 937 valid symbol? Can we exclude global PIC addresses with an added 938 offset? */ 939 if (flag_pic 940 && CONSTANT_ADDRESS_P (operands[1]) 941 && !cris_valid_pic_const (operands[1], false)) 942 { 943 enum cris_pic_symbol_type t = cris_pic_symbol_type_of (operands[1]); 944 945 gcc_assert (t != cris_no_symbol); 946 947 if (! REG_S_P (operands[0])) 948 { 949 /* We must have a register as destination for what we're about to 950 do, and for the patterns we generate. */ 951 CRIS_ASSERT (can_create_pseudo_p ()); 952 operands[1] = force_reg (SImode, operands[1]); 953 } 954 else 955 { 956 /* FIXME: add a REG_EQUAL (or is it REG_EQUIV) note to the 957 destination register for the symbol. It might not be 958 worth it. Measure. */ 959 crtl->uses_pic_offset_table = 1; 960 if (t == cris_rel_symbol) 961 { 962 /* Change a "move.d sym(+offs),rN" into (allocate register rM) 963 for pre-v32: 964 "move.d (const (plus (unspec [sym] 965 CRIS_UNSPEC_GOTREL) offs)),rM" "add.d rPIC,rM,rN" 966 and for v32: 967 "move.d (const (plus (unspec [sym] 968 CRIS_UNSPEC_PCREL) offs)),rN". */ 969 rtx tem, rm, rn = operands[0]; 970 rtx sym = GET_CODE (operands[1]) != CONST 971 ? operands[1] : get_related_value (operands[1]); 972 HOST_WIDE_INT offs = get_integer_term (operands[1]); 973 974 gcc_assert (can_create_pseudo_p ()); 975 976 if (TARGET_V32) 977 { 978 tem = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, sym), 979 CRIS_UNSPEC_PCREL); 980 if (offs != 0) 981 tem = plus_constant (tem, offs); 982 rm = rn; 983 emit_move_insn (rm, gen_rtx_CONST (Pmode, tem)); 984 } 985 else 986 { 987 /* We still uses GOT-relative addressing for 988 pre-v32. */ 989 crtl->uses_pic_offset_table = 1; 990 tem = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, sym), 991 CRIS_UNSPEC_GOTREL); 992 if (offs != 0) 993 tem = plus_constant (tem, offs); 994 rm = gen_reg_rtx (Pmode); 995 emit_move_insn (rm, gen_rtx_CONST (Pmode, tem)); 996 if (expand_binop (Pmode, add_optab, rm, pic_offset_table_rtx, 997 rn, 0, OPTAB_LIB_WIDEN) != rn) 998 internal_error ("expand_binop failed in movsi gotrel"); 999 } 1000 DONE; 1001 } 1002 else if (t == cris_got_symbol) 1003 { 1004 /* Change a "move.d sym,rN" into (allocate register rM, rO) 1005 "move.d (const (unspec [sym] CRIS_UNSPEC_GOTREAD)),rM" 1006 "add.d rPIC,rM,rO", "move.d [rO],rN" with 1007 the memory access marked as read-only. */ 1008 rtx tem, mem, rm, ro, rn = operands[0]; 1009 gcc_assert (can_create_pseudo_p ()); 1010 tem = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, operands[1]), 1011 CRIS_UNSPEC_GOTREAD); 1012 rm = gen_reg_rtx (Pmode); 1013 emit_move_insn (rm, gen_rtx_CONST (Pmode, tem)); 1014 ro = gen_reg_rtx (Pmode); 1015 if (expand_binop (Pmode, add_optab, rm, pic_offset_table_rtx, 1016 ro, 0, OPTAB_LIB_WIDEN) != ro) 1017 internal_error ("expand_binop failed in movsi got"); 1018 mem = gen_rtx_MEM (Pmode, ro); 1019 1020 /* This MEM doesn't alias anything. Whether it 1021 aliases other same symbols is unimportant. */ 1022 set_mem_alias_set (mem, new_alias_set ()); 1023 MEM_NOTRAP_P (mem) = 1; 1024 1025 /* We can set the GOT memory read of a non-called symbol 1026 to readonly, but not that of a call symbol, as those 1027 are subject to lazy evaluation and usually have the value 1028 changed from the first call to the second (but 1029 constant thereafter). */ 1030 MEM_READONLY_P (mem) = 1; 1031 emit_move_insn (rn, mem); 1032 DONE; 1033 } 1034 else 1035 { 1036 /* We get here when we have to change something that would 1037 be recognizable if it wasn't PIC. A ``sym'' is ok for 1038 PIC symbols both with and without a GOT entry. And ``sym 1039 + offset'' is ok for local symbols, so the only thing it 1040 could be, is a global symbol with an offset. Check and 1041 abort if not. */ 1042 rtx reg = gen_reg_rtx (Pmode); 1043 rtx sym = get_related_value (operands[1]); 1044 HOST_WIDE_INT offs = get_integer_term (operands[1]); 1045 1046 gcc_assert (can_create_pseudo_p () 1047 && t == cris_got_symbol_needing_fixup 1048 && sym != NULL_RTX && offs != 0); 1049 1050 emit_move_insn (reg, sym); 1051 if (expand_binop (SImode, add_optab, reg, 1052 GEN_INT (offs), operands[0], 0, 1053 OPTAB_LIB_WIDEN) != operands[0]) 1054 internal_error ("expand_binop failed in movsi got+offs"); 1055 DONE; 1056 } 1057 } 1058 } 1059}) 1060 1061(define_insn "*movsi_got_load" 1062 [(set (reg:SI CRIS_GOT_REGNUM) (unspec:SI [(const_int 0)] CRIS_UNSPEC_GOT))] 1063 "flag_pic" 1064{ 1065 return TARGET_V32 1066 ? "lapc _GLOBAL_OFFSET_TABLE_,%:" 1067 : "move.d $pc,%:\;sub.d .:GOTOFF,%:"; 1068} 1069 [(set_attr "cc" "clobber")]) 1070 1071(define_insn "*movsi_internal" 1072 [(set 1073 (match_operand:SI 0 "nonimmediate_operand" 1074 "=r,r, r,Q>,r,Q>,g,r,r, r,g,rQ>,x, m,x") 1075 (match_operand:SI 1 "cris_general_operand_or_pic_source" 1076 "r,Q>,M,M, I,r, M,n,!S,g,r,x, rQ>,x,gi"))] 1077 ;; Note that we prefer not to use the S alternative (if for some reason 1078 ;; it competes with others) above, but g matches S. 1079 "" 1080{ 1081 /* Better to have c-switch here; it is worth it to optimize the size of 1082 move insns. The alternative would be to try to find more constraint 1083 letters. FIXME: Check again. It seems this could shrink a bit. */ 1084 switch (which_alternative) 1085 { 1086 case 9: 1087 if (TARGET_V32) 1088 { 1089 if (!flag_pic 1090 && (GET_CODE (operands[1]) == SYMBOL_REF 1091 || GET_CODE (operands[1]) == LABEL_REF 1092 || GET_CODE (operands[1]) == CONST)) 1093 { 1094 /* FIXME: Express this through (set_attr cc none) instead, 1095 since we can't express the ``none'' at this point. FIXME: 1096 Use lapc for everything except const_int and when next cc0 1097 user would want the flag setting. */ 1098 CC_STATUS_INIT; 1099 return "lapc %1,%0"; 1100 } 1101 if (flag_pic == 1 1102 && GET_CODE (operands[1]) == CONST 1103 && GET_CODE (XEXP (operands[1], 0)) == UNSPEC 1104 && XINT (XEXP (operands[1], 0), 1) == CRIS_UNSPEC_GOTREAD) 1105 return "movu.w %1,%0"; 1106 } 1107 /* FALLTHROUGH */ 1108 case 0: 1109 case 1: 1110 case 5: 1111 case 10: 1112 return "move.d %1,%0"; 1113 1114 case 11: 1115 case 12: 1116 case 13: 1117 case 14: 1118 return "move %d1,%0"; 1119 1120 case 2: 1121 case 3: 1122 case 6: 1123 return "clear.d %0"; 1124 1125 /* Constants -32..31 except 0. */ 1126 case 4: 1127 return "moveq %1,%0"; 1128 1129 /* We can win a little on constants -32768..-33, 32..65535. */ 1130 case 7: 1131 if (INTVAL (operands[1]) > 0 && INTVAL (operands[1]) < 65536) 1132 { 1133 if (INTVAL (operands[1]) < 256) 1134 return "movu.b %1,%0"; 1135 return "movu.w %1,%0"; 1136 } 1137 else if (INTVAL (operands[1]) >= -32768 && INTVAL (operands[1]) < 32768) 1138 { 1139 if (INTVAL (operands[1]) >= -128 && INTVAL (operands[1]) < 128) 1140 return "movs.b %1,%0"; 1141 return "movs.w %1,%0"; 1142 } 1143 return "move.d %1,%0"; 1144 1145 case 8: 1146 { 1147 rtx tem = operands[1]; 1148 gcc_assert (GET_CODE (tem) == CONST); 1149 tem = XEXP (tem, 0); 1150 if (GET_CODE (tem) == PLUS 1151 && GET_CODE (XEXP (tem, 0)) == UNSPEC 1152 && (XINT (XEXP (tem, 0), 1) == CRIS_UNSPEC_GOTREL 1153 || XINT (XEXP (tem, 0), 1) == CRIS_UNSPEC_PCREL) 1154 && CONST_INT_P (XEXP (tem, 1))) 1155 tem = XEXP (tem, 0); 1156 gcc_assert (GET_CODE (tem) == UNSPEC); 1157 switch (XINT (tem, 1)) 1158 { 1159 case CRIS_UNSPEC_GOTREAD: 1160 case CRIS_UNSPEC_PLTGOTREAD: 1161 /* Using sign-extend mostly to be consistent with the 1162 indexed addressing mode. */ 1163 if (flag_pic == 1) 1164 return "movs.w %1,%0"; 1165 return "move.d %1,%0"; 1166 1167 case CRIS_UNSPEC_GOTREL: 1168 case CRIS_UNSPEC_PLT_GOTREL: 1169 gcc_assert (!TARGET_V32); 1170 return "move.d %1,%0"; 1171 1172 case CRIS_UNSPEC_PCREL: 1173 case CRIS_UNSPEC_PLT_PCREL: 1174 gcc_assert (TARGET_V32); 1175 return "lapc %1,%0"; 1176 1177 default: 1178 gcc_unreachable (); 1179 } 1180 } 1181 default: 1182 return "BOGUS: %1 to %0"; 1183 } 1184} 1185 [(set_attr "slottable" "yes,yes,yes,yes,yes,yes,no,no,no,no,no,yes,yes,no,no") 1186 (set_attr "cc" "*,*,*,*,*,*,*,*,*,*,*,none,none,none,none")]) 1187 1188;; Extend operations with side-effect from mem to register, using 1189;; MOVS/MOVU. These are from mem to register only. 1190;; 1191;; [rx=ry+rz.S] 1192;; 1193;; QImode to HImode 1194;; 1195;; FIXME: Can we omit extend to HImode, since GCC should truncate for 1196;; HImode by itself? Perhaps use only anonymous modes? 1197 1198(define_insn "*ext_sideqihi_biap" 1199 [(set (match_operand:HI 0 "register_operand" "=r,r") 1200 (match_operator:HI 1201 5 "cris_extend_operator" 1202 [(mem:QI (plus:SI 1203 (mult:SI (match_operand:SI 1 "register_operand" "r,r") 1204 (match_operand:SI 2 "const_int_operand" "n,n")) 1205 (match_operand:SI 3 "register_operand" "r,r")))])) 1206 (set (match_operand:SI 4 "register_operand" "=*3,r") 1207 (plus:SI (mult:SI (match_dup 1) 1208 (match_dup 2)) 1209 (match_dup 3)))] 1210 "cris_side_effect_mode_ok (MULT, operands, 4, 3, 1, 2, 0)" 1211 "@ 1212 # 1213 mov%e5.%m5 [%4=%3+%1%T2],%0") 1214 1215(define_insn "*ext_side<mode>si_biap" 1216 [(set (match_operand:SI 0 "register_operand" "=r,r") 1217 (match_operator:SI 1218 5 "cris_extend_operator" 1219 [(mem:BW (plus:SI 1220 (mult:SI (match_operand:SI 1 "register_operand" "r,r") 1221 (match_operand:SI 2 "const_int_operand" "n,n")) 1222 (match_operand:SI 3 "register_operand" "r,r")))])) 1223 (set (match_operand:SI 4 "register_operand" "=*3,r") 1224 (plus:SI (mult:SI (match_dup 1) 1225 (match_dup 2)) 1226 (match_dup 3)))] 1227 "cris_side_effect_mode_ok (MULT, operands, 4, 3, 1, 2, 0)" 1228 "@ 1229 # 1230 mov%e5<m> [%4=%3+%1%T2],%0") 1231 1232;; Same but [rx=ry+i] 1233 1234;; QImode to HImode 1235 1236(define_insn "*ext_sideqihi" 1237 [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r") 1238 (match_operator:HI 1239 4 "cris_extend_operator" 1240 [(mem:QI (plus:SI 1241 (match_operand:SI 1 "cris_bdap_operand" "%r,r,r,R,R") 1242 (match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))])) 1243 (set (match_operand:SI 3 "register_operand" "=*1,r,r,*2,r") 1244 (plus:SI (match_dup 1) 1245 (match_dup 2)))] 1246 "cris_side_effect_mode_ok (PLUS, operands, 3, 1, 2, -1, 0)" 1247{ 1248 if ((which_alternative == 0 || which_alternative == 3) 1249 && (!CONST_INT_P (operands[2]) 1250 || INTVAL (operands[2]) > 127 1251 || INTVAL (operands[2]) < -128 1252 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N') 1253 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))) 1254 return "#"; 1255 if (which_alternative == 4) 1256 return "mov%e4.%m4 [%3=%2%S1],%0"; 1257 return "mov%e4.%m4 [%3=%1%S2],%0"; 1258}) 1259 1260(define_insn "*ext_side<mode>si" 1261 [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r") 1262 (match_operator:SI 1263 4 "cris_extend_operator" 1264 [(mem:BW (plus:SI 1265 (match_operand:SI 1 "cris_bdap_operand" "%r,r,r,R,R") 1266 (match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))])) 1267 (set (match_operand:SI 3 "register_operand" "=*1,r,r,*2,r") 1268 (plus:SI (match_dup 1) 1269 (match_dup 2)))] 1270 "cris_side_effect_mode_ok (PLUS, operands, 3, 1, 2, -1, 0)" 1271{ 1272 if ((which_alternative == 0 || which_alternative == 3) 1273 && (!CONST_INT_P (operands[2]) 1274 || INTVAL (operands[2]) > 127 1275 || INTVAL (operands[2]) < -128 1276 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N') 1277 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))) 1278 return "#"; 1279 if (which_alternative == 4) 1280 return "mov%e4<m> [%3=%2%S1],%0"; 1281 return "mov%e4<m> [%3=%1%S2],%0"; 1282}) 1283 1284;; FIXME: See movsi. 1285 1286(define_insn "movhi" 1287 [(set 1288 (match_operand:HI 0 "nonimmediate_operand" "=r,r, r,Q>,r,Q>,r,r,r,g,g,r,r,x") 1289 (match_operand:HI 1 "general_operand" "r,Q>,M,M, I,r, L,O,n,M,r,g,x,r"))] 1290 "" 1291{ 1292 switch (which_alternative) 1293 { 1294 case 0: 1295 case 1: 1296 case 5: 1297 case 10: 1298 case 11: 1299 return "move.w %1,%0"; 1300 case 12: 1301 case 13: 1302 return "move %1,%0"; 1303 case 2: 1304 case 3: 1305 case 9: 1306 return "clear.w %0"; 1307 case 4: 1308 return "moveq %1,%0"; 1309 case 6: 1310 case 8: 1311 if (INTVAL (operands[1]) < 256 && INTVAL (operands[1]) >= -128) 1312 { 1313 if (INTVAL (operands[1]) > 0) 1314 return "movu.b %1,%0"; 1315 return "movs.b %1,%0"; 1316 } 1317 return "move.w %1,%0"; 1318 case 7: 1319 return "movEq %b1,%0"; 1320 default: 1321 return "BOGUS: %1 to %0"; 1322 } 1323} 1324 [(set_attr "slottable" "yes,yes,yes,yes,yes,yes,no,yes,no,no,no,no,yes,yes") 1325 (set_attr "cc" "*,*,none,none,*,none,*,clobber,*,none,none,*,none,none")]) 1326 1327(define_insn "movstricthi" 1328 [(set 1329 (strict_low_part 1330 (match_operand:HI 0 "nonimmediate_operand" "+r,r, r,Q>,Q>,g,r,g")) 1331 (match_operand:HI 1 "general_operand" "r,Q>,M,M, r, M,g,r"))] 1332 "" 1333 "@ 1334 move.w %1,%0 1335 move.w %1,%0 1336 clear.w %0 1337 clear.w %0 1338 move.w %1,%0 1339 clear.w %0 1340 move.w %1,%0 1341 move.w %1,%0" 1342 [(set_attr "slottable" "yes,yes,yes,yes,yes,no,no,no")]) 1343 1344(define_expand "reload_in<mode>" 1345 [(set (match_operand:BW 2 "register_operand" "=r") 1346 (match_operand:BW 1 "memory_operand" "m")) 1347 (set (match_operand:BW 0 "register_operand" "=x") 1348 (match_dup 2))] 1349 "" 1350 "") 1351 1352(define_expand "reload_out<mode>" 1353 [(set (match_operand:BW 2 "register_operand" "=&r") 1354 (match_operand:BW 1 "register_operand" "x")) 1355 (set (match_operand:BW 0 "memory_operand" "=m") 1356 (match_dup 2))] 1357 "" 1358 "") 1359 1360(define_insn "movqi" 1361 [(set (match_operand:QI 0 "nonimmediate_operand" "=r,Q>,r, r,Q>,r,g,g,r,r,r,x") 1362 (match_operand:QI 1 "general_operand" "r,r, Q>,M,M, I,M,r,O,g,x,r"))] 1363 "" 1364 "@ 1365 move.b %1,%0 1366 move.b %1,%0 1367 move.b %1,%0 1368 clear.b %0 1369 clear.b %0 1370 moveq %1,%0 1371 clear.b %0 1372 move.b %1,%0 1373 moveq %b1,%0 1374 move.b %1,%0 1375 move %1,%0 1376 move %1,%0" 1377 [(set_attr "slottable" "yes,yes,yes,yes,yes,yes,no,no,yes,no,yes,yes") 1378 (set_attr "cc" "*,*,*,*,*,*,*,*,clobber,*,none,none")]) 1379 1380(define_insn "movstrictqi" 1381 [(set (strict_low_part 1382 (match_operand:QI 0 "nonimmediate_operand" "+r,Q>,r, r,Q>,g,g,r")) 1383 (match_operand:QI 1 "general_operand" "r,r, Q>,M,M, M,r,g"))] 1384 "" 1385 "@ 1386 move.b %1,%0 1387 move.b %1,%0 1388 move.b %1,%0 1389 clear.b %0 1390 clear.b %0 1391 clear.b %0 1392 move.b %1,%0 1393 move.b %1,%0" 1394 [(set_attr "slottable" "yes,yes,yes,yes,yes,no,no,no")]) 1395 1396;; The valid "quick" bit-patterns are, except for 0.0, denormalized 1397;; values REALLY close to 0, and some NaN:s (I think; their exponent is 1398;; all ones); the worthwhile one is "0.0". 1399;; It will use clear, so we know ALL types of immediate 0 never change cc. 1400 1401(define_insn "movsf" 1402 [(set (match_operand:SF 0 "nonimmediate_operand" "=r,Q>,r, r,Q>,g,g,r,r,x,Q>,m,x, x") 1403 (match_operand:SF 1 "general_operand" "r,r, Q>,G,G, G,r,g,x,r,x, x,Q>,g"))] 1404 "" 1405 "@ 1406 move.d %1,%0 1407 move.d %1,%0 1408 move.d %1,%0 1409 clear.d %0 1410 clear.d %0 1411 clear.d %0 1412 move.d %1,%0 1413 move.d %1,%0 1414 move %1,%0 1415 move %1,%0 1416 move %1,%0 1417 move %1,%0 1418 move %1,%0 1419 move %1,%0" 1420 [(set_attr "slottable" "yes,yes,yes,yes,yes,no,no,no,yes,yes,yes,no,yes,no")]) 1421 1422;; Movem patterns. Primarily for use in function prologue and epilogue. 1423;; The V32 variants have an ordering matching the expectations of the 1424;; standard names "load_multiple" and "store_multiple"; pre-v32 movem 1425;; store R0 in the highest memory location. 1426 1427(define_expand "load_multiple" 1428 [(match_operand:SI 0 "register_operand" "") 1429 (match_operand:SI 1 "memory_operand" "") 1430 (match_operand:SI 2 "const_int_operand" "")] 1431 "TARGET_V32" 1432{ 1433 rtx indreg; 1434 1435 /* Apparently the predicate isn't checked, so we need to do so 1436 manually. Once happened for libstdc++-v3 locale_facets.tcc. */ 1437 if (!MEM_P (operands[1])) 1438 FAIL; 1439 1440 indreg = XEXP (operands[1], 0); 1441 1442 if (GET_CODE (indreg) == POST_INC) 1443 indreg = XEXP (indreg, 0); 1444 if (!REG_P (indreg) 1445 || GET_CODE (operands[2]) != CONST_INT 1446 || !REG_P (operands[0]) 1447 || REGNO (operands[0]) != 0 1448 || INTVAL (operands[2]) > CRIS_SP_REGNUM 1449 || (int) REGNO (indreg) < INTVAL (operands[2])) 1450 FAIL; 1451 gcc_unreachable (); 1452 emit_insn (cris_gen_movem_load (operands[1], operands[2], 0)); 1453 DONE; 1454}) 1455 1456(define_expand "store_multiple" 1457 [(match_operand:SI 0 "memory_operand" "") 1458 (match_operand:SI 1 "register_operand" "") 1459 (match_operand:SI 2 "const_int_operand" "")] 1460 "TARGET_V32" 1461{ 1462 rtx indreg; 1463 1464 /* See load_multiple. */ 1465 if (!MEM_P (operands[0])) 1466 FAIL; 1467 1468 indreg = XEXP (operands[0], 0); 1469 1470 if (GET_CODE (indreg) == POST_INC) 1471 indreg = XEXP (indreg, 0); 1472 if (!REG_P (indreg) 1473 || GET_CODE (operands[2]) != CONST_INT 1474 || !REG_P (operands[1]) 1475 || REGNO (operands[1]) != 0 1476 || INTVAL (operands[2]) > CRIS_SP_REGNUM 1477 || (int) REGNO (indreg) < INTVAL (operands[2])) 1478 FAIL; 1479 gcc_unreachable (); 1480 cris_emit_movem_store (operands[0], operands[2], 0, false); 1481 DONE; 1482}) 1483 1484(define_insn "*cris_load_multiple" 1485 [(match_parallel 0 "cris_load_multiple_op" 1486 [(set (match_operand:SI 1 "register_operand" "=r,r") 1487 (match_operand:SI 2 "memory_operand" "Q,m"))])] 1488 "" 1489 "movem %O0,%o0" 1490 [(set_attr "cc" "none") 1491 (set_attr "slottable" "yes,no") 1492 ;; Not true, but setting the length to 0 causes return sequences (ret 1493 ;; movem) to have the cost they had when (return) included the movem 1494 ;; and reduces the performance penalty taken for needing to emit an 1495 ;; epilogue (in turn copied by bb-reorder) instead of return patterns. 1496 ;; FIXME: temporary change until all insn lengths are correctly 1497 ;; described. FIXME: have better target control over bb-reorder. 1498 (set_attr "length" "0")]) 1499 1500(define_insn "*cris_store_multiple" 1501 [(match_parallel 0 "cris_store_multiple_op" 1502 [(set (match_operand:SI 2 "memory_operand" "=Q,m") 1503 (match_operand:SI 1 "register_operand" "r,r"))])] 1504 "" 1505 "movem %o0,%O0" 1506 [(set_attr "cc" "none") 1507 (set_attr "slottable" "yes,no")]) 1508 1509 1510;; Sign- and zero-extend insns with standard names. 1511;; Those for integer source operand are ordered with the widest source 1512;; type first. 1513 1514;; Sign-extend. 1515 1516(define_insn "extendsidi2" 1517 [(set (match_operand:DI 0 "register_operand" "=r") 1518 (sign_extend:DI (match_operand:SI 1 "general_operand" "g")))] 1519 "" 1520 "move.d %1,%M0\;smi %H0\;neg.d %H0,%H0") 1521 1522(define_insn "extend<mode>di2" 1523 [(set (match_operand:DI 0 "register_operand" "=r") 1524 (sign_extend:DI (match_operand:BW 1 "general_operand" "g")))] 1525 "" 1526 "movs<m> %1,%M0\;smi %H0\;neg.d %H0,%H0") 1527 1528(define_insn "extend<mode>si2" 1529 [(set (match_operand:SI 0 "register_operand" "=r,r,r") 1530 (sign_extend:SI (match_operand:BW 1 "general_operand" "r,Q>,g")))] 1531 "" 1532 "movs<m> %1,%0" 1533 [(set_attr "slottable" "yes,yes,no")]) 1534 1535;; To do a byte->word extension, extend to dword, exept that the top half 1536;; of the register will be clobbered. FIXME: Perhaps this is not needed. 1537 1538(define_insn "extendqihi2" 1539 [(set (match_operand:HI 0 "register_operand" "=r,r,r") 1540 (sign_extend:HI (match_operand:QI 1 "general_operand" "r,Q>,g")))] 1541 "" 1542 "movs.b %1,%0" 1543 [(set_attr "slottable" "yes,yes,no")]) 1544 1545 1546;; Zero-extend. The DImode ones are synthesized by gcc, so we don't 1547;; specify them here. 1548 1549(define_insn "zero_extend<mode>si2" 1550 [(set (match_operand:SI 0 "register_operand" "=r,r,r") 1551 (zero_extend:SI 1552 (match_operand:BW 1 "nonimmediate_operand" "r,Q>,m")))] 1553 "" 1554 "movu<m> %1,%0" 1555 [(set_attr "slottable" "yes,yes,no")]) 1556 1557;; Same comment as sign-extend QImode to HImode above applies. 1558 1559(define_insn "zero_extendqihi2" 1560 [(set (match_operand:HI 0 "register_operand" "=r,r,r") 1561 (zero_extend:HI 1562 (match_operand:QI 1 "nonimmediate_operand" "r,Q>,m")))] 1563 "" 1564 "movu.b %1,%0" 1565 [(set_attr "slottable" "yes,yes,no")]) 1566 1567;; All kinds of arithmetic and logical instructions. 1568;; 1569;; First, anonymous patterns to match addressing modes with 1570;; side-effects. 1571;; 1572;; op.S [rx=ry+I],rz; (add, sub, or, and, bound). 1573;; 1574;; [rx=ry+rz.S] 1575 1576(define_insn "*op_side<mode>_biap" 1577 [(set (match_operand:BWD 0 "register_operand" "=r,r") 1578 (match_operator:BWD 1579 6 "cris_orthogonal_operator" 1580 [(match_operand:BWD 1 "register_operand" "0,0") 1581 (mem:BWD (plus:SI 1582 (mult:SI (match_operand:SI 2 "register_operand" "r,r") 1583 (match_operand:SI 3 "const_int_operand" "n,n")) 1584 (match_operand:SI 4 "register_operand" "r,r")))])) 1585 (set (match_operand:SI 5 "register_operand" "=*4,r") 1586 (plus:SI (mult:SI (match_dup 2) 1587 (match_dup 3)) 1588 (match_dup 4)))] 1589 "cris_side_effect_mode_ok (MULT, operands, 5, 4, 2, 3, 0)" 1590 "@ 1591 # 1592 %x6<m> [%5=%4+%2%T3],%0") 1593 1594;; [rx=ry+i] ([%4=%2+%3]) 1595 1596(define_insn "*op_side<mode>" 1597 [(set (match_operand:BWD 0 "register_operand" "=r,r,r,r,r") 1598 (match_operator:BWD 1599 5 "cris_orthogonal_operator" 1600 [(match_operand:BWD 1 "register_operand" "0,0,0,0,0") 1601 (mem:BWD (plus:SI 1602 (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R") 1603 (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))])) 1604 (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r") 1605 (plus:SI (match_dup 2) 1606 (match_dup 3)))] 1607 "cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)" 1608{ 1609 if ((which_alternative == 0 || which_alternative == 3) 1610 && (!CONST_INT_P (operands[3]) 1611 || INTVAL (operands[3]) > 127 1612 || INTVAL (operands[3]) < -128 1613 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N') 1614 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J'))) 1615 return "#"; 1616 if (which_alternative == 4) 1617 return "%x5.%s0 [%4=%3%S2],%0"; 1618 return "%x5<m> [%4=%2%S3],%0"; 1619}) 1620 1621;; To match all cases for commutative operations we may have to have the 1622;; following pattern for add, or & and. I do not know really, but it does 1623;; not break anything. 1624;; 1625;; FIXME: This really ought to be checked. 1626;; 1627;; op.S [rx=ry+I],rz; 1628;; 1629;; [rx=ry+rz.S] 1630 1631(define_insn "*op_swap_side<mode>_biap" 1632 [(set (match_operand:BWD 0 "register_operand" "=r,r") 1633 (match_operator:BWD 1634 6 "cris_commutative_orth_op" 1635 [(mem:BWD (plus:SI 1636 (mult:SI (match_operand:SI 2 "register_operand" "r,r") 1637 (match_operand:SI 3 "const_int_operand" "n,n")) 1638 (match_operand:SI 4 "register_operand" "r,r"))) 1639 (match_operand:BWD 1 "register_operand" "0,0")])) 1640 (set (match_operand:SI 5 "register_operand" "=*4,r") 1641 (plus:SI (mult:SI (match_dup 2) 1642 (match_dup 3)) 1643 (match_dup 4)))] 1644 "cris_side_effect_mode_ok (MULT, operands, 5, 4, 2, 3, 0)" 1645 "@ 1646 # 1647 %x6<m> [%5=%4+%2%T3],%0") 1648 1649;; [rx=ry+i] ([%4=%2+%3]) 1650;; FIXME: These could have anonymous mode for operand 0. 1651 1652;; QImode 1653 1654(define_insn "*op_swap_side<mode>" 1655 [(set (match_operand:BWD 0 "register_operand" "=r,r,r,r,r") 1656 (match_operator:BWD 1657 5 "cris_commutative_orth_op" 1658 [(mem:BWD 1659 (plus:SI (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R") 1660 (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r"))) 1661 (match_operand:BWD 1 "register_operand" "0,0,0,0,0")])) 1662 (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r") 1663 (plus:SI (match_dup 2) 1664 (match_dup 3)))] 1665 "cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)" 1666{ 1667 if ((which_alternative == 0 || which_alternative == 3) 1668 && (!CONST_INT_P (operands[3]) 1669 || INTVAL (operands[3]) > 127 1670 || INTVAL (operands[3]) < -128 1671 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N') 1672 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J'))) 1673 return "#"; 1674 if (which_alternative == 4) 1675 return "%x5<m> [%4=%3%S2],%0"; 1676 return "%x5<m> [%4=%2%S3],%0"; 1677}) 1678 1679;; Add operations, standard names. 1680 1681;; Note that for the 'P' constraint, the high part can be -1 or 0. We 1682;; output the insn through the 'A' output modifier as "adds.w" and "addq", 1683;; respectively. 1684(define_expand "adddi3" 1685 [(set (match_operand:DI 0 "register_operand") 1686 (plus:DI (match_operand:DI 1 "register_operand") 1687 (match_operand:DI 2 "general_operand")))] 1688 "" 1689{ 1690 if (MEM_P (operands[2]) && TARGET_V32) 1691 operands[2] = force_reg (DImode, operands[2]); 1692}) 1693 1694(define_insn "*adddi3_non_v32" 1695 [(set (match_operand:DI 0 "register_operand" "=r,r,r,&r,&r") 1696 (plus:DI (match_operand:DI 1 "register_operand" "%0,0,0,0,r") 1697 (match_operand:DI 2 "general_operand" "J,N,P,g,!To")))] 1698 "!TARGET_V32" 1699 "@ 1700 addq %2,%M0\;ax\;addq 0,%H0 1701 subq %n2,%M0\;ax\;subq 0,%H0 1702 add%e2.%z2 %2,%M0\;ax\;%A2 %H2,%H0 1703 add.d %M2,%M0\;ax\;add.d %H2,%H0 1704 add.d %M2,%M1,%M0\;ax\;add.d %H2,%H1,%H0") 1705 1706; It seems no use allowing a memory operand for this one, because we'd 1707; need a scratch register for incrementing the address. 1708(define_insn "*adddi3_v32" 1709 [(set (match_operand:DI 0 "register_operand" "=r,r,r,r,r") 1710 (plus:DI (match_operand:DI 1 "register_operand" "%0,0,0,0,0") 1711 (match_operand:DI 2 "nonmemory_operand" "J,N,P,r,n")))] 1712 "TARGET_V32" 1713 "@ 1714 addq %2,%M0\;addc 0,%H0 1715 subq %n2,%M0\;ax\;subq 0,%H0 1716 add%e2.%z2 %2,%M0\;addc %H2,%H0 1717 add.d %M2,%M0\;addc %H2,%H0 1718 add.d %M2,%M0\;addc %H2,%H0") 1719 1720(define_expand "add<mode>3" 1721 [(set (match_operand:BWD 0 "register_operand") 1722 (plus:BWD 1723 (match_operand:BWD 1 "register_operand") 1724 (match_operand:BWD 2 "general_operand")))] 1725 "" 1726 "") 1727 1728(define_insn "*addsi3_non_v32" 1729 [(set (match_operand:SI 0 "register_operand" "=r,r, r,r,r,r, r,r, r") 1730 (plus:SI 1731 (match_operand:SI 1 "register_operand" "%0,0, 0,0,0,0, 0,r, r") 1732 (match_operand:SI 2 "general_operand" "r,Q>,J,N,n,!S,g,!To,0")))] 1733 1734;; The last constraint is due to that after reload, the '%' is not 1735;; honored, and canonicalization doesn't care about keeping the same 1736;; register as in destination. This will happen after insn splitting. 1737;; gcc <= 2.7.2. FIXME: Check for gcc-2.9x 1738 1739 "!TARGET_V32" 1740{ 1741 switch (which_alternative) 1742 { 1743 case 0: 1744 case 1: 1745 return "add.d %2,%0"; 1746 case 2: 1747 return "addq %2,%0"; 1748 case 3: 1749 return "subq %n2,%0"; 1750 case 4: 1751 /* 'Known value', but not in -63..63. 1752 Check if addu/subu may be used. */ 1753 if (INTVAL (operands[2]) > 0) 1754 { 1755 if (INTVAL (operands[2]) < 256) 1756 return "addu.b %2,%0"; 1757 if (INTVAL (operands[2]) < 65536) 1758 return "addu.w %2,%0"; 1759 } 1760 else 1761 { 1762 if (INTVAL (operands[2]) >= -255) 1763 return "subu.b %n2,%0"; 1764 if (INTVAL (operands[2]) >= -65535) 1765 return "subu.w %n2,%0"; 1766 } 1767 return "add.d %2,%0"; 1768 case 5: 1769 { 1770 rtx tem = operands[2]; 1771 gcc_assert (GET_CODE (tem) == CONST); 1772 tem = XEXP (tem, 0); 1773 if (GET_CODE (tem) == PLUS 1774 && GET_CODE (XEXP (tem, 0)) == UNSPEC 1775 /* We don't allow CRIS_UNSPEC_PCREL here; we can't have a 1776 pc-relative operand in an add insn. */ 1777 && XINT (XEXP (tem, 0), 1) == CRIS_UNSPEC_GOTREL 1778 && CONST_INT_P (XEXP (tem, 1))) 1779 tem = XEXP (tem, 0); 1780 gcc_assert (GET_CODE (tem) == UNSPEC); 1781 switch (XINT (tem, 1)) 1782 { 1783 case CRIS_UNSPEC_GOTREAD: 1784 case CRIS_UNSPEC_PLTGOTREAD: 1785 /* Using sign-extend mostly to be consistent with the 1786 indexed addressing mode. */ 1787 if (flag_pic == 1) 1788 return "adds.w %2,%0"; 1789 return "add.d %2,%0"; 1790 1791 case CRIS_UNSPEC_PLT_GOTREL: 1792 case CRIS_UNSPEC_GOTREL: 1793 return "add.d %2,%0"; 1794 default: 1795 gcc_unreachable (); 1796 } 1797 } 1798 case 6: 1799 return "add%u2 %2,%0"; 1800 case 7: 1801 return "add.d %2,%1,%0"; 1802 case 8: 1803 return "add.d %1,%0"; 1804 default: 1805 return "BOGUS addsi %2+%1 to %0"; 1806 } 1807} 1808 [(set_attr "slottable" "yes,yes,yes,yes,no,no,no,no,yes")]) 1809 1810; FIXME: Check what's best: having the three-operand ACR alternative 1811; before or after the corresponding-operand2 alternative. Check for 1812; *all* insns. FIXME: constant constraint letter for -128..127. 1813(define_insn "*addsi3_v32" 1814 [(set (match_operand:SI 0 "register_operand" "=r,!a,r,!a, r,r,!a,r,!a,r,r,r,!a") 1815 (plus:SI 1816 (match_operand:SI 1 "register_operand" "%0,r, 0, r, 0,0,r, 0,r, 0,0,0,r") 1817 (match_operand:SI 2 "general_operand" "r, r, Q>,Q>,J,N,NJ,L,L, P,n,g,g")))] 1818 "TARGET_V32" 1819 "@ 1820 add.d %2,%0 1821 addi %2.b,%1,%0 1822 add.d %2,%0 1823 addo.d %2,%1,%0 1824 addq %2,%0 1825 subq %n2,%0 1826 addoq %2,%1,%0 1827 adds.w %2,%0 1828 addo %2,%1,%0 1829 addu.w %2,%0 1830 add.d %2,%0 1831 add%u2 %2,%0 1832 addo.%Z2 %2,%1,%0" 1833 [(set_attr "slottable" "yes,yes,yes,yes,yes,yes,yes,no,no,no,no,no,no") 1834 (set_attr "cc" "*,none,*,none,*,*,none,*,none,*,*,*,none")]) 1835 1836(define_insn "*addhi3_non_v32" 1837 [(set (match_operand:HI 0 "register_operand" "=r,r, r,r,r,r") 1838 (plus:HI (match_operand:HI 1 "register_operand" "%0,0, 0,0,0,r") 1839 (match_operand:HI 2 "general_operand" "r,Q>,J,N,g,!To")))] 1840 "!TARGET_V32" 1841 "@ 1842 add.w %2,%0 1843 add.w %2,%0 1844 addq %2,%0 1845 subq %n2,%0 1846 add.w %2,%0 1847 add.w %2,%1,%0" 1848 [(set_attr "slottable" "yes,yes,yes,yes,no,no") 1849 (set_attr "cc" "normal,normal,clobber,clobber,normal,normal")]) 1850 1851(define_insn "*addhi3_v32" 1852 [(set (match_operand:HI 0 "register_operand" "=r, !a,r,!a, r,r,!a,r,!a") 1853 (plus:HI 1854 (match_operand:HI 1 "register_operand" "%0,r, 0, r, 0,0,r, 0,r") 1855 (match_operand:HI 2 "general_operand" "r, r, Q>,Q>,J,N,NJ,g,g")))] 1856 "TARGET_V32" 1857 "@ 1858 add.w %2,%0 1859 addi %2.b,%1,%0 1860 add.w %2,%0 1861 addo.w %2,%1,%0 1862 addq %2,%0 1863 subq %n2,%0 1864 addoq %2,%1,%0 1865 add.w %2,%0 1866 addo.w %2,%1,%0" 1867 [(set_attr "slottable" "yes,yes,yes,yes,yes,yes,yes,no,no") 1868 (set_attr "cc" "*,none,*,none,clobber,clobber,none,*,none")]) 1869 1870(define_insn "*addqi3_non_v32" 1871 [(set (match_operand:QI 0 "register_operand" "=r,r, r,r,r,r,r") 1872 (plus:QI (match_operand:QI 1 "register_operand" "%0,0, 0,0,0,0,r") 1873 (match_operand:QI 2 "general_operand" "r,Q>,J,N,O,g,!To")))] 1874 "!TARGET_V32" 1875 "@ 1876 add.b %2,%0 1877 add.b %2,%0 1878 addq %2,%0 1879 subq %n2,%0 1880 subQ -%b2,%0 1881 add.b %2,%0 1882 add.b %2,%1,%0" 1883 [(set_attr "slottable" "yes,yes,yes,yes,yes,no,no") 1884 (set_attr "cc" "normal,normal,clobber,clobber,clobber,normal,normal")]) 1885 1886(define_insn "*addqi3_v32" 1887 [(set (match_operand:QI 0 "register_operand" "=r,!a,r,!a, r,r,!a,r,r,!a") 1888 (plus:QI 1889 (match_operand:QI 1 "register_operand" "%0,r, 0, r, 0,0,r, 0,0,r") 1890 (match_operand:QI 2 "general_operand" "r,r, Q>,Q>,J,N,NJ,O,g,g")))] 1891 "TARGET_V32" 1892 "@ 1893 add.b %2,%0 1894 addi %2.b,%1,%0 1895 add.b %2,%0 1896 addo.b %2,%1,%0 1897 addq %2,%0 1898 subq %n2,%0 1899 addoq %2,%1,%0 1900 subQ -%b2,%0 1901 add.b %2,%0 1902 addo.b %2,%1,%0" 1903 [(set_attr "slottable" "yes,yes,yes,yes,yes,yes,yes,yes,no,no") 1904 (set_attr "cc" "*,none,*,none,clobber,clobber,none,clobber,*,none")]) 1905 1906;; Subtract. 1907;; 1908;; Note that because of insn canonicalization these will *seldom* but 1909;; rarely be used with a known constant as an operand. 1910 1911;; Note that for the 'P' constraint, the high part can be -1 or 0. We 1912;; output the insn through the 'D' output modifier as "subs.w" and "subq", 1913;; respectively. 1914(define_expand "subdi3" 1915 [(set (match_operand:DI 0 "register_operand") 1916 (minus:DI (match_operand:DI 1 "register_operand") 1917 (match_operand:DI 2 "general_operand")))] 1918 "" 1919{ 1920 if (TARGET_V32 && MEM_P (operands[2])) 1921 operands[2] = force_reg (DImode, operands[2]); 1922}) 1923 1924(define_insn "*subdi3_non_v32" 1925 [(set (match_operand:DI 0 "register_operand" "=r,r,r,&r,&r") 1926 (minus:DI (match_operand:DI 1 "register_operand" "0,0,0,0,r") 1927 (match_operand:DI 2 "general_operand" "J,N,P,g,!To")))] 1928 "!TARGET_V32" 1929 "@ 1930 subq %2,%M0\;ax\;subq 0,%H0 1931 addq %n2,%M0\;ax\;addq 0,%H0 1932 sub%e2.%z2 %2,%M0\;ax\;%D2 %H2,%H0 1933 sub.d %M2,%M0\;ax\;sub.d %H2,%H0 1934 sub.d %M2,%M1,%M0\;ax\;sub.d %H2,%H1,%H0") 1935 1936(define_insn "*subdi3_v32" 1937 [(set (match_operand:DI 0 "register_operand" "=r,r,r,&r") 1938 (minus:DI (match_operand:DI 1 "register_operand" "0,0,0,0") 1939 (match_operand:DI 2 "nonmemory_operand" "J,N,P,r")))] 1940 "TARGET_V32" 1941 "@ 1942 subq %2,%M0\;ax\;subq 0,%H0 1943 addq %n2,%M0\;ax\;addq 0,%H0 1944 sub%e2.%z2 %2,%M0\;ax\;%D2 %H2,%H0 1945 sub.d %M2,%M0\;ax\;sub.d %H2,%H0") 1946 1947(define_expand "sub<mode>3" 1948 [(set (match_operand:BWD 0 "register_operand") 1949 (minus:BWD 1950 (match_operand:BWD 1 "register_operand") 1951 (match_operand:BWD 2 "general_operand")))] 1952 "" 1953 "") 1954 1955(define_insn "*subsi3_non_v32" 1956 [(set (match_operand:SI 0 "register_operand" "=r,r, r,r,r,r,r,r") 1957 (minus:SI 1958 (match_operand:SI 1 "register_operand" "0,0, 0,0,0,0,0,r") 1959 (match_operand:SI 2 "general_operand" "r,Q>,J,N,P,n,g,!To")))] 1960 "!TARGET_V32" 1961 1962;; This does not do the optimal: "addu.w 65535,r0" when %2 is negative. 1963;; But then again, %2 should not be negative. 1964 1965 "@ 1966 sub.d %2,%0 1967 sub.d %2,%0 1968 subq %2,%0 1969 addq %n2,%0 1970 sub%e2.%z2 %2,%0 1971 sub.d %2,%0 1972 sub.d %2,%0 1973 sub.d %2,%1,%0" 1974 [(set_attr "slottable" "yes,yes,yes,yes,no,no,no,no")]) 1975 1976(define_insn "*subsi3_v32" 1977 [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r,r,r") 1978 (minus:SI 1979 (match_operand:SI 1 "register_operand" "0,0,0,0,0,0,0") 1980 (match_operand:SI 2 "general_operand" "r,Q>,J,N,P,n,g")))] 1981 "TARGET_V32" 1982 "@ 1983 sub.d %2,%0 1984 sub.d %2,%0 1985 subq %2,%0 1986 addq %n2,%0 1987 sub%e2.%z2 %2,%0 1988 sub.d %2,%0 1989 sub.d %2,%0" 1990 [(set_attr "slottable" "yes,yes,yes,yes,no,no,no")]) 1991 1992(define_insn "*sub<mode>3_nonv32" 1993 [(set (match_operand:BW 0 "register_operand" "=r,r, r,r,r,r") 1994 (minus:BW (match_operand:BW 1 "register_operand" "0,0, 0,0,0,r") 1995 (match_operand:BW 2 "general_operand" "r,Q>,J,N,g,!To")))] 1996 "!TARGET_V32" 1997 "@ 1998 sub<m> %2,%0 1999 sub<m> %2,%0 2000 subq %2,%0 2001 addq %n2,%0 2002 sub<m> %2,%0 2003 sub<m> %2,%1,%0" 2004 [(set_attr "slottable" "yes,yes,yes,yes,no,no") 2005 (set_attr "cc" "normal,normal,clobber,clobber,normal,normal")]) 2006 2007(define_insn "*sub<mode>3_v32" 2008 [(set (match_operand:BW 0 "register_operand" "=r,r,r,r,r") 2009 (minus:BW (match_operand:BW 1 "register_operand" "0,0,0,0,0") 2010 (match_operand:BW 2 "general_operand" "r,Q>,J,N,g")))] 2011 "TARGET_V32" 2012 "@ 2013 sub<m> %2,%0 2014 sub<m> %2,%0 2015 subq %2,%0 2016 addq %n2,%0 2017 sub<m> %2,%0" 2018 [(set_attr "slottable" "yes,yes,yes,yes,no") 2019 (set_attr "cc" "normal,normal,clobber,clobber,normal")]) 2020 2021;; CRIS has some add/sub-with-sign/zero-extend instructions. 2022;; Although these perform sign/zero-extension to SImode, they are 2023;; equally applicable for the HImode case. 2024;; FIXME: Check; GCC should handle the widening. 2025;; Note that these must be located after the normal add/sub patterns, 2026;; so not to get constants into any less specific operands. 2027;; 2028;; Extend with add/sub and side-effect. 2029;; 2030;; ADDS/SUBS/ADDU/SUBU and BOUND, which needs a check for zero_extend 2031;; 2032;; adds/subs/addu/subu bound [rx=ry+rz.S] 2033 2034;; QImode to HImode 2035;; FIXME: GCC should widen. 2036 2037(define_insn "*extopqihi_side_biap" 2038 [(set (match_operand:HI 0 "register_operand" "=r,r") 2039 (match_operator:HI 2040 6 "cris_additive_operand_extend_operator" 2041 [(match_operand:HI 1 "register_operand" "0,0") 2042 (match_operator:HI 2043 7 "cris_extend_operator" 2044 [(mem:QI (plus:SI 2045 (mult:SI (match_operand:SI 2 "register_operand" "r,r") 2046 (match_operand:SI 3 "const_int_operand" "n,n")) 2047 (match_operand:SI 4 "register_operand" "r,r")))])])) 2048 (set (match_operand:SI 5 "register_operand" "=*4,r") 2049 (plus:SI (mult:SI (match_dup 2) 2050 (match_dup 3)) 2051 (match_dup 4)))] 2052 "cris_side_effect_mode_ok (MULT, operands, 5, 4, 2, 3, 0)" 2053 "@ 2054 # 2055 %x6%e7.%m7 [%5=%4+%2%T3],%0") 2056 2057(define_insn "*extop<mode>si_side_biap" 2058 [(set (match_operand:SI 0 "register_operand" "=r,r") 2059 (match_operator:SI 2060 6 "cris_operand_extend_operator" 2061 [(match_operand:SI 1 "register_operand" "0,0") 2062 (match_operator:SI 2063 7 "cris_extend_operator" 2064 [(mem:BW (plus:SI 2065 (mult:SI (match_operand:SI 2 "register_operand" "r,r") 2066 (match_operand:SI 3 "const_int_operand" "n,n")) 2067 (match_operand:SI 4 "register_operand" "r,r")))])])) 2068 (set (match_operand:SI 5 "register_operand" "=*4,r") 2069 (plus:SI (mult:SI (match_dup 2) 2070 (match_dup 3)) 2071 (match_dup 4)))] 2072 "(GET_CODE (operands[6]) != UMIN || GET_CODE (operands[7]) == ZERO_EXTEND) 2073 && cris_side_effect_mode_ok (MULT, operands, 5, 4, 2, 3, 0)" 2074 "@ 2075 # 2076 %x6%e7<m> [%5=%4+%2%T3],%0") 2077 2078 2079;; [rx=ry+i] 2080 2081;; QImode to HImode 2082 2083(define_insn "*extopqihi_side" 2084 [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r") 2085 (match_operator:HI 2086 5 "cris_additive_operand_extend_operator" 2087 [(match_operand:HI 1 "register_operand" "0,0,0,0,0") 2088 (match_operator:HI 2089 6 "cris_extend_operator" 2090 [(mem:QI 2091 (plus:SI (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R") 2092 (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r") 2093 ))])])) 2094 (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r") 2095 (plus:SI (match_dup 2) 2096 (match_dup 3)))] 2097 "cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)" 2098{ 2099 if ((which_alternative == 0 || which_alternative == 3) 2100 && (!CONST_INT_P (operands[3]) 2101 || INTVAL (operands[3]) > 127 2102 || INTVAL (operands[3]) < -128 2103 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N') 2104 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J'))) 2105 return "#"; 2106 if (which_alternative == 4) 2107 return "%x5%E6.%m6 [%4=%3%S2],%0"; 2108 return "%x5%E6.%m6 [%4=%2%S3],%0"; 2109}) 2110 2111(define_insn "*extop<mode>si_side" 2112 [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r") 2113 (match_operator:SI 2114 5 "cris_operand_extend_operator" 2115 [(match_operand:SI 1 "register_operand" "0,0,0,0,0") 2116 (match_operator:SI 2117 6 "cris_extend_operator" 2118 [(mem:BW 2119 (plus:SI (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R") 2120 (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r") 2121 ))])])) 2122 (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r") 2123 (plus:SI (match_dup 2) 2124 (match_dup 3)))] 2125 "(GET_CODE (operands[5]) != UMIN || GET_CODE (operands[6]) == ZERO_EXTEND) 2126 && cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)" 2127{ 2128 if ((which_alternative == 0 || which_alternative == 3) 2129 && (!CONST_INT_P (operands[3]) 2130 || INTVAL (operands[3]) > 127 2131 || INTVAL (operands[3]) < -128 2132 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N') 2133 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J'))) 2134 return "#"; 2135 if (which_alternative == 4) 2136 return "%x5%E6<m> [%4=%3%S2],%0"; 2137 return "%x5%E6<m> [%4=%2%S3],%0"; 2138}) 2139 2140 2141;; As with op.S we may have to add special pattern to match commuted 2142;; operands to adds/addu and bound 2143;; 2144;; adds/addu/bound [rx=ry+rz.S] 2145 2146;; QImode to HImode 2147;; FIXME: GCC should widen. 2148 2149(define_insn "*extopqihi_swap_side_biap" 2150 [(set (match_operand:HI 0 "register_operand" "=r,r") 2151 (plus:HI 2152 (match_operator:HI 2153 6 "cris_extend_operator" 2154 [(mem:QI (plus:SI 2155 (mult:SI (match_operand:SI 2 "register_operand" "r,r") 2156 (match_operand:SI 3 "const_int_operand" "n,n")) 2157 (match_operand:SI 4 "register_operand" "r,r")))]) 2158 (match_operand:HI 1 "register_operand" "0,0"))) 2159 (set (match_operand:SI 5 "register_operand" "=*4,r") 2160 (plus:SI (mult:SI (match_dup 2) 2161 (match_dup 3)) 2162 (match_dup 4)))] 2163 "cris_side_effect_mode_ok (MULT, operands, 5, 4, 2, 3, 0)" 2164 "@ 2165 # 2166 add%e6.b [%5=%4+%2%T3],%0") 2167 2168(define_insn "*extop<mode>si_swap_side_biap" 2169 [(set (match_operand:SI 0 "register_operand" "=r,r") 2170 (match_operator:SI 2171 7 "cris_plus_or_bound_operator" 2172 [(match_operator:SI 2173 6 "cris_extend_operator" 2174 [(mem:BW (plus:SI 2175 (mult:SI (match_operand:SI 2 "register_operand" "r,r") 2176 (match_operand:SI 3 "const_int_operand" "n,n")) 2177 (match_operand:SI 4 "register_operand" "r,r")))]) 2178 (match_operand:SI 1 "register_operand" "0,0")])) 2179 (set (match_operand:SI 5 "register_operand" "=*4,r") 2180 (plus:SI (mult:SI (match_dup 2) 2181 (match_dup 3)) 2182 (match_dup 4)))] 2183 "(GET_CODE (operands[7]) != UMIN || GET_CODE (operands[6]) == ZERO_EXTEND) 2184 && cris_side_effect_mode_ok (MULT, operands, 5, 4, 2, 3, 0)" 2185 "@ 2186 # 2187 %x7%E6<m> [%5=%4+%2%T3],%0") 2188 2189;; [rx=ry+i] 2190;; FIXME: GCC should widen. 2191 2192;; QImode to HImode 2193 2194(define_insn "*extopqihi_swap_side" 2195 [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r") 2196 (plus:HI 2197 (match_operator:HI 2198 5 "cris_extend_operator" 2199 [(mem:QI (plus:SI 2200 (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R") 2201 (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))]) 2202 (match_operand:HI 1 "register_operand" "0,0,0,0,0"))) 2203 (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r") 2204 (plus:SI (match_dup 2) 2205 (match_dup 3)))] 2206 "cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)" 2207{ 2208 if ((which_alternative == 0 || which_alternative == 3) 2209 && (!CONST_INT_P (operands[3]) 2210 || INTVAL (operands[3]) > 127 2211 || INTVAL (operands[3]) < -128 2212 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N') 2213 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J'))) 2214 return "#"; 2215 if (which_alternative == 4) 2216 return "add%e5.b [%4=%3%S2],%0"; 2217 return "add%e5.b [%4=%2%S3],%0"; 2218}) 2219 2220(define_insn "*extop<mode>si_swap_side" 2221 [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r") 2222 (match_operator:SI 2223 6 "cris_plus_or_bound_operator" 2224 [(match_operator:SI 2225 5 "cris_extend_operator" 2226 [(mem:BW (plus:SI 2227 (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R") 2228 (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))]) 2229 (match_operand:SI 1 "register_operand" "0,0,0,0,0")])) 2230 (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r") 2231 (plus:SI (match_dup 2) 2232 (match_dup 3)))] 2233 "(GET_CODE (operands[6]) != UMIN || GET_CODE (operands[5]) == ZERO_EXTEND) 2234 && cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)" 2235{ 2236 if ((which_alternative == 0 || which_alternative == 3) 2237 && (!CONST_INT_P (operands[3]) 2238 || INTVAL (operands[3]) > 127 2239 || INTVAL (operands[3]) < -128 2240 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N') 2241 || CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J'))) 2242 return "#"; 2243 if (which_alternative == 4) 2244 return \"%x6%E5.%m5 [%4=%3%S2],%0\"; 2245 return "%x6%E5<m> [%4=%2%S3],%0"; 2246}) 2247 2248;; Extend versions (zero/sign) of normal add/sub (no side-effects). 2249 2250;; QImode to HImode 2251;; FIXME: GCC should widen. 2252 2253(define_insn "*extopqihi_non_v32" 2254 [(set (match_operand:HI 0 "register_operand" "=r,r,r,r") 2255 (match_operator:HI 2256 3 "cris_additive_operand_extend_operator" 2257 [(match_operand:HI 1 "register_operand" "0,0,0,r") 2258 (match_operator:HI 2259 4 "cris_extend_operator" 2260 [(match_operand:QI 2 "nonimmediate_operand" "r,Q>,m,!To")])]))] 2261 "!TARGET_V32 && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD 2262 && (operands[1] != frame_pointer_rtx || GET_CODE (operands[3]) != PLUS)" 2263 "@ 2264 %x3%E4.%m4 %2,%0 2265 %x3%E4.%m4 %2,%0 2266 %x3%E4.%m4 %2,%0 2267 %x3%E4.%m4 %2,%1,%0" 2268 [(set_attr "slottable" "yes,yes,no,no") 2269 (set_attr "cc" "clobber")]) 2270 2271(define_insn "*extopqihi_v32" 2272 [(set (match_operand:HI 0 "register_operand" "=r,r") 2273 (match_operator:HI 2274 3 "cris_additive_operand_extend_operator" 2275 [(match_operand:HI 1 "register_operand" "0,0") 2276 (match_operator:HI 2277 4 "cris_extend_operator" 2278 [(match_operand:QI 2 "nonimmediate_operand" "r,m")])]))] 2279 "TARGET_V32" 2280 "%x3%e4.%m4 %2,%0" 2281 [(set_attr "slottable" "yes") 2282 (set_attr "cc" "clobber")]) 2283 2284;; QImode to SImode 2285 2286(define_insn "*extop<mode>si_non_v32" 2287 [(set (match_operand:SI 0 "register_operand" "=r,r,r,r") 2288 (match_operator:SI 2289 3 "cris_operand_extend_operator" 2290 [(match_operand:SI 1 "register_operand" "0,0,0,r") 2291 (match_operator:SI 2292 4 "cris_extend_operator" 2293 [(match_operand:BW 2 "nonimmediate_operand" "r,Q>,m,!To")])]))] 2294 "!TARGET_V32 2295 && (GET_CODE (operands[3]) != UMIN || GET_CODE (operands[4]) == ZERO_EXTEND) 2296 && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD 2297 && (operands[1] != frame_pointer_rtx || GET_CODE (operands[3]) != PLUS)" 2298 "@ 2299 %x3%E4<m> %2,%0 2300 %x3%E4<m> %2,%0 2301 %x3%E4<m> %2,%0 2302 %x3%E4<m> %2,%1,%0" 2303 [(set_attr "slottable" "yes,yes,no,no")]) 2304 2305(define_insn "*extop<mode>si_v32" 2306 [(set (match_operand:SI 0 "register_operand" "=r,r") 2307 (match_operator:SI 2308 3 "cris_additive_operand_extend_operator" 2309 [(match_operand:SI 1 "register_operand" "0,0") 2310 (match_operator:SI 2311 4 "cris_extend_operator" 2312 [(match_operand:BW 2 "nonimmediate_operand" "r,m")])]))] 2313 "TARGET_V32" 2314 "%x3%e4.%m4 %2,%0" 2315 [(set_attr "slottable" "yes")]) 2316 2317;; As with the side-effect patterns, may have to have swapped operands for add. 2318;; For commutative operands, these are the canonical forms. 2319 2320;; QImode to HImode 2321 2322(define_insn "*addxqihi_swap_non_v32" 2323 [(set (match_operand:HI 0 "register_operand" "=r,r,r,r") 2324 (plus:HI 2325 (match_operator:HI 2326 3 "cris_extend_operator" 2327 [(match_operand:QI 2 "nonimmediate_operand" "r,Q>,m,!To")]) 2328 (match_operand:HI 1 "register_operand" "0,0,0,r")))] 2329 "!TARGET_V32 && operands[1] != frame_pointer_rtx" 2330 "@ 2331 add%e3.b %2,%0 2332 add%e3.b %2,%0 2333 add%e3.b %2,%0 2334 add%e3.b %2,%1,%0" 2335 [(set_attr "slottable" "yes,yes,no,no") 2336 (set_attr "cc" "clobber")]) 2337 2338;; A case for v32, to catch the "addo" insn in addition to "adds". We 2339;; only care to match the canonical form; there should be no other. 2340 2341(define_insn "*addsbw_v32" 2342 [(set (match_operand:HI 0 "register_operand" "=r,r,!a") 2343 (plus:HI 2344 (sign_extend:HI 2345 (match_operand:QI 2 "nonimmediate_operand" "r,m,m")) 2346 (match_operand:HI 1 "register_operand" "0,0,r")))] 2347 "TARGET_V32" 2348 "@ 2349 adds.b %2,%0 2350 adds.b %2,%0 2351 addo.b %2,%1,%0" 2352 [(set_attr "slottable" "yes") 2353 (set_attr "cc" "clobber,clobber,none")]) 2354 2355(define_insn "*addubw_v32" 2356 [(set (match_operand:HI 0 "register_operand" "=r,r") 2357 (plus:HI 2358 (zero_extend:HI 2359 (match_operand:QI 2 "nonimmediate_operand" "r,m")) 2360 (match_operand:HI 1 "register_operand" "0,0")))] 2361 "TARGET_V32" 2362 "addu.b %2,%0" 2363 [(set_attr "slottable" "yes") 2364 (set_attr "cc" "clobber")]) 2365 2366(define_insn "*extop<mode>si_swap_non_v32" 2367 [(set (match_operand:SI 0 "register_operand" "=r,r,r,r") 2368 (match_operator:SI 2369 4 "cris_plus_or_bound_operator" 2370 [(match_operator:SI 2371 3 "cris_extend_operator" 2372 [(match_operand:BW 2 "nonimmediate_operand" "r,Q>,m,!To")]) 2373 (match_operand:SI 1 "register_operand" "0,0,0,r")]))] 2374 "!TARGET_V32 2375 && (GET_CODE (operands[4]) != UMIN || GET_CODE (operands[3]) == ZERO_EXTEND) 2376 && operands[1] != frame_pointer_rtx" 2377 "@ 2378 %x4%E3<m> %2,%0 2379 %x4%E3<m> %2,%0 2380 %x4%E3<m> %2,%0 2381 %x4%E3<m> %2,%1,%0" 2382 [(set_attr "slottable" "yes,yes,no,no")]) 2383 2384(define_insn "*adds<mode>_v32" 2385 [(set (match_operand:SI 0 "register_operand" "=r,r,!a") 2386 (plus:SI 2387 (sign_extend:SI 2388 (match_operand:BW 2 "nonimmediate_operand" "r,m,m")) 2389 (match_operand:SI 1 "register_operand" "0,0,r")))] 2390 "TARGET_V32" 2391 "@ 2392 adds<m> %2,%0 2393 adds<m> %2,%0 2394 addo<m> %2,%1,%0" 2395 [(set_attr "slottable" "yes") 2396 (set_attr "cc" "*,*,none")]) 2397 2398(define_insn "*addu<mode>_v32" 2399 [(set (match_operand:SI 0 "register_operand" "=r,r") 2400 (plus:SI 2401 (zero_extend:SI 2402 (match_operand:BW 2 "nonimmediate_operand" "r,m")) 2403 (match_operand:SI 1 "register_operand" "0,0")))] 2404 "TARGET_V32 && operands[1] != frame_pointer_rtx" 2405 "addu<m> %2,%0" 2406 [(set_attr "slottable" "yes")]) 2407 2408(define_insn "*bound<mode>_v32" 2409 [(set (match_operand:SI 0 "register_operand" "=r") 2410 (umin:SI 2411 (zero_extend:SI 2412 (match_operand:BW 2 "register_operand" "r")) 2413 (match_operand:SI 1 "register_operand" "0")))] 2414 "TARGET_V32 && operands[1] != frame_pointer_rtx" 2415 "bound<m> %2,%0" 2416 [(set_attr "slottable" "yes")]) 2417 2418;; This is the special case when we use what corresponds to the 2419;; instruction above in "casesi". Do *not* change it to use the generic 2420;; pattern and "REG 15" as pc; I did that and it led to madness and 2421;; maintenance problems: Instead of (as imagined) recognizing and removing 2422;; or replacing this pattern with something simpler, other variant 2423;; patterns were recognized or combined, including some prefix variants 2424;; where the value in pc is not that of the next instruction (which means 2425;; this instruction actually *is* special and *should* be marked as such). 2426;; When switching from the "generic pattern match" approach to this simpler 2427;; approach, there were insignificant differences in gcc, ipps and 2428;; product code, somehow due to scratching reload behind the ear or 2429;; something. Testcase "gcc" looked .01% slower and 4 bytes bigger; 2430;; product code became .001% smaller but "looked better". The testcase 2431;; "ipps" was just different at register allocation). 2432;; 2433;; Assumptions in the jump optimizer forces us to use IF_THEN_ELSE in this 2434;; pattern with the default-label as the else, with the "if" being 2435;; index-is-less-than the max number of cases plus one. The default-label 2436;; is attached to the end of the case-table at time of output. 2437 2438(define_insn "*casesi_adds_w" 2439 [(set (pc) 2440 (if_then_else 2441 (ltu (match_operand:SI 0 "register_operand" "r") 2442 (match_operand:SI 1 "const_int_operand" "n")) 2443 (plus:SI (sign_extend:SI 2444 (mem:HI 2445 (plus:SI (mult:SI (match_dup 0) (const_int 2)) 2446 (pc)))) 2447 (pc)) 2448 (label_ref (match_operand 2 "" "")))) 2449 (use (label_ref (match_operand 3 "" "")))] 2450 "!TARGET_V32 && operands[0] != frame_pointer_rtx" 2451 "adds.w [$pc+%0.w],$pc" 2452 [(set_attr "cc" "clobber")]) 2453 2454;; For V32, we just have a jump, but we need to mark the table as used, 2455;; and the jump insn must have the if_then_else form expected by core 2456;; GCC. Since we don't want to prolong the lifetime of the original 2457;; index value, we compare against "unspec 0". It's a pity we have to 2458;; jump through to get the default label in place and to keep the jump 2459;; table around. FIXME: Look into it some time. 2460 2461(define_insn "*casesi_jump_v32" 2462 [(set (pc) 2463 (if_then_else 2464 (ltu (unspec [(const_int 0)] CRIS_UNSPEC_CASESI) 2465 (match_operand:SI 0 "const_int_operand" "n")) 2466 (match_operand:SI 1 "register_operand" "r") 2467 (label_ref (match_operand 2 "" "")))) 2468 (use (label_ref (match_operand 3 "" "")))] 2469 "TARGET_V32" 2470 "jump %1%#" 2471 [(set_attr "cc" "clobber") 2472 (set_attr "slottable" "has_slot")]) 2473 2474;; Multiply instructions. 2475 2476;; Sometimes powers of 2 (which are normally canonicalized to a 2477;; left-shift) appear here, as a result of address reloading. 2478;; As a special, for values 3 and 5, we can match with an addi, so add those. 2479;; 2480;; FIXME: This may be unnecessary now. 2481;; Explicitly named for convenience of having a gen_... function. 2482 2483(define_insn "addi_mul" 2484 [(set (match_operand:SI 0 "register_operand" "=r") 2485 (mult:SI 2486 (match_operand:SI 1 "register_operand" "%0") 2487 (match_operand:SI 2 "const_int_operand" "n")))] 2488 "operands[0] != frame_pointer_rtx 2489 && operands[1] != frame_pointer_rtx 2490 && CONST_INT_P (operands[2]) 2491 && (INTVAL (operands[2]) == 2 2492 || INTVAL (operands[2]) == 4 || INTVAL (operands[2]) == 3 2493 || INTVAL (operands[2]) == 5)" 2494{ 2495 if (INTVAL (operands[2]) == 2) 2496 return "lslq 1,%0"; 2497 else if (INTVAL (operands[2]) == 4) 2498 return "lslq 2,%0"; 2499 else if (INTVAL (operands[2]) == 3) 2500 return "addi %0.w,%0"; 2501 else if (INTVAL (operands[2]) == 5) 2502 return "addi %0.d,%0"; 2503 return "BAD: adr_mulsi: %0=%1*%2"; 2504} 2505[(set_attr "slottable" "yes") 2506 ;; No flags are changed if this insn is "addi", but it does not seem 2507 ;; worth the trouble to distinguish that to the lslq cases. 2508 (set_attr "cc" "clobber")]) 2509 2510;; The addi insn as it is normally used. 2511 2512;; Make the the ACR alternative taste bad enough to not choose it as a 2513;; preference to avoid spilling problems (unwind-dw2-fde.c at build). 2514;; FIXME: Revisit for new register allocator. 2515 2516(define_insn "*addi" 2517 [(set (match_operand:SI 0 "register_operand" "=r,!a") 2518 (plus:SI 2519 (mult:SI (match_operand:SI 2 "register_operand" "r,r") 2520 (match_operand:SI 3 "const_int_operand" "n,n")) 2521 (match_operand:SI 1 "register_operand" "0,r")))] 2522 "operands[0] != frame_pointer_rtx 2523 && operands[1] != frame_pointer_rtx 2524 && CONST_INT_P (operands[3]) 2525 && (INTVAL (operands[3]) == 1 2526 || INTVAL (operands[3]) == 2 || INTVAL (operands[3]) == 4)" 2527 "@ 2528 addi %2%T3,%0 2529 addi %2%T3,%1,%0" 2530 [(set_attr "slottable" "yes") 2531 (set_attr "cc" "none")]) 2532 2533;; The mstep instruction. Probably not useful by itself; it's to 2534;; non-linear wrt. the other insns. We used to expand to it, so at least 2535;; it's correct. 2536 2537(define_insn "mstep_shift" 2538 [(set (match_operand:SI 0 "register_operand" "=r") 2539 (if_then_else:SI 2540 (lt:SI (cc0) (const_int 0)) 2541 (plus:SI (ashift:SI (match_operand:SI 1 "register_operand" "0") 2542 (const_int 1)) 2543 (match_operand:SI 2 "register_operand" "r")) 2544 (ashift:SI (match_operand:SI 3 "register_operand" "0") 2545 (const_int 1))))] 2546 "!TARGET_V32" 2547 "mstep %2,%0" 2548 [(set_attr "slottable" "yes")]) 2549 2550;; When illegitimate addresses are legitimized, sometimes gcc forgets 2551;; to canonicalize the multiplications. 2552;; 2553;; FIXME: Check gcc > 2.7.2, remove and possibly fix in gcc. 2554 2555(define_insn "mstep_mul" 2556 [(set (match_operand:SI 0 "register_operand" "=r") 2557 (if_then_else:SI 2558 (lt:SI (cc0) (const_int 0)) 2559 (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "0") 2560 (const_int 2)) 2561 (match_operand:SI 2 "register_operand" "r")) 2562 (mult:SI (match_operand:SI 3 "register_operand" "0") 2563 (const_int 2))))] 2564 "!TARGET_V32 2565 && operands[0] != frame_pointer_rtx 2566 && operands[1] != frame_pointer_rtx 2567 && operands[2] != frame_pointer_rtx 2568 && operands[3] != frame_pointer_rtx" 2569 "mstep %2,%0" 2570 [(set_attr "slottable" "yes")]) 2571 2572(define_insn "<u>mul<s><mode>3" 2573 [(set (match_operand:WD 0 "register_operand" "=r") 2574 (mult:WD 2575 (szext:WD (match_operand:<S> 1 "register_operand" "%0")) 2576 (szext:WD (match_operand:<S> 2 "register_operand" "r")))) 2577 (clobber (match_scratch:SI 3 "=h"))] 2578 "TARGET_HAS_MUL_INSNS" 2579 "%!mul<su><mm> %2,%0" 2580 [(set (attr "slottable") 2581 (if_then_else (ne (symbol_ref "TARGET_MUL_BUG") (const_int 0)) 2582 (const_string "no") 2583 (const_string "yes"))) 2584 ;; For umuls.[bwd] it's just N unusable here, but let's be safe. 2585 ;; For muls.b, this really extends to SImode, so cc should be 2586 ;; considered clobbered. 2587 ;; For muls.w, it's just N unusable here, but let's be safe. 2588 (set_attr "cc" "clobber")]) 2589 2590;; Note that gcc does not make use of such a thing as umulqisi3. It gets 2591;; confused and will erroneously use it instead of umulhisi3, failing (at 2592;; least) gcc.c-torture/execute/arith-rand.c at all optimization levels. 2593;; Inspection of optab code shows that there must be only one widening 2594;; multiplication per mode widened to. 2595 2596(define_insn "mulsi3" 2597 [(set (match_operand:SI 0 "register_operand" "=r") 2598 (mult:SI (match_operand:SI 1 "register_operand" "%0") 2599 (match_operand:SI 2 "register_operand" "r"))) 2600 (clobber (match_scratch:SI 3 "=h"))] 2601 "TARGET_HAS_MUL_INSNS" 2602 "%!muls.d %2,%0" 2603 [(set (attr "slottable") 2604 (if_then_else (ne (symbol_ref "TARGET_MUL_BUG") (const_int 0)) 2605 (const_string "no") 2606 (const_string "yes"))) 2607 ;; Just N unusable here, but let's be safe. 2608 (set_attr "cc" "clobber")]) 2609 2610;; A few multiply variations. 2611 2612;; When needed, we can get the high 32 bits from the overflow 2613;; register. We don't care to split and optimize these. 2614;; 2615;; Note that cc0 is still valid after the move-from-overflow-register 2616;; insn; no special precaution need to be taken in cris_notice_update_cc. 2617 2618(define_insn "<u>mulsidi3" 2619 [(set (match_operand:DI 0 "register_operand" "=r") 2620 (mult:DI 2621 (szext:DI (match_operand:SI 1 "register_operand" "%0")) 2622 (szext:DI (match_operand:SI 2 "register_operand" "r")))) 2623 (clobber (match_scratch:SI 3 "=h"))] 2624 "TARGET_HAS_MUL_INSNS" 2625 "%!mul<su>.d %2,%M0\;move $mof,%H0") 2626 2627;; These two patterns may be expressible by other means, perhaps by making 2628;; [u]?mulsidi3 a define_expand. 2629 2630;; Due to register allocation braindamage, the clobber 1,2 alternatives 2631;; cause a move into the clobbered register *before* the insn, then 2632;; after the insn, mof is moved too, rather than the clobber assigned 2633;; the last mof target. This became apparent when making MOF and SRP 2634;; visible registers, with the necessary tweak to smulsi3_highpart. 2635;; Because these patterns are used in division by constants, that damage 2636;; is visible (ipps regression tests). Therefore the last two 2637;; alternatives, "helping" reload to avoid an unnecessary move, but 2638;; punished by force of one "?". Check code from "int d (int a) {return 2639;; a / 1000;}" and unsigned. FIXME: Comment above was for 3.2, revisit. 2640 2641(define_insn "<su>mulsi3_highpart" 2642 [(set (match_operand:SI 0 "register_operand" "=h,h,?r,?r") 2643 (truncate:SI 2644 (lshiftrt:DI 2645 (mult:DI 2646 (szext:DI (match_operand:SI 1 "register_operand" "r,r,0,r")) 2647 (szext:DI (match_operand:SI 2 "register_operand" "r,r,r,0"))) 2648 (const_int 32)))) 2649 (clobber (match_scratch:SI 3 "=1,2,h,h"))] 2650 "TARGET_HAS_MUL_INSNS" 2651 "@ 2652 %!mul<su>.d %2,%1 2653 %!mul<su>.d %1,%2 2654 %!mul<su>.d %2,%1\;move $mof,%0 2655 %!mul<su>.d %1,%2\;move $mof,%0" 2656 [(set_attr "slottable" "yes,yes,no,no") 2657 (set_attr "cc" "clobber")]) 2658 2659;; Divide and modulus instructions. CRIS only has a step instruction. 2660 2661(define_insn "dstep_shift" 2662 [(set (match_operand:SI 0 "register_operand" "=r") 2663 (if_then_else:SI 2664 (geu:SI (ashift:SI (match_operand:SI 1 "register_operand" "0") 2665 (const_int 1)) 2666 (match_operand:SI 2 "register_operand" "r")) 2667 (minus:SI (ashift:SI (match_operand:SI 3 "register_operand" "0") 2668 (const_int 1)) 2669 (match_operand:SI 4 "register_operand" "2")) 2670 (ashift:SI (match_operand:SI 5 "register_operand" "0") 2671 (const_int 1))))] 2672 "" 2673 "dstep %2,%0" 2674 [(set_attr "slottable" "yes") 2675 (set_attr "cc" "noov32")]) 2676 2677;; Here's a variant with mult instead of ashift. 2678;; 2679;; FIXME: This should be investigated. Which one matches through combination? 2680 2681(define_insn "dstep_mul" 2682 [(set (match_operand:SI 0 "register_operand" "=r") 2683 (if_then_else:SI 2684 (geu:SI (mult:SI (match_operand:SI 1 "register_operand" "0") 2685 (const_int 2)) 2686 (match_operand:SI 2 "register_operand" "r")) 2687 (minus:SI (mult:SI (match_operand:SI 3 "register_operand" "0") 2688 (const_int 2)) 2689 (match_operand:SI 4 "register_operand" "2")) 2690 (mult:SI (match_operand:SI 5 "register_operand" "0") 2691 (const_int 2))))] 2692 "operands[0] != frame_pointer_rtx 2693 && operands[1] != frame_pointer_rtx 2694 && operands[2] != frame_pointer_rtx 2695 && operands[3] != frame_pointer_rtx" 2696 "dstep %2,%0" 2697 [(set_attr "slottable" "yes") 2698 (set_attr "cc" "noov32")]) 2699 2700;; Logical operators. 2701 2702;; Bitwise "and". 2703 2704;; There is no use in defining "anddi3", because gcc can expand this by 2705;; itself, and make reasonable code without interference. 2706 2707;; If the first operand is memory or a register and is the same as the 2708;; second operand, and the third operand is -256 or -65536, we can use 2709;; CLEAR instead. Or, if the first operand is a register, and the third 2710;; operand is 255 or 65535, we can zero_extend. 2711;; GCC isn't smart enough to recognize these cases (yet), and they seem 2712;; to be common enough to be worthwhile. 2713;; FIXME: This should be made obsolete. 2714 2715(define_expand "andsi3" 2716 [(set (match_operand:SI 0 "nonimmediate_operand" "") 2717 (and:SI (match_operand:SI 1 "nonimmediate_operand" "") 2718 (match_operand:SI 2 "general_operand" "")))] 2719 "" 2720{ 2721 if (! (CONST_INT_P (operands[2]) 2722 && (((INTVAL (operands[2]) == -256 2723 || INTVAL (operands[2]) == -65536) 2724 && rtx_equal_p (operands[1], operands[0])) 2725 || ((INTVAL (operands[2]) == 255 2726 || INTVAL (operands[2]) == 65535) 2727 && REG_P (operands[0]))))) 2728 { 2729 /* Make intermediate steps if operand0 is not a register or 2730 operand1 is not a register, and hope that the reload pass will 2731 make something useful out of it. Note that the operands are 2732 *not* canonicalized. For the moment, I chicken out on this, 2733 because all or most ports do not describe 'and' with 2734 canonicalized operands, and I seem to remember magic in reload, 2735 checking that operand1 has constraint '%0', in which case 2736 operand0 and operand1 must have similar predicates. 2737 FIXME: Investigate. */ 2738 rtx reg0 = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (SImode); 2739 rtx reg1 = operands[1]; 2740 2741 if (! REG_P (reg1)) 2742 { 2743 emit_move_insn (reg0, reg1); 2744 reg1 = reg0; 2745 } 2746 2747 emit_insn (gen_rtx_SET (SImode, reg0, 2748 gen_rtx_AND (SImode, reg1, operands[2]))); 2749 2750 /* Make sure we get the right *final* destination. */ 2751 if (! REG_P (operands[0])) 2752 emit_move_insn (operands[0], reg0); 2753 2754 DONE; 2755 } 2756}) 2757 2758;; Some special cases of andsi3. 2759 2760(define_insn "*andsi_movu" 2761 [(set (match_operand:SI 0 "register_operand" "=r,r,r") 2762 (and:SI (match_operand:SI 1 "nonimmediate_operand" "%r,Q,To") 2763 (match_operand:SI 2 "const_int_operand" "n,n,n")))] 2764 "(INTVAL (operands[2]) == 255 || INTVAL (operands[2]) == 65535) 2765 && !side_effects_p (operands[1])" 2766 "movu.%z2 %1,%0" 2767 [(set_attr "slottable" "yes,yes,no")]) 2768 2769(define_insn "*andsi_clear" 2770 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,Q,Q,To,To") 2771 (and:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0,0,0") 2772 (match_operand:SI 2 "const_int_operand" "P,n,P,n,P,n")))] 2773 "(INTVAL (operands[2]) == -65536 || INTVAL (operands[2]) == -256) 2774 && !side_effects_p (operands[0])" 2775 "@ 2776 cLear.b %0 2777 cLear.w %0 2778 cLear.b %0 2779 cLear.w %0 2780 cLear.b %0 2781 cLear.w %0" 2782 [(set_attr "slottable" "yes,yes,yes,yes,no,no") 2783 (set_attr "cc" "none")]) 2784 2785;; This is a catch-all pattern, taking care of everything that was not 2786;; matched in the insns above. 2787;; 2788;; Sidenote: the tightening from "nonimmediate_operand" to 2789;; "register_operand" for operand 1 actually increased the register 2790;; pressure (worse code). That will hopefully change with an 2791;; improved reload pass. 2792 2793(define_insn "*expanded_andsi_non_v32" 2794 [(set (match_operand:SI 0 "register_operand" "=r,r,r, r,r") 2795 (and:SI (match_operand:SI 1 "register_operand" "%0,0,0, 0,r") 2796 (match_operand:SI 2 "general_operand" "I,r,Q>,g,!To")))] 2797 "!TARGET_V32" 2798 "@ 2799 andq %2,%0 2800 and.d %2,%0 2801 and.d %2,%0 2802 and.d %2,%0 2803 and.d %2,%1,%0" 2804 [(set_attr "slottable" "yes,yes,yes,no,no")]) 2805 2806(define_insn "*expanded_andsi_v32" 2807 [(set (match_operand:SI 0 "register_operand" "=r,r,r,r") 2808 (and:SI (match_operand:SI 1 "register_operand" "%0,0,0,0") 2809 (match_operand:SI 2 "general_operand" "I,r,Q>,g")))] 2810 "TARGET_V32" 2811 "@ 2812 andq %2,%0 2813 and.d %2,%0 2814 and.d %2,%0 2815 and.d %2,%0" 2816 [(set_attr "slottable" "yes,yes,yes,no") 2817 (set_attr "cc" "noov32")]) 2818 2819;; For both QI and HI we may use the quick patterns. This results in 2820;; useless condition codes, but that is used rarely enough for it to 2821;; normally be a win (could check ahead for use of cc0, but seems to be 2822;; more pain than win). 2823 2824;; FIXME: See note for andsi3 2825 2826(define_expand "andhi3" 2827 [(set (match_operand:HI 0 "nonimmediate_operand" "") 2828 (and:HI (match_operand:HI 1 "nonimmediate_operand" "") 2829 (match_operand:HI 2 "general_operand" "")))] 2830 "" 2831{ 2832 if (! (CONST_INT_P (operands[2]) 2833 && (((INTVAL (operands[2]) == -256 2834 || INTVAL (operands[2]) == 65280) 2835 && rtx_equal_p (operands[1], operands[0])) 2836 || (INTVAL (operands[2]) == 255 2837 && REG_P (operands[0]))))) 2838 { 2839 /* See comment for andsi3. */ 2840 rtx reg0 = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (HImode); 2841 rtx reg1 = operands[1]; 2842 2843 if (! REG_P (reg1)) 2844 { 2845 emit_move_insn (reg0, reg1); 2846 reg1 = reg0; 2847 } 2848 2849 emit_insn (gen_rtx_SET (HImode, reg0, 2850 gen_rtx_AND (HImode, reg1, operands[2]))); 2851 2852 /* Make sure we get the right destination. */ 2853 if (! REG_P (operands[0])) 2854 emit_move_insn (operands[0], reg0); 2855 2856 DONE; 2857 } 2858}) 2859 2860;; Some fast andhi3 special cases. 2861 2862(define_insn "*andhi_movu" 2863 [(set (match_operand:HI 0 "register_operand" "=r,r,r") 2864 (and:HI (match_operand:HI 1 "nonimmediate_operand" "r,Q,To") 2865 (const_int 255)))] 2866 "!side_effects_p (operands[1])" 2867 "mOvu.b %1,%0" 2868 [(set_attr "slottable" "yes,yes,no")]) 2869 2870(define_insn "*andhi_clear" 2871 [(set (match_operand:HI 0 "nonimmediate_operand" "=r,Q,To") 2872 (and:HI (match_operand:HI 1 "nonimmediate_operand" "0,0,0") 2873 (const_int -256)))] 2874 "!side_effects_p (operands[0])" 2875 "cLear.b %0" 2876 [(set_attr "slottable" "yes,yes,no") 2877 (set_attr "cc" "none")]) 2878 2879;; Catch-all andhi3 pattern. 2880 2881(define_insn "*expanded_andhi_non_v32" 2882 [(set (match_operand:HI 0 "register_operand" "=r,r,r, r,r,r,r") 2883 (and:HI (match_operand:HI 1 "register_operand" "%0,0,0, 0,0,0,r") 2884 (match_operand:HI 2 "general_operand" "I,r,Q>,L,O,g,!To")))] 2885 2886;; Sidenote: the tightening from "general_operand" to 2887;; "register_operand" for operand 1 actually increased the register 2888;; pressure (worse code). That will hopefully change with an 2889;; improved reload pass. 2890 2891 "!TARGET_V32" 2892 "@ 2893 andq %2,%0 2894 and.w %2,%0 2895 and.w %2,%0 2896 and.w %2,%0 2897 anDq %b2,%0 2898 and.w %2,%0 2899 and.w %2,%1,%0" 2900 [(set_attr "slottable" "yes,yes,yes,no,yes,no,no") 2901 (set_attr "cc" "clobber,normal,normal,normal,clobber,normal,normal")]) 2902 2903(define_insn "*expanded_andhi_v32" 2904 [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r,r") 2905 (and:HI (match_operand:HI 1 "register_operand" "%0,0,0,0,0,0") 2906 (match_operand:HI 2 "general_operand" "I,r,Q>,L,O,g")))] 2907 "TARGET_V32" 2908 "@ 2909 andq %2,%0 2910 and.w %2,%0 2911 and.w %2,%0 2912 and.w %2,%0 2913 anDq %b2,%0 2914 and.w %2,%0" 2915 [(set_attr "slottable" "yes,yes,yes,no,yes,no") 2916 (set_attr "cc" "clobber,noov32,noov32,noov32,clobber,noov32")]) 2917 2918;; A strict_low_part pattern. 2919 2920(define_insn "*andhi_lowpart_non_v32" 2921 [(set (strict_low_part 2922 (match_operand:HI 0 "register_operand" "+r,r, r,r,r,r")) 2923 (and:HI (match_operand:HI 1 "register_operand" "%0,0, 0,0,0,r") 2924 (match_operand:HI 2 "general_operand" "r,Q>,L,O,g,!To")))] 2925 "!TARGET_V32" 2926 "@ 2927 and.w %2,%0 2928 and.w %2,%0 2929 and.w %2,%0 2930 anDq %b2,%0 2931 and.w %2,%0 2932 and.w %2,%1,%0" 2933 [(set_attr "slottable" "yes,yes,no,yes,no,no") 2934 (set_attr "cc" "normal,normal,normal,clobber,normal,normal")]) 2935 2936(define_insn "*andhi_lowpart_v32" 2937 [(set (strict_low_part 2938 (match_operand:HI 0 "register_operand" "+r,r,r,r,r")) 2939 (and:HI (match_operand:HI 1 "register_operand" "%0,0,0,0,0") 2940 (match_operand:HI 2 "general_operand" "r,Q>,L,O,g")))] 2941 "TARGET_V32" 2942 "@ 2943 and.w %2,%0 2944 and.w %2,%0 2945 and.w %2,%0 2946 anDq %b2,%0 2947 and.w %2,%0" 2948 [(set_attr "slottable" "yes,yes,no,yes,no") 2949 (set_attr "cc" "noov32,noov32,noov32,clobber,noov32")]) 2950 2951(define_expand "andqi3" 2952 [(set (match_operand:QI 0 "register_operand") 2953 (and:QI (match_operand:QI 1 "register_operand") 2954 (match_operand:QI 2 "general_operand")))] 2955 "" 2956 "") 2957 2958(define_insn "*andqi3_non_v32" 2959 [(set (match_operand:QI 0 "register_operand" "=r,r,r, r,r,r") 2960 (and:QI (match_operand:QI 1 "register_operand" "%0,0,0, 0,0,r") 2961 (match_operand:QI 2 "general_operand" "I,r,Q>,O,g,!To")))] 2962 "!TARGET_V32" 2963 "@ 2964 andq %2,%0 2965 and.b %2,%0 2966 and.b %2,%0 2967 andQ %b2,%0 2968 and.b %2,%0 2969 and.b %2,%1,%0" 2970 [(set_attr "slottable" "yes,yes,yes,yes,no,no") 2971 (set_attr "cc" "clobber,normal,normal,clobber,normal,normal")]) 2972 2973(define_insn "*andqi3_v32" 2974 [(set (match_operand:QI 0 "register_operand" "=r,r,r,r,r") 2975 (and:QI (match_operand:QI 1 "register_operand" "%0,0,0,0,0") 2976 (match_operand:QI 2 "general_operand" "I,r,Q>,O,g")))] 2977 "TARGET_V32" 2978 "@ 2979 andq %2,%0 2980 and.b %2,%0 2981 and.b %2,%0 2982 andQ %b2,%0 2983 and.b %2,%0" 2984 [(set_attr "slottable" "yes,yes,yes,yes,no") 2985 (set_attr "cc" "clobber,noov32,noov32,clobber,noov32")]) 2986 2987(define_insn "*andqi_lowpart_non_v32" 2988 [(set (strict_low_part 2989 (match_operand:QI 0 "register_operand" "+r,r, r,r,r")) 2990 (and:QI (match_operand:QI 1 "register_operand" "%0,0, 0,0,r") 2991 (match_operand:QI 2 "general_operand" "r,Q>,O,g,!To")))] 2992 "!TARGET_V32" 2993 "@ 2994 and.b %2,%0 2995 and.b %2,%0 2996 andQ %b2,%0 2997 and.b %2,%0 2998 and.b %2,%1,%0" 2999 [(set_attr "slottable" "yes,yes,yes,no,no") 3000 (set_attr "cc" "normal,normal,clobber,normal,normal")]) 3001 3002(define_insn "*andqi_lowpart_v32" 3003 [(set (strict_low_part 3004 (match_operand:QI 0 "register_operand" "+r,r,r,r")) 3005 (and:QI (match_operand:QI 1 "register_operand" "%0,0,0,0") 3006 (match_operand:QI 2 "general_operand" "r,Q>,O,g")))] 3007 "TARGET_V32" 3008 "@ 3009 and.b %2,%0 3010 and.b %2,%0 3011 andQ %b2,%0 3012 and.b %2,%0" 3013 [(set_attr "slottable" "yes,yes,yes,no") 3014 (set_attr "cc" "noov32,noov32,clobber,noov32")]) 3015 3016;; Bitwise or. 3017 3018;; Same comment as anddi3 applies here - no need for such a pattern. 3019 3020;; It seems there's no need to jump through hoops to get good code such as 3021;; with andsi3. 3022 3023(define_expand "ior<mode>3" 3024 [(set (match_operand:BWD 0 "register_operand") 3025 (ior:BWD (match_operand:BWD 1 "register_operand") 3026 (match_operand:BWD 2 "general_operand")))] 3027 "" 3028 "") 3029 3030(define_insn "*iorsi3_non_v32" 3031 [(set (match_operand:SI 0 "register_operand" "=r,r,r, r,r,r") 3032 (ior:SI (match_operand:SI 1 "register_operand" "%0,0,0, 0,0,r") 3033 (match_operand:SI 2 "general_operand" "I, r,Q>,n,g,!To")))] 3034 "!TARGET_V32" 3035 "@ 3036 orq %2,%0 3037 or.d %2,%0 3038 or.d %2,%0 3039 oR.%s2 %2,%0 3040 or.d %2,%0 3041 or.d %2,%1,%0" 3042 [(set_attr "slottable" "yes,yes,yes,no,no,no") 3043 (set_attr "cc" "normal,normal,normal,clobber,normal,normal")]) 3044 3045(define_insn "*iorsi3_v32" 3046 [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r") 3047 (ior:SI (match_operand:SI 1 "register_operand" "%0,0,0,0,0") 3048 (match_operand:SI 2 "general_operand" "I,r,Q>,n,g")))] 3049 "TARGET_V32" 3050 "@ 3051 orq %2,%0 3052 or.d %2,%0 3053 or.d %2,%0 3054 oR.%s2 %2,%0 3055 or.d %2,%0" 3056 [(set_attr "slottable" "yes,yes,yes,no,no") 3057 (set_attr "cc" "noov32,noov32,noov32,clobber,noov32")]) 3058 3059(define_insn "*iorhi3_non_v32" 3060 [(set (match_operand:HI 0 "register_operand" "=r,r,r, r,r,r,r") 3061 (ior:HI (match_operand:HI 1 "register_operand" "%0,0,0, 0,0,0,r") 3062 (match_operand:HI 2 "general_operand" "I,r,Q>,L,O,g,!To")))] 3063 "!TARGET_V32" 3064 "@ 3065 orq %2,%0 3066 or.w %2,%0 3067 or.w %2,%0 3068 or.w %2,%0 3069 oRq %b2,%0 3070 or.w %2,%0 3071 or.w %2,%1,%0" 3072 [(set_attr "slottable" "yes,yes,yes,no,yes,no,no") 3073 (set_attr "cc" "clobber,normal,normal,normal,clobber,normal,normal")]) 3074 3075(define_insn "*iorhi3_v32" 3076 [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r,r") 3077 (ior:HI (match_operand:HI 1 "register_operand" "%0,0,0,0,0,0") 3078 (match_operand:HI 2 "general_operand" "I,r,Q>,L,O,g")))] 3079 "TARGET_V32" 3080 "@ 3081 orq %2,%0 3082 or.w %2,%0 3083 or.w %2,%0 3084 or.w %2,%0 3085 oRq %b2,%0 3086 or.w %2,%0" 3087 [(set_attr "slottable" "yes,yes,yes,no,yes,no") 3088 (set_attr "cc" "clobber,noov32,noov32,noov32,clobber,noov32")]) 3089 3090(define_insn "*iorqi3_non_v32" 3091 [(set (match_operand:QI 0 "register_operand" "=r,r,r, r,r,r") 3092 (ior:QI (match_operand:QI 1 "register_operand" "%0,0,0, 0,0,r") 3093 (match_operand:QI 2 "general_operand" "I,r,Q>,O,g,!To")))] 3094 "!TARGET_V32" 3095 "@ 3096 orq %2,%0 3097 or.b %2,%0 3098 or.b %2,%0 3099 orQ %b2,%0 3100 or.b %2,%0 3101 or.b %2,%1,%0" 3102 [(set_attr "slottable" "yes,yes,yes,yes,no,no") 3103 (set_attr "cc" "clobber,normal,normal,clobber,normal,normal")]) 3104 3105(define_insn "*iorqi3_v32" 3106 [(set (match_operand:QI 0 "register_operand" "=r,r,r,r,r") 3107 (ior:QI (match_operand:QI 1 "register_operand" "%0,0,0,0,0") 3108 (match_operand:QI 2 "general_operand" "I,r,Q>,O,g")))] 3109 "TARGET_V32" 3110 "@ 3111 orq %2,%0 3112 or.b %2,%0 3113 or.b %2,%0 3114 orQ %b2,%0 3115 or.b %2,%0" 3116 [(set_attr "slottable" "yes,yes,yes,yes,no") 3117 (set_attr "cc" "clobber,noov32,noov32,clobber,noov32")]) 3118 3119;; Exclusive-or 3120 3121;; See comment about "anddi3" for xordi3 - no need for such a pattern. 3122;; FIXME: Do we really need the shorter variants? 3123 3124(define_insn "xorsi3" 3125 [(set (match_operand:SI 0 "register_operand" "=r") 3126 (xor:SI (match_operand:SI 1 "register_operand" "%0") 3127 (match_operand:SI 2 "register_operand" "r")))] 3128 "" 3129 "xor %2,%0" 3130 [(set_attr "slottable" "yes") 3131 (set_attr "cc" "noov32")]) 3132 3133(define_insn "xor<mode>3" 3134 [(set (match_operand:BW 0 "register_operand" "=r") 3135 (xor:BW (match_operand:BW 1 "register_operand" "%0") 3136 (match_operand:BW 2 "register_operand" "r")))] 3137 "" 3138 "xor %2,%0" 3139 [(set_attr "slottable" "yes") 3140 (set_attr "cc" "clobber")]) 3141 3142;; Negation insns. 3143 3144;; Questionable use, here mostly as a (slightly usable) define_expand 3145;; example. 3146 3147(define_expand "negsf2" 3148 [(set (match_dup 2) 3149 (match_dup 3)) 3150 (parallel [(set (match_operand:SF 0 "register_operand" "=r") 3151 (neg:SF (match_operand:SF 1 3152 "register_operand" "0"))) 3153 (use (match_dup 2))])] 3154 "" 3155{ 3156 operands[2] = gen_reg_rtx (SImode); 3157 operands[3] = GEN_INT (1 << 31); 3158}) 3159 3160(define_insn "*expanded_negsf2" 3161 [(set (match_operand:SF 0 "register_operand" "=r") 3162 (neg:SF (match_operand:SF 1 "register_operand" "0"))) 3163 (use (match_operand:SI 2 "register_operand" "r"))] 3164 "" 3165 "xor %2,%0" 3166 [(set_attr "slottable" "yes")]) 3167 3168;; No "negdi2" although we could make one up that may be faster than 3169;; the one in libgcc. 3170 3171(define_insn "neg<mode>2" 3172 [(set (match_operand:BWD 0 "register_operand" "=r") 3173 (neg:BWD (match_operand:BWD 1 "register_operand" "r")))] 3174 "" 3175 "neg<m> %1,%0" 3176 [(set_attr "slottable" "yes")]) 3177 3178;; One-complements. 3179 3180;; See comment on anddi3 - no need for a DImode pattern. 3181;; See also xor comment. 3182 3183(define_insn "one_cmplsi2" 3184 [(set (match_operand:SI 0 "register_operand" "=r") 3185 (not:SI (match_operand:SI 1 "register_operand" "0")))] 3186 "" 3187 "not %0" 3188 [(set_attr "slottable" "yes") 3189 (set_attr "cc" "noov32")]) 3190 3191(define_insn "one_cmpl<mode>2" 3192 [(set (match_operand:BW 0 "register_operand" "=r") 3193 (not:BW (match_operand:BW 1 "register_operand" "0")))] 3194 "" 3195 "not %0" 3196 [(set_attr "slottable" "yes") 3197 (set_attr "cc" "clobber")]) 3198 3199;; Arithmetic/Logical shift right (and SI left). 3200 3201(define_insn "<shlr>si3" 3202 [(set (match_operand:SI 0 "register_operand" "=r") 3203 (shift:SI (match_operand:SI 1 "register_operand" "0") 3204 (match_operand:SI 2 "nonmemory_operand" "Kcr")))] 3205 "" 3206{ 3207 if (REG_S_P (operands[2])) 3208 return "<slr>.d %2,%0"; 3209 3210 return "<slr>q %2,%0"; 3211} 3212 [(set_attr "slottable" "yes") 3213 (set_attr "cc" "noov32")]) 3214 3215;; Since gcc gets lost, and forgets to zero-extend the source (or mask 3216;; the destination) when it changes shifts of lower modes into SImode, 3217;; it is better to make these expands an anonymous patterns instead of 3218;; the more correct define_insns. This occurs when gcc thinks that is 3219;; is better to widen to SImode and use immediate shift count. 3220 3221;; FIXME: Is this legacy or still true for gcc >= 2.7.2? 3222 3223;; FIXME: Can't parametrize sign_extend and zero_extend (before 3224;; mentioning "shiftrt"), so we need two patterns. 3225(define_expand "ashr<mode>3" 3226 [(set (match_dup 3) 3227 (sign_extend:SI (match_operand:BW 1 "nonimmediate_operand" ""))) 3228 (set (match_dup 4) 3229 (zero_extend:SI (match_operand:BW 2 "nonimmediate_operand" ""))) 3230 (set (match_dup 5) (ashiftrt:SI (match_dup 3) (match_dup 4))) 3231 (set (match_operand:BW 0 "general_operand" "") 3232 (subreg:BW (match_dup 5) 0))] 3233 "" 3234{ 3235 int i; 3236 3237 for (i = 3; i < 6; i++) 3238 operands[i] = gen_reg_rtx (SImode); 3239}) 3240 3241(define_expand "lshr<mode>3" 3242 [(set (match_dup 3) 3243 (zero_extend:SI (match_operand:BW 1 "nonimmediate_operand" ""))) 3244 (set (match_dup 4) 3245 (zero_extend:SI (match_operand:BW 2 "nonimmediate_operand" ""))) 3246 (set (match_dup 5) (lshiftrt:SI (match_dup 3) (match_dup 4))) 3247 (set (match_operand:BW 0 "general_operand" "") 3248 (subreg:BW (match_dup 5) 0))] 3249 "" 3250{ 3251 int i; 3252 3253 for (i = 3; i < 6; i++) 3254 operands[i] = gen_reg_rtx (SImode); 3255}) 3256 3257(define_insn "*expanded_<shlr><mode>" 3258 [(set (match_operand:BW 0 "register_operand" "=r") 3259 (shiftrt:BW (match_operand:BW 1 "register_operand" "0") 3260 (match_operand:BW 2 "register_operand" "r")))] 3261 "" 3262 "<slr><m> %2,%0" 3263 [(set_attr "slottable" "yes") 3264 (set_attr "cc" "noov32")]) 3265 3266(define_insn "*<shlr><mode>_lowpart" 3267 [(set (strict_low_part (match_operand:BW 0 "register_operand" "+r")) 3268 (shiftrt:BW (match_dup 0) 3269 (match_operand:BW 1 "register_operand" "r")))] 3270 "" 3271 "<slr><m> %1,%0" 3272 [(set_attr "slottable" "yes") 3273 (set_attr "cc" "noov32")]) 3274 3275;; Arithmetic/logical shift left. 3276 3277;; For narrower modes than SI, we can use lslq although it makes cc 3278;; unusable. The win is that we do not have to reload the shift-count 3279;; into a register. 3280 3281(define_insn "ashl<mode>3" 3282 [(set (match_operand:BW 0 "register_operand" "=r,r") 3283 (ashift:BW (match_operand:BW 1 "register_operand" "0,0") 3284 (match_operand:BW 2 "nonmemory_operand" "r,Kc")))] 3285 "" 3286{ 3287 return 3288 (CONST_INT_P (operands[2]) && INTVAL (operands[2]) > <nbitsm1>) 3289 ? "moveq 0,%0" 3290 : (CONSTANT_P (operands[2]) 3291 ? "lslq %2,%0" : "lsl<m> %2,%0"); 3292} 3293 [(set_attr "slottable" "yes") 3294 (set_attr "cc" "noov32,clobber")]) 3295 3296;; A strict_low_part matcher. 3297 3298(define_insn "*ashl<mode>_lowpart" 3299 [(set (strict_low_part (match_operand:BW 0 "register_operand" "+r")) 3300 (ashift:BW (match_dup 0) 3301 (match_operand:HI 1 "register_operand" "r")))] 3302 "" 3303 "lsl<m> %1,%0" 3304 [(set_attr "slottable" "yes") 3305 (set_attr "cc" "noov32")]) 3306 3307;; Various strange insns that gcc likes. 3308 3309;; Fortunately, it is simple to construct an abssf (although it may not 3310;; be very much used in practice). 3311 3312(define_insn "abssf2" 3313 [(set (match_operand:SF 0 "register_operand" "=r") 3314 (abs:SF (match_operand:SF 1 "register_operand" "0")))] 3315 "" 3316 "lslq 1,%0\;lsrq 1,%0") 3317 3318(define_insn "abssi2" 3319 [(set (match_operand:SI 0 "register_operand" "=r") 3320 (abs:SI (match_operand:SI 1 "register_operand" "r")))] 3321 "" 3322 "abs %1,%0" 3323 [(set_attr "slottable" "yes") 3324 (set_attr "cc" "noov32")]) 3325 3326;; FIXME: GCC should be able to do these expansions itself. 3327 3328(define_expand "abs<mode>2" 3329 [(set (match_dup 2) 3330 (sign_extend:SI (match_operand:BW 1 "general_operand" ""))) 3331 (set (match_dup 3) (abs:SI (match_dup 2))) 3332 (set (match_operand:BW 0 "register_operand" "") 3333 (subreg:BW (match_dup 3) 0))] 3334 "" 3335 "operands[2] = gen_reg_rtx (SImode); operands[3] = gen_reg_rtx (SImode);") 3336 3337(define_insn "clzsi2" 3338 [(set (match_operand:SI 0 "register_operand" "=r") 3339 (clz:SI (match_operand:SI 1 "register_operand" "r")))] 3340 "TARGET_HAS_LZ" 3341 "lz %1,%0" 3342 [(set_attr "slottable" "yes") 3343 (set_attr "cc" "noov32")]) 3344 3345(define_insn "bswapsi2" 3346 [(set (match_operand:SI 0 "register_operand" "=r") 3347 (bswap:SI (match_operand:SI 1 "register_operand" "0")))] 3348 "TARGET_HAS_SWAP" 3349 "swapwb %0" 3350 [(set_attr "slottable" "yes") 3351 (set_attr "cc" "noov32")]) 3352 3353;; This instruction swaps all bits in a register. 3354;; That means that the most significant bit is put in the place 3355;; of the least significant bit, and so on. 3356 3357(define_insn "cris_swap_bits" 3358 [(set (match_operand:SI 0 "register_operand" "=r") 3359 (unspec:SI [(match_operand:SI 1 "register_operand" "0")] 3360 CRIS_UNSPEC_SWAP_BITS))] 3361 "TARGET_HAS_SWAP" 3362 "swapwbr %0" 3363 [(set_attr "slottable" "yes") 3364 (set_attr "cc" "noov32")]) 3365 3366;; Implement ctz using two instructions, one for bit swap and one for clz. 3367;; Defines a scratch register to avoid clobbering input. 3368 3369(define_expand "ctzsi2" 3370 [(set (match_dup 2) 3371 (match_operand:SI 1 "register_operand")) 3372 (set (match_dup 2) 3373 (unspec:SI [(match_dup 2)] CRIS_UNSPEC_SWAP_BITS)) 3374 (set (match_operand:SI 0 "register_operand") 3375 (clz:SI (match_dup 2)))] 3376 "TARGET_HAS_LZ && TARGET_HAS_SWAP" 3377 "operands[2] = gen_reg_rtx (SImode);") 3378 3379;; Bound-insn. Defined to be the same as an unsigned minimum, which is an 3380;; operation supported by gcc. Used in casesi, but used now and then in 3381;; normal code too. 3382 3383(define_expand "uminsi3" 3384 [(set (match_operand:SI 0 "register_operand" "") 3385 (umin:SI (match_operand:SI 1 "register_operand" "") 3386 (match_operand:SI 2 "general_operand" "")))] 3387 "" 3388{ 3389 if (MEM_P (operands[2]) && TARGET_V32) 3390 operands[2] = force_reg (SImode, operands[2]); 3391}) 3392 3393(define_insn "*uminsi3_non_v32" 3394 [(set (match_operand:SI 0 "register_operand" "=r,r, r,r") 3395 (umin:SI (match_operand:SI 1 "register_operand" "%0,0, 0,r") 3396 (match_operand:SI 2 "general_operand" "r,Q>,g,!To")))] 3397 "!TARGET_V32" 3398{ 3399 if (CONST_INT_P (operands[2])) 3400 { 3401 /* Constant operands are zero-extended, so only 32-bit operands 3402 may be negative. */ 3403 if (INTVAL (operands[2]) >= 0) 3404 { 3405 if (INTVAL (operands[2]) < 256) 3406 return "bound.b %2,%0"; 3407 3408 if (INTVAL (operands[2]) < 65536) 3409 return "bound.w %2,%0"; 3410 } 3411 } 3412 else if (which_alternative == 3) 3413 return "bound.d %2,%1,%0"; 3414 3415 return "bound.d %2,%0"; 3416} 3417 [(set_attr "slottable" "yes,yes,no,no")]) 3418 3419(define_insn "*uminsi3_v32" 3420 [(set (match_operand:SI 0 "register_operand" "=r,r") 3421 (umin:SI (match_operand:SI 1 "register_operand" "%0,0") 3422 (match_operand:SI 2 "nonmemory_operand" "r,i")))] 3423 "TARGET_V32" 3424{ 3425 if (GET_CODE (operands[2]) == CONST_INT) 3426 { 3427 /* Constant operands are zero-extended, so only 32-bit operands 3428 may be negative. */ 3429 if (INTVAL (operands[2]) >= 0) 3430 { 3431 if (INTVAL (operands[2]) < 256) 3432 return "bound.b %2,%0"; 3433 3434 if (INTVAL (operands[2]) < 65536) 3435 return "bound.w %2,%0"; 3436 } 3437 } 3438 3439 return "bound.d %2,%0"; 3440} 3441 [(set_attr "slottable" "yes,no")]) 3442 3443;; Jump and branch insns. 3444 3445(define_insn "jump" 3446 [(set (pc) 3447 (label_ref (match_operand 0 "" "")))] 3448 "" 3449 "ba %l0%#" 3450 [(set_attr "slottable" "has_slot")]) 3451 3452;; Testcase gcc.c-torture/compile/991213-3.c fails if we allow a constant 3453;; here, since the insn is not recognized as an indirect jump by 3454;; jmp_uses_reg_or_mem used by computed_jump_p. Perhaps it is a kludge to 3455;; change from general_operand to nonimmediate_operand (at least the docs 3456;; should be changed), but then again the pattern is called indirect_jump. 3457(define_expand "indirect_jump" 3458 [(set (pc) (match_operand:SI 0 "nonimmediate_operand"))] 3459 "" 3460{ 3461 if (TARGET_V32 && MEM_P (operands[0])) 3462 operands[0] = force_reg (SImode, operands[0]); 3463}) 3464 3465(define_insn "*indirect_jump_non_v32" 3466 [(set (pc) (match_operand:SI 0 "nonimmediate_operand" "rm"))] 3467 "!TARGET_V32" 3468 "jump %0") 3469 3470(define_insn "*indirect_jump_v32" 3471 [(set (pc) (match_operand:SI 0 "register_operand" "r"))] 3472 "TARGET_V32" 3473 "jump %0%#" 3474 [(set_attr "slottable" "has_slot")]) 3475 3476;; Return insn. Used whenever the epilogue is very simple; if it is only 3477;; a single ret or jump [sp+]. No allocated stack space or saved 3478;; registers are allowed. 3479;; Note that for this pattern, although named, it is ok to check the 3480;; context of the insn in the test, not only compiler switches. 3481 3482(define_expand "return" 3483 [(return)] 3484 "cris_simple_epilogue ()" 3485 "cris_expand_return (cris_return_address_on_stack ()); DONE;") 3486 3487(define_insn "*return_expanded" 3488 [(return)] 3489 "" 3490{ 3491 return cris_return_address_on_stack_for_return () 3492 ? "jump [$sp+]" : "ret%#"; 3493} 3494 [(set (attr "slottable") 3495 (if_then_else 3496 (ne (symbol_ref 3497 "(cris_return_address_on_stack_for_return ())") 3498 (const_int 0)) 3499 (const_string "no") 3500 (const_string "has_return_slot")))]) 3501 3502(define_expand "prologue" 3503 [(const_int 0)] 3504 "TARGET_PROLOGUE_EPILOGUE" 3505 "cris_expand_prologue (); DONE;") 3506 3507;; Note that the (return) from the expander itself is always the last 3508;; insn in the epilogue. 3509(define_expand "epilogue" 3510 [(const_int 0)] 3511 "TARGET_PROLOGUE_EPILOGUE" 3512 "cris_expand_epilogue (); DONE;") 3513 3514;; Conditional branches. 3515 3516(define_expand "cbranch<mode>4" 3517 [(set (cc0) (compare 3518 (match_operand:BWD 1 "nonimmediate_operand") 3519 (match_operand:BWD 2 "general_operand"))) 3520 (set (pc) 3521 (if_then_else (match_operator 0 "ordered_comparison_operator" 3522 [(cc0) (const_int 0)]) 3523 (label_ref (match_operand 3 "" "")) 3524 (pc)))] 3525 "" 3526 "") 3527 3528(define_expand "cbranchdi4" 3529 [(set (cc0) 3530 (compare (match_operand:DI 1 "nonimmediate_operand" "") 3531 (match_operand:DI 2 "general_operand" ""))) 3532 (set (pc) 3533 (if_then_else (match_operator 0 "ordered_comparison_operator" 3534 [(cc0) (const_int 0)]) 3535 (label_ref (match_operand 3 "" "")) 3536 (pc)))] 3537 "" 3538{ 3539 if (TARGET_V32 && !REG_P (operands[1])) 3540 operands[1] = force_reg (DImode, operands[1]); 3541 if (TARGET_V32 && MEM_P (operands[2])) 3542 operands[2] = force_reg (DImode, operands[2]); 3543}) 3544 3545 3546;; We suffer from the same overflow-bit-gets-in-the-way problem as 3547;; e.g. m68k, so we have to check if overflow bit is set on all "signed" 3548;; conditions. 3549 3550(define_insn "b<ncond:code>" 3551 [(set (pc) 3552 (if_then_else (ncond (cc0) 3553 (const_int 0)) 3554 (label_ref (match_operand 0 "" "")) 3555 (pc)))] 3556 "" 3557 "b<CC> %l0%#" 3558 [(set_attr "slottable" "has_slot")]) 3559 3560(define_insn "b<ocond:code>" 3561 [(set (pc) 3562 (if_then_else (ocond (cc0) 3563 (const_int 0)) 3564 (label_ref (match_operand 0 "" "")) 3565 (pc)))] 3566 "" 3567{ 3568 return 3569 (cc_prev_status.flags & CC_NO_OVERFLOW) 3570 ? 0 : "b<CC> %l0%#"; 3571} 3572 [(set_attr "slottable" "has_slot")]) 3573 3574(define_insn "b<rcond:code>" 3575 [(set (pc) 3576 (if_then_else (rcond (cc0) 3577 (const_int 0)) 3578 (label_ref (match_operand 0 "" "")) 3579 (pc)))] 3580 "" 3581{ 3582 return 3583 (cc_prev_status.flags & CC_NO_OVERFLOW) 3584 ? "b<oCC> %l0%#" : "b<CC> %l0%#"; 3585} 3586 [(set_attr "slottable" "has_slot")]) 3587 3588;; Reversed anonymous patterns to the ones above, as mandated. 3589 3590(define_insn "*b<ncond:code>_reversed" 3591 [(set (pc) 3592 (if_then_else (ncond (cc0) 3593 (const_int 0)) 3594 (pc) 3595 (label_ref (match_operand 0 "" ""))))] 3596 "" 3597 "b<rCC> %l0%#" 3598 [(set_attr "slottable" "has_slot")]) 3599 3600(define_insn "*b<ocond:code>_reversed" 3601 [(set (pc) 3602 (if_then_else (ocond (cc0) 3603 (const_int 0)) 3604 (pc) 3605 (label_ref (match_operand 0 "" ""))))] 3606 "" 3607{ 3608 return 3609 (cc_prev_status.flags & CC_NO_OVERFLOW) 3610 ? 0 : "b<rCC> %l0%#"; 3611} 3612 [(set_attr "slottable" "has_slot")]) 3613 3614(define_insn "*b<rcond:code>_reversed" 3615 [(set (pc) 3616 (if_then_else (rcond (cc0) 3617 (const_int 0)) 3618 (pc) 3619 (label_ref (match_operand 0 "" ""))))] 3620 "" 3621{ 3622 return 3623 (cc_prev_status.flags & CC_NO_OVERFLOW) 3624 ? "b<roCC> %l0%#" : "b<rCC> %l0%#"; 3625} 3626 [(set_attr "slottable" "has_slot")]) 3627 3628;; Set on condition: sCC. 3629 3630(define_expand "cstoredi4" 3631 [(set (cc0) (compare 3632 (match_operand:DI 2 "nonimmediate_operand") 3633 (match_operand:DI 3 "general_operand"))) 3634 (set (match_operand:SI 0 "register_operand") 3635 (match_operator:SI 1 "ordered_comparison_operator" 3636 [(cc0) (const_int 0)]))] 3637 "" 3638{ 3639 if (TARGET_V32 && !REG_P (operands[2])) 3640 operands[2] = force_reg (DImode, operands[2]); 3641 if (TARGET_V32 && MEM_P (operands[3])) 3642 operands[3] = force_reg (DImode, operands[3]); 3643}) 3644 3645(define_expand "cstore<mode>4" 3646 [(set (cc0) (compare 3647 (match_operand:BWD 2 "nonimmediate_operand") 3648 (match_operand:BWD 3 "general_operand"))) 3649 (set (match_operand:SI 0 "register_operand") 3650 (match_operator:SI 1 "ordered_comparison_operator" 3651 [(cc0) (const_int 0)]))] 3652 "" 3653 "") 3654 3655;; Like bCC, we have to check the overflow bit for 3656;; signed conditions. 3657 3658(define_insn "s<ncond:code>" 3659 [(set (match_operand:SI 0 "register_operand" "=r") 3660 (ncond:SI (cc0) (const_int 0)))] 3661 "" 3662 "s<CC> %0" 3663 [(set_attr "slottable" "yes") 3664 (set_attr "cc" "none")]) 3665 3666(define_insn "s<rcond:code>" 3667 [(set (match_operand:SI 0 "register_operand" "=r") 3668 (rcond:SI (cc0) (const_int 0)))] 3669 "" 3670{ 3671 return 3672 (cc_prev_status.flags & CC_NO_OVERFLOW) 3673 ? "s<oCC> %0" : "s<CC> %0"; 3674} 3675 [(set_attr "slottable" "yes") 3676 (set_attr "cc" "none")]) 3677 3678(define_insn "s<ocond:code>" 3679 [(set (match_operand:SI 0 "register_operand" "=r") 3680 (ocond:SI (cc0) (const_int 0)))] 3681 "" 3682{ 3683 return 3684 (cc_prev_status.flags & CC_NO_OVERFLOW) 3685 ? 0 : "s<CC> %0"; 3686} 3687 [(set_attr "slottable" "yes") 3688 (set_attr "cc" "none")]) 3689 3690;; Call insns. 3691 3692;; We need to make these patterns "expand", since the real operand is 3693;; hidden in a (mem:QI ) inside operand[0] (call_value: operand[1]), 3694;; and cannot be checked if it were a "normal" pattern. 3695;; Note that "call" and "call_value" are *always* called with a 3696;; mem-operand for operand 0 and 1 respective. What happens for combined 3697;; instructions is a different issue. 3698 3699(define_expand "call" 3700 [(parallel [(call (match_operand:QI 0 "cris_mem_call_operand" "") 3701 (match_operand 1 "general_operand" "")) 3702 (clobber (reg:SI CRIS_SRP_REGNUM))])] 3703 "" 3704{ 3705 gcc_assert (MEM_P (operands[0])); 3706 if (flag_pic) 3707 cris_expand_pic_call_address (&operands[0]); 3708}) 3709 3710;; Accept *anything* as operand 1. Accept operands for operand 0 in 3711;; order of preference. 3712 3713(define_insn "*expanded_call_non_v32" 3714 [(call (mem:QI (match_operand:SI 0 "general_operand" "r,Q>,g")) 3715 (match_operand 1 "" "")) 3716 (clobber (reg:SI CRIS_SRP_REGNUM))] 3717 "!TARGET_V32" 3718 "jsr %0") 3719 3720(define_insn "*expanded_call_v32" 3721 [(call 3722 (mem:QI 3723 (match_operand:SI 0 "cris_nonmemory_operand_or_callable_symbol" "n,r,U,i")) 3724 (match_operand 1 "" "")) 3725 (clobber (reg:SI CRIS_SRP_REGNUM))] 3726 "TARGET_V32" 3727 "@ 3728 jsr %0%# 3729 jsr %0%# 3730 bsr %0%# 3731 bsr %0%#" 3732 [(set_attr "slottable" "has_call_slot")]) 3733 3734;; Parallel when calculating and reusing address of indirect pointer 3735;; with simple offset. (Makes most sense with PIC.) It looks a bit 3736;; wrong not to have the clobber last, but that's the way combine 3737;; generates it (except it doesn' look into the *inner* mem, so this 3738;; just matches a peephole2). FIXME: investigate that. 3739(define_insn "*expanded_call_side" 3740 [(call (mem:QI 3741 (mem:SI 3742 (plus:SI (match_operand:SI 0 "cris_bdap_operand" "%r, r,r") 3743 (match_operand:SI 1 "cris_bdap_operand" "r>Rn,r,>Rn")))) 3744 (match_operand 2 "" "")) 3745 (clobber (reg:SI CRIS_SRP_REGNUM)) 3746 (set (match_operand:SI 3 "register_operand" "=*0,r,r") 3747 (plus:SI (match_dup 0) 3748 (match_dup 1)))] 3749 "!TARGET_AVOID_GOTPLT && !TARGET_V32" 3750 "jsr [%3=%0%S1]") 3751 3752(define_expand "call_value" 3753 [(parallel [(set (match_operand 0 "" "") 3754 (call (match_operand:QI 1 "cris_mem_call_operand" "") 3755 (match_operand 2 "" ""))) 3756 (clobber (reg:SI CRIS_SRP_REGNUM))])] 3757 "" 3758{ 3759 gcc_assert (MEM_P (operands[1])); 3760 if (flag_pic) 3761 cris_expand_pic_call_address (&operands[1]); 3762}) 3763 3764;; Accept *anything* as operand 2. The validity other than "general" of 3765;; operand 0 will be checked elsewhere. Accept operands for operand 1 in 3766;; order of preference (Q includes r, but r is shorter, faster). 3767;; We also accept a PLT symbol. We output it as [rPIC+sym:GOTPLT] rather 3768;; than requiring getting rPIC + sym:PLT into a register. 3769 3770(define_insn "*expanded_call_value_non_v32" 3771 [(set (match_operand 0 "nonimmediate_operand" "=g,g,g") 3772 (call (mem:QI (match_operand:SI 1 "general_operand" "r,Q>,g")) 3773 (match_operand 2 "" ""))) 3774 (clobber (reg:SI CRIS_SRP_REGNUM))] 3775 "!TARGET_V32" 3776 "Jsr %1" 3777 [(set_attr "cc" "clobber")]) 3778 3779;; See similar call special-case. 3780(define_insn "*expanded_call_value_side" 3781 [(set (match_operand 0 "nonimmediate_operand" "=g,g,g") 3782 (call 3783 (mem:QI 3784 (mem:SI 3785 (plus:SI (match_operand:SI 1 "cris_bdap_operand" "%r, r,r") 3786 (match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn")))) 3787 (match_operand 3 "" ""))) 3788 (clobber (reg:SI CRIS_SRP_REGNUM)) 3789 (set (match_operand:SI 4 "register_operand" "=*1,r,r") 3790 (plus:SI (match_dup 1) 3791 (match_dup 2)))] 3792 "!TARGET_AVOID_GOTPLT && !TARGET_V32" 3793 "Jsr [%4=%1%S2]" 3794 [(set_attr "cc" "clobber")]) 3795 3796(define_insn "*expanded_call_value_v32" 3797 [(set 3798 (match_operand 0 "nonimmediate_operand" "=g,g,g,g") 3799 (call 3800 (mem:QI 3801 (match_operand:SI 1 "cris_nonmemory_operand_or_callable_symbol" "n,r,U,i")) 3802 (match_operand 2 "" ""))) 3803 (clobber (reg:SI 16))] 3804 "TARGET_V32" 3805 "@ 3806 Jsr %1%# 3807 Jsr %1%# 3808 Bsr %1%# 3809 Bsr %1%#" 3810 [(set_attr "cc" "clobber") 3811 (set_attr "slottable" "has_call_slot")]) 3812 3813;; Used in debugging. No use for the direct pattern; unfilled 3814;; delayed-branches are taken care of by other means. 3815 3816(define_insn "nop" 3817 [(const_int 0)] 3818 "" 3819 "nop" 3820 [(set_attr "cc" "none")]) 3821 3822;; We need to stop accesses to the stack after the memory is 3823;; deallocated. Unfortunately, reorg doesn't look at naked clobbers, 3824;; e.g. (insn ... (clobber (mem:BLK (stack_pointer_rtx)))) and we don't 3825;; want to use a naked (unspec_volatile) as that would stop any 3826;; scheduling in the epilogue. Hence we model it as a "real" insn that 3827;; sets the memory in an unspecified manner. FIXME: Unfortunately it 3828;; still has the effect of an unspec_volatile. 3829(define_insn "cris_frame_deallocated_barrier" 3830 [(set (mem:BLK (reg:SI CRIS_SP_REGNUM)) 3831 (unspec:BLK [(const_int 0)] CRIS_UNSPEC_FRAME_DEALLOC))] 3832 "" 3833 "" 3834 [(set_attr "length" "0")]) 3835 3836;; We expand on casesi so we can use "bound" and "add offset fetched from 3837;; a table to pc" (adds.w [pc+%0.w],pc). 3838 3839;; Note: if you change the "parallel" (or add anything after it) in 3840;; this expansion, you must change the macro ASM_OUTPUT_CASE_END 3841;; accordingly, to add the default case at the end of the jump-table. 3842 3843(define_expand "cris_casesi_non_v32" 3844 [(set (match_dup 5) (match_operand:SI 0 "general_operand" "")) 3845 (set (match_dup 6) 3846 (minus:SI (match_dup 5) 3847 (match_operand:SI 1 "const_int_operand" "n"))) 3848 (set (match_dup 7) 3849 (umin:SI (match_dup 6) 3850 (match_operand:SI 2 "const_int_operand" "n"))) 3851 (parallel 3852 [(set (pc) 3853 (if_then_else 3854 (ltu (match_dup 7) (match_dup 2)) 3855 (plus:SI (sign_extend:SI 3856 (mem:HI 3857 (plus:SI (mult:SI (match_dup 7) (const_int 2)) 3858 (pc)))) 3859 (pc)) 3860 (label_ref (match_operand 4 "" "")))) 3861 (use (label_ref (match_operand 3 "" "")))])] 3862 "" 3863{ 3864 operands[2] = plus_constant (operands[2], 1); 3865 operands[5] = gen_reg_rtx (SImode); 3866 operands[6] = gen_reg_rtx (SImode); 3867 operands[7] = gen_reg_rtx (SImode); 3868}) 3869 3870;; FIXME: Check effect of not JUMP_TABLES_IN_TEXT_SECTION. 3871(define_expand "cris_casesi_v32" 3872 [(set (match_dup 5) (match_operand:SI 0 "general_operand")) 3873 (set (match_dup 6) 3874 (minus:SI (match_dup 5) 3875 (match_operand:SI 1 "const_int_operand"))) 3876 (set (match_dup 7) 3877 (umin:SI (match_dup 6) 3878 (match_operand:SI 2 "const_int_operand"))) 3879 (set (match_dup 8) (match_dup 11)) 3880 (set (match_dup 9) 3881 (plus:SI (mult:SI (match_dup 7) (const_int 2)) 3882 (match_dup 8))) 3883 (set (match_dup 10) 3884 (plus:SI (sign_extend:SI (mem:HI (match_dup 9))) 3885 (match_dup 9))) 3886 (parallel 3887 [(set (pc) 3888 (if_then_else 3889 (ltu (unspec [(const_int 0)] CRIS_UNSPEC_CASESI) (match_dup 2)) 3890 (match_dup 10) 3891 (label_ref (match_operand 4 "" "")))) 3892 (use (label_ref (match_dup 3)))])] 3893 "TARGET_V32" 3894{ 3895 int i; 3896 rtx xlabel = gen_rtx_LABEL_REF (VOIDmode, operands[3]); 3897 for (i = 5; i <= 10; i++) 3898 operands[i] = gen_reg_rtx (SImode); 3899 operands[2] = plus_constant (operands[2], 1); 3900 3901 /* Don't forget to decorate labels too, for PIC. */ 3902 operands[11] = flag_pic 3903 ? gen_rtx_CONST (Pmode, 3904 gen_rtx_UNSPEC (Pmode, gen_rtvec (1, xlabel), 3905 CRIS_UNSPEC_PCREL)) 3906 : xlabel; 3907}) 3908 3909(define_expand "casesi" 3910 [(match_operand:SI 0 "general_operand") 3911 (match_operand:SI 1 "const_int_operand") 3912 (match_operand:SI 2 "const_int_operand") 3913 (match_operand 3 "" "") 3914 (match_operand 4 "" "")] 3915 "" 3916{ 3917 if (TARGET_V32) 3918 emit_insn (gen_cris_casesi_v32 (operands[0], operands[1], operands[2], 3919 operands[3], operands[4])); 3920 else 3921 emit_insn (gen_cris_casesi_non_v32 (operands[0], operands[1], operands[2], 3922 operands[3], operands[4])); 3923 DONE; 3924}) 3925 3926;; Split-patterns. Some of them have modes unspecified. This 3927;; should always be ok; if for no other reason sparc.md has it as 3928;; well. 3929;; 3930;; When register_operand is specified for an operand, we can get a 3931;; subreg as well (Axis-990331), so don't just assume that REG_P is true 3932;; for a register_operand and that REGNO can be used as is. It is best to 3933;; guard with REG_P, unless it is worth it to adjust for the subreg case. 3934 3935;; op [rx + 0],ry,rz 3936;; The index to rx is optimized into zero, and gone. 3937 3938;; First, recognize bound [rx],ry,rz; where [rx] is zero-extended, 3939;; and add/sub [rx],ry,rz, with zero or sign-extend on [rx]. 3940;; Split this into: 3941;; move ry,rz 3942;; op [rx],rz 3943;; Lose if rz=ry or rx=rz. 3944;; Call this op-extend-split. 3945;; Do not match for V32; the addo and addi shouldn't be split 3946;; up. 3947 3948(define_split 3949 [(set (match_operand 0 "register_operand" "") 3950 (match_operator 3951 4 "cris_operand_extend_operator" 3952 [(match_operand 1 "register_operand" "") 3953 (match_operator 3954 3 "cris_extend_operator" 3955 [(match_operand 2 "memory_operand" "")])]))] 3956 "!TARGET_V32 3957 && REG_P (operands[0]) 3958 && REG_P (operands[1]) 3959 && REGNO (operands[1]) != REGNO (operands[0]) 3960 && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD 3961 && REG_P (XEXP (operands[2], 0)) 3962 && REGNO (XEXP (operands[2], 0)) != REGNO (operands[0])" 3963 [(set (match_dup 0) 3964 (match_dup 1)) 3965 (set (match_dup 0) 3966 (match_op_dup 3967 4 [(match_dup 0) 3968 (match_op_dup 3 [(match_dup 2)])]))] 3969 "") 3970 3971;; As op-extend-split, but recognize and split op [rz],ry,rz into 3972;; ext [rz],rz 3973;; op ry,rz 3974;; Do this for plus or bound only, being commutative operations, since we 3975;; have swapped the operands. 3976;; Call this op-extend-split-rx=rz 3977 3978(define_split 3979 [(set (match_operand 0 "register_operand" "") 3980 (match_operator 3981 4 "cris_plus_or_bound_operator" 3982 [(match_operand 1 "register_operand" "") 3983 (match_operator 3984 3 "cris_extend_operator" 3985 [(match_operand 2 "memory_operand" "")])]))] 3986 "!TARGET_V32 3987 && REG_P (operands[0]) 3988 && REG_P (operands[1]) 3989 && REGNO (operands[1]) != REGNO (operands[0]) 3990 && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD 3991 && REG_P (XEXP (operands[2], 0)) 3992 && REGNO (XEXP (operands[2], 0)) == REGNO (operands[0])" 3993 [(set (match_dup 0) 3994 (match_op_dup 3 [(match_dup 2)])) 3995 (set (match_dup 0) 3996 (match_op_dup 3997 4 [(match_dup 0) 3998 (match_dup 1)]))] 3999 "") 4000 4001;; As the op-extend-split, but swapped operands, and only for 4002;; plus or bound, being the commutative extend-operators. FIXME: Why is 4003;; this needed? Is it? 4004;; Call this op-extend-split-swapped 4005 4006(define_split 4007 [(set (match_operand 0 "register_operand" "") 4008 (match_operator 4009 4 "cris_plus_or_bound_operator" 4010 [(match_operator 4011 3 "cris_extend_operator" 4012 [(match_operand 2 "memory_operand" "")]) 4013 (match_operand 1 "register_operand" "")]))] 4014 "!TARGET_V32 4015 && REG_P (operands[0]) 4016 && REG_P (operands[1]) 4017 && REGNO (operands[1]) != REGNO (operands[0]) 4018 && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD 4019 && REG_P (XEXP (operands[2], 0)) 4020 && REGNO (XEXP (operands[2], 0)) != REGNO (operands[0])" 4021 [(set (match_dup 0) 4022 (match_dup 1)) 4023 (set (match_dup 0) 4024 (match_op_dup 4025 4 [(match_dup 0) 4026 (match_op_dup 3 [(match_dup 2)])]))] 4027 "") 4028 4029;; As op-extend-split-rx=rz, but swapped operands, only for plus or 4030;; bound. Call this op-extend-split-swapped-rx=rz. 4031 4032(define_split 4033 [(set (match_operand 0 "register_operand" "") 4034 (match_operator 4035 4 "cris_plus_or_bound_operator" 4036 [(match_operator 4037 3 "cris_extend_operator" 4038 [(match_operand 2 "memory_operand" "")]) 4039 (match_operand 1 "register_operand" "")]))] 4040 "!TARGET_V32 4041 && REG_P (operands[0]) 4042 && REG_P (operands[1]) 4043 && REGNO (operands[1]) != REGNO (operands[0]) 4044 && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD 4045 && REG_P (XEXP (operands[2], 0)) 4046 && REGNO (XEXP (operands[2], 0)) == REGNO (operands[0])" 4047 [(set (match_dup 0) 4048 (match_op_dup 3 [(match_dup 2)])) 4049 (set (match_dup 0) 4050 (match_op_dup 4051 4 [(match_dup 0) 4052 (match_dup 1)]))] 4053 "") 4054 4055;; As op-extend-split, but the mem operand is not extended. 4056;; 4057;; op [rx],ry,rz changed into 4058;; move ry,rz 4059;; op [rx],rz 4060;; lose if ry=rz or rx=rz 4061;; Call this op-extend. 4062 4063(define_split 4064 [(set (match_operand 0 "register_operand" "") 4065 (match_operator 4066 3 "cris_orthogonal_operator" 4067 [(match_operand 1 "register_operand" "") 4068 (match_operand 2 "memory_operand" "")]))] 4069 "!TARGET_V32 4070 && REG_P (operands[0]) 4071 && REG_P (operands[1]) 4072 && REGNO (operands[1]) != REGNO (operands[0]) 4073 && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD 4074 && REG_P (XEXP (operands[2], 0)) 4075 && REGNO (XEXP (operands[2], 0)) != REGNO (operands[0])" 4076 [(set (match_dup 0) 4077 (match_dup 1)) 4078 (set (match_dup 0) 4079 (match_op_dup 4080 3 [(match_dup 0) 4081 (match_dup 2)]))] 4082 "") 4083 4084;; As op-extend-split-rx=rz, non-extended. 4085;; Call this op-split-rx=rz 4086 4087(define_split 4088 [(set (match_operand 0 "register_operand" "") 4089 (match_operator 4090 3 "cris_commutative_orth_op" 4091 [(match_operand 2 "memory_operand" "") 4092 (match_operand 1 "register_operand" "")]))] 4093 "!TARGET_V32 4094 && REG_P (operands[0]) 4095 && REG_P (operands[1]) 4096 && REGNO (operands[1]) != REGNO (operands[0]) 4097 && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD 4098 && REG_P (XEXP (operands[2], 0)) 4099 && REGNO (XEXP (operands[2], 0)) != REGNO (operands[0])" 4100 [(set (match_dup 0) 4101 (match_dup 1)) 4102 (set (match_dup 0) 4103 (match_op_dup 4104 3 [(match_dup 0) 4105 (match_dup 2)]))] 4106 "") 4107 4108;; As op-extend-split-swapped, nonextended. 4109;; Call this op-split-swapped. 4110 4111(define_split 4112 [(set (match_operand 0 "register_operand" "") 4113 (match_operator 4114 3 "cris_commutative_orth_op" 4115 [(match_operand 1 "register_operand" "") 4116 (match_operand 2 "memory_operand" "")]))] 4117 "!TARGET_V32 4118 && REG_P (operands[0]) && REG_P (operands[1]) 4119 && REGNO (operands[1]) != REGNO (operands[0]) 4120 && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD 4121 && REG_P (XEXP (operands[2], 0)) 4122 && REGNO (XEXP (operands[2], 0)) == REGNO (operands[0])" 4123 [(set (match_dup 0) 4124 (match_dup 2)) 4125 (set (match_dup 0) 4126 (match_op_dup 4127 3 [(match_dup 0) 4128 (match_dup 1)]))] 4129 "") 4130 4131;; As op-extend-split-swapped-rx=rz, non-extended. 4132;; Call this op-split-swapped-rx=rz. 4133 4134(define_split 4135 [(set (match_operand 0 "register_operand" "") 4136 (match_operator 4137 3 "cris_orthogonal_operator" 4138 [(match_operand 2 "memory_operand" "") 4139 (match_operand 1 "register_operand" "")]))] 4140 "!TARGET_V32 4141 && REG_P (operands[0]) && REG_P (operands[1]) 4142 && REGNO (operands[1]) != REGNO (operands[0]) 4143 && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD 4144 && REG_P (XEXP (operands[2], 0)) 4145 && REGNO (XEXP (operands[2], 0)) == REGNO (operands[0])" 4146 [(set (match_dup 0) 4147 (match_dup 2)) 4148 (set (match_dup 0) 4149 (match_op_dup 4150 3 [(match_dup 0) 4151 (match_dup 1)]))] 4152 "") 4153 4154;; Splits for all cases in side-effect insns where (possibly after reload 4155;; and register allocation) rx and ry in [rx=ry+i] are equal. 4156 4157;; move.S1 [rx=rx+rz.S2],ry 4158 4159(define_split 4160 [(parallel 4161 [(set (match_operand 0 "register_operand" "") 4162 (match_operator 4163 6 "cris_mem_op" 4164 [(plus:SI 4165 (mult:SI (match_operand:SI 1 "register_operand" "") 4166 (match_operand:SI 2 "const_int_operand" "")) 4167 (match_operand:SI 3 "register_operand" ""))])) 4168 (set (match_operand:SI 4 "register_operand" "") 4169 (plus:SI (mult:SI (match_dup 1) 4170 (match_dup 2)) 4171 (match_dup 3)))])] 4172 "REG_P (operands[3]) && REG_P (operands[4]) 4173 && REGNO (operands[3]) == REGNO (operands[4])" 4174 [(set (match_dup 4) (plus:SI (mult:SI (match_dup 1) (match_dup 2)) 4175 (match_dup 3))) 4176 (set (match_dup 0) (match_dup 5))] 4177 "operands[5] = replace_equiv_address (operands[6], operands[3]);") 4178 4179;; move.S1 [rx=rx+i],ry 4180 4181(define_split 4182 [(parallel 4183 [(set (match_operand 0 "register_operand" "") 4184 (match_operator 4185 5 "cris_mem_op" 4186 [(plus:SI (match_operand:SI 1 "cris_bdap_operand" "") 4187 (match_operand:SI 2 "cris_bdap_operand" ""))])) 4188 (set (match_operand:SI 3 "register_operand" "") 4189 (plus:SI (match_dup 1) 4190 (match_dup 2)))])] 4191 "(rtx_equal_p (operands[3], operands[1]) 4192 || rtx_equal_p (operands[3], operands[2]))" 4193 [(set (match_dup 3) (plus:SI (match_dup 1) (match_dup 2))) 4194 (set (match_dup 0) (match_dup 4))] 4195{ 4196 operands[4] = replace_equiv_address (operands[5], operands[3]); 4197 cris_order_for_addsi3 (operands, 1); 4198}) 4199 4200;; move.S1 ry,[rx=rx+rz.S2] 4201 4202(define_split 4203 [(parallel 4204 [(set (match_operator 4205 6 "cris_mem_op" 4206 [(plus:SI 4207 (mult:SI (match_operand:SI 0 "register_operand" "") 4208 (match_operand:SI 1 "const_int_operand" "")) 4209 (match_operand:SI 2 "register_operand" ""))]) 4210 (match_operand 3 "register_operand" "")) 4211 (set (match_operand:SI 4 "register_operand" "") 4212 (plus:SI (mult:SI (match_dup 0) 4213 (match_dup 1)) 4214 (match_dup 2)))])] 4215 "REG_P (operands[2]) && REG_P (operands[4]) 4216 && REGNO (operands[4]) == REGNO (operands[2])" 4217 [(set (match_dup 4) (plus:SI (mult:SI (match_dup 0) (match_dup 1)) 4218 (match_dup 2))) 4219 (set (match_dup 5) (match_dup 3))] 4220 "operands[5] = replace_equiv_address (operands[6], operands[4]);") 4221 4222;; move.S1 ry,[rx=rx+i] 4223 4224(define_split 4225 [(parallel 4226 [(set (match_operator 4227 6 "cris_mem_op" 4228 [(plus:SI (match_operand:SI 0 "cris_bdap_operand" "") 4229 (match_operand:SI 1 "cris_bdap_operand" ""))]) 4230 (match_operand 2 "register_operand" "")) 4231 (set (match_operand:SI 3 "register_operand" "") 4232 (plus:SI (match_dup 0) 4233 (match_dup 1)))])] 4234 "(rtx_equal_p (operands[3], operands[0]) 4235 || rtx_equal_p (operands[3], operands[1]))" 4236 [(set (match_dup 3) (plus:SI (match_dup 0) (match_dup 1))) 4237 (set (match_dup 5) (match_dup 2))] 4238{ 4239 operands[5] = replace_equiv_address (operands[6], operands[3]); 4240 cris_order_for_addsi3 (operands, 0); 4241}) 4242 4243;; clear.[bwd] [rx=rx+rz.S2] 4244 4245(define_split 4246 [(parallel 4247 [(set (mem:BWD (plus:SI 4248 (mult:SI (match_operand:SI 0 "register_operand" "") 4249 (match_operand:SI 1 "const_int_operand" "")) 4250 (match_operand:SI 2 "register_operand" ""))) 4251 (const_int 0)) 4252 (set (match_operand:SI 3 "register_operand" "") 4253 (plus:SI (mult:SI (match_dup 0) 4254 (match_dup 1)) 4255 (match_dup 2)))])] 4256 "REG_P (operands[2]) && REG_P (operands[3]) 4257 && REGNO (operands[3]) == REGNO (operands[2])" 4258 [(set (match_dup 3) (plus:SI (mult:SI (match_dup 0) (match_dup 1)) 4259 (match_dup 2))) 4260 (set (mem:BWD (match_dup 3)) (const_int 0))] 4261 "") 4262 4263;; clear.[bwd] [rx=rx+i] 4264 4265(define_split 4266 [(parallel 4267 [(set (mem:BWD 4268 (plus:SI (match_operand:SI 0 "cris_bdap_operand" "") 4269 (match_operand:SI 1 "cris_bdap_operand" ""))) 4270 (const_int 0)) 4271 (set (match_operand:SI 2 "register_operand" "") 4272 (plus:SI (match_dup 0) 4273 (match_dup 1)))])] 4274 "(rtx_equal_p (operands[0], operands[2]) 4275 || rtx_equal_p (operands[2], operands[1]))" 4276 [(set (match_dup 2) (plus:SI (match_dup 0) (match_dup 1))) 4277 (set (mem:BWD (match_dup 2)) (const_int 0))] 4278 "cris_order_for_addsi3 (operands, 0);") 4279 4280;; mov(s|u).S1 [rx=rx+rz.S2],ry 4281 4282(define_split 4283 [(parallel 4284 [(set (match_operand 0 "register_operand" "") 4285 (match_operator 4286 5 "cris_extend_operator" 4287 [(mem (plus:SI 4288 (mult:SI (match_operand:SI 1 "register_operand" "") 4289 (match_operand:SI 2 "const_int_operand" "")) 4290 (match_operand:SI 3 "register_operand" "")))])) 4291 (set (match_operand:SI 4 "register_operand" "") 4292 (plus:SI (mult:SI (match_dup 1) 4293 (match_dup 2)) 4294 (match_dup 3)))])] 4295 "REG_P (operands[3]) 4296 && REG_P (operands[4]) 4297 && REGNO (operands[3]) == REGNO (operands[4])" 4298 [(set (match_dup 4) (plus:SI (mult:SI (match_dup 1) (match_dup 2)) 4299 (match_dup 3))) 4300 (set (match_dup 0) (match_op_dup 5 [(match_dup 6)]))] 4301 "operands[6] = replace_equiv_address (XEXP (operands[5], 0), operands[4]);") 4302 4303;; mov(s|u).S1 [rx=rx+i],ry 4304 4305(define_split 4306 [(parallel 4307 [(set (match_operand 0 "register_operand" "") 4308 (match_operator 4309 4 "cris_extend_operator" 4310 [(mem (plus:SI 4311 (match_operand:SI 1 "cris_bdap_operand" "") 4312 (match_operand:SI 2 "cris_bdap_operand" "")))])) 4313 (set (match_operand:SI 3 "register_operand" "") 4314 (plus:SI (match_dup 1) 4315 (match_dup 2)))])] 4316 "(rtx_equal_p (operands[1], operands[3]) 4317 || rtx_equal_p (operands[2], operands[3]))" 4318 [(set (match_dup 3) (plus:SI (match_dup 1) (match_dup 2))) 4319 (set (match_dup 0) (match_op_dup 4 [(match_dup 5)]))] 4320{ 4321 operands[5] = replace_equiv_address (XEXP (operands[4], 0), operands[3]); 4322 cris_order_for_addsi3 (operands, 1); 4323}) 4324 4325;; op.S1 [rx=rx+i],ry 4326 4327(define_split 4328 [(parallel 4329 [(set (match_operand 0 "register_operand" "") 4330 (match_operator 4331 5 "cris_orthogonal_operator" 4332 [(match_operand 1 "register_operand" "") 4333 (mem (plus:SI 4334 (match_operand:SI 2 "cris_bdap_operand" "") 4335 (match_operand:SI 3 "cris_bdap_operand" "")))])) 4336 (set (match_operand:SI 4 "register_operand" "") 4337 (plus:SI (match_dup 2) 4338 (match_dup 3)))])] 4339 "(rtx_equal_p (operands[4], operands[2]) 4340 || rtx_equal_p (operands[4], operands[3]))" 4341 [(set (match_dup 4) (plus:SI (match_dup 2) (match_dup 3))) 4342 (set (match_dup 0) (match_op_dup 5 [(match_dup 1) (match_dup 6)]))] 4343{ 4344 operands[6] = replace_equiv_address (XEXP (operands[5], 1), operands[4]); 4345 cris_order_for_addsi3 (operands, 2); 4346}) 4347 4348;; op.S1 [rx=rx+rz.S2],ry 4349 4350(define_split 4351 [(parallel 4352 [(set (match_operand 0 "register_operand" "") 4353 (match_operator 4354 6 "cris_orthogonal_operator" 4355 [(match_operand 1 "register_operand" "") 4356 (mem (plus:SI 4357 (mult:SI (match_operand:SI 2 "register_operand" "") 4358 (match_operand:SI 3 "const_int_operand" "")) 4359 (match_operand:SI 4 "register_operand" "")))])) 4360 (set (match_operand:SI 5 "register_operand" "") 4361 (plus:SI (mult:SI (match_dup 2) 4362 (match_dup 3)) 4363 (match_dup 4)))])] 4364 "REG_P (operands[4]) 4365 && REG_P (operands[5]) 4366 && REGNO (operands[5]) == REGNO (operands[4])" 4367 [(set (match_dup 5) (plus:SI (mult:SI (match_dup 2) (match_dup 3)) 4368 (match_dup 4))) 4369 (set (match_dup 0) (match_op_dup 6 [(match_dup 1) (match_dup 7)]))] 4370 "operands[7] = replace_equiv_address (XEXP (operands[6], 1), operands[5]);") 4371 4372;; op.S1 [rx=rx+rz.S2],ry (swapped) 4373 4374(define_split 4375 [(parallel 4376 [(set (match_operand 0 "register_operand" "") 4377 (match_operator 4378 6 "cris_commutative_orth_op" 4379 [(mem (plus:SI 4380 (mult:SI (match_operand:SI 2 "register_operand" "") 4381 (match_operand:SI 3 "const_int_operand" "")) 4382 (match_operand:SI 4 "register_operand" ""))) 4383 (match_operand 1 "register_operand" "")])) 4384 (set (match_operand:SI 5 "register_operand" "") 4385 (plus:SI (mult:SI (match_dup 2) 4386 (match_dup 3)) 4387 (match_dup 4)))])] 4388 "REG_P (operands[4]) 4389 && REG_P (operands[5]) 4390 && REGNO (operands[5]) == REGNO (operands[4])" 4391 [(set (match_dup 5) (plus:SI (mult:SI (match_dup 2) (match_dup 3)) 4392 (match_dup 4))) 4393 (set (match_dup 0) (match_op_dup 6 [(match_dup 7) (match_dup 1)]))] 4394 "operands[7] = replace_equiv_address (XEXP (operands[6], 0), operands[5]);") 4395 4396;; op.S1 [rx=rx+i],ry (swapped) 4397 4398(define_split 4399 [(parallel 4400 [(set (match_operand 0 "register_operand" "") 4401 (match_operator 4402 5 "cris_commutative_orth_op" 4403 [(mem 4404 (plus:SI (match_operand:SI 2 "cris_bdap_operand" "") 4405 (match_operand:SI 3 "cris_bdap_operand" ""))) 4406 (match_operand 1 "register_operand" "")])) 4407 (set (match_operand:SI 4 "register_operand" "") 4408 (plus:SI (match_dup 2) 4409 (match_dup 3)))])] 4410 "(rtx_equal_p (operands[4], operands[2]) 4411 || rtx_equal_p (operands[4], operands[3]))" 4412 [(set (match_dup 4) (plus:SI (match_dup 2) (match_dup 3))) 4413 (set (match_dup 0) (match_op_dup 5 [(match_dup 6) (match_dup 1)]))] 4414{ 4415 operands[6] = replace_equiv_address (XEXP (operands[5], 0), operands[4]); 4416 cris_order_for_addsi3 (operands, 2); 4417}) 4418 4419;; op(s|u).S1 [rx=rx+rz.S2],ry 4420 4421(define_split 4422 [(parallel 4423 [(set (match_operand 0 "register_operand" "") 4424 (match_operator 4425 6 "cris_operand_extend_operator" 4426 [(match_operand 1 "register_operand" "") 4427 (match_operator 4428 7 "cris_extend_operator" 4429 [(mem (plus:SI 4430 (mult:SI (match_operand:SI 2 "register_operand" "") 4431 (match_operand:SI 3 "const_int_operand" "")) 4432 (match_operand:SI 4 "register_operand" "")))])])) 4433 (set (match_operand:SI 5 "register_operand" "") 4434 (plus:SI (mult:SI (match_dup 2) 4435 (match_dup 3)) 4436 (match_dup 4)))])] 4437 "REG_P (operands[4]) 4438 && REG_P (operands[5]) 4439 && REGNO (operands[5]) == REGNO (operands[4])" 4440 [(set (match_dup 5) (plus:SI (mult:SI (match_dup 2) (match_dup 3)) 4441 (match_dup 4))) 4442 (set (match_dup 0) (match_op_dup 6 [(match_dup 1) (match_dup 8)]))] 4443 "operands[8] = gen_rtx_fmt_e (GET_CODE (operands[7]), GET_MODE (operands[7]), 4444 replace_equiv_address (XEXP (operands[7], 0), 4445 operands[5]));") 4446 4447;; op(s|u).S1 [rx=rx+i],ry 4448 4449(define_split 4450 [(parallel 4451 [(set (match_operand 0 "register_operand" "") 4452 (match_operator 4453 5 "cris_operand_extend_operator" 4454 [(match_operand 1 "register_operand" "") 4455 (match_operator 4456 6 "cris_extend_operator" 4457 [(mem 4458 (plus:SI (match_operand:SI 2 "cris_bdap_operand" "") 4459 (match_operand:SI 3 "cris_bdap_operand" "") 4460 ))])])) 4461 (set (match_operand:SI 4 "register_operand" "") 4462 (plus:SI (match_dup 2) 4463 (match_dup 3)))])] 4464 "(rtx_equal_p (operands[4], operands[2]) 4465 || rtx_equal_p (operands[4], operands[3]))" 4466 [(set (match_dup 4) (plus:SI (match_dup 2) (match_dup 3))) 4467 (set (match_dup 0) (match_op_dup 5 [(match_dup 1) (match_dup 7)]))] 4468{ 4469 operands[7] = gen_rtx_fmt_e (GET_CODE (operands[6]), GET_MODE (operands[6]), 4470 replace_equiv_address (XEXP (operands[6], 0), 4471 operands[4])); 4472 cris_order_for_addsi3 (operands, 2); 4473}) 4474 4475;; op(s|u).S1 [rx=rx+rz.S2],ry (swapped, plus or bound) 4476 4477(define_split 4478 [(parallel 4479 [(set (match_operand 0 "register_operand" "") 4480 (match_operator 4481 7 "cris_plus_or_bound_operator" 4482 [(match_operator 4483 6 "cris_extend_operator" 4484 [(mem (plus:SI 4485 (mult:SI (match_operand:SI 2 "register_operand" "") 4486 (match_operand:SI 3 "const_int_operand" "")) 4487 (match_operand:SI 4 "register_operand" "")))]) 4488 (match_operand 1 "register_operand" "")])) 4489 (set (match_operand:SI 5 "register_operand" "") 4490 (plus:SI (mult:SI (match_dup 2) 4491 (match_dup 3)) 4492 (match_dup 4)))])] 4493 "REG_P (operands[4]) && REG_P (operands[5]) 4494 && REGNO (operands[5]) == REGNO (operands[4])" 4495 [(set (match_dup 5) (plus:SI (mult:SI (match_dup 2) (match_dup 3)) 4496 (match_dup 4))) 4497 (set (match_dup 0) (match_op_dup 6 [(match_dup 8) (match_dup 1)]))] 4498 "operands[8] = gen_rtx_fmt_e (GET_CODE (operands[6]), GET_MODE (operands[6]), 4499 replace_equiv_address (XEXP (operands[6], 0), 4500 operands[5]));") 4501 4502;; op(s|u).S1 [rx=rx+i],ry (swapped, plus or bound) 4503 4504(define_split 4505 [(parallel 4506 [(set (match_operand 0 "register_operand" "") 4507 (match_operator 4508 6 "cris_plus_or_bound_operator" 4509 [(match_operator 4510 5 "cris_extend_operator" 4511 [(mem (plus:SI 4512 (match_operand:SI 2 "cris_bdap_operand" "") 4513 (match_operand:SI 3 "cris_bdap_operand" "")))]) 4514 (match_operand 1 "register_operand" "")])) 4515 (set (match_operand:SI 4 "register_operand" "") 4516 (plus:SI (match_dup 2) 4517 (match_dup 3)))])] 4518 "(rtx_equal_p (operands[4], operands[2]) 4519 || rtx_equal_p (operands[4], operands[3]))" 4520 [(set (match_dup 4) (plus:SI (match_dup 2) (match_dup 3))) 4521 (set (match_dup 0) (match_op_dup 6 [(match_dup 7) (match_dup 1)]))] 4522{ 4523 operands[7] = gen_rtx_fmt_e (GET_CODE (operands[5]), GET_MODE (operands[5]), 4524 replace_equiv_address (XEXP (operands[5], 0), 4525 operands[4])); 4526 cris_order_for_addsi3 (operands, 2); 4527}) 4528 4529;; Splits for addressing prefixes that have no side-effects, so we can 4530;; fill a delay slot. Never split if we lose something, though. 4531 4532;; If we have a 4533;; move [indirect_ref],rx 4534;; where indirect ref = {const, [r+], [r]}, it costs as much as 4535;; move indirect_ref,rx 4536;; move [rx],rx 4537;; Take care not to allow indirect_ref = register. 4538 4539;; We're not allowed to generate copies of registers with different mode 4540;; until after reload; copying pseudos upsets reload. CVS as of 4541;; 2001-08-24, unwind-dw2-fde.c, _Unwind_Find_FDE ICE in 4542;; cselib_invalidate_regno. 4543 4544(define_split ; indir_to_reg_split 4545 [(set (match_operand 0 "register_operand" "") 4546 (match_operand 1 "indirect_operand" ""))] 4547 "reload_completed 4548 && REG_P (operands[0]) 4549 && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD 4550 && (MEM_P (XEXP (operands[1], 0)) || CONSTANT_P (XEXP (operands[1], 0))) 4551 && REGNO (operands[0]) < CRIS_LAST_GENERAL_REGISTER" 4552 [(set (match_dup 2) (match_dup 4)) 4553 (set (match_dup 0) (match_dup 3))] 4554 "operands[2] = gen_rtx_REG (Pmode, REGNO (operands[0])); 4555 operands[3] = replace_equiv_address (operands[1], operands[2]); 4556 operands[4] = XEXP (operands[1], 0);") 4557 4558;; As the above, but MOVS and MOVU. 4559 4560(define_split 4561 [(set (match_operand 0 "register_operand" "") 4562 (match_operator 4563 4 "cris_extend_operator" 4564 [(match_operand 1 "indirect_operand" "")]))] 4565 "reload_completed 4566 && REG_P (operands[0]) 4567 && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD 4568 && (MEM_P (XEXP (operands[1], 0)) 4569 || CONSTANT_P (XEXP (operands[1], 0)))" 4570 [(set (match_dup 2) (match_dup 5)) 4571 (set (match_dup 0) (match_op_dup 4 [(match_dup 3)]))] 4572 "operands[2] = gen_rtx_REG (Pmode, REGNO (operands[0])); 4573 operands[3] = replace_equiv_address (XEXP (operands[4], 0), operands[2]); 4574 operands[5] = XEXP (operands[1], 0);") 4575 4576;; Various peephole optimizations. 4577;; 4578;; Watch out: when you exchange one set of instructions for another, the 4579;; condition codes setting must be the same, or you have to CC_INIT or 4580;; whatever is appropriate, in the pattern before you emit the 4581;; assembly text. This is best done here, not in cris_notice_update_cc, 4582;; to keep changes local to their cause. 4583;; 4584;; Do not add patterns that you do not know will be matched. 4585;; Please also add a self-contained testcase. 4586 4587;; We have trouble with and:s and shifts. Maybe something is broken in 4588;; gcc? Or it could just be that bit-field insn expansion is a bit 4589;; suboptimal when not having extzv insns. 4590;; Testcase for the following four peepholes: gcc.dg/cris-peep2-xsrand.c 4591 4592(define_peephole2 ; asrandb (peephole casesi+31) 4593 [(set (match_operand:SI 0 "register_operand" "") 4594 (ashiftrt:SI (match_dup 0) 4595 (match_operand:SI 1 "const_int_operand" ""))) 4596 (set (match_dup 0) 4597 (and:SI (match_dup 0) 4598 (match_operand 2 "const_int_operand" "")))] 4599 "INTVAL (operands[2]) > 31 4600 && INTVAL (operands[2]) < 255 4601 && INTVAL (operands[1]) > 23 4602 /* Check that the and-operation enables us to use logical-shift. */ 4603 && (INTVAL (operands[2]) 4604 & ((HOST_WIDE_INT) -1 << (32 - INTVAL (operands[1])))) == 0" 4605 [(set (match_dup 0) (lshiftrt:SI (match_dup 0) (match_dup 1))) 4606 (set (match_dup 3) (and:QI (match_dup 3) (match_dup 4)))] 4607 ;; FIXME: CC0 is valid except for the M bit. 4608{ 4609 operands[3] = gen_rtx_REG (QImode, REGNO (operands[0])); 4610 operands[4] = GEN_INT (trunc_int_for_mode (INTVAL (operands[2]), QImode)); 4611}) 4612 4613(define_peephole2 ; asrandw (peephole casesi+32) 4614 [(set (match_operand:SI 0 "register_operand" "") 4615 (ashiftrt:SI (match_dup 0) 4616 (match_operand:SI 1 "const_int_operand" ""))) 4617 (set (match_dup 0) 4618 (and:SI (match_dup 0) (match_operand 2 "const_int_operand" "")))] 4619 "INTVAL (operands[2]) > 31 4620 && INTVAL (operands[2]) < 65535 4621 && INTVAL (operands[2]) != 255 4622 && INTVAL (operands[1]) > 15 4623 /* Check that the and-operation enables us to use logical-shift. */ 4624 && (INTVAL (operands[2]) 4625 & ((HOST_WIDE_INT) -1 << (32 - INTVAL (operands[1])))) == 0" 4626 [(set (match_dup 0) (lshiftrt:SI (match_dup 0) (match_dup 1))) 4627 (set (match_dup 3) (and:HI (match_dup 3) (match_dup 4)))] 4628 ;; FIXME: CC0 is valid except for the M bit. 4629{ 4630 operands[3] = gen_rtx_REG (HImode, REGNO (operands[0])); 4631 operands[4] = GEN_INT (trunc_int_for_mode (INTVAL (operands[2]), HImode)); 4632}) 4633 4634(define_peephole2 ; lsrandb (peephole casesi+33) 4635 [(set (match_operand:SI 0 "register_operand" "") 4636 (lshiftrt:SI (match_dup 0) 4637 (match_operand:SI 1 "const_int_operand" ""))) 4638 (set (match_dup 0) 4639 (and:SI (match_dup 0) (match_operand 2 "const_int_operand" "")))] 4640 "INTVAL (operands[2]) > 31 4641 && INTVAL (operands[2]) < 255 4642 && INTVAL (operands[1]) > 23" 4643 [(set (match_dup 0) (lshiftrt:SI (match_dup 0) (match_dup 1))) 4644 (set (match_dup 3) (and:QI (match_dup 3) (match_dup 4)))] 4645 ;; FIXME: CC0 is valid except for the M bit. 4646{ 4647 operands[3] = gen_rtx_REG (QImode, REGNO (operands[0])); 4648 operands[4] = GEN_INT (trunc_int_for_mode (INTVAL (operands[2]), QImode)); 4649}) 4650 4651(define_peephole2 ; lsrandw (peephole casesi+34) 4652 [(set (match_operand:SI 0 "register_operand" "") 4653 (lshiftrt:SI (match_dup 0) 4654 (match_operand:SI 1 "const_int_operand" ""))) 4655 (set (match_dup 0) 4656 (and:SI (match_dup 0) (match_operand 2 "const_int_operand" "")))] 4657 "INTVAL (operands[2]) > 31 && INTVAL (operands[2]) < 65535 4658 && INTVAL (operands[2]) != 255 4659 && INTVAL (operands[1]) > 15" 4660 [(set (match_dup 0) (lshiftrt:SI (match_dup 0) (match_dup 1))) 4661 (set (match_dup 3) (and:HI (match_dup 3) (match_dup 4)))] 4662 ;; FIXME: CC0 is valid except for the M bit. 4663{ 4664 operands[3] = gen_rtx_REG (HImode, REGNO (operands[0])); 4665 operands[4] = GEN_INT (trunc_int_for_mode (INTVAL (operands[2]), HImode)); 4666}) 4667 4668 4669;; Change 4670;; add.d n,rx 4671;; move [rx],ry 4672;; into 4673;; move [rx=rx+n],ry 4674;; when -128 <= n <= 127. 4675;; This will reduce the size of the assembler code for n = [-128..127], 4676;; and speed up accordingly. Don't match if the previous insn is 4677;; (set rx rz) because that combination is matched by another peephole. 4678;; No stable test-case. 4679 4680(define_peephole2 ; moversideqi (peephole casesi+35) 4681 [(set (match_operand:SI 0 "register_operand" "") 4682 (plus:SI (match_operand:SI 1 "register_operand" "") 4683 (match_operand:SI 2 "const_int_operand" ""))) 4684 (set (match_operand 3 "register_operand" "") 4685 (match_operator 4 "cris_mem_op" [(match_dup 0)]))] 4686 "GET_MODE_SIZE (GET_MODE (operands[4])) <= UNITS_PER_WORD 4687 && REGNO (operands[3]) != REGNO (operands[0]) 4688 && (BASE_P (operands[1]) || BASE_P (operands[2])) 4689 && !CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J') 4690 && !CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N') 4691 && (INTVAL (operands[2]) >= -128 && INTVAL (operands[2]) < 128) 4692 && TARGET_SIDE_EFFECT_PREFIXES" 4693 [(parallel 4694 [(set (match_dup 3) (match_dup 5)) 4695 (set (match_dup 0) (plus:SI (match_dup 1) (match_dup 2)))])] 4696 ;; Checking the previous insn is a bit too awkward for the condition. 4697{ 4698 rtx prev = prev_nonnote_insn (curr_insn); 4699 if (prev != NULL_RTX) 4700 { 4701 rtx set = single_set (prev); 4702 if (set != NULL_RTX 4703 && REG_S_P (SET_DEST (set)) 4704 && REGNO (SET_DEST (set)) == REGNO (operands[0]) 4705 && REG_S_P (SET_SRC (set))) 4706 FAIL; 4707 } 4708 operands[5] 4709 = replace_equiv_address (operands[4], 4710 gen_rtx_PLUS (SImode, 4711 operands[1], operands[2])); 4712}) 4713 4714;; Vice versa: move ry,[rx=rx+n] 4715 4716(define_peephole2 ; movemsideqi (peephole casesi+36) 4717 [(set (match_operand:SI 0 "register_operand" "") 4718 (plus:SI (match_operand:SI 1 "register_operand" "") 4719 (match_operand:SI 2 "const_int_operand" ""))) 4720 (set (match_operator 3 "cris_mem_op" [(match_dup 0)]) 4721 (match_operand 4 "register_operand" ""))] 4722 "GET_MODE_SIZE (GET_MODE (operands[4])) <= UNITS_PER_WORD 4723 && REGNO (operands[4]) != REGNO (operands[0]) 4724 && (BASE_P (operands[1]) || BASE_P (operands[2])) 4725 && !CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J') 4726 && !CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N') 4727 && (INTVAL (operands[2]) >= -128 && INTVAL (operands[2]) < 128) 4728 && TARGET_SIDE_EFFECT_PREFIXES" 4729 [(parallel 4730 [(set (match_dup 5) (match_dup 4)) 4731 (set (match_dup 0) (plus:SI (match_dup 1) (match_dup 2)))])] 4732 "operands[5] 4733 = replace_equiv_address (operands[3], 4734 gen_rtx_PLUS (SImode, 4735 operands[1], operands[2]));") 4736 4737;; As above, change: 4738;; add.d n,rx 4739;; op.d [rx],ry 4740;; into: 4741;; op.d [rx=rx+n],ry 4742;; Saves when n = [-128..127]. 4743;; 4744;; Splitting and joining combinations for side-effect modes are slightly 4745;; out of hand. They probably will not save the time they take typing in, 4746;; not to mention the bugs that creep in. FIXME: Get rid of as many of 4747;; the splits and peepholes as possible. 4748;; No stable test-case. 4749 4750(define_peephole2 ; mover2side (peephole casesi+37) 4751 [(set (match_operand:SI 0 "register_operand" "") 4752 (plus:SI (match_operand:SI 1 "register_operand" "") 4753 (match_operand:SI 2 "const_int_operand" ""))) 4754 (set (match_operand 3 "register_operand" "") 4755 (match_operator 4 "cris_orthogonal_operator" 4756 [(match_dup 3) 4757 (match_operator 4758 5 "cris_mem_op" [(match_dup 0)])]))] 4759 ;; FIXME: What about DFmode? 4760 ;; Change to GET_MODE_SIZE (GET_MODE (operands[3])) <= UNITS_PER_WORD? 4761 "GET_MODE (operands[3]) != DImode 4762 && REGNO (operands[0]) != REGNO (operands[3]) 4763 && !CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J') 4764 && !CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N') 4765 && INTVAL (operands[2]) >= -128 4766 && INTVAL (operands[2]) <= 127 4767 && TARGET_SIDE_EFFECT_PREFIXES" 4768 [(parallel 4769 [(set (match_dup 3) (match_op_dup 4 [(match_dup 3) (match_dup 6)])) 4770 (set (match_dup 0) (plus:SI (match_dup 1) (match_dup 2)))])] 4771 "operands[6] 4772 = replace_equiv_address (operands[5], 4773 gen_rtx_PLUS (SImode, 4774 operands[1], operands[2]));") 4775 4776;; Sometimes, for some reason the pattern 4777;; move x,rx 4778;; add y,rx 4779;; move [rx],rz 4780;; will occur. Solve this, and likewise for to-memory. 4781;; No stable test-case. 4782 4783(define_peephole2 ; moverside (peephole casesi+38) 4784 [(set (match_operand:SI 0 "register_operand" "") 4785 (match_operand:SI 1 "cris_bdap_biap_operand" "")) 4786 (set (match_dup 0) 4787 (plus:SI (match_operand:SI 2 "cris_bdap_biap_operand" "") 4788 (match_operand:SI 3 "cris_bdap_biap_operand" ""))) 4789 (set (match_operand 4 "register_operand" "") 4790 (match_operator 5 "cris_mem_op" [(match_dup 0)]))] 4791 "(rtx_equal_p (operands[2], operands[0]) 4792 || rtx_equal_p (operands[3], operands[0])) 4793 && cris_side_effect_mode_ok (PLUS, operands, 0, 4794 (REG_S_P (operands[1]) 4795 ? 1 4796 : (rtx_equal_p (operands[2], operands[0]) 4797 ? 3 : 2)), 4798 (! REG_S_P (operands[1]) 4799 ? 1 4800 : (rtx_equal_p (operands[2], operands[0]) 4801 ? 3 : 2)), 4802 -1, 4)" 4803 [(parallel 4804 [(set (match_dup 4) (match_dup 6)) 4805 (set (match_dup 0) (plus:SI (match_dup 7) (match_dup 8)))])] 4806{ 4807 rtx otherop 4808 = rtx_equal_p (operands[2], operands[0]) ? operands[3] : operands[2]; 4809 4810 /* Make sure we have canonical RTX so we match the insn pattern - 4811 not a constant in the first operand. We also require the order 4812 (plus reg mem) to match the final pattern. */ 4813 if (CONSTANT_P (otherop) || MEM_P (otherop)) 4814 { 4815 operands[7] = operands[1]; 4816 operands[8] = otherop; 4817 } 4818 else 4819 { 4820 operands[7] = otherop; 4821 operands[8] = operands[1]; 4822 } 4823 operands[6] 4824 = replace_equiv_address (operands[5], 4825 gen_rtx_PLUS (SImode, 4826 operands[7], operands[8])); 4827}) 4828 4829;; As above but to memory. 4830;; FIXME: Split movemside and moverside into variants and prune 4831;; the ones that don't trig. 4832;; No stable test-case. 4833 4834(define_peephole2 ; movemside (peephole casesi+39) 4835 [(set (match_operand:SI 0 "register_operand" "") 4836 (match_operand:SI 1 "cris_bdap_biap_operand" "")) 4837 (set (match_dup 0) 4838 (plus:SI (match_operand:SI 2 "cris_bdap_biap_operand" "") 4839 (match_operand:SI 3 "cris_bdap_biap_operand" ""))) 4840 (set (match_operator 4 "cris_mem_op" [(match_dup 0)]) 4841 (match_operand 5 "register_operand" ""))] 4842 "(rtx_equal_p (operands[2], operands[0]) 4843 || rtx_equal_p (operands[3], operands[0])) 4844 && cris_side_effect_mode_ok (PLUS, operands, 0, 4845 (REG_S_P (operands[1]) 4846 ? 1 4847 : (rtx_equal_p (operands[2], operands[0]) 4848 ? 3 : 2)), 4849 (! REG_S_P (operands[1]) 4850 ? 1 4851 : (rtx_equal_p (operands[2], operands[0]) 4852 ? 3 : 2)), 4853 -1, 5)" 4854 [(parallel 4855 [(set (match_dup 6) (match_dup 5)) 4856 (set (match_dup 0) (plus:SI (match_dup 7) (match_dup 8)))])] 4857{ 4858 rtx otherop 4859 = rtx_equal_p (operands[2], operands[0]) ? operands[3] : operands[2]; 4860 4861 /* Make sure we have canonical RTX so we match the insn pattern - 4862 not a constant in the first operand. We also require the order 4863 (plus reg mem) to match the final pattern. */ 4864 if (CONSTANT_P (otherop) || MEM_P (otherop)) 4865 { 4866 operands[7] = operands[1]; 4867 operands[8] = otherop; 4868 } 4869 else 4870 { 4871 operands[7] = otherop; 4872 operands[8] = operands[1]; 4873 } 4874 operands[6] 4875 = replace_equiv_address (operands[4], 4876 gen_rtx_PLUS (SImode, 4877 operands[7], operands[8])); 4878}) 4879 4880;; Another spotted bad code: 4881;; move rx,ry 4882;; move [ry],ry 4883;; No stable test-case. 4884 4885(define_peephole2 ; movei (peephole casesi+42) 4886 [(set (match_operand:SI 0 "register_operand" "") 4887 (match_operand:SI 1 "register_operand" "")) 4888 (set (match_operand 2 "register_operand" "") 4889 (match_operator 3 "cris_mem_op" [(match_dup 0)]))] 4890 "REGNO (operands[0]) == REGNO (operands[2]) 4891 && (REGNO_REG_CLASS (REGNO (operands[0])) 4892 == REGNO_REG_CLASS (REGNO (operands[1]))) 4893 && GET_MODE_SIZE (GET_MODE (operands[2])) <= UNITS_PER_WORD" 4894 [(set (match_dup 2) (match_dup 4))] 4895 "operands[4] = replace_equiv_address (operands[3], operands[1]);") 4896 4897;; move.d [r10+16],r9 4898;; and.d r12,r9 4899;; change to 4900;; and.d [r10+16],r12,r9 4901;; With generalization of the operation, the size and the addressing mode. 4902;; This seems to be the result of a quirk in register allocation 4903;; missing the three-operand cases when having different predicates. 4904;; Maybe that it matters that it is a commutative operation. 4905;; This pattern helps that situation, but there's still the increased 4906;; register pressure. 4907;; Note that adding the noncommutative variant did not show any matches 4908;; in ipps and cc1, so it's not here. 4909;; No stable test-case. 4910 4911(define_peephole2 ; op3 (peephole casesi+44) 4912 [(set (match_operand 0 "register_operand" "") 4913 (match_operator 4914 6 "cris_mem_op" 4915 [(plus:SI 4916 (match_operand:SI 1 "cris_bdap_biap_operand" "") 4917 (match_operand:SI 2 "cris_bdap_biap_operand" ""))])) 4918 (set (match_dup 0) 4919 (match_operator 4920 5 "cris_commutative_orth_op" 4921 [(match_operand 3 "register_operand" "") 4922 (match_operand 4 "register_operand" "")]))] 4923 "(rtx_equal_p (operands[3], operands[0]) 4924 || rtx_equal_p (operands[4], operands[0])) 4925 && ! rtx_equal_p (operands[3], operands[4]) 4926 && (REG_S_P (operands[1]) || REG_S_P (operands[2])) 4927 && GET_MODE_SIZE (GET_MODE (operands[0])) <= UNITS_PER_WORD" 4928 [(set (match_dup 0) (match_op_dup 5 [(match_dup 7) (match_dup 6)]))] 4929 "operands[7] 4930 = rtx_equal_p (operands[3], operands[0]) ? operands[4] : operands[3];") 4931 4932;; I cannot tell GCC (2.1, 2.7.2) how to correctly reload an instruction 4933;; that looks like 4934;; and.b some_byte,const,reg_32 4935;; where reg_32 is the destination of the "three-address" code optimally. 4936;; It should be: 4937;; movu.b some_byte,reg_32 4938;; and.b const,reg_32 4939;; but it turns into: 4940;; move.b some_byte,reg_32 4941;; and.d const,reg_32 4942;; Fix it here. 4943;; Testcases: gcc.dg/cris-peep2-andu1.c gcc.dg/cris-peep2-andu2.c 4944 4945(define_peephole2 ; andu (casesi+45) 4946 [(set (match_operand:SI 0 "register_operand" "") 4947 (match_operand:SI 1 "nonimmediate_operand" "")) 4948 (set (match_operand:SI 2 "register_operand" "") 4949 (and:SI (match_dup 0) 4950 (match_operand:SI 3 "const_int_operand" "")))] 4951 ;; Since the size of the memory access could be made different here, 4952 ;; don't do this for a mem-volatile access. 4953 "REGNO (operands[2]) == REGNO (operands[0]) 4954 && INTVAL (operands[3]) <= 65535 && INTVAL (operands[3]) >= 0 4955 && !CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'I') 4956 && !side_effects_p (operands[1]) 4957 && (!REG_P (operands[1]) 4958 || REGNO (operands[1]) <= CRIS_LAST_GENERAL_REGISTER)" 4959 ;; FIXME: CC0 valid except for M (i.e. CC_NOT_NEGATIVE). 4960 [(set (match_dup 0) (match_dup 4)) 4961 (set (match_dup 5) (match_dup 6))] 4962{ 4963 enum machine_mode zmode = INTVAL (operands[3]) <= 255 ? QImode : HImode; 4964 enum machine_mode amode 4965 = CRIS_CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'O') ? SImode : zmode; 4966 rtx op1 4967 = (REG_S_P (operands[1]) 4968 ? gen_rtx_REG (zmode, REGNO (operands[1])) 4969 : adjust_address (operands[1], zmode, 0)); 4970 operands[4] 4971 = gen_rtx_ZERO_EXTEND (SImode, op1); 4972 operands[5] = gen_rtx_REG (amode, REGNO (operands[0])); 4973 operands[6] 4974 = gen_rtx_AND (amode, gen_rtx_REG (amode, REGNO (operands[0])), 4975 GEN_INT (trunc_int_for_mode (INTVAL (operands[3]), 4976 amode == SImode 4977 ? QImode : amode))); 4978}) 4979 4980;; Try and avoid GOTPLT reads escaping a call: transform them into 4981;; PLT. Curiously (but thankfully), peepholes for instructions 4982;; *without side-effects* that just feed a call (or call_value) are 4983;; not matched neither in a build or test-suite, so those patterns are 4984;; omitted. 4985 4986;; A "normal" move where we don't check the consumer. 4987 4988(define_peephole2 ; gotplt-to-plt 4989 [(set 4990 (match_operand:SI 0 "register_operand" "") 4991 (match_operator:SI 4992 1 "cris_mem_op" 4993 [(plus:SI 4994 (reg:SI CRIS_GOT_REGNUM) 4995 (const:SI 4996 (unspec:SI [(match_operand:SI 2 "cris_general_operand_or_symbol" "")] 4997 CRIS_UNSPEC_PLTGOTREAD)))]))] 4998 "flag_pic 4999 && cris_valid_pic_const (XEXP (XEXP (operands[1], 0), 1), true) 5000 && REGNO_REG_CLASS (REGNO (operands[0])) == REGNO_REG_CLASS (0)" 5001 [(set (match_dup 0) (const:SI (unspec:SI [(match_dup 2)] CRIS_UNSPEC_PLT_GOTREL))) 5002 (set (match_dup 0) (plus:SI (match_dup 0) (reg:SI CRIS_GOT_REGNUM)))] 5003 "") 5004 5005;; And one set with a side-effect getting the PLTGOT offset. 5006;; First call and call_value variants. 5007 5008(define_peephole2 ; gotplt-to-plt-side-call 5009 [(parallel 5010 [(set 5011 (match_operand:SI 0 "register_operand" "") 5012 (match_operator:SI 5013 1 "cris_mem_op" 5014 [(plus:SI 5015 (reg:SI CRIS_GOT_REGNUM) 5016 (const:SI 5017 (unspec:SI [(match_operand:SI 5018 2 "cris_general_operand_or_symbol" "")] 5019 CRIS_UNSPEC_PLTGOTREAD)))])) 5020 (set (match_operand:SI 3 "register_operand" "") 5021 (plus:SI (reg:SI CRIS_GOT_REGNUM) 5022 (const:SI 5023 (unspec:SI [(match_dup 2)] CRIS_UNSPEC_PLTGOTREAD))))]) 5024 (parallel [(call (mem:QI (match_dup 0)) 5025 (match_operand 4 "" "")) 5026 (clobber (reg:SI CRIS_SRP_REGNUM))])] 5027 "flag_pic 5028 && cris_valid_pic_const (XEXP (XEXP (operands[1], 0), 1), true) 5029 && peep2_reg_dead_p (2, operands[0])" 5030 [(parallel [(call (mem:QI (match_dup 1)) 5031 (match_dup 4)) 5032 (clobber (reg:SI CRIS_SRP_REGNUM)) 5033 (set (match_dup 3) 5034 (plus:SI (reg:SI CRIS_GOT_REGNUM) 5035 (const:SI 5036 (unspec:SI [(match_dup 2)] 5037 CRIS_UNSPEC_PLTGOTREAD))))])] 5038 "") 5039 5040(define_peephole2 ; gotplt-to-plt-side-call-value 5041 [(parallel 5042 [(set 5043 (match_operand:SI 0 "register_operand" "") 5044 (match_operator:SI 5045 1 "cris_mem_op" 5046 [(plus:SI 5047 (reg:SI CRIS_GOT_REGNUM) 5048 (const:SI 5049 (unspec:SI [(match_operand:SI 5050 2 "cris_general_operand_or_symbol" "")] 5051 CRIS_UNSPEC_PLTGOTREAD)))])) 5052 (set (match_operand:SI 3 "register_operand" "") 5053 (plus:SI (reg:SI CRIS_GOT_REGNUM) 5054 (const:SI 5055 (unspec:SI [(match_dup 2)] CRIS_UNSPEC_PLTGOTREAD))))]) 5056 (parallel [(set (match_operand 5 "" "") 5057 (call (mem:QI (match_dup 0)) 5058 (match_operand 4 "" ""))) 5059 (clobber (reg:SI CRIS_SRP_REGNUM))])] 5060 "flag_pic 5061 && cris_valid_pic_const (XEXP (XEXP (operands[1], 0), 1), true) 5062 && peep2_reg_dead_p (2, operands[0])" 5063 [(parallel [(set (match_dup 5) 5064 (call (mem:QI (match_dup 1)) 5065 (match_dup 4))) 5066 (clobber (reg:SI CRIS_SRP_REGNUM)) 5067 (set (match_dup 3) 5068 (plus:SI (reg:SI CRIS_GOT_REGNUM) 5069 (const:SI 5070 (unspec:SI [(match_dup 2)] 5071 CRIS_UNSPEC_PLTGOTREAD))))])] 5072 "") 5073 5074(define_peephole2 ; gotplt-to-plt-side 5075 [(parallel 5076 [(set 5077 (match_operand:SI 0 "register_operand" "") 5078 (match_operator:SI 5079 1 "cris_mem_op" 5080 [(plus:SI 5081 (reg:SI CRIS_GOT_REGNUM) 5082 (const:SI 5083 (unspec:SI [(match_operand:SI 5084 2 "cris_general_operand_or_symbol" "")] 5085 CRIS_UNSPEC_PLTGOTREAD)))])) 5086 (set (match_operand:SI 3 "register_operand" "") 5087 (plus:SI (reg:SI CRIS_GOT_REGNUM) 5088 (const:SI 5089 (unspec:SI [(match_dup 2)] CRIS_UNSPEC_PLTGOTREAD))))])] 5090 "flag_pic 5091 && cris_valid_pic_const (XEXP (XEXP (operands[1], 0), 1), true) 5092 && REGNO_REG_CLASS (REGNO (operands[0])) == REGNO_REG_CLASS (0)" 5093 [(set (match_dup 3) 5094 (const:SI (unspec:SI [(match_dup 2)] CRIS_UNSPEC_PLTGOTREAD))) 5095 (set (match_dup 3) (plus:SI (match_dup 3) (reg:SI CRIS_GOT_REGNUM))) 5096 (set (match_dup 0) 5097 (const:SI (unspec:SI [(match_dup 2)] CRIS_UNSPEC_PLT_GOTREL))) 5098 (set (match_dup 0) (plus:SI (match_dup 0) (reg:SI CRIS_GOT_REGNUM)))] 5099 "") 5100 5101;; Local variables: 5102;; mode:emacs-lisp 5103;; comment-start: ";; " 5104;; eval: (set-syntax-table (copy-sequence (syntax-table))) 5105;; eval: (modify-syntax-entry ?[ "(]") 5106;; eval: (modify-syntax-entry ?] ")[") 5107;; eval: (modify-syntax-entry ?{ "(}") 5108;; eval: (modify-syntax-entry ?} "){") 5109;; eval: (setq indent-tabs-mode t) 5110;; End: 5111