Quick Search:

View

Revision:
Expand:  
Changeset: MAIN:ragge:20050917075840

Diff

Diff from 1.71 to:

Annotations

Annotate by Age | Author | Mixed | None
/fisheye/browse/pcc/pcc/mip/pass2.h

Annotated File View

ragge
1.71
1 /*      $Id: pass2.h,v 1.71 2005/09/17 07:58:40 ragge Exp $     */
ragge
1.19
2 /*
3  * Copyright(C) Caldera International Inc. 2001-2002. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * Redistributions of source code and documentation must retain the above
10  * copyright notice, this list of conditions and the following disclaimer.
11  * Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditionsand the following disclaimer in the
13  * documentation and/or other materials provided with the distribution.
14  * All advertising materials mentioning features or use of this software
15  * must display the following acknowledgement:
16  *      This product includes software developed or owned by Caldera
17  *      International, Inc.
18  * Neither the name of Caldera International, Inc. nor the names of other
19  * contributors may be used to endorse or promote products derived from
20  * this software without specific prior written permission.
21  *
22  * USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
23  * INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
24  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26  * DISCLAIMED.  IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE
27  * FOR ANY DIRECT, INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OFLIABILITY, WHETHER IN CONTRACT,
31  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
32  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
33  * POSSIBILITY OF SUCH DAMAGE.
34  */
ragge
1.5
35 #include <sys/types.h>
36
ragge
1.1
37 #include "manifest.h"
ragge
1.2
38 #include "protos.h"
ragge
1.55
39 #ifndef MKEXT
40 #include "external.h"
41 #else
42 typedef int bittype/* XXX - for basicblock */
43 #endif
ragge
1.1
44
45 /* cookies, used as arguments to codgen */
46 #define FOREFF  01              /* compute for effects only */
47 #define INAREG  02              /* compute into a register */
ragge
1.71
48 #define INBREG  04              /* compute into a lvalue register */
49 #define INTAREG 010             /* compute into a scratch register */
ragge
1.1
50 #define INTBREG 020             /* compute into a scratch lvalue register */
51 #define FORCC   040             /* compute for condition codes only */
52 #define INTEMP  010000          /* compute into a temporary location */
53 #define FORREW  040000          /* search the table for a rewrite rule */
54
55 /*
56  * OP descriptors,
57  * the ASG operator may be used on some of these
58  */
59 #define OPSIMP  010000          /* +, -, &, |, ^ */
60 #define OPCOMM  010002          /* +, &, |, ^ */
61 #define OPMUL   010004          /* *, / */
62 #define OPDIV   010006          /* /, % */
63 #define OPUNARY 010010          /* unary ops */
64 #define OPLEAF  010012          /* leaves */
65 #define OPANY   010014          /* any op... */
66 #define OPLOG   010016          /* logical ops */
67 #define OPFLOAT 010020          /* +, -, *, or / (for floats) */
68 #define OPSHFT  010022          /* <<, >> */
69 #define OPLTYPE 010024          /* leaf type nodes (e.g, NAME, ICON, etc.) */
70
71 /* shapes */
72 #define SANY    01              /* same as FOREFF */
73 #define SAREG   02              /* same as INAREG */
ragge
1.71
74 #define SBREG   04              /* same as INBREG */
75 #ifdef SNH_REG
76 #define SCREG   010             /* same as INTAREG */
77 #define SDREG   020             /* same as INTBREG */
78 #define SEREG   010000
79 #endif
ragge
1.1
80 #define SCC     040             /* same as FORCC */
ragge
1.18
81 #define SNAME   0100
82 #define SCON    0200
83 #define SFLD    0400
84 #define SOREG   01000
85 #define STARNM  02000
86 #define STARREG 04000
87 #define SWADD   040000
88 #define SPECIAL 0100000
89 #define SZERO   SPECIAL
90 #define SONE    (SPECIAL|1)
91 #define SMONE   (SPECIAL|2)
ragge
1.1
92 #define SCCON   (SPECIAL|3)     /* -256 <= constant < 256 */
93 #define SSCON   (SPECIAL|4)     /* -32768 <= constant < 32768 */
94 #define SSOREG  (SPECIAL|5)     /* non-indexed OREG */
ragge
1.18
95
ragge
1.38
96 /* tshape() return values */
97 #define SRNOPE  0               /* Cannot match any shape */
98 #define SRDIR   1               /* Direct match */
99 #define SROREG  2               /* Can convert into OREG */
100 #define SRREG   3               /* Must put into REG */
101
ragge
1.32
102 /* INTEMP is carefully not conflicting with shapes */
ragge
1.1
103
104 /* types */
105 #define TCHAR           01      /* char */
106 #define TSHORT          02      /* short */
107 #define TINT            04      /* int */
108 #define TLONG           010     /* long */
109 #define TFLOAT          020     /* float */
110 #define TDOUBLE         040     /* double */
111 #define TPOINT          0100    /* pointer to something */
112 #define TUCHAR          0200    /* unsigned char */
113 #define TUSHORT         0400    /* unsigned short */
114 #define TUNSIGNED       01000   /* unsigned int */
115 #define TULONG          02000   /* unsigned long */
116 #define TPTRTO          04000   /* pointer to one of the above */
117 #define TANY            010000  /* matches anything within reason */
118 #define TSTRUCT         020000  /* structure or union */
ragge
1.4
119 #define TLONGLONG       040000  /* long long */
120 #define TULONGLONG      0100000 /* unsigned long long */
ragge
1.44
121 #define TLDOUBLE        0200000 /* long double; exceeds 16 bit */
ragge
1.51
122 #define TFTN            0400000 /* function pointer; exceeds 16 bit */
ragge
1.1
123
124 /* reclamation cookies */
125 #define RNULL           0       /* clobber result */
ragge
1.18
126 #define RLEFT           01
127 #define RRIGHT          02
128 #define RESC1           04
129 #define RESC2           010
130 #define RESC3           020
ragge
1.27
131 #define RDEST           040
ragge
1.18
132 #define RESCC           04000
ragge
1.1
133 #define RNOP            010000  /* DANGER: can cause loops.. */
134
135 /* needs */
ragge
1.26
136 #define NAREG           000001
137 #define NACOUNT         000003
138 #define NAMASK          000017
139 #define NASL            000004  /* may share left register */
140 #define NASR            000010  /* may share right register */
141 #define NBREG           000020
142 #define NBCOUNT         000060
143 #define NBMASK          000360
144 #define NBSL            000100
145 #define NBSR            000200
146 #define NTEMP           000400
147 #define NTMASK          001400
ragge
1.40
148 #define NSPECIAL        002000  /* need special register treatment */
ragge
1.18
149 #define REWRITE         010000
ragge
1.1
150
151 #define MUSTDO          010000  /* force register requirements */
152 #define NOPREF          020000  /* no preference for register assignment */
153
ragge
1.48
154 #define isbreg(r)       (REGBIT(r) & BREGS)
ragge
1.1
155
ragge
1.18
156 #define TBUSY           01000
ragge
1.1
157 #define REGLOOP(i)      for (i = 0; i < REGSZ; ++i)
158
159 #define SETSTO(x,y)     (stotree = (x), stocook = (y))
160 extern  int stocook;
ragge
1.18
161
ragge
1.1
162 extern  NODE *stotree;
163 extern  int callflag;
164
165 extern  int fregs;
166
167 /* code tables */
168 extern  struct optab {
ragge
1.18
169         int     op;
170         int     visit;
171         int     lshape;
172         int     ltype;
173         int     rshape;
174         int     rtype;
175         int     needs;
176         int     rewrite;
177         char    *cstring;
ragge
1.1
178 table[];
179
ragge
1.70
180 /* Special needs for register allocations */
181 struct rspecial {
182         int *left;
183         int *right;
184         int *rmask;
185         int *res;
186 };
187
ragge
1.1
188 extern  NODE resc[];
189
ragge
1.59
190 extern  int p2autooffp2maxautooff;
ragge
1.18
191
ragge
1.1
192 extern  NODE
ragge
1.2
193         *talloc(void),
194         *eread(void),
195         *tcopy(NODE *),
ragge
1.45
196         *mklnode(intCONSZintTWORD),
197         *mkbinode(intNODE *, NODE *, TWORD),
198         *mkunode(intNODE *, intTWORD),
ragge
1.2
199         *getlr(NODE *pint);
ragge
1.1
200
ragge
1.49
201 void eoftn(struct interpass_prolog *);
202 void prologue(struct interpass_prolog *);
ragge
1.14
203 void setlocc(int locctr);
ragge
1.15
204 int e2print(NODE *pint downint *aint *b);
ragge
1.22
205 void myoptim(struct interpass *);
ragge
1.24
206 void cbgen(int opint label);
ragge
1.26
207 struct optab *nxtmatch(struct optab *);
ragge
1.27
208 int chkmatch(NODE *, intintint);
209 int match(NODE *pint cookie);
210 int nmatch(NODE *pint what);
ragge
1.36
211 #ifndef special
ragge
1.29
212 int special(NODE *, int);
ragge
1.36
213 #endif
ragge
1.31
214 int setasg(NODE *, int);
215 int setuni(NODE *, int);
216 int sucomp(NODE *);
ragge
1.56
217 int nsucomp(NODE *);
ragge
1.31
218 void geninsn(NODE *, int cookie);
ragge
1.33
219 void adrput(FILE *, NODE *);
220 void comperr(char *str, ...);
ragge
1.34
221 void genregs(NODE *p);
ragge
1.70
222 void ngenregs(struct interpass *);
ragge
1.41
223 NODE *store(NODE *);
ragge
1.42
224 void mygenregs(NODE *);
ragge
1.45
225 void gencall(NODE *, NODE *prev);
226 struct interpass *ipnode(NODE *);
ragge
1.46
227 void deflab(int);
ragge
1.65
228 void rmove(intintTWORD);
ragge
1.70
229 struct rspecial *nspecial(struct optab *);
230 void printip(struct interpass *pole);
ragge
1.71
231 int findops(NODE *pint);
232 int findasg(NODE *pint);
233 int finduni(NODE *pint);
234 int findleaf(NODE *pint);
235 int relops(NODE *p);
ragge
1.32
236
237 char *prcook(int);
ragge
1.12
238
ragge
1.37
239 void conput(FILE *, NODE *);
240
ragge
1.1
241 extern  char *rnames[];
242
243 extern  int lineno;
244 extern  int fldshffldsz;
ragge
1.9
245 extern  int lflagx2debugudebuge2debugodebugmdebug;
pj
1.57
246 extern  int rdebugradebugt2debugs2debugb2debug;
ragge
1.1
247 #ifdef FORT
248 extern  int Oflag;
249 #endif
250
251 #ifndef callchk
252 #define callchk(x) allchk()
253 #endif
254
255 #ifndef PUTCHAR
256 #define PUTCHAR(x) putchar(x)
257 #endif
258
ragge
1.16
259 #define optype(o)       (dope[o]&TYFLG)
260 #define asgop(o)        (dope[o]&ASGFLG) 
261 #define logop(o)        (dope[o]&LOGFLG)
262 #define callop(o)       (dope[o]&CALLFLG)
263 extern  int dope[];     /* a vector containing operator information */
264 extern  char *opst[];   /* a vector containing names for ops */
265
ragge
1.18
266         /* macros for doing double indexing */
267 #define R2PACK(x,y,z)   (0200*((x)+1)+y+040000*z)
268 #define R2UPK1(x)       ((((x)>>7)-1)&0177)
269 #define R2UPK2(x)       ((x)&0177)
270 #define R2UPK3(x)       (x>>14)
271 #define R2TEST(x)       ((x)>=0200)
ragge
1.34
272
273 /*
274  * Layout of findops() return value:
275  *      bit 0-1 where to store left node.
276  *      bit 2-3 where to store right node.
277  *      bit 4   set if right leg should be evaluated first
278  *      bit 5-  table index
279  */
280 #define LREG            001
281 #define LOREG           002
282 #define LTEMP           003
283 #define LMASK           003
284 #define RREG            004
285 #define ROREG           010
286 #define RTEMP           014
287 #define RMASK           014
288 #define DORIGHT         020
ragge
1.47
289 #define LBREG           040     /* XXX - left in breg */
290 #define TBSH            6
ragge
1.34
291 #define TBLIDX(idx)     ((idx) >> TBSH)
292 #define MKIDX(tbl,mod)  (((tbl) << TBSH) | (mod))
293
ragge
1.48
294 #ifndef BREGS
295 #define BREGS   0
296 #define TBREGS  0
297 #endif
298 #define REGBIT(x) (1 << (x))
299
ragge
1.39
300 /* hardops definitions */
301 struct hardops {
302         int op;         /* op to search for */
303         TWORD type;     /* type not handled */
304         char *fun;      /* function to call */
305 };
306 extern struct hardops hardops[];
ragge
1.40
307
ragge
1.61
308 void emit(struct interpass *);
ragge
1.70
309 void optimize(struct interpass *);
pj
1.50
310
311 struct basicblock {
ragge
1.55
312         DLIST_ENTRY(basicblockbbelem;
313         SLIST_HEAD(, cfgnodechildren/* CFG - children to this node */
314         SLIST_HEAD(, cfgnodeparents/* CFG - parents to this node */
ragge
1.69
315         int bbnum;      /* this basic block number */
pj
1.52
316         unsigned int dfnum/* DFS-number */
317         unsigned int dfparent/* Parent in DFS */
318         unsigned int semi;
319         unsigned int ancestor;
320         unsigned int idom;
321         unsigned int samedom;
ragge
1.55
322         bittype *bucket;
323         bittype *df;
324         bittype *dfchildren;
pj
1.62
325         bittype *Aorig;
326         bittype *Aphi;
pj
1.50
327         struct interpass *first/* first element of basic block */
328         struct interpass *last;  /* last element of basic block */
329 };
330
331 struct labelinfo {
332         struct basicblock **arr;
333         unsigned int size;
334         unsigned int low;
335 };
336
pj
1.52
337 struct bblockinfo {
338         unsigned int size;
339         struct basicblock **arr;
340 };
341
pj
1.57
342 struct varinfo {
343         struct pvarinfo **arr;
344         int size;
345         int low;
346 };
347
348 struct pvarinfo {
349         struct pvarinfo *next;
350         struct basicblock *bb;
351         NODE *top, *n;
352 };
353
pj
1.50
354 struct cfgnode {
ragge
1.55
355         SLIST_ENTRY(cfgnodecfgelem;
pj
1.50
356         struct basicblock *bblock;
357 };
358
pj
1.58
359 /*
360  * C compiler second pass extra defines.
361  */
ragge
1.63
362 #define PHI (MAXOP + 1)         /* Used in SSA trees */
FishEye: Open Source License registered to PCC.
Your maintenance has expired. You can renew your license at http://www.atlassian.com/fisheye/renew
Atlassian FishEye, CVS analysis. (Version:1.6.3 Build:build-336 2008-11-04) - Administration - Page generated 2014-10-31 05:48 +0100