summaryrefslogtreecommitdiff
path: root/src/pkg/bytes/asm_arm.s
diff options
context:
space:
mode:
authorMichael Stapelberg <stapelberg@debian.org>2013-03-04 21:27:36 +0100
committerMichael Stapelberg <michael@stapelberg.de>2013-03-04 21:27:36 +0100
commit04b08da9af0c450d645ab7389d1467308cfc2db8 (patch)
treedb247935fa4f2f94408edc3acd5d0d4f997aa0d8 /src/pkg/bytes/asm_arm.s
parent917c5fb8ec48e22459d77e3849e6d388f93d3260 (diff)
downloadgolang-upstream/1.1_hg20130304.tar.gz
Imported Upstream version 1.1~hg20130304upstream/1.1_hg20130304
Diffstat (limited to 'src/pkg/bytes/asm_arm.s')
-rw-r--r--src/pkg/bytes/asm_arm.s53
1 files changed, 49 insertions, 4 deletions
diff --git a/src/pkg/bytes/asm_arm.s b/src/pkg/bytes/asm_arm.s
index 4ed0c1580..c7685f041 100644
--- a/src/pkg/bytes/asm_arm.s
+++ b/src/pkg/bytes/asm_arm.s
@@ -2,10 +2,55 @@
// 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 s+0(FP), R0
+ MOVW s+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, r+16(FP)
+ RET
+
+_notfound:
+ MOVW $-1, R0
+ MOVW R0, r+16(FP)
+ RET
-// no memcmp implementation on arm yet
TEXT ·Equal(SB),7,$0
- B ·equalPortable(SB)
+ MOVW a+4(FP), R1
+ MOVW b+16(FP), R3
+
+ CMP R1, R3 // unequal lengths are not equal
+ B.NE _notequal
+
+ MOVW a+0(FP), R0
+ MOVW b+12(FP), R2
+ ADD R0, R1 // end
+
+_next:
+ CMP R0, R1
+ B.EQ _equal // reached the end
+ MOVBU.P 1(R0), R4
+ MOVBU.P 1(R2), R5
+ CMP R4, R5
+ B.EQ _next
+
+_notequal:
+ MOVW $0, R0
+ MOVBU R0, r+24(FP)
+ RET
+
+_equal:
+ MOVW $1, R0
+ MOVBU R0, r+24(FP)
+ RET