From: Joel Sing Date: Fri, 25 Aug 2023 18:19:40 +0000 (+1000) Subject: cmd/internal/obj/riscv: support subtraction with a constant X-Git-Tag: go1.22rc1~407 X-Git-Url: http://www.git.cypherpunks.ru/?p=gostls13.git;a=commitdiff_plain;h=dc74a3dd4f30c4a3df235aac8a9e84575767ba69 cmd/internal/obj/riscv: support subtraction with a constant Allow SUB and SUBW to be specified with a constant, which are mapped to ADDI and ADDIW with negated values. Change-Id: I7dc55692febc81ea87393b0a3a7d23a43c30313b Reviewed-on: https://go-review.googlesource.com/c/go/+/538915 Run-TryBot: Joel Sing Reviewed-by: Cherry Mui Reviewed-by: M Zhuo TryBot-Result: Gopher Robot Reviewed-by: Heschi Kreinick Reviewed-by: Mark Ryan Reviewed-by: Wang Yaduo Reviewed-by: Mauri de Souza Meneguzzo --- diff --git a/src/cmd/asm/internal/asm/testdata/riscv64.s b/src/cmd/asm/internal/asm/testdata/riscv64.s index 2afa457105..072302b225 100644 --- a/src/cmd/asm/internal/asm/testdata/riscv64.s +++ b/src/cmd/asm/internal/asm/testdata/riscv64.s @@ -94,6 +94,10 @@ start: SUB X6, X5, X7 // b3836240 SUB X5, X6 // 33035340 + SUB $-2047, X5, X6 // 1383f27f + SUB $2048, X5, X6 // 13830280 + SUB $-2047, X5 // 9382f27f + SUB $2048, X5 // 93820280 SRA X6, X5, X7 // b3d36240 SRA X5, X6 // 33535340 @@ -157,6 +161,7 @@ start: ADDW $1, X6 // 1b031300 SLLW $1, X6 // 1b131300 SRLW $1, X6 // 1b531300 + SUBW $1, X6 // 1b03f3ff SRAW $1, X6 // 1b531340 // 5.3: Load and Store Instructions (RV64I) diff --git a/src/cmd/internal/obj/riscv/obj.go b/src/cmd/internal/obj/riscv/obj.go index 279c8678a7..4ff1d910ce 100644 --- a/src/cmd/internal/obj/riscv/obj.go +++ b/src/cmd/internal/obj/riscv/obj.go @@ -69,6 +69,8 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) { switch p.As { case AADD: p.As = AADDI + case ASUB: + p.As, p.From.Offset = AADDI, -p.From.Offset case ASLT: p.As = ASLTI case ASLTU: @@ -87,6 +89,8 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) { p.As = ASRAI case AADDW: p.As = AADDIW + case ASUBW: + p.As, p.From.Offset = AADDIW, -p.From.Offset case ASLLW: p.As = ASLLIW case ASRLW: