Annotation of researchv10no/cmd/pico/opt.c, revision 1.1

1.1     ! root        1: #include "pico.h"
        !             2: 
        !             3: long   eval();
        !             4: Node*  abase();
        !             5: Node   *new();
        !             6: #define        ARITH   1
        !             7: #define        BOOL    0
        !             8: #define        Z       ((Node *)0)
        !             9: #define        OK(x)   (x==0)
        !            10: #define        EQ(x,y) ((x)==(y))
        !            11: #define        IS(x,y) EQ((x)->type,(y))
        !            12: #define        OSIZE   50
        !            13: 
        !            14: rewrite(n, context)
        !            15: Node *n;
        !            16: {
        !            17:        long v;
        !            18: 
        !            19:        if(n == Z)
        !            20:                return;
        !            21:        if(isconst(n)) {
        !            22:                if(!IS(n,CONST) && !IS(n,CONSTB))
        !            23:                        mkconst(n, eval(n, context));
        !            24:                return;
        !            25:        }
        !            26:        switch(n->type)
        !            27:        {
        !            28:        case LABL:
        !            29:                rewrite(n->left, context);
        !            30:                return;
        !            31: 
        !            32:        case GOTO:
        !            33:        case VAR:
        !            34:        case OARG:
        !            35:        case REG:
        !            36:                return;
        !            37: 
        !            38:        case CONDI:
        !            39:                if(isconst(n->other)) {
        !            40:                        v = eval(n->other, BOOL);
        !            41:                        if(v) {
        !            42:                                rewrite(n->left, context);
        !            43:                                *n = *n->left;
        !            44:                                return;
        !            45:                        }
        !            46:                        rewrite(n->right, context);
        !            47:                        *n = *n->right;
        !            48:                        return;
        !            49:                }
        !            50:                rewrite(n->other, BOOL);
        !            51:                iknown(n->other, n->left, 1);
        !            52:                rewrite(n->left, context);
        !            53:                if(n->right != Z) {
        !            54:                        iknown(n->other, n->right, 0);
        !            55:                        rewrite(n->right, context);
        !            56:                        if(compr(n->left, n->right) == 0)
        !            57:                                *n = *n->right;
        !            58:                }
        !            59:                return;
        !            60: 
        !            61:        case DEREFB:
        !            62:                rewrite(n->left, ARITH);
        !            63:                rewrite(n->right, ARITH);
        !            64:                if(n->left->type != VAR)
        !            65:                        return;
        !            66:                if(IS(n->right,CONST)) {
        !            67:                        n->left->arg += n->right->arg;
        !            68:                        n->right = Z;
        !            69:                        return;
        !            70:                }
        !            71:                if(IS(n->right,OADD))
        !            72:                if(IS(n->right->right,CONST)) {
        !            73:                        n->left->arg += n->right->right->arg;
        !            74:                        n->right = n->right->left;
        !            75:                        return;
        !            76:                }
        !            77:                return;
        !            78: 
        !            79:        case DEREFS:
        !            80:                rewrite(n->left, ARITH);
        !            81:                rewrite(n->right, ARITH);
        !            82:                if(n->left->type != VAR)
        !            83:                        return;
        !            84:                if(IS(n->right,CONST)) {
        !            85:                        n->left->arg += 2*n->right->arg;
        !            86:                        n->right = Z;
        !            87:                        return;
        !            88:                }
        !            89:                if(IS(n->right,OADD))
        !            90:                if(IS(n->right->right,CONST)) {
        !            91:                        n->left->arg += 2*n->right->right->arg;
        !            92:                        n->right = n->right->left;
        !            93:                        return;
        !            94:                }
        !            95:                return;
        !            96: 
        !            97:        case DEREFL:
        !            98:                rewrite(n->left, ARITH);
        !            99:                rewrite(n->right, ARITH);
        !           100:                if(n->left->type != VAR)
        !           101:                        return;
        !           102:                if(IS(n->right,CONST)) {
        !           103:                        n->left->arg += 4*n->right->arg;
        !           104:                        n->right = Z;
        !           105:                        return;
        !           106:                }
        !           107:                if(IS(n->right,OADD))
        !           108:                if(IS(n->right->right,CONST)) {
        !           109:                        n->left->arg += 4*n->right->right->arg;
        !           110:                        n->right = n->right->left;
        !           111:                        return;
        !           112:                }
        !           113:                return;
        !           114: 
        !           115:        case OADD:
        !           116:        case OSUB:
        !           117:        case OISUB:
        !           118:        case OMINUS:
        !           119:                acan(n);
        !           120:                return;
        !           121: 
        !           122:        case OMUL:
        !           123:                scan(n, 1L);
        !           124:                return;
        !           125: 
        !           126:        case ODIV:
        !           127:                rewrite(n->left, ARITH);
        !           128:                rewrite(n->right, ARITH);
        !           129:                if(IS(n->right,CONST)) {
        !           130:                        v = n->right->arg;
        !           131:                        if(v == 1)
        !           132:                                *n = *n->left;
        !           133:                }
        !           134:                return;
        !           135: 
        !           136:        case OIDIV:
        !           137:                rewrite(n->left, ARITH);
        !           138:                rewrite(n->right, ARITH);
        !           139:                if(IS(n->left,CONST)) {
        !           140:                        v = n->left->arg;
        !           141:                        if(v == 1)
        !           142:                                *n = *n->right;
        !           143:                }
        !           144:                return;
        !           145: 
        !           146:        case OPOW:
        !           147:        case OBIC:
        !           148:        case OLSH:
        !           149:                rewrite(n->left, ARITH);
        !           150:                rewrite(n->right, ARITH);
        !           151:                return;
        !           152: 
        !           153:        case ORETURN:
        !           154:                rewrite(n->left, ARITH);
        !           155:                return;
        !           156: 
        !           157:        case OAND:
        !           158:                scan(n, -1L);
        !           159:                if(IS(n, OAND))
        !           160:                if(context == ARITH)
        !           161:                        fixbic(n);
        !           162:                return;
        !           163: 
        !           164:        case OOR:
        !           165:        case OXOR:
        !           166:                scan(n, 0L);
        !           167:                return;
        !           168: 
        !           169:        case ONEG:
        !           170:                rewrite(n->left, context);
        !           171:                return;
        !           172: 
        !           173:        case OCOMMA:
        !           174:        case ACOMMA:
        !           175:                rewrite(n->left, ARITH);
        !           176:                rewrite(n->right, context);
        !           177:                return;
        !           178: 
        !           179:        case OCALL:
        !           180:        case CCALL:
        !           181:                rewrite(n->left, ARITH);
        !           182:                return;
        !           183: 
        !           184:        case OASS:
        !           185:                rewrite(n->left, context);
        !           186:                rewrite(n->right, context);
        !           187:                return;
        !           188: 
        !           189:        case COMP:
        !           190:                rewrite(n->left, ARITH);
        !           191:                return;
        !           192: 
        !           193:        case OGT:
        !           194:        case OLT:
        !           195:        case OLE:
        !           196:        case OGE:
        !           197:        case ONE:
        !           198:        case OEQ:
        !           199:                rewrite(n->left, ARITH);
        !           200:                rewrite(n->right, ARITH);
        !           201:                if(n->right && IS(n->right,CONST) && n->right->arg == 0) {
        !           202:                        n->right = Z;
        !           203:                        return;
        !           204:                }
        !           205:                if(n->left && IS(n->left,CONST) && n->left->arg == 0) {
        !           206:                        n->left = n->right;
        !           207:                        n->right = Z;
        !           208:                        n->type = comop(n->type);
        !           209:                        return;
        !           210:                }
        !           211:                return;
        !           212: 
        !           213:        case OOROR:
        !           214:                rewrite(n->left, BOOL);
        !           215:                rewrite(n->right, BOOL);
        !           216:                if(IS(n->left,CONST)) {
        !           217:                        *n = *n->right;
        !           218:                        return;
        !           219:                }
        !           220:                if(IS(n->right,CONST)) {
        !           221:                        if(!eval(n->right, BOOL))
        !           222:                                *n = *n->right;
        !           223:                        return;
        !           224:                }
        !           225:                iknown(n->left, n->right, 0);
        !           226:                return;
        !           227: 
        !           228:        case OANDAND:
        !           229:                rewrite(n->left, BOOL);
        !           230:                rewrite(n->right, BOOL);
        !           231:                if(IS(n->left,CONST)) {
        !           232:                        *n = *n->right;
        !           233:                        return;
        !           234:                }
        !           235:                if(IS(n->right,CONST)) {
        !           236:                        if(eval(n->right, BOOL))
        !           237:                                *n = *n->right;
        !           238:                        return;
        !           239:                }
        !           240:                iknown(n->left, n->right, 1);
        !           241:                return;
        !           242: 
        !           243:        case ONOT:
        !           244:                rewrite(n->left, BOOL);
        !           245:                return;
        !           246:        }
        !           247:        printf("type = %d\n", n->type);
        !           248: }
        !           249: 
        !           250: comop(o)
        !           251: {
        !           252: 
        !           253:        switch(o) {
        !           254: 
        !           255:        case OLT: o = OGE; break;
        !           256:        case OLE: o = OGT; break;
        !           257:        case OGT: o = OLE; break;
        !           258:        case OGE: o = OLT; break;
        !           259:        }
        !           260:        return(o);
        !           261: }
        !           262: 
        !           263: fixbic(n)
        !           264: Node *n;
        !           265: {
        !           266: 
        !           267:        if(!IS(n->right,CONST))
        !           268:                return;
        !           269:        n->right->arg = ~n->right->arg;
        !           270:        n->type = OBIC;
        !           271: }
        !           272: 
        !           273: iknown(x, n, f)
        !           274: Node *n, *x;
        !           275: {
        !           276: 
        !           277:        if (n == Z)
        !           278:                return;
        !           279: 
        !           280:        known(x, n, f);
        !           281:        switch(x->type) {
        !           282: 
        !           283:        case ONOT:
        !           284:                iknown(x->left, n, !f);
        !           285:                break;
        !           286: 
        !           287:        case OAND:
        !           288:                if(f) {
        !           289:                        if(isconst(x->left))
        !           290:                                iknown(x->right, n, 1);
        !           291:                        if(isconst(x->right))
        !           292:                                iknown(x->left, n, 1);
        !           293:                }
        !           294:                break;
        !           295: 
        !           296:        case OOR:
        !           297:                if(!f) {
        !           298:                        if(isconst(x->left))
        !           299:                                iknown(x->right, n, 0);
        !           300:                        if(isconst(x->right))
        !           301:                                iknown(x->left, n, 0);
        !           302:                }
        !           303:                break;
        !           304:        }
        !           305: }
        !           306: 
        !           307: known(x, n, f)
        !           308: Node *n, *x;
        !           309: {
        !           310: 
        !           311:        if(compr(x, n) == 0) {
        !           312:                if(f == 0) {
        !           313:                        mkconst(n, 0L);
        !           314:                        return;
        !           315:                }
        !           316:        }
        !           317:        switch(n->type) {
        !           318: 
        !           319:        case CONDI:
        !           320:                known(x, n->other, f);
        !           321:                if(compr(x, n->other) == 0) {
        !           322:                        if(f)
        !           323:                                *n = *n->left;
        !           324:                        else
        !           325:                                *n = *n->right;
        !           326:                        known(x, n, f);
        !           327:                        return;
        !           328:                }
        !           329:                break;
        !           330: 
        !           331:        case OANDAND:
        !           332:                if(compr(x, n->left) == 0) {
        !           333:                        if(f)
        !           334:                                mkconst(n, 1L);
        !           335:                        else
        !           336:                                *n = *n->right;
        !           337:                        known(x, n, f);
        !           338:                        return;
        !           339:                }
        !           340:                if(compr(x, n->right) == 0) {
        !           341:                        if(f)
        !           342:                                mkconst(n->right, 1L);
        !           343:                        else
        !           344:                                *n = *n->left;
        !           345:                        known(x, n, f);
        !           346:                        return;
        !           347:                }
        !           348:                break;
        !           349: 
        !           350:        case OOROR:
        !           351:                if(compr(x, n->left) == 0) {
        !           352:                        if(f)
        !           353:                                *n = *n->right;
        !           354:                        else
        !           355:                                mkconst(n, 0L);
        !           356:                        known(x, n, f);
        !           357:                        return;
        !           358:                }
        !           359:                if(compr(x, n->right) == 0) {
        !           360:                        if(f)
        !           361:                                *n = *n->left;
        !           362:                        else
        !           363:                                mkconst(n->right, 0L);
        !           364:                        known(x, n, f);
        !           365:                        return;
        !           366:                }
        !           367:                break;
        !           368:        }
        !           369:        if(n->right)
        !           370:                known(x, n->right, f);
        !           371:        if(n->left)
        !           372:                known(x, n->left, f);
        !           373: }
        !           374: 
        !           375: mkconst(n, v)
        !           376: Node *n;
        !           377: long v;
        !           378: {
        !           379: 
        !           380:        n->type = CONST;
        !           381:        n->other = Z;
        !           382:        n->left = Z;
        !           383:        n->right = Z;
        !           384:        n->arg = v;
        !           385: }
        !           386: 
        !           387: 
        !           388: isconst(n)
        !           389: Node *n;
        !           390: {
        !           391: 
        !           392:        if(n == Z)
        !           393:                return 0;
        !           394:        switch(n->type)
        !           395:        {
        !           396: 
        !           397:        case CONST:
        !           398:        case CONSTB:
        !           399:                return 1;
        !           400: 
        !           401:        case REG:
        !           402:        case VAR:
        !           403:        case OARG:
        !           404:        case DEREFB:
        !           405:        case DEREFS:
        !           406:        case DEREFL:
        !           407:        case OCALL:
        !           408:        case CCALL:
        !           409:        case OASS:
        !           410:        case GOTO:
        !           411:        case LABL:
        !           412:        case OCOMMA:
        !           413:        case ACOMMA:
        !           414:        case ORETURN:
        !           415:                return 0;
        !           416: 
        !           417:        case COMP:
        !           418:                for (n = n->left; n->type == ACOMMA; n = n->left)
        !           419:                        if(!isconst(n->left))
        !           420:                                return 0;
        !           421:                return isconst(n);
        !           422: 
        !           423:        case OANDAND:
        !           424:                if(isconst(n->left)) {
        !           425:                        if(!eval(n->left, BOOL))
        !           426:                                return 1;
        !           427:                        return isconst(n->right);
        !           428:                }
        !           429:                return 0;
        !           430: 
        !           431:        case OOROR:
        !           432:                if(isconst(n->left)) {
        !           433:                        if(eval(n->left, BOOL))
        !           434:                                return 1;
        !           435:                        return isconst(n->right);
        !           436:                }
        !           437:                return 0;
        !           438: 
        !           439:        case CONDI:
        !           440:                if(!isconst(n->other))
        !           441:                        return 0;
        !           442:                if(eval(n->other, BOOL))
        !           443:                        return isconst(n->left);
        !           444:                return isconst(n->right);
        !           445:        }
        !           446:        if(n->left)
        !           447:                if(!isconst(n->left))
        !           448:                        return 0;
        !           449:        if(n->right)
        !           450:                if(!isconst(n->right))
        !           451:                        return 0;
        !           452:        return 1;
        !           453: }
        !           454: 
        !           455: struct O
        !           456: {
        !           457:        struct  l
        !           458:        {
        !           459:                Node    *n;
        !           460:                long    f;
        !           461:        } l[OSIZE];
        !           462:        Node    *free;
        !           463:        int     count;
        !           464: } O;
        !           465: 
        !           466: cancmp1(p1, p2)
        !           467: struct l *p1, *p2;
        !           468: {
        !           469: 
        !           470:        return compr(p1->n, p2->n);
        !           471: }
        !           472: 
        !           473: scan1(n, o)
        !           474:        Node *n;
        !           475: {
        !           476: 
        !           477:        if(IS(n,o)) {
        !           478:                scan1(n->left, o);
        !           479:                scan1(n->right, o);
        !           480:                return;
        !           481:        }
        !           482:        rewrite(n, ARITH);
        !           483: }
        !           484: 
        !           485: scan2(n, o)
        !           486:        Node *n;
        !           487: {
        !           488: 
        !           489:        if(IS(n,o)) {
        !           490:                scan2(n->left, o);
        !           491:                scan2(n->right, o);
        !           492:                n->type = o;
        !           493:                n->left = O.free;
        !           494:                n->right = Z;
        !           495:                n->arg = 0;
        !           496:                O.free = n;
        !           497:                return;
        !           498:        }
        !           499:        O.l[O.count].n = n;
        !           500:        O.count++;
        !           501:        if(O.count >= OSIZE)
        !           502:                yyerror("OSIZE too small");
        !           503: }
        !           504: 
        !           505: scan(n, z)
        !           506: Node *n;
        !           507: long z;
        !           508: {
        !           509:        Node t;
        !           510:        int i, j, o;
        !           511: 
        !           512:        o = n->type;
        !           513:        scan1(n, o);
        !           514:        O.count = 0;
        !           515:        O.free = Z;
        !           516:        scan2(n, o);
        !           517:        qsort(O.l, O.count, sizeof O.l[0], cancmp1);
        !           518: 
        !           519:        j = 0;
        !           520:        for(i=0; i<O.count; i++) {
        !           521:                if(j)
        !           522:                if(IS(O.l[i].n,CONST)) {
        !           523:                        t.type = o;
        !           524:                        t.left = O.l[i].n;
        !           525:                        t.right = O.l[j-1].n;
        !           526:                        mkconst(O.l[i].n, eval(&t, ARITH));
        !           527:                        O.l[j-1].n = O.l[i].n;
        !           528:                        continue;
        !           529:                }
        !           530:                if(j)
        !           531:                if(compr(O.l[j-1].n, O.l[i].n) == 0) {
        !           532:                        /* x^x => 0 */
        !           533:                        if(o == OXOR) {
        !           534:                                j--;
        !           535:                                continue;
        !           536:                        }
        !           537:                        /* x&x => x */
        !           538:                        /* x|x => x */
        !           539:                        if(o == OAND || o == OOR)
        !           540:                                continue;
        !           541:                }
        !           542:                O.l[j].n = O.l[i].n;
        !           543:                if(IS(O.l[j].n,CONST))
        !           544:                if(O.l[j].n->arg == z)
        !           545:                        continue;
        !           546:                j++;
        !           547:        }
        !           548:        O.count = j;
        !           549:        if(n != O.free)
        !           550:                yyerror("scan smells");
        !           551:        if(O.count == 0) {
        !           552:                mkconst(n, z);
        !           553:                return;
        !           554:        }
        !           555:        if(O.count == 1) {
        !           556:                *n = *O.l[0].n;
        !           557:                return;
        !           558:        }
        !           559:        for(i=0; i<O.count-2; i++) {
        !           560:                O.free->right = O.l[i].n;
        !           561:                O.free = O.free->left;
        !           562:        }
        !           563:        O.free->right = O.l[i].n;
        !           564:        O.free->left = O.l[i+1].n;
        !           565: }
        !           566: 
        !           567: acan1(n)
        !           568:        Node *n;
        !           569: {
        !           570:        register t;
        !           571: 
        !           572:        t = n->type;
        !           573:        if(EQ(t,OADD)||EQ(t,OSUB)||EQ(t,OMINUS)||EQ(t,OISUB)) {
        !           574:                acan1(n->left);
        !           575:                if(n->right)
        !           576:                        acan1(n->right);
        !           577:                return;
        !           578:        }
        !           579: if (t == OISUB) yyerror("hit bug in optimizer (loop)");
        !           580:        rewrite(n, ARITH);
        !           581: }
        !           582: 
        !           583: acan2(n, f)
        !           584: Node *n;
        !           585: long f;
        !           586: {
        !           587:        register t;
        !           588: 
        !           589:        t = n->type;
        !           590:        if(EQ(t,OADD)) {
        !           591:                acan2(n->left, f);
        !           592:                acan2(n->right, f);
        !           593:                goto out;
        !           594:        }
        !           595:        if(EQ(t,OSUB)) {
        !           596:                acan2(n->left, f);
        !           597:                acan2(n->right, -f);
        !           598:                goto out;
        !           599:        }
        !           600:        if(EQ(t,OISUB)) {
        !           601:                acan2(n->left, -f);
        !           602:                acan2(n->right, f);
        !           603:                goto out;
        !           604:        }
        !           605:        if(EQ(t,OMINUS)) {
        !           606:                acan2(n->left, -f);
        !           607:                goto out;
        !           608:        }
        !           609:        if(EQ(t,OMUL))
        !           610:        if(IS(n->right,CONST)) {
        !           611:                f *= n->right->arg;
        !           612:                acan2(n->left, f);
        !           613:                goto out;
        !           614:        }
        !           615:        if(f != 1 && IS(n,CONST)) {
        !           616:                mkconst(n, f*n->arg);
        !           617:                f = 1;
        !           618:        }
        !           619:        O.l[O.count].n = n;
        !           620:        O.l[O.count].f = f;
        !           621:        O.count++;
        !           622:        if(O.count >= OSIZE)
        !           623:                yyerror("OSIZE too small");
        !           624:        return;
        !           625: 
        !           626: out:
        !           627:        n->type = OADD;
        !           628:        n->left = O.free;
        !           629:        n->right = Z;
        !           630:        n->arg = 0;
        !           631:        O.free = n;
        !           632: }
        !           633: 
        !           634: acan3()
        !           635: {
        !           636:        int i, j;
        !           637:        long nator, dator;
        !           638:        Node *t;
        !           639: 
        !           640:        if(IS(O.l[0].n,CONST))
        !           641:        if(O.l[0].n->arg < 0) {
        !           642:                O.l[0].n->arg = -O.l[0].n->arg;
        !           643:                O.l[0].f = -O.l[0].f;
        !           644:        }
        !           645:        for(i=0; i<O.count; i++) {
        !           646:                if(IS(O.l[i].n,CONST))
        !           647:                        continue;
        !           648:                dator = O.l[i].f;
        !           649:                if(dator < 0)
        !           650:                        dator = -dator;
        !           651:                if(dator <= 1)
        !           652:                        continue;
        !           653:                for(j=0; j<O.count; j++) {
        !           654:                        if(i == j)
        !           655:                                continue;
        !           656:                        nator = O.l[j].f;
        !           657:                        if(IS(O.l[j].n,CONST))
        !           658:                                nator = O.l[j].n->arg;
        !           659:                        if(nator < 0)
        !           660:                                nator = -nator;
        !           661:                        if(nator%dator)
        !           662:                                continue;
        !           663:                        if(IS(O.l[j].n,CONST)) {
        !           664:                                O.l[j].n->arg = nator/dator;
        !           665:                                t = O.l[j].n;
        !           666:                        } else
        !           667:                        if(dator == nator) {
        !           668:                                t = O.l[j].n;
        !           669:                        } else {
        !           670:                                t = new(CONST, Z, Z, nator/dator);
        !           671:                                t = new(OMUL, O.l[j].n, t, 0L);
        !           672:                        }
        !           673:                        if(O.l[j].f < 0)
        !           674:                                t = new(OSUB, O.l[i].n, t, 0L);
        !           675:                        else
        !           676:                                t = new(OADD, O.l[i].n, t, 0L);
        !           677:                        O.l[i].n = t;
        !           678:                        O.l[j].f = 0;
        !           679:                }
        !           680:        }
        !           681:        j = 0;
        !           682:        for(i=0; i<O.count; i++) {
        !           683:                if(O.l[i].f == 0)
        !           684:                        continue;
        !           685:                O.l[j].n = O.l[i].n;
        !           686:                O.l[j].f = O.l[i].f;
        !           687:                j++;
        !           688:        }
        !           689:        O.count = j;
        !           690:        for(i=O.count-1; i>=0; i--) {
        !           691:                if(O.l[i].f < 0)
        !           692:                        continue;
        !           693:        }
        !           694: }
        !           695: 
        !           696: Node *
        !           697: atemp(i)
        !           698: {
        !           699:        Node *t;
        !           700:        int f;
        !           701: 
        !           702:        f = O.l[i].f;
        !           703:        if(f < 0)
        !           704:                f = -f;
        !           705:        if(f != 1) {
        !           706:                t = new(CONST, Z, Z, f);
        !           707:                if(f)
        !           708:                        t = new(OMUL, O.l[i].n, t, 0L);
        !           709:                return t;
        !           710:        }
        !           711:        return O.l[i].n;
        !           712: }
        !           713: 
        !           714: acan(n)
        !           715: Node *n;
        !           716: {
        !           717:        Node t;
        !           718:        int i, j;
        !           719: 
        !           720:        acan1(n);
        !           721:        O.count = 0;
        !           722:        O.free = Z;
        !           723:        acan2(n, 1L);
        !           724:        qsort(O.l, O.count, sizeof O.l[0], cancmp1);
        !           725: 
        !           726:        j = 0;
        !           727:        for(i=0; i<O.count; i++) {
        !           728:                if(j)
        !           729:                if(IS(O.l[i].n,CONST)) {
        !           730:                        t.type = OADD;
        !           731:                        t.left = O.l[i].n;
        !           732:                        t.right = O.l[j-1].n;
        !           733:                        mkconst(O.l[i].n, eval(&t, ARITH));
        !           734:                        O.l[j-1].n = O.l[i].n;
        !           735:                        continue;
        !           736:                }
        !           737:                if(j)
        !           738:                if(compr(O.l[j-1].n, O.l[i].n) == 0) {
        !           739:                        O.l[j-1].f += O.l[i].f;
        !           740:                        if(O.l[j-1].f == 0)
        !           741:                                j--;
        !           742:                        continue;
        !           743:                }
        !           744:                O.l[j].n = O.l[i].n;
        !           745:                O.l[j].f = O.l[i].f;
        !           746:                if(IS(O.l[j].n,CONST))
        !           747:                if(O.l[j].n->arg == 0)
        !           748:                        continue;
        !           749:                j++;
        !           750:        }
        !           751:        O.count = j;
        !           752:        acan3();
        !           753:        if(n != O.free)
        !           754:                yyerror("acan smells");
        !           755:        if(O.count == 0) {
        !           756:                mkconst(n, 0L);
        !           757:                return;
        !           758:        }
        !           759:        j = -1;
        !           760:        for(i=0; i<O.count; i++)
        !           761:                if(O.l[i].f >= 0)
        !           762:                        j = i;
        !           763:        if(j < 0) {
        !           764:                if(IS(O.l[0].n,CONST)) {
        !           765:                        O.l[0].n->arg = -O.l[0].n->arg;
        !           766:                        O.l[0].f = -O.l[0].f;
        !           767:                        j = 0;
        !           768:                } else {
        !           769:                        O.free->type = OMINUS;
        !           770:                        if(O.count == 1) {
        !           771:                                O.free->left = atemp(0);
        !           772:                                return;
        !           773:                        }
        !           774:                        O.free = O.free->left;
        !           775:                }
        !           776:        }
        !           777:        for(i=j+1; i<O.count; i++)
        !           778:                O.l[i].f = -O.l[i].f;
        !           779:        if(O.count == 1) {
        !           780:                *O.free = *atemp(0);
        !           781:                return;
        !           782:        }
        !           783:        for(i=0; i<O.count-2; i++) {
        !           784:                O.free->right = atemp(i);
        !           785:                if(O.l[i].f < 0)
        !           786:                        O.free->type = OSUB;
        !           787:                else
        !           788:                if(i == j)
        !           789:                        O.free->type = OISUB;
        !           790:                O.free = O.free->left;
        !           791:        }
        !           792:        O.free->right = atemp(i);
        !           793:        if(O.l[i].f < 0)
        !           794:                O.free->type = OSUB;
        !           795:        else
        !           796:        if(i == j)
        !           797:                O.free->type = OISUB;
        !           798:        O.free->left = atemp(i+1);
        !           799: }
        !           800: 
        !           801: compr(n1, n2)
        !           802: Node *n1, *n2;
        !           803: {
        !           804:        int v;
        !           805: 
        !           806:        v = n1->type - n2->type;
        !           807:        if(v) {
        !           808:                if(IS(n1,CONST))
        !           809:                        return -1;
        !           810:                if(IS(n2,CONST))
        !           811:                        return 1;
        !           812:                return v;
        !           813:        }
        !           814:        switch(n1->type)
        !           815:        {
        !           816: 
        !           817:        case VAR:
        !           818:        case CONST:
        !           819:        case REG:
        !           820:        case OARG:
        !           821:                v = n1->arg - n2->arg;
        !           822:                return v;
        !           823: 
        !           824:        case CONDI:
        !           825:                v = compr(n1->other, n2->other);
        !           826:                if(v)
        !           827:                        return v;
        !           828: 
        !           829:        case OCALL:
        !           830:        case CCALL:
        !           831:        case LABL:
        !           832:        case GOTO:
        !           833:                return -1;
        !           834:        }
        !           835:        v = compr(n1->left, n2->left);
        !           836:        if(v)
        !           837:                return v;
        !           838:        if(n1->right)
        !           839:                return compr(n1->right, n2->right);
        !           840:        return 0;
        !           841: }
        !           842: 
        !           843: dlist()
        !           844: {
        !           845:        int i;
        !           846: 
        !           847:        for(i=0; i<O.count; i++) {
        !           848:                printf("[%2d]  ", i);
        !           849:                printf("%3d ", O.l[i].f);
        !           850:                prtree(O.l[i].n, 0, 5);
        !           851:        }
        !           852:        printf("\n");
        !           853: }
        !           854: 
        !           855: long
        !           856: eval(n, context)
        !           857: Node *n;
        !           858: {
        !           859:        Node n1, n2;
        !           860:        long v;
        !           861: 
        !           862: 
        !           863:        if(context == BOOL) {
        !           864:                n1.type = ONOT;
        !           865:                n1.left = &n2;
        !           866:                n1.right = Z;
        !           867:                n1.other = Z;
        !           868: 
        !           869:                n2.type = ONOT;
        !           870:                n2.left = n;
        !           871:                n2.right = Z;
        !           872:                n2.other = Z;
        !           873: 
        !           874:                n = &n1;
        !           875:        }
        !           876:        gencode(n);
        !           877:        v = callit();
        !           878:        return v;
        !           879: }
        !           880: 
        !           881: callit()
        !           882: {
        !           883:        register x, y, z;
        !           884:        extern program();
        !           885: 
        !           886:        x = y = z = 0;
        !           887: asm("          jsb     *_program                       ");
        !           888: asm("  x:      brb     x+9                             ");     
        !           889:                x = program();
        !           890:        return(x);
        !           891: }
        !           892: 

unix.superglobalmegacorp.com

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