xref: /plan9/sys/src/ape/lib/ap/arm/strchr.s (revision 2ddf2468114832cf7379e5290d3756505dc39637)
180ee5cbfSDavid du ColombierTEXT strchr(SB), $-4
280ee5cbfSDavid du Colombier	MOVBU	c+4(FP), R1
380ee5cbfSDavid du Colombier	CMP	$0, R1
480ee5cbfSDavid du Colombier	BEQ	_null
580ee5cbfSDavid du Colombier
680ee5cbfSDavid du Colombier_strchr:				/* not looking for a null, byte at a time */
780ee5cbfSDavid du Colombier	MOVBU.P	1(R0), R2
880ee5cbfSDavid du Colombier	CMP	R1, R2
980ee5cbfSDavid du Colombier	BEQ	_sub1
1080ee5cbfSDavid du Colombier
1180ee5cbfSDavid du Colombier	CMP	$0, R2
1280ee5cbfSDavid du Colombier	BNE	_strchr
1380ee5cbfSDavid du Colombier
1480ee5cbfSDavid du Colombier_return0:				/* character not found in string, return 0 */
1580ee5cbfSDavid du Colombier	MOVW	$0, R0
1680ee5cbfSDavid du Colombier	RET
1780ee5cbfSDavid du Colombier
1880ee5cbfSDavid du Colombier_null:					/* looking for null, align */
1980ee5cbfSDavid du Colombier	AND.S	$3, R0, R2
2080ee5cbfSDavid du Colombier	BEQ	_aligned
2180ee5cbfSDavid du Colombier
2280ee5cbfSDavid du Colombier	MOVBU.P	1(R0), R4
2380ee5cbfSDavid du Colombier	CMP	$0, R4
2480ee5cbfSDavid du Colombier	BEQ	_sub1
2580ee5cbfSDavid du Colombier	B	_null
2680ee5cbfSDavid du Colombier
2780ee5cbfSDavid du Colombier_aligned:
2880ee5cbfSDavid du Colombier	MOVW	$0xFF, R3		/* mask */
2980ee5cbfSDavid du Colombier
3080ee5cbfSDavid du Colombier_loop:
3180ee5cbfSDavid du Colombier	MOVW.P	4(R0), R4		/* 4 at a time */
3280ee5cbfSDavid du Colombier	TST	R4, R3			/* AND.S R2, R3, Rx */
33*2ddf2468SDavid du Colombier	TST.NE	R4>>8, R3
34*2ddf2468SDavid du Colombier	TST.NE	R4>>16, R3
35*2ddf2468SDavid du Colombier	TST.NE	R4>>24, R3
36*2ddf2468SDavid du Colombier	BNE	_loop
37*2ddf2468SDavid du Colombier
38*2ddf2468SDavid du Colombier	TST	R4, R3			/* its somewhere, find it and correct */
3980ee5cbfSDavid du Colombier	BEQ	_sub4
4080ee5cbfSDavid du Colombier	TST	R4>>8, R3
4180ee5cbfSDavid du Colombier	BEQ	_sub3
4280ee5cbfSDavid du Colombier	TST	R4>>16, R3
4380ee5cbfSDavid du Colombier	BEQ	_sub2
4480ee5cbfSDavid du Colombier
4580ee5cbfSDavid du Colombier_sub1:					/* compensate for pointer increment */
4680ee5cbfSDavid du Colombier	SUB	$1, R0
4780ee5cbfSDavid du Colombier	RET
4880ee5cbfSDavid du Colombier_sub2:
4980ee5cbfSDavid du Colombier	SUB	$2, R0
5080ee5cbfSDavid du Colombier	RET
5180ee5cbfSDavid du Colombier_sub3:
5280ee5cbfSDavid du Colombier	SUB	$3, R0
5380ee5cbfSDavid du Colombier	RET
5480ee5cbfSDavid du Colombier_sub4:
5580ee5cbfSDavid du Colombier	SUB	$4, R0
5680ee5cbfSDavid du Colombier	RET
57