Annotation of researchv10no/cmd/lcc/gen2/mc/pseudos.c, revision 1.1.1.1

1.1       root        1: /* C compiler: MC68020 code generator */
                      2: 
                      3: #include "c.h"
                      4: 
                      5: #define        AREG    0       /* an address register */
                      6: #define        DREG    1       /* a data register */
                      7: #define FREG   2       /* a floating point register */
                      8: 
                      9: #if mc68020 || mc68030 || NeXT
                     10: #include <stab.h>
                     11: #include "stabbsd.c"
                     12: #endif
                     13: 
                     14: dclproto(static void address,(Symbol, Symbol, int));
                     15: dclproto(static void defaddress,(Symbol));
                     16: dclproto(static void defconst,(int, Value));
                     17: dclproto(static void defstring,(int, char *));
                     18: dclproto(static void defsymbol,(Symbol));
                     19: dclproto(static void doarg,(Node));
                     20: dclproto(static void emitspecial,(Node));
                     21: dclproto(static void function,(Symbol, Symbol [], Symbol [], int));
                     22: dclproto(static void global,(Symbol));
                     23: dclproto(static void import,(Symbol));
                     24: dclproto(static void local,(Symbol));
                     25: dclproto(static void progbeg,(int, char **));
                     26: dclproto(static void segment,(int));
                     27: dclproto(static void space,(int));
                     28: 
                     29: dclproto(static void initgen,(void));
                     30: dclproto(static void final,(Node));
                     31: 
                     32: Interface mcInterface = {
                     33:        "mc",
                     34:        1, 1, 0,        /* char */
                     35:        2, 2, 0,        /* short */
                     36:        4, 2, 0,        /* int */
                     37:        4, 2, 1,        /* float */
                     38:        8, 2, 1,        /* double */
                     39:        4, 2, 0,        /* T * */
                     40:        0, 2, 0,        /* struct */
                     41:        1,              /* left_to_right */
                     42:        0,              /* little_endian */
                     43:        1,              /* jump_on_return */
                     44:        0,              /* mulops_are_calls */
                     45:        0,              /* compl_band */
                     46:        0,              /* no_argb */
                     47:        NODAG,          /* no_dag */
                     48:        address,
                     49:        blockbeg,
                     50:        blockend,
                     51:        defaddress,
                     52:        defconst,
                     53:        defstring,
                     54:        defsymbol,
                     55:        0,
                     56:        export,
                     57:        function,
                     58:        gen,
                     59:        global,
                     60:        import,
                     61:        local,
                     62:        progbeg,
                     63:        progend,
                     64:        segment,
                     65:        space,
                     66: #if mc68020 || mc68030 || NeXT
                     67:        stabblock, 0, 0, stabinit, stabline, stabsym, stabtype,
                     68: #else
                     69:        0, 0, 0, 0, 0, 0, 0,
                     70: #endif
                     71:        {".globl %s\n", 1, 0, {".text", ".bss", ".data", ".text", ".data2"},
                     72:        doarg, docall, 0, 0, 0,
                     73:        final, 0, emitspecial }
                     74: }, nextInterface = {
                     75:        "next",
                     76:        1, 1, 0,        /* char */
                     77:        2, 2, 0,        /* short */
                     78:        4, 2, 0,        /* int */
                     79:        4, 2, 1,        /* float */
                     80:        8, 2, 1,        /* double */
                     81:        4, 2, 0,        /* T * */
                     82:        0, 2, 0,        /* struct */
                     83:        1,              /* left_to_right */
                     84:        0,              /* little_endian */
                     85:        1,              /* jump_on_return */
                     86:        0,              /* mulops_are_calls */
                     87:        0,              /* compl_band */
                     88:        0,              /* no_argb */
                     89:        NODAG,          /* no_dag */
                     90:        address,
                     91:        blockbeg,
                     92:        blockend,
                     93:        defaddress,
                     94:        defconst,
                     95:        defstring,
                     96:        defsymbol,
                     97:        0,
                     98:        export,
                     99:        function,
                    100:        gen,
                    101:        global,
                    102:        import,
                    103:        local,
                    104:        progbeg,
                    105:        progend,
                    106:        segment,
                    107:        space,
                    108: #if mc68020 || mc68030 || NeXT
                    109:        stabblock, 0, 0, stabinit, stabline, stabsym, stabtype,
                    110: #else
                    111:        0, 0, 0, 0, 0, 0, 0,
                    112: #endif
                    113:        {".globl %s\n", 1, 0, {".text", ".bss", ".data", ".text", ".data2"},
                    114:        doarg, docall, 0, 0, 0,
                    115:        final, 0, emitspecial }
                    116: 
                    117: };
                    118: 
                    119: static Symbol a0, a1, d0, d1, d1234, fp0;
                    120: 
                    121: /* address - initialize q for addressing expression p+n */
                    122: static void address(q, p, n) Symbol q, p; {
                    123:        q->x.offset = p->x.offset + n;
                    124:        if (p->scope == GLOBAL || p->sclass == STATIC || p->sclass == EXTERN)
                    125:                q->x.name = stringf("%s%s%d", p->x.name, n >= 0 ? "+" : "", n);
                    126:        else
                    127:                q->x.name = stringd(q->x.offset);
                    128: }
                    129: 
                    130: static void defaddress(p) Symbol p; {
                    131:        if (p->scope == LABELS)
                    132:                print(".align 2; ");    /* for switch tables */
                    133:        print(".long %s\n", p->x.name);
                    134: }
                    135: 
                    136: /* defconst - define a constant */
                    137: static void defconst(ty, v) Value v; {
                    138:        struct real r;
                    139: 
                    140:        switch (ty) {
                    141:        case C: print(".byte %d\n",   v.uc); break;
                    142:        case S: print(".word %d\n",   v.ss); break;
                    143:        case I: print(".long %d\n",   v.i ); break;
                    144:        case U: print(".long 0x%x\n", v.u ); break;
                    145:        case P: print(".long 0x%x\n", v.p ); break;
                    146:        case F:
                    147:                r = decode(F, v.f);
                    148:                if (v.f)
                    149:                        r.exp = (r.exp + 127)&0xff;
                    150:                print(".long 0x%x\n", (r.sign<<31) | (r.exp<<23) | (r.msb>>9));
                    151:                break;
                    152:        case D:
                    153:                r = decode(D, v.d);
                    154:                if (v.d)
                    155:                        r.exp = (r.exp + 1023)&0x7ff;
                    156:                print(".long 0x%x,0x%x\n",
                    157:                        (r.sign<<31) | (r.exp<<20) | (r.msb>>12),
                    158:                        ( r.msb<<20) | (r.lsb>>12));
                    159:                break;
                    160:        default:
                    161:                assert(0);
                    162:        }
                    163: }
                    164: 
                    165: static void defstring(n, s) char *s; {
                    166:        genascii(".ascii", ".byte", n, s);
                    167: }
                    168: 
                    169: /* defsymbol - compute and store p's back-end name */
                    170: static void defsymbol(p) Symbol p; {
                    171:        if (p->scope == CONSTANTS)
                    172:                p->x.name = p->name;
                    173:        else if (p->scope >= LOCAL && p->sclass == STATIC)
                    174:                p->x.name = stringf("L%d", genlabel(1));
                    175:        else if (p->generated)
                    176:                p->x.name = stringf("L%s", p->name);
                    177:        else
                    178:                p->x.name = stringf("_%s", p->name);
                    179: }
                    180: 
                    181: /* doarg - assign offset for next ARG node */
                    182: static void doarg(p) Node p; {
                    183:        assert(p);
                    184:        assert(p->syms[0]);
                    185:        assert(p->syms[1]);
                    186:        p->syms[2] = intconst(mkactual(p->syms[1]->u.c.v.i, p->syms[0]->u.c.v.i, 4));
                    187: }
                    188: 
                    189: static void emitspecial(p) Node p; {}
                    190: 
                    191: /* function - generate code for a function */
                    192: static void function(p, caller, callee, n) Symbol p, callee[], caller[]; {
                    193:        int i;
                    194:        unsigned fmask, imask;
                    195: 
                    196:        initfunc(n, 8, 0);
                    197:        for (i = 0; callee[i]; i++) {
                    198:                assert(caller[i]);
                    199:                callee[i]->x.offset = caller[i]->x.offset = offset;
                    200:                callee[i]->x.name = caller[i]->x.name = stringd(offset);
                    201:                offset = roundup(offset + caller[i]->type->size, 4);
                    202:                getregvar(callee[i], rmap[ttob(callee[i]->type)]);
                    203:        }
                    204:        assert(caller[i] == 0);
                    205:        offset = 0;
                    206:        gencode(caller, callee);
                    207:        mvregvars();
                    208:        fmask = 0;
                    209:        if (usedmask[FREG])
                    210:                for (i = 0; i < 8; i++)
                    211:                        if (usedmask[FREG]&(1<<i))
                    212:                                fmask |= 0x80>>i;
                    213:        imask = (((usedmask[AREG]&eemask[AREG])<<8) | (usedmask[DREG]&eemask[DREG]));
                    214:        maxoffset += 12*bitcount(fmask) + 4*bitcount(imask);
                    215:        print(".align 2\n%s:link a6,#-%d\n", p->x.name, maxoffset + argbuildsize);
                    216:        savemask[DREG] = usedmask[DREG]&eemask[DREG];
                    217:        savemask[AREG] = usedmask[AREG]&eemask[AREG];
                    218:        savemask[FREG] = usedmask[FREG]&eemask[FREG];
                    219:        savebase[DREG] = -maxoffset;
                    220:        savebase[AREG] = savebase[DREG] + 4*bitcount(savemask[DREG]);
                    221:        savebase[FREG] = savebase[AREG] + 4*bitcount(savemask[AREG]);
                    222:        if (fmask)
                    223:                print("fmovemx #0x%x,a6@(%d)\n", fmask, -maxoffset + 4*bitcount(imask));
                    224:        if (imask)
                    225:                print("moveml #0x%x,a6@(%d)\n", imask, -maxoffset);
                    226:        if (isstruct(freturn(p->type)))
                    227:                print("movl a1,a6@(-4)\n");
                    228:        if (pflag) {
                    229:                int lab = genlabel(1);
                    230:                print("movl #L%d,a0\njsr mcount\n", lab);
                    231:                print("%s\n.even\nL%d: .skip 4\n.text\n", IR->x.segnames[BSS-1], lab);
                    232:        }
                    233:        emitcode();
                    234:        if (ttob(p->type->type) == F)
                    235:                print("fmoves fp0,d0\n");
                    236:        else if (ttob(p->type->type) == D)
                    237:                print("fmoved fp0,sp@-; movl sp@+,d0; movl sp@+,d1\n");
                    238:        if (imask)
                    239:                print("moveml a6@(%d),#0x%x\n", -maxoffset, imask);
                    240:        if (fmask)
                    241:                print("fmovemx a6@(%d),#0x%x\n", -maxoffset + 4*bitcount(imask), fmask);
                    242:        print("unlk a6\nrts\n");
                    243: }
                    244: 
                    245: /* global - global id */
                    246: static void global(p) Symbol p; {
                    247:        assert(p->u.seg);
                    248:        if (IR == &nextInterface && p->u.seg == BSS && Aflag >= 2) {
                    249:                if (p->type->align > 1)
                    250:                        print(".align %d; ", p->type->align);
                    251:                print("%s:.skip ", p->x.name);
                    252:        } else if (p->u.seg == BSS && (p->sclass == STATIC || Aflag >= 2))
                    253:                print(".lcomm %s,", p->x.name);
                    254:        else if (p->u.seg == BSS)
                    255:                print(".comm %s,", p->x.name);
                    256:        else {
                    257:                if (p->type->align > 1)
                    258:                        print(".align %d; ", p->type->align);
                    259:                print("%s:", p->x.name);
                    260:        }
                    261: }
                    262: 
                    263: static void import(p) Symbol p; {}
                    264: 
                    265: /* local - local */
                    266: static void local(p) Symbol p; {
                    267:        if (getregvar(p, rmap[ttob(p->type)]) == 0)
                    268:                p->x.name = stringd(mkauto(p, 4));
                    269: }
                    270: 
                    271: /* progbeg - beginning of program */
                    272: static void progbeg(argc, argv) char *argv[]; {
                    273:        nregsets = 3;
                    274:        eemask[AREG] = 0x3c; eemask[DREG] = 0xfc; eemask[FREG] = 0xff;
                    275:        tmask[AREG]  = 0x07; tmask[DREG] = 0x1f; tmask[FREG] = 0x0f;
                    276:        vmask[AREG]  = 0x38; vmask[DREG] = 0xe0; vmask[FREG] = 0xf0;
                    277:        parseflags(argc, argv);
                    278:        kflag = IR == &nextInterface;
                    279:        if (kflag)
                    280:                IR->x.segnames[BSS-1] = ".data";
                    281:        initgen();
                    282:        a0      = mkregs("%d", 0, 0, 1, 1, AREG, P, 0);
                    283:        a1      = mkregs("%d", 1, 1, 1, 1, AREG, P, 0);
                    284:        d0      = mkregs("%d", 0, 0, 1, 1, DREG, I, 0);
                    285:        d1234   = mkregs("%d", 1, 4, 1, 1, DREG, I, 0);
                    286:        fp0     = mkregs("%d", 0, 0, 1, 1, FREG, D, 0);
                    287:        rmap[P] = mkregs("%d", 0, 5, 1, 1, AREG, P, 0);
                    288:        rmap[I] = mkregs("%d", 0, 7, 1, 1, DREG, I, 0);
                    289:        rmap[D] = mkregs("%d", 0, 7, 1, 1, FREG, D, 0);
                    290:        rmap[F] = rmap[D]; rmap[C] = rmap[S] = rmap[U] = rmap[I];
                    291: }
                    292: 
                    293: static void segment(n) {
                    294:        setseg(n);
                    295: }
                    296: 
                    297: static void space(n) {
                    298:        spacen(n, ".skip");
                    299: }

unix.superglobalmegacorp.com

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