From: Joel Sing Date: Sat, 3 Sep 2022 19:23:07 +0000 (+1000) Subject: cmd/compile: combine operations with immediate on riscv64 X-Git-Tag: go1.20rc1~987 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=7234c90352e5ea7769c02808017fb20043ea8210;p=gostls13.git cmd/compile: combine operations with immediate on riscv64 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 TryBot-Result: Gopher Robot Run-TryBot: Joel Sing Reviewed-by: David Chase Reviewed-by: Cherry Mui --- diff --git a/src/cmd/compile/internal/ssa/gen/RISCV64.rules b/src/cmd/compile/internal/ssa/gen/RISCV64.rules index 5c3c862571..8f29871218 100644 --- a/src/cmd/compile/internal/ssa/gen/RISCV64.rules +++ b/src/cmd/compile/internal/ssa/gen/RISCV64.rules @@ -788,6 +788,11 @@ (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))]) diff --git a/src/cmd/compile/internal/ssa/rewriteRISCV64.go b/src/cmd/compile/internal/ssa/rewriteRISCV64.go index 05c646e4a6..9ec5169433 100644 --- a/src/cmd/compile/internal/ssa/rewriteRISCV64.go +++ b/src/cmd/compile/internal/ssa/rewriteRISCV64.go @@ -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 {