Quick Search:

View

Revision:
Expand:  
Changeset: MAIN:gmcgarry:20071105145703

Diff

Diff from 1.2 to:

Annotations

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

Annotated File View

gmcgarry
1.2
1 /*      $Id: code.c,v 1.2 2007/11/05 14:57:03 gmcgarry Exp $    */
ragge
1.1
2 /*
3  * Copyright (c) 2003 Anders Magnusson (ragge@ludd.luth.se).
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. The name of the author may not be used to endorse or promote products
15  *    derived from this software without specific prior written permission
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29
30 /*
31  * MIPS port by Jan Enoksson (janeno-1@student.ltu.se) and
32  * Simon Olsson (simols-1@student.ltu.se) 2005.
33  */
34
35 # include "pass1.h"
36 # include "manifest.h"
37
38 /* Offset to arguments passed to a function. */
39 int passedargoff;
40
41 /*
42  * cause the alignment to become a multiple of n
43  * never called for text segment.
44  */
45 void
46 defalign(int n)
47 {
48         n /= SZCHAR;
49         if (n == 1)
50                 return;
51         printf("        .align %d\n"n);
52 }
53
54 /*
55  * define the current location as the name p->sname
56  * never called for text segment.
57  */
58 void
59 defnam(struct symtab *p)
60 {
61         char *c = p->sname;
62
63 #ifdef GCC_COMPAT
64         c = gcc_findname(p);
65 #endif
66         if (p->sclass == EXTDEF)
67                 printf("        .globl %s\n"c);
68         printf("%s:\n"c);
69 }
70
71
72 /*
73  * code for the end of a function
74  * deals with struct return here
75  */
76 void
77 efcode()
78 {
79         if (cftnsp->stype != STRTY+FTN && cftnsp->stype != UNIONTY+FTN)
80                 return;
81 }
82
83 /*
84  * helper for bfcode() to put register arguments on stack.
85  */
86 static void
87 argmove(struct symtab *sint regno)
88 {
89         NODE *p, *r;
90
91         s->sclass = PARAM;
92         s->soffset = NOOFFSET;
93
94         oalloc(s, &passedargoff);
95
96         spname = s;
97         p = buildtree(NAMENILNIL);
98         r = bcon(0);
99         r->n_op = REG;
100         r->n_rval = regno;
101         r->n_type = p->n_type;
102         r->n_sue = p->n_sue;
103         r->n_df = p->n_df;
104         ecode(buildtree(ASSIGNpr));
105 }
106
107 /*
108  * code for the beginning of a function; a is an array of
109  * indices in symtab for the arguments; n is the number
110  */
111 void
112 bfcode(struct symtab **aint n)
113 {
114         int im;
115
116         /* Passed arguments start 64 bits above the framepointer. */
gmcgarry
1.2
117         passedargoff = ARGINIT;
ragge
1.1
118         
119         if (cftnsp->stype == STRTY+FTN || cftnsp->stype == UNIONTY+FTN) {
120                 /* Function returns struct, adjust arg offset */
121                 for (i = 0i < ni++)
122                         a[i]->soffset += SZPOINT(INT);
123         }
124
125         m = n <= 4 ? n : 4;
126         
127         for(i = 0i < mi++) {
128             /*
129             if(a[i]->stype == LONGLONG || a[i]->stype == ULONGLONG) {
130                 printf("longlong\n");
131                 argmove(a[i], A0+i);
132
133                 if(i+1 < 4) {
134                     argmove(a[i], A0+i+1);
135                 }
136                 
137                 i++;            
138                 } else*/
139             argmove(a[i], A0+i);
140
141         }
142 }
143
144
145 /*
146  * by now, the automatics and register variables are allocated
147  */
148 void
149 bccode()
150 {
151         SETOFF(autooffSZINT);
152 }
153
154 /* called just before final exit */
155 /* flag is 1 if errors, 0 if none */
156 void
157 ejobcode(int flag )
158 {
159 }
160
161 void
162 bjobcode()
163 {
164 }
165
166 /*
167  * Print character t at position i in one string, until t == -1.
168  * Locctr & label is already defined.
169  */
170 void
171 bycode(int tint i)
172 {
gmcgarry
1.2
173         static int lastoctal = 0;
ragge
1.1
174
175         /* put byte i+1 in a string */
176
177         if (t < 0) {
178                 if (i != 0)
179                         puts("\"");
180         } else {
181                 if (i == 0)
gmcgarry
1.2
182                         printf("\t.asciiz \"");
183                 if (t == 0)
184                         return;
185                 else if (t == '\\' || t == '"') {
ragge
1.1
186                         lastoctal = 0;
187                         putchar('\\');
188                         putchar(t);
gmcgarry
1.2
189                 } else if (t == 012) {
190                         printf("\\n");
ragge
1.1
191                 } else if (t < 040 || t >= 0177) {
192                         lastoctal++;
193                         printf("\\%o",t);
194                 } else if (lastoctal && '0' <= t && t <= '9') {
195                         lastoctal = 0;
gmcgarry
1.2
196                         printf("\"\n\t.asciiz \"%c"t);
ragge
1.1
197                 } else {        
198                         lastoctal = 0;
199                         putchar(t);
200                 }
201         }
202 }
203
204 /*
205  * n integer words of zeros
206  */
207 void
208 zecode(int n)
209 {
210         printf("        .zero %d\n"n * (SZINT/SZCHAR));
gmcgarry
1.2
211 //      inoff += n * SZINT;
ragge
1.1
212 }
213
214 /*
215  * return the alignment of field of type t
216  */
217 int
218 fldal(unsigned int t)
219 {
220         uerror("illegal field type");
221         return(ALINT);
222 }
223
224 /* fix up type of field p */
225 void
226 fldty(struct symtab *p)
227 {
228 }
229
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  * XXX - fix genswitch.
236  */
237 void
gmcgarry
1.2
238 genswitch(int numstruct swents **pint n)
ragge
1.1
239 {
gmcgarry
1.2
240         NODE *r;
241         int i;
242
243         /* simple switch code */
244         for (i = 1i <= n; ++i) {
245                 /* already in 1 */
246                 r = tempnode(numINT0MKSUE(INT));
247                 r = buildtree(NErbcon(p[i]->sval));
248                 cbranch(buildtree(NOTrNIL), bcon(p[i]->slab));
249         }
250         if (p[0]->slab > 0)
251                 branch(p[0]->slab);
ragge
1.1
252 }
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-09-30 17:50 +0200