Annotation of 3BSD/cmd/mip/match.c, revision 1.1.1.1

1.1       root        1: # include "mfile2"
                      2: 
                      3: 
                      4: int fldsz, fldshf;
                      5: 
                      6: static int mamask[] = { /* masks for matching dope with shapes */
                      7:        SIMPFLG,                /* OPSIMP */
                      8:        SIMPFLG|ASGFLG,         /* ASG OPSIMP */
                      9:        COMMFLG,        /* OPCOMM */
                     10:        COMMFLG|ASGFLG, /* ASG OPCOMM */
                     11:        MULFLG,         /* OPMUL */
                     12:        MULFLG|ASGFLG,  /* ASG OPMUL */
                     13:        DIVFLG,         /* OPDIV */
                     14:        DIVFLG|ASGFLG,  /* ASG OPDIV */
                     15:        UTYPE,          /* OPUNARY */
                     16:        TYFLG,          /* ASG OPUNARY is senseless */
                     17:        LTYPE,          /* OPLEAF */
                     18:        TYFLG,          /* ASG OPLEAF is senseless */
                     19:        0,              /* OPANY */
                     20:        ASGOPFLG|ASGFLG,        /* ASG OPANY */
                     21:        LOGFLG,         /* OPLOG */
                     22:        TYFLG,          /* ASG OPLOG is senseless */
                     23:        FLOFLG,         /* OPFLOAT */
                     24:        FLOFLG|ASGFLG,  /* ASG OPFLOAT */
                     25:        SHFFLG,         /* OPSHFT */
                     26:        SHFFLG|ASGFLG,  /* ASG OPSHIFT */
                     27:        SPFLG,          /* OPLTYPE */
                     28:        TYFLG,          /* ASG OPLTYPE is senseless */
                     29:        };
                     30: 
                     31: int sdebug = 0;
                     32: 
                     33: tshape( p, shape ) NODE *p; {
                     34:        /* return true if shape is appropriate for the node p
                     35:           side effect for SFLD is to set up fldsz,etc */
                     36:        register o, mask;
                     37: 
                     38:        o = p->op;
                     39: 
                     40:        if( sdebug ){
                     41:                printf( "tshape( %o, %o), op = %d\n", p, shape, o );
                     42:                }
                     43: 
                     44:        if( shape & SPECIAL ){
                     45: 
                     46:                switch( shape ){
                     47: 
                     48:                case SZERO:
                     49:                case SONE:
                     50:                case SMONE:
                     51:                case SSCON:
                     52:                case SCCON:
                     53:                        if( o != ICON || p->name[0] ) return(0);
                     54:                        if( p->lval == 0 && shape == SZERO ) return(1);
                     55:                        else if( p->lval == 1 && shape == SONE ) return(1);
                     56:                        else if( p->lval == -1 && shape == SMONE ) return(1);
                     57:                        else if( p->lval > -257 && p->lval < 256 && shape == SCCON ) return(1);
                     58:                        else if( p->lval > -32769 && p->lval < 32768 && shape == SSCON ) return(1);
                     59:                        else return(0);
                     60: 
                     61:                case SSOREG:    /* non-indexed OREG */
                     62:                        if( o == OREG && !R2TEST(p->rval) ) return(1);
                     63:                        else return(0);
                     64: 
                     65:                default:
                     66:                        return( special( p, shape ) );
                     67:                        }
                     68:                }
                     69: 
                     70:        if( shape & SANY ) return(1);
                     71: 
                     72:        if( (shape&INTEMP) && shtemp(p) ) return(1);
                     73: 
                     74:        if( (shape&SWADD) && (o==NAME||o==OREG) ){
                     75:                if( BYTEOFF(p->lval) ) return(0);
                     76:                }
                     77: 
                     78:        switch( o ){
                     79: 
                     80:        case NAME:
                     81:                return( shape&SNAME );
                     82:        case ICON:
                     83:                mask = SCON;
                     84:                return( shape & mask );
                     85: 
                     86:        case FLD:
                     87:                if( shape & SFLD ){
                     88:                        if( !flshape( p->left ) ) return(0);
                     89:                        /* it is a FIELD shape; make side-effects */
                     90:                        o = p->rval;
                     91:                        fldsz = UPKFSZ(o);
                     92: # ifdef RTOLBYTES
                     93:                        fldshf = UPKFOFF(o);
                     94: # else
                     95:                        fldshf = SZINT - fldsz - UPKFOFF(o);
                     96: # endif
                     97:                        return(1);
                     98:                        }
                     99:                return(0);
                    100: 
                    101:        case CCODES:
                    102:                return( shape&SCC );
                    103: 
                    104:        case REG:
                    105:                /* distinctions:
                    106:                SAREG   any scalar register
                    107:                STAREG  any temporary scalar register
                    108:                SBREG   any lvalue (index) register
                    109:                STBREG  any temporary lvalue register
                    110:                */
                    111:                mask = isbreg( p->rval ) ? SBREG : SAREG;
                    112:                if( istreg( p->rval ) && busy[p->rval]<=1 ) mask |= mask==SAREG ? STAREG : STBREG;
                    113:                return( shape & mask );
                    114: 
                    115:        case OREG:
                    116:                return( shape & SOREG );
                    117: 
                    118:        case UNARY MUL:
                    119:                /* return STARNM or STARREG or 0 */
                    120:                return( shumul(p->left) & shape );
                    121: 
                    122:                }
                    123: 
                    124:        return(0);
                    125:        }
                    126: 
                    127: int tdebug = 0;
                    128: 
                    129: ttype( t, tword ) TWORD t; {
                    130:        /* does the type t match tword */
                    131: 
                    132:        if( tword & TANY ) return(1);
                    133: 
                    134:        if( tdebug ){
                    135:                printf( "ttype( %o, %o )\n", t, tword );
                    136:                }
                    137:        if( ISPTR(t) && (tword&TPTRTO) ) {
                    138:                do {
                    139:                        t = DECREF(t);
                    140:                } while ( ISARY(t) );
                    141:                        /* arrays that are left are usually only
                    142:                           in structure references... */
                    143:                return( ttype( t, tword&(~TPTRTO) ) );
                    144:                }
                    145:        if( t != BTYPE(t) ) return( tword & TPOINT ); /* TPOINT means not simple! */
                    146:        if( tword & TPTRTO ) return(0);
                    147: 
                    148:        switch( t ){
                    149: 
                    150:        case CHAR:
                    151:                return( tword & TCHAR );
                    152:        case SHORT:
                    153:                return( tword & TSHORT );
                    154:        case STRTY:
                    155:        case UNIONTY:
                    156:                return( tword & TSTRUCT );
                    157:        case INT:
                    158:                return( tword & TINT );
                    159:        case UNSIGNED:
                    160:                return( tword & TUNSIGNED );
                    161:        case USHORT:
                    162:                return( tword & TUSHORT );
                    163:        case UCHAR:
                    164:                return( tword & TUCHAR );
                    165:        case ULONG:
                    166:                return( tword & TULONG );
                    167:        case LONG:
                    168:                return( tword & TLONG );
                    169:        case FLOAT:
                    170:                return( tword & TFLOAT );
                    171:        case DOUBLE:
                    172:                return( tword & TDOUBLE );
                    173:                }
                    174: 
                    175:        return(0);
                    176:        }
                    177: 
                    178: struct optab *rwtable;
                    179: 
                    180: struct optab *opptr[DSIZE];
                    181: 
                    182: setrew(){
                    183:        /* set rwtable to first value which allows rewrite */
                    184:        register struct optab *q;
                    185:        register int i;
                    186: 
                    187:        for( q = table; q->op != FREE; ++q ){
                    188:                if( q->needs == REWRITE ){
                    189:                        rwtable = q;
                    190:                        goto more;
                    191:                        }
                    192:                }
                    193:        cerror( "bad setrew" );
                    194: 
                    195: 
                    196:        more:
                    197:        for( i=0; i<DSIZE; ++i ){
                    198:                if( dope[i] ){ /* there is an op... */
                    199:                        for( q=table; q->op != FREE; ++q ){
                    200:                                /*  beware; things like LTYPE that match
                    201:                                    multiple things in the tree must
                    202:                                    not try to look at the NIL at this
                    203:                                    stage of things!  Put something else
                    204:                                    first in table.c  */
                    205:                                /* at one point, the operator matching was 15% of the
                    206:                                    total comile time; thus, the function
                    207:                                    call that was here was removed...
                    208:                                */
                    209: 
                    210:                                if( q->op < OPSIMP ){
                    211:                                        if( q->op==i ) break;
                    212:                                        }
                    213:                                else {
                    214:                                        register opmtemp;
                    215:                                        if((opmtemp=mamask[q->op - OPSIMP])&SPFLG){
                    216:                                                if( i==NAME || i==ICON || i==OREG ) break;
                    217:                                                else if( shltype( i, NIL ) ) break;
                    218:                                                }
                    219:                                        else if( (dope[i]&(opmtemp|ASGFLG)) == opmtemp ) break;
                    220:                                        }
                    221:                                }
                    222:                        opptr[i] = q;
                    223:                        }
                    224:                }
                    225:        }
                    226: 
                    227: match( p, cookie ) NODE *p; {
                    228:        /* called by: order, gencall
                    229:           look for match in table and generate code if found unless
                    230:           entry specified REWRITE.
                    231:           returns MDONE, MNOPE, or rewrite specification from table */
                    232: 
                    233:        register struct optab *q;
                    234:        register NODE *r;
                    235: 
                    236:        rcount();
                    237:        if( cookie == FORREW ) q = rwtable;
                    238:        else q = opptr[p->op];
                    239: 
                    240:        for( ; q->op != FREE; ++q ){
                    241: 
                    242:                /* at one point the call that was here was over 15% of the total time;
                    243:                    thus the function call was expanded inline */
                    244:                if( q->op < OPSIMP ){
                    245:                        if( q->op!=p->op ) continue;
                    246:                        }
                    247:                else {
                    248:                        register opmtemp;
                    249:                        if((opmtemp=mamask[q->op - OPSIMP])&SPFLG){
                    250:                                if( p->op!=NAME && p->op!=ICON && p->op!= OREG &&
                    251:                                        ! shltype( p->op, p ) ) continue;
                    252:                                }
                    253:                        else if( (dope[p->op]&(opmtemp|ASGFLG)) != opmtemp ) continue;
                    254:                        }
                    255: 
                    256:                if( !(q->visit & cookie ) ) continue;
                    257:                r = getlr( p, 'L' );                    /* see if left child matches */
                    258:                if( !tshape( r, q->lshape ) ) continue;
                    259:                if( !ttype( r->type, q->ltype ) ) continue;
                    260:                r = getlr( p, 'R' );                    /* see if right child matches */
                    261:                if( !tshape( r, q->rshape ) ) continue;
                    262:                if( !ttype( r->type, q->rtype ) ) continue;
                    263: 
                    264:                        /* REWRITE means no code from this match but go ahead
                    265:                           and rewrite node to help future match */
                    266:                if( q->needs & REWRITE ) return( q->rewrite );
                    267:                if( !allo( p, q ) ) continue;                   /* if can't generate code, skip entry */
                    268: 
                    269:                /* resources are available */
                    270: 
                    271:                expand( p, cookie, q->cstring );                /* generate code */
                    272:                reclaim( p, q->rewrite, cookie );
                    273: 
                    274:                return(MDONE);
                    275: 
                    276:                }
                    277: 
                    278:        return(MNOPE);
                    279:        }
                    280: 
                    281: expand( p, cookie, cp ) NODE *p;  register char *cp; {
                    282:        /* generate code by interpreting table entry */
                    283: 
                    284:        CONSZ val;
                    285: 
                    286:        for( ; *cp; ++cp ){
                    287:                switch( *cp ){
                    288: 
                    289:                default:
                    290:                        PUTCHAR( *cp );
                    291:                        continue;  /* this is the usual case... */
                    292: 
                    293:                case 'Z':  /* special machine dependent operations */
                    294:                        zzzcode( p, *++cp );
                    295:                        continue;
                    296: 
                    297:                case 'F':  /* this line deleted if FOREFF is active */
                    298:                        if( cookie & FOREFF ) while( *++cp != '\n' ) ; /* VOID */
                    299:                        continue;
                    300: 
                    301:                case 'S':  /* field size */
                    302:                        printf( "$%d", fldsz );
                    303:                        continue;
                    304: 
                    305:                case 'H':  /* field shift */
                    306:                        printf( "$%d", fldshf );
                    307:                        continue;
                    308: 
                    309:                case 'M':  /* field mask */
                    310:                case 'N':       /* complement of field mask */
                    311:                        val = 1;
                    312:                        val <<= fldsz;
                    313:                        --val;
                    314:                        val <<= fldshf;
                    315:                        adrcon( *cp=='M' ? val : ~val );
                    316:                        continue;
                    317: 
                    318:                case 'L':  /* output special label field */
                    319:                        printf( "%d", p->label );
                    320:                        continue;
                    321: 
                    322:                case 'O':  /* opcode string */
                    323:                        hopcode( *++cp, p->op );
                    324:                        continue;
                    325: 
                    326:                case 'B':  /* byte offset in word */
                    327:                        val = getlr(p,*++cp)->lval;
                    328:                        val = BYTEOFF(val);
                    329:                        printf( CONFMT, val );
                    330:                        continue;
                    331: 
                    332:                case 'C': /* for constant value only */
                    333:                        conput( getlr( p, *++cp ) );
                    334:                        continue;
                    335: 
                    336:                case 'I': /* in instruction */
                    337:                        insput( getlr( p, *++cp ) );
                    338:                        continue;
                    339: 
                    340:                case 'A': /* address of */
                    341:                        adrput( getlr( p, *++cp ) );
                    342:                        continue;
                    343: 
                    344:                case 'U': /* for upper half of address, only */
                    345:                        upput( getlr( p, *++cp ) );
                    346:                        continue;
                    347: 
                    348:                        }
                    349: 
                    350:                }
                    351: 
                    352:        }
                    353: 
                    354: NODE *
                    355: getlr( p, c ) NODE *p; {
                    356: 
                    357:        /* return the pointer to the left or right side of p, or p itself,
                    358:           depending on the optype of p */
                    359: 
                    360:        switch( c ) {
                    361: 
                    362:        case '1':
                    363:        case '2':
                    364:        case '3':
                    365:                return( &resc[c-'1'] );
                    366: 
                    367:        case 'L':
                    368:                return( optype( p->op ) == LTYPE ? p : p->left );
                    369: 
                    370:        case 'R':
                    371:                return( optype( p->op ) != BITYPE ? p : p->right );
                    372: 
                    373:                }
                    374:        cerror( "bad getlr: %c", c );
                    375:        /* NOTREACHED */
                    376:        }

unix.superglobalmegacorp.com

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