Bell 32V release
[unix-history] / usr / src / cmd / f77 / put.c
CommitLineData
0d57d6f5
TL
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 == SCJ
9# include "scjdefs"
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];
55}
56
57
58putex1(p)
59expptr p;
60{
61putx( fixtype(p) );
62templist = hookup(templist, holdtemps);
63holdtemps = NULL;
64}
65
66
67
68
69
70putassign(lp, rp)
71expptr lp, rp;
72{
73putx( fixexpr( mkexpr(OPASSIGN, lp, rp) ));
74}
75
76
77
78
79puteq(lp, rp)
80expptr lp, rp;
81{
82putexpr( mkexpr(OPASSIGN, lp, rp) );
83}
84
85
86
87
88/* put code for a *= b */
89
90putsteq(a, b)
91expptr a, b;
92{
93putx( fixexpr( mkexpr(OPSTAREQ, cpexpr(a), cpexpr(b)) ));
94}
95
96
97
98
99
100struct addrblock *realpart(p)
101register struct addrblock *p;
102{
103register struct addrblock *q;
104
105q = cpexpr(p);
106if( ISCOMPLEX(p->vtype) )
107 q->vtype += (TYREAL-TYCOMPLEX);
108return(q);
109}
110
111
112
113
114struct addrblock *imagpart(p)
115register struct addrblock *p;
116{
117register struct addrblock *q;
118struct constblock *mkrealcon();
119
120if( ISCOMPLEX(p->vtype) )
121 {
122 q = cpexpr(p);
123 q->vtype += (TYREAL-TYCOMPLEX);
124 q->memoffset = mkexpr(OPPLUS, q->memoffset, ICON(typesize[q->vtype]));
125 }
126else
127 q = mkrealcon( ISINT(p->vtype) ? TYDREAL : p->vtype , 0.0);
128return(q);
129}
130\f
131struct addrblock *putconst(p)
132register struct constblock *p;
133{
134register struct addrblock *q;
135struct literal *litp, *lastlit;
136int i, k, type;
137int litflavor;
138
139if( ! ISCONST(p) )
140 fatal1("putconst: bad tag %d", p->tag);
141
142q = ALLOC(addrblock);
143q->tag = TADDR;
144type = p->vtype;
145q->vtype = ( type==TYADDR ? TYINT : type );
146q->vleng = cpexpr(p->vleng);
147q->vstg = STGCONST;
148q->memno = newlabel();
149q->memoffset = ICON(0);
150
151/* check for value in literal pool, and update pool if necessary */
152
153switch(type = p->vtype)
154 {
155 case TYCHAR:
156 if(p->vleng->const.ci > XL)
157 break; /* too long for literal table */
158 litflavor = 1;
159 goto loop;
160
161 case TYREAL:
162 case TYDREAL:
163 litflavor = 2;
164 goto loop;
165
166 case TYLOGICAL:
167 type = tylogical;
168 case TYSHORT:
169 case TYLONG:
170 litflavor = 3;
171
172 loop:
173 lastlit = litpool + nliterals;
174 for(litp = litpool ; litp<lastlit ; ++litp)
175 if(type == litp->littype) switch(litflavor)
176 {
177 case 1:
178 if(p->vleng->const.ci != litp->litval.litcval.litclen)
179 break;
180 if(! eqn( (int) p->vleng->const.ci, p->const.ccp,
181 litp->litval.litcval.litcstr) )
182 break;
183
184 ret:
185 q->memno = litp->litnum;
186 frexpr(p);
187 return(q);
188
189 case 2:
190 if(p->const.cd[0] == litp->litval.litdval)
191 goto ret;
192 break;
193
194 case 3:
195 if(p->const.ci == litp->litval.litival)
196 goto ret;
197 break;
198 }
199 if(nliterals < MAXLITERALS)
200 {
201 ++nliterals;
202 litp->littype = type;
203 litp->litnum = q->memno;
204 switch(litflavor)
205 {
206 case 1:
207 litp->litval.litcval.litclen = p->vleng->const.ci;
208 cpn( (int) litp->litval.litcval.litclen,
209 p->const.ccp,
210 litp->litval.litcval.litcstr);
211 break;
212
213 case 2:
214 litp->litval.litdval = p->const.cd[0];
215 break;
216
217 case 3:
218 litp->litval.litival = p->const.ci;
219 break;
220 }
221 }
222 default:
223 break;
224 }
225
226preven(typealign[ type==TYCHAR ? TYLONG : type ]);
227prlabel(asmfile, q->memno);
228
229k = 1;
230switch(type)
231 {
232 case TYLOGICAL:
233 case TYSHORT:
234 case TYLONG:
235 prconi(asmfile, type, p->const.ci);
236 break;
237
238 case TYCOMPLEX:
239 k = 2;
240 case TYREAL:
241 type = TYREAL;
242 goto flpt;
243
244 case TYDCOMPLEX:
245 k = 2;
246 case TYDREAL:
247 type = TYDREAL;
248
249 flpt:
250 for(i = 0 ; i < k ; ++i)
251 prconr(asmfile, type, p->const.cd[i]);
252 break;
253
254 case TYCHAR:
255 putstr(asmfile, p->const.ccp, p->vleng->const.ci);
256 break;
257
258 case TYADDR:
259 prcona(asmfile, p->const.ci);
260 break;
261
262 default:
263 fatal1("putconst: bad type %d", p->vtype);
264 }
265
266frexpr(p);
267return( q );
268}
269\f
270/*
271 * put out a character string constant. begin every one on
272 * a long integer boundary, and pad with nulls
273 */
274putstr(fp, s, n)
275FILEP fp;
276char *s;
277ftnint n;
278{
279int b[SZSHORT];
280int i;
281
282i = 0;
283while(--n >= 0)
284 {
285 b[i++] = *s++;
286 if(i == SZSHORT)
287 {
288 prchars(fp, b);
289 i = 0;
290 }
291 }
292
293while(i < SZSHORT)
294 b[i++] = '\0';
295prchars(fp, b);
296}