📄 sparc.h
字号:
program. Do not define this macro if it does not need to do anything. */#define EXTRA_SPECS \ { "cpp_cpu", CPP_CPU_SPEC }, \ { "cpp_cpu_default", CPP_CPU_DEFAULT_SPEC }, \ { "cpp_arch32", CPP_ARCH32_SPEC }, \ { "cpp_arch64", CPP_ARCH64_SPEC }, \ { "cpp_arch_default", CPP_ARCH_DEFAULT_SPEC },\ { "cpp_arch", CPP_ARCH_SPEC }, \ { "cpp_endian", CPP_ENDIAN_SPEC }, \ { "cpp_subtarget", CPP_SUBTARGET_SPEC }, \ { "asm_cpu", ASM_CPU_SPEC }, \ { "asm_cpu_default", ASM_CPU_DEFAULT_SPEC }, \ { "asm_arch32", ASM_ARCH32_SPEC }, \ { "asm_arch64", ASM_ARCH64_SPEC }, \ { "asm_arch_default", ASM_ARCH_DEFAULT_SPEC },\ { "asm_arch", ASM_ARCH_SPEC }, \ SUBTARGET_EXTRA_SPECS#define SUBTARGET_EXTRA_SPECS#ifdef SPARC_BI_ARCH#define NO_BUILTIN_PTRDIFF_TYPE#define NO_BUILTIN_SIZE_TYPE#endif#define PTRDIFF_TYPE (TARGET_ARCH64 ? "long int" : "int")#define SIZE_TYPE (TARGET_ARCH64 ? "long unsigned int" : "unsigned int")/* ??? This should be 32 bits for v9 but what can we do? */#define WCHAR_TYPE "short unsigned int"#define WCHAR_TYPE_SIZE 16#define MAX_WCHAR_TYPE_SIZE 16/* Show we can debug even without a frame pointer. */#define CAN_DEBUG_WITHOUT_FP/* To make profiling work with -f{pic,PIC}, we need to emit the profiling code into the rtl. Also, if we are profiling, we cannot eliminate the frame pointer (because the return address will get smashed). */void sparc_override_options ();#define OVERRIDE_OPTIONS \ do { \ if (profile_flag || profile_block_flag || profile_arc_flag) \ { \ if (flag_pic) \ { \ const char *pic_string = (flag_pic == 1) ? "-fpic" : "-fPIC";\ warning ("%s and profiling conflict: disabling %s", \ pic_string, pic_string); \ flag_pic = 0; \ } \ flag_omit_frame_pointer = 0; \ } \ sparc_override_options (); \ SUBTARGET_OVERRIDE_OPTIONS; \ } while (0)/* This is meant to be redefined in the host dependent files. */#define SUBTARGET_OVERRIDE_OPTIONS/* These compiler options take an argument. We ignore -target for now. */#define WORD_SWITCH_TAKES_ARG(STR) \ (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \ || !strcmp (STR, "target") || !strcmp (STR, "assert"))/* Print subsidiary information on the compiler version in use. */#define TARGET_VERSION fprintf (stderr, " (sparc)");/* Generate DBX debugging information. */#define DBX_DEBUGGING_INFO/* Run-time compilation parameters selecting different hardware subsets. */extern int target_flags;/* Nonzero if we should generate code to use the fpu. */#define MASK_FPU 1#define TARGET_FPU (target_flags & MASK_FPU)/* Nonzero if we should use FUNCTION_EPILOGUE. Otherwise, we use fast return insns, but lose some generality. */#define MASK_EPILOGUE 2#define TARGET_EPILOGUE (target_flags & MASK_EPILOGUE)/* Nonzero if we should assume that double pointers might be unaligned. This can happen when linking gcc compiled code with other compilers, because the ABI only guarantees 4 byte alignment. */#define MASK_UNALIGNED_DOUBLES 4#define TARGET_UNALIGNED_DOUBLES (target_flags & MASK_UNALIGNED_DOUBLES)/* Nonzero means that we should generate code for a v8 sparc. */#define MASK_V8 0x8#define TARGET_V8 (target_flags & MASK_V8)/* Nonzero means that we should generate code for a sparclite. This enables the sparclite specific instructions, but does not affect whether FPU instructions are emitted. */#define MASK_SPARCLITE 0x10#define TARGET_SPARCLITE (target_flags & MASK_SPARCLITE)/* Nonzero if we're compiling for the sparclet. */#define MASK_SPARCLET 0x20#define TARGET_SPARCLET (target_flags & MASK_SPARCLET)/* Nonzero if we're compiling for v9 sparc. Note that v9's can run in 32 bit mode so this doesn't necessarily mean the word size is 64. */#define MASK_V9 0x40#define TARGET_V9 (target_flags & MASK_V9)/* Non-zero to generate code that uses the instructions deprecated in the v9 architecture. This option only applies to v9 systems. *//* ??? This isn't user selectable yet. It's used to enable such insns on 32 bit v9 systems and for the moment they're permanently disabled on 64 bit v9 systems. */#define MASK_DEPRECATED_V8_INSNS 0x80#define TARGET_DEPRECATED_V8_INSNS (target_flags & MASK_DEPRECATED_V8_INSNS)/* Mask of all CPU selection flags. */#define MASK_ISA \(MASK_V8 + MASK_SPARCLITE + MASK_SPARCLET + MASK_V9 + MASK_DEPRECATED_V8_INSNS)/* Non-zero means don't pass `-assert pure-text' to the linker. */#define MASK_IMPURE_TEXT 0x100#define TARGET_IMPURE_TEXT (target_flags & MASK_IMPURE_TEXT)/* Nonzero means that we should generate code using a flat register window model, i.e. no save/restore instructions are generated, which is compatible with normal sparc code. The frame pointer is %i7 instead of %fp. */#define MASK_FLAT 0x200#define TARGET_FLAT (target_flags & MASK_FLAT)/* Nonzero means use the registers that the Sparc ABI reserves for application software. This must be the default to coincide with the setting in FIXED_REGISTERS. */#define MASK_APP_REGS 0x400#define TARGET_APP_REGS (target_flags & MASK_APP_REGS)/* Option to select how quad word floating point is implemented. When TARGET_HARD_QUAD is true, we use the hardware quad instructions. Otherwise, we use the SPARC ABI quad library functions. */#define MASK_HARD_QUAD 0x800#define TARGET_HARD_QUAD (target_flags & MASK_HARD_QUAD)/* Non-zero on little-endian machines. *//* ??? Little endian support currently only exists for sparclet-aout and sparc64-elf configurations. May eventually want to expand the support to all targets, but for now it's kept local to only those two. */#define MASK_LITTLE_ENDIAN 0x1000#define TARGET_LITTLE_ENDIAN (target_flags & MASK_LITTLE_ENDIAN)/* 0x2000, 0x4000 are unused *//* Nonzero if pointers are 64 bits. At the moment it must follow architecture size flag. */#define MASK_PTR64 0x8000#define TARGET_PTR64 (target_flags & MASK_PTR64)/* Nonzero if generating code to run in a 64 bit environment. This is intended to only be used by TARGET_ARCH{32,64} as they are the mechanism used to control compile time or run time selection. */#define MASK_64BIT 0x10000#define TARGET_64BIT (target_flags & MASK_64BIT)/* 0x20000,0x40000 unused *//* Non-zero means use a stack bias of 2047. Stack offsets are obtained by adding 2047 to %sp. This option is for v9 only and is the default. */#define MASK_STACK_BIAS 0x80000#define TARGET_STACK_BIAS (target_flags & MASK_STACK_BIAS)/* Non-zero means %g0 is a normal register. We still clobber it as necessary, but we can't rely on it always having a zero value. We don't bother to support this in true 64 bit mode. */#define MASK_LIVE_G0 0x100000#define TARGET_LIVE_G0 (target_flags & MASK_LIVE_G0)/* Non-zero means the cpu has broken `save' and `restore' insns, only the trivial versions work (save %g0,%g0,%g0; restore %g0,%g0,%g0). We assume the environment will properly handle or otherwise avoid trouble associated with an interrupt occurring after the `save' or trap occurring during it. */#define MASK_BROKEN_SAVERESTORE 0x200000#define TARGET_BROKEN_SAVERESTORE (target_flags & MASK_BROKEN_SAVERESTORE)/* Non-zero means -m{,no-}fpu was passed on the command line. */#define MASK_FPU_SET 0x400000#define TARGET_FPU_SET (target_flags & MASK_FPU_SET)/* Use the UltraSPARC Visual Instruction Set extensions. */#define MASK_VIS 0x1000000 #define TARGET_VIS (target_flags & MASK_VIS)/* Compile for Solaris V8+. 32 bit Solaris preserves the high bits of the current out and global registers. Linux saves the high bits on context switches but not signals. */#define MASK_V8PLUS 0x2000000 #define TARGET_V8PLUS (target_flags & MASK_V8PLUS) /* TARGET_HARD_MUL: Use hardware multiply instructions but not %y. TARGET_HARD_MUL32: Use hardware multiply instructions with rd %y to get high 32 bits. False in V8+ or V9 because multiply stores a 64 bit result in a register. */#define TARGET_HARD_MUL32 \ ((TARGET_V8 || TARGET_SPARCLITE \ || TARGET_SPARCLET || TARGET_DEPRECATED_V8_INSNS) \ && ! TARGET_V8PLUS)#define TARGET_HARD_MUL \ (TARGET_V8 || TARGET_SPARCLITE || TARGET_SPARCLET \ || TARGET_DEPRECATED_V8_INSNS || TARGET_V8PLUS) /* Macro to define tables used to set the flags. This is a list in braces of pairs in braces, each pair being { "NAME", VALUE } where VALUE is the bits to set or minus the bits to clear. An empty string NAME is used to identify the default VALUE. */#define TARGET_SWITCHES \ { {"fpu", MASK_FPU | MASK_FPU_SET, "Use hardware fp" }, \ {"no-fpu", -MASK_FPU, "Do not use hardware fp" }, \ {"no-fpu", MASK_FPU_SET, "Do not use hardware fp" }, \ {"hard-float", MASK_FPU | MASK_FPU_SET, "Use hardware fp" }, \ {"soft-float", -MASK_FPU, "Do not use hardware fp" }, \ {"soft-float", MASK_FPU_SET, "Do not use hardware fp" }, \ {"epilogue", MASK_EPILOGUE, "Use FUNCTION_EPILOGUE" }, \ {"no-epilogue", -MASK_EPILOGUE, "Do not use FUNCTION_EPILOGUE" }, \ {"unaligned-doubles", MASK_UNALIGNED_DOUBLES, "Assume possible double misalignment" },\ {"no-unaligned-doubles", -MASK_UNALIGNED_DOUBLES, "Assume all doubles are aligned" }, \ {"impure-text", MASK_IMPURE_TEXT, "Pass -assert pure-text to linker" }, \ {"no-impure-text", -MASK_IMPURE_TEXT, "Do not pass -assert pure-text to linker" }, \ {"flat", MASK_FLAT, "Use flat register window model" }, \ {"no-flat", -MASK_FLAT, "Do not use flat register window model" }, \ {"app-regs", MASK_APP_REGS, "Use ABI reserved registers" }, \ {"no-app-regs", -MASK_APP_REGS, "Do not use ABI reserved registers" }, \ {"hard-quad-float", MASK_HARD_QUAD, "Use hardware quad fp instructions" }, \ {"soft-quad-float", -MASK_HARD_QUAD, "Do not use hardware quad fp instructions" }, \ {"v8plus", MASK_V8PLUS, "Compile for v8plus ABI" }, \ {"no-v8plus", -MASK_V8PLUS, "Do not compile for v8plus ABI" }, \ {"vis", MASK_VIS, "Utilize Visual Instruction Set" }, \ {"no-vis", -MASK_VIS, "Do not utilize Visual Instruction Set" }, \ /* ??? These are deprecated, coerced to -mcpu=. Delete in 2.9. */ \ {"cypress", 0, "Optimize for Cypress processors" }, \ {"sparclite", 0, "Optimize for SparcLite processors" }, \ {"f930", 0, "Optimize for F930 processors" }, \ {"f934", 0, "Optimize for F934 processors" }, \ {"v8", 0, "Use V8 Sparc ISA" }, \ {"supersparc", 0, "Optimize for SuperSparc processors" }, \ /* End of deprecated options. */ \ {"ptr64", MASK_PTR64, "Pointers are 64-bit" }, \ {"ptr32", -MASK_PTR64, "Pointers are 32-bit" }, \ {"32", -MASK_64BIT, "Use 32-bit ABI" }, \ {"64", MASK_64BIT, "Use 64-bit ABI" }, \ {"stack-bias", MASK_STACK_BIAS, "Use stack bias" }, \ {"no-stack-bias", -MASK_STACK_BIAS, "Do not use stack bias" }, \ SUBTARGET_SWITCHES \ { "", TARGET_DEFAULT, ""}}/* MASK_APP_REGS must always be the default because that's what FIXED_REGISTERS is set to and -ffixed- is processed before CONDITIONAL_REGISTER_USAGE is called (where we process -mno-app-regs). */#define TARGET_DEFAULT (MASK_APP_REGS + MASK_EPILOGUE + MASK_FPU)/* This is meant to be redefined in target specific files. */#define SUBTARGET_SWITCHES/* Processor type. These must match the values for the cpu attribute in sparc.md. */enum processor_type { PROCESSOR_V7, PROCESSOR_CYPRESS, PROCESSOR_V8, PROCESSOR_SUPERSPARC, PROCESSOR_SPARCLITE, PROCESSOR_F930, PROCESSOR_F934, PROCESSOR_HYPERSPARC, PROCESSOR_SPARCLITE86X, PROCESSOR_SPARCLET, PROCESSOR_TSC701, PROCESSOR_V9, PROCESSOR_ULTRASPARC};/* This is set from -m{cpu,tune}=xxx. */extern enum processor_type sparc_cpu;/* Recast the cpu class to be the cpu attribute. Every file includes us, but not every file includes insn-attr.h. */#define sparc_cpu_attr ((enum attr_cpu) sparc_cpu)/* This macro is similar to `TARGET_SWITCHES' but defines names of command options that have values. Its definition is an initializer with a subgrouping for each command option. Each subgrouping contains a string constant, that defines the fixed part of the option name, and the address of a variable. The variable, type `char *', is set to the variable part of the given option if the fixed part matches. The actual option name is made by appending `-m' to the specified name. Here is an example which defines `-mshort-data-NUMBER'. If the given option is `-mshort-data-512', the variable `m88k_short_data' will be set to the string `"512"'. extern char *m88k_short_data; #define TARGET_OPTIONS { { "short-data-", &m88k_short_data } } */#define TARGET_OPTIONS \{ \ { "cpu=", &sparc_select[1].string, "Use features of and schedule code for given CPU" }, \ { "tune=", &sparc_select[2].string, "Schedule code for given CPU" }, \ { "cmodel=", &sparc_cmodel_string, "Use given Sparc code model" }, \ { "align-loops=", &sparc_align_loops_string, "Loop code aligned to this power of 2" }, \ { "align-jumps=", &sparc_align_jumps_string, "Jump targets are aligned to this power of 2" }, \ { "align-functions=", &sparc_align_funcs_string, "Function starts are aligned to this power of 2" }, \ SUBTARGET_OPTIONS \}/* This is meant to be redefined in target specific files. */#define SUBTARGET_OPTIONS/* sparc_select[0] is reserved for the default cpu. */struct sparc_cpu_select{ const char *string; const char *name; int set_tune_p; int set_arch_p;};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -