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