Annotation of researchv9/cmd/sun/pcc/float2.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)float2.c 1.1 86/02/03 Copyr 1985 Sun Micro";
                      3: #endif
                      4: 
                      5: /*
                      6:  * Copyright (c) 1985 by Sun Microsystems, Inc.
                      7:  */
                      8: 
                      9: /*
                     10:  *     float2.c
                     11:  */
                     12: 
                     13: #include "cpass2.h"
                     14: #include "sky.h"
                     15: #define iscnode(x) (x->tn.op==REG && iscreg(x->tn.rval))
                     16: 
                     17: static skyused = 0;
                     18: int skybase = 0;
                     19: 
                     20: 
                     21: #define FADD   0
                     22: #define FADDS  1
                     23: #define FSUB   2
                     24: #define FSUBS  3
                     25: #define FMUL   4
                     26: #define FMULS  5
                     27: #define FDIV   6
                     28: #define FDIVS  7
                     29: #define FMOD   8
                     30: #define FMODS  9
                     31: #define FITOD  10
                     32: #define FITOS  11
                     33: #define FSTOD  12
                     34: #define FDTOS  13
                     35: #define FSTOI  14
                     36: #define FDTOI  15
                     37: #define FCMP   16
                     38: #define FCMPS  17
                     39: #define FPVT   18
                     40: #define FPVTS  19
                     41: 
                     42: extern NODE * double_conv();
                     43: 
                     44: ezsconv( p )
                     45:     register NODE *p;
                     46: {
                     47:     /* return 1 if *p is an SCONV that does not require run-time support */
                     48: 
                     49:     if (use68881)
                     50:        return(1);
                     51:     switch (p->in.type){
                     52:     case FLOAT:
                     53:     case DOUBLE:
                     54:        return 0;
                     55:     default:
                     56:        switch (p->in.left->in.type){
                     57:        case FLOAT:
                     58:            /* ???p->in.left = double_conv( p->in.left ); */
                     59:            /* fall through */
                     60:        case DOUBLE:
                     61:            return 0;
                     62:        default: return 1;
                     63:        }
                     64:     }
                     65: }
                     66: 
                     67: static void
                     68: rightreg( l, r, d)
                     69:     NODE *l, *r, *d;
                     70: {
                     71:     if (usesky) return;
                     72:     if (l->in.op!=REG || (r && r->in.type==FLOAT && r->in.op!=REG))
                     73:        cerror("misplaced floating argument\n");
                     74:     if (l->tn.rval != D0){
                     75:        if (r && r->in.op==REG && r->tn.rval == D0){
                     76:            if (l->tn.rval == D1){
                     77:                print_str("     exg     d0,d1\n");
                     78:                l->tn.rval = D0;
                     79:                r->tn.rval = D1;
                     80:                return;
                     81:            } else {
                     82:                r->in.rall = MUSTDO|D1;
                     83:                order( r, INTAREG );
                     84:            }
                     85:        }
                     86:        l->in.rall = MUSTDO|D0;
                     87:        order( l, INTAREG );
                     88:     }
                     89:     if (r && r->in.type==FLOAT && r->tn.rval != D1 ){
                     90:        r->in.rall = MUSTDO|D1;
                     91:        order( r, INTAREG );
                     92:     } else if (r && r->in.type==DOUBLE)
                     93:        if (tshape( r, SNAME|SOREG|SCON|STARNM))
                     94:            expand( r, FOREFF, "        lea     A.,a0\n" );
                     95:        else {
                     96:            /* must be *dp++ or *--dp. Horrors!! */
                     97:            if ((l=r->in.left)->in.op == ASG MINUS)
                     98:                expand( l->in.left, FOREFF, "   subqw   #8,A.\n");
                     99:            expand( l->in.left, INTBREG, "      movl    A.,a0\n");
                    100:            if (l->in.op == INCR)
                    101:                expand( l->in.left, FOREFF, "   addqw   #8,A.\n");
                    102:        }
                    103:     if (d!=NULL){
                    104:        /* must be d0 */
                    105:        if (d->in.op!=REG || d->tn.rval!=D0)
                    106:            cerror("misplaced floating argument\n");
                    107:     }
                    108: }
                    109: 
                    110: struct fopnames {
                    111:        char *opcode;
                    112:        char *fvroutine;
                    113: } fopnames[] = {
                    114:        "fabs",         "abs",
                    115:        "fcos",         "cos",
                    116:        "fsin",         "sin",
                    117:        "ftan",         "tan",
                    118:        "facos",        "acos",
                    119:        "fasin",        "asin",
                    120:        "fatan",        "atan",
                    121:        "fcosh",        "cosh",
                    122:        "fsinh",        "sinh",
                    123:        "ftanh",        "tanh",
                    124:        "fetox",        "exp",
                    125:        "ftentox",      "pow10",
                    126:        "ftwotox",      "pow2",
                    127:        "flogn",        "log",
                    128:        "flog10",       "log10",
                    129:        "flog2",        "log2",
                    130:        "",             "sqr",
                    131:        "fsqrt",        "sqrt",
                    132:        "fintrz",       "aint",
                    133:        "",             "anint",
                    134:        "",             "nint",
                    135: };
                    136: 
                    137: char
                    138: floatprefix()
                    139: {
                    140:        extern usesky, usefpa, use68881, useswitch;
                    141: 
                    142:        if (usefpa) return 'W';
                    143:        if (use68881) return 'M';
                    144:        if (useswitch) return 'V';
                    145:        if (usesky) return 'S';
                    146:        return 'F';
                    147: }
                    148: 
                    149: /*
                    150:  * load floating point result register A1 with operand q.
                    151:  * opcode is the mnemonic for a 68881 instruction that
                    152:  * accepts a memory, d-reg, or fp-reg source operand.
                    153:  */
                    154: fpload(q, cookie, opcode)
                    155:        register NODE *q;
                    156:        char *opcode;
                    157: {
                    158:        if ( q->in.op == REG && q->in.type == DOUBLE
                    159:            && isareg(q->tn.rval) ) {
                    160:                /* register pair */
                    161:                expand(q, cookie,
                    162:                    "   movl    U.,sp@-\n        movl   A.,sp@-\n");
                    163:                printf("        %s", opcode);
                    164:                expand(q, cookie, "ZF   sp@+,A1\n");
                    165:        } else {
                    166:                printf("        %s", opcode);
                    167:                expand(q, cookie, "ZF   A.,A1\n");
                    168:        }
                    169: }
                    170: 
                    171: floatcode( p, cookie )
                    172:     register NODE *p;
                    173: {
                    174:     /*
                    175:      * we mean to emit floating-point code. figure out what we want to do,
                    176:      * figure out who we are, and do the right thing.
                    177:      */
                    178:      register o, ty;
                    179:      register NODE *q, *r;
                    180:      NODE *d;
                    181:      NODE *x;
                    182:      int temp, m;
                    183:      int fname;
                    184: 
                    185:      ty = p->in.type;
                    186:      q  = p->in.left;
                    187:      r  = p->in.right;
                    188:      o  = p->in.op;
                    189: 
                    190:     d = &resc[0];
                    191:     x = NIL;
                    192:     switch (o){
                    193:     case ASG PLUS:     d = q;
                    194:     case     PLUS:     fname = FADD; 
                    195:                        if (usesky && r->in.op == MUL) {
                    196:                            fname = FPVT;
                    197:                            x = q;
                    198:                            q = r->in.left;
                    199:                            r = r->in.right;
                    200:                        }
                    201:                        goto asop;
                    202:     case ASG MINUS:    d = q;
                    203:     case     MINUS:    fname = FSUB; 
                    204:                        goto asop;
                    205:     case ASG MUL:      d = q;
                    206:     case     MUL:      fname = FMUL;
                    207:                        goto asop;
                    208:     case ASG MOD:      d = q;
                    209:     case     MOD:      fname = FMOD; 
                    210:                        goto asop;
                    211:     case ASG DIV:      d = q;
                    212:     case     DIV:      fname = FDIV;
                    213:            asop:
                    214:                        /* d0 op= d1  */
                    215:                        /* d0 op= *a0 */
                    216:                        /* and, for sky case */
                    217:                        /* AWD op= AWD */
                    218:                        /* or 
                    219:                        /* AWD = AWD op AWD */
                    220:                        if (p->in.type == FLOAT )
                    221:                            fname += 1;
                    222:                        rightreg( q, r, d );
                    223:                        floatop( fname, r, q, x, d );
                    224:                        return;
                    225: 
                    226:     case REG:
                    227:     case NAME:
                    228:     case FCON:
                    229:     case OREG:
                    230:     case UNARY MUL:
                    231:                if (cookie&FORARG) {
                    232:                    /* float FORARG -- must convert */
                    233: #ifdef FLOATMATH
                    234:                    if (FLOATMATH>1 && ty == FLOAT){
                    235:                        if (o == REG && iscreg(p->tn.rval)) {
                    236:                            /* 68881 coprocessor register */
                    237:                            expand( p, FORARG," fmoves  AR,Z-\n");
                    238:                        } else {
                    239:                            expand( p, FORARG," movl    AR,Z-\n");
                    240:                        }
                    241:                        return;
                    242:                    }
                    243: #endif FLOATMATH
                    244:                    if (o == FCON) {
                    245:                        p->in.type = DOUBLE;
                    246:                    } else {
                    247:                        p = double_conv(p);
                    248:                    }
                    249:                    order( p, FORARG );
                    250:                    /* expand( p, FORARG,"      movl    UR,Z-\n movl    AR,Z-\n"); */
                    251:                    return;
                    252:                }
                    253: 
                    254:                /* FORCC */
                    255:                m = getlab() ;
                    256:                expand( p, cookie, "    cmpl    #0x80000000,AL\n");
                    257:                print_str_d_nl( "       jeq     L", m );
                    258:                q = (o == UNARY MUL? q : p );
                    259:                if ( q->in.op == REG && isbreg(q->tn.rval) && !use68020 ) {
                    260:                        /* can't tst an a-register with last year's model */
                    261:                        expand( p, cookie, "    cmpw    #0,AL\n");
                    262:                } else {
                    263:                        expand( p, cookie, "    tstl    AL\n");
                    264:                }
                    265:                if ( ty == DOUBLE ){
                    266:                    temp = m; m = getlab();
                    267:                    printf( "   jne     L%d\nL%d:", m, temp);
                    268:                    expand( p, cookie, "        tstl    UL\n");
                    269:                }
                    270:                print_label(m);
                    271:                return;
                    272:        /* end of case EA */
                    273: 
                    274:     case UNARY MINUS:
                    275:        /* negation of a floating-point (or double) quantity */
                    276: /*     expand( p, cookie, "    eorl    #0x80000000, AL\n" ); */
                    277:        expand( p, cookie, (q->tn.op==REG)? "   bchg    #31,AL\n" 
                    278:                                          : "   bchg    #7,AL\n" );
                    279:        return;
                    280:     case LT:
                    281:     case LE:
                    282:     case GT:
                    283:     case GE:
                    284:     case EQ:
                    285:     case NE:
                    286:        fname = FCMP;
                    287:        if (q->in.type==FLOAT)
                    288:            fname += 1;
                    289:        rightreg( q, r, NULL );
                    290:        floatop( fname, r, q, NIL, NIL );
                    291:        return;
                    292: 
                    293:        /* fortran intrinsics -- only unary ops for now */
                    294:     case FABS:
                    295:     case FCOS:
                    296:     case FSIN:
                    297:     case FTAN:
                    298:     case FACOS:
                    299:     case FASIN:
                    300:     case FATAN:
                    301:     case FCOSH:
                    302:     case FSINH:
                    303:     case FTANH:
                    304:     case FEXP:
                    305:     case F10TOX:
                    306:     case F2TOX:
                    307:     case FLOG10:
                    308:     case FLOG2:
                    309:     case FAINT:
                    310:        /*
                    311:         * source in memory, d-regs, or fp-regs
                    312:         * result in fp-reg A1
                    313:         */
                    314:        if (use68881) {
                    315:                /* done in a single instruction by the 68881 */
                    316:                fpload(q, cookie, fopnames[o-FABS].opcode);
                    317:                return;
                    318:        }
                    319:        goto call_intrinsic;
                    320: 
                    321:     case FSQR:         /* sqr(x) = x*x */
                    322:        /*
                    323:         * source in memory, d-regs, or fp-regs
                    324:         * result in fp-reg A1
                    325:         */
                    326:        if (use68881) {
                    327:                fpload(q, cookie, "fmove");
                    328:                expand(q, cookie, "     fmulx   A1,A1\n");
                    329:                return;
                    330:        }
                    331:        goto call_intrinsic;
                    332: 
                    333:     case FANINT:       /* float biased round towards zero */
                    334:        /*
                    335:         * source in memory, d-regs, or fp-regs
                    336:         * result in fp-reg A1
                    337:         */
                    338:        if (use68881) {
                    339:                fpload(q, cookie, "fmove");
                    340:                p->in.op = PLUS;        /* just so getlr will work */
                    341:                r = talloc();
                    342:                p->in.right = r;
                    343:                r->in.op = FCON;
                    344:                r->fpn.type = q->in.type;
                    345:                r->fpn.dval = 0.5;
                    346:                expand(p, cookie, "     ftestx  A1\n");
                    347:                expand(p, cookie, "     fjlt    1f\n");
                    348:                expand(p, cookie, "     faddZF  ZK,A1\n");
                    349:                expand(p, cookie, "     jra     2f\n");
                    350:                expand(p, cookie, "1:   fsubZF  ZK,A1\n");
                    351:                expand(q, cookie, "2:   fintrzx A1,A1\n");
                    352:                return;
                    353:        }
                    354:        goto call_intrinsic;
                    355: 
                    356:     case FNINT:                /* int biased round towards zero */
                    357:        /*
                    358:         * This one is different:
                    359:         * source in fp-reg, result in d-reg A1
                    360:         */
                    361:        if (use68881) {
                    362:                if (!istnode(q) || !iscreg(q->tn.rval)) {
                    363:                        order(q, INTCREG);
                    364:                }
                    365:                p->in.op = PLUS;        /* just so getlr will work */
                    366:                r = talloc();
                    367:                p->in.right = r;
                    368:                r->in.op = FCON;
                    369:                r->fpn.type = q->in.type;
                    370:                r->fpn.dval = 0.5;
                    371:                expand(p, cookie, "     ftestx  AL\n");
                    372:                expand(p, cookie, "     fjlt    1f\n");
                    373:                expand(p, cookie, "     faddZF  ZK,AL\n");
                    374:                expand(p, cookie, "     jra     2f\n");
                    375:                expand(p, cookie, "1:   fsubZF  ZK,AL\n");
                    376:                expand(q, cookie, "2:   fintrzx AL,AL\n");
                    377:                expand(p, cookie, "     fmovel  AL,A1\n");
                    378:                return;
                    379:        }
                    380:        goto call_intrinsic;
                    381: 
                    382:     case FLOGN:
                    383:        /*
                    384:         * KLUDGE to work around a bug in the A79J (RevC) mask set.
                    385:         * In the first production masks of the 68881, flogn does
                    386:         * not work correctly for (0.5 <= x <= 1.0).  The following
                    387:         * work-around is required as long as some of the defective
                    388:         * chips are in the field:
                    389:         */
                    390:        if (use68881) {
                    391:                fpload(q, cookie, "fmove");
                    392:                expand(q, cookie, "     fcmps   #0r0.5,A1\n");
                    393:                expand(q, cookie, "     fjule   1f\n");
                    394:                expand(q, cookie, "     fsubl   #1,A1\n");
                    395:                expand(q, cookie, "     flognp1x A1,A1\n");
                    396:                expand(q, cookie, "     jra     2f\n");
                    397:                expand(q, cookie, "1:   flognx  A1,A1\n");
                    398:                expand(q, cookie, "2:");
                    399:                return;
                    400:        }
                    401:        goto call_intrinsic;
                    402: 
                    403:     case FSQRT:
                    404:        /*
                    405:         * KLUDGE to work around a bug in the A79J (RevC) mask set.
                    406:         * In the first production masks of the 68881, fsqrt fpx,fpy
                    407:         * does not work reliably when fpx and fpy are different
                    408:         * registers.
                    409:         */
                    410:        if (use68881) {
                    411:                if (q->in.op == REG && iscreg(q->tn.rval)
                    412:                    && q->tn.rval != resc[0].tn.rval) {
                    413:                        fpload(q, cookie, "fmove");
                    414:                        expand(q, cookie, "     fsqrtx  A1,A1\n");
                    415:                } else {
                    416:                        fpload(q, cookie, "fsqrt");
                    417:                }
                    418:                return;
                    419:        }
                    420:        goto call_intrinsic;
                    421:        
                    422:     call_intrinsic:
                    423:        rightreg(q, NULL, NULL);
                    424:        printf("        jsr     %c%s%c\n",
                    425:                floatprefix(),
                    426:                fopnames[o-FABS].fvroutine,
                    427:                (q->in.type == FLOAT ? 's' : 'd'));
                    428:        return;
                    429: 
                    430:     default:
                    431: huh:
                    432:        print_str("HEY! cookie = ");
                    433:        prcook( cookie);
                    434:        putchar('\n');
                    435:        fwalk( p, eprint, 0);
                    436:        cerror("floatcode got a tree it didn't expect");
                    437:     }
                    438: 
                    439: }
                    440: 
                    441: 
                    442: 
                    443: floatconv( p, c, cookie )
                    444:     register NODE *p;
                    445:     char c;
                    446: {
                    447:     int ty = p->in.type;
                    448:     NODE *q = p->in.left;
                    449:     register t2 = q->in.type;
                    450:     int fname;
                    451: 
                    452:     switch( ty ){
                    453:     case FLOAT:
                    454:        switch (t2){
                    455:        case FLOAT:  return;
                    456:        case DOUBLE: fname = FDTOS; break;
                    457:        default:     fname = FITOS; makeint( q, cookie ); break;
                    458:        }
                    459:        break;
                    460:     case DOUBLE:
                    461:        switch (t2){
                    462:        case DOUBLE: return;
                    463:        case FLOAT:  fname = FSTOD; break;
                    464:        default:     fname = FITOD;    makeint( q, cookie ); break;
                    465:        }
                    466:        break;
                    467:     default:
                    468:        switch(t2){
                    469:        case DOUBLE: fname = FDTOI; break;
                    470:        case FLOAT:  fname = FSTOI; break;
                    471:        default: return;
                    472:        }
                    473:     }
                    474:     rightreg( q, NULL, NULL );
                    475:     floatop( fname, NIL, q, NIL, &resc[0] );
                    476: 
                    477: }
                    478: 
                    479: makeint( p, cookie )
                    480:     NODE *p;
                    481: {
                    482:     switch( p->tn.type ){
                    483:            case UCHAR:
                    484:                expand( p, cookie, "    andl    #0xff,AL\n" );
                    485:                return;
                    486:            case USHORT:
                    487:                expand( p, cookie, "    andl    #0xffff,AL\n" );
                    488:                return;
                    489:            case CHAR:
                    490:                expand( p, cookie, "    extw    AL\n" );
                    491:                /* fall through */
                    492:            case SHORT:
                    493:                expand( p, cookie, "    extl    AL\n" );
                    494:                return;
                    495:            default: 
                    496:                ;
                    497:     }
                    498: }
                    499: 
                    500: /*
                    501:  * Note: the names below are INCOMPATIBLE with pre-3.0 libraries
                    502:  */
                    503: struct finfo {
                    504:        char * fname;
                    505:        short  skycode;
                    506:        char   nlsource; /* source from left */
                    507:        char   nrsource; /* source from right    */
                    508:        char   nxsource; /* 3rd source, from wherever */
                    509:        char   ndest;    /* size of sink          */
                    510:        char   delay;    /* need busy-wait loop before collecting results? */
                    511: } finfo [] = {
                    512:        { "addd",  S_DADD3, 2, 2, 0, 2, 1}, /* fadd */
                    513:        { "adds",  S_SADD3, 1, 1, 0, 1, 0}, /* fadds */
                    514:        { "subd",  S_DSUB3, 2, 2, 0, 2, 1}, /* fsub */
                    515:        { "subs",  S_SSUB3, 1, 1, 0, 1, 0}, /* fsubs */
                    516:        { "muld",  S_DMUL3, 2, 2, 0, 2, 1}, /* fmul */
                    517:        { "muls",  S_SMUL3, 1, 1, 0, 1, 0}, /* fmuls */
                    518:        { "divd",  S_DDIV3, 2, 2, 0, 2, 1}, /* fdiv */
                    519:        { "divs",  S_SDIV3, 1, 1, 0, 1, 1}, /* fdivs */
                    520:        { "modd",  0                     }, /* fmod */
                    521:        { "mods",  0                     }, /* fmods */
                    522:        { "fltd",  S_ITOD,  1, 0, 0, 2, 0}, /* fitod */
                    523:        { "flts",  S_ITOS,  1, 0, 0, 1, 0}, /* fitos */
                    524:        { "stod",  S_STOD,1, 0, 0, 2, 0},   /* fstod */
                    525:        { "dtos",  S_DTOS,2, 0, 0, 1, 0},   /* fdtos */
                    526:        { "ints",  S_STOI,  1, 0, 0, 1, 0}, /* fstoi */
                    527:        { "intd",  S_DTOI,  2, 0, 0, 1, 0}, /* fdtoi */
                    528:        { "cmpd",  S_DCMP3, 2, 2, 0,-1, 0}, /* fcmp */
                    529:        { "cmps",  S_SCMP3, 1, 1, 0,-1, 0}, /* fcmps */
                    530:        { "",      S_DPVT3, 2, 2, 2, 2, 1}, /* fpvt */
                    531:        { "",      S_SPVT3, 1, 1, 1, 1, 1}, /* fpvts */
                    532: };
                    533: 
                    534: static void 
                    535: move_to_sky( p, n, skybreg )
                    536:     register NODE *p;
                    537:     int n;
                    538:     char *skybreg;
                    539: {
                    540:     /* special hackery for *--dp */
                    541:     if ( n==2 && p->in.op==UNARY MUL && p->in.left->in.op==ASG MINUS ){
                    542:        /* do --, rewrite as oreg */
                    543:        NODE *q; NODE *l;
                    544:        l = p->in.left; /* ASG MINUS node */
                    545:        q = l->in.left;
                    546:        expand( q, INBREG|INTBREG, "    subqw   #8,A.\n" );
                    547:        *p = *q;
                    548:        p->in.op = OREG;
                    549:        l->in.op = FREE;
                    550:        l->in.right->in.op = FREE;
                    551:        q->in.op = FREE;
                    552:     }
                    553:     expand( p, FOREFF, "       movl    A.,");
                    554:     printf( "%s@\n", skybreg );
                    555:     if (n >1) {
                    556:        expand( p, FOREFF, "    movl    U.,");
                    557:        printf( "%s@\n", skybreg );
                    558:     }
                    559: }
                    560: 
                    561: /* #define READY 1:tstw SKYBASE@(-OPERAND+STATUS) ; bges 1b
                    562: /*     STATUS  =       2
                    563: /*     OPERAND =       4
                    564: */
                    565: 
                    566: floatop( f, r, l, x, d ) register f; NODE *r, *l, *x, *d; 
                    567: {
                    568:     register j;
                    569:     register char *skybreg;
                    570:     if (usesky && (j=finfo[f].skycode)){
                    571:        if (skybase) {
                    572:            /* reg reserved by optimizer; use it */
                    573:            if (!isbreg(skybase)) {
                    574:                /* not an a-register, must move it */
                    575:                printf( "       movl    %s,a1\n" );
                    576:                skybreg = "a1";
                    577:            } else {
                    578:                /* reg ok as is */
                    579:                skybreg = rnames[skybase];
                    580:            }
                    581:        } else {
                    582:            /* must load __skybase into a1 */
                    583:            printf( "   movl    __skybase,a1\n" );
                    584:            skybreg = "a1";
                    585:        }
                    586:        printf( "       movw    #%#X,%s@(-4)\n", j, skybreg);
                    587:        if (j=finfo[f].nlsource)
                    588:            move_to_sky( l, j, skybreg );
                    589:        if (j=finfo[f].nrsource)
                    590:            move_to_sky( r, j, skybreg );
                    591:        if (j=finfo[f].nxsource)
                    592:            move_to_sky( x, j, skybreg );
                    593:        if (finfo[f].delay){
                    594:            printf( "1: tstw    %s@(-2)\n", skybreg );
                    595:            printf( "   bges    1b\n" );
                    596:        }
                    597:        j = finfo[f].ndest;
                    598:        if (j < 0){
                    599:            printf( "   movw    %s@,cc\n", skybreg );
                    600: #ifndef IEEECCODES
                    601:            printf( "   andb    #0xfd,cc\n");
                    602: #endif IEEECCODES
                    603:        } else {
                    604:            printf( "   movl    %s@,", skybreg );
                    605:            expand( d, FOREFF, "A.\n" );
                    606:            if (j >1) {
                    607:                printf( "       movl    %s@,", skybreg );
                    608:                expand( d, FOREFF, "U.\n" );
                    609:            }
                    610:        }
                    611:        skyused++;
                    612:     } else {
                    613:        printf( "       jsr     %c%s\n", floatprefix(), finfo[f].fname);
                    614:        if (d && (d->tn.op!=REG || d->tn.rval!=D0) && (j=finfo[f].ndest)>0){
                    615:            /* must rewrite destination as advertised */
                    616:            expand( d, FOREFF, "        movl    d0,A.\n" );
                    617:            if (j >1)
                    618:                expand( d, FOREFF, "    movl    d1,U.\n" );
                    619:        }
                    620:     }
                    621: }
                    622: 
                    623: 
                    624: floatnote()
                    625: {
                    626:        /* printf( "    .globl  ieeeused\n" ); *//* troublemaker */
                    627:        if (skyused)
                    628:            printf("    .globl  fsky_used\n" );
                    629:        else if (use68881)
                    630:            printf("    .globl  f68881_used\n" );
                    631:        else if (usefpa)
                    632:            printf("    .globl  ffpa_used\n" );
                    633: }

unix.superglobalmegacorp.com

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