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

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)regmask.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: regmask RegMasks[PCREG+1][LR+1] = {
        !            13:        /* d0 */        { {0}, {01}, {03}, {07} },
        !            14:        /* d1 */        { {0}, {010}, {030}, {070} },
        !            15:        /* d2 */        { {0}, {0100}, {0300}, {0700} },
        !            16:        /* d3 */        { {0}, {01000}, {03000}, {07000} },
        !            17:        /* d4 */        { {0}, {010000}, {030000}, {070000} },
        !            18:        /* d5 */        { {0}, {0100000}, {0300000}, {0700000} },
        !            19:        /* d6 */        { {0}, {01000000}, {03000000}, {07000000} },
        !            20:        /* d7 */        { {0}, {010000000}, {030000000}, {070000000} },
        !            21:        /* a0 */        { {0}, {0100000000}, {0100000000}, {0100000000} },
        !            22:        /* a1 */        { {0}, {0200000000}, {0200000000}, {0200000000} },
        !            23:        /* a2 */        { {0}, {0400000000}, {0400000000}, {0400000000} },
        !            24:        /* a3 */        { {0}, {01000000000}, {01000000000}, {01000000000} },
        !            25:        /* a4 */        { {0}, {02000000000}, {02000000000}, {02000000000} },
        !            26:        /* a5 */        { {0}, {04000000000}, {04000000000}, {04000000000} },
        !            27:        /* a6 */        { {0}, {010000000000}, {010000000000}, {010000000000} },
        !            28:        /* a7 */        { {0}, {020000000000}, {020000000000}, {020000000000} },
        !            29:        /* f0 */        { {0}, {0,1}, {0,1}, {0,1} },
        !            30:        /* f1 */        { {0}, {0,2}, {0,2}, {0,2} },
        !            31:        /* f2 */        { {0}, {0,4}, {0,4}, {0,4} },
        !            32:        /* f3 */        { {0}, {0,010}, {0,010}, {0,010} },
        !            33:        /* f4 */        { {0}, {0,020}, {0,020}, {0,020} },
        !            34:        /* f5 */        { {0}, {0,040}, {0,040}, {0,040} },
        !            35:        /* f6 */        { {0}, {0,0100}, {0,0100}, {0,0100} },
        !            36:        /* f7 */        { {0}, {0,0200}, {0,0200}, {0,0200} },
        !            37:        /* cc */        { {0}, {0,0400}, {0,0400}, {0,0400} },
        !            38:        /* fcc*/        { {0}, {0,01000}, {0,01000}, {0,01000} },
        !            39:        /* pc */        { {0}, {0}, {0}, {0} },
        !            40: };
        !            41: 
        !            42: regmask exitmask; 
        !            43: regmask regmask0 = {0,0};
        !            44: regmask regmask_all = { -1, 0x3ff };
        !            45: regmask regmask_nontemp = {0xfcffffc0, 0x0fc }; /* all registers except d0/d1, a0,a1, f0,f1 */
        !            46: 
        !            47: int
        !            48: inmask( a, b )
        !            49:     int a;
        !            50:     regmask b;
        !            51: {
        !            52:     if (a < A0REG)
        !            53:        return( (RegMasks[a][LR].da & b.da)>>(3*a));
        !            54:     else if (a< FP0REG)
        !            55:        return( (RegMasks[a][LR].da & b.da)>>(a+24-A0REG));
        !            56:     else
        !            57:        return( (RegMasks[a][LR].f & b.f) >> (a-FP0REG));
        !            58: }
        !            59: 
        !            60: regmask
        !            61: addmask( a, b )
        !            62:     regmask a, b;
        !            63: {
        !            64:     a.da |= b.da;
        !            65:     a.f  |= b.f;
        !            66:     return a;
        !            67: }
        !            68: 
        !            69: regmask
        !            70: submask( a, b )
        !            71:     regmask a, b;
        !            72: {
        !            73:     a.da &= ~b.da;
        !            74:     a.f  &= ~b.f & 01777;
        !            75:     return a;
        !            76: }
        !            77: 
        !            78: regmask
        !            79: andmask( a, b )
        !            80:     regmask a, b;
        !            81: {
        !            82:     a.da &= b.da;
        !            83:     a.f  &= b.f;
        !            84:     return a;
        !            85: }
        !            86: 
        !            87: regmask 
        !            88: notmask( a )
        !            89:     regmask a;
        !            90: {
        !            91:     a.da = ~a.da;
        !            92:     a.f  = ~a.f & 01777;
        !            93:     return a;
        !            94: }
        !            95: 
        !            96: int
        !            97: emptymask( a )
        !            98:     regmask a;
        !            99: {
        !           100:     return a.da == 0 && a.f == 0;
        !           101: }
        !           102: 
        !           103: int
        !           104: samemask( a, b)
        !           105:     regmask a, b;
        !           106: {
        !           107:     return ((a.da==b.da) && (a.f==b.f));
        !           108: }
        !           109: 
        !           110: regmask
        !           111: movemmask( so, rw, operands )
        !           112:     subop_t so;
        !           113:     struct oper *operands[];
        !           114: {
        !           115:     register short imask, regbit, regno;
        !           116:     regmask r;
        !           117:     int sl;
        !           118:     operand_t t;
        !           119:     r = regmask0;
        !           120:     switch (so){
        !           121:     case SUBOP_W: sl = WR+LW; break; /* movemw */
        !           122:     case SUBOP_X:
        !           123:     case SUBOP_L: sl = LR+LW; break; /* moveml */
        !           124:     }
        !           125:     sl &= rw;
        !           126:     if (rw==RMASK){
        !           127:        /* which registers are read by this operation? */
        !           128:        if (operands[0]->type_o != T_IMMED) return regmask0; /* this instruction writes */
        !           129:        if (operands[0]->sym_o) return regmask0 ; /* lord knows */
        !           130:        imask = operands[0]->value_o;
        !           131:        t = operands[1]->type_o;
        !           132:     } else {
        !           133:        /* which registers are written by this operation */
        !           134:        sl >>= RWWIDTH;
        !           135:        if (operands[1]->type_o != T_IMMED) return regmask0; /* this instructino reads */
        !           136:        if (operands[1]->sym_o) return regmask0 ; /* lord knows */
        !           137:        imask = operands[1]->value_o;
        !           138:        t = operands[0]->type_o;
        !           139:     }
        !           140:     if (so == SUBOP_X){
        !           141:        for (regbit=(1<<7), regno=FP0REG; regno<=FP0REG+7; regno++, regbit>>=1)
        !           142:            if (imask&regbit)
        !           143:                r = addmask( r, MAKERMASK( regno, sl ));
        !           144:     } else if (t == T_PREDEC){
        !           145:        for (regbit=(1<<15), regno=0; regno<=15; regno++, regbit>>=1)
        !           146:            if (imask&regbit)
        !           147:                r = addmask( r, MAKERMASK( regno, sl ));
        !           148:     } else {
        !           149:        for (regbit= 1     , regno=0; regno<=15; regno++, regbit<<=1)
        !           150:            if (imask&regbit)
        !           151:                r = addmask( r, MAKERMASK( regno, sl ));
        !           152:     }
        !           153:     return r;
        !           154: }
        !           155: 
        !           156: void
        !           157: printmask( mask )
        !           158:     regmask mask;
        !           159: {
        !           160:     register m;
        !           161:     register regno;
        !           162:     m = mask.da;
        !           163:     /* D registers first */
        !           164:     for (regno=0; regno<=7; regno ++){
        !           165:        if      (m&4) printf(" L%d", regno);
        !           166:        else if (m&2) printf(" W%d", regno);
        !           167:        else if (m&1) printf(" B%d", regno);
        !           168:        m >>= 3;
        !           169:     }
        !           170:     /* now A registers */
        !           171:     for (regno=8; regno <= 15; regno++){
        !           172:        if (m&1) printf(" A%d", regno-8);
        !           173:        m >>= 1;
        !           174:     }
        !           175:     /* finally F registers and ccs */
        !           176:     m = mask.f;
        !           177:     for (regno=0; regno <=7; regno++){
        !           178:        if (m&1) printf(" F%d", regno);
        !           179:        m >>= 1;
        !           180:     }
        !           181:     if (m&1) printf(" CC");
        !           182:     if (m&2) printf(" FCC");
        !           183: }

unix.superglobalmegacorp.com

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