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

📄 s390.h

📁 gcc3.2.1源代码
💻 H
📖 第 1 页 / 共 4 页
字号:
   DSA size and determine stack offset.  */#define ACCUMULATE_OUTGOING_ARGS 1/* Offset from the stack pointer register to an item dynamically   allocated on the stack, e.g., by `alloca'.   The default value for this macro is `STACK_POINTER_OFFSET' plus the   length of the outgoing arguments.  The default is correct for most   machines.  See `function.c' for details.  */#define STACK_DYNAMIC_OFFSET(FUNDECL) (STARTING_FRAME_OFFSET)/* Offset of first parameter from the argument pointer register value.    On the S/390, we define the argument pointer to the start of the fixed   area.  */#define FIRST_PARM_OFFSET(FNDECL) 0/* Define this if stack space is still allocated for a parameter passed   in a register.  The value is the number of bytes allocated to this   area.  *//* #define REG_PARM_STACK_SPACE(FNDECL)    32 *//* Define this if the above stack space is to be considered part of the   space allocated by the caller.  *//* #define OUTGOING_REG_PARM_STACK_SPACE *//* 1 if N is a possible register number for function argument passing.   On S390, general registers 2 - 6 and floating point register 0 and 2   are used in this way.  */#define FUNCTION_ARG_REGNO_P(N) (((N) >=2 && (N) <7) || \                                 (N) == 16 || (N) == 17)/* Define a data type for recording info about an argument list during   the scan of that argument list.  This data type should hold all   necessary information about the function itself and about the args   processed so far, enough to enable macros such as FUNCTION_ARG to   determine where the next arg should go.  */typedef struct s390_arg_structure{  int gprs;			/* gpr so far */  int fprs;			/* fpr so far */}CUMULATIVE_ARGS;/* Initialize a variable CUM of type CUMULATIVE_ARGS for a call to   a function whose data type is FNTYPE.   For a library call, FNTYPE is 0.  */#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, NN) \  ((CUM).gprs=0, (CUM).fprs=0)/* Update the data in CUM to advance over an argument of mode MODE and   data type TYPE.  (TYPE is null for libcalls where that information   may not be available.) */#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED)                    \  s390_function_arg_advance (&CUM, MODE, TYPE, NAMED)/* Define where to put the arguments to a function.  Value is zero to push   the argument on the stack, or a hard register in which to store the   argument.  */#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED)   \  s390_function_arg (&CUM, MODE, TYPE, NAMED)/* Define where to expect the arguments of a function.  Value is zero, if   the argument is on the stack, or a hard register in which the argument   is stored. It is the same like FUNCTION_ARG, except for unnamed args   That means, that all in case of varargs used, the arguments are expected   from the stack.    S/390 has already space on the stack for args coming in registers,    they are pushed in prologue, if needed.  */  /* Define the `__builtin_va_list' type.  */#define BUILD_VA_LIST_TYPE(VALIST) \  (VALIST) = s390_build_va_list ()/* Implement `va_start' for varargs and stdarg.  */#define EXPAND_BUILTIN_VA_START(stdarg, valist, nextarg) \  s390_va_start (stdarg, valist, nextarg)/* Implement `va_arg'.  */#define EXPAND_BUILTIN_VA_ARG(valist, type) \  s390_va_arg (valist, type)/* For an arg passed partly in registers and partly in memory, this is the   number of registers used.  For args passed entirely in registers or   entirely in memory, zero.  */#define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) 0/* Define if returning from a function call automatically pops the   arguments described by the number-of-args field in the call.  */#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, SIZE) 0/* Define how to find the value returned by a function.  VALTYPE is the   data type of the value (as a tree).   If the precise function being called is known, FUNC is its FUNCTION_DECL;   otherwise, FUNC is 15.  */#define RET_REG(MODE) ((GET_MODE_CLASS (MODE) == MODE_INT       \                       || TARGET_SOFT_FLOAT ) ? 2 : 16)/* for structs the address is passed, and the Callee makes a   copy, only if needed */#define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) \  s390_function_arg_pass_by_reference (MODE, TYPE)/* Register 2 (and 3) for integral values   or floating point register 0 (and 2) for fp values are used.  */#define FUNCTION_VALUE(VALTYPE, FUNC)				\  gen_rtx_REG ((INTEGRAL_TYPE_P (VALTYPE)			\		&& TYPE_PRECISION (VALTYPE) < BITS_PER_WORD)	\	       || POINTER_TYPE_P (VALTYPE)			\	       ? word_mode : TYPE_MODE (VALTYPE),		\	       TREE_CODE (VALTYPE) == REAL_TYPE && TARGET_HARD_FLOAT ? 16 : 2)/* Define how to find the value returned by a library function assuming   the value has mode MODE.  */#define LIBCALL_VALUE(MODE)  gen_rtx (REG, MODE, RET_REG (MODE))/* 1 if N is a possible register number for a function value.  */#define FUNCTION_VALUE_REGNO_P(N) ((N) == 2 || (N) == 16)/* The definition of this macro implies that there are cases where   a scalar value cannot be returned in registers.  */#define RETURN_IN_MEMORY(type)       				\  (TYPE_MODE (type) == BLKmode || 				\   GET_MODE_CLASS (TYPE_MODE (type)) == MODE_COMPLEX_INT  ||	\   GET_MODE_CLASS (TYPE_MODE (type)) == MODE_COMPLEX_FLOAT)/* Mode of stack savearea.   FUNCTION is VOIDmode because calling convention maintains SP.   BLOCK needs Pmode for SP.   NONLOCAL needs twice Pmode to maintain both backchain and SP.  */#define STACK_SAVEAREA_MODE(LEVEL)      \  (LEVEL == SAVE_FUNCTION ? VOIDmode    \  : LEVEL == SAVE_NONLOCAL ? (TARGET_64BIT ? TImode : DImode) : Pmode)/* Structure value address is passed as invisible first argument (gpr 2).  */#define STRUCT_VALUE 0/* This macro definition sets up a default value for `main' to return.  */#define DEFAULT_MAIN_RETURN  c_expand_return (integer_zero_node)/* Length in units of the trampoline for entering a nested function.  */#define TRAMPOLINE_SIZE (TARGET_64BIT ? 36 : 20)/* Initialize the dynamic part of trampoline.  */#define INITIALIZE_TRAMPOLINE(ADDR, FNADDR, CXT)                       \   s390_initialize_trampoline ((ADDR), (FNADDR), (CXT))/* Template for constant part of trampoline.  */#define TRAMPOLINE_TEMPLATE(FILE)                                       \   s390_trampoline_template (FILE)/* Output assembler code to FILE to increment profiler label # LABELNO   for profiling a function entry.  */#define FUNCTION_PROFILER(FILE, LABELNO) 			\	s390_function_profiler ((FILE), ((LABELNO)))#define PROFILE_BEFORE_PROLOGUE 1/* Define EXIT_IGNORE_STACK if, when returning from a function, the stack   pointer does not matter (provided there is a frame pointer).  */#define EXIT_IGNORE_STACK       1/* Addressing modes, and classification of registers for them.  *//* #define HAVE_POST_INCREMENT *//* #define HAVE_POST_DECREMENT *//* #define HAVE_PRE_DECREMENT *//* #define HAVE_PRE_INCREMENT *//* These assume that REGNO is a hard or pseudo reg number.  They give   nonzero only if REGNO is a hard reg of the suitable class or a pseudo   reg currently allocated to a suitable hard reg.   These definitions are NOT overridden anywhere.  */#define REGNO_OK_FOR_INDEX_P(REGNO)					\    (((REGNO) < FIRST_PSEUDO_REGISTER 					\     && REGNO_REG_CLASS ((REGNO)) == ADDR_REGS) 			\    || (reg_renumber[REGNO] > 0 && reg_renumber[REGNO] < 16))#define REGNO_OK_FOR_BASE_P(REGNO) REGNO_OK_FOR_INDEX_P (REGNO)#define REGNO_OK_FOR_DATA_P(REGNO)                                      \  ((REGNO) < 16 || (unsigned) reg_renumber[REGNO] < 16)#define REGNO_OK_FOR_FP_P(REGNO)                                        \  FLOAT_REGNO_P (REGNO)/* Now macros that check whether X is a register and also,   strictly, whether it is in a specified class.  *//* 1 if X is a data register.  */#define DATA_REG_P(X) (REG_P (X) && REGNO_OK_FOR_DATA_P (REGNO (X)))/* 1 if X is an fp register.  */#define FP_REG_P(X) (REG_P (X) && REGNO_OK_FOR_FP_P (REGNO (X)))/* 1 if X is an address register.  */#define ADDRESS_REG_P(X) (REG_P (X) && REGNO_OK_FOR_BASE_P (REGNO (X)))/* Maximum number of registers that can appear in a valid memory address.  */#define MAX_REGS_PER_ADDRESS 2/* Recognize any constant value that is a valid address.  */#define CONSTANT_ADDRESS_P(X) 0#define SYMBOLIC_CONST(X)       \(GET_CODE (X) == SYMBOL_REF                                             \ || GET_CODE (X) == LABEL_REF                                           \ || (GET_CODE (X) == CONST && symbolic_reference_mentioned_p (X)))/* General operand is everything except SYMBOL_REF, CONST and CONST_DOUBLE   they have to be forced to constant pool   CONST_INT have to be forced into constant pool, if greater than   64k. Depending on the insn they have to be force into constant pool   for smaller value; in this case we have to work with nonimmediate operand.  */#define LEGITIMATE_PIC_OPERAND_P(X)  \      legitimate_pic_operand_p (X)/* Nonzero if the constant value X is a legitimate general operand.   It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */#define LEGITIMATE_CONSTANT_P(X) \     legitimate_constant_p (X)/* The macros REG_OK_FOR..._P assume that the arg is a REG rtx and check   its validity for a certain class.  We have two alternate definitions   for each of them.  The usual definition accepts all pseudo regs; the   other rejects them all.  The symbol REG_OK_STRICT causes the latter   definition to be used.   Most source files want to accept pseudo regs in the hope that they will   get allocated to the class that the insn wants them to be in.   Some source files that are used after register allocation   need to be strict.  *//*  * Nonzero if X is a hard reg that can be used as an index or if it is * a pseudo reg.   */#define REG_OK_FOR_INDEX_NONSTRICT_P(X)   	\((GET_MODE (X) == Pmode) &&			\ ((REGNO (X) >= FIRST_PSEUDO_REGISTER) 		\  || REGNO_REG_CLASS (REGNO (X)) == ADDR_REGS))  /* Nonzero if X is a hard reg that can be used as a base reg or if it is   a pseudo reg.  */#define REG_OK_FOR_BASE_NONSTRICT_P(X)    REG_OK_FOR_INDEX_NONSTRICT_P (X)/* Nonzero if X is a hard reg that can be used as an index.  */#define REG_OK_FOR_INDEX_STRICT_P(X) 				\((GET_MODE (X) == Pmode) && (REGNO_OK_FOR_INDEX_P (REGNO (X))))/* Nonzero if X is a hard reg that can be used as a base reg.  */#define REG_OK_FOR_BASE_STRICT_P(X)				\((GET_MODE (X) == Pmode) && (REGNO_OK_FOR_BASE_P (REGNO (X))))#ifndef REG_OK_STRICT#define REG_OK_FOR_INDEX_P(X)  REG_OK_FOR_INDEX_NONSTRICT_P(X)#define REG_OK_FOR_BASE_P(X)   REG_OK_FOR_BASE_NONSTRICT_P(X)#else#define REG_OK_FOR_INDEX_P(X)  REG_OK_FOR_INDEX_STRICT_P(X)#define REG_OK_FOR_BASE_P(X)   REG_OK_FOR_BASE_STRICT_P(X)#endif/* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression that is a   valid memory address for an instruction.   The MODE argument is the machine mode for the MEM expression   that wants to use this address.   The other macros defined here are used only in GO_IF_LEGITIMATE_ADDRESS,   except for CONSTANT_ADDRESS_P which is actually machine-independent.  */#ifdef REG_OK_STRICT#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)                         \{                                                                       \  if (legitimate_address_p (MODE, X, 1))                                \    goto ADDR;                                                          \}#else#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)                         \{                                                                       \  if (legitimate_address_p (MODE, X, 0))                                \    goto ADDR;                                                          \}#endif/* S/390 has no mode dependent addresses.  */#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)/* Try machine-dependent ways of modifying an illegitimate address   to be legitimate.  If we find one, return the new, valid address.   This macro is used in only one place: `memory_address' in explow.c.  */#define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN)                          \{                                                                       \  (X) = legitimize_address (X, OLDX, MODE);                             \  if (memory_address_p (MODE, X))                                       \    goto WIN;                                                           \}/* Specify the machine mode that this machine uses for the index in the   tablejump instruction.  */

⌨️ 快捷键说明

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