Annotation of 43BSDReno/pgrm/f77/pass1.tahoe/tahoe.c, revision 1.1

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

unix.superglobalmegacorp.com

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