Annotation of researchv10no/cmd/ccom/vax/local2.c, revision 1.1

1.1     ! root        1: # include "mfile2.h"
        !             2: /* a lot of the machine dependent parts of the second pass */
        !             3: 
        !             4: char *
        !             5: ccbranches[] = {
        !             6:        "       jeql    L%d\n",
        !             7:        "       jneq    L%d\n",
        !             8:        "       jleq    L%d\n",
        !             9:        "       jlss    L%d\n",
        !            10:        "       jgeq    L%d\n",
        !            11:        "       jgtr    L%d\n",
        !            12:        "       jlequ   L%d\n",
        !            13:        "       jlssu   L%d\n",
        !            14:        "       jgequ   L%d\n",
        !            15:        "       jgtru   L%d\n",
        !            16:        };
        !            17: 
        !            18: cbgen( o, lab, mode )
        !            19: int o, lab, mode;
        !            20: { /*   printf conditional and unconditional branches */
        !            21: 
        !            22:        if( !o ) printf( "      jbr     L%d\n", lab );
        !            23:        else    if( o > UGT ) cerror( "bad conditional branch: %s", opst[o] );
        !            24:        else printf( ccbranches[o-EQ], lab );
        !            25: }
        !            26: 
        !            27: zzzcode( p, ppc, q )
        !            28: NODE *p; char **ppc; OPTAB *q;
        !            29: {
        !            30:        register c;
        !            31: 
        !            32:        switch( c= *++(*ppc) )
        !            33:        {
        !            34:        case 'I':
        !            35:                cbgen( p->bn.lop, p->bn.label, c );
        !            36:                return;
        !            37: 
        !            38: 
        !            39:        case 'k':       /* complement mask for bit instr */
        !            40:                printf("$%ld", ~p->in.right->tn.lval);
        !            41:                return;
        !            42: 
        !            43:        case 'c':
        !            44:                /* argument size */
        !            45:                printf( "$%d", p->stn.argsize/SZINT);
        !            46:                return;
        !            47: 
        !            48:        case 'U':       /* 32 - n, for unsigned right shifts */
        !            49:                printf("$%d", 32 - p->in.right->tn.lval );
        !            50:                return;
        !            51: 
        !            52:        case 'T':       /* structure length for arguments */
        !            53:                printf("$%d", p->stn.stsize / SZCHAR);
        !            54:                break;
        !            55: 
        !            56:        case 'M':       /* move address */
        !            57:                staradr( p->in.right );
        !            58:                break;
        !            59: 
        !            60:        case 'S':  /* structure assignment */
        !            61:                {
        !            62:                        register NODE *l, *r;
        !            63:                        register size;
        !            64: 
        !            65:                        if( p->in.op == STASG )
        !            66:                        {
        !            67:                                l = p->in.left;
        !            68:                                r = p->in.right;
        !            69:                        }
        !            70:                        else if( p->in.op == STARG )
        !            71:                        {  /* store an arg */
        !            72:                                r = p->in.left;
        !            73:                        }
        !            74:                        else cerror( "STASG bad" );
        !            75: 
        !            76:                        size = p->stn.stsize/SZCHAR;
        !            77: 
        !            78:                        if( size <= 0 || size > 65535 )
        !            79:                                cerror("structure size <0=0 or >65535");
        !            80: 
        !            81:                        switch(size)
        !            82:                        {
        !            83:                        case 1:
        !            84:                                printf("        movb    ");
        !            85:                                break;
        !            86:                        case 2:
        !            87:                                printf("        movw    ");
        !            88:                                break;
        !            89:                        case 4:
        !            90:                                printf("        movl    ");
        !            91:                                break;
        !            92:                        case 8:
        !            93:                                printf("        movq    ");
        !            94:                                break;
        !            95:                        default:
        !            96:                                printf("        movc3   $%d,", size);
        !            97:                                break;
        !            98:                        }
        !            99:                        staradr( r );
        !           100:                        printf(",");
        !           101:                        if( p->in.op == STARG ) printf( "(sp)" );
        !           102:                        else staradr( l );
        !           103:                        printf("\n");
        !           104: 
        !           105:                }
        !           106:                break;
        !           107: 
        !           108:        default:
        !           109:                cerror( "illegal zzzcode" );
        !           110:        }
        !           111: }
        !           112: 
        !           113: staradr( p )
        !           114: NODE *p;
        !           115: {
        !           116:        NODE *pp;
        !           117:        pp = talloc();
        !           118:        pp->in.op = STAR;
        !           119:        pp->in.left = p;
        !           120:        upput( pp );
        !           121:        pp->in.op = FREE;
        !           122: }
        !           123: 
        !           124: conput( p )
        !           125: register NODE *p;
        !           126: {
        !           127:        switch( p->in.op )
        !           128:        {
        !           129:        case ICON:
        !           130:                acon( p );
        !           131:                return;
        !           132: 
        !           133:        case REG:
        !           134:                printf( "%s", rnames[p->tn.rval] );
        !           135:                return;
        !           136: 
        !           137:        default:
        !           138:                cerror( "illegal conput" );
        !           139:        }
        !           140: }
        !           141: 
        !           142: insput( p )
        !           143: NODE *p;
        !           144: {
        !           145:        cerror( "insput" );
        !           146: }
        !           147: 
        !           148: /* new use for an old routine
        !           149:  * upput now puts out an indirect address ( STAR node )
        !           150:  * equivalent to the old case STAR in adrput
        !           151:  * as upput, we can now get to this routine directly from the
        !           152:  * templates, using the U symbol
        !           153:  */
        !           154: 
        !           155: int sideff;
        !           156: 
        !           157: upput( p )
        !           158: NODE *p;
        !           159: {
        !           160:        register NODE *r, *l, *pp;
        !           161:        register o;
        !           162:        pp = ( STAR == p->in.op ) ? p->in.left : p ;
        !           163:        o = pp->in.op;
        !           164:        if( o==NAME || o==STAR || o==TEMP || o==VAUTO || o==VPARAM )
        !           165:        {
        !           166:                printf( "*" );
        !           167:                adrput(pp);
        !           168:                return;
        !           169:        }
        !           170:        if( o==ICON )
        !           171:        {
        !           172:                acon( pp );
        !           173:                sideff = 0;
        !           174:                return;
        !           175:        }
        !           176:        if( o == PLUS )
        !           177:        {
        !           178:                r = pp->in.right;
        !           179:                l = pp->in.left;
        !           180:                if( l->in.op == REG && r->in.op == ICON )
        !           181:                {
        !           182:                        acon( r );
        !           183:                        pp = pp->in.left;
        !           184:                }
        !           185:                else
        !           186:                {
        !           187:                        /* index mode (shudder) */
        !           188:                        /* save the index, rewrite p to point to
        !           189:                        /* the rest, call adrput recursively, and
        !           190:                        /* then tack on the index */
        !           191:                        if( l->in.op == UNARY AND )
        !           192:                        { /* double index */
        !           193:                                adrput( l->in.left );
        !           194:                                l = r;
        !           195:                        }
        !           196:                        else
        !           197:                        {
        !           198:                                p->in.left = r;
        !           199:                                adrput( p );
        !           200:                                p->in.left = pp;  /* back to normal */
        !           201:                        }
        !           202:                        if( l->in.op == LS ) l = l->in.left;
        !           203:                        if( l->in.op != REG ) cerror("illegal address");
        !           204:                        printf( "[%s]", rnames[l->tn.rval] );
        !           205:                        return;
        !           206:                }
        !           207:        }
        !           208:        else if( o == MINUS )
        !           209:        {
        !           210:                r = pp->in.right;
        !           211:                if( r->tn.op != ICON || r->tn.name ) cerror("illegal address");
        !           212:                r->tn.lval = -r->tn.lval;
        !           213:                acon( r );
        !           214:                r->tn.lval = -r->tn.lval;
        !           215:                pp = pp->in.left;
        !           216:        }
        !           217:        else if( o == ASG MINUS )
        !           218:        {
        !           219:                r = pp->in.right;
        !           220:                if( r->tn.op != ICON ) cerror("illegal address");
        !           221:                r = pp->in.left;
        !           222:                if( r->tn.op != REG ) cerror("illegal address");
        !           223:                /* always do the side effect */
        !           224:                printf( "-(%s)", rnames[r->tn.rval] );
        !           225:                sideff = 1;  /* cream it */
        !           226:                return;
        !           227:        }
        !           228:        else if( o == INCR )
        !           229:        {
        !           230:                r = pp->in.right;
        !           231:                if( r->tn.op != ICON ) cerror("illegal address");
        !           232:                r = pp->in.left;
        !           233:                if( r->tn.op != REG ) cerror("illegal address");
        !           234:                if( sideff ) printf( "(%s)+", rnames[r->tn.rval] );
        !           235:                else printf( "(%s)", rnames[r->tn.rval] );
        !           236:                return;
        !           237:        }
        !           238:        if( pp->tn.op != REG ) cerror("illegal address");
        !           239:        printf( "(%s)", rnames[pp->tn.rval] );
        !           240:        return;
        !           241: }
        !           242: 
        !           243: adrput( p )
        !           244: register NODE *p;
        !           245: {
        !           246:        /* output an address, with offsets, from p */
        !           247:        register o;
        !           248: 
        !           249:        while( (o=p->in.op) == FLD || o==CONV )
        !           250:        {
        !           251:                p = p->in.left;
        !           252:                o = p->in.op;
        !           253:        }
        !           254:        switch( o )
        !           255:        {
        !           256:        case NAME:
        !           257:                acon( p );
        !           258:                sideff = 0;
        !           259:                return;
        !           260: 
        !           261:        case ICON:
        !           262:                /* addressable value of the constant */
        !           263:                printf( "$" );
        !           264:                acon( p );
        !           265:                sideff = 0;
        !           266:                return;
        !           267: 
        !           268:        case REG:
        !           269:                printf( "%s", rnames[p->tn.rval] );
        !           270:                sideff = 0;
        !           271:                return;
        !           272: 
        !           273:        case STAR:
        !           274:                upput( p );
        !           275:                return;
        !           276: 
        !           277:        case TEMP:
        !           278:                sideff = 0;
        !           279:                printf( "%ld(fp)", p->tn.lval - maxboff / SZCHAR );
        !           280:                return;
        !           281: 
        !           282:        case VAUTO:
        !           283:                sideff = 0;
        !           284:                printf( "%ld(fp)", p->tn.lval );
        !           285:                return;
        !           286: 
        !           287:        case VPARAM:
        !           288:                sideff = 0;
        !           289:                printf( "%ld(ap)", p->tn.lval );
        !           290:                return;
        !           291: 
        !           292:        default:
        !           293:                cerror( "illegal address" );
        !           294:                return;
        !           295:        }
        !           296: }
        !           297: 
        !           298: acon(p)
        !           299: NODE *p;
        !           300: { /* print out a constant */
        !           301: 
        !           302:        if( p->tn.name == 0 )
        !           303:        {       /* constant only */
        !           304:                printf( "%ld", p->tn.lval);
        !           305:        }
        !           306:        else if( p->tn.lval == 0 )
        !           307:        {       /* name only */
        !           308:                printf( "%s", p->tn.name );
        !           309:        }
        !           310:        else
        !           311:        {                               /* name + offset */
        !           312:                printf( "%s+%ld", p->tn.name, p->tn.lval );
        !           313:        }
        !           314: }
        !           315: 
        !           316: special()
        !           317: {
        !           318:        cerror("reached special");
        !           319: }

unix.superglobalmegacorp.com

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