1;; Predicate definitions for Renesas / SuperH SH. 2;; Copyright (C) 2005-2019 Free Software Foundation, Inc. 3;; 4;; This file is part of GCC. 5;; 6;; GCC is free software; you can redistribute it and/or modify 7;; it under the terms of the GNU General Public License as published by 8;; the Free Software Foundation; either version 3, or (at your option) 9;; any later version. 10;; 11;; GCC is distributed in the hope that it will be useful, 12;; but WITHOUT ANY WARRANTY; without even the implied warranty of 13;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14;; GNU General Public License for more details. 15;; 16;; You should have received a copy of the GNU General Public License 17;; along with GCC; see the file COPYING3. If not see 18;; <http://www.gnu.org/licenses/>. 19 20 21;; Returns 1 if OP is a normal arithmetic register. 22(define_predicate "arith_reg_operand" 23 (match_code "subreg,reg,sign_extend") 24{ 25 if (register_operand (op, mode)) 26 { 27 int regno; 28 29 if (REG_P (op)) 30 regno = REGNO (op); 31 else if (GET_CODE (op) == SUBREG && REG_P (SUBREG_REG (op))) 32 regno = REGNO (SUBREG_REG (op)); 33 else 34 return 1; 35 36 return (regno != T_REG && regno != PR_REG 37 && regno != FPUL_REG && regno != FPSCR_REG 38 && regno != MACH_REG && regno != MACL_REG); 39 } 40 /* Allow a no-op sign extension - compare LOAD_EXTEND_OP. 41 We allow SImode here, as not using an FP register is just a matter of 42 proper register allocation. */ 43 44#if 0 /* Can't do this because of PROMOTE_MODE for unsigned vars. */ 45 if (GET_MODE (op) == SImode && GET_CODE (op) == SIGN_EXTEND 46 && GET_MODE (XEXP (op, 0)) == HImode 47 && REG_P (XEXP (op, 0)) 48 && REGNO (XEXP (op, 0)) <= LAST_GENERAL_REG) 49 return register_operand (XEXP (op, 0), VOIDmode); 50#endif 51 if (GET_MODE_CLASS (GET_MODE (op)) == MODE_VECTOR_INT 52 && GET_CODE (op) == SUBREG 53 && GET_MODE (SUBREG_REG (op)) == DImode 54 && GET_CODE (SUBREG_REG (op)) == SIGN_EXTEND 55 && GET_MODE (XEXP (SUBREG_REG (op), 0)) == SImode 56 && GET_CODE (XEXP (SUBREG_REG (op), 0)) != SUBREG) 57 return register_operand (XEXP (SUBREG_REG (op), 0), VOIDmode); 58 return 0; 59}) 60 61;; Like above, but for DImode destinations: forbid paradoxical DImode 62;; subregs, because this would lead to missing sign extensions when 63;; truncating from DImode to SImode. 64(define_predicate "arith_reg_dest" 65 (and (match_code "subreg,reg") 66 (match_operand 0 "arith_reg_operand"))) 67 68;; Returns true if OP is a valid source operand for an arithmetic insn. 69(define_predicate "arith_operand" 70 (and (match_code "subreg,reg,const_int,truncate") 71 (ior (match_operand 0 "arith_reg_operand") 72 (match_test "satisfies_constraint_I08 (op)")))) 73 74;; Likewise arith_operand but always permits const_int. 75(define_predicate "arith_or_int_operand" 76 (and (match_code "subreg,reg,const_int,const_vector") 77 (ior (match_operand 0 "arith_operand") 78 (match_operand 0 "const_int_operand")))) 79 80;; Returns true if OP is a valid source operand for a compare insn. 81(define_predicate "arith_reg_or_0_operand" 82 (and (match_code "subreg,reg,const_int,const_vector") 83 (ior (match_operand 0 "arith_reg_operand") 84 (match_test "satisfies_constraint_Z (op)")))) 85 86;; Returns true if OP is either a register or constant 0 or constant 1. 87(define_predicate "arith_reg_or_0_or_1_operand" 88 (and (match_code "subreg,reg,const_int,const_vector") 89 (ior (match_operand 0 "arith_reg_or_0_operand") 90 (match_test "satisfies_constraint_M (op)")))) 91 92;; Returns true if OP is a suitable constant for the minimum value of a 93;; clips.b or clips.w insn. 94(define_predicate "clips_min_const_int" 95 (and (match_code "const_int") 96 (ior (match_test "INTVAL (op) == -128") 97 (match_test "INTVAL (op) == -32768")))) 98 99;; Returns true if OP is a suitable constant for the maximum value of a 100;; clips.b or clips.w insn. 101(define_predicate "clips_max_const_int" 102 (and (match_code "const_int") 103 (ior (match_test "INTVAL (op) == 127") 104 (match_test "INTVAL (op) == 32767")))) 105 106;; Returns true if OP is a suitable constant for the maximum value of a 107;; clipu.b or clipu.w insn. 108(define_predicate "clipu_max_const_int" 109 (and (match_code "const_int") 110 (ior (match_test "INTVAL (op) == 255") 111 (match_test "INTVAL (op) == 65535")))) 112 113;; Returns true if OP is a floating point register that can be used in floating 114;; point arithmetic operations. 115(define_predicate "fp_arith_reg_operand" 116 (match_code "subreg,reg") 117{ 118 if (register_operand (op, mode)) 119 { 120 int regno; 121 122 if (REG_P (op)) 123 regno = REGNO (op); 124 else if (GET_CODE (op) == SUBREG && REG_P (SUBREG_REG (op))) 125 regno = REGNO (SUBREG_REG (op)); 126 else 127 return 1; 128 129 return (regno >= FIRST_PSEUDO_REGISTER 130 || FP_REGISTER_P (regno)); 131 } 132 return 0; 133}) 134 135;; Returns true if OP is the FPSCR. 136(define_predicate "fpscr_operand" 137 (and (match_code "reg") 138 (match_test "REGNO (op) == FPSCR_REG"))) 139 140;; Returns true if OP is a valid source operand for a FPSCR move insn. 141(define_predicate "fpscr_movsrc_operand" 142 (match_code "reg,subreg,mem") 143{ 144 if (arith_reg_operand (op, mode)) 145 return true; 146 147 return MEM_P (op) && GET_CODE (XEXP (op, 0)) == POST_INC; 148}) 149 150;; Returns true if OP is a valid destination operand for a FPSCR move insn. 151(define_predicate "fpscr_movdst_operand" 152 (match_code "reg,subreg,mem") 153{ 154 if (arith_reg_dest (op, mode)) 155 return true; 156 157 return MEM_P (op) && GET_CODE (XEXP (op, 0)) == PRE_DEC; 158}) 159 160;; Returns true if OP is an operand that is either the fpul hard reg or 161;; a pseudo. This prevents combine from propagating function arguments 162;; in hard regs into insns that need the operand in fpul. If it's a pseudo 163;; reload can fix it up. 164(define_predicate "fpul_operand" 165 (match_code "reg") 166{ 167 return REG_P (op) 168 && (REGNO (op) == FPUL_REG || REGNO (op) >= FIRST_PSEUDO_REGISTER) 169 && GET_MODE (op) == mode; 170}) 171 172;; Returns true if OP is a valid fpul input operand for the fsca insn. 173;; The value in fpul is a fixed-point value and its scaling is described 174;; in the fsca insn by a mult:SF. To allow pre-scaled fixed-point inputs 175;; in fpul we have to permit things like 176;; (reg:SI) 177;; (fix:SF (float:SF (reg:SI))) 178(define_predicate "fpul_fsca_operand" 179 (match_code "fix,reg") 180{ 181 if (fpul_operand (op, SImode)) 182 return true; 183 if (GET_CODE (op) == FIX && GET_MODE (op) == SImode 184 && GET_CODE (XEXP (op, 0)) == FLOAT && GET_MODE (XEXP (op, 0)) == SFmode) 185 return fpul_fsca_operand (XEXP (XEXP (op, 0), 0), 186 GET_MODE (XEXP (XEXP (op, 0), 0))); 187 return false; 188}) 189 190;; Returns true if OP is a valid constant scale factor for the fsca insn. 191(define_predicate "fsca_scale_factor" 192 (and (match_code "const_double") 193 (match_test "op == sh_fsca_int2sf ()"))) 194 195;; Returns true if OP is an operand that is zero extended during an operation. 196(define_predicate "general_extend_operand" 197 (match_code "subreg,reg,mem,truncate") 198{ 199 if (reload_completed && GET_CODE (op) == TRUNCATE) 200 return arith_operand (op, mode); 201 202 if (MEM_P (op) || (GET_CODE (op) == SUBREG && MEM_P (SUBREG_REG (op)))) 203 return general_movsrc_operand (op, mode); 204 205 return nonimmediate_operand (op, mode); 206}) 207 208;; Returns 1 if OP is a simple register address. 209(define_predicate "simple_mem_operand" 210 (and (match_code "mem") 211 (match_code "reg" "0") 212 (match_test "arith_reg_operand (XEXP (op, 0), SImode)"))) 213 214;; Returns 1 if OP is a valid displacement address. 215(define_predicate "displacement_mem_operand" 216 (and (match_code "mem") 217 (match_code "plus" "0") 218 (match_code "reg" "00") 219 (match_test "arith_reg_operand (XEXP (XEXP (op, 0), 0), SImode)") 220 (match_test "sh_legitimate_index_p (GET_MODE (op), 221 XEXP (XEXP (op, 0), 1), 222 TARGET_SH2A, true)"))) 223 224;; Returns true if OP is a displacement address that can fit into a 225;; 16 bit (non-SH2A) memory load / store insn. 226(define_predicate "short_displacement_mem_operand" 227 (and (match_code "mem") 228 (match_operand 0 "displacement_mem_operand") 229 (match_test "sh_disp_addr_displacement (op) 230 <= sh_max_mov_insn_displacement (GET_MODE (op), false)"))) 231 232;; Returns true if OP is a displacement address that does not fit into 233;; a 16 bit (non-SH2A) memory load / store insn. 234(define_predicate "long_displacement_mem_operand" 235 (and (match_operand 0 "displacement_mem_operand") 236 (not (match_operand 0 "short_displacement_mem_operand")))) 237 238;; Returns true if OP is a post-increment addressing mode memory reference. 239(define_predicate "post_inc_mem" 240 (and (match_code "mem") 241 (match_code "post_inc" "0") 242 (match_code "reg" "00"))) 243 244;; Returns true if OP is a pre-decrement addressing mode memory reference. 245(define_predicate "pre_dec_mem" 246 (and (match_code "mem") 247 (match_code "pre_dec" "0") 248 (match_code "reg" "00"))) 249 250;; Returns 1 if the operand can be used in an SH2A movu.{b|w} insn. 251(define_predicate "zero_extend_movu_operand" 252 (and (ior (match_operand 0 "displacement_mem_operand") 253 (match_operand 0 "simple_mem_operand")) 254 (ior (match_test "GET_MODE (op) == QImode") 255 (match_test "GET_MODE (op) == HImode")))) 256 257;; Returns 1 if OP can be source of a simple move operation. Same as 258;; general_operand, but a LABEL_REF is valid, PRE_DEC is invalid as 259;; are subregs of system registers. 260(define_predicate "general_movsrc_operand" 261 (match_code "subreg,reg,const_int,const_double,mem,symbol_ref,label_ref, 262 const,const_vector") 263{ 264 if (t_reg_operand (op, mode)) 265 return 0; 266 267 if (fpscr_operand (op, mode)) 268 return false; 269 270 /* Disallow PC relative QImode loads, since these is no insn to do that 271 and an imm8 load should be used instead. */ 272 if (IS_PC_RELATIVE_LOAD_ADDR_P (op) && GET_MODE (op) == QImode) 273 return false; 274 275 if (MEM_P (op)) 276 { 277 rtx inside = XEXP (op, 0); 278 279 /* Disallow mems with GBR address here. They have to go through 280 separate special patterns. */ 281 if ((REG_P (inside) && REGNO (inside) == GBR_REG) 282 || (GET_CODE (inside) == PLUS && REG_P (XEXP (inside, 0)) 283 && REGNO (XEXP (inside, 0)) == GBR_REG)) 284 return 0; 285 286 if (GET_CODE (inside) == CONST) 287 inside = XEXP (inside, 0); 288 289 if (GET_CODE (inside) == LABEL_REF) 290 return 1; 291 292 if (GET_CODE (inside) == PLUS 293 && GET_CODE (XEXP (inside, 0)) == LABEL_REF 294 && CONST_INT_P (XEXP (inside, 1))) 295 return 1; 296 297 /* Only post inc allowed. */ 298 if (GET_CODE (inside) == PRE_DEC) 299 return 0; 300 } 301 302 if (mode == GET_MODE (op) 303 && (MEM_P (op) || (GET_CODE (op) == SUBREG && MEM_P (SUBREG_REG (op))))) 304 { 305 rtx mem_rtx = MEM_P (op) ? op : SUBREG_REG (op); 306 rtx x = XEXP (mem_rtx, 0); 307 308 if (GET_CODE (x) == PLUS) 309 { 310 rtx y = XEXP (x, 0); 311 312 if (! REG_P (y) 313 && ! (GET_CODE (y) == SUBREG && REG_P (SUBREG_REG (y)))) 314 return false; 315 y = XEXP (x, 1); 316 if (! REG_P (y) 317 && ! (GET_CODE (y) == SUBREG && REG_P (SUBREG_REG (y))) 318 && ! CONST_INT_P (y)) 319 return false; 320 } 321 322 /* LRA will try to satisfy the constraints for the memory displacements 323 and thus we must not reject invalid displacements in the predicate, 324 or else LRA will bail out. 325 FIXME: maybe remove this check completely? */ 326 if (!lra_in_progress && (mode == QImode || mode == HImode) 327 && GET_CODE (x) == PLUS 328 && REG_P (XEXP (x, 0)) 329 && CONST_INT_P (XEXP (x, 1))) 330 return sh_legitimate_index_p (mode, XEXP (x, 1), TARGET_SH2A, false); 331 332 /* Allow reg+reg addressing here without validating the register 333 numbers. Usually one of the regs must be R0 or a pseudo reg. 334 In some cases it can happen that arguments from hard regs are 335 propagated directly into address expressions. In this cases reload 336 will have to fix it up later. However, allow this only for native 337 1, 2 or 4 byte addresses. */ 338 if (can_create_pseudo_p () && GET_CODE (x) == PLUS 339 && GET_MODE_SIZE (mode) <= 4 340 && REG_P (XEXP (x, 0)) && REG_P (XEXP (x, 1))) 341 return true; 342 343 /* 'general_operand' does not allow volatile mems during RTL expansion to 344 avoid matching arithmetic that operates on mems, it seems. 345 On SH this leads to redundant sign extensions for QImode or HImode 346 loads. Thus we mimic the behavior but allow volatile mems. */ 347 if (memory_address_addr_space_p (GET_MODE (mem_rtx), x, 348 MEM_ADDR_SPACE (mem_rtx))) 349 return true; 350 } 351 352 return general_operand (op, mode); 353}) 354 355;; Returns true if OP is a MEM that does not use displacement addressing. 356(define_predicate "movsrc_no_disp_mem_operand" 357 (and (match_code "mem") 358 (match_operand 0 "general_movsrc_operand") 359 (match_test "satisfies_constraint_Snd (op)"))) 360 361;; Returns 1 if OP can be a destination of a move. Same as 362;; general_operand, but no preinc allowed. 363(define_predicate "general_movdst_operand" 364 (match_code "subreg,reg,mem") 365{ 366 if (t_reg_operand (op, mode)) 367 return 0; 368 369 if (fpscr_operand (op, mode)) 370 return false; 371 372 if (MEM_P (op)) 373 { 374 rtx inside = XEXP (op, 0); 375 /* Disallow mems with GBR address here. They have to go through 376 separate special patterns. */ 377 if ((REG_P (inside) && REGNO (inside) == GBR_REG) 378 || (GET_CODE (inside) == PLUS && REG_P (XEXP (inside, 0)) 379 && REGNO (XEXP (inside, 0)) == GBR_REG)) 380 return 0; 381 } 382 383 /* Only pre dec allowed. */ 384 if (MEM_P (op) && GET_CODE (XEXP (op, 0)) == POST_INC) 385 return 0; 386 387 if (mode == GET_MODE (op) 388 && (MEM_P (op) || (GET_CODE (op) == SUBREG && MEM_P (SUBREG_REG (op))))) 389 { 390 rtx mem_rtx = MEM_P (op) ? op : SUBREG_REG (op); 391 rtx x = XEXP (mem_rtx, 0); 392 393 if (GET_CODE (x) == PLUS) 394 { 395 rtx y = XEXP (x, 0); 396 397 if (! REG_P (y) 398 && ! (GET_CODE (y) == SUBREG && REG_P (SUBREG_REG (y)))) 399 return false; 400 y = XEXP (x, 1); 401 if (! REG_P (y) 402 && ! (GET_CODE (y) == SUBREG && REG_P (SUBREG_REG (y))) 403 && ! CONST_INT_P (y)) 404 return false; 405 } 406 407 /* LRA will try to satisfy the constraints for the memory displacements 408 and thus we must not reject invalid displacements in the predicate, 409 or else LRA will bail out. 410 FIXME: maybe remove this check completely? */ 411 if (!lra_in_progress && (mode == QImode || mode == HImode) 412 && GET_CODE (x) == PLUS 413 && REG_P (XEXP (x, 0)) 414 && CONST_INT_P (XEXP (x, 1))) 415 return sh_legitimate_index_p (mode, XEXP (x, 1), TARGET_SH2A, false); 416 417 /* Allow reg+reg addressing here without validating the register 418 numbers. Usually one of the regs must be R0 or a pseudo reg. 419 In some cases it can happen that arguments from hard regs are 420 propagated directly into address expressions. In this cases reload 421 will have to fix it up later. However, allow this only for native 422 1, 2 or 4 byte addresses. */ 423 if (can_create_pseudo_p () && GET_CODE (x) == PLUS 424 && GET_MODE_SIZE (mode) <= 4 425 && REG_P (XEXP (x, 0)) && REG_P (XEXP (x, 1))) 426 return true; 427 428 /* 'general_operand' does not allow volatile mems during RTL expansion to 429 avoid matching arithmetic that operates on mems, it seems. 430 On SH this leads to redundant sign extensions for QImode or HImode 431 stores. Thus we mimic the behavior but allow volatile mems. */ 432 if (memory_address_addr_space_p (GET_MODE (mem_rtx), x, 433 MEM_ADDR_SPACE (mem_rtx))) 434 return true; 435 } 436 437 return general_operand (op, mode); 438}) 439 440;; Returns 1 if OP is a MEM that can be source of a simple move operation. 441(define_predicate "unaligned_load_operand" 442 (match_code "mem") 443{ 444 rtx inside; 445 446 if (!MEM_P (op) || GET_MODE (op) != mode) 447 return 0; 448 449 inside = XEXP (op, 0); 450 451 if (GET_CODE (inside) == POST_INC) 452 inside = XEXP (inside, 0); 453 454 if (REG_P (inside)) 455 return 1; 456 457 return 0; 458}) 459 460;; Returns 1 if OP is a MEM that can be used in "index_disp" combiner 461;; patterns. 462(define_predicate "mem_index_disp_operand" 463 (match_code "mem") 464{ 465 rtx plus0_rtx, plus1_rtx, mult_rtx; 466 467 plus0_rtx = XEXP (op, 0); 468 if (GET_CODE (plus0_rtx) != PLUS) 469 return 0; 470 471 plus1_rtx = XEXP (plus0_rtx, 0); 472 if (GET_CODE (plus1_rtx) != PLUS) 473 return 0; 474 if (! arith_reg_operand (XEXP (plus1_rtx, 1), GET_MODE (XEXP (plus1_rtx, 1)))) 475 return 0; 476 477 mult_rtx = XEXP (plus1_rtx, 0); 478 if (GET_CODE (mult_rtx) != MULT) 479 return 0; 480 if (! arith_reg_operand (XEXP (mult_rtx, 0), GET_MODE (XEXP (mult_rtx, 0))) 481 || ! CONST_INT_P (XEXP (mult_rtx, 1))) 482 return 0; 483 484 return exact_log2 (INTVAL (XEXP (mult_rtx, 1))) > 0 485 && sh_legitimate_index_p (mode, XEXP (plus0_rtx, 1), TARGET_SH2A, true); 486}) 487 488;; Returns true if OP is a valid source operand for a logical operation. 489(define_predicate "logical_operand" 490 (and (match_code "subreg,reg,const_int") 491 (ior (match_operand 0 "arith_reg_operand") 492 (match_test "satisfies_constraint_K08 (op)")))) 493 494;; Returns true if OP is a valid constant source operand for a logical 495;; operations tst/and/or/xor #imm,r0. 496(define_predicate "const_logical_operand" 497 (and (match_code "const_int") 498 (match_test "satisfies_constraint_K08 (op)"))) 499 500;; Like logical_operand but allows additional constant values which can be 501;; done with zero extensions. Used for the second operand of and insns. 502(define_predicate "logical_and_operand" 503 (and (match_code "subreg,reg,const_int") 504 (ior (match_operand 0 "logical_operand") 505 (match_test "satisfies_constraint_Jmb (op)") 506 (match_test "satisfies_constraint_Jmw (op)")))) 507 508;; Returns true if OP is a logical operator. 509(define_predicate "logical_operator" 510 (match_code "and,ior,xor")) 511 512;; Returns true if OP is a constant vector. 513(define_predicate "sh_const_vec" 514 (match_code "const_vector") 515{ 516 for (int i = XVECLEN (op, 0) - 1; i >= 0; i--) 517 if (!CONST_INT_P (XVECEXP (op, 0, i))) 518 return false; 519 return true; 520}) 521 522;; Determine if OP is a constant vector matching MODE with only one 523;; element that is not a sign extension. Two byte-sized elements 524;; count as one. 525(define_predicate "sh_1el_vec" 526 (match_code "const_vector") 527{ 528 /* Determine numbers of last and of least significant elements. */ 529 int last = XVECLEN (op, 0) - 1; 530 int least = TARGET_LITTLE_ENDIAN ? 0 : last; 531 if (!CONST_INT_P (XVECEXP (op, 0, least))) 532 return false; 533 int sign_ix = least; 534 if (GET_MODE_UNIT_SIZE (mode) == 1) 535 sign_ix = TARGET_LITTLE_ENDIAN ? 1 : last - 1; 536 if (!CONST_INT_P (XVECEXP (op, 0, sign_ix))) 537 return false; 538 int unit_size = GET_MODE_UNIT_SIZE (GET_MODE (op)); 539 rtx sign = INTVAL (XVECEXP (op, 0, sign_ix)) >> (unit_size * BITS_PER_UNIT - 1) 540 ? constm1_rtx : const0_rtx; 541 int i = XVECLEN (op, 0) - 1; 542 do 543 if (i != least && i != sign_ix && XVECEXP (op, 0, i) != sign) 544 return 0; 545 while (--i); 546 return true; 547}) 548 549;; Returns true if OP is a vector which is composed of one element that is 550;; repeated. 551(define_predicate "sh_rep_vec" 552 (match_code "const_vector,parallel") 553{ 554 int i = XVECLEN (op, 0) - 2; 555 rtx x = XVECEXP (op, 0, i + 1); 556 if (GET_MODE_UNIT_SIZE (mode) == 1) 557 { 558 rtx y = XVECEXP (op, 0, i); 559 for (i -= 2; i >= 0; i -= 2) 560 if (! rtx_equal_p (XVECEXP (op, 0, i + 1), x) 561 || ! rtx_equal_p (XVECEXP (op, 0, i), y)) 562 return false; 563 } 564 else 565 for (; i >= 0; i--) 566 if (XVECEXP (op, 0, i) != x) 567 return false; 568 return true; 569}) 570 571;; Returns true if OP is a valid shift count operand for shift operations. 572(define_predicate "shift_count_operand" 573 (match_code "const_int,const_double,const,symbol_ref,label_ref,subreg,reg, 574 zero_extend,sign_extend") 575{ 576 /* Allow T_REG as shift count for dynamic shifts, although it is not 577 really possible. It will then be copied to a general purpose reg. */ 578 return const_int_operand (op, mode) || arith_reg_operand (op, mode) 579 || (TARGET_DYNSHIFT && t_reg_operand (op, mode)); 580}) 581 582;; Predicates for matching operands that are constant shift 583;; amounts 1, 2, 8, 16. 584(define_predicate "p27_shift_count_operand" 585 (and (match_code "const_int") 586 (match_test "satisfies_constraint_P27 (op)"))) 587 588(define_predicate "not_p27_shift_count_operand" 589 (and (match_code "const_int") 590 (match_test "! satisfies_constraint_P27 (op)"))) 591 592;; For right shifts the constant 1 is a special case because the shlr insn 593;; clobbers the T_REG and is handled by the T_REG clobbering version of the 594;; insn, which is also used for non-P27 shift sequences. 595(define_predicate "p27_rshift_count_operand" 596 (and (match_code "const_int") 597 (match_test "satisfies_constraint_P27 (op)") 598 (match_test "! satisfies_constraint_M (op)"))) 599 600(define_predicate "not_p27_rshift_count_operand" 601 (and (match_code "const_int") 602 (ior (match_test "! satisfies_constraint_P27 (op)") 603 (match_test "satisfies_constraint_M (op)")))) 604 605;; Returns true if OP is a symbol reference. 606(define_predicate "symbol_ref_operand" 607 (match_code "symbol_ref")) 608 609(define_predicate "bitwise_memory_operand" 610 (match_code "mem") 611{ 612 if (MEM_P (op)) 613 { 614 if (REG_P (XEXP (op, 0))) 615 return 1; 616 617 if (GET_CODE (XEXP (op, 0)) == PLUS 618 && REG_P (XEXP (XEXP (op, 0), 0)) 619 && satisfies_constraint_K12 (XEXP (XEXP (op, 0), 1))) 620 return 1; 621 } 622 return 0; 623}) 624 625;; A predicate that matches any expression for which there is an 626;; insn pattern that sets the T bit. 627(define_predicate "treg_set_expr" 628 (match_test "sh_recog_treg_set_expr (op, mode)")) 629 630;; Same as treg_set_expr but disallow constants 0 and 1 which can be loaded 631;; into the T bit. 632(define_predicate "treg_set_expr_not_const01" 633 (and (match_test "op != const0_rtx") 634 (match_test "op != const1_rtx") 635 (match_operand 0 "treg_set_expr"))) 636 637;; A predicate describing the T bit register in any form. 638(define_predicate "t_reg_operand" 639 (match_code "reg,subreg,sign_extend,zero_extend,ne,eq") 640{ 641 switch (GET_CODE (op)) 642 { 643 case EQ: 644 return t_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0))) 645 && XEXP (op, 1) == const1_rtx; 646 647 case NE: 648 return t_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0))) 649 && XEXP (op, 1) == const0_rtx; 650 651 case REG: 652 return REGNO (op) == T_REG; 653 654 case SUBREG: 655 return REG_P (SUBREG_REG (op)) && REGNO (SUBREG_REG (op)) == T_REG; 656 657 case ZERO_EXTEND: 658 case SIGN_EXTEND: 659 if (REG_P (XEXP (op, 0)) && REGNO (XEXP (op, 0)) == T_REG) 660 return true; 661 return GET_CODE (XEXP (op, 0)) == SUBREG 662 && REG_P (SUBREG_REG (XEXP (op, 0))) 663 && REGNO (SUBREG_REG (XEXP (op, 0))) == T_REG; 664 665 default: 666 return 0; 667 } 668}) 669 670;; A predicate describing a negated T bit register. 671(define_predicate "negt_reg_operand" 672 (match_code "subreg,xor,ne,eq") 673{ 674 switch (GET_CODE (op)) 675 { 676 case EQ: 677 return t_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0))) 678 && XEXP (op, 1) == const0_rtx; 679 680 case NE: 681 return t_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0))) 682 && XEXP (op, 1) == const1_rtx; 683 684 case XOR: 685 return t_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0))) 686 && XEXP (op, 1) == const1_rtx; 687 688 case SUBREG: 689 return negt_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0))); 690 691 default: 692 return 0; 693 } 694}) 695 696;; Returns true if OP is an operand that can be used as the first operand in 697;; the cstoresi4 expander pattern. 698(define_predicate "cmpsi_operand" 699 (and (match_code "subreg,reg,const_int") 700 (ior (match_operand:SI 0 "t_reg_operand") 701 (match_operand 0 "arith_operand")))) 702 703;; A predicate that returns true if OP is a valid construct around the T bit 704;; that can be used as an operand for conditional branches. 705(define_predicate "cbranch_treg_value" 706 (and (match_code "eq,ne,reg,subreg,xor,sign_extend,zero_extend") 707 (match_test "sh_eval_treg_value (op) >= 0"))) 708 709;; Returns true if OP is arith_reg_operand or t_reg_operand. 710(define_predicate "arith_reg_or_t_reg_operand" 711 (ior (match_operand 0 "arith_reg_operand") 712 (match_operand 0 "t_reg_operand"))) 713 714(define_predicate "arith_reg_or_treg_set_expr" 715 (ior (match_operand 0 "arith_reg_operand") 716 (match_operand 0 "treg_set_expr"))) 717 718;; A predicate describing the negated value of the T bit register shifted 719;; left by 31. 720(define_predicate "negt_reg_shl31_operand" 721 (match_code "plus,minus,if_then_else") 722{ 723 /* (minus:SI (const_int -2147483648) ;; 0xffffffff80000000 724 (ashift:SI (match_operand:SI 1 "t_reg_operand") 725 (const_int 31))) 726 */ 727 if (GET_CODE (op) == MINUS && satisfies_constraint_Jhb (XEXP (op, 0)) 728 && GET_CODE (XEXP (op, 1)) == ASHIFT 729 && t_reg_operand (XEXP (XEXP (op, 1), 0), SImode) 730 && CONST_INT_P (XEXP (XEXP (op, 1), 1)) 731 && INTVAL (XEXP (XEXP (op, 1), 1)) == 31) 732 return true; 733 734 /* (plus:SI (ashift:SI (match_operand:SI 1 "t_reg_operand") 735 (const_int 31)) 736 (const_int -2147483648)) ;; 0xffffffff80000000 737 */ 738 if (GET_CODE (op) == PLUS && satisfies_constraint_Jhb (XEXP (op, 1)) 739 && GET_CODE (XEXP (op, 0)) == ASHIFT 740 && t_reg_operand (XEXP (XEXP (op, 0), 0), SImode) 741 && CONST_INT_P (XEXP (XEXP (op, 0), 1)) 742 && INTVAL (XEXP (XEXP (op, 0), 1)) == 31) 743 return true; 744 745 /* (plus:SI (mult:SI (match_operand:SI 1 "t_reg_operand") 746 (const_int -2147483648)) ;; 0xffffffff80000000 747 (const_int -2147483648)) 748 */ 749 if (GET_CODE (op) == PLUS && satisfies_constraint_Jhb (XEXP (op, 1)) 750 && GET_CODE (XEXP (op, 0)) == MULT 751 && t_reg_operand (XEXP (XEXP (op, 0), 0), SImode) 752 && satisfies_constraint_Jhb (XEXP (XEXP (op, 0), 1))) 753 return true; 754 755 /* (minus:SI (const_int -2147483648) ;; 0xffffffff80000000 756 (mult:SI (match_operand:SI 1 "t_reg_operand") 757 (const_int -2147483648))) 758 */ 759 if (GET_CODE (op) == MINUS 760 && satisfies_constraint_Jhb (XEXP (op, 0)) 761 && GET_CODE (XEXP (op, 1)) == MULT 762 && t_reg_operand (XEXP (XEXP (op, 1), 0), SImode) 763 && satisfies_constraint_Jhb (XEXP (XEXP (op, 1), 1))) 764 return true; 765 766 /* (if_then_else:SI (match_operand:SI 1 "t_reg_operand") 767 (const_int 0) 768 (const_int -2147483648)) ;; 0xffffffff80000000 769 */ 770 if (GET_CODE (op) == IF_THEN_ELSE && t_reg_operand (XEXP (op, 0), SImode) 771 && satisfies_constraint_Z (XEXP (op, 1)) 772 && satisfies_constraint_Jhb (XEXP (op, 2))) 773 return true; 774 775 return false; 776}) 777 778;; A predicate that determines whether a given constant is a valid 779;; displacement for a GBR load/store of the specified mode. 780(define_predicate "gbr_displacement" 781 (match_code "const_int") 782{ 783 const int mode_sz = GET_MODE_SIZE (mode); 784 const int move_sz = mode_sz > GET_MODE_SIZE (SImode) 785 ? GET_MODE_SIZE (SImode) 786 : mode_sz; 787 int max_disp = 255 * move_sz; 788 if (mode_sz > move_sz) 789 max_disp -= mode_sz - move_sz; 790 791 return INTVAL (op) >= 0 && INTVAL (op) <= max_disp; 792}) 793 794;; A predicate that determines whether OP is a valid GBR addressing mode 795;; memory reference. 796(define_predicate "gbr_address_mem" 797 (match_code "mem") 798{ 799 rtx addr = XEXP (op, 0); 800 801 if (REG_P (addr) && REGNO (addr) == GBR_REG) 802 return true; 803 if (GET_CODE (addr) == PLUS 804 && REG_P (XEXP (addr, 0)) && REGNO (XEXP (addr, 0)) == GBR_REG 805 && gbr_displacement (XEXP (addr, 1), mode)) 806 return true; 807 808 return false; 809}) 810