]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: combine operations with immediate on riscv64
authorJoel Sing <joel@sing.id.au>
Sat, 3 Sep 2022 19:23:07 +0000 (05:23 +1000)
committerJoel Sing <joel@sing.id.au>
Mon, 19 Sep 2022 19:01:45 +0000 (19:01 +0000)
Replace two immediate operations with one, where possible.

Change-Id: Idc00e868155c9ca1d872aaaf70ea1f73e9eac4d6
Reviewed-on: https://go-review.googlesource.com/c/go/+/428497
Reviewed-by: Wayne Zuo <wdvxdr@golangcn.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Joel Sing <joel@sing.id.au>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
src/cmd/compile/internal/ssa/gen/RISCV64.rules
src/cmd/compile/internal/ssa/rewriteRISCV64.go

index 5c3c8625714a05dec7b093776f335c046c9cff86..8f298712186f10343a3e7ca35402ac05cfa60b25 100644 (file)
 (ORI [-1] x) => (MOVDconst [-1])
 (ORI [x] (MOVDconst [y])) => (MOVDconst [x | y])
 
+// Combine operations with immediate.
+(ADDI [x] (ADDI [y] z)) && is32Bit(x + y) => (ADDI [x + y] z)
+(ANDI [x] (ANDI [y] z)) => (ANDI [x & y] z)
+(ORI  [x] (ORI  [y] z)) => (ORI  [x | y] z)
+
 // Negation of a constant.
 (NEG  (MOVDconst [x])) => (MOVDconst [-x])
 (NEGW (MOVDconst [x])) => (MOVDconst [int64(int32(-x))])
index 05c646e4a6fd595b3b25249eccedede45383cf2d..9ec51694330fe7920262c1f012b30c02aa6ee40b 100644 (file)
@@ -3174,6 +3174,24 @@ func rewriteValueRISCV64_OpRISCV64ADDI(v *Value) bool {
                v.AuxInt = int64ToAuxInt(x + y)
                return true
        }
+       // match: (ADDI [x] (ADDI [y] z))
+       // cond: is32Bit(x + y)
+       // result: (ADDI [x + y] z)
+       for {
+               x := auxIntToInt64(v.AuxInt)
+               if v_0.Op != OpRISCV64ADDI {
+                       break
+               }
+               y := auxIntToInt64(v_0.AuxInt)
+               z := v_0.Args[0]
+               if !(is32Bit(x + y)) {
+                       break
+               }
+               v.reset(OpRISCV64ADDI)
+               v.AuxInt = int64ToAuxInt(x + y)
+               v.AddArg(z)
+               return true
+       }
        return false
 }
 func rewriteValueRISCV64_OpRISCV64AND(v *Value) bool {
@@ -3235,6 +3253,20 @@ func rewriteValueRISCV64_OpRISCV64ANDI(v *Value) bool {
                v.AuxInt = int64ToAuxInt(x & y)
                return true
        }
+       // match: (ANDI [x] (ANDI [y] z))
+       // result: (ANDI [x & y] z)
+       for {
+               x := auxIntToInt64(v.AuxInt)
+               if v_0.Op != OpRISCV64ANDI {
+                       break
+               }
+               y := auxIntToInt64(v_0.AuxInt)
+               z := v_0.Args[0]
+               v.reset(OpRISCV64ANDI)
+               v.AuxInt = int64ToAuxInt(x & y)
+               v.AddArg(z)
+               return true
+       }
        return false
 }
 func rewriteValueRISCV64_OpRISCV64FMADDD(v *Value) bool {
@@ -5439,6 +5471,20 @@ func rewriteValueRISCV64_OpRISCV64ORI(v *Value) bool {
                v.AuxInt = int64ToAuxInt(x | y)
                return true
        }
+       // match: (ORI [x] (ORI [y] z))
+       // result: (ORI [x | y] z)
+       for {
+               x := auxIntToInt64(v.AuxInt)
+               if v_0.Op != OpRISCV64ORI {
+                       break
+               }
+               y := auxIntToInt64(v_0.AuxInt)
+               z := v_0.Args[0]
+               v.reset(OpRISCV64ORI)
+               v.AuxInt = int64ToAuxInt(x | y)
+               v.AddArg(z)
+               return true
+       }
        return false
 }
 func rewriteValueRISCV64_OpRISCV64SEQZ(v *Value) bool {