|
|
1.1 ! root 1: /* pass2.h 4.2 86/10/29 */ ! 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: #define NEVEN 0100000 /* even register required */ ! 117: ! 118: /* register allocation */ ! 119: extern int rstatus[]; /* register status info */ ! 120: extern int busy[]; /* register use info */ ! 121: extern struct respref { ! 122: int cform; ! 123: int mform; ! 124: } respref[]; /* resource preference rules */ ! 125: ! 126: #define isbreg(r) (rstatus[r]&SBREG) ! 127: #define istreg(r) (rstatus[r]&(STBREG|STAREG)) ! 128: #define istnode(p) (p->in.op==REG && istreg(p->tn.rval)) ! 129: ! 130: #define TBUSY 01000 /* register temporarily busy (during alloc) */ ! 131: #define REGLOOP(i) for (i = 0; i < REGSZ; ++i) ! 132: ! 133: extern NODE *deltrees[DELAYS]; /* trees held for delayed evaluation */ ! 134: extern int deli; /* mmmmm */ ! 135: ! 136: #define SETSTO(x,y) (stotree = (x), stocook = (y)) ! 137: extern int stocook; ! 138: extern NODE *stotree; ! 139: extern int callflag; ! 140: ! 141: extern int fregs; ! 142: ! 143: #ifndef ONEPASS ! 144: #include "ndu.h" ! 145: #endif ! 146: ! 147: extern NODE node[]; ! 148: ! 149: /* code tables */ ! 150: extern struct optab { ! 151: int op; /* operator to match */ ! 152: int visit; /* goal to match */ ! 153: int lshape; /* left shape to match */ ! 154: int ltype; /* left type to match */ ! 155: int rshape; /* right shape to match */ ! 156: int rtype; /* right type to match */ ! 157: int needs; /* resource required */ ! 158: int rewrite; /* how to rewrite afterwards */ ! 159: char *cstring; /* code generation template */ ! 160: } table[]; ! 161: ! 162: extern NODE resc[]; ! 163: ! 164: extern OFFSZ tmpoff; ! 165: extern OFFSZ maxoff; ! 166: extern OFFSZ baseoff; ! 167: extern OFFSZ maxtemp; ! 168: extern int maxtreg; ! 169: extern int ftnno; ! 170: extern int rtyflg; ! 171: extern int nrecur; /* flag to keep track of recursions */ ! 172: ! 173: extern NODE ! 174: *talloc(), ! 175: *eread(), ! 176: *tcopy(), ! 177: *getlr(); ! 178: ! 179: extern CONSZ rdin(); ! 180: extern int eprint(); ! 181: extern char *rnames[]; ! 182: ! 183: extern int lineno; ! 184: extern char filename[]; ! 185: extern int fldshf, fldsz; ! 186: extern int lflag, xdebug, udebug, edebug, odebug; ! 187: extern int rdebug, radebug, tdebug, sdebug; ! 188: #ifdef FORT ! 189: extern int Oflag; ! 190: #endif ! 191: ! 192: #ifndef callchk ! 193: #define callchk(x) allchk() ! 194: #endif ! 195: ! 196: #ifndef PUTCHAR ! 197: #define PUTCHAR(x) putchar(x) ! 198: #endif ! 199: ! 200: /* macros for doing double indexing */ ! 201: #define R2PACK(x,y,z) (0200*((x)+1)+y+040000*z) /* pack 3 regs */ ! 202: #define R2UPK1(x) ((((x)>>7)-1)&0177) /* unpack reg 1 */ ! 203: #define R2UPK2(x) ((x)&0177) /* unpack reg 2 */ ! 204: #define R2UPK3(x) (x>>14) /* unpack reg 3 */ ! 205: #define R2TEST(x) ((x)>=0200) /* test if packed */ ! 206: ! 207: #ifdef MULTILEVEL ! 208: union mltemplate { ! 209: struct ml_head { ! 210: int tag; /* tree class */ ! 211: int subtag; /* subclass of tree */ ! 212: union mltemplate *nexthead; /* linked by mlinit() */ ! 213: } mlhead; ! 214: struct ml_node { ! 215: int op; /* operator or op description */ ! 216: int nshape; /* node shape */ ! 217: /* ! 218: * Both op and nshape must match the node. ! 219: * where the work is to be done entirely by ! 220: * op, nshape can be SANY, visa versa, op can ! 221: * be OPANY. ! 222: */ ! 223: int ntype; /* type descriptor */ ! 224: } mlnode; ! 225: }; ! 226: extern union mltemplate mltree[]; ! 227: #endif ! 228: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.