# include "macdefs" # include "mac2defs" # include "manifest" # ifdef ONEPASS /* bunch of stuff for putting the passes together... */ # define crslab crs2lab # define where where2 # define xdebug x2debug # define tdebug t2debug # define deflab def2lab # define edebug e2debug # define eprint e2print # define getlab get2lab # define filename ftitle # endif /* cookies, used as arguments to codgen */ # define FOREFF 01 /* compute for effects only */ # define INAREG 02 /* compute into a register */ # define INTAREG 04 /* compute into a scratch register */ # define INBREG 010 /* compute into a lvalue register */ # define INTBREG 020 /* compute into a scratch lvalue register */ # define FORCC 040 /* compute for condition codes only */ # define INTEMP 010000 /* compute into a temporary location */ # define FORARG 020000 /* compute for an argument of a function */ # define FORREW 040000 /* search the table, looking for a rewrite rule */ /* OP descriptors */ /* the ASG operator may be used on some of these */ # define OPSIMP 010000 /* +, -, &, |, ^ */ # define OPCOMM 010002 /* +, &, |, ^ */ # define OPMUL 010004 /* *, / */ # define OPDIV 010006 /* /, % */ # define OPUNARY 010010 /* unary ops */ # define OPLEAF 010012 /* leaves */ # define OPANY 010014 /* any op... */ # define OPLOG 010016 /* logical ops */ # define OPFLOAT 010020 /* +, -, *, or / (for floats) */ # define OPSHFT 010022 /* <<, >> */ # define OPLTYPE 010024 /* leaf type nodes (e.g, NAME, ICON, etc. ) */ /* match returns */ # define MNOPE 010000 # define MDONE 010001 /* shapes */ # define SANY 01 /* same as FOREFF */ # define SAREG 02 /* same as INAREG */ # define STAREG 04 /* same as INTAREG */ # define SBREG 010 /* same as INBREG */ # define STBREG 020 /* same as INTBREG */ # define SCC 040 /* same as FORCC */ # define SNAME 0100 # define SCON 0200 # define SFLD 0400 # define SOREG 01000 # define STARNM 02000 # define STARREG 04000 # define SWADD 040000 # define SPECIAL 0100000 # define SZERO SPECIAL # define SONE (SPECIAL|1) # define SMONE (SPECIAL|2) /* FORARG and INTEMP are carefully not conflicting with shapes */ /* types */ # define TCHAR 01 # define TSHORT 02 # define TINT 04 # define TLONG 010 # define TFLOAT 020 # define TDOUBLE 040 # define TPOINT 0100 # define TUCHAR 0200 # define TUSHORT 0400 # define TUNSIGNED 01000 # define TULONG 02000 # define TPTRTO 04000 /* pointer to one of the above */ # define TANY 010000 /* matches anything within reason */ # define TSTRUCT 020000 /* structure or union */ /* reclamation cookies */ # define RNULL 0 /* clobber result */ # define RLEFT 01 # define RRIGHT 02 # define RESC1 04 # define RESC2 010 # define RESC3 020 # define RESCC 04000 # define RNOP 010000 /* DANGER: can cause loops.. */ /* needs */ # define NAREG 01 # define NACOUNT 03 # define NAMASK 017 # define NASL 04 /* share left register */ # define NASR 010 /* share right register */ # define NBREG 020 # define NBCOUNT 060 # define NBMASK 0360 # define NBSL 0100 # define NBSR 0200 # define NTEMP 0400 # define NTMASK 07400 # define REWRITE 010000 # define MUSTDO 010000 /* force register requirements */ # define NOPREF 020000 /* no preference for register assignment */ /* register allocation */ extern int rstatus[]; extern int busy[]; extern struct respref { int cform; int mform; } respref[]; # define isbreg(r) (rstatus[r]&SBREG) # define istreg(r) (rstatus[r]&(STBREG|STAREG)) # define istnode(p) (p->op==REG && istreg(p->rval)) # define TBUSY 01000 # define REGLOOP(i) for(i=0;i<REGSZ;++i) # define SETSTO(x,y) (stotree=(x),stocook=(y)) extern int stocook; # define DELAYS 20 extern NODE *deltrees[DELAYS]; extern int deli; /* mmmmm */ extern NODE *stotree; extern int callflag; extern int fregs; # ifndef ONEPASS union ndu { struct { int op; int rall; TWORD type; int su; char name[NCHNAM]; NODE *left; NODE *right; }; struct { int op; int rall; TWORD type; int su; char name[NCHNAM]; CONSZ lval; int rval; }; struct { int op, rall; TWORD type; int su; int label; /* for use with branching */ }; struct { int op, rall; TWORD type; int su; int stsize; /* sizes of structure objects */ int stalign; /* alignment of structure objects */ }; }; #endif extern NODE node[]; extern struct optab { int op; int visit; int lshape; int ltype; int rshape; int rtype; int needs; int rewrite; char * cstring; } table[]; extern NODE resc[]; extern OFFSZ tmpoff; extern OFFSZ maxoff; extern OFFSZ baseoff; extern OFFSZ maxtemp; extern int maxtreg; extern int ftnno; extern int rtyflg; extern int nrecur; /* flag to keep track of recursions */ # define NRECUR (10*TREESZ) extern NODE *talloc(), *eread(), *tcopy(), *getlr(); extern CONSZ rdin(); extern int eprint(); extern char *rnames[]; extern int lineno; extern char filename[]; extern int fldshf, fldsz; extern int lflag, xdebug, udebug, edebug, odebug, rdebug, radebug, tdebug, sdebug; #ifndef callchk #define callchk(x) allchk() #endif #ifndef PUTCHAR # define PUTCHAR(x) putchar(x) #endif /* macros for doing double indexing */ # define R2PACK(x,y) (0200*((x)+1)+y) # define R2UPK1(x) (((x)>>7)-1) # define R2UPK2(x) ((x)&0177) # define R2TEST(x) ((x)>=0200)