]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: use NOT pseudo-instruction on riscv64
authorJoel Sing <joel@sing.id.au>
Mon, 2 Mar 2020 16:43:02 +0000 (03:43 +1100)
committerJoel Sing <joel@sing.id.au>
Sun, 15 Mar 2020 08:18:17 +0000 (08:18 +0000)
Change-Id: I24a72c3fb8d72a47cfded4b523c5d7aa2d40419d
Reviewed-on: https://go-review.googlesource.com/c/go/+/221690
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/compile/internal/riscv64/ssa.go
src/cmd/compile/internal/ssa/gen/RISCV64.rules
src/cmd/compile/internal/ssa/gen/RISCV64Ops.go
src/cmd/compile/internal/ssa/opGen.go
src/cmd/compile/internal/ssa/rewriteRISCV64.go

index 3fece75b1b273b307dc0e6b8d232b29d7bda5cec..798e54a907b50911153048ea7fd69288304f7af9 100644 (file)
@@ -250,7 +250,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
        case ssa.OpRISCV64FSQRTS, ssa.OpRISCV64FNEGS, ssa.OpRISCV64FSQRTD, ssa.OpRISCV64FNEGD,
                ssa.OpRISCV64FMVSX, ssa.OpRISCV64FMVDX,
                ssa.OpRISCV64FCVTSW, ssa.OpRISCV64FCVTSL, ssa.OpRISCV64FCVTWS, ssa.OpRISCV64FCVTLS,
-               ssa.OpRISCV64FCVTDW, ssa.OpRISCV64FCVTDL, ssa.OpRISCV64FCVTWD, ssa.OpRISCV64FCVTLD, ssa.OpRISCV64FCVTDS, ssa.OpRISCV64FCVTSD:
+               ssa.OpRISCV64FCVTDW, ssa.OpRISCV64FCVTDL, ssa.OpRISCV64FCVTWD, ssa.OpRISCV64FCVTLD, ssa.OpRISCV64FCVTDS, ssa.OpRISCV64FCVTSD,
+               ssa.OpRISCV64NOT:
                p := s.Prog(v.Op.Asm())
                p.From.Type = obj.TYPE_REG
                p.From.Reg = v.Args[0].Reg()
index 9b88b568718068b73b5e60deea9c126f70ed1f5b..d6ed61a461f5033282daf6a55343e376e9762f75 100644 (file)
 (Neg32F ...) -> (FNEGS ...)
 (Neg64F ...) -> (FNEGD ...)
 
-(Com64 x) -> (XORI [int64(-1)] x)
-(Com32 x) -> (XORI [int64(-1)] x)
-(Com16 x) -> (XORI [int64(-1)] x)
-(Com8  x) -> (XORI [int64(-1)] x)
+(Com64 ...) -> (NOT ...)
+(Com32 ...) -> (NOT ...)
+(Com16 ...) -> (NOT ...)
+(Com8  ...) -> (NOT ...)
 
 (Sqrt ...) -> (FSQRTD ...)
 
index 28a91d559f0ae1c8d64b1e8d528898aa9609b117..4a8d87c7fb2bede97df7e0ef440616f07dbbf7d6 100644 (file)
@@ -193,6 +193,7 @@ func init() {
                {name: "ORI", argLength: 1, reg: gp11, asm: "ORI", aux: "Int64"},      // arg0 | auxint
                {name: "AND", argLength: 2, reg: gp21, asm: "AND", commutative: true}, // arg0 & arg1
                {name: "ANDI", argLength: 1, reg: gp11, asm: "ANDI", aux: "Int64"},    // arg0 & auxint
+               {name: "NOT", argLength: 1, reg: gp11, asm: "NOT"},                    // ^arg0
 
                // Generate boolean values
                {name: "SEQZ", argLength: 1, reg: gp11, asm: "SEQZ"},                 // arg0 == 0, result is 0 or 1
index 2573ba1f2f31f5abdcd74a27cc6130b4dfa4a44e..019c76ec0b159b74c74c43d091ea6e7fad9bf286 100644 (file)
@@ -1933,6 +1933,7 @@ const (
        OpRISCV64ORI
        OpRISCV64AND
        OpRISCV64ANDI
+       OpRISCV64NOT
        OpRISCV64SEQZ
        OpRISCV64SNEZ
        OpRISCV64SLT
@@ -25712,6 +25713,19 @@ var opcodeTable = [...]opInfo{
                        },
                },
        },
+       {
+               name:   "NOT",
+               argLen: 1,
+               asm:    riscv.ANOT,
+               reg: regInfo{
+                       inputs: []inputInfo{
+                               {0, 1073741812}, // X3 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X27 X28 X29 X30
+                       },
+                       outputs: []outputInfo{
+                               {0, 1073741812}, // X3 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X27 X28 X29 X30
+                       },
+               },
+       },
        {
                name:   "SEQZ",
                argLen: 1,
index 676ca52e8ede96effb7ca33fca7ca7d936164a95..dcb1b60da13862c1c2c66f54affd5af6cb676eca 100644 (file)
@@ -53,13 +53,17 @@ func rewriteValueRISCV64(v *Value) bool {
                v.Op = OpRISCV64CALLclosure
                return true
        case OpCom16:
-               return rewriteValueRISCV64_OpCom16(v)
+               v.Op = OpRISCV64NOT
+               return true
        case OpCom32:
-               return rewriteValueRISCV64_OpCom32(v)
+               v.Op = OpRISCV64NOT
+               return true
        case OpCom64:
-               return rewriteValueRISCV64_OpCom64(v)
+               v.Op = OpRISCV64NOT
+               return true
        case OpCom8:
-               return rewriteValueRISCV64_OpCom8(v)
+               v.Op = OpRISCV64NOT
+               return true
        case OpConst16:
                v.Op = OpRISCV64MOVHconst
                return true
@@ -615,54 +619,6 @@ func rewriteValueRISCV64_OpAvg64u(v *Value) bool {
                return true
        }
 }
-func rewriteValueRISCV64_OpCom16(v *Value) bool {
-       v_0 := v.Args[0]
-       // match: (Com16 x)
-       // result: (XORI [int64(-1)] x)
-       for {
-               x := v_0
-               v.reset(OpRISCV64XORI)
-               v.AuxInt = int64(-1)
-               v.AddArg(x)
-               return true
-       }
-}
-func rewriteValueRISCV64_OpCom32(v *Value) bool {
-       v_0 := v.Args[0]
-       // match: (Com32 x)
-       // result: (XORI [int64(-1)] x)
-       for {
-               x := v_0
-               v.reset(OpRISCV64XORI)
-               v.AuxInt = int64(-1)
-               v.AddArg(x)
-               return true
-       }
-}
-func rewriteValueRISCV64_OpCom64(v *Value) bool {
-       v_0 := v.Args[0]
-       // match: (Com64 x)
-       // result: (XORI [int64(-1)] x)
-       for {
-               x := v_0
-               v.reset(OpRISCV64XORI)
-               v.AuxInt = int64(-1)
-               v.AddArg(x)
-               return true
-       }
-}
-func rewriteValueRISCV64_OpCom8(v *Value) bool {
-       v_0 := v.Args[0]
-       // match: (Com8 x)
-       // result: (XORI [int64(-1)] x)
-       for {
-               x := v_0
-               v.reset(OpRISCV64XORI)
-               v.AuxInt = int64(-1)
-               v.AddArg(x)
-               return true
-       }
-}
 func rewriteValueRISCV64_OpConst32F(v *Value) bool {
        b := v.Block
        typ := &b.Func.Config.Types