From 37d4532867b9c49f936cb8e394dec44d8985fe29 Mon Sep 17 00:00:00 2001 From: Ben Shi Date: Thu, 2 Sep 2021 00:06:42 +0000 Subject: [PATCH] cmd/internal/obj/riscv: simplify addition with constant This CL simplifies riscv addition (add r, imm) to (ADDI (ADDI r, imm/2), imm-imm/2) if imm is in specific ranges. (-4096 <= imm <= -2049 or 2048 <= imm <= 4094) There is little impact to the go1 benchmark, while the total size of pkg/linux_riscv64 decreased by about 11KB. Change-Id: I236eb8af3b83bb35ce9c0b318fc1d235e8ab9a4e GitHub-Last-Rev: a2f56a07635344a40d6b8a9571f236743122be34 GitHub-Pull-Request: golang/go#48110 Reviewed-on: https://go-review.googlesource.com/c/go/+/346689 Run-TryBot: Ben Shi TryBot-Result: Go Bot Reviewed-by: Joel Sing Reviewed-by: Cherry Mui Reviewed-by: Keith Randall Trust: Michael Munday --- src/cmd/internal/obj/riscv/obj.go | 21 +++++++++++++++++++++ test/codegen/arithmetic.go | 8 ++++++++ 2 files changed, 29 insertions(+) diff --git a/src/cmd/internal/obj/riscv/obj.go b/src/cmd/internal/obj/riscv/obj.go index 73f62c007d..6de967319c 100644 --- a/src/cmd/internal/obj/riscv/obj.go +++ b/src/cmd/internal/obj/riscv/obj.go @@ -774,6 +774,27 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { break // no need to split } + // Split into two additions if possible. + imm := q.From.Offset + const minInt12, maxInt12 = -(1 << 11), (1 << 11) - 1 + if q.As == AADDI && 2*minInt12 <= imm && imm <= 2*maxInt12 { + imm0, imm1 := imm/2, imm-imm/2 + // ADDI $(imm/2), REG, TO + p.Spadj = 0 // needed if TO is SP + p.As = AADDI + p.From = obj.Addr{Type: obj.TYPE_CONST, Offset: imm0} + p.Reg = q.Reg + p.To = q.To + p = obj.Appendp(p, newprog) + // ADDI $(imm-imm/2), TO, TO + p.Spadj = q.Spadj + p.As = AADDI + p.From = obj.Addr{Type: obj.TYPE_CONST, Offset: imm1} + p.Reg = q.To.Reg + p.To = q.To + break + } + p.As = ALUI p.From = obj.Addr{Type: obj.TYPE_CONST, Offset: high} p.Reg = 0 diff --git a/test/codegen/arithmetic.go b/test/codegen/arithmetic.go index eb95416b6a..754c5c9bc9 100644 --- a/test/codegen/arithmetic.go +++ b/test/codegen/arithmetic.go @@ -575,3 +575,11 @@ func constantFold3(i, j int) int { r := (5 * i) * (6 * j) return r } + +func addConst(i int64) (int64, int64) { + // riscv64:`ADDI`,-`LUI` + a := i + 3001 + // riscv64:`LUI`,`ADDIW` + b := i + 5009 + return a, b +} -- 2.50.0