]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: check pointer equality in arm64 cmpbody
authorDave Cheney <dave@cheney.net>
Tue, 25 Aug 2015 03:12:32 +0000 (13:12 +1000)
committerDave Cheney <dave@cheney.net>
Tue, 25 Aug 2015 03:29:47 +0000 (03:29 +0000)
Updates #11336

Follow the lead of amd64 by doing a pointer equality check
before comparing string/byte contents on arm64.

BenchmarkCompareBytesEqual-8               25.8           26.3           +1.94%
BenchmarkCompareBytesToNil-8               9.59           9.59           +0.00%
BenchmarkCompareBytesEmpty-8               9.59           9.17           -4.38%
BenchmarkCompareBytesIdentical-8           26.3           9.17           -65.13%
BenchmarkCompareBytesSameLength-8          16.3           16.3           +0.00%
BenchmarkCompareBytesDifferentLength-8     16.3           16.3           +0.00%
BenchmarkCompareBytesBigUnaligned-8        1132038        1131409        -0.06%
BenchmarkCompareBytesBig-8                 1126758        1128470        +0.15%
BenchmarkCompareBytesBigIdentical-8        1084366        9.17           -100.00%

Change-Id: Id7125c31957eff1ddb78897d4511bd50e79af3f7
Reviewed-on: https://go-review.googlesource.com/13885
Reviewed-by: Keith Randall <khr@golang.org>
src/runtime/asm_arm64.s

index 9aff9c7e6c8c0d9aef97bed3a2bbf93e06df2093..703ceea97a283cf56f83eeb0367c0192c341eaba 100644 (file)
@@ -870,6 +870,8 @@ TEXT bytes·Compare(SB),NOSPLIT,$-4-56
 // On exit:
 // R4, R5, and R6 are clobbered
 TEXT runtime·cmpbody<>(SB),NOSPLIT,$-4-0
+       CMP     R2, R3
+       BEQ     samebytes // same starting pointers; compare lengths
        CMP     R0, R1
        CSEL    LT, R1, R0, R6 // R6 is min(R0, R1)