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