1
0
mirror of https://github.com/golang/go synced 2024-11-25 09:07:58 -07:00

bytes: add assembly version of IndexByte for ARM

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
This commit is contained in:
Dave Cheney 2012-04-25 13:18:31 +10:00
parent 97a7defed4
commit 0681b13437

View File

@ -2,10 +2,29 @@
// 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)