|
|
1.1 root 1: /* local.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: struct _iobuf *fopen();
15: struct _iobuf *fdopen();
16: struct _iobuf *freopen();
17: long ftell();
18: char *fgets();
19: char *hash();
20: char *savestr();
21: char *tstr();
22: extern int tstrused;
23: extern char *tstrbuf[];
24: extern char **curtstr;
25: extern int nerrors;
26: typedef union ndu NODE;
27: typedef unsigned int TWORD;
28: typedef long CONSZ;
29:
30:
31: extern int dope[];
32: extern char *opst[];
33:
34: union ndu {
35: struct {
36: int op;
37: int goal;
38: TWORD type;
39: int cst[(6+4)];
40: char * name;
41: char pad[8 -sizeof(char *)];
42: NODE *left;
43: NODE *right;
44: }in;
45:
46: struct {
47: int op;
48: int goal;
49: TWORD type;
50: int cst[(6+4)];
51: char * name;
52: char pad[8 -sizeof(char *)];
53: CONSZ lval;
54: int rval;
55: }tn;
56:
57: struct {
58: int op;
59: int goal;
60: TWORD type;
61: int cst[(6+4)];
62: int label;
63: int lop;
64: }bn;
65: struct {
66: int op;
67: int goal;
68: TWORD type;
69: int cst[(6+4)];
70: int stsize;
71: short stalign;
72: short argsize;
73: }stn;
74: struct {
75: int op;
76: int goal;
77: TWORD type;
78: int cdim;
79: int csiz;
80: }fn;
81:
82: struct {
83:
84: int op;
85: int goal;
86: TWORD type;
87: int cdim;
88: int csiz;
89: double dval;
90: }fpn;
91: };
92:
93: extern char *scnames();
94: typedef long OFFSZ;
95: struct symtab {
96: char *sname;
97: TWORD stype;
98: char sclass;
99: char slevel;
100: char sflags;
101: int offset;
102: short dimoff;
103: short sizoff;
104: short suse;
105: struct symtab *scopelink;
106: };
107: struct sw {
108: CONSZ sval;
109: int slab;
110: };
111: extern struct sw swtab[];
112: extern struct sw *swp;
113: extern int swx;
114: extern int ftnno;
115: extern int blevel;
116: extern int instruct, stwart;
117: extern int lineno, nerrors;
118: typedef union {
119: int intval;
120: NODE * nodep;
121: } YYSTYPE;
122: extern YYSTYPE yylval;
123: extern CONSZ lastcon;
124: extern CONSZ ccast();
125: extern double dcon;
126: extern char ftitle[];
127: extern struct symtab stab[];
128: extern int curftn;
129: extern int strftn;
130: extern char *locnames[];
131: extern int curloc;
132: extern int curclass;
133: extern int curdim;
134: extern int dimtab[];
135: extern int paramstk[];
136: extern int paramno;
137: extern int argstk[];
138: extern int argsoff[];
139: extern TWORD argty[];
140: extern int argno;
141: extern int autooff, argoff, strucoff;
142: extern int regvar;
143: extern int nextrvar;
144: extern int brkflag;
145: extern char yytext[];
146: extern int strflg;
147: extern OFFSZ inoff;
148: extern int reached;
149: extern int idname;
150: extern NODE node[];
151: extern NODE *lastfree;
152: extern int cflag, hflag, pflag;
153: extern int brklab;
154: extern int contlab;
155: extern int flostat;
156: extern int retlab;
157: extern int retstat;
158: extern int asavbc[], *psavbc;
159:
160: extern NODE
161: *aadjust(),
162: *bcon(),
163: *bdty(),
164: *block(),
165: *bpsize(),
166: *buildtree(),
167: *clocal(),
168: *conval(),
169: *convert(),
170: *dclstruct(),
171: *doszof(),
172: *getstr(),
173: *makety(),
174: *mkty(),
175: *oconvert(),
176: *offcon(),
177: *optim(),
178: *pconvert(),
179: *ptmatch(),
180: *pvconvert(),
181: *rstruct(),
182: *sconvert(),
183: *strargs(),
184: *stref(),
185: *talloc(),
186: *tymatch(),
187: *tymerge(),
188: *unconvert(),
189: *xicolon();
190: OFFSZ tsize(),
191: psize();
192: TWORD types(),
193: ctype();
194: char *exname(), *exdcon();
195: int minrvar = 11;
196: int wloop_level = 1 ;
197: int floop_level = 1 ;
198: int maxboff;
199: int maxtemp;
200: extern int gdebug;
201: main( argc, argv ) char *argv[];
202: {
203: extern int proflag;
204:
205:
206: int r;
207: r = mainp1( argc, argv );
208: return( r );
209: }
210: beg_file()
211: {
212:
213: register char *p, *s;
214: char *tempnam();
215:
216: p = ftitle + strlen( ftitle ) - 2;
217: s = p - 14;
218: while ( p > s && *p != '"' && *p != '/' )
219: --p;
220: regvar = minrvar;
221: if (gdebug)
222: dbline();
223: }
224: NODE *
225: treecpy(p)
226: register NODE *p;
227: {
228:
229: register NODE *q;
230: q = talloc();
231: *q = *p;
232: switch ( (dope[q->in.op]&016))
233: {
234: case 010:
235: q->in.right = treecpy(p->in.right);
236: case 04:
237: q->in.left = treecpy(p->in.left);
238: }
239: return (q);
240: }
241: NODE *
242: clocal(p) NODE *p;
243: {
244: register NODE *l,*ll,*temp;
245: if( p->in.op == (2+ 11) )
246: {
247:
248: l = p->in.left;
249: if( l->in.op == 6 )
250: {
251: ll = l->in.left;
252: if( ll->in.op != 11 && ll->in.op != 2+ 14 )
253: {
254: if( (l->in.right)->in.op == 11 )
255: {
256: temp = l->in.right;
257: l->in.right = l->in.left;
258: l->in.left = temp;
259: }
260: }
261: }
262: }
263: return(p);
264: }
265: cisreg( t ) TWORD t;
266: {
267: if( t==4 || t==14 || ((t&(03<<5 ))== 040) || t==2 || t==12
268: || t==3 || t==13 )
269: {
270: if( regvar >= 6 )
271: {
272: nextrvar = regvar--;
273: if( regvar < minrvar ) minrvar = regvar;
274: return(1);
275: }
276: }
277: return(0);
278: }
279: opbigsz( op )
280: {
281:
282: switch( op )
283: {
284: default:
285: return( 32 );
286: case 6:
287: case 8:
288: case 17:
289: case 14:
290: case 19:
291: case 77:
292: case 2+ 8:
293: return( 8 );
294: }
295: }
296: branch(n)
297: int n;
298: {
299: if (!reached)
300: return;
301: dbline();
302: genubr(n);
303: }
304:
305: static int tablelabel;
306: struct sw heapsw[250 ];
307:
308:
309: genswitch(p,n) register struct sw *p;
310: {
311:
312: register i;
313: register CONSZ j, range;
314: register dlab, swlab;
315: range = p[n].sval-p[1].sval;
316: if( ( range>0 && range<=(3* n ) && n >=4) )
317: {
318: swlab = getlab();
319: dlab = ((p->slab >= 0) ? p->slab : getlab());
320: dswbegin( n, p[1].sval, range, swlab, dlab );
321: for( i=1,j=p[1].sval; i<=n; j++)
322: {
323: if( j == p[i].sval )
324: {
325: dswcase( p[i].slab );
326: j = p[i++].sval;
327: }
328: else
329: {
330: dswcase( dlab );
331: }
332: }
333:
334: locctr( 0 );
335: if( p->slab >= 0 ) genubr( dlab );
336: else deflab( dlab );
337: return;
338: }
339: if( (n>8) )
340: {
341: heapsw[0].slab = dlab = (p->slab >= 0 ? p->slab : getlab());
342: makeheap(p, n, 1);
343: walkheap(1, n);
344: if( p->slab >= 0 )
345: genubr( dlab );
346: else
347: deflab( dlab );
348: return;
349: }
350:
351: for( i=1; i<=n; ++i ) sswtest( p[i].sval, p[i].slab );
352: if( p->slab>=0 ) genubr( p->slab );
353: }
354: makeheap(p, m, n)
355: register struct sw *p;
356: {
357: register int q;
358: q = select(m);
359: heapsw[n] = p[q];
360: if( q>1 ) makeheap(p, q-1, 2*n);
361: if( q<m ) makeheap(p+q, m-q, 2*n+1);
362: }
363: select(m) {
364: register int l,i,k;
365: for(i=1; ; i*=2)
366: if( (i-1) > m ) break;
367: l = ((k = i/2 - 1) + 1)/2;
368: return( l + (m-k < l ? m-k : l));
369: }
370: walkheap(start, limit)
371: {
372: int label;
373: if( start > limit ) return;
374: sswtest( heapsw[start].sval, heapsw[start].slab );
375: if( (2*start) > limit ) {
376: genubr( heapsw[0].slab );
377: return;
378: }
379: if( (2*start+1) <= limit ) {
380: label = getlab();
381: hswelse( label );
382: } else
383: hswelse( heapsw[0].slab );
384: walkheap( 2*start, limit);
385: if( (2*start+1) <= limit ) {
386: deflab( label );
387: walkheap( 2*start+1, limit);
388: }
389: }
390: dswbegin( numb, first, range, labl, dlab )
391: CONSZ first, range;
392: int numb, labl, dlab;
393: {
394: printf(" casel r0,$%ld,$%ld\n", first, range );
395: printf("L%d:\n", labl );
396: tablelabel = labl;
397: }
398: dswcase( l )
399: int l;
400: {
401: printf(" .word L%d-L%d\n", l, tablelabel );
402: }
403: sswtest( val, lab )
404: CONSZ val;
405: int lab;
406: {
407: printf( " cmpl r0,$%ld\n jeql L%d\n", val, lab );
408: }
409: hswelse( lab )
410: int lab;
411: {
412: printf(" jgtr L%d\n", lab );
413: }
414: OFFSZ inoff;
415: static inwd;
416: static long word;
417: zecode( n )
418: int n;
419: {
420:
421: if (n <= 0) return;
422: printf( " .space %d\n", 4*n );
423: inoff += n*32;
424: }
425: vfdzero( n ){
426:
427: sz_incode( (CONSZ)0, n );
428: }
429: incode (p, sz)
430: NODE *p;
431: {
432: sz_incode(p->tn.lval, sz);
433: }
434: sz_incode( val, sz )
435: CONSZ val;
436: {
437:
438:
439:
440: if((sz+inwd) > 32) cerror("incode: field > long");
441:
442: word |= ((unsigned)(val<<(32-sz))) >> (32-sz-inwd);
443: inwd += sz;
444: inoff += sz;
445:
446: if( inwd == 32 )
447: {
448: genlong( word );
449: word = inwd = 0;
450: }
451: }
452: fincode( d, sz )
453: double d;
454: int sz;
455: {
456:
457:
458:
459: union { float f; double d; int i[2]; } cheat;
460: if (sz == 64)
461: {
462: cheat.d = d;
463: printf("\t.long\t0x%x,0x%x\t# %.20e\n", cheat.i[0], cheat.i[1],
464: cheat.d);
465: }
466: else
467: {
468: cheat.f = d;
469: printf("\t.long\t0x%x\t# %.20e\n", cheat.i[0], cheat.f);
470: }
471: inoff += sz;
472: }
473: int ftlab1, ftlab2;
474: int proflag;
475: int ent_mask[] = {
476: 0,0,0,0,0, 0xfc0, 0xf80, 0xf00, 0xe00, 0xc00, 0x800, 0};
477: efcode()
478: {
479:
480: long spoff;
481: genret( strftn, strftn, retlab );
482: printf( " .set L.R%d,0x%x\n", ftnno, ent_mask[minrvar] );
483: spoff = maxboff;
484: if( spoff >= ((0 )/8) ) spoff -= ((0 )/8);
485: spoff += maxtemp;
486: spoff /= 8;
487: deflab( ftlab1 );
488: if( spoff!=0 )
489: if( spoff < 64 )
490: printf( " subl2 $%ld,sp\n", spoff );
491: else
492: printf( " movab -%ld(sp),sp\n", spoff);
493: genubr( ftlab2 );
494: regvar = minrvar = 11;
495: if (gdebug)
496: dbfunend(getlab());
497: }
498: bfcode( a, n )
499: int a[], n;
500: {
501:
502: register i;
503:
504: printf( " .word L.R%d\n", ftnno);
505: genubr( ftlab1 = getlab() );
506: deflab( ftlab2 = getlab() );
507: retlab = getlab();
508: if( proflag )
509: {
510: i = getlab();
511: printf(" movab L%d,r0\n", i);
512: printf(" jsb mcount\n");
513: printf(" .data\n");
514: printf(" .align 2\n");
515: printf("L%d: .long 0\n", i);
516: printf(" .text\n");
517: }
518: if (gdebug)
519: {
520: dbfunbeg(&stab[curftn]);
521: dbnargs(n);
522: for (i = 0; i < n; ++i)
523: dbfunarg(&stab[a[i]]);
524: }
525: }
526: defnam( psym )
527: register struct symtab *psym;
528: {
529:
530:
531:
532: if (psym->sclass == 5)
533: printf( " .globl %s\n", exname(psym->sname) );
534: printf("%s:\n", exname(psym->sname));
535: }
536: commdec(id)
537: int id;
538: {
539: register struct symtab *psym;
540: OFFSZ n;
541: psym = &stab[id];
542: psym->sflags |= 0200;
543: n = tsize(psym->stype, psym->dimoff, psym->sizoff) / 8;
544: if (psym->sclass == 3)
545: if (psym->slevel)
546: printf(" .lcomm L%d,%ld\n", psym->offset, n);
547: else
548: printf(" .lcomm %s,%ld\n", exname(psym->sname), n);
549: else if (psym->sclass == 2)
550: printf(" .comm %s,%ld\n", exname(psym->sname), n);
551: else
552: cerror("Non-static/external in common");
553: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.