]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/x86: simplify 387 with FLDZ and FLZ1
authorBen Shi <powerman1st@163.com>
Tue, 19 Jun 2018 03:44:28 +0000 (03:44 +0000)
committerBen Shi <powerman1st@163.com>
Mon, 20 Aug 2018 14:05:37 +0000 (14:05 +0000)
FLD1 pushes +1.0 to the 387 register stack, and FLDZ pushes +0.0
to the 387 regiser stack.

They can be used to simplify MOVSSconst/MOVSDconst when the
constant is +0.0, -0.0, +1.0, -1.0.

The size of the go executable reduces about 62KB and the total size
of pkg/linux_386 reduces about 7KB with this optimization.

Change-Id: Icc8213b58262e0024a277cf1103812a17dd4b05e
Reviewed-on: https://go-review.googlesource.com/119635
Run-TryBot: Ben Shi <powerman1st@163.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/x86/387.go

index 7a3622405ce8dcd7ea223728f83c26f315a91441..ab3d30e76c1a9e46f3703111579ca88baa106f8e 100644 (file)
@@ -22,11 +22,24 @@ func ssaGenValue387(s *gc.SSAGenState, v *ssa.Value) {
 
        switch v.Op {
        case ssa.Op386MOVSSconst, ssa.Op386MOVSDconst:
-               p := s.Prog(loadPush(v.Type))
-               p.From.Type = obj.TYPE_FCONST
-               p.From.Val = math.Float64frombits(uint64(v.AuxInt))
-               p.To.Type = obj.TYPE_REG
-               p.To.Reg = x86.REG_F0
+               iv := uint64(v.AuxInt)
+               if iv == 0x0000000000000000 { // +0.0
+                       s.Prog(x86.AFLDZ)
+               } else if iv == 0x3ff0000000000000 { // +1.0
+                       s.Prog(x86.AFLD1)
+               } else if iv == 0x8000000000000000 { // -0.0
+                       s.Prog(x86.AFLDZ)
+                       s.Prog(x86.AFCHS)
+               } else if iv == 0xbff0000000000000 { // -1.0
+                       s.Prog(x86.AFLD1)
+                       s.Prog(x86.AFCHS)
+               } else { // others
+                       p := s.Prog(loadPush(v.Type))
+                       p.From.Type = obj.TYPE_FCONST
+                       p.From.Val = math.Float64frombits(iv)
+                       p.To.Type = obj.TYPE_REG
+                       p.To.Reg = x86.REG_F0
+               }
                popAndSave(s, v)
 
        case ssa.Op386MOVSSconst2, ssa.Op386MOVSDconst2: