mirror of
https://github.com/golang/go
synced 2024-09-30 20:18:33 -06:00
cmd/compile: improve Slicemask on riscv64
Implement Slicemask the same way every other architecture does - negate then arithmetic right shift. This sets or clears the sign bit, before extending it to the entire register. Removes around 2,500 instructions from the Go binary on linux/riscv64. Change-Id: I4d675b826e7eb23fe2b1e6e46b95dcd49ab49733 Reviewed-on: https://go-review.googlesource.com/c/go/+/426354 Reviewed-by: Meng Zhuo <mzh@golangcn.org> Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Run-TryBot: Joel Sing <joel@sing.id.au> Reviewed-by: Wayne Zuo <wdvxdr@golangcn.org> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
ba1ef54c1e
commit
c011270fa5
@ -142,14 +142,7 @@
|
||||
(Round32F ...) => (Copy ...)
|
||||
(Round64F ...) => (Copy ...)
|
||||
|
||||
// From genericOps.go:
|
||||
// "0 if arg0 == 0, -1 if arg0 > 0, undef if arg0<0"
|
||||
//
|
||||
// Like other arches, we compute ~((x-1) >> 63), with arithmetic right shift.
|
||||
// For positive x, bit 63 of x-1 is always 0, so the result is -1.
|
||||
// For zero x, bit 63 of x-1 is 1, so the result is 0.
|
||||
//
|
||||
(Slicemask <t> x) => (NOT (SRAI <t> [63] (ADDI <t> [-1] x)))
|
||||
(Slicemask <t> x) => (SRAI [63] (NEG <t> x))
|
||||
|
||||
// Truncations
|
||||
// We ignore the unused high parts of registers, so truncates are just copies.
|
||||
|
@ -7329,17 +7329,14 @@ func rewriteValueRISCV64_OpSlicemask(v *Value) bool {
|
||||
v_0 := v.Args[0]
|
||||
b := v.Block
|
||||
// match: (Slicemask <t> x)
|
||||
// result: (NOT (SRAI <t> [63] (ADDI <t> [-1] x)))
|
||||
// result: (SRAI [63] (NEG <t> x))
|
||||
for {
|
||||
t := v.Type
|
||||
x := v_0
|
||||
v.reset(OpRISCV64NOT)
|
||||
v0 := b.NewValue0(v.Pos, OpRISCV64SRAI, t)
|
||||
v0.AuxInt = int64ToAuxInt(63)
|
||||
v1 := b.NewValue0(v.Pos, OpRISCV64ADDI, t)
|
||||
v1.AuxInt = int64ToAuxInt(-1)
|
||||
v1.AddArg(x)
|
||||
v0.AddArg(v1)
|
||||
v.reset(OpRISCV64SRAI)
|
||||
v.AuxInt = int64ToAuxInt(63)
|
||||
v0 := b.NewValue0(v.Pos, OpRISCV64NEG, t)
|
||||
v0.AddArg(x)
|
||||
v.AddArg(v0)
|
||||
return true
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user