xref: /plan9/sys/src/libc/arm/strchr.s (revision 6ca8a7e31df69aa273b57c9a8727a3aa1ead4d4b)
1*6ca8a7e3SDavid du ColombierTEXT strchr(SB), $0
27dd7cddfSDavid du Colombier	MOVBU	c+4(FP), R1
37dd7cddfSDavid du Colombier	CMP	$0, R1
47dd7cddfSDavid du Colombier	BEQ	_null
57dd7cddfSDavid du Colombier
67dd7cddfSDavid du Colombier_strchr:				/* not looking for a null, byte at a time */
77dd7cddfSDavid du Colombier	MOVBU.P	1(R0), R2
87dd7cddfSDavid du Colombier	CMP	R1, R2
97dd7cddfSDavid du Colombier	BEQ	_sub1
107dd7cddfSDavid du Colombier
117dd7cddfSDavid du Colombier	CMP	$0, R2
127dd7cddfSDavid du Colombier	BNE	_strchr
137dd7cddfSDavid du Colombier
147dd7cddfSDavid du Colombier_return0:				/* character not found in string, return 0 */
157dd7cddfSDavid du Colombier	MOVW	$0, R0
167dd7cddfSDavid du Colombier	RET
177dd7cddfSDavid du Colombier
187dd7cddfSDavid du Colombier_null:					/* looking for null, align */
197dd7cddfSDavid du Colombier	AND.S	$3, R0, R2
207dd7cddfSDavid du Colombier	BEQ	_aligned
217dd7cddfSDavid du Colombier
227dd7cddfSDavid du Colombier	MOVBU.P	1(R0), R4
237dd7cddfSDavid du Colombier	CMP	$0, R4
247dd7cddfSDavid du Colombier	BEQ	_sub1
257dd7cddfSDavid du Colombier	B	_null
267dd7cddfSDavid du Colombier
277dd7cddfSDavid du Colombier_aligned:
287dd7cddfSDavid du Colombier	MOVW	$0xFF, R3		/* mask */
297dd7cddfSDavid du Colombier
307dd7cddfSDavid du Colombier_loop:
317dd7cddfSDavid du Colombier	MOVW.P	4(R0), R4		/* 4 at a time */
327dd7cddfSDavid du Colombier	TST	R4, R3			/* AND.S R2, R3, Rx */
3380ee5cbfSDavid du Colombier	TST.NE	R4>>8, R3
3480ee5cbfSDavid du Colombier	TST.NE	R4>>16, R3
3580ee5cbfSDavid du Colombier	TST.NE	R4>>24, R3
3680ee5cbfSDavid du Colombier	BNE	_loop
3780ee5cbfSDavid du Colombier
3880ee5cbfSDavid du Colombier	TST	R4, R3			/* its somewhere, find it and correct */
397dd7cddfSDavid du Colombier	BEQ	_sub4
407dd7cddfSDavid du Colombier	TST	R4>>8, R3
417dd7cddfSDavid du Colombier	BEQ	_sub3
427dd7cddfSDavid du Colombier	TST	R4>>16, R3
437dd7cddfSDavid du Colombier	BEQ	_sub2
447dd7cddfSDavid du Colombier
457dd7cddfSDavid du Colombier_sub1:					/* compensate for pointer increment */
467dd7cddfSDavid du Colombier	SUB	$1, R0
477dd7cddfSDavid du Colombier	RET
487dd7cddfSDavid du Colombier_sub2:
497dd7cddfSDavid du Colombier	SUB	$2, R0
507dd7cddfSDavid du Colombier	RET
517dd7cddfSDavid du Colombier_sub3:
527dd7cddfSDavid du Colombier	SUB	$3, R0
537dd7cddfSDavid du Colombier	RET
547dd7cddfSDavid du Colombier_sub4:
557dd7cddfSDavid du Colombier	SUB	$4, R0
567dd7cddfSDavid du Colombier	RET
57