Annotation of researchv10dc/cmd/ccom/vax/local2.c, revision 1.1.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.