📄 rs6000.c
字号:
warning ("-mmultiple is not supported on little endian systems"); } if (TARGET_STRING) { target_flags &= ~MASK_STRING; if ((target_flags_explicit & MASK_STRING) != 0) warning ("-mstring is not supported on little endian systems"); } } /* Set debug flags */ if (rs6000_debug_name) { if (! strcmp (rs6000_debug_name, "all")) rs6000_debug_stack = rs6000_debug_arg = 1; else if (! strcmp (rs6000_debug_name, "stack")) rs6000_debug_stack = 1; else if (! strcmp (rs6000_debug_name, "arg")) rs6000_debug_arg = 1; else error ("unknown -mdebug-%s switch", rs6000_debug_name); } if (rs6000_traceback_name) { if (! strncmp (rs6000_traceback_name, "full", 4)) rs6000_traceback = traceback_full; else if (! strncmp (rs6000_traceback_name, "part", 4)) rs6000_traceback = traceback_part; else if (! strncmp (rs6000_traceback_name, "no", 2)) rs6000_traceback = traceback_none; else error ("unknown -mtraceback arg %qs; expecting %<full%>, %<partial%> or %<none%>", rs6000_traceback_name); } /* Set size of long double */ rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE; if (rs6000_long_double_size_string) { char *tail; int size = strtol (rs6000_long_double_size_string, &tail, 10); if (*tail != '\0' || (size != 64 && size != 128)) error ("Unknown switch -mlong-double-%s", rs6000_long_double_size_string); else rs6000_long_double_type_size = size; } /* Set Altivec ABI as default for powerpc64 linux. */ if (TARGET_ELF && TARGET_64BIT) { rs6000_altivec_abi = 1; rs6000_altivec_vrsave = 1; } /* Set the Darwin64 ABI as default for 64-bit Darwin. */ if (DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT) { rs6000_darwin64_abi = 1; /* Setting to empty string is same as "-mone-byte-bool". */#if TARGET_MACHO darwin_one_byte_bool = ""; /* APPLE LOCAL pragma reverse_bitfields */ darwin_reverse_bitfields = 0;#endif /* Default to natural alignment, for better performance. */ rs6000_alignment_flags = MASK_ALIGN_NATURAL; } /* Handle -mabi= options. */ rs6000_parse_abi_options (); /* Handle -malign-XXXXX option. */ rs6000_parse_alignment_option (); rs6000_parse_float_gprs_option (); /* Handle generic -mFOO=YES/NO options. */ rs6000_parse_yes_no_option ("vrsave", rs6000_altivec_vrsave_string, &rs6000_altivec_vrsave); rs6000_parse_yes_no_option ("isel", rs6000_isel_string, &rs6000_isel); rs6000_parse_yes_no_option ("spe", rs6000_spe_string, &rs6000_spe); /* Handle -mtls-size option. */ rs6000_parse_tls_size_option ();#ifdef SUBTARGET_OVERRIDE_OPTIONS SUBTARGET_OVERRIDE_OPTIONS;#endif#ifdef SUBSUBTARGET_OVERRIDE_OPTIONS SUBSUBTARGET_OVERRIDE_OPTIONS;#endif#ifdef SUB3TARGET_OVERRIDE_OPTIONS SUB3TARGET_OVERRIDE_OPTIONS;#endif if (TARGET_E500) { if (TARGET_ALTIVEC) error ("AltiVec and E500 instructions cannot coexist"); /* The e500 does not have string instructions, and we set MASK_STRING above when optimizing for size. */ if ((target_flags & MASK_STRING) != 0) target_flags = target_flags & ~MASK_STRING; /* No SPE means 64-bit long doubles, even if an E500. */ if (rs6000_spe_string != 0 && !strcmp (rs6000_spe_string, "no")) rs6000_long_double_type_size = 64; } else if (rs6000_select[1].string != NULL) { /* For the powerpc-eabispe configuration, we set all these by default, so let's unset them if we manually set another CPU that is not the E500. */ if (rs6000_abi_string == 0) rs6000_spe_abi = 0; if (rs6000_spe_string == 0) rs6000_spe = 0; if (rs6000_float_gprs_string == 0) rs6000_float_gprs = 0; if (rs6000_isel_string == 0) rs6000_isel = 0; if (rs6000_long_double_size_string == 0) rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE; } rs6000_always_hint = (rs6000_cpu != PROCESSOR_POWER4 && rs6000_cpu != PROCESSOR_POWER5); rs6000_sched_groups = (rs6000_cpu == PROCESSOR_POWER4 || rs6000_cpu == PROCESSOR_POWER5); /* Handle -m(no-)longcall option. This is a bit of a cheap hack, using TARGET_OPTIONS to handle a toggle switch, but we're out of bits in target_flags so TARGET_SWITCHES cannot be used. Assumption here is that rs6000_longcall_switch points into the text of the complete option, rather than being a copy, so we can scan back for the presence or absence of the no- modifier. */ if (rs6000_longcall_switch) { const char *base = rs6000_longcall_switch; while (base[-1] != 'm') base--; if (*rs6000_longcall_switch != '\0') error ("invalid option %qs", base); rs6000_default_long_calls = (base[0] != 'n'); } /* Handle -m(no-)warn-altivec-long similarly. */ if (rs6000_warn_altivec_long_switch) { const char *base = rs6000_warn_altivec_long_switch; while (base[-1] != 'm') base--; if (*rs6000_warn_altivec_long_switch != '\0') error ("invalid option %qs", base); rs6000_warn_altivec_long = (base[0] != 'n'); } /* Handle -mprioritize-restricted-insns option. */ rs6000_sched_restricted_insns_priority = (rs6000_sched_groups ? 1 : 0); if (rs6000_sched_restricted_insns_priority_str) rs6000_sched_restricted_insns_priority = atoi (rs6000_sched_restricted_insns_priority_str); /* APPLE LOCAL begin only consider true dependency for grouping */ /* Handle -msched-costly-dep option. */ rs6000_sched_costly_dep = (rs6000_sched_groups ? true_store_to_load_dep_costly : no_dep_costly); /* APPLE LOCAL end only consider true dependency for grouping */ if (rs6000_sched_costly_dep_str) { if (! strcmp (rs6000_sched_costly_dep_str, "no")) rs6000_sched_costly_dep = no_dep_costly; else if (! strcmp (rs6000_sched_costly_dep_str, "all")) rs6000_sched_costly_dep = all_deps_costly; else if (! strcmp (rs6000_sched_costly_dep_str, "true_store_to_load")) rs6000_sched_costly_dep = true_store_to_load_dep_costly; else if (! strcmp (rs6000_sched_costly_dep_str, "store_to_load")) rs6000_sched_costly_dep = store_to_load_dep_costly; else rs6000_sched_costly_dep = atoi (rs6000_sched_costly_dep_str); } /* Handle -minsert-sched-nops option. */ rs6000_sched_insert_nops = (rs6000_sched_groups ? sched_finish_regroup_exact : sched_finish_none); if (rs6000_sched_insert_nops_str) { if (! strcmp (rs6000_sched_insert_nops_str, "no")) rs6000_sched_insert_nops = sched_finish_none; else if (! strcmp (rs6000_sched_insert_nops_str, "pad")) rs6000_sched_insert_nops = sched_finish_pad_groups; else if (! strcmp (rs6000_sched_insert_nops_str, "regroup_exact")) rs6000_sched_insert_nops = sched_finish_regroup_exact; else rs6000_sched_insert_nops = atoi (rs6000_sched_insert_nops_str); }#ifdef TARGET_REGNAMES /* If the user desires alternate register names, copy in the alternate names now. */ if (TARGET_REGNAMES) memcpy (rs6000_reg_names, alt_reg_names, sizeof (rs6000_reg_names));#endif /* Set TARGET_AIX_STRUCT_RET last, after the ABI is determined. If -maix-struct-return or -msvr4-struct-return was explicitly used, don't override with the ABI default. */ if ((target_flags_explicit & MASK_AIX_STRUCT_RET) == 0) { if (DEFAULT_ABI == ABI_V4 && !DRAFT_V4_STRUCT_RET) target_flags = (target_flags & ~MASK_AIX_STRUCT_RET); else target_flags |= MASK_AIX_STRUCT_RET; } if (TARGET_LONG_DOUBLE_128 && (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)) REAL_MODE_FORMAT (TFmode) = &ibm_extended_format; /* Allocate an alias set for register saves & restores from stack. */ rs6000_sr_alias_set = new_alias_set (); if (TARGET_TOC) ASM_GENERATE_INTERNAL_LABEL (toc_label_name, "LCTOC", 1); /* We can only guarantee the availability of DI pseudo-ops when assembling for 64-bit targets. */ if (!TARGET_64BIT) { targetm.asm_out.aligned_op.di = NULL; targetm.asm_out.unaligned_op.di = NULL; } /* Set branch target alignment, if not optimizing for size. */ if (!optimize_size) { if (rs6000_sched_groups) { if (align_functions <= 0) align_functions = 16; if (align_jumps <= 0) align_jumps = 16; if (align_loops <= 0) align_loops = 16; } if (align_jumps_max_skip <= 0) align_jumps_max_skip = 15; if (align_loops_max_skip <= 0) align_loops_max_skip = 15; } /* Arrange to save and restore machine status around nested functions. */ init_machine_status = rs6000_init_machine_status; /* We should always be splitting complex arguments, but we can't break Linux and Darwin ABIs at the moment. For now, only AIX is fixed. */ if (DEFAULT_ABI != ABI_AIX) targetm.calls.split_complex_arg = NULL; /* APPLE LOCAL begin AltiVec */ /* Enable '(vector signed int)(a, b, c, d)' vector literal notation. */ if (TARGET_ALTIVEC) targetm.cast_expr_as_vector_init = true; /* APPLE LOCAL end AltiVec */ /* Initialize rs6000_cost with the appropriate target costs. */ if (optimize_size) rs6000_cost = TARGET_POWERPC64 ? &size64_cost : &size32_cost; else switch (rs6000_cpu) { case PROCESSOR_RIOS1: rs6000_cost = &rios1_cost; break; case PROCESSOR_RIOS2: rs6000_cost = &rios2_cost; break; case PROCESSOR_RS64A: rs6000_cost = &rs64a_cost; break; case PROCESSOR_MPCCORE: rs6000_cost = &mpccore_cost; break; case PROCESSOR_PPC403: rs6000_cost = &ppc403_cost; break; case PROCESSOR_PPC405: rs6000_cost = &ppc405_cost; break; case PROCESSOR_PPC440: rs6000_cost = &ppc440_cost; break; case PROCESSOR_PPC601: rs6000_cost = &ppc601_cost; break; case PROCESSOR_PPC603: rs6000_cost = &ppc603_cost; break; case PROCESSOR_PPC604: rs6000_cost = &ppc604_cost; break; case PROCESSOR_PPC604e: rs6000_cost = &ppc604e_cost; break; case PROCESSOR_PPC620: rs6000_cost = &ppc620_cost; break; case PROCESSOR_PPC630: rs6000_cost = &ppc630_cost; break; case PROCESSOR_PPC750: case PROCESSOR_PPC7400: rs6000_cost = &ppc750_cost; break; case PROCESSOR_PPC7450: rs6000_cost = &ppc7450_cost; break; case PROCESSOR_PPC8540: rs6000_cost = &ppc8540_cost; break; case PROCESSOR_POWER4: case PROCESSOR_POWER5: rs6000_cost = &power4_cost; break; default: abort (); }}/* Implement targetm.vectorize.builtin_mask_for_load. */static treers6000_builtin_mask_for_load (void){ if (TARGET_ALTIVEC) return altivec_builtin_mask_for_load; else return 0;}/* APPLE LOCAL begin 4375453 *//* Return true iff, data reference of TYPE can reach vector alignment (16) after applying N number of iterations. This routi
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -