xref: /plan9/sys/src/ape/lib/ap/arm/memset.s (revision 514807136a8518a9c368e175000825c6e1429f43)
180ee5cbfSDavid du ColombierTO = 1
280ee5cbfSDavid du ColombierTOE = 2
380ee5cbfSDavid du ColombierN = 3
480ee5cbfSDavid du ColombierTMP = 3					/* N and TMP don't overlap */
580ee5cbfSDavid du Colombier
680ee5cbfSDavid du ColombierTEXT memset(SB), $0
780ee5cbfSDavid du Colombier	MOVW	R0, R(TO)
880ee5cbfSDavid du Colombier	MOVW	data+4(FP), R(4)
980ee5cbfSDavid du Colombier	MOVW	n+8(FP), R(N)
1080ee5cbfSDavid du Colombier
1180ee5cbfSDavid du Colombier	ADD	R(N), R(TO), R(TOE)	/* to end pointer */
1280ee5cbfSDavid du Colombier
1380ee5cbfSDavid du Colombier	CMP	$4, R(N)		/* need at least 4 bytes to copy */
1480ee5cbfSDavid du Colombier	BLT	_1tail
1580ee5cbfSDavid du Colombier
162ddf2468SDavid du Colombier	AND	$0xFF, R(4)
172ddf2468SDavid du Colombier	ORR	R(4)<<8, R(4)
182ddf2468SDavid du Colombier	ORR	R(4)<<16, R(4)		/* replicate to word */
1980ee5cbfSDavid du Colombier
2080ee5cbfSDavid du Colombier_4align:				/* align on 4 */
2180ee5cbfSDavid du Colombier	AND.S	$3, R(TO), R(TMP)
2280ee5cbfSDavid du Colombier	BEQ	_4aligned
2380ee5cbfSDavid du Colombier
2480ee5cbfSDavid du Colombier	MOVBU.P	R(4), 1(R(TO))		/* implicit write back */
2580ee5cbfSDavid du Colombier	B	_4align
2680ee5cbfSDavid du Colombier
2780ee5cbfSDavid du Colombier_4aligned:
28*51480713SDavid du Colombier	SUB	$15, R(TOE), R(TMP)	/* do 16-byte chunks if possible */
2980ee5cbfSDavid du Colombier	CMP	R(TMP), R(TO)
3080ee5cbfSDavid du Colombier	BHS	_4tail
3180ee5cbfSDavid du Colombier
3280ee5cbfSDavid du Colombier	MOVW	R4, R5			/* replicate */
3380ee5cbfSDavid du Colombier	MOVW	R4, R6
3480ee5cbfSDavid du Colombier	MOVW	R4, R7
3580ee5cbfSDavid du Colombier
36*51480713SDavid du Colombier_f16loop:
3780ee5cbfSDavid du Colombier	CMP	R(TMP), R(TO)
3880ee5cbfSDavid du Colombier	BHS	_4tail
3980ee5cbfSDavid du Colombier
40*51480713SDavid du Colombier	MOVM.IA.W [R4-R7], (R(TO))
41*51480713SDavid du Colombier	B	_f16loop
4280ee5cbfSDavid du Colombier
4380ee5cbfSDavid du Colombier_4tail:
4480ee5cbfSDavid du Colombier	SUB	$3, R(TOE), R(TMP)	/* do remaining words if possible */
4580ee5cbfSDavid du Colombier_4loop:
4680ee5cbfSDavid du Colombier	CMP	R(TMP), R(TO)
4780ee5cbfSDavid du Colombier	BHS	_1tail
4880ee5cbfSDavid du Colombier
4980ee5cbfSDavid du Colombier	MOVW.P	R(4), 4(R(TO))		/* implicit write back */
5080ee5cbfSDavid du Colombier	B	_4loop
5180ee5cbfSDavid du Colombier
5280ee5cbfSDavid du Colombier_1tail:
5380ee5cbfSDavid du Colombier	CMP	R(TO), R(TOE)
5480ee5cbfSDavid du Colombier	BEQ	_return
5580ee5cbfSDavid du Colombier
5680ee5cbfSDavid du Colombier	MOVBU.P	R(4), 1(R(TO))		/* implicit write back */
5780ee5cbfSDavid du Colombier	B	_1tail
5880ee5cbfSDavid du Colombier
5980ee5cbfSDavid du Colombier_return:
6080ee5cbfSDavid du Colombier	RET
61