Commit 798b19bf authored by Ken Thompson's avatar Ken Thompson

improvement in registerization

R=r
OCL=29317
CL=29317
parent 4238b183
...@@ -748,11 +748,40 @@ doregbits(int r) ...@@ -748,11 +748,40 @@ doregbits(int r)
return b; return b;
} }
static int
overlap(Var *v, int o2, int w2)
{
int o1, w1, t1, t2, z;
Bits bit;
o1 = v->offset;
w1 = v->width;
t1 = o1+w1;
t2 = o2+w2;
if(!(t1 > o2 && t2 > o1))
return 0;
// set to max extent
if(o2 < o1)
v->offset = o2;
if(t1 > t2)
v->width = t1-v->offset;
else
v->width = t2-v->offset;
// and dont registerize
bit = blsh(v-var);
for(z=0; z<BITS; z++)
addrs.b[z] |= bit.b[z];
return 1;
}
Bits Bits
mkvar(Reg *r, Adr *a) mkvar(Reg *r, Adr *a)
{ {
Var *v; Var *v;
int i, t, n, et, z, w; int i, t, n, et, z, w, flag;
int32 o; int32 o;
Bits bit; Bits bit;
Sym *s; Sym *s;
...@@ -793,12 +822,26 @@ mkvar(Reg *r, Adr *a) ...@@ -793,12 +822,26 @@ mkvar(Reg *r, Adr *a)
o = a->offset; o = a->offset;
w = a->width; w = a->width;
v = var; v = var;
flag = 0;
for(i=0; i<nvar; i++) { for(i=0; i<nvar; i++) {
if(s == v->sym) if(s == v->sym)
if(n == v->name) if(n == v->name) {
goto out; // if it is the same, use it
if(v->etype == et)
if(v->width == w)
if(v->offset == o)
goto out;
// if it overlaps, set max
// width and dont registerize
if(overlap(v, o, w))
flag = 1;
}
v++; v++;
} }
if(flag)
goto none;
switch(et) { switch(et) {
case 0: case 0:
...@@ -826,18 +869,9 @@ mkvar(Reg *r, Adr *a) ...@@ -826,18 +869,9 @@ mkvar(Reg *r, Adr *a)
out: out:
bit = blsh(i); bit = blsh(i);
if(n == D_EXTERN || n == D_STATIC)
for(z=0; z<BITS; z++)
externs.b[z] |= bit.b[z];
if(n == D_PARAM)
for(z=0; z<BITS; z++)
params.b[z] |= bit.b[z];
// this has horrible consequences - // funny punning
// no structure elements are registerized, if(v->etype != et) {
// but i dont know how to be more specific
if(v->etype != et || v->width != w || v->offset != o) {
/* funny punning */
if(debug['R']) if(debug['R'])
print("pun et=%d/%d w=%d/%d o=%d/%d %D\n", print("pun et=%d/%d w=%d/%d o=%d/%d %D\n",
v->etype, et, v->etype, et,
...@@ -845,8 +879,16 @@ out: ...@@ -845,8 +879,16 @@ out:
v->offset, o, a); v->offset, o, a);
for(z=0; z<BITS; z++) for(z=0; z<BITS; z++)
addrs.b[z] |= bit.b[z]; addrs.b[z] |= bit.b[z];
goto none;
} }
if(n == D_EXTERN || n == D_STATIC)
for(z=0; z<BITS; z++)
externs.b[z] |= bit.b[z];
if(n == D_PARAM)
for(z=0; z<BITS; z++)
params.b[z] |= bit.b[z];
return bit; return bit;
none: none:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment