📄 rs6000.c
字号:
#ifdef TARGET_REGNAMESstatic const char alt_reg_names[][8] ={ "%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23", "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31", "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7", "%f8", "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15", "%f16", "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23", "%f24", "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31", "mq", "lr", "ctr", "ap", "%cr0", "%cr1", "%cr2", "%cr3", "%cr4", "%cr5", "%cr6", "%cr7", "xer", /* AltiVec registers. */ "%v0", "%v1", "%v2", "%v3", "%v4", "%v5", "%v6", "%v7", "%v8", "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15", "%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23", "%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31", "vrsave", "vscr", /* SPE registers. */ "spe_acc", "spefscr", /* Soft frame pointer. */ "sfp"};#endif#ifndef MASK_STRICT_ALIGN#define MASK_STRICT_ALIGN 0#endif#ifndef TARGET_PROFILE_KERNEL#define TARGET_PROFILE_KERNEL 0#endif/* The VRSAVE bitmask puts bit %v0 as the most significant bit. */#define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))/* Initialize the GCC target structure. */#undef TARGET_ATTRIBUTE_TABLE#define TARGET_ATTRIBUTE_TABLE rs6000_attribute_table#undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES#define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES rs6000_set_default_type_attributes#undef TARGET_ASM_ALIGNED_DI_OP#define TARGET_ASM_ALIGNED_DI_OP DOUBLE_INT_ASM_OP/* Default unaligned ops are only provided for ELF. Find the ops needed for non-ELF systems. */#ifndef OBJECT_FORMAT_ELF#if TARGET_XCOFF/* For XCOFF. rs6000_assemble_integer will handle unaligned DIs on 64-bit targets. */#undef TARGET_ASM_UNALIGNED_HI_OP#define TARGET_ASM_UNALIGNED_HI_OP "\t.vbyte\t2,"#undef TARGET_ASM_UNALIGNED_SI_OP#define TARGET_ASM_UNALIGNED_SI_OP "\t.vbyte\t4,"#undef TARGET_ASM_UNALIGNED_DI_OP#define TARGET_ASM_UNALIGNED_DI_OP "\t.vbyte\t8,"#else/* For Darwin. */#undef TARGET_ASM_UNALIGNED_HI_OP#define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"#undef TARGET_ASM_UNALIGNED_SI_OP#define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"#undef TARGET_ASM_UNALIGNED_DI_OP#define TARGET_ASM_UNALIGNED_DI_OP "\t.quad\t"#undef TARGET_ASM_ALIGNED_DI_OP#define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"#endif#endif/* This hook deals with fixups for relocatable code and DI-mode objects in 64-bit code. */#undef TARGET_ASM_INTEGER#define TARGET_ASM_INTEGER rs6000_assemble_integer#ifdef HAVE_GAS_HIDDEN#undef TARGET_ASM_ASSEMBLE_VISIBILITY#define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility#endif#undef TARGET_HAVE_TLS#define TARGET_HAVE_TLS HAVE_AS_TLS#undef TARGET_CANNOT_FORCE_CONST_MEM#define TARGET_CANNOT_FORCE_CONST_MEM rs6000_tls_referenced_p#undef TARGET_ASM_FUNCTION_PROLOGUE#define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue#undef TARGET_ASM_FUNCTION_EPILOGUE#define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue#undef TARGET_SCHED_VARIABLE_ISSUE#define TARGET_SCHED_VARIABLE_ISSUE rs6000_variable_issue#undef TARGET_SCHED_ISSUE_RATE#define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate#undef TARGET_SCHED_ADJUST_COST#define TARGET_SCHED_ADJUST_COST rs6000_adjust_cost#undef TARGET_SCHED_ADJUST_PRIORITY#define TARGET_SCHED_ADJUST_PRIORITY rs6000_adjust_priority#undef TARGET_SCHED_IS_COSTLY_DEPENDENCE#define TARGET_SCHED_IS_COSTLY_DEPENDENCE rs6000_is_costly_dependence#undef TARGET_SCHED_FINISH#define TARGET_SCHED_FINISH rs6000_sched_finish#undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD#define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD rs6000_use_sched_lookahead#undef TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD#define TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD rs6000_builtin_mask_for_load#undef TARGET_INIT_BUILTINS#define TARGET_INIT_BUILTINS rs6000_init_builtins#undef TARGET_EXPAND_BUILTIN#define TARGET_EXPAND_BUILTIN rs6000_expand_builtin#undef TARGET_MANGLE_FUNDAMENTAL_TYPE#define TARGET_MANGLE_FUNDAMENTAL_TYPE rs6000_mangle_fundamental_type#undef TARGET_INIT_LIBFUNCS#define TARGET_INIT_LIBFUNCS rs6000_init_libfuncs#if TARGET_MACHO#undef TARGET_BINDS_LOCAL_P#define TARGET_BINDS_LOCAL_P darwin_binds_local_p#endif#undef TARGET_ASM_OUTPUT_MI_THUNK#define TARGET_ASM_OUTPUT_MI_THUNK rs6000_output_mi_thunk#undef TARGET_ASM_CAN_OUTPUT_MI_THUNK#define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_tree_hwi_hwi_tree_true#undef TARGET_FUNCTION_OK_FOR_SIBCALL#define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall#undef TARGET_INVALID_WITHIN_DOLOOP#define TARGET_INVALID_WITHIN_DOLOOP rs6000_invalid_within_doloop#undef TARGET_RTX_COSTS#define TARGET_RTX_COSTS rs6000_rtx_costs#undef TARGET_ADDRESS_COST#define TARGET_ADDRESS_COST hook_int_rtx_0#undef TARGET_VECTOR_OPAQUE_P#define TARGET_VECTOR_OPAQUE_P rs6000_is_opaque_type#undef TARGET_DWARF_REGISTER_SPAN#define TARGET_DWARF_REGISTER_SPAN rs6000_dwarf_register_span/* On rs6000, function arguments are promoted, as are function return values. */#undef TARGET_PROMOTE_FUNCTION_ARGS#define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true#undef TARGET_PROMOTE_FUNCTION_RETURN#define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_true#undef TARGET_RETURN_IN_MEMORY#define TARGET_RETURN_IN_MEMORY rs6000_return_in_memory#undef TARGET_SETUP_INCOMING_VARARGS#define TARGET_SETUP_INCOMING_VARARGS setup_incoming_varargs/* Always strict argument naming on rs6000. */#undef TARGET_STRICT_ARGUMENT_NAMING#define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true#undef TARGET_PRETEND_OUTGOING_VARARGS_NAMED#define TARGET_PRETEND_OUTGOING_VARARGS_NAMED hook_bool_CUMULATIVE_ARGS_true#undef TARGET_SPLIT_COMPLEX_ARG#define TARGET_SPLIT_COMPLEX_ARG hook_bool_tree_true#undef TARGET_MUST_PASS_IN_STACK#define TARGET_MUST_PASS_IN_STACK rs6000_must_pass_in_stack#undef TARGET_PASS_BY_REFERENCE#define TARGET_PASS_BY_REFERENCE rs6000_pass_by_reference#undef TARGET_ARG_PARTIAL_BYTES#define TARGET_ARG_PARTIAL_BYTES rs6000_arg_partial_bytes#undef TARGET_BUILD_BUILTIN_VA_LIST#define TARGET_BUILD_BUILTIN_VA_LIST rs6000_build_builtin_va_list#undef TARGET_GIMPLIFY_VA_ARG_EXPR#define TARGET_GIMPLIFY_VA_ARG_EXPR rs6000_gimplify_va_arg#undef TARGET_EH_RETURN_FILTER_MODE#define TARGET_EH_RETURN_FILTER_MODE rs6000_eh_return_filter_mode#undef TARGET_VECTOR_MODE_SUPPORTED_P#define TARGET_VECTOR_MODE_SUPPORTED_P rs6000_vector_mode_supported_p#undef TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN#define TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN invalid_arg_for_unprototyped_fn#undef TARGET_HANDLE_OPTION#define TARGET_HANDLE_OPTION rs6000_handle_option#undef TARGET_DEFAULT_TARGET_FLAGS#define TARGET_DEFAULT_TARGET_FLAGS \ (TARGET_DEFAULT | MASK_SCHED_PROLOG)#undef TARGET_STACK_PROTECT_FAIL#define TARGET_STACK_PROTECT_FAIL rs6000_stack_protect_fail/* MPC604EUM 3.5.2 Weak Consistency between Multiple Processors The PowerPC architecture requires only weak consistency among processors--that is, memory accesses between processors need not be sequentially consistent and memory accesses among processors can occur in any order. The ability to order memory accesses weakly provides opportunities for more efficient use of the system bus. Unless a dependency exists, the 604e allows read operations to precede store operations. */#undef TARGET_RELAXED_ORDERING#define TARGET_RELAXED_ORDERING true#ifdef HAVE_AS_TLS#undef TARGET_ASM_OUTPUT_DWARF_DTPREL#define TARGET_ASM_OUTPUT_DWARF_DTPREL rs6000_output_dwarf_dtprel#endifstruct gcc_target targetm = TARGET_INITIALIZER;/* Value is 1 if hard register REGNO can hold a value of machine-mode MODE. */static intrs6000_hard_regno_mode_ok (int regno, enum machine_mode mode){ /* The GPRs can hold any mode, but values bigger than one register cannot go past R31. */ if (INT_REGNO_P (regno)) return INT_REGNO_P (regno + HARD_REGNO_NREGS (regno, mode) - 1); /* The float registers can only hold floating modes and DImode. */ if (FP_REGNO_P (regno)) return (GET_MODE_CLASS (mode) == MODE_FLOAT && FP_REGNO_P (regno + HARD_REGNO_NREGS (regno, mode) - 1)) || (GET_MODE_CLASS (mode) == MODE_INT && GET_MODE_SIZE (mode) == UNITS_PER_FP_WORD); /* The CR register can only hold CC modes. */ if (CR_REGNO_P (regno)) return GET_MODE_CLASS (mode) == MODE_CC; if (XER_REGNO_P (regno)) return mode == PSImode; /* AltiVec only in AldyVec registers. */ if (ALTIVEC_REGNO_P (regno)) return ALTIVEC_VECTOR_MODE (mode); /* ...but GPRs can hold SIMD data on the SPE in one register. */ if (SPE_SIMD_REGNO_P (regno) && TARGET_SPE && SPE_VECTOR_MODE (mode)) return 1; /* We cannot put TImode anywhere except general register and it must be able to fit within the register set. */ return GET_MODE_SIZE (mode) <= UNITS_PER_WORD;}/* Initialize rs6000_hard_regno_mode_ok_p table. */static voidrs6000_init_hard_regno_mode_ok (void){ int r, m; for (r = 0; r < FIRST_PSEUDO_REGISTER; ++r) for (m = 0; m < NUM_MACHINE_MODES; ++m) if (rs6000_hard_regno_mode_ok (r, m)) rs6000_hard_regno_mode_ok_p[m][r] = true;}/* If not otherwise specified by a target, make 'long double' equivalent to 'double'. */#ifndef RS6000_DEFAULT_LONG_DOUBLE_SIZE#define RS6000_DEFAULT_LONG_DOUBLE_SIZE 64#endif/* Override command line options. Mostly we process the processor type and sometimes adjust other TARGET_ options. */voidrs6000_override_options (const char *default_cpu){ size_t i, j; struct rs6000_cpu_select *ptr; int set_masks; /* Simplifications for entries below. */ enum { POWERPC_BASE_MASK = MASK_POWERPC | MASK_NEW_MNEMONICS, POWERPC_7400_MASK = POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_ALTIVEC }; /* This table occasionally claims that a processor does not support a particular feature even though it does, but the feature is slower than the alternative. Thus, it shouldn't be relied on as a complete description of the processor's support. Please keep this list in order, and don't forget to update the documentation in invoke.texi when adding a new processor or flag. */ static struct ptt { const char *const name; /* Canonical processor name. */ const enum processor_type processor; /* Processor type enum value. */ const int target_enable; /* Target flags to enable. */ } const processor_target_table[] = {{"401", PROCESSOR_PPC403, POWERPC_BASE_MASK | MASK_SOFT_FLOAT}, {"403", PROCESSOR_PPC403, POWERPC_BASE_MASK | MASK_SOFT_FLOAT | MASK_STRICT_ALIGN}, {"405", PROCESSOR_PPC405, POWERPC_BASE_MASK | MASK_SOFT_FLOAT}, {"405fp", PROCESSOR_PPC405, POWERPC_BASE_MASK}, {"440", PROCESSOR_PPC440, POWERPC_BASE_MASK | MASK_SOFT_FLOAT}, {"440fp", PROCESSOR_PPC440, POWERPC_BASE_MASK}, {"505", PROCESSOR_MPCCORE, POWERPC_BASE_MASK}, {"601", PROCESSOR_PPC601, MASK_POWER | POWERPC_BASE_MASK | MASK_MULTIPLE | MASK_STRING}, {"602", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT}, {"603", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT}, {"603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_PPC_GFXOPT}, {"604", PROCESSOR_PPC604, POWERPC_BASE_MASK | MASK_PPC_GFXOPT}, {"604e", PROCESSOR_PPC604e, POWERPC_BASE_MASK | MASK_PPC_GFXOPT}, {"620", PROCESSOR_PPC620, POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64}, {"630", PROCESSOR_PPC630, POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64}, {"740", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT}, {"7400", PROCESSOR_PPC7400, POWERPC_7400_MASK}, {"7450", PROCESSOR_PPC7450, POWERPC_7400_MASK}, {"750", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT}, {"801", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT}, {"821", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT}, {"823", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT}, {"8540", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_PPC_GFXOPT}, /* 8548 has a dummy entry for now. */ {"8548", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_PPC_GFXOPT}, {"860", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT}, {"970", PROCESSOR_POWER4, POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64}, {"common", PROCESSOR_COMMON, MASK_NEW_MNEMONICS}, {"ec603e", PROCESSOR_PPC603, POWERPC_BASE_MASK | MASK_SOFT_FLOAT}, {"G3", PROCESSOR_PPC750, POWERPC_BASE_MASK | MASK_PPC_GFXOPT}, {"G4", PROCESSOR_PPC7450, POWERPC_7400_MASK}, {"G5", PROCESSOR_POWER4, POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64}, {"power", PROCESSOR_POWER, MASK_POWER | MASK_MULTIPLE | MASK_STRING}, {"power2", PROCESSOR_POWER, MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING}, {"power3", PROCESSOR_PPC630, POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64}, {"power4", PROCESSOR_POWER4, POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POWERPC64}, {"power5", PROCESSOR_POWER5, POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POPCNTB}, {"power5+", PROCESSOR_POWER5, POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND}, {"powerpc", PROCESSOR_POWERPC, POWERPC_BASE_MASK}, {"powerpc64", PROCESSOR_POWERPC64, POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64}, {"rios", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING}, {"rios1", PROCESSOR_RIOS1, MASK_POWER | MASK_MULTIPLE | MASK_STRING}, {"rios2", PROCESSOR_RIOS2, MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING}, {"rsc", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING}, {"rsc1", PROCESSOR_PPC601, MASK_POWER | MASK_MULTIPLE | MASK_STRING}, {"rs64", PROCESSOR_RS64A, POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64} }; const size_t ptt_size = ARRAY_SIZE (processor_target_table); /* Some OSs don't support saving the high part of 64-bit registers on context switch. Other OSs don't support saving Altivec registers. On those OSs, we don't touch the MASK_POWERPC64 or MASK_ALTIVEC settings; if the user wants either, the user must explicitly specify them and we won't interfere with the user's specification. */ enum { POWER_MASKS = MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING, POWERPC_MASKS = (POWERPC_BASE_MASK | MASK_PPC_GPOPT | MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_ALTIVEC | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND) }; rs6000_init_hard_regno_mode_ok (); set_masks = POWER_MASKS | POWERPC_MASKS | MASK_SOFT_FLOAT;#ifdef OS_MISSING_POWERPC64 if (OS_MISSING_POWERPC64) set_masks &= ~MASK_POWERPC64;#endif#ifdef OS_MISSING_ALTIVEC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -