Annotation of 43BSD/usr.bin/f77/src/f77pass1/vax.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.