📄 alpha.c
字号:
#if HOST_BITS_PER_WIDE_INT == 64 || INTVAL (op) == -1#endif ));}/* Return 1 if OP is a multiple of 8 less than 64. */intmul8_operand (op, mode) register rtx op; enum machine_mode mode ATTRIBUTE_UNUSED;{ return (GET_CODE (op) == CONST_INT && (unsigned HOST_WIDE_INT) INTVAL (op) < 64 && (INTVAL (op) & 7) == 0);}/* Return 1 if OP is the constant zero in floating-point. */intfp0_operand (op, mode) register rtx op; enum machine_mode mode;{ return (GET_MODE (op) == mode && GET_MODE_CLASS (mode) == MODE_FLOAT && op == CONST0_RTX (mode));}/* Return 1 if OP is the floating-point constant zero or a register. */intreg_or_fp0_operand (op, mode) register rtx op; enum machine_mode mode;{ return fp0_operand (op, mode) || register_operand (op, mode);}/* Return 1 if OP is a hard floating-point register. */inthard_fp_register_operand (op, mode) register rtx op; enum machine_mode mode;{ return ((GET_CODE (op) == REG && REGNO_REG_CLASS (REGNO (op)) == FLOAT_REGS) || (GET_CODE (op) == SUBREG && hard_fp_register_operand (SUBREG_REG (op), mode)));}/* Return 1 if OP is a register or a constant integer. */intreg_or_cint_operand (op, mode) register rtx op; enum machine_mode mode;{ return (GET_CODE (op) == CONST_INT || register_operand (op, mode));}/* Return 1 if OP is something that can be reloaded into a register; if it is a MEM, it need not be valid. */intsome_operand (op, mode) register rtx op; enum machine_mode mode;{ if (mode != VOIDmode && GET_MODE (op) != VOIDmode && mode != GET_MODE (op)) return 0; switch (GET_CODE (op)) { case REG: case MEM: case CONST_DOUBLE: case CONST_INT: case LABEL_REF: case SYMBOL_REF: case CONST: return 1; case SUBREG: return some_operand (SUBREG_REG (op), VOIDmode); default: break; } return 0;}/* Return 1 if OP is a valid operand for the source of a move insn. */intinput_operand (op, mode) register rtx op; enum machine_mode mode;{ if (mode != VOIDmode && GET_MODE (op) != VOIDmode && mode != GET_MODE (op)) return 0; if (GET_MODE_CLASS (mode) == MODE_FLOAT && GET_MODE (op) != mode) return 0; switch (GET_CODE (op)) { case LABEL_REF: case SYMBOL_REF: case CONST: /* This handles both the Windows/NT and OSF cases. */ return mode == ptr_mode || mode == DImode; case REG: return 1; case SUBREG: if (register_operand (op, mode)) return 1; /* ... fall through ... */ case MEM: return ((TARGET_BWX || (mode != HImode && mode != QImode)) && general_operand (op, mode)); case CONST_DOUBLE: return GET_MODE_CLASS (mode) == MODE_FLOAT && op == CONST0_RTX (mode); case CONST_INT: return mode == QImode || mode == HImode || add_operand (op, mode); case CONSTANT_P_RTX: return 1; default: break; } return 0;}/* Return 1 if OP is a SYMBOL_REF for a function known to be in this file. */intcurrent_file_function_operand (op, mode) rtx op; enum machine_mode mode ATTRIBUTE_UNUSED;{ return (GET_CODE (op) == SYMBOL_REF && ! profile_flag && ! profile_block_flag && (SYMBOL_REF_FLAG (op) || op == XEXP (DECL_RTL (current_function_decl), 0)));}/* Return 1 if OP is a valid operand for the MEM of a CALL insn. */intcall_operand (op, mode) rtx op; enum machine_mode mode;{ if (mode != Pmode) return 0; return (GET_CODE (op) == SYMBOL_REF || (GET_CODE (op) == REG && (TARGET_OPEN_VMS || TARGET_WINDOWS_NT || REGNO (op) == 27)));}/* Return 1 if OP is a valid Alpha comparison operator. Here we know which comparisons are valid in which insn. */intalpha_comparison_operator (op, mode) register rtx op; enum machine_mode mode;{ enum rtx_code code = GET_CODE (op); if (mode != GET_MODE (op) || GET_RTX_CLASS (code) != '<') return 0; return (code == EQ || code == LE || code == LT || (mode == DImode && (code == LEU || code == LTU)));}/* Return 1 if OP is a valid Alpha swapped comparison operator. */intalpha_swapped_comparison_operator (op, mode) register rtx op; enum machine_mode mode;{ enum rtx_code code = GET_CODE (op); if (mode != GET_MODE (op) || GET_RTX_CLASS (code) != '<') return 0; code = swap_condition (code); return (code == EQ || code == LE || code == LT || (mode == DImode && (code == LEU || code == LTU)));}/* Return 1 if OP is a signed comparison operation. */intsigned_comparison_operator (op, mode) register rtx op; enum machine_mode mode ATTRIBUTE_UNUSED;{ switch (GET_CODE (op)) { case EQ: case NE: case LE: case LT: case GE: case GT: return 1; default: break; } return 0;}/* Return 1 if this is a divide or modulus operator. */intdivmod_operator (op, mode) register rtx op; enum machine_mode mode ATTRIBUTE_UNUSED;{ switch (GET_CODE (op)) { case DIV: case MOD: case UDIV: case UMOD: return 1; default: break; } return 0;}/* Return 1 if this memory address is a known aligned register plus a constant. It must be a valid address. This means that we can do this as an aligned reference plus some offset. Take into account what reload will do. */intaligned_memory_operand (op, mode) register rtx op; enum machine_mode mode;{ rtx base; if (reload_in_progress) { rtx tmp = op; if (GET_CODE (tmp) == SUBREG) tmp = SUBREG_REG (tmp); if (GET_CODE (tmp) == REG && REGNO (tmp) >= FIRST_PSEUDO_REGISTER) { op = reg_equiv_memory_loc[REGNO (tmp)]; if (op == 0) return 0; } } if (GET_CODE (op) != MEM || GET_MODE (op) != mode) return 0; op = XEXP (op, 0); /* LEGITIMIZE_RELOAD_ADDRESS creates (plus (plus reg const_hi) const_lo) sorts of constructs. Dig for the real base register. */ if (reload_in_progress && GET_CODE (op) == PLUS && GET_CODE (XEXP (op, 0)) == PLUS) base = XEXP (XEXP (op, 0), 0); else { if (! memory_address_p (mode, op)) return 0; base = (GET_CODE (op) == PLUS ? XEXP (op, 0) : op); } return (GET_CODE (base) == REG && REGNO_POINTER_ALIGN (REGNO (base)) >= 4);}/* Similar, but return 1 if OP is a MEM which is not alignable. */intunaligned_memory_operand (op, mode) register rtx op; enum machine_mode mode;{ rtx base; if (reload_in_progress) { rtx tmp = op; if (GET_CODE (tmp) == SUBREG) tmp = SUBREG_REG (tmp); if (GET_CODE (tmp) == REG && REGNO (tmp) >= FIRST_PSEUDO_REGISTER) { op = reg_equiv_memory_loc[REGNO (tmp)]; if (op == 0) return 0; } } if (GET_CODE (op) != MEM || GET_MODE (op) != mode) return 0; op = XEXP (op, 0); /* LEGITIMIZE_RELOAD_ADDRESS creates (plus (plus reg const_hi) const_lo) sorts of constructs. Dig for the real base register. */ if (reload_in_progress && GET_CODE (op) == PLUS && GET_CODE (XEXP (op, 0)) == PLUS) base = XEXP (XEXP (op, 0), 0); else { if (! memory_address_p (mode, op)) return 0; base = (GET_CODE (op) == PLUS ? XEXP (op, 0) : op); } return (GET_CODE (base) == REG && REGNO_POINTER_ALIGN (REGNO (base)) < 4);}/* Return 1 if OP is either a register or an unaligned memory location. */intreg_or_unaligned_mem_operand (op, mode) rtx op; enum machine_mode mode;{ return register_operand (op, mode) || unaligned_memory_operand (op, mode);}/* Return 1 if OP is any memory location. During reload a pseudo matches. */intany_memory_operand (op, mode) register rtx op; enum machine_mode mode ATTRIBUTE_UNUSED;{ return (GET_CODE (op) == MEM || (GET_CODE (op) == SUBREG && GET_CODE (SUBREG_REG (op)) == REG) || (reload_in_progress && GET_CODE (op) == REG && REGNO (op) >= FIRST_PSEUDO_REGISTER) || (reload_in_progress && GET_CODE (op) == SUBREG && GET_CODE (SUBREG_REG (op)) == REG && REGNO (SUBREG_REG (op)) >= FIRST_PSEUDO_REGISTER));}/* Returns 1 if OP is not an eliminable register. This exists to cure a pathological abort in the s8addq (et al) patterns, long foo () { long t; bar(); return (long) &t * 26107; } which run afoul of a hack in reload to cure a (presumably) similar problem with lea-type instructions on other targets. But there is one of us and many of them, so work around the problem by selectively preventing combine from making the optimization. */intreg_not_elim_operand (op, mode) register rtx op; enum machine_mode mode;{ rtx inner = op; if (GET_CODE (op) == SUBREG) inner = SUBREG_REG (op); if (inner == frame_pointer_rtx || inner == arg_pointer_rtx) return 0; return register_operand (op, mode);}/* Return 1 is OP is a memory location that is not a reference (using an AND) to an unaligned location. Take into account what reload will do. */intnormal_memory_operand (op, mode) register rtx op; enum machine_mode mode ATTRIBUTE_UNUSED;{ if (reload_in_progress) { rtx tmp = op; if (GET_CODE (tmp) == SUBREG) tmp = SUBREG_REG (tmp); if (GET_CODE (tmp) == REG && REGNO (tmp) >= FIRST_PSEUDO_REGISTER) { op = reg_equiv_memory_loc[REGNO (tmp)]; /* This may not have been assigned an equivalent address if it will be eliminated. In that case, it doesn't matter what we do. */ if (op == 0) return 1; } } return GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) != AND;}/* Accept a register, but not a subreg of any kind. This allows us to avoid pathological cases in reload wrt data movement common in int->fp conversion. */intreg_no_subreg_operand (op, mode) register rtx op; enum machine_mode mode;{ if (GET_CODE (op) == SUBREG) return 0; return register_operand (op, mode);}/* Return 1 if this function can directly return via $26. */intdirect_return (){ return (! TARGET_OPEN_VMS && reload_completed && alpha_sa_size () == 0 && get_frame_size () == 0 && current_function_outgoing_args_size == 0 && current_function_pretend_args_size == 0);}/* REF is an alignable memory location. Place an aligned SImode reference into *PALIGNED_MEM and the number of bits to shift into *PBITNUM. SCRATCH is a free register for use in reloading out of range stack slots. */voidget_aligned_mem (ref, paligned_mem, pbitnum) rtx ref; rtx *paligned_mem, *pbitnum;{ rtx base; HOST_WIDE_INT offset = 0; if (GET_CODE (ref) != MEM) abort (); if (reload_in_progress && ! memory_address_p (GET_MODE (ref), XEXP (ref, 0))) { base = find_replacement (&XEXP (ref, 0)); if (! memory_address_p (GET_MODE (ref), base)) abort (); } else { base = XEXP (ref, 0); } if (GET_CODE (base) == PLUS) offset += INTVAL (XEXP (base, 1)), base = XEXP (base, 0); *paligned_mem = gen_rtx_MEM (SImode, plus_constant (base, offset & ~3)); MEM_COPY_ATTRIBUTES (*paligned_mem, ref); RTX_UNCHANGING_P (*paligned_mem) = RTX_UNCHANGING_P (ref); /* Sadly, we cannot use alias sets here because we may overlap other data in a different alias set. */ /* MEM_ALIAS_SET (*paligned_mem) = MEM_ALIAS_SET (ref); */ *pbitnum = GEN_INT ((offset & 3) * 8);}/* Similar, but just get the address. Handle the two reload cases. Add EXTRA_OFFSET to the address we return. */rtxget_unaligned_address (ref, extra_offset) rtx ref;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -