Quick Search:

View

Revision:
Expand:  
Changeset: MAIN:ragge:20060417132352

Diff

Diff from 1.1 to:

Annotations

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

Annotated File View

ragge
1.1
1 /*      $Id: code.c,v 1.1 2006/04/17 13:23:52 ragge Exp $       */
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         NODE *p, *q;
80         int sz;
81
82         if (cftnsp->stype != STRTY+FTN && cftnsp->stype != UNIONTY+FTN)
83                 return;
84 }
85
86 /*
87  * helper for bfcode() to put register arguments on stack.
88  */
89 static void
90 argmove(struct symtab *sint regno)
91 {
92         NODE *p, *r;
93
94         s->sclass = PARAM;
95         s->soffset = NOOFFSET;
96
97         oalloc(s, &passedargoff);
98
99         spname = s;
100         p = buildtree(NAMENILNIL);
101         r = bcon(0);
102         r->n_op = REG;
103         r->n_rval = regno;
104         r->n_type = p->n_type;
105         r->n_sue = p->n_sue;
106         r->n_df = p->n_df;
107         ecode(buildtree(ASSIGNpr));
108 }
109
110 /*
111  * code for the beginning of a function; a is an array of
112  * indices in symtab for the arguments; n is the number
113  */
114 void
115 bfcode(struct symtab **aint n)
116 {
117         int im;
118
119         /* Passed arguments start 64 bits above the framepointer. */
120         passedargoff = 64;
121         
122         if (cftnsp->stype == STRTY+FTN || cftnsp->stype == UNIONTY+FTN) {
123                 /* Function returns struct, adjust arg offset */
124                 for (i = 0i < ni++)
125                         a[i]->soffset += SZPOINT(INT);
126         }
127
128         m = n <= 4 ? n : 4;
129         
130         for(i = 0i < mi++) {
131             /*
132             if(a[i]->stype == LONGLONG || a[i]->stype == ULONGLONG) {
133                 printf("longlong\n");
134                 argmove(a[i], A0+i);
135
136                 if(i+1 < 4) {
137                     argmove(a[i], A0+i+1);
138                 }
139                 
140                 i++;            
141                 } else*/
142             argmove(a[i], A0+i);
143
144         }
145 }
146
147
148 /*
149  * by now, the automatics and register variables are allocated
150  */
151 void
152 bccode()
153 {
154         SETOFF(autooffSZINT);
155 }
156
157 /* called just before final exit */
158 /* flag is 1 if errors, 0 if none */
159 void
160 ejobcode(int flag )
161 {
162 }
163
164 void
165 bjobcode()
166 {
167 }
168
169 /*
170  * Print character t at position i in one string, until t == -1.
171  * Locctr & label is already defined.
172  */
173 void
174 bycode(int tint i)
175 {
176         static  int     lastoctal = 0;
177
178         /* put byte i+1 in a string */
179
180         if (t < 0) {
181                 if (i != 0)
182                         puts("\"");
183         } else {
184                 if (i == 0)
185                         printf("\t.ascii \"");
186                 if (t == '\\' || t == '"') {
187                         lastoctal = 0;
188                         putchar('\\');
189                         putchar(t);
190                 } else if (t < 040 || t >= 0177) {
191                         lastoctal++;
192                         printf("\\%o",t);
193                 } else if (lastoctal && '0' <= t && t <= '9') {
194                         lastoctal = 0;
195                         printf("\"\n\t.ascii \"%c"t);
196                 } else {        
197                         lastoctal = 0;
198                         putchar(t);
199                 }
200         }
201 }
202
203 /*
204  * n integer words of zeros
205  */
206 void
207 zecode(int n)
208 {
209         printf("        .zero %d\n"n * (SZINT/SZCHAR));
210         inoff += n * SZINT;
211 }
212
213 /*
214  * return the alignment of field of type t
215  */
216 int
217 fldal(unsigned int t)
218 {
219         uerror("illegal field type");
220         return(ALINT);
221 }
222
223 /* fix up type of field p */
224 void
225 fldty(struct symtab *p)
226 {
227 }
228
229 /* p points to an array of structures, each consisting
230  * of a constant value and a label.
231  * The first is >=0 if there is a default label;
232  * its value is the label number
233  * The entries p[1] to p[n] are the nontrivial cases
234  * XXX - fix genswitch.
235  */
236 void
237 genswitch(struct swents **pint n)
238 {
239 }
FishEye: Open Source License registered to PCC.
Atlassian FishEye, CVS analysis. (Version:1.6.3 Build:build-336 2008-11-04) - Administration - Page generated 2014-12-23 06:11 +0100