]> Cypherpunks repositories - gostls13.git/commitdiff
bytes: add assembly version of IndexByte for ARM
authorDave Cheney <dave@cheney.net>
Wed, 25 Apr 2012 03:18:31 +0000 (13:18 +1000)
committerDave Cheney <dave@cheney.net>
Wed, 25 Apr 2012 03:18:31 +0000 (13:18 +1000)
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

src/pkg/bytes/asm_arm.s

index 4ed0c1580a8bd6ff628610fe16a1c0070dc5492b..bc8e00695ce6dd6b58b4adeec211fe0d4edec413 100644 (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)