Annotation of researchv10no/cmd/ccom/vax/genmore.c, revision 1.1

1.1     ! root        1: #include "gencode.h"
        !             2: char *jeq = "jeql";
        !             3: char *jne = "jneq";
        !             4: char *jgt = "jgtr";
        !             5: char *jge = "jgeq";
        !             6: char *jlt = "jlss";
        !             7: char *jle = "jleq";
        !             8: char *jugt = "jgtru";
        !             9: char *juge = "jgequ";
        !            10: char *jult = "jlssu";
        !            11: char *jule = "jlequ";
        !            12: mnod *gimmemnod();
        !            13: 
        !            14: char prbuf[10*1024];
        !            15: extern int bothdebug, nosharp;
        !            16: #define NBUF 256       /* must fit in an unsigned char */
        !            17: char bufs[NBUF][BUF], *buf;
        !            18: char *bufend = (char *)bufs + sizeof(bufs);
        !            19: pr(fmt, list)
        !            20: char *fmt; long list;
        !            21: {      char *n;
        !            22:        char *sprintxl();
        !            23:        nosharp = !bothdebug;
        !            24:        prptr = sprintxl(n=prptr, fmt, &list);
        !            25:        if(prptr > prbuf + sizeof(prbuf))
        !            26:                cerror("prbuf overflow");
        !            27:        nosharp = 0;
        !            28: }
        !            29: 
        !            30: outpr()
        !            31: {
        !            32:        *prptr = 0;
        !            33:        printbuf(prbuf, prptr-prbuf);
        !            34: }
        !            35: 
        !            36: ret
        !            37: checksize(p, s, regmask)
        !            38: mnod *p;
        !            39: ret s;
        !            40: {      ret t;
        !            41:        if(p->type != Tdouble)
        !            42:                return(s);
        !            43:        regmask |= s.regmask;
        !            44:        t = allocreg(p, regmask);
        !            45:        return(t);
        !            46: }
        !            47: 
        !            48: gimmetemp(n)
        !            49: {
        !            50:        return(freetemp(n)/8 - maxboff/SZCHAR);
        !            51: }
        !            52: 
        !            53: commutes(op)
        !            54: {
        !            55:        switch(op) {
        !            56:        default:
        !            57:                cerror("unexpected op in commutes");
        !            58:        case Plus: case Mul: case Or: case Xor: case And:
        !            59:                return(1);
        !            60:        case Minus: case Div: case Mod:
        !            61:                return(0);
        !            62:        }
        !            63: }
        !            64: 
        !            65: strshift(s, n)
        !            66: char *s;
        !            67: {      int i, j;
        !            68:                i = strlen(s);
        !            69:        if(n > 0)
        !            70:                for(j = i; j >= 0; j--)
        !            71:                        s[j + n] = s[j];
        !            72:        else
        !            73:                for(j = -n; j <= i; j++)
        !            74:                        s[j + n] = s[j];
        !            75: }
        !            76: 
        !            77: ret
        !            78: tostack()
        !            79: {      ret s;
        !            80:        sprintx(buf, "-(sp)");
        !            81:        done(s, 0, 0);
        !            82: }
        !            83: 
        !            84: char *
        !            85: genjbc(n)
        !            86: {
        !            87:        if(n == EQ)
        !            88:                return("jbc");
        !            89:        if(n == NE)
        !            90:                return("jbs");
        !            91:        cerror("impossible jmp mask type");
        !            92:        return("jweird");
        !            93: }
        !            94: 
        !            95: char *
        !            96: genjmp(n)
        !            97: {
        !            98:        switch(n) {
        !            99:        default: cerror("impossible jmp type"); return("jweird");
        !           100:        case EQ: return(jeq);
        !           101:        case NE: return(jne);
        !           102:        case GT: return(jgt);
        !           103:        case GE: return(jge);
        !           104:        case LT: return(jlt);
        !           105:        case LE: return(jle);
        !           106:        case UGT: return(jugt);
        !           107:        case UGE: return(juge);
        !           108:        case ULT: return(jult);
        !           109:        case ULE: return(jule);
        !           110:        }
        !           111: }
        !           112: 
        !           113: pow2(n)
        !           114: {      int i;
        !           115:        if(n & (n-1))
        !           116:                return(-1);
        !           117:        for(i = 0; i < 32; i++) /* good old vax */
        !           118:                if(n & (1 << i))
        !           119:                        return(i);
        !           120:        return(-1);     /* can't happen */
        !           121: }
        !           122: 
        !           123: ret
        !           124: indirit(s)
        !           125: ret s;
        !           126: {
        !           127:        if(s.flag & ISREG) {
        !           128:                strcat(str(s), ")");
        !           129:                strshift(str(s), 1);
        !           130:                str(s)[0] = '(';
        !           131:                return(s);
        !           132:        }
        !           133:        if(s.flag & CANINDIR) {
        !           134:                strshift(str(s), 1);
        !           135:                str(s)[0] = '*';
        !           136:                return(s);
        !           137:        }
        !           138:        if(str(s)[0] == '(') {  /* (r3)[r11] */
        !           139:                strshift(str(s), 1);
        !           140:                str(s)[0] = '*';
        !           141:                return(s);
        !           142:        }
        !           143:        if(str(s)[0] == '$') {  /* an icon for structure returns */
        !           144:                strshift(str(s), -1);
        !           145:                return(s);
        !           146:        }
        !           147:        debugpr("# FAIL ");
        !           148:        s.flag = FAIL;
        !           149:        return(s);
        !           150: }
        !           151: 
        !           152: ret    /* unseal the seals for Stasg */
        !           153: addrsimp(a, b)
        !           154: ret a, b;
        !           155: {      extern char *index();
        !           156:        char *p;
        !           157:        if(str(b)[0] == '(') {  /* posit register */
        !           158: reg:
        !           159:                strshift(str(b), -1);
        !           160:                *index(str(b), ')') = 0;
        !           161:                return(b);
        !           162:        }
        !           163:        if(str(a)[0] == '(') {  /* posit register */
        !           164:                b = a;
        !           165:                goto reg;
        !           166:        }
        !           167:        if(str(b)[0] == '_') {  /* posit name of struct */
        !           168: name:
        !           169:                pr("#\tmoval\t%s,r0\n", str(b));
        !           170:                b.regmask = 1;
        !           171:                b.flag = ISREG|SCRATCH;
        !           172:                strcpy(str(b), "r0");           /* arrrrrgh */
        !           173:                return(b);
        !           174:        }
        !           175:        if(str(a)[0] == '_') {
        !           176:                b = a;
        !           177:                goto name;
        !           178:        }
        !           179:        if(str(b)[0] == '*') {
        !           180: unstar:
        !           181:                p = index(str(b), '+');
        !           182:                if(!p)
        !           183:                        p = index(str(b), '-');
        !           184:                if(p && (*(p+1) == 0 || *(p+1) == '('))
        !           185:                        goto bad;
        !           186:                strshift(str(b), -1);
        !           187:                return(b);
        !           188:        }
        !           189:        if(str(a)[0] == '*') {
        !           190:                b = a;
        !           191:                goto unstar;
        !           192:        }
        !           193:        if(str(b)[0] == 'L') {
        !           194: label:
        !           195:                strshift(str(b), 1);
        !           196:                str(b)[0] = '&';
        !           197:                return(b);
        !           198:        }
        !           199:        if(str(a)[0] == 'L') {
        !           200:                b = a;
        !           201:                goto label;
        !           202:        }
        !           203: bad:
        !           204:        cerror("(addrsimp) rewrite struct asg");
        !           205: }
        !           206:                
        !           207: ret
        !           208: simpler(a, b)  /* returns b (as dest) preferentially */
        !           209: ret a, b;
        !           210: {
        !           211:        if(b.flag & ISREG)
        !           212:                return(b);
        !           213:        if(a.flag & ISREG)
        !           214:                return(a);
        !           215:        if(b.flag & SCRATCH)
        !           216:                return(b);
        !           217:        if(a.flag & SCRATCH)
        !           218:                return(a);
        !           219:        if(!(b.flag & INDEX))
        !           220:                return(b);
        !           221:        if(!(a.flag & INDEX))
        !           222:                return(a);
        !           223:        /* disallow *p++ = *q++ but not p[i]=q[i]*/
        !           224:        if(!index(str(b), '-') && !index(str(b), '+'))
        !           225:                return(b);
        !           226:        if(!index(str(a), '-') && !index(str(a), '+'))
        !           227:                return(a);
        !           228:        b.flag |= USED;
        !           229:        return(b);
        !           230: }
        !           231: 
        !           232: hasqnode(p)
        !           233: mnod *p;
        !           234: {
        !           235:        if(p->op == Asg && p->left->op == Qnode) {
        !           236:                return(1);
        !           237:        }
        !           238:        if(1) {
        !           239:                return(0);
        !           240:        }
        !           241:        switch(p->op) {
        !           242:        default:
        !           243:                cerror("hasqnode\n");
        !           244:        case Andeq: case And: case Cmp: case Comop: case Decr: 
        !           245:        case Diveq: case Div: case Xoreq: case Xor:
        !           246:        case Incr: case Lseq: case Ls: case Minuseq: case Minus:
        !           247:        case Modeq: case Mod: case Muleq: case Mul: case Oreq:
        !           248:        case Or: case Pluseq: case Plus: case Rseq: case Rs:
        !           249:        case Asg: case Cm:
        !           250:        case Call: case Stcall:
        !           251:        case Stasg:
        !           252:                return(hasqnode(p->left) || hasqnode(p->right));
        !           253:        case Compl: case Conv: case Genbr: case Genlab:
        !           254:        case Genubr: case Star: case Addr: case Ucall:
        !           255:        case Uminus: case Ustcall: case Init: case Funarg:
        !           256:        case Fld:case Starg:
        !           257:                return(hasqnode(p->left));
        !           258:        case Auto: case Reg: case Name: case Param: case Icon:
        !           259:        case Snode: case Rnode:
        !           260:                return(0);
        !           261:        case Qnode:
        !           262:                return(1);
        !           263:        }
        !           264: }
        !           265: 
        !           266: mnod *
        !           267: copytree(p)
        !           268: NODE *p;
        !           269: {      mnod *a, *b, *c;
        !           270:        c = gimmemnod();
        !           271:        switch(p->in.op) {
        !           272:        case ASG AND: case AND: case CMP: case COMOP: case DECR: 
        !           273:        case ASG DIV: case DIV: case ASG ER: case ER:
        !           274:        case INCR: case ASG LS: case LS: case ASG MINUS: case MINUS:
        !           275:        case ASG MOD: case MOD: case ASG MUL: case MUL: case ASG OR:
        !           276:        case OR: case ASG PLUS: case PLUS: case ASG RS: case RS:
        !           277:        case ASSIGN: case CM:
        !           278:                a = copytree(p->in.left);
        !           279:                b = copytree(p->in.right);
        !           280:                c->left = a;
        !           281:                c->right = b;
        !           282:                break;
        !           283:        case CALL: case STCALL:
        !           284:                a = copytree(p->in.left);
        !           285:                b = copytree(p->in.right);
        !           286:                c->argsize = p->stn.argsize;
        !           287:                c->left = a;
        !           288:                c->right = b;
        !           289:                break;
        !           290:        case STASG:
        !           291:                a = copytree(p->in.left);
        !           292:                b = copytree(p->in.right);
        !           293:                c->stsize = p->stn.stsize;
        !           294:                c->left = a;
        !           295:                c->right = b;
        !           296:                break;
        !           297:        case COMPL: case CONV: case GENBR: case GENLAB:
        !           298:        case GENUBR: case STAR: case UNARY AND: case UNARY CALL:
        !           299:        case UNARY MINUS: case UNARY STCALL: case INIT: case FUNARG:
        !           300:                a = copytree(p->in.left);
        !           301:                c->label = p->bn.label; /* should be separated out */
        !           302:                c->lop = p->bn.lop;
        !           303:                c->left = a;
        !           304:                break;
        !           305:        case FLD:case STARG:
        !           306:                a = copytree(p->in.left);
        !           307:                c->left = a;
        !           308:                c->rval = p->tn.rval;
        !           309:                c->stsize = p->stn.stsize;
        !           310:                break;
        !           311:        case VAUTO: case REG: case NAME: case VPARAM: case ICON:
        !           312:        case SNODE: case RNODE: case QNODE:
        !           313:                c->name = p->tn.name;
        !           314:                c->lval = p->tn.lval;
        !           315:                c->rval = p->tn.rval;
        !           316:                break;
        !           317:        }
        !           318:        switch(p->in.op) {
        !           319:        default:
        !           320:                cerror("unk op in copytree");
        !           321:        case ASG AND:   c->op = Andeq; break;
        !           322:        case AND:       c->op = And; break;
        !           323:        case CMP:       c->op = Cmp; break;
        !           324:        case COMOP:     c->op = Comop; break;
        !           325:        case DECR:      c->op = Decr; break;
        !           326:        case ASG DIV:   c->op = Diveq; break;
        !           327:        case DIV:       c->op = Div; break;
        !           328:        case ASG ER:    c->op = Xoreq; break;
        !           329:        case ER:        c->op = Xor; break;
        !           330:        case INCR:      c->op = Incr; break;
        !           331:        case ASG LS:    c->op = Lseq; break;
        !           332:        case LS:        c->op = Ls; break;
        !           333:        case ASG MINUS: c->op = Minuseq; break;
        !           334:        case MINUS:     c->op = Minus; break;
        !           335:        case ASG MOD:   c->op = Modeq; break;
        !           336:        case MOD:       c->op = Mod; break;
        !           337:        case ASG MUL:   c->op = Muleq; break;
        !           338:        case MUL:       c->op = Mul; break;
        !           339:        case ASG OR:    c->op = Oreq; break;
        !           340:        case OR:        c->op = Or; break;
        !           341:        case ASG PLUS:  c->op = Pluseq; break;
        !           342:        case PLUS:      c->op = Plus; break;
        !           343:        case ASG RS:    c->op = Rseq; break;
        !           344:        case RS:        c->op = Rs; break;
        !           345:        case ASSIGN:    c->op = Asg; break;
        !           346:        case CM:        c->op = Cm; break;
        !           347:        case CALL:      c->op = Call; break;
        !           348:        case STCALL:    c->op = Stcall; break;
        !           349:        case STASG:     c->op = Stasg; break;
        !           350:        case COMPL:     c->op = Compl; break;
        !           351:        case CONV:      c->op = Conv; break;
        !           352:        case GENBR:     c->op = Genbr; break;
        !           353:        case GENLAB:    c->op = Genlab; break;
        !           354:        case GENUBR:    c->op = Genubr; break;
        !           355:        case STAR:      c->op = Star; break;
        !           356:        case UNARY AND: c->op = Addr; break;
        !           357:        case UNARY CALL:        c->op = Ucall; break;
        !           358:        case UNARY MINUS:       c->op = Uminus; break;
        !           359:        case UNARY STCALL:      c->op = Ustcall; break;
        !           360:        case INIT:      c->op = Init; break;
        !           361:        case FUNARG:    c->op = Funarg; break;
        !           362:        case FLD:       c->op = Fld; break;
        !           363:        case STARG:     c->op = Starg; break;
        !           364:        case VAUTO:     c->op = Auto; break;
        !           365:        case REG:       c->op = Reg; break;
        !           366:        case NAME:      c->op = Name; break;
        !           367:        case VPARAM:    c->op = Param; break;
        !           368:        case ICON:      c->op = Icon; break;
        !           369:        case SNODE:     c->op = Snode; break;
        !           370:        case QNODE:     c->op = Qnode; break;
        !           371:        case RNODE:     c->op = Rnode; break;
        !           372:        }
        !           373:        switch(p->in.type) {
        !           374:        default:
        !           375:                cerror("incomprehensible type");
        !           376:        case TCHAR:     c->type = Tchar; break;
        !           377:        case TUCHAR:    c->type = Tuchar; break;
        !           378:        case TSHORT:    c->type = Tshort; break;
        !           379:        case TUSHORT:   c->type = Tushort; break;
        !           380:        case TINT:      c->type = Tint; break;
        !           381:        case TUNSIGNED: c->type = Tuint; break;
        !           382:        case TLONG:     c->type = Tlong; break;
        !           383:        case TULONG:    c->type = Tulong; break;
        !           384:        case TPOINT:    c->type = Tpoint; break;
        !           385:        case TFLOAT:    c->type = Tfloat; break;
        !           386:        case TDOUBLE:   c->type = Tdouble; break;
        !           387:        case TSTRUCT:   c->type = Tstruct; break;
        !           388:        case TVOID:     c->type = Tvoid; break;
        !           389:        }
        !           390: }
        !           391: 
        !           392: /* does p contain an asgop or Incr (or could it be evaluated twice) */
        !           393: sideffects(p)
        !           394: mnod *p;
        !           395: {
        !           396:        switch(p->op) {
        !           397:        case Andeq: case Decr: case Diveq: case Xoreq: case Incr:
        !           398:        case Lseq:  case Minuseq:case Modeq: case Muleq: case Oreq:
        !           399:        case Pluseq: case Rseq: case Call: case Stcall: case Ucall:
        !           400:                return(1);
        !           401:        case And: case Cmp: case Comop: case Div: case Xor:
        !           402:        case Ls: case Minus: case Mod: case Mul:
        !           403:        case Or: case Plus: case Rs: case Asg: case Cm: case Stasg:
        !           404:                return(sideffects(p->left) || sideffects(p->right));
        !           405:        case Compl: case Conv: case Genbr: case Genlab:
        !           406:        case Genubr: case Star: case Addr:
        !           407:        case Uminus: case Ustcall: case Init: case Funarg:
        !           408:        case Fld: case Starg:
        !           409:                return(sideffects(p->left));
        !           410:        case Auto: case Reg: case Name: case Param: case Icon:
        !           411:        case Snode: case Rnode: case Qnode:
        !           412:                return(0);
        !           413:        default:
        !           414:                cerror("unk mnod in sideffects");
        !           415:        }
        !           416: }
        !           417: /* to make up for pointless 9th edition name change */
        !           418: char *
        !           419: index(s, c)
        !           420: char *s;
        !           421: {
        !           422:        return(strchr(s, c));
        !           423: }
        !           424: 
        !           425: char *
        !           426: rindex(s, c)
        !           427: {
        !           428:        return(strrchr(s, c));
        !           429: }
        !           430: 
        !           431: overr()
        !           432: {
        !           433:        cerror("expression too complicated");
        !           434: }

unix.superglobalmegacorp.com

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