mirror of https://github.com/golang/go.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 <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>
This commit is contained in:
parent
83d94daec2
commit
7234c90352
|
|
@ -788,6 +788,11 @@
|
||||||
(ORI [-1] x) => (MOVDconst [-1])
|
(ORI [-1] x) => (MOVDconst [-1])
|
||||||
(ORI [x] (MOVDconst [y])) => (MOVDconst [x | y])
|
(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.
|
// Negation of a constant.
|
||||||
(NEG (MOVDconst [x])) => (MOVDconst [-x])
|
(NEG (MOVDconst [x])) => (MOVDconst [-x])
|
||||||
(NEGW (MOVDconst [x])) => (MOVDconst [int64(int32(-x))])
|
(NEGW (MOVDconst [x])) => (MOVDconst [int64(int32(-x))])
|
||||||
|
|
|
||||||
|
|
@ -3174,6 +3174,24 @@ func rewriteValueRISCV64_OpRISCV64ADDI(v *Value) bool {
|
||||||
v.AuxInt = int64ToAuxInt(x + y)
|
v.AuxInt = int64ToAuxInt(x + y)
|
||||||
return true
|
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
|
return false
|
||||||
}
|
}
|
||||||
func rewriteValueRISCV64_OpRISCV64AND(v *Value) bool {
|
func rewriteValueRISCV64_OpRISCV64AND(v *Value) bool {
|
||||||
|
|
@ -3235,6 +3253,20 @@ func rewriteValueRISCV64_OpRISCV64ANDI(v *Value) bool {
|
||||||
v.AuxInt = int64ToAuxInt(x & y)
|
v.AuxInt = int64ToAuxInt(x & y)
|
||||||
return true
|
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
|
return false
|
||||||
}
|
}
|
||||||
func rewriteValueRISCV64_OpRISCV64FMADDD(v *Value) bool {
|
func rewriteValueRISCV64_OpRISCV64FMADDD(v *Value) bool {
|
||||||
|
|
@ -5439,6 +5471,20 @@ func rewriteValueRISCV64_OpRISCV64ORI(v *Value) bool {
|
||||||
v.AuxInt = int64ToAuxInt(x | y)
|
v.AuxInt = int64ToAuxInt(x | y)
|
||||||
return true
|
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
|
return false
|
||||||
}
|
}
|
||||||
func rewriteValueRISCV64_OpRISCV64SEQZ(v *Value) bool {
|
func rewriteValueRISCV64_OpRISCV64SEQZ(v *Value) bool {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue