|
|
1.1 ! root 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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.