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