diff options
author | Austin Clements <austin@google.com> | 2014-11-04 16:34:56 -0500 |
---|---|---|
committer | Austin Clements <austin@google.com> | 2014-11-04 16:34:56 -0500 |
commit | 5996f13128bd9aa828ea2677819f055845553c74 (patch) | |
tree | 933b06f915aee3d730d77961d265f68d85c6cad9 /src/cmd/gc | |
parent | f90cfa5dbb1fbbc382661aaef561129e65808a56 (diff) | |
download | go-5996f13128bd9aa828ea2677819f055845553c74.tar.gz |
[dev.power64] gc: convert Bits to a uint64 array
So far all of our architectures have had at most 32 registers,
so we've been able to use entry 0 in the Bits uint32 array
directly as a register mask. Power64 has 64 registers, so
this converts Bits to a uint64 array so we can continue to use
entry 0 directly as a register mask on Power64.
LGTM=rsc
R=rsc
CC=golang-codereviews
https://codereview.appspot.com/169060043
Diffstat (limited to 'src/cmd/gc')
-rw-r--r-- | src/cmd/gc/bits.c | 34 | ||||
-rw-r--r-- | src/cmd/gc/go.h | 12 |
2 files changed, 28 insertions, 18 deletions
diff --git a/src/cmd/gc/bits.c b/src/cmd/gc/bits.c index 2e79f6f1d..fe9a168dc 100644 --- a/src/cmd/gc/bits.c +++ b/src/cmd/gc/bits.c @@ -95,11 +95,11 @@ int bnum(Bits a) { int i; - int32 b; + uint64 b; for(i=0; i<BITS; i++) if(b = a.b[i]) - return 32*i + bitno(b); + return 64*i + bitno(b); fatal("bad in bnum"); return 0; } @@ -110,27 +110,35 @@ blsh(uint n) Bits c; c = zbits; - c.b[n/32] = 1L << (n%32); + c.b[n/64] = 1LL << (n%64); return c; } -/* int -bset(Bits a, uint n) +btest(Bits *a, uint n) { - if(a.b[n/32] & (1L << (n%32))) - return 1; - return 0; + return (a->b[n/64] & (1LL << (n%64))) != 0; +} + +void +biset(Bits *a, uint n) +{ + a->b[n/64] |= 1LL << (n%64); +} + +void +biclr(Bits *a, uint n) +{ + a->b[n/64] &= ~(1LL << (n%64)); } -*/ int -bitno(int32 b) +bitno(uint64 b) { int i; - for(i=0; i<32; i++) - if(b & (1L<<i)) + for(i=0; i<64; i++) + if(b & (1LL<<i)) return i; fatal("bad in bitno"); return 0; @@ -157,7 +165,7 @@ Qconv(Fmt *fp) if(var[i].offset != 0) fmtprint(fp, "%+lld", (vlong)var[i].offset); } - bits.b[i/32] &= ~(1L << (i%32)); + biclr(&bits, i); } return 0; } diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h index 965a0550d..d3c4193b5 100644 --- a/src/cmd/gc/go.h +++ b/src/cmd/gc/go.h @@ -704,13 +704,13 @@ enum Ecomplit = 1<<11, // type in composite literal }; -#define BITS 5 -#define NVAR (BITS*sizeof(uint32)*8) +#define BITS 3 +#define NVAR (BITS*sizeof(uint64)*8) typedef struct Bits Bits; struct Bits { - uint32 b[BITS]; + uint64 b[BITS]; }; EXTERN Bits zbits; @@ -1027,12 +1027,14 @@ int Qconv(Fmt *fp); Bits band(Bits a, Bits b); int bany(Bits *a); int beq(Bits a, Bits b); -int bitno(int32 b); +int bitno(uint64 b); Bits blsh(uint n); Bits bnot(Bits a); int bnum(Bits a); Bits bor(Bits a, Bits b); -int bset(Bits a, uint n); +int btest(Bits *a, uint n); +void biset(Bits *a, uint n); +void biclr(Bits *a, uint n); /* * bv.c |