Annotation of researchv10no/cmd/PDP11/11c/c20.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *      C object code improver
        !             3:  */
        !             4: 
        !             5: #include "c2.h"
        !             6: 
        !             7: struct optab optab[] = {
        !             8:        "jbr",  JBR,
        !             9:        "jeq",  CBR | JEQ<<8,
        !            10:        "jne",  CBR | JNE<<8,
        !            11:        "jle",  CBR | JLE<<8,
        !            12:        "jge",  CBR | JGE<<8,
        !            13:        "jlt",  CBR | JLT<<8,
        !            14:        "jgt",  CBR | JGT<<8,
        !            15:        "jlo",  CBR | JLO<<8,
        !            16:        "jhi",  CBR | JHI<<8,
        !            17:        "jlos", CBR | JLOS<<8,
        !            18:        "jhis", CBR | JHIS<<8,
        !            19:        "jmp",  JMP,
        !            20:        ".globl",EROU,
        !            21:        "mov",  MOV,
        !            22:        "clr",  CLR,
        !            23:        "com",  COM,
        !            24:        "inc",  INC,
        !            25:        "dec",  DEC,
        !            26:        "neg",  NEG,
        !            27:        "tst",  TST,
        !            28:        "asr",  ASR,
        !            29:        "asl",  ASL,
        !            30:        "sxt",  SXT,
        !            31:        "cmp",  CMP,
        !            32:        "add",  ADD,
        !            33:        "sub",  SUB,
        !            34:        "bit",  BIT,
        !            35:        "bic",  BIC,
        !            36:        "bis",  BIS,
        !            37:        "mul",  MUL,
        !            38:        "ash",  ASH,
        !            39:        "xor",  XOR,
        !            40:        ".text",TEXT,
        !            41:        ".data",DATA,
        !            42:        ".bss", BSS,
        !            43:        ".even",EVEN,
        !            44:        "movf", MOVF,
        !            45:        "movof",MOVOF,
        !            46:        "movfo",MOVFO,
        !            47:        "addf", ADDF,
        !            48:        "subf", SUBF,
        !            49:        "divf", DIVF,
        !            50:        "mulf", MULF,
        !            51:        "clrf", CLRF,
        !            52:        "cmpf", CMPF,
        !            53:        "negf", NEGF,
        !            54:        "tstf", TSTF,
        !            55:        "cfcc", CFCC,
        !            56:        "sob",  SOB,
        !            57:        "jsr",  JSR,
        !            58:        ".end", END,
        !            59:        0,      0};
        !            60: 
        !            61: char   revbr[] = { JNE, JEQ, JGT, JLT, JGE, JLE, JHIS, JLOS, JHI, JLO };
        !            62: int    isn     = 20000;
        !            63: int    lastseg = -1;
        !            64: 
        !            65: #define        NSTK    5000
        !            66: 
        !            67: main(argc, argv)
        !            68: char **argv;
        !            69: {
        !            70:        register int niter, maxiter, isend;
        !            71:        extern end;
        !            72:        int nflag;
        !            73:        char    stspace[NSTK];
        !            74: 
        !            75:        if (argc>1 && argv[1][0]=='+') {
        !            76:                argc--;
        !            77:                argv++;
        !            78:                debug++;
        !            79:        }
        !            80:        nflag = 0;
        !            81:        if (argc>1 && argv[1][0]=='-') {
        !            82:                argc--;
        !            83:                argv++;
        !            84:                nflag++;
        !            85:        }
        !            86:        if (argc>1) {
        !            87:                if (freopen(argv[1], "r", stdin) == NULL) {
        !            88:                        fprintf(stderr, "C2: can't find %s\n", argv[1]);
        !            89:                        exit(1);
        !            90:                }
        !            91:        }
        !            92:        if (argc>2) {
        !            93:                if (freopen(argv[2], "w", stdout) == NULL) {
        !            94:                        fprintf(stderr, "C2: can't create %s\n", argv[2]);
        !            95:                        exit(1);
        !            96:                }
        !            97:        }
        !            98:        lasta = firstr = lastr = sbrk(sizeof(char *));
        !            99:        maxiter = 0;
        !           100:        opsetup();
        !           101:        do {
        !           102:        alasta = stspace;
        !           103:        alastr = &stspace[NSTK];
        !           104:                isend = input();
        !           105:                movedat();
        !           106:                niter = 0;
        !           107:                do {
        !           108:                        refcount();
        !           109:                        do {
        !           110:                                iterate();
        !           111:                                clearreg();
        !           112:                                niter++;
        !           113:                        } while (nchange);
        !           114:                        comjump();
        !           115:                        rmove();
        !           116:                } while (nchange || jumpsw());
        !           117:                addsob();
        !           118:                output();
        !           119:                if (niter > maxiter)
        !           120:                        maxiter = niter;
        !           121:                lasta = firstr;
        !           122:        } while (isend);
        !           123:        if (nflag) {
        !           124:                fprintf(stderr, "%d iterations\n", maxiter);
        !           125:                fprintf(stderr, "%d jumps to jumps\n", nbrbr);
        !           126:                fprintf(stderr, "%d inst. after jumps\n", iaftbr);
        !           127:                fprintf(stderr, "%d jumps to .+2\n", njp1);
        !           128:                fprintf(stderr, "%d redundant labels\n", nrlab);
        !           129:                fprintf(stderr, "%d cross-jumps\n", nxjump);
        !           130:                fprintf(stderr, "%d code motions\n", ncmot);
        !           131:                fprintf(stderr, "%d branches reversed\n", nrevbr);
        !           132:                fprintf(stderr, "%d redundant moves\n", redunm);
        !           133:                fprintf(stderr, "%d simplified addresses\n", nsaddr);
        !           134:                fprintf(stderr, "%d loops inverted\n", loopiv);
        !           135:                fprintf(stderr, "%d redundant jumps\n", nredunj);
        !           136:                fprintf(stderr, "%d common seqs before jmp's\n", ncomj);
        !           137:                fprintf(stderr, "%d skips over jumps\n", nskip);
        !           138:                fprintf(stderr, "%d sob's added\n", nsob);
        !           139:                fprintf(stderr, "%d redundant tst's\n", nrtst);
        !           140:                fprintf(stderr, "%d literals eliminated\n", nlit);
        !           141:                fprintf(stderr, "%dK core\n", (((int)lastr+01777)>>10)&077);
        !           142:        }
        !           143:        exit(0);
        !           144: }
        !           145: 
        !           146: input()
        !           147: {
        !           148:        register struct node *p, *lastp;
        !           149:        register int oper;
        !           150: 
        !           151:        lastp = &first;
        !           152:        for (;;) {
        !           153:                oper = getline();
        !           154:                switch (oper&0377) {
        !           155:        
        !           156:                case LABEL:
        !           157:                        p = (struct node *)alloc(sizeof first);
        !           158:                        if (line[0] == 'L') {
        !           159:                                p->op = LABEL;
        !           160:                                p->subop = 0;
        !           161:                                p->labno = getnum(line+1);
        !           162:                                p->code = 0;
        !           163:                        } else {
        !           164:                                p->op = DLABEL;
        !           165:                                p->subop = 0;
        !           166:                                p->labno = 0;
        !           167:                                p->code = copy(1, line);
        !           168:                        }
        !           169:                        break;
        !           170:        
        !           171:                case JBR:
        !           172:                case CBR:
        !           173:                case JMP:
        !           174:                case JSW:
        !           175:                        p = (struct node *)alloc(sizeof first);
        !           176:                        p->op = oper&0377;
        !           177:                        p->subop = oper>>8;
        !           178:                        if (*curlp=='L' && (p->labno = getnum(curlp+1)))
        !           179:                                p->code = 0;
        !           180:                        else {
        !           181:                                p->labno = 0;
        !           182:                                p->code = copy(1, curlp);
        !           183:                        }
        !           184:                        break;
        !           185: 
        !           186:                default:
        !           187:                        p = (struct node *)alloc(sizeof first);
        !           188:                        p->op = oper&0377;
        !           189:                        p->subop = oper>>8;
        !           190:                        p->labno = 0;
        !           191:                        p->code = copy(1, curlp);
        !           192:                        break;
        !           193: 
        !           194:                }
        !           195:                p->forw = 0;
        !           196:                p->back = lastp;
        !           197:                lastp->forw = p;
        !           198:                lastp = p;
        !           199:                p->ref = 0;
        !           200:                if (oper==EROU)
        !           201:                        return(1);
        !           202:                if (oper==END)
        !           203:                        return(0);
        !           204:        }
        !           205: }
        !           206: 
        !           207: getline()
        !           208: {
        !           209:        register char *lp;
        !           210:        register c;
        !           211: 
        !           212:        lp = line;
        !           213:        while ((c = getchar())==' ' || c=='\t')
        !           214:                ;
        !           215:        do {
        !           216:                if (c==':') {
        !           217:                        *lp++ = 0;
        !           218:                        return(LABEL);
        !           219:                }
        !           220:                if (c=='\n') {
        !           221:                        *lp++ = 0;
        !           222:                        return(oplook());
        !           223:                }
        !           224:                if (lp >= &line[LSIZE-2]) {
        !           225:                        fprintf(stderr, "C2: Sorry, input line too long\n");
        !           226:                        exit(1);
        !           227:                }
        !           228:                *lp++ = c;
        !           229:        } while ((c = getchar()) != EOF);
        !           230:        *lp++ = 0;
        !           231:        return(END);
        !           232: }
        !           233: 
        !           234: getnum(ap)
        !           235: char *ap;
        !           236: {
        !           237:        register char *p;
        !           238:        register n, c;
        !           239: 
        !           240:        p = ap;
        !           241:        n = 0;
        !           242:        while ((c = *p++) >= '0' && c <= '9')
        !           243:                n = n*10 + c - '0';
        !           244:        if (*--p != 0)
        !           245:                return(0);
        !           246:        return(n);
        !           247: }
        !           248: 
        !           249: output()
        !           250: {
        !           251:        register struct node *t;
        !           252:        register struct optab *oper;
        !           253:        register int byte;
        !           254: 
        !           255:        t = &first;
        !           256:        while (t = t->forw) switch (t->op) {
        !           257: 
        !           258:        case END:
        !           259:                return;
        !           260: 
        !           261:        case LABEL:
        !           262:                printf("L%d:", t->labno);
        !           263:                continue;
        !           264: 
        !           265:        case DLABEL:
        !           266:                printf("%s:", t->code);
        !           267:                continue;
        !           268: 
        !           269:        case TEXT:
        !           270:        case DATA:
        !           271:        case BSS:
        !           272:                lastseg = t->op;
        !           273: 
        !           274:        default:
        !           275:                if ((byte = t->subop) == BYTE)
        !           276:                        t->subop = 0;
        !           277:                for (oper = optab; oper->opstring!=0; oper++) 
        !           278:                        if ((oper->opcode&0377) == t->op
        !           279:                         && (oper->opcode>>8) == t->subop) {
        !           280:                                printf("%s", oper->opstring);
        !           281:                                if (byte==BYTE)
        !           282:                                        printf("b");
        !           283:                                break;
        !           284:                        }
        !           285:                if (t->code) {
        !           286:                        reducelit(t);
        !           287:                        printf("\t%s\n", t->code);
        !           288:                } else if (t->op==JBR || t->op==CBR)
        !           289:                        printf("\tL%d\n", t->labno);
        !           290:                else
        !           291:                        printf("\n");
        !           292:                continue;
        !           293: 
        !           294:        case JSW:
        !           295:                printf("L%d\n", t->labno);
        !           296:                continue;
        !           297: 
        !           298:        case SOB:
        !           299:                printf("sob     %s", t->code);
        !           300:                if (t->labno)
        !           301:                        printf(",L%d", t->labno);
        !           302:                printf("\n");
        !           303:                continue;
        !           304: 
        !           305:        case 0:
        !           306:                if (t->code)
        !           307:                        printf("%s", t->code);
        !           308:                printf("\n");
        !           309:                continue;
        !           310:        }
        !           311: }
        !           312: 
        !           313: /*
        !           314:  * Notice addresses of the form
        !           315:  * $xx,xx(r)
        !           316:  * and replace them with (pc),xx(r)
        !           317:  *     -- Thanx and a tip of the Hatlo hat to Bliss-11.
        !           318:  */
        !           319: reducelit(at)
        !           320: struct node *at;
        !           321: {
        !           322:        register char *c1, *c2;
        !           323:        char *c2s;
        !           324:        register struct node *t;
        !           325: 
        !           326:        t = at;
        !           327:        if (*t->code != '$')
        !           328:                return;
        !           329:        c1 = t->code;
        !           330:        while (*c1 != ',')
        !           331:                if (*c1++ == '\0')
        !           332:                        return;
        !           333:        c2s = c1;
        !           334:        c1++;
        !           335:        if (*c1=='*')
        !           336:                c1++;
        !           337:        c2 = t->code+1;
        !           338:        while (*c1++ == *c2++);
        !           339:        if (*--c1!='(' || *--c2!=',')
        !           340:                return;
        !           341:        t->code = copy(2, "(pc)", c2s);
        !           342:        nlit++;
        !           343: }
        !           344: 
        !           345: char *
        !           346: copy(na, ap)
        !           347: char *ap;
        !           348: {
        !           349:        register char *p, *np;
        !           350:        char *onp;
        !           351:        register n;
        !           352: 
        !           353:        p = ap;
        !           354:        n = 0;
        !           355:        if (*p==0)
        !           356:                return(0);
        !           357:        do
        !           358:                n++;
        !           359:        while (*p++);
        !           360:        if (na>1) {
        !           361:                p = (&ap)[1];
        !           362:                while (*p++)
        !           363:                        n++;
        !           364:        }
        !           365:        onp = np = alloc(n);
        !           366:        p = ap;
        !           367:        while (*np++ = *p++)
        !           368:                ;
        !           369:        if (na>1) {
        !           370:                p = (&ap)[1];
        !           371:                np--;
        !           372:                while (*np++ = *p++);
        !           373:        }
        !           374:        return(onp);
        !           375: }
        !           376: 
        !           377: opsetup()
        !           378: {
        !           379:        register struct optab *optp, **ophp;
        !           380:        register char *p;
        !           381: 
        !           382:        for (optp = optab; p = optp->opstring; optp++) {
        !           383:                ophp = &ophash[(((p[0]<<3)+(p[1]<<1)+p[2])&077777) % OPHS];
        !           384:                while (*ophp++)
        !           385:                        if (ophp > &ophash[OPHS])
        !           386:                                ophp = ophash;
        !           387:                *--ophp = optp;
        !           388:        }
        !           389: }
        !           390: 
        !           391: oplook()
        !           392: {
        !           393:        register struct optab *optp;
        !           394:        register char *lp, *np;
        !           395:        static char tmpop[32];
        !           396:        struct optab **ophp;
        !           397: 
        !           398:        if (line[0]=='\0') {
        !           399:                curlp = line;
        !           400:                return(0);
        !           401:        }
        !           402:        np = tmpop;
        !           403:        for (lp = line; *lp && *lp!=' ' && *lp!='\t';)
        !           404:                *np++ = *lp++;
        !           405:        *np++ = 0;
        !           406:        while (*lp=='\t' || *lp==' ')
        !           407:                lp++;
        !           408:        curlp = lp;
        !           409:        ophp = &ophash[(((tmpop[0]<<3)+(tmpop[1]<<1)+tmpop[2])&077777) % OPHS];
        !           410:        while (optp = *ophp) {
        !           411:                np = optp->opstring;
        !           412:                lp = tmpop;
        !           413:                while (*lp == *np++)
        !           414:                        if (*lp++ == 0)
        !           415:                                return(optp->opcode);
        !           416:                if (*lp++=='b' && *lp++==0 && *--np==0)
        !           417:                        return(optp->opcode + (BYTE<<8));
        !           418:                ophp++;
        !           419:                if (ophp >= &ophash[OPHS])
        !           420:                        ophp = ophash;
        !           421:        }
        !           422:        if (line[0]=='L') {
        !           423:                lp = &line[1];
        !           424:                while (*lp)
        !           425:                        if (*lp<'0' || *lp++>'9')
        !           426:                                return(0);
        !           427:                curlp = line;
        !           428:                return(JSW);
        !           429:        }
        !           430:        curlp = line;
        !           431:        return(0);
        !           432: }
        !           433: 
        !           434: refcount()
        !           435: {
        !           436:        register struct node *p, *lp;
        !           437:        static struct node *labhash[LABHS];
        !           438:        register struct node **hp, *tp;
        !           439: 
        !           440:        for (hp = labhash; hp < &labhash[LABHS];)
        !           441:                *hp++ = 0;
        !           442:        for (p = first.forw; p!=0; p = p->forw)
        !           443:                if (p->op==LABEL) {
        !           444:                        labhash[p->labno % LABHS] = p;
        !           445:                        p->refc = 0;
        !           446:                }
        !           447:        for (p = first.forw; p!=0; p = p->forw) {
        !           448:                if (p->op==JBR || p->op==CBR || p->op==JSW) {
        !           449:                        p->ref = 0;
        !           450:                        lp = labhash[p->labno % LABHS];
        !           451:                        if (lp==0 || p->labno!=lp->labno)
        !           452:                        for (lp = first.forw; lp!=0; lp = lp->forw) {
        !           453:                                if (lp->op==LABEL && p->labno==lp->labno)
        !           454:                                        break;
        !           455:                        }
        !           456:                        if (lp) {
        !           457:                                tp = nonlab(lp)->back;
        !           458:                                if (tp!=lp) {
        !           459:                                        p->labno = tp->labno;
        !           460:                                        lp = tp;
        !           461:                                }
        !           462:                                p->ref = lp;
        !           463:                                lp->refc++;
        !           464:                        }
        !           465:                }
        !           466:        }
        !           467:        for (p = first.forw; p!=0; p = p->forw)
        !           468:                if (p->op==LABEL && p->refc==0
        !           469:                 && (lp = nonlab(p))->op && lp->op!=JSW)
        !           470:                        decref(p);
        !           471: }
        !           472: 
        !           473: iterate()
        !           474: {
        !           475:        register struct node *p, *rp, *p1;
        !           476: 
        !           477:        nchange = 0;
        !           478:        for (p = first.forw; p!=0; p = p->forw) {
        !           479:                CHECK(0);
        !           480:                if ((p->op==JBR||p->op==CBR||p->op==JSW) && p->ref) {
        !           481:                        rp = nonlab(p->ref);
        !           482:                        if (rp->op==JBR && rp->labno && p->labno!=rp->labno) {
        !           483:                                nbrbr++;
        !           484:                                p->labno = rp->labno;
        !           485:                                decref(p->ref);
        !           486:                                rp->ref->refc++;
        !           487:                                p->ref = rp->ref;
        !           488:                                CHECK(1);
        !           489:                                nchange++;
        !           490:                        }
        !           491:                }
        !           492:                if (p->op==CBR && (p1 = p->forw)->op==JBR) {
        !           493:                        rp = p->ref;
        !           494:                        do
        !           495:                                rp = rp->back;
        !           496:                        while (rp->op==LABEL);
        !           497:                        if (rp==p1) {
        !           498:                                decref(p->ref);
        !           499:                                p->ref = p1->ref;
        !           500:                                p->labno = p1->labno;
        !           501:                                p1->forw->back = p;
        !           502:                                p->forw = p1->forw;
        !           503:                                p->subop = revbr[p->subop];
        !           504:                                nchange++;
        !           505:                                CHECK(2);
        !           506:                                nskip++;
        !           507:                        }
        !           508:                }
        !           509:                if (p->op==JBR || p->op==JMP) {
        !           510:                        while (p->forw && p->forw->op!=LABEL
        !           511:                                && p->forw->op!=DLABEL
        !           512:                                && p->forw->op!=EROU && p->forw->op!=END
        !           513:                                && p->forw->op!=0 && p->forw->op!=DATA) {
        !           514:                                nchange++;
        !           515:                                iaftbr++;
        !           516:                                if (p->forw->ref)
        !           517:                                        decref(p->forw->ref);
        !           518:                                p->forw = p->forw->forw;
        !           519:                                p->forw->back = p;
        !           520:                                CHECK(3);
        !           521:                        }
        !           522:                        rp = p->forw;
        !           523:                        while (rp && rp->op==LABEL) {
        !           524:                                if (p->ref == rp) {
        !           525:                                        p->back->forw = p->forw;
        !           526:                                        p->forw->back = p->back;
        !           527:                                        p = p->back;
        !           528:                                        decref(rp);
        !           529:                                        nchange++;
        !           530:                                        CHECK(4);
        !           531:                                        njp1++;
        !           532:                                        break;
        !           533:                                }
        !           534:                                rp = rp->forw;
        !           535:                        }
        !           536:                }
        !           537:                if (p->op==JBR || p->op==JMP) {
        !           538:                        xjump(p);
        !           539:                        p = codemove(p);
        !           540:                }
        !           541:        }
        !           542: }
        !           543: 
        !           544: xjump(p1)
        !           545: register struct node *p1;
        !           546: {
        !           547:        register struct node *p2, *p3;
        !           548: 
        !           549:        if ((p2 = p1->ref)==0)
        !           550:                return;
        !           551:        for (;;) {
        !           552:                while ((p1 = p1->back) && p1->op==LABEL);
        !           553:                while ((p2 = p2->back) && p2->op==LABEL);
        !           554:                if (!equop(p1, p2) || p1==p2)
        !           555:                        return;
        !           556:                p3 = insertl(p2);
        !           557:                p1->op = JBR;
        !           558:                p1->subop = 0;
        !           559:                p1->ref = p3;
        !           560:                p1->labno = p3->labno;
        !           561:                p1->code = 0;
        !           562:                nxjump++;
        !           563:                CHECK(5);
        !           564:                nchange++;
        !           565:        }
        !           566: }
        !           567: 
        !           568: struct node *
        !           569: insertl(oldp)
        !           570: register struct node *oldp;
        !           571: {
        !           572:        register struct node *lp;
        !           573: 
        !           574:        if (oldp->op == LABEL) {
        !           575:                oldp->refc++;
        !           576:                return(oldp);
        !           577:        }
        !           578:        if (oldp->back->op == LABEL) {
        !           579:                oldp = oldp->back;
        !           580:                oldp->refc++;
        !           581:                return(oldp);
        !           582:        }
        !           583:        lp = (struct node *)alloc(sizeof first);
        !           584:        lp->op = LABEL;
        !           585:        lp->subop = 0;
        !           586:        lp->labno = isn++;
        !           587:        lp->ref = 0;
        !           588:        lp->code = 0;
        !           589:        lp->refc = 1;
        !           590:        lp->back = oldp->back;
        !           591:        lp->forw = oldp;
        !           592:        oldp->back->forw = lp;
        !           593:        oldp->back = lp;
        !           594:        CHECK(6);
        !           595:        return(lp);
        !           596: }
        !           597: 
        !           598: struct node *
        !           599: codemove(p)
        !           600: struct node *p;
        !           601: {
        !           602:        register struct node *p1, *p2, *p3;
        !           603:        struct node *t, *tl;
        !           604:        int n;
        !           605: 
        !           606:        p1 = p;
        !           607:        if (p1->op!=JBR || (p2 = p1->ref)==0)
        !           608:                return(p1);
        !           609:        while (p2->op == LABEL)
        !           610:                if ((p2 = p2->back) == 0)
        !           611:                        return(p1);
        !           612:        if (p2->op!=JBR && p2->op!=JMP)
        !           613:                goto ivloop;
        !           614:        if (p1==p2)
        !           615:                return(p1);
        !           616:        p2 = p2->forw;
        !           617:        p3 = p1->ref;
        !           618:        while (p3) {
        !           619:                if (p3->op==JBR || p3->op==JMP) {
        !           620:                        if (p1==p3 || p1->forw==p3 || p1->back==p3)
        !           621:                                return(p1);
        !           622:                        ncmot++;
        !           623:                        nchange++;
        !           624:                        CHECK(70);
        !           625:                        p1->back->forw = p2;
        !           626:                        p1->forw->back = p3;
        !           627:                        p2->back->forw = p3->forw;
        !           628:                        p3->forw->back = p2->back;
        !           629:                        p2->back = p1->back;
        !           630:                        p3->forw = p1->forw;
        !           631:                        decref(p1->ref);
        !           632:                        CHECK(7);
        !           633:                        return(p2);
        !           634:                } else
        !           635:                        p3 = p3->forw;
        !           636:        }
        !           637:        return(p1);
        !           638: ivloop:
        !           639:        if (p1->forw->op!=LABEL)
        !           640:                return(p1);
        !           641:        p3 = p2 = p2->forw;
        !           642:        n = 16;
        !           643:        do {
        !           644:                if ((p3 = p3->forw) == 0 || p3==p1 || --n==0)
        !           645:                        return(p1);
        !           646:        } while (p3->op!=CBR || p3->labno!=p1->forw->labno);
        !           647:        do 
        !           648:                if ((p1 = p1->back) == 0)
        !           649:                        return(p);
        !           650:        while (p1!=p3);
        !           651:        p1 = p;
        !           652:        tl = insertl(p1);
        !           653:        p3->subop = revbr[p3->subop];
        !           654:        decref(p3->ref);
        !           655:        p2->back->forw = p1;
        !           656:        p3->forw->back = p1;
        !           657:        p1->back->forw = p2;
        !           658:        p1->forw->back = p3;
        !           659:        t = p1->back;
        !           660:        p1->back = p2->back;
        !           661:        p2->back = t;
        !           662:        t = p1->forw;
        !           663:        p1->forw = p3->forw;
        !           664:        p3->forw = t;
        !           665:        p2 = insertl(p1->forw);
        !           666:        p3->labno = p2->labno;
        !           667:        p3->ref = p2;
        !           668:        decref(tl);
        !           669:        if (tl->refc<=0)
        !           670:                nrlab--;
        !           671:        loopiv++;
        !           672:        nchange++;
        !           673:        CHECK(8);
        !           674:        return(p3);
        !           675: }
        !           676: 
        !           677: comjump()
        !           678: {
        !           679:        register struct node *p1, *p2, *p3;
        !           680: 
        !           681:        for (p1 = first.forw; p1!=0; p1 = p1->forw)
        !           682:                if (p1->op==JBR && (p2 = p1->ref) && p2->refc > 1)
        !           683:                        for (p3 = p1->forw; p3!=0; p3 = p3->forw)
        !           684:                                if (p3->op==JBR && p3->ref == p2)
        !           685:                                        backjmp(p1, p3);
        !           686: }
        !           687: 
        !           688: backjmp(ap1, ap2)
        !           689: struct node *ap1, *ap2;
        !           690: {
        !           691:        register struct node *p1, *p2, *p3;
        !           692: 
        !           693:        p1 = ap1;
        !           694:        p2 = ap2;
        !           695:        for(;;) {
        !           696:                while ((p1 = p1->back) && p1->op==LABEL);
        !           697:                p2 = p2->back;
        !           698:                if (equop(p1, p2)) {
        !           699:                        p3 = insertl(p1);
        !           700:                        p2->back->forw = p2->forw;
        !           701:                        p2->forw->back = p2->back;
        !           702:                        p2 = p2->forw;
        !           703:                        decref(p2->ref);
        !           704:                        p2->labno = p3->labno;
        !           705:                        p2->ref = p3;
        !           706:                        nchange++;
        !           707:                        ncomj++;
        !           708:                        CHECK(9);
        !           709:                } else
        !           710:                        return;
        !           711:        }
        !           712: }

unix.superglobalmegacorp.com

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