1 /* pass2.h 4.1 85/03/19 */ 2 3 #ifndef _PASS2_ 4 #define _PASS2_ 5 6 #include "macdefs.h" 7 #include "mac2defs.h" 8 #include "manifest.h" 9 10 /* cookies, used as arguments to codgen */ 11 #define FOREFF 01 /* compute for effects only */ 12 #define INAREG 02 /* compute into a register */ 13 #define INTAREG 04 /* compute into a scratch register */ 14 #define INBREG 010 /* compute into a lvalue register */ 15 #define INTBREG 020 /* compute into a scratch lvalue register */ 16 #define FORCC 040 /* compute for condition codes only */ 17 #define INTEMP 010000 /* compute into a temporary location */ 18 #define FORARG 020000 /* compute for an argument of a function */ 19 #define FORREW 040000 /* search the table for a rewrite rule */ 20 21 /* 22 * OP descriptors, 23 * the ASG operator may be used on some of these 24 */ 25 #define OPSIMP 010000 /* +, -, &, |, ^ */ 26 #define OPCOMM 010002 /* +, &, |, ^ */ 27 #define OPMUL 010004 /* *, / */ 28 #define OPDIV 010006 /* /, % */ 29 #define OPUNARY 010010 /* unary ops */ 30 #define OPLEAF 010012 /* leaves */ 31 #define OPANY 010014 /* any op... */ 32 #define OPLOG 010016 /* logical ops */ 33 #define OPFLOAT 010020 /* +, -, *, or / (for floats) */ 34 #define OPSHFT 010022 /* <<, >> */ 35 #define OPLTYPE 010024 /* leaf type nodes (e.g, NAME, ICON, etc.) */ 36 37 /* match returns */ 38 #define MNOPE 010000 /* no match generated */ 39 #define MDONE 010001 /* done evalution */ 40 41 /* shapes */ 42 #define SANY 01 /* same as FOREFF */ 43 #define SAREG 02 /* same as INAREG */ 44 #define STAREG 04 /* same as INTAREG */ 45 #define SBREG 010 /* same as INBREG */ 46 #define STBREG 020 /* same as INTBREG */ 47 #define SCC 040 /* same as FORCC */ 48 #define SNAME 0100 /* name */ 49 #define SCON 0200 /* constant */ 50 #define SFLD 0400 /* field */ 51 #define SOREG 01000 /* offset from register */ 52 /* indirection or wild card shapes */ 53 #ifndef WCARD1 54 #define STARNM 02000 /* indirect through name */ 55 #endif 56 #ifndef WCARD2 57 #define STARREG 04000 /* indirect through register */ 58 #endif 59 #define SWADD 040000 /* word address */ 60 #define SPECIAL 0100000 /* special stuff (follows) */ 61 #define SZERO SPECIAL /* constant zero */ 62 #define SONE (SPECIAL|1) /* constant +1 */ 63 #define SMONE (SPECIAL|2) /* constant -1 */ 64 #define SCCON (SPECIAL|3) /* -256 <= constant < 256 */ 65 #define SSCON (SPECIAL|4) /* -32768 <= constant < 32768 */ 66 #define SSOREG (SPECIAL|5) /* non-indexed OREG */ 67 /* FORARG and INTEMP are carefully not conflicting with shapes */ 68 69 /* types */ 70 #define TCHAR 01 /* char */ 71 #define TSHORT 02 /* short */ 72 #define TINT 04 /* int */ 73 #define TLONG 010 /* long */ 74 #define TFLOAT 020 /* float */ 75 #define TDOUBLE 040 /* double */ 76 #define TPOINT 0100 /* pointer to something */ 77 #define TUCHAR 0200 /* unsigned char */ 78 #define TUSHORT 0400 /* unsigned short */ 79 #define TUNSIGNED 01000 /* unsigned int */ 80 #define TULONG 02000 /* unsigned long */ 81 #define TPTRTO 04000 /* pointer to one of the above */ 82 #define TANY 010000 /* matches anything within reason */ 83 #define TSTRUCT 020000 /* structure or union */ 84 85 /* reclamation cookies */ 86 #define RNULL 0 /* clobber result */ 87 #define RLEFT 01 /* reclaim left resource */ 88 #define RRIGHT 02 /* reclaim right resource */ 89 #define RESC1 04 /* reclaim resource allocated #1 */ 90 #define RESC2 010 /* reclaim resource allocated #2 */ 91 #define RESC3 020 /* reclaim resource allocated #3 */ 92 #define RESCC 04000 /* reclaim condition codes */ 93 #define RNOP 010000 /* DANGER: can cause loops.. */ 94 95 /* needs */ 96 #define NAREG 01 /* need an A register */ 97 #define NACOUNT 03 /* count mask of A registers */ 98 #define NAMASK 017 /* A register need field mask */ 99 #define NASL 04 /* need A register shared with left resource */ 100 #define NASR 010 /* need A register shared with right resource */ 101 #define NBREG 020 /* need a B register */ 102 #define NBCOUNT 060 /* count mask of B register */ 103 #define NBMASK 0360 /* B register need field mask */ 104 #define NBSL 0100 /* need B register shared with left resource */ 105 #define NBSR 0200 /* need B register shared with right resource */ 106 #define NTEMP 0400 /* need temporary storage location */ 107 #define NTMASK 07400 /* count mask of temporary storage locations */ 108 #define REWRITE 010000 /* need rewrite */ 109 #define EITHER 040000 /* allocate all resources or nothing */ 110 111 #define MUSTDO 010000 /* force register requirements */ 112 #ifndef NOPREF 113 /* also defined in onepass.h */ 114 #define NOPREF 020000 /* no preference for register assignment */ 115 #endif 116 117 /* register allocation */ 118 extern int rstatus[]; /* register status info */ 119 extern int busy[]; /* register use info */ 120 extern struct respref { 121 int cform; 122 int mform; 123 } respref[]; /* resource preference rules */ 124 125 #define isbreg(r) (rstatus[r]&SBREG) 126 #define istreg(r) (rstatus[r]&(STBREG|STAREG)) 127 #define istnode(p) (p->in.op==REG && istreg(p->tn.rval)) 128 129 #define TBUSY 01000 /* register temporarily busy (during alloc) */ 130 #define REGLOOP(i) for (i = 0; i < REGSZ; ++i) 131 132 extern NODE *deltrees[DELAYS]; /* trees held for delayed evaluation */ 133 extern int deli; /* mmmmm */ 134 135 #define SETSTO(x,y) (stotree = (x), stocook = (y)) 136 extern int stocook; 137 extern NODE *stotree; 138 extern int callflag; 139 140 extern int fregs; 141 142 #ifndef ONEPASS 143 #include "ndu.h" 144 #endif 145 146 extern NODE node[]; 147 148 /* code tables */ 149 extern struct optab { 150 int op; /* operator to match */ 151 int visit; /* goal to match */ 152 int lshape; /* left shape to match */ 153 int ltype; /* left type to match */ 154 int rshape; /* right shape to match */ 155 int rtype; /* right type to match */ 156 int needs; /* resource required */ 157 int rewrite; /* how to rewrite afterwards */ 158 char *cstring; /* code generation template */ 159 } table[]; 160 161 extern NODE resc[]; 162 163 extern OFFSZ tmpoff; 164 extern OFFSZ maxoff; 165 extern OFFSZ baseoff; 166 extern OFFSZ maxtemp; 167 extern int maxtreg; 168 extern int ftnno; 169 extern int rtyflg; 170 extern int nrecur; /* flag to keep track of recursions */ 171 172 extern NODE 173 *talloc(), 174 *eread(), 175 *tcopy(), 176 *getlr(); 177 178 extern CONSZ rdin(); 179 extern int eprint(); 180 extern char *rnames[]; 181 182 extern int lineno; 183 extern char filename[]; 184 extern int fldshf, fldsz; 185 extern int lflag, xdebug, udebug, edebug, odebug; 186 extern int rdebug, radebug, tdebug, sdebug; 187 #ifdef FORT 188 extern int Oflag; 189 #endif 190 191 #ifndef callchk 192 #define callchk(x) allchk() 193 #endif 194 195 #ifndef PUTCHAR 196 #define PUTCHAR(x) putchar(x) 197 #endif 198 199 /* macros for doing double indexing */ 200 #define R2PACK(x,y,z) (0200*((x)+1)+y+040000*z) /* pack 3 regs */ 201 #define R2UPK1(x) ((((x)>>7)-1)&0177) /* unpack reg 1 */ 202 #define R2UPK2(x) ((x)&0177) /* unpack reg 2 */ 203 #define R2UPK3(x) (x>>14) /* unpack reg 3 */ 204 #define R2TEST(x) ((x)>=0200) /* test if packed */ 205 206 #ifdef MULTILEVEL 207 union mltemplate { 208 struct ml_head { 209 int tag; /* tree class */ 210 int subtag; /* subclass of tree */ 211 union mltemplate *nexthead; /* linked by mlinit() */ 212 } mlhead; 213 struct ml_node { 214 int op; /* operator or op description */ 215 int nshape; /* node shape */ 216 /* 217 * Both op and nshape must match the node. 218 * where the work is to be done entirely by 219 * op, nshape can be SANY, visa versa, op can 220 * be OPANY. 221 */ 222 int ntype; /* type descriptor */ 223 } mlnode; 224 }; 225 extern union mltemplate mltree[]; 226 #endif 227 #endif 228