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

📄 pa.h

📁 linux下编程用 编译软件
💻 H
📖 第 1 页 / 共 5 页
字号:
/* Make arrays of chars word-aligned for the same reasons.  */#define DATA_ALIGNMENT(TYPE, ALIGN)		\  (TREE_CODE (TYPE) == ARRAY_TYPE		\   && TYPE_MODE (TREE_TYPE (TYPE)) == QImode	\   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))/* Set this nonzero if move instructions will actually fail to work   when given unaligned data.  */#define STRICT_ALIGNMENT 1/* Value is 1 if it is a good idea to tie two pseudo registers   when one has mode MODE1 and one has mode MODE2.   If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2,   for any hard reg, then this must be 0 for correct output.  */#define MODES_TIEABLE_P(MODE1, MODE2) \  (GET_MODE_CLASS (MODE1) == GET_MODE_CLASS (MODE2))/* Specify the registers used for certain standard purposes.   The values of these macros are register numbers.  *//* The HP-PA pc isn't overloaded on a register that the compiler knows about.  *//* #define PC_REGNUM  *//* Register to use for pushing function arguments.  */#define STACK_POINTER_REGNUM 30/* Base register for access to local variables of the function.  */#define FRAME_POINTER_REGNUM 3/* Value should be nonzero if functions must have frame pointers.  */#define FRAME_POINTER_REQUIRED \  (current_function_calls_alloca)/* Don't allow hard registers to be renamed into r2 unless r2   is already live or already being saved (due to eh).  */#define HARD_REGNO_RENAME_OK(OLD_REG, NEW_REG) \  ((NEW_REG) != 2 || regs_ever_live[2] || current_function_calls_eh_return)/* C statement to store the difference between the frame pointer   and the stack pointer values immediately after the function prologue.   Note, we always pretend that this is a leaf function because if   it's not, there's no point in trying to eliminate the   frame pointer.  If it is a leaf function, we guessed right!  */#define INITIAL_FRAME_POINTER_OFFSET(VAR) \  do {(VAR) = - compute_frame_size (get_frame_size (), 0);} while (0)/* Base register for access to arguments of the function.  */#define ARG_POINTER_REGNUM (TARGET_64BIT ? 29 : 3)/* Register in which static-chain is passed to a function.  */#define STATIC_CHAIN_REGNUM (TARGET_64BIT ? 31 : 29)/* Register used to address the offset table for position-independent   data references.  */#define PIC_OFFSET_TABLE_REGNUM \  (flag_pic ? (TARGET_64BIT ? 27 : 19) : INVALID_REGNUM)#define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED 1/* Function to return the rtx used to save the pic offset table register   across function calls.  */extern struct rtx_def *hppa_pic_save_rtx (void);#define DEFAULT_PCC_STRUCT_RETURN 0/* Register in which address to store a structure value   is passed to a function.  */#define PA_STRUCT_VALUE_REGNUM 28/* Describe how we implement __builtin_eh_return.  */#define EH_RETURN_DATA_REGNO(N)	\  ((N) < 3 ? (N) + 20 : (N) == 3 ? 31 : INVALID_REGNUM)#define EH_RETURN_STACKADJ_RTX	gen_rtx_REG (Pmode, 29)#define EH_RETURN_HANDLER_RTX \  gen_rtx_MEM (word_mode,						\	       gen_rtx_PLUS (word_mode, frame_pointer_rtx,		\			     TARGET_64BIT ? GEN_INT (-16) : GEN_INT (-20)))/* Offset from the frame pointer register value to the top of stack.  */#define FRAME_POINTER_CFA_OFFSET(FNDECL) 0/* A C expression whose value is RTL representing the location of the   incoming return address at the beginning of any function, before the   prologue.  You only need to define this macro if you want to support   call frame debugging information like that provided by DWARF 2.  */#define INCOMING_RETURN_ADDR_RTX (gen_rtx_REG (word_mode, 2))#define DWARF_FRAME_RETURN_COLUMN (DWARF_FRAME_REGNUM (2))/* A C expression whose value is an integer giving a DWARF 2 column   number that may be used as an alternate return column.  This should   be defined only if DWARF_FRAME_RETURN_COLUMN is set to a general   register, but an alternate column needs to be used for signal frames.   Column 0 is not used but unfortunately its register size is set to   4 bytes (sizeof CCmode) so it can't be used on 64-bit targets.  */#define DWARF_ALT_FRAME_RETURN_COLUMN FIRST_PSEUDO_REGISTER/* This macro chooses the encoding of pointers embedded in the exception   handling sections.  If at all possible, this should be defined such   that the exception handling section will not require dynamic relocations,   and so may be read-only.   Because the HP assembler auto aligns, it is necessary to use   DW_EH_PE_aligned.  It's not possible to make the data read-only   on the HP-UX SOM port since the linker requires fixups for label   differences in different sections to be word aligned.  However,   the SOM linker can do unaligned fixups for absolute pointers.   We also need aligned pointers for global and function pointers.   Although the HP-UX 64-bit ELF linker can handle unaligned pc-relative   fixups, the runtime doesn't have a consistent relationship between   text and data for dynamically loaded objects.  Thus, it's not possible   to use pc-relative encoding for pointers on this target.  It may be   possible to use segment relative encodings but GAS doesn't currently   have a mechanism to generate these encodings.  For other targets, we   use pc-relative encoding for pointers.  If the pointer might require   dynamic relocation, we make it indirect.  */#define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL)			\  (TARGET_GAS && !TARGET_HPUX						\   ? (DW_EH_PE_pcrel							\      | ((GLOBAL) || (CODE) == 2 ? DW_EH_PE_indirect : 0)		\      | (TARGET_64BIT ? DW_EH_PE_sdata8 : DW_EH_PE_sdata4))		\   : (!TARGET_GAS || (GLOBAL) || (CODE) == 2				\      ? DW_EH_PE_aligned : DW_EH_PE_absptr))/* Handle special EH pointer encodings.  Absolute, pc-relative, and   indirect are handled automatically.  We output pc-relative, and   indirect pc-relative ourself since we need some special magic to   generate pc-relative relocations, and to handle indirect function   pointers.  */#define ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX(FILE, ENCODING, SIZE, ADDR, DONE) \  do {									\    if (((ENCODING) & 0x70) == DW_EH_PE_pcrel)				\      {									\	fputs (integer_asm_op (SIZE, FALSE), FILE);			\	if ((ENCODING) & DW_EH_PE_indirect)				\	  output_addr_const (FILE, get_deferred_plabel (ADDR));		\	else								\	  assemble_name (FILE, XSTR ((ADDR), 0));			\	fputs ("+8-$PIC_pcrel$0", FILE);				\	goto DONE;							\      }									\    } while (0)/* The letters I, J, K, L and M in a register constraint string   can be used to stand for particular ranges of immediate operands.   This macro defines what the ranges are.   C is the letter, and VALUE is a constant value.   Return 1 if VALUE is in the range specified by C.   `I' is used for the 11 bit constants.   `J' is used for the 14 bit constants.   `K' is used for values that can be moved with a zdepi insn.   `L' is used for the 5 bit constants.   `M' is used for 0.   `N' is used for values with the least significant 11 bits equal to zero	                  and when sign extended from 32 to 64 bits the			  value does not change.   `O' is used for numbers n such that n+1 is a power of 2.   */#define CONST_OK_FOR_LETTER_P(VALUE, C)  \  ((C) == 'I' ? VAL_11_BITS_P (VALUE)					\   : (C) == 'J' ? VAL_14_BITS_P (VALUE)					\   : (C) == 'K' ? zdepi_cint_p (VALUE)					\   : (C) == 'L' ? VAL_5_BITS_P (VALUE)					\   : (C) == 'M' ? (VALUE) == 0						\   : (C) == 'N' ? (((VALUE) & (((HOST_WIDE_INT) -1 << 31) | 0x7ff)) == 0 \		   || (((VALUE) & (((HOST_WIDE_INT) -1 << 31) | 0x7ff))	\		       == (HOST_WIDE_INT) -1 << 31))			\   : (C) == 'O' ? (((VALUE) & ((VALUE) + 1)) == 0)			\   : (C) == 'P' ? and_mask_p (VALUE)					\   : 0)/* Similar, but for floating or large integer constants, and defining letters   G and H.   Here VALUE is the CONST_DOUBLE rtx itself.   For PA, `G' is the floating-point constant zero.  `H' is undefined.  */#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C)  			\  ((C) == 'G' ? (GET_MODE_CLASS (GET_MODE (VALUE)) == MODE_FLOAT	\		 && (VALUE) == CONST0_RTX (GET_MODE (VALUE)))		\   : 0)/* The class value for index registers, and the one for base regs.  */#define INDEX_REG_CLASS GENERAL_REGS#define BASE_REG_CLASS GENERAL_REGS#define FP_REG_CLASS_P(CLASS) \  ((CLASS) == FP_REGS || (CLASS) == FPUPPER_REGS)/* True if register is floating-point.  */#define FP_REGNO_P(N) ((N) >= FP_REG_FIRST && (N) <= FP_REG_LAST)/* Given an rtx X being reloaded into a reg required to be   in class CLASS, return the class of reg to actually use.   In general this is just CLASS; but on some machines   in some cases it is preferable to use a more restrictive class.  */#define PREFERRED_RELOAD_CLASS(X,CLASS) (CLASS)/* Return the register class of a scratch register needed to copy   IN into a register in CLASS in MODE, or a register in CLASS in MODE   to IN.  If it can be done directly NO_REGS is returned.   Avoid doing any work for the common case calls.  */#define SECONDARY_RELOAD_CLASS(CLASS,MODE,IN) \  ((CLASS == BASE_REG_CLASS && GET_CODE (IN) == REG		\    && REGNO (IN) < FIRST_PSEUDO_REGISTER)			\   ? NO_REGS : secondary_reload_class (CLASS, MODE, IN))#define MAYBE_FP_REG_CLASS_P(CLASS) \  reg_classes_intersect_p ((CLASS), FP_REGS)/* On the PA it is not possible to directly move data between   GENERAL_REGS and FP_REGS.  On the 32-bit port, we use the   location at SP-16.  We don't expose this location in the RTL to   avoid scheduling related problems.  For example, the store and   load could be separated by a call to a pure or const function   which has no frame and uses SP-16.  */#define SECONDARY_MEMORY_NEEDED(CLASS1, CLASS2, MODE)			\  (TARGET_64BIT								\   && (MAYBE_FP_REG_CLASS_P (CLASS1) != FP_REG_CLASS_P (CLASS2)		\       || MAYBE_FP_REG_CLASS_P (CLASS2) != FP_REG_CLASS_P (CLASS1)))/* Stack layout; function entry, exit and calling.  *//* Define this if pushing a word on the stack   makes the stack pointer a smaller address.  *//* #define STACK_GROWS_DOWNWARD *//* Believe it or not.  */#define ARGS_GROW_DOWNWARD/* Define this to nonzero if the nominal address of the stack frame   is at the high-address end of the local variables;   that is, each additional local variable allocated   goes at a more negative offset in the frame.  */#define FRAME_GROWS_DOWNWARD 0/* Offset within stack frame to start allocating local variables at.   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the   first local allocated.  Otherwise, it is the offset to the BEGINNING   of the first local allocated.   On the 32-bit ports, we reserve one slot for the previous frame   pointer and one fill slot.  The fill slot is for compatibility   with HP compiled programs.  On the 64-bit ports, we reserve one   slot for the previous frame pointer.  */#define STARTING_FRAME_OFFSET 8/* Define STACK_ALIGNMENT_NEEDED to zero to disable final alignment   of the stack.  The default is to align it to STACK_BOUNDARY.  */#define STACK_ALIGNMENT_NEEDED 0/* If we generate an insn to push BYTES bytes,   this says how many the stack pointer really advances by.   On the HP-PA, don't define this because there are no push insns.  *//*  #define PUSH_ROUNDING(BYTES) *//* Offset of first parameter from the argument pointer register value.   This value will be negated because the arguments grow down.   Also note that on STACK_GROWS_UPWARD machines (such as this one)   this is the distance from the frame pointer to the end of the first   argument, not it's beginning.  To get the real offset of the first   argument, the size of the argument must be added.  */#define FIRST_PARM_OFFSET(FNDECL) (TARGET_64BIT ? -64 : -32)/* When a parameter is passed in a register, stack space is still   allocated for it.  */#define REG_PARM_STACK_SPACE(DECL) (TARGET_64BIT ? 64 : 16)/* 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/* Keep the stack pointer constant throughout the function.   This is both an optimization and a necessity: longjmp   doesn't behave itself when the stack pointer moves within   the function!  */#define ACCUMULATE_OUTGOING_ARGS 1/* The weird HPPA calling conventions require a minimum of 48 bytes on   the stack: 16 bytes for register saves, and 32 bytes for magic.   This is the difference between the logical top of stack and the   actual sp.   On the 64-bit port, the HP C compiler allocates a 48-byte frame   marker, although the runtime documentation only describes a 16   byte marker.  For compatibility, we allocate 48 bytes.  */#define STACK_POINTER_OFFSET \  (TARGET_64BIT ? -(current_function_outgoing_args_size + 48): -32)#define STACK_DYNAMIC_OFFSET(FNDECL)	\  (TARGET_64BIT				\   ? (STACK_POINTER_OFFSET)		\   : ((STACK_POINTER_OFFSET) - current_function_outgoing_args_size))/* Value is 1 if returning from a function call automatically   pops the arguments described by the number-of-args field in the call.   FUNDECL is the declaration node of the function (as a tree),   FUNTYPE is the data type of the function (as a tree),   or for a library call it is an identifier node for the subroutine name.  */#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 0.  */#define FUNCTION_VALUE(VALTYPE, FUNC) function_value (VALTYPE, FUNC)/* 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,							\	       (! TARGET_SOFT_FLOAT					\		&& ((MODE) == SFmode || (MODE) == DFmode) ? 32 : 28))/* 1 if N is a possible register number for a function value   as seen by the caller.  */#define FUNCTION_VALUE_REGNO_P(N) \  ((N) == 28 || (! TARGET_SOFT_FLOAT && (N) == 32))/* Define a data type for recording info about an argument list

⌨️ 快捷键说明

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