📄 alpha.c
字号:
{ if (alpha_fprm == ALPHA_FPRM_MINF || alpha_fprm == ALPHA_FPRM_DYN) { warning ("rounding mode not supported for VAX floats"); alpha_fprm = ALPHA_FPRM_NORM; } if (alpha_fptm == ALPHA_FPTM_SUI) { warning ("trap mode not supported for VAX floats"); alpha_fptm = ALPHA_FPTM_SU; } if (target_flags_explicit & MASK_LONG_DOUBLE_128) warning ("128-bit long double not supported for VAX floats"); target_flags &= ~MASK_LONG_DOUBLE_128; } { char *end; int lat; if (!alpha_mlat_string) alpha_mlat_string = "L1"; if (ISDIGIT ((unsigned char)alpha_mlat_string[0]) && (lat = strtol (alpha_mlat_string, &end, 10), *end == '\0')) ; else if ((alpha_mlat_string[0] == 'L' || alpha_mlat_string[0] == 'l') && ISDIGIT ((unsigned char)alpha_mlat_string[1]) && alpha_mlat_string[2] == '\0') { static int const cache_latency[][4] = { { 3, 30, -1 }, /* ev4 -- Bcache is a guess */ { 2, 12, 38 }, /* ev5 -- Bcache from PC164 LMbench numbers */ { 3, 12, 30 }, /* ev6 -- Bcache from DS20 LMbench. */ }; lat = alpha_mlat_string[1] - '0'; if (lat <= 0 || lat > 3 || cache_latency[alpha_cpu][lat-1] == -1) { warning ("L%d cache latency unknown for %s", lat, alpha_cpu_name[alpha_cpu]); lat = 3; } else lat = cache_latency[alpha_cpu][lat-1]; } else if (! strcmp (alpha_mlat_string, "main")) { /* Most current memories have about 370ns latency. This is a reasonable guess for a fast cpu. */ lat = 150; } else { warning ("bad value `%s' for -mmemory-latency", alpha_mlat_string); lat = 3; } alpha_memory_latency = lat; } /* Default the definition of "small data" to 8 bytes. */ if (!g_switch_set) g_switch_value = 8; /* Infer TARGET_SMALL_DATA from -fpic/-fPIC. */ if (flag_pic == 1) target_flags |= MASK_SMALL_DATA; else if (flag_pic == 2) target_flags &= ~MASK_SMALL_DATA; /* Align labels and loops for optimal branching. */ /* ??? Kludge these by not doing anything if we don't optimize and also if we are writing ECOFF symbols to work around a bug in DEC's assembler. */ if (optimize > 0 && write_symbols != SDB_DEBUG) { if (align_loops <= 0) align_loops = 16; if (align_jumps <= 0) align_jumps = 16; } if (align_functions <= 0) align_functions = 16; /* Acquire a unique set number for our register saves and restores. */ alpha_sr_alias_set = new_alias_set (); /* Register variables and functions with the garbage collector. */ /* Set up function hooks. */ init_machine_status = alpha_init_machine_status; /* Tell the compiler when we're using VAX floating point. */ if (TARGET_FLOAT_VAX) { real_format_for_mode[SFmode - QFmode] = &vax_f_format; real_format_for_mode[DFmode - QFmode] = &vax_g_format; real_format_for_mode[TFmode - QFmode] = NULL; }}/* Returns 1 if VALUE is a mask that contains full bytes of zero or ones. */intzap_mask (value) HOST_WIDE_INT value;{ int i; for (i = 0; i < HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR; i++, value >>= 8) if ((value & 0xff) != 0 && (value & 0xff) != 0xff) return 0; return 1;}/* Returns 1 if OP is either the constant zero or a register. If a register, it must be in the proper mode unless MODE is VOIDmode. */intreg_or_0_operand (op, mode) register rtx op; enum machine_mode mode;{ return op == CONST0_RTX (mode) || register_operand (op, mode);}/* Return 1 if OP is a constant in the range of 0-63 (for a shift) or any register. */intreg_or_6bit_operand (op, mode) register rtx op; enum machine_mode mode;{ return ((GET_CODE (op) == CONST_INT && (unsigned HOST_WIDE_INT) INTVAL (op) < 64) || register_operand (op, mode));}/* Return 1 if OP is an 8-bit constant or any register. */intreg_or_8bit_operand (op, mode) register rtx op; enum machine_mode mode;{ return ((GET_CODE (op) == CONST_INT && (unsigned HOST_WIDE_INT) INTVAL (op) < 0x100) || register_operand (op, mode));}/* Return 1 if OP is a constant or any register. */intreg_or_const_int_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 an 8-bit constant. */intcint8_operand (op, mode) register rtx op; enum machine_mode mode ATTRIBUTE_UNUSED;{ return ((GET_CODE (op) == CONST_INT && (unsigned HOST_WIDE_INT) INTVAL (op) < 0x100));}/* Return 1 if the operand is a valid second operand to an add insn. */intadd_operand (op, mode) register rtx op; enum machine_mode mode;{ if (GET_CODE (op) == CONST_INT) /* Constraints I, J, O and P are covered by K. */ return (CONST_OK_FOR_LETTER_P (INTVAL (op), 'K') || CONST_OK_FOR_LETTER_P (INTVAL (op), 'L')); return register_operand (op, mode);}/* Return 1 if the operand is a valid second operand to a sign-extending add insn. */intsext_add_operand (op, mode) register rtx op; enum machine_mode mode;{ if (GET_CODE (op) == CONST_INT) return (CONST_OK_FOR_LETTER_P (INTVAL (op), 'I') || CONST_OK_FOR_LETTER_P (INTVAL (op), 'O')); return reg_not_elim_operand (op, mode);}/* Return 1 if OP is the constant 4 or 8. */intconst48_operand (op, mode) register rtx op; enum machine_mode mode ATTRIBUTE_UNUSED;{ return (GET_CODE (op) == CONST_INT && (INTVAL (op) == 4 || INTVAL (op) == 8));}/* Return 1 if OP is a valid first operand to an AND insn. */intand_operand (op, mode) register rtx op; enum machine_mode mode;{ if (GET_CODE (op) == CONST_DOUBLE && GET_MODE (op) == VOIDmode) return (zap_mask (CONST_DOUBLE_LOW (op)) && zap_mask (CONST_DOUBLE_HIGH (op))); if (GET_CODE (op) == CONST_INT) return ((unsigned HOST_WIDE_INT) INTVAL (op) < 0x100 || (unsigned HOST_WIDE_INT) ~ INTVAL (op) < 0x100 || zap_mask (INTVAL (op))); return register_operand (op, mode);}/* Return 1 if OP is a valid first operand to an IOR or XOR insn. */intor_operand (op, mode) register rtx op; enum machine_mode mode;{ if (GET_CODE (op) == CONST_INT) return ((unsigned HOST_WIDE_INT) INTVAL (op) < 0x100 || (unsigned HOST_WIDE_INT) ~ INTVAL (op) < 0x100); return register_operand (op, mode);}/* Return 1 if OP is a constant that is the width, in bits, of an integral mode smaller than DImode. */intmode_width_operand (op, mode) register rtx op; enum machine_mode mode ATTRIBUTE_UNUSED;{ return (GET_CODE (op) == CONST_INT && (INTVAL (op) == 8 || INTVAL (op) == 16 || INTVAL (op) == 32 || INTVAL (op) == 64));}/* Return 1 if OP is a constant that is the width of an integral machine mode smaller than an integer. */intmode_mask_operand (op, mode) register rtx op; enum machine_mode mode ATTRIBUTE_UNUSED;{ if (GET_CODE (op) == CONST_INT) { HOST_WIDE_INT value = INTVAL (op); if (value == 0xff) return 1; if (value == 0xffff) return 1; if (value == 0xffffffff) return 1; if (value == -1) return 1; } else if (HOST_BITS_PER_WIDE_INT == 32 && GET_CODE (op) == CONST_DOUBLE) { if (CONST_DOUBLE_LOW (op) == 0xffffffff && CONST_DOUBLE_HIGH (op) == 0) return 1; } return 0;}/* 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 zero constant for MODE. */intconst0_operand (op, mode) register rtx op; enum machine_mode mode;{ return op == CONST0_RTX (mode);}/* Return 1 if OP is a hard floating-point register. */inthard_fp_register_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_CODE (op) == SUBREG) op = SUBREG_REG (op); return GET_CODE (op) == REG && REGNO_REG_CLASS (REGNO (op)) == FLOAT_REGS;}/* Return 1 if OP is a hard general register. */inthard_int_register_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_CODE (op) == SUBREG) op = SUBREG_REG (op); return GET_CODE (op) == REG && REGNO_REG_CLASS (REGNO (op)) == GENERAL_REGS;}/* 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_INT: case CONST_DOUBLE: case CONST_VECTOR: case LABEL_REF: case SYMBOL_REF: case CONST: case HIGH: return 1; case SUBREG: return some_operand (SUBREG_REG (op), VOIDmode); default: break; } return 0;}/* Likewise, but don't accept constants. */intsome_ni_operand (op, mode) register rtx op; enum machine_mode mode;{ if (GET_MODE (op) != mode && mode != VOIDmode) return 0; if (GET_CODE (op) == SUBREG) op = SUBREG_REG (op); return (GET_CODE (op) == REG || GET_CODE (op) == MEM);}/* 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: if (TARGET_EXPLICIT_RELOCS) { /* We don't split symbolic operands into something unintelligable until after reload, but we do not wish non-small, non-global symbolic operands to be reconstructed from their high/lo_sum form. */ return (small_symbolic_operand (op, mode) || global_symbolic_operand (op, mode) || gotdtp_symbolic_operand (op, mode) || gottp_symbolic_operand (op, mode)); } /* This handles both the Windows/NT and OSF cases. */ return mode == ptr_mode || mode == DImode; case HIGH: return (TARGET_EXPLICIT_RELOCS && local_symbolic_operand (XEXP (op, 0), mode)); case REG: case ADDRESSOF: 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: case CONST_VECTOR: return 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, and in the same section as the current function. */intcurrent_file_function_operand (op, mode) rtx op; enum machine_mode mode ATTRIBUTE_UNUSED;{ if (GET_CODE (op) != SYMBOL_REF) return 0; /* Easy test for recursion. */ if (op == XEXP (DECL_RTL (current_function_decl), 0)) return 1; /* Otherwise, we need the DECL for the SYMBOL_REF, which we can't get. So SYMBOL_REF_FLAG has been declared to imply that the function is in the default text section. So we must also check that the current function is also in the text section. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -