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

📄 m68hc11.h

📁 linux下的gcc编译器
💻 H
📖 第 1 页 / 共 5 页
字号:
   contents of class N.  The way the integer MASK is interpreted is   that register R is in the class if `MASK & (1 << R)' is 1.  *//*--------------------------------------------------------------   X		0x00000001   D		0x00000002   Y		0x00000004   SP		0x00000008   PC		0x00000010   A		0x00000020   B		0x00000040   CCR		0x00000080   Z		0x00000100   FRAME        0x00000200   ZTMP		0x00000400   ZREG		0x00000800   XYREG	0x00001000   FAKE         0x00002000   Di		0xFFFFc000, 0x03FFF   SFRAME       0x00000000, 0x04000   AP           0x00000000, 0x08000   D_OR_X_REGS represents D+X. It is used for 32-bits numbers.   A_REGS      represents a valid base register for indexing. It represents	       X,Y and the Z register.   S_REGS      represents the soft-registers. This includes the hard frame	       and soft frame registers.--------------------------------------------------------------*/#define REG_CLASS_CONTENTS \/* NO_REGS */		{{ 0x00000000, 0x00000000 },			\/* D_REGS  */		 { 0x00000002, 0x00000000 }, /* D */            \/* X_REGS  */		 { 0x00000001, 0x00000000 }, /* X */            \/* Y_REGS  */		 { 0x00000004, 0x00000000 }, /* Y */            \/* SP_REGS */		 { 0x00000008, 0x00000000 }, /* SP */           \/* DA_REGS */		 { 0x00000020, 0x00000000 }, /* A */            \/* DB_REGS */		 { 0x00000040, 0x00000000 }, /* B */            \/* Z_REGS  */		 { 0x00000100, 0x00000000 }, /* Z */            \/* D8_REGS */		 { 0x00000060, 0x00000000 }, /* A B */          \/* Q_REGS  */		 { 0x00000062, 0x00000000 }, /* A B D */        \/* D_OR_X_REGS */        { 0x00000003, 0x00000000 }, /* D X */          \/* D_OR_Y_REGS */        { 0x00000006, 0x00000000 }, /* D Y */          \/* D_OR_SP_REGS */       { 0x0000000A, 0x00000000 }, /* D SP */         \/* X_OR_Y_REGS  */	 { 0x00000005, 0x00000000 }, /* X Y */          \/* A_REGS  */		 { 0x00000105, 0x00000000 }, /* X Y Z */        \/* X_OR_SP_REGS */       { 0x00000009, 0x00000000 }, /* X SP */         \/* Y_OR_SP_REGS */       { 0x0000000C, 0x00000000 }, /* Y SP */         \/* X_OR_Y_OR_D_REGS */   { 0x00000007, 0x00000000 }, /* D X Y */        \/* A_OR_D_REGS  */       { 0x00000107, 0x00000000 }, /* D X Y Z */      \/* A_OR_SP_REGS */       { 0x0000010D, 0x00000000 }, /* X Y SP */       \/* H_REGS  */		 { 0x0000010F, 0x00000000 }, /* D X Y SP */     \/* S_REGS  */		 { 0xFFFFDE00, 0x00007FFF }, /* _.D,..,FP,Z*  */  \/* D_OR_S_REGS */	 { 0xFFFFDE02, 0x00007FFF }, /* D _.D */        \/* X_OR_S_REGS */	 { 0xFFFFDE01, 0x00007FFF }, /* X _.D */        \/* Y_OR_S_REGS */	 { 0xFFFFDE04, 0x00007FFF }, /* Y _.D */        \/* Z_OR_S_REGS */	 { 0xFFFFDF00, 0x00007FFF }, /* Z _.D */        \/* SP_OR_S_REGS */	 { 0xFFFFDE08, 0x00007FFF }, /* SP _.D */	\/* D_OR_X_OR_S_REGS */	 { 0xFFFFDE03, 0x00007FFF }, /* D X _.D */      \/* D_OR_Y_OR_S_REGS */	 { 0xFFFFDE06, 0x00007FFF }, /* D Y _.D */      \/* D_OR_SP_OR_S_REGS */	 { 0xFFFFDE0A, 0x00007FFF }, /* D SP _.D */     \/* A_OR_S_REGS */	 { 0xFFFFDF05, 0x00007FFF }, /* X Y _.D */      \/* D_OR_A_OR_S_REGS */	 { 0xFFFFDF07, 0x00007FFF }, /* D X Y _.D */    \/* TMP_REGS  */	         { 0x00002000, 0x00000000 }, /* FAKE */		\/* D_OR_A_OR_TMP_REGS*/  { 0x00002107, 0x00000000 }, /* D X Y Z Fake */  \/* G_REGS  */		 { 0xFFFFFF1F, 0x00007FFF }, /* ? _.D D X Y */   \/* ALL_REGS*/		 { 0xFFFFFFFF, 0x00007FFF }}/* set up a C expression whose value is a register class containing hard   register REGNO */#define Q_REGNO_P(REGNO)	((REGNO) == HARD_A_REGNUM \				 || (REGNO) == HARD_B_REGNUM)#define Q_REG_P(X)              (REG_P (X) && Q_REGNO_P (REGNO (X)))#define D_REGNO_P(REGNO)        ((REGNO) == HARD_D_REGNUM)#define D_REG_P(X)              (REG_P (X) && D_REGNO_P (REGNO (X)))#define DB_REGNO_P(REGNO)       ((REGNO) == HARD_B_REGNUM)#define DB_REG_P(X)             (REG_P (X) && DB_REGNO_P (REGNO (X)))#define DA_REGNO_P(REGNO)       ((REGNO) == HARD_A_REGNUM)#define DA_REG_P(X)             (REG_P (X) && DA_REGNO_P (REGNO (X)))#define X_REGNO_P(REGNO)        ((REGNO) == HARD_X_REGNUM)#define X_REG_P(X)              (REG_P (X) && X_REGNO_P (REGNO (X)))#define Y_REGNO_P(REGNO)        ((REGNO) == HARD_Y_REGNUM)#define Y_REG_P(X)              (REG_P (X) && Y_REGNO_P (REGNO (X)))#define Z_REGNO_P(REGNO)        ((REGNO) == HARD_Z_REGNUM)#define Z_REG_P(X)              (REG_P (X) && Z_REGNO_P (REGNO (X)))#define SP_REGNO_P(REGNO)       ((REGNO) == HARD_SP_REGNUM)#define SP_REG_P(X)             (REG_P (X) && SP_REGNO_P (REGNO (X)))/* Address register.  */#define A_REGNO_P(REGNO)        ((REGNO) == HARD_X_REGNUM \                                 || (REGNO) == HARD_Y_REGNUM \                                 || (REGNO) == HARD_Z_REGNUM)#define A_REG_P(X)              (REG_P (X) && A_REGNO_P (REGNO (X)))/* M68hc11 hard registers.  */#define H_REGNO_P(REGNO)        (D_REGNO_P (REGNO) || A_REGNO_P (REGNO) \				 || SP_REGNO_P (REGNO) || Q_REGNO_P (REGNO))#define H_REG_P(X)              (REG_P (X) && H_REGNO_P (REGNO (X)))#define FAKE_REGNO_P(REGNO)     ((REGNO) == FAKE_CLOBBER_REGNUM)#define FAKE_REG_P(X)           (REG_P (X) && FAKE_REGNO_P (REGNO (X)))/* Soft registers (or register emulation for gcc).  The temporary register   used by insn template must be part of the S_REGS class so that it   matches the 'u' constraint.  */#define S_REGNO_P(REGNO)        ((REGNO) >= SOFT_TMP_REGNUM \                                 && (REGNO) <= SOFT_REG_LAST \                                 && (REGNO) != FAKE_CLOBBER_REGNUM)#define S_REG_P(X)              (REG_P (X) && S_REGNO_P (REGNO (X)))#define Z_REGNO_P(REGNO)        ((REGNO) == HARD_Z_REGNUM)#define Z_REG_P(X)              (REG_P (X) && Z_REGNO_P (REGNO (X)))/* General register.  */#define G_REGNO_P(REGNO)        (H_REGNO_P (REGNO) || S_REGNO_P (REGNO) \                                 || ((REGNO) == HARD_PC_REGNUM) \				 || ((REGNO) == HARD_FP_REGNUM) \				 || ((REGNO) == SOFT_FP_REGNUM) \				 || ((REGNO) == FAKE_CLOBBER_REGNUM) \				 || ((REGNO) == SOFT_AP_REGNUM))#define G_REG_P(X)              (REG_P (X) && G_REGNO_P (REGNO (X)))#define REGNO_REG_CLASS(REGNO) \  (D_REGNO_P (REGNO) ? D_REGS : \   (X_REGNO_P (REGNO) ? X_REGS : \    (Y_REGNO_P (REGNO) ? Y_REGS : \     (SP_REGNO_P (REGNO) ? SP_REGS : \      (Z_REGNO_P (REGNO) ? Z_REGS : \       (H_REGNO_P (REGNO) ? H_REGS : \        (FAKE_REGNO_P (REGNO) ? TMP_REGS : \	 (S_REGNO_P (REGNO) ? S_REGS : \	  (DA_REGNO_P (REGNO) ? DA_REGS: \	   (DB_REGNO_P (REGNO) ? DB_REGS: \            (G_REGNO_P (REGNO) ? G_REGS : ALL_REGS)))))))))))/* Get reg_class from a letter in the machine description.  */extern enum reg_class m68hc11_tmp_regs_class;#define REG_CLASS_FROM_LETTER(C) \   ((C) == 'a' ? DA_REGS : \    (C) == 'A' ? A_REGS : \    (C) == 'b' ? DB_REGS : \    (C) == 'B' ? X_OR_Y_REGS : \    (C) == 'd' ? D_REGS : \    (C) == 'D' ? D_OR_X_REGS : \    (C) == 'q' ? Q_REGS : \    (C) == 'h' ? H_REGS : \    (C) == 't' ? TMP_REGS : \    (C) == 'u' ? S_REGS : \    (C) == 'v' ? m68hc11_tmp_regs_class : \    (C) == 'w' ? SP_REGS : \    (C) == 'x' ? X_REGS : \    (C) == 'y' ? Y_REGS : \    (C) == 'z' ? Z_REGS : NO_REGS)#define PREFERRED_RELOAD_CLASS(X,CLASS)	preferred_reload_class(X,CLASS)#define SMALL_REGISTER_CLASSES 1/* A C expression that is nonzero if hard register number REGNO2 can be   considered for use as a rename register for REGNO1 */#define HARD_REGNO_RENAME_OK(REGNO1,REGNO2) \  m68hc11_hard_regno_rename_ok ((REGNO1), (REGNO2))/* A C expression whose value is nonzero if pseudos that have been   assigned to registers of class CLASS would likely be spilled   because registers of CLASS are needed for spill registers.   The default value of this macro returns 1 if CLASS has exactly one   register and zero otherwise.  On most machines, this default   should be used.  Only define this macro to some other expression   if pseudo allocated by `local-alloc.c' end up in memory because   their hard registers were needed for spill registers.  If this   macro returns nonzero for those classes, those pseudos will only   be allocated by `global.c', which knows how to reallocate the   pseudo to another register.  If there would not be another   register available for reallocation, you should not change the   definition of this macro since the only effect of such a   definition would be to slow down register allocation.  */#define CLASS_LIKELY_SPILLED_P(CLASS)					\  (((CLASS) == D_REGS)							\   || ((CLASS) == X_REGS)                                               \   || ((CLASS) == Y_REGS)                                               \   || ((CLASS) == A_REGS)                                               \   || ((CLASS) == SP_REGS)                                              \   || ((CLASS) == D_OR_X_REGS)                                          \   || ((CLASS) == D_OR_Y_REGS)                                          \   || ((CLASS) == X_OR_SP_REGS)                                         \   || ((CLASS) == Y_OR_SP_REGS)                                         \   || ((CLASS) == D_OR_SP_REGS))/* Return the maximum number of consecutive registers needed to represent   mode MODE in a register of class CLASS.  */#define CLASS_MAX_NREGS(CLASS, MODE)		\(((CLASS) == DA_REGS || (CLASS) == DB_REGS \   || (CLASS) == D8_REGS || (CLASS) == Q_REGS) ? GET_MODE_SIZE (MODE) \ : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))/* 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.   `K' is for 0.   `L' is for range -65536 to 65536   `M' is for values whose 16-bit low part is 0   'N' is for +1 or -1.   'O' is for 16 (for rotate using swap).   'P' is for range -8 to 2 (used by addhi_sp)   'I', 'J' are not used.  */#define CONST_OK_FOR_LETTER_P(VALUE, C) \  ((C) == 'K' ? (VALUE) == 0 : \   (C) == 'L' ? ((VALUE) >= -65536 && (VALUE) <= 65535) : \   (C) == 'M' ? ((VALUE) & 0x0ffffL) == 0 : \   (C) == 'N' ? ((VALUE) == 1 || (VALUE) == -1) : \   (C) == 'I' ? ((VALUE) >= -2 && (VALUE) <= 2) : \   (C) == 'O' ? (VALUE) == 16 : \   (C) == 'P' ? ((VALUE) <= 2 && (VALUE) >= -8) : 0)/* Similar, but for floating constants, and defining letters G and H.   `G' is for 0.0.  */#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) /* 'U' represents certain kind of memory indexed operand for 68HC12.   and any memory operand for 68HC11.  */#define EXTRA_CONSTRAINT(OP, C)                         \((C) == 'U' ? m68hc11_small_indexed_indirect_p (OP, GET_MODE (OP)) \ : (C) == 'Q' ? m68hc11_symbolic_p (OP, GET_MODE (OP)) \ : (C) == 'R' ? m68hc11_indirect_p (OP, GET_MODE (OP)) \ : (C) == 'S' ? (memory_operand (OP, GET_MODE (OP)) \		 && non_push_operand (OP, GET_MODE (OP))) : 0)/* 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/* Define this 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.   Don't define for 68HC11, the frame pointer is the bottom   of local variables.  *//* #define FRAME_GROWS_DOWNWARD *//* Define this if successive arguments to a function occupy decreasing    addresses in the stack.  *//* #define ARGS_GROW_DOWNWARD *//* 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.  */#define STARTING_FRAME_OFFSET		0/* Offset of first parameter from the argument pointer register value.  */#define FIRST_PARM_OFFSET(FNDECL)	2/* After the prologue, RA is at 0(AP) in the current frame.  */#define RETURN_ADDR_RTX(COUNT, FRAME)					\  ((COUNT) == 0								\   ? gen_rtx_MEM (Pmode, arg_pointer_rtx)                               \   : 0)/* Before the prologue, the top of the frame is at 2(sp).  */#define INCOMING_FRAME_SP_OFFSET        2/* Define this if functions should assume that stack space has been   allocated for arguments even when their values are passed in   registers.     The value of this macro is the size, in bytes, of the area reserved for   arguments passed in registers.     This space can either be allocated by the caller or be a part of the   machine-dependent stack frame: `OUTGOING_REG_PARM_STACK_SPACE'   says which.  *//* #define REG_PARM_STACK_SPACE(FNDECL)	2 *//* Define this macro if REG_PARM_STACK_SPACE is defined but stack   parameters don't skip the area specified by REG_PARM_STACK_SPACE.   Normally, when a parameter is not passed in registers, it is placed on   the stack beyond the REG_PARM_STACK_SPACE area.  Defining this macro     suppresses this behavior and causes the parameter to be passed on the   stack in its natural location.  *//* #define STACK_PARMS_IN_REG_PARM_AREA *//* Register to use for pushing function arguments.  */#define STACK_POINTER_REGNUM		HARD_SP_REGNUM/* Base register for access to local variables of the function.  */#define FRAME_POINTER_REGNUM		SOFT_FP_REGNUM#define HARD_FRAME_POINTER_REGNUM	HARD_FP_REGNUM/* Base register for access to arguments of the function.  */#define ARG_POINTER_REGNUM		SOFT_AP_REGNUM

⌨️ 快捷键说明

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