📄 rs6000.c
字号:
{ switch (code) { case OPT_mno_power: target_flags &= ~(MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING); target_flags_explicit |= (MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING); break; case OPT_mno_powerpc: target_flags &= ~(MASK_POWERPC | MASK_PPC_GPOPT | MASK_PPC_GFXOPT | MASK_POWERPC64); target_flags_explicit |= (MASK_POWERPC | MASK_PPC_GPOPT | MASK_PPC_GFXOPT | MASK_POWERPC64); break; case OPT_mfull_toc: target_flags &= ~(MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC | MASK_NO_SUM_IN_TOC); target_flags_explicit |= (MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC | MASK_NO_SUM_IN_TOC);#ifdef TARGET_USES_SYSV4_OPT /* Note, V.4 no longer uses a normal TOC, so make -mfull-toc, be just the same as -mminimal-toc. */ target_flags |= MASK_MINIMAL_TOC; target_flags_explicit |= MASK_MINIMAL_TOC;#endif break;#ifdef TARGET_USES_SYSV4_OPT case OPT_mtoc: /* Make -mtoc behave like -mminimal-toc. */ target_flags |= MASK_MINIMAL_TOC; target_flags_explicit |= MASK_MINIMAL_TOC; break;#endif#ifdef TARGET_USES_AIX64_OPT case OPT_maix64:#else case OPT_m64:#endif target_flags |= MASK_POWERPC64 | MASK_POWERPC; target_flags |= ~target_flags_explicit & MASK_PPC_GFXOPT; target_flags_explicit |= MASK_POWERPC64 | MASK_POWERPC; break;#ifdef TARGET_USES_AIX64_OPT case OPT_maix32:#else case OPT_m32:#endif target_flags &= ~MASK_POWERPC64; target_flags_explicit |= MASK_POWERPC64; break; case OPT_minsert_sched_nops_: rs6000_sched_insert_nops_str = arg; break; case OPT_mminimal_toc: if (value == 1) { target_flags &= ~(MASK_NO_FP_IN_TOC | MASK_NO_SUM_IN_TOC); target_flags_explicit |= (MASK_NO_FP_IN_TOC | MASK_NO_SUM_IN_TOC); } break; case OPT_mpower: if (value == 1) { target_flags |= (MASK_MULTIPLE | MASK_STRING); target_flags_explicit |= (MASK_MULTIPLE | MASK_STRING); } break; case OPT_mpower2: if (value == 1) { target_flags |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING); target_flags_explicit |= (MASK_POWER | MASK_MULTIPLE | MASK_STRING); } break; case OPT_mpowerpc_gpopt: case OPT_mpowerpc_gfxopt: if (value == 1) { target_flags |= MASK_POWERPC; target_flags_explicit |= MASK_POWERPC; } break; case OPT_maix_struct_return: case OPT_msvr4_struct_return: rs6000_explicit_options.aix_struct_ret = true; break; case OPT_mvrsave_: rs6000_parse_yes_no_option ("vrsave", arg, &(TARGET_ALTIVEC_VRSAVE)); break; case OPT_misel_: rs6000_explicit_options.isel = true; rs6000_parse_yes_no_option ("isel", arg, &(rs6000_isel)); break; case OPT_mspe_: rs6000_explicit_options.spe = true; rs6000_parse_yes_no_option ("spe", arg, &(rs6000_spe)); /* No SPE means 64-bit long doubles, even if an E500. */ if (!rs6000_spe) rs6000_long_double_type_size = 64; break; case OPT_mdebug_: rs6000_debug_name = arg; break;#ifdef TARGET_USES_SYSV4_OPT case OPT_mcall_: rs6000_abi_name = arg; break; case OPT_msdata_: rs6000_sdata_name = arg; break; case OPT_mtls_size_: rs6000_tls_size_string = arg; break; case OPT_mrelocatable: if (value == 1) { target_flags |= MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC; target_flags_explicit |= MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC; } break; case OPT_mrelocatable_lib: if (value == 1) { target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC; target_flags_explicit |= MASK_RELOCATABLE | MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC; } else { target_flags &= ~MASK_RELOCATABLE; target_flags_explicit |= MASK_RELOCATABLE; } break;#endif case OPT_mabi_: rs6000_explicit_options.abi = true; if (!strcmp (arg, "altivec")) { rs6000_altivec_abi = 1; rs6000_spe_abi = 0; } else if (! strcmp (arg, "no-altivec")) rs6000_altivec_abi = 0; else if (! strcmp (arg, "spe")) { rs6000_spe_abi = 1; rs6000_altivec_abi = 0; if (!TARGET_SPE_ABI) error ("not configured for ABI: '%s'", arg); } else if (! strcmp (arg, "no-spe")) rs6000_spe_abi = 0; /* These are here for testing during development only, do not document in the manual please. */ else if (! strcmp (arg, "d64")) { rs6000_darwin64_abi = 1; warning (0, "Using darwin64 ABI"); } else if (! strcmp (arg, "d32")) { rs6000_darwin64_abi = 0; warning (0, "Using old darwin ABI"); } else if (! strcmp (arg, "ibmlongdouble")) { rs6000_ieeequad = 0; warning (0, "Using IBM extended precision long double"); } else if (! strcmp (arg, "ieeelongdouble")) { rs6000_ieeequad = 1; warning (0, "Using IEEE extended precision long double"); } else { error ("unknown ABI specified: '%s'", arg); return false; } break; case OPT_mcpu_: rs6000_select[1].string = arg; break; case OPT_mtune_: rs6000_select[2].string = arg; break; case OPT_mtraceback_: rs6000_traceback_name = arg; break; case OPT_mfloat_gprs_: rs6000_explicit_options.float_gprs = true; if (! strcmp (arg, "yes") || ! strcmp (arg, "single")) rs6000_float_gprs = 1; else if (! strcmp (arg, "double")) rs6000_float_gprs = 2; else if (! strcmp (arg, "no")) rs6000_float_gprs = 0; else { error ("invalid option for -mfloat-gprs: '%s'", arg); return false; } break; case OPT_mlong_double_: rs6000_explicit_options.long_double = true; rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE; if (value != 64 && value != 128) { error ("Unknown switch -mlong-double-%s", arg); rs6000_long_double_type_size = RS6000_DEFAULT_LONG_DOUBLE_SIZE; return false; } else rs6000_long_double_type_size = value; break; case OPT_msched_costly_dep_: rs6000_sched_costly_dep_str = arg; break; case OPT_malign_: rs6000_explicit_options.alignment = true; if (! strcmp (arg, "power")) { /* On 64-bit Darwin, power alignment is ABI-incompatible with some C library functions, so warn about it. The flag may be useful for performance studies from time to time though, so don't disable it entirely. */ if (DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT) warning (0, "-malign-power is not supported for 64-bit Darwin;" " it is incompatible with the installed C and C++ libraries"); rs6000_alignment_flags = MASK_ALIGN_POWER; } else if (! strcmp (arg, "natural")) rs6000_alignment_flags = MASK_ALIGN_NATURAL; else { error ("unknown -malign-XXXXX option specified: '%s'", arg); return false; } break; } return true;}/* Do anything needed at the start of the asm file. */static voidrs6000_file_start (void){ size_t i; char buffer[80]; const char *start = buffer; struct rs6000_cpu_select *ptr; const char *default_cpu = TARGET_CPU_DEFAULT; FILE *file = asm_out_file; default_file_start ();#ifdef TARGET_BI_ARCH if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT) default_cpu = 0;#endif if (flag_verbose_asm) { sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START); rs6000_select[0].string = default_cpu; for (i = 0; i < ARRAY_SIZE (rs6000_select); i++) { ptr = &rs6000_select[i]; if (ptr->string != (char *)0 && ptr->string[0] != '\0') { fprintf (file, "%s %s%s", start, ptr->name, ptr->string); start = ""; } } if (PPC405_ERRATUM77) { fprintf (file, "%s PPC405CR_ERRATUM77", start); start = ""; }#ifdef USING_ELFOS_H switch (rs6000_sdata) { case SDATA_NONE: fprintf (file, "%s -msdata=none", start); start = ""; break; case SDATA_DATA: fprintf (file, "%s -msdata=data", start); start = ""; break; case SDATA_SYSV: fprintf (file, "%s -msdata=sysv", start); start = ""; break; case SDATA_EABI: fprintf (file, "%s -msdata=eabi", start); start = ""; break; } if (rs6000_sdata && g_switch_value) { fprintf (file, "%s -G " HOST_WIDE_INT_PRINT_UNSIGNED, start, g_switch_value); start = ""; }#endif if (*start == '\0') putc ('\n', file); } if (DEFAULT_ABI == ABI_AIX || (TARGET_ELF && flag_pic == 2)) { toc_section (); text_section (); }}/* Return nonzero if this function is known to have a null epilogue. */intdirect_return (void){ if (reload_completed) { rs6000_stack_t *info = rs6000_stack_info (); if (info->first_gp_reg_save == 32 && info->first_fp_reg_save == 64 && info->first_altivec_reg_save == LAST_ALTIVEC_REGNO + 1 && ! info->lr_save_p && ! info->cr_save_p && info->vrsave_mask == 0 && ! info->push_p) return 1; } return 0;}/* Return the number of instructions it takes to form a constant in an integer register. */intnum_insns_constant_wide (HOST_WIDE_INT value){ /* signed constant loadable with {cal|addi} */ if (CONST_OK_FOR_LETTER_P (value, 'I')) return 1; /* constant loadable with {cau|addis} */ else if (CONST_OK_FOR_LETTER_P (value, 'L')) return 1;#if HOST_BITS_PER_WIDE_INT == 64 else if (TARGET_POWERPC64) { HOST_WIDE_INT low = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000; HOST_WIDE_INT high = value >> 31; if (high == 0 || high == -1) return 2; high >>= 1; if (low == 0) return num_insns_constant_wide (high) + 1; else return (num_insns_constant_wide (high)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -