Skip to content

Commit cdd9616

Browse files
mrosier-qdtbradfitz
authored andcommitted
cmd/compile: generate tbz/tbnz when comparing against zero on arm64
The tbz/tbnz checks the sign bit to determine if the value is >= 0 or < 0. go1 benchmark results: name old speed new speed delta JSONEncode 94.4MB/s ± 1% 95.7MB/s ± 0% +1.36% (p=0.000 n=10+9) JSONDecode 19.7MB/s ± 1% 19.9MB/s ± 1% +1.08% (p=0.000 n=9+10) Gzip 45.5MB/s ± 0% 46.0MB/s ± 0% +1.06% (p=0.000 n=10+10) Revcomp 376MB/s ± 0% 379MB/s ± 0% +0.69% (p=0.000 n=10+10) RegexpMatchHard_1K 12.6MB/s ± 0% 12.7MB/s ± 0% +0.57% (p=0.000 n=10+8) RegexpMatchMedium_32 3.21MB/s ± 0% 3.22MB/s ± 0% +0.31% (p=0.000 n=9+10) RegexpMatchEasy1_1K 1.27GB/s ± 0% 1.27GB/s ± 0% +0.23% (p=0.000 n=9+9) RegexpMatchHard_32 11.4MB/s ± 0% 11.4MB/s ± 1% +0.19% (p=0.036 n=10+8) RegexpMatchEasy0_1K 1.77GB/s ± 0% 1.77GB/s ± 0% +0.13% (p=0.000 n=9+10) RegexpMatchMedium_1K 19.3MB/s ± 0% 19.3MB/s ± 0% +0.04% (p=0.008 n=10+8) RegexpMatchEasy0_32 131MB/s ± 0% 131MB/s ± 0% ~ (p=0.211 n=10+10) GobDecode 57.5MB/s ± 1% 57.6MB/s ± 2% ~ (p=0.469 n=10+10) GobEncode 58.6MB/s ± 1% 58.5MB/s ± 2% ~ (p=0.781 n=10+10) GoParse 9.40MB/s ± 0% 9.39MB/s ± 0% -0.19% (p=0.005 n=10+9) RegexpMatchEasy1_32 133MB/s ± 0% 133MB/s ± 0% -0.48% (p=0.000 n=10+10) Template 20.9MB/s ± 0% 20.6MB/s ± 0% -1.54% (p=0.000 n=8+10) Change-Id: I411efe44db35c3962445618d5a47c12e31b3925b Reviewed-on: https://go-review.googlesource.com/92715 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
1 parent eab06e6 commit cdd9616

File tree

3 files changed

+114
-0
lines changed

3 files changed

+114
-0
lines changed

src/cmd/compile/internal/gc/asm_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2711,6 +2711,46 @@ var linuxARM64Tests = []*asmTest{
27112711
pos: []string{"LSL\t\\$17"},
27122712
neg: []string{"CMP"},
27132713
},
2714+
{
2715+
fn: `
2716+
func $(a int32, ptr *int) {
2717+
if a >= 0 {
2718+
*ptr = 0
2719+
}
2720+
}
2721+
`,
2722+
pos: []string{"TBNZ"},
2723+
},
2724+
{
2725+
fn: `
2726+
func $(a int64, ptr *int) {
2727+
if a >= 0 {
2728+
*ptr = 0
2729+
}
2730+
}
2731+
`,
2732+
pos: []string{"TBNZ"},
2733+
},
2734+
{
2735+
fn: `
2736+
func $(a int32, ptr *int) {
2737+
if a < 0 {
2738+
*ptr = 0
2739+
}
2740+
}
2741+
`,
2742+
pos: []string{"TBZ"},
2743+
},
2744+
{
2745+
fn: `
2746+
func $(a int64, ptr *int) {
2747+
if a < 0 {
2748+
*ptr = 0
2749+
}
2750+
}
2751+
`,
2752+
pos: []string{"TBZ"},
2753+
},
27142754
}
27152755

27162756
var linuxMIPSTests = []*asmTest{

src/cmd/compile/internal/ssa/gen/ARM64.rules

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,12 @@
534534
(ZW (ANDconst [c] x) yes no) && oneBit(int64(uint32(c))) -> (TBZ {ntz(int64(uint32(c)))} x yes no)
535535
(NZW (ANDconst [c] x) yes no) && oneBit(int64(uint32(c))) -> (TBNZ {ntz(int64(uint32(c)))} x yes no)
536536

537+
// Test sign-bit for signed comparisons against zero
538+
(GE (CMPWconst [0] x) yes no) -> (TBZ {int64(31)} x yes no)
539+
(GE (CMPconst [0] x) yes no) -> (TBZ {int64(63)} x yes no)
540+
(LT (CMPWconst [0] x) yes no) -> (TBNZ {int64(31)} x yes no)
541+
(LT (CMPconst [0] x) yes no) -> (TBNZ {int64(63)} x yes no)
542+
537543
// fold offset into address
538544
(ADDconst [off1] (MOVDaddr [off2] {sym} ptr)) -> (MOVDaddr [off1+off2] {sym} ptr)
539545

src/cmd/compile/internal/ssa/rewriteARM64.go

Lines changed: 68 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)