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