]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: improve Slicemask on riscv64
authorJoel Sing <joel@sing.id.au>
Mon, 29 Aug 2022 10:36:51 +0000 (20:36 +1000)
committerJoel Sing <joel@sing.id.au>
Wed, 7 Sep 2022 05:37:53 +0000 (05:37 +0000)
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>

src/cmd/compile/internal/ssa/gen/RISCV64.rules
src/cmd/compile/internal/ssa/rewriteRISCV64.go

index 9d3cb06697d4e74fdc8912b439857cc70752e788..0207fb45d68bd13a6d4b69457df04a58bf8baec0 100644 (file)
 (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.
index 6244488992d7e29672005489d26bcd33cfcb9f0a..908456b0aa074284475f9dfd942409cd2c755e5f 100644 (file)
@@ -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
        }