]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: use SEQZ pseudo instruction in RISCV64 boolean rules
authorJoel Sing <joel@sing.id.au>
Sat, 25 Apr 2020 18:34:34 +0000 (04:34 +1000)
committerJoel Sing <joel@sing.id.au>
Sat, 2 May 2020 18:10:49 +0000 (18:10 +0000)
This makes the intent clearer, allows for another ellipsis and will aid
in future rewriting. While here, document boolean loads to explain register
contents.

Change-Id: I933db2813826d88819366191fbbea8fcee5e4dda
Reviewed-on: https://go-review.googlesource.com/c/go/+/230120
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/ssa/gen/RISCV64.rules
src/cmd/compile/internal/ssa/gen/RISCV64Ops.go
src/cmd/compile/internal/ssa/rewriteRISCV64.go

index 845ca58b6ed5d4a95d76275f20d01debc9392d85..fbd87360ac839047ddded22e3679af35dd6268d6 100644 (file)
 // Boolean ops; 0=false, 1=true
 (AndB ...) => (AND ...)
 (OrB  ...) => (OR  ...)
-(EqB  x y) => (XORI [1] (XOR <typ.Bool> x y))
+(EqB  x y) => (SEQZ (XOR <typ.Bool> x y))
 (NeqB ...) => (XOR ...)
-(Not  x)   => (XORI [1] x)
+(Not  ...) => (SEQZ ...)
 
 // Lowering pointer arithmetic
 // TODO: Special handling for SP offsets, like ARM
index 8bdb35f95af4bd1376e2b6af10b7bc707e66a213..8ab4abe04a073e9c4fa9843e714a06e58ed6e4a3 100644 (file)
@@ -10,6 +10,9 @@ import (
        "fmt"
 )
 
+// Notes:
+//  - Boolean types occupy the entire register. 0=false, 1=true.
+
 // Suffixes encode the bit width of various instructions:
 //
 // D (double word) = 64 bit int
index db9f529bae0b0061949cd3cac262c79d9388630a..6b91c08628b544399da4782144257dfd1ccb1bfc 100644 (file)
@@ -391,7 +391,8 @@ func rewriteValueRISCV64(v *Value) bool {
                v.Op = OpRISCV64LoweredNilCheck
                return true
        case OpNot:
-               return rewriteValueRISCV64_OpNot(v)
+               v.Op = OpRISCV64SEQZ
+               return true
        case OpOffPtr:
                return rewriteValueRISCV64_OpOffPtr(v)
        case OpOr16:
@@ -913,12 +914,11 @@ func rewriteValueRISCV64_OpEqB(v *Value) bool {
        b := v.Block
        typ := &b.Func.Config.Types
        // match: (EqB x y)
-       // result: (XORI [1] (XOR <typ.Bool> x y))
+       // result: (SEQZ (XOR <typ.Bool> x y))
        for {
                x := v_0
                y := v_1
-               v.reset(OpRISCV64XORI)
-               v.AuxInt = int64ToAuxInt(1)
+               v.reset(OpRISCV64SEQZ)
                v0 := b.NewValue0(v.Pos, OpRISCV64XOR, typ.Bool)
                v0.AddArg2(x, y)
                v.AddArg(v0)
@@ -2132,18 +2132,6 @@ func rewriteValueRISCV64_OpNeqPtr(v *Value) bool {
                return true
        }
 }
-func rewriteValueRISCV64_OpNot(v *Value) bool {
-       v_0 := v.Args[0]
-       // match: (Not x)
-       // result: (XORI [1] x)
-       for {
-               x := v_0
-               v.reset(OpRISCV64XORI)
-               v.AuxInt = int64ToAuxInt(1)
-               v.AddArg(x)
-               return true
-       }
-}
 func rewriteValueRISCV64_OpOffPtr(v *Value) bool {
        v_0 := v.Args[0]
        b := v.Block