"uint16 %d": "",
"uint16 %v": "",
"uint16 %x": "",
- "uint32 %08x": "",
"uint32 %d": "",
"uint32 %x": "",
- "uint64 %016x": "",
"uint64 %08x": "",
"uint64 %d": "",
"uint64 %x": "",
p.To.Type = obj.TYPE_REG
p.To.Reg = x
case ssa.Op386MOVSSconst1, ssa.Op386MOVSDconst1:
- var literal string
- if v.Op == ssa.Op386MOVSDconst1 {
- literal = fmt.Sprintf("$f64.%016x", uint64(v.AuxInt))
- } else {
- literal = fmt.Sprintf("$f32.%08x", math.Float32bits(float32(math.Float64frombits(uint64(v.AuxInt)))))
- }
p := s.Prog(x86.ALEAL)
p.From.Type = obj.TYPE_MEM
p.From.Name = obj.NAME_EXTERN
- p.From.Sym = gc.Ctxt.Lookup(literal, 0)
- p.From.Sym.Set(obj.AttrLocal, true)
+ f := math.Float64frombits(uint64(v.AuxInt))
+ if v.Op == ssa.Op386MOVSDconst1 {
+ p.From.Sym = gc.Ctxt.Float64Sym(f)
+ } else {
+ p.From.Sym = gc.Ctxt.Float32Sym(float32(f))
+ }
p.To.Type = obj.TYPE_REG
p.To.Reg = v.Reg()
case ssa.Op386MOVSSconst2, ssa.Op386MOVSDconst2:
import (
"cmd/internal/obj"
"cmd/internal/sys"
- "fmt"
- "math"
)
var progedit_tlsfallback *obj.LSym
case AMOVF:
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 := ctxt.Lookup(literal, 0)
p.From.Type = obj.TYPE_MEM
- p.From.Sym = s
+ p.From.Sym = ctxt.Float32Sym(f32)
p.From.Name = obj.NAME_EXTERN
p.From.Offset = 0
}
case AMOVD:
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 := ctxt.Lookup(literal, 0)
p.From.Type = obj.TYPE_MEM
- p.From.Sym = s
+ p.From.Sym = ctxt.Float64Sym(p.From.Val.(float64))
p.From.Name = obj.NAME_EXTERN
p.From.Offset = 0
}
import (
"cmd/internal/obj"
"cmd/internal/sys"
- "fmt"
"math"
)
case AFMOVS:
if p.From.Type == obj.TYPE_FCONST {
f32 := float32(p.From.Val.(float64))
- i32 := math.Float32bits(f32)
- if i32 == 0 {
+ if math.Float32bits(f32) == 0 {
p.From.Type = obj.TYPE_REG
p.From.Reg = REGZERO
break
}
- literal := fmt.Sprintf("$f32.%08x", i32)
- s := ctxt.Lookup(literal, 0)
- s.Size = 4
p.From.Type = obj.TYPE_MEM
- p.From.Sym = s
- p.From.Sym.Set(obj.AttrLocal, true)
+ p.From.Sym = ctxt.Float32Sym(f32)
p.From.Name = obj.NAME_EXTERN
p.From.Offset = 0
}
case AFMOVD:
if p.From.Type == obj.TYPE_FCONST {
- i64 := math.Float64bits(p.From.Val.(float64))
- if i64 == 0 {
+ f64 := p.From.Val.(float64)
+ if math.Float64bits(f64) == 0 {
p.From.Type = obj.TYPE_REG
p.From.Reg = REGZERO
break
}
- literal := fmt.Sprintf("$f64.%016x", i64)
- s := ctxt.Lookup(literal, 0)
- s.Size = 8
p.From.Type = obj.TYPE_MEM
- p.From.Sym = s
- p.From.Sym.Set(obj.AttrLocal, true)
+ p.From.Sym = ctxt.Float64Sym(f64)
p.From.Name = obj.NAME_EXTERN
p.From.Offset = 0
}
case AMOVF:
if p.From.Type == obj.TYPE_FCONST {
f32 := float32(p.From.Val.(float64))
- i32 := math.Float32bits(f32)
- if i32 == 0 {
+ if math.Float32bits(f32) == 0 {
p.As = AMOVW
p.From.Type = obj.TYPE_REG
p.From.Reg = REGZERO
break
}
- literal := fmt.Sprintf("$f32.%08x", i32)
- s := ctxt.Lookup(literal, 0)
- s.Size = 4
p.From.Type = obj.TYPE_MEM
- p.From.Sym = s
+ p.From.Sym = ctxt.Float32Sym(f32)
p.From.Name = obj.NAME_EXTERN
p.From.Offset = 0
}
case AMOVD:
if p.From.Type == obj.TYPE_FCONST {
- i64 := math.Float64bits(p.From.Val.(float64))
- if i64 == 0 && ctxt.Arch.Family == sys.MIPS64 {
+ f64 := p.From.Val.(float64)
+ if math.Float64bits(f64) == 0 && ctxt.Arch.Family == sys.MIPS64 {
p.As = AMOVV
p.From.Type = obj.TYPE_REG
p.From.Reg = REGZERO
break
}
- literal := fmt.Sprintf("$f64.%016x", i64)
- s := ctxt.Lookup(literal, 0)
- s.Size = 8
p.From.Type = obj.TYPE_MEM
- p.From.Sym = s
+ p.From.Sym = ctxt.Float64Sym(f64)
p.From.Name = obj.NAME_EXTERN
p.From.Offset = 0
}
// Put >32-bit constants in memory and load them
case AMOVV:
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 {
- literal := fmt.Sprintf("$i64.%016x", uint64(p.From.Offset))
- s := ctxt.Lookup(literal, 0)
- s.Size = 8
p.From.Type = obj.TYPE_MEM
- p.From.Sym = s
+ p.From.Sym = ctxt.Int64Sym(p.From.Offset)
p.From.Name = obj.NAME_EXTERN
p.From.Offset = 0
}
import (
"cmd/internal/obj"
"cmd/internal/sys"
- "fmt"
- "math"
)
func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
case AFMOVS:
if p.From.Type == obj.TYPE_FCONST {
f32 := float32(p.From.Val.(float64))
- i32 := math.Float32bits(f32)
- literal := fmt.Sprintf("$f32.%08x", i32)
- s := ctxt.Lookup(literal, 0)
- s.Size = 4
p.From.Type = obj.TYPE_MEM
- p.From.Sym = s
- p.From.Sym.Set(obj.AttrLocal, true)
+ p.From.Sym = ctxt.Float32Sym(f32)
p.From.Name = obj.NAME_EXTERN
p.From.Offset = 0
}
case AFMOVD:
if p.From.Type == obj.TYPE_FCONST {
- i64 := math.Float64bits(p.From.Val.(float64))
- literal := fmt.Sprintf("$f64.%016x", i64)
- s := ctxt.Lookup(literal, 0)
- s.Size = 8
+ f64 := p.From.Val.(float64)
p.From.Type = obj.TYPE_MEM
- p.From.Sym = s
- p.From.Sym.Set(obj.AttrLocal, true)
+ p.From.Sym = ctxt.Float64Sym(f64)
p.From.Name = obj.NAME_EXTERN
p.From.Offset = 0
}
// Put >32-bit constants in memory and load them
case AMOVD:
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 {
- literal := fmt.Sprintf("$i64.%016x", uint64(p.From.Offset))
- s := ctxt.Lookup(literal, 0)
- s.Size = 8
p.From.Type = obj.TYPE_MEM
- p.From.Sym = s
- p.From.Sym.Set(obj.AttrLocal, true)
+ p.From.Sym = ctxt.Int64Sym(p.From.Offset)
p.From.Name = obj.NAME_EXTERN
p.From.Offset = 0
}
import (
"cmd/internal/obj"
"cmd/internal/sys"
- "fmt"
"math"
)
case AFMOVS:
if p.From.Type == obj.TYPE_FCONST {
f32 := float32(p.From.Val.(float64))
- i32 := math.Float32bits(f32)
- if i32 == 0 { // +0
+ if math.Float32bits(f32) == 0 { // +0
break
}
- literal := fmt.Sprintf("$f32.%08x", i32)
- s := ctxt.Lookup(literal, 0)
- s.Size = 4
p.From.Type = obj.TYPE_MEM
- p.From.Sym = s
- p.From.Sym.Set(obj.AttrLocal, true)
+ p.From.Sym = ctxt.Float32Sym(f32)
p.From.Name = obj.NAME_EXTERN
p.From.Offset = 0
}
case AFMOVD:
if p.From.Type == obj.TYPE_FCONST {
- i64 := math.Float64bits(p.From.Val.(float64))
- if i64 == 0 { // +0
+ f64 := p.From.Val.(float64)
+ if math.Float64bits(f64) == 0 { // +0
break
}
- literal := fmt.Sprintf("$f64.%016x", i64)
- s := ctxt.Lookup(literal, 0)
- s.Size = 8
p.From.Type = obj.TYPE_MEM
- p.From.Sym = s
- p.From.Sym.Set(obj.AttrLocal, true)
+ p.From.Sym = ctxt.Float64Sym(f64)
p.From.Name = obj.NAME_EXTERN
p.From.Offset = 0
}
if int64(int32(val)) != val &&
int64(uint32(val)) != val &&
int64(uint64(val)&(0xffffffff<<32)) != val {
- literal := fmt.Sprintf("$i64.%016x", uint64(p.From.Offset))
- s := ctxt.Lookup(literal, 0)
- s.Size = 8
p.From.Type = obj.TYPE_MEM
- p.From.Sym = s
- p.From.Sym.Set(obj.AttrLocal, true)
+ p.From.Sym = ctxt.Int64Sym(p.From.Offset)
p.From.Name = obj.NAME_EXTERN
p.From.Offset = 0
}
package obj
import (
+ "fmt"
"log"
+ "math"
"os"
"path/filepath"
)
return s
}
+func (ctxt *Link) Float32Sym(f float32) *LSym {
+ i := math.Float32bits(f)
+ name := fmt.Sprintf("$f32.%08x", i)
+ s := ctxt.Lookup(name, 0)
+ s.Size = 4
+ s.Set(AttrLocal, true)
+ return s
+}
+
+func (ctxt *Link) Float64Sym(f float64) *LSym {
+ i := math.Float64bits(f)
+ name := fmt.Sprintf("$f64.%016x", i)
+ s := ctxt.Lookup(name, 0)
+ s.Size = 8
+ s.Set(AttrLocal, true)
+ return s
+}
+
+func (ctxt *Link) Int64Sym(i int64) *LSym {
+ name := fmt.Sprintf("$i64.%016x", uint64(i))
+ s := ctxt.Lookup(name, 0)
+ s.Size = 8
+ s.Set(AttrLocal, true)
+ return s
+}
+
func Linksymfmt(s *LSym) string {
if s == nil {
return "<nil>"
import (
"cmd/internal/obj"
"cmd/internal/sys"
- "fmt"
"math"
"strings"
)
AUCOMISS:
if p.From.Type == obj.TYPE_FCONST {
f32 := float32(p.From.Val.(float64))
- i32 := math.Float32bits(f32)
- literal := fmt.Sprintf("$f32.%08x", i32)
- s := ctxt.Lookup(literal, 0)
p.From.Type = obj.TYPE_MEM
p.From.Name = obj.NAME_EXTERN
- p.From.Sym = s
- p.From.Sym.Set(obj.AttrLocal, true)
+ p.From.Sym = ctxt.Float32Sym(f32)
p.From.Offset = 0
}
ACOMISD,
AUCOMISD:
if p.From.Type == obj.TYPE_FCONST {
- i64 := math.Float64bits(p.From.Val.(float64))
- literal := fmt.Sprintf("$f64.%016x", i64)
- s := ctxt.Lookup(literal, 0)
+ f64 := p.From.Val.(float64)
p.From.Type = obj.TYPE_MEM
p.From.Name = obj.NAME_EXTERN
- p.From.Sym = s
- p.From.Sym.Set(obj.AttrLocal, true)
+ p.From.Sym = ctxt.Float64Sym(f64)
p.From.Offset = 0
}
}