summaryrefslogtreecommitdiff
path: root/sys/src/ape/lib/ap/arm/strchr.s
blob: 349b5a49f52c80e398d6a8178126a55d09b2d8f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
TEXT strchr(SB), $-4
	MOVBU	c+4(FP), R1
	CMP	$0, R1
	BEQ	_null

_strchr:				/* not looking for a null, byte at a time */
	MOVBU.P	1(R0), R2
	CMP	R1, R2
	BEQ	_sub1

	CMP	$0, R2
	BNE	_strchr

_return0:				/* character not found in string, return 0 */
	MOVW	$0, R0
	RET

_null:					/* looking for null, align */
	AND.S	$3, R0, R2
	BEQ	_aligned

	MOVBU.P	1(R0), R4
	CMP	$0, R4
	BEQ	_sub1
	B	_null

_aligned:
	MOVW	$0xFF, R3		/* mask */

_loop:
	MOVW.P	4(R0), R4		/* 4 at a time */
	TST	R4, R3			/* AND.S R2, R3, Rx */
	TST.NE	R4>>8, R3
	TST.NE	R4>>16, R3
	TST.NE	R4>>24, R3
	BNE	_loop

	TST	R4, R3			/* its somewhere, find it and correct */
	BEQ	_sub4
	TST	R4>>8, R3
	BEQ	_sub3
	TST	R4>>16, R3
	BEQ	_sub2

_sub1:					/* compensate for pointer increment */
	SUB	$1, R0
	RET
_sub2:
	SUB	$2, R0
	RET
_sub3:
	SUB	$3, R0
	RET
_sub4:
	SUB	$4, R0
	RET