xref: /plan9-contrib/sys/src/ape/lib/ap/sparc/memset.s (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier	TEXT	memset(SB),$0
2*219b2ee8SDavid du Colombier
3*219b2ee8SDavid du Colombier/*
4*219b2ee8SDavid du Colombier * performance:
5*219b2ee8SDavid du Colombier *	(tba)
6*219b2ee8SDavid du Colombier */
7*219b2ee8SDavid du Colombier
8*219b2ee8SDavid du ColombierMOVW	R7, 0(FP)
9*219b2ee8SDavid du Colombier	MOVW	n+8(FP), R9		/* R9 is count */
10*219b2ee8SDavid du Colombier	MOVW	p+0(FP), R10		/* R10 is pointer */
11*219b2ee8SDavid du Colombier	MOVW	c+4(FP), R11		/* R11 is char */
12*219b2ee8SDavid du Colombier	ADD	R9,R10, R12		/* R12 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	SUBCC	$4,R9, R0
24*219b2ee8SDavid du Colombier	BL	out
25*219b2ee8SDavid du Colombier
26*219b2ee8SDavid du Colombier/*
27*219b2ee8SDavid du Colombier * turn R11 into a word of characters
28*219b2ee8SDavid du Colombier */
29*219b2ee8SDavid du Colombier	AND	$0xff, R11
30*219b2ee8SDavid du Colombier	SLL	$8,R11, R7
31*219b2ee8SDavid du Colombier	OR	R7, R11
32*219b2ee8SDavid du Colombier	SLL	$16,R11, R7
33*219b2ee8SDavid du Colombier	OR	R7, R11
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	ANDCC	$3,R10, R0
41*219b2ee8SDavid du Colombier	BE	l2
42*219b2ee8SDavid du Colombier	MOVB	R11, 0(R10)
43*219b2ee8SDavid du Colombier	ADD	$1, R10
44*219b2ee8SDavid du Colombier	JMP	l1
45*219b2ee8SDavid du Colombier
46*219b2ee8SDavid du Colombier/*
47*219b2ee8SDavid du Colombier * turn R9 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	ADD	$-15,R12, R9
52*219b2ee8SDavid du Colombier	SUBCC	R10,R9, R0
53*219b2ee8SDavid du Colombier	BLEU	l4
54*219b2ee8SDavid du Colombierl3:
55*219b2ee8SDavid du Colombier	MOVW	R11, 0(R10)
56*219b2ee8SDavid du Colombier	MOVW	R11, 4(R10)
57*219b2ee8SDavid du Colombier	ADD	$16, R10
58*219b2ee8SDavid du Colombier	SUBCC	R10,R9, R0
59*219b2ee8SDavid du Colombier	MOVW	R11, -8(R10)
60*219b2ee8SDavid du Colombier	MOVW	R11, -4(R10)
61*219b2ee8SDavid du Colombier	BGU	l3
62*219b2ee8SDavid du Colombier
63*219b2ee8SDavid du Colombier/*
64*219b2ee8SDavid du Colombier * turn R9 into end pointer-3
65*219b2ee8SDavid du Colombier * store 4 at a time while theres room
66*219b2ee8SDavid du Colombier */
67*219b2ee8SDavid du Colombierl4:
68*219b2ee8SDavid du Colombier	ADD	$-3,R12, R9
69*219b2ee8SDavid du Colombierl5:
70*219b2ee8SDavid du Colombier	SUBCC	R10,R9, R0
71*219b2ee8SDavid du Colombier	BLEU	out
72*219b2ee8SDavid du Colombier	MOVW	R11, 0(R10)
73*219b2ee8SDavid du Colombier	ADD	$4, R10
74*219b2ee8SDavid du Colombier	JMP	l5
75*219b2ee8SDavid du Colombier
76*219b2ee8SDavid du Colombier/*
77*219b2ee8SDavid du Colombier * last loop, store byte at a time
78*219b2ee8SDavid du Colombier */
79*219b2ee8SDavid du Colombierout:
80*219b2ee8SDavid du Colombier	SUBCC	R10,R12, R0
81*219b2ee8SDavid du Colombier	BLEU	ret
82*219b2ee8SDavid du Colombier	MOVB	R11, 0(R10)
83*219b2ee8SDavid du Colombier	ADD	$1, R10
84*219b2ee8SDavid du Colombier	JMP	out
85*219b2ee8SDavid du Colombier
86*219b2ee8SDavid du Colombierret:
87*219b2ee8SDavid du Colombier	MOVW	s1+0(FP), R7
88*219b2ee8SDavid du Colombier	RETURN
89