xref: /original-bsd/old/pcc/mip/pass2.h (revision ad93c43e)
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