📄 predicates.md
字号:
{ /* Only pre dec allowed. */ if (GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == POST_INC) return 0; if (mode == DImode && TARGET_SHMEDIA && GET_CODE (op) == SUBREG && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) < 8 && ! (high_life_started || reload_completed)) return 0; return general_operand (op, mode);});; Returns 1 if OP is a MEM that can be source of a simple move operation.(define_predicate "unaligned_load_operand" (match_code "mem"){ rtx inside; if (GET_CODE (op) != MEM || GET_MODE (op) != mode) return 0; inside = XEXP (op, 0); if (GET_CODE (inside) == POST_INC) inside = XEXP (inside, 0); if (GET_CODE (inside) == REG) return 1; return 0;});; TODO: Add a comment here.(define_predicate "greater_comparison_operator" (match_code "gt,ge,gtu,geu"){ if (mode != VOIDmode && GET_MODE (op) != mode) return 0; switch (GET_CODE (op)) { case GT: case GE: case GTU: case GEU: return 1; default: return 0; }});; TODO: Add a comment here.(define_predicate "inqhi_operand" (match_code "truncate"){ if (GET_CODE (op) != TRUNCATE || mode != GET_MODE (op)) return 0; op = XEXP (op, 0); /* Can't use true_regnum here because copy_cost wants to know about SECONDARY_INPUT_RELOAD_CLASS. */ return GET_CODE (op) == REG && FP_REGISTER_P (REGNO (op));});; TODO: Add a comment here.(define_special_predicate "int_gpr_dest" (match_code "subreg,reg"){ enum machine_mode op_mode = GET_MODE (op); if (GET_MODE_CLASS (op_mode) != MODE_INT || GET_MODE_SIZE (op_mode) >= UNITS_PER_WORD) return 0; if (! reload_completed) return 0; return true_regnum (op) <= LAST_GENERAL_REG;});; TODO: Add a comment here.(define_predicate "less_comparison_operator" (match_code "lt,le,ltu,leu"){ if (mode != VOIDmode && GET_MODE (op) != mode) return 0; switch (GET_CODE (op)) { case LT: case LE: case LTU: case LEU: return 1; default: return 0; }});; Returns 1 if OP is a valid source operand for a logical operation.(define_predicate "logical_operand" (match_code "subreg,reg,const_int"){ if (TARGET_SHMEDIA && mode != DImode && GET_CODE (op) == SUBREG && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4) return 0; if (arith_reg_operand (op, mode)) return 1; if (TARGET_SHMEDIA) { if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_I10 (INTVAL (op))) return 1; else return 0; } else if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_K08 (INTVAL (op))) return 1; return 0;});; TODO: Add a comment here.(define_predicate "logical_operator" (match_code "and,ior,xor"){ if (mode != VOIDmode && GET_MODE (op) != mode) return 0; switch (GET_CODE (op)) { case AND: case IOR: case XOR: return 1; default: return 0; }});; Like arith_reg_operand, but for register source operands of narrow;; logical SHMEDIA operations: forbid subregs of DImode / TImode regs.(define_predicate "logical_reg_operand" (match_code "subreg,reg"){ if (TARGET_SHMEDIA && GET_CODE (op) == SUBREG && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4 && mode != DImode) return 0; return arith_reg_operand (op, mode);});; TODO: Add a comment here.(define_predicate "mextr_bit_offset" (match_code "const_int"){ HOST_WIDE_INT i; if (GET_CODE (op) != CONST_INT) return 0; i = INTVAL (op); return i >= 1 * 8 && i <= 7 * 8 && (i & 7) == 0;});; TODO: Add a comment here.(define_predicate "minuend_operand" (match_code "subreg,reg,truncate,const_int"){ return op == constm1_rtx || extend_reg_or_0_operand (op, mode);});; TODO: Add a comment here.(define_predicate "noncommutative_float_operator" (match_code "minus,div"){ if (GET_MODE (op) != mode) return 0; switch (GET_CODE (op)) { case MINUS: case DIV: return 1; default: break; } return 0;});; TODO: Add a comment here.(define_predicate "sh_const_vec" (match_code "const_vector"){ int i; if (GET_CODE (op) != CONST_VECTOR || (GET_MODE (op) != mode && mode != VOIDmode)) return 0; i = XVECLEN (op, 0) - 1; for (; i >= 0; i--) if (GET_CODE (XVECEXP (op, 0, i)) != CONST_INT) return 0; return 1;});; Determine if OP is a constant vector matching MODE with only one;; element that is not a sign extension. Two byte-sized elements;; count as one.(define_predicate "sh_1el_vec" (match_code "const_vector"){ int unit_size; int i, last, least, sign_ix; rtx sign; if (GET_CODE (op) != CONST_VECTOR || (GET_MODE (op) != mode && mode != VOIDmode)) return 0; /* Determine numbers of last and of least significant elements. */ last = XVECLEN (op, 0) - 1; least = TARGET_LITTLE_ENDIAN ? 0 : last; if (GET_CODE (XVECEXP (op, 0, least)) != CONST_INT) return 0; sign_ix = least; if (GET_MODE_UNIT_SIZE (mode) == 1) sign_ix = TARGET_LITTLE_ENDIAN ? 1 : last - 1; if (GET_CODE (XVECEXP (op, 0, sign_ix)) != CONST_INT) return 0; unit_size = GET_MODE_UNIT_SIZE (GET_MODE (op)); sign = (INTVAL (XVECEXP (op, 0, sign_ix)) >> (unit_size * BITS_PER_UNIT - 1) ? constm1_rtx : const0_rtx); i = XVECLEN (op, 0) - 1; do if (i != least && i != sign_ix && XVECEXP (op, 0, i) != sign) return 0; while (--i); return 1;});; Like register_operand, but take into account that SHMEDIA can use;; the constant zero like a general register.(define_predicate "sh_register_operand" (match_code "reg,subreg,const_int"){ if (op == CONST0_RTX (mode) && TARGET_SHMEDIA) return 1; return register_operand (op, mode);});; TODO: Add a comment here.(define_predicate "sh_rep_vec" (match_code "const_vector"){ int i; rtx x, y; if ((GET_CODE (op) != CONST_VECTOR && GET_CODE (op) != PARALLEL) || (GET_MODE (op) != mode && mode != VOIDmode)) return 0; i = XVECLEN (op, 0) - 2; x = XVECEXP (op, 0, i + 1); if (GET_MODE_UNIT_SIZE (mode) == 1) { y = XVECEXP (op, 0, i); for (i -= 2; i >= 0; i -= 2) if (! rtx_equal_p (XVECEXP (op, 0, i + 1), x) || ! rtx_equal_p (XVECEXP (op, 0, i), y)) return 0; } else for (; i >= 0; i--) if (XVECEXP (op, 0, i) != x) return 0; return 1;});; TODO: Add a comment here.(define_predicate "shift_count_operand" (match_code "const_int,const_double,const,symbol_ref,label_ref,subreg,reg,zero_extend,sign_extend"){ return (CONSTANT_P (op) ? (GET_CODE (op) == CONST_INT ? (unsigned) INTVAL (op) < GET_MODE_BITSIZE (mode) : nonmemory_operand (op, mode)) : shift_count_reg_operand (op, mode));});; TODO: Add a comment here.(define_predicate "shift_count_reg_operand" (match_code "subreg,reg,zero_extend,sign_extend"){ if ((GET_CODE (op) == ZERO_EXTEND || GET_CODE (op) == SIGN_EXTEND || (GET_CODE (op) == SUBREG && SUBREG_BYTE (op) == 0)) && (mode == VOIDmode || mode == GET_MODE (op)) && GET_MODE_BITSIZE (GET_MODE (XEXP (op, 0))) >= 6 && GET_MODE_CLASS (GET_MODE (XEXP (op, 0))) == MODE_INT) { mode = VOIDmode; do op = XEXP (op, 0); while ((GET_CODE (op) == ZERO_EXTEND || GET_CODE (op) == SIGN_EXTEND || GET_CODE (op) == TRUNCATE) && GET_MODE_BITSIZE (GET_MODE (XEXP (op, 0))) >= 6 && GET_MODE_CLASS (GET_MODE (XEXP (op, 0))) == MODE_INT); } return arith_reg_operand (op, mode);});; TODO: Add a comment here.(define_predicate "shift_operator" (match_code "ashift,ashiftrt,lshiftrt"){ if (mode != VOIDmode && GET_MODE (op) != mode) return 0; switch (GET_CODE (op)) { case ASHIFT: case ASHIFTRT: case LSHIFTRT: return 1; default: return 0; }});; TODO: Add a comment here.(define_predicate "symbol_ref_operand" (match_code "symbol_ref"){ return (GET_CODE (op) == SYMBOL_REF);});; Same as target_reg_operand, except that label_refs and symbol_refs;; are accepted before reload.(define_special_predicate "target_operand" (match_code "subreg,reg,label_ref,symbol_ref,const,unspec"){ if (mode != VOIDmode && mode != Pmode) return 0; if ((GET_MODE (op) == Pmode || GET_MODE (op) == VOIDmode) && EXTRA_CONSTRAINT_Csy (op)) return ! reload_completed; return target_reg_operand (op, mode);});; Accept pseudos and branch target registers.(define_special_predicate "target_reg_operand" (match_code "subreg,reg"){ if (mode == VOIDmode ? GET_MODE (op) != Pmode && GET_MODE (op) != PDImode : mode != GET_MODE (op)) return 0; if (GET_CODE (op) == SUBREG) op = XEXP (op, 0); if (GET_CODE (op) != REG) return 0; /* We must protect ourselves from matching pseudos that are virtual register, because they will eventually be replaced with hardware registers that aren't branch-target registers. */ if (REGNO (op) > LAST_VIRTUAL_REGISTER || TARGET_REGISTER_P (REGNO (op))) return 1; return 0;});; TODO: Add a comment here.(define_special_predicate "trunc_hi_operand" (match_code "subreg,reg,truncate"){ enum machine_mode op_mode = GET_MODE (op); if (op_mode != SImode && op_mode != DImode && op_mode != V4HImode && op_mode != V2SImode) return 0; return extend_reg_operand (op, mode);});; TODO: Add a comment here.(define_predicate "ua_address_operand" (match_code "subreg,reg,plus"){ if (GET_CODE (op) == PLUS && (GET_CODE (XEXP (op, 1)) != CONST_INT || ! CONST_OK_FOR_I06 (INTVAL (XEXP (op, 1))))) return 0; return address_operand (op, QImode);});; TODO: Add a comment here.(define_predicate "ua_offset" (match_code "const_int"){ return GET_CODE (op) == CONST_INT && CONST_OK_FOR_I06 (INTVAL (op));});; TODO: Add a comment here.(define_predicate "unary_float_operator" (match_code "abs,neg,sqrt"){ if (GET_MODE (op) != mode) return 0; switch (GET_CODE (op)) { case ABS: case NEG: case SQRT: return 1; default: break; } return 0;});; Return 1 if OP is a valid source operand for xor.(define_predicate "xor_operand" (match_code "subreg,reg,const_int"){ if (GET_CODE (op) == CONST_INT) return (TARGET_SHMEDIA ? (CONST_OK_FOR_I06 (INTVAL (op)) || (no_new_pseudos && INTVAL (op) == 0xff)) : CONST_OK_FOR_K08 (INTVAL (op))); if (TARGET_SHMEDIA && mode != DImode && GET_CODE (op) == SUBREG && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4) return 0; return arith_reg_operand (op, mode);})
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -