xref: /plan9/sys/src/libc/arm/memset.s (revision 514807136a8518a9c368e175000825c6e1429f43)
17dd7cddfSDavid du ColombierTO = 1
27dd7cddfSDavid du ColombierTOE = 2
37dd7cddfSDavid du ColombierN = 3
47dd7cddfSDavid du ColombierTMP = 3					/* N and TMP don't overlap */
57dd7cddfSDavid du Colombier
67dd7cddfSDavid du ColombierTEXT memset(SB), $0
77dd7cddfSDavid du Colombier	MOVW	R0, R(TO)
87dd7cddfSDavid du Colombier	MOVW	data+4(FP), R(4)
97dd7cddfSDavid du Colombier	MOVW	n+8(FP), R(N)
107dd7cddfSDavid du Colombier
117dd7cddfSDavid du Colombier	ADD	R(N), R(TO), R(TOE)	/* to end pointer */
127dd7cddfSDavid du Colombier
137dd7cddfSDavid du Colombier	CMP	$4, R(N)		/* need at least 4 bytes to copy */
147dd7cddfSDavid du Colombier	BLT	_1tail
157dd7cddfSDavid du Colombier
1680ee5cbfSDavid du Colombier	AND	$0xFF, R(4)
1780ee5cbfSDavid du Colombier	ORR	R(4)<<8, R(4)
1880ee5cbfSDavid du Colombier	ORR	R(4)<<16, R(4)		/* replicate to word */
197dd7cddfSDavid du Colombier
207dd7cddfSDavid du Colombier_4align:				/* align on 4 */
217dd7cddfSDavid du Colombier	AND.S	$3, R(TO), R(TMP)
227dd7cddfSDavid du Colombier	BEQ	_4aligned
237dd7cddfSDavid du Colombier
247dd7cddfSDavid du Colombier	MOVBU.P	R(4), 1(R(TO))		/* implicit write back */
257dd7cddfSDavid du Colombier	B	_4align
267dd7cddfSDavid du Colombier
277dd7cddfSDavid du Colombier_4aligned:
28*51480713SDavid du Colombier	SUB	$15, R(TOE), R(TMP)	/* do 16-byte chunks if possible */
297dd7cddfSDavid du Colombier	CMP	R(TMP), R(TO)
307dd7cddfSDavid du Colombier	BHS	_4tail
317dd7cddfSDavid du Colombier
327dd7cddfSDavid du Colombier	MOVW	R4, R5			/* replicate */
337dd7cddfSDavid du Colombier	MOVW	R4, R6
347dd7cddfSDavid du Colombier	MOVW	R4, R7
357dd7cddfSDavid du Colombier
36*51480713SDavid du Colombier_f16loop:
377dd7cddfSDavid du Colombier	CMP	R(TMP), R(TO)
387dd7cddfSDavid du Colombier	BHS	_4tail
397dd7cddfSDavid du Colombier
40*51480713SDavid du Colombier	MOVM.IA.W [R4-R7], (R(TO))
41*51480713SDavid du Colombier	B	_f16loop
427dd7cddfSDavid du Colombier
437dd7cddfSDavid du Colombier_4tail:
447dd7cddfSDavid du Colombier	SUB	$3, R(TOE), R(TMP)	/* do remaining words if possible */
457dd7cddfSDavid du Colombier_4loop:
467dd7cddfSDavid du Colombier	CMP	R(TMP), R(TO)
477dd7cddfSDavid du Colombier	BHS	_1tail
487dd7cddfSDavid du Colombier
497dd7cddfSDavid du Colombier	MOVW.P	R(4), 4(R(TO))		/* implicit write back */
507dd7cddfSDavid du Colombier	B	_4loop
517dd7cddfSDavid du Colombier
527dd7cddfSDavid du Colombier_1tail:
537dd7cddfSDavid du Colombier	CMP	R(TO), R(TOE)
547dd7cddfSDavid du Colombier	BEQ	_return
557dd7cddfSDavid du Colombier
567dd7cddfSDavid du Colombier	MOVBU.P	R(4), 1(R(TO))		/* implicit write back */
577dd7cddfSDavid du Colombier	B	_1tail
587dd7cddfSDavid du Colombier
597dd7cddfSDavid du Colombier_return:
607dd7cddfSDavid du Colombier	RET
61