From 0681b13437e36de582521d5b9f1b4664400312a9 Mon Sep 17 00:00:00 2001 From: Dave Cheney Date: Wed, 25 Apr 2012 13:18:31 +1000 Subject: [PATCH] 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 --- src/pkg/bytes/asm_arm.s | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/pkg/bytes/asm_arm.s b/src/pkg/bytes/asm_arm.s index 4ed0c1580a..bc8e00695c 100644 --- a/src/pkg/bytes/asm_arm.s +++ b/src/pkg/bytes/asm_arm.s @@ -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) -- 2.48.1