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

📄 ccreg.h

📁 KCC , a good c compiler, write by Ken Harrenstien
💻 H
字号:
/*	CCREG.H - Declarations for KCC register management
**
**	(c) Copyright Ken Harrenstien 1989
**		All changes after v.17, 5-Apr-1988
**	(c) Copyright Ken Harrenstien, SRI International 1985, 1986
**		All changes after v.8, 8-Aug-1985
**
** Original version by David Eppstein / Stanford University / 8 Mar 1985
*/

#define R_ZERO		000	/* AC0, never used for many reasons */
#define R_RETVAL	001	/* register for subroutine return */
#define R_RETDBL	002	/* second return for doublewords */
#define R_SCRREG	016	/* scratch for CCOUT */
#define R_FAP		016	/* Also use as Fortran Arg Pointer reg */
#define	R_SP		017	/* push down Stack Pointer */

#define REGMASK 017		/* mask to get reg only from bp idx */
#define NREGS   020		/* number of physical registers */

#define VREG struct vreg	/* Virtual Register definition */

VREG
    {
    char	Vrflags;		/* Flags for spilled, double, etc */
    int		Vrloc;			/* if VRF_SPILLED, stack offset */
    TYPE*	Vrtype;			/* C type of object in register */
    INT		Vroldstk;		/* where to back stack to */
    VREG*	Vrnext;
    VREG*	Vrprev;			/* double linked list pointers */
    VREG*	Vrmate;			/* Ptr to other reg if part of dbl */
    };

#define VRF_SPILLED	01	/* register is on stack */
#define VRF_REGPAIR	02	/* Reg is 1st of a doubleword */
#define VRF_REG2ND	04	/* Reg is 2nd of a doubleword */
#define VRF_LOCK	010	/* register locked in current phys reg */
#define VRF_SPECIAL	020	/* Special vreg (R_RETVAL or R_SP) */
#if 0
 #define VRF_HASVAL	0100	/* Reg has a needed val, don't clobber it */
#endif				/** (OK to change reg # if change instr that
				** set it)
				*/
#define VR_RETVAL &vr_retval	/* Constant virtual regs */
#define VR_SP &vr_sp
extern VREG vr_retval, vr_sp;	/* Initialized in CCREG */

/* FW 2A(47) */
#define Register_Nopreserve(r) (((r) <= r_maxnopreserve) || ((r) > R_MAXREG))
#define Register_Preserve(r)  (((r) > r_maxnopreserve) && ((r) <= R_MAXREG))

#define Register_Id(node)  ((node)->Nop == Q_IDENT &&	\
    ((node)->Nid->Sclass == SC_RAUTO ||	(node)->Nid->Sclass == SC_RARG))

#define Flag_Preserve_Reg(node)	{		\
    if (Register_Id(node))			\
          r_preserve = (node)->Nid->Sreg;	\
    }

#define VR_ZERO &vr_zero	/* For FORTRAN linkage */
#define VR_FAP &vr_fap
extern VREG vr_zero, vr_fap;

/* Virtual Register routines, in CCREG */
extern void vrinit(),		/* Init regs for new routine */
	vrendchk();		/* Check regs at end of routine */
extern VREG *vrget(), *vrdget();	/* Allocate virtual register or pair */
extern VREG *vrretget(), *vrretdget();	/* Same but use return-value regs */
extern void vrfree();		/* Release vreg */
extern void vrset();		/* Capture vreg */
extern void vrallspill();	/* Spill all active regs onto stack */
extern VREG *vrwiden();		/* Widen a vreg into a pair */
extern void vrlowiden();	/* Common case: widen vreg in low direction */
extern void vrnarrow();		/* Narrow a vreg pair into single vreg */
extern int vrreal();		/* Get real reg # for active virtual reg */
extern int vrtoreal();		/* Ensure reg is active, return real # */
extern int vrstoreal();		/* Same for 2 regs, return # of 1st */
extern int vrispair();		/* TRUE if vreg is 1st of a vreg pair */
extern void vrufcreg();		/* Undo MOVE of failed changereg w/o freeing*/
extern int rfree();		/* TRUE if real register is assigned */
extern void rset();		/* sets a real register */
#if 0
 extern int rhasval();		/* TRUE if real register has a value */
#endif

#define VR2(vr) ((vr)->Vrmate)	/* Get 2nd of a vreg pair */

/* Register bit macros.  Turns register # into a bit mask. */
#define regbit(r) (1<<(r))	/* Single-register bit */
#define dregbit(r) (3<<(r))	/* Double-register bits */

/* Register bit routines, in CCOPT */

extern int rbref(), rbset(), rbmod(), rbuse(), rbchg(), rbin();
#if 0	/* 5/91 KCC size */
extern int rrref(), rrset(), rrmod(), rruse(), rrchg(), rrin();
#endif
extern int rbincode(), rbinreg(), rbinaddr();
extern int rincode(), rinreg(), rinaddr();

/* Array of register bits indexed by register #, for faster use. */

extern int rbits[NREGS];	/* Array of regbit(n) */
extern int drbits[NREGS];	/* Array of dregbit(n) */

⌨️ 快捷键说明

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