Annotation of cci/usr/src/lib/fc2/c22.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * C object code improver-- third part
                      3:  */
                      4: 
                      5: #include "c2.h"
                      6: #include <stdio.h>
                      7: #include <ctype.h>
                      8: 
                      9: rmove()
                     10: {
                     11:        register struct node *p;
                     12:        register int r, r1;
                     13: 
                     14:        clearreg();
                     15:        for (p=first.forw; p!=0; p = p->forw) {
                     16:        if (debug) {
                     17:                printf("Regs: ");
                     18:                for (r=0; r<=NREG; r++)
                     19:                        if (regs[r][0]) {
                     20:                                r1=regs[r][0];
                     21:                                printf("%d: %d%d %s\n", r, r1&0xF, r1>>4, regs[r]+1);
                     22:                        }
                     23:                printf("-\n");
                     24:        }
                     25:        switch (p->op) {
                     26: 
                     27:        case CVT:
                     28:        case MOVZ:
                     29:                splitrand(p);
                     30:                repladdr(p);
                     31:                r = isreg(regs[RT1]);
                     32:                r1 = isreg(regs[RT2]);
                     33:                dest(regs[RT2],p->subop, 1);
                     34:                if (r>=0 && r1>=0) {
                     35:                        p->op = MOV; p->subop = LONG;
                     36:                        p->pop = 0;
                     37:                        nchange++;
                     38:                        goto case_mov;
                     39:                }
                     40:                if(p->op == CVT) {
                     41:                        if (r1>=0) savereg(r1, regs[RT1], p->subop);
                     42:                } else
                     43:                        ccloc[0] = 0;
                     44:                break;
                     45: 
                     46:        case MOV:
                     47:        case_mov:
                     48:                splitrand(p);
                     49:                if ((r = findrand(regs[RT1],p->subop)) >= 0) {
                     50:                        if (r == isreg(regs[RT2]))
                     51:                                if(p->forw->op!=CBR) {
                     52:                                        delnode(p); redunm++; nchange++; break;
                     53:                                } else {
                     54:                                        p->op=TST; p->pop=0;
                     55:                                        while(*p->code++ != ',');
                     56:                                        redunm++; nchange++;
                     57:                                        goto case_tst;
                     58:                                }
                     59:                }
                     60:                repladdr(p);
                     61:                r = isreg(regs[RT1]);
                     62:                r1 = isreg(regs[RT2]);
                     63:                dest(regs[RT2],p->subop, 1);
                     64:                if ((regs[ACC][0]) && equstr(regs[RT2],regs[ACC]+1)) {
                     65:                 *(short *)(regs[ACC]) = 0;}
                     66: 
                     67:                if (r>=0) {
                     68:                        if (r1>=0) {
                     69:                                if (r == r1 && p->forw->op!=CBR) {
                     70:                                        delnode(p); redunm++; nchange++; break;
                     71:                                }
                     72:                                if(regs[r][0])
                     73:                                        savereg(r1, regs[r]+1, p->subop);
                     74:                        } else savereg(r, regs[RT2], p->subop);
                     75:                } else if (r1>=0) savereg(r1, regs[RT1], p->subop);
                     76:                else setcon(regs[RT1], regs[RT2], p->subop);
                     77:                break;
                     78: 
                     79: /* .rx,.wx or .rx,.rx,.wx */
                     80:        case ADD:
                     81:        case SUB:
                     82:        case AND:
                     83:        case OR:
                     84:        case XOR:
                     85:        case MUL:
                     86:        case DIV:
                     87: #ifdef EMOD
                     88:        case EDIV:
                     89:        case EMOD:
                     90: #endif EMOD
                     91:        case SHAL:
                     92:        case SHAR:
                     93:        case SHL:
                     94:        case SHR:
                     95:        case ADDA:
                     96:        case SUBA:
                     97: /* .rx,.wx */
                     98:        case MFPR:
                     99:        case COM:
                    100:        case NEG:
                    101:                splitrand(p);
                    102:                repladdr(p);
                    103:                dest(lastrand,p->subop, p->op!=ADDA && p->op!=SUBA);
                    104:                break;
                    105: 
                    106: /* .mx or .wx */
                    107:        case STF:
                    108:                if(equstr(p->code, regs[ACC]+1) && p->subop==regs[ACC][0]) {
                    109:                        delnode(p);
                    110:                        nst++; nchange++; break;
                    111:                }
                    112:                savereg(ACC, p->code, p->subop);
                    113:        case CLR:
                    114:        case INC:
                    115:        case DEC:
                    116:        case CVFL:
                    117:                dest(p->code,p->subop, 1);
                    118:                if (p->op==CLR)
                    119:                        if ((r = isreg(p->code)) >= 0)
                    120:                                savereg(r, "$0", p->subop);
                    121:                        else
                    122:                                setcon("$0", p->code, p->subop);
                    123:                break;
                    124: 
                    125: /* .rx */
                    126:        case LDF:
                    127:                if(equstr(p->code, regs[ACC]+1) && p->subop==regs[ACC][0]) {
                    128:                        delnode(p);
                    129:                        nld++; nchange++; break;
                    130:                }
                    131:                savereg(ACC, p->code, p->subop);
                    132:                goto case_tst;
                    133:        case LNF:
                    134:                if(equstr(p->code, regs[ACC]+1) && p->subop==regs[ACC][0]) {
                    135:                        p->op = NEGF; p->pop = 0; p->code = 0;
                    136:                        regs[ACC][0] = 0;
                    137:                        break;
                    138:                }
                    139:        case CVLF:
                    140:        case LDFD:
                    141:        case ADDF:
                    142:        case SUBF:
                    143:        case MULF:
                    144:        case DIVF:
                    145:                regs[ACC][0] = 0;
                    146:        case TST:
                    147:        case_tst:
                    148:        case PUSH:
                    149:                splitrand(p);
                    150:                lastrand=regs[RT1+1]; /* fool repladdr into doing 1 operand */
                    151:                repladdr(p);
                    152:                lastrand=regs[RT1];
                    153:                if (p->op==TST && equstr(lastrand, ccloc+1)
                    154:                  && ((0xf&(ccloc[0]>>4))==p->subop || equtype(ccloc[0],p->subop))) {
                    155:                        delnode(p); nrtst++; nchange++; break;
                    156:                }
                    157:                if (p->op==PUSH && p->subop!=LONG &&
                    158:                 (isreg(lastrand)>=0 || *lastrand=='$')) {
                    159:                        p->subop = LONG;
                    160:                        p->pop = 0;
                    161:                        nchange++;
                    162:                }
                    163:                if (p->op==TST || p->op==PUSH)
                    164:                        setcc(lastrand,p->subop);
                    165:                break;
                    166: 
                    167: /* .rx,.rx,.rx */
                    168:        case PROBE:
                    169:        case CASE:
                    170: /* .rx,.rx */
                    171:        case MTPR:
                    172:        case CALLS:
                    173:        case CALLF:
                    174:        case CMP:
                    175:        case BIT:
                    176:        case CMPF:
                    177:        case CMPF2:
                    178:                splitrand(p);
                    179:                /* fool repladdr into doing right number of operands */
                    180:                lastrand=byondrd(p);
                    181:                if (p->op==CALLF || p->op==CALLS) clearreg();
                    182:                else repladdr(p);
                    183:        case TSTF:
                    184:                ccloc[0]=0;
                    185:        case PUSHD:
                    186:                break;
                    187: 
                    188: /* acc only */
                    189:        case CVDF:
                    190:        case NEGF:
                    191:        case SINF:
                    192:        case COSF:
                    193:        case ATANF:
                    194:        case LOGF:
                    195:        case SQRTF:
                    196:        case EXPF:
                    197:                regs[ACC][0] = 0;
                    198:                break;
                    199: 
                    200: #ifndef EMOD
                    201: /* .rx,.rx,.wx,.wx */
                    202:        case EDIV:
                    203:                splitrand(p);
                    204:                lastrand = regs[RT3];
                    205:                repladdr(p);
                    206:                dest(regs[RT3], p->subop, 1);
                    207:                dest(regs[RT4], p->subop, 0);
                    208:                break;
                    209: #endif EMOD
                    210: 
                    211: /* .rx,.rx,.rx,wx */
                    212:        case EMUL:
                    213:                splitrand(p);
                    214:                lastrand = regs[RT4];
                    215:                repladdr(p);
                    216:                dest(regs[RT4],QUAD, 1); /* fourth operand is a quad */
                    217:                break;
                    218:        case CBR:
                    219:                if (p->subop>=JBC) {
                    220:                        splitrand(p);
                    221:                        lastrand=regs[RT3]; /* 2 operands can be optimized */
                    222:                        repladdr(p);
                    223:                        ccloc[0] = 0;
                    224:                } else
                    225:                        reduncbr(p);
                    226:                break;
                    227: 
                    228:        case JBR:
                    229:                redunbr(p);
                    230: 
                    231:        default:
                    232:                clearreg();
                    233:        }
                    234:        }
                    235: }
                    236: 
                    237: jumpsw()
                    238: {
                    239:        register struct node *p, *p1, *pt;
                    240:        register int t, nj;
                    241: 
                    242:        t = 0;
                    243:        nj = 0;
                    244:        for (p=first.forw; p!=0; p = p->forw)
                    245:                p->seq = ++t;
                    246:        for (p=first.forw; p!=0; p = p1) {
                    247:                p1 = p->forw;
                    248:                if (p->op == CBR && p1->op==JBR && p->ref && p1->ref
                    249:                 && abs(p->seq - p->ref->seq) > abs(p1->seq - p1->ref->seq)) {
                    250:                        if (p->ref==p1->ref)
                    251:                                continue;
                    252:                        p->subop = revbr[p->subop];
                    253:                        p->pop=0;
                    254:                        pt = p1->ref;
                    255:                        p1->ref = p->ref;
                    256:                        p->ref = pt;
                    257:                        t = p1->labno;
                    258:                        p1->labno = p->labno;
                    259:                        p->labno = t;
                    260: #ifdef COPYCODE
                    261:                        if (p->labno == 0) {
                    262:                                pt = (struct node *)p1->code; p1->code = p->code; p->code = (char *)pt;
                    263:                        }
                    264: #endif
                    265:                        nrevbr++;
                    266:                        nj++;
                    267:                }
                    268:        }
                    269:        return(nj);
                    270: }
                    271: 
                    272: addaob()
                    273: {
                    274:        register struct node *p, *p1, *p2, *p3;
                    275: 
                    276:        for (p = &first; (p1 = p->forw)!=0; p = p1) {
                    277:        if (p->op==INC && p->subop==LONG) {
                    278:                if (p1->op==LABEL && p1->refc==1 && p1->forw->op==CMP && p1->forw->subop==LONG
                    279:                  && (p2=p1->forw->forw)->op==CBR && p2->subop==JLE
                    280:                  && (p3=p2->ref->back)->op==JBR && p3->subop==0 && p3->ref==p1
                    281:                  && p3->forw->op==LABEL && p3->forw==p2->ref) {
                    282:                        /* change       INC LAB: CMP    to      LAB: INC CMP */
                    283:                        p->back->forw=p1; p1->back=p->back;
                    284:                        p->forw=p1->forw; p1->forw->back=p;
                    285:                        p->back=p1; p1->forw=p;
                    286:                        p1=p->forw;
                    287:                        /* adjust beginning value by 1 */
                    288:                        p2=alloc(sizeof first); p2->op = DEC; p2->subop = LONG;
                    289:                        p2->pop=0;
                    290:                        p2->forw=p3; p2->back=p3->back; p3->back->forw=p2;
                    291:                        p3->back=p2; p2->code=p->code; p2->labno=0;
                    292:                }
                    293:                if (p1->op==CMP && p1->subop==LONG &&
                    294:                  (p2=p1->forw)->op==CBR && p2->forw->op!=CBR) {
                    295:                        register char *cp1,*cp2;
                    296:                        splitrand(p1); if (!equstr(p->code,regs[RT1])) continue;
                    297:                        if (p2->subop==JLE || p2->subop==JLT) {
                    298:                                if (p2->subop==JLE) p->op = AOBLEQ; else p->op = AOBLSS; p->subop = 0;
                    299:                                cp2=regs[RT1]; cp1=regs[RT2]; while (*cp2++= *cp1++); /* limit */
                    300:                                cp2=regs[RT2]; cp1=p->code; while (*cp2++= *cp1++); /* index */
                    301:                                p->pop=0; newcode(p);
                    302:                                p->labno = p2->labno; delnode(p2); delnode(p1); naob++;
                    303:                        }
                    304:                }
                    305:        }
                    306:        }
                    307: }
                    308: 
                    309: ispow2(n) register long n; {/* -1 -> no; else -> log to base 2 */
                    310:        register int log;
                    311:        if (n==0 || n&(n-1)) return(-1); log=0;
                    312:        for (;;) {n >>= 1; if (n==0) return(log); ++log; if (n== -1) return(log);}
                    313: }
                    314: 
                    315: equop(p1, p2)
                    316: register struct node *p1, *p2;
                    317: {
                    318:        register char *cp1, *cp2;
                    319: 
                    320:        if (p1->op != p2->op || p1->subop != p2->subop)
                    321:                return(0);
                    322:        if (p1->op>0 && p1->op<MOV)
                    323:                return(0);
                    324:        if (p1->op==MOVA && p1->labno!=p2->labno) return(0);
                    325:        cp1 = p1->code;
                    326:        cp2 = p2->code;
                    327:        if (cp1==0 && cp2==0)
                    328:                return(1);
                    329:        if (cp1==0 || cp2==0)
                    330:                return(0);
                    331:        while (*cp1 == *cp2++)
                    332:                if (*cp1++ == 0)
                    333:                        return(1);
                    334:        return(0);
                    335: }
                    336: 
                    337: delnode(p) register struct node *p; {
                    338:        p->back->forw = p->forw;
                    339:        p->forw->back = p->back;
                    340: }
                    341: 
                    342: decref(p)
                    343: register struct node *p;
                    344: {
                    345:        if (p && --p->refc <= 0) {
                    346:                nrlab++; nchange++;
                    347:                delnode(p);
                    348:        }
                    349: }
                    350: 
                    351: struct node *
                    352: nonlab(ap)
                    353: struct node *ap;
                    354: {
                    355:        register struct node *p;
                    356: 
                    357:        p = ap;
                    358:        while (p && p->op==LABEL)
                    359:                p = p->forw;
                    360:        return(p);
                    361: }
                    362: 
                    363: clearuse() {
                    364:        register struct node **i;
                    365:        for (i=uses+NUSE; i>uses;) *--i=0;
                    366:        useacc = 0;
                    367: }
                    368: 
                    369: clearreg() {
                    370:        register char **i;
                    371:        for (i=regs+NREG+1; i>regs;){ **--i=0; **i=0; }
                    372:        conloc[0] = 0; ccloc[0] = 0;
                    373: }
                    374: 
                    375: savereg(ai, s, type)
                    376: register char *s;
                    377: {
                    378:        register char *p, *sp;
                    379: 
                    380:        sp = p = regs[ai];
                    381:        /* if any indexing, must be parameter or local */
                    382:        /* indirection (as in "*-4(fp)") is ok, however */
                    383:        *p++ = type;
                    384:        if (*s=='*' || *s=='$')
                    385:                *p++ = *s++;
                    386:        if (natural(s))
                    387:                strcpy(p, s);
                    388:        else {*sp = 0; return;}
                    389: }
                    390: 
                    391: dest(s,type, ccflg)
                    392: register char *s;
                    393: {
                    394:        register int i;
                    395: 
                    396:        if ((i = isreg(s)) >= 0) {
                    397:                *(short *)(regs[i]) = 0; /* if register destination, that reg is a goner */
                    398:                if (DOUBLE==(type&0xF) || DOUBLE==((type>>4)&0xF) || type==QUAD)
                    399:                        *(short *)(regs[i+1]) = 0;
                    400:        }
                    401:        for (i=NREG; --i>=0;)
                    402:                if (regs[i][1]=='*' && equstr(s, regs[i]+2))
                    403:                        *(short *)(regs[i]) = 0; /* previous indirection through destination is invalid */
                    404:        while ((i = findrand(s,0)) >= 0) /* previous values of destination are invalid */
                    405:                *(short *)(regs[i]) = 0;
                    406: 
                    407:        if (!natural(s)) {/* wild store, everything except constants vanishes */
                    408:                for (i=NREG; --i>=0;) if (regs[i][1] != '$') *(short *)(regs[i]) = 0;
                    409:                conloc[0] = 0; ccloc[0] = 0;
                    410:        } else {
                    411:                if(ccflg)setcc(s,type); /* natural destinations set condition codes */
                    412:                if (equstr(s, conloc))
                    413:                        conloc[0] = 0;
                    414:        }
                    415: }
                    416: 
                    417: splitrand(p) struct node *p; {
                    418: /* separate operands at commas, set up 'regs' and 'lastrand' */
                    419: register char *p1, *p2; register char **preg;
                    420: 
                    421:        preg=regs+RT1;
                    422:        if (p1=p->code) while (*p1) {
                    423:                lastrand=p2= *preg++;
                    424:                while (*p1) if (','==(*p2++= *p1++)) {--p2; break;}
                    425:                *p2=0;
                    426:        }
                    427:        while (preg<(regs+RT1+5)) *(*preg++)=0;
                    428: }
                    429: 
                    430: compat(have, want)
                    431: register int have, want;
                    432: {
                    433:        register int hsrc, hdst;
                    434:        extern int bitsize[];
                    435: 
                    436:        if (0==(want &= 0xF)) return(1); /* anything satisfies a wildcard want */
                    437:        hsrc=have&0xF; if (0==(hdst=((have>>4)&0xF)) || hdst>=OP2) hdst=hsrc;
                    438:        if (want>=QUAD)
                    439:                return(bitsize[hdst]==bitsize[want] && bitsize[hsrc]==bitsize[want]);
                    440:        return(hsrc==want && hdst>=want && hdst<QUAD);
                    441: }
                    442: 
                    443: equtype(t1,t2) {return(compat(t1,t2) && compat(t2,t1));}
                    444: 
                    445: findrand(as, type)
                    446: char *as;
                    447: {
                    448:        register char **i;
                    449:        for (i = regs+NREG; --i>=regs;) {
                    450:                if (**i && equstr(*i+1, as) && compat(**i,type))
                    451:                        return(i-regs);
                    452:        }
                    453:        return(-1);
                    454: }
                    455: 
                    456: isreg(s)
                    457: register char *s;
                    458: {
                    459:        if (*s++!='r' || !isdigit(*s++)) return(-1);
                    460:        if (*s==0) return(*--s-'0');
                    461:        if (*(s-1)=='1' && isdigit(*s++) && *s==0) return(10+*--s-'0');
                    462:        return(-1);
                    463: }
                    464: 
                    465: /*
                    466: check()
                    467: {
                    468:        register struct node *p, *lp;
                    469: 
                    470:        lp = &first;
                    471:        for (p=first.forw; p!=0; p = p->forw) {
                    472:                if (p->back != lp)
                    473:                        abort(-1);
                    474:                lp = p;
                    475:        }
                    476: }
                    477: */
                    478: 
                    479: newcode(p) struct node *p; {
                    480:        register char *p1,*p2,**preg;
                    481: 
                    482:        preg=regs+RT1; p2=line;
                    483:        while (*(p1= *preg++)) {while (*p2++= *p1++); *(p2-1)=',';}
                    484:        *--p2=0;
                    485:        p->code=copy(line);
                    486: }
                    487: 
                    488: repladdr(p)
                    489: struct node *p;
                    490: {
                    491:        register int r;
                    492:        register char *p1;
                    493:        register char **preg;
                    494:        register int nrepl;
                    495: 
                    496:        preg=regs+RT1; nrepl=0;
                    497:        while (lastrand!=(p1= *preg++))
                    498:                if (0<=(r=findrand(p1,p->subop))) {
                    499:                        *p1++='r'; if (r>9) {*p1++='1'; r -= 10;} *p1++=r+'0'; *p1=0;
                    500:                        nchange++; nrepl++; nsaddr++;
                    501:                }
                    502:        if (nrepl) newcode(p);
                    503: }
                    504: 
                    505: /* conditional branches which are never/always taken */
                    506: reduncbr(p)
                    507: register struct node *p;
                    508: {
                    509:        register struct node *p1;
                    510:        register char *ap1, *ap2;
                    511: 
                    512:        p1 = p->back;
                    513:        if (p1->op==CMP) {
                    514:                splitrand(p1);
                    515:                ap1 = findcon(regs[RT1], p1->subop);
                    516:                ap2 = findcon(regs[RT2], p1->subop);
                    517:        } else {
                    518:                if(!ccloc[0])
                    519:                        return;
                    520:                ap1 = findcon(ccloc+1, ccloc[0]);
                    521:                ap2 = "$0";
                    522:        }
                    523:        switch (compare(p->subop, ap1, ap2)) {
                    524:        case 0:         /* branch never taken */
                    525:                delnode(p);
                    526:                nredunj++;
                    527:                nchange++;
                    528:                decref(p->ref);
                    529:                if(p->forw->op!=CBR && (p1->op==TST || p1->op==CMP)) {
                    530:                        delnode(p1);
                    531:                        nrtst++;
                    532:                }
                    533:                break;
                    534:        case 1:         /* branch always taken */
                    535:                p->op = JBR;
                    536:                p->subop = 0;
                    537:                p->pop = 0;
                    538:                nchange++;
                    539:                if(nonlab(p->ref)->op!=CBR && (p1->op==TST || p1->op==CMP)) {
                    540:                        delnode(p1);
                    541:                        nrtst++;
                    542:                }
                    543:        }
                    544: }
                    545: 
                    546: /* a jump to a redundant compare (start of a 'for') */
                    547: redunbr(p)
                    548: register struct node *p;
                    549: {
                    550:        register struct node *p1;
                    551:        register char *ap1, *ap2;
                    552: 
                    553:        if ((p1 = p->ref) == 0)
                    554:                return;
                    555:        p1 = nonlab(p1);
                    556:        if (p1->op==TST || p1->op==CMP)
                    557:                splitrand(p1);
                    558:        else
                    559:                return;
                    560:        if (p1->forw->op==CBR) {
                    561:                ap1 = findcon(regs[RT1], p1->subop);
                    562:                if (p1->op==TST)
                    563:                        ap2 = "$0";
                    564:                else
                    565:                        ap2 = findcon(regs[RT2], p1->subop);
                    566:                p1 = p1->forw;
                    567:                if (compare(p1->subop, ap1, ap2) > 0) {
                    568:                        nredunj++;
                    569:                        nchange++;
                    570:                        decref(p->ref);
                    571:                        p->ref = p1->ref;
                    572:                        p->labno = p1->labno;
                    573: #ifdef COPYCODE
                    574:                        if (p->labno == 0)
                    575:                                p->code = p1->code;
                    576:                        if (p->ref)
                    577: #endif
                    578:                                p->ref->refc++;
                    579:                }
                    580:        } else if (p1->op==TST && equstr(regs[RT1],ccloc+1) &&
                    581:                        equtype(ccloc[0],p1->subop)) {
                    582:                p1=insertl(p1->forw); decref(p->ref); p->ref=p1; 
                    583:                nrtst++; nchange++;
                    584:        }
                    585: }
                    586: 
                    587: char *
                    588: findcon(p, type)
                    589:        register char *p;
                    590: {
                    591:        register int r;
                    592: 
                    593:        if (*p=='$')
                    594:                return(p);
                    595:        if ((r = isreg(p)) >= 0 && compat(regs[r][0],type))
                    596:                return(regs[r]+1);
                    597:        if (equstr(p, conloc))
                    598:                return(conval+1);
                    599:        return(p);
                    600: }
                    601: 
                    602: /* compare constants: 0 - branch taken; 1 - not taken; -1 - don't know */
                    603: compare(op, acp1, acp2)
                    604: char *acp1, *acp2;
                    605: {
                    606:        register char *cp1, *cp2;
                    607:        register int n1, n2, sign;
                    608: 
                    609:        cp1 = acp1;
                    610:        cp2 = acp2;
                    611:        if (*cp1++ != '$' || *cp2++ != '$')
                    612:                return(-1);
                    613:        n1 = 0; sign=1; if (*cp1=='-') {++cp1; sign= -1;}
                    614:        while (isdigit(*cp1)) {n1 *= 10; n1 += *cp1++ - '0';}
                    615:        n1 *= sign;
                    616:        n2 = 0; sign=1; if (*cp2=='-') {++cp2; sign= -1;}
                    617:        while (isdigit(*cp2)) {n2 *= 10; n2 += *cp2++ - '0';}
                    618:        n2 *= sign;
                    619:        if (*cp1=='+')
                    620:                cp1++;
                    621:        if (*cp2=='+')
                    622:                cp2++;
                    623:        do {
                    624:                if (*cp1++ != *cp2)
                    625:                        return(-1);
                    626:        } while (*cp2++);
                    627:        switch(op) {
                    628: 
                    629:        case JEQ:
                    630:                return(n1 == n2);
                    631:        case JNE:
                    632:                return(n1 != n2);
                    633:        case JLE:
                    634:                return(n1 <= n2);
                    635:        case JGE:
                    636:                return(n1 >= n2);
                    637:        case JLT:
                    638:                return(n1 < n2);
                    639:        case JGT:
                    640:                return(n1 > n2);
                    641:        case JLO:
                    642:                return((unsigned)n1 < (unsigned)n2);
                    643:        case JHI:
                    644:                return((unsigned)n1 > (unsigned)n2);
                    645:        case JLOS:
                    646:                return((unsigned)n1 <= (unsigned)n2);
                    647:        case JHIS:
                    648:                return((unsigned)n1 >= (unsigned)n2);
                    649:        }
                    650:        return(-1);
                    651: }
                    652: 
                    653: setcon(cv, cl, type)
                    654: register char *cv, *cl;
                    655: {
                    656:        register char *p;
                    657: 
                    658:        if (*cv != '$')
                    659:                return;
                    660:        if (!natural(cl))
                    661:                return;
                    662:        p = conloc;
                    663:        while (*p++ = *cl++);
                    664:        p = conval;
                    665:        *p++ = type;
                    666:        while (*p++ = *cv++);
                    667: }
                    668: 
                    669: setcc(ap,type)
                    670: char *ap;
                    671: {
                    672:        register char *p, *p1;
                    673: 
                    674:        p = ap;
                    675:        if (!natural(p)) {
                    676:                ccloc[0] = 0;
                    677:                return;
                    678:        }
                    679:        p1 = ccloc;
                    680:        *p1++ = type;
                    681:        while (*p1++ = *p++);
                    682: }
                    683: 
                    684: indexa(p) register char *p; {/* 1-> uses [r] addressing mode; 0->doesn't */
                    685:        while (*p) if (*p++=='[') return(1);
                    686:        return(0);
                    687: }
                    688: 
                    689: natural(p)
                    690: register char *p;
                    691: {/* 1->simple local, parameter, global, or register; 0->otherwise */
                    692: 
                    693:        if (*p=='*' || *p=='(' || *p=='$')
                    694:                return(0);
                    695:        while (*p++);
                    696:        p--;
                    697:        if (*--p==']' || *p==')' &&
                    698:         !(*(p-2)=='f' || fortflg && (*--p=='1' || *p=='2') && *--p=='1'))
                    699:                return(0);
                    700:        return(1);
                    701: }
                    702: 
                    703: /*
                    704: ** Tell if an argument is most likely static.
                    705: */
                    706: 
                    707: isstatic(cp)
                    708: register char  *cp;
                    709: {
                    710:        if (*cp == '_' || *cp == 'L')
                    711:                return (1);
                    712:        return (0);
                    713: }

unix.superglobalmegacorp.com

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