Annotation of lucent/sys/src/alef/k/reg.c, revision 1.1

1.1     ! root        1: #include <u.h>
        !             2: #include <libc.h>
        !             3: #include <bio.h>
        !             4: #include <ctype.h>
        !             5: #define Extern extern
        !             6: #include "parl.h"
        !             7: #include "globl.h"
        !             8: 
        !             9: int regmap[65];
        !            10: 
        !            11: void
        !            12: reginit(void)
        !            13: {
        !            14:        regmap[Retfreg]++;
        !            15:        regmap[Retireg]++;
        !            16:        regmap[Reglink]++;
        !            17:        regmap[Regtmp]++;
        !            18: 
        !            19:        privreg = Pregs;
        !            20: }
        !            21: 
        !            22: void
        !            23: regcheck(void)
        !            24: {
        !            25:        int r, e;
        !            26: 
        !            27:        e = 0;
        !            28:        for(r = Ireg; r < Maxireg; r++)
        !            29:                if(regmap[r]) {
        !            30:                        switch(r) {
        !            31:                        default:
        !            32:                                print("R%d still used\n", r);
        !            33:                                e++;
        !            34:                                break;
        !            35:                        case Retfreg:
        !            36:                        case Retireg:
        !            37:                        case Reglink:
        !            38:                        case Regtmp:
        !            39:                                break;
        !            40:                        }
        !            41:                }
        !            42: 
        !            43:        for(r = Freg; r < Maxfreg; r++)
        !            44:                if(regmap[r] && (r != Retfreg || regmap[Retfreg] != 1)) {
        !            45:                        print("F%d still used\n", r);
        !            46:                        e++;
        !            47:                }
        !            48:        if(e)
        !            49:                fatal("regcheck %P", curfunc);
        !            50: }
        !            51: 
        !            52: void
        !            53: reg(Node *n, Type *t, Node *use)
        !            54: {
        !            55:        int r, j;
        !            56:        static int ireg;
        !            57: 
        !            58:        switch(t->type) {
        !            59:        default:
        !            60:                fatal("reg: bad type %T", t);
        !            61: 
        !            62:        case TINT:
        !            63:        case TUINT:
        !            64:        case TSINT:
        !            65:        case TSUINT:
        !            66:        case TCHAR:
        !            67:        case TIND:
        !            68:        case TCHANNEL:
        !            69:                if(use && use->type == OREGISTER && use->reg < Freg) {
        !            70:                        r = use->reg;
        !            71:                        break;
        !            72:                }
        !            73:                j = ireg+Ireg;
        !            74:                for(r = Ireg; r < Maxireg; r++) {
        !            75:                        if(j >= Maxireg)
        !            76:                                j = Ireg;
        !            77:                        if(regmap[j] == 0) {
        !            78:                                r = j;
        !            79:                                break;
        !            80:                        }
        !            81:                        j++;
        !            82:                }
        !            83:                if(r >= Maxireg)
        !            84:                        fatal("No int registers");
        !            85:                break;
        !            86: 
        !            87:        case TFLOAT:
        !            88:                if(use && use->type == OREGISTER && use->reg >= Freg) {
        !            89:                        r = use->reg;
        !            90:                        break;
        !            91:                }
        !            92: 
        !            93:                j = ireg*2+Freg;
        !            94:                for(r = Freg; r < Maxfreg; r += 2) {
        !            95:                        if(j >= Maxfreg)
        !            96:                                j = Ireg;
        !            97:                        if(regmap[j] == 0) {
        !            98:                                r = j;
        !            99:                                break;
        !           100:                        }
        !           101:                        j += 2;
        !           102:                }
        !           103:                if(r >= Maxfreg)
        !           104:                        fatal("No float registers");
        !           105:                break;
        !           106:        }
        !           107:        ireg++;
        !           108:        if(ireg > 5)
        !           109:                ireg = 0;
        !           110:        regmap[r]++;
        !           111:        n->reg = r;
        !           112:        n->type = OREGISTER;
        !           113:        n->islval = 11;
        !           114:        n->sun = 0;
        !           115:        n->t = t;
        !           116: }
        !           117: 
        !           118: Node*
        !           119: regtmp(void)
        !           120: {
        !           121:        Node *n;
        !           122:        int r;
        !           123: 
        !           124:        n = an(OREGISTER, ZeroN, ZeroN);
        !           125:        n->t = builtype[TINT];
        !           126:        n->islval = 11;
        !           127:        n->sun = 0;
        !           128: 
        !           129:        for(r = Ireg; r < Maxireg; r++)
        !           130:                if(regmap[r] == 0) {
        !           131:                        n->reg = r;
        !           132:                        regmap[r]++;
        !           133:                        return n;
        !           134:                }
        !           135:        fatal("No int registers");
        !           136:        return ZeroN;   
        !           137: }
        !           138: 
        !           139: Node*
        !           140: regn(int nr)
        !           141: {
        !           142:        Node *n;
        !           143: 
        !           144:        n = an(OREGISTER, ZeroN, ZeroN);
        !           145:        if(nr >= Freg)
        !           146:                n->t = builtype[TFLOAT];
        !           147:        else
        !           148:                n->t = builtype[TINT];
        !           149:        n->islval = 11;
        !           150:        n->sun = 0;
        !           151:        n->reg = nr;
        !           152:        return n;
        !           153: }
        !           154: 
        !           155: void
        !           156: regret(Node *n, Type*t)
        !           157: {
        !           158:        int r;
        !           159: 
        !           160:        switch(t->type) {
        !           161:        default:
        !           162:                fatal("regret: bad type %T", t);
        !           163: 
        !           164:        case TINT:
        !           165:        case TUINT:
        !           166:        case TSINT:
        !           167:        case TSUINT:
        !           168:        case TCHAR:
        !           169:        case TIND:
        !           170:        case TCHANNEL:
        !           171:                r = Retireg;
        !           172:                break;
        !           173: 
        !           174:        case TFLOAT:
        !           175:                r = Retfreg;
        !           176:                break;
        !           177:        }
        !           178:        regmap[r]++;
        !           179:        n->reg = r;
        !           180:        n->type = OREGISTER;
        !           181:        n->t = t;
        !           182: }
        !           183: 
        !           184: void
        !           185: regfree(Node *n)
        !           186: {
        !           187:        if(regmap[n->reg] <= 0)
        !           188:                fatal("regfree");
        !           189: 
        !           190:        regmap[n->reg]--;
        !           191: }
        !           192: 
        !           193: /*
        !           194:  * look for a constant which fits in a sparc immediate
        !           195:  */
        !           196: int
        !           197: immed(Node *n)
        !           198: {
        !           199:        long ival;
        !           200: 
        !           201:        if(n->type != OCONST || n->t->type == TFLOAT)
        !           202:                return 0;
        !           203: 
        !           204:        ival = n->ival;
        !           205:        if(ival >= -(1<<12) && ival < (1<<12))
        !           206:                return 1;
        !           207: 
        !           208:        return 0;
        !           209: }
        !           210: 
        !           211: /*
        !           212:  * Return the name of an activation argument
        !           213:  */
        !           214: Node*
        !           215: atvnode(Type *t)
        !           216: {
        !           217:        int o;
        !           218:        Node *n;
        !           219: 
        !           220:        n = an(OREGISTER, ZeroN, ZeroN);
        !           221:        n->reg = ratv.reg;
        !           222:        n->ival = 0;
        !           223:        n->t = at(TIND, t);
        !           224: 
        !           225:        o = align(ratv.ival, builtype[TINT]);
        !           226:        ratv.ival = o+t->size;
        !           227:        if(ratv.ival > maxframe)
        !           228:                maxframe = ratv.ival;
        !           229: 
        !           230:        /* Adjust offset within int for smaller types */
        !           231:        switch(t->type) {
        !           232:        case TSINT:
        !           233:        case TSUINT:
        !           234:                o += Shortfoff;
        !           235:                break;
        !           236: 
        !           237:        case TCHAR:
        !           238:                o += Charfoff;
        !           239:                break;
        !           240:        }
        !           241: 
        !           242:        n = an(OADD, n, con(o));
        !           243:        n->t = n->left->t;
        !           244:        n = an(OIND, n, ZeroN);
        !           245:        n->t = t;
        !           246: 
        !           247:        sucalc(n);
        !           248:        return n;
        !           249: }
        !           250: 
        !           251: /*
        !           252:  * Make a node to alias an argument
        !           253:  */
        !           254: Node*
        !           255: argnode(Type *t)
        !           256: {
        !           257:        Node *n;
        !           258:        int o;
        !           259: 
        !           260:        if(atv)
        !           261:                return atvnode(t);
        !           262: 
        !           263:        n = an(ONAME, ZeroN, ZeroN);
        !           264:        n->t = t;
        !           265:        n->ti = ati(t, Argument);
        !           266:        args = align(args, builtype[TINT]);
        !           267:        o = args;
        !           268: 
        !           269:        /* Adjust offset within int for smaller types */
        !           270:        switch(t->type) {
        !           271:        case TSINT:
        !           272:        case TSUINT:
        !           273:                o += Shortfoff;
        !           274:                break;
        !           275: 
        !           276:        case TCHAR:
        !           277:                o += Charfoff;
        !           278:                break;
        !           279:        }
        !           280: 
        !           281:        n->ti->offset = o;
        !           282:        args += t->size;
        !           283: 
        !           284:        sucalc(n);
        !           285:        return n;
        !           286: }
        !           287: 
        !           288: Node*
        !           289: paramnode(Type *t)
        !           290: {
        !           291:        Node *n;
        !           292: 
        !           293:        USED(t);
        !           294: 
        !           295:        while(tip->class != Parameter)
        !           296:                tip = tip->dcllist;
        !           297: 
        !           298:        n = an(ONAME, ZeroN, ZeroN);
        !           299:        n->sym = tip->s;
        !           300:        n->ti = tip;
        !           301:        n->t = tip->t;
        !           302: 
        !           303:        /* for next time */
        !           304:        tip = tip->dcllist;
        !           305: 
        !           306:        sucalc(n);
        !           307:        return n;
        !           308: }
        !           309: 
        !           310: /*
        !           311:  * Make a stack temporary node and allocate space in the frame
        !           312:  */
        !           313: Node*
        !           314: stknode(Type *o)
        !           315: {
        !           316:        Node *n;
        !           317:        char buf[10];
        !           318: 
        !           319:        n = an(ONAME, ZeroN, ZeroN);
        !           320:        n->sym = malloc(sizeof(Sym));
        !           321:        n->ti = ati(o, Automatic);
        !           322:        n->t = o;
        !           323: 
        !           324:        sprint(buf, ".t%d", stmp++);
        !           325:        n->sym->name = strdup(buf);
        !           326: 
        !           327:        /* Allocate the space */
        !           328:        frame = align(frame, o);
        !           329:        frame += o->size;
        !           330: 
        !           331:        n->ti->offset = -frame;
        !           332:        sucalc(n);
        !           333:        return n;
        !           334: }
        !           335: 
        !           336: Node*
        !           337: internnode(Type *o)
        !           338: {
        !           339:        Node *n;
        !           340:        char buf[10];
        !           341: 
        !           342:        n = an(ONAME, ZeroN, ZeroN);
        !           343:        n->sym = malloc(sizeof(Sym));
        !           344:        n->t = at(o->type, 0);
        !           345:        n->t->class = Internal;
        !           346:        n->ti = ati(n->t, Internal);
        !           347: 
        !           348:        sprint(buf, ".i%d", stmp++);
        !           349:        n->sym->name = strdup(buf);
        !           350: 
        !           351:        n->ti->offset = 0;
        !           352:        sucalc(n);
        !           353: 
        !           354:        n->init = ZeroN;
        !           355:        gendata(n);
        !           356: 
        !           357:        return n;
        !           358: }
        !           359: 
        !           360: Node*
        !           361: con(int i)
        !           362: {
        !           363:        Node *c;
        !           364: 
        !           365:        c = an(OCONST, ZeroN, ZeroN);
        !           366:        c->t = builtype[TINT];
        !           367:        c->ival = i;
        !           368: 
        !           369:        return c;
        !           370: }
        !           371: 
        !           372: Node*
        !           373: conf(double d)
        !           374: {
        !           375:        Node *c;
        !           376: 
        !           377:        c = an(OCONST, ZeroN, ZeroN);
        !           378:        c->t = builtype[TFLOAT];
        !           379:        c->fval = d;
        !           380: 
        !           381:        return c;
        !           382: }

unix.superglobalmegacorp.com

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