| // Copyright 2019 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| #include "go_asm.h" |
| #include "textflag.h" |
| |
| TEXT ·Count(SB),NOSPLIT,$0-20 |
| MOVW b_base+0(FP), R0 |
| MOVW b_len+4(FP), R1 |
| MOVBU c+12(FP), R2 |
| MOVW $ret+16(FP), R7 |
| B countbytebody<>(SB) |
| |
| TEXT ·CountString(SB),NOSPLIT,$0-16 |
| MOVW s_base+0(FP), R0 |
| MOVW s_len+4(FP), R1 |
| MOVBU c+8(FP), R2 |
| MOVW $ret+12(FP), R7 |
| B countbytebody<>(SB) |
| |
| // Input: |
| // R0: data |
| // R1: data length |
| // R2: byte to find |
| // R7: address to put result |
| // |
| // On exit: |
| // R4 and R8 are clobbered |
| TEXT countbytebody<>(SB),NOSPLIT,$0 |
| MOVW $0, R8 // R8 = count of byte to search |
| CMP $0, R1 |
| B.EQ done // short path to handle 0-byte case |
| ADD R0, R1 // R1 is the end of the range |
| byte_loop: |
| MOVBU.P 1(R0), R4 |
| CMP R4, R2 |
| ADD.EQ $1, R8 |
| CMP R0, R1 |
| B.NE byte_loop |
| done: |
| MOVW R8, (R7) |
| RET |