|
|
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®bit)
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®bit)
147: r = addmask( r, MAKERMASK( regno, sl ));
148: } else {
149: for (regbit= 1 , regno=0; regno<=15; regno++, regbit<<=1)
150: if (imask®bit)
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.