]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/amd64: update popcnt code generation
authorIlya Tocar <ilya.tocar@intel.com>
Thu, 7 Dec 2017 16:56:45 +0000 (10:56 -0600)
committerIlya Tocar <ilya.tocar@intel.com>
Wed, 14 Feb 2018 19:56:57 +0000 (19:56 +0000)
Popcnt has false dependency on output register and generates
MOVQ $0, reg to break it. But recently we switched MOVQ $0, reg
encoding from xor reg, reg  to actual mov $0, reg. This CL updates
code generation for popcnt to use actual XOR.

Change-Id: I4c1fc11e85758b53ba2679165fa55614ec54b27d
Reviewed-on: https://go-review.googlesource.com/82516
Run-TryBot: Ilya Tocar <ilya.tocar@intel.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/amd64/ssa.go

index e3129edbf18566ce77ca91151c2155d06d01e911..49ef415e66c46b8e118586fa70ac60779964a844 100644 (file)
@@ -867,10 +867,10 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
        case ssa.OpAMD64POPCNTQ, ssa.OpAMD64POPCNTL:
                if v.Args[0].Reg() != v.Reg() {
                        // POPCNT on Intel has a false dependency on the destination register.
-                       // Zero the destination to break the dependency.
-                       p := s.Prog(x86.AMOVQ)
-                       p.From.Type = obj.TYPE_CONST
-                       p.From.Offset = 0
+                       // Xor register with itself to break the dependency.
+                       p := s.Prog(x86.AXORQ)
+                       p.From.Type = obj.TYPE_REG
+                       p.From.Reg = v.Reg()
                        p.To.Type = obj.TYPE_REG
                        p.To.Reg = v.Reg()
                }