|
|
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.