BSD 3 development
[unix-history] / usr / src / cmd / f77 / put.c
CommitLineData
47621762
BJ
1/*
2 * INTERMEDIATE CODE GENERATION PROCEDURES COMMON TO BOTH
3 * JOHNSON AND RITCHIE FAMILIES OF SECOND PASSES
4*/
5
6#include "defs"
7
8#if FAMILY == PCC
9# include "pccdefs"
10#else
11# include "dmrdefs"
12#endif
13
14/*
15char *ops [ ] =
16 {
17 "??", "+", "-", "*", "/", "**", "-",
18 "OR", "AND", "EQV", "NEQV", "NOT",
19 "CONCAT",
20 "<", "==", ">", "<=", "!=", ">=",
21 " of ", " ofC ", " = ", " += ", " *= ", " CONV ", " << ", " % ",
22 " , ", " ? ", " : "
23 " abs ", " min ", " max ", " addr ", " indirect ",
24 " bitor ", " bitand ", " bitxor ", " bitnot ", " >> ",
25 };
26*/
27
28int ops2 [ ] =
29 {
30 P2BAD, P2PLUS, P2MINUS, P2STAR, P2SLASH, P2BAD, P2NEG,
31 P2OROR, P2ANDAND, P2EQ, P2NE, P2NOT,
32 P2BAD,
33 P2LT, P2EQ, P2GT, P2LE, P2NE, P2GE,
34 P2CALL, P2CALL, P2ASSIGN, P2PLUSEQ, P2STAREQ, P2CONV, P2LSHIFT, P2MOD,
35 P2COMOP, P2QUEST, P2COLON,
36 P2BAD, P2BAD, P2BAD, P2BAD, P2BAD,
37 P2BITOR, P2BITAND, P2BITXOR, P2BITNOT, P2RSHIFT
38 };
39
40
41int types2 [ ] =
42 {
43 P2BAD, P2INT|P2PTR, P2SHORT, P2LONG, P2REAL, P2DREAL,
44#if TARGET == INTERDATA
45 P2BAD, P2BAD, P2LONG, P2CHAR, P2INT, P2BAD
46#else
47 P2REAL, P2DREAL, P2LONG, P2CHAR, P2INT, P2BAD
48#endif
49 };
50
51
52setlog()
53{
54types2[TYLOGICAL] = types2[tylogical];
55typesize[TYLOGICAL] = typesize[tylogical];
56typealign[TYLOGICAL] = typealign[tylogical];
57}
58
59
60putex1(p)
61expptr p;
62{
63putx( fixtype(p) );
64templist = hookup(templist, holdtemps);
65holdtemps = NULL;
66}
67
68
69
70
71
72putassign(lp, rp)
73expptr lp, rp;
74{
75putx( fixexpr( mkexpr(OPASSIGN, lp, rp) ));
76}
77
78
79
80
81puteq(lp, rp)
82expptr lp, rp;
83{
84putexpr( mkexpr(OPASSIGN, lp, rp) );
85}
86
87
88
89
90/* put code for a *= b */
91
92putsteq(a, b)
93expptr a, b;
94{
95putx( fixexpr( mkexpr(OPSTAREQ, cpexpr(a), cpexpr(b)) ));
96}
97
98
99
100
101
102struct Addrblock *realpart(p)
103register struct Addrblock *p;
104{
105register struct Addrblock *q;
106
107q = cpexpr(p);
108if( ISCOMPLEX(p->vtype) )
109 q->vtype += (TYREAL-TYCOMPLEX);
110return(q);
111}
112
113
114
115
116struct Addrblock *imagpart(p)
117register struct Addrblock *p;
118{
119register struct Addrblock *q;
120struct Constblock *mkrealcon();
121
122if( ISCOMPLEX(p->vtype) )
123 {
124 q = cpexpr(p);
125 q->vtype += (TYREAL-TYCOMPLEX);
126 q->memoffset = mkexpr(OPPLUS, q->memoffset, ICON(typesize[q->vtype]));
127 }
128else
129 q = mkrealcon( ISINT(p->vtype) ? TYDREAL : p->vtype , 0.0);
130return(q);
131}
132\f
133struct Addrblock *putconst(p)
134register struct Constblock *p;
135{
136register struct Addrblock *q;
137struct Literal *litp, *lastlit;
138int i, k, type;
139int litflavor;
140
141if( p->tag != TCONST )
142 fatali("putconst: bad tag %d", p->tag);
143
144q = ALLOC(Addrblock);
145q->tag = TADDR;
146type = p->vtype;
147q->vtype = ( type==TYADDR ? TYINT : type );
148q->vleng = cpexpr(p->vleng);
149q->vstg = STGCONST;
150q->memno = newlabel();
151q->memoffset = ICON(0);
152
153/* check for value in literal pool, and update pool if necessary */
154
155switch(type = p->vtype)
156 {
157 case TYCHAR:
158 if(p->vleng->constblock.const.ci > XL)
159 break; /* too long for literal table */
160 litflavor = 1;
161 goto loop;
162
163 case TYREAL:
164 case TYDREAL:
165 litflavor = 2;
166 goto loop;
167
168 case TYLOGICAL:
169 type = tylogical;
170 case TYSHORT:
171 case TYLONG:
172 litflavor = 3;
173
174 loop:
175 lastlit = litpool + nliterals;
176 for(litp = litpool ; litp<lastlit ; ++litp)
177 if(type == litp->littype) switch(litflavor)
178 {
179 case 1:
180 if(p->vleng->constblock.const.ci != litp->litval.litcval.litclen)
181 break;
182 if(! eqn( (int) p->vleng->constblock.const.ci, p->const.ccp,
183 litp->litval.litcval.litcstr) )
184 break;
185
186 ret:
187 q->memno = litp->litnum;
188 frexpr(p);
189 return(q);
190
191 case 2:
192 if(p->const.cd[0] == litp->litval.litdval)
193 goto ret;
194 break;
195
196 case 3:
197 if(p->const.ci == litp->litval.litival)
198 goto ret;
199 break;
200 }
201 if(nliterals < MAXLITERALS)
202 {
203 ++nliterals;
204 litp->littype = type;
205 litp->litnum = q->memno;
206 switch(litflavor)
207 {
208 case 1:
209 litp->litval.litcval.litclen =
210 p->vleng->constblock.const.ci;
211 cpn( (int) litp->litval.litcval.litclen,
212 p->const.ccp,
213 litp->litval.litcval.litcstr);
214 break;
215
216 case 2:
217 litp->litval.litdval = p->const.cd[0];
218 break;
219
220 case 3:
221 litp->litval.litival = p->const.ci;
222 break;
223 }
224 }
225 default:
226 break;
227 }
228
229preven(typealign[ type==TYCHAR ? TYLONG : type ]);
230prlabel(asmfile, q->memno);
231
232k = 1;
233switch(type)
234 {
235 case TYLOGICAL:
236 case TYSHORT:
237 case TYLONG:
238 prconi(asmfile, type, p->const.ci);
239 break;
240
241 case TYCOMPLEX:
242 k = 2;
243 case TYREAL:
244 type = TYREAL;
245 goto flpt;
246
247 case TYDCOMPLEX:
248 k = 2;
249 case TYDREAL:
250 type = TYDREAL;
251
252 flpt:
253 for(i = 0 ; i < k ; ++i)
254 prconr(asmfile, type, p->const.cd[i]);
255 break;
256
257 case TYCHAR:
258 putstr(asmfile, p->const.ccp, p->vleng->constblock.const.ci);
259 break;
260
261 case TYADDR:
262 prcona(asmfile, p->const.ci);
263 break;
264
265 default:
266 fatali("putconst: bad type %d", p->vtype);
267 }
268
269frexpr(p);
270return( q );
271}
272\f
273/*
274 * put out a character string constant. begin every one on
275 * a long integer boundary, and pad with nulls
276 */
277putstr(fp, s, n)
278FILEP fp;
279char *s;
280ftnint n;
281{
282int b[SZSHORT];
283int i;
284
285i = 0;
286while(--n >= 0)
287 {
288 b[i++] = *s++;
289 if(i == SZSHORT)
290 {
291 prchars(fp, b);
292 i = 0;
293 }
294 }
295
296while(i < SZSHORT)
297 b[i++] = '\0';
298prchars(fp, b);
299}