xref: /inferno-os/libkern/strchr-thumb.s (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.ForsythTEXT strchr(SB), $-4
2*37da2899SCharles.Forsyth	MOVBU	c+4(FP), R1
3*37da2899SCharles.Forsyth	CMP	$0, R1
4*37da2899SCharles.Forsyth	BEQ	_null
5*37da2899SCharles.Forsyth
6*37da2899SCharles.Forsyth_strchr:				/* not looking for a null, byte at a time */
7*37da2899SCharles.Forsyth	MOVBU.P	1(R0), R2
8*37da2899SCharles.Forsyth	CMP	R1, R2
9*37da2899SCharles.Forsyth	BEQ	_sub1
10*37da2899SCharles.Forsyth
11*37da2899SCharles.Forsyth	CMP	$0, R2
12*37da2899SCharles.Forsyth	BNE	_strchr
13*37da2899SCharles.Forsyth
14*37da2899SCharles.Forsyth_return0:				/* character not found in string, return 0 */
15*37da2899SCharles.Forsyth	MOVW	$0, R0
16*37da2899SCharles.Forsyth	RET
17*37da2899SCharles.Forsyth
18*37da2899SCharles.Forsyth_null:					/* looking for null, align */
19*37da2899SCharles.Forsyth	AND.S	$3, R0, R2
20*37da2899SCharles.Forsyth	BEQ	_aligned
21*37da2899SCharles.Forsyth
22*37da2899SCharles.Forsyth	MOVBU.P	1(R0), R4
23*37da2899SCharles.Forsyth	CMP	$0, R4
24*37da2899SCharles.Forsyth	BEQ	_sub1
25*37da2899SCharles.Forsyth	B	_null
26*37da2899SCharles.Forsyth
27*37da2899SCharles.Forsyth_aligned:
28*37da2899SCharles.Forsyth	MOVW	$0xFF, R3		/* mask */
29*37da2899SCharles.Forsyth
30*37da2899SCharles.Forsyth_loop:
31*37da2899SCharles.Forsyth	MOVW.P	4(R0), R4		/* 4 at a time */
32*37da2899SCharles.Forsyth	TST	R4, R3			/* AND.S R2, R3, Rx */
33*37da2899SCharles.Forsyth	BEQ	_sub4
34*37da2899SCharles.Forsyth	TST	R4>>8, R3
35*37da2899SCharles.Forsyth	BEQ	_sub3
36*37da2899SCharles.Forsyth	TST	R4>>16, R3
37*37da2899SCharles.Forsyth	BEQ	_sub2
38*37da2899SCharles.Forsyth	TST	R4>>24, R3
39*37da2899SCharles.Forsyth	BNE	_loop
40*37da2899SCharles.Forsyth
41*37da2899SCharles.Forsyth_sub1:					/* compensate for pointer increment */
42*37da2899SCharles.Forsyth	SUB	$1, R0
43*37da2899SCharles.Forsyth	RET
44*37da2899SCharles.Forsyth_sub2:
45*37da2899SCharles.Forsyth	SUB	$2, R0
46*37da2899SCharles.Forsyth	RET
47*37da2899SCharles.Forsyth_sub3:
48*37da2899SCharles.Forsyth	SUB	$3, R0
49*37da2899SCharles.Forsyth	RET
50*37da2899SCharles.Forsyth_sub4:
51*37da2899SCharles.Forsyth	SUB	$4, R0
52*37da2899SCharles.Forsyth	RET
53