Annotation of researchv10no/cmd/ccom/vax/tests/6.i, revision 1.1

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

unix.superglobalmegacorp.com

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