Quick Search:

View

Revision:
Expand:  
Changeset: MAIN:ragge:20071112190327

Diff

Diff from 1.3 to:

Annotations

Annotate by Age | Author | Mixed | None
/fisheye/browse/pcc/pcc/arch/vax/code.c

Annotated File View

ragge
1.3
1 /*      $Id: code.c,v 1.3 2007/11/12 19:03:28 ragge Exp $       */
ragge
1.1
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  */
35
ragge
1.2
36 # include "pass1.h"
ragge
1.1
37
38 short log2tab[] = {001223333};
39 #define LOG2SZ 9
40
ragge
1.2
41 void
ragge
1.1
42 defalign(n) {
43         /* cause the alignment to become a multiple of n */
44         n /= SZCHAR;
45         iflastloc != PROG && n > 1 ) printf"        .align  %d\n"n >= 0 && n < LOG2SZ ? log2tab[n] : 0 );
46         }
47
ragge
1.2
48 /*
49  * output something to define the current position as label n
50  */
51 void
52 deflab1(int n)
53 {
54         printf(LABFMT ":\n"n);
55 }
ragge
1.1
56
ragge
1.2
57 void
ragge
1.1
58 efcode(){
59         /* code for the end of a function */
ragge
1.2
60         if (cftnsp->stype != STRTY+FTN && cftnsp->stype != UNIONTY+FTN)
61                 return;
62         cerror("efcode");
ragge
1.1
63
ragge
1.2
64 #ifdef notyet
ragge
1.1
65         ifstrftn ){  /* copy output (in R2) to caller */
66                 register NODE *l, *r;
67                 register struct symtab *p;
68                 register TWORD t;
69                 register int j;
70                 int i;
71
72                 p = &stab[curftn];
73                 t = p->stype;
74                 t = DECREF(t);
75
76                 deflabretlab );
77
78                 i = getlab();   /* label for return area */
79                 printf("        .data\n" );
80                 printf("        .align  2\n" );
ragge
1.2
81                 deflab1(i);
82                 printf("\t.space  %d\n"tsize(tp->dimoffp->sizoff)/SZCHAR);
ragge
1.1
83                 printf("        .text\n" );
84                 psline();
ragge
1.2
85                 printf("        movab   " LABFMT ",r1\n"i);
ragge
1.1
86
87                 reached = 1;
88                 l = blockREGNILNILPTR|tp->dimoffp->sizoff );
89                 l->rval = 1;  /* R1 */
90                 l->lval = 0;  /* no offset */
91                 r = blockREGNILNILPTR|tp->dimoffp->sizoff );
92                 r->rval = 0;  /* R0 */
93                 r->lval = 0;
94                 l = buildtreeUNARY MULlNIL );
95                 r = buildtreeUNARY MULrNIL );
96                 l = buildtreeASSIGNlr );
97                 l->op = FREE;
98                 ecompl->left );
ragge
1.2
99                 printf"       movab   " LABFMT ",r0\n"i );
ragge
1.1
100                 /* turn off strftn flag, so return sequence will be generated */
101                 strftn = 0;
102                 }
103         branchretlab );
104         printf"       .set    .R%d,0x%x\n"ftnnoent_mask[reg_use] );
105         reg_use = 11;
106         p2bend();
107         fdefflag = 0;
ragge
1.2
108 #endif
ragge
1.1
109         }
110
ragge
1.2
111 void
112 bfcode(struct symtab **aint n)
113 {
114         int i;
ragge
1.1
115
ragge
1.2
116         if (cftnsp->stype != STRTY+FTN && cftnsp->stype != UNIONTY+FTN)
117                 return;
118         /* Function returns struct, adjust arg offset */
119         for (i = 0i < ni++)
120                 a[i]->soffset += SZPOINT(INT);
121 }
ragge
1.1
122
ragge
1.2
123 void
ragge
1.1
124 bccode(){ /* called just before the first executable statment */
125                 /* by now, the automatics and register variables are allocated */
126         SETOFFautooffSZINT );
ragge
1.2
127 #if 0
ragge
1.1
128         /* set aside store area offset */
129         p2bbegautooffregvar );
130         reg_use = (reg_use > regvar ? regvar : reg_use);
ragge
1.2
131 #endif
ragge
1.1
132         }
133
ragge
1.2
134 void
ragge
1.1
135 ejobcodeflag ){
136         /* called just before final exit */
137         /* flag is 1 if errors, 0 if none */
138         }
139
ragge
1.2
140 void
141 bjobcode()
142 {
143 }
144
145 #if 0
ragge
1.1
146 aobeg(){
147         /* called before removing automatics from stab */
148         }
149
150 aocode(pstruct symtab *p; {
151         /* called when automatic p removed from stab */
152         }
153
154 aoend(){
155         /* called after removing all automatics from stab */
156         }
ragge
1.2
157 #endif
ragge
1.1
158
ragge
1.2
159 void
ragge
1.1
160 defnamp ) register struct symtab *p; {
161         /* define the current location as the name p->sname */
162
163         ifp->sclass == EXTDEF ){
164                 printf"       .globl  %s\n"exnamep->sname ) );
165                 }
ragge
1.2
166         printf"%s:\n"exnamep->sname ) );
ragge
1.1
167
168         }
169
ragge
1.2
170 void
ragge
1.1
171 bycodeti ){
172         /* put byte i+1 in a string */
173
174         i &= 07;
175         ift < 0 ){ /* end of the string */
176                 ifi != 0 ) printf"\n" );
177                 }
178
179         else { /* stash byte t into string */
180                 ifi == 0 ) printf"  .byte   " );
181                 else printf"," );
182                 printf"0x%x"t );
183                 ifi == 07 ) printf"\n" );
184                 }
185         }
186
ragge
1.2
187 void
ragge
1.1
188 zecoden ){
189         /* n integer words of zeros */
190         ifn <= 0 ) return;
191         printf"       .space  %d\n", (SZINT/SZCHAR)*n );
192         }
193
ragge
1.2
194 int
ragge
1.1
195 fldalt ) unsigned t; { /* return the alignment of field of type t */
196         uerror"illegal field type" );
197         returnALINT );
198         }
199
ragge
1.2
200 void
ragge
1.1
201 fldtyp ) struct symtab *p; { /* fix up type of field p */
202         ;
203         }
204
ragge
1.2
205 /* p points to an array of structures, each consisting
206  * of a constant value and a label.
207  * The first is >=0 if there is a default label;
208  * its value is the label number
209  * The entries p[1] to p[n] are the nontrivial cases
210  * XXX - fix genswitch.
ragge
1.1
211  */
ragge
1.2
212 void
213 genswitch(int numstruct swents **pint n)
ragge
1.1
214 {
ragge
1.2
215         cerror("genswitch");
ragge
1.1
216 }
217
ragge
1.2
218 #ifdef notyet
ragge
1.1
219 struct sw heapsw[SWITSZ];       /* heap for switches */
220
221 genswitch(p,nregister struct sw *p;{
222         /*      p points to an array of structures, each consisting
223                 of a constant value and a label.
224                 The first is >=0 if there is a default label;
225                 its value is the label number
226                 The entries p[1] to p[n] are the nontrivial cases
227                 */
228         register i;
229         register CONSZ jrange;
230         register dlabswlab;
231
232         range = p[n].sval-p[1].sval;
233
234         ifrange>0 && range <= 3*n && n>=4 ){ /* implement a direct switch */
235
236                 swlab = getlab();
237                 dlab = p->slab >= 0 ? p->slab : getlab();
238
239                 /* already in r0 */
240                 printf("        casel   r0,$%ld,$%ld\n"p[1].svalrange);
ragge
1.2
241                 deflab1(swlab);
ragge
1.1
242                 fori=1,j=p[1].svali<=nj++) {
ragge
1.2
243                         printf("        .word   " LABFMT "-" LABFMT "\n",
244                             (j == p[i].sval ? ((j=p[i++].sval), p[i-1].slab) : dlab),
ragge
1.1
245                                 swlab);
246                         }
247
248                 ifp->slab >= 0 ) branchdlab );
ragge
1.2
249                 else deflab1(dlab);
ragge
1.1
250                 return;
251
252                 }
253
254         ifn>8 ) {     /* heap switch */
255
256                 heapsw[0].slab = dlab = p->slab >= 0 ? p->slab : getlab();
257                 makeheap(pn1);      /* build heap */
258
259                 walkheap(1n); /* produce code */
260
261                 ifp->slab >= 0 )
262                         branchdlab );
263                 else
ragge
1.2
264                         deflab1(dlab);
ragge
1.1
265                 return;
266         }
267
268         /* debugging code */
269
270         /* out for the moment
271         if( n >= 4 ) werror( "inefficient switch: %d, %d", n, (int) (range/n) );
272         */
273
274         /* simple switch code */
275
276         fori=1i<=n; ++i ){
277                 /* already in r0 */
278
279                 printf"       cmpl    r0,$" );
280                 printfCONFMTp[i].sval );
ragge
1.2
281                 printf"\n     jeql    " LBLFMT "\n"p[i].slab );
ragge
1.1
282                 }
283
284         ifp->slab>=0 ) branchp->slab );
285         }
286
287 makeheap(pmn)
288 register struct sw *p;
289 {
290         register int q;
291
292         q = select(m);
293         heapsw[n] = p[q];
294         ifq>1 ) makeheap(pq-12*n);
295         ifq<m ) makeheap(p+qm-q2*n+1);
296 }
297
298 select(m) {
299         register int l,i,k;
300
301         for(i=1; ; i*=2)
302                 if( (i-1) > m ) break;
303         l = ((k = i/2 - 1) + 1)/2;
304         returnl + (m-k < l ? m-k : l));
305 }
306
307 walkheap(startlimit)
308 {
309         int label;
310
311
312         ifstart > limit ) return;
313         printf("        cmpl    r0,$%d\n",  heapsw[start].sval);
ragge
1.2
314         printf("        jeql    " LBLFMT "\n"heapsw[start].slab);
ragge
1.1
315         if( (2*start) > limit ) {
ragge
1.2
316                 printf("        jbr     " LBLFMT "\n"heapsw[0].slab);
ragge
1.1
317                 return;
318         }
319         if( (2*start+1) <= limit ) {
320                 label = getlab();
ragge
1.2
321                 printf("        jgtr    " LBLFMT "\n"label);
ragge
1.1
322         } else
ragge
1.2
323                 printf("        jgtr    " LBLFMT "\n"heapsw[0].slab);
ragge
1.1
324         walkheap2*startlimit);
325         if( (2*start+1) <= limit ) {
ragge
1.2
326                 deflab1(label);
ragge
1.1
327                 walkheap2*start+1limit);
328         }
329 }
ragge
1.2
330 #endif
ragge
1.3
331 /*
332  * Called with a function call with arguments as argument.
333  * This is done early in buildtree() and only done once.
334  */
335 NODE *
336 funcode(NODE *p)
337 {
338         return p;
339 }
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-01 14:21 +0200