xref: /inferno-os/libkern/memset-arm.s (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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)		/* it's a byte */
17	SLL	$8, R(4), R(TMP)	/* replicate to a word */
18	ORR	R(TMP), R(4)
19	SLL	$16, R(4), R(TMP)
20	ORR	R(TMP), R(4)
21
22_4align:				/* align on 4 */
23	AND.S	$3, R(TO), R(TMP)
24	BEQ	_4aligned
25
26	MOVBU.P	R(4), 1(R(TO))		/* implicit write back */
27	B	_4align
28
29_4aligned:
30	SUB	$31, R(TOE), R(TMP)	/* do 32-byte chunks if possible */
31	CMP	R(TMP), R(TO)
32	BHS	_4tail
33
34	MOVW	R4, R5			/* replicate */
35	MOVW	R4, R6
36	MOVW	R4, R7
37	MOVW	R4, R8
38	MOVW	R4, R9
39	MOVW	R4, R10
40	MOVW	R4, R11
41
42_f32loop:
43	CMP	R(TMP), R(TO)
44	BHS	_4tail
45
46	MOVM.IA.W [R4-R11], (R(TO))
47	B	_f32loop
48
49_4tail:
50	SUB	$3, R(TOE), R(TMP)	/* do remaining words if possible */
51_4loop:
52	CMP	R(TMP), R(TO)
53	BHS	_1tail
54
55	MOVW.P	R(4), 4(R(TO))		/* implicit write back */
56	B	_4loop
57
58_1tail:
59	CMP	R(TO), R(TOE)
60	BEQ	_return
61
62	MOVBU.P	R(4), 1(R(TO))		/* implicit write back */
63	B	_1tail
64
65_return:
66	RET
67