xref: /inferno-os/libkern/memset-mips.s (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1	TEXT	memset(SB),$12
2MOVW R1, 0(FP)
3
4/*
5 * performance:
6 *	about 1us/call and 28mb/sec
7 */
8
9	MOVW	n+8(FP), R3		/* R3 is count */
10	MOVW	p+0(FP), R4		/* R4 is pointer */
11	MOVW	c+4(FP), R5		/* R5 is char */
12	ADDU	R3,R4, R6		/* R6 is end pointer */
13
14/*
15 * if not at least 4 chars,
16 * dont even mess around.
17 * 3 chars to guarantee any
18 * rounding up to a word
19 * boundary and 4 characters
20 * to get at least maybe one
21 * full word store.
22 */
23	SGT	$4,R3, R1
24	BNE	R1, out
25
26/*
27 * turn R5 into a word of characters
28 */
29	AND	$0xff, R5
30	SLL	$8,R5, R1
31	OR	R1, R5
32	SLL	$16,R5, R1
33	OR	R1, R5
34
35/*
36 * store one byte at a time until pointer
37 * is alligned on a word boundary
38 */
39l1:
40	AND	$3,R4, R1
41	BEQ	R1, l2
42	MOVB	R5, 0(R4)
43	ADDU	$1, R4
44	JMP	l1
45
46/*
47 * turn R3 into end pointer-15
48 * store 16 at a time while theres room
49 */
50l2:
51	ADDU	$-15,R6, R3
52l3:
53	SGTU	R3,R4, R1
54	BEQ	R1, l4
55	MOVW	R5, 0(R4)
56	MOVW	R5, 4(R4)
57	ADDU	$16, R4
58	MOVW	R5, -8(R4)
59	MOVW	R5, -4(R4)
60	JMP	l3
61
62/*
63 * turn R3 into end pointer-3
64 * store 4 at a time while theres room
65 */
66l4:
67	ADDU	$-3,R6, R3
68l5:
69	SGTU	R3,R4, R1
70	BEQ	R1, out
71	MOVW	R5, 0(R4)
72	ADDU	$4, R4
73	JMP	l5
74
75/*
76 * last loop, store byte at a time
77 */
78out:
79	SGTU	R6,R4 ,R1
80	BEQ	R1, ret
81	MOVB	R5, 0(R4)
82	ADDU	$1, R4
83	JMP	out
84
85ret:
86	MOVW	s1+0(FP), R1
87	RET
88	END
89