mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile/internal/ssa: use BEQ/BNE to optimize the combination of XOR and EQ/NE on loong64
Reduce the number of go toolchain instructions on loong64 as follows: file before after Δ % go 1599056 1590560 -8496 -0.5313% gofmt 326188 326104 -84 -0.0258% asm 563482 561250 -2232 -0.3961% cgo 488644 485252 -3392 -0.6942% compile 2504614 2486388 -18226 -0.7277% cover 526322 523270 -3052 -0.5799% link 714532 711124 -3408 -0.4770% preprofile 242316 241112 -1204 -0.4969% vet 794446 786118 -8328 -1.0483% Change-Id: I0914889119a28ea672b694529ef54513fbb3f3b5 Reviewed-on: https://go-review.googlesource.com/c/go/+/693875 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: abner chenc <chenguoqi@loongson.cn> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Reviewed-by: Keith Randall <khr@google.com>
This commit is contained in:
parent
adbf59525c
commit
b266318cf7
2 changed files with 35 additions and 0 deletions
|
|
@ -4,3 +4,6 @@
|
|||
|
||||
// Prefer addition when shifting left by one.
|
||||
(SLLVconst [1] x) => (ADDV x x)
|
||||
|
||||
(EQZ (XOR x y) yes no) => (BEQ x y yes no)
|
||||
(NEZ (XOR x y) yes no) => (BNE x y yes no)
|
||||
|
|
|
|||
|
|
@ -25,5 +25,37 @@ func rewriteValueLOONG64latelower_OpLOONG64SLLVconst(v *Value) bool {
|
|||
return false
|
||||
}
|
||||
func rewriteBlockLOONG64latelower(b *Block) bool {
|
||||
switch b.Kind {
|
||||
case BlockLOONG64EQZ:
|
||||
// match: (EQZ (XOR x y) yes no)
|
||||
// result: (BEQ x y yes no)
|
||||
for b.Controls[0].Op == OpLOONG64XOR {
|
||||
v_0 := b.Controls[0]
|
||||
_ = v_0.Args[1]
|
||||
v_0_0 := v_0.Args[0]
|
||||
v_0_1 := v_0.Args[1]
|
||||
for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
|
||||
x := v_0_0
|
||||
y := v_0_1
|
||||
b.resetWithControl2(BlockLOONG64BEQ, x, y)
|
||||
return true
|
||||
}
|
||||
}
|
||||
case BlockLOONG64NEZ:
|
||||
// match: (NEZ (XOR x y) yes no)
|
||||
// result: (BNE x y yes no)
|
||||
for b.Controls[0].Op == OpLOONG64XOR {
|
||||
v_0 := b.Controls[0]
|
||||
_ = v_0.Args[1]
|
||||
v_0_0 := v_0.Args[0]
|
||||
v_0_1 := v_0.Args[1]
|
||||
for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
|
||||
x := v_0_0
|
||||
y := v_0_1
|
||||
b.resetWithControl2(BlockLOONG64BNE, x, y)
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue