aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssa/rewriteRISCV64.go
diff options
context:
space:
mode:
authorJoel Sing <joel@sing.id.au>2020-03-02 04:23:12 +1100
committerJoel Sing <joel@sing.id.au>2020-03-03 11:36:47 +0000
commitbd6f4cd886458bb4ab1f492202fa2b499dcfc6f7 (patch)
tree61f53f045d065a1f4be1779ea34f6806830d80a3 /src/cmd/compile/internal/ssa/rewriteRISCV64.go
parent52b457d6f320c3491ab14a71afc3c7416b36430c (diff)
downloadgo-bd6f4cd886458bb4ab1f492202fa2b499dcfc6f7.tar.gz
go-bd6f4cd886458bb4ab1f492202fa2b499dcfc6f7.zip
cmd/compile: improve subtraction of constants on riscv64
Convert subtraction of a constant into an ADDI with a negative immediate, where possible. Change-Id: Ie8d54b7538f0012e5f898abea233b2957fe31899 Reviewed-on: https://go-review.googlesource.com/c/go/+/221679 Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/cmd/compile/internal/ssa/rewriteRISCV64.go')
-rw-r--r--src/cmd/compile/internal/ssa/rewriteRISCV64.go75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/rewriteRISCV64.go b/src/cmd/compile/internal/ssa/rewriteRISCV64.go
index 2e0b34de8d..128f7bb2b2 100644
--- a/src/cmd/compile/internal/ssa/rewriteRISCV64.go
+++ b/src/cmd/compile/internal/ssa/rewriteRISCV64.go
@@ -404,6 +404,8 @@ func rewriteValueRISCV64(v *Value) bool {
return rewriteValueRISCV64_OpRISCV64MOVWload(v)
case OpRISCV64MOVWstore:
return rewriteValueRISCV64_OpRISCV64MOVWstore(v)
+ case OpRISCV64SUB:
+ return rewriteValueRISCV64_OpRISCV64SUB(v)
case OpRotateLeft16:
return rewriteValueRISCV64_OpRotateLeft16(v)
case OpRotateLeft32:
@@ -2877,6 +2879,79 @@ func rewriteValueRISCV64_OpRISCV64MOVWstore(v *Value) bool {
}
return false
}
+func rewriteValueRISCV64_OpRISCV64SUB(v *Value) bool {
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
+ // match: (SUB x (MOVBconst [val]))
+ // cond: is32Bit(-val)
+ // result: (ADDI [-val] x)
+ for {
+ x := v_0
+ if v_1.Op != OpRISCV64MOVBconst {
+ break
+ }
+ val := v_1.AuxInt
+ if !(is32Bit(-val)) {
+ break
+ }
+ v.reset(OpRISCV64ADDI)
+ v.AuxInt = -val
+ v.AddArg(x)
+ return true
+ }
+ // match: (SUB x (MOVHconst [val]))
+ // cond: is32Bit(-val)
+ // result: (ADDI [-val] x)
+ for {
+ x := v_0
+ if v_1.Op != OpRISCV64MOVHconst {
+ break
+ }
+ val := v_1.AuxInt
+ if !(is32Bit(-val)) {
+ break
+ }
+ v.reset(OpRISCV64ADDI)
+ v.AuxInt = -val
+ v.AddArg(x)
+ return true
+ }
+ // match: (SUB x (MOVWconst [val]))
+ // cond: is32Bit(-val)
+ // result: (ADDI [-val] x)
+ for {
+ x := v_0
+ if v_1.Op != OpRISCV64MOVWconst {
+ break
+ }
+ val := v_1.AuxInt
+ if !(is32Bit(-val)) {
+ break
+ }
+ v.reset(OpRISCV64ADDI)
+ v.AuxInt = -val
+ v.AddArg(x)
+ return true
+ }
+ // match: (SUB x (MOVDconst [val]))
+ // cond: is32Bit(-val)
+ // result: (ADDI [-val] x)
+ for {
+ x := v_0
+ if v_1.Op != OpRISCV64MOVDconst {
+ break
+ }
+ val := v_1.AuxInt
+ if !(is32Bit(-val)) {
+ break
+ }
+ v.reset(OpRISCV64ADDI)
+ v.AuxInt = -val
+ v.AddArg(x)
+ return true
+ }
+ return false
+}
func rewriteValueRISCV64_OpRotateLeft16(v *Value) bool {
v_1 := v.Args[1]
v_0 := v.Args[0]