1;; Predicate definitions for POWER and PowerPC. 2;; Copyright (C) 2005-2022 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;; Return 1 for anything except PARALLEL. 21(define_predicate "any_operand" 22 (match_code "const_int,const_double,const_wide_int,const,symbol_ref,label_ref,subreg,reg,mem")) 23 24;; Return 1 for any PARALLEL. 25(define_predicate "any_parallel_operand" 26 (match_code "parallel")) 27 28;; Return 1 if op is COUNT register. 29(define_predicate "count_register_operand" 30 (and (match_code "reg") 31 (match_test "REGNO (op) == CTR_REGNO 32 || REGNO (op) > LAST_VIRTUAL_REGISTER"))) 33 34;; Return 1 if op is a SUBREG that is used to look at a SFmode value as 35;; and integer or vice versa. 36;; 37;; In the normal case where SFmode is in a floating point/vector register, it 38;; is stored as a DFmode and has a different format. If we don't transform the 39;; value, things that use logical operations on the values will get the wrong 40;; value. 41;; 42;; If we don't have 64-bit and direct move, this conversion will be done by 43;; store and load, instead of by fiddling with the bits within the register. 44(define_predicate "sf_subreg_operand" 45 (match_code "subreg") 46{ 47 rtx inner_reg = SUBREG_REG (op); 48 machine_mode inner_mode = GET_MODE (inner_reg); 49 50 if (TARGET_ALLOW_SF_SUBREG || !REG_P (inner_reg)) 51 return 0; 52 53 if ((mode == SFmode && GET_MODE_CLASS (inner_mode) == MODE_INT) 54 || (GET_MODE_CLASS (mode) == MODE_INT && inner_mode == SFmode)) 55 { 56 if (INT_REGNO_P (REGNO (inner_reg))) 57 return 0; 58 59 return 1; 60 } 61 return 0; 62}) 63 64;; Return 1 if op is an Altivec register. 65(define_predicate "altivec_register_operand" 66 (match_operand 0 "register_operand") 67{ 68 if (SUBREG_P (op)) 69 { 70 if (TARGET_NO_SF_SUBREG && sf_subreg_operand (op, mode)) 71 return 0; 72 73 op = SUBREG_REG (op); 74 } 75 76 if (!REG_P (op)) 77 return 0; 78 79 if (!HARD_REGISTER_P (op)) 80 return 1; 81 82 return ALTIVEC_REGNO_P (REGNO (op)); 83}) 84 85;; Return 1 if op is a VSX register. 86(define_predicate "vsx_register_operand" 87 (match_operand 0 "register_operand") 88{ 89 if (SUBREG_P (op)) 90 { 91 if (TARGET_NO_SF_SUBREG && sf_subreg_operand (op, mode)) 92 return 0; 93 94 op = SUBREG_REG (op); 95 } 96 97 if (!REG_P (op)) 98 return 0; 99 100 if (!HARD_REGISTER_P (op)) 101 return 1; 102 103 return VSX_REGNO_P (REGNO (op)); 104}) 105 106;; Like vsx_register_operand, but allow SF SUBREGS 107(define_predicate "vsx_reg_sfsubreg_ok" 108 (match_operand 0 "register_operand") 109{ 110 if (SUBREG_P (op)) 111 op = SUBREG_REG (op); 112 113 if (!REG_P (op)) 114 return 0; 115 116 if (!HARD_REGISTER_P (op)) 117 return 1; 118 119 return VSX_REGNO_P (REGNO (op)); 120}) 121 122;; Return 1 if op is a vector register that operates on floating point vectors 123;; (either altivec or VSX). 124(define_predicate "vfloat_operand" 125 (match_operand 0 "register_operand") 126{ 127 if (SUBREG_P (op)) 128 { 129 if (TARGET_NO_SF_SUBREG && sf_subreg_operand (op, mode)) 130 return 0; 131 132 op = SUBREG_REG (op); 133 } 134 135 if (!REG_P (op)) 136 return 0; 137 138 if (!HARD_REGISTER_P (op)) 139 return 1; 140 141 return VFLOAT_REGNO_P (REGNO (op)); 142}) 143 144;; Return 1 if op is a vector register that operates on integer vectors 145;; (only altivec, VSX doesn't support integer vectors) 146(define_predicate "vint_operand" 147 (match_operand 0 "register_operand") 148{ 149 if (SUBREG_P (op)) 150 { 151 if (TARGET_NO_SF_SUBREG && sf_subreg_operand (op, mode)) 152 return 0; 153 154 op = SUBREG_REG (op); 155 } 156 157 if (!REG_P (op)) 158 return 0; 159 160 if (!HARD_REGISTER_P (op)) 161 return 1; 162 163 return VINT_REGNO_P (REGNO (op)); 164}) 165 166;; Return 1 if op is a vector register to do logical operations on (and, or, 167;; xor, etc.) 168(define_predicate "vlogical_operand" 169 (match_operand 0 "register_operand") 170{ 171 if (SUBREG_P (op)) 172 { 173 if (TARGET_NO_SF_SUBREG && sf_subreg_operand (op, mode)) 174 return 0; 175 176 op = SUBREG_REG (op); 177 } 178 179 180 if (!REG_P (op)) 181 return 0; 182 183 if (!HARD_REGISTER_P (op)) 184 return 1; 185 186 return VLOGICAL_REGNO_P (REGNO (op)); 187}) 188 189;; Return 1 if op is the carry register. 190(define_predicate "ca_operand" 191 (match_operand 0 "register_operand") 192{ 193 if (SUBREG_P (op)) 194 op = SUBREG_REG (op); 195 196 if (!REG_P (op)) 197 return 0; 198 199 return CA_REGNO_P (REGNO (op)); 200}) 201 202;; Return 1 if operand is constant zero (scalars and vectors). 203(define_predicate "zero_constant" 204 (and (match_code "const_int,const_double,const_wide_int,const_vector") 205 (match_test "op == CONST0_RTX (mode)"))) 206 207;; Return 1 if operand is constant -1 (scalars and vectors). 208(define_predicate "all_ones_constant" 209 (and (match_code "const_int,const_double,const_wide_int,const_vector") 210 (match_test "op == CONSTM1_RTX (mode) && !FLOAT_MODE_P (mode)"))) 211 212;; Return 1 if op is a signed 5-bit constant integer. 213(define_predicate "s5bit_cint_operand" 214 (and (match_code "const_int") 215 (match_test "INTVAL (op) >= -16 && INTVAL (op) <= 15"))) 216 217;; Return 1 if op is an unsigned 1-bit constant integer. 218(define_predicate "u1bit_cint_operand" 219 (and (match_code "const_int") 220 (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 1"))) 221 222;; Return 1 if op is a unsigned 3-bit constant integer. 223(define_predicate "u3bit_cint_operand" 224 (and (match_code "const_int") 225 (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 7"))) 226 227;; Return 1 if op is a unsigned 5-bit constant integer. 228(define_predicate "u5bit_cint_operand" 229 (and (match_code "const_int") 230 (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 31"))) 231 232;; Return 1 if op is a unsigned 6-bit constant integer. 233(define_predicate "u6bit_cint_operand" 234 (and (match_code "const_int") 235 (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 63"))) 236 237;; Return 1 if op is an unsigned 7-bit constant integer. 238(define_predicate "u7bit_cint_operand" 239 (and (match_code "const_int") 240 (match_test "IN_RANGE (INTVAL (op), 0, 127)"))) 241 242;; Return 1 if op is a unsigned 8-bit constant integer. 243(define_predicate "u8bit_cint_operand" 244 (and (match_code "const_int") 245 (match_test "IN_RANGE (INTVAL (op), 0, 255)"))) 246 247;; Return 1 if op is a signed 8-bit constant integer. 248;; Integer multiplication complete more quickly 249(define_predicate "s8bit_cint_operand" 250 (and (match_code "const_int") 251 (match_test "INTVAL (op) >= -128 && INTVAL (op) <= 127"))) 252 253;; Return 1 if op is a unsigned 10-bit constant integer. 254(define_predicate "u10bit_cint_operand" 255 (and (match_code "const_int") 256 (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 1023"))) 257 258;; Return 1 if op is a constant integer that can fit in a D field. 259(define_predicate "short_cint_operand" 260 (and (match_code "const_int") 261 (match_test "satisfies_constraint_I (op)"))) 262 263;; Return 1 if op is a constant integer that can fit in an unsigned D field. 264(define_predicate "u_short_cint_operand" 265 (and (match_code "const_int") 266 (match_test "satisfies_constraint_K (op)"))) 267 268;; Return 1 if op is a constant integer that is a signed 16-bit constant 269;; shifted left 16 bits 270(define_predicate "upper16_cint_operand" 271 (and (match_code "const_int") 272 (match_test "satisfies_constraint_L (op)"))) 273 274;; Return 1 if op is a constant integer that cannot fit in a signed D field. 275(define_predicate "non_short_cint_operand" 276 (and (match_code "const_int") 277 (match_test "(unsigned HOST_WIDE_INT) 278 (INTVAL (op) + 0x8000) >= 0x10000"))) 279 280;; Return 1 if op is a 32-bit constant signed integer 281(define_predicate "s32bit_cint_operand" 282 (and (match_code "const_int") 283 (match_test "(0x80000000 + UINTVAL (op)) >> 32 == 0"))) 284 285;; Return 1 if op is a constant 32-bit unsigned 286(define_predicate "c32bit_cint_operand" 287 (and (match_code "const_int") 288 (match_test "((UINTVAL (op) >> 32) == 0)"))) 289 290;; Return 1 if op is a positive constant integer that is an exact power of 2. 291(define_predicate "exact_log2_cint_operand" 292 (and (match_code "const_int") 293 (match_test "INTVAL (op) > 0 && exact_log2 (INTVAL (op)) >= 0"))) 294 295;; Match op = 0 or op = 1. 296(define_predicate "const_0_to_1_operand" 297 (and (match_code "const_int") 298 (match_test "IN_RANGE (INTVAL (op), 0, 1)"))) 299 300;; Match op = -1, op = 0, or op = 1. 301(define_predicate "const_m1_to_1_operand" 302 (and (match_code "const_int") 303 (match_test "IN_RANGE (INTVAL (op), -1, 1)"))) 304 305;; Match op = 0..3. 306(define_predicate "const_0_to_3_operand" 307 (and (match_code "const_int") 308 (match_test "IN_RANGE (INTVAL (op), 0, 3)"))) 309 310;; Match op = 2 or op = 3. 311(define_predicate "const_2_to_3_operand" 312 (and (match_code "const_int") 313 (match_test "IN_RANGE (INTVAL (op), 2, 3)"))) 314 315;; Match op = 0..7. 316(define_predicate "const_0_to_7_operand" 317 (and (match_code "const_int") 318 (match_test "IN_RANGE (INTVAL (op), 0, 7)"))) 319 320;; Match op = 0..11 321(define_predicate "const_0_to_12_operand" 322 (and (match_code "const_int") 323 (match_test "IN_RANGE (INTVAL (op), 0, 12)"))) 324 325;; Match op = 0..15 326(define_predicate "const_0_to_15_operand" 327 (and (match_code "const_int") 328 (match_test "IN_RANGE (INTVAL (op), 0, 15)"))) 329 330;; Return 1 if op is a 34-bit constant integer. 331(define_predicate "cint34_operand" 332 (match_code "const_int") 333{ 334 if (!TARGET_PREFIXED) 335 return 0; 336 337 return SIGNED_INTEGER_34BIT_P (INTVAL (op)); 338}) 339 340;; Return 1 if op is a register that is not special. 341;; Disallow (SUBREG:SF (REG:SI)) and (SUBREG:SI (REG:SF)) on VSX systems where 342;; you need to be careful in moving a SFmode to SImode and vice versa due to 343;; the fact that SFmode is represented as DFmode in the VSX registers. 344(define_predicate "gpc_reg_operand" 345 (match_operand 0 "register_operand") 346{ 347 if (SUBREG_P (op)) 348 { 349 if (TARGET_NO_SF_SUBREG && sf_subreg_operand (op, mode)) 350 return 0; 351 352 op = SUBREG_REG (op); 353 } 354 355 if (!REG_P (op)) 356 return 0; 357 358 if (!HARD_REGISTER_P (op)) 359 return 1; 360 361 if (TARGET_ALTIVEC && ALTIVEC_REGNO_P (REGNO (op))) 362 return 1; 363 364 if (TARGET_VSX && VSX_REGNO_P (REGNO (op))) 365 return 1; 366 367 return INT_REGNO_P (REGNO (op)) || FP_REGNO_P (REGNO (op)); 368}) 369 370;; Return 1 if op is a general purpose register. Unlike gpc_reg_operand, don't 371;; allow floating point or vector registers. Since vector registers are not 372;; allowed, we don't have to reject SFmode/SImode subregs. 373(define_predicate "int_reg_operand" 374 (match_operand 0 "register_operand") 375{ 376 if (SUBREG_P (op)) 377 { 378 if (TARGET_NO_SF_SUBREG && sf_subreg_operand (op, mode)) 379 return 0; 380 381 op = SUBREG_REG (op); 382 } 383 384 if (!REG_P (op)) 385 return 0; 386 387 if (!HARD_REGISTER_P (op)) 388 return 1; 389 390 return INT_REGNO_P (REGNO (op)); 391}) 392 393;; Like int_reg_operand, but don't return true for pseudo registers 394;; We don't have to check for SF SUBREGS because pseudo registers 395;; are not allowed, and SF SUBREGs are ok within GPR registers. 396(define_predicate "int_reg_operand_not_pseudo" 397 (match_operand 0 "register_operand") 398{ 399 if (SUBREG_P (op)) 400 op = SUBREG_REG (op); 401 402 if (!REG_P (op)) 403 return 0; 404 405 if (!HARD_REGISTER_P (op)) 406 return 0; 407 408 return INT_REGNO_P (REGNO (op)); 409}) 410 411;; Like int_reg_operand, but only return true for base registers 412(define_predicate "base_reg_operand" 413 (match_operand 0 "int_reg_operand") 414{ 415 if (SUBREG_P (op)) 416 op = SUBREG_REG (op); 417 418 if (!REG_P (op)) 419 return 0; 420 421 return (REGNO (op) != FIRST_GPR_REGNO); 422}) 423 424 425;; Return true if this is a traditional floating point register 426(define_predicate "fpr_reg_operand" 427 (match_code "reg,subreg") 428{ 429 HOST_WIDE_INT r; 430 431 if (SUBREG_P (op)) 432 op = SUBREG_REG (op); 433 434 if (!REG_P (op)) 435 return 0; 436 437 r = REGNO (op); 438 if (!HARD_REGISTER_NUM_P (r)) 439 return 1; 440 441 return FP_REGNO_P (r); 442}) 443 444;; Return 1 if op is a general purpose register that is an even register 445;; which suitable for a load/store quad operation 446;; Subregs are not allowed here because when they are combine can 447;; create (subreg:PTI (reg:TI pseudo)) which will cause reload to 448;; think the innermost reg needs reloading, in TImode instead of 449;; PTImode. So reload will choose a reg in TImode which has no 450;; requirement that the reg be even. 451(define_predicate "quad_int_reg_operand" 452 (match_code "reg") 453{ 454 HOST_WIDE_INT r; 455 456 if (!TARGET_QUAD_MEMORY && !TARGET_QUAD_MEMORY_ATOMIC) 457 return 0; 458 459 r = REGNO (op); 460 if (!HARD_REGISTER_NUM_P (r)) 461 return 1; 462 463 return (INT_REGNO_P (r) && ((r & 1) == 0)); 464}) 465 466;; Return 1 if op is a register that is a condition register field. 467(define_predicate "cc_reg_operand" 468 (match_operand 0 "register_operand") 469{ 470 if (SUBREG_P (op)) 471 op = SUBREG_REG (op); 472 473 if (!REG_P (op)) 474 return 0; 475 476 if (REGNO (op) > LAST_VIRTUAL_REGISTER) 477 return 1; 478 479 return CR_REGNO_P (REGNO (op)); 480}) 481 482;; Return 1 if op is a register that is a condition register field not cr0. 483(define_predicate "cc_reg_not_cr0_operand" 484 (match_operand 0 "register_operand") 485{ 486 if (SUBREG_P (op)) 487 op = SUBREG_REG (op); 488 489 if (!REG_P (op)) 490 return 0; 491 492 if (REGNO (op) > LAST_VIRTUAL_REGISTER) 493 return 1; 494 495 return CR_REGNO_NOT_CR0_P (REGNO (op)); 496}) 497 498;; Return 1 if op is a constant integer valid for D field 499;; or non-special register. 500(define_predicate "reg_or_short_operand" 501 (if_then_else (match_code "const_int") 502 (match_operand 0 "short_cint_operand") 503 (match_operand 0 "gpc_reg_operand"))) 504 505;; Return 1 if op is a constant integer valid for DS field 506;; or non-special register. 507(define_predicate "reg_or_aligned_short_operand" 508 (if_then_else (match_code "const_int") 509 (and (match_operand 0 "short_cint_operand") 510 (match_test "!(INTVAL (op) & 3)")) 511 (match_operand 0 "gpc_reg_operand"))) 512 513;; Return 1 if op is a constant integer whose high-order 16 bits are zero 514;; or non-special register. 515(define_predicate "reg_or_u_short_operand" 516 (if_then_else (match_code "const_int") 517 (match_operand 0 "u_short_cint_operand") 518 (match_operand 0 "gpc_reg_operand"))) 519 520;; Return 1 if op is any constant integer or a non-special register. 521(define_predicate "reg_or_cint_operand" 522 (ior (match_code "const_int") 523 (match_operand 0 "gpc_reg_operand"))) 524 525;; Return 1 if op is constant zero or a non-special register. 526(define_predicate "reg_or_zero_operand" 527 (ior (match_operand 0 "zero_constant") 528 (match_operand 0 "gpc_reg_operand"))) 529 530;; Return 1 if op is a constant integer valid for addition with addis, addi. 531(define_predicate "add_cint_operand" 532 (and (match_code "const_int") 533 (match_test "((unsigned HOST_WIDE_INT) INTVAL (op) 534 + (mode == SImode ? 0x80000000 : 0x80008000)) 535 < (unsigned HOST_WIDE_INT) 0x100000000ll"))) 536 537;; Return 1 if op is a constant integer valid for addition 538;; or non-special register. 539(define_predicate "reg_or_add_cint_operand" 540 (if_then_else (match_code "const_int") 541 (match_operand 0 "add_cint_operand") 542 (match_operand 0 "gpc_reg_operand"))) 543 544;; Return 1 if op is a constant integer valid for subtraction 545;; or non-special register. 546(define_predicate "reg_or_sub_cint_operand" 547 (if_then_else (match_code "const_int") 548 (match_test "(unsigned HOST_WIDE_INT) 549 (- UINTVAL (op) + (mode == SImode ? 0x80000000 : 0x80008000)) 550 < (unsigned HOST_WIDE_INT) 0x100000000ll") 551 (match_operand 0 "gpc_reg_operand"))) 552 553;; Return 1 if op is any 32-bit unsigned constant integer 554;; or non-special register. 555(define_predicate "reg_or_logical_cint_operand" 556 (if_then_else (match_code "const_int") 557 (match_test "(GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT 558 && INTVAL (op) >= 0) 559 || ((INTVAL (op) & GET_MODE_MASK (mode) 560 & (~ (unsigned HOST_WIDE_INT) 0xffffffff)) == 0)") 561 (match_operand 0 "gpc_reg_operand"))) 562 563;; Like reg_or_logical_cint_operand, but allow vsx registers 564(define_predicate "vsx_reg_or_cint_operand" 565 (ior (match_operand 0 "vsx_register_operand") 566 (match_operand 0 "reg_or_logical_cint_operand"))) 567 568;; Return 1 if operand is a CONST_DOUBLE that can be set in a register 569;; with no more than one instruction per word. 570(define_predicate "easy_fp_constant" 571 (match_code "const_double") 572{ 573 gcc_assert (GET_MODE (op) == mode && SCALAR_FLOAT_MODE_P (mode)); 574 575 /* Consider all constants with -msoft-float to be easy when regs are 576 32-bit and thus can be loaded with a maximum of 2 insns. For 577 64-bit avoid long dependent insn sequences. */ 578 if (TARGET_SOFT_FLOAT) 579 { 580 if (!TARGET_POWERPC64) 581 return 1; 582 583 int size = GET_MODE_SIZE (mode); 584 if (size < 8) 585 return 1; 586 587 int load_from_mem_insns = 2; 588 if (size > 8) 589 load_from_mem_insns++; 590 if (TARGET_CMODEL != CMODEL_SMALL) 591 load_from_mem_insns++; 592 if (num_insns_constant (op, mode) <= load_from_mem_insns) 593 return 1; 594 } 595 596 /* 0.0D is not all zero bits. */ 597 if (DECIMAL_FLOAT_MODE_P (mode)) 598 return 0; 599 600 /* The constant 0.0 is easy under VSX. */ 601 if (TARGET_VSX && op == CONST0_RTX (mode)) 602 return 1; 603 604 /* Constants that can be generated with ISA 3.1 instructions are easy. */ 605 vec_const_128bit_type vsx_const; 606 if (TARGET_POWER10 && vec_const_128bit_to_bytes (op, mode, &vsx_const)) 607 { 608 if (constant_generates_lxvkq (&vsx_const)) 609 return true; 610 611 if (constant_generates_xxspltiw (&vsx_const)) 612 return true; 613 614 if (constant_generates_xxspltidp (&vsx_const)) 615 return true; 616 } 617 618 /* Otherwise consider floating point constants hard, so that the 619 constant gets pushed to memory during the early RTL phases. This 620 has the advantage that double precision constants that can be 621 represented in single precision without a loss of precision will 622 use single precision loads. */ 623 return 0; 624}) 625 626;; Return 1 if the operand is a 64-bit floating point scalar constant or a 627;; vector constant that can be loaded to a VSX register with one prefixed 628;; instruction, such as XXSPLTIDP or XXSPLTIW. 629;; 630;; In addition regular constants, we also recognize constants formed with the 631;; VEC_DUPLICATE insn from scalar constants. 632;; 633;; We don't handle scalar integer constants here because the assumption is the 634;; normal integer constants will be loaded into GPR registers. For the 635;; constants that need to be loaded into vector registers, the instructions 636;; don't work well with TImode variables assigned a constant. This is because 637;; the 64-bit scalar constants are splatted into both halves of the register. 638 639(define_predicate "vsx_prefixed_constant" 640 (match_code "const_double,const_vector,vec_duplicate") 641{ 642 /* If we can generate the constant with a few Altivec instructions, don't 643 generate a prefixed instruction. */ 644 if (CONST_VECTOR_P (op) && easy_altivec_constant (op, mode)) 645 return false; 646 647 /* Do we have prefixed instructions and are VSX registers available? Is the 648 constant recognized? */ 649 if (!TARGET_PREFIXED || !TARGET_VSX) 650 return false; 651 652 vec_const_128bit_type vsx_const; 653 if (!vec_const_128bit_to_bytes (op, mode, &vsx_const)) 654 return false; 655 656 if (constant_generates_xxspltiw (&vsx_const)) 657 return true; 658 659 if (constant_generates_xxspltidp (&vsx_const)) 660 return true; 661 662 return false; 663}) 664 665;; Return 1 if the operand is a special IEEE 128-bit value that can be loaded 666;; via the LXVKQ instruction. 667 668(define_predicate "easy_vector_constant_ieee128" 669 (match_code "const_vector,const_double") 670{ 671 vec_const_128bit_type vsx_const; 672 673 /* Can we generate the LXVKQ instruction? */ 674 if (!TARGET_IEEE128_CONSTANT || !TARGET_FLOAT128_HW || !TARGET_POWER10 675 || !TARGET_VSX) 676 return false; 677 678 return (vec_const_128bit_to_bytes (op, mode, &vsx_const) 679 && constant_generates_lxvkq (&vsx_const) != 0); 680}) 681 682;; Return 1 if the operand is a constant that can loaded with a XXSPLTIB 683;; instruction and then a VUPKHSB, VECSB2W or VECSB2D instruction. 684 685(define_predicate "xxspltib_constant_split" 686 (match_code "const_vector,vec_duplicate,const_int") 687{ 688 int value = 256; 689 int num_insns = -1; 690 691 if (!xxspltib_constant_p (op, mode, &num_insns, &value)) 692 return false; 693 694 return num_insns > 1; 695}) 696 697 698;; Return 1 if the operand is constant that can loaded directly with a XXSPLTIB 699;; instruction. 700 701(define_predicate "xxspltib_constant_nosplit" 702 (match_code "const_vector,vec_duplicate,const_int") 703{ 704 int value = 256; 705 int num_insns = -1; 706 707 if (!xxspltib_constant_p (op, mode, &num_insns, &value)) 708 return false; 709 710 return num_insns == 1; 711}) 712 713;; Return 1 if the operand is a CONST_VECTOR and can be loaded into a 714;; vector register without using memory. 715(define_predicate "easy_vector_constant" 716 (match_code "const_vector") 717{ 718 if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode)) 719 { 720 int value = 256; 721 int num_insns = -1; 722 723 if (zero_constant (op, mode) || all_ones_constant (op, mode)) 724 return true; 725 726 /* Constants that can be generated with ISA 3.1 instructions are 727 easy. */ 728 vec_const_128bit_type vsx_const; 729 if (TARGET_POWER10 && vec_const_128bit_to_bytes (op, mode, &vsx_const)) 730 { 731 if (constant_generates_lxvkq (&vsx_const)) 732 return true; 733 734 if (constant_generates_xxspltiw (&vsx_const)) 735 return true; 736 737 if (constant_generates_xxspltidp (&vsx_const)) 738 return true; 739 } 740 741 if (TARGET_P9_VECTOR 742 && xxspltib_constant_p (op, mode, &num_insns, &value)) 743 return true; 744 745 return easy_altivec_constant (op, mode); 746 } 747 748 return false; 749}) 750 751;; Same as easy_vector_constant but only for EASY_VECTOR_15_ADD_SELF. 752(define_predicate "easy_vector_constant_add_self" 753 (and (match_code "const_vector") 754 (and (match_test "TARGET_ALTIVEC") 755 (match_test "easy_altivec_constant (op, mode)"))) 756{ 757 HOST_WIDE_INT val; 758 int elt; 759 if (mode == V2DImode || mode == V2DFmode) 760 return 0; 761 elt = BYTES_BIG_ENDIAN ? GET_MODE_NUNITS (mode) - 1 : 0; 762 val = const_vector_elt_as_int (op, elt); 763 val = ((val & 0xff) ^ 0x80) - 0x80; 764 return EASY_VECTOR_15_ADD_SELF (val); 765}) 766 767;; Same as easy_vector_constant but only for EASY_VECTOR_MSB. 768(define_predicate "easy_vector_constant_msb" 769 (and (match_code "const_vector") 770 (and (match_test "TARGET_ALTIVEC") 771 (match_test "easy_altivec_constant (op, mode)") 772 (match_test "vspltis_shifted (op) == 0"))) 773{ 774 HOST_WIDE_INT val; 775 int elt, sz = easy_altivec_constant (op, mode); 776 machine_mode inner = GET_MODE_INNER (mode); 777 int isz = GET_MODE_SIZE (inner); 778 if (mode == V2DImode || mode == V2DFmode) 779 return 0; 780 elt = BYTES_BIG_ENDIAN ? GET_MODE_NUNITS (mode) - 1 : 0; 781 if (isz < sz) 782 { 783 if (const_vector_elt_as_int (op, elt) != 0) 784 return 0; 785 elt += (BYTES_BIG_ENDIAN ? -1 : 1) * (sz - isz) / isz; 786 } 787 else if (isz > sz) 788 inner = smallest_int_mode_for_size (sz * BITS_PER_UNIT); 789 val = const_vector_elt_as_int (op, elt); 790 return EASY_VECTOR_MSB (val, inner); 791}) 792 793;; Return true if this is an easy altivec constant that we form 794;; by using VSLDOI. 795(define_predicate "easy_vector_constant_vsldoi" 796 (and (match_code "const_vector") 797 (and (match_test "TARGET_ALTIVEC") 798 (and (match_test "easy_altivec_constant (op, mode)") 799 (match_test "vspltis_shifted (op) != 0"))))) 800 801;; Return true if this is a vector constant and each byte in 802;; it is the same. 803(define_predicate "const_vector_each_byte_same" 804 (match_code "const_vector") 805{ 806 rtx elt; 807 if (!const_vec_duplicate_p (op, &elt)) 808 return false; 809 810 machine_mode emode = GET_MODE_INNER (mode); 811 unsigned HOST_WIDE_INT eval; 812 if (CONST_INT_P (elt)) 813 eval = INTVAL (elt); 814 else if (CONST_DOUBLE_AS_FLOAT_P (elt)) 815 { 816 gcc_assert (emode == SFmode || emode == DFmode); 817 long l[2]; 818 real_to_target (l, CONST_DOUBLE_REAL_VALUE (elt), emode); 819 /* real_to_target puts 32-bit pieces in each long. */ 820 eval = zext_hwi (l[0], 32); 821 eval |= zext_hwi (l[1], 32) << 32; 822 } 823 else 824 return false; 825 826 unsigned int esize = GET_MODE_SIZE (emode); 827 unsigned char byte0 = eval & 0xff; 828 for (unsigned int i = 1; i < esize; i++) 829 { 830 eval >>= BITS_PER_UNIT; 831 if (byte0 != (eval & 0xff)) 832 return false; 833 } 834 835 return true; 836}) 837 838;; Return 1 if operand is a vector int register or is either a vector constant 839;; of all 0 bits of a vector constant of all 1 bits. 840(define_predicate "vector_int_reg_or_same_bit" 841 (match_code "reg,subreg,const_vector") 842{ 843 if (GET_MODE_CLASS (mode) != MODE_VECTOR_INT) 844 return 0; 845 846 else if (REG_P (op) || SUBREG_P (op)) 847 return vint_operand (op, mode); 848 849 else 850 return op == CONST0_RTX (mode) || op == CONSTM1_RTX (mode); 851}) 852 853;; Return 1 if operand is 0.0. 854(define_predicate "zero_fp_constant" 855 (and (match_code "const_double") 856 (match_test "SCALAR_FLOAT_MODE_P (mode) 857 && op == CONST0_RTX (mode)"))) 858 859;; Return 1 if the operand is in volatile memory. Note that during the 860;; RTL generation phase, memory_operand does not return TRUE for volatile 861;; memory references. So this function allows us to recognize volatile 862;; references where it's safe. 863(define_predicate "volatile_mem_operand" 864 (and (match_code "mem") 865 (match_test "MEM_VOLATILE_P (op)") 866 (if_then_else (match_test "reload_completed") 867 (match_operand 0 "memory_operand") 868 (match_test "memory_address_p (mode, XEXP (op, 0))")))) 869 870;; Return 1 if the operand is a volatile or non-volatile memory operand. 871(define_predicate "any_memory_operand" 872 (ior (match_operand 0 "memory_operand") 873 (match_operand 0 "volatile_mem_operand"))) 874 875;; Return 1 if the operand is an offsettable memory operand. 876(define_predicate "offsettable_mem_operand" 877 (and (match_operand 0 "any_memory_operand") 878 (match_test "offsettable_nonstrict_memref_p (op)"))) 879 880;; Return 1 if the operand is a simple offsettable memory operand 881;; that does not include pre-increment, post-increment, etc. 882(define_predicate "simple_offsettable_mem_operand" 883 (match_operand 0 "offsettable_mem_operand") 884{ 885 rtx addr = XEXP (op, 0); 886 887 if (GET_CODE (addr) != PLUS && GET_CODE (addr) != LO_SUM) 888 return 0; 889 890 if (!CONSTANT_P (XEXP (addr, 1))) 891 return 0; 892 893 return base_reg_operand (XEXP (addr, 0), Pmode); 894}) 895 896;; Return 1 if the operand is suitable for load/store quad memory. 897;; This predicate only checks for non-atomic loads/stores (not lqarx/stqcx). 898(define_predicate "quad_memory_operand" 899 (match_code "mem") 900{ 901 if (!TARGET_QUAD_MEMORY && !TARGET_SYNC_TI) 902 return false; 903 904 if (GET_MODE_SIZE (mode) != 16 || !MEM_P (op) || MEM_ALIGN (op) < 128) 905 return false; 906 907 return quad_address_p (XEXP (op, 0), mode, false); 908}) 909 910;; Return 1 if the operand is suitable for load/store to vector registers with 911;; d-form addressing (register+offset), which was added in ISA 3.0. 912;; Unlike quad_memory_operand, we do not have to check for alignment. 913(define_predicate "vsx_quad_dform_memory_operand" 914 (match_code "mem") 915{ 916 if (!TARGET_P9_VECTOR) 917 return false; 918 919 return quad_address_p (XEXP (op, 0), mode, false); 920}) 921 922;; Return 1 if the operand is an indexed or indirect memory operand. 923(define_predicate "indexed_or_indirect_operand" 924 (match_code "mem") 925{ 926 op = XEXP (op, 0); 927 if (VECTOR_MEM_ALTIVEC_P (mode) 928 && GET_CODE (op) == AND 929 && CONST_INT_P (XEXP (op, 1)) 930 && INTVAL (XEXP (op, 1)) == -16) 931 op = XEXP (op, 0); 932 933 return indexed_or_indirect_address (op, mode); 934}) 935 936;; Like indexed_or_indirect_operand, but also allow a GPR register if direct 937;; moves are supported. 938(define_predicate "reg_or_indexed_operand" 939 (match_code "mem,reg,subreg") 940{ 941 if (MEM_P (op)) 942 return indexed_or_indirect_operand (op, mode); 943 else if (TARGET_DIRECT_MOVE) 944 return register_operand (op, mode); 945 return 946 0; 947}) 948 949;; Return 1 if the operand is an indexed or indirect memory operand with an 950;; AND -16 in it, used to recognize when we need to switch to Altivec loads 951;; to realign loops instead of VSX (altivec silently ignores the bottom bits, 952;; while VSX uses the full address and traps) 953(define_predicate "altivec_indexed_or_indirect_operand" 954 (match_code "mem") 955{ 956 op = XEXP (op, 0); 957 if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode) 958 && GET_CODE (op) == AND 959 && CONST_INT_P (XEXP (op, 1)) 960 && INTVAL (XEXP (op, 1)) == -16) 961 return indexed_or_indirect_address (XEXP (op, 0), mode); 962 963 return 0; 964}) 965 966;; Return 1 if the operand is an indexed or indirect address. 967(define_special_predicate "indexed_or_indirect_address" 968 (and (match_test "REG_P (op) 969 || (GET_CODE (op) == PLUS 970 /* Omit testing REG_P (XEXP (op, 0)). */ 971 && REG_P (XEXP (op, 1)))") 972 (match_operand 0 "address_operand"))) 973 974;; Return 1 if the operand is an index-form address. 975(define_special_predicate "indexed_address" 976 (match_test "(GET_CODE (op) == PLUS 977 && REG_P (XEXP (op, 0)) 978 && REG_P (XEXP (op, 1)))")) 979 980;; Return 1 if the operand is a MEM with an update-form address. This may 981;; also include update-indexed form. 982(define_special_predicate "update_address_mem" 983 (match_test "(MEM_P (op) 984 && (GET_CODE (XEXP (op, 0)) == PRE_INC 985 || GET_CODE (XEXP (op, 0)) == PRE_DEC 986 || GET_CODE (XEXP (op, 0)) == PRE_MODIFY))")) 987 988;; Anything that matches memory_operand but does not update the address. 989(define_predicate "non_update_memory_operand" 990 (match_code "mem") 991{ 992 if (update_address_mem (op, mode)) 993 return 0; 994 return memory_operand (op, mode); 995}) 996 997;; Return 1 if the operand is a MEM with an indexed-form address. 998(define_special_predicate "indexed_address_mem" 999 (match_test "(MEM_P (op) 1000 && (indexed_address (XEXP (op, 0), mode) 1001 || (GET_CODE (XEXP (op, 0)) == PRE_MODIFY 1002 && indexed_address (XEXP (XEXP (op, 0), 1), mode))))")) 1003 1004;; Return 1 if the operand is either a non-special register or can be used 1005;; as the operand of a `mode' add insn. 1006(define_predicate "add_operand" 1007 (if_then_else (match_code "const_int") 1008 (match_test "satisfies_constraint_I (op) 1009 || satisfies_constraint_L (op) 1010 || satisfies_constraint_eI (op)") 1011 (match_operand 0 "gpc_reg_operand"))) 1012 1013;; Return 1 if the operand is either a non-special register, or 0, or -1. 1014(define_predicate "adde_operand" 1015 (if_then_else (match_code "const_int") 1016 (match_test "INTVAL (op) == 0 || INTVAL (op) == -1") 1017 (match_operand 0 "gpc_reg_operand"))) 1018 1019;; Return 1 if OP is a constant but not a valid add_operand. 1020(define_predicate "non_add_cint_operand" 1021 (and (match_code "const_int") 1022 (not (match_operand 0 "add_operand")))) 1023 1024;; Return 1 if the operand is a constant that can be used as the operand 1025;; of an AND, OR or XOR. 1026(define_predicate "logical_const_operand" 1027 (match_code "const_int") 1028{ 1029 HOST_WIDE_INT opl; 1030 1031 opl = INTVAL (op) & GET_MODE_MASK (mode); 1032 1033 return ((opl & ~ (unsigned HOST_WIDE_INT) 0xffff) == 0 1034 || (opl & ~ (unsigned HOST_WIDE_INT) 0xffff0000) == 0); 1035}) 1036 1037;; Return 1 if the operand is a non-special register or a constant that 1038;; can be used as the operand of an AND, OR or XOR. 1039(define_predicate "logical_operand" 1040 (ior (match_operand 0 "gpc_reg_operand") 1041 (match_operand 0 "logical_const_operand"))) 1042 1043;; Return 1 if op is a constant that is not a logical operand, but could 1044;; be split into one. 1045(define_predicate "non_logical_cint_operand" 1046 (and (match_code "const_int,const_wide_int") 1047 (and (not (match_operand 0 "logical_operand")) 1048 (match_operand 0 "reg_or_logical_cint_operand")))) 1049 1050;; Return 1 if the operand is either a non-special register or a 1051;; constant that can be used as the operand of a logical AND. 1052(define_predicate "and_operand" 1053 (ior (and (match_code "const_int") 1054 (match_test "rs6000_is_valid_and_mask (op, mode)")) 1055 (if_then_else (match_test "fixed_regs[CR0_REGNO]") 1056 (match_operand 0 "gpc_reg_operand") 1057 (match_operand 0 "logical_operand")))) 1058 1059;; Return 1 if the operand is either a logical operand or a short cint operand. 1060(define_predicate "scc_eq_operand" 1061 (ior (match_operand 0 "logical_operand") 1062 (match_operand 0 "short_cint_operand"))) 1063 1064;; Return 1 if the operand is a general non-special register or memory operand. 1065(define_predicate "reg_or_mem_operand" 1066 (ior (match_operand 0 "gpc_reg_operand") 1067 (match_operand 0 "any_memory_operand") 1068 (and (match_code "mem") 1069 (match_test "macho_lo_sum_memory_operand (op, mode)")))) 1070 1071;; Return 1 if the operand is CONST_DOUBLE 0, register or memory operand. 1072(define_predicate "zero_reg_mem_operand" 1073 (ior (and (match_test "TARGET_VSX") 1074 (match_operand 0 "zero_fp_constant")) 1075 (match_operand 0 "reg_or_mem_operand"))) 1076 1077;; Return 1 if the operand is a CONST_INT and it is the element for 64-bit 1078;; data types inside of a vector that scalar instructions operate on 1079(define_predicate "vsx_scalar_64bit" 1080 (match_code "const_int") 1081{ 1082 return (INTVAL (op) == VECTOR_ELEMENT_SCALAR_64BIT); 1083}) 1084 1085;; Return 1 if the operand is a general register or memory operand without 1086;; pre_inc or pre_dec or pre_modify, which produces invalid form of PowerPC 1087;; lwa instruction. 1088(define_predicate "lwa_operand" 1089 (match_code "reg,subreg,mem") 1090{ 1091 rtx inner, addr, offset; 1092 1093 inner = op; 1094 if (reload_completed && SUBREG_P (inner)) 1095 inner = SUBREG_REG (inner); 1096 1097 if (gpc_reg_operand (inner, mode)) 1098 return true; 1099 if (!any_memory_operand (inner, mode)) 1100 return false; 1101 1102 addr = XEXP (inner, 0); 1103 1104 /* The LWA instruction uses the DS-form instruction format which requires 1105 that the bottom two bits of the offset must be 0. The prefixed PLWA does 1106 not have this restriction. While the actual load from memory is 32-bits, 1107 we pass in DImode here to test for using a DS instruction. */ 1108 if (address_is_prefixed (addr, DImode, NON_PREFIXED_DS)) 1109 return true; 1110 1111 if (GET_CODE (addr) == PRE_INC 1112 || GET_CODE (addr) == PRE_DEC 1113 || (GET_CODE (addr) == PRE_MODIFY 1114 && !legitimate_indexed_address_p (XEXP (addr, 1), 0))) 1115 return false; 1116 if (GET_CODE (addr) == LO_SUM 1117 && REG_P (XEXP (addr, 0)) 1118 && GET_CODE (XEXP (addr, 1)) == CONST) 1119 addr = XEXP (XEXP (addr, 1), 0); 1120 if (GET_CODE (addr) != PLUS) 1121 return true; 1122 offset = XEXP (addr, 1); 1123 if (!CONST_INT_P (offset)) 1124 return true; 1125 return INTVAL (offset) % 4 == 0; 1126}) 1127 1128;; Return 1 if the operand, used inside a MEM, is a SYMBOL_REF. 1129(define_predicate "symbol_ref_operand" 1130 (and (match_code "symbol_ref") 1131 (match_test "(mode == VOIDmode || GET_MODE (op) == mode) 1132 && (DEFAULT_ABI != ABI_AIX || SYMBOL_REF_FUNCTION_P (op))"))) 1133 1134;; Return 1 if op is an operand that can be loaded via the GOT. 1135;; or non-special register field no cr0 1136(define_predicate "got_operand" 1137 (match_code "symbol_ref,const,label_ref")) 1138 1139;; Return 1 if op is a simple reference that can be loaded via the GOT, 1140;; excluding labels involving addition. 1141(define_predicate "got_no_const_operand" 1142 (match_code "symbol_ref,label_ref")) 1143 1144;; Return 1 if op is a SYMBOL_REF for a TLS symbol. 1145(define_predicate "rs6000_tls_symbol_ref" 1146 (and (match_code "symbol_ref") 1147 (match_test "RS6000_SYMBOL_REF_TLS_P (op)"))) 1148 1149;; Return 1 for the CONST_INT or UNSPEC second CALL operand. 1150;; Prevents unwanted substitution of the unspec got_reg arg. 1151(define_predicate "unspec_tls" 1152 (match_code "const_int,unspec") 1153{ 1154 if (CONST_INT_P (op)) 1155 return 1; 1156 if (XINT (op, 1) == UNSPEC_TLSGD) 1157 return REG_P (XVECEXP (op, 0, 1)) || XVECEXP (op, 0, 1) == const0_rtx; 1158 if (XINT (op, 1) == UNSPEC_TLSLD) 1159 return REG_P (XVECEXP (op, 0, 0)) || XVECEXP (op, 0, 0) == const0_rtx; 1160 return 0; 1161}) 1162 1163;; Return 1 if the operand, used inside a MEM, is a valid first argument 1164;; to CALL. This is a SYMBOL_REF, a pseudo-register, LR or CTR. 1165(define_predicate "call_operand" 1166 (if_then_else (match_code "reg") 1167 (match_test "REGNO (op) == LR_REGNO 1168 || REGNO (op) == CTR_REGNO 1169 || !HARD_REGISTER_P (op)") 1170 (match_code "symbol_ref"))) 1171 1172;; Return 1 if the operand, used inside a MEM, is a valid first argument 1173;; to an indirect CALL. This is LR, CTR, or a PLTSEQ unspec using CTR. 1174(define_predicate "indirect_call_operand" 1175 (match_code "reg,unspec") 1176{ 1177 if (REG_P (op)) 1178 return (REGNO (op) == LR_REGNO 1179 || REGNO (op) == CTR_REGNO); 1180 if (GET_CODE (op) == UNSPEC) 1181 { 1182 if (XINT (op, 1) != UNSPEC_PLTSEQ) 1183 return false; 1184 op = XVECEXP (op, 0, 0); 1185 return REG_P (op) && REGNO (op) == CTR_REGNO; 1186 } 1187 return false; 1188}) 1189 1190;; Return 1 if the operand is a SYMBOL_REF for a function known to be in 1191;; this file. 1192(define_predicate "current_file_function_operand" 1193 (and (match_code "symbol_ref") 1194 (match_test "(DEFAULT_ABI != ABI_AIX || SYMBOL_REF_FUNCTION_P (op)) 1195 && (SYMBOL_REF_LOCAL_P (op) 1196 || (op == XEXP (DECL_RTL (current_function_decl), 0) 1197 && !decl_replaceable_p (current_function_decl, 1198 opt_for_fn (current_function_decl, 1199 flag_semantic_interposition)))) 1200 && !((DEFAULT_ABI == ABI_AIX 1201 || DEFAULT_ABI == ABI_ELFv2) 1202 && (SYMBOL_REF_EXTERNAL_P (op) 1203 || SYMBOL_REF_WEAK (op))) 1204 && !(DEFAULT_ABI == ABI_ELFv2 1205 && SYMBOL_REF_DECL (op) != NULL 1206 && TREE_CODE (SYMBOL_REF_DECL (op)) == FUNCTION_DECL 1207 && (rs6000_fndecl_pcrel_p (SYMBOL_REF_DECL (op)) 1208 != rs6000_pcrel_p ()))"))) 1209 1210;; Return 1 if this operand is a valid input for a move insn. 1211(define_predicate "input_operand" 1212 (match_code "symbol_ref,const,reg,subreg,mem, 1213 const_double,const_wide_int,const_vector,const_int") 1214{ 1215 /* Memory is always valid. */ 1216 if (any_memory_operand (op, mode)) 1217 return 1; 1218 1219 /* For floating-point, easy constants are valid. */ 1220 if (SCALAR_FLOAT_MODE_P (mode) 1221 && easy_fp_constant (op, mode)) 1222 return 1; 1223 1224 /* Allow any integer constant. */ 1225 if (SCALAR_INT_MODE_P (mode) && CONST_SCALAR_INT_P (op)) 1226 return 1; 1227 1228 /* Allow easy vector constants. */ 1229 if (GET_CODE (op) == CONST_VECTOR 1230 && easy_vector_constant (op, mode)) 1231 return 1; 1232 1233 /* For floating-point or multi-word mode, the only remaining valid type 1234 is a register. */ 1235 if (SCALAR_FLOAT_MODE_P (mode) 1236 || GET_MODE_SIZE (mode) > UNITS_PER_WORD) 1237 return register_operand (op, mode); 1238 1239 /* We don't allow moving the carry bit around. */ 1240 if (ca_operand (op, mode)) 1241 return 0; 1242 1243 /* The only cases left are integral modes one word or smaller (we 1244 do not get called for MODE_CC values). These can be in any 1245 register. */ 1246 if (register_operand (op, mode)) 1247 return 1; 1248 1249 /* V.4 allows SYMBOL_REFs and CONSTs that are in the small data region 1250 to be valid. */ 1251 if (DEFAULT_ABI == ABI_V4 1252 && (SYMBOL_REF_P (op) || GET_CODE (op) == CONST) 1253 && small_data_operand (op, Pmode)) 1254 return 1; 1255 1256 return 0; 1257}) 1258 1259;; Return 1 if this operand is a valid input for a vsx_splat insn. 1260(define_predicate "splat_input_operand" 1261 (match_code "reg,subreg,mem") 1262{ 1263 machine_mode vmode; 1264 1265 if (mode == DFmode) 1266 vmode = V2DFmode; 1267 else if (mode == DImode) 1268 vmode = V2DImode; 1269 else if (mode == SImode && TARGET_P9_VECTOR) 1270 vmode = V4SImode; 1271 else if (mode == SFmode && TARGET_P9_VECTOR) 1272 vmode = V4SFmode; 1273 else 1274 return false; 1275 1276 if (MEM_P (op)) 1277 { 1278 rtx addr = XEXP (op, 0); 1279 1280 if (! volatile_ok && MEM_VOLATILE_P (op)) 1281 return 0; 1282 1283 if (lra_in_progress || reload_completed) 1284 return indexed_or_indirect_address (addr, vmode); 1285 else 1286 return memory_address_addr_space_p (vmode, addr, MEM_ADDR_SPACE (op)); 1287 } 1288 return gpc_reg_operand (op, mode); 1289}) 1290 1291;; Return 1 if this operand is valid for a MMA assemble accumulator insn. 1292(define_special_predicate "mma_assemble_input_operand" 1293 (match_test "(mode == V16QImode 1294 && (vsx_register_operand (op, mode) 1295 || (MEM_P (op) 1296 && (indexed_or_indirect_address (XEXP (op, 0), mode) 1297 || quad_address_p (XEXP (op, 0), mode, false)))))")) 1298 1299;; Return 1 if this operand is valid for an MMA disassemble insn. 1300(define_predicate "mma_disassemble_output_operand" 1301 (match_code "reg,subreg,mem") 1302{ 1303 if (MEM_P (op)) 1304 { 1305 rtx addr = XEXP (op, 0); 1306 return indexed_or_indirect_address (addr, mode) 1307 || quad_address_p (addr, mode, false); 1308 } 1309 1310 if (SUBREG_P (op)) 1311 op = SUBREG_REG (op); 1312 1313 return vsx_register_operand (op, mode); 1314}) 1315 1316;; Return true if operand is an operator used in rotate-and-mask instructions. 1317(define_predicate "rotate_mask_operator" 1318 (match_code "rotate,ashift,lshiftrt")) 1319 1320;; Return true if operand is boolean operator. 1321(define_predicate "boolean_operator" 1322 (match_code "and,ior,xor")) 1323 1324;; Return true if operand is OR-form of boolean operator. 1325(define_predicate "boolean_or_operator" 1326 (match_code "ior,xor")) 1327 1328;; Return true if operand is an equality operator. 1329(define_special_predicate "equality_operator" 1330 (match_code "eq,ne")) 1331 1332;; Return 1 if OP is a comparison operation that is valid for a branch 1333;; instruction. We check the opcode against the mode of the CC value. 1334;; validate_condition_mode is an assertion. 1335(define_predicate "branch_comparison_operator" 1336 (and (match_operand 0 "comparison_operator") 1337 (match_test "GET_MODE_CLASS (GET_MODE (XEXP (op, 0))) == MODE_CC") 1338 (if_then_else (match_test "GET_MODE (XEXP (op, 0)) == CCFPmode") 1339 (if_then_else (match_test "flag_finite_math_only") 1340 (match_code "lt,le,gt,ge,eq,ne,unordered,ordered") 1341 (match_code "lt,gt,eq,unordered,unge,unle,ne,ordered")) 1342 (match_code "lt,ltu,le,leu,gt,gtu,ge,geu,eq,ne")) 1343 (match_test "validate_condition_mode (GET_CODE (op), 1344 GET_MODE (XEXP (op, 0))), 1345 1"))) 1346 1347;; Return 1 if OP is a comparison that needs an extra instruction to do (a 1348;; crlogical or an extra branch). 1349(define_predicate "extra_insn_branch_comparison_operator" 1350 (and (match_operand 0 "comparison_operator") 1351 (match_test "GET_MODE (XEXP (op, 0)) == CCFPmode") 1352 (match_code "ltgt,le,ge,unlt,ungt,uneq") 1353 (match_test "validate_condition_mode (GET_CODE (op), 1354 GET_MODE (XEXP (op, 0))), 1355 1"))) 1356 1357;; Return 1 if OP is an unsigned comparison operator. 1358(define_predicate "unsigned_comparison_operator" 1359 (match_code "ltu,gtu,leu,geu")) 1360 1361;; Return 1 if OP is a signed comparison operator. 1362(define_predicate "signed_comparison_operator" 1363 (match_code "lt,gt,le,ge")) 1364 1365;; Return 1 if OP is a signed comparison or an equality operator. 1366(define_predicate "signed_or_equality_comparison_operator" 1367 (ior (match_operand 0 "equality_operator") 1368 (match_operand 0 "signed_comparison_operator"))) 1369 1370;; Return 1 if OP is an unsigned comparison or an equality operator. 1371(define_predicate "unsigned_or_equality_comparison_operator" 1372 (ior (match_operand 0 "equality_operator") 1373 (match_operand 0 "unsigned_comparison_operator"))) 1374 1375;; Return 1 if OP is a comparison operation that is valid for an SCC insn -- 1376;; it must be a positive comparison. 1377(define_predicate "scc_comparison_operator" 1378 (and (match_operand 0 "branch_comparison_operator") 1379 (match_code "eq,lt,gt,ltu,gtu,unordered"))) 1380 1381;; Return 1 if OP is a comparison operation whose inverse would be valid for 1382;; an SCC insn. 1383(define_predicate "scc_rev_comparison_operator" 1384 (and (match_operand 0 "branch_comparison_operator") 1385 (match_code "ne,le,ge,leu,geu,ordered"))) 1386 1387;; Return 1 if OP is a comparison operator suitable for floating point 1388;; vector/scalar comparisons that generate a -1/0 mask. 1389(define_predicate "fpmask_comparison_operator" 1390 (match_code "eq,gt,ge")) 1391 1392;; Return 1 if OP is a comparison operator suitable for vector/scalar 1393;; comparisons that generate a 0/-1 mask (i.e. the inverse of 1394;; fpmask_comparison_operator). 1395(define_predicate "invert_fpmask_comparison_operator" 1396 (match_code "ne,unlt,unle")) 1397 1398;; Return 1 if OP is a comparison operation suitable for integer vector/scalar 1399;; comparisons that generate a -1/0 mask. 1400(define_predicate "vecint_comparison_operator" 1401 (match_code "eq,gt,gtu")) 1402 1403;; Return 1 if OP is a comparison operation that is valid for a branch 1404;; insn, which is true if the corresponding bit in the CC register is set. 1405(define_predicate "branch_positive_comparison_operator" 1406 (and (match_operand 0 "branch_comparison_operator") 1407 (match_code "eq,lt,gt,ltu,gtu,unordered"))) 1408 1409;; Return 1 if OP is valid for a save_world call in prologue, known to be 1410;; a PARLLEL. 1411(define_predicate "save_world_operation" 1412 (match_code "parallel") 1413{ 1414 int index; 1415 int i; 1416 rtx elt; 1417 int count = XVECLEN (op, 0); 1418 1419 if (count != 54) 1420 return 0; 1421 1422 index = 0; 1423 if (GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER 1424 || GET_CODE (XVECEXP (op, 0, index++)) != USE) 1425 return 0; 1426 1427 for (i=1; i <= 18; i++) 1428 { 1429 elt = XVECEXP (op, 0, index++); 1430 if (GET_CODE (elt) != SET 1431 || !MEM_P (SET_DEST (elt)) 1432 || !memory_operand (SET_DEST (elt), DFmode) 1433 || !REG_P (SET_SRC (elt)) 1434 || GET_MODE (SET_SRC (elt)) != DFmode) 1435 return 0; 1436 } 1437 1438 for (i=1; i <= 12; i++) 1439 { 1440 elt = XVECEXP (op, 0, index++); 1441 if (GET_CODE (elt) != SET 1442 || !MEM_P (SET_DEST (elt)) 1443 || !REG_P (SET_SRC (elt)) 1444 || GET_MODE (SET_SRC (elt)) != V4SImode) 1445 return 0; 1446 } 1447 1448 for (i=1; i <= 19; i++) 1449 { 1450 elt = XVECEXP (op, 0, index++); 1451 if (GET_CODE (elt) != SET 1452 || !MEM_P (SET_DEST (elt)) 1453 || !memory_operand (SET_DEST (elt), Pmode) 1454 || !REG_P (SET_SRC (elt)) 1455 || GET_MODE (SET_SRC (elt)) != Pmode) 1456 return 0; 1457 } 1458 1459 elt = XVECEXP (op, 0, index++); 1460 if (GET_CODE (elt) != SET 1461 || !MEM_P (SET_DEST (elt)) 1462 || !memory_operand (SET_DEST (elt), Pmode) 1463 || !REG_P (SET_SRC (elt)) 1464 || REGNO (SET_SRC (elt)) != CR2_REGNO 1465 || GET_MODE (SET_SRC (elt)) != Pmode) 1466 return 0; 1467 1468 if (GET_CODE (XVECEXP (op, 0, index++)) != SET 1469 || GET_CODE (XVECEXP (op, 0, index++)) != SET) 1470 return 0; 1471 return 1; 1472}) 1473 1474;; Return 1 if OP is valid for a restore_world call in epilogue, known to be 1475;; a PARLLEL. 1476(define_predicate "restore_world_operation" 1477 (match_code "parallel") 1478{ 1479 int index; 1480 int i; 1481 rtx elt; 1482 int count = XVECLEN (op, 0); 1483 1484 if (count != 58) 1485 return 0; 1486 1487 index = 0; 1488 if (GET_CODE (XVECEXP (op, 0, index++)) != RETURN 1489 || GET_CODE (XVECEXP (op, 0, index++)) != USE 1490 || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER) 1491 return 0; 1492 1493 elt = XVECEXP (op, 0, index++); 1494 if (GET_CODE (elt) != SET 1495 || !MEM_P (SET_SRC (elt)) 1496 || !memory_operand (SET_SRC (elt), Pmode) 1497 || !REG_P (SET_DEST (elt)) 1498 || REGNO (SET_DEST (elt)) != CR2_REGNO 1499 || GET_MODE (SET_DEST (elt)) != Pmode) 1500 return 0; 1501 1502 for (i=1; i <= 19; i++) 1503 { 1504 elt = XVECEXP (op, 0, index++); 1505 if (GET_CODE (elt) != SET 1506 || !MEM_P (SET_SRC (elt)) 1507 || !memory_operand (SET_SRC (elt), Pmode) 1508 || !REG_P (SET_DEST (elt)) 1509 || GET_MODE (SET_DEST (elt)) != Pmode) 1510 return 0; 1511 } 1512 1513 for (i=1; i <= 12; i++) 1514 { 1515 elt = XVECEXP (op, 0, index++); 1516 if (GET_CODE (elt) != SET 1517 || !MEM_P (SET_SRC (elt)) 1518 || !REG_P (SET_DEST (elt)) 1519 || GET_MODE (SET_DEST (elt)) != V4SImode) 1520 return 0; 1521 } 1522 1523 for (i=1; i <= 18; i++) 1524 { 1525 elt = XVECEXP (op, 0, index++); 1526 if (GET_CODE (elt) != SET 1527 || !MEM_P (SET_SRC (elt)) 1528 || !memory_operand (SET_SRC (elt), DFmode) 1529 || !REG_P (SET_DEST (elt)) 1530 || GET_MODE (SET_DEST (elt)) != DFmode) 1531 return 0; 1532 } 1533 1534 if (GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER 1535 || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER 1536 || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER 1537 || GET_CODE (XVECEXP (op, 0, index++)) != CLOBBER 1538 || GET_CODE (XVECEXP (op, 0, index++)) != USE) 1539 return 0; 1540 return 1; 1541}) 1542 1543;; Return 1 if OP is valid for a vrsave call, known to be a PARALLEL. 1544(define_predicate "vrsave_operation" 1545 (match_code "parallel") 1546{ 1547 int count = XVECLEN (op, 0); 1548 unsigned int dest_regno, src_regno; 1549 int i; 1550 1551 if (count <= 1 1552 || GET_CODE (XVECEXP (op, 0, 0)) != SET 1553 || !REG_P (SET_DEST (XVECEXP (op, 0, 0))) 1554 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC_VOLATILE 1555 || XINT (SET_SRC (XVECEXP (op, 0, 0)), 1) != UNSPECV_SET_VRSAVE) 1556 return 0; 1557 1558 dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0))); 1559 src_regno = REGNO (XVECEXP (SET_SRC (XVECEXP (op, 0, 0)), 0, 1)); 1560 1561 if (dest_regno != VRSAVE_REGNO || src_regno != VRSAVE_REGNO) 1562 return 0; 1563 1564 for (i = 1; i < count; i++) 1565 { 1566 rtx elt = XVECEXP (op, 0, i); 1567 1568 if (GET_CODE (elt) != CLOBBER 1569 && GET_CODE (elt) != SET) 1570 return 0; 1571 } 1572 1573 return 1; 1574}) 1575 1576;; Return 1 if OP is valid for mfcr insn, known to be a PARALLEL. 1577(define_predicate "mfcr_operation" 1578 (match_code "parallel") 1579{ 1580 int count = XVECLEN (op, 0); 1581 int i; 1582 1583 /* Perform a quick check so we don't blow up below. */ 1584 if (count < 1 1585 || GET_CODE (XVECEXP (op, 0, 0)) != SET 1586 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC 1587 || XVECLEN (SET_SRC (XVECEXP (op, 0, 0)), 0) != 2) 1588 return 0; 1589 1590 for (i = 0; i < count; i++) 1591 { 1592 rtx exp = XVECEXP (op, 0, i); 1593 rtx unspec; 1594 int maskval; 1595 rtx src_reg; 1596 1597 src_reg = XVECEXP (SET_SRC (exp), 0, 0); 1598 1599 if (!REG_P (src_reg) 1600 || GET_MODE (src_reg) != CCmode 1601 || ! CR_REGNO_P (REGNO (src_reg))) 1602 return 0; 1603 1604 if (GET_CODE (exp) != SET 1605 || !REG_P (SET_DEST (exp)) 1606 || GET_MODE (SET_DEST (exp)) != SImode 1607 || ! INT_REGNO_P (REGNO (SET_DEST (exp)))) 1608 return 0; 1609 unspec = SET_SRC (exp); 1610 maskval = 1 << (MAX_CR_REGNO - REGNO (src_reg)); 1611 1612 if (GET_CODE (unspec) != UNSPEC 1613 || XINT (unspec, 1) != UNSPEC_MOVESI_FROM_CR 1614 || XVECLEN (unspec, 0) != 2 1615 || XVECEXP (unspec, 0, 0) != src_reg 1616 || !CONST_INT_P (XVECEXP (unspec, 0, 1)) 1617 || INTVAL (XVECEXP (unspec, 0, 1)) != maskval) 1618 return 0; 1619 } 1620 return 1; 1621}) 1622 1623;; Return 1 if OP is valid for mtcrf insn, known to be a PARALLEL. 1624(define_predicate "mtcrf_operation" 1625 (match_code "parallel") 1626{ 1627 int count = XVECLEN (op, 0); 1628 int i; 1629 rtx src_reg; 1630 1631 /* Perform a quick check so we don't blow up below. */ 1632 if (count < 1 1633 || GET_CODE (XVECEXP (op, 0, 0)) != SET 1634 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != UNSPEC 1635 || XVECLEN (SET_SRC (XVECEXP (op, 0, 0)), 0) != 2) 1636 return 0; 1637 src_reg = XVECEXP (SET_SRC (XVECEXP (op, 0, 0)), 0, 0); 1638 1639 if (!REG_P (src_reg) 1640 || GET_MODE (src_reg) != SImode 1641 || ! INT_REGNO_P (REGNO (src_reg))) 1642 return 0; 1643 1644 for (i = 0; i < count; i++) 1645 { 1646 rtx exp = XVECEXP (op, 0, i); 1647 rtx unspec; 1648 int maskval; 1649 1650 if (GET_CODE (exp) != SET 1651 || !REG_P (SET_DEST (exp)) 1652 || GET_MODE (SET_DEST (exp)) != CCmode 1653 || ! CR_REGNO_P (REGNO (SET_DEST (exp)))) 1654 return 0; 1655 unspec = SET_SRC (exp); 1656 maskval = 1 << (MAX_CR_REGNO - REGNO (SET_DEST (exp))); 1657 1658 if (GET_CODE (unspec) != UNSPEC 1659 || XINT (unspec, 1) != UNSPEC_MOVESI_TO_CR 1660 || XVECLEN (unspec, 0) != 2 1661 || XVECEXP (unspec, 0, 0) != src_reg 1662 || !CONST_INT_P (XVECEXP (unspec, 0, 1)) 1663 || INTVAL (XVECEXP (unspec, 0, 1)) != maskval) 1664 return 0; 1665 } 1666 return 1; 1667}) 1668 1669;; Return 1 if OP is valid for crsave insn, known to be a PARALLEL. 1670(define_predicate "crsave_operation" 1671 (match_code "parallel") 1672{ 1673 int count = XVECLEN (op, 0); 1674 int i; 1675 1676 for (i = 1; i < count; i++) 1677 { 1678 rtx exp = XVECEXP (op, 0, i); 1679 1680 if (GET_CODE (exp) != USE 1681 || !REG_P (XEXP (exp, 0)) 1682 || GET_MODE (XEXP (exp, 0)) != CCmode 1683 || ! CR_REGNO_P (REGNO (XEXP (exp, 0)))) 1684 return 0; 1685 } 1686 return 1; 1687}) 1688 1689;; Return 1 if OP is valid for lmw insn, known to be a PARALLEL. 1690(define_predicate "lmw_operation" 1691 (match_code "parallel") 1692{ 1693 int count = XVECLEN (op, 0); 1694 unsigned int dest_regno; 1695 rtx src_addr; 1696 unsigned int base_regno; 1697 HOST_WIDE_INT offset; 1698 int i; 1699 1700 /* Perform a quick check so we don't blow up below. */ 1701 if (count <= 1 1702 || GET_CODE (XVECEXP (op, 0, 0)) != SET 1703 || !REG_P (SET_DEST (XVECEXP (op, 0, 0))) 1704 || !MEM_P (SET_SRC (XVECEXP (op, 0, 0)))) 1705 return 0; 1706 1707 dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0))); 1708 src_addr = XEXP (SET_SRC (XVECEXP (op, 0, 0)), 0); 1709 1710 if (dest_regno > 31 1711 || count != 32 - (int) dest_regno) 1712 return 0; 1713 1714 if (legitimate_indirect_address_p (src_addr, 0)) 1715 { 1716 offset = 0; 1717 base_regno = REGNO (src_addr); 1718 if (base_regno == 0) 1719 return 0; 1720 } 1721 else if (rs6000_legitimate_offset_address_p (SImode, src_addr, false, false)) 1722 { 1723 offset = INTVAL (XEXP (src_addr, 1)); 1724 base_regno = REGNO (XEXP (src_addr, 0)); 1725 } 1726 else 1727 return 0; 1728 1729 for (i = 0; i < count; i++) 1730 { 1731 rtx elt = XVECEXP (op, 0, i); 1732 rtx newaddr; 1733 rtx addr_reg; 1734 HOST_WIDE_INT newoffset; 1735 1736 if (GET_CODE (elt) != SET 1737 || !REG_P (SET_DEST (elt)) 1738 || GET_MODE (SET_DEST (elt)) != SImode 1739 || REGNO (SET_DEST (elt)) != dest_regno + i 1740 || !MEM_P (SET_SRC (elt)) 1741 || GET_MODE (SET_SRC (elt)) != SImode) 1742 return 0; 1743 newaddr = XEXP (SET_SRC (elt), 0); 1744 if (legitimate_indirect_address_p (newaddr, 0)) 1745 { 1746 newoffset = 0; 1747 addr_reg = newaddr; 1748 } 1749 else if (rs6000_legitimate_offset_address_p (SImode, newaddr, false, false)) 1750 { 1751 addr_reg = XEXP (newaddr, 0); 1752 newoffset = INTVAL (XEXP (newaddr, 1)); 1753 } 1754 else 1755 return 0; 1756 if (REGNO (addr_reg) != base_regno 1757 || newoffset != offset + 4 * i) 1758 return 0; 1759 } 1760 1761 return 1; 1762}) 1763 1764;; Return 1 if OP is valid for stmw insn, known to be a PARALLEL. 1765(define_predicate "stmw_operation" 1766 (match_code "parallel") 1767{ 1768 int count = XVECLEN (op, 0); 1769 unsigned int src_regno; 1770 rtx dest_addr; 1771 unsigned int base_regno; 1772 HOST_WIDE_INT offset; 1773 int i; 1774 1775 /* Perform a quick check so we don't blow up below. */ 1776 if (count <= 1 1777 || GET_CODE (XVECEXP (op, 0, 0)) != SET 1778 || !MEM_P (SET_DEST (XVECEXP (op, 0, 0))) 1779 || !REG_P (SET_SRC (XVECEXP (op, 0, 0)))) 1780 return 0; 1781 1782 src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0))); 1783 dest_addr = XEXP (SET_DEST (XVECEXP (op, 0, 0)), 0); 1784 1785 if (src_regno > 31 1786 || count != 32 - (int) src_regno) 1787 return 0; 1788 1789 if (legitimate_indirect_address_p (dest_addr, 0)) 1790 { 1791 offset = 0; 1792 base_regno = REGNO (dest_addr); 1793 if (base_regno == 0) 1794 return 0; 1795 } 1796 else if (rs6000_legitimate_offset_address_p (SImode, dest_addr, false, false)) 1797 { 1798 offset = INTVAL (XEXP (dest_addr, 1)); 1799 base_regno = REGNO (XEXP (dest_addr, 0)); 1800 } 1801 else 1802 return 0; 1803 1804 for (i = 0; i < count; i++) 1805 { 1806 rtx elt = XVECEXP (op, 0, i); 1807 rtx newaddr; 1808 rtx addr_reg; 1809 HOST_WIDE_INT newoffset; 1810 1811 if (GET_CODE (elt) != SET 1812 || !REG_P (SET_SRC (elt)) 1813 || GET_MODE (SET_SRC (elt)) != SImode 1814 || REGNO (SET_SRC (elt)) != src_regno + i 1815 || !MEM_P (SET_DEST (elt)) 1816 || GET_MODE (SET_DEST (elt)) != SImode) 1817 return 0; 1818 newaddr = XEXP (SET_DEST (elt), 0); 1819 if (legitimate_indirect_address_p (newaddr, 0)) 1820 { 1821 newoffset = 0; 1822 addr_reg = newaddr; 1823 } 1824 else if (rs6000_legitimate_offset_address_p (SImode, newaddr, false, false)) 1825 { 1826 addr_reg = XEXP (newaddr, 0); 1827 newoffset = INTVAL (XEXP (newaddr, 1)); 1828 } 1829 else 1830 return 0; 1831 if (REGNO (addr_reg) != base_regno 1832 || newoffset != offset + 4 * i) 1833 return 0; 1834 } 1835 1836 return 1; 1837}) 1838 1839;; Return 1 if OP is a stack tie operand. 1840(define_predicate "tie_operand" 1841 (match_code "parallel") 1842{ 1843 return (GET_CODE (XVECEXP (op, 0, 0)) == SET 1844 && MEM_P (XEXP (XVECEXP (op, 0, 0), 0)) 1845 && GET_MODE (XEXP (XVECEXP (op, 0, 0), 0)) == BLKmode 1846 && XEXP (XVECEXP (op, 0, 0), 1) == const0_rtx); 1847}) 1848 1849;; Match a small code model toc reference (or medium and large 1850;; model toc references before reload). 1851(define_predicate "small_toc_ref" 1852 (match_code "unspec,plus") 1853{ 1854 if (GET_CODE (op) == PLUS && add_cint_operand (XEXP (op, 1), mode)) 1855 op = XEXP (op, 0); 1856 1857 return GET_CODE (op) == UNSPEC && XINT (op, 1) == UNSPEC_TOCREL; 1858}) 1859 1860 1861;; Match the first insn (addis) in fusing the combination of addis and loads to 1862;; GPR registers on power8. 1863(define_predicate "fusion_gpr_addis" 1864 (match_code "const_int,high,plus") 1865{ 1866 HOST_WIDE_INT value; 1867 rtx int_const; 1868 1869 if (GET_CODE (op) == HIGH) 1870 return 1; 1871 1872 if (CONST_INT_P (op)) 1873 int_const = op; 1874 1875 else if (GET_CODE (op) == PLUS 1876 && base_reg_operand (XEXP (op, 0), Pmode) 1877 && CONST_INT_P (XEXP (op, 1))) 1878 int_const = XEXP (op, 1); 1879 1880 else 1881 return 0; 1882 1883 value = INTVAL (int_const); 1884 if ((value & (HOST_WIDE_INT)0xffff) != 0) 1885 return 0; 1886 1887 if ((value & (HOST_WIDE_INT)0xffff0000) == 0) 1888 return 0; 1889 1890 /* Power8 only does the fusion if the top 12 bits of the addis value are all 1891 1's or 0's. */ 1892 return (IN_RANGE (value >> 16, -16, 15)); 1893}) 1894 1895;; Match the second insn (lbz, lhz, lwz, ld) in fusing the combination of addis 1896;; and loads to GPR registers on power8. 1897(define_predicate "fusion_gpr_mem_load" 1898 (match_code "mem,sign_extend,zero_extend") 1899{ 1900 rtx addr, base, offset; 1901 1902 /* Handle sign/zero extend. */ 1903 if (GET_CODE (op) == ZERO_EXTEND 1904 || (TARGET_P8_FUSION_SIGN && GET_CODE (op) == SIGN_EXTEND)) 1905 { 1906 op = XEXP (op, 0); 1907 mode = GET_MODE (op); 1908 } 1909 1910 if (!MEM_P (op)) 1911 return 0; 1912 1913 switch (mode) 1914 { 1915 case E_QImode: 1916 case E_HImode: 1917 case E_SImode: 1918 break; 1919 1920 case E_DImode: 1921 if (!TARGET_POWERPC64) 1922 return 0; 1923 break; 1924 1925 /* Do not allow SF/DFmode in GPR fusion. While the loads do occur, they 1926 are not common. */ 1927 default: 1928 return 0; 1929 } 1930 1931 addr = XEXP (op, 0); 1932 if (GET_CODE (addr) != PLUS && GET_CODE (addr) != LO_SUM) 1933 return 0; 1934 1935 base = XEXP (addr, 0); 1936 if (!base_reg_operand (base, GET_MODE (base))) 1937 return 0; 1938 1939 offset = XEXP (addr, 1); 1940 1941 if (GET_CODE (addr) == PLUS) 1942 return satisfies_constraint_I (offset); 1943 1944 else if (GET_CODE (addr) == LO_SUM) 1945 { 1946 if (TARGET_XCOFF || (TARGET_ELF && TARGET_POWERPC64)) 1947 return small_toc_ref (offset, GET_MODE (offset)); 1948 1949 else if (TARGET_ELF && !TARGET_POWERPC64) 1950 return CONSTANT_P (offset); 1951 } 1952 1953 return 0; 1954}) 1955 1956;; Match a GPR load (lbz, lhz, lwz, ld) that uses a combined address in the 1957;; memory field with both the addis and the memory offset. Sign extension 1958;; is not handled here, since lha and lwa are not fused. 1959(define_predicate "fusion_addis_mem_combo_load" 1960 (match_code "mem,zero_extend") 1961{ 1962 rtx addr, base, offset; 1963 1964 /* Handle zero extend. */ 1965 if (GET_CODE (op) == ZERO_EXTEND) 1966 { 1967 op = XEXP (op, 0); 1968 mode = GET_MODE (op); 1969 } 1970 1971 if (!MEM_P (op)) 1972 return 0; 1973 1974 switch (mode) 1975 { 1976 case E_QImode: 1977 case E_HImode: 1978 case E_SImode: 1979 break; 1980 1981 /* Do not fuse 64-bit DImode in 32-bit since it splits into two 1982 separate instructions. */ 1983 case E_DImode: 1984 if (!TARGET_POWERPC64) 1985 return 0; 1986 break; 1987 1988 /* Do not allow SF/DFmode in GPR fusion. While the loads do occur, they 1989 are not common. */ 1990 default: 1991 return 0; 1992 } 1993 1994 addr = XEXP (op, 0); 1995 if (GET_CODE (addr) != PLUS && GET_CODE (addr) != LO_SUM) 1996 return 0; 1997 1998 base = XEXP (addr, 0); 1999 if (!fusion_gpr_addis (base, GET_MODE (base))) 2000 return 0; 2001 2002 offset = XEXP (addr, 1); 2003 if (GET_CODE (addr) == PLUS) 2004 return satisfies_constraint_I (offset); 2005 2006 else if (GET_CODE (addr) == LO_SUM) 2007 { 2008 if (TARGET_XCOFF || (TARGET_ELF && TARGET_POWERPC64)) 2009 return small_toc_ref (offset, GET_MODE (offset)); 2010 2011 else if (TARGET_ELF && !TARGET_POWERPC64) 2012 return CONSTANT_P (offset); 2013 } 2014 2015 return 0; 2016}) 2017 2018 2019;; Return true if the operand is a PC-relative address of a local symbol or a 2020;; label that can be used directly in a memory operation. 2021(define_predicate "pcrel_local_address" 2022 (match_code "label_ref,symbol_ref,const") 2023{ 2024 enum insn_form iform = address_to_insn_form (op, mode, NON_PREFIXED_DEFAULT); 2025 return iform == INSN_FORM_PCREL_LOCAL; 2026}) 2027 2028;; Return true if the operand is a PC-relative external symbol whose address 2029;; can be loaded into a register. 2030(define_predicate "pcrel_external_address" 2031 (match_code "symbol_ref,const") 2032{ 2033 enum insn_form iform = address_to_insn_form (op, mode, NON_PREFIXED_DEFAULT); 2034 return iform == INSN_FORM_PCREL_EXTERNAL; 2035}) 2036 2037;; Return true if the address is PC-relative and the symbol is either local or 2038;; external. 2039(define_predicate "pcrel_local_or_external_address" 2040 (ior (match_operand 0 "pcrel_local_address") 2041 (match_operand 0 "pcrel_external_address"))) 2042 2043;; Return true if the operand is a memory address that uses a prefixed address. 2044(define_predicate "prefixed_memory" 2045 (match_code "mem") 2046{ 2047 return address_is_prefixed (XEXP (op, 0), mode, NON_PREFIXED_DEFAULT); 2048}) 2049 2050;; Return true if the operand is a valid memory operand with a D-form 2051;; address that could be merged with the load of a PC-relative external address 2052;; with the PCREL_OPT optimization. We don't check here whether or not the 2053;; offset needs to be used in a DS-FORM (bottom 2 bits 0) or DQ-FORM (bottom 4 2054;; bits 0) instruction. 2055(define_predicate "d_form_memory" 2056 (match_code "mem") 2057{ 2058 if (!memory_operand (op, mode)) 2059 return false; 2060 2061 rtx addr = XEXP (op, 0); 2062 2063 if (REG_P (addr)) 2064 return true; 2065 if (SUBREG_P (addr) && REG_P (SUBREG_REG (addr))) 2066 return true; 2067 2068 return !indexed_address (addr, mode); 2069}) 2070 2071;; Return 1 if this operand is valid as the index for vec_set. 2072(define_predicate "vec_set_index_operand" 2073 (if_then_else (match_test "TARGET_VSX") 2074 (match_operand 0 "reg_or_cint_operand") 2075 (match_operand 0 "const_int_operand"))) 2076 2077;; Return true if the operand is a valid Mach-O pic address. 2078;; 2079(define_predicate "macho_pic_address" 2080 (match_code "const,unspec") 2081{ 2082 if (GET_CODE (op) == CONST) 2083 op = XEXP (op, 0); 2084 2085 if (GET_CODE (op) == UNSPEC && XINT (op, 1) == UNSPEC_MACHOPIC_OFFSET) 2086 return CONSTANT_P (XVECEXP (op, 0, 0)); 2087 else 2088 return false; 2089}) 2090