Annotation of researchv10no/cmd/ccom/vax/tests/7.i, revision 1.1.1.1

1.1       root        1: /* local2.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:        char            *hash();
                     15:        char            *savestr();
                     16:        char            *tstr();
                     17:        extern int      tstrused;
                     18:        extern char     *tstrbuf[];
                     19:        extern char     **curtstr;
                     20: extern int nerrors;  
                     21: typedef union ndu NODE;
                     22: typedef unsigned int TWORD;
                     23: typedef long CONSZ;  
                     24:        
                     25:        
                     26: extern int dope[];  
                     27: extern char *opst[];  
                     28:        
                     29: union ndu {
                     30:        struct {
                     31:                int op;
                     32:                int goal;
                     33:                TWORD type;
                     34:                int cst[(6+4)];
                     35:                char * name;
                     36:                char pad[8  -sizeof(char *)];   
                     37:                NODE *left;
                     38:                NODE *right;
                     39:        }in;    
                     40:        
                     41:        struct {
                     42:                int op;
                     43:                int goal;
                     44:                TWORD type;
                     45:                int cst[(6+4)];
                     46:                char * name;
                     47:                char pad[8  -sizeof(char *)];   
                     48:                CONSZ lval;
                     49:                int rval;
                     50:        }tn;    
                     51:        
                     52:        struct {
                     53:                int op;
                     54:                int goal;
                     55:                TWORD type;
                     56:                int cst[(6+4)];
                     57:                int label;  
                     58:                int lop;  
                     59:        }bn;    
                     60:        struct {
                     61:                int op;
                     62:                int goal;
                     63:                TWORD type;
                     64:                int cst[(6+4)];
                     65:                int stsize;  
                     66:                short stalign;  
                     67:                short argsize;  
                     68:        }stn;   
                     69:        struct {
                     70:                int op;
                     71:                int goal;
                     72:                TWORD type;
                     73:                int cdim;
                     74:                int csiz;
                     75:        }fn;    
                     76:        
                     77:        struct {
                     78:                
                     79:                int op;
                     80:                int goal;
                     81:                TWORD type;
                     82:                int cdim;
                     83:                int csiz;
                     84:                double dval;
                     85:        }fpn;   
                     86: };
                     87:        
                     88:        
                     89:                
                     90:        
                     91:        
                     92:        
                     93:  
                     94:        
                     95: extern int busy[];
                     96: extern NODE node[];
                     97: typedef struct shape SHAPE;
                     98:        
                     99: extern struct shape {
                    100:        int     op;     
                    101:        SHAPE   *sl;    
                    102:        SHAPE   *sr;
                    103:        int     sh;     
                    104:        int     sc;     
                    105: } shapes[];
                    106: extern SHAPE   *pshape[];
                    107: typedef struct optab OPTAB;
                    108: struct optab {
                    109:        int     op;     
                    110:        int     tyop;   
                    111:        OPTAB   *nextop;
                    112:        SHAPE   **lshape;       
                    113:        int     ltype;          
                    114:        SHAPE   **rshape;       
                    115:        int     rtype;
                    116:        int     needs;
                    117:        int     rewrite;
                    118:        char    *cstring;
                    119:        int     cost;
                    120:        int     lcount;         
                    121:        int     rcount;         
                    122:        int     stinline;       
                    123: };
                    124: extern OPTAB
                    125:        *match(),
                    126:        *ophead[],
                    127:        table[];
                    128: extern NODE resc[];
                    129: extern int tmpoff;
                    130: extern int maxboff;
                    131: extern int maxtemp;
                    132: extern int maxarg;
                    133: extern int ftnno;
                    134: extern int sideff;
                    135: extern NODE
                    136:        *talloc(),
                    137:        *ind2type(),
                    138:        *tcopy(),
                    139:        *getadr(),
                    140:        *getlr();
                    141: extern CONSZ rdin();
                    142: extern char *rnames[];
                    143: extern int lineno;
                    144: extern char ftitle[];
                    145: extern int fldshf, fldsz;
                    146: extern int lflag, udebug, e2debug, odebug, rdebug, radebug, sdebug;
                    147: extern int fast;  
                    148:        
                    149:        
                    150:        
                    151:        
                    152: typedef struct inst INST;
                    153: struct inst {
                    154:        NODE    *p;
                    155:        OPTAB   *q;
                    156:        int     goal;
                    157: };
                    158: extern INST inst[300];
                    159: extern nins;
                    160:        
                    161:        
                    162: typedef SHAPE  *SHTABLE[2][20];
                    163: extern SHTABLE sha;
                    164: eobl2()                        
                    165: {
                    166: }
                    167: char *
                    168: exname( ix )
                    169: char *ix;
                    170: {
                    171:        
                    172:        static char text[100];
                    173:        if( ix == 0 ) cerror("no name in exname");
                    174:        sprintf( text, "_%s", ix );
                    175:        return( text );
                    176: }
                    177: lineid( l, fn )
                    178: int l;
                    179: char *fn;
                    180: {
                    181:        extern int gdebug;
                    182:        
                    183:        printf( "#      line %d, file %s\n", l, fn );
                    184: }
                    185: deflab( n )
                    186: int n;
                    187: {
                    188:        printf( "L%d:\n", n );
                    189: }
                    190: genubr( n )
                    191: int n;
                    192: {
                    193:        
                    194:        printf( "       jbr     L%d\n", n );
                    195: }
                    196: genret( s, l, n )
                    197: int s, l, n;
                    198: {
                    199:        
                    200:        
                    201:        deflab(n);
                    202:        if( s ) printf( "       movab   L%d,r0\n", l );
                    203:        dbfunret();
                    204:        printf( "       ret\n" );
                    205: }
                    206: defalign(n)
                    207: int n;
                    208: {
                    209:        
                    210:        if( n % 8 ) cerror( "funny alignment: %d", n );
                    211:        else n /= 8;
                    212:        if( n == 1 ) return;
                    213:        else if( n==2 ) n=1;
                    214:        else if( n==4 ) n=2;
                    215:        else cerror( "funny alignment: %d", n );
                    216:        printf( "       .align  %d\n", n );
                    217: }
                    218: char *locnames[] = {
                    219:        
                    220:        "       .text\n",
                    221:        "       .data\n",
                    222:        "       .data\n",
                    223:        "       .data   2\n",
                    224:        "       .data   1\n",
                    225:        };
                    226: bycode( t, i )
                    227: int t, i;
                    228: {
                    229:        
                    230:        i &= 07;
                    231:        if( t < 0 )
                    232:        { 
                    233:                if( i != 0 ) printf("\n");
                    234:        }
                    235:        else
                    236:        { 
                    237:                if( i == 0 ) printf( "\n        .byte   " );
                    238:                else printf(",");
                    239:                printf("0x%x", t);
                    240:        }
                    241: }
                    242: genshort( s )
                    243: short s;
                    244: {
                    245:        
                    246:        printf( "       .short  %d\n", (short) s );
                    247: }
                    248: genlong( l )
                    249: long l;
                    250: {
                    251:        
                    252:        printf( "       .long   0x%lx\n", l );
                    253: }
                    254: char *
                    255: rnames[]= {  
                    256:        "r0", "r1",
                    257:        "r2", "r3", "r4",
                    258:        "r5", "r6", "r7", "r8", "r9", "r10", "r11",
                    259:        "ap", "fp", "sp", "pc" 
                    260:        };
                    261: zzzcode( p, ppc, q )
                    262: NODE *p; char **ppc; OPTAB *q;
                    263: {
                    264:        register c;
                    265:        switch( c= *++(*ppc) )
                    266:        {
                    267:        case 'I':
                    268:                cbgen( p->bn.lop, p->bn.label, c );
                    269:                return;
                    270:        case 'k':       
                    271:                printf("$%ld", ~p->in.right->tn.lval);
                    272:                return;
                    273:        case 'c':
                    274:                
                    275:                printf( "$%d", p->stn.argsize/32);
                    276:                return;
                    277:        case 'U':       
                    278:                printf("$%d", 32 - p->in.right->tn.lval );
                    279:                return;
                    280:        case 'T':       
                    281:                printf("$%d", p->stn.stsize/8);
                    282:                break;
                    283:        case 'M':       
                    284:                staradr( p->in.right );
                    285:                break;
                    286:        case 'S':  
                    287:                {
                    288:                        register NODE *l, *r;
                    289:                        register size;
                    290:                        if( p->in.op == 98 )
                    291:                        {
                    292:                                l = p->in.left;
                    293:                                r = p->in.right;
                    294:                        }
                    295:                        else if( p->in.op == 99 )
                    296:                        {  
                    297:                                r = p->in.left;
                    298:                        }
                    299:                        else cerror( "STASG bad" );
                    300:                        size = p->stn.stsize/8;
                    301:                        if( size <= 0 || size > 65535 )
                    302:                                cerror("structure size <0=0 or >65535");
                    303:                        switch(size)
                    304:                        {
                    305:                        case 1:
                    306:                                printf("        movb    ");
                    307:                                break;
                    308:                        case 2:
                    309:                                printf("        movw    ");
                    310:                                break;
                    311:                        case 4:
                    312:                                printf("        movl    ");
                    313:                                break;
                    314:                        case 8:
                    315:                                printf("        movq    ");
                    316:                                break;
                    317:                        default:
                    318:                                printf("        movc3   $%d,", size);
                    319:                                break;
                    320:                        }
                    321:                        staradr( r );
                    322:                        printf(",");
                    323:                        if( p->in.op == 99 ) printf( "(sp)" );
                    324:                        else staradr( l );
                    325:                        printf("\n");
                    326:                }
                    327:                break;
                    328:        default:
                    329:                cerror( "illegal zzzcode" );
                    330:        }
                    331: }
                    332: staradr( p )
                    333: NODE *p;
                    334: {
                    335:        NODE *pp;
                    336:        pp = talloc();
                    337:        pp->in.op = (2+ 11);
                    338:        pp->in.left = p;
                    339:        upput( pp );
                    340:        pp->in.op = 97;
                    341: }
                    342: conput( p )
                    343: register NODE *p;
                    344: {
                    345:        switch( p->in.op )
                    346:        {
                    347:        case 4:
                    348:                acon( p );
                    349:                return;
                    350:        case 94:
                    351:                printf( "%s", rnames[p->tn.rval] );
                    352:                return;
                    353:        default:
                    354:                cerror( "illegal conput" );
                    355:        }
                    356: }
                    357: insput( p )
                    358: NODE *p;
                    359: {
                    360:        cerror( "insput" );
                    361: }
                    362: upput( p )
                    363: NODE *p;
                    364: {
                    365:        register NODE *r, *l, *pp;
                    366:        register o;
                    367:        pp = ( (2+ 11) == p->in.op ) ? p->in.left : p ;
                    368:        o = pp->in.op;
                    369:        if( o==2 || o==(2+ 11) || o==95 || o==116 || o==117 )
                    370:        {
                    371:                printf( "*" );
                    372:                adrput(pp);
                    373:                return;
                    374:        }
                    375:        if( o==4 )
                    376:        {
                    377:                acon( pp );
                    378:                sideff = 0;
                    379:                return;
                    380:        }
                    381:        if( o == 6 )
                    382:        {
                    383:                r = pp->in.right;
                    384:                l = pp->in.left;
                    385:                if( l->in.op == 94 && r->in.op == 4 )
                    386:                {
                    387:                        acon( r );
                    388:                        pp = pp->in.left;
                    389:                }
                    390:                else
                    391:                {
                    392:                        
                    393:                        
                    394:                        if( l->in.op == 2+ 14 )
                    395:                        { 
                    396:                                adrput( l->in.left );
                    397:                                l = r;
                    398:                        }
                    399:                        else
                    400:                        {
                    401:                                p->in.left = r;
                    402:                                adrput( p );
                    403:                                p->in.left = pp;  
                    404:                        }
                    405:                        if( l->in.op == 64 ) l = l->in.left;
                    406:                        if( l->in.op != 94 ) cerror("illegal address");
                    407:                        printf( "[%s]", rnames[l->tn.rval] );
                    408:                        return;
                    409:                }
                    410:        }
                    411:        else if( o == 8 )
                    412:        {
                    413:                r = pp->in.right;
                    414:                if( r->tn.op != 4 || r->tn.name ) cerror("illegal address");
                    415:                r->tn.lval = -r->tn.lval;
                    416:                acon( r );
                    417:                r->tn.lval = -r->tn.lval;
                    418:                pp = pp->in.left;
                    419:        }
                    420:        else if( o == 1+ 8 )
                    421:        {
                    422:                r = pp->in.right;
                    423:                if( r->tn.op != 4 ) cerror("illegal address");
                    424:                r = pp->in.left;
                    425:                if( r->tn.op != 94 ) cerror("illegal address");
                    426:                
                    427:                printf( "-(%s)", rnames[r->tn.rval] );
                    428:                sideff = 1;  
                    429:                return;
                    430:        }
                    431:        else if( o == 78 )
                    432:        {
                    433:                r = pp->in.right;
                    434:                if( r->tn.op != 4 ) cerror("illegal address");
                    435:                r = pp->in.left;
                    436:                if( r->tn.op != 94 ) cerror("illegal address");
                    437:                if( sideff ) printf( "(%s)+", rnames[r->tn.rval] );
                    438:                else printf( "(%s)", rnames[r->tn.rval] );
                    439:                return;
                    440:        }
                    441:        if( pp->tn.op != 94 ) cerror("illegal address");
                    442:        printf( "(%s)", rnames[pp->tn.rval] );
                    443:        return;
                    444: }
                    445: adrput( p )
                    446: register NODE *p;
                    447: {
                    448:        
                    449:        register o;
                    450:        while( (o=p->in.op) == 103 || o==104 )
                    451:        {
                    452:                p = p->in.left;
                    453:                o = p->in.op;
                    454:        }
                    455:        switch( o )
                    456:        {
                    457:        case 2:
                    458:                acon( p );
                    459:                sideff = 0;
                    460:                return;
                    461:        case 4:
                    462:                
                    463:                printf( "$" );
                    464:                acon( p );
                    465:                sideff = 0;
                    466:                return;
                    467:        case 94:
                    468:                printf( "%s", rnames[p->tn.rval] );
                    469:                sideff = 0;
                    470:                return;
                    471:        case (2+ 11):
                    472:                upput( p );
                    473:                return;
                    474:        case 95:
                    475:                sideff = 0;
                    476:                printf( "%ld(fp)", p->tn.lval - maxboff );
                    477:                return;
                    478:        case 116:
                    479:                sideff = 0;
                    480:                printf( "%ld(fp)", p->tn.lval );
                    481:                return;
                    482:        case 117:
                    483:                sideff = 0;
                    484:                printf( "%ld(ap)", p->tn.lval );
                    485:                return;
                    486:        default:
                    487:                cerror( "illegal address" );
                    488:                return;
                    489:        }
                    490: }
                    491: acon(p)
                    492: NODE *p;
                    493: { 
                    494:        if( p->tn.name == 0 )
                    495:        {       
                    496:                printf( "%ld", p->tn.lval);
                    497:        }
                    498:        else if( p->tn.lval == 0 )
                    499:        {       
                    500:                printf( "%s", p->tn.name );
                    501:        }
                    502:        else
                    503:        {                               
                    504:                printf( "%s+%ld", p->tn.name, p->tn.lval );
                    505:        }
                    506: }
                    507: char *
                    508: ccbranches[] = {
                    509:        "       jeql    L%d\n",
                    510:        "       jneq    L%d\n",
                    511:        "       jleq    L%d\n",
                    512:        "       jlss    L%d\n",
                    513:        "       jgeq    L%d\n",
                    514:        "       jgtr    L%d\n",
                    515:        "       jlequ   L%d\n",
                    516:        "       jlssu   L%d\n",
                    517:        "       jgequ   L%d\n",
                    518:        "       jgtru   L%d\n",
                    519:        };
                    520: cbgen( o, lab, mode )
                    521: int o, lab, mode;
                    522: { 
                    523:        if( !o ) printf( "      jbr     L%d\n", lab );
                    524:        else    if( o > 89 ) cerror( "bad conditional branch: %s", opst[o] );
                    525:        else printf( ccbranches[o-80], lab );
                    526: }
                    527: special()
                    528: {
                    529:        cerror("reached special");
                    530: }

unix.superglobalmegacorp.com

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