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

📄 i386.c

📁 linux下编程用 编译软件
💻 C
📖 第 1 页 / 共 5 页
字号:
  if (ix86_align_loops_string)    {      warning (0, "-malign-loops is obsolete, use -falign-loops");      if (align_loops == 0)	{	  i = atoi (ix86_align_loops_string);	  if (i < 0 || i > MAX_CODE_ALIGN)	    error ("-malign-loops=%d is not between 0 and %d", i, MAX_CODE_ALIGN);	  else	    align_loops = 1 << i;	}    }  if (ix86_align_jumps_string)    {      warning (0, "-malign-jumps is obsolete, use -falign-jumps");      if (align_jumps == 0)	{	  i = atoi (ix86_align_jumps_string);	  if (i < 0 || i > MAX_CODE_ALIGN)	    error ("-malign-loops=%d is not between 0 and %d", i, MAX_CODE_ALIGN);	  else	    align_jumps = 1 << i;	}    }  if (ix86_align_funcs_string)    {      warning (0, "-malign-functions is obsolete, use -falign-functions");      if (align_functions == 0)	{	  i = atoi (ix86_align_funcs_string);	  if (i < 0 || i > MAX_CODE_ALIGN)	    error ("-malign-loops=%d is not between 0 and %d", i, MAX_CODE_ALIGN);	  else	    align_functions = 1 << i;	}    }  /* Default align_* from the processor table.  */  if (align_loops == 0)    {      align_loops = processor_target_table[ix86_tune].align_loop;      align_loops_max_skip = processor_target_table[ix86_tune].align_loop_max_skip;    }  if (align_jumps == 0)    {      align_jumps = processor_target_table[ix86_tune].align_jump;      align_jumps_max_skip = processor_target_table[ix86_tune].align_jump_max_skip;    }  if (align_functions == 0)    {      align_functions = processor_target_table[ix86_tune].align_func;    }  /* Validate -mpreferred-stack-boundary= value, or provide default.     The default of 128 bits is for Pentium III's SSE __m128, but we     don't want additional code to keep the stack aligned when     optimizing for code size.  */  ix86_preferred_stack_boundary = (optimize_size				   ? TARGET_64BIT ? 128 : 32				   : 128);  if (ix86_preferred_stack_boundary_string)    {      i = atoi (ix86_preferred_stack_boundary_string);      if (i < (TARGET_64BIT ? 4 : 2) || i > 12)	error ("-mpreferred-stack-boundary=%d is not between %d and 12", i,	       TARGET_64BIT ? 4 : 2);      else	ix86_preferred_stack_boundary = (1 << i) * BITS_PER_UNIT;    }  /* Validate -mbranch-cost= value, or provide default.  */  ix86_branch_cost = processor_target_table[ix86_tune].cost->branch_cost;  if (ix86_branch_cost_string)    {      i = atoi (ix86_branch_cost_string);      if (i < 0 || i > 5)	error ("-mbranch-cost=%d is not between 0 and 5", i);      else	ix86_branch_cost = i;    }  if (ix86_section_threshold_string)    {      i = atoi (ix86_section_threshold_string);      if (i < 0)	error ("-mlarge-data-threshold=%d is negative", i);      else	ix86_section_threshold = i;    }  if (ix86_tls_dialect_string)    {      if (strcmp (ix86_tls_dialect_string, "gnu") == 0)	ix86_tls_dialect = TLS_DIALECT_GNU;      else if (strcmp (ix86_tls_dialect_string, "sun") == 0)	ix86_tls_dialect = TLS_DIALECT_SUN;      else	error ("bad value (%s) for -mtls-dialect= switch",	       ix86_tls_dialect_string);    }  /* Keep nonleaf frame pointers.  */  if (flag_omit_frame_pointer)    target_flags &= ~MASK_OMIT_LEAF_FRAME_POINTER;  else if (TARGET_OMIT_LEAF_FRAME_POINTER)    flag_omit_frame_pointer = 1;  /* If we're doing fast math, we don't care about comparison order     wrt NaNs.  This lets us use a shorter comparison sequence.  */  if (flag_unsafe_math_optimizations)    target_flags &= ~MASK_IEEE_FP;  /* If the architecture always has an FPU, turn off NO_FANCY_MATH_387,     since the insns won't need emulation.  */  if (x86_arch_always_fancy_math_387 & (1 << ix86_arch))    target_flags &= ~MASK_NO_FANCY_MATH_387;  /* Likewise, if the target doesn't have a 387, or we've specified     software floating point, don't use 387 inline intrinsics.  */  if (!TARGET_80387)    target_flags |= MASK_NO_FANCY_MATH_387;  /* Turn on SSE2 builtins for -msse3.  */  if (TARGET_SSE3)    target_flags |= MASK_SSE2;  /* Turn on SSE builtins for -msse2.  */  if (TARGET_SSE2)    target_flags |= MASK_SSE;  /* Turn on MMX builtins for -msse.  */  if (TARGET_SSE)    {      target_flags |= MASK_MMX & ~target_flags_explicit;      x86_prefetch_sse = true;    }  /* Turn on MMX builtins for 3Dnow.  */  if (TARGET_3DNOW)    target_flags |= MASK_MMX;  if (TARGET_64BIT)    {      if (TARGET_ALIGN_DOUBLE)	error ("-malign-double makes no sense in the 64bit mode");      if (TARGET_RTD)	error ("-mrtd calling convention not supported in the 64bit mode");      /* Enable by default the SSE and MMX builtins.  Do allow the user to	 explicitly disable any of these.  In particular, disabling SSE and	 MMX for kernel code is extremely useful.  */      target_flags	|= ((MASK_SSE2 | MASK_SSE | MASK_MMX | MASK_128BIT_LONG_DOUBLE)	    & ~target_flags_explicit);     }  else    {      /* i386 ABI does not specify red zone.  It still makes sense to use it         when programmer takes care to stack from being destroyed.  */      if (!(target_flags_explicit & MASK_NO_RED_ZONE))        target_flags |= MASK_NO_RED_ZONE;    }  /* Accept -msseregparm only if at least SSE support is enabled.  */  if (TARGET_SSEREGPARM      && ! TARGET_SSE)    error ("-msseregparm used without SSE enabled");  ix86_fpmath = TARGET_FPMATH_DEFAULT;  if (ix86_fpmath_string != 0)    {      if (! strcmp (ix86_fpmath_string, "387"))	ix86_fpmath = FPMATH_387;      else if (! strcmp (ix86_fpmath_string, "sse"))	{	  if (!TARGET_SSE)	    {	      warning (0, "SSE instruction set disabled, using 387 arithmetics");	      ix86_fpmath = FPMATH_387;	    }	  else	    ix86_fpmath = FPMATH_SSE;	}      else if (! strcmp (ix86_fpmath_string, "387,sse")	       || ! strcmp (ix86_fpmath_string, "sse,387"))	{	  if (!TARGET_SSE)	    {	      warning (0, "SSE instruction set disabled, using 387 arithmetics");	      ix86_fpmath = FPMATH_387;	    }	  else if (!TARGET_80387)	    {	      warning (0, "387 instruction set disabled, using SSE arithmetics");	      ix86_fpmath = FPMATH_SSE;	    }	  else	    ix86_fpmath = FPMATH_SSE | FPMATH_387;	}      else	error ("bad value (%s) for -mfpmath= switch", ix86_fpmath_string);    }  /* If the i387 is disabled, then do not return values in it. */  if (!TARGET_80387)    target_flags &= ~MASK_FLOAT_RETURNS;  if ((x86_accumulate_outgoing_args & TUNEMASK)      && !(target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)      && !optimize_size)    target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;  /* ??? Unwind info is not correct around the CFG unless either a frame     pointer is present or M_A_O_A is set.  Fixing this requires rewriting     unwind info generation to be aware of the CFG and propagating states     around edges.  */  if ((flag_unwind_tables || flag_asynchronous_unwind_tables       || flag_exceptions || flag_non_call_exceptions)      && flag_omit_frame_pointer      && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))    {      if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)	warning (0, "unwind tables currently require either a frame pointer "		 "or -maccumulate-outgoing-args for correctness");      target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;    }  /* Figure out what ASM_GENERATE_INTERNAL_LABEL builds as a prefix.  */  {    char *p;    ASM_GENERATE_INTERNAL_LABEL (internal_label_prefix, "LX", 0);    p = strchr (internal_label_prefix, 'X');    internal_label_prefix_len = p - internal_label_prefix;    *p = '\0';  }  /* When scheduling description is not available, disable scheduler pass     so it won't slow down the compilation and make x87 code slower.  */  if (!TARGET_SCHEDULE)    flag_schedule_insns_after_reload = flag_schedule_insns = 0;}/* switch to the appropriate section for output of DECL.   DECL is either a `VAR_DECL' node or a constant of some sort.   RELOC indicates whether forming the initial value of DECL requires   link-time relocations.  */static voidx86_64_elf_select_section (tree decl, int reloc,		         unsigned HOST_WIDE_INT align){  if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)      && ix86_in_large_data_p (decl))    {      const char *sname = NULL;      unsigned int flags = SECTION_WRITE;      switch (categorize_decl_for_section (decl, reloc, flag_pic))	{	case SECCAT_DATA:	  sname = ".ldata";	  break;	case SECCAT_DATA_REL:	  sname = ".ldata.rel";	  break;	case SECCAT_DATA_REL_LOCAL:	  sname = ".ldata.rel.local";	  break;	case SECCAT_DATA_REL_RO:	  sname = ".ldata.rel.ro";	  break;	case SECCAT_DATA_REL_RO_LOCAL:	  sname = ".ldata.rel.ro.local";	  break;	case SECCAT_BSS:	  sname = ".lbss";	  flags |= SECTION_BSS;	  break;	case SECCAT_RODATA:	case SECCAT_RODATA_MERGE_STR:	case SECCAT_RODATA_MERGE_STR_INIT:	case SECCAT_RODATA_MERGE_CONST:	  sname = ".lrodata";	  flags = 0;	  break;	case SECCAT_SRODATA:	case SECCAT_SDATA:	case SECCAT_SBSS:	  gcc_unreachable ();	case SECCAT_TEXT:	case SECCAT_TDATA:	case SECCAT_TBSS:	  /* We don't split these for medium model.  Place them into	     default sections and hope for best.  */	  break;	}      if (sname)	{	  /* We might get called with string constants, but named_section	     doesn't like them as they are not DECLs.  Also, we need to set	     flags in that case.  */	  if (!DECL_P (decl))	    named_section_flags (sname, flags);	  else	    named_section (decl, sname, reloc);	  return;	}    }  default_elf_select_section (decl, reloc, align);}/* Build up a unique section name, expressed as a   STRING_CST node, and assign it to DECL_SECTION_NAME (decl).   RELOC indicates whether the initial value of EXP requires   link-time relocations.  */static voidx86_64_elf_unique_section (tree decl, int reloc){  if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)      && ix86_in_large_data_p (decl))    {      const char *prefix = NULL;      /* We only need to use .gnu.linkonce if we don't have COMDAT groups.  */      bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;      switch (categorize_decl_for_section (decl, reloc, flag_pic))	{	case SECCAT_DATA:	case SECCAT_DATA_REL:	case SECCAT_DATA_REL_LOCAL:	case SECCAT_DATA_REL_RO:	case SECCAT_DATA_REL_RO_LOCAL:          prefix = one_only ? ".gnu.linkonce.ld." : ".ldata.";	  break;	case SECCAT_BSS:          prefix = one_only ? ".gnu.linkonce.lb." : ".lbss.";	  break;	case SECCAT_RODATA:	case SECCAT_RODATA_MERGE_STR:	case SECCAT_RODATA_MERGE_STR_INIT:	case SECCAT_RODATA_MERGE_CONST:          prefix = one_only ? ".gnu.linkonce.lr." : ".lrodata.";	  break;	case SECCAT_SRODATA:	case SECCAT_SDATA:	case SECCAT_SBSS:	  gcc_unreachable ();	case SECCAT_TEXT:	case SECCAT_TDATA:	case SECCAT_TBSS:	  /* We don't split these for medium model.  Place them into	     default sections and hope for best.  */	  break;	}      if (prefix)	{	  const char 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -