]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile: handle non-in-place NEG and NOT
authorJosh Bleecher Snyder <josharian@gmail.com>
Fri, 31 Jul 2015 00:15:16 +0000 (17:15 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Fri, 31 Jul 2015 17:10:13 +0000 (17:10 +0000)
This fixes the crypto/subtle tests.

Change-Id: Ie6e721eec3481f67f13de1bfbd7988e227793148
Reviewed-on: https://go-review.googlesource.com/13000
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/gc/ssa.go

index 4db33a84a7e20f09cfeac65d66674512af24fd35..9422970b98f265811e84eeb205ffe5a8c6c0304f 100644 (file)
@@ -2093,9 +2093,18 @@ func genValue(v *ssa.Value) {
                p.To.Reg = regnum(v.Args[0])
        case ssa.OpAMD64NEGQ, ssa.OpAMD64NEGL, ssa.OpAMD64NEGW, ssa.OpAMD64NEGB,
                ssa.OpAMD64NOTQ, ssa.OpAMD64NOTL, ssa.OpAMD64NOTW, ssa.OpAMD64NOTB:
+               x := regnum(v.Args[0])
+               r := regnum(v)
+               if x != r {
+                       p := Prog(regMoveAMD64(v.Type.Size()))
+                       p.From.Type = obj.TYPE_REG
+                       p.From.Reg = x
+                       p.To.Type = obj.TYPE_REG
+                       p.To.Reg = r
+               }
                p := Prog(v.Op.Asm())
                p.To.Type = obj.TYPE_REG
-               p.To.Reg = regnum(v.Args[0])
+               p.To.Reg = r
        case ssa.OpSP, ssa.OpSB:
                // nothing to do
        case ssa.OpAMD64SETEQ, ssa.OpAMD64SETNE,