diff options
author | Michael Stapelberg <stapelberg@debian.org> | 2013-03-04 21:27:36 +0100 |
---|---|---|
committer | Michael Stapelberg <michael@stapelberg.de> | 2013-03-04 21:27:36 +0100 |
commit | 04b08da9af0c450d645ab7389d1467308cfc2db8 (patch) | |
tree | db247935fa4f2f94408edc3acd5d0d4f997aa0d8 /src/pkg/bytes/asm_arm.s | |
parent | 917c5fb8ec48e22459d77e3849e6d388f93d3260 (diff) | |
download | golang-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.s | 53 |
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 |