|
|
1.1 root 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: /*
15: char *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:
28: int 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:
41: int 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:
52: setlog()
53: {
54: types2[TYLOGICAL] = types2[tylogical];
55: typesize[TYLOGICAL] = typesize[tylogical];
56: typealign[TYLOGICAL] = typealign[tylogical];
57: }
58:
59:
60: putex1(p)
61: expptr p;
62: {
63: putx( fixtype(p) );
64: templist = hookup(templist, holdtemps);
65: holdtemps = NULL;
66: }
67:
68:
69:
70:
71:
72: putassign(lp, rp)
73: expptr lp, rp;
74: {
75: putx( fixexpr( mkexpr(OPASSIGN, lp, rp) ));
76: }
77:
78:
79:
80:
81: puteq(lp, rp)
82: expptr lp, rp;
83: {
84: putexpr( mkexpr(OPASSIGN, lp, rp) );
85: }
86:
87:
88:
89:
90: /* put code for a *= b */
91:
92: putsteq(a, b)
93: expptr a, b;
94: {
95: putx( fixexpr( mkexpr(OPSTAREQ, cpexpr(a), cpexpr(b)) ));
96: }
97:
98:
99:
100:
101:
102: struct Addrblock *realpart(p)
103: register struct Addrblock *p;
104: {
105: register struct Addrblock *q;
106:
107: q = cpexpr(p);
108: if( ISCOMPLEX(p->vtype) )
109: q->vtype += (TYREAL-TYCOMPLEX);
110: return(q);
111: }
112:
113:
114:
115:
116: struct Addrblock *imagpart(p)
117: register struct Addrblock *p;
118: {
119: register struct Addrblock *q;
120: struct Constblock *mkrealcon();
121:
122: if( 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: }
128: else
129: q = mkrealcon( ISINT(p->vtype) ? TYDREAL : p->vtype , 0.0);
130: return(q);
131: }
132:
133: struct Addrblock *putconst(p)
134: register struct Constblock *p;
135: {
136: register struct Addrblock *q;
137: struct Literal *litp, *lastlit;
138: int i, k, type;
139: int litflavor;
140:
141: if( p->tag != TCONST )
142: fatali("putconst: bad tag %d", p->tag);
143:
144: q = ALLOC(Addrblock);
145: q->tag = TADDR;
146: type = p->vtype;
147: q->vtype = ( type==TYADDR ? TYINT : type );
148: q->vleng = cpexpr(p->vleng);
149: q->vstg = STGCONST;
150: q->memno = newlabel();
151: q->memoffset = ICON(0);
152:
153: /* check for value in literal pool, and update pool if necessary */
154:
155: switch(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:
229: preven(typealign[ type==TYCHAR ? TYLONG : type ]);
230: prlabel(asmfile, q->memno);
231:
232: k = 1;
233: switch(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:
269: frexpr(p);
270: return( q );
271: }
272:
273: /*
274: * put out a character string constant. begin every one on
275: * a long integer boundary, and pad with nulls
276: */
277: putstr(fp, s, n)
278: FILEP fp;
279: char *s;
280: ftnint n;
281: {
282: int b[SZSHORT];
283: int i;
284:
285: i = 0;
286: while(--n >= 0)
287: {
288: b[i++] = *s++;
289: if(i == SZSHORT)
290: {
291: prchars(fp, b);
292: i = 0;
293: }
294: }
295:
296: while(i < SZSHORT)
297: b[i++] = '\0';
298: prchars(fp, b);
299: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.