|  | // 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 |