diff options
| author | Russ Cox <rsc@golang.org> | 2015-03-16 15:54:44 -0400 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2015-03-20 04:47:08 +0000 |
| commit | 532ccae1547580e572cf5cd0f687f4508ceeddb9 (patch) | |
| tree | 0bf2149cc9ed14425e7cc6f83dd597372597aad2 /src/cmd/internal/obj | |
| parent | 631d6a33bf2889c5c648555ab993687a48f9c287 (diff) | |
| download | go-532ccae1547580e572cf5cd0f687f4508ceeddb9.tar.xz | |
cmd/internal/obj: replace Addr.U struct {...} with Val interface{}
An interface{} is more in the spirit of the original union.
By my calculations, on 64-bit systems this reduces
Addr from 120 to 80 bytes, and Prog from 592 to 424 bytes.
Change-Id: I0d7b0981513c2a3c94c9ac76bb4f8816485b5a3c
Reviewed-on: https://go-review.googlesource.com/7744
Reviewed-by: Rob Pike <r@golang.org>
Diffstat (limited to 'src/cmd/internal/obj')
| -rw-r--r-- | src/cmd/internal/obj/arm/asm5.go | 6 | ||||
| -rw-r--r-- | src/cmd/internal/obj/arm/obj5.go | 10 | ||||
| -rw-r--r-- | src/cmd/internal/obj/arm64/asm7.go | 2 | ||||
| -rw-r--r-- | src/cmd/internal/obj/arm64/obj7.go | 6 | ||||
| -rw-r--r-- | src/cmd/internal/obj/data.go | 6 | ||||
| -rw-r--r-- | src/cmd/internal/obj/link.go | 41 | ||||
| -rw-r--r-- | src/cmd/internal/obj/pass.go | 19 | ||||
| -rw-r--r-- | src/cmd/internal/obj/ppc64/obj9.go | 6 | ||||
| -rw-r--r-- | src/cmd/internal/obj/util.go | 12 | ||||
| -rw-r--r-- | src/cmd/internal/obj/x86/obj6.go | 10 |
10 files changed, 59 insertions, 59 deletions
diff --git a/src/cmd/internal/obj/arm/asm5.go b/src/cmd/internal/obj/arm/asm5.go index 96074c70f5..942fc70ff7 100644 --- a/src/cmd/internal/obj/arm/asm5.go +++ b/src/cmd/internal/obj/arm/asm5.go @@ -1116,10 +1116,10 @@ func aclass(ctxt *obj.Link, a *obj.Addr) int { return C_GOK case obj.TYPE_FCONST: - if chipzero5(ctxt, a.U.Dval) >= 0 { + if chipzero5(ctxt, a.Val.(float64)) >= 0 { return C_ZFCON } - if chipfloat5(ctxt, a.U.Dval) >= 0 { + if chipfloat5(ctxt, a.Val.(float64)) >= 0 { return C_SFCON } return C_LFCON @@ -2259,7 +2259,7 @@ func asmout(ctxt *obj.Link, p *obj.Prog, o *Optab, out []uint32) { } o1 |= ((uint32(p.Scond) & C_SCOND) ^ C_SCOND_XOR) << 28 o1 |= (uint32(p.To.Reg) & 15) << 12 - v := int32(chipfloat5(ctxt, p.From.U.Dval)) + v := int32(chipfloat5(ctxt, p.From.Val.(float64))) o1 |= (uint32(v) & 0xf) << 0 o1 |= (uint32(v) & 0xf0) << 12 diff --git a/src/cmd/internal/obj/arm/obj5.go b/src/cmd/internal/obj/arm/obj5.go index 1f59c621c5..6b6e46b6a6 100644 --- a/src/cmd/internal/obj/arm/obj5.go +++ b/src/cmd/internal/obj/arm/obj5.go @@ -107,8 +107,8 @@ func progedit(ctxt *obj.Link, p *obj.Prog) { // Rewrite float constants to values stored in memory. switch p.As { case AMOVF: - if p.From.Type == obj.TYPE_FCONST && chipfloat5(ctxt, p.From.U.Dval) < 0 && (chipzero5(ctxt, p.From.U.Dval) < 0 || p.Scond&C_SCOND != C_SCOND_NONE) { - f32 := float32(p.From.U.Dval) + if p.From.Type == obj.TYPE_FCONST && chipfloat5(ctxt, p.From.Val.(float64)) < 0 && (chipzero5(ctxt, p.From.Val.(float64)) < 0 || p.Scond&C_SCOND != C_SCOND_NONE) { + f32 := float32(p.From.Val.(float64)) i32 := math.Float32bits(f32) literal := fmt.Sprintf("$f32.%08x", i32) s := obj.Linklookup(ctxt, literal, 0) @@ -125,8 +125,8 @@ func progedit(ctxt *obj.Link, p *obj.Prog) { } case AMOVD: - if p.From.Type == obj.TYPE_FCONST && chipfloat5(ctxt, p.From.U.Dval) < 0 && (chipzero5(ctxt, p.From.U.Dval) < 0 || p.Scond&C_SCOND != C_SCOND_NONE) { - i64 := math.Float64bits(p.From.U.Dval) + if p.From.Type == obj.TYPE_FCONST && chipfloat5(ctxt, p.From.Val.(float64)) < 0 && (chipzero5(ctxt, p.From.Val.(float64)) < 0 || p.Scond&C_SCOND != C_SCOND_NONE) { + i64 := math.Float64bits(p.From.Val.(float64)) literal := fmt.Sprintf("$f64.%016x", i64) s := obj.Linklookup(ctxt, literal, 0) if s.Type == 0 { @@ -201,7 +201,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { autoffset = 0 } cursym.Locals = autoffset - cursym.Args = p.To.U.Argsize + cursym.Args = p.To.Val.(int32) if ctxt.Debugzerostack != 0 { if autoffset != 0 && p.From3.Offset&obj.NOSPLIT == 0 { diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index ba56f82df0..d8f39fe405 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -2625,7 +2625,7 @@ func asmout(ctxt *obj.Link, p *obj.Prog, o *Optab, out []uint32) { var rf int if p.From.Type == obj.TYPE_CONST { - rf = chipfloat7(ctxt, p.From.U.Dval) + rf = chipfloat7(ctxt, p.From.Val.(float64)) if rf < 0 || true { ctxt.Diag("invalid floating-point immediate\n%v", p) rf = 0 diff --git a/src/cmd/internal/obj/arm64/obj7.go b/src/cmd/internal/obj/arm64/obj7.go index 0b92cfcaf1..dfba86ccb9 100644 --- a/src/cmd/internal/obj/arm64/obj7.go +++ b/src/cmd/internal/obj/arm64/obj7.go @@ -240,7 +240,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog) { switch p.As { case AFMOVS: if p.From.Type == obj.TYPE_FCONST { - f32 := float32(p.From.U.Dval) + f32 := float32(p.From.Val.(float64)) i32 := math.Float32bits(f32) literal := fmt.Sprintf("$f32.%08x", uint32(i32)) s := obj.Linklookup(ctxt, literal, 0) @@ -253,7 +253,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog) { case AFMOVD: if p.From.Type == obj.TYPE_FCONST { - i64 := math.Float64bits(p.From.U.Dval) + i64 := math.Float64bits(p.From.Val.(float64)) literal := fmt.Sprintf("$f64.%016x", uint64(i64)) s := obj.Linklookup(ctxt, literal, 0) s.Size = 8 @@ -480,7 +480,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { textstksiz := p.To.Offset aoffset := int32(textstksiz) - cursym.Args = p.To.U.Argsize + cursym.Args = p.To.Val.(int32) cursym.Locals = int32(textstksiz) /* diff --git a/src/cmd/internal/obj/data.go b/src/cmd/internal/obj/data.go index 6321ca4f2a..ab3e2096d0 100644 --- a/src/cmd/internal/obj/data.go +++ b/src/cmd/internal/obj/data.go @@ -75,16 +75,16 @@ func savedata(ctxt *Link, s *LSym, p *Prog, pn string) { ctxt.Diag("unexpected %d-byte floating point constant", siz) case 4: - flt := math.Float32bits(float32(p.To.U.Dval)) + flt := math.Float32bits(float32(p.To.Val.(float64))) ctxt.Arch.ByteOrder.PutUint32(s.P[off:], flt) case 8: - flt := math.Float64bits(p.To.U.Dval) + flt := math.Float64bits(p.To.Val.(float64)) ctxt.Arch.ByteOrder.PutUint64(s.P[off:], flt) } case TYPE_SCONST: - copy(s.P[off:off+siz], p.To.U.Sval) + copy(s.P[off:off+siz], p.To.Val.(string)) case TYPE_CONST, TYPE_ADDR: if p.To.Sym != nil || int(p.To.Type) == TYPE_ADDR { diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index 76dd72aa61..3b286af493 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -76,13 +76,13 @@ import "encoding/binary" // Floating point constant value. // Encoding: // type = TYPE_FCONST -// u.dval = floating point value +// val = floating point value // // $<string literal, up to 8 chars> // String literal value (raw bytes used for DATA instruction). // Encoding: // type = TYPE_SCONST -// u.sval = string +// val = string // // <register name> // Any register: integer, floating point, control, segment, and so on. @@ -94,7 +94,7 @@ import "encoding/binary" // x(PC) // Encoding: // type = TYPE_BRANCH -// u.branch = Prog* reference OR ELSE offset = target pc (branch takes priority) +// val = Prog* reference OR ELSE offset = target pc (branch takes priority) // // $±x-±y // Final argument to TEXT, specifying local frame size x and argument size y. @@ -106,7 +106,7 @@ import "encoding/binary" // Encoding: // type = TYPE_TEXTSIZE // offset = x -// u.argsize = y +// val = int32(y) // // reg<<shift, reg>>shift, reg->shift, reg@>shift // Shifted register value, for ARM. @@ -150,20 +150,21 @@ type Addr struct { Index int16 Scale int16 // Sometimes holds a register. Name int8 - Offset int64 - Sym *LSym - U struct { - Sval string - Dval float64 - Branch *Prog - Argsize int32 - Bits uint64 - } - Gotype *LSym Class int8 Etype uint8 - Node interface{} + Offset int64 Width int64 + Sym *LSym + Gotype *LSym + + // argument value: + // for TYPE_SCONST, a string + // for TYPE_FCONST, a float64 + // for TYPE_BRANCH, a *Prog (optional) + // for TYPE_TEXTSIZE, an int32 (optional) + Val interface{} + + Node interface{} // for use by compiler } const ( @@ -198,13 +199,8 @@ const ( // TODO(rsc): Describe TEXT/GLOBL flag in from3, DATA width in from3. type Prog struct { Ctxt *Link - Pc int64 - Lineno int32 Link *Prog - As int16 - Scond uint8 From Addr - Reg int16 From3 Addr To Addr To2 Addr @@ -213,9 +209,14 @@ type Prog struct { Pcond *Prog Comefrom *Prog Pcrel *Prog + Pc int64 + Lineno int32 Spadj int32 + As int16 + Reg int16 Mark uint16 Optab uint16 + Scond uint8 Back uint8 Ft uint8 F3t uint8 diff --git a/src/cmd/internal/obj/pass.go b/src/cmd/internal/obj/pass.go index 50d21e9e00..50dda94c8c 100644 --- a/src/cmd/internal/obj/pass.go +++ b/src/cmd/internal/obj/pass.go @@ -90,7 +90,7 @@ func checkaddr(ctxt *Link, p *Prog, a *Addr) { return } - if a.Reg != 0 || a.Scale != 0 || a.Name != 0 || a.Sym != nil || a.U.Bits != 0 { + if a.Reg != 0 || a.Scale != 0 || a.Name != 0 || a.Sym != nil || a.Val != nil { break } return @@ -111,7 +111,7 @@ func checkaddr(ctxt *Link, p *Prog, a *Addr) { return case TYPE_ADDR: - if a.U.Bits != 0 { + if a.Val != nil { break } if a.Reg == 0 && a.Index == 0 && a.Scale == 0 && a.Name == 0 && a.Sym == nil { @@ -120,13 +120,13 @@ func checkaddr(ctxt *Link, p *Prog, a *Addr) { return case TYPE_SHIFT: - if a.Index != 0 || a.Scale != 0 || a.Name != 0 || a.Sym != nil || a.U.Bits != 0 { + if a.Index != 0 || a.Scale != 0 || a.Name != 0 || a.Sym != nil || a.Val != nil { break } return case TYPE_REGREG: - if a.Index != 0 || a.Scale != 0 || a.Name != 0 || a.Sym != nil || a.U.Bits != 0 { + if a.Index != 0 || a.Scale != 0 || a.Name != 0 || a.Sym != nil || a.Val != nil { break } return @@ -140,7 +140,7 @@ func checkaddr(ctxt *Link, p *Prog, a *Addr) { // Expect sym and name to be set, nothing else. // Technically more is allowed, but this is only used for *name(SB). case TYPE_INDIR: - if a.Reg != 0 || a.Index != 0 || a.Scale != 0 || a.Name == 0 || a.Offset != 0 || a.Sym == nil || a.U.Bits != 0 { + if a.Reg != 0 || a.Index != 0 || a.Scale != 0 || a.Name == 0 || a.Offset != 0 || a.Sym == nil || a.Val != nil { break } return @@ -167,10 +167,9 @@ func linkpatch(ctxt *Link, sym *LSym) { if p.To.Type != TYPE_BRANCH { continue } - if p.To.U.Branch != nil { - // TODO: Remove to.u.branch in favor of p->pcond. - p.Pcond = p.To.U.Branch - + if p.To.Val != nil { + // TODO: Remove To.Val.(*Prog) in favor of p->pcond. + p.Pcond = p.To.Val.(*Prog) continue } @@ -198,7 +197,7 @@ func linkpatch(ctxt *Link, sym *LSym) { p.To.Type = TYPE_NONE } - p.To.U.Branch = q + p.To.Val = q p.Pcond = q } diff --git a/src/cmd/internal/obj/ppc64/obj9.go b/src/cmd/internal/obj/ppc64/obj9.go index f47d81d77e..90fa725239 100644 --- a/src/cmd/internal/obj/ppc64/obj9.go +++ b/src/cmd/internal/obj/ppc64/obj9.go @@ -56,7 +56,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog) { switch p.As { case AFMOVS: if p.From.Type == obj.TYPE_FCONST { - f32 := float32(p.From.U.Dval) + f32 := float32(p.From.Val.(float64)) i32 := math.Float32bits(f32) literal := fmt.Sprintf("$f32.%08x", i32) s := obj.Linklookup(ctxt, literal, 0) @@ -69,7 +69,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog) { case AFMOVD: if p.From.Type == obj.TYPE_FCONST { - i64 := math.Float64bits(p.From.U.Dval) + i64 := math.Float64bits(p.From.Val.(float64)) literal := fmt.Sprintf("$f64.%016x", i64) s := obj.Linklookup(ctxt, literal, 0) s.Size = 8 @@ -130,7 +130,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { p := cursym.Text textstksiz := p.To.Offset - cursym.Args = p.To.U.Argsize + cursym.Args = p.To.Val.(int32) cursym.Locals = int32(textstksiz) /* diff --git a/src/cmd/internal/obj/util.go b/src/cmd/internal/obj/util.go index a2f3c1f8f1..b0d10b5fd5 100644 --- a/src/cmd/internal/obj/util.go +++ b/src/cmd/internal/obj/util.go @@ -389,8 +389,8 @@ func Dconv(p *Prog, a *Addr) string { str = fmt.Sprintf("%s(SB)", a.Sym.Name) } else if p != nil && p.Pcond != nil { str = fmt.Sprintf("%d", p.Pcond.Pc) - } else if a.U.Branch != nil { - str = fmt.Sprintf("%d", a.U.Branch.Pc) + } else if a.Val != nil { + str = fmt.Sprintf("%d", a.Val.(*Prog).Pc) } else { str = fmt.Sprintf("%d(PC)", a.Offset) } @@ -412,14 +412,14 @@ func Dconv(p *Prog, a *Addr) string { } case TYPE_TEXTSIZE: - if a.U.Argsize == ArgsSizeUnknown { + if a.Val.(int32) == ArgsSizeUnknown { str = fmt.Sprintf("$%d", a.Offset) } else { - str = fmt.Sprintf("$%d-%d", a.Offset, a.U.Argsize) + str = fmt.Sprintf("$%d-%d", a.Offset, a.Val.(int32)) } case TYPE_FCONST: - str = fmt.Sprintf("%.17g", a.U.Dval) + str = fmt.Sprintf("%.17g", a.Val.(float64)) // Make sure 1 prints as 1.0 if !strings.ContainsAny(str, ".e") { str += ".0" @@ -427,7 +427,7 @@ func Dconv(p *Prog, a *Addr) string { str = fmt.Sprintf("$(%s)", str) case TYPE_SCONST: - str = fmt.Sprintf("$%q", a.U.Sval) + str = fmt.Sprintf("$%q", a.Val.(string)) case TYPE_ADDR: str = fmt.Sprintf("$%s", Mconv(a)) diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go index cf226d8672..6a0baa66a3 100644 --- a/src/cmd/internal/obj/x86/obj6.go +++ b/src/cmd/internal/obj/x86/obj6.go @@ -201,7 +201,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog) { // Convert AMOVSS $(0), Xx to AXORPS Xx, Xx case AMOVSS: if p.From.Type == obj.TYPE_FCONST { - if p.From.U.Dval == 0 { + if p.From.Val.(float64) == 0 { if p.To.Type == obj.TYPE_REG && REG_X0 <= p.To.Reg && p.To.Reg <= REG_X15 { p.As = AXORPS p.From = p.To @@ -227,7 +227,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog) { ACOMISS, AUCOMISS: if p.From.Type == obj.TYPE_FCONST { - f32 := float32(p.From.U.Dval) + f32 := float32(p.From.Val.(float64)) i32 := math.Float32bits(f32) literal := fmt.Sprintf("$f32.%08x", i32) s := obj.Linklookup(ctxt, literal, 0) @@ -246,7 +246,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog) { case AMOVSD: // Convert AMOVSD $(0), Xx to AXORPS Xx, Xx if p.From.Type == obj.TYPE_FCONST { - if p.From.U.Dval == 0 { + if p.From.Val.(float64) == 0 { if p.To.Type == obj.TYPE_REG && REG_X0 <= p.To.Reg && p.To.Reg <= REG_X15 { p.As = AXORPS p.From = p.To @@ -272,7 +272,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog) { ACOMISD, AUCOMISD: if p.From.Type == obj.TYPE_FCONST { - i64 := math.Float64bits(p.From.U.Dval) + i64 := math.Float64bits(p.From.Val.(float64)) literal := fmt.Sprintf("$f64.%016x", i64) s := obj.Linklookup(ctxt, literal, 0) if s.Type == 0 { @@ -361,7 +361,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { bpsize = 0 } - textarg := int64(p.To.U.Argsize) + textarg := int64(p.To.Val.(int32)) cursym.Args = int32(textarg) cursym.Locals = int32(p.To.Offset) |
