Annotation of lucent/sys/src/alef/k/output.c, revision 1.1.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: #include "y.tab.h"
                      9: 
                     10: static int slot;
                     11: 
                     12: char   *itab[] =
                     13: {
                     14:        "XXX",
                     15:        "ADD",
                     16:        "ADDCC",
                     17:        "ADDX",
                     18:        "ADDXCC",
                     19:        "AND",
                     20:        "ANDCC",
                     21:        "ANDN",
                     22:        "ANDNCC",
                     23:        "BA",
                     24:        "BCC",
                     25:        "BCS",
                     26:        "BE",
                     27:        "BG",
                     28:        "BGE",
                     29:        "BGU",
                     30:        "BL",
                     31:        "BLE",
                     32:        "BLEU",
                     33:        "BN",
                     34:        "BNE",
                     35:        "BNEG",
                     36:        "BPOS",
                     37:        "BVC",
                     38:        "BVS",
                     39:        "CB0",
                     40:        "CB01",
                     41:        "CB012",
                     42:        "CB013",
                     43:        "CB02",
                     44:        "CB023",
                     45:        "CB03",
                     46:        "CB1",
                     47:        "CB12",
                     48:        "CB123",
                     49:        "CB13",
                     50:        "CB2",
                     51:        "CB23",
                     52:        "CB3",
                     53:        "CBA",
                     54:        "CBN",
                     55:        "CMP",
                     56:        "CPOP1",
                     57:        "CPOP2",
                     58:        "DATA",
                     59:        "DIV",
                     60:        "DIVL",
                     61:        "FABSD",
                     62:        "FABSF",
                     63:        "FABSX",
                     64:        "FADDD",
                     65:        "FADDF",
                     66:        "FADDX",
                     67:        "FBA",
                     68:        "FBE",
                     69:        "FBG",
                     70:        "FBGE",
                     71:        "FBL",
                     72:        "FBLE",
                     73:        "FBLG",
                     74:        "FBN",
                     75:        "FBNE",
                     76:        "FBO",
                     77:        "FBU",
                     78:        "FBUE",
                     79:        "FBUG",
                     80:        "FBUGE",
                     81:        "FBUL",
                     82:        "FBULE",
                     83:        "FCMPD",
                     84:        "FCMPED",
                     85:        "FCMPEF",
                     86:        "FCMPEX",
                     87:        "FCMPF",
                     88:        "FCMPX",
                     89:        "FDIVD",
                     90:        "FDIVF",
                     91:        "FDIVX",
                     92:        "FMOVD",
                     93:        "FMOVDF",
                     94:        "FMOVDW",
                     95:        "FMOVDX",
                     96:        "FMOVF",
                     97:        "FMOVFD",
                     98:        "FMOVFW",
                     99:        "FMOVFX",
                    100:        "FMOVWD",
                    101:        "FMOVWF",
                    102:        "FMOVWX",
                    103:        "FMOVX",
                    104:        "FMOVXD",
                    105:        "FMOVXF",
                    106:        "FMOVXW",
                    107:        "FMULD",
                    108:        "FMULF",
                    109:        "FMULX",
                    110:        "FNEGD",
                    111:        "FNEGF",
                    112:        "FNEGX",
                    113:        "FSQRTD",
                    114:        "FSQRTF",
                    115:        "FSQRTX",
                    116:        "FSUBD",
                    117:        "FSUBF",
                    118:        "FSUBX",
                    119:        "GLOBL",
                    120:        "GOK",
                    121:        "HISTORY",
                    122:        "IFLUSH",
                    123:        "JMPL",
                    124:        "JMP",
                    125:        "MOD",
                    126:        "MODL",
                    127:        "MOVB",
                    128:        "MOVBU",
                    129:        "MOVD",
                    130:        "MOVH",
                    131:        "MOVHU",
                    132:        "MOVW",
                    133:        "MUL",
                    134:        "MULSCC",
                    135:        "NAME",
                    136:        "NOP",
                    137:        "OR",
                    138:        "ORCC",
                    139:        "ORN",
                    140:        "ORNCC",
                    141:        "RESTORE",
                    142:        "RETT",
                    143:        "RETURN",
                    144:        "SAVE",
                    145:        "SLL",
                    146:        "SRA",
                    147:        "SRL",
                    148:        "SUB",
                    149:        "SUBCC",
                    150:        "SUBX",
                    151:        "SUBXCC",
                    152:        "SWAP",
                    153:        "TA",
                    154:        "TADDCC",
                    155:        "TADDCCTV",
                    156:        "TAS",
                    157:        "TCC",
                    158:        "TCS",
                    159:        "TE",
                    160:        "TEXT",
                    161:        "TG",
                    162:        "TGE",
                    163:        "TGU",
                    164:        "TL",
                    165:        "TLE",
                    166:        "TLEU",
                    167:        "TN",
                    168:        "TNE",
                    169:        "TNEG",
                    170:        "TPOS",
                    171:        "TSUBCC",
                    172:        "TSUBCCTV",
                    173:        "TVC",
                    174:        "TVS",
                    175:        "UNIMP",
                    176:        "WORD",
                    177:        "XNOR",
                    178:        "XNORCC",
                    179:        "XOR",
                    180:        "XORCC",
                    181:        "END",
                    182:        "DYNT",
                    183:        "INIT",
                    184:        "LAST",
                    185: };
                    186: 
                    187: char rcmap[256] =
                    188: {
                    189:        ['\0'] 'z',
                    190:        ['\n'] 'n',
                    191:        ['\r'] 'r',
                    192:        ['\t'] 't',
                    193:        ['\b'] 'b',
                    194:        ['\f'] 'f',
                    195:        ['\a'] 'a',
                    196:        ['\v'] 'v',
                    197:        ['\\'] '\\',
                    198:        ['"']  '"',
                    199: };
                    200: 
                    201: void
                    202: vwrite(Biobuf *b, Inst *i, int sf, int st)
                    203: {
                    204:        char io[100], *bp;
                    205: 
                    206:        io[0] = i->op;
                    207:        if(i->reg == Nreg)
                    208:                io[1] = NREG;
                    209:        else 
                    210:                io[1] = i->reg;
                    211: 
                    212:        io[2] = i->lineno;
                    213:        io[3] = i->lineno>>8;
                    214:        io[4] = i->lineno>>16;
                    215:        io[5] = i->lineno>>24;
                    216: 
                    217:        bp = vaddr(io+6, &i->src1, sf);
                    218:        bp = vaddr(bp, &i->dst, st);
                    219: 
                    220:        Bwrite(b, io, bp-io);
                    221: }
                    222: 
                    223: void
                    224: outhist(Biobuf *b)
                    225: {
                    226:        Hist *h;
                    227:        char *p, *q;
                    228:        Inst pg;
                    229:        int n;
                    230: 
                    231:        pg.op = AHISTORY;
                    232:        pg.src1.type = A_NONE;
                    233:        pg.dst.reg = Nreg;
                    234:        pg.reg = Nreg;
                    235:        for(h = hist; h != H; h = h->link) {
                    236:                p = h->name;
                    237:                while(p) {
                    238:                        q = strchr(p, '/');
                    239:                        if(q) {
                    240:                                n = q-p;
                    241:                                if(n == 0)
                    242:                                        n = 1;  /* leading "/" */
                    243:                                q++;
                    244:                        } else {
                    245:                                n = strlen(p);
                    246:                                q = 0;
                    247:                        }
                    248:                        if(n) {
                    249:                                Bputc(b, ANAME);
                    250:                                Bputc(b, D_FILE);
                    251:                                Bputc(b, 1);
                    252:                                Bputc(b, '<');
                    253:                                Bwrite(b, p, n);
                    254:                                Bputc(b, 0);
                    255:                        }
                    256:                        p = q;
                    257:                }
                    258:                pg.lineno = h->line;
                    259:                pg.dst.ival = h->offset;
                    260:                pg.dst.type = A_NONE;
                    261:                if(h->offset)
                    262:                        pg.dst.type = A_CONST;
                    263: 
                    264:                vwrite(b, &pg, 0, 0);
                    265:        }
                    266: }
                    267: 
                    268: void
                    269: sfile(char *name)
                    270: {
                    271:        int f;
                    272:        Inst *i;
                    273:        Biobuf b;
                    274: 
                    275:        f = create(name, OWRITE|OTRUNC, 0666);
                    276:        if(f < 0) {
                    277:                diag(ZeroN, "cannot open %s: %r", name);
                    278:                return;
                    279:        }
                    280:        Binit(&b, f, OWRITE);
                    281: 
                    282:        for(i = proghead; i; i = i->next) {
                    283:                if(i->dst.type == A_BRANCH)
                    284:                        i->dst.ival -= i->pc;
                    285: 
                    286:                Bprint(&b, "%i\n", i);
                    287:        }
                    288: 
                    289:        Bflush(&b);
                    290:        close(f);
                    291: }
                    292: 
                    293: void
                    294: objfile(char *name)
                    295: {
                    296:        Inst *i;
                    297:        Biobuf b;
                    298:        Inst end;
                    299:        int f, sfrom, sto;
                    300:        
                    301:        f = create(name, OWRITE|OTRUNC, 0666);
                    302:        if(f < 0) {
                    303:                diag(ZeroN, "cannot open %s: %r", name);
                    304:                return;
                    305:        }
                    306:        Binit(&b, f, OWRITE);
                    307:        Bseek(&b, 0L, 2);
                    308: 
                    309:        outhist(&b);
                    310: 
                    311:        memset(scache, 0, sizeof(scache));
                    312: 
                    313:        for(i = proghead; i; i = i->next) {
                    314:                sto = 0;
                    315:                sfrom = 0;
                    316:                do{
                    317:                        switch(i->src1.type) {
                    318:                        case A_CONST:
                    319:                        case A_INDREG:
                    320:                                if(i->src1.class)
                    321:                                        sfrom = vcache(&b, &i->src1);
                    322:                        }
                    323:                        switch(i->dst.type) {
                    324:                        case A_CONST:
                    325:                        case A_INDREG:
                    326:                                if(i->dst.class)
                    327:                                        sto = vcache(&b, &i->dst);
                    328:                        }
                    329:                }while(sfrom == sto && sfrom != 0);
                    330: 
                    331:                vwrite(&b, i, sfrom, sto);
                    332:        }
                    333: 
                    334:        end = zprog;
                    335:        end.op = AEND;
                    336:        vwrite(&b, &end, 0, 0);
                    337: 
                    338:        Bflush(&b);
                    339:        close(f);
                    340: }
                    341: 
                    342: int
                    343: vcache(Biobuf *b, Adres *a)
                    344: {
                    345:        Sym *s;
                    346:        Scache *c;
                    347: 
                    348:        s = a->sym;
                    349: 
                    350:        if(s->slot) {
                    351:                c = &scache[s->slot];
                    352:                if(c->s == s)
                    353:                if(c->class == a->class)
                    354:                        return s->slot;
                    355:        }
                    356: 
                    357:        slot++;
                    358:        if(slot >= NSYM)
                    359:                slot = 1;
                    360: 
                    361:        c = &scache[slot];
                    362:        c->s = s;
                    363:        c->class = a->class;
                    364: 
                    365:        vname(b, a->class, s->name, slot);
                    366: 
                    367:        return slot;
                    368: }
                    369: 
                    370: void
                    371: vname(Biobuf *b, char class, char *name, int slot)
                    372: {
                    373:        char io[4];
                    374: 
                    375:        io[0] = ANAME;
                    376:        switch(class) {
                    377:        default:
                    378:                fatal("vcache %d", class);
                    379:        case Dfile:
                    380:                io[1] = D_FILE;
                    381:                break;
                    382:        case Internal:
                    383:                io[1] = D_STATIC;
                    384:                break;
                    385:        case External:
                    386:        case Global:
                    387:                io[1] = D_EXTERN;
                    388:                break;
                    389:        case Parameter:
                    390:                io[1] = D_PARAM;
                    391:                break;
                    392:        case Automatic:
                    393:                io[1] = D_AUTO;
                    394:                break;
                    395:        }
                    396:        io[2] = slot;
                    397: 
                    398:        Bwrite(b, io, 3);
                    399:        Bwrite(b, name, strlen(name)+1);
                    400: }
                    401: 
                    402: char*
                    403: vaddr(char *bp, Adres *a, int s)
                    404: {
                    405:        long l;
                    406:        Ieee e;
                    407: 
                    408:        bp[0] = D_NONE;
                    409:        bp[1] = NREG;
                    410:        bp[2] = 0;
                    411:        bp[3] = D_NONE;
                    412: 
                    413:        switch(a->type) {
                    414:        default:
                    415:                fatal("vaddr %a", a);
                    416: 
                    417:        case A_NONE:
                    418:                bp += 4;
                    419:                break;
                    420: 
                    421:        case A_CONST:
                    422:                bp[0] = D_CONST;
                    423:                if(a->reg != Nreg)
                    424:                        bp[1] = a->reg;
                    425:                bp[2] = s;
                    426:                l = a->ival;
                    427:                switch(a->class) {
                    428:                default:
                    429:                        bp[3] = D_NONE;
                    430:                        break;
                    431:                case Internal:
                    432:                        bp[3] = D_STATIC;
                    433:                        break;
                    434:                case External:
                    435:                case Global:
                    436:                        bp[3] = D_EXTERN;
                    437:                        break;
                    438:                case Parameter:
                    439:                        bp[3] = D_PARAM;
                    440:                        break;
                    441:                case Automatic:
                    442:                        bp[3] = D_AUTO;
                    443:                        break;
                    444:                }
                    445:                bp[4] = l;
                    446:                bp[5] = l>>8;
                    447:                bp[6] = l>>16;
                    448:                bp[7] = l>>24;
                    449:                bp += 8;
                    450:                break;
                    451: 
                    452:        case A_FCONST:
                    453:                bp[0] = D_FCONST;
                    454:                ieeedtod(&e, a->fval);
                    455:                l = e.l;
                    456:                bp[4] = l;
                    457:                bp[5] = l>>8;
                    458:                bp[6] = l>>16;
                    459:                bp[7] = l>>24;
                    460:                l = e.h;
                    461:                bp[8] = l;
                    462:                bp[9] = l>>8;
                    463:                bp[10] = l>>16;
                    464:                bp[11] = l>>24;
                    465:                bp += 12;
                    466:                break;
                    467: 
                    468:        case A_REG:
                    469:                bp[0] = D_REG;
                    470:                bp[1] = a->reg;
                    471:                bp += 4;
                    472:                break;
                    473: 
                    474:        case A_FREG:
                    475:                bp[0] = D_FREG;
                    476:                bp[1] = a->reg;
                    477:                bp += 4;
                    478:                break;
                    479: 
                    480:        case A_INDREG:
                    481:                bp[0] = D_OREG;
                    482:                bp[2] = s;
                    483:                l = a->ival;
                    484:                switch(a->class) {
                    485:                default:
                    486:                        bp[1] = a->reg;
                    487:                        bp[3] = D_NONE;
                    488:                        break;
                    489:                case Internal:
                    490:                        bp[1] = NREG;
                    491:                        bp[3] = D_STATIC;
                    492:                        break;
                    493:                case External:
                    494:                case Global:
                    495:                        bp[1] = NREG;
                    496:                        bp[3] = D_EXTERN;
                    497:                        break;
                    498:                case Parameter:
                    499:                        bp[1] = NREG;
                    500:                        bp[3] = D_PARAM;
                    501:                        break;
                    502:                case Automatic:
                    503:                        bp[1] = NREG;
                    504:                        bp[3] = D_AUTO;
                    505:                        break;
                    506:                }
                    507:                bp[4] = l;
                    508:                bp[5] = l>>8;
                    509:                bp[6] = l>>16;
                    510:                bp[7] = l>>24;
                    511:                bp += 8;
                    512:                break;
                    513: 
                    514:        case A_BRANCH:
                    515:                bp[0] = D_BRANCH;
                    516:                l = a->ival;
                    517:                bp[4] = l;
                    518:                bp[5] = l>>8;
                    519:                bp[6] = l>>16;
                    520:                bp[7] = l>>24;
                    521:                bp += 8;
                    522:                break;
                    523: 
                    524:        case A_STRING:
                    525:                bp[0] = D_SCONST;
                    526:                memmove(bp+4, a->str, NSNAME);
                    527:                bp += 4+NSNAME;
                    528:                break;
                    529:        }
                    530:        return bp;
                    531: }
                    532: 
                    533: /* Quoted string printer */
                    534: int
                    535: qconv(void *o, Fconv *f)
                    536: {
                    537:        char buf[64], *b;
                    538:        char *p;
                    539:        int i;
                    540: 
                    541:        p = *((char**)o);
                    542:        b = buf;
                    543:        for(i = 0; i < 8; i++) {
                    544:                if(rcmap[*p]) {
                    545:                        b[0] = '\\';
                    546:                        b[1] = rcmap[*p++];
                    547:                        b += 2;
                    548:                }
                    549:                else
                    550:                        *b++ = *p++;
                    551:        }
                    552:        *b = '\0';
                    553:        strconv(buf, f);
                    554:        return sizeof(p);
                    555: }
                    556: 
                    557: /* Instruction printer */
                    558: int
                    559: iconv(void *o, Fconv *f)
                    560: {
                    561:        Inst *i;
                    562:        char c, buf[128];
                    563: 
                    564:        i = *((Inst **)o);
                    565: 
                    566:        if(i->op == ADATA || i->op == AINIT || i->op == ADYNT)
                    567:                sprint(buf, "\t%s\t%a/%d,%a", itab[i->op], &i->src1, i->reg, &i->dst);
                    568:        else
                    569:        if(i->reg == Nreg) {
                    570:                if(i->dst.type == A_NONE)
                    571:                        sprint(buf, "\t%s\t%a", itab[i->op], &i->src1);
                    572:                else
                    573:                        sprint(buf, "\t%s\t%a,%a", itab[i->op], &i->src1, &i->dst);
                    574:        }
                    575:        else {
                    576:                c = 'R';
                    577:                if(i->src1.type == A_FREG)
                    578:                        c = 'F';
                    579:                sprint(buf, "\t%s\t%a,%c%d,%a", itab[i->op], 
                    580:                                        &i->src1, c, i->reg, &i->dst);
                    581:        }
                    582: 
                    583:        strconv(buf, f);
                    584:        return sizeof(i);
                    585: }
                    586: 
                    587: int
                    588: mconv(void *o, Fconv *f)
                    589: {
                    590:        Adres *adr;
                    591:        char buf[128];
                    592: 
                    593:        adr = *((Adres **)o);
                    594: 
                    595:        switch(adr->class) {
                    596:        default:
                    597:                sprint(buf, "Addr(%d/%d)", adr->class, adr->ival);
                    598:                break;
                    599: 
                    600:        case External:
                    601:        case Global:
                    602:                sprint(buf, "%s+%d(SB)", adr->sym->name, adr->ival);
                    603:                break;
                    604: 
                    605:        case Internal:
                    606:                sprint(buf, "%s<>+%d(SB)", adr->sym->name, adr->ival);
                    607:                break;
                    608: 
                    609:        case Parameter:
                    610:                sprint(buf, "%s+%d(FP)", adr->sym->name, adr->ival);
                    611:                break;
                    612: 
                    613:        case Automatic:
                    614:                sprint(buf, "%s%d(SP)", adr->sym->name, adr->ival);
                    615:                break;
                    616:        }
                    617: 
                    618:        strconv(buf, f);
                    619:        return sizeof(adr);
                    620: 
                    621: }
                    622: 
                    623: /* Address syllable printer */
                    624: int
                    625: aconv(void *o, Fconv *f)
                    626: {
                    627:        char buf[128];
                    628:        Adres *adr;
                    629: 
                    630:        adr = *((Adres **)o);
                    631:        switch(adr->type) {
                    632:        default:
                    633:                sprint(buf, "Addr(%d)", adr->type);
                    634:                break;
                    635: 
                    636:        case A_NONE:
                    637:                buf[0] = 0;
                    638:                break;
                    639: 
                    640:        case A_BRANCH:
                    641:                sprint(buf, "%d(PC)", adr->ival);
                    642:                break;
                    643: 
                    644:        case A_STRING:
                    645:                sprint(buf, "$\"%q\"", adr->str);
                    646:                break;
                    647: 
                    648:        case A_CONST:
                    649:                if(adr->class)
                    650:                        sprint(buf, "$%m", adr);
                    651:                else
                    652:                if(adr->reg != Nreg)
                    653:                        sprint(buf, "$%d(R%d)", adr->ival, adr->reg);
                    654:                else
                    655:                        sprint(buf, "$%d", adr->ival);
                    656:                break;
                    657: 
                    658:        case A_FCONST:
                    659:                sprint(buf, "$%#g", adr->fval);
                    660:                break;
                    661: 
                    662:        case A_REG:
                    663:                sprint(buf, "R%d", adr->reg);
                    664:                break;
                    665: 
                    666:        case A_FREG:
                    667:                sprint(buf, "F%d", adr->reg);
                    668:                break;
                    669: 
                    670:        case A_INDREG:
                    671:                if(adr->class)
                    672:                        sprint(buf, "%m", adr);
                    673:                else
                    674:                if(adr->ival == 0)
                    675:                        sprint(buf, "(R%d)", adr->reg);
                    676:                else
                    677:                        sprint(buf, "%d(R%d)", adr->ival, adr->reg);
                    678:                break;
                    679:        }
                    680: 
                    681:        strconv(buf, f);
                    682:        return sizeof(adr);
                    683: }
                    684: 
                    685: typedef struct runtime Runtime;
                    686: struct runtime
                    687: {
                    688:        char    *name;
                    689:        Node    **p;
                    690: }runtime[] = {
                    691:        "ALEF_proc",            &procnode,
                    692:        "ALEF_task",            &tasknode,
                    693:        "ALEF_send",            &sendnode,
                    694:        "ALEF_exit",            &exitnode,
                    695:        "ALEF_selrecv",         &selrecv,
                    696:        "ALEF_selsend",         &selsend,
                    697:        "ALEF_doselect",        &doselect,
                    698:        "ALEF_varselect",       &varselect,
                    699:        "ALEF_pfork",           &pforknode,
                    700:        "ALEF_pexit",           &pexitnode,
                    701:        "ALEF_pdone",           &pdonenode,
                    702:        "ALEF_csnd",            &csndnode,
                    703:        "ALEF_crcv",            &crcvnode,
                    704:        "ALEF_chana",           &challocnode,
                    705:        "ALEF_chanu",           &chunallocnode,
                    706:        "malloc",               &allocnode,
                    707:        "free",                 &unallocnode,
                    708:        "ALEF_gin",             &ginode,
                    709:        "ALEF_gou",             &gonode,
                    710:        "memmove",              &movenode,
                    711:        "ALEFcheck",            &checknode,
                    712:        0,                      0,
                    713: };
                    714: 
                    715: void
                    716: outinit(void)
                    717: {
                    718:        Node *n;
                    719:        Type *t;
                    720:        Runtime *rp;
                    721: 
                    722:        fmtinstall('i', iconv);         /* Instructions */
                    723:        fmtinstall('a', aconv);         /* Addresses */
                    724:        fmtinstall('q', qconv);         /* Data */
                    725:        fmtinstall('m', mconv);         /* Memeory addresses */
                    726:        fmtinstall('B', Bconv);         /* Memeory addresses */
                    727: 
                    728:        for(rp = runtime; rp->name; rp++) {
                    729:                n = an(ONAME, nil, nil);
                    730:                n->sym = enter(rp->name, Tid);
                    731: 
                    732:                t = builtype[TVOID];
                    733:                if(rp->p == &allocnode)
                    734:                        t = at(TIND, t);
                    735:                t = at(TFUNC, t);
                    736:                t->proto = an(ONAME, an(OVARARG, nil, nil), nil);
                    737:                t->proto->sym = n->sym;
                    738:                if(rp->p == &checknode)
                    739:                        t = at(TIND, t);
                    740: 
                    741:                n->t = t;
                    742:                n->ti = ati(t, Global);
                    743:                sucalc(n);
                    744:                *(rp->p) = n;
                    745:        }
                    746: 
                    747:        zprog.next = 0;
                    748:        zprog.src1.type = A_NONE;
                    749:        zprog.dst.type = A_NONE;
                    750:        zprog.op = AGOK;
                    751:        zprog.reg = Nreg;
                    752: }
                    753: 
                    754: void
                    755: ieeedtod(Ieee *ieee, double native)
                    756: {
                    757:        double fr, ho, f;
                    758:        int exp;
                    759: 
                    760:        if(native < 0) {
                    761:                ieeedtod(ieee, -native);
                    762:                ieee->h |= 0x80000000L;
                    763:                return;
                    764:        }
                    765:        if(native == 0) {
                    766:                ieee->l = 0;
                    767:                ieee->h = 0;
                    768:                return;
                    769:        }
                    770:        fr = frexp(native, &exp);
                    771:        f = 2097152L;           /* shouldnt use fp constants here */
                    772:        fr = modf(fr*f, &ho);
                    773:        ieee->h = ho;
                    774:        ieee->h &= 0xfffffL;
                    775:        ieee->h |= (exp+1022L) << 20;
                    776:        f = 65536L;
                    777:        fr = modf(fr*f, &ho);
                    778:        ieee->l = ho;
                    779:        ieee->l <<= 16;
                    780:        ieee->l |= (long)(fr*f);
                    781: }
                    782: 
                    783: void
                    784: init(Node *tab, Node *v)
                    785: {
                    786:        Inst *i;
                    787: 
                    788:        i = ai();
                    789:        i->op = AINIT;
                    790:        i->reg = builtype[TIND]->size;
                    791:        mkaddr(tab, &i->src1, 0);
                    792:        mkaddr(v, &i->dst, 0);
                    793:        ilink(i);
                    794: }
                    795: 
                    796: void
                    797: dynt(Node *tab, Node *ind)
                    798: {
                    799:        Inst *i;
                    800: 
                    801:        i = ai();
                    802:        i->op = ADYNT;
                    803:        if(tab)
                    804:                mkaddr(tab, &i->src1, 0);
                    805:        mkaddr(ind, &i->dst, 0);
                    806:        ilink(i);
                    807: }
                    808: 
                    809: void
                    810: dupok(void)
                    811: {
                    812:        if(ipc->reg == Nreg)
                    813:                ipc->reg = DUPOK;
                    814:        else
                    815:                ipc->reg |= DUPOK;
                    816: }

unix.superglobalmegacorp.com

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