1 /* pass2.h 4.4 87/12/10 */ 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 #define SMCON (SPECIAL|6) /* constant < 0 */ 68 /* FORARG and INTEMP are carefully not conflicting with shapes */ 69 70 /* types */ 71 #define TCHAR 01 /* char */ 72 #define TSHORT 02 /* short */ 73 #define TINT 04 /* int */ 74 #define TLONG 010 /* long */ 75 #define TFLOAT 020 /* float */ 76 #define TDOUBLE 040 /* double */ 77 #define TPOINT 0100 /* pointer to something */ 78 #define TUCHAR 0200 /* unsigned char */ 79 #define TUSHORT 0400 /* unsigned short */ 80 #define TUNSIGNED 01000 /* unsigned int */ 81 #define TULONG 02000 /* unsigned long */ 82 #define TPTRTO 04000 /* pointer to one of the above */ 83 #define TANY 010000 /* matches anything within reason */ 84 #define TSTRUCT 020000 /* structure or union */ 85 86 /* reclamation cookies */ 87 #define RNULL 0 /* clobber result */ 88 #define RLEFT 01 /* reclaim left resource */ 89 #define RRIGHT 02 /* reclaim right resource */ 90 #define RESC1 04 /* reclaim resource allocated #1 */ 91 #define RESC2 010 /* reclaim resource allocated #2 */ 92 #define RESC3 020 /* reclaim resource allocated #3 */ 93 #define RESCC 04000 /* reclaim condition codes */ 94 #define RNOP 010000 /* DANGER: can cause loops.. */ 95 96 /* needs */ 97 #define NAREG 01 /* need an A register */ 98 #define NACOUNT 03 /* count mask of A registers */ 99 #define NAMASK 017 /* A register need field mask */ 100 #define NASL 04 /* need A register shared with left resource */ 101 #define NASR 010 /* need A register shared with right resource */ 102 #define NBREG 020 /* need a B register */ 103 #define NBCOUNT 060 /* count mask of B register */ 104 #define NBMASK 0360 /* B register need field mask */ 105 #define NBSL 0100 /* need B register shared with left resource */ 106 #define NBSR 0200 /* need B register shared with right resource */ 107 #define NTEMP 0400 /* need temporary storage location */ 108 #define NTMASK 07400 /* count mask of temporary storage locations */ 109 #define REWRITE 010000 /* need rewrite */ 110 #define EITHER 040000 /* allocate all resources or nothing */ 111 112 #define MUSTDO 010000 /* force register requirements */ 113 #ifndef NOPREF 114 /* also defined in onepass.h */ 115 #define NOPREF 020000 /* no preference for register assignment */ 116 #endif 117 #define NEVEN 0100000 /* even register required */ 118 119 /* register allocation */ 120 extern int rstatus[]; /* register status info */ 121 extern int busy[]; /* register use info */ 122 extern struct respref { 123 int cform; 124 int mform; 125 } respref[]; /* resource preference rules */ 126 127 #define isbreg(r) (rstatus[r]&SBREG) 128 #define istreg(r) (rstatus[r]&(STBREG|STAREG)) 129 #define istnode(p) (p->in.op==REG && istreg(p->tn.rval)) 130 131 #define TBUSY 01000 /* register temporarily busy (during alloc) */ 132 #define PBUSY 02000 /* this reg and next one are used as a pair */ 133 #define ISBUSY(r) (((busy[r])&(PBUSY-1)) > 1) 134 #define REGLOOP(i) for (i = 0; i < REGSZ; ++i) 135 136 extern NODE *deltrees[DELAYS]; /* trees held for delayed evaluation */ 137 extern int deli; /* mmmmm */ 138 139 #define SETSTO(x,y) (stotree = (x), stocook = (y)) 140 extern int stocook; 141 extern NODE *stotree; 142 extern int callflag; 143 144 extern int fregs; 145 146 #ifndef ONEPASS 147 #include "ndu.h" 148 #endif 149 150 extern NODE node[]; 151 152 /* code tables */ 153 extern struct optab { 154 int op; /* operator to match */ 155 int visit; /* goal to match */ 156 int lshape; /* left shape to match */ 157 int ltype; /* left type to match */ 158 int rshape; /* right shape to match */ 159 int rtype; /* right type to match */ 160 int needs; /* resource required */ 161 int rewrite; /* how to rewrite afterwards */ 162 char *cstring; /* code generation template */ 163 } table[]; 164 165 extern NODE resc[]; 166 167 extern OFFSZ tmpoff; 168 extern OFFSZ maxoff; 169 extern OFFSZ baseoff; 170 extern OFFSZ maxtemp; 171 extern int maxtreg; 172 extern int ftnno; 173 extern int rtyflg; 174 extern int nrecur; /* flag to keep track of recursions */ 175 176 extern NODE 177 *talloc(), 178 *eread(), 179 *tcopy(), 180 *getlr(); 181 182 extern CONSZ rdin(); 183 extern int eprint(); 184 extern char *rnames[]; 185 186 extern int lineno; 187 extern char filename[]; 188 extern int fldshf, fldsz; 189 extern int lflag, xdebug, udebug, edebug, odebug; 190 extern int rdebug, radebug, tdebug, sdebug; 191 #ifdef FORT 192 extern int Oflag; 193 #endif 194 195 #ifndef callchk 196 #define callchk(x) allchk() 197 #endif 198 199 #ifndef PUTCHAR 200 #define PUTCHAR(x) putchar(x) 201 #endif 202 203 /* macros for doing double indexing */ 204 #define R2PACK(x,y,z) (0200*((x)+1)+y+040000*z) /* pack 3 regs */ 205 #define R2UPK1(x) ((((x)>>7)-1)&0177) /* unpack reg 1 */ 206 #define R2UPK2(x) ((x)&0177) /* unpack reg 2 */ 207 #define R2UPK3(x) (x>>14) /* unpack reg 3 */ 208 #define R2TEST(x) ((x)>=0200) /* test if packed */ 209 210 #ifdef MULTILEVEL 211 union mltemplate { 212 struct ml_head { 213 int tag; /* tree class */ 214 int subtag; /* subclass of tree */ 215 union mltemplate *nexthead; /* linked by mlinit() */ 216 } mlhead; 217 struct ml_node { 218 int op; /* operator or op description */ 219 int nshape; /* node shape */ 220 /* 221 * Both op and nshape must match the node. 222 * where the work is to be done entirely by 223 * op, nshape can be SANY, visa versa, op can 224 * be OPANY. 225 */ 226 int ntype; /* type descriptor */ 227 } mlnode; 228 }; 229 extern union mltemplate mltree[]; 230 #endif 231 #endif 232