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

📄 avr.h

📁 linux下的gcc编译器
💻 H
📖 第 1 页 / 共 5 页
字号:
/* A C expression to create an RTX representing the place where a   function returns a value of data type VALTYPE.  VALTYPE is a tree   node representing a data type.  Write `TYPE_MODE (VALTYPE)' to get   the machine mode used to represent that type.  On many machines,   only the mode is relevant.  (Actually, on most machines, scalar   values are returned in the same place regardless of mode).   The value of the expression is usually a `reg' RTX for the hard   register where the return value is stored.  The value can also be a   `parallel' RTX, if the return value is in multiple places.  See   `FUNCTION_ARG' for an explanation of the `parallel' form.   If `PROMOTE_FUNCTION_RETURN' is defined, you must apply the same   promotion rules specified in `PROMOTE_MODE' if VALTYPE is a scalar   type.   If the precise function being called is known, FUNC is a tree node   (`FUNCTION_DECL') for it; otherwise, FUNC is a null pointer.  This   makes it possible to use a different value-returning convention   for specific functions when all their calls are known.   `FUNCTION_VALUE' is not used for return vales with aggregate data   types, because these are returned in another way.  See   `STRUCT_VALUE_REGNUM' and related macros, below.  */#define LIBCALL_VALUE(MODE)  avr_libcall_value (MODE)/* A C expression to create an RTX representing the place where a   library function returns a value of mode MODE.  If the precise   function being called is known, FUNC is a tree node   (`FUNCTION_DECL') for it; otherwise, FUNC is a null pointer.  This   makes it possible to use a different value-returning convention   for specific functions when all their calls are known.   Note that "library function" in this context means a compiler   support routine, used to perform arithmetic, whose name is known   specially by the compiler and was not mentioned in the C code being   compiled.   The definition of `LIBRARY_VALUE' need not be concerned aggregate   data types, because none of the library functions returns such   types.  */#define FUNCTION_VALUE_REGNO_P(N) ((N) == RET_REGISTER)/* A C expression that is nonzero if REGNO is the number of a hard   register in which the values of called function may come back.   A register whose use for returning values is limited to serving as   the second of a pair (for a value of type `double', say) need not   be recognized by this macro.  So for most machines, this definition   suffices:   #define FUNCTION_VALUE_REGNO_P(N) ((N) == 0)   If the machine has register windows, so that the caller and the   called function use different registers for the return value, this   macro should recognize only the caller's register numbers.  */#define RETURN_IN_MEMORY(TYPE) ((TYPE_MODE (TYPE) == BLKmode)	\				? int_size_in_bytes (TYPE) > 8	\				: 0)/* A C expression which can inhibit the returning of certain function   values in registers, based on the type of value.  A nonzero value   says to return the function value in memory, just as large   structures are always returned.  Here TYPE will be a C expression   of type `tree', representing the data type of the value.   Note that values of mode `BLKmode' must be explicitly handled by   this macro.  Also, the option `-fpcc-struct-return' takes effect   regardless of this macro.  On most systems, it is possible to   leave the macro undefined; this causes a default definition to be   used, whose value is the constant 1 for `BLKmode' values, and 0   otherwise.   Do not use this macro to indicate that structures and unions   should always be returned in memory.  You should instead use   `DEFAULT_PCC_STRUCT_RETURN' to indicate this.  */#define DEFAULT_PCC_STRUCT_RETURN 0/* Define this macro to be 1 if all structure and union return values   must be in memory.  Since this results in slower code, this should   be defined only if needed for compatibility with other compilers   or with an ABI.  If you define this macro to be 0, then the   conventions used for structure and union return values are decided   by the `RETURN_IN_MEMORY' macro.   If not defined, this defaults to the value 1.  */#define STRUCT_VALUE 0/* If the structure value address is not passed in a register, define   `STRUCT_VALUE' as an expression returning an RTX for the place   where the address is passed.  If it returns 0, the address is   passed as an "invisible" first argument.  */#define STRUCT_VALUE_INCOMING 0/* If the incoming location is not a register, then you should define   `STRUCT_VALUE_INCOMING' as an expression for an RTX for where the   called function should find the value.  If it should find the   value on the stack, define this to create a `mem' which refers to   the frame pointer.  A definition of 0 means that the address is   passed as an "invisible" first argument.  */#define EPILOGUE_USES(REGNO) 0/* Define this macro as a C expression that is nonzero for registers   are used by the epilogue or the `return' pattern.  The stack and   frame pointer registers are already be assumed to be used as   needed.  */#define STRICT_ARGUMENT_NAMING 1/* Define this macro if the location where a function argument is   passed depends on whether or not it is a named argument.   This macro controls how the NAMED argument to `FUNCTION_ARG' is   set for varargs and stdarg functions.  With this macro defined,   the NAMED argument is always true for named arguments, and false   for unnamed arguments.  If this is not defined, but   `SETUP_INCOMING_VARARGS' is defined, then all arguments are   treated as named.  Otherwise, all named arguments except the last   are treated as named.  */#define HAVE_POST_INCREMENT 1/* Define this macro if the machine supports post-increment   addressing.  */#define HAVE_PRE_DECREMENT 1/* #define HAVE_PRE_INCREMENT   #define HAVE_POST_DECREMENT  *//* Similar for other kinds of addressing.  */#define CONSTANT_ADDRESS_P(X) CONSTANT_P (X)/* A C expression that is 1 if the RTX X is a constant which is a   valid address.  On most machines, this can be defined as   `CONSTANT_P (X)', but a few machines are more restrictive in which   constant addresses are supported.   `CONSTANT_P' accepts integer-values expressions whose values are   not explicitly known, such as `symbol_ref', `label_ref', and   `high' expressions and `const' arithmetic expressions, in addition   to `const_int' and `const_double' expressions.  */#define MAX_REGS_PER_ADDRESS 1/* A number, the maximum number of registers that can appear in a   valid memory address.  Note that it is up to you to specify a   value equal to the maximum number that `GO_IF_LEGITIMATE_ADDRESS'   would ever accept.  */#ifdef REG_OK_STRICT#  define GO_IF_LEGITIMATE_ADDRESS(mode, operand, ADDR)	\{							\  if (legitimate_address_p (mode, operand, 1))		\    goto ADDR;						\}#  else#  define GO_IF_LEGITIMATE_ADDRESS(mode, operand, ADDR)	\{							\  if (legitimate_address_p (mode, operand, 0))		\    goto ADDR;						\}#endif/* A C compound statement with a conditional `goto LABEL;' executed   if X (an RTX) is a legitimate memory address on the target machine   for a memory operand of mode MODE.  *//* `REG_OK_FOR_BASE_P (X)'   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.  */#define REG_OK_FOR_BASE_NOSTRICT_P(X) \  (REGNO (X) >= FIRST_PSEUDO_REGISTER || REG_OK_FOR_BASE_STRICT_P(X))#define REG_OK_FOR_BASE_STRICT_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))#ifdef REG_OK_STRICT#  define REG_OK_FOR_BASE_P(X) REG_OK_FOR_BASE_STRICT_P (X)#else#  define REG_OK_FOR_BASE_P(X) REG_OK_FOR_BASE_NOSTRICT_P (X)#endif/* A C expression that is just like `REG_OK_FOR_BASE_P', except that   that expression may examine the mode of the memory reference in   MODE.  You should define this macro if the mode of the memory   reference affects whether a register may be used as a base   register.  If you define this macro, the compiler will use it   instead of `REG_OK_FOR_BASE_P'.  */#define REG_OK_FOR_INDEX_P(X) 0/* 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 LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN)				\{									\  (X) = legitimize_address (X, OLDX, MODE);				\  if (memory_address_p (MODE, X))					\    goto WIN;								\}/* 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 XEXP_(X,Y) (X)#define LEGITIMIZE_RELOAD_ADDRESS(X, MODE, OPNUM, TYPE, IND_LEVELS, WIN)    \do {									    \  if (1&&(GET_CODE (X) == POST_INC || GET_CODE (X) == PRE_DEC))	    \    {									    \      push_reload (XEXP (X,0), XEXP (X,0), &XEXP (X,0), &XEXP (X,0),	    \	           POINTER_REGS, GET_MODE (X),GET_MODE (X) , 0, 0,	    \		   OPNUM, RELOAD_OTHER);				    \      goto WIN;								    \    }									    \  if (GET_CODE (X) == PLUS						    \      && REG_P (XEXP (X, 0))						    \      && GET_CODE (XEXP (X, 1)) == CONST_INT				    \      && INTVAL (XEXP (X, 1)) >= 1)					    \    {									    \      int fit = INTVAL (XEXP (X, 1)) <= (64 - GET_MODE_SIZE (MODE));	    \      if (fit)								    \	{								    \          if (reg_equiv_address[REGNO (XEXP (X, 0))] != 0)		    \	    {								    \	      int regno = REGNO (XEXP (X, 0));				    \	      rtx mem = make_memloc (X, regno);				    \	      push_reload (XEXP (mem,0), NULL, &XEXP (mem,0), NULL,         \		           POINTER_REGS, Pmode, VOIDmode, 0, 0,		    \		           1, ADDR_TYPE (TYPE));			    \	      push_reload (mem, NULL_RTX, &XEXP (X, 0), NULL,		    \		           BASE_POINTER_REGS, GET_MODE (X), VOIDmode, 0, 0, \		           OPNUM, TYPE);				    \	      goto WIN;							    \	    }								    \	  push_reload (XEXP (X, 0), NULL_RTX, &XEXP (X, 0), NULL,	    \		       BASE_POINTER_REGS, GET_MODE (X), VOIDmode, 0, 0,	    \		       OPNUM, TYPE);					    \          goto WIN;							    \	}								    \      else if (! (frame_pointer_needed && XEXP (X,0) == frame_pointer_rtx)) \	{								    \	  push_reload (X, NULL_RTX, &X, NULL,				    \		       POINTER_REGS, GET_MODE (X), VOIDmode, 0, 0,	    \		       OPNUM, TYPE);					    \          goto WIN;							    \	}								    \    }									    \} while(0)/* A C compound statement that attempts to replace X, which is an   address that needs reloading, with a valid memory address for an   operand of mode MODE.  WIN will be a C statement label elsewhere   in the code.  It is not necessary to define this macro, but it   might be useful for performance reasons.   For example, on the i386, it is sometimes possible to use a single   reload register instead of two by reloading a sum of two pseudo   registers into a register.  On the other hand, for number of RISC   processors offsets are limited so that often an intermediate   address needs to be generated in order to address a stack slot.   By defining LEGITIMIZE_RELOAD_ADDRESS appropriately, the   intermediate addresses generated for adjacent some stack slots can   be made identical, and thus be shared.   *Note*: This macro should be used with caution.  It is necessary   to know something of how reload works in order to effectively use   this, and it is quite easy to produce macros that build in too   much knowledge of reload internals.   *No

⌨️ 快捷键说明

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