Annotation of researchv10no/cmd/f77/alt/pdp11.c, revision 1.1.1.1

1.1       root        1: #include "defs"
                      2: #if FAMILY == DMR
                      3: #      include "dmrdefs"
                      4: #endif
                      5: #if FAMILY==PCC
                      6: #      include "pccdefs"
                      7: #endif
                      8: 
                      9: /*
                     10:       PDP 11-SPECIFIC ROUTINES
                     11: */
                     12: 
                     13: int maxregvar = 0;
                     14: int regnum[] = { 3, 2 };
                     15: 
                     16: ftnint intcon[14] =
                     17:        { 2, 2, 2, 2,
                     18:          15, 31, 24, 56,
                     19:          -128, -128, 127, 127,
                     20:          32767, 2147483647 };
                     21: 
                     22: #if HERE == PDP11
                     23:        /* then put in constants in octal */
                     24: long realcon[6][2] =
                     25:        {
                     26:                { 040000000, 0 },
                     27:                { 040000000, 0 },
                     28:                { 017777777777, 0 },
                     29:                { 017777777777, 037777777777 },
                     30:                { 06440000000, 0 },
                     31:                { 04440000000, 0 }
                     32:        };
                     33: #else
                     34: double realcon[6] =
                     35:        {
                     36:        2.9387358771e-39,
                     37:        2.938735877055718800e-39
                     38:        1.7014117332e+38,
                     39:        1.701411834604692250e+38
                     40:        5.960464e-8,
                     41:        1.38777878078144567e-17,
                     42:        };
                     43: #endif
                     44: 
                     45: 
                     46: 
                     47: 
                     48: prsave()
                     49: {
                     50: }
                     51: 
                     52: 
                     53: 
                     54: goret(type)
                     55: int type;
                     56: {
                     57: #if  FAMILY == DMR
                     58:        p2op(P2RETURN);
                     59: #endif
                     60: #if FAMILY==PCC
                     61:        p2pass("\tjmp\tcret");
                     62: #endif
                     63: }
                     64: 
                     65: 
                     66: 
                     67: 
                     68: /*
                     69:  * move argument slot arg1 (relative to ap)
                     70:  * to slot arg2 (relative to ARGREG)
                     71:  */
                     72: 
                     73: mvarg(type, arg1, arg2)
                     74: int type, arg1, arg2;
                     75: {
                     76: mvarg1(arg1+4, arg2);
                     77: if(type == TYLONG)
                     78:        mvarg1(arg1+6, arg2+2);
                     79: }
                     80: 
                     81: 
                     82: 
                     83: 
                     84: mvarg1(m, n)
                     85: int m, n;
                     86: {
                     87: #if FAMILY == DMR
                     88:        p2reg(ARGREG, P2SHORT|P2PTR);
                     89:        p2op2(P2ICON, P2SHORT);
                     90:        p2i(n);
                     91:        p2op2(P2PLUS, P2SHORT|P2PTR);
                     92:        p2op2(P2INDIRECT, P2SHORT);
                     93:        p2reg(AUTOREG, P2SHORT|P2PTR);
                     94:        p2op2(P2ICON, P2SHORT);
                     95:        p2i(m);
                     96:        p2op2(P2PLUS, P2SHORT|P2PTR);
                     97:        p2op2(P2INDIRECT, P2SHORT);
                     98:        p2op2(P2ASSIGN, P2SHORT);
                     99:        putstmt();
                    100: #endif
                    101: #if FAMILY == PCC
                    102:        p2pij("\tmov\t%d.(r5),%d.(r4)", m, n);
                    103: #endif
                    104: }
                    105: 
                    106: 
                    107: 
                    108: 
                    109: prlabel(fp, k)
                    110: FILEP fp;
                    111: int k;
                    112: {
                    113: fprintf(fp, "L%d:\n", k);
                    114: }
                    115: 
                    116: 
                    117: 
                    118: prconi(fp, type, n)
                    119: FILEP fp;
                    120: int type;
                    121: ftnint n;
                    122: {
                    123: register int *np;
                    124: np = &n;
                    125: if(type == TYLONG)
                    126:        fprintf(fp, "\t%d.;%d.\n", np[0], np[1]);
                    127: else
                    128:        fprintf(fp, "\t%d.\n", np[1]);
                    129: }
                    130: 
                    131: 
                    132: 
                    133: prcona(fp, a)
                    134: FILEP fp;
                    135: ftnint a;
                    136: {
                    137: fprintf(fp, "L%ld\n", a);
                    138: }
                    139: 
                    140: 
                    141: 
                    142: #if HERE!=PDP11
                    143: BAD NEWS
                    144: #endif
                    145: 
                    146: #if HERE==PDP11
                    147: prconr(fp, type, x)
                    148: FILEP fp;
                    149: int type;
                    150: double x;
                    151: {
                    152: register int k, *n;
                    153: n = &x;        /* nonportable cheat */
                    154: k = (type==TYREAL ? 2 : 4);
                    155: fprintf(fp, "\t");
                    156: while(--k >= 0)
                    157:        fprintf(fp, "%d.%c", *n++, (k==0 ? '\n' : ';') );
                    158: }
                    159: #endif
                    160: 
                    161: 
                    162: 
                    163: 
                    164: preven(k)
                    165: int k;
                    166: {
                    167: if(k > 1)
                    168:        fprintf(asmfile, "\t.even\n", k);
                    169: }
                    170: 
                    171: 
                    172: 
                    173: #if FAMILY == PCC
                    174: 
                    175: prcmgoto(p, nlab, skiplabel, labarray)
                    176: expptr p;
                    177: int nlab, skiplabel, labarray;
                    178: {
                    179: int regno;
                    180: 
                    181: putforce(p->vtype, p);
                    182: 
                    183: if(p->vtype == TYLONG)
                    184:        {
                    185:        regno = 1;
                    186:        p2pass("\ttst\tr0");
                    187:        p2pi("\tbne\tL%d", skiplabel);
                    188:        }
                    189: else
                    190:        regno = 0;
                    191: 
                    192: p2pij("\tcmp\tr%d,$%d.", regno, nlab);
                    193: p2pi("\tbhi\tL%d", skiplabel);
                    194: p2pi("\tasl\tr%d", regno);
                    195: p2pij("\tjmp\t*L%d(r%d)", labarray, regno);
                    196: }
                    197: 
                    198: 
                    199: prarif(p, neg,zer,pos)
                    200: expptr p;
                    201: int neg, zer, pos;
                    202: {
                    203: register int ptype;
                    204: 
                    205: putforce( ptype = p->vtype, p);
                    206: if( ISINT(ptype) )
                    207:        {
                    208:        p2pass("\ttst\tr0");
                    209:        p2pi("\tjlt\tL%d", neg);
                    210:        p2pi("\tjgt\tL%d", pos);
                    211:        if(ptype != TYSHORT)
                    212:                {
                    213:                p2pass("\ttst\tr1");
                    214:                p2pi("\tjeq\tL%d", zer);
                    215:                }
                    216:        p2pi("\tjbr\tL%d", pos);
                    217:        }
                    218: else
                    219:        {
                    220:        p2pass("\ttstf\tr0");
                    221:        p2pass("\tcfcc");
                    222:        p2pi("\tjeq\tL%d", zer);
                    223:        p2pi("\tjlt\tL%d", neg);
                    224:        p2pi("\tjmp\tL%d", pos);
                    225:        }
                    226: }
                    227: 
                    228: #endif
                    229: 
                    230: 
                    231: 
                    232: 
                    233: char *memname(stg, mem)
                    234: int stg, mem;
                    235: {
                    236: static char s[20];
                    237: 
                    238: switch(stg)
                    239:        {
                    240:        case STGCOMMON:
                    241:        case STGEXT:
                    242:                sprintf(s, "_%s", varstr(XL, extsymtab[mem].extname) );
                    243:                break;
                    244: 
                    245:        case STGBSS:
                    246:        case STGINIT:
                    247:                sprintf(s, "v.%d", mem);
                    248:                break;
                    249: 
                    250:        case STGCONST:
                    251:                sprintf(s, "L%d", mem);
                    252:                break;
                    253: 
                    254:        case STGEQUIV:
                    255:                sprintf(s, "q.%d", mem+eqvstart);
                    256:                break;
                    257: 
                    258:        default:
                    259:                fatali("memname: invalid vstg %d", stg);
                    260:        }
                    261: return(s);
                    262: }
                    263: 
                    264: 
                    265: prlocvar(s, len)
                    266: char *s;
                    267: ftnint len;
                    268: {
                    269: fprintf(asmfile, "%s:", s);
                    270: prskip(asmfile, len);
                    271: }
                    272: 
                    273: 
                    274: 
                    275: prext(name, leng, init)
                    276: char *name;
                    277: ftnint leng;
                    278: int init;
                    279: {
                    280: if(leng==0 || init)
                    281:        fprintf(asmfile, "\t.globl\t_%s\n", name);
                    282: else
                    283:        fprintf(asmfile, "\t.comm\t_%s,%ld.\n", name, leng);
                    284: }
                    285: 
                    286: 
                    287: 
                    288: prendproc()
                    289: {
                    290: }
                    291: 
                    292: 
                    293: 
                    294: prtail()
                    295: {
                    296: #if FAMILY == PCC
                    297:        p2pass("\t.globl\tcsv,cret");
                    298: #else
                    299:        p2op(P2EOF);
                    300: #endif
                    301: }
                    302: 
                    303: 
                    304: 
                    305: prolog(ep, argvec)
                    306: struct Entrypoint *ep;
                    307: struct Addrblock *argvec;
                    308: {
                    309: int i, argslot, proflab;
                    310: register chainp p;
                    311: register struct Nameblock *q;
                    312: register struct Dimblock *dp;
                    313: struct Constblock *mkaddcon();
                    314: 
                    315: if(procclass == CLMAIN)
                    316:        prentry("MAIN__");
                    317: 
                    318: if(ep->entryname)
                    319:        prentry( varstr(XL, ep->entryname->extname) );
                    320: 
                    321: if(procclass == CLBLOCK)
                    322:        return;
                    323: if(profileflag)
                    324:        proflab = newlabel();
                    325: #if FAMILY == PCC
                    326:        if(profileflag)
                    327:                {
                    328:                fprintf(asmfile, "L%d:\t. = .+2\n", proflab);
                    329:                p2pi("\tmov\t$L%d,r0", proflab);
                    330:                p2pass("\tjsr\tpc,mcount");
                    331:                }
                    332:        p2pass("\tjsr\tr5,csv");
                    333:        p2pi("\tsub\t$.F%d,sp", procno);
                    334: #else
                    335:        if(profileflag)
                    336:                p2op2(P2PROFILE, proflab);
                    337:        p2op(P2SAVE);
                    338:        p2op2(P2SETSTK, ( (((int) autoleng)+1) & ~01) );
                    339: #endif
                    340: 
                    341: if(argvec == NULL)
                    342:        addreg(argloc = 4);
                    343: else
                    344:        {
                    345:        addreg( argloc = argvec->memoffset->constblock.const.ci );
                    346:        if(proctype == TYCHAR)
                    347:                {
                    348:                mvarg(TYADDR, 0, chslot);
                    349:                mvarg(TYLENG, SZADDR, chlgslot);
                    350:                argslot = SZADDR + SZLENG;
                    351:                }
                    352:        else if( ISCOMPLEX(proctype) )
                    353:                {
                    354:                mvarg(TYADDR, 0, cxslot);
                    355:                argslot = SZADDR;
                    356:                }
                    357:        else
                    358:                argslot = 0;
                    359: 
                    360:        for(p = ep->arglist ; p ; p =p->nextp)
                    361:                {
                    362:                q = p->datap;
                    363:                mvarg(TYADDR, argslot, q->vardesc.varno);
                    364:                argslot += SZADDR;
                    365:                }
                    366:        for(p = ep->arglist ; p ; p = p->nextp)
                    367:                {
                    368:                q = p->datap;
                    369:                if(q->vtype==TYCHAR || q->vclass==CLPROC)
                    370:                        {
                    371:                        if( q->vleng && ! ISCONST(q->vleng) )
                    372:                                mvarg(TYLENG, argslot, q->vleng->addrblock.memno);
                    373:                        argslot += SZLENG;
                    374:                        }
                    375:                }
                    376:        }
                    377: 
                    378: for(p = ep->arglist ; p ; p = p->nextp)
                    379:        if(dp = ( (struct Nameblock *) (p->datap) ) ->vdim)
                    380:                {
                    381:                for(i = 0 ; i < dp->ndim ; ++i)
                    382:                        if(dp->dims[i].dimexpr)
                    383:                                puteq( fixtype(cpexpr(dp->dims[i].dimsize)),
                    384:                                        fixtype(cpexpr(dp->dims[i].dimexpr)));
                    385:                if(dp->basexpr)
                    386:                        puteq(  cpexpr(fixtype(dp->baseoffset)),
                    387:                                cpexpr(fixtype(dp->basexpr)));
                    388:                }
                    389: 
                    390: if(typeaddr)
                    391:        puteq( cpexpr(typeaddr), mkaddcon(ep->typelabel) );
                    392: putgoto(ep->entrylabel);
                    393: }
                    394: 
                    395: 
                    396: 
                    397: prentry(s)
                    398: char *s;
                    399: {
                    400: #if FAMILY == PCC
                    401:        p2ps("_%s:", s);
                    402: #else
                    403:        p2op(P2RLABEL);
                    404:        putc('_', textfile);
                    405:        p2str(s);
                    406: #endif
                    407: }
                    408: 
                    409: 
                    410: 
                    411: 
                    412: addreg(k)
                    413: int k;
                    414: {
                    415: #if FAMILY == PCC
                    416:        p2pass("\tmov\tr5,r4");
                    417:        p2pi("\tadd\t$%d.,r4", k);
                    418: #else
                    419:        p2reg(ARGREG, P2SHORT);
                    420:        p2reg(AUTOREG, P2SHORT);
                    421:        p2op2(P2ICON, P2SHORT);
                    422:        p2i(k);
                    423:        p2op2(P2PLUS, P2SHORT);
                    424:        p2op2(P2ASSIGN, P2SHORT);
                    425:        putstmt();
                    426: #endif
                    427: }
                    428: 
                    429: 
                    430: 
                    431: 
                    432: 
                    433: prhead(fp)
                    434: FILEP fp;
                    435: {
                    436: #if FAMILY == PCC
                    437:        p2triple(P2LBRACKET, ARGREG-1-highregvar, procno);
                    438:        p2word( (long) (BITSPERCHAR*autoleng) );
                    439:        p2flush();
                    440: #endif
                    441: }
                    442: 
                    443: prdbginfo()
                    444: {
                    445: register char *s;
                    446: char *t, buff[50];
                    447: register struct Nameblock *p;
                    448: struct Hashentry *hp;
                    449: 
                    450: if(s = entries->entryname->extname)
                    451:        s = varstr(XL, s);
                    452: else if(procclass == CLMAIN)
                    453:        s = "MAIN__";
                    454: else
                    455:        return;
                    456: 
                    457: if(procclass != CLBLOCK)
                    458:        fprintf(asmfile, "~~%s = _%s\n", s, s);
                    459: 
                    460: for(hp = hashtab ; hp<lasthash ; ++hp)
                    461:     if(p = hp->varp)
                    462:        {
                    463:        s = NULL;
                    464:        if(p->vstg == STGARG)
                    465:                {
                    466:                sprintf(buff, "%o", p->vardesc.varno+argloc);
                    467:                s = buff;
                    468:                }
                    469:        else if(p->vclass == CLVAR)
                    470:                switch(p->vstg)
                    471:                        {
                    472:                        case STGBSS:
                    473:                        case STGINIT:
                    474:                        case STGEQUIV:
                    475:                                t = memname(p->vstg, p->vardesc.varno);
                    476:                                if(p->voffset)
                    477:                                        sprintf(buff, "%s+%o", t, p->voffset);
                    478:                                else
                    479:                                        sprintf(buff, "%s", t);
                    480:                                s = buff;
                    481:                                break;
                    482: 
                    483:                        case STGAUTO:
                    484:                                sprintf(buff, "%o", p->voffset);
                    485:                                s = buff;
                    486:                                break;
                    487: 
                    488:                        default:
                    489:                                break;
                    490:                        }
                    491:        if(s)
                    492:                fprintf(asmfile, "~%s = %s\n", varstr(VL,p->varname), s);
                    493:        }
                    494: fprintf(asmfile, "~~:\n");
                    495: }

unix.superglobalmegacorp.com

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