1169689Skan;; Predicate definitions for IA-32 and x86-64. 2169689Skan;; Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. 3169689Skan;; 4169689Skan;; This file is part of GCC. 5169689Skan;; 6169689Skan;; GCC is free software; you can redistribute it and/or modify 7169689Skan;; it under the terms of the GNU General Public License as published by 8169689Skan;; the Free Software Foundation; either version 2, or (at your option) 9169689Skan;; any later version. 10169689Skan;; 11169689Skan;; GCC is distributed in the hope that it will be useful, 12169689Skan;; but WITHOUT ANY WARRANTY; without even the implied warranty of 13169689Skan;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14169689Skan;; GNU General Public License for more details. 15169689Skan;; 16169689Skan;; You should have received a copy of the GNU General Public License 17169689Skan;; along with GCC; see the file COPYING. If not, write to 18169689Skan;; the Free Software Foundation, 51 Franklin Street, Fifth Floor, 19169689Skan;; Boston, MA 02110-1301, USA. 20169689Skan 21169689Skan;; Return nonzero if OP is either a i387 or SSE fp register. 22169689Skan(define_predicate "any_fp_register_operand" 23169689Skan (and (match_code "reg") 24169689Skan (match_test "ANY_FP_REGNO_P (REGNO (op))"))) 25169689Skan 26169689Skan;; Return nonzero if OP is an i387 fp register. 27169689Skan(define_predicate "fp_register_operand" 28169689Skan (and (match_code "reg") 29169689Skan (match_test "FP_REGNO_P (REGNO (op))"))) 30169689Skan 31169689Skan;; Return nonzero if OP is a non-fp register_operand. 32169689Skan(define_predicate "register_and_not_any_fp_reg_operand" 33169689Skan (and (match_code "reg") 34169689Skan (not (match_test "ANY_FP_REGNO_P (REGNO (op))")))) 35169689Skan 36169689Skan;; Return nonzero if OP is a register operand other than an i387 fp register. 37169689Skan(define_predicate "register_and_not_fp_reg_operand" 38169689Skan (and (match_code "reg") 39169689Skan (not (match_test "FP_REGNO_P (REGNO (op))")))) 40169689Skan 41169689Skan;; True if the operand is an MMX register. 42169689Skan(define_predicate "mmx_reg_operand" 43169689Skan (and (match_code "reg") 44169689Skan (match_test "MMX_REGNO_P (REGNO (op))"))) 45169689Skan 46169689Skan;; True if the operand is a Q_REGS class register. 47169689Skan(define_predicate "q_regs_operand" 48169689Skan (match_operand 0 "register_operand") 49169689Skan{ 50169689Skan if (GET_CODE (op) == SUBREG) 51169689Skan op = SUBREG_REG (op); 52169689Skan return ANY_QI_REG_P (op); 53169689Skan}) 54169689Skan 55169689Skan;; Return true if op is a NON_Q_REGS class register. 56169689Skan(define_predicate "non_q_regs_operand" 57169689Skan (match_operand 0 "register_operand") 58169689Skan{ 59169689Skan if (GET_CODE (op) == SUBREG) 60169689Skan op = SUBREG_REG (op); 61169689Skan return NON_QI_REG_P (op); 62169689Skan}) 63169689Skan 64169689Skan;; Match an SI or HImode register for a zero_extract. 65169689Skan(define_special_predicate "ext_register_operand" 66169689Skan (match_operand 0 "register_operand") 67169689Skan{ 68169689Skan if ((!TARGET_64BIT || GET_MODE (op) != DImode) 69169689Skan && GET_MODE (op) != SImode && GET_MODE (op) != HImode) 70169689Skan return 0; 71169689Skan if (GET_CODE (op) == SUBREG) 72169689Skan op = SUBREG_REG (op); 73169689Skan 74169689Skan /* Be careful to accept only registers having upper parts. */ 75169689Skan return REGNO (op) > LAST_VIRTUAL_REGISTER || REGNO (op) < 4; 76169689Skan}) 77169689Skan 78169689Skan;; Return true if op is the AX register. 79169689Skan(define_predicate "ax_reg_operand" 80169689Skan (and (match_code "reg") 81169689Skan (match_test "REGNO (op) == 0"))) 82169689Skan 83169689Skan;; Return true if op is the flags register. 84169689Skan(define_predicate "flags_reg_operand" 85169689Skan (and (match_code "reg") 86169689Skan (match_test "REGNO (op) == FLAGS_REG"))) 87169689Skan 88169689Skan;; Return 1 if VALUE can be stored in a sign extended immediate field. 89169689Skan(define_predicate "x86_64_immediate_operand" 90169689Skan (match_code "const_int,symbol_ref,label_ref,const") 91169689Skan{ 92169689Skan if (!TARGET_64BIT) 93169689Skan return immediate_operand (op, mode); 94169689Skan 95169689Skan switch (GET_CODE (op)) 96169689Skan { 97169689Skan case CONST_INT: 98169689Skan /* CONST_DOUBLES never match, since HOST_BITS_PER_WIDE_INT is known 99169689Skan to be at least 32 and this all acceptable constants are 100169689Skan represented as CONST_INT. */ 101169689Skan if (HOST_BITS_PER_WIDE_INT == 32) 102169689Skan return 1; 103169689Skan else 104169689Skan { 105169689Skan HOST_WIDE_INT val = trunc_int_for_mode (INTVAL (op), DImode); 106169689Skan return trunc_int_for_mode (val, SImode) == val; 107169689Skan } 108169689Skan break; 109169689Skan 110169689Skan case SYMBOL_REF: 111169689Skan /* For certain code models, the symbolic references are known to fit. 112169689Skan in CM_SMALL_PIC model we know it fits if it is local to the shared 113169689Skan library. Don't count TLS SYMBOL_REFs here, since they should fit 114169689Skan only if inside of UNSPEC handled below. */ 115169689Skan /* TLS symbols are not constant. */ 116169689Skan if (SYMBOL_REF_TLS_MODEL (op)) 117169689Skan return false; 118169689Skan return (ix86_cmodel == CM_SMALL || ix86_cmodel == CM_KERNEL 119169689Skan || (ix86_cmodel == CM_MEDIUM && !SYMBOL_REF_FAR_ADDR_P (op))); 120169689Skan 121169689Skan case LABEL_REF: 122169689Skan /* For certain code models, the code is near as well. */ 123169689Skan return (ix86_cmodel == CM_SMALL || ix86_cmodel == CM_MEDIUM 124169689Skan || ix86_cmodel == CM_KERNEL); 125169689Skan 126169689Skan case CONST: 127169689Skan /* We also may accept the offsetted memory references in certain 128169689Skan special cases. */ 129169689Skan if (GET_CODE (XEXP (op, 0)) == UNSPEC) 130169689Skan switch (XINT (XEXP (op, 0), 1)) 131169689Skan { 132169689Skan case UNSPEC_GOTPCREL: 133169689Skan case UNSPEC_DTPOFF: 134169689Skan case UNSPEC_GOTNTPOFF: 135169689Skan case UNSPEC_NTPOFF: 136169689Skan return 1; 137169689Skan default: 138169689Skan break; 139169689Skan } 140169689Skan 141169689Skan if (GET_CODE (XEXP (op, 0)) == PLUS) 142169689Skan { 143169689Skan rtx op1 = XEXP (XEXP (op, 0), 0); 144169689Skan rtx op2 = XEXP (XEXP (op, 0), 1); 145169689Skan HOST_WIDE_INT offset; 146169689Skan 147169689Skan if (ix86_cmodel == CM_LARGE) 148169689Skan return 0; 149169689Skan if (GET_CODE (op2) != CONST_INT) 150169689Skan return 0; 151169689Skan offset = trunc_int_for_mode (INTVAL (op2), DImode); 152169689Skan switch (GET_CODE (op1)) 153169689Skan { 154169689Skan case SYMBOL_REF: 155169689Skan /* TLS symbols are not constant. */ 156169689Skan if (SYMBOL_REF_TLS_MODEL (op1)) 157169689Skan return 0; 158169689Skan /* For CM_SMALL assume that latest object is 16MB before 159169689Skan end of 31bits boundary. We may also accept pretty 160169689Skan large negative constants knowing that all objects are 161169689Skan in the positive half of address space. */ 162169689Skan if ((ix86_cmodel == CM_SMALL 163169689Skan || (ix86_cmodel == CM_MEDIUM 164169689Skan && !SYMBOL_REF_FAR_ADDR_P (op1))) 165169689Skan && offset < 16*1024*1024 166169689Skan && trunc_int_for_mode (offset, SImode) == offset) 167169689Skan return 1; 168169689Skan /* For CM_KERNEL we know that all object resist in the 169169689Skan negative half of 32bits address space. We may not 170169689Skan accept negative offsets, since they may be just off 171169689Skan and we may accept pretty large positive ones. */ 172169689Skan if (ix86_cmodel == CM_KERNEL 173169689Skan && offset > 0 174169689Skan && trunc_int_for_mode (offset, SImode) == offset) 175169689Skan return 1; 176169689Skan break; 177169689Skan 178169689Skan case LABEL_REF: 179169689Skan /* These conditions are similar to SYMBOL_REF ones, just the 180169689Skan constraints for code models differ. */ 181169689Skan if ((ix86_cmodel == CM_SMALL || ix86_cmodel == CM_MEDIUM) 182169689Skan && offset < 16*1024*1024 183169689Skan && trunc_int_for_mode (offset, SImode) == offset) 184169689Skan return 1; 185169689Skan if (ix86_cmodel == CM_KERNEL 186169689Skan && offset > 0 187169689Skan && trunc_int_for_mode (offset, SImode) == offset) 188169689Skan return 1; 189169689Skan break; 190169689Skan 191169689Skan case UNSPEC: 192169689Skan switch (XINT (op1, 1)) 193169689Skan { 194169689Skan case UNSPEC_DTPOFF: 195169689Skan case UNSPEC_NTPOFF: 196169689Skan if (offset > 0 197169689Skan && trunc_int_for_mode (offset, SImode) == offset) 198169689Skan return 1; 199169689Skan } 200169689Skan break; 201169689Skan 202169689Skan default: 203169689Skan break; 204169689Skan } 205169689Skan } 206169689Skan break; 207169689Skan 208169689Skan default: 209169689Skan gcc_unreachable (); 210169689Skan } 211169689Skan 212169689Skan return 0; 213169689Skan}) 214169689Skan 215169689Skan;; Return 1 if VALUE can be stored in the zero extended immediate field. 216169689Skan(define_predicate "x86_64_zext_immediate_operand" 217169689Skan (match_code "const_double,const_int,symbol_ref,label_ref,const") 218169689Skan{ 219169689Skan switch (GET_CODE (op)) 220169689Skan { 221169689Skan case CONST_DOUBLE: 222169689Skan if (HOST_BITS_PER_WIDE_INT == 32) 223169689Skan return (GET_MODE (op) == VOIDmode && !CONST_DOUBLE_HIGH (op)); 224169689Skan else 225169689Skan return 0; 226169689Skan 227169689Skan case CONST_INT: 228169689Skan if (HOST_BITS_PER_WIDE_INT == 32) 229169689Skan return INTVAL (op) >= 0; 230169689Skan else 231169689Skan return !(INTVAL (op) & ~(HOST_WIDE_INT) 0xffffffff); 232169689Skan 233169689Skan case SYMBOL_REF: 234169689Skan /* For certain code models, the symbolic references are known to fit. */ 235169689Skan /* TLS symbols are not constant. */ 236169689Skan if (SYMBOL_REF_TLS_MODEL (op)) 237169689Skan return false; 238169689Skan return (ix86_cmodel == CM_SMALL 239169689Skan || (ix86_cmodel == CM_MEDIUM 240169689Skan && !SYMBOL_REF_FAR_ADDR_P (op))); 241169689Skan 242169689Skan case LABEL_REF: 243169689Skan /* For certain code models, the code is near as well. */ 244169689Skan return ix86_cmodel == CM_SMALL || ix86_cmodel == CM_MEDIUM; 245169689Skan 246169689Skan case CONST: 247169689Skan /* We also may accept the offsetted memory references in certain 248169689Skan special cases. */ 249169689Skan if (GET_CODE (XEXP (op, 0)) == PLUS) 250169689Skan { 251169689Skan rtx op1 = XEXP (XEXP (op, 0), 0); 252169689Skan rtx op2 = XEXP (XEXP (op, 0), 1); 253169689Skan 254169689Skan if (ix86_cmodel == CM_LARGE) 255169689Skan return 0; 256169689Skan switch (GET_CODE (op1)) 257169689Skan { 258169689Skan case SYMBOL_REF: 259169689Skan /* TLS symbols are not constant. */ 260169689Skan if (SYMBOL_REF_TLS_MODEL (op1)) 261169689Skan return 0; 262169689Skan /* For small code model we may accept pretty large positive 263169689Skan offsets, since one bit is available for free. Negative 264169689Skan offsets are limited by the size of NULL pointer area 265169689Skan specified by the ABI. */ 266169689Skan if ((ix86_cmodel == CM_SMALL 267169689Skan || (ix86_cmodel == CM_MEDIUM 268169689Skan && !SYMBOL_REF_FAR_ADDR_P (op1))) 269169689Skan && GET_CODE (op2) == CONST_INT 270169689Skan && trunc_int_for_mode (INTVAL (op2), DImode) > -0x10000 271169689Skan && trunc_int_for_mode (INTVAL (op2), SImode) == INTVAL (op2)) 272169689Skan return 1; 273169689Skan /* ??? For the kernel, we may accept adjustment of 274169689Skan -0x10000000, since we know that it will just convert 275169689Skan negative address space to positive, but perhaps this 276169689Skan is not worthwhile. */ 277169689Skan break; 278169689Skan 279169689Skan case LABEL_REF: 280169689Skan /* These conditions are similar to SYMBOL_REF ones, just the 281169689Skan constraints for code models differ. */ 282169689Skan if ((ix86_cmodel == CM_SMALL || ix86_cmodel == CM_MEDIUM) 283169689Skan && GET_CODE (op2) == CONST_INT 284169689Skan && trunc_int_for_mode (INTVAL (op2), DImode) > -0x10000 285169689Skan && trunc_int_for_mode (INTVAL (op2), SImode) == INTVAL (op2)) 286169689Skan return 1; 287169689Skan break; 288169689Skan 289169689Skan default: 290169689Skan return 0; 291169689Skan } 292169689Skan } 293169689Skan break; 294169689Skan 295169689Skan default: 296169689Skan gcc_unreachable (); 297169689Skan } 298169689Skan return 0; 299169689Skan}) 300169689Skan 301169689Skan;; Return nonzero if OP is general operand representable on x86_64. 302169689Skan(define_predicate "x86_64_general_operand" 303169689Skan (if_then_else (match_test "TARGET_64BIT") 304169689Skan (ior (match_operand 0 "nonimmediate_operand") 305169689Skan (match_operand 0 "x86_64_immediate_operand")) 306169689Skan (match_operand 0 "general_operand"))) 307169689Skan 308169689Skan;; Return nonzero if OP is general operand representable on x86_64 309169689Skan;; as either sign extended or zero extended constant. 310169689Skan(define_predicate "x86_64_szext_general_operand" 311169689Skan (if_then_else (match_test "TARGET_64BIT") 312169689Skan (ior (match_operand 0 "nonimmediate_operand") 313169689Skan (ior (match_operand 0 "x86_64_immediate_operand") 314169689Skan (match_operand 0 "x86_64_zext_immediate_operand"))) 315169689Skan (match_operand 0 "general_operand"))) 316169689Skan 317169689Skan;; Return nonzero if OP is nonmemory operand representable on x86_64. 318169689Skan(define_predicate "x86_64_nonmemory_operand" 319169689Skan (if_then_else (match_test "TARGET_64BIT") 320169689Skan (ior (match_operand 0 "register_operand") 321169689Skan (match_operand 0 "x86_64_immediate_operand")) 322169689Skan (match_operand 0 "nonmemory_operand"))) 323169689Skan 324169689Skan;; Return nonzero if OP is nonmemory operand representable on x86_64. 325169689Skan(define_predicate "x86_64_szext_nonmemory_operand" 326169689Skan (if_then_else (match_test "TARGET_64BIT") 327169689Skan (ior (match_operand 0 "register_operand") 328169689Skan (ior (match_operand 0 "x86_64_immediate_operand") 329169689Skan (match_operand 0 "x86_64_zext_immediate_operand"))) 330169689Skan (match_operand 0 "nonmemory_operand"))) 331169689Skan 332169689Skan;; Return true when operand is PIC expression that can be computed by lea 333169689Skan;; operation. 334169689Skan(define_predicate "pic_32bit_operand" 335169689Skan (match_code "const,symbol_ref,label_ref") 336169689Skan{ 337169689Skan if (!flag_pic) 338169689Skan return 0; 339169689Skan /* Rule out relocations that translate into 64bit constants. */ 340169689Skan if (TARGET_64BIT && GET_CODE (op) == CONST) 341169689Skan { 342169689Skan op = XEXP (op, 0); 343169689Skan if (GET_CODE (op) == PLUS && GET_CODE (XEXP (op, 1)) == CONST_INT) 344169689Skan op = XEXP (op, 0); 345169689Skan if (GET_CODE (op) == UNSPEC 346169689Skan && (XINT (op, 1) == UNSPEC_GOTOFF 347169689Skan || XINT (op, 1) == UNSPEC_GOT)) 348169689Skan return 0; 349169689Skan } 350169689Skan return symbolic_operand (op, mode); 351169689Skan}) 352169689Skan 353169689Skan 354169689Skan;; Return nonzero if OP is nonmemory operand acceptable by movabs patterns. 355169689Skan(define_predicate "x86_64_movabs_operand" 356169689Skan (if_then_else (match_test "!TARGET_64BIT || !flag_pic") 357169689Skan (match_operand 0 "nonmemory_operand") 358169689Skan (ior (match_operand 0 "register_operand") 359169689Skan (and (match_operand 0 "const_double_operand") 360169689Skan (match_test "GET_MODE_SIZE (mode) <= 8"))))) 361169689Skan 362169689Skan;; Returns nonzero if OP is either a symbol reference or a sum of a symbol 363169689Skan;; reference and a constant. 364169689Skan(define_predicate "symbolic_operand" 365169689Skan (match_code "symbol_ref,label_ref,const") 366169689Skan{ 367169689Skan switch (GET_CODE (op)) 368169689Skan { 369169689Skan case SYMBOL_REF: 370169689Skan case LABEL_REF: 371169689Skan return 1; 372169689Skan 373169689Skan case CONST: 374169689Skan op = XEXP (op, 0); 375169689Skan if (GET_CODE (op) == SYMBOL_REF 376169689Skan || GET_CODE (op) == LABEL_REF 377169689Skan || (GET_CODE (op) == UNSPEC 378169689Skan && (XINT (op, 1) == UNSPEC_GOT 379169689Skan || XINT (op, 1) == UNSPEC_GOTOFF 380169689Skan || XINT (op, 1) == UNSPEC_GOTPCREL))) 381169689Skan return 1; 382169689Skan if (GET_CODE (op) != PLUS 383169689Skan || GET_CODE (XEXP (op, 1)) != CONST_INT) 384169689Skan return 0; 385169689Skan 386169689Skan op = XEXP (op, 0); 387169689Skan if (GET_CODE (op) == SYMBOL_REF 388169689Skan || GET_CODE (op) == LABEL_REF) 389169689Skan return 1; 390169689Skan /* Only @GOTOFF gets offsets. */ 391169689Skan if (GET_CODE (op) != UNSPEC 392169689Skan || XINT (op, 1) != UNSPEC_GOTOFF) 393169689Skan return 0; 394169689Skan 395169689Skan op = XVECEXP (op, 0, 0); 396169689Skan if (GET_CODE (op) == SYMBOL_REF 397169689Skan || GET_CODE (op) == LABEL_REF) 398169689Skan return 1; 399169689Skan return 0; 400169689Skan 401169689Skan default: 402169689Skan gcc_unreachable (); 403169689Skan } 404169689Skan}) 405169689Skan 406169689Skan;; Return true if the operand contains a @GOT or @GOTOFF reference. 407169689Skan(define_predicate "pic_symbolic_operand" 408169689Skan (match_code "const") 409169689Skan{ 410169689Skan op = XEXP (op, 0); 411169689Skan if (TARGET_64BIT) 412169689Skan { 413169689Skan if (GET_CODE (op) == UNSPEC 414169689Skan && XINT (op, 1) == UNSPEC_GOTPCREL) 415169689Skan return 1; 416169689Skan if (GET_CODE (op) == PLUS 417169689Skan && GET_CODE (XEXP (op, 0)) == UNSPEC 418169689Skan && XINT (XEXP (op, 0), 1) == UNSPEC_GOTPCREL) 419169689Skan return 1; 420169689Skan } 421169689Skan else 422169689Skan { 423169689Skan if (GET_CODE (op) == UNSPEC) 424169689Skan return 1; 425169689Skan if (GET_CODE (op) != PLUS 426169689Skan || GET_CODE (XEXP (op, 1)) != CONST_INT) 427169689Skan return 0; 428169689Skan op = XEXP (op, 0); 429169689Skan if (GET_CODE (op) == UNSPEC) 430169689Skan return 1; 431169689Skan } 432169689Skan return 0; 433169689Skan}) 434169689Skan 435169689Skan;; Return true if OP is a symbolic operand that resolves locally. 436169689Skan(define_predicate "local_symbolic_operand" 437169689Skan (match_code "const,label_ref,symbol_ref") 438169689Skan{ 439169689Skan if (GET_CODE (op) == CONST 440169689Skan && GET_CODE (XEXP (op, 0)) == PLUS 441169689Skan && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT) 442169689Skan op = XEXP (XEXP (op, 0), 0); 443169689Skan 444169689Skan if (GET_CODE (op) == LABEL_REF) 445169689Skan return 1; 446169689Skan 447169689Skan if (GET_CODE (op) != SYMBOL_REF) 448169689Skan return 0; 449169689Skan 450169689Skan if (SYMBOL_REF_TLS_MODEL (op) != 0) 451169689Skan return 0; 452169689Skan 453169689Skan if (SYMBOL_REF_LOCAL_P (op)) 454169689Skan return 1; 455169689Skan 456169689Skan /* There is, however, a not insubstantial body of code in the rest of 457169689Skan the compiler that assumes it can just stick the results of 458169689Skan ASM_GENERATE_INTERNAL_LABEL in a symbol_ref and have done. */ 459169689Skan /* ??? This is a hack. Should update the body of the compiler to 460169689Skan always create a DECL an invoke targetm.encode_section_info. */ 461169689Skan if (strncmp (XSTR (op, 0), internal_label_prefix, 462169689Skan internal_label_prefix_len) == 0) 463169689Skan return 1; 464169689Skan 465169689Skan return 0; 466169689Skan}) 467169689Skan 468169689Skan;; Test for various thread-local symbols. 469169689Skan(define_predicate "tls_symbolic_operand" 470169689Skan (and (match_code "symbol_ref") 471169689Skan (match_test "SYMBOL_REF_TLS_MODEL (op) != 0"))) 472169689Skan 473169689Skan(define_predicate "tls_modbase_operand" 474169689Skan (and (match_code "symbol_ref") 475169689Skan (match_test "op == ix86_tls_module_base ()"))) 476169689Skan 477169689Skan(define_predicate "tp_or_register_operand" 478169689Skan (ior (match_operand 0 "register_operand") 479169689Skan (and (match_code "unspec") 480169689Skan (match_test "XINT (op, 1) == UNSPEC_TP")))) 481169689Skan 482169689Skan;; Test for a pc-relative call operand 483169689Skan(define_predicate "constant_call_address_operand" 484169689Skan (ior (match_code "symbol_ref") 485169689Skan (match_operand 0 "local_symbolic_operand"))) 486169689Skan 487169689Skan;; True for any non-virtual or eliminable register. Used in places where 488169689Skan;; instantiation of such a register may cause the pattern to not be recognized. 489169689Skan(define_predicate "register_no_elim_operand" 490169689Skan (match_operand 0 "register_operand") 491169689Skan{ 492169689Skan if (GET_CODE (op) == SUBREG) 493169689Skan op = SUBREG_REG (op); 494169689Skan return !(op == arg_pointer_rtx 495169689Skan || op == frame_pointer_rtx 496169689Skan || (REGNO (op) >= FIRST_PSEUDO_REGISTER 497169689Skan && REGNO (op) <= LAST_VIRTUAL_REGISTER)); 498169689Skan}) 499169689Skan 500169689Skan;; Similarly, but include the stack pointer. This is used to prevent esp 501169689Skan;; from being used as an index reg. 502169689Skan(define_predicate "index_register_operand" 503169689Skan (match_operand 0 "register_operand") 504169689Skan{ 505169689Skan if (GET_CODE (op) == SUBREG) 506169689Skan op = SUBREG_REG (op); 507169689Skan if (reload_in_progress || reload_completed) 508169689Skan return REG_OK_FOR_INDEX_STRICT_P (op); 509169689Skan else 510169689Skan return REG_OK_FOR_INDEX_NONSTRICT_P (op); 511169689Skan}) 512169689Skan 513169689Skan;; Return false if this is any eliminable register. Otherwise general_operand. 514169689Skan(define_predicate "general_no_elim_operand" 515169689Skan (if_then_else (match_code "reg,subreg") 516169689Skan (match_operand 0 "register_no_elim_operand") 517169689Skan (match_operand 0 "general_operand"))) 518169689Skan 519169689Skan;; Return false if this is any eliminable register. Otherwise 520169689Skan;; register_operand or a constant. 521169689Skan(define_predicate "nonmemory_no_elim_operand" 522169689Skan (ior (match_operand 0 "register_no_elim_operand") 523169689Skan (match_operand 0 "immediate_operand"))) 524169689Skan 525169689Skan;; Test for a valid operand for a call instruction. 526169689Skan(define_predicate "call_insn_operand" 527169689Skan (ior (match_operand 0 "constant_call_address_operand") 528169689Skan (ior (match_operand 0 "register_no_elim_operand") 529169689Skan (match_operand 0 "memory_operand")))) 530169689Skan 531169689Skan;; Similarly, but for tail calls, in which we cannot allow memory references. 532169689Skan(define_predicate "sibcall_insn_operand" 533169689Skan (ior (match_operand 0 "constant_call_address_operand") 534169689Skan (match_operand 0 "register_no_elim_operand"))) 535169689Skan 536169689Skan;; Match exactly zero. 537169689Skan(define_predicate "const0_operand" 538169689Skan (match_code "const_int,const_double,const_vector") 539169689Skan{ 540169689Skan if (mode == VOIDmode) 541169689Skan mode = GET_MODE (op); 542169689Skan return op == CONST0_RTX (mode); 543169689Skan}) 544169689Skan 545169689Skan;; Match exactly one. 546169689Skan(define_predicate "const1_operand" 547169689Skan (and (match_code "const_int") 548169689Skan (match_test "op == const1_rtx"))) 549169689Skan 550169689Skan;; Match exactly eight. 551169689Skan(define_predicate "const8_operand" 552169689Skan (and (match_code "const_int") 553169689Skan (match_test "INTVAL (op) == 8"))) 554169689Skan 555169689Skan;; Match 2, 4, or 8. Used for leal multiplicands. 556169689Skan(define_predicate "const248_operand" 557169689Skan (match_code "const_int") 558169689Skan{ 559169689Skan HOST_WIDE_INT i = INTVAL (op); 560169689Skan return i == 2 || i == 4 || i == 8; 561169689Skan}) 562169689Skan 563169689Skan;; Match 0 or 1. 564169689Skan(define_predicate "const_0_to_1_operand" 565169689Skan (and (match_code "const_int") 566169689Skan (match_test "op == const0_rtx || op == const1_rtx"))) 567169689Skan 568169689Skan;; Match 0 to 3. 569169689Skan(define_predicate "const_0_to_3_operand" 570169689Skan (and (match_code "const_int") 571169689Skan (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 3"))) 572169689Skan 573169689Skan;; Match 0 to 7. 574169689Skan(define_predicate "const_0_to_7_operand" 575169689Skan (and (match_code "const_int") 576169689Skan (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 7"))) 577169689Skan 578169689Skan;; Match 0 to 15. 579169689Skan(define_predicate "const_0_to_15_operand" 580169689Skan (and (match_code "const_int") 581169689Skan (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 15"))) 582169689Skan 583169689Skan;; Match 0 to 63. 584169689Skan(define_predicate "const_0_to_63_operand" 585169689Skan (and (match_code "const_int") 586169689Skan (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 63"))) 587169689Skan 588169689Skan;; Match 0 to 255. 589169689Skan(define_predicate "const_0_to_255_operand" 590169689Skan (and (match_code "const_int") 591169689Skan (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 255"))) 592169689Skan 593169689Skan;; Match (0 to 255) * 8 594169689Skan(define_predicate "const_0_to_255_mul_8_operand" 595169689Skan (match_code "const_int") 596169689Skan{ 597169689Skan unsigned HOST_WIDE_INT val = INTVAL (op); 598169689Skan return val <= 255*8 && val % 8 == 0; 599169689Skan}) 600169689Skan 601169689Skan;; Return nonzero if OP is CONST_INT >= 1 and <= 31 (a valid operand 602169689Skan;; for shift & compare patterns, as shifting by 0 does not change flags). 603169689Skan(define_predicate "const_1_to_31_operand" 604169689Skan (and (match_code "const_int") 605169689Skan (match_test "INTVAL (op) >= 1 && INTVAL (op) <= 31"))) 606169689Skan 607169689Skan;; Match 2 or 3. 608169689Skan(define_predicate "const_2_to_3_operand" 609169689Skan (and (match_code "const_int") 610169689Skan (match_test "INTVAL (op) == 2 || INTVAL (op) == 3"))) 611169689Skan 612169689Skan;; Match 4 to 7. 613169689Skan(define_predicate "const_4_to_7_operand" 614169689Skan (and (match_code "const_int") 615169689Skan (match_test "INTVAL (op) >= 4 && INTVAL (op) <= 7"))) 616169689Skan 617169689Skan;; Match exactly one bit in 4-bit mask. 618169689Skan(define_predicate "const_pow2_1_to_8_operand" 619169689Skan (match_code "const_int") 620169689Skan{ 621169689Skan unsigned int log = exact_log2 (INTVAL (op)); 622169689Skan return log <= 3; 623169689Skan}) 624169689Skan 625169689Skan;; Match exactly one bit in 8-bit mask. 626169689Skan(define_predicate "const_pow2_1_to_128_operand" 627169689Skan (match_code "const_int") 628169689Skan{ 629169689Skan unsigned int log = exact_log2 (INTVAL (op)); 630169689Skan return log <= 7; 631169689Skan}) 632169689Skan 633169689Skan;; True if this is a constant appropriate for an increment or decrement. 634169689Skan(define_predicate "incdec_operand" 635169689Skan (match_code "const_int") 636169689Skan{ 637169689Skan /* On Pentium4, the inc and dec operations causes extra dependency on flag 638169689Skan registers, since carry flag is not set. */ 639169689Skan if (!TARGET_USE_INCDEC && !optimize_size) 640169689Skan return 0; 641169689Skan return op == const1_rtx || op == constm1_rtx; 642169689Skan}) 643169689Skan 644169689Skan;; True for registers, or 1 or -1. Used to optimize double-word shifts. 645169689Skan(define_predicate "reg_or_pm1_operand" 646169689Skan (ior (match_operand 0 "register_operand") 647169689Skan (and (match_code "const_int") 648169689Skan (match_test "op == const1_rtx || op == constm1_rtx")))) 649169689Skan 650169689Skan;; True if OP is acceptable as operand of DImode shift expander. 651169689Skan(define_predicate "shiftdi_operand" 652169689Skan (if_then_else (match_test "TARGET_64BIT") 653169689Skan (match_operand 0 "nonimmediate_operand") 654169689Skan (match_operand 0 "register_operand"))) 655169689Skan 656169689Skan(define_predicate "ashldi_input_operand" 657169689Skan (if_then_else (match_test "TARGET_64BIT") 658169689Skan (match_operand 0 "nonimmediate_operand") 659169689Skan (match_operand 0 "reg_or_pm1_operand"))) 660169689Skan 661169689Skan;; Return true if OP is a vector load from the constant pool with just 662169689Skan;; the first element nonzero. 663169689Skan(define_predicate "zero_extended_scalar_load_operand" 664169689Skan (match_code "mem") 665169689Skan{ 666169689Skan unsigned n_elts; 667169689Skan op = maybe_get_pool_constant (op); 668169689Skan if (!op) 669169689Skan return 0; 670169689Skan if (GET_CODE (op) != CONST_VECTOR) 671169689Skan return 0; 672169689Skan n_elts = 673169689Skan (GET_MODE_SIZE (GET_MODE (op)) / 674169689Skan GET_MODE_SIZE (GET_MODE_INNER (GET_MODE (op)))); 675169689Skan for (n_elts--; n_elts > 0; n_elts--) 676169689Skan { 677169689Skan rtx elt = CONST_VECTOR_ELT (op, n_elts); 678169689Skan if (elt != CONST0_RTX (GET_MODE_INNER (GET_MODE (op)))) 679169689Skan return 0; 680169689Skan } 681169689Skan return 1; 682169689Skan}) 683169689Skan 684169689Skan/* Return true if operand is a vector constant that is all ones. */ 685169689Skan(define_predicate "vector_all_ones_operand" 686169689Skan (match_code "const_vector") 687169689Skan{ 688169689Skan int nunits = GET_MODE_NUNITS (mode); 689169689Skan 690169689Skan if (GET_CODE (op) == CONST_VECTOR 691169689Skan && CONST_VECTOR_NUNITS (op) == nunits) 692169689Skan { 693169689Skan int i; 694169689Skan for (i = 0; i < nunits; ++i) 695169689Skan { 696169689Skan rtx x = CONST_VECTOR_ELT (op, i); 697169689Skan if (x != constm1_rtx) 698169689Skan return 0; 699169689Skan } 700169689Skan return 1; 701169689Skan } 702169689Skan 703169689Skan return 0; 704169689Skan}) 705169689Skan 706169689Skan; Return 1 when OP is operand acceptable for standard SSE move. 707169689Skan(define_predicate "vector_move_operand" 708169689Skan (ior (match_operand 0 "nonimmediate_operand") 709169689Skan (match_operand 0 "const0_operand"))) 710169689Skan 711169689Skan;; Return 1 when OP is nonimmediate or standard SSE constant. 712169689Skan(define_predicate "nonimmediate_or_sse_const_operand" 713169689Skan (match_operand 0 "general_operand") 714169689Skan{ 715169689Skan if (nonimmediate_operand (op, mode)) 716169689Skan return 1; 717169689Skan if (standard_sse_constant_p (op) > 0) 718169689Skan return 1; 719169689Skan return 0; 720169689Skan}) 721169689Skan 722169689Skan;; Return true if OP is a register or a zero. 723169689Skan(define_predicate "reg_or_0_operand" 724169689Skan (ior (match_operand 0 "register_operand") 725169689Skan (match_operand 0 "const0_operand"))) 726169689Skan 727169689Skan;; Return true if op if a valid address, and does not contain 728169689Skan;; a segment override. 729169689Skan(define_special_predicate "no_seg_address_operand" 730169689Skan (match_operand 0 "address_operand") 731169689Skan{ 732169689Skan struct ix86_address parts; 733169689Skan int ok; 734169689Skan 735169689Skan ok = ix86_decompose_address (op, &parts); 736169689Skan gcc_assert (ok); 737169689Skan return parts.seg == SEG_DEFAULT; 738169689Skan}) 739169689Skan 740169689Skan;; Return nonzero if the rtx is known to be at least 32 bits aligned. 741169689Skan(define_predicate "aligned_operand" 742169689Skan (match_operand 0 "general_operand") 743169689Skan{ 744169689Skan struct ix86_address parts; 745169689Skan int ok; 746169689Skan 747169689Skan /* Registers and immediate operands are always "aligned". */ 748169689Skan if (GET_CODE (op) != MEM) 749169689Skan return 1; 750169689Skan 751169689Skan /* All patterns using aligned_operand on memory operands ends up 752169689Skan in promoting memory operand to 64bit and thus causing memory mismatch. */ 753169689Skan if (TARGET_MEMORY_MISMATCH_STALL && !optimize_size) 754169689Skan return 0; 755169689Skan 756169689Skan /* Don't even try to do any aligned optimizations with volatiles. */ 757169689Skan if (MEM_VOLATILE_P (op)) 758169689Skan return 0; 759169689Skan 760169689Skan if (MEM_ALIGN (op) >= 32) 761169689Skan return 1; 762169689Skan 763169689Skan op = XEXP (op, 0); 764169689Skan 765169689Skan /* Pushes and pops are only valid on the stack pointer. */ 766169689Skan if (GET_CODE (op) == PRE_DEC 767169689Skan || GET_CODE (op) == POST_INC) 768169689Skan return 1; 769169689Skan 770169689Skan /* Decode the address. */ 771169689Skan ok = ix86_decompose_address (op, &parts); 772169689Skan gcc_assert (ok); 773169689Skan 774169689Skan /* Look for some component that isn't known to be aligned. */ 775169689Skan if (parts.index) 776169689Skan { 777169689Skan if (REGNO_POINTER_ALIGN (REGNO (parts.index)) * parts.scale < 32) 778169689Skan return 0; 779169689Skan } 780169689Skan if (parts.base) 781169689Skan { 782169689Skan if (REGNO_POINTER_ALIGN (REGNO (parts.base)) < 32) 783169689Skan return 0; 784169689Skan } 785169689Skan if (parts.disp) 786169689Skan { 787169689Skan if (GET_CODE (parts.disp) != CONST_INT 788169689Skan || (INTVAL (parts.disp) & 3) != 0) 789169689Skan return 0; 790169689Skan } 791169689Skan 792169689Skan /* Didn't find one -- this must be an aligned address. */ 793169689Skan return 1; 794169689Skan}) 795169689Skan 796169689Skan;; Returns 1 if OP is memory operand with a displacement. 797169689Skan(define_predicate "memory_displacement_operand" 798169689Skan (match_operand 0 "memory_operand") 799169689Skan{ 800169689Skan struct ix86_address parts; 801169689Skan int ok; 802169689Skan 803169689Skan ok = ix86_decompose_address (XEXP (op, 0), &parts); 804169689Skan gcc_assert (ok); 805169689Skan return parts.disp != NULL_RTX; 806169689Skan}) 807169689Skan 808169689Skan;; Returns 1 if OP is memory operand with a displacement only. 809169689Skan(define_predicate "memory_displacement_only_operand" 810169689Skan (match_operand 0 "memory_operand") 811169689Skan{ 812169689Skan struct ix86_address parts; 813169689Skan int ok; 814169689Skan 815169689Skan ok = ix86_decompose_address (XEXP (op, 0), &parts); 816169689Skan gcc_assert (ok); 817169689Skan 818169689Skan if (parts.base || parts.index) 819169689Skan return 0; 820169689Skan 821169689Skan return parts.disp != NULL_RTX; 822169689Skan}) 823169689Skan 824169689Skan;; Returns 1 if OP is memory operand that cannot be represented 825169689Skan;; by the modRM array. 826169689Skan(define_predicate "long_memory_operand" 827169689Skan (and (match_operand 0 "memory_operand") 828169689Skan (match_test "memory_address_length (op) != 0"))) 829169689Skan 830169689Skan;; Return 1 if OP is a comparison operator that can be issued by fcmov. 831169689Skan(define_predicate "fcmov_comparison_operator" 832169689Skan (match_operand 0 "comparison_operator") 833169689Skan{ 834169689Skan enum machine_mode inmode = GET_MODE (XEXP (op, 0)); 835169689Skan enum rtx_code code = GET_CODE (op); 836169689Skan 837169689Skan if (inmode == CCFPmode || inmode == CCFPUmode) 838169689Skan { 839169689Skan enum rtx_code second_code, bypass_code; 840169689Skan ix86_fp_comparison_codes (code, &bypass_code, &code, &second_code); 841169689Skan if (bypass_code != UNKNOWN || second_code != UNKNOWN) 842169689Skan return 0; 843169689Skan code = ix86_fp_compare_code_to_integer (code); 844169689Skan } 845169689Skan /* i387 supports just limited amount of conditional codes. */ 846169689Skan switch (code) 847169689Skan { 848169689Skan case LTU: case GTU: case LEU: case GEU: 849169689Skan if (inmode == CCmode || inmode == CCFPmode || inmode == CCFPUmode) 850169689Skan return 1; 851169689Skan return 0; 852169689Skan case ORDERED: case UNORDERED: 853169689Skan case EQ: case NE: 854169689Skan return 1; 855169689Skan default: 856169689Skan return 0; 857169689Skan } 858169689Skan}) 859169689Skan 860169689Skan;; Return 1 if OP is a comparison that can be used in the CMPSS/CMPPS insns. 861169689Skan;; The first set are supported directly; the second set can't be done with 862169689Skan;; full IEEE support, i.e. NaNs. 863169689Skan;; 864169689Skan;; ??? It would seem that we have a lot of uses of this predicate that pass 865169689Skan;; it the wrong mode. We got away with this because the old function didn't 866169689Skan;; check the mode at all. Mirror that for now by calling this a special 867169689Skan;; predicate. 868169689Skan 869169689Skan(define_special_predicate "sse_comparison_operator" 870169689Skan (match_code "eq,lt,le,unordered,ne,unge,ungt,ordered")) 871169689Skan 872169689Skan;; Return 1 if OP is a valid comparison operator in valid mode. 873169689Skan(define_predicate "ix86_comparison_operator" 874169689Skan (match_operand 0 "comparison_operator") 875169689Skan{ 876169689Skan enum machine_mode inmode = GET_MODE (XEXP (op, 0)); 877169689Skan enum rtx_code code = GET_CODE (op); 878169689Skan 879169689Skan if (inmode == CCFPmode || inmode == CCFPUmode) 880169689Skan { 881169689Skan enum rtx_code second_code, bypass_code; 882169689Skan ix86_fp_comparison_codes (code, &bypass_code, &code, &second_code); 883169689Skan return (bypass_code == UNKNOWN && second_code == UNKNOWN); 884169689Skan } 885169689Skan switch (code) 886169689Skan { 887169689Skan case EQ: case NE: 888169689Skan return 1; 889169689Skan case LT: case GE: 890169689Skan if (inmode == CCmode || inmode == CCGCmode 891169689Skan || inmode == CCGOCmode || inmode == CCNOmode) 892169689Skan return 1; 893169689Skan return 0; 894169689Skan case LTU: case GTU: case LEU: case ORDERED: case UNORDERED: case GEU: 895169689Skan if (inmode == CCmode) 896169689Skan return 1; 897169689Skan return 0; 898169689Skan case GT: case LE: 899169689Skan if (inmode == CCmode || inmode == CCGCmode || inmode == CCNOmode) 900169689Skan return 1; 901169689Skan return 0; 902169689Skan default: 903169689Skan return 0; 904169689Skan } 905169689Skan}) 906169689Skan 907169689Skan;; Return 1 if OP is a valid comparison operator testing carry flag to be set. 908169689Skan(define_predicate "ix86_carry_flag_operator" 909169689Skan (match_code "ltu,lt,unlt,gt,ungt,le,unle,ge,unge,ltgt,uneq") 910169689Skan{ 911169689Skan enum machine_mode inmode = GET_MODE (XEXP (op, 0)); 912169689Skan enum rtx_code code = GET_CODE (op); 913169689Skan 914169689Skan if (GET_CODE (XEXP (op, 0)) != REG 915169689Skan || REGNO (XEXP (op, 0)) != FLAGS_REG 916169689Skan || XEXP (op, 1) != const0_rtx) 917169689Skan return 0; 918169689Skan 919169689Skan if (inmode == CCFPmode || inmode == CCFPUmode) 920169689Skan { 921169689Skan enum rtx_code second_code, bypass_code; 922169689Skan ix86_fp_comparison_codes (code, &bypass_code, &code, &second_code); 923169689Skan if (bypass_code != UNKNOWN || second_code != UNKNOWN) 924169689Skan return 0; 925169689Skan code = ix86_fp_compare_code_to_integer (code); 926169689Skan } 927169689Skan else if (inmode != CCmode) 928169689Skan return 0; 929169689Skan 930169689Skan return code == LTU; 931169689Skan}) 932169689Skan 933169689Skan;; Nearly general operand, but accept any const_double, since we wish 934169689Skan;; to be able to drop them into memory rather than have them get pulled 935169689Skan;; into registers. 936169689Skan(define_predicate "cmp_fp_expander_operand" 937169689Skan (ior (match_code "const_double") 938169689Skan (match_operand 0 "general_operand"))) 939169689Skan 940169689Skan;; Return true if this is a valid binary floating-point operation. 941169689Skan(define_predicate "binary_fp_operator" 942169689Skan (match_code "plus,minus,mult,div")) 943169689Skan 944169689Skan;; Return true if this is a multiply operation. 945169689Skan(define_predicate "mult_operator" 946169689Skan (match_code "mult")) 947169689Skan 948169689Skan;; Return true if this is a division operation. 949169689Skan(define_predicate "div_operator" 950169689Skan (match_code "div")) 951169689Skan 952169689Skan;; Return true if this is a float extend operation. 953169689Skan(define_predicate "float_operator" 954169689Skan (match_code "float")) 955169689Skan 956169689Skan;; Return true for ARITHMETIC_P. 957169689Skan(define_predicate "arith_or_logical_operator" 958169689Skan (match_code "plus,mult,and,ior,xor,smin,smax,umin,umax,compare,minus,div, 959169689Skan mod,udiv,umod,ashift,rotate,ashiftrt,lshiftrt,rotatert")) 960169689Skan 961169689Skan;; Return 1 if OP is a binary operator that can be promoted to wider mode. 962169689Skan;; Modern CPUs have same latency for HImode and SImode multiply, 963169689Skan;; but 386 and 486 do HImode multiply faster. */ 964169689Skan(define_predicate "promotable_binary_operator" 965169689Skan (ior (match_code "plus,and,ior,xor,ashift") 966169689Skan (and (match_code "mult") 967169689Skan (match_test "ix86_tune > PROCESSOR_I486")))) 968169689Skan 969169689Skan;; To avoid problems when jump re-emits comparisons like testqi_ext_ccno_0, 970169689Skan;; re-recognize the operand to avoid a copy_to_mode_reg that will fail. 971169689Skan;; 972169689Skan;; ??? It seems likely that this will only work because cmpsi is an 973169689Skan;; expander, and no actual insns use this. 974169689Skan 975169689Skan(define_predicate "cmpsi_operand" 976169689Skan (ior (match_operand 0 "nonimmediate_operand") 977169689Skan (and (match_code "and") 978169689Skan (match_code "zero_extract" "0") 979169689Skan (match_code "const_int" "1") 980169689Skan (match_code "const_int" "01") 981169689Skan (match_code "const_int" "02") 982169689Skan (match_test "INTVAL (XEXP (XEXP (op, 0), 1)) == 8") 983169689Skan (match_test "INTVAL (XEXP (XEXP (op, 0), 2)) == 8") 984169689Skan ))) 985169689Skan 986169689Skan(define_predicate "compare_operator" 987169689Skan (match_code "compare")) 988169689Skan 989169689Skan(define_predicate "absneg_operator" 990169689Skan (match_code "abs,neg")) 991