|
|
1.1 root 1: /* local2.c */
2: extern struct _iobuf {
3: int _cnt;
4: char *_ptr;
5: char *_base;
6: short _flag;
7: char _file;
8: } _iob[20];
9: struct _iobuf *fopen();
10: struct _iobuf *fdopen();
11: struct _iobuf *freopen();
12: long ftell();
13: char *fgets();
14: char *hash();
15: char *savestr();
16: char *tstr();
17: extern int tstrused;
18: extern char *tstrbuf[];
19: extern char **curtstr;
20: extern int nerrors;
21: typedef union ndu NODE;
22: typedef unsigned int TWORD;
23: typedef long CONSZ;
24:
25:
26: extern int dope[];
27: extern char *opst[];
28:
29: union ndu {
30: struct {
31: int op;
32: int goal;
33: TWORD type;
34: int cst[(6+4)];
35: char * name;
36: char pad[8 -sizeof(char *)];
37: NODE *left;
38: NODE *right;
39: }in;
40:
41: struct {
42: int op;
43: int goal;
44: TWORD type;
45: int cst[(6+4)];
46: char * name;
47: char pad[8 -sizeof(char *)];
48: CONSZ lval;
49: int rval;
50: }tn;
51:
52: struct {
53: int op;
54: int goal;
55: TWORD type;
56: int cst[(6+4)];
57: int label;
58: int lop;
59: }bn;
60: struct {
61: int op;
62: int goal;
63: TWORD type;
64: int cst[(6+4)];
65: int stsize;
66: short stalign;
67: short argsize;
68: }stn;
69: struct {
70: int op;
71: int goal;
72: TWORD type;
73: int cdim;
74: int csiz;
75: }fn;
76:
77: struct {
78:
79: int op;
80: int goal;
81: TWORD type;
82: int cdim;
83: int csiz;
84: double dval;
85: }fpn;
86: };
87:
88:
89:
90:
91:
92:
93:
94:
95: extern int busy[];
96: extern NODE node[];
97: typedef struct shape SHAPE;
98:
99: extern struct shape {
100: int op;
101: SHAPE *sl;
102: SHAPE *sr;
103: int sh;
104: int sc;
105: } shapes[];
106: extern SHAPE *pshape[];
107: typedef struct optab OPTAB;
108: struct optab {
109: int op;
110: int tyop;
111: OPTAB *nextop;
112: SHAPE **lshape;
113: int ltype;
114: SHAPE **rshape;
115: int rtype;
116: int needs;
117: int rewrite;
118: char *cstring;
119: int cost;
120: int lcount;
121: int rcount;
122: int stinline;
123: };
124: extern OPTAB
125: *match(),
126: *ophead[],
127: table[];
128: extern NODE resc[];
129: extern int tmpoff;
130: extern int maxboff;
131: extern int maxtemp;
132: extern int maxarg;
133: extern int ftnno;
134: extern int sideff;
135: extern NODE
136: *talloc(),
137: *ind2type(),
138: *tcopy(),
139: *getadr(),
140: *getlr();
141: extern CONSZ rdin();
142: extern char *rnames[];
143: extern int lineno;
144: extern char ftitle[];
145: extern int fldshf, fldsz;
146: extern int lflag, udebug, e2debug, odebug, rdebug, radebug, sdebug;
147: extern int fast;
148:
149:
150:
151:
152: typedef struct inst INST;
153: struct inst {
154: NODE *p;
155: OPTAB *q;
156: int goal;
157: };
158: extern INST inst[300];
159: extern nins;
160:
161:
162: typedef SHAPE *SHTABLE[2][20];
163: extern SHTABLE sha;
164: eobl2()
165: {
166: }
167: char *
168: exname( ix )
169: char *ix;
170: {
171:
172: static char text[100];
173: if( ix == 0 ) cerror("no name in exname");
174: sprintf( text, "_%s", ix );
175: return( text );
176: }
177: lineid( l, fn )
178: int l;
179: char *fn;
180: {
181: extern int gdebug;
182:
183: printf( "# line %d, file %s\n", l, fn );
184: }
185: deflab( n )
186: int n;
187: {
188: printf( "L%d:\n", n );
189: }
190: genubr( n )
191: int n;
192: {
193:
194: printf( " jbr L%d\n", n );
195: }
196: genret( s, l, n )
197: int s, l, n;
198: {
199:
200:
201: deflab(n);
202: if( s ) printf( " movab L%d,r0\n", l );
203: dbfunret();
204: printf( " ret\n" );
205: }
206: defalign(n)
207: int n;
208: {
209:
210: if( n % 8 ) cerror( "funny alignment: %d", n );
211: else n /= 8;
212: if( n == 1 ) return;
213: else if( n==2 ) n=1;
214: else if( n==4 ) n=2;
215: else cerror( "funny alignment: %d", n );
216: printf( " .align %d\n", n );
217: }
218: char *locnames[] = {
219:
220: " .text\n",
221: " .data\n",
222: " .data\n",
223: " .data 2\n",
224: " .data 1\n",
225: };
226: bycode( t, i )
227: int t, i;
228: {
229:
230: i &= 07;
231: if( t < 0 )
232: {
233: if( i != 0 ) printf("\n");
234: }
235: else
236: {
237: if( i == 0 ) printf( "\n .byte " );
238: else printf(",");
239: printf("0x%x", t);
240: }
241: }
242: genshort( s )
243: short s;
244: {
245:
246: printf( " .short %d\n", (short) s );
247: }
248: genlong( l )
249: long l;
250: {
251:
252: printf( " .long 0x%lx\n", l );
253: }
254: char *
255: rnames[]= {
256: "r0", "r1",
257: "r2", "r3", "r4",
258: "r5", "r6", "r7", "r8", "r9", "r10", "r11",
259: "ap", "fp", "sp", "pc"
260: };
261: zzzcode( p, ppc, q )
262: NODE *p; char **ppc; OPTAB *q;
263: {
264: register c;
265: switch( c= *++(*ppc) )
266: {
267: case 'I':
268: cbgen( p->bn.lop, p->bn.label, c );
269: return;
270: case 'k':
271: printf("$%ld", ~p->in.right->tn.lval);
272: return;
273: case 'c':
274:
275: printf( "$%d", p->stn.argsize/32);
276: return;
277: case 'U':
278: printf("$%d", 32 - p->in.right->tn.lval );
279: return;
280: case 'T':
281: printf("$%d", p->stn.stsize/8);
282: break;
283: case 'M':
284: staradr( p->in.right );
285: break;
286: case 'S':
287: {
288: register NODE *l, *r;
289: register size;
290: if( p->in.op == 98 )
291: {
292: l = p->in.left;
293: r = p->in.right;
294: }
295: else if( p->in.op == 99 )
296: {
297: r = p->in.left;
298: }
299: else cerror( "STASG bad" );
300: size = p->stn.stsize/8;
301: if( size <= 0 || size > 65535 )
302: cerror("structure size <0=0 or >65535");
303: switch(size)
304: {
305: case 1:
306: printf(" movb ");
307: break;
308: case 2:
309: printf(" movw ");
310: break;
311: case 4:
312: printf(" movl ");
313: break;
314: case 8:
315: printf(" movq ");
316: break;
317: default:
318: printf(" movc3 $%d,", size);
319: break;
320: }
321: staradr( r );
322: printf(",");
323: if( p->in.op == 99 ) printf( "(sp)" );
324: else staradr( l );
325: printf("\n");
326: }
327: break;
328: default:
329: cerror( "illegal zzzcode" );
330: }
331: }
332: staradr( p )
333: NODE *p;
334: {
335: NODE *pp;
336: pp = talloc();
337: pp->in.op = (2+ 11);
338: pp->in.left = p;
339: upput( pp );
340: pp->in.op = 97;
341: }
342: conput( p )
343: register NODE *p;
344: {
345: switch( p->in.op )
346: {
347: case 4:
348: acon( p );
349: return;
350: case 94:
351: printf( "%s", rnames[p->tn.rval] );
352: return;
353: default:
354: cerror( "illegal conput" );
355: }
356: }
357: insput( p )
358: NODE *p;
359: {
360: cerror( "insput" );
361: }
362: upput( p )
363: NODE *p;
364: {
365: register NODE *r, *l, *pp;
366: register o;
367: pp = ( (2+ 11) == p->in.op ) ? p->in.left : p ;
368: o = pp->in.op;
369: if( o==2 || o==(2+ 11) || o==95 || o==116 || o==117 )
370: {
371: printf( "*" );
372: adrput(pp);
373: return;
374: }
375: if( o==4 )
376: {
377: acon( pp );
378: sideff = 0;
379: return;
380: }
381: if( o == 6 )
382: {
383: r = pp->in.right;
384: l = pp->in.left;
385: if( l->in.op == 94 && r->in.op == 4 )
386: {
387: acon( r );
388: pp = pp->in.left;
389: }
390: else
391: {
392:
393:
394: if( l->in.op == 2+ 14 )
395: {
396: adrput( l->in.left );
397: l = r;
398: }
399: else
400: {
401: p->in.left = r;
402: adrput( p );
403: p->in.left = pp;
404: }
405: if( l->in.op == 64 ) l = l->in.left;
406: if( l->in.op != 94 ) cerror("illegal address");
407: printf( "[%s]", rnames[l->tn.rval] );
408: return;
409: }
410: }
411: else if( o == 8 )
412: {
413: r = pp->in.right;
414: if( r->tn.op != 4 || r->tn.name ) cerror("illegal address");
415: r->tn.lval = -r->tn.lval;
416: acon( r );
417: r->tn.lval = -r->tn.lval;
418: pp = pp->in.left;
419: }
420: else if( o == 1+ 8 )
421: {
422: r = pp->in.right;
423: if( r->tn.op != 4 ) cerror("illegal address");
424: r = pp->in.left;
425: if( r->tn.op != 94 ) cerror("illegal address");
426:
427: printf( "-(%s)", rnames[r->tn.rval] );
428: sideff = 1;
429: return;
430: }
431: else if( o == 78 )
432: {
433: r = pp->in.right;
434: if( r->tn.op != 4 ) cerror("illegal address");
435: r = pp->in.left;
436: if( r->tn.op != 94 ) cerror("illegal address");
437: if( sideff ) printf( "(%s)+", rnames[r->tn.rval] );
438: else printf( "(%s)", rnames[r->tn.rval] );
439: return;
440: }
441: if( pp->tn.op != 94 ) cerror("illegal address");
442: printf( "(%s)", rnames[pp->tn.rval] );
443: return;
444: }
445: adrput( p )
446: register NODE *p;
447: {
448:
449: register o;
450: while( (o=p->in.op) == 103 || o==104 )
451: {
452: p = p->in.left;
453: o = p->in.op;
454: }
455: switch( o )
456: {
457: case 2:
458: acon( p );
459: sideff = 0;
460: return;
461: case 4:
462:
463: printf( "$" );
464: acon( p );
465: sideff = 0;
466: return;
467: case 94:
468: printf( "%s", rnames[p->tn.rval] );
469: sideff = 0;
470: return;
471: case (2+ 11):
472: upput( p );
473: return;
474: case 95:
475: sideff = 0;
476: printf( "%ld(fp)", p->tn.lval - maxboff );
477: return;
478: case 116:
479: sideff = 0;
480: printf( "%ld(fp)", p->tn.lval );
481: return;
482: case 117:
483: sideff = 0;
484: printf( "%ld(ap)", p->tn.lval );
485: return;
486: default:
487: cerror( "illegal address" );
488: return;
489: }
490: }
491: acon(p)
492: NODE *p;
493: {
494: if( p->tn.name == 0 )
495: {
496: printf( "%ld", p->tn.lval);
497: }
498: else if( p->tn.lval == 0 )
499: {
500: printf( "%s", p->tn.name );
501: }
502: else
503: {
504: printf( "%s+%ld", p->tn.name, p->tn.lval );
505: }
506: }
507: char *
508: ccbranches[] = {
509: " jeql L%d\n",
510: " jneq L%d\n",
511: " jleq L%d\n",
512: " jlss L%d\n",
513: " jgeq L%d\n",
514: " jgtr L%d\n",
515: " jlequ L%d\n",
516: " jlssu L%d\n",
517: " jgequ L%d\n",
518: " jgtru L%d\n",
519: };
520: cbgen( o, lab, mode )
521: int o, lab, mode;
522: {
523: if( !o ) printf( " jbr L%d\n", lab );
524: else if( o > 89 ) cerror( "bad conditional branch: %s", opst[o] );
525: else printf( ccbranches[o-80], lab );
526: }
527: special()
528: {
529: cerror("reached special");
530: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.