]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/arm64: materialize float constant 0 from zero register
authorCherry Zhang <cherryyz@google.com>
Wed, 26 Oct 2016 22:10:40 +0000 (18:10 -0400)
committerCherry Zhang <cherryyz@google.com>
Fri, 28 Oct 2016 20:18:29 +0000 (20:18 +0000)
Materialize float constant 0 from integer zero register, instead
of loading from constant pool.

Also fix assembling FMOV from zero register to FP register.

Change-Id: Ie413dd342cedebdb95ba8cfc220e23ed2a39e885
Reviewed-on: https://go-review.googlesource.com/32250
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
src/cmd/internal/obj/arm64/asm7.go
src/cmd/internal/obj/arm64/obj7.go

index 523055b6f3a48dfea2a766938b2bf8a3e5fe2459..b282c1e0af68b0e1ef7d7e8ceda9abb55b733e67 100644 (file)
@@ -2380,13 +2380,15 @@ func asmout(ctxt *obj.Link, p *obj.Prog, o *Optab, out []uint32) {
                o2 |= uint32(p.To.Reg & 31)
 
        case 29: /* op Rn, Rd */
-               if (p.As == AFMOVD || p.As == AFMOVS) && (aclass(ctxt, &p.From) == C_REG || aclass(ctxt, &p.To) == C_REG) {
+               fc := aclass(ctxt, &p.From)
+               tc := aclass(ctxt, &p.To)
+               if (p.As == AFMOVD || p.As == AFMOVS) && (fc == C_REG || fc == C_ZCON || tc == C_REG || tc == C_ZCON) {
                        // FMOV Rx, Fy or FMOV Fy, Rx
                        o1 = FPCVTI(0, 0, 0, 0, 6)
                        if p.As == AFMOVD {
                                o1 |= 1<<31 | 1<<22 // 64-bit
                        }
-                       if aclass(ctxt, &p.From) == C_REG {
+                       if fc == C_REG || fc == C_ZCON {
                                o1 |= 1 << 16 // FMOV Rx, Fy
                        }
                } else {
index cbe246e882fdf8e39b9c8ceee82c0d4c5e742d1a..3ea78cd5563a195ac0de4d695939c8794f4eea17 100644 (file)
@@ -262,6 +262,11 @@ func progedit(ctxt *obj.Link, p *obj.Prog) {
                if p.From.Type == obj.TYPE_FCONST {
                        f32 := float32(p.From.Val.(float64))
                        i32 := math.Float32bits(f32)
+                       if i32 == 0 {
+                               p.From.Type = obj.TYPE_REG
+                               p.From.Reg = REGZERO
+                               break
+                       }
                        literal := fmt.Sprintf("$f32.%08x", i32)
                        s := obj.Linklookup(ctxt, literal, 0)
                        s.Size = 4
@@ -275,6 +280,11 @@ func progedit(ctxt *obj.Link, p *obj.Prog) {
        case AFMOVD:
                if p.From.Type == obj.TYPE_FCONST {
                        i64 := math.Float64bits(p.From.Val.(float64))
+                       if i64 == 0 {
+                               p.From.Type = obj.TYPE_REG
+                               p.From.Reg = REGZERO
+                               break
+                       }
                        literal := fmt.Sprintf("$f64.%016x", i64)
                        s := obj.Linklookup(ctxt, literal, 0)
                        s.Size = 8