Annotation of researchv10no/cmd/ccom/vax/tests/8.i, revision 1.1.1.1

1.1       root        1: /* gencode.c */
                      2: extern struct  _iobuf {
                      3:        int     _cnt;
                      4:        unsigned char   *_ptr;
                      5:        unsigned char   *_base;
                      6:        short   _flag;
                      7:        char    _file;
                      8: } _iob[20];
                      9: struct _iobuf  *fopen();
                     10: struct _iobuf  *fdopen();
                     11: struct _iobuf  *freopen();
                     12: long   ftell();
                     13: char   *fgets();
                     14:        char            *hash();
                     15:        char            *savestr();
                     16:        char            *tstr();
                     17:        extern int      tstrused;
                     18:        extern char     *tstrbuf[];
                     19:        extern char     **curtstr;
                     20: extern int nerrors;  
                     21: typedef union ndu NODE;
                     22: typedef unsigned int TWORD;
                     23: typedef long CONSZ;  
                     24: extern int dope[];  
                     25: extern char *opst[];  
                     26: union ndu {
                     27:        struct {
                     28:                int op;
                     29:                int goal;
                     30:                TWORD type;
                     31:                int cst[(6+4)];
                     32:                char * name;
                     33:                char pad[8  -sizeof(char *)];   
                     34:                NODE *left;
                     35:                NODE *right;
                     36:        }in;    
                     37:        
                     38:        struct {
                     39:                int op;
                     40:                int goal;
                     41:                TWORD type;
                     42:                int cst[(6+4)];
                     43:                char * name;
                     44:                char pad[8  -sizeof(char *)];   
                     45:                CONSZ lval;
                     46:                int rval;
                     47:        }tn;    
                     48:        
                     49:        struct {
                     50:                int op;
                     51:                int goal;
                     52:                TWORD type;
                     53:                int cst[(6+4)];
                     54:                int label;  
                     55:                int lop;  
                     56:        }bn;    
                     57:        struct {
                     58:                int op;
                     59:                int goal;
                     60:                TWORD type;
                     61:                int cst[(6+4)];
                     62:                int stsize;  
                     63:                short stalign;  
                     64:                short argsize;  
                     65:        }stn;   
                     66:        struct {
                     67:                int op;
                     68:                int goal;
                     69:                TWORD type;
                     70:                int cdim;
                     71:                int csiz;
                     72:        }fn;    
                     73:        
                     74:        struct {
                     75:                
                     76:                int op;
                     77:                int goal;
                     78:                TWORD type;
                     79:                int cdim;
                     80:                int csiz;
                     81:                double dval;
                     82:        }fpn;   
                     83: };
                     84: extern int busy[];
                     85: extern NODE node[];
                     86: typedef struct shape SHAPE;
                     87:        
                     88: extern struct shape {
                     89:        int     op;     
                     90:        SHAPE   *sl;    
                     91:        SHAPE   *sr;
                     92:        int     sh;     
                     93:        int     sc;     
                     94: } shapes[];
                     95: extern SHAPE   *pshape[];
                     96: typedef struct optab OPTAB;
                     97: struct optab {
                     98:        int     op;     
                     99:        int     tyop;   
                    100:        OPTAB   *nextop;
                    101:        SHAPE   **lshape;       
                    102:        int     ltype;          
                    103:        SHAPE   **rshape;       
                    104:        int     rtype;
                    105:        int     needs;
                    106:        int     rewrite;
                    107:        char    *cstring;
                    108:        int     cost;
                    109:        int     lcount;         
                    110:        int     rcount;         
                    111:        int     stinline;       
                    112: };
                    113: extern OPTAB
                    114:        *match(),
                    115:        *ophead[],
                    116:        table[];
                    117: extern NODE resc[];
                    118: extern int tmpoff;
                    119: extern int maxboff;
                    120: extern int maxtemp;
                    121: extern int maxarg;
                    122: extern int ftnno;
                    123: extern int sideff;
                    124: extern NODE
                    125:        *talloc(),
                    126:        *ind2type(),
                    127:        *tcopy(),
                    128:        *getadr(),
                    129:        *getlr();
                    130: extern CONSZ rdin();
                    131: extern char *rnames[];
                    132: extern int lineno;
                    133: extern char ftitle[];
                    134: extern int fldshf, fldsz;
                    135: extern int lflag, udebug, e2debug, odebug, rdebug, radebug, sdebug;
                    136: extern int fast;  
                    137: typedef struct inst INST;
                    138: struct inst {
                    139:        NODE    *p;
                    140:        OPTAB   *q;
                    141:        int     goal;
                    142: };
                    143: extern INST inst[300];
                    144: extern nins;
                    145: typedef SHAPE  *SHTABLE[2][20];
                    146: extern SHTABLE sha;
                    147: typedef struct {
                    148:        unsigned char ans;
                    149:        unsigned char regmask;
                    150:        unsigned short flag;
                    151: } ret;
                    152: ret doit(), allocreg(), reg0(), indir(), tostack();
                    153: char *genjmp();
                    154: char bufs[128][64];
                    155: char *buf;
                    156: char prbuf[10240];
                    157: char *prptr;
                    158: NODE *copytree(), *gimmenode();
                    159: extern int ntree;
                    160: typedef int jmp_buf[10];
                    161: jmp_buf back;
                    162: int acnt;
                    163: gencode(p)
                    164: NODE *p;
                    165: {      NODE *q;
                    166:        if(setjmp(back)) {
                    167:                pr("#\treg\t%d\n", ++acnt);
                    168:                if(acnt > 20) {
                    169:                        prtree(q);
                    170:                        outpr();
                    171:                        return;
                    172:                }
                    173:        }
                    174:        else
                    175:                q = copytree(p);
                    176:        buf = bufs[1];
                    177:        prptr = prbuf;
                    178:        (void) doit(q, 0, 0, 0x3f);
                    179:        acnt = ntree = 0;
                    180:        outpr();
                    181: }
                    182: ret
                    183: doit(p, flag, dest, regmask)
                    184: NODE *p;
                    185: ret dest;
                    186: {      ret s, t, x;
                    187:        char *pp;
                    188:        NODE snode, *q;
                    189:        int i, j;
                    190:        switch(p->in.op) {
                    191:        default:
                    192:                pr("#\tweird??? %d\n", p->in.op);
                    193:                return(dest);
                    194:        case 1+ 14:
                    195:                flag |= 256;
                    196:                flag &= ~1;
                    197:        case 14:
                    198:                
                    199:                t = doit(p->in.left, 2, 0, regmask);
                    200:                regmask &= ~t.regmask;
                    201:                s = doit(p->in.right, 2, 0, regmask);
                    202:                if(s.flag & 1024) {
                    203:                        totemp(p, 0);
                    204:                        longjmp(back, 1);
                    205:                }
                    206:                regmask &= ~s.regmask;
                    207:                if(flag & 1) {
                    208:                        pr("#\tbit%c\t%s,%s\n", childtype(p),   bufs[s.ans],    bufs[t.ans]);
                    209:                        dest.ans = 0;
                    210:                        dest.flag = 1;
                    211:                        dest.regmask = 0;
                    212:                        return(dest);
                    213:                }
                    214:                if(flag & 256)
                    215:                        dest = x = t;
                    216:                if(dest.ans == 0)
                    217:                        if(s.flag & 16)
                    218:                                dest = x = s;
                    219:                        else if(t.flag & 16)
                    220:                                dest = x = t;
                    221:                        else
                    222:                                dest = x = allocreg(p, regmask);
                    223:                else
                    224:                        x = allocreg(p, regmask);
                    225:                if(p->in.right->in.op == 4) {
                    226:                        x = tostack();  
                    227:                        sprintf(        bufs[x.ans], "$%d", -p->in.right->tn.lval - 1);
                    228:                }
                    229:                else
                    230:                        pr("#\tmcom%c\t%s,%s\n", childtype(p),  bufs[s.ans],    bufs[x.ans]);
                    231:                if(strcmp(      bufs[t.ans],    bufs[dest.ans]) == 0)
                    232:                        pr("#\tbic%c2\t%s,%s\n", childtype(p),  bufs[x.ans],    bufs[dest.ans]);
                    233:                else
                    234:                        pr("#\tbic%c3\t%s,%s,%s\n", childtype(p),       bufs[x.ans],
                    235:                                        bufs[t.ans],    bufs[dest.ans]);
                    236:                dest.flag |= 1;
                    237:                return(dest);
                    238:        case 70:
                    239: call:
                    240:                funargs(p->in.right, regmask);
                    241:                i = p->stn.argsize/32;
                    242: called:
                    243:                s = doit(p->in.left, 2|8, 0, regmask & ~3);
                    244:                pp =    bufs[s.ans];
                    245: aftercall:
                    246:                if(regmask != 0x3f) {
                    247:                        s.flag = 1024;
                    248:                        return(s);
                    249:                }
                    250:                x = reg0(p, regmask);
                    251:                pr("#\tcalls\t$%d,%s\n", i, pp);
                    252:                if(p->in.op == 100 || p->in.op == 2+ 100 || (flag & 8)) {
                    253:                        strcat( bufs[x.ans], ")");
                    254:                        strshift(       bufs[x.ans], 1);
                    255:                                bufs[x.ans][0] = '(';
                    256:                }
                    257:                if(dest.ans == 0)
                    258:                        if(flag & 256)
                    259:                                dest = doit(p->in.left->in.op == 104?
                    260:                                        p->in.left->in.left:
                    261:                                        p->in.left, 0, 0, regmask & ~x.regmask);
                    262:                        else
                    263:                                return(x);
                    264: movexdest:     
                    265:                if(strcmp(      bufs[x.ans],    bufs[dest.ans]) == 0)
                    266:                        return(x);
                    267:                if(flag & 4)
                    268:                        pr("#\tpush%c\t%s\n", type(p),  bufs[x.ans]);
                    269:                else
                    270:                        pr("#\tmov%c\t%s,%s\n", type(p),        bufs[x.ans],    bufs[dest.ans]);
                    271:                dest.flag |= 1;
                    272:                return(dest);
                    273:        case 111:
                    274:                s = doit(p->in.left, 2, 0, regmask);
                    275:                regmask &= ~s.regmask;
                    276:                t = doit(p->in.right, 2, 0, regmask);
                    277:                if(t.flag & 1024) {
                    278:                        totemp(p, 0);
                    279:                        longjmp(back, 1);
                    280:                }
                    281:                pr("#\tcmp%c\t%s,%s\n", childtype(p),   bufs[s.ans],    bufs[t.ans]);
                    282:                dest.ans = dest.regmask = 0;
                    283:                dest.flag = 1;
                    284:                return(dest);
                    285:        case 59:        
                    286:                if(p->in.left->in.op == 108) {
                    287:                        if(dest.ans == 0) {
                    288:                                dest = allocreg(p, regmask);
                    289:                        }
                    290:                        (void) doit(p->in.left, 2, dest, regmask);
                    291:                }
                    292:                else
                    293:                        (void) doit(p->in.left, 0, 0, regmask);
                    294:                s = doit(p->in.right, 2, dest, regmask);
                    295:                if(flag & 8) {
                    296:                        dest.ans = 0;
                    297:                        i = (s.flag & (128|512|16));
                    298:                        j = s.regmask;
                    299:                        buf =   bufs[s.ans];
                    300:                        goto convbuf;
                    301:                }
                    302:                return(s);
                    303:        case 77:
                    304:                s = doit(p->in.left, 2, 0, regmask);
                    305:                if(dest.ans == 0)
                    306:                        if(s.flag & 16)
                    307:                                dest = s;
                    308:                        else
                    309:                                dest = allocreg(p, regmask & ~s.regmask);
                    310:                pr("#\tmcom%c\t%s,%s\n", childtype(p),  bufs[s.ans],    bufs[dest.ans]);
                    311:                dest.flag |= 1;
                    312:                return(dest);
                    313:        case 104:
                    314:                if(p->in.left->in.op == 58 && p->in.left->in.left->in.op == (2+ 11)) {
                    315:                        if(dest.ans == 0) {
                    316:                                dest = allocreg(p, regmask);
                    317:                                s = doit(p->in.left, 2, dest, regmask);
                    318:                        }
                    319:                        else {
                    320:                                x = allocreg(p, regmask);
                    321:                                s = doit(p->in.left, 2, x, regmask & ~x.regmask);
                    322:                        }
                    323:                }
                    324:                else
                    325:                        s = doit(p->in.left, 2, 0, regmask);
                    326:                regmask &= ~s.regmask;
                    327:                if(childtype(p) == type(p))
                    328:                        return(s);
                    329:                if(dest.ans == 0)
                    330:                        if(s.flag & 16)
                    331:                                dest = s;
                    332:                        else
                    333:                                dest = allocreg(p, regmask);
                    334:                if(isunsigned(p->in.left) && incrsize(p) > incrsize(p->in.left)
                    335:                        && type(p) != 'f' && type(p) != 'd')
                    336:                        pp = "movz";    
                    337:                else
                    338:                        pp = "cvt";
                    339:                pr("#\t%s%c%c\t%s,%s\n", pp, childtype(p), type(p),     bufs[s.ans],    bufs[dest.ans]);
                    340:                dest.flag |= 1;
                    341:                return(dest);
                    342:        case 79:
                    343:                i = -1;
                    344:                pp = "sub";
                    345: incrop:
                    346:                if(p->in.right->in.op != 4)
                    347:                        fflush((&_iob[1])), cerror("codegen! incrop not with ICON");
                    348:                s = doit(p->in.left, 0, 0, regmask);
                    349:                t = doit(p->in.right, 0, 0, 0);
                    350:                if(flag & 2) {
                    351:                        if(dest.ans == 0)
                    352:                                dest = allocreg(p, regmask & ~s.regmask);
                    353:                        pr("#\tmov%c\t%s,%s\n", childtype(p),   bufs[s.ans],    bufs[dest.ans]);
                    354:                        if(t.flag & 64) {
                    355:                                if(i == 1)
                    356:                                        pp = "inc";
                    357:                                else
                    358:                                        pp = "dec";
                    359:                                pr("#\t%s%c\t%s\n", pp, childtype(p),   bufs[s.ans]);
                    360:                        }
                    361:                        else
                    362:                                pr("#\t%s%c2\t%s,%s\n", pp, childtype(p),
                    363:                                                bufs[t.ans],    bufs[s.ans]);
                    364:                        if(flag & 8) {
                    365:                                s = dest;
                    366:                                goto inreg;
                    367:                        }
                    368:                        dest.flag &= ~1;
                    369:                        return(dest);
                    370:                }
                    371:                if(t.flag & 64) {
                    372:                        if(i == 1)
                    373:                                pp = "inc";
                    374:                        else
                    375:                                pp = "dec";
                    376:                        pr("#\t%s%c\t%s\n", pp, childtype(p),   bufs[s.ans]);
                    377:                }
                    378:                else
                    379:                        pr("#\t%s%c2\t%s,%s\n", pp, childtype(p),       bufs[t.ans],    bufs[s.ans]);
                    380:                if(dest.ans) {
                    381:                        x = s;
                    382:                        goto movexdest;
                    383:                }
                    384:                s.flag |= 1;
                    385:                return(s);
                    386:        case 1+ 60:
                    387:                flag |= 256;
                    388:        case 60:
                    389:                
                    390:                if(!isunsigned(p->in.left)) {
                    391:                        if(p->in.left->in.op == 104 && type(p) == childtype(p->in.left)) {
                    392:                                p->in.left = p->in.left->in.left;
                    393:                        }
                    394:                        if(p->in.right->in.op == 104 && type(p) == childtype(p->in.right)) {
                    395:                                p->in.right = p->in.right->in.left;
                    396:                        }
                    397:                        pp = "div";
                    398:                        goto binop;
                    399:                }
                    400:                pp = "udiv";
                    401: unsdiv:
                    402:                if(incrsize(p->in.right) != 4) {
                    403:                        snode.in.op = 104;
                    404:                        snode.in.left = p->in.right;
                    405:                        snode.in.type =         01000;
                    406:                        s = doit(&snode, 2|4, tostack(), regmask);
                    407:                }
                    408:                else
                    409:                        s = doit(p->in.right, 4, tostack(), regmask);
                    410:                regmask &= ~s.regmask;
                    411:                if(incrsize(p->in.left) != 4) {         
                    412:                        snode.in.op = 104;
                    413:                        snode.in.left = p->in.left;
                    414:                        snode.in.type =         01000;
                    415:                        t = doit(&snode, 2|4, tostack(), regmask);
                    416:                }
                    417:                else
                    418:                        t = doit(p->in.left, 4, tostack(), regmask);
                    419:                if(t.flag & 1024) {
                    420:                        totemp(p, 1);
                    421:                        longjmp(back, 1);
                    422:                }
                    423:                i = 2;
                    424:                goto aftercall;
                    425:        case 1+ 19:
                    426:                flag |= 256;
                    427:        case 19:
                    428:                pp = "xor";
                    429: binop:
                    430:                t = doit(p->in.left, 2, 0, regmask);
                    431:                regmask &= ~t.regmask;
                    432:                s = doit(p->in.right, 2, 0, regmask);
                    433:                if(s.flag & 1024) {
                    434:                        totemp(p, 0);
                    435:                        longjmp(back, 1);
                    436:                }
                    437:                regmask &= ~s.regmask;
                    438:                if(type(p) != childtype(p)) {
                    439:                        x = allocreg(p, regmask);
                    440:                        pr("#\t%s%c3\t%s,%s,%s\n", pp, childtype(p),    bufs[s.ans],
                    441:                                        bufs[t.ans],    bufs[x.ans]);
                    442:                        if(dest.ans == 0)
                    443:                                dest = x;
                    444:                        pr("#\tcvt%c%c\t%s,%s\n", childtype(p), type(p),
                    445:                                        bufs[x.ans],    bufs[dest.ans]);
                    446:                        dest.flag |= 1;
                    447:                        return(dest);
                    448:                }       
                    449:                if(dest.ans == 0)       
                    450:                        if((t.flag & 16) || (flag & 256)) {
                    451: twoop:
                    452:                                dest = t;
                    453:                                if(*pp == 'a' && (s.flag & 64))
                    454:                                        pr("#\tinc%c\t%s\n", childtype(p),      bufs[t.ans]);
                    455:                                else if(*pp == 's' && (s.flag & 64))
                    456:                                        pr("#\tdec%c\t%s\n", childtype(p),      bufs[t.ans]);
                    457:                                else
                    458:                                        pr("#\t%s%c2\t%s,%s\n", pp, childtype(p),
                    459:                                                        bufs[s.ans],    bufs[t.ans]);
                    460:                                if(flag & 8)
                    461:                                        goto binopaddr;
                    462:                                dest.flag |= 1;
                    463:                                return(dest);
                    464:                        }
                    465:                        else if(s.flag & 16)
                    466:                                dest = s;
                    467:                        else
                    468:                                dest = allocreg(p, regmask);
                    469:                if((*pp == 'a' || *pp == 'm' || *pp == 'x' || *pp == 'b')
                    470:                        && strcmp(      bufs[s.ans],    bufs[dest.ans]) == 0) {
                    471:                        dest = s;
                    472:                        s = t;
                    473:                        t = dest;
                    474:                        goto twoop;
                    475:                }
                    476:                pr("#\t%s%c3\t%s,%s,%s\n", pp, childtype(p),    bufs[s.ans],    bufs[t.ans],    bufs[dest.ans]);
                    477: binopaddr:
                    478:                if(flag & 8) {
                    479:                        if(dest.flag & 128) {
                    480:                                strcat( bufs[dest.ans], ")");
                    481:                                strshift(       bufs[dest.ans], 1);
                    482:                                        bufs[dest.ans][0] = '(';
                    483:                                return(dest);
                    484:                        }
                    485:                        if(dest.flag & 512) {
                    486:                                strshift(       bufs[dest.ans], 1);
                    487:                                        bufs[dest.ans][0] = '*';
                    488:                                dest.flag &= ~512;
                    489:                                return(dest);
                    490:                        }
                    491:                        dest.flag = 1024;       
                    492:                        return(dest);
                    493:                }
                    494:                dest.flag |= 1;
                    495:                return(dest);   
                    496:        case 103:
                    497:                
                    498:                s = doit(p->in.left, 0, 0, regmask);
                    499:                if(dest.ans == 0)
                    500:                        dest = allocreg(p, regmask & ~s.regmask);
                    501:                pr("#\text%sv\t$%d,$%d,%s,%s\n", isunsigned(p->in.left)? "z": "",
                    502:                        p->tn.rval/64, p->tn.rval%64,   bufs[s.ans],    bufs[dest.ans]);
                    503:                dest.flag |= 1;
                    504:                return(dest);
                    505:        case 110:
                    506:                s = doit(p->in.left, 1|2, 0, regmask);
                    507:                pp = genjmp(p->bn.lop);
                    508:                if(s.flag & 1)
                    509:                        pr("#\t%s\tL%d\n", pp, p->bn.label);
                    510:                else
                    511:                        pr("#\ttst%c\t%s\n#\t%s\tL%d\n", childtype(p),  bufs[s.ans],
                    512:                                pp, p->bn.label);
                    513:                s.flag |= 1;
                    514:                return(s);
                    515:        case 108:
                    516:                s = doit(p->in.left, flag, dest, regmask);
                    517:                pr("#L%d:\n", p->bn.label);
                    518:                return(s);
                    519:        case 112:
                    520:                (void) doit(p->in.left, 0, dest, regmask);
                    521:                pr("#\tjbr\tL%d\n", p->bn.label);
                    522:                s.ans = s.regmask = s.flag = 0;
                    523:                return(s);
                    524:        case 4:
                    525:                if(p->tn.name)
                    526:                        if(p->tn.lval)
                    527:                                sprintf(buf, "%s+%d", p->tn.name, p->tn.lval);
                    528:                        else
                    529:                                sprintf(buf, "%s", p->tn.name);
                    530:                else
                    531:                        sprintf(buf, "%d", p->tn.lval);
                    532:                if(!(flag & 8)) {
                    533:                        strshift(buf, 1);;
                    534:                        buf[0] = '$';
                    535:                }
                    536:                i = 0;
                    537:                if(p->tn.name == 0)
                    538:                        if(p->tn.lval == 0)
                    539:                                i = 32;
                    540:                        else if(p->tn.lval == 1)
                    541:                                i = 64;
                    542:                j = 0;
                    543: convbuf:       
                    544:                if(dest.ans == 0) {
                    545:                        if(p->in.op == 4 || !(flag & 8)) {
                    546:                                 s.ans = (buf - bufs[0])/64; buf += 64; s.flag =  i; s.regmask =  j; return(s);
                    547:                        }
                    548:                        if(i & 512) {
                    549:                                strshift(buf, 1);
                    550:                                buf[0] = '*';
                    551:                                 s.ans = (buf - bufs[0])/64; buf += 64; s.flag =  i & ~512; s.regmask =  j; return(s);
                    552:                        }
                    553:                        if(i & 128) {
                    554:                                strcat(buf, ")");
                    555:                                strshift(buf, 1);
                    556:                                buf[0] = '(';
                    557:                                 s.ans = (buf - bufs[0])/64; buf += 64; s.flag =  i; s.regmask =  j; return(s);
                    558:                        }
                    559:                        pp = buf;
                    560:                        buf += 64;
                    561:                        s = allocreg(p, regmask);
                    562:                        pr("#\tmov%c\t%s,%s\n", type(p), pp,    bufs[s.ans]);
                    563:                        flag &= ~8;
                    564:                        goto inreg;
                    565:                }
                    566:                if(flag & 4)
                    567:                        if(p->in.type != 040)
                    568:                                pr("#\tpushl\t%s\n", buf);
                    569:                        else
                    570:                                pr("#\tmovd\t%s,%s\n", buf,     bufs[dest.ans]);
                    571:                else if(i & 32)
                    572:                        pr("#\tclr%c\t%s\n", type(p),   bufs[dest.ans]);
                    573:                else    
                    574:                        pr("#\tmov%c\t%s,%s\n", type(p), buf,   bufs[dest.ans]);
                    575:                dest.flag |= 1;
                    576:                return(dest);
                    577:        case 78:
                    578:                i = 1;
                    579:                pp = "add";
                    580:                goto incrop;
                    581:        case 113:       
                    582:                s = doit(p->in.left, 8, 0, 0);
                    583:                pr("#\t.long\t%s\n",    bufs[s.ans]);
                    584:                return(dest);
                    585:        case 1+ 64:
                    586:                flag |= 256;
                    587:        case 64:
                    588:                s = doit(p->in.left, 2, 0, regmask);
                    589:                regmask &= ~s.flag;
                    590:                t = doit(p->in.right, 2, 0, regmask);
                    591:                if(t.flag & 1024) {
                    592:                        totemp(p, 0);
                    593:                        longjmp(back, 1);
                    594:                }
                    595:                regmask &= ~t.regmask;
                    596:                if(dest.ans == 0)
                    597:                        if((s.flag & 16) || (flag & 256))
                    598:                                dest = s;
                    599:                        else
                    600:                                dest = allocreg(p, regmask);
                    601:                pr("#\tashl\t%s,%s,%s\n",       bufs[t.ans],    bufs[s.ans],    bufs[dest.ans]);
                    602:                dest.flag |= 1;
                    603:                return(dest);
                    604:        case 1+ 8:
                    605:                if(p->in.right->in.op == 4) {
                    606:                        i = -1;
                    607:                        pp = "sub";
                    608:                        flag &= ~2;
                    609:                        goto incrop;
                    610:                }
                    611:                flag |= 256;
                    612:        case 8:
                    613:                pp = "sub";
                    614:                goto binop;
                    615:        case 1+ 62:
                    616:                flag |= 256;
                    617:                if(p->in.left->in.op == 104 && !isunsigned(p)) {
                    618:                        snode = *p;
                    619:                        snode.in.left = p->in.left->in.left;
                    620:                        p = &snode;
                    621:                }
                    622:        case 62:
                    623:                if(isunsigned(p)) {
                    624:                        pp = "urem";
                    625:                        goto unsdiv;
                    626:                }
                    627:                s = doit(p->in.left, 2, 0, regmask);
                    628:                regmask &= ~s.regmask;
                    629:                t = doit(p->in.right, 2, 0, regmask);
                    630:                regmask &= ~t.regmask;
                    631:                x = allocreg(p, regmask);
                    632:                pr("#\tdiv%c3\t%s,%s,%s\n", childtype(p),       bufs[t.ans],    bufs[s.ans],    bufs[x.ans]);
                    633:                pr("#\tmul%c2\t%s,%s\n", childtype(p),  bufs[t.ans],    bufs[x.ans]);
                    634:                pr("#\tsub%c3\t%s,%s,%s\n", childtype(p),       bufs[x.ans],    bufs[s.ans],    bufs[x.ans]);
                    635:                if(dest.ans)
                    636:                        goto movexdest;
                    637:                if(flag & 256) {
                    638:                        dest = s;
                    639:                        goto movexdest;
                    640:                }
                    641:                x.flag |= 1;
                    642:                return(x);
                    643:        case 1+ 11:
                    644:                flag |= 256;
                    645:        case 11:
                    646:                pp = "mul";
                    647:                goto binop;
                    648:        case 2: 
                    649:                if(p->tn.lval)
                    650:                        sprintf(buf, "%s+%d", p->tn.name, p->tn.lval);
                    651:                else if(p->tn.name)
                    652:                        sprintf(buf, "%s", p->tn.name);
                    653:                else
                    654:                        sprintf(buf, "0");
                    655:                j = 0;
                    656:                i = 512;
                    657:                goto convbuf;
                    658:        case 1+ 17:
                    659:                flag |= 256;
                    660:        case 17:
                    661:                pp = "bis";
                    662:                goto binop;
                    663:        case 1+ 6:
                    664:                if(p->in.right->in.op == 4) {
                    665:                        i = 1;
                    666:                        pp = "add";
                    667:                        flag &= ~2;
                    668:                        goto incrop;
                    669:                }
                    670:                flag |= 256;
                    671:        case 6:
                    672:                pp = "add";
                    673:                goto binop;
                    674:        case 94:
                    675:                sprintf(buf, "r%d", p->tn.rval);
                    676:                j = 0;
                    677:                i = 128;
                    678:                goto convbuf;
                    679:        case 118: case 119:
                    680:                x = reg0(p, 3);
                    681:                x.regmask = 0;
                    682:                if(dest.ans)
                    683:                        goto movexdest;
                    684:                return(x);
                    685:        case 120:
                    686:                return(reg0(p, regmask));
                    687:        case 1+ 66:
                    688:                flag |= 256;
                    689:        case 66:
                    690:                s = doit(p->in.left, 2, 0, regmask);
                    691:                regmask &= ~s.regmask;
                    692:                if(dest.ans == 0)
                    693:                        if((flag & 256) || (s.flag & 16))
                    694:                                dest = s;
                    695:                        else
                    696:                                dest = allocreg(p, regmask);
                    697:                dest.flag |= 1;
                    698:                regmask &= ~dest.regmask;
                    699:                if(p->in.right->in.op == 4 && (i = p->in.right->tn.lval) >= 0) {
                    700:                        pr("#\textv\t$%d,$%d,%s,%s\n", i, 32 - i,       bufs[s.ans],    bufs[dest.ans]);
                    701:                        return(dest);
                    702:                }
                    703:                t = doit(p->in.right, 2, 0, regmask);
                    704:                regmask &= ~t.regmask;
                    705:                x = allocreg(p, regmask);
                    706:                pr("#\tmnegl\t%s,%s\n",         bufs[t.ans],    bufs[x.ans]);
                    707:                pr("#\tashl\t%s,%s,%s\n",       bufs[x.ans],    bufs[s.ans],    bufs[dest.ans]);
                    708:                return(dest);
                    709:        case (2+ 11):
                    710:                switch(p->in.left->in.op) {
                    711:                case 116:
                    712:                case 117:
                    713:                case 2:
                    714:                        s = doit(p->in.left, 2, 0, regmask);
                    715:                        sprintf(buf, "*%s",     bufs[s.ans]);
                    716:                        j = i = 0;
                    717:                        goto convbuf;
                    718:                case 94:
                    719:                        s = doit(p->in.left, 2, 0, regmask);
                    720: inreg:
                    721:                        if(s.flag & 128) {
                    722:                                sprintf(buf, "(%s)",    bufs[s.ans]);
                    723:                                j = 0;
                    724:                                i = 512;
                    725:                                goto convbuf;
                    726:                        }
                    727:                        else if(s.flag & 512) {
                    728:                                sprintf(buf, "*%s",     bufs[s.ans]);
                    729:                                j = 0;
                    730:                                i = 0;
                    731:                                goto convbuf;
                    732:                        }
                    733:                        else {
                    734:                                s.flag = 1024;
                    735:                                return(s);
                    736:                        }
                    737:                }
                    738:                q = p->in.left;
                    739:                if(q->in.op == 78
                    740:                        && q->in.right->in.op == 4 && q->in.left->in.op == 94
                    741:                        && incrsize(p) == (int) q->in.right->tn.lval) {
                    742:                        s = doit(q->in.left, 2, 0, regmask);
                    743:                        sprintf(buf, "(%s)+",   bufs[s.ans]);
                    744:                        i = 0;
                    745:                        j = s.regmask;
                    746:                        goto convbuf;
                    747:                }
                    748:                if(q->in.op == 6 && q->in.left->in.op == 64
                    749:                        && q->in.left->in.right->in.op == 4
                    750:                        && shiftsize(p) == (int) q->in.left->in.right->tn.lval) {
                    751:                        s = doit(q->in.left->in.left, 2, 0, regmask);
                    752:                        regmask &= ~s.regmask;
                    753:                        if(!(s.flag & 128)) {
                    754:                                x = allocreg(p, regmask);
                    755:                                pr("#\tmov%c\t%s,%s\n", childtype(q),   bufs[s.ans],    bufs[x.ans]);
                    756:                                regmask |= s.regmask;
                    757:                                regmask &= ~x.regmask;
                    758:                                s = x;
                    759:                        }
                    760:                        t = doit(q->in.right, 8, 0, regmask);
                    761:                        sprintf(buf, "%s[%s]",  bufs[t.ans],    bufs[s.ans]);
                    762:                        i = 0;
                    763:                        j = s.regmask;
                    764:                        goto convbuf;
                    765:                }
                    766:                if(q->in.op == 6
                    767:                        && (q->in.right->in.op == 4 || q->in.right->in.op == 2)) {
                    768:                        s = doit(q->in.left, 2, 0, regmask);
                    769:                        regmask &= ~s.regmask;
                    770:                        if(!(s.flag & 128)) {
                    771:                                x = allocreg(p, regmask);
                    772:                                pr("#\tmov%c\t%s,%s\n", childtype(q),   bufs[s.ans],    bufs[x.ans]);
                    773:                                regmask |= s.regmask;
                    774:                                regmask &= ~x.regmask;
                    775:                                s = x;
                    776:                        }
                    777:                        t = doit(q->in.right, 8, 0, regmask);
                    778:                        sprintf(buf, "%s(%s)",  bufs[t.ans],    bufs[s.ans]);
                    779:                        i = 512;
                    780:                        j = s.regmask;
                    781:                        goto convbuf;
                    782:                }
                    783:                if(q->in.op == 8 && q->in.right->in.op == 4) {
                    784:                        s = doit(q->in.left, 2, 0, regmask);
                    785:                        regmask &= ~s.regmask;
                    786:                        if(!(s.flag & 128)) {
                    787:                                x = allocreg(p, regmask);
                    788:                                pr("#\tmov%c\t%s,%s\n", childtype(q),   bufs[s.ans],    bufs[x.ans]);
                    789:                                regmask |= s.regmask;
                    790:                                regmask &= ~x.regmask;
                    791:                                s = x;
                    792:                                if(!(s.flag & 128)) {
                    793:                                        s.flag = 1024;
                    794:                                        return(s);
                    795:                                }
                    796:                        }
                    797:                        sprintf(buf, "%d(%s)", -q->in.right->tn.lval,   bufs[s.ans]);
                    798:                        i = 512;
                    799:                        j = s.regmask;
                    800:                        goto convbuf;
                    801:                }
                    802:                if(q->in.op == 1+ 8
                    803:                        && q->in.right->in.op == 4 && q->in.left->in.op == 94
                    804:                        && incrsize(p) == (int) q->in.right->tn.lval) {
                    805:                        s = doit(q->in.left, 2, 0, regmask);
                    806:                        sprintf(buf, "-(%s)",   bufs[s.ans]);
                    807:                        i = 0;
                    808:                        j = s.regmask;
                    809:                        goto convbuf;
                    810:                }
                    811:                if(q->in.op == 6 && q->in.left->in.op == 94
                    812:                        && q->in.right->in.op == 94) {
                    813:                        sprintf(buf, "(r%d)[r%d]", q->in.right->tn.rval,
                    814:                                q->in.left->tn.rval);
                    815:                        i = 0;
                    816:                        j = 0;
                    817:                        goto convbuf;
                    818:                }
                    819:                s = doit(p->in.left, 2, 0, regmask);
                    820:                if(s.flag & 1024)
                    821:                        return(s);
                    822:                regmask &= ~s.regmask;
                    823:                if(s.flag & 512) {
                    824:                        sprintf(buf, "*%s",     bufs[s.ans]);
                    825:                        i = 0;
                    826:                        j = s.regmask;
                    827:                        goto convbuf;
                    828:                }
                    829:                if(!(s.flag & 128)) {
                    830:                        x = allocreg(p, regmask);
                    831:                        pr("#\tmov%c\t%s,%s\n", childtype(q),   bufs[s.ans],    bufs[x.ans]);
                    832:                        regmask |= s.regmask;
                    833:                        regmask &= ~x.regmask;
                    834:                        s = x;
                    835:                }
                    836:                if(!(s.flag & 128)) {
                    837:                        s.flag = 1024;
                    838:                        return(s);
                    839:                }
                    840:                sprintf(buf, "(%s)",    bufs[s.ans]);
                    841:                i = 0;
                    842:                j = s.regmask;
                    843:                goto convbuf;
                    844:        case 98:
                    845:                if(p->stn.stsize/8 == 4) {
                    846:                        i = 'l';
                    847: stasg:
                    848:                        s = doit(p->in.right, 2|8, 0, regmask);
                    849:                        regmask &= ~s.regmask;
                    850:                        t = doit(p->in.left, 2|8, 0, regmask);
                    851:                        pr("#\tmov%c\t%s,%s\n", i,      bufs[s.ans],    bufs[t.ans]);
                    852:                        s.regmask = s.flag = 0;
                    853:                        return(s);
                    854:                }
                    855:                else if(p->stn.stsize/8 == 8) {
                    856:                        i = 'q';
                    857:                        goto stasg;
                    858:                }
                    859:                if(regmask != 0x3f) {
                    860:                        s.flag = 1024;
                    861:                        return(s);
                    862:                }
                    863:                s = doit(p->in.right, 2|8, 0, regmask);
                    864:                regmask &= ~s.regmask;
                    865:                t = doit(p->in.left, 2|8, 0, regmask);
                    866:                pr("#\tmovc3\t$%d,%s,%s\n", p->stn.stsize/8,    bufs[s.ans],    bufs[t.ans]);
                    867:                s.regmask = s.flag = 0;
                    868:                return(s);
                    869:        case 100:
                    870:                goto call;
                    871:        case 116:
                    872:                sprintf(buf, "%d(fp)", p->tn.lval);
                    873:                j = 0;
                    874:                i = 512;
                    875:                goto convbuf;
                    876:        case 117:
                    877:                sprintf(buf, "%d(ap)", p->tn.lval);
                    878:                j = 0;
                    879:                i = 512;
                    880:                goto convbuf;
                    881:        case 2+ 14:
                    882:                s = doit(p->in.left, 0, 0, regmask);
                    883:                regmask &= ~s.regmask;
                    884:                if(dest.ans == 0) {
                    885:                        dest = allocreg(p, regmask);
                    886:                }
                    887:                if(flag & 4)
                    888:                        pr("#\tpushal\t%s\n",   bufs[s.ans]);
                    889:                else {
                    890:                        pr("#\tmova%c\t%s,%s\n", childtype(p),  bufs[s.ans],    bufs[dest.ans]);
                    891:                }
                    892:                if(flag & 8) {
                    893:                        if(dest.flag & 128) {
                    894:                                strcat( bufs[dest.ans], ")");
                    895:                                strshift(       bufs[dest.ans], 1);
                    896:                                        bufs[dest.ans][0] = '(';
                    897:                        }
                    898:                        else {
                    899:                                strshift(       bufs[dest.ans], 1);
                    900:                                        bufs[dest.ans][0] = '*';
                    901:                        }
                    902:                }
                    903:                return(dest);
                    904:        case 2+ 70:
                    905:                i = 0;
                    906:                goto called;
                    907:        case 2+ 8:
                    908:                s = doit(p->in.left, 2, 0, regmask);
                    909:                if(dest.ans == 0)
                    910:                        if(s.flag & 16)
                    911:                                dest = s;
                    912:                        else
                    913:                                dest = allocreg(p, regmask & ~s.regmask);
                    914:                pr("#\tmneg%c\t%s,%s\n", childtype(p),  bufs[s.ans],    bufs[dest.ans]);
                    915:                dest.flag |= 1;
                    916:                return(dest);
                    917:        case 2+ 100:
                    918:                i = 0;
                    919:                goto called;
                    920:        case 58:
                    921:                if(p->in.left->in.op == 120 && dest.ans) {
                    922:                        s = doit(p->in.right, 2, dest, regmask);
                    923:                        return(s);
                    924:                }
                    925:                if(p->in.left->in.op == 103) {
                    926:                        s = doit(p->in.left->in.left, 0, 0, regmask);
                    927:                        regmask &= ~s.regmask;
                    928:                        if(p->in.right->in.op == 58) {
                    929:                                x = allocreg(p->in.right, regmask);
                    930:                                t = doit(p->in.right, 2, x, regmask & ~x.regmask);
                    931:                        }
                    932:                        else
                    933:                                t = doit(p->in.right, 2, 0, regmask);
                    934:                        if(t.flag & 1024) {
                    935:                                totemp(p->in.left, 0);
                    936:                                longjmp(back, 1);
                    937:                        }
                    938:                        pr("#\tinsv\t%s,$%d,$%d,%s\n",  bufs[t.ans], p->in.left->tn.rval/64,
                    939:                                p->in.left->tn.rval % 64,       bufs[s.ans]);
                    940:                        t.flag |= 1;
                    941:                        return(t);
                    942:                }
                    943:                if(dest.ans && p->in.left->in.op == (2+ 11)) {
                    944:                        if(dest.flag & 16)
                    945:                                x = dest;
                    946:                        else
                    947:                                x = allocreg(p, regmask);
                    948:                        s = doit(p->in.right, 2, x, regmask);
                    949:                        regmask &= ~s.regmask;
                    950: assignit:
                    951:                        t = doit(p->in.left, 0, 0, regmask);
                    952:                        pr("#\tmov%c\t%s,%s\n", type(p),        bufs[x.ans],    bufs[t.ans]);
                    953:                        if(strcmp(      bufs[x.ans],    bufs[dest.ans]) == 0) {
                    954:                                dest.flag |= 1;
                    955:                                return(dest);
                    956:                        }
                    957:                        goto movexdest;
                    958:                }
                    959:                if(p->in.right->in.op == 119)
                    960:                        t = doit(p->in.left, 0, 0, regmask & ~3);
                    961:                else
                    962:                        t = doit(p->in.left, 0, 0, regmask);
                    963:                regmask &= ~t.regmask;
                    964:                s = doit(p->in.right, 2, t, regmask);
                    965:                if(s.flag & 1024) {
                    966:                
                    967:                        if(dest.ans) {
                    968:                                regmask |= t.regmask;
                    969:                                s = doit(p->in.right, 2, t, regmask);
                    970:                                if(s.flag & 1024)
                    971:                                        return(s);
                    972:                        }
                    973:                        asgwrite(p);
                    974:                        longjmp(back, 1);
                    975:                }
                    976:                if(dest.ans) {
                    977:                        x = s;
                    978:                        goto movexdest;
                    979:                }
                    980:                else if(flag & 8) {
                    981:                        i = (s.flag & (128|512|16));
                    982:                        j = s.regmask;
                    983:                        buf =   bufs[s.ans];
                    984:                        goto convbuf;
                    985:                }
                    986:                s.flag |= 1;
                    987:                return(s);
                    988:        }
                    989: }
                    990: char *
                    991: genjmp(n)
                    992: {
                    993:        switch(n) {
                    994:        default:
                    995:                return("jweird");
                    996:        case 80:
                    997:                return("jeql");
                    998:        case 81:
                    999:                return("jneq");
                   1000:        case 85:
                   1001:                return("jgtr");
                   1002:        case 84:
                   1003:                return("jgeq");
                   1004:        case 83:
                   1005:                return("jlss");
                   1006:        case 82:
                   1007:                return("jleq");
                   1008:        case 89:
                   1009:                return("jgtru");
                   1010:        case 88:
                   1011:                return("jgequ");
                   1012:        case 87:
                   1013:                return("jlssu");
                   1014:        case 86:
                   1015:                return("jlequ");
                   1016:        }
                   1017: }

unix.superglobalmegacorp.com

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