xref: /plan9/sys/src/libc/arm/memset.s (revision 514807136a8518a9c368e175000825c6e1429f43)
1TO = 1
2TOE = 2
3N = 3
4TMP = 3					/* N and TMP don't overlap */
5
6TEXT memset(SB), $0
7	MOVW	R0, R(TO)
8	MOVW	data+4(FP), R(4)
9	MOVW	n+8(FP), R(N)
10
11	ADD	R(N), R(TO), R(TOE)	/* to end pointer */
12
13	CMP	$4, R(N)		/* need at least 4 bytes to copy */
14	BLT	_1tail
15
16	AND	$0xFF, R(4)
17	ORR	R(4)<<8, R(4)
18	ORR	R(4)<<16, R(4)		/* replicate to word */
19
20_4align:				/* align on 4 */
21	AND.S	$3, R(TO), R(TMP)
22	BEQ	_4aligned
23
24	MOVBU.P	R(4), 1(R(TO))		/* implicit write back */
25	B	_4align
26
27_4aligned:
28	SUB	$15, R(TOE), R(TMP)	/* do 16-byte chunks if possible */
29	CMP	R(TMP), R(TO)
30	BHS	_4tail
31
32	MOVW	R4, R5			/* replicate */
33	MOVW	R4, R6
34	MOVW	R4, R7
35
36_f16loop:
37	CMP	R(TMP), R(TO)
38	BHS	_4tail
39
40	MOVM.IA.W [R4-R7], (R(TO))
41	B	_f16loop
42
43_4tail:
44	SUB	$3, R(TOE), R(TMP)	/* do remaining words if possible */
45_4loop:
46	CMP	R(TMP), R(TO)
47	BHS	_1tail
48
49	MOVW.P	R(4), 4(R(TO))		/* implicit write back */
50	B	_4loop
51
52_1tail:
53	CMP	R(TO), R(TOE)
54	BEQ	_return
55
56	MOVBU.P	R(4), 1(R(TO))		/* implicit write back */
57	B	_1tail
58
59_return:
60	RET
61