⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs6000.c

📁 linux下编程用 编译软件
💻 C
📖 第 1 页 / 共 5 页
字号:
{  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 + -