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

1.1     ! root        1: #
        !             2: /*
        !             3:  * C object code improver-- second part
        !             4:  */
        !             5: 
        !             6: #include "c2.h"
        !             7: 
        !             8: rmove()
        !             9: {
        !            10:        register struct node *p;
        !            11:        register int r;
        !            12:        register  r1, flt;
        !            13: 
        !            14:        for (p=first.forw; p!=0; p = p->forw) {
        !            15:        flt = 0;
        !            16:        switch (p->op) {
        !            17: 
        !            18:        case MOVF:
        !            19:        case MOVFO:
        !            20:        case MOVOF:
        !            21:                flt = NREG;
        !            22: 
        !            23:        case MOV:
        !            24:                if (p->subop==BYTE)
        !            25:                        goto dble;
        !            26:                dualop(p);
        !            27:                if ((r = findrand(regs[RT1], flt)) >= 0) {
        !            28:                        if (r == flt+isreg(regs[RT2]) && p->forw->op!=CBR
        !            29:                           && p->forw->op!=SXT
        !            30:                           && p->forw->op!=CFCC) {
        !            31:                                p->forw->back = p->back;
        !            32:                                p->back->forw = p->forw;
        !            33:                                redunm++;
        !            34:                                continue;
        !            35:                        }
        !            36:                }
        !            37:                if (equstr(regs[RT1], "$0")) {
        !            38:                        p->op = CLR;
        !            39:                        strcpy(regs[RT1], regs[RT2]);
        !            40:                        regs[RT2][0] = 0;
        !            41:                        p->code = copy(1, regs[RT1]);
        !            42:                        goto sngl;
        !            43:                }
        !            44:                repladdr(p, 0, flt);
        !            45:                r = isreg(regs[RT1]);
        !            46:                r1 = isreg(regs[RT2]);
        !            47:                dest(regs[RT2], flt);
        !            48:                if (r >= 0)
        !            49:                        if (r1 >= 0)
        !            50:                                savereg(r1+flt, regs[r+flt]);
        !            51:                        else
        !            52:                                savereg(r+flt, regs[RT2]);
        !            53:                else
        !            54:                        if (r1 >= 0)
        !            55:                                savereg(r1+flt, regs[RT1]);
        !            56:                        else
        !            57:                                setcon(regs[RT1], regs[RT2]);
        !            58:                source(regs[RT1]);
        !            59:                setcc(regs[RT2]);
        !            60:                continue;
        !            61: 
        !            62:        case ADDF:
        !            63:        case SUBF:
        !            64:        case DIVF:
        !            65:        case MULF:
        !            66:                flt = NREG;
        !            67:                goto dble;
        !            68: 
        !            69:        case ADD:
        !            70:        case SUB:
        !            71:        case BIC:
        !            72:        case BIS:
        !            73:        case MUL:
        !            74:        case DIV:
        !            75:        case ASH:
        !            76:        dble:
        !            77:                dualop(p);
        !            78:                if (p->op==BIC && (equstr(regs[RT1], "$-1") || equstr(regs[RT1], "$177777"))) {
        !            79:                        p->op = CLR;
        !            80:                        strcpy(regs[RT1], regs[RT2]);
        !            81:                        regs[RT2][0] = 0;
        !            82:                        p->code = copy(1, regs[RT1]);
        !            83:                        goto sngl;
        !            84:                }
        !            85:                if ((p->op==BIC || p->op==BIS) && equstr(regs[RT1], "$0")) {
        !            86:                        if (p->forw->op!=CBR) {
        !            87:                                p->back->forw = p->forw;
        !            88:                                p->forw->back = p->back;
        !            89:                                continue;
        !            90:                        }
        !            91:                }
        !            92:                repladdr(p, 0, flt);
        !            93:                source(regs[RT1]);
        !            94:                dest(regs[RT2], flt);
        !            95:                if (p->op==DIV && (r = isreg(regs[RT2])>=0))
        !            96:                        regs[r+1][0] = 0;
        !            97:                ccloc[0] = 0;
        !            98:                continue;
        !            99: 
        !           100:        case CLRF:
        !           101:        case NEGF:
        !           102:                flt = NREG;
        !           103: 
        !           104:        case CLR:
        !           105:        case COM:
        !           106:        case INC:
        !           107:        case DEC:
        !           108:        case NEG:
        !           109:        case ASR:
        !           110:        case ASL:
        !           111:        case SXT:
        !           112:                singop(p);
        !           113:        sngl:
        !           114:                dest(regs[RT1], flt);
        !           115:                if (p->op==CLR && flt==0)
        !           116:                        if ((r = isreg(regs[RT1])) >= 0)
        !           117:                                savereg(r, "$0");
        !           118:                        else
        !           119:                                setcon("$0", regs[RT1]);
        !           120:                ccloc[0] = 0;
        !           121:                continue;
        !           122: 
        !           123:        case TSTF:
        !           124:                flt = NREG;
        !           125: 
        !           126:        case TST:
        !           127:                singop(p);
        !           128:                repladdr(p, 0, flt);
        !           129:                source(regs[RT1]);
        !           130:                if (equstr(regs[RT1], ccloc)) {
        !           131:                        p->back->forw = p->forw;
        !           132:                        p->forw->back = p->back;
        !           133:                        p = p->back;
        !           134:                        nrtst++;
        !           135:                        nchange++;
        !           136:                }
        !           137:                continue;
        !           138: 
        !           139:        case CMPF:
        !           140:                flt = NREG;
        !           141: 
        !           142:        case CMP:
        !           143:        case BIT:
        !           144:                dualop(p);
        !           145:                source(regs[RT1]);
        !           146:                source(regs[RT2]);
        !           147:                if(p->op==BIT) {
        !           148:                        if (equstr(regs[RT1], "$-1") || equstr(regs[RT1], "$177777")) {
        !           149:                                p->op = TST;
        !           150:                                strcpy(regs[RT1], regs[RT2]);
        !           151:                                regs[RT2][0] = 0;
        !           152:                                p->code = copy(1, regs[RT1]);
        !           153:                                nchange++;
        !           154:                                nsaddr++;
        !           155:                        } else if (equstr(regs[RT2], "$-1") || equstr(regs[RT2], "$177777")) {
        !           156:                                p->op = TST;
        !           157:                                regs[RT2][0] = 0;
        !           158:                                p->code = copy(1, regs[RT1]);
        !           159:                                nchange++;
        !           160:                                nsaddr++;
        !           161:                        }
        !           162:                        if (equstr(regs[RT1], "$0")) {
        !           163:                                p->op = TST;
        !           164:                                regs[RT2][0] = 0;
        !           165:                                p->code = copy(1, regs[RT1]);
        !           166:                                nchange++;
        !           167:                                nsaddr++;
        !           168:                        } else if (equstr(regs[RT2], "$0")) {
        !           169:                                p->op = TST;
        !           170:                                strcpy(regs[RT1], regs[RT2]);
        !           171:                                regs[RT2][0] = 0;
        !           172:                                p->code = copy(1, regs[RT1]);
        !           173:                                nchange++;
        !           174:                                nsaddr++;
        !           175:                        }
        !           176:                }
        !           177:                repladdr(p, 1, flt);
        !           178:                ccloc[0] = 0;
        !           179:                continue;
        !           180: 
        !           181:        case CBR:
        !           182:                r = -1;
        !           183:                if (p->back->op==TST || p->back->op==CMP) {
        !           184:                        if (p->back->op==TST) {
        !           185:                                singop(p->back);
        !           186:                                savereg(RT2, "$0");
        !           187:                        } else
        !           188:                                dualop(p->back);
        !           189:                        if (equstr(regs[RT1], regs[RT2])
        !           190:                         && natural(regs[RT1]) && natural(regs[RT2]))
        !           191:                                r = compare(p->subop, "$1", "$1");
        !           192:                        else
        !           193:                                r = compare(p->subop, findcon(RT1), findcon(RT2));
        !           194:                        if (r==0) {
        !           195:                                if (p->forw->op==CBR
        !           196:                                  || p->forw->op==SXT
        !           197:                                  || p->forw->op==CFCC) {
        !           198:                                        p->back->forw = p->forw;
        !           199:                                        p->forw->back = p->back;
        !           200:                                } else {
        !           201:                                        p->back->back->forw = p->forw;
        !           202:                                        p->forw->back = p->back->back;
        !           203:                                }
        !           204:                                decref(p->ref);
        !           205:                                p = p->back->back;
        !           206:                                nchange++;
        !           207:                        } else if (r>0) {
        !           208:                                p->op = JBR;
        !           209:                                p->subop = 0;
        !           210:                                p->back->back->forw = p;
        !           211:                                p->back = p->back->back;
        !           212:                                p = p->back;
        !           213:                                nchange++;
        !           214:                        }
        !           215:                }
        !           216:        case CFCC:
        !           217:                ccloc[0] = 0;
        !           218:                continue;
        !           219: 
        !           220:        case JBR:
        !           221:                redunbr(p);
        !           222: 
        !           223:        default:
        !           224:                clearreg();
        !           225:        }
        !           226:        }
        !           227: }
        !           228: 
        !           229: jumpsw()
        !           230: {
        !           231:        register struct node *p, *p1;
        !           232:        register t;
        !           233:        register struct node *tp;
        !           234:        int nj;
        !           235: 
        !           236:        t = 0;
        !           237:        nj = 0;
        !           238:        for (p=first.forw; p!=0; p = p->forw)
        !           239:                p->refc = ++t;
        !           240:        for (p=first.forw; p!=0; p = p1) {
        !           241:                p1 = p->forw;
        !           242:                if (p->op == CBR && p1->op==JBR && p->ref && p1->ref
        !           243:                 && abs(p->refc - p->ref->refc) > abs(p1->refc - p1->ref->refc)) {
        !           244:                        if (p->ref==p1->ref)
        !           245:                                continue;
        !           246:                        p->subop = revbr[p->subop];
        !           247:                        tp = p1->ref;
        !           248:                        p1->ref = p->ref;
        !           249:                        p->ref = tp;
        !           250:                        t = p1->labno;
        !           251:                        p1->labno = p->labno;
        !           252:                        p->labno = t;
        !           253:                        nrevbr++;
        !           254:                        nj++;
        !           255:                }
        !           256:        }
        !           257:        return(nj);
        !           258: }
        !           259: 
        !           260: addsob()
        !           261: {
        !           262:        register struct node *p, *p1;
        !           263: 
        !           264:        for (p = &first; (p1 = p->forw)!=0; p = p1) {
        !           265:                if (p->op==DEC && isreg(p->code)>=0
        !           266:                 && p1->op==CBR && p1->subop==JNE) {
        !           267:                        if (p->refc < p1->ref->refc)
        !           268:                                continue;
        !           269:                        if (toofar(p1))
        !           270:                                continue;
        !           271:                        p->labno = p1->labno;
        !           272:                        p->op = SOB;
        !           273:                        p->subop = 0;
        !           274:                        p1->forw->back = p;
        !           275:                        p->forw = p1->forw;
        !           276:                        nsob++;
        !           277:                }
        !           278:        }
        !           279: }
        !           280: 
        !           281: toofar(p)
        !           282: struct node *p;
        !           283: {
        !           284:        register struct node *p1;
        !           285:        int len;
        !           286: 
        !           287:        len = 0;
        !           288:        for (p1 = p->ref; p1 && p1!=p; p1 = p1->forw)
        !           289:                len += ilen(p1);
        !           290:        if (len < 128)
        !           291:                return(0);
        !           292:        return(1);
        !           293: }
        !           294: 
        !           295: ilen(p)
        !           296: register struct node *p;
        !           297: {
        !           298: 
        !           299:        switch (p->op) {
        !           300:        case LABEL:
        !           301:        case DLABEL:
        !           302:        case TEXT:
        !           303:        case EROU:
        !           304:        case EVEN:
        !           305:                return(0);
        !           306: 
        !           307:        case CBR:
        !           308:                return(6);
        !           309: 
        !           310:        default:
        !           311:                dualop(p);
        !           312:                return(2 + adrlen(regs[RT1]) + adrlen(regs[RT2]));
        !           313:        }
        !           314: }
        !           315: 
        !           316: adrlen(s)
        !           317: register char *s;
        !           318: {
        !           319:        if (*s == 0)
        !           320:                return(0);
        !           321:        if (*s=='r')
        !           322:                return(0);
        !           323:        if (*s=='(' && *(s+1)=='r')
        !           324:                return(0);
        !           325:        if (*s=='-' && *(s+1)=='(')
        !           326:                return(0);
        !           327:        return(2);
        !           328: }
        !           329: 
        !           330: abs(x)
        !           331: {
        !           332:        return(x<0? -x: x);
        !           333: }
        !           334: 
        !           335: equop(ap1, p2)
        !           336: struct node *ap1, *p2;
        !           337: {
        !           338:        register char *cp1, *cp2;
        !           339:        register struct node *p1;
        !           340: 
        !           341:        p1 = ap1;
        !           342:        if (p1->op!=p2->op || p1->subop!=p2->subop)
        !           343:                return(0);
        !           344:        if (p1->op>0 && p1->op<MOV)
        !           345:                return(0);
        !           346:        cp1 = p1->code;
        !           347:        cp2 = p2->code;
        !           348:        if (cp1==0 && cp2==0)
        !           349:                return(1);
        !           350:        if (cp1==0 || cp2==0)
        !           351:                return(0);
        !           352:        while (*cp1 == *cp2++)
        !           353:                if (*cp1++ == 0)
        !           354:                        return(1);
        !           355:        return(0);
        !           356: }
        !           357: 
        !           358: decref(p)
        !           359: register struct node *p;
        !           360: {
        !           361:        if (--p->refc <= 0) {
        !           362:                nrlab++;
        !           363:                p->back->forw = p->forw;
        !           364:                p->forw->back = p->back;
        !           365:        }
        !           366: }
        !           367: 
        !           368: struct node *
        !           369: nonlab(p)
        !           370: struct node *p;
        !           371: {
        !           372:        CHECK(10);
        !           373:        while (p && p->op==LABEL)
        !           374:                p = p->forw;
        !           375:        return(p);
        !           376: }
        !           377: 
        !           378: char *
        !           379: alloc(n)
        !           380: register n;
        !           381: {
        !           382:        register char *p;
        !           383: 
        !           384: #define round(a,b) ((((a)+(b)-1)/(b))*(b))
        !           385:        n=round(n,sizeof(char *));
        !           386:        if (alasta+n < alastr) {
        !           387:                p = alasta;
        !           388:                alasta += n;
        !           389:                return(p);
        !           390:        }
        !           391:        if (lasta+n >= lastr) {
        !           392:                if (sbrk(2000) == (char *)-1) {
        !           393:                        fprintf(stderr, "C Optimizer: out of space\n");
        !           394:                        exit(1);
        !           395:                }
        !           396:                lastr += 2000;
        !           397:        }
        !           398:        p = lasta;
        !           399:        lasta += n;
        !           400:        return(p);
        !           401: }
        !           402: 
        !           403: clearreg()
        !           404: {
        !           405:        register int i;
        !           406: 
        !           407:        for (i=0; i<2*NREG; i++)
        !           408:                regs[i][0] = '\0';
        !           409:        conloc[0] = 0;
        !           410:        ccloc[0] = 0;
        !           411: }
        !           412: 
        !           413: savereg(ai, as)
        !           414: char *as;
        !           415: {
        !           416:        register char *p, *s, *sp;
        !           417: 
        !           418:        sp = p = regs[ai];
        !           419:        s = as;
        !           420:        if (source(s))
        !           421:                return;
        !           422:        while (*p++ = *s) {
        !           423:                if (s[0]=='(' && s[1]=='r' && s[2]<'5') {
        !           424:                        *sp = 0;
        !           425:                        return;
        !           426:                }
        !           427:                if (*s++ == ',')
        !           428:                        break;
        !           429:        }
        !           430:        *--p = '\0';
        !           431: }
        !           432: 
        !           433: dest(as, flt)
        !           434: char *as;
        !           435: {
        !           436:        register char *s;
        !           437:        register int i;
        !           438: 
        !           439:        s = as;
        !           440:        source(s);
        !           441:        if ((i = isreg(s)) >= 0)
        !           442:                regs[i+flt][0] = 0;
        !           443:        for (i=0; i<NREG+NREG; i++)
        !           444:                if (*regs[i]=='*' && equstr(s, regs[i]+1))
        !           445:                        regs[i][0] = 0;
        !           446:        if (equstr(s, conloc))
        !           447:                conloc[0] = '\0';
        !           448:        while ((i = findrand(s, flt)) >= 0)
        !           449:                regs[i][0] = 0;
        !           450:        while (*s) {
        !           451:                if ((*s=='(' && (*(s+1)!='r' || *(s+2)!='5')) || *s++=='*') {
        !           452:                        for (i=0; i<NREG+NREG; i++) {
        !           453:                                if (regs[i][0] != '$')
        !           454:                                        regs[i][0] = 0;
        !           455:                                conloc[0] = 0;
        !           456:                        }
        !           457:                        return;
        !           458:                }
        !           459:        }
        !           460: }
        !           461: 
        !           462: singop(ap)
        !           463: struct node *ap;
        !           464: {
        !           465:        register char *p1, *p2;
        !           466: 
        !           467:        p1 = ap->code;
        !           468:        p2 = regs[RT1];
        !           469:        while (*p2++ = *p1++);
        !           470:        regs[RT2][0] = 0;
        !           471: }
        !           472: 
        !           473: 
        !           474: dualop(ap)
        !           475: struct node *ap;
        !           476: {
        !           477:        register char *p1, *p2;
        !           478:        register struct node *p;
        !           479: 
        !           480:        p = ap;
        !           481:        p1 = p->code;
        !           482:        p2 = regs[RT1];
        !           483:        while (*p1 && *p1!=',')
        !           484:                *p2++ = *p1++;
        !           485:        *p2++ = 0;
        !           486:        p2 = regs[RT2];
        !           487:        *p2 = 0;
        !           488:        if (*p1++ !=',')
        !           489:                return;
        !           490:        while (*p1==' ' || *p1=='\t')
        !           491:                p1++;
        !           492:        while (*p2++ = *p1++)
        !           493:                ;
        !           494: }
        !           495: 
        !           496: findrand(as, flt)
        !           497: char *as;
        !           498: {
        !           499:        register int i;
        !           500:        for (i = flt; i<NREG+flt; i++) {
        !           501:                if (equstr(regs[i], as))
        !           502:                        return(i);
        !           503:        }
        !           504:        return(-1);
        !           505: }
        !           506: 
        !           507: isreg(as)
        !           508: char *as;
        !           509: {
        !           510:        register char *s;
        !           511: 
        !           512:        s = as;
        !           513:        if (s[0]=='r' && s[1]>='0' && s[1]<='4' && s[2]==0)
        !           514:                return(s[1]-'0');
        !           515:        return(-1);
        !           516: }
        !           517: 
        !           518: check()
        !           519: {
        !           520:        register struct node *p, *lp;
        !           521:        register count;
        !           522: 
        !           523:        lp = &first;
        !           524:        count = 0;
        !           525:        for (p=first.forw; p!=0; p = p->forw) {
        !           526:                if (++count > 10000)
        !           527:                        abort(0);
        !           528:                if (p->back != lp)
        !           529:                        abort(1);
        !           530:                lp = p;
        !           531:        }
        !           532: }
        !           533: 
        !           534: source(ap)
        !           535: char *ap;
        !           536: {
        !           537:        register char *p1, *p2;
        !           538: 
        !           539:        p1 = ap;
        !           540:        p2 = p1;
        !           541:        if (*p1==0)
        !           542:                return(0);
        !           543:        while (*p2++);
        !           544:        if (*p1=='-' && *(p1+1)=='('
        !           545:         || *p1=='*' && *(p1+1)=='-' && *(p1+2)=='('
        !           546:         || *(p2-2)=='+') {
        !           547:                while (*p1 && *p1++!='r');
        !           548:                if (*p1>='0' && *p1<='4')
        !           549:                        regs[*p1 - '0'][0] = 0;
        !           550:                return(1);
        !           551:        }
        !           552:        return(0);
        !           553: }
        !           554: 
        !           555: repladdr(p, f, flt)
        !           556: struct node *p;
        !           557: {
        !           558:        register r;
        !           559:        int r1;
        !           560:        register char *p1, *p2;
        !           561:        static char rt1[50], rt2[50];
        !           562: 
        !           563:        if (f)
        !           564:                r1 = findrand(regs[RT2], flt);
        !           565:        else
        !           566:                r1 = -1;
        !           567:        r = findrand(regs[RT1], flt);
        !           568:        if (r1 >= NREG)
        !           569:                r1 -= NREG;
        !           570:        if (r >= NREG)
        !           571:                r -= NREG;
        !           572:        if (r>=0 || r1>=0) {
        !           573:                p2 = regs[RT1];
        !           574:                for (p1 = rt1; *p1++ = *p2++;);
        !           575:                if (regs[RT2][0]) {
        !           576:                        p1 = rt2;
        !           577:                        *p1++ = ',';
        !           578:                        for (p2 = regs[RT2]; *p1++ = *p2++;);
        !           579:                } else
        !           580:                        rt2[0] = 0;
        !           581:                if (r>=0) {
        !           582:                        rt1[0] = 'r';
        !           583:                        rt1[1] = r + '0';
        !           584:                        rt1[2] = 0;
        !           585:                        nsaddr++;
        !           586:                }
        !           587:                if (r1>=0) {
        !           588:                        rt2[1] = 'r';
        !           589:                        rt2[2] = r1 + '0';
        !           590:                        rt2[3] = 0;
        !           591:                        nsaddr++;
        !           592:                }
        !           593:                p->code = copy(2, rt1, rt2);
        !           594:        }
        !           595: }
        !           596: 
        !           597: movedat()
        !           598: {
        !           599:        register struct node *p1, *p2;
        !           600:        struct node *p3;
        !           601:        register seg;
        !           602:        struct node data;
        !           603:        struct node *datp;
        !           604: 
        !           605:        if (first.forw == 0)
        !           606:                return;
        !           607:        if (lastseg != TEXT && lastseg != -1) {
        !           608:                p1 = (struct node *)alloc(sizeof(first));
        !           609:                p1->op = lastseg;
        !           610:                p1->subop = 0;
        !           611:                p1->code = NULL;
        !           612:                p1->forw = first.forw;
        !           613:                p1->back = &first;
        !           614:                first.forw->back = p1;
        !           615:                first.forw = p1;
        !           616:        }
        !           617:        datp = &data;
        !           618:        for (p1 = first.forw; p1!=0; p1 = p1->forw) {
        !           619:                if (p1->op == DATA) {
        !           620:                        p2 = p1->forw;
        !           621:                        while (p2 && p2->op!=TEXT)
        !           622:                                p2 = p2->forw;
        !           623:                        if (p2==0)
        !           624:                                break;
        !           625:                        p3 = p1->back;
        !           626:                        p1->back->forw = p2->forw;
        !           627:                        p2->forw->back = p3;
        !           628:                        p2->forw = 0;
        !           629:                        datp->forw = p1;
        !           630:                        p1->back = datp;
        !           631:                        p1 = p3;
        !           632:                        datp = p2;
        !           633:                }
        !           634:        }
        !           635:        if (data.forw) {
        !           636:                datp->forw = first.forw;
        !           637:                first.forw->back = datp;
        !           638:                data.forw->back = &first;
        !           639:                first.forw = data.forw;
        !           640:        }
        !           641:        seg = lastseg;
        !           642:        for (p1 = first.forw; p1!=0; p1 = p1->forw) {
        !           643:                if (p1->op==TEXT||p1->op==DATA||p1->op==BSS) {
        !           644:                        if (p2 = p1->forw) {
        !           645:                                if (p2->op==TEXT||p2->op==DATA||p2->op==BSS)
        !           646:                                        p1->op  = p2->op;
        !           647:                        }
        !           648:                        if (p1->op == seg || p1->forw&&p1->forw->op==seg) {
        !           649:                                p1->back->forw = p1->forw;
        !           650:                                p1->forw->back = p1->back;
        !           651:                                p1 = p1->back;
        !           652:                                continue;
        !           653:                        }
        !           654:                        seg = p1->op;
        !           655:                }
        !           656:        }
        !           657: }
        !           658: 
        !           659: redunbr(p)
        !           660: register struct node *p;
        !           661: {
        !           662:        register struct node *p1;
        !           663:        register char *ap1;
        !           664:        char *ap2;
        !           665: 
        !           666:        if ((p1 = p->ref) == 0)
        !           667:                return;
        !           668:        p1 = nonlab(p1);
        !           669:        if (p1->op==TST) {
        !           670:                singop(p1);
        !           671:                savereg(RT2, "$0");
        !           672:        } else if (p1->op==CMP)
        !           673:                dualop(p1);
        !           674:        else
        !           675:                return;
        !           676:        if (p1->forw->op!=CBR)
        !           677:                return;
        !           678:        ap1 = findcon(RT1);
        !           679:        ap2 = findcon(RT2);
        !           680:        p1 = p1->forw;
        !           681:        if (compare(p1->subop, ap1, ap2)>0) {
        !           682:                nredunj++;
        !           683:                nchange++;
        !           684:                decref(p->ref);
        !           685:                p->ref = p1->ref;
        !           686:                p->labno = p1->labno;
        !           687:                p->ref->refc++;
        !           688:        }
        !           689: }
        !           690: 
        !           691: char *
        !           692: findcon(i)
        !           693: {
        !           694:        register char *p;
        !           695:        register r;
        !           696: 
        !           697:        p = regs[i];
        !           698:        if (*p=='$')
        !           699:                return(p);
        !           700:        if ((r = isreg(p)) >= 0)
        !           701:                return(regs[r]);
        !           702:        if (equstr(p, conloc))
        !           703:                return(conval);
        !           704:        return(p);
        !           705: }
        !           706: 
        !           707: compare(oper, cp1, cp2)
        !           708: register char *cp1, *cp2;
        !           709: {
        !           710:        register unsigned n1, n2;
        !           711: 
        !           712:        if (*cp1++ != '$' || *cp2++ != '$')
        !           713:                return(-1);
        !           714:        n1 = 0;
        !           715:        while (*cp2 >= '0' && *cp2 <= '7') {
        !           716:                n1 <<= 3;
        !           717:                n1 += *cp2++ - '0';
        !           718:        }
        !           719:        n2 = n1;
        !           720:        n1 = 0;
        !           721:        while (*cp1 >= '0' && *cp1 <= '7') {
        !           722:                n1 <<= 3;
        !           723:                n1 += *cp1++ - '0';
        !           724:        }
        !           725:        if (*cp1=='+')
        !           726:                cp1++;
        !           727:        if (*cp2=='+')
        !           728:                cp2++;
        !           729:        do {
        !           730:                if (*cp1++ != *cp2)
        !           731:                        return(-1);
        !           732:        } while (*cp2++);
        !           733:        switch(oper) {
        !           734: 
        !           735:        case JEQ:
        !           736:                return(n1 == n2);
        !           737:        case JNE:
        !           738:                return(n1 != n2);
        !           739:        case JLE:
        !           740:                return((int)n1 <= (int)n2);
        !           741:        case JGE:
        !           742:                return((int)n1 >= (int)n2);
        !           743:        case JLT:
        !           744:                return((int)n1 < (int)n2);
        !           745:        case JGT:
        !           746:                return((int)n1 > (int)n2);
        !           747:        case JLO:
        !           748:                return(n1 < n2);
        !           749:        case JHI:
        !           750:                return(n1 > n2);
        !           751:        case JLOS:
        !           752:                return(n1 <= n2);
        !           753:        case JHIS:
        !           754:                return(n1 >= n2);
        !           755:        }
        !           756:        return(-1);
        !           757: }
        !           758: 
        !           759: setcon(ar1, ar2)
        !           760: char *ar1, *ar2;
        !           761: {
        !           762:        register char *cl, *cv, *p;
        !           763: 
        !           764:        cl = ar2;
        !           765:        cv = ar1;
        !           766:        if (*cv != '$')
        !           767:                return;
        !           768:        if (!natural(cl))
        !           769:                return;
        !           770:        p = conloc;
        !           771:        while (*p++ = *cl++);
        !           772:        p = conval;
        !           773:        while (*p++ = *cv++);
        !           774: }
        !           775: 
        !           776: equstr(ap1, ap2)
        !           777: char *ap1, *ap2;
        !           778: {
        !           779:        char *p1, *p2;
        !           780: 
        !           781:        p1 = ap1;
        !           782:        p2 = ap2;
        !           783:        do {
        !           784:                if (*p1++ != *p2)
        !           785:                        return(0);
        !           786:        } while (*p2++);
        !           787:        return(1);
        !           788: }
        !           789: 
        !           790: setcc(ap)
        !           791: char *ap;
        !           792: {
        !           793:        register char *p, *p1;
        !           794: 
        !           795:        p = ap;
        !           796:        if (!natural(p)) {
        !           797:                ccloc[0] = 0;
        !           798:                return;
        !           799:        }
        !           800:        p1 = ccloc;
        !           801:        while (*p1++ = *p++);
        !           802: }
        !           803: 
        !           804: natural(ap)
        !           805: char *ap;
        !           806: {
        !           807:        register char *p;
        !           808: 
        !           809:        p = ap;
        !           810:        if (*p=='*' || *p=='(' || *p=='-'&&*(p+1)=='(')
        !           811:                return(0);
        !           812:        while (*p++);
        !           813:        p--;
        !           814:        if (*--p == '+' || *p ==')' && *--p != '5')
        !           815:                return(0);
        !           816:        return(1);
        !           817: }

unix.superglobalmegacorp.com

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