benchmark old ns/op new ns/op delta
BenchmarkIndexByte32 459 126 -72.55%
BenchmarkIndexByte4K 52404 10939 -79.13%
BenchmarkIndexByte4M
54470800 11177370 -79.48%
BenchmarkIndexByte64M
1010803000 178860500 -82.31%
benchmark old MB/s new MB/s speedup
BenchmarkIndexByte32 69.58 252.63 3.63x
BenchmarkIndexByte4K 78.16 374.42 4.79x
BenchmarkIndexByte4M 77.00 375.25 4.87x
BenchmarkIndexByte64M 66.39 375.20 5.65x
R=rsc, minux.ma
CC=golang-dev
https://golang.org/cl/
6106044
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// no memchr implementation on arm yet
TEXT ·IndexByte(SB),7,$0
- B ·indexBytePortable(SB)
+ MOVW base+0(FP), R0
+ MOVW len+4(FP), R1
+ MOVBU c+12(FP), R2 // byte to find
+ MOVW R0, R4 // store base for later
+ ADD R0, R1 // end
+
+_loop:
+ CMP R0, R1
+ B.EQ _notfound
+ MOVBU.P 1(R0), R3
+ CMP R2, R3
+ B.NE _loop
+
+ SUB $1, R0 // R0 will be one beyond the position we want
+ SUB R4, R0 // remove base
+ MOVW R0, index+16(FP)
+ RET
+
+_notfound:
+ MOVW $-1, R0
+ MOVW R0, index+16(FP)
+ RET
-// no memcmp implementation on arm yet
TEXT ·Equal(SB),7,$0
B ·equalPortable(SB)