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