1
0
mirror of https://github.com/golang/go synced 2024-11-23 16:30:06 -07:00

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 <khr@golang.org>
This commit is contained in:
Joel Sing 2020-04-26 04:34:34 +10:00
parent be08e10b3b
commit 9439a7d87f
3 changed files with 9 additions and 18 deletions

View File

@ -414,9 +414,9 @@
// 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

View 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

View 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