]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/cmd/compile/internal/ssa/rewriteRISCV64.go
cmd/compile: optimize right shifts of uint32 on riscv
[gostls13.git] / src / cmd / compile / internal / ssa / rewriteRISCV64.go
index 1ca03a58a9c7b390ea71b8df0ef868f1f70c9919..02629de3ae76ba381d982258912ecf84e6a94b82 100644 (file)
@@ -545,6 +545,8 @@ func rewriteValueRISCV64(v *Value) bool {
                return rewriteValueRISCV64_OpRISCV64SRL(v)
        case OpRISCV64SRLI:
                return rewriteValueRISCV64_OpRISCV64SRLI(v)
+       case OpRISCV64SRLW:
+               return rewriteValueRISCV64_OpRISCV64SRLW(v)
        case OpRISCV64SUB:
                return rewriteValueRISCV64_OpRISCV64SUB(v)
        case OpRISCV64SUBW:
@@ -6293,6 +6295,20 @@ func rewriteValueRISCV64_OpRISCV64SRAI(v *Value) bool {
 func rewriteValueRISCV64_OpRISCV64SRL(v *Value) bool {
        v_1 := v.Args[1]
        v_0 := v.Args[0]
+       // match: (SRL <t> (MOVWUreg x) y)
+       // result: (SRLW <t> x y)
+       for {
+               t := v.Type
+               if v_0.Op != OpRISCV64MOVWUreg {
+                       break
+               }
+               x := v_0.Args[0]
+               y := v_1
+               v.reset(OpRISCV64SRLW)
+               v.Type = t
+               v.AddArg2(x, y)
+               return true
+       }
        // match: (SRL x (MOVDconst [val]))
        // result: (SRLI [int64(val&63)] x)
        for {
@@ -6310,6 +6326,21 @@ func rewriteValueRISCV64_OpRISCV64SRL(v *Value) bool {
 }
 func rewriteValueRISCV64_OpRISCV64SRLI(v *Value) bool {
        v_0 := v.Args[0]
+       // match: (SRLI <t> [x] (MOVWUreg y))
+       // result: (SRLIW <t> [x] y)
+       for {
+               t := v.Type
+               x := auxIntToInt64(v.AuxInt)
+               if v_0.Op != OpRISCV64MOVWUreg {
+                       break
+               }
+               y := v_0.Args[0]
+               v.reset(OpRISCV64SRLIW)
+               v.Type = t
+               v.AuxInt = int64ToAuxInt(x)
+               v.AddArg(y)
+               return true
+       }
        // match: (SRLI [x] (MOVDconst [y]))
        // result: (MOVDconst [int64(uint64(y) >> uint32(x))])
        for {
@@ -6324,6 +6355,24 @@ func rewriteValueRISCV64_OpRISCV64SRLI(v *Value) bool {
        }
        return false
 }
+func rewriteValueRISCV64_OpRISCV64SRLW(v *Value) bool {
+       v_1 := v.Args[1]
+       v_0 := v.Args[0]
+       // match: (SRLW x (MOVDconst [val]))
+       // result: (SRLIW [int64(val&31)] x)
+       for {
+               x := v_0
+               if v_1.Op != OpRISCV64MOVDconst {
+                       break
+               }
+               val := auxIntToInt64(v_1.AuxInt)
+               v.reset(OpRISCV64SRLIW)
+               v.AuxInt = int64ToAuxInt(int64(val & 31))
+               v.AddArg(x)
+               return true
+       }
+       return false
+}
 func rewriteValueRISCV64_OpRISCV64SUB(v *Value) bool {
        v_1 := v.Args[1]
        v_0 := v.Args[0]
@@ -6940,7 +6989,7 @@ func rewriteValueRISCV64_OpRsh32Ux16(v *Value) bool {
        typ := &b.Func.Config.Types
        // match: (Rsh32Ux16 <t> x y)
        // cond: !shiftIsBounded(v)
-       // result: (AND (SRL <t> (ZeroExt32to64 x) y) (Neg32 <t> (SLTIU <t> [64] (ZeroExt16to64 y))))
+       // result: (AND (SRL <t> (ZeroExt32to64 x) y) (Neg32 <t> (SLTIU <t> [32] (ZeroExt16to64 y))))
        for {
                t := v.Type
                x := v_0
@@ -6955,7 +7004,7 @@ func rewriteValueRISCV64_OpRsh32Ux16(v *Value) bool {
                v0.AddArg2(v1, y)
                v2 := b.NewValue0(v.Pos, OpNeg32, t)
                v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
-               v3.AuxInt = int64ToAuxInt(64)
+               v3.AuxInt = int64ToAuxInt(32)
                v4 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
                v4.AddArg(y)
                v3.AddArg(v4)
@@ -6987,7 +7036,7 @@ func rewriteValueRISCV64_OpRsh32Ux32(v *Value) bool {
        typ := &b.Func.Config.Types
        // match: (Rsh32Ux32 <t> x y)
        // cond: !shiftIsBounded(v)
-       // result: (AND (SRL <t> (ZeroExt32to64 x) y) (Neg32 <t> (SLTIU <t> [64] (ZeroExt32to64 y))))
+       // result: (AND (SRL <t> (ZeroExt32to64 x) y) (Neg32 <t> (SLTIU <t> [32] (ZeroExt32to64 y))))
        for {
                t := v.Type
                x := v_0
@@ -7002,7 +7051,7 @@ func rewriteValueRISCV64_OpRsh32Ux32(v *Value) bool {
                v0.AddArg2(v1, y)
                v2 := b.NewValue0(v.Pos, OpNeg32, t)
                v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
-               v3.AuxInt = int64ToAuxInt(64)
+               v3.AuxInt = int64ToAuxInt(32)
                v4 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
                v4.AddArg(y)
                v3.AddArg(v4)
@@ -7034,7 +7083,7 @@ func rewriteValueRISCV64_OpRsh32Ux64(v *Value) bool {
        typ := &b.Func.Config.Types
        // match: (Rsh32Ux64 <t> x y)
        // cond: !shiftIsBounded(v)
-       // result: (AND (SRL <t> (ZeroExt32to64 x) y) (Neg32 <t> (SLTIU <t> [64] y)))
+       // result: (AND (SRL <t> (ZeroExt32to64 x) y) (Neg32 <t> (SLTIU <t> [32] y)))
        for {
                t := v.Type
                x := v_0
@@ -7049,7 +7098,7 @@ func rewriteValueRISCV64_OpRsh32Ux64(v *Value) bool {
                v0.AddArg2(v1, y)
                v2 := b.NewValue0(v.Pos, OpNeg32, t)
                v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
-               v3.AuxInt = int64ToAuxInt(64)
+               v3.AuxInt = int64ToAuxInt(32)
                v3.AddArg(y)
                v2.AddArg(v3)
                v.AddArg2(v0, v2)
@@ -7079,7 +7128,7 @@ func rewriteValueRISCV64_OpRsh32Ux8(v *Value) bool {
        typ := &b.Func.Config.Types
        // match: (Rsh32Ux8 <t> x y)
        // cond: !shiftIsBounded(v)
-       // result: (AND (SRL <t> (ZeroExt32to64 x) y) (Neg32 <t> (SLTIU <t> [64] (ZeroExt8to64 y))))
+       // result: (AND (SRL <t> (ZeroExt32to64 x) y) (Neg32 <t> (SLTIU <t> [32] (ZeroExt8to64 y))))
        for {
                t := v.Type
                x := v_0
@@ -7094,7 +7143,7 @@ func rewriteValueRISCV64_OpRsh32Ux8(v *Value) bool {
                v0.AddArg2(v1, y)
                v2 := b.NewValue0(v.Pos, OpNeg32, t)
                v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
-               v3.AuxInt = int64ToAuxInt(64)
+               v3.AuxInt = int64ToAuxInt(32)
                v4 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
                v4.AddArg(y)
                v3.AddArg(v4)