Annotation of researchv9/cmd/sun/c2/util.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)util.c 1.1 86/02/03 Copyr 1985 Sun Micro";
                      3: #endif
                      4: 
                      5: /*
                      6:  * Copyright (c) 1985 by Sun Microsystems, Inc.
                      7:  */
                      8: 
                      9: #include "as.h"
                     10: #include "c2.h"
                     11: 
                     12: int
                     13: cntbits( vl )
                     14: {
                     15:     register unsigned long v = vl;
                     16:     register  n;
                     17:     n = 0;
                     18:     do{
                     19:        n += v&1;
                     20:     }while( v>>=1 );
                     21:     return n;
                     22: }
                     23: 
                     24: 
                     25: /* can this address operand be incremented by n? */
                     26: int
                     27: incraddr( o, n )
                     28:     register struct oper *o;
                     29: {
                     30:     /*
                     31:      * Because we don't want to mess up potential device drivers,
                     32:      * we must be very prudent here. Too bad. 
                     33:      * We can only do this to a memory location if its an offset from
                     34:      * the stack or frame pointers. Those had better not point to
                     35:      * device registers, damn them.
                     36:      * We must also (I fear) be careful around immediates that are still
                     37:      * relocatable.
                     38:      */
                     39:     extern int Xperimental;
                     40: 
                     41:     switch (o->type_o){
                     42:     case T_IMMED:
                     43:            if (n!=0 && o->sym_o!=NULL) return 1;
                     44:            return 0;
                     45:     case T_REG:
                     46:            if (o->value_o >= A0REG && n != 0 ) return 1;
                     47:            else return 0;
                     48:     case T_DISPL:
                     49:            if (!Xperimental)
                     50:                if ( (o->reg_o < (fortranprog?(A0REG+4):FPREG))
                     51:                || (n+o->value_o > 0x7fff) ) return 1;
                     52:            o->value_o += n;
                     53:            return 0;
                     54:     case T_DEFER:
                     55:            if (!Xperimental)
                     56:                if (o->value_o < (fortranprog?(A0REG+4):FPREG)) return 1;
                     57:            if (n != 0){
                     58:                o->reg_o = o->value_o;
                     59:                o->value_o = n;
                     60:                o->sym_o = 0;
                     61:                o->type_o = T_DISPL;
                     62:            }
                     63:            return 0;
                     64:     case T_INDEX:
                     65:            if (!Xperimental)
                     66:                if (o->reg_o < (fortranprog?(A0REG+4):FPREG)) return 1;
                     67:            if (!Xperimental)
                     68:                if  (o->disp_o+n > 0x7f) return 1;
                     69:            if (o->flags_o & O_INDIRECT)
                     70:                o->disp2_o += n;
                     71:            else
                     72:                o->disp_o  += n;
                     73:            return 0;
                     74:     }
                     75:     /* default falls through here */
                     76:     return 1; /* no way */
                     77: }
                     78: 
                     79: /* can this operand reference be deleted? */
                     80: int 
                     81: deladdr( o )
                     82:     struct oper *o;
                     83: {
                     84:     return !incraddr( o, 0) ;
                     85: }
                     86: 
                     87: /* compare operands, instructions */
                     88: 
                     89: int
                     90: sameops( op1, op2)
                     91:     register struct oper *op1, *op2;
                     92: {
                     93: #   define SAME( a ) if (op1->a != op2->a) return 0
                     94:     /* are these two operands the same? */
                     95:     SAME( type_o );
                     96:     SAME( flags_o );
                     97:     switch (op1->type_o){
                     98:     case T_IMMED:
                     99:                if ( op1->flags_o & O_FLOAT ){
                    100:                    SAME( fval_o );
                    101:                    break;
                    102:                }
                    103:                /* fall through */
                    104:     case T_NORMAL:
                    105:     case T_ABSS:
                    106:     case T_ABSL:
                    107:                SAME( sym_o );
                    108:                /* fall through */
                    109:     case T_REG: 
                    110:     case T_DEFER:
                    111:     case T_POSTINC:
                    112:     case T_PREDEC:
                    113:                SAME( value_o );
                    114:                break;
                    115:     case T_INDEX:
                    116:                SAME( disp_o );
                    117:                if (op1->flags_o & O_INDIRECT){
                    118:                    SAME( disp2_o );
                    119:                    SAME( sym2_o );
                    120:                }
                    121:                if (op1->flags_o & (O_PREINDEX|O_POSTINDEX)){
                    122:                    SAME( scale_o );
                    123:                }
                    124:                /* fall through */
                    125:     case T_DISPL:
                    126:                SAME( sym_o );
                    127:                /* fall through */
                    128:     case T_REGPAIR:
                    129:                SAME( value_o );
                    130:                SAME( reg_o );
                    131:                break;
                    132:     default:    return 0;
                    133:     }
                    134:     if (op1->flags_o & O_BFLD){
                    135:        SAME( bfoffset_o );
                    136:        SAME( bfwidth_o  );
                    137:     }
                    138:     return 1;
                    139: #   undef SAME
                    140: }
                    141: 
                    142: int
                    143: sameins( i1, i2 )
                    144:     register NODE *i1, *i2;
                    145: {
                    146:     register int refs, nrefs;
                    147: 
                    148:     if (!ISINSTRUC( i1->op) ) 
                    149:        sys_error("sameins: got non-instruction as comperand\n");
                    150:     if (i1->instr != i2->instr|| (nrefs=i1->nref) != i2->nref)
                    151:        return 0;
                    152:     for (refs=0; refs<nrefs; refs++)
                    153:        if (!sameops( i1->ref[refs], i2->ref[refs]) )
                    154:            return 0;
                    155:     return 1;
                    156: }
                    157: 
                    158: 
                    159: extern void printmask();
                    160: 
                    161: /* flush an instruction directly to stdout */
                    162: putinstr( ip )
                    163:     struct ins_bkt *ip;
                    164: {
                    165:     register i,n;
                    166:     printf("   %s", ip->text_i);
                    167:     if (n = numops ){
                    168:        putchar('\t');
                    169:        printoperand( &operands[0] );
                    170:        for (i=1; i<n; i++){
                    171:            putchar(',');
                    172:            printoperand( &operands[i] );
                    173:        }
                    174:     }
                    175:     putchar('\n');
                    176: }
                    177: 
                    178: 
                    179: void
                    180: dumpnode( np, verbose )
                    181:     register NODE *np;
                    182: {
                    183:     register i,n;
                    184:     struct sym_bkt *switchlabel;
                    185: 
                    186:     switch (np->op){
                    187:     case OP_LABEL:
                    188:        if (verbose)
                    189:            printf("%s: | referenced %d times",
                    190:                np->name->name_s, np->nref );
                    191:        else
                    192:            printf("%s:", np->name->name_s );
                    193:        break;
                    194:     case OP_COMMENT:
                    195:        printf("|%s", (char *)(np->ref[0]));
                    196:        break;
                    197:     default:
                    198:        printf("        %s", np->instr->text_i);
                    199:        if (n = np->nref ){
                    200:            putchar('\t');
                    201:            printoperand( np->ref[0] );
                    202:            for (i=1; i<n; i++){
                    203:                putchar(',');
                    204:                printoperand( np->ref[i] );
                    205:            }
                    206:        }
                    207:        if ( np->op==OP_JUMP || np->op==OP_DJMP ){
                    208:            if (np->subop==JIND){
                    209:                fputs("\tpc@(2,d0:w)", stdout);
                    210:                switchlabel = np->luse->name;
                    211:            } else {
                    212:                putchar((n)?',':'\t');
                    213:                fputs(np->luse->name->name_s, stdout);
                    214:            }
                    215:        } else if (np->op==OP_CSWITCH){
                    216:            putchar('\t');
                    217:            fputs(np->luse->name->name_s, stdout);
                    218:            putchar('-');
                    219:            fputs(switchlabel->name_s, stdout);
                    220:        }
                    221:        break;
                    222:     }
                    223:     if (verbose){
                    224:        fputs(" | ", stdout);
                    225:        if (!emptymask(np->ruse)){
                    226:            fputs(" reads:", stdout); printmask( np->ruse);
                    227:        }
                    228:        if (!emptymask(np->rset)){
                    229:            fputs(" writes:", stdout);printmask( np->rset);
                    230:        }
                    231:        if (!emptymask(np->rlive)){
                    232:            fputs(" live:", stdout); printmask( np->rlive);
                    233:        }
                    234:     }
                    235:     putchar('\n');
                    236: }
                    237: 
                    238: void
                    239: dumpprogram(verbose)
                    240: {
                    241:     NODE *np;
                    242: 
                    243:     printf("   .text\n");
                    244:     for (np=first.forw; np != &first; np = np->forw){
                    245:        dumpnode( np, verbose );
                    246:     }
                    247: }
                    248: 
                    249: void
                    250: sortints( ip, n )
                    251:     register int *ip;
                    252:     register n;
                    253: {
                    254:     /* sort the array of n ints. Not quick, but compact */
                    255:     register int *np, *p;
                    256:     register changed, temp;
                    257:     np = ip + n - 1;
                    258:     changed = 1;
                    259:     while(changed){
                    260:        changed = 0;
                    261:        for (p = ip; p < np; p++)
                    262:            if (*p > *(p+1) ){
                    263:                temp = *p;
                    264:                *p = *(p+1);
                    265:                *(p+1) = temp;
                    266:                changed = 1;
                    267:            }
                    268:     }
                    269: }
                    270: 
                    271: void 
                    272: xref(){
                    273:     register NODE *p, *u;
                    274:     int allocsize = 100, usecnt;
                    275:     int *ip, *tp;
                    276:     ip = (int *)malloc( allocsize * sizeof * p );
                    277:     for (p=first.forw; p != &first; p=p->forw){
                    278:        if (p->op==OP_LABEL){
                    279:            fputs( p->name->name_s, stdout );
                    280:            if (p->nref+1 > allocsize ){
                    281:                allocsize += allocsize;
                    282:                if (p->nref+1 > allocsize )
                    283:                    allocsize = p->nref + 5;
                    284:                ip = (int *)realloc( ip, allocsize * sizeof * p );
                    285:            }
                    286:            tp = ip;
                    287:            *tp++ = p->lineno;
                    288:            for (usecnt = p->nref, u=p->luse; usecnt--; ){
                    289:                if (u==NULL)
                    290:                    *tp++ = -1;
                    291:                else {
                    292:                    *tp++ = u->lineno;
                    293:                    u = u->lnext;
                    294:                }
                    295:            }
                    296:            sortints( ip, p->nref+1 );
                    297:            putchar( ':' );
                    298:            for ( usecnt = p->nref+1, tp=ip ; usecnt--; tp++ ){
                    299:                if (*tp == -1)
                    300:                    fputs(" ???", stdout);
                    301:                else
                    302:                    printf(" %3d", *tp);
                    303:                if (*tp == p->lineno)
                    304:                    putchar('*' );
                    305:            }
                    306:            putchar('\n');
                    307:        }
                    308:     }
                    309:     free( ip );
                    310: }
                    311: 
                    312: /*
                    313:  * Insert a node after another one
                    314:  */
                    315: insert(p, after)
                    316: NODE   *p;
                    317: NODE   *after;
                    318: {
                    319:        NODE    *lastp;
                    320: 
                    321:        for (lastp = p; lastp->forw != NULL; lastp = lastp->forw)
                    322:                ;
                    323:        after->forw->back = lastp;
                    324:        lastp->forw = after->forw;
                    325:        after->forw = p;
                    326:        p->back = after;
                    327: }
                    328: 
                    329: #ifdef C2
                    330: char *
                    331: docomment(p)
                    332:     register char *p;
                    333: {
                    334:     extern char *c2pseudocomment();
                    335:     NODE *n;
                    336: 
                    337:     if (*p != '#' && *p != '|') return p;
                    338:     n = new();
                    339:     n->op = OP_COMMENT;
                    340:     n->ref[0] = (struct oper *)malloc( strlen(p) );
                    341:     strcpy( (char *)n->ref[0], p+1 );
                    342:     addnode( n );
                    343:     if (strncmp(p,C2MAGIC,C2MAGICSIZE) == 0){
                    344:        p = c2pseudocomment( p+=C2MAGICSIZE );
                    345:     }
                    346:     return p;
                    347: }
                    348: #endif

unix.superglobalmegacorp.com

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