Quick Search:

View

Revision:
Expand:  
Changeset: MAIN:ragge:20080622152459

Diff

Diff from 1.108 to:

Annotations

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

Annotated File View

ragge
1.108
1 /*      $Id: pass2.h,v 1.108 2008/06/22 15:25:00 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.75
48 #define INBREG  04              /* compute into a register */
49 #define INCREG  010             /* compute into a register */
50 #define INDREG  020             /* compute into a register */
51 #define INREGS  (INAREG|INBREG|INCREG|INDREG)
ragge
1.1
52 #define FORCC   040             /* compute for condition codes only */
53 #define INTEMP  010000          /* compute into a temporary location */
54 #define FORREW  040000          /* search the table for a rewrite rule */
55
56 /*
57  * OP descriptors,
58  * the ASG operator may be used on some of these
59  */
60 #define OPSIMP  010000          /* +, -, &, |, ^ */
61 #define OPCOMM  010002          /* +, &, |, ^ */
62 #define OPMUL   010004          /* *, / */
63 #define OPDIV   010006          /* /, % */
64 #define OPUNARY 010010          /* unary ops */
65 #define OPLEAF  010012          /* leaves */
66 #define OPANY   010014          /* any op... */
67 #define OPLOG   010016          /* logical ops */
68 #define OPFLOAT 010020          /* +, -, *, or / (for floats) */
69 #define OPSHFT  010022          /* <<, >> */
70 #define OPLTYPE 010024          /* leaf type nodes (e.g, NAME, ICON, etc.) */
71
72 /* shapes */
73 #define SANY    01              /* same as FOREFF */
74 #define SAREG   02              /* same as INAREG */
ragge
1.71
75 #define SBREG   04              /* same as INBREG */
ragge
1.75
76 #define SCREG   010             /* same as INCREG */
77 #define SDREG   020             /* same as INDREG */
ragge
1.1
78 #define SCC     040             /* same as FORCC */
ragge
1.18
79 #define SNAME   0100
80 #define SCON    0200
81 #define SFLD    0400
82 #define SOREG   01000
83 #define STARNM  02000
84 #define STARREG 04000
85 #define SWADD   040000
86 #define SPECIAL 0100000
87 #define SZERO   SPECIAL
88 #define SONE    (SPECIAL|1)
89 #define SMONE   (SPECIAL|2)
ragge
1.1
90 #define SCCON   (SPECIAL|3)     /* -256 <= constant < 256 */
91 #define SSCON   (SPECIAL|4)     /* -32768 <= constant < 32768 */
92 #define SSOREG  (SPECIAL|5)     /* non-indexed OREG */
ragge
1.87
93 #define MAXSPECIAL      (SPECIAL|5)
ragge
1.18
94
ragge
1.82
95 /* These are used in rstatus[] in conjunction with SxREG */
96 #define TEMPREG 0100
97 #define PERMREG 0200
98
ragge
1.38
99 /* tshape() return values */
100 #define SRNOPE  0               /* Cannot match any shape */
101 #define SRDIR   1               /* Direct match */
102 #define SROREG  2               /* Can convert into OREG */
103 #define SRREG   3               /* Must put into REG */
104
ragge
1.75
105 /* find*() return values */
ragge
1.77
106 #define FRETRY  -2
ragge
1.75
107 #define FFAIL   -1
108
ragge
1.32
109 /* INTEMP is carefully not conflicting with shapes */
ragge
1.1
110
111 /* types */
112 #define TCHAR           01      /* char */
113 #define TSHORT          02      /* short */
114 #define TINT            04      /* int */
115 #define TLONG           010     /* long */
116 #define TFLOAT          020     /* float */
117 #define TDOUBLE         040     /* double */
118 #define TPOINT          0100    /* pointer to something */
119 #define TUCHAR          0200    /* unsigned char */
120 #define TUSHORT         0400    /* unsigned short */
121 #define TUNSIGNED       01000   /* unsigned int */
122 #define TULONG          02000   /* unsigned long */
123 #define TPTRTO          04000   /* pointer to one of the above */
124 #define TANY            010000  /* matches anything within reason */
125 #define TSTRUCT         020000  /* structure or union */
ragge
1.4
126 #define TLONGLONG       040000  /* long long */
127 #define TULONGLONG      0100000 /* unsigned long long */
ragge
1.44
128 #define TLDOUBLE        0200000 /* long double; exceeds 16 bit */
ragge
1.51
129 #define TFTN            0400000 /* function pointer; exceeds 16 bit */
ragge
1.1
130
131 /* reclamation cookies */
132 #define RNULL           0       /* clobber result */
ragge
1.18
133 #define RLEFT           01
134 #define RRIGHT          02
135 #define RESC1           04
136 #define RESC2           010
137 #define RESC3           020
ragge
1.27
138 #define RDEST           040
ragge
1.18
139 #define RESCC           04000
ragge
1.1
140 #define RNOP            010000  /* DANGER: can cause loops.. */
141
142 /* needs */
ragge
1.79
143 #define NAREG           0000001
144 #define NACOUNT         0000003
145 #define NAMASK          0000017
146 #define NASL            0000004 /* may share left register */
147 #define NASR            0000010 /* may share right register */
148 #define NBREG           0000020
149 #define NBCOUNT         0000060
150 #define NBMASK          0000360
151 #define NBSL            0000100
152 #define NBSR            0000200
153 #define NTEMP           0000400
154 #define NTMASK          0001400
155 #define NSPECIAL        0040000 /* need special register treatment */
156 #define REWRITE         0100000
ragge
1.81
157 #define NCSL            0x10000 /* Above 16 bit */
158 #define NCSR            0x20000 /* Above 16 bit */
159 #define NCREG           0x40000 /* Above 16 bit */
160 #define NCCOUNT         0xc0000
161 #define NDSL            0x100000        /* Above 16 bit */
162 #define NDSR            0x200000        /* Above 16 bit */
163 #define NDREG           0x400000        /* Above 16 bit */
164 #define NDCOUNT         0xc00000
ragge
1.79
165
166 /* special treatment */
ragge
1.80
167 #define NLEFT           (0001)  /* left leg register (moveadd) */
168 #define NOLEFT          (0002)  /* avoid regs for left (addedge) */
169 #define NRIGHT          (0004)  /* right leg register */
170 #define NORIGHT         (0010)  /* avoid reg for right */
171 #define NEVER           (0020)  /* registers trashed (addalledges) */
172 #define NRES            (0040)  /* result register (moveadd) */
173 #define NMOVTO          (0100)  /* move between classes */
ragge
1.79
174
ragge
1.1
175
176 #define MUSTDO          010000  /* force register requirements */
177 #define NOPREF          020000  /* no preference for register assignment */
178
ragge
1.92
179 #define isreg(p)        (p->n_op == REG || p->n_op == TEMP)
ragge
1.1
180
ragge
1.18
181 #define TBUSY           01000
ragge
1.1
182
183 #define SETSTO(x,y)     (stotree = (x), stocook = (y))
184 extern  int stocook;
ragge
1.18
185
ragge
1.1
186 extern  NODE *stotree;
187 extern  int callflag;
188
189 extern  int fregs;
190
191 /* code tables */
192 extern  struct optab {
ragge
1.18
193         int     op;
194         int     visit;
195         int     lshape;
196         int     ltype;
197         int     rshape;
198         int     rtype;
199         int     needs;
200         int     rewrite;
201         char    *cstring;
ragge
1.1
202 table[];
203
ragge
1.70
204 /* Special needs for register allocations */
205 struct rspecial {
ragge
1.78
206         int opnum;
207 #if 0
208         int left;       /* left leg register */
209         int noleft;     /* avoid regs for left */
210         int right;      /* right leg register */
211         int noright;    /* avoid right leg register */
212         int *rmask;     /* array of destroyed registers */
213         int res;        /* Result ends up here */
214 //      void (*rew)(struct optab *, NODE *);    /* special rewrite */
215 #endif
ragge
1.70
216 };
217
ragge
1.1
218 extern  NODE resc[];
219
ragge
1.59
220 extern  int p2autooffp2maxautooff;
ragge
1.18
221
ragge
1.1
222 extern  NODE
ragge
1.2
223         *talloc(void),
224         *eread(void),
ragge
1.45
225         *mklnode(intCONSZintTWORD),
226         *mkbinode(intNODE *, NODE *, TWORD),
227         *mkunode(intNODE *, intTWORD),
ragge
1.2
228         *getlr(NODE *pint);
ragge
1.1
229
ragge
1.49
230 void eoftn(struct interpass_prolog *);
231 void prologue(struct interpass_prolog *);
ragge
1.87
232 void e2print(NODE *pint downint *aint *b);
ragge
1.22
233 void myoptim(struct interpass *);
ragge
1.24
234 void cbgen(int opint label);
ragge
1.27
235 int match(NODE *pint cookie);
gmcgarry
1.105
236 int acceptable(struct optab *);
ragge
1.29
237 int special(NODE *, int);
ragge
1.31
238 int setasg(NODE *, int);
239 int setuni(NODE *, int);
240 int sucomp(NODE *);
ragge
1.56
241 int nsucomp(NODE *);
ragge
1.96
242 int setorder(NODE *);
ragge
1.75
243 int geninsn(NODE *, int cookie);
ragge
1.33
244 void adrput(FILE *, NODE *);
245 void comperr(char *str, ...);
ragge
1.34
246 void genregs(NODE *p);
ragge
1.70
247 void ngenregs(struct interpass *);
ragge
1.41
248 NODE *store(NODE *);
ragge
1.45
249 struct interpass *ipnode(NODE *);
ragge
1.46
250 void deflab(int);
ragge
1.83
251 void rmove(intintTWORD);
ragge
1.78
252 int rspecial(struct optab *, int);
253 struct rspecial *nspecial(struct optab *q);
ragge
1.70
254 void printip(struct interpass *pole);
ragge
1.71
255 int findops(NODE *pint);
256 int findasg(NODE *pint);
257 int finduni(NODE *pint);
ragge
1.90
258 int findumul(NODE *pint);
ragge
1.71
259 int findleaf(NODE *pint);
260 int relops(NODE *p);
ragge
1.94
261 void offstar(NODE *pint shape);
ragge
1.80
262 int gclass(TWORD);
ragge
1.85
263 void lastcall(NODE *);
ragge
1.87
264 void myreader(struct interpass *pole);
ragge
1.91
265 int oregok(NODE *pint sharp);
ragge
1.97
266 void myormake(NODE *);
ragge
1.103
267 int *livecall(NODE *);
ragge
1.106
268 void prtreg(FILE *, NODE *);
ragge
1.32
269 char *prcook(int);
ragge
1.108
270 int myxasm(struct interpass *ipNODE *p);
ragge
1.12
271
ragge
1.37
272 void conput(FILE *, NODE *);
273
ragge
1.1
274 extern  char *rnames[];
ragge
1.82
275 extern  int rstatus[];
276 extern  int roverlap[MAXREGS][MAXREGS];
ragge
1.1
277
ragge
1.74
278 extern int classmask(int), tclassmask(int);
279 extern void cmapinit(void);
ragge
1.83
280 extern int aliasmap(int adjclassint regnum);
ragge
1.74
281 extern int regK[];
ragge
1.73
282 #define CLASSA  1
283 #define CLASSB  2
284 #define CLASSC  3
285 #define CLASSD  4
286 #define CLASSE  5
287
ragge
1.88
288 /* routines to handle double indirection */
289 #ifdef R2REGS
290 void makeor2(NODE *pNODE *qintint);
291 int base(NODE *);
292 int offset(NODE *pint);
293 #endif
294
ragge
1.1
295 extern  int lineno;
296 extern  int fldshffldsz;
gmcgarry
1.104
297 extern  int lflagx2debugudebuge2debugodebug;
298 extern  int rdebugt2debugs2debugb2debugc2debug;
ragge
1.98
299 extern  int kflag;
ragge
1.1
300 #ifdef FORT
301 extern  int Oflag;
302 #endif
303
304 #ifndef callchk
305 #define callchk(x) allchk()
306 #endif
307
308 #ifndef PUTCHAR
309 #define PUTCHAR(x) putchar(x)
310 #endif
311
ragge
1.16
312 #define optype(o)       (dope[o]&TYFLG)
313 #define asgop(o)        (dope[o]&ASGFLG) 
314 #define logop(o)        (dope[o]&LOGFLG)
315 #define callop(o)       (dope[o]&CALLFLG)
316 extern  int dope[];     /* a vector containing operator information */
317 extern  char *opst[];   /* a vector containing names for ops */
318
ragge
1.18
319         /* macros for doing double indexing */
320 #define R2PACK(x,y,z)   (0200*((x)+1)+y+040000*z)
321 #define R2UPK1(x)       ((((x)>>7)-1)&0177)
322 #define R2UPK2(x)       ((x)&0177)
323 #define R2UPK3(x)       (x>>14)
324 #define R2TEST(x)       ((x)>=0200)
ragge
1.34
325
326 /*
327  * Layout of findops() return value:
328  *      bit 0-1 where to store left node.
329  *      bit 2-3 where to store right node.
330  *      bit 4   set if right leg should be evaluated first
331  *      bit 5-  table index
ragge
1.89
332  *
333  * LOREG means: walk down left node, after code emission call canon() to
334  *  convert the tree to an OREG.
ragge
1.34
335  */
336 #define LREG            001
337 #define LOREG           002
338 #define LTEMP           003
ragge
1.93
339 #define LDIR            003
ragge
1.34
340 #define LMASK           003
341 #define RREG            004
342 #define ROREG           010
343 #define RTEMP           014
ragge
1.93
344 #define RDIR            014
ragge
1.34
345 #define RMASK           014
346 #define DORIGHT         020
ragge
1.75
347 #define SCLASS(v,x)     ((v) |= ((x) << 5))
348 #define TCLASS(x)       (((x) >> 5) & 7)
349 #define TBSH            8
ragge
1.34
350 #define TBLIDX(idx)     ((idx) >> TBSH)
351 #define MKIDX(tbl,mod)  (((tbl) << TBSH) | (mod))
352
ragge
1.48
353 #ifndef BREGS
354 #define BREGS   0
355 #define TBREGS  0
356 #endif
357 #define REGBIT(x) (1 << (x))
mickey
1.102
358 #ifndef PERMTYPE
359 #define PERMTYPE(a)     (INT)
360 #endif
ragge
1.48
361
ragge
1.61
362 void emit(struct interpass *);
ragge
1.70
363 void optimize(struct interpass *);
pj
1.50
364
365 struct basicblock {
ragge
1.55
366         DLIST_ENTRY(basicblockbbelem;
367         SLIST_HEAD(, cfgnodechildren/* CFG - children to this node */
368         SLIST_HEAD(, cfgnodeparents/* CFG - parents to this node */
ragge
1.69
369         int bbnum;      /* this basic block number */
pj
1.52
370         unsigned int dfnum/* DFS-number */
371         unsigned int dfparent/* Parent in DFS */
372         unsigned int semi;
373         unsigned int ancestor;
374         unsigned int idom;
375         unsigned int samedom;
ragge
1.55
376         bittype *bucket;
377         bittype *df;
378         bittype *dfchildren;
pj
1.62
379         bittype *Aorig;
380         bittype *Aphi;
pj
1.50
381         struct interpass *first/* first element of basic block */
382         struct interpass *last;  /* last element of basic block */
383 };
384
385 struct labelinfo {
386         struct basicblock **arr;
gmcgarry
1.107
387         int size;
pj
1.50
388         unsigned int low;
389 };
390
pj
1.52
391 struct bblockinfo {
gmcgarry
1.107
392         int size;
pj
1.52
393         struct basicblock **arr;
394 };
395
pj
1.57
396 struct varinfo {
397         struct pvarinfo **arr;
398         int size;
399         int low;
400 };
401
402 struct pvarinfo {
403         struct pvarinfo *next;
404         struct basicblock *bb;
405         NODE *top, *n;
406 };
407
pj
1.50
408 struct cfgnode {
ragge
1.55
409         SLIST_ENTRY(cfgnodecfgelem;
pj
1.50
410         struct basicblock *bblock;
411 };
412
pj
1.58
413 /*
414  * C compiler second pass extra defines.
415  */
ragge
1.63
416 #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-08-23 03:36 +0200