Annotation of researchv8dc/cmd/ccom/vax/genaux.c, revision 1.1

1.1     ! root        1: #include "gencode.h"
        !             2: #define NDNUM 400
        !             3: NODE myt[NDNUM];
        !             4: int ntree;
        !             5: extern int bothdebug, nosharp;
        !             6: #if M32 == 1
        !             7: char *regnames[] = {"%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7",
        !             8:        "%r8", "%fp", "%ap", "%r11", "%sp", "%r13", "%r14", "%pc"};
        !             9: char *frameptr = "%fp";
        !            10: char *argptr = "%ap";
        !            11: char *jeq = "je";
        !            12: char *jne = "jne";
        !            13: char *jgt = "jg";
        !            14: char *jge = "jge";
        !            15: char *jlt = "jl";
        !            16: char *jle = "jle";
        !            17: char *jugt = "jgu";
        !            18: char *juge = "jgeu";
        !            19: char *jult = "jlu";
        !            20: char *jule = "jleu";
        !            21: #define CHARCHAR 'b'
        !            22: #define SHORTCHAR 'h'
        !            23: #define LONGCHAR 'w'
        !            24: #define FLOATCHAR 's'
        !            25: #define DOUBLECHAR 'd'
        !            26: #else if VAX == 1
        !            27: char *regnames[] = {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8",
        !            28:        "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
        !            29: char *frameptr = "fp";
        !            30: char *argptr = "ap";
        !            31: char *jeq = "jeql";
        !            32: char *jne = "jneq";
        !            33: char *jgt = "jgtr";
        !            34: char *jge = "jgeq";
        !            35: char *jlt = "jlss";
        !            36: char *jle = "jleq";
        !            37: char *jugt = "jgtru";
        !            38: char *juge = "jgequ";
        !            39: char *jult = "jlssu";
        !            40: char *jule = "jlequ";
        !            41: #define CHARCHAR 'b'
        !            42: #define SHORTCHAR 'w'
        !            43: #define LONGCHAR 'l'
        !            44: #define FLOATCHAR 'f'
        !            45: #define DOUBLECHAR 'd'
        !            46: #endif
        !            47: char *bufend = (char *)bufs + sizeof(bufs);
        !            48: pr(fmt, list)
        !            49: char *fmt; long list;
        !            50: {
        !            51:        char *sprintxl();
        !            52:        nosharp = !bothdebug;
        !            53:        prptr = sprintxl(prptr, fmt, &list);
        !            54:        if(prptr > prbuf + sizeof(prbuf))
        !            55:                cerror("prbuf overflow");
        !            56:        nosharp = 0;
        !            57: }
        !            58: 
        !            59: outpr()
        !            60: {
        !            61:        *prptr = 0;
        !            62:        printbuf(prbuf, prptr-prbuf);
        !            63: }
        !            64: NODE *
        !            65: gimmenode()
        !            66: {      NODE *p;
        !            67:        p = myt + ntree++;
        !            68:        if(ntree > NDNUM)
        !            69:                cerror("out of temporary trees");
        !            70:        return(p);
        !            71: }
        !            72: 
        !            73: NODE *
        !            74: tempnode(p, flag)
        !            75: NODE *p;
        !            76: {      NODE *x, *q = p->in.left;
        !            77:        int n;
        !            78:        extern int minrvar;
        !            79:        if(p->in.op == CONV)
        !            80:                q = p;  /* CONV to double of float, versus (CMP double double) */
        !            81:        x = gimmenode();
        !            82:        x->in.type = q->in.type;
        !            83:        n = incrsize(q) == 8? 2: 1;
        !            84:        if(!(flag & ASADDR) && regvar >= REGVAR - 1 + n) {
        !            85:                x->in.op = REG;
        !            86:                x->tn.rval = regvar + 1 - n;
        !            87:                x->tn.lval = 1; /* SCRATCH marker !!!!! */
        !            88:                regvar -= n;
        !            89:                if(minrvar > regvar)
        !            90:                        minrvar = regvar;       /* in case current routine recursive */
        !            91:                return(x);
        !            92:        }
        !            93:        x->in.op = VAUTO;
        !            94:        x->tn.lval = gimmetemp(n);
        !            95:        /* scratch marker? */
        !            96:        return(x);
        !            97: }
        !            98: ret
        !            99: alloctmp(p)
        !           100: NODE *p;
        !           101: {      ret s;
        !           102:        sprintf(buf, "%d(%s)", gimmetemp(incrsize(p) == 8? 2: 1), frameptr);
        !           103:        done(s, CANINDIR|SCRATCH, 0);
        !           104: }
        !           105: ret
        !           106: checksize(p, s, regmask)
        !           107: NODE *p;
        !           108: ret s;
        !           109: {      ret t;
        !           110:        if(p->in.type != TDOUBLE)
        !           111:                return(s);
        !           112:        regmask |= s.regmask;
        !           113:        t = allocreg(p, regmask);
        !           114:        return(t);
        !           115: }
        !           116: 
        !           117: ret
        !           118: allocreg(p, regmask)
        !           119: NODE *p;
        !           120: {      int i, n;
        !           121:        ret s;
        !           122:        NODE *x;
        !           123:        if(p->in.type == TDOUBLE)
        !           124:                n = 2;
        !           125:        else
        !           126:                n = 1;
        !           127:        for(i = 0; i < REGVAR; i++) {
        !           128:                if(!(regmask & (1 << i)))
        !           129:                        continue;
        !           130:                if(n == 2 & !(regmask & (1 << (1+i))))
        !           131:                        continue;
        !           132:                sprintx(buf, "%s", regnames[i]);
        !           133:                regmask = (1 << i);
        !           134:                if(n == 2)
        !           135:                        regmask |= (1 << (i+1));
        !           136:                done(s, SCRATCH|ISREG, regmask);
        !           137:        }
        !           138:        x = tempnode(p, 0);
        !           139:        if(x->in.op == REG) {
        !           140:                sprintx(buf, "%s", regnames[x->tn.rval]);
        !           141:                done(s, SCRATCH|ISREG, 0);
        !           142:        }
        !           143:        sprintx(buf, "%d(%s)", x->tn.lval, frameptr);
        !           144:        done(s, SCRATCH|CANINDIR, 0);
        !           145: }
        !           146: 
        !           147: gimmetemp(n)
        !           148: {
        !           149:        if(VAX)
        !           150:                return(freetemp(n)/8 - maxboff/SZCHAR);
        !           151:        else
        !           152:                return(freetemp(n)/8 + maxboff/SZCHAR);
        !           153: }
        !           154: 
        !           155: isfloat(p)
        !           156: NODE *p;
        !           157: {
        !           158:        return(p->in.type == TFLOAT || p->in.type == TDOUBLE);
        !           159: }
        !           160: 
        !           161: childtype(p)
        !           162: NODE *p;
        !           163: {
        !           164:        return(type(p->in.left));
        !           165: }
        !           166: 
        !           167: type(p)
        !           168: NODE *p;
        !           169: {      int n = p->in.type;
        !           170:        switch(n) {
        !           171:        default:
        !           172:                return('?');
        !           173:        case TCHAR: case TUCHAR:
        !           174:                return(CHARCHAR);
        !           175:        case TSHORT: case TUSHORT:
        !           176:                return(SHORTCHAR);
        !           177:        case TINT: case TUNSIGNED: case TLONG: case TULONG:
        !           178:        case TPOINT: case TSTRUCT:
        !           179:                return(LONGCHAR);
        !           180:        case TFLOAT:
        !           181:                return(FLOATCHAR);
        !           182:        case TDOUBLE:
        !           183:                return(DOUBLECHAR);
        !           184:        }
        !           185: }
        !           186: 
        !           187: shiftsize(p)
        !           188: NODE *p;
        !           189: {
        !           190:        switch(p->in.type) {
        !           191:        default:
        !           192:                return(0);      /* 0 can't occur in an ICON under shift */
        !           193:        case TCHAR: case TUCHAR:
        !           194:                return(0);
        !           195:        case TSHORT: case TUSHORT:
        !           196:                return(1);
        !           197:        case TINT: case TUNSIGNED: case TLONG: case TULONG: case TPOINT:
        !           198:        case TFLOAT:
        !           199:                return(2);
        !           200:        case TDOUBLE:
        !           201:                return(3);
        !           202:        }
        !           203: }      
        !           204: 
        !           205: incrsize(p)
        !           206: NODE *p;
        !           207: {
        !           208:        switch(p->in.type) {
        !           209:        default:
        !           210:                return(0);      /* 0 can't occur in an icon under incrop */
        !           211:        case TCHAR: case TUCHAR:
        !           212:                return(1);
        !           213:        case TSHORT: case TUSHORT:
        !           214:                return(2);
        !           215:        case TINT: case TUNSIGNED: case TLONG: case TULONG: case TPOINT:
        !           216:        case TFLOAT:
        !           217:                return(4);
        !           218:        case TDOUBLE:
        !           219:                return(8);
        !           220:        }
        !           221: }
        !           222:        
        !           223: isunsigned(p)
        !           224: NODE *p;
        !           225: {
        !           226:        switch(p->in.type) {
        !           227: #if VAX==1
        !           228:        case TCHAR:
        !           229: #endif
        !           230:        case TSHORT: case TINT: case TLONG: case TFLOAT: case TDOUBLE:
        !           231:                return(0);
        !           232: #if M32==1
        !           233:        case TCHAR:
        !           234: #endif
        !           235:        default:
        !           236:                return(1);
        !           237:        }
        !           238: }
        !           239: 
        !           240: NODE *
        !           241: copytree(p)
        !           242: NODE *p;
        !           243: {      NODE *a, *b, *c;
        !           244:        switch(p->in.op) {
        !           245:        case ASG AND: case AND: case CALL: case CMP: case COMOP:
        !           246:        case DECR: case ASG DIV: case DIV: case ASG ER: case ER:
        !           247:        case INCR: case ASG LS: case LS: case ASG MINUS: case MINUS:
        !           248:        case ASG MOD: case MOD: case ASG MUL: case MUL: case ASG OR:
        !           249:        case OR: case ASG PLUS: case PLUS: case ASG RS: case RS:
        !           250:        case STASG: case STCALL: case ASSIGN: case CM:
        !           251:                a = copytree(p->in.left);
        !           252:                b = copytree(p->in.right);
        !           253:                c = gimmenode();
        !           254:                *c = *p;
        !           255:                c->in.left = a;
        !           256:                c->in.right = b;
        !           257:                return(c);
        !           258:        case COMPL: case CONV: case FLD: case GENBR: case GENLAB:
        !           259:        case GENUBR: case STAR: case UNARY AND: case UNARY CALL:
        !           260:        case UNARY MINUS: case UNARY STCALL: case INIT: case FUNARG:
        !           261:        case STARG:
        !           262:                a = copytree(p->in.left);
        !           263:                c = gimmenode();
        !           264:                *c = *p;
        !           265:                c->in.left = a;
        !           266:                return(c);
        !           267:        case VAUTO: case REG: case NAME: case VPARAM: case ICON:
        !           268:        case SNODE: case RNODE: case QNODE:
        !           269:                c = gimmenode();
        !           270:                *c = *p;
        !           271:                return(c);
        !           272:        default:
        !           273:                cerror("unk node in copytree");
        !           274:        }
        !           275: }
        !           276: /* rewrit A op B into (T = A, T) op B or A op (T = B, T) */
        !           277: totemp(p, flag)
        !           278: NODE *p;
        !           279: {      NODE *a, *b, *c;
        !           280:        a = gimmenode();
        !           281:        b = tempnode(p, flag);
        !           282:        c = gimmenode();
        !           283:        if(flag & LEFT)
        !           284:                *a = *p->in.left;
        !           285:        else
        !           286:                *a = *p->in.right;
        !           287:        a->in.op = ASSIGN;
        !           288:        a->in.left = b;
        !           289:        if(flag & LEFT)
        !           290:                a->in.right = p->in.left;
        !           291:        else
        !           292:                a->in.right = p->in.right;
        !           293:        c->in.op = COMOP;
        !           294:        c->in.left = a;
        !           295:        c->in.right = b;
        !           296:        c->in.type = a->in.type;
        !           297:        if(flag & LEFT)
        !           298:                p->in.left = c;
        !           299:        else
        !           300:                p->in.right = c;
        !           301: }
        !           302: 
        !           303: funargs(p, regmask)
        !           304: NODE *p;
        !           305: {      ret s, t;
        !           306:        int i;
        !           307:        switch(p->in.op) {
        !           308:        case CM:        /* order depends on way stack grows */
        !           309: #ifdef LTORARGS
        !           310:                i = funargs(p->in.left, regmask);
        !           311:                i |= funargs(p->in.right, regmask);
        !           312: #else
        !           313:                i = funargs(p->in.right, regmask);
        !           314:                i |= funargs(p->in.left, regmask);
        !           315: #endif
        !           316:                return(i);
        !           317:        case FUNARG:
        !           318: #if VAX==1
        !           319:                t = tostack();
        !           320:                s = doit(p->in.left, VALUE|TOSTACK, t, regmask);
        !           321: #else if M32==1
        !           322:                s = doit(p->in.left, VALUE|TOSTACK, 0, regmask);
        !           323: #endif
        !           324:                return(s.flag & FAIL);
        !           325:        case STARG:
        !           326:                /* this has to have same cases as STASG */
        !           327:                if(regmask != REGMASK)
        !           328:                        return(FAILX);
        !           329:                s = doit(p->in.left, VAX?(ASADDR|VALUE):VALUE, 0, regmask);
        !           330:                /* this generates expensive code for small structures */
        !           331:                i = p->stn.stsize / 8;
        !           332:                if(p->in.left->in.op == STASG) {
        !           333:                        if(VAX && i != 4 && i != 8) {
        !           334:                                pr("#\tsubl2\t$%d,sp\n", i);
        !           335:                                pr("#\tsubl2\t$%d,r3\n", i);
        !           336:                                pr("#\tmovc3\t$%d,(r3),(sp)\n", p->stn.stsize/8);
        !           337:                                return(0);
        !           338:                        }
        !           339:                        else if(M32 && i >= 7 * 4) {
        !           340:                                pr("#\taddw2\t&%d,%%sp\n", i);
        !           341:                                pr("#\tsubw2\t&%d,%%r0\n", i/4);
        !           342:                                goto moveit;
        !           343:                        }
        !           344:                }
        !           345:                if(VAX) {
        !           346:                        if(i == 4)
        !           347:                                pr("#\tpushl\t%s\n", str(s));
        !           348:                        else if(i == 8)
        !           349:                                pr("#\tmovq\t%s,-(sp)\n", str(s));
        !           350:                        else {
        !           351:                                pr("#\tsubl2\t$%d,sp\n", i);
        !           352:                                pr("#\tmovc3\t$%d,%s,(sp)\n", p->stn.stsize/8, str(s));
        !           353:                        }
        !           354:                }
        !           355:                else if(M32) {
        !           356:                        pr("#\taddw2\t&%d,%%sp\n", i);
        !           357:                        if(strcmp(str(s), "%r0"))
        !           358:                                pr("#\tmovw\t%s,%r0\n", str(s));
        !           359: moveit:
        !           360:                        pr("#\tmovaw\t-%d(%%sp),%r1\n", p->stn.stsize/8);
        !           361:                        i = p->stn.stsize/32;
        !           362:                        if(i >= 7) {
        !           363:                                pr("#\tmovw\t&%d,%%r2\n", i);
        !           364:                                pr("#\tMOVBLW\n");
        !           365:                        }
        !           366:                        else
        !           367:                                while(--i >= 0)
        !           368:                                        pr("#\tmovw\t%d(%r0),%d(%r1)\n", 4*i, 4*i);
        !           369:                }
        !           370:                return(s.flag & FAIL);
        !           371:        }
        !           372: }
        !           373: 
        !           374: strshift(s, n)
        !           375: char *s;
        !           376: {      int i, j;
        !           377:                i = strlen(s);
        !           378:        if(n > 0)
        !           379:                for(j = i; j >= 0; j--)
        !           380:                        s[j + n] = s[j];
        !           381:        else
        !           382:                for(j = -n; j <= i; j++)
        !           383:                        s[j + n] = s[j];
        !           384: }
        !           385: 
        !           386: ret
        !           387: tostack()
        !           388: {      ret s;
        !           389:        sprintx(buf, "-(sp)");
        !           390:        done(s, 0, 0);
        !           391: }
        !           392: 
        !           393: ret
        !           394: specialreg(p, regmask)
        !           395: NODE *p;
        !           396: {      ret s;
        !           397:        int n, i;
        !           398:        n = p ->in.type == TDOUBLE? 2: 1;
        !           399:        i = 1;
        !           400:        if(n == 2)
        !           401:                i = 3;
        !           402:        sprintx(buf, "%s", regnames[0]);
        !           403:        if(i & ~regmask)
        !           404:                pr("#\specialreg not free\n");
        !           405:        done(s, SCRATCH|ISREG, i);
        !           406: }
        !           407: /* these guys rewrite a1 = a2 = ... an = x
        !           408:  * as t = x; an = t; an-1 = an */
        !           409: NODE *
        !           410: fromtemp(p, temp)
        !           411: NODE *p, *temp;
        !           412: {      NODE *q;
        !           413:        q = gimmenode();
        !           414:        *q = *p;
        !           415:        q->in.left = p;
        !           416:        q->in.op = ASSIGN;
        !           417:        q->in.right = temp;
        !           418:        return(q);
        !           419: }
        !           420: 
        !           421: NODE *
        !           422: to(p, temp)
        !           423: NODE *p, *temp;
        !           424: {      NODE *q;
        !           425:        q = gimmenode();
        !           426:        *q = *p;
        !           427:        q->in.right = p;
        !           428:        q->in.op = ASSIGN;
        !           429:        q->in.left = temp;
        !           430:        return(q);
        !           431: }
        !           432: 
        !           433: NODE *
        !           434: comnode(a, p)
        !           435: NODE *a, *p;
        !           436: {      NODE *q;
        !           437:        q = gimmenode();
        !           438:        *q = *p;
        !           439:        q->in.op = COMOP;
        !           440:        q->in.right = p;
        !           441:        q->in.left = a;
        !           442:        return(q);
        !           443: }
        !           444: 
        !           445: asgwrite(p)
        !           446: NODE *p;
        !           447: {      NODE *q, *a, *temp;
        !           448:        temp = tempnode(p, 0);
        !           449:        a = fromtemp(p->in.left, temp);
        !           450:        for(q = p->in.right; q->in.op == ASSIGN; q = q->in.right)
        !           451:                a = comnode(fromtemp(q->in.left, temp), a);
        !           452:        a = comnode(to(q, temp), a);
        !           453:        *p = *a;
        !           454: }
        !           455: 
        !           456: char *
        !           457: genjmp(n)
        !           458: {
        !           459:        switch(n) {
        !           460:        default:
        !           461:                return("jweird");
        !           462:        case EQ:
        !           463:                return(jeq);
        !           464:        case NE:
        !           465:                return(jne);
        !           466:        case GT:
        !           467:                return(jgt);
        !           468:        case GE:
        !           469:                return(jge);
        !           470:        case LT:
        !           471:                return(jlt);
        !           472:        case LE:
        !           473:                return(jle);
        !           474:        case UGT:
        !           475:                return(jugt);
        !           476:        case UGE:
        !           477:                return(juge);
        !           478:        case ULT:
        !           479:                return(jult);
        !           480:        case ULE:
        !           481:                return(jule);
        !           482:        }
        !           483: }
        !           484: 
        !           485: lsconv(p)
        !           486: NODE *p;
        !           487: {      NODE *lft, *right;
        !           488:        lft = gimmenode();
        !           489:        right = gimmenode();
        !           490:        lft->in.op = right->in.op = CONV;
        !           491:        lft->in.type = right->in.type = TLONG;
        !           492:        lft->in.left = p->in.left;
        !           493:        right->in.left = p->in.right;
        !           494:        if(p->in.left->in.op != ICON)   /* ICONS are longs anyway (see RS) */
        !           495:                p->in.left = lft;
        !           496:        p->in.right = right;
        !           497: }
        !           498: /* only some ops have to be rewritten (addb and addl are the same at the bottom) */
        !           499: rewriteasgop(p)
        !           500: NODE *p;
        !           501: {      NODE *a, *newop;
        !           502:        if(p->in.left->in.op != CONV)
        !           503:                return(0);
        !           504:        if(p->in.left->in.left->in.op == STAR)
        !           505:                longjmp(back, awfulstar(p));
        !           506:        newop = gimmenode();
        !           507:        *newop = *p;
        !           508:        switch(p->in.op) {
        !           509:        case ASG DIV:
        !           510:                newop->in.op = DIV;
        !           511:                break;
        !           512:        case ASG LS:
        !           513:                newop->in.op = LS;
        !           514:                break;
        !           515:        case ASG MOD:
        !           516:                newop->in.op = MOD;
        !           517:                break;
        !           518:        case ASG RS:
        !           519:                newop->in.op = RS;
        !           520:                break;
        !           521:        case ASG PLUS:
        !           522:                if(incrsize(p->in.left) != 8)
        !           523:                        return(0);
        !           524:                newop->in.op = PLUS;
        !           525:                break;
        !           526:        case ASG MINUS:
        !           527:                if(incrsize(p->in.left) != 8)
        !           528:                        return(0);
        !           529:                newop->in.op = MINUS;
        !           530:                break;
        !           531:        case ASG MUL:
        !           532:                if(incrsize(p->in.left) != 8)
        !           533:                        return(0);
        !           534:                newop->in.op = MUL;
        !           535:                break;
        !           536: 
        !           537:        default:
        !           538:                cerror("codegen: rewriting asgop");
        !           539:        }
        !           540:        a = gimmenode();
        !           541:        *a = *p->in.left->in.left;
        !           542:        p->in.op = ASSIGN;
        !           543:        p->in.left = a;
        !           544:        p->in.right = newop;
        !           545:        return(1);
        !           546: }
        !           547: 
        !           548: rewriteconv(p) /* uns to float or double */
        !           549: NODE *p;
        !           550: {      NODE *a;
        !           551:        a = gimmenode();
        !           552:        *a = *p;
        !           553:        a->in.type = TLONG;
        !           554:        p->in.left = a;
        !           555: }
        !           556: 
        !           557: mediumstar(p)
        !           558: NODE *p;
        !           559: {      NODE *newtop, *tmp, *x, *y;
        !           560:        newtop = gimmenode();
        !           561:        newtop->in.op = COMOP;
        !           562:        newtop->in.type = p->in.type;
        !           563:        x = gimmenode();
        !           564:        x->in.op = ASSIGN;
        !           565:        x->in.type = TPOINT;
        !           566:        x->in.right = p->in.left->in.left;
        !           567:        newtop->in.left = x;
        !           568:        tmp = tempnode(newtop, 0);
        !           569:        tmp->in.type = TPOINT;
        !           570:        x->in.left = tmp;
        !           571:        y = gimmenode();
        !           572:        y->in.op = COMOP;
        !           573:        y->in.type = p->in.type;
        !           574:        x = gimmenode();
        !           575:        *x = *p;
        !           576:        newtop->in.right = y;
        !           577:        y->in.left = x;
        !           578:        y->in.right = x->in.left;
        !           579:        x->in.left->in.left = tmp;
        !           580:        *p = *newtop;
        !           581:        return(1);
        !           582: }
        !           583: 
        !           584: awfulstar(p)
        !           585: NODE *p;
        !           586: {      NODE *newtop, *doleft, *x, *op, *equals;
        !           587:        newtop = gimmenode();
        !           588:        newtop->in.op = COMOP;
        !           589:        newtop->in.type = p->in.type;
        !           590:        doleft = gimmenode();
        !           591:        doleft->in.op = ASSIGN;
        !           592:        doleft->in.type = TPOINT;
        !           593:        doleft->in.right = p->in.left->in.left->in.left;
        !           594:        x = tempnode(doleft, 0);
        !           595:        doleft->in.left = x;
        !           596:        op = gimmenode();
        !           597:        *op = *p;
        !           598:        op->in.op -= (ASG 0);   /* crap for crap */
        !           599:        op->in.left->in.left->in.left = x;      /* so it's a dag, but x is harmless */
        !           600:        equals = gimmenode();
        !           601:        *equals = *p;
        !           602:        equals->in.right = op;
        !           603:        equals->in.left = p->in.left->in.left;
        !           604:        equals->in.op = ASSIGN;
        !           605:        *p = *newtop;
        !           606:        p->in.left = doleft;
        !           607:        p->in.right = equals;
        !           608:        return(1);
        !           609: }
        !           610: rewritefld(p)
        !           611: NODE *p;
        !           612: {      NODE *q, *tmp, *left, *comop;
        !           613:        if((q = p->in.left->in.left)->in.op != STAR) {
        !           614:                rewfld(p);
        !           615:                return;
        !           616:        }
        !           617:        q = q->in.left;
        !           618:        tmp = tempnode(q, 0);
        !           619:        left = gimmenode();
        !           620:        left->in.type = q->in.type;
        !           621:        left->in.op = ASSIGN;
        !           622:        left->in.left = tmp;
        !           623:        left->in.right = gimmenode();
        !           624:        left->in.right = copytree(q);
        !           625:        *q = *tmp;
        !           626:        comop = gimmenode();
        !           627:        comop->in.op = COMOP;
        !           628:        comop->in.left = left;
        !           629:        comop->in.right = copytree(p);
        !           630:        *p = *comop;
        !           631:        rewfld(p->in.right);
        !           632:        longjmp(back, 1);
        !           633: }
        !           634: rewfld(p)
        !           635: NODE *p;
        !           636: {      NODE *x, *y, *z;
        !           637:        x = gimmenode();
        !           638:        *x = *copytree(p);
        !           639:        y = gimmenode();
        !           640:        *y = *copytree(p);
        !           641:        z = gimmenode();
        !           642:        *z = *p;
        !           643:        z->in.left = x;
        !           644:        x->in.op = ASSIGN;
        !           645:        x->in.right = y;
        !           646:        if(p->in.op == DECR || p->in.op == ASG MINUS)
        !           647:                z->in.op = PLUS;
        !           648:        else
        !           649:                z->in.op = MINUS;
        !           650:        if(p->in.op == DECR)
        !           651:                y->in.op = MINUS;
        !           652:        else if(p->in.op == INCR)
        !           653:                y->in.op = PLUS;
        !           654:        else
        !           655:                y->in.op -= (ASG 0);    /* good grief */
        !           656:        if(p->in.op == DECR || p->in.op == INCR)
        !           657:                *p = *z;
        !           658:        else
        !           659:                *p = *x;
        !           660: }
        !           661: 
        !           662: ret
        !           663: indirit(s)
        !           664: ret s;
        !           665: {
        !           666:        if(s.flag & ISREG) {
        !           667:                strcat(str(s), ")");
        !           668:                strshift(str(s), 1);
        !           669:                str(s)[0] = '(';
        !           670:                return(s);
        !           671:        }
        !           672:        if(s.flag & CANINDIR) {
        !           673:                strshift(str(s), 1);
        !           674:                str(s)[0] = '*';
        !           675:                return(s);
        !           676:        }
        !           677:        if(VAX && str(s)[0] == '(') {   /* (r3)[r11] */
        !           678:                strshift(str(s), 1);
        !           679:                str(s)[0] = '*';
        !           680:                return(s);
        !           681:        }
        !           682:        if(VAX && str(s)[0] == '$') {   /* an icon for structure returns */
        !           683:                strshift(str(s), -1);
        !           684:                return(s);
        !           685:        }
        !           686:        s.flag = FAIL;
        !           687:        return(s);
        !           688: }
        !           689: /* not int = (...? int exprs) have a bogus tree */
        !           690: extracheck(p)
        !           691: NODE *p;
        !           692: {      NODE *a;
        !           693:        if(p->in.right->in.op != GENLAB)
        !           694:                return;
        !           695:        a = gimmenode();
        !           696:        *a = *p;
        !           697:        a->in.left = p->in.right;
        !           698:        a->in.op = CONV;
        !           699:        p->in.right = a;
        !           700: }
        !           701: 
        !           702: starasg(p)
        !           703: NODE *p;
        !           704: {      NODE *tmp, *asg, *x;
        !           705:        tmp = tempnode(p->in.left->in.left, 0);
        !           706:        x = gimmenode();
        !           707:        *x = *p;
        !           708:        asg = gimmenode();
        !           709:        *asg = *p->in.left->in.left;
        !           710:        asg->in.op = ASSIGN;
        !           711:        asg->in.left = tmp;
        !           712:        asg->in.right = p->in.left->in.left;
        !           713:        x->in.left->in.left = tmp;
        !           714:        p->in.op = COMOP;
        !           715:        p->in.left = asg;
        !           716:        p->in.right = x;
        !           717: }
        !           718: stasgrewrite(p)
        !           719: NODE *p;
        !           720: {      NODE *qa, *qb, *n, *left, *right;
        !           721:        if(VAX) {
        !           722:                totemp(p, RIGHT);
        !           723:                longjmp(back, 1);
        !           724:        }
        !           725:        if(M32) {
        !           726:                qa = tempnode(p->in.right, 0);
        !           727:                qb = tempnode(p->in.left, 0);
        !           728:                right = to(p->in.right, qa);
        !           729:                left = to(p->in.left, qb);
        !           730:                p->in.right = qa;
        !           731:                p->in.left = qb;
        !           732:                qa = gimmenode();
        !           733:                qb = gimmenode();
        !           734:                qa->in.op = qb->in.op = COMOP;
        !           735:                qa->in.left = left;
        !           736:                qa->in.right = qb;
        !           737:                qb->in.left = right;
        !           738:                n = gimmenode();
        !           739:                *n = *p;
        !           740:                qb->in.right = n;
        !           741:                *p = *qa;
        !           742:                longjmp(back, 1);
        !           743:        }
        !           744: }
        !           745: ret
        !           746: simpler(a, b)  /* returns b (as dest) preferentially */
        !           747: ret a, b;
        !           748: {
        !           749:        if(b.flag & ISREG)
        !           750:                return(b);
        !           751:        if(a.flag & ISREG)
        !           752:                return(a);
        !           753:        if(b.flag & SCRATCH)
        !           754:                return(b);
        !           755:        if(a.flag & SCRATCH)
        !           756:                return(a);
        !           757:        if(!(b.flag & INDEX))
        !           758:                return(b);
        !           759:        if(!(a.flag & INDEX))
        !           760:                return(a);
        !           761:        /* disallow *p++ = *q++ but not p[i]=q[i]*/
        !           762:        if(!index(str(b), '-') && !index(str(b), '+'))
        !           763:                return(b);
        !           764:        if(!index(str(a), '-') && !index(str(a), '+'))
        !           765:                return(a);
        !           766:        b.flag |= USED;
        !           767:        return(b);
        !           768: }

unix.superglobalmegacorp.com

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