From: Ken Thompson Date: Sat, 23 May 2009 23:36:43 +0000 (-0700) Subject: improvement in registerization X-Git-Tag: weekly.2009-11-06~1552 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=798b19bf774bdba24537375fc5c809778f0d445b;p=gostls13.git improvement in registerization R=r OCL=29317 CL=29317 --- diff --git a/src/cmd/6g/reg.c b/src/cmd/6g/reg.c index 865d3a60fd..daad3f1250 100644 --- a/src/cmd/6g/reg.c +++ b/src/cmd/6g/reg.c @@ -748,11 +748,40 @@ doregbits(int r) 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; zoffset; w = a->width; v = var; + + flag = 0; for(i=0; isym) - if(n == v->name) - goto out; + if(n == v->name) { + // 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++; } + if(flag) + goto none; switch(et) { case 0: @@ -826,18 +869,9 @@ mkvar(Reg *r, Adr *a) out: bit = blsh(i); - if(n == D_EXTERN || n == D_STATIC) - for(z=0; zetype != et || v->width != w || v->offset != o) { - /* funny punning */ + // funny punning + if(v->etype != et) { if(debug['R']) print("pun et=%d/%d w=%d/%d o=%d/%d %D\n", v->etype, et, @@ -845,8 +879,16 @@ out: v->offset, o, a); for(z=0; z