1 ;; Predicate definitions for S/390 and zSeries. 2 ;; Copyright (C) 2005-2022 Free Software Foundation, Inc. 3 ;; Contributed by Hartmut Penner (hpenner (a] de.ibm.com) and 4 ;; Ulrich Weigand (uweigand (a] de.ibm.com). 5 ;; 6 ;; This file is part of GCC. 7 ;; 8 ;; GCC is free software; you can redistribute it and/or modify 9 ;; it under the terms of the GNU General Public License as published by 10 ;; the Free Software Foundation; either version 3, or (at your option) 11 ;; any later version. 12 ;; 13 ;; GCC is distributed in the hope that it will be useful, 14 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 15 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 ;; GNU General Public License for more details. 17 ;; 18 ;; You should have received a copy of the GNU General Public License 19 ;; along with GCC; see the file COPYING3. If not see 20 ;; <http://www.gnu.org/licenses/>. 21 22 ;; OP is the current operation. 23 ;; MODE is the current operation mode. 24 25 ;; operands -------------------------------------------------------------- 26 27 ;; Return true if OP a const 0 operand (int/float/vector). 28 (define_predicate "const0_operand" 29 (and (match_code "const_int,const_wide_int,const_double,const_vector") 30 (match_test "op == CONST0_RTX (mode)"))) 31 32 ;; Return true if OP an all ones operand (int/vector). 33 (define_predicate "all_ones_operand" 34 (and (match_code "const_int, const_wide_int, const_vector") 35 (match_test "INTEGRAL_MODE_P (GET_MODE (op))") 36 (match_test "op == CONSTM1_RTX (mode)"))) 37 38 ;; Return true if OP is a 4 bit mask operand 39 (define_predicate "const_mask_operand" 40 (and (match_code "const_int") 41 (match_test "UINTVAL (op) < 16"))) 42 43 ;; Return true if OP is constant. 44 45 (define_special_predicate "consttable_operand" 46 (and (match_code "symbol_ref, label_ref, const, const_int, const_wide_int, const_double, const_vector") 47 (match_test "CONSTANT_P (op)"))) 48 49 ; An operand used as vector permutation pattern 50 51 ; This in particular accepts constants which would otherwise be 52 ; rejected. These constants require special post reload handling 53 54 (define_special_predicate "permute_pattern_operand" 55 (and (match_code "const_vector,mem,reg,subreg") 56 (match_test "GET_MODE (op) == V16QImode") 57 (match_test "!MEM_P (op) || s390_mem_constraint (\"R\", op)"))) 58 59 ;; Return true if OP is a valid S-type operand. 60 61 (define_predicate "s_operand" 62 (and (match_code "subreg, mem") 63 (match_operand 0 "general_operand")) 64 { 65 /* Just like memory_operand, allow (subreg (mem ...)) 66 after reload. */ 67 if (reload_completed 68 && GET_CODE (op) == SUBREG 69 && GET_CODE (SUBREG_REG (op)) == MEM) 70 op = SUBREG_REG (op); 71 72 if (GET_CODE (op) != MEM) 73 return false; 74 if (!s390_legitimate_address_without_index_p (op)) 75 return false; 76 77 return true; 78 }) 79 80 ;; Return true of the address of the mem operand plus 16 is still a 81 ;; valid Q constraint address. 82 83 (define_predicate "plus16_Q_operand" 84 (and (match_code "mem") 85 (match_operand 0 "general_operand")) 86 { 87 rtx addr = XEXP (op, 0); 88 if (REG_P (addr)) 89 return true; 90 91 if (GET_CODE (addr) != PLUS 92 || !REG_P (XEXP (addr, 0)) 93 || !CONST_INT_P (XEXP (addr, 1))) 94 return false; 95 96 return SHORT_DISP_IN_RANGE (INTVAL (XEXP (addr, 1)) + 16); 97 }) 98 99 ;; Return true if OP is a valid operand for the BRAS instruction. 100 ;; Allow SYMBOL_REFs and @PLT stubs. 101 102 (define_special_predicate "bras_sym_operand" 103 (ior (and (match_code "symbol_ref") 104 (ior (match_test "!flag_pic") 105 (match_test "SYMBOL_REF_LOCAL_P (op)") 106 (and (match_test "TARGET_64BIT") 107 (match_test "SYMBOL_REF_FUNCTION_P (op)")))) 108 (and (match_code "const") 109 (and (match_test "GET_CODE (XEXP (op, 0)) == UNSPEC") 110 (match_test "XINT (XEXP (op, 0), 1) == UNSPEC_PLT31"))))) 111 112 ;; Return true if OP is a PLUS that is not a legitimate 113 ;; operand for the LA instruction. 114 115 (define_predicate "s390_plus_operand" 116 (and (match_code "plus") 117 (and (match_test "mode == Pmode") 118 (match_test "!legitimate_la_operand_p (op)")))) 119 120 ;; Return true if OP is a valid operand as scalar shift count or setmem. 121 122 (define_predicate "setmem_operand" 123 (match_code "reg, subreg, plus, const_int") 124 { 125 HOST_WIDE_INT offset; 126 rtx base; 127 128 if (GET_MODE (op) != VOIDmode 129 && GET_MODE_CLASS (GET_MODE (op)) != MODE_INT) 130 return false; 131 132 /* Extract base register and offset. */ 133 if (!s390_decompose_addrstyle_without_index (op, &base, &offset)) 134 return false; 135 136 /* Don't allow any non-base hard registers. Doing so without 137 confusing reload and/or regrename would be tricky, and doesn't 138 buy us much anyway. */ 139 if (base && REGNO (base) < FIRST_PSEUDO_REGISTER && !ADDR_REG_P (base)) 140 return false; 141 142 /* Unfortunately we have to reject constants that are invalid 143 for an address, or else reload will get confused. */ 144 if (!DISP_IN_RANGE (offset)) 145 return false; 146 147 return true; 148 }) 149 150 ; An integer operand with the lowest order 6 bits all ones. 151 (define_predicate "const_int_6bitset_operand" 152 (and (match_code "const_int") 153 (match_test "(INTVAL (op) & 63) == 63"))) 154 (define_predicate "nonzero_shift_count_operand" 155 (and (match_code "const_int") 156 (match_test "IN_RANGE (INTVAL (op), 1, GET_MODE_BITSIZE (mode) - 1)"))) 157 158 ;; Return true if OP a valid operand for the LARL instruction. 159 160 (define_predicate "larl_operand" 161 (match_code "label_ref, symbol_ref, const") 162 { 163 /* Allow labels and local symbols. */ 164 if (GET_CODE (op) == LABEL_REF) 165 return true; 166 if (SYMBOL_REF_P (op)) 167 return (!SYMBOL_FLAG_NOTALIGN2_P (op) 168 && SYMBOL_REF_TLS_MODEL (op) == 0 169 && s390_rel_address_ok_p (op)); 170 171 /* Everything else must have a CONST, so strip it. */ 172 if (GET_CODE (op) != CONST) 173 return false; 174 op = XEXP (op, 0); 175 176 /* Allow adding *even* in-range constants. */ 177 if (GET_CODE (op) == PLUS) 178 { 179 if (GET_CODE (XEXP (op, 1)) != CONST_INT 180 || (INTVAL (XEXP (op, 1)) & 1) != 0) 181 return false; 182 if (INTVAL (XEXP (op, 1)) >= HOST_WIDE_INT_1 << 31 183 || INTVAL (XEXP (op, 1)) < -(HOST_WIDE_INT_1 << 31)) 184 return false; 185 op = XEXP (op, 0); 186 } 187 188 /* Labels and local symbols allowed here as well. */ 189 if (GET_CODE (op) == LABEL_REF) 190 return true; 191 if (SYMBOL_REF_P (op)) 192 return (!SYMBOL_FLAG_NOTALIGN2_P (op) 193 && SYMBOL_REF_TLS_MODEL (op) == 0 194 && s390_rel_address_ok_p (op)); 195 196 197 /* Now we must have a @GOTENT offset or @PLT stub 198 or an @INDNTPOFF TLS offset. */ 199 if (GET_CODE (op) == UNSPEC 200 && XINT (op, 1) == UNSPEC_GOTENT) 201 return true; 202 if (GET_CODE (op) == UNSPEC 203 && XINT (op, 1) == UNSPEC_PLT31) 204 return true; 205 if (GET_CODE (op) == UNSPEC 206 && XINT (op, 1) == UNSPEC_INDNTPOFF) 207 return true; 208 209 return false; 210 }) 211 212 ; Predicate that always allows wraparound of the one-bit range. 213 (define_predicate "contiguous_bitmask_operand" 214 (match_code "const_int") 215 { 216 return s390_contiguous_bitmask_p (INTVAL (op), true, 217 GET_MODE_BITSIZE (mode), NULL, NULL); 218 }) 219 220 ; Same without wraparound. 221 (define_predicate "contiguous_bitmask_nowrap_operand" 222 (match_code "const_int") 223 { 224 return s390_contiguous_bitmask_p 225 (INTVAL (op), false, GET_MODE_BITSIZE (mode), NULL, NULL); 226 }) 227 228 ;; Return true if OP is legitimate for any LOC instruction. 229 230 (define_predicate "loc_operand" 231 (ior (match_operand 0 "nonimmediate_operand") 232 (and (match_code "const_int") 233 (match_test "INTVAL (op) <= 32767 && INTVAL (op) >= -32768")))) 234 235 (define_predicate "reload_const_wide_int_operand" 236 (and (match_code "const_wide_int") 237 (match_test "legitimate_reload_constant_p (op)"))) 238 239 240 ;; operators -------------------------------------------------------------- 241 242 ;; Return nonzero if OP is a valid comparison operator 243 ;; for a branch condition. 244 245 (define_predicate "s390_comparison" 246 (match_code "eq, ne, lt, gt, le, ge, ltu, gtu, leu, geu, 247 uneq, unlt, ungt, unle, unge, ltgt, 248 unordered, ordered") 249 { 250 if (GET_CODE (XEXP (op, 0)) != REG 251 || REGNO (XEXP (op, 0)) != CC_REGNUM 252 || (XEXP (op, 1) != const0_rtx 253 && !(CONST_INT_P (XEXP (op, 1)) 254 && GET_MODE (XEXP (op, 0)) == CCRAWmode 255 && INTVAL (XEXP (op, 1)) >= 0 256 && INTVAL (XEXP (op, 1)) <= 15))) 257 return false; 258 259 return (s390_branch_condition_mask (op) >= 0); 260 }) 261 262 ;; Return true if op is the cc register. 263 (define_predicate "cc_reg_operand" 264 (and (match_code "reg") 265 (match_test "REGNO (op) == CC_REGNUM"))) 266 267 (define_predicate "s390_signed_integer_comparison" 268 (match_code "eq, ne, lt, gt, le, ge") 269 { 270 return (s390_compare_and_branch_condition_mask (op) >= 0); 271 }) 272 273 (define_predicate "s390_unsigned_integer_comparison" 274 (match_code "eq, ne, ltu, gtu, leu, geu") 275 { 276 return (s390_compare_and_branch_condition_mask (op) >= 0); 277 }) 278 279 ;; Return nonzero if OP is a valid comparison operator for the 280 ;; cstore expanders -- respectively cstorecc4 and integer cstore. 281 (define_predicate "s390_eqne_operator" 282 (match_code "eq, ne")) 283 284 (define_predicate "s390_scond_operator" 285 (match_code "ltu, gtu, leu, geu")) 286 287 (define_predicate "s390_brx_operator" 288 (match_code "le, gt")) 289 290 ;; Return nonzero if OP is a valid comparison operator 291 ;; for an ALC condition. 292 293 (define_predicate "s390_alc_comparison" 294 (match_code "zero_extend, sign_extend, ltu, gtu, leu, geu") 295 { 296 while (GET_CODE (op) == ZERO_EXTEND || GET_CODE (op) == SIGN_EXTEND) 297 op = XEXP (op, 0); 298 299 if (!COMPARISON_P (op)) 300 return false; 301 302 if (GET_CODE (XEXP (op, 0)) != REG 303 || REGNO (XEXP (op, 0)) != CC_REGNUM 304 || (XEXP (op, 1) != const0_rtx 305 && !(CONST_INT_P (XEXP (op, 1)) 306 && GET_MODE (XEXP (op, 0)) == CCRAWmode 307 && INTVAL (XEXP (op, 1)) >= 0 308 && INTVAL (XEXP (op, 1)) <= 15))) 309 return false; 310 311 switch (GET_MODE (XEXP (op, 0))) 312 { 313 case E_CCL1mode: 314 return GET_CODE (op) == LTU; 315 316 case E_CCL2mode: 317 return GET_CODE (op) == LEU; 318 319 case E_CCL3mode: 320 return GET_CODE (op) == GEU; 321 322 case E_CCUmode: 323 return GET_CODE (op) == GTU; 324 325 case E_CCURmode: 326 return GET_CODE (op) == LTU; 327 328 case E_CCSmode: 329 return GET_CODE (op) == UNGT; 330 331 case E_CCSRmode: 332 return GET_CODE (op) == UNLT; 333 334 default: 335 return false; 336 } 337 }) 338 339 ;; Return nonzero if OP is a valid comparison operator 340 ;; for an SLB condition. 341 342 (define_predicate "s390_slb_comparison" 343 (match_code "zero_extend, sign_extend, ltu, gtu, leu, geu") 344 { 345 while (GET_CODE (op) == ZERO_EXTEND || GET_CODE (op) == SIGN_EXTEND) 346 op = XEXP (op, 0); 347 348 if (!COMPARISON_P (op)) 349 return false; 350 351 if (GET_CODE (XEXP (op, 0)) != REG 352 || REGNO (XEXP (op, 0)) != CC_REGNUM 353 || XEXP (op, 1) != const0_rtx) 354 return false; 355 356 switch (GET_MODE (XEXP (op, 0))) 357 { 358 case E_CCL1mode: 359 return GET_CODE (op) == GEU; 360 361 case E_CCL2mode: 362 return GET_CODE (op) == GTU; 363 364 case E_CCL3mode: 365 return GET_CODE (op) == LTU; 366 367 case E_CCUmode: 368 return GET_CODE (op) == LEU; 369 370 case E_CCURmode: 371 return GET_CODE (op) == GEU; 372 373 case E_CCSmode: 374 return GET_CODE (op) == LE; 375 376 case E_CCSRmode: 377 return GET_CODE (op) == GE; 378 379 default: 380 return false; 381 } 382 }) 383 384 ;; Return true if OP is a load multiple operation. It is known to be a 385 ;; PARALLEL and the first section will be tested. 386 387 (define_special_predicate "load_multiple_operation" 388 (match_code "parallel") 389 { 390 machine_mode elt_mode; 391 int count = XVECLEN (op, 0); 392 unsigned int dest_regno; 393 rtx src_addr; 394 int i, off; 395 396 /* Perform a quick check so we don't blow up below. */ 397 if (count <= 1 398 || GET_CODE (XVECEXP (op, 0, 0)) != SET 399 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG 400 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != MEM) 401 return false; 402 403 dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0))); 404 src_addr = XEXP (SET_SRC (XVECEXP (op, 0, 0)), 0); 405 elt_mode = GET_MODE (SET_DEST (XVECEXP (op, 0, 0))); 406 407 /* Check, is base, or base + displacement. */ 408 409 if (GET_CODE (src_addr) == REG) 410 off = 0; 411 else if (GET_CODE (src_addr) == PLUS 412 && GET_CODE (XEXP (src_addr, 0)) == REG 413 && GET_CODE (XEXP (src_addr, 1)) == CONST_INT) 414 { 415 off = INTVAL (XEXP (src_addr, 1)); 416 src_addr = XEXP (src_addr, 0); 417 } 418 else 419 return false; 420 421 for (i = 1; i < count; i++) 422 { 423 rtx elt = XVECEXP (op, 0, i); 424 425 if (GET_CODE (elt) != SET 426 || GET_CODE (SET_DEST (elt)) != REG 427 || GET_MODE (SET_DEST (elt)) != elt_mode 428 || REGNO (SET_DEST (elt)) != dest_regno + i 429 || GET_CODE (SET_SRC (elt)) != MEM 430 || GET_MODE (SET_SRC (elt)) != elt_mode 431 || GET_CODE (XEXP (SET_SRC (elt), 0)) != PLUS 432 || ! rtx_equal_p (XEXP (XEXP (SET_SRC (elt), 0), 0), src_addr) 433 || GET_CODE (XEXP (XEXP (SET_SRC (elt), 0), 1)) != CONST_INT 434 || INTVAL (XEXP (XEXP (SET_SRC (elt), 0), 1)) 435 != off + i * GET_MODE_SIZE (elt_mode)) 436 return false; 437 } 438 439 return true; 440 }) 441 442 ;; For an execute pattern the target instruction is embedded into the 443 ;; RTX but will not get checked for validity by recog automatically. 444 ;; The execute_operation predicate extracts the target RTX and invokes 445 ;; recog. 446 (define_special_predicate "execute_operation" 447 (match_code "parallel") 448 { 449 rtx pattern = op; 450 rtx_insn *insn; 451 int icode; 452 453 /* This is redundant but since this predicate is evaluated 454 first when recognizing the insn we can prevent the more 455 expensive code below from being executed for many cases. */ 456 if (GET_CODE (XVECEXP (pattern, 0, 0)) != UNSPEC 457 || XINT (XVECEXP (pattern, 0, 0), 1) != UNSPEC_EXECUTE) 458 return false; 459 460 /* Keep in sync with s390_execute_target. */ 461 if (XVECLEN (pattern, 0) == 2) 462 { 463 pattern = copy_rtx (XVECEXP (pattern, 0, 1)); 464 } 465 else 466 { 467 rtvec vec = rtvec_alloc (XVECLEN (pattern, 0) - 1); 468 int i; 469 470 for (i = 0; i < XVECLEN (pattern, 0) - 1; i++) 471 RTVEC_ELT (vec, i) = copy_rtx (XVECEXP (pattern, 0, i + 1)); 472 473 pattern = gen_rtx_PARALLEL (VOIDmode, vec); 474 } 475 476 /* Since we do not have the wrapping insn here we have to build one. */ 477 insn = make_insn_raw (pattern); 478 icode = recog_memoized (insn); 479 if (icode < 0) 480 return false; 481 482 extract_constrain_insn (insn); 483 484 return which_alternative >= 0; 485 }) 486 487 ;; Return true if OP is a store multiple operation. It is known to be a 488 ;; PARALLEL and the first section will be tested. 489 490 (define_special_predicate "store_multiple_operation" 491 (match_code "parallel") 492 { 493 machine_mode elt_mode; 494 int count = XVECLEN (op, 0); 495 unsigned int src_regno; 496 rtx dest_addr; 497 int i, off; 498 499 /* Perform a quick check so we don't blow up below. */ 500 if (count <= 1 501 || GET_CODE (XVECEXP (op, 0, 0)) != SET 502 || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != MEM 503 || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != REG) 504 return false; 505 506 src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0))); 507 dest_addr = XEXP (SET_DEST (XVECEXP (op, 0, 0)), 0); 508 elt_mode = GET_MODE (SET_SRC (XVECEXP (op, 0, 0))); 509 510 /* Check, is base, or base + displacement. */ 511 512 if (GET_CODE (dest_addr) == REG) 513 off = 0; 514 else if (GET_CODE (dest_addr) == PLUS 515 && GET_CODE (XEXP (dest_addr, 0)) == REG 516 && GET_CODE (XEXP (dest_addr, 1)) == CONST_INT) 517 { 518 off = INTVAL (XEXP (dest_addr, 1)); 519 dest_addr = XEXP (dest_addr, 0); 520 } 521 else 522 return false; 523 524 for (i = 1; i < count; i++) 525 { 526 rtx elt = XVECEXP (op, 0, i); 527 528 if (GET_CODE (elt) != SET 529 || GET_CODE (SET_SRC (elt)) != REG 530 || GET_MODE (SET_SRC (elt)) != elt_mode 531 || REGNO (SET_SRC (elt)) != src_regno + i 532 || GET_CODE (SET_DEST (elt)) != MEM 533 || GET_MODE (SET_DEST (elt)) != elt_mode 534 || GET_CODE (XEXP (SET_DEST (elt), 0)) != PLUS 535 || ! rtx_equal_p (XEXP (XEXP (SET_DEST (elt), 0), 0), dest_addr) 536 || GET_CODE (XEXP (XEXP (SET_DEST (elt), 0), 1)) != CONST_INT 537 || INTVAL (XEXP (XEXP (SET_DEST (elt), 0), 1)) 538 != off + i * GET_MODE_SIZE (elt_mode)) 539 return false; 540 } 541 return true; 542 }) 543 544 (define_predicate "const_shift_by_byte_operand" 545 (match_code "const_int") 546 { 547 unsigned HOST_WIDE_INT val = INTVAL (op); 548 return val <= 128 && val % 8 == 0; 549 }) 550 551 ;; Certain operations (e.g. CS) cannot access SYMBOL_REF directly, it needs to 552 ;; be loaded into some register first. In theory, if we put a SYMBOL_REF into 553 ;; a corresponding insn anyway, reload will generate a load for it, but, when 554 ;; coupled with constant propagation, this will lead to an inefficient code 555 ;; (see PR 80080). 556 557 (define_predicate "nonsym_memory_operand" 558 (match_code "mem") 559 { 560 return memory_operand (op, mode) && !contains_symbol_ref_p (op); 561 }) 562 563 ;; Check for a valid shift count operand with an implicit 564 ;; shift truncation mask of 63. 565 566 (define_predicate "shift_count_operand" 567 (and (match_code "reg, subreg, and, plus, const_int") 568 (match_test "CONST_INT_P (op) || GET_MODE (op) == E_QImode")) 569 { 570 return s390_valid_shift_count (op, 63); 571 } 572 ) 573 574 ;; This is used as operand predicate. As we do not know 575 ;; the mode of the first operand here and the shift truncation 576 ;; mask depends on the mode, we cannot check the mask. 577 ;; This is supposed to happen in the insn condition which 578 ;; calls s390_valid_shift_count with the proper mode size. 579 ;; We need two separate predicates for non-vector and vector 580 ;; shifts since the (less restrictive) insn condition is checked 581 ;; after the more restrictive operand predicate which will 582 ;; disallow the operand before we can check the condition. 583 584 (define_predicate "shift_count_operand_vec" 585 (and (match_code "reg, subreg, and, plus, const_int") 586 (match_test "CONST_INT_P (op) || GET_MODE (op) == E_QImode")) 587 { 588 return s390_valid_shift_count (op, 0); 589 } 590 ) 591 592 ; An integer constant which can be used in a signed add with overflow 593 ; pattern without being reloaded. 594 (define_predicate "addv_const_operand" 595 (and (match_code "const_int") 596 (match_test "INTVAL (op) >= -32768 && INTVAL (op) <= 32767"))) 597 598 ; Match (subreg (reg ...)) operands. 599 ; Used for movstrict destination operands 600 ; When replacing pseudos with hard regs reload strips away the 601 ; subregs. Accept also plain registers then to prevent the insn from 602 ; becoming unrecognizable. 603 (define_predicate "subreg_register_operand" 604 (ior (and (match_code "subreg") 605 (match_test "register_operand (SUBREG_REG (op), GET_MODE (SUBREG_REG (op)))")) 606 (and (match_code "reg") 607 (match_test "reload_completed || reload_in_progress") 608 (match_test "register_operand (op, GET_MODE (op))")))) 609