Annotation of researchv9/cmd/sun/c2/quicken.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)quicken.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: #include "as.h"
        !            10: #include "c2.h"
        !            11: 
        !            12: extern struct ins_bkt *moveq, *subql, *addql;
        !            13: #ifdef TRACKSP
        !            14: int spoffset = 0; /* track a6-a7 distance */
        !            15: #define SPUNK 999999; /* sp unknown here */
        !            16: #endif TRACKSP
        !            17: 
        !            18: void
        !            19: quicken()
        !            20: {
        !            21:     register NODE *n;
        !            22:     register struct oper *o;
        !            23:     register long v;
        !            24:     register struct ins_bkt *ip;
        !            25:     register int regno;
        !            26: 
        !            27:     for (n=first.forw; n!=&first; n=n->forw){
        !            28:        switch (n->op){
        !            29:        case OP_MOVE:
        !            30:            if (n->instr==moveq || (o=n->ref[0])->type_o!=T_IMMED || o->sym_o!=NULL) continue;
        !            31:            v = o->value_o;
        !            32:            o = n->ref[1];
        !            33:            if (!datareg_addr(o))continue;
        !            34:            regno = o->value_o;
        !            35:            if ( dreg(regno) && v >= -128 && v<= 127) {
        !            36:                n->instr = moveq;
        !            37:            } else if (freg( regno ) ){
        !            38:                if (use_fmovecr( n ))
        !            39:                    meter.nusecr++;
        !            40:                    break;
        !            41:            }
        !            42:            continue;
        !            43:        case OP_ADD:
        !            44:            ip = addql;
        !            45:            goto xsub;
        !            46:        case OP_SUB:
        !            47:            ip = subql;
        !            48:        xsub:
        !            49:            if ( n->subop==SUBOP_B ) ip-=2;
        !            50:            else if (n->subop==SUBOP_W) ip-=1;
        !            51:            if (n->instr==ip || (o=n->ref[0])->type_o!=T_IMMED || o->sym_o!=NULL) continue;
        !            52:            v = o->value_o;
        !            53:            if ( v>=1 && v<=8)
        !            54:                n->instr = ip;
        !            55:            else if ( v<=-1 && v>= -8){
        !            56:                o->value_o = -v;
        !            57:                if (n->op==OP_ADD){
        !            58:                    n->op=OP_SUB;
        !            59:                    ip = subql;
        !            60:                } else {
        !            61:                    n->op=OP_ADD;
        !            62:                    ip = addql;
        !            63:                }
        !            64:                goto xsub;
        !            65:            }
        !            66:            continue;
        !            67:        }
        !            68:     }
        !            69: }
        !            70: 
        !            71: #ifdef TRACKSP
        !            72: void
        !            73: track_sp( n )
        !            74:     NODE *n;
        !            75: {
        !            76:     /* try to keep track of distance from a6 to a7 */
        !            77:     /* keep global variable spoffset up-to-date    */
        !            78: 
        !            79:     register struct oper *o;
        !            80:     int i;
        !            81: 
        !            82:     switch (n->op){
        !            83:     case OP_LINK:    
        !            84:           if ((o=n->ref[1])->type_o==T_IMMED)
        !            85:                spoffset = - o->value_o;
        !            86:            else
        !            87:                spoffset = SPUNK;
        !            88:            break;
        !            89:     case OP_UNLK:    
        !            90:            spoffset = 0;  break;
        !            91:     case OP_LEA:     
        !            92:            if (istmp(o=n->ref[0]))
        !            93:                spoffset += o->value_o;
        !            94:            else 
        !            95:                spoffset = SPUNK;
        !            96:            break;
        !            97:     case OP_PEA:
        !            98:            spoffset -= 4; break;
        !            99:     case OP_ADD:
        !           100:            if ((o=n->ref[0])->type_o==T_IMMED)
        !           101:                spoffset +=  o->value_o;
        !           102:            else
        !           103:                spoffset = SPUNK;
        !           104:            break;
        !           105:     case OP_SUB:
        !           106:            if ((o=n->ref[0])->type_o==T_IMMED)
        !           107:                spoffset -=  o->value_o;
        !           108:            else
        !           109:                spoffset = SPUNK;
        !           110:            break;
        !           111:     default: 
        !           112:            for (i=0; i<n->nref; i++){
        !           113:                o = n->ref[i];
        !           114:                if (o->type_o == T_REG && o->value_o == SPREG)
        !           115:                    spoffset = SPUNK;
        !           116:                else if (o->type_o == T_POSTINC)
        !           117:                    spoffset += BYTESIZE(n->subop);
        !           118:                else if (o->type_o == T_PREDEC)
        !           119:                    spoffset -= BYTESIZE(n->subop);
        !           120:            }
        !           121:     }
        !           122: }
        !           123: #endif TRACKSP
        !           124: 
        !           125: /*
        !           126:  * list of floating-point constants in the 68881 constant ROM.
        !           127:  * Note that the ROM supports more constants, and they are
        !           128:  * actually documented; but they aren't representable in IEEE
        !           129:  * double precision.
        !           130:  */
        !           131: struct romlist { 
        !           132:     int            address;
        !           133:     double  value;
        !           134: } romlist[] = {
        !           135:     0xf, 0.0,
        !           136:     0x32, 1.0,
        !           137:     0x33, 1.0e1,
        !           138:     0x34, 1.0e2,
        !           139:     0x35, 1.0e4,
        !           140:     0x36, 1.0e8,
        !           141:     0x37, 1.0e16,
        !           142:     0x38, 1.0e32,
        !           143:     0x39, 1.0e64,
        !           144:     0x3a, 1.0e128,
        !           145:     0x3b, 1.0e256,
        !           146:     -1,   0.0
        !           147: };
        !           148: 
        !           149: /*
        !           150:  * determine if the fmove instruction n can be replaced by a fmovecr
        !           151:  * instruction. If so, then make the substitution.
        !           152:  */
        !           153: static int
        !           154: use_fmovecr( n )
        !           155:     NODE *n;
        !           156: {
        !           157:     register struct oper *o;
        !           158:     register struct romlist *rp;
        !           159:     register double v;
        !           160: 
        !           161:     o = n->ref[0];
        !           162:     if (o->flags_o&O_FLOAT) {
        !           163:        v = o->fval_o;
        !           164:     } else {
        !           165:        /* integer conversion */
        !           166:        v = (double)o->value_o;
        !           167:     }
        !           168:     rp = romlist;
        !           169:     while ( rp->address >= 0 && rp->value != v )
        !           170:        rp++;
        !           171:     if ( rp->address  < 0 ) return 0; /* sorry */
        !           172:     o->value_o = rp->address;
        !           173:     o->flags_o = 0;
        !           174:     cannibalize( n, "fmovecr" );
        !           175:     return 1;
        !           176: }

unix.superglobalmegacorp.com

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