From 9439a7d87f90b97e00717fc0849d4460628d82d0 Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Sun, 26 Apr 2020 04:34:34 +1000 Subject: [PATCH] cmd/compile: use SEQZ pseudo instruction in RISCV64 boolean rules 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 --- .../compile/internal/ssa/gen/RISCV64.rules | 4 ++-- .../compile/internal/ssa/gen/RISCV64Ops.go | 3 +++ .../compile/internal/ssa/rewriteRISCV64.go | 20 ++++--------------- 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/RISCV64.rules b/src/cmd/compile/internal/ssa/gen/RISCV64.rules index 845ca58b6ed..fbd87360ac8 100644 --- a/src/cmd/compile/internal/ssa/gen/RISCV64.rules +++ b/src/cmd/compile/internal/ssa/gen/RISCV64.rules @@ -414,9 +414,9 @@ // Boolean ops; 0=false, 1=true (AndB ...) => (AND ...) (OrB ...) => (OR ...) -(EqB x y) => (XORI [1] (XOR x y)) +(EqB x y) => (SEQZ (XOR x y)) (NeqB ...) => (XOR ...) -(Not x) => (XORI [1] x) +(Not ...) => (SEQZ ...) // Lowering pointer arithmetic // TODO: Special handling for SP offsets, like ARM diff --git a/src/cmd/compile/internal/ssa/gen/RISCV64Ops.go b/src/cmd/compile/internal/ssa/gen/RISCV64Ops.go index 8bdb35f95af..8ab4abe04a0 100644 --- a/src/cmd/compile/internal/ssa/gen/RISCV64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/RISCV64Ops.go @@ -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 diff --git a/src/cmd/compile/internal/ssa/rewriteRISCV64.go b/src/cmd/compile/internal/ssa/rewriteRISCV64.go index db9f529bae0..6b91c08628b 100644 --- a/src/cmd/compile/internal/ssa/rewriteRISCV64.go +++ b/src/cmd/compile/internal/ssa/rewriteRISCV64.go @@ -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 x y)) + // result: (SEQZ (XOR 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