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

📄 fr30.h

📁 linux下的gcc编译器
💻 H
📖 第 1 页 / 共 4 页
字号:
	  && GET_CODE (XEXP (X, 1)) == CONST_INT			\	  && IN_RANGE (INTVAL (XEXP (X, 1)), -(1 << 9), (1 <<  9) - 4))	\        goto LABEL;							\    }									\  while (0)#else#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, LABEL)			\  do									\    {									\      if (GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X))			\        goto LABEL;							\      if (GET_CODE (X) == PLUS						\	  && ((MODE) == SImode || (MODE) == SFmode)			\	  && XEXP (X, 0) == stack_pointer_rtx				\	  && GET_CODE (XEXP (X, 1)) == CONST_INT			\	  && IN_RANGE (INTVAL (XEXP (X, 1)), 0, (1 <<  6) - 4))		\	goto LABEL;							\      if (GET_CODE (X) == PLUS						\	  && ((MODE) == SImode || (MODE) == SFmode)			\	  && GET_CODE (XEXP (X, 0)) == REG \          && (REGNO (XEXP (X, 0)) == FRAME_POINTER_REGNUM \           || REGNO (XEXP (X, 0)) == ARG_POINTER_REGNUM) \	  && GET_CODE (XEXP (X, 1)) == CONST_INT			\	  && IN_RANGE (INTVAL (XEXP (X, 1)), -(1 << 9), (1 <<  9) - 4))	\        goto LABEL;							\    }									\  while (0)#endif/* A C expression that is nonzero if X (assumed to be a `reg' RTX) is valid for   use as a base register.  For hard registers, it should always accept those   which the hardware permits and reject the others.  Whether the macro accepts   or rejects pseudo registers must be controlled by `REG_OK_STRICT' as   described above.  This usually requires two variant definitions, of which   `REG_OK_STRICT' controls the one actually used.  */#ifdef REG_OK_STRICT#define REG_OK_FOR_BASE_P(X) (((unsigned) REGNO (X)) <= STACK_POINTER_REGNUM)#else#define REG_OK_FOR_BASE_P(X) 1#endif/* A C expression that is nonzero if X (assumed to be a `reg' RTX) is valid for   use as an index register.   The difference between an index register and a base register is that the   index register may be scaled.  If an address involves the sum of two   registers, neither one of them scaled, then either one may be labeled the   "base" and the other the "index"; but whichever labeling is used must fit   the machine's constraints of which registers may serve in each capacity.   The compiler will try both labelings, looking for one that is valid, and   will reload one or both registers only if neither labeling works.  */#define REG_OK_FOR_INDEX_P(X) REG_OK_FOR_BASE_P (X)/* A C compound statement that attempts to replace X with a valid memory   address for an operand of mode MODE.  WIN will be a C statement label   elsewhere in the code; the macro definition may use        GO_IF_LEGITIMATE_ADDRESS (MODE, X, WIN);   to avoid further processing if the address has become legitimate.   X will always be the result of a call to `break_out_memory_refs', and OLDX   will be the operand that was given to that function to produce X.   The code generated by this macro should not alter the substructure of X.  If   it transforms X into a more legitimate form, it should assign X (which will   always be a C variable) a new value.   It is not necessary for this macro to come up with a legitimate address.   The compiler has standard ways of doing so in all cases.  In fact, it is   safe for this macro to do nothing.  But often a machine-dependent strategy   can generate better code.  */#define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN)/* A C statement or compound statement with a conditional `goto LABEL;'   executed if memory address X (an RTX) can have different meanings depending   on the machine mode of the memory reference it is used for or if the address   is valid for some modes but not others.   Autoincrement and autodecrement addresses typically have mode-dependent   effects because the amount of the increment or decrement is the size of the   operand being addressed.  Some machines have other mode-dependent addresses.   Many RISC machines have no mode-dependent addresses.   You may assume that ADDR is a valid address for the machine.  */#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)/* A C expression that is nonzero if X is a legitimate constant for an   immediate operand on the target machine.  You can assume that X satisfies   `CONSTANT_P', so you need not check this.  In fact, `1' is a suitable   definition for this macro on machines where anything `CONSTANT_P' is valid.  */#define LEGITIMATE_CONSTANT_P(X) 1/*}}}*/ /*{{{  Describing Relative Costs of Operations */ /* Define this macro as a C expression which is nonzero if accessing less than   a word of memory (i.e. a `char' or a `short') is no faster than accessing a   word of memory, i.e., if such access require more than one instruction or if   there is no difference in cost between byte and (aligned) word loads.   When this macro is not defined, the compiler will access a field by finding   the smallest containing object; when it is defined, a fullword load will be   used if alignment permits.  Unless bytes accesses are faster than word   accesses, using word accesses is preferable since it may eliminate   subsequent memory access if subsequent accesses occur to other fields in the   same word of the structure, but to different bytes.  */#define SLOW_BYTE_ACCESS 1/*}}}*/ /*{{{  Dividing the output into sections.  */ /* A C expression whose value is a string containing the assembler operation   that should precede instructions and read-only data.  Normally `".text"' is   right.  */#define TEXT_SECTION_ASM_OP "\t.text"/* A C expression whose value is a string containing the assembler operation to   identify the following data as writable initialized data.  Normally   `".data"' is right.  */#define DATA_SECTION_ASM_OP "\t.data"/* If defined, a C expression whose value is a string containing the   assembler operation to identify the following data as   uninitialized global data.  If not defined, and neither   `ASM_OUTPUT_BSS' nor `ASM_OUTPUT_ALIGNED_BSS' are defined,   uninitialized global data will be output in the data section if   `-fno-common' is passed, otherwise `ASM_OUTPUT_COMMON' will be   used.  */#define BSS_SECTION_ASM_OP "\t.section .bss"/*}}}*/ /*{{{  The Overall Framework of an Assembler File.  *//* A C string constant describing how to begin a comment in the target   assembler language.  The compiler assumes that the comment will end at the   end of the line.  */#define ASM_COMMENT_START ";"/* A C string constant for text to be output before each `asm' statement or   group of consecutive ones.  Normally this is `"#APP"', which is a comment   that has no effect on most assemblers but tells the GNU assembler that it   must check the lines that follow for all valid assembler constructs.  */#define ASM_APP_ON "#APP\n"/* A C string constant for text to be output after each `asm' statement or   group of consecutive ones.  Normally this is `"#NO_APP"', which tells the   GNU assembler to resume making the time-saving assumptions that are valid   for ordinary compiler output.  */#define ASM_APP_OFF "#NO_APP\n"/*}}}*/ /*{{{  Output and Generation of Labels.  */ /* Globalizing directive for a label.  */#define GLOBAL_ASM_OP "\t.globl "/* A C expression to assign to OUTVAR (which is a variable of type `char *') a   newly allocated string made from the string NAME and the number NUMBER, with   some suitable punctuation added.  Use `alloca' to get space for the string.   The string will be used as an argument to `ASM_OUTPUT_LABELREF' to produce   an assembler label for an internal static variable whose name is NAME.   Therefore, the string must be such as to result in valid assembler code.   The argument NUMBER is different each time this macro is executed; it   prevents conflicts between similarly-named internal static variables in   different scopes.   Ideally this string should not be a valid C identifier, to prevent any   conflict with the user's own symbols.  Most assemblers allow periods or   percent signs in assembler symbols; putting at least one of these between   the name and the number will suffice.  */#define ASM_FORMAT_PRIVATE_NAME(OUTVAR, NAME, NUMBER)		\  do								\    {								\      (OUTVAR) = (char *) alloca (strlen ((NAME)) + 12);	\      sprintf ((OUTVAR), "%s.%ld", (NAME), (long)(NUMBER));	\    }								\  while (0)/*}}}*/ /*{{{  Output of Assembler Instructions.  */ /* A C compound statement to output to stdio stream STREAM the assembler syntax   for an instruction operand X.  X is an RTL expression.   CODE is a value that can be used to specify one of several ways of printing   the operand.  It is used when identical operands must be printed differently   depending on the context.  CODE comes from the `%' specification that was   used to request printing of the operand.  If the specification was just   `%DIGIT' then CODE is 0; if the specification was `%LTR DIGIT' then CODE is   the ASCII code for LTR.   If X is a register, this macro should print the register's name.  The names   can be found in an array `reg_names' whose type is `char *[]'.  `reg_names'   is initialized from `REGISTER_NAMES'.   When the machine description has a specification `%PUNCT' (a `%' followed by   a punctuation character), this macro is called with a null pointer for X and   the punctuation character for CODE.  */#define PRINT_OPERAND(STREAM, X, CODE)	fr30_print_operand (STREAM, X, CODE)/* A C expression which evaluates to true if CODE is a valid punctuation   character for use in the `PRINT_OPERAND' macro.  If   `PRINT_OPERAND_PUNCT_VALID_P' is not defined, it means that no punctuation   characters (except for the standard one, `%') are used in this way.  */#define PRINT_OPERAND_PUNCT_VALID_P(CODE) (CODE == '#')/* A C compound statement to output to stdio stream STREAM the assembler syntax   for an instruction operand that is a memory reference whose address is X.  X   is an RTL expression.  */#define PRINT_OPERAND_ADDRESS(STREAM, X) fr30_print_operand_address (STREAM, X)/* If defined, C string expressions to be used for the `%R', `%L', `%U', and   `%I' options of `asm_fprintf' (see `final.c').  These are useful when a   single `md' file must support multiple assembler formats.  In that case, the   various `tm.h' files can define these macros differently.   USER_LABEL_PREFIX is defined in svr4.h.  */#define REGISTER_PREFIX "%"#define LOCAL_LABEL_PREFIX "."#define USER_LABEL_PREFIX ""#define IMMEDIATE_PREFIX ""/*}}}*/ /*{{{  Output of Dispatch Tables.  */ /* This macro should be provided on machines where the addresses in a dispatch   table are relative to the table's own address.   The definition should be a C statement to output to the stdio stream STREAM   an assembler pseudo-instruction to generate a difference between two labels.   VALUE and REL are the numbers of two internal labels.  The definitions of   these labels are output using `ASM_OUTPUT_INTERNAL_LABEL', and they must be   printed in the same way here.  For example,        fprintf (STREAM, "\t.word L%d-L%d\n", VALUE, REL)  */#define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL) \fprintf (STREAM, "\t.word .L%d-.L%d\n", VALUE, REL)/* This macro should be provided on machines where the addresses in a dispatch   table are absolute.   The definition should be a C statement to output to the stdio stream STREAM   an assembler pseudo-instruction to generate a reference to a label.  VALUE   is the number of an internal label whose definition is output using   `ASM_OUTPUT_INTERNAL_LABEL'.  For example,        fprintf (STREAM, "\t.word L%d\n", VALUE)  */#define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE) \fprintf (STREAM, "\t.word .L%d\n", VALUE)/*}}}*/ /*{{{  Assembler Commands for Alignment.  */ /* A C statement to output to the stdio stream STREAM an assembler command to   advance the location counter to a multiple of 2 to the POWER bytes.  POWER   will be a C expression of type `int'.  */#define ASM_OUTPUT_ALIGN(STREAM, POWER) \  fprintf ((STREAM), "\t.p2align %d\n", (POWER))/*}}}*/ /*{{{  Miscellaneous Parameters.  */ /* An alias for a machine mode name.  This is the machine mode that elements of   a jump-table should have.  */#define CASE_VECTOR_MODE SImode/* The maximum number of bytes that a single instruction can move quickly from   memory to memory.  */#define MOVE_MAX 8/* A C expression which is nonzero if on this machine it is safe to "convert"   an integer of INPREC bits to one of OUTPREC bits (where OUTPREC is smaller   than INPREC) by merely operating on it as if it had only OUTPREC bits.   On many machines, this expression can be 1.   When `TRULY_NOOP_TRUNCATION' returns 1 for a pair of sizes for modes for   which `MODES_TIEABLE_P' is 0, suboptimal code can result.  If this is the   case, making `TRULY_NOOP_TRUNCATION' return 0 in such cases may improve   things.  */#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1/* An alias for the machine mode for pointers.  On most machines, define this   to be the integer mode corresponding to the width of a hardware pointer;   `SImode' on 32-bit machine or `DImode' on 64-bit machines.  On some machines   you must define this to be one of the partial integer modes, such as   `PSImode'.   The width of `Pmode' must be at least as large as the value of   `POINTER_SIZE'.  If it is not equal, you must define the macro   `POINTERS_EXTEND_UNSIGNED' to specify how pointers are extended to `Pmode'.  */#define Pmode SImode/* An alias for the machine mode used for memory references to functions being   called, in `call' RTL expressions.  On most machines this should be   `QImode'.  */#define FUNCTION_MODE QImode/* If cross-compiling, don't require stdio.h etc to build libgcc.a.  */#if defined CROSS_COMPILE && ! defined inhibit_libc#define inhibit_libc#endif/*}}}*/ /*{{{  Exported variables */ /* Define the information needed to generate branch and scc insns.  This is   stored from the compare operation.  Note that we can't use "rtx" here   since it hasn't been defined!  */extern struct rtx_def * fr30_compare_op0;extern struct rtx_def * fr30_compare_op1;/*}}}*/ /*{{{  PERDICATE_CODES.  */ #define PREDICATE_CODES					\  { "stack_add_operand",	{ CONST_INT }},		\  { "high_register_operand",	{ REG }},		\  { "low_register_operand",	{ REG }},		\  { "call_operand",		{ MEM }},		\  { "fp_displacement_operand",	{ CONST_INT }},		\  { "sp_displacement_operand",	{ CONST_INT }},		\  { "di_operand",		{ CONST_INT, CONST_DOUBLE, REG, MEM }},	\  { "nonimmediate_di_operand",	{ REG, MEM }},		\  { "add_immediate_operand",	{ REG, CONST_INT }},/*}}}*/ /* Local Variables: *//* folded-file: t   *//* End:		    */

⌨️ 快捷键说明

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