Annotation of researchv9/jerq/sgs/comp/local2.c, revision 1.1.1.1

1.1       root        1: /*     @(#) local2.c : 1.6 3/14/84     */
                      2: /*     local2.c - machine dependent grunge for back end
                      3:  *
                      4:  *             Bellmac32
                      5:  *                     R. J. Mascitti
                      6:  */
                      7: 
                      8: # include "mfile2.h"
                      9: # define istnode(p) (p->in.op==REG && istreg(p->tn.rval))
                     10: # define STHRESH 6     /* max # of words to unroll copy loop */
                     11: 
                     12: static int strcall;    /* have we made a call to a structure function? */
                     13: 
                     14: 
                     15: 
                     16: lineid(l, fn)                  /* identify line l and file fn */
                     17: int l;
                     18: char *fn;
                     19: {
                     20:        printf("#       line %d, file %s\n", l, fn);
                     21: }
                     22: 
                     23: 
                     24: eobl2()                                /* end of function stuff */
                     25: {
                     26:        strcall = 0;
                     27:        eobl2dbg();                     /* very end debug code */
                     28: }
                     29: 
                     30: 
                     31: char *rnames[]=
                     32: {
                     33:        "%r0",
                     34:        "%r1",
                     35:        "%r2",
                     36:        "%r3",
                     37:        "%r4",
                     38:        "%r5",
                     39:        "%r6",
                     40:        "%r7",
                     41:        "%r8"
                     42: };
                     43: 
                     44: static char * ccbranches[] =
                     45: {
                     46:        "je",
                     47:        "jne",
                     48:        "jle",
                     49:        "jl",
                     50:        "jge",
                     51:        "jg",
                     52:        "jleu",
                     53:        "jlu",
                     54:        "jgeu",
                     55:        "jgu"
                     56: };
                     57: 
                     58: static char * arithjump[] =
                     59: {
                     60:        "jz",
                     61:        "jnz",
                     62:        "jnpos",
                     63:        "jneg",
                     64:        "jnneg",
                     65:        "jpos",
                     66:        "jnpos",
                     67:        "jneg",
                     68:        "jnneg",
                     69:        "jpos"
                     70: };
                     71: 
                     72: static int cmpflag = 0;                /* have we done a cmp? */
                     73: 
                     74: zzzcode(pnode, ppc, q)         /* hard stuff escaped from templates */
                     75: NODE *pnode;
                     76: char **ppc;
                     77: OPTAB *q;                      /* not used in m32 zzzcode */
                     78: {
                     79:        int stlab, i;
                     80:        OPTAB *q;
                     81:        NODE *pl, *pr;
                     82: 
                     83:        switch (*++(*ppc))
                     84:        {
                     85: 
                     86:        case 'H':    
                     87:        /* put out word relative bit shift for insv and extv
                     88:        /* instruction.  Similar to case 'H' case in expand(),
                     89:        /* but no difference for different types
                     90:        */
                     91:            {
                     92:                extern int fldsz, fldshf;
                     93: 
                     94:                pl = getlr( pnode, *++(*ppc) );
                     95:                if (pl->tn.op != FLD ) cerror( "bad FLD for ZH" );
                     96:                fldsz = UPKFSZ(pl->tn.rval);
                     97:                fldshf = SZINT - fldsz - UPKFOFF(pl->tn.rval);
                     98:                printf( "%d", fldshf );
                     99:            }
                    100:                break;
                    101: 
                    102: 
                    103:        case 'D':       /* output address of second half of double */
                    104:                dbladrput( pl = getlr(pnode,*++(*ppc)) );
                    105:                break;
                    106: 
                    107: 
                    108:        case 'B':
                    109:                bycode(pnode->in.left->tn.lval, 0);
                    110:                break;
                    111: 
                    112:        case 'b':
                    113:                ++cmpflag;
                    114:                break;
                    115: 
                    116:        case 'C':
                    117:                printf("%s\t.L%d\n",
                    118:                    cmpflag ? ccbranches[pnode->bn.lop - EQ] :
                    119:                    arithjump[pnode->bn.lop - EQ], pnode->bn.label);
                    120:                cmpflag = 0;
                    121:                break;
                    122: 
                    123:        case 'c':               /* # of word-length args */
                    124:                printf("%d", pnode->stn.argsize / SZINT);
                    125:                break;
                    126: 
                    127:        case 'h':               /* deal with the BM32's weird treatment
                    128:                                   of half-word compares */
                    129:                /* If a 16 bit positive constant is used, it will
                    130:                   not be sign extended, but the othe operand will */
                    131:                {
                    132:                register NODE *r, *l;
                    133:                int lchg = 0, rchg = 0;
                    134:                l = pnode ->in.left;
                    135:                if ((l->tn.op == ICON) &&
                    136:                    ((l->tn.type == TUSHORT) ||
                    137:                     (l->tn.type == TSHORT)) &&
                    138:                    (l->tn.lval > 0x7fff))  {
                    139:                        lchg = 1;
                    140:                }
                    141:                r = pnode->in.right;
                    142:                if ((r->tn.op == ICON) &&
                    143:                    ((r->tn.type == TUSHORT) ||
                    144:                    (r->tn.type == TSHORT)) &&
                    145:                    (r->tn.lval > 0x7fff))  {
                    146:                        rchg = 1;
                    147:                }
                    148:                if ((!rchg && !lchg) || (rchg && lchg))  {
                    149:                        expand(pnode, FORCC, "cmph      AL,AR", q);
                    150:                } else if (rchg)  {
                    151:                        expand(pnode, FORCC,
                    152:                            "movzhw     AL,A1\n cmpw    A1,AR", q);
                    153:                } else {
                    154:                        expand(pnode, FORCC,
                    155:                            "movzhw     AR,A1\n cmpw    AL,A1", q);
                    156:                }
                    157:                break;
                    158:                }
                    159: 
                    160:        case 'S':               /* STASG */
                    161:                q = ophead[STASG];
                    162:                if (istnode(pnode->in.left))
                    163:                        pl = pnode->in.left;
                    164:                else
                    165:                {
                    166:                        pl = &resc[1];
                    167:                        if (pnode->in.left->in.op == UNARY AND)
                    168:                                expand(pnode, FOREFF, " movaw   A(LL),A2\n", q);
                    169:                        else
                    170:                                expand(pnode, FOREFF, " movw    AL,A2\n", q);
                    171:                }
                    172:                if (istnode(pnode->in.right))
                    173:                        pr = pnode->in.right;
                    174:                else
                    175:                {
                    176:                        pr = &resc[0];
                    177:                        if (pnode->in.right->in.op == UNARY AND)
                    178:                                expand(pnode, FOREFF, " movaw   A(RL),A1\n", q);
                    179:                        else
                    180:                                expand(pnode, FOREFF, " movw    AR,A1\n", q);
                    181:                }
                    182:                if ((i = pnode->stn.stsize / SZINT) <= STHRESH)
                    183:                        while (i--)
                    184:                                printf("\tmovw\t%d(%s),%d(%s)\n", i << 2,
                    185:                                    rnames[pr->tn.rval], i << 2,
                    186:                                    rnames[pl->tn.rval]);
                    187:                else
                    188:                {
                    189:                        int lastlab = getlab();
                    190: 
                    191:                        printf("        movw    &%d,", i);
                    192:                        expand(pnode, FOREFF, "A3\n.\\L", q);
                    193:                        printf("%d:\tmovw\t0(%s),0(%s)\n\taddw2\t&4,%s\n\taddw2\t&4,%s\n",
                    194:                            lastlab, rnames[pr->tn.rval], rnames[pl->tn.rval],
                    195:                            rnames[pr->tn.rval], rnames[pl->tn.rval]);
                    196:                        expand(pnode,FOREFF, "\tsubw2\t&1,A3\n\tjpos\t.\\L", q);
                    197:                        printf("%d\n", lastlab);
                    198:                }
                    199:                break;
                    200: 
                    201:        case 's':               /* STARG */
                    202:                q = ophead[STARG];
                    203:                if (istnode(pnode->in.left))
                    204:                        pl = pnode->in.left;
                    205:                else
                    206:                {
                    207:                        pl = &resc[0];
                    208:                        if (pnode->in.left->in.op == UNARY AND)
                    209:                                expand(pnode, FOREFF, " movaw   A(LL),A1\n", q);
                    210:                        else
                    211:                                expand(pnode, FOREFF, " movw    AL,A1\n", q);
                    212:                }
                    213:                printf("        addw2   &%d,%%sp\n      movaw   -%d(%%sp),",
                    214:                        pnode->stn.stsize / SZCHAR, pnode->stn.stsize / SZCHAR);
                    215:                expand(pnode, FOREFF, "A2\n", q);
                    216:                if ((i = pnode->stn.stsize / SZINT) <= STHRESH)
                    217:                        while (i--)
                    218:                        {
                    219:                                printf("        movw    %d(%s),%d(", i << 2,
                    220:                                    rnames[pl->tn.rval], i << 2);
                    221:                                expand(pnode, FOREFF, "A2)\n", q);
                    222:                        }
                    223:                else
                    224:                {
                    225:                        int lastlab = getlab();
                    226: 
                    227:                        printf("        movw    &%d,", i);
                    228:                        expand(pnode, FOREFF, "A3\n.\\L", q);
                    229:                        printf("%d:\tmovw\t0(%s),0(", lastlab,
                    230:                            rnames[pl->tn.rval]);
                    231:                        expand(pnode, FOREFF, "A2)\n\taddw2\t&4,", q);
                    232:                        printf("%s\n\taddw2\t&4,", rnames[pl->tn.rval]);
                    233:                        expand(pnode, FOREFF,
                    234:                            "A2\n\tsubw2\t&1,A3\n\tjpos\t.\\L", q);
                    235:                        printf("%d\n", lastlab);
                    236:                }
                    237:                break;
                    238: 
                    239:        default:
                    240:                cerror("botched Z macro %c", **ppc);
                    241:                /*NOTREACHED*/
                    242:        }
                    243: }
                    244: 
                    245: 
                    246: staradr(p)                             /* dereference p */
                    247: NODE *p;
                    248: {
                    249:        NODE *pp;
                    250: 
                    251:        pp = talloc();
                    252:        pp->tn.op = STAR;
                    253:        pp->in.left = p;
                    254:        upput(pp);
                    255:        pp->tn.op = FREE;
                    256: }
                    257: 
                    258: conput(p)                      /* name for a known */
                    259: register NODE *p;
                    260: {
                    261:        switch(p->in.op)
                    262:        {
                    263:        case ICON:
                    264:                acon(p);
                    265:                break;
                    266:        case REG:
                    267:                fputs(rnames[p->tn.rval], stdout);
                    268:                break;
                    269:        default:
                    270:                cerror("confused node in conput");
                    271:                /*NOTREACHED*/
                    272:        }
                    273: }
                    274: 
                    275: insput(p)                      /* we don't have any */
                    276: NODE *p;
                    277: {
                    278:        cerror("insput");
                    279: }
                    280: 
                    281: upput(p)                       /* generate address incl. indirect, offset */
                    282: NODE *p;
                    283: {
                    284:        register NODE *r, *l, *pp;
                    285: 
                    286:        sideff = 0;
                    287:        if (p->in.op == STAR)
                    288:                pp =  p->in.left;
                    289:        else
                    290:                pp = p;
                    291: again:
                    292:        switch (pp->tn.op)
                    293:        {
                    294:        case NAME:
                    295:        case TEMP:
                    296:        case VAUTO:
                    297:        case VPARAM:
                    298:                if (p->in.op == STAR)
                    299:                        putchar('*');
                    300:                adrput(pp);
                    301:                break;
                    302: 
                    303:        case REG:
                    304:                if (p->in.op == STAR)
                    305:                {
                    306:                        fputs("0(", stdout);
                    307:                        conput(pp);
                    308:                        putchar(')');
                    309:                }
                    310:                else
                    311:                        conput(pp);
                    312:                break;
                    313: 
                    314:        case ICON:
                    315:                if (p->in.op == STAR)
                    316:                        putchar('*');
                    317:                acon(pp);
                    318:                break;
                    319: 
                    320:        case STAR:
                    321:                putchar('*');
                    322:                p = pp;
                    323:                pp = pp->in.left;
                    324:                goto again;
                    325: 
                    326:        case PLUS:
                    327:        case MINUS:
                    328:        case INCR:
                    329:        case DECR:
                    330:                if (p->in.op == STAR && pp->in.left->in.op != REG)
                    331:                        putchar('*');
                    332:                if (pp->in.op == MINUS)
                    333:                        putchar('-');
                    334:                acon(pp->in.right);
                    335:                putchar('(');
                    336:                conput(pp->in.left);
                    337:                putchar(')');
                    338:                break;
                    339:        
                    340:        default:
                    341:                cerror("upput: confused addressing mode matched");
                    342:                /*NOTREACHED*/
                    343:        }
                    344: }
                    345: 
                    346: adrput(p)              /* output address from p */
                    347: NODE *p;
                    348: {
                    349:        sideff = 0;
                    350:        while (p->in.op == FLD || p->in.op == CONV)
                    351:                p = p->in.left;
                    352:        switch (p->in.op)
                    353:        {
                    354:        case ICON:               /* value of the constant */
                    355:                putchar('&');
                    356:        case NAME:
                    357:                acon(p);
                    358:                break;
                    359:        case REG:
                    360:                conput(p);
                    361:                break;
                    362:        case STAR:
                    363:                upput(p);
                    364:                break;
                    365:        case TEMP:
                    366:                printf("%d(%%fp)", p->tn.lval + maxboff / SZCHAR);
                    367:                break;
                    368:        case VAUTO:
                    369:                printf("%d(%%fp)", p->tn.lval);
                    370:                break;
                    371:        case VPARAM:
                    372:                printf("%d(%%ap)", p->tn.lval);
                    373:                break;
                    374:        default:
                    375:                cerror("adrput: illegal address");
                    376:                break;
                    377:        }
                    378: }
                    379: 
                    380: 
                    381: 
                    382: 
                    383: dbladrput(p)
                    384: NODE *p;
                    385: /* output address of word after p.  used for double moves */
                    386: {
                    387:        while (p->in.op == FLD || p->in.op == CONV)
                    388:                p = p->in.left;
                    389:        switch (p->in.op)
                    390:        {
                    391:        case NAME:
                    392:            printf("%s+%ld", p->in.name, p->tn.lval + 4);
                    393:            break;
                    394:        case REG:
                    395:            fputs(rnames[p->tn.rval + 1],stdout);
                    396:            break;
                    397:        case TEMP:
                    398:            printf("%d(%%fp)", (p->tn.lval+maxboff/SZCHAR)+4);
                    399:            break;
                    400:        case VAUTO:
                    401:            printf("%d(%%fp)", p->tn.lval + 4);
                    402:            break;
                    403:        case VPARAM:
                    404:            printf("%d(%%ap)", p->tn.lval + 4);
                    405:            break;
                    406:        default:
                    407:            cerror("dbladrput:  illegal double address substitution");
                    408:            /*NOTREACHED*/
                    409:        }
                    410: }
                    411: 
                    412: 
                    413: 
                    414: 
                    415: acon(p)                        /* print out a constant */
                    416: register NODE *p;
                    417: {
                    418: 
                    419:        if (p->in.name == (char *) 0)   /* constant only */
                    420:        {
                    421:                if (p->in.op == ICON &&
                    422:                    (p->in.type == TCHAR || p->in.type == TUCHAR))
                    423:                        p->tn.lval &= 0xff;
                    424:                printf("%ld", p->tn.lval);
                    425:        }
                    426:        else if (p->tn.lval == 0)       /* name only */
                    427:                printf("%s", p->in.name);
                    428:        else                            /* name + offset */
                    429:                printf ("%s+%ld", p->in.name, p->tn.lval);
                    430: }
                    431: 
                    432: 
                    433: 
                    434: special(sc,p)
                    435: NODE *p;
                    436: {
                    437:        cerror("special shape used");
                    438:        return (INFINITY);
                    439: }
                    440: 

unix.superglobalmegacorp.com

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