Skip to content

Commit 9968348

Browse files
committed
cmd/internal/obj: unify creation of numeric literal syms
This is a straightforward refactoring, to reduce the scope of upcoming changes. The symbol size and AttrLocal=true was not set universally, but it appears not to matter, since toolstash -cmp is happy. Passes toolstash-check -all. Change-Id: I7f8392f939592d3a1bc6f61dec992f5661f42fca Reviewed-on: https://go-review.googlesource.com/39791 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
1 parent c311488 commit 9968348

File tree

9 files changed

+60
-101
lines changed

9 files changed

+60
-101
lines changed

src/cmd/compile/fmt_test.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -703,10 +703,8 @@ var knownFormats = map[string]string{
703703
"uint16 %d": "",
704704
"uint16 %v": "",
705705
"uint16 %x": "",
706-
"uint32 %08x": "",
707706
"uint32 %d": "",
708707
"uint32 %x": "",
709-
"uint64 %016x": "",
710708
"uint64 %08x": "",
711709
"uint64 %d": "",
712710
"uint64 %x": "",

src/cmd/compile/internal/x86/ssa.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -443,17 +443,15 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
443443
p.To.Type = obj.TYPE_REG
444444
p.To.Reg = x
445445
case ssa.Op386MOVSSconst1, ssa.Op386MOVSDconst1:
446-
var literal string
447-
if v.Op == ssa.Op386MOVSDconst1 {
448-
literal = fmt.Sprintf("$f64.%016x", uint64(v.AuxInt))
449-
} else {
450-
literal = fmt.Sprintf("$f32.%08x", math.Float32bits(float32(math.Float64frombits(uint64(v.AuxInt)))))
451-
}
452446
p := s.Prog(x86.ALEAL)
453447
p.From.Type = obj.TYPE_MEM
454448
p.From.Name = obj.NAME_EXTERN
455-
p.From.Sym = gc.Ctxt.Lookup(literal, 0)
456-
p.From.Sym.Set(obj.AttrLocal, true)
449+
f := math.Float64frombits(uint64(v.AuxInt))
450+
if v.Op == ssa.Op386MOVSDconst1 {
451+
p.From.Sym = gc.Ctxt.Float64Sym(f)
452+
} else {
453+
p.From.Sym = gc.Ctxt.Float32Sym(float32(f))
454+
}
457455
p.To.Type = obj.TYPE_REG
458456
p.To.Reg = v.Reg()
459457
case ssa.Op386MOVSSconst2, ssa.Op386MOVSDconst2:

src/cmd/internal/obj/arm/obj5.go

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ package arm
3333
import (
3434
"cmd/internal/obj"
3535
"cmd/internal/sys"
36-
"fmt"
37-
"math"
3836
)
3937

4038
var progedit_tlsfallback *obj.LSym
@@ -108,22 +106,16 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
108106
case AMOVF:
109107
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) {
110108
f32 := float32(p.From.Val.(float64))
111-
i32 := math.Float32bits(f32)
112-
literal := fmt.Sprintf("$f32.%08x", i32)
113-
s := ctxt.Lookup(literal, 0)
114109
p.From.Type = obj.TYPE_MEM
115-
p.From.Sym = s
110+
p.From.Sym = ctxt.Float32Sym(f32)
116111
p.From.Name = obj.NAME_EXTERN
117112
p.From.Offset = 0
118113
}
119114

120115
case AMOVD:
121116
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) {
122-
i64 := math.Float64bits(p.From.Val.(float64))
123-
literal := fmt.Sprintf("$f64.%016x", i64)
124-
s := ctxt.Lookup(literal, 0)
125117
p.From.Type = obj.TYPE_MEM
126-
p.From.Sym = s
118+
p.From.Sym = ctxt.Float64Sym(p.From.Val.(float64))
127119
p.From.Name = obj.NAME_EXTERN
128120
p.From.Offset = 0
129121
}

src/cmd/internal/obj/arm64/obj7.go

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ package arm64
3333
import (
3434
"cmd/internal/obj"
3535
"cmd/internal/sys"
36-
"fmt"
3736
"math"
3837
)
3938

@@ -259,36 +258,27 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
259258
case AFMOVS:
260259
if p.From.Type == obj.TYPE_FCONST {
261260
f32 := float32(p.From.Val.(float64))
262-
i32 := math.Float32bits(f32)
263-
if i32 == 0 {
261+
if math.Float32bits(f32) == 0 {
264262
p.From.Type = obj.TYPE_REG
265263
p.From.Reg = REGZERO
266264
break
267265
}
268-
literal := fmt.Sprintf("$f32.%08x", i32)
269-
s := ctxt.Lookup(literal, 0)
270-
s.Size = 4
271266
p.From.Type = obj.TYPE_MEM
272-
p.From.Sym = s
273-
p.From.Sym.Set(obj.AttrLocal, true)
267+
p.From.Sym = ctxt.Float32Sym(f32)
274268
p.From.Name = obj.NAME_EXTERN
275269
p.From.Offset = 0
276270
}
277271

278272
case AFMOVD:
279273
if p.From.Type == obj.TYPE_FCONST {
280-
i64 := math.Float64bits(p.From.Val.(float64))
281-
if i64 == 0 {
274+
f64 := p.From.Val.(float64)
275+
if math.Float64bits(f64) == 0 {
282276
p.From.Type = obj.TYPE_REG
283277
p.From.Reg = REGZERO
284278
break
285279
}
286-
literal := fmt.Sprintf("$f64.%016x", i64)
287-
s := ctxt.Lookup(literal, 0)
288-
s.Size = 8
289280
p.From.Type = obj.TYPE_MEM
290-
p.From.Sym = s
291-
p.From.Sym.Set(obj.AttrLocal, true)
281+
p.From.Sym = ctxt.Float64Sym(f64)
292282
p.From.Name = obj.NAME_EXTERN
293283
p.From.Offset = 0
294284
}

src/cmd/internal/obj/mips/obj0.go

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -58,48 +58,38 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
5858
case AMOVF:
5959
if p.From.Type == obj.TYPE_FCONST {
6060
f32 := float32(p.From.Val.(float64))
61-
i32 := math.Float32bits(f32)
62-
if i32 == 0 {
61+
if math.Float32bits(f32) == 0 {
6362
p.As = AMOVW
6463
p.From.Type = obj.TYPE_REG
6564
p.From.Reg = REGZERO
6665
break
6766
}
68-
literal := fmt.Sprintf("$f32.%08x", i32)
69-
s := ctxt.Lookup(literal, 0)
70-
s.Size = 4
7167
p.From.Type = obj.TYPE_MEM
72-
p.From.Sym = s
68+
p.From.Sym = ctxt.Float32Sym(f32)
7369
p.From.Name = obj.NAME_EXTERN
7470
p.From.Offset = 0
7571
}
7672

7773
case AMOVD:
7874
if p.From.Type == obj.TYPE_FCONST {
79-
i64 := math.Float64bits(p.From.Val.(float64))
80-
if i64 == 0 && ctxt.Arch.Family == sys.MIPS64 {
75+
f64 := p.From.Val.(float64)
76+
if math.Float64bits(f64) == 0 && ctxt.Arch.Family == sys.MIPS64 {
8177
p.As = AMOVV
8278
p.From.Type = obj.TYPE_REG
8379
p.From.Reg = REGZERO
8480
break
8581
}
86-
literal := fmt.Sprintf("$f64.%016x", i64)
87-
s := ctxt.Lookup(literal, 0)
88-
s.Size = 8
8982
p.From.Type = obj.TYPE_MEM
90-
p.From.Sym = s
83+
p.From.Sym = ctxt.Float64Sym(f64)
9184
p.From.Name = obj.NAME_EXTERN
9285
p.From.Offset = 0
9386
}
9487

9588
// Put >32-bit constants in memory and load them
9689
case AMOVV:
9790
if p.From.Type == obj.TYPE_CONST && p.From.Name == obj.NAME_NONE && p.From.Reg == 0 && int64(int32(p.From.Offset)) != p.From.Offset {
98-
literal := fmt.Sprintf("$i64.%016x", uint64(p.From.Offset))
99-
s := ctxt.Lookup(literal, 0)
100-
s.Size = 8
10191
p.From.Type = obj.TYPE_MEM
102-
p.From.Sym = s
92+
p.From.Sym = ctxt.Int64Sym(p.From.Offset)
10393
p.From.Name = obj.NAME_EXTERN
10494
p.From.Offset = 0
10595
}

src/cmd/internal/obj/ppc64/obj9.go

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ package ppc64
3232
import (
3333
"cmd/internal/obj"
3434
"cmd/internal/sys"
35-
"fmt"
36-
"math"
3735
)
3836

3937
func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
@@ -57,39 +55,26 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
5755
case AFMOVS:
5856
if p.From.Type == obj.TYPE_FCONST {
5957
f32 := float32(p.From.Val.(float64))
60-
i32 := math.Float32bits(f32)
61-
literal := fmt.Sprintf("$f32.%08x", i32)
62-
s := ctxt.Lookup(literal, 0)
63-
s.Size = 4
6458
p.From.Type = obj.TYPE_MEM
65-
p.From.Sym = s
66-
p.From.Sym.Set(obj.AttrLocal, true)
59+
p.From.Sym = ctxt.Float32Sym(f32)
6760
p.From.Name = obj.NAME_EXTERN
6861
p.From.Offset = 0
6962
}
7063

7164
case AFMOVD:
7265
if p.From.Type == obj.TYPE_FCONST {
73-
i64 := math.Float64bits(p.From.Val.(float64))
74-
literal := fmt.Sprintf("$f64.%016x", i64)
75-
s := ctxt.Lookup(literal, 0)
76-
s.Size = 8
66+
f64 := p.From.Val.(float64)
7767
p.From.Type = obj.TYPE_MEM
78-
p.From.Sym = s
79-
p.From.Sym.Set(obj.AttrLocal, true)
68+
p.From.Sym = ctxt.Float64Sym(f64)
8069
p.From.Name = obj.NAME_EXTERN
8170
p.From.Offset = 0
8271
}
8372

8473
// Put >32-bit constants in memory and load them
8574
case AMOVD:
8675
if p.From.Type == obj.TYPE_CONST && p.From.Name == obj.NAME_NONE && p.From.Reg == 0 && int64(int32(p.From.Offset)) != p.From.Offset {
87-
literal := fmt.Sprintf("$i64.%016x", uint64(p.From.Offset))
88-
s := ctxt.Lookup(literal, 0)
89-
s.Size = 8
9076
p.From.Type = obj.TYPE_MEM
91-
p.From.Sym = s
92-
p.From.Sym.Set(obj.AttrLocal, true)
77+
p.From.Sym = ctxt.Int64Sym(p.From.Offset)
9378
p.From.Name = obj.NAME_EXTERN
9479
p.From.Offset = 0
9580
}

src/cmd/internal/obj/s390x/objz.go

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ package s390x
3232
import (
3333
"cmd/internal/obj"
3434
"cmd/internal/sys"
35-
"fmt"
3635
"math"
3736
)
3837

@@ -57,32 +56,23 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
5756
case AFMOVS:
5857
if p.From.Type == obj.TYPE_FCONST {
5958
f32 := float32(p.From.Val.(float64))
60-
i32 := math.Float32bits(f32)
61-
if i32 == 0 { // +0
59+
if math.Float32bits(f32) == 0 { // +0
6260
break
6361
}
64-
literal := fmt.Sprintf("$f32.%08x", i32)
65-
s := ctxt.Lookup(literal, 0)
66-
s.Size = 4
6762
p.From.Type = obj.TYPE_MEM
68-
p.From.Sym = s
69-
p.From.Sym.Set(obj.AttrLocal, true)
63+
p.From.Sym = ctxt.Float32Sym(f32)
7064
p.From.Name = obj.NAME_EXTERN
7165
p.From.Offset = 0
7266
}
7367

7468
case AFMOVD:
7569
if p.From.Type == obj.TYPE_FCONST {
76-
i64 := math.Float64bits(p.From.Val.(float64))
77-
if i64 == 0 { // +0
70+
f64 := p.From.Val.(float64)
71+
if math.Float64bits(f64) == 0 { // +0
7872
break
7973
}
80-
literal := fmt.Sprintf("$f64.%016x", i64)
81-
s := ctxt.Lookup(literal, 0)
82-
s.Size = 8
8374
p.From.Type = obj.TYPE_MEM
84-
p.From.Sym = s
85-
p.From.Sym.Set(obj.AttrLocal, true)
75+
p.From.Sym = ctxt.Float64Sym(f64)
8676
p.From.Name = obj.NAME_EXTERN
8777
p.From.Offset = 0
8878
}
@@ -94,12 +84,8 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
9484
if int64(int32(val)) != val &&
9585
int64(uint32(val)) != val &&
9686
int64(uint64(val)&(0xffffffff<<32)) != val {
97-
literal := fmt.Sprintf("$i64.%016x", uint64(p.From.Offset))
98-
s := ctxt.Lookup(literal, 0)
99-
s.Size = 8
10087
p.From.Type = obj.TYPE_MEM
101-
p.From.Sym = s
102-
p.From.Sym.Set(obj.AttrLocal, true)
88+
p.From.Sym = ctxt.Int64Sym(p.From.Offset)
10389
p.From.Name = obj.NAME_EXTERN
10490
p.From.Offset = 0
10591
}

src/cmd/internal/obj/sym.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
package obj
3333

3434
import (
35+
"fmt"
3536
"log"
37+
"math"
3638
"os"
3739
"path/filepath"
3840
)
@@ -82,6 +84,32 @@ func (ctxt *Link) Lookup(name string, v int) *LSym {
8284
return s
8385
}
8486

87+
func (ctxt *Link) Float32Sym(f float32) *LSym {
88+
i := math.Float32bits(f)
89+
name := fmt.Sprintf("$f32.%08x", i)
90+
s := ctxt.Lookup(name, 0)
91+
s.Size = 4
92+
s.Set(AttrLocal, true)
93+
return s
94+
}
95+
96+
func (ctxt *Link) Float64Sym(f float64) *LSym {
97+
i := math.Float64bits(f)
98+
name := fmt.Sprintf("$f64.%016x", i)
99+
s := ctxt.Lookup(name, 0)
100+
s.Size = 8
101+
s.Set(AttrLocal, true)
102+
return s
103+
}
104+
105+
func (ctxt *Link) Int64Sym(i int64) *LSym {
106+
name := fmt.Sprintf("$i64.%016x", uint64(i))
107+
s := ctxt.Lookup(name, 0)
108+
s.Size = 8
109+
s.Set(AttrLocal, true)
110+
return s
111+
}
112+
85113
func Linksymfmt(s *LSym) string {
86114
if s == nil {
87115
return "<nil>"

src/cmd/internal/obj/x86/obj6.go

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ package x86
3333
import (
3434
"cmd/internal/obj"
3535
"cmd/internal/sys"
36-
"fmt"
3736
"math"
3837
"strings"
3938
)
@@ -241,13 +240,9 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
241240
AUCOMISS:
242241
if p.From.Type == obj.TYPE_FCONST {
243242
f32 := float32(p.From.Val.(float64))
244-
i32 := math.Float32bits(f32)
245-
literal := fmt.Sprintf("$f32.%08x", i32)
246-
s := ctxt.Lookup(literal, 0)
247243
p.From.Type = obj.TYPE_MEM
248244
p.From.Name = obj.NAME_EXTERN
249-
p.From.Sym = s
250-
p.From.Sym.Set(obj.AttrLocal, true)
245+
p.From.Sym = ctxt.Float32Sym(f32)
251246
p.From.Offset = 0
252247
}
253248

@@ -281,13 +276,10 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
281276
ACOMISD,
282277
AUCOMISD:
283278
if p.From.Type == obj.TYPE_FCONST {
284-
i64 := math.Float64bits(p.From.Val.(float64))
285-
literal := fmt.Sprintf("$f64.%016x", i64)
286-
s := ctxt.Lookup(literal, 0)
279+
f64 := p.From.Val.(float64)
287280
p.From.Type = obj.TYPE_MEM
288281
p.From.Name = obj.NAME_EXTERN
289-
p.From.Sym = s
290-
p.From.Sym.Set(obj.AttrLocal, true)
282+
p.From.Sym = ctxt.Float64Sym(f64)
291283
p.From.Offset = 0
292284
}
293285
}

0 commit comments

Comments
 (0)