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