|
|
1.1 root 1: #include "defs.h"
2:
3: #ifdef SDB
4: # include <a.out.h>
5: extern int types2[];
6: # ifndef N_SO
7: # include <stab.h>
8: # endif
9: #endif
10:
11: #include "pccdefs.h"
12:
13:
14: /*
15: VAX-11/780 - SPECIFIC ROUTINES
16: */
17:
18:
19: int maxregvar = MAXREGVAR;
20: int regnum[] = { 10, 9, 8, 7, 6 } ;
21: static int regmask[] = { 0x800, 0xc00, 0xe00, 0xf00, 0xf80, 0xfc0 };
22:
23:
24:
25: ftnint intcon[14] =
26: { 2, 2, 2, 2,
27: 15, 31, 24, 56,
28: -128, -128, 127, 127,
29: 32767, 2147483647 };
30:
31: #if HERE == VAX
32: /* then put in constants in octal */
33: long realcon[6][2] =
34: {
35: { 0200, 0 },
36: { 0200, 0 },
37: { 037777677777, 0 },
38: { 037777677777, 037777777777 },
39: { 032200, 0 },
40: { 022200, 0 }
41: };
42: #else
43: double realcon[6] =
44: {
45: 2.9387358771e-39,
46: 2.938735877055718800e-39
47: 1.7014117332e+38,
48: 1.701411834604692250e+38
49: 5.960464e-8,
50: 1.38777878078144567e-17,
51: };
52: #endif
53:
54:
55:
56:
57: prsave(proflab)
58: int proflab;
59: {
60: if(profileflag)
61: {
62: fprintf(asmfile, "L%d:\t.space\t4\n", proflab);
63: p2pi("\tmovab\tL%d,r0", proflab);
64: p2pass("\tjsb\tmcount");
65: }
66: p2pi("\tsubl2\t$LF%d,sp", procno);
67: }
68:
69:
70:
71: goret(type)
72: int type;
73: {
74: p2pass("\tret");
75: }
76:
77:
78:
79:
80: /*
81: * move argument slot arg1 (relative to ap)
82: * to slot arg2 (relative to ARGREG)
83: */
84:
85: mvarg(type, arg1, arg2)
86: int type, arg1, arg2;
87: {
88: p2pij("\tmovl\t%d(ap),%d(fp)", arg1+ARGOFFSET, arg2+argloc);
89: }
90:
91:
92:
93:
94: prlabel(fp, k)
95: FILEP fp;
96: int k;
97: {
98: fprintf(fp, "L%d:\n", k);
99: }
100:
101:
102:
103: prconi(fp, type, n)
104: FILEP fp;
105: int type;
106: ftnint n;
107: {
108: fprintf(fp, "\t%s\t%ld\n", (type==TYSHORT ? ".word" : ".long"), n);
109: }
110:
111:
112:
113: prcona(fp, a)
114: FILEP fp;
115: ftnint a;
116: {
117: fprintf(fp, "\t.long\tL%ld\n", a);
118: }
119:
120:
121:
122: #ifndef vax
123: prconr(fp, type, x)
124: FILEP fp;
125: int type;
126: float x;
127: {
128: fprintf(fp, "\t%s\t0f%e\n", (type==TYREAL ? ".float" : ".double"), x);
129: }
130: #endif
131:
132: #ifdef vax
133: prconr(fp, type, x)
134: FILEP fp;
135: int type;
136: double x;
137: {
138: /* non-portable cheat to preserve bit patterns */
139: union { double xd; long int xl[2]; } cheat;
140: cheat.xd = x;
141: if(type == TYREAL)
142: {float y = x; fprintf(fp, "\t.long\t0x%X\n", *(long *) &y); }
143: else
144: fprintf(fp, "\t.long\t0x%X,0x%X\n", cheat.xl[0], cheat.xl[1]);
145: }
146: #endif
147:
148:
149:
150: praddr(fp, stg, varno, offset)
151: FILE *fp;
152: int stg, varno;
153: ftnint offset;
154: {
155: char *memname();
156:
157: if(stg == STGNULL)
158: fprintf(fp, "\t.long\t0\n");
159: else
160: {
161: fprintf(fp, "\t.long\t%s", memname(stg,varno));
162: if(offset)
163: fprintf(fp, "+%ld", offset);
164: fprintf(fp, "\n");
165: }
166: }
167:
168:
169:
170:
171: preven(k)
172: int k;
173: {
174: register int lg;
175:
176: if(k > 4)
177: lg = 3;
178: else if(k > 2)
179: lg = 2;
180: else if(k > 1)
181: lg = 1;
182: else
183: return;
184: fprintf(asmfile, "\t.align\t%d\n", lg);
185: }
186:
187:
188:
189:
190: pralign(k)
191: int k;
192: {
193: register int lg;
194:
195: if (k > 4)
196: lg = 3;
197: else if (k > 2)
198: lg = 2;
199: else if (k > 1)
200: lg = 1;
201: else
202: return;
203:
204: fprintf(initfile, "\t.align\t%d\n", lg);
205: return;
206: }
207:
208:
209:
210: vaxgoto(index, nlab, labs)
211: expptr index;
212: register int nlab;
213: struct Labelblock *labs[];
214: {
215: register int i;
216: register int arrlab;
217:
218: putforce(TYINT, index);
219: p2pi("\tcasel\tr0,$1,$%d", nlab-1);
220: p2pi("L%d:", arrlab = newlabel() );
221: for(i = 0; i< nlab ; ++i)
222: if( labs[i] )
223: p2pij("\t.word\tL%d-L%d", labs[i]->labelno, arrlab);
224: }
225:
226:
227: prarif(p, neg, zer, pos)
228: expptr p;
229: int neg, zer, pos;
230: {
231: int type;
232:
233: type = p->headblock.vtype;
234: putforce(type, p);
235: if(type == TYLONG)
236: p2pass("\ttstl\tr0");
237: else if (type == TYSHORT)
238: p2pass("\ttstw\tr0");
239: else
240: p2pass("\ttstd\tr0");
241: p2pi("\tjlss\tL%d", neg);
242: p2pi("\tjeql\tL%d", zer);
243: p2pi("\tjbr\tL%d", pos);
244: }
245:
246:
247:
248:
249: char *memname(stg, mem)
250: int stg, mem;
251: {
252: static char s[20];
253:
254: switch(stg)
255: {
256: case STGCOMMON:
257: case STGEXT:
258: sprintf(s, "_%s", varstr(XL, extsymtab[mem].extname) );
259: break;
260:
261: case STGBSS:
262: case STGINIT:
263: sprintf(s, "v.%d", mem);
264: break;
265:
266: case STGCONST:
267: sprintf(s, "L%d", mem);
268: break;
269:
270: case STGEQUIV:
271: sprintf(s, "q.%d", mem+eqvstart);
272: break;
273:
274: default:
275: badstg("memname", stg);
276: }
277: return(s);
278: }
279:
280:
281:
282:
283: prlocvar(s, len)
284: char *s;
285: ftnint len;
286: {
287: fprintf(asmfile, "\t.lcomm\t%s,%ld\n", s, len);
288: }
289:
290:
291:
292:
293: char *
294: packbytes(cp)
295: register Constp cp;
296: {
297: static char shrt[2];
298: static char lng[4];
299: static char quad[8];
300: static char oct[16];
301:
302: register int type;
303: register int *ip, *jp;
304:
305: switch (cp->vtype)
306: {
307: case TYSHORT:
308: *((short *) shrt) = (short) cp->const.ci;
309: return (shrt);
310:
311: case TYLONG:
312: case TYLOGICAL:
313: case TYREAL:
314: *((int *) lng) = cp->const.ci;
315: return (lng);
316:
317: case TYDREAL:
318: ip = (int *) quad;
319: jp = (int *) &(cp->const.cd[0]);
320: ip[0] = jp[0];
321: ip[1] = jp[1];
322: return (quad);
323:
324: case TYCOMPLEX:
325: ip = (int *) quad;
326: jp = (int *) &(cp->const.cd[0]);
327: ip[0] = jp[0];
328: ip[1] = jp[2];
329: return (quad);
330:
331: case TYDCOMPLEX:
332: ip = (int *) oct;
333: jp = (int *) &(cp->const.cd[0]);
334: *ip++ = *jp++;
335: *ip++ = *jp++;
336: *ip++ = *jp++;
337: *ip = *jp;
338: return (oct);
339:
340: default:
341: badtype("packbytes", cp->vtype);
342: }
343: }
344:
345:
346:
347:
348: prsdata(s, len)
349: register char *s;
350: register int len;
351: {
352: static char *longfmt = "\t.long\t0x%x\n";
353: static char *wordfmt = "\t.word\t0x%x\n";
354: static char *bytefmt = "\t.byte\t0x%x\n";
355:
356: register int i;
357:
358: i = 0;
359: if ((len - i) >= 4)
360: {
361: fprintf(initfile, longfmt, *((int *) s));
362: i += 4;
363: }
364: if ((len - i) >= 2)
365: {
366: fprintf(initfile, wordfmt, 0xffff & (*((short *) (s + i))));
367: i += 2;
368: }
369: if ((len - i) > 0)
370: fprintf(initfile,bytefmt, 0xff & s[i]);
371:
372: return;
373: }
374:
375:
376:
377: prquad(s)
378: char *s;
379: {
380: static char *quadfmt1 = "\t.quad\t0x%x\n";
381: static char *quadfmt2 = "\t.quad\t0x%x%08x\n";
382:
383: if ( *((int *) (s + 4)) == 0 )
384: fprintf(initfile, quadfmt1, *((int *) s));
385: else
386: fprintf(initfile, quadfmt2, *((int *) (s + 4)), *((int *) s));
387:
388: return;
389: }
390:
391:
392:
393: #ifdef NOTDEF
394:
395: /* The code for generating .fill directives has been */
396: /* ifdefed out because of bugs in the UCB VAX assembler. */
397: /* If those bugs are ever fixed (and it seems unlikely), */
398: /* the NOTDEF's should be replaced by UCBVAXASM. */
399:
400:
401: prfill(n, s)
402: int n;
403: register char *s;
404: {
405: static char *fillfmt1 = "\t.fill\t%d,8,0x%x\n";
406: static char *fillfmt2 = "\t.fill\t%d,8,0x%x%08x\n";
407:
408: if (*((int *) (s + 4)) == 0)
409: fprintf(initfile, fillfmt1, n, *((int *) s));
410: else
411: fprintf(initfile, fillfmt2, n, *((int *) (s + 4)), *((int *) s));
412:
413: return;
414: }
415:
416: #endif
417:
418:
419:
420: prext(ep)
421: register struct Extsym *ep;
422: {
423: static char *globlfmt = "\t.globl\t_%s\n";
424: static char *commfmt = "\t.comm\t_%s,%ld\n";
425: static char *spacefmt = "\t.space\t%d\n";
426: static char *align2fmt = "\t.align\t2\n";
427: static char *labelfmt = "_%s:\n";
428:
429: static char *seekerror = "seek error on tmp file";
430: static char *readerror = "read error on tmp file";
431:
432: char *tag;
433: register int leng;
434: long pos;
435: register int i;
436: char oldvalue[8];
437: char newvalue[8];
438: register int n;
439: register int repl;
440:
441: tag = varstr(XL, ep->extname);
442: leng = ep->maxleng;
443:
444: if (leng == 0)
445: {
446: fprintf(asmfile, globlfmt, tag);
447: return;
448: }
449:
450: if (ep->init == NO)
451: {
452: fprintf(asmfile, commfmt, tag, leng);
453: return;
454: }
455:
456: fprintf(asmfile, globlfmt, tag);
457: fprintf(initfile, align2fmt);
458: fprintf(initfile, labelfmt, tag);
459:
460: pos = lseek(cdatafile, ep->initoffset, 0);
461: if (pos == -1)
462: {
463: err(seekerror);
464: done(1);
465: }
466:
467: *((int *) oldvalue) = 0;
468: *((int *) (oldvalue + 4)) = 0;
469: n = read(cdatafile, oldvalue, 8);
470: if (n < 0)
471: {
472: err(readerror);
473: done(1);
474: }
475:
476: if (leng <= 8)
477: {
478: i = leng;
479: while (i > 0 && oldvalue[--i] == '\0') /* SKIP */;
480: if (oldvalue[i] == '\0')
481: fprintf(initfile, spacefmt, leng);
482: else if (leng == 8)
483: prquad(oldvalue);
484: else
485: prsdata(oldvalue, leng);
486:
487: return;
488: }
489:
490: repl = 1;
491: leng -= 8;
492:
493: while (leng >= 8)
494: {
495: *((int *) newvalue) = 0;
496: *((int *) (newvalue + 4)) = 0;
497:
498: n = read(cdatafile, newvalue, 8);
499: if (n < 0)
500: {
501: err(readerror);
502: done(1);
503: }
504:
505: leng -= 8;
506:
507: if (*((int *) oldvalue) == *((int *) newvalue)
508: && *((int *) (oldvalue + 4)) == *((int *) (newvalue + 4)))
509: repl++;
510: else
511: {
512: if (*((int *) oldvalue) == 0
513: && *((int *) (oldvalue + 4)) == 0)
514: fprintf(initfile, spacefmt, 8*repl);
515: else if (repl == 1)
516: prquad(oldvalue);
517: else
518: #ifdef NOTDEF
519: prfill(repl, oldvalue);
520: #else
521: {
522: while (repl-- > 0)
523: prquad(oldvalue);
524: }
525: #endif
526: *((int *) oldvalue) = *((int *) newvalue);
527: *((int *) (oldvalue + 4)) = *((int *) (newvalue + 4));
528: repl = 1;
529: }
530: }
531:
532: *((int *) newvalue) = 0;
533: *((int *) (newvalue + 4)) = 0;
534:
535: if (leng > 0)
536: {
537: n = read(cdatafile, newvalue, leng);
538: if (n < 0)
539: {
540: err(readerror);
541: done(1);
542: }
543: }
544:
545: if (*((int *) (oldvalue + 4)) == 0
546: && *((int *) oldvalue) == 0
547: && *((int *) (newvalue + 4)) == 0
548: && *((int *) newvalue) == 0)
549: {
550: fprintf(initfile, spacefmt, 8*repl + leng);
551: return;
552: }
553:
554: if (*((int *) (oldvalue + 4)) == 0
555: && *((int *) oldvalue) == 0)
556: fprintf(initfile, spacefmt, 8*repl);
557: else if (repl == 1)
558: prquad(oldvalue);
559: else
560: #ifdef NOTDEF
561: prfill(repl, oldvalue);
562: #else
563: {
564: while (repl-- > 0)
565: prquad(oldvalue);
566: }
567: #endif
568:
569: prsdata(newvalue, leng);
570:
571: return;
572: }
573:
574:
575:
576: prlocdata(sname, leng, type, initoffset, inlcomm)
577: char *sname;
578: ftnint leng;
579: int type;
580: long initoffset;
581: char *inlcomm;
582: {
583: static char *seekerror = "seek error on tmp file";
584: static char *readerror = "read error on tmp file";
585:
586: static char *labelfmt = "%s:\n";
587: static char *spacefmt = "\t.space\t%d\n";
588:
589: register int k;
590: register int i;
591: register int repl;
592: register int first;
593: register long pos;
594: register long n;
595: char oldvalue[8];
596: char newvalue[8];
597:
598: *inlcomm = NO;
599:
600: k = leng;
601: first = YES;
602:
603: pos = lseek(vdatafile, initoffset, 0);
604: if (pos == -1)
605: {
606: err(seekerror);
607: done(1);
608: }
609:
610: *((int *) oldvalue) = 0;
611: *((int *) (oldvalue + 4)) = 0;
612: n = read(vdatafile, oldvalue, 8);
613: if (n < 0)
614: {
615: err(readerror);
616: done(1);
617: }
618:
619: if (k <= 8)
620: {
621: i = k;
622: while (i > 0 && oldvalue[--i] == '\0')
623: /* SKIP */ ;
624: if (oldvalue[i] == '\0')
625: {
626: if (SMALLVAR(leng))
627: {
628: pralign(typealign[type]);
629: fprintf(initfile, labelfmt, sname);
630: fprintf(initfile, spacefmt, leng);
631: }
632: else
633: {
634: preven(ALIDOUBLE);
635: prlocvar(sname, leng);
636: *inlcomm = YES;
637: }
638: }
639: else
640: {
641: fprintf(initfile, labelfmt, sname);
642: if (leng == 8)
643: prquad(oldvalue);
644: else
645: prsdata(oldvalue, leng);
646: }
647: return;
648: }
649:
650: repl = 1;
651: k -= 8;
652:
653: while (k >=8)
654: {
655: *((int *) newvalue) = 0;
656: *((int *) (newvalue + 4)) = 0;
657:
658: n = read(vdatafile, newvalue, 8);
659: if (n < 0)
660: {
661: err(readerror);
662: done(1);
663: }
664:
665: k -= 8;
666:
667: if (*((int *) oldvalue) == *((int *) newvalue)
668: && *((int *) (oldvalue + 4)) == *((int *) (newvalue + 4)))
669: repl++;
670: else
671: {
672: if (first == YES)
673: {
674: pralign(typealign[type]);
675: fprintf(initfile, labelfmt, sname);
676: first = NO;
677: }
678:
679: if (*((int *) oldvalue) == 0
680: && *((int *) (oldvalue + 4)) == 0)
681: fprintf(initfile, spacefmt, 8*repl);
682: else
683: {
684: while (repl-- > 0)
685: prquad(oldvalue);
686: }
687: *((int *) oldvalue) = *((int *) newvalue);
688: *((int *) (oldvalue + 4)) = *((int *) (newvalue + 4));
689: repl = 1;
690: }
691: }
692:
693: *((int *) newvalue) = 0;
694: *((int *) (newvalue + 4)) = 0;
695:
696: if (k > 0)
697: {
698: n = read(vdatafile, newvalue, k);
699: if (n < 0)
700: {
701: err(readerror);
702: done(1);
703: }
704: }
705:
706: if (*((int *) (oldvalue + 4)) == 0
707: && *((int *) oldvalue) == 0
708: && *((int *) (newvalue + 4)) == 0
709: && *((int *) newvalue) == 0)
710: {
711: if (first == YES && !SMALLVAR(leng))
712: {
713: prlocvar(sname, leng);
714: *inlcomm = YES;
715: }
716: else
717: {
718: if (first == YES)
719: {
720: pralign(typealign[type]);
721: fprintf(initfile, labelfmt, sname);
722: }
723: fprintf(initfile, spacefmt, 8*repl + k);
724: }
725: return;
726: }
727:
728: if (first == YES)
729: {
730: pralign(typealign[type]);
731: fprintf(initfile, labelfmt, sname);
732: }
733:
734: if (*((int *) (oldvalue + 4)) == 0
735: && *((int *) oldvalue) == 0)
736: fprintf(initfile, spacefmt, 8*repl);
737: else
738: {
739: while (repl-- > 0)
740: prquad(oldvalue);
741: }
742:
743: prsdata(newvalue, k);
744:
745: return;
746: }
747:
748:
749:
750:
751: prendproc()
752: {
753: }
754:
755:
756:
757:
758: prtail()
759: {
760: }
761:
762:
763:
764:
765:
766: prolog(ep, argvec)
767: struct Entrypoint *ep;
768: Addrp argvec;
769: {
770: int i, argslot, proflab;
771: int size;
772: register chainp p;
773: register Namep q;
774: register struct Dimblock *dp;
775: expptr tp;
776:
777: p2pass("\t.align\t1");
778:
779:
780: if(procclass == CLMAIN) {
781: if(fudgelabel)
782: {
783: if(ep->entryname) {
784: p2ps("_%s:", varstr(XL, ep->entryname->extname));
785: p2pi("\t.word\tLWM%d", procno);
786: }
787: putlabel(fudgelabel);
788: fudgelabel = 0;
789: fixlwm();
790: }
791: else
792: {
793: p2pass( "_MAIN_:" );
794: if(ep->entryname == NULL)
795: p2pi("\t.word\tLWM%d", procno);
796: }
797:
798: } else if(ep->entryname)
799: if(fudgelabel)
800: {
801: putlabel(fudgelabel);
802: fudgelabel = 0;
803: fixlwm();
804: }
805: else
806: {
807: p2ps("_%s:", varstr(XL, ep->entryname->extname));
808: p2pi("\t.word\tLWM%d", procno);
809: prsave(newlabel());
810: }
811:
812: if(procclass == CLBLOCK)
813: return;
814: if (anylocals == YES)
815: {
816: char buff[30];
817: sprintf(buff, "\tmovl\t$v.%d,r11", bsslabel);
818: p2pass(buff);
819: }
820: if(argvec)
821: {
822: if (argvec->tag != TADDR) badtag ("prolog",argvec->tag);
823: argloc = argvec->memoffset->constblock.const.ci + SZINT;
824: /* first slot holds count */
825: if(proctype == TYCHAR)
826: {
827: mvarg(TYADDR, 0, chslot);
828: mvarg(TYLENG, SZADDR, chlgslot);
829: argslot = SZADDR + SZLENG;
830: }
831: else if( ISCOMPLEX(proctype) )
832: {
833: mvarg(TYADDR, 0, cxslot);
834: argslot = SZADDR;
835: }
836: else
837: argslot = 0;
838:
839: for(p = ep->arglist ; p ; p =p->nextp)
840: {
841: q = (Namep) (p->datap);
842: mvarg(TYADDR, argslot, q->vardesc.varno);
843: argslot += SZADDR;
844: }
845: for(p = ep->arglist ; p ; p = p->nextp)
846: {
847: q = (Namep) (p->datap);
848: if(q->vtype==TYCHAR && q->vclass!=CLPROC)
849: {
850: if(q->vleng && ! ISCONST(q->vleng) )
851: mvarg(TYLENG, argslot,
852: q->vleng->addrblock.memno);
853: argslot += SZLENG;
854: }
855: }
856: p2pi("\taddl3\t$%d,fp,ap", argloc-ARGOFFSET);
857: p2pi("\tmovl\t$%d,(ap)\n", lastargslot/SZADDR);
858: }
859:
860: for(p = ep->arglist ; p ; p = p->nextp)
861: {
862: q = (Namep) (p->datap);
863: if(dp = q->vdim)
864: {
865: for(i = 0 ; i < dp->ndim ; ++i)
866: if(dp->dims[i].dimexpr)
867: puteq( fixtype(cpexpr(dp->dims[i].dimsize)),
868: fixtype(cpexpr(dp->dims[i].dimexpr)));
869: #ifdef SDB
870: if(sdbflag) {
871: for(i = 0 ; i < dp->ndim ; ++i) {
872: if(dp->dims[i].lbaddr)
873: puteq( fixtype(cpexpr(dp->dims[i].lbaddr)),
874: fixtype(cpexpr(dp->dims[i].lb)));
875: if(dp->dims[i].ubaddr)
876: puteq( fixtype(cpexpr(dp->dims[i].ubaddr)),
877: fixtype(cpexpr(dp->dims[i].ub)));
878:
879: }
880: }
881: #endif
882: size = typesize[ q->vtype ];
883: if(q->vtype == TYCHAR)
884: if( ISICON(q->vleng) )
885: size *= q->vleng->constblock.const.ci;
886: else
887: size = -1;
888:
889: /* on VAX, get more efficient subscripting if subscripts
890: have zero-base, so fudge the argument pointers for arrays.
891: Not done if array bounds are being checked.
892: */
893: if(dp->basexpr)
894: puteq( cpexpr(fixtype(dp->baseoffset)),
895: cpexpr(fixtype(dp->basexpr)));
896: #ifdef SDB
897: if( (! checksubs) && (! sdbflag) )
898: #else
899: if(! checksubs)
900: #endif
901: {
902: if(dp->basexpr)
903: {
904: if(size > 0)
905: tp = (expptr) ICON(size);
906: else
907: tp = (expptr) cpexpr(q->vleng);
908: putforce(TYINT,
909: fixtype( mkexpr(OPSTAR, tp,
910: cpexpr(dp->baseoffset)) ));
911: p2pi("\tsubl2\tr0,%d(ap)",
912: p->datap->nameblock.vardesc.varno +
913: ARGOFFSET);
914: }
915: else if(dp->baseoffset->constblock.const.ci != 0)
916: {
917: char buff[25];
918: if(size > 0)
919: {
920: sprintf(buff, "\tsubl2\t$%ld,%d(ap)",
921: dp->baseoffset->constblock.const.ci * size,
922: p->datap->nameblock.vardesc.varno +
923: ARGOFFSET);
924: }
925: else {
926: putforce(TYINT, mkexpr(OPSTAR, cpexpr(dp->baseoffset),
927: cpexpr(q->vleng) ));
928: sprintf(buff, "\tsubl2\tr0,%d(ap)",
929: p->datap->nameblock.vardesc.varno +
930: ARGOFFSET);
931: }
932: p2pass(buff);
933: }
934: }
935: }
936: }
937:
938: if(typeaddr)
939: puteq( cpexpr(typeaddr), mkaddcon(ep->typelabel) );
940: /* replace to avoid long jump problem
941: putgoto(ep->entrylabel);
942: */
943: p2pi("\tjmp\tL%d", ep->entrylabel);
944: }
945:
946: fixlwm()
947: {
948: extern lwmno;
949: if (lwmno == procno)
950: return;
951: fprintf(asmfile, "\t.set\tLWM%d,0x%x\n",
952: procno, regmask[highregvar]);
953: lwmno = procno;
954: }
955:
956:
957: prhead(fp)
958: FILEP fp;
959: {
960: #if FAMILY==PCC
961: p2triple(P2LBRACKET, ARGREG-highregvar, procno);
962: p2word( (long) (BITSPERCHAR*autoleng) );
963: p2flush();
964: #endif
965: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.