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

1.1     ! root        1: # include "mfile2.h"
        !             2: 
        !             3: /*     some storage declarations */
        !             4: 
        !             5: int lflag;
        !             6: int e2debug;
        !             7: int udebug;
        !             8: int fast;
        !             9: 
        !            10: /* maxtemp is the maximum size (in bits) needed for temps so far */
        !            11: /* maxarg is ditto for outgoing arguments */
        !            12: /* maxboff is ditto for automatic variables */
        !            13: 
        !            14: int maxtemp;
        !            15: extern int maxarg;
        !            16: int maxboff;
        !            17: NODE *condit();
        !            18: 
        !            19: NODE *
        !            20: force(p)
        !            21: register NODE *p; 
        !            22: {
        !            23:        register NODE *q, *r;
        !            24:        if( !p ) cerror( "force" );
        !            25:        q = talloc();
        !            26:        *q = *p;
        !            27:        r = talloc();
        !            28:        *r = *p;
        !            29:        q->tn.op = ASSIGN;
        !            30:        q->in.right = p;
        !            31:        q->in.left = r;
        !            32:        r->tn.op = QNODE;
        !            33:        r->tn.rval = callreg(p); /* the reg where the value will be forced */
        !            34:        return( q );
        !            35: }
        !            36: 
        !            37: int odebug = 0, rdebug = 0, sdebug = 0;
        !            38: 
        !            39: p2init( argc, argv )
        !            40: char *argv[];
        !            41: {
        !            42:        /* set the values of the pass 2 arguments */
        !            43: 
        !            44:        register int c; extern int syncstdio;
        !            45:        register char *cp;
        !            46:        register files;
        !            47: 
        !            48:        allo0();  /* free all regs */
        !            49:        files = 0;
        !            50: 
        !            51:        for( c=1; c<argc; ++c )
        !            52:        {
        !            53:                if( *(cp=argv[c]) == '-' )
        !            54:                {
        !            55:                        while( *++cp )
        !            56:                        {
        !            57:                                switch(++syncstdio, *cp)
        !            58:                                {
        !            59: 
        !            60:                                case 'X':  /* pass1 flags */
        !            61:                                        while( *++cp ) 
        !            62:                                        {
        !            63:                                                 /* VOID */ 
        !            64:                                        }
        !            65:                                        --syncstdio;
        !            66:                                        --cp;
        !            67:                                        break;
        !            68: # ifdef GDEBUG
        !            69: #define LL_TOP 0       /* from mfile1.h */
        !            70:                                case 'g':  /* another stab in the back */
        !            71:                                        {
        !            72:                                                extern int gdebug;
        !            73:                                                extern int wloop_level, floop_level;
        !            74:                                                gdebug = !gdebug;
        !            75:                                                wloop_level = LL_TOP; /* natural */
        !            76:                                                floop_level = LL_TOP; /* loops */
        !            77:                                        }       /* fall through */
        !            78: # endif
        !            79:                                case 'l':  /* linenos */
        !            80:                                        --syncstdio;
        !            81:                                        ++lflag;
        !            82:                                        break;
        !            83: 
        !            84:                                default:
        !            85:                                        cerror( "bad option: %c", *cp );
        !            86:                                }
        !            87:                        }
        !            88:                }
        !            89:                else files = 1;  /* assumed to be a ftitle */
        !            90:        }
        !            91: 
        !            92:        mkdope();
        !            93:        return( files );
        !            94: }
        !            95: 
        !            96: NODE *
        !            97: dlabel( p, l )
        !            98: register NODE *p; 
        !            99: {
        !           100:        /* define a label after p is executed */
        !           101:        register NODE *q;
        !           102: 
        !           103: /*     condit will throw away things, fix here
        !           104: /*     if( !p ) cerror( "dlabel" );
        !           105: */
        !           106:        if (!p)         /* create conventional dumb subtree */
        !           107:        {
        !           108:                p = talloc();
        !           109:                p->tn.op = ICON;
        !           110:                p->tn.name = NULL;
        !           111:                p->tn.lval = 0;
        !           112:                p->tn.type = TINT;
        !           113:        }
        !           114:        q = talloc();
        !           115:        q->tn.type = p->tn.type;
        !           116:        q->in.left = p;
        !           117:        q->tn.op = GENLAB;
        !           118:        q->bn.label = l;
        !           119:        return( q );
        !           120: }
        !           121: 
        !           122: 
        !           123: NODE *
        !           124: genbr( o, l, p )
        !           125: register NODE *p; 
        !           126: register o,l;
        !           127: {
        !           128:        /* after evaluating p, generate a branch to l */
        !           129:        /* if o is 0, unconditional */
        !           130:        register NODE *q;
        !           131:        if( !p ) cerror( "genbr" );
        !           132:        if( l < 0 ) cerror( "genbr1" );
        !           133:        q = talloc();
        !           134:        q->tn.op = o?GENBR:GENUBR;
        !           135:        q->tn.type = p->tn.type;
        !           136:        q->in.left = p;
        !           137:        q->bn.label = l;
        !           138:        q->bn.lop = o;
        !           139:        if( o && logop(p->tn.op) &&
        !           140:                (p->tn.op != ANDAND) 
        !           141:                && (p->tn.op != OROR)
        !           142:        ) p->tn.op = CMP;
        !           143:        return( q );
        !           144: }
        !           145: 
        !           146: 
        !           147: static NODE *
        !           148: oreff(p)
        !           149: register NODE *p;
        !           150: {
        !           151:        register NODE *r, *l;
        !           152:        NODE *condit(), *seq();
        !           153:        int lab, t, f;
        !           154:        /* oreff is called if an || op is evaluated with goal=CEFF
        !           155:           The rhs of || ops should be executed only if the
        !           156:           lhs is false.  Since our goal is CEFF, we don't need
        !           157:           a result of the ||, but we need to
        !           158:           preserve that dependancy with this special case */
        !           159: 
        !           160:        /* We must catch this case before its children are
        !           161:           condit() and change the goal on it left child to CCC */
        !           162:           
        !           163:        if (tcond(p->in.left))  {
        !           164:                tfree(p->in.right);
        !           165:                p->in.op = FREE;
        !           166:                p = condit( p->in.left, CEFF, -1, -1);
        !           167:        } else if (fcond(p->in.left))  {
        !           168:                p->in.op = COMOP;
        !           169:                p = condit( p, CEFF, -1, -1);
        !           170:        } else {
        !           171:                lab = getlab();
        !           172:                l = condit( p->in.left, CCC, lab, -1);
        !           173:                r = condit( p->in.right, CEFF, -1, -1);
        !           174:                p->in.op = FREE;
        !           175:                p = seq(l, r);  /* put r after l */
        !           176:                p = dlabel(p, lab);
        !           177:        }
        !           178:        return p;
        !           179: }
        !           180: static NODE *
        !           181: andeff(p)
        !           182: register NODE *p;
        !           183: {
        !           184:        register NODE *r, *l;
        !           185:        NODE *condit();
        !           186:        int lab, t, f;
        !           187:        /* andeff is called if an && op is evaluated with goal=CEFF
        !           188:           The rhs of && ops should be executed only if the
        !           189:           lhs is true.  Since our goal is CEFF, we don't need
        !           190:           a result of the &&, but we need to
        !           191:           preserve that dependancy with this special case */
        !           192: 
        !           193:        /* We must catch this case before its children are
        !           194:           condit() and change the goal on it left child to CCC */
        !           195:           
        !           196:        if (fcond(p->in.left))  {
        !           197:                tfree(p->in.right);
        !           198:                p->in.op = FREE;
        !           199:                p = condit( p->in.left, CEFF, -1, -1);
        !           200:        } else if (tcond(p->in.left))  {
        !           201:                p->in.op = COMOP;
        !           202:                p = condit( p, CEFF, -1, -1);
        !           203:        } else {
        !           204:                lab = getlab();
        !           205:                p->in.op = FREE;
        !           206:                l = condit( p->in.left, CCC, -1, lab);
        !           207:                r = condit( p->in.right, CEFF, -1, -1);
        !           208:                p = seq(l, r);  /* put r after l */
        !           209:                p = dlabel(p, lab);
        !           210:        }
        !           211:        return p;
        !           212: }
        !           213: int negrel[] = 
        !           214: {
        !           215:         NE, EQ, GT, GE, LT, LE, UGT, UGE, ULT, ULE 
        !           216: } ;  /* negatives of relationals */
        !           217: 
        !           218: tcond( p )
        !           219: register NODE *p; 
        !           220: {
        !           221:        /* return 1 if p is always true, 0 otherwise */
        !           222:        register o = p->tn.op;
        !           223:        register NODE *q;
        !           224: 
        !           225:        switch( o ) 
        !           226:        {
        !           227: 
        !           228:        case ICON:
        !           229:                return( p->tn.lval || p->tn.name != (char *) 0 );
        !           230: 
        !           231:        case COMOP:
        !           232:                return( tcond( p->in.right ) );
        !           233: 
        !           234:        case ANDAND:
        !           235:                return( tcond( p->in.left ) && tcond( p->in.right ) );
        !           236: 
        !           237:        case OROR:
        !           238:                return( tcond( p->in.left ) || tcond( p->in.right ) );
        !           239: 
        !           240:        case NOT:
        !           241:                return( fcond( p->in.left ) );
        !           242: 
        !           243:        case QUEST:
        !           244:                q = p->in.right;
        !           245:                if( tcond( p->in.left ) ) return( tcond( q->in.left ) );
        !           246:                if( fcond( p->in.left ) ) return( tcond( q->in.right ) );
        !           247:                return( tcond( q->in.left ) && tcond( q->in.right ) );
        !           248: 
        !           249:        default:
        !           250:                return( 0 );
        !           251:        }
        !           252: }
        !           253: 
        !           254: fcond( p )
        !           255: register NODE *p; 
        !           256: {
        !           257:        /* return 1 if p is always false, 0 otherwise */
        !           258:        register o = p->tn.op;
        !           259:        register NODE *q;
        !           260: 
        !           261:        switch( o ) 
        !           262:        {
        !           263: 
        !           264:        case ICON:
        !           265:                return( !p->tn.lval && p->tn.name == (char *) 0 );
        !           266: 
        !           267:        case COMOP:
        !           268:                return( fcond( p->in.right ) );
        !           269: 
        !           270:        case ANDAND:
        !           271:                return( fcond( p->in.left ) || fcond( p->in.right ) );
        !           272: 
        !           273:        case OROR:
        !           274:                return( fcond( p->in.left ) && fcond( p->in.right ) );
        !           275: 
        !           276:        case NOT:
        !           277:                return( tcond( p->in.left ) );
        !           278: 
        !           279:        case QUEST:
        !           280:                q = p->in.right;
        !           281:                if( tcond( p->in.left ) ) return( fcond( q->in.left ) );
        !           282:                if( fcond( p->in.left ) ) return( fcond( q->in.right ) );
        !           283:                return( fcond( q->in.left ) && fcond( q->in.right ) );
        !           284: 
        !           285:        default:
        !           286:                return( 0 );
        !           287:        }
        !           288: }
        !           289: 
        !           290: NODE *
        !           291: rcomma( p )
        !           292: register NODE *p; 
        !           293: {
        !           294:        /* p is a COMOP; return the shrunken version thereof */
        !           295: 
        !           296:        if( p->tn.op != COMOP ) cerror( "rcomma" );
        !           297: 
        !           298:        if( p->in.left && p->in.right ) return( p );
        !           299:        p->tn.op = FREE;
        !           300:        if( !p->in.left ) return( p->in.right );
        !           301:        return( p->in.left );
        !           302: }
        !           303: 
        !           304: NODE *
        !           305: seq( p1, p2 )
        !           306: register NODE *p1, *p2;
        !           307: {
        !           308:        /* execute p then q */
        !           309:        register NODE *q;
        !           310: 
        !           311:        q = talloc();
        !           312:        if (!p1) return p2;
        !           313:        if (!p2) return p1;
        !           314:        q->in.op = COMOP;
        !           315:        /*q->in.type = p2->in.right->in.type; why? */
        !           316:        q->in.type = p2->in.type;
        !           317:        q->in.left = p1;
        !           318:        q->in.right = p2;
        !           319:        return q;
        !           320: }
        !           321: 
        !           322: NODE *
        !           323: gtb( p, l )
        !           324: register NODE *p; 
        !           325: register l;
        !           326: {
        !           327:        register NODE *q;
        !           328:        /* replace p by a trivial branch to l */
        !           329:        /* if l is -1, return NULL */
        !           330:        q = condit( p, CEFF, -1, -1 );
        !           331:        if( l<0 ) return( q );
        !           332:        if( !q ) 
        !           333:        {
        !           334:                q = talloc();
        !           335:                q->tn.op = ICON;
        !           336:                q->tn.lval = 0;
        !           337:                q->tn.name = (char *) 0;
        !           338:                q->tn.type = TINT;
        !           339:        }
        !           340:        return( genbr( 0, l, q ) );
        !           341: }
        !           342: 
        !           343: NODE *
        !           344: condit( p, goal, t, f )
        !           345: register NODE *p; 
        !           346: register goal,t,f;
        !           347: {
        !           348:        /* generate code for conditionals in terms of GENLAB and GENBR nodes */
        !           349:        /* goal is either CEFF, NRGS, or CCC */
        !           350:        /* also, delete stuff that never needs get done */
        !           351:        /* if goal==CEFF, return of null means nothing to be done */
        !           352: 
        !           353:        register o, lt, lf, l;
        !           354:        register NODE *q, *q1, *q2;
        !           355: 
        !           356:        o = p->tn.op;
        !           357: 
        !           358:        if( o == CBRANCH ) 
        !           359:        {
        !           360:                p->in.right->tn.op = p->tn.op = FREE;
        !           361:                l = p->in.right->tn.lval;
        !           362:                p = p->in.left;
        !           363:                if( fcond( p ) ) return( gtb(p,l) );
        !           364:                if( tcond( p ) ) return( gtb(p,-1) );
        !           365:                return( condit( p, CCC, -1, l ) );
        !           366:        }
        !           367: 
        !           368:        /* a convenient place to diddle a few special ops */
        !           369:        if( callop(o) )
        !           370:        {
        !           371:                if( optype(o) == UTYPE ) p->stn.argsize = 0;
        !           372:                else p->stn.argsize = argsize(p->in.right);
        !           373:                if( goal==CEFF ) goal = NRGS;
        !           374:                /* flow on, so that we can handle if( f(...) )... */
        !           375:        }
        !           376:        else if( goal==CEFF && (asgop(o) || o==STASG || o==INIT)) goal=NRGS;
        !           377: 
        !           378:        /* do a bit of optimization */
        !           379: 
        !           380:        if( goal == NRGS ) 
        !           381:        {
        !           382:                if( logop(o) )
        !           383:                {
        !           384:                        /* must make p into ( p ? 1 : 0 ), then recompile */
        !           385:                        q1 = talloc();
        !           386:                        q1->tn.op = ICON;
        !           387:                        q1->tn.name = (char *) 0;
        !           388:                        q1->tn.lval = 1;
        !           389:                        q1->tn.type = p->tn.type;
        !           390:                        q2 = talloc();
        !           391:                        *q2 = *q1;
        !           392:                        q2->tn.lval = 0;
        !           393:                        q = talloc();
        !           394:                        q->tn.op = COLON;
        !           395:                        q->tn.type = p->tn.type;
        !           396:                        q->in.left = q1;
        !           397:                        q->in.right = q2;
        !           398:                        q1 = talloc();
        !           399:                        q1->tn.op = o = QUEST;
        !           400:                        q1->tn.type = p->tn.type;
        !           401:                        q1->in.left = p;
        !           402:                        q1->in.right = q;
        !           403:                        p = q1;  /* flow on, and compile */
        !           404:                }
        !           405:        }
        !           406: 
        !           407:        if( goal != CCC ) 
        !           408:        {
        !           409:                if( o == QUEST ) 
        !           410:                {
        !           411:                        /* rewrite ? : when goal not CCC */
        !           412:                        lf = getlab();
        !           413:                        l = getlab();
        !           414:                        p->tn.op = COMOP;
        !           415:                        q = p->in.right;
        !           416:                        q1 = condit( q->in.left, goal, -1, -1 );
        !           417:                        q->in.right = condit( q->in.right, goal, -1, -1 );
        !           418:                        if( tcond( p->in.left ) ) 
        !           419:                        {
        !           420:                                q->tn.op = FREE;
        !           421:                                tfree( q->in.right );
        !           422:                                p->in.right = q1;
        !           423:                                p->in.left=condit( p->in.left, CEFF, -1, -1 );
        !           424:                                return( rcomma( p ) );
        !           425:                        }
        !           426:                        if( fcond( p->in.left ) ) 
        !           427:                        {
        !           428:                                q->tn.op = FREE;
        !           429:                                tfree( q1 );
        !           430:                                p->in.right = q->in.right;
        !           431:                                p->in.left=condit( p->in.left, CEFF, -1, -1 );
        !           432:                                return( rcomma( p ) );
        !           433:                        }
        !           434:                        if( !q1 ) 
        !           435:                        {
        !           436:                                if( !q->in.right ) 
        !           437:                                {
        !           438:                                        /* may still have work to do
        !           439:                                        ** if left side of ? has effect
        !           440:                                        */
        !           441:                                        q1 = condit(p->in.left, goal,
        !           442:                                                -1, -1);
        !           443:                                        if (!q1)
        !           444:                                        {
        !           445:                                                tfree( p->in.left );
        !           446:                                        }
        !           447:                                        p->tn.op = q->tn.op = FREE;
        !           448:                                        return( q1 );
        !           449:                                }
        !           450:                                /* rhs done if condition is false */
        !           451:                                p->in.left = condit( p->in.left, CCC, l, -1 );
        !           452:                                p->in.right = dlabel( q->in.right, l );
        !           453:                                q->tn.op = FREE;
        !           454:                                return( p );
        !           455:                        }
        !           456:                        else if( !q->in.right ) 
        !           457:                        {
        !           458:                                /* lhs done if condition is true */
        !           459:                                p->in.left=condit( p->in.left, CCC, -1, lf );
        !           460:                                p->in.right = dlabel( q1, lf );
        !           461:                                q->tn.op = FREE;
        !           462:                                return( p );
        !           463:                        }
        !           464: 
        !           465:                        /* both sides exist and the condition is nontrivial */
        !           466:                        p->in.left = condit( p->in.left, CCC, -1, lf );
        !           467:                        q1 = force(q1);
        !           468:                        q->in.right = force(q->in.right);
        !           469:                        q1 = genbr( 0, l, q1 );
        !           470:                        q->in.left = dlabel( q1, lf );
        !           471:                        q->tn.op = COMOP;
        !           472:                        return( dlabel( p, l ) );
        !           473:                }
        !           474: 
        !           475:                if( goal == CEFF ) 
        !           476:                {
        !           477:                        /* some things may disappear */
        !           478:                        switch( o ) 
        !           479:                        {
        !           480: 
        !           481:                        case CBRANCH:
        !           482:                        case GENBR:
        !           483:                        case GENUBR:
        !           484:                        case CALL:
        !           485:                        case UNARY CALL:
        !           486:                        case FORTCALL:
        !           487:                        case UNARY FORTCALL:
        !           488:                        case STCALL:
        !           489:                        case UNARY STCALL:
        !           490:                        case STASG:
        !           491:                        case INIT:
        !           492:                        case MOD:   /* do these for the side effects */
        !           493:                        case DIV:
        !           494:                                goal = NRGS;
        !           495:                        }
        !           496:                }
        !           497: 
        !           498:                /* The rhs of && and || ops are executed only if the
        !           499:                   result is not clear from the lhs.  If our goal is
        !           500:                   CEFF, we don't need a result, but we need to
        !           501:                   preserve that dependancy. So special case it. */
        !           502:                if (goal==CEFF)  {
        !           503:                        if (o == ANDAND) return andeff(p);
        !           504:                        if (o == OROR) return oreff(p);
        !           505:                }
        !           506:                /* This next batch of code wanders over the tree getting
        !           507:                   rid of code which is for effect only and has no
        !           508:                   effect */
        !           509:                switch( optype(o) ) 
        !           510:                {
        !           511:                case LTYPE:
        !           512:                        if( goal == CEFF ) 
        !           513:                        {
        !           514:                                p->tn.op = FREE;
        !           515:                                return( NIL );
        !           516:                        }
        !           517:                        break;
        !           518: 
        !           519:                case BITYPE:
        !           520:                        p->in.right = condit( p->in.right, goal, -1, -1 );
        !           521:                case UTYPE:
        !           522:                        p->in.left = condit( p->in.left, o==COMOP?CEFF:goal,
        !           523:                        -1, -1 );
        !           524:                }
        !           525:                /* If we are only interested in effects, we quit here */
        !           526:                if( goal == CEFF || o==COMOP ) 
        !           527:                {
        !           528:                        /* lhs or rhs may have disappeared */
        !           529:                        /* op need not get done */
        !           530: 
        !           531:                        switch( optype(o) )
        !           532:                        {
        !           533: 
        !           534:                        case BITYPE:
        !           535:                                p->tn.op = COMOP;
        !           536:                                p = rcomma(p);
        !           537:                                return ( p );
        !           538: 
        !           539:                        case UTYPE:
        !           540:                                /* don't throw out prepass's labels */
        !           541:                                if(p->in.op == GENLAB)
        !           542:                                        return(p);
        !           543:                                p->tn.op = FREE;
        !           544:                                return( p->in.left );
        !           545: 
        !           546:                        case LTYPE:
        !           547:                                p->tn.op = FREE;
        !           548:                                return( NIL );
        !           549:                        }
        !           550:                }
        !           551:                return( p );
        !           552:        }
        !           553: 
        !           554:        /* goal must = CCC from here on */
        !           555: 
        !           556:        switch( o ) 
        !           557:        {
        !           558: 
        !           559:        case ULE:
        !           560:        case ULT:
        !           561:        case UGE:
        !           562:        case UGT:
        !           563:        case EQ:
        !           564:        case NE:
        !           565:        case LE:
        !           566:        case LT:
        !           567:        case GE:
        !           568:        case GT:
        !           569:                if(t<0 ) 
        !           570:                {
        !           571:                        o = p->tn.op = negrel[o-EQ];
        !           572:                        t = f;
        !           573:                        f = -1;
        !           574:                }
        !           575: 
        !           576: #ifndef NOOPT
        !           577:                if( p->in.right->in.op == ICON &&
        !           578:                    p->in.right->tn.lval == 0 &&
        !           579:                    p->in.right->in.name == (char *) 0 ) 
        !           580:                {
        !           581:                        /* if chars are unsigned, do these optimizations
        !           582:                           as if this is an unsigned compare*/
        !           583: #ifndef CHSIGN
        !           584:                        if (
        !           585:                            ( p->in.left->tn.type == TCHAR ||
        !           586:                              ( p->in.left->in.op == CONV && 
        !           587:                                p->in.left->in.left->tn.type == TCHAR ) )
        !           588:                             && o >= LE && o <= GT)
        !           589:                                o += UGT - GT;
        !           590: #endif
        !           591: 
        !           592:                        /* the question here is whether we can assume that */
        !           593:                        /* unconditional branches preserve condition codes */
        !           594:                        /* if this turned out to be no, we would have to */
        !           595:                        /* explicitly handle this case here */
        !           596: 
        !           597:                        switch( o ) 
        !           598:                        {
        !           599: 
        !           600:                        case UGT:
        !           601:                        case ULE:
        !           602:                                o = p->in.op = (o==UGT)?NE:EQ;
        !           603:                        case EQ:
        !           604:                        case NE:
        !           605:                        case LE:
        !           606:                        case LT:
        !           607:                        case GE:
        !           608:                        case GT:
        !           609:                                if( logop( p->in.left->tn.op ) )
        !           610:                                {
        !           611:                                        /* situation like (a==0)==0 */
        !           612:                                        /* ignore optimization */
        !           613:                                        goto noopt;
        !           614:                                }
        !           615:                                break;
        !           616: 
        !           617:                        case ULT:  /* never succeeds */
        !           618:                                return( gtb( p, f ) );
        !           619: 
        !           620:                        case UGE:
        !           621:                                /* always succeeds */
        !           622:                                return( gtb( p, t ) );
        !           623:                        }
        !           624:                        p->tn.op = p->in.right->tn.op = FREE;
        !           625:                        p = condit( p->in.left, NRGS, -1, -1 );
        !           626:                        p = genbr( o, t, p );
        !           627:                        if( f<0 ) return( p );
        !           628:                        else return( genbr( 0, f, p ) );
        !           629:                }
        !           630: noopt:
        !           631: # endif
        !           632: 
        !           633:                p->in.left = condit( p->in.left, NRGS, -1, -1 );
        !           634:                p->in.right = condit( p->in.right, NRGS, -1, -1 );
        !           635:                p = genbr( o, t, p );
        !           636:                if( f>=0 ) p = genbr( 0, f, p );
        !           637:                return( p );
        !           638: 
        !           639:        case COMOP:
        !           640:                p->in.left = condit( p->in.left, CEFF, -1, -1 );
        !           641:                p->in.right = condit( p->in.right, CCC, t, f );
        !           642:                return( rcomma( p ) );
        !           643: 
        !           644:        case NOT:
        !           645:                p->tn.op = FREE;
        !           646:                return( condit( p->in.left, CCC, f, t ) );
        !           647: 
        !           648:        case ANDAND:
        !           649:                lf = f<0 ? getlab() : f;
        !           650:                lt = t<0 ? getlab() : t;
        !           651:                p->tn.op = COMOP;
        !           652:                if( tcond( p->in.left ) )
        !           653:                {
        !           654:                        /* left is always true */
        !           655:                        p->in.left = condit( p->in.left, CEFF, -1, -1 );
        !           656:                        p->in.right = condit( p->in.right, CCC, t, f );
        !           657:                }
        !           658:                else  {
        !           659:                        /* lhs not always true */
        !           660:                        if( tcond( p->in.right ) )
        !           661:                        {
        !           662:                                /* rhs is always true */
        !           663:                                p->in.right =
        !           664:                                   condit( p->in.right, CEFF, -1, -1 );
        !           665:                                if (p->in.right)  {
        !           666:                                    /* const with sideeffect */
        !           667:                                    p->in.left = 
        !           668:                                        condit( p->in.left, CCC, -1,lf);
        !           669:                                    p->in.right = condit( p->in.right,
        !           670:                                        CCC, t, t );
        !           671:                                } else
        !           672:                                    p->in.left =
        !           673:                                     condit( p->in.left, CCC, t, f );
        !           674:                        } else  {
        !           675:                                p->in.left =
        !           676:                                     condit( p->in.left, CCC, -1, lf );
        !           677:                                p->in.right =
        !           678:                                   condit( p->in.right, CCC, t, f );
        !           679:                        }
        !           680:                }
        !           681:                q = rcomma( p );
        !           682:                if( f<0 ) q = dlabel( q, lf );
        !           683:                if( t<0 ) q = dlabel( q, lt );
        !           684:                return( q );
        !           685: 
        !           686:        case OROR:
        !           687:                lf = f<0 ? getlab() : f;
        !           688:                lt = t<0 ? getlab() : t;
        !           689:                p->tn.op = COMOP;
        !           690:                if( fcond( p->in.left ) )
        !           691:                {
        !           692:                        /* left is always false */
        !           693:                        p->in.left = condit( p->in.left, CEFF, -1, -1 );
        !           694:                        p->in.right = condit( p->in.right, CCC, t, f );
        !           695:                }
        !           696:                else  {
        !           697:                        /* left is not always false */
        !           698:                        if( fcond( p->in.right ) )
        !           699:                        {
        !           700:                                /* right always false */
        !           701:                                p->in.right =
        !           702:                                   condit( p->in.right, CEFF, -1, -1 );
        !           703:                                if (p->in.right) {  
        !           704:                                    /* const with sideeffect */
        !           705:                                    p->in.left = 
        !           706:                                        condit( p->in.left, CCC, lt,-1);
        !           707:                                    /* This may generate a superfluous
        !           708:                                       test.  Tough. */
        !           709:                                    p->in.right = condit( p->in.right,
        !           710:                                        CCC, f, f );
        !           711:                                } else
        !           712:                                    p->in.left =
        !           713:                                     condit( p->in.left, CCC, t, f );
        !           714:                        } else  {
        !           715:                                p->in.left =
        !           716:                                     condit( p->in.left, CCC, lt, -1 );
        !           717:                                p->in.right =
        !           718:                                   condit( p->in.right, CCC, t, f );
        !           719:                        }
        !           720:                }
        !           721:                p = rcomma( p );
        !           722:                if( f<0 ) p = dlabel( p, lf );
        !           723:                if( t<0 ) p = dlabel( p, lt );
        !           724:                return( p );
        !           725: 
        !           726:        case QUEST:
        !           727:                lf = f<0 ? getlab() : f;
        !           728:                lt = t<0 ? getlab() : t;
        !           729:                p->in.left = condit( p->in.left, CCC, -1, l=getlab() );
        !           730:                q = p->in.right;
        !           731:                q1 = condit( q->in.left, goal, lt, lf );
        !           732:                q->in.left = dlabel( q1, l );
        !           733:                q->in.right = condit( q->in.right, goal, t, f );
        !           734:                p->tn.op = COMOP;
        !           735:                q->tn.op = COMOP;
        !           736:                if( t<0 ) p = dlabel( p, lt );
        !           737:                if( f<0 ) p = dlabel( p, lf );
        !           738:                return( p );
        !           739: 
        !           740:        default:
        !           741:                /* get the condition codes, generate the branch */
        !           742:                switch( optype(o) )
        !           743:                {
        !           744:                case BITYPE:
        !           745:                        p->in.right = condit( p->in.right, NRGS, -1, -1 );
        !           746:                case UTYPE:
        !           747:                        p->in.left = condit( p->in.left, NRGS, -1, -1 );
        !           748:                }
        !           749:                if( t>=0 ) p = genbr( NE, t, p );
        !           750:                if( f>=0 ) p = genbr( (t>=0)?0:EQ, f, p );
        !           751:                return( p );
        !           752:        }
        !           753: }
        !           754: 
        !           755: p2compile( p )
        !           756: register NODE *p; 
        !           757: {
        !           758:        if( lflag ) lineid(p->ln.lineno ? p->ln.lineno : lineno, ftitle );
        !           759:        tmpoff = 0;  /* expression at top level reuses temps */
        !           760:        /* generate code for the tree p */
        !           761: 
        !           762:        /* eliminate the conditionals */
        !           763:        if(p)
        !           764:                p = condit( p, CEFF, -1, -1 );
        !           765:        if( p ) 
        !           766:        {
        !           767:                /* expression does something */
        !           768:                /* generate the code */
        !           769:                pjwreader(p);
        !           770:                pjwend(p);
        !           771:        }
        !           772:        allchk();
        !           773:        /* tcheck will be done by the first pass at the end of a ftn. */
        !           774:        /* first pass will do it... */
        !           775: }
        !           776: 
        !           777: p2bbeg( aoff, myreg ) 
        !           778: register aoff,myreg;
        !           779: {
        !           780:        static int myftn = -1;
        !           781:        SETOFF( aoff, ALSTACK );
        !           782:        if( myftn != ftnno )
        !           783:        {
        !           784:                 /* beginning of function */
        !           785:                maxboff = aoff;
        !           786:                myftn = ftnno;
        !           787:                maxtemp = 0;
        !           788:                maxarg = 0;
        !           789:        }
        !           790:        else 
        !           791:        {
        !           792:                if( aoff > maxboff ) maxboff = aoff;
        !           793:        }
        !           794: # ifdef SETREGS
        !           795:        SETREGS(myreg);
        !           796: # endif
        !           797: }
        !           798: 
        !           799: p2bend()
        !           800: {
        !           801:        SETOFF( maxboff, ALSTACK );
        !           802:        SETOFF( maxarg, ALSTACK );
        !           803:        SETOFF( maxtemp, ALSTACK );
        !           804:        eobl2();
        !           805:        maxboff = maxarg = maxtemp = 0;
        !           806: }

unix.superglobalmegacorp.com

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