Quick Search:

View

Revision:
Expand:  
Changeset: MAIN:ragge:20110623134823

Diff

Diff from 1.11 to:

Annotations

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

Annotated File View

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