xref: /plan9-contrib/sys/src/libc/riscv/memcmp.s (revision ce95e1b3727b9cb1c223ffbed69aff21a8ced255)
1*ce95e1b3SDavid du Colombier	TEXT	memcmp(SB), $0
2*ce95e1b3SDavid du Colombier	MOVW 	R8, s1+0(FP)
3*ce95e1b3SDavid du Colombier	MOVW	n+8(FP), R15		/* R15 is count */
4*ce95e1b3SDavid du Colombier	MOVW	s1+0(FP), R9		/* R9 is pointer1 */
5*ce95e1b3SDavid du Colombier	MOVW	s2+4(FP), R10		/* R10 is pointer2 */
6*ce95e1b3SDavid du Colombier	ADD	R15,R9, R11		/* R11 is end pointer1 */
7*ce95e1b3SDavid du Colombier
8*ce95e1b3SDavid du Colombier/*
9*ce95e1b3SDavid du Colombier * if not at least 4 chars,
10*ce95e1b3SDavid du Colombier * dont even mess around.
11*ce95e1b3SDavid du Colombier * 3 chars to guarantee any
12*ce95e1b3SDavid du Colombier * rounding up to a word
13*ce95e1b3SDavid du Colombier * boundary and 4 characters
14*ce95e1b3SDavid du Colombier * to get at least maybe one
15*ce95e1b3SDavid du Colombier * full word cmp.
16*ce95e1b3SDavid du Colombier */
17*ce95e1b3SDavid du Colombier	SLT	$4,R15, R8
18*ce95e1b3SDavid du Colombier	BNE	R8, out
19*ce95e1b3SDavid du Colombier
20*ce95e1b3SDavid du Colombier/*
21*ce95e1b3SDavid du Colombier * test if both pointers
22*ce95e1b3SDavid du Colombier * are similarly word aligned
23*ce95e1b3SDavid du Colombier */
24*ce95e1b3SDavid du Colombier	XOR	R9,R10, R8
25*ce95e1b3SDavid du Colombier	AND	$3, R8
26*ce95e1b3SDavid du Colombier	BNE	R8, out
27*ce95e1b3SDavid du Colombier
28*ce95e1b3SDavid du Colombier/*
29*ce95e1b3SDavid du Colombier * byte at a time to word align
30*ce95e1b3SDavid du Colombier */
31*ce95e1b3SDavid du Colombierl1:
32*ce95e1b3SDavid du Colombier	AND	$3,R9, R8
33*ce95e1b3SDavid du Colombier	BEQ	R8, l2
34*ce95e1b3SDavid du Colombier	MOVBU	0(R9), R14
35*ce95e1b3SDavid du Colombier	MOVBU	0(R10), R15
36*ce95e1b3SDavid du Colombier	ADD	$1, R9
37*ce95e1b3SDavid du Colombier	BNE	R14,R15, ne
38*ce95e1b3SDavid du Colombier	ADD	$1, R10
39*ce95e1b3SDavid du Colombier	JMP	l1
40*ce95e1b3SDavid du Colombier
41*ce95e1b3SDavid du Colombier/*
42*ce95e1b3SDavid du Colombier * turn R15 into end pointer1-15
43*ce95e1b3SDavid du Colombier * cmp 16 at a time while theres room
44*ce95e1b3SDavid du Colombier */
45*ce95e1b3SDavid du Colombierl2:
46*ce95e1b3SDavid du Colombier	ADD	$-15,R11, R15
47*ce95e1b3SDavid du Colombierl3:
48*ce95e1b3SDavid du Colombier	SLTU	R15,R9, R8
49*ce95e1b3SDavid du Colombier	BEQ	R8, l4
50*ce95e1b3SDavid du Colombier	MOVW	0(R9), R12
51*ce95e1b3SDavid du Colombier	MOVW	0(R10), R13
52*ce95e1b3SDavid du Colombier	BNE	R12,R13, ne1
53*ce95e1b3SDavid du Colombier	MOVW	4(R9), R12
54*ce95e1b3SDavid du Colombier	MOVW	4(R10), R13
55*ce95e1b3SDavid du Colombier	BNE	R12,R13, ne1
56*ce95e1b3SDavid du Colombier	MOVW	8(R9), R12
57*ce95e1b3SDavid du Colombier	MOVW	8(R10), R13
58*ce95e1b3SDavid du Colombier	BNE	R12,R13, ne1
59*ce95e1b3SDavid du Colombier	MOVW	12(R9), R12
60*ce95e1b3SDavid du Colombier	MOVW	12(R10), R13
61*ce95e1b3SDavid du Colombier	BNE	R12,R13, ne1
62*ce95e1b3SDavid du Colombier	ADD	$16, R9
63*ce95e1b3SDavid du Colombier	ADD	$16, R10
64*ce95e1b3SDavid du Colombier	JMP	l3
65*ce95e1b3SDavid du Colombier
66*ce95e1b3SDavid du Colombier/*
67*ce95e1b3SDavid du Colombier * turn R15 into end pointer1-3
68*ce95e1b3SDavid du Colombier * cmp 4 at a time while theres room
69*ce95e1b3SDavid du Colombier */
70*ce95e1b3SDavid du Colombierl4:
71*ce95e1b3SDavid du Colombier	ADD	$-3,R11, R15
72*ce95e1b3SDavid du Colombierl5:
73*ce95e1b3SDavid du Colombier	SLTU	R15,R9, R8
74*ce95e1b3SDavid du Colombier	BEQ	R8, out
75*ce95e1b3SDavid du Colombier	MOVW	0(R9), R12
76*ce95e1b3SDavid du Colombier	MOVW	0(R10), R13
77*ce95e1b3SDavid du Colombier	ADD	$4, R9
78*ce95e1b3SDavid du Colombier	BNE	R12,R13, ne1
79*ce95e1b3SDavid du Colombier	ADD	$4, R10
80*ce95e1b3SDavid du Colombier	JMP	l5
81*ce95e1b3SDavid du Colombier
82*ce95e1b3SDavid du Colombier/*
83*ce95e1b3SDavid du Colombier * last loop, cmp byte at a time
84*ce95e1b3SDavid du Colombier */
85*ce95e1b3SDavid du Colombierout:
86*ce95e1b3SDavid du Colombier	SLTU	R11,R9, R8
87*ce95e1b3SDavid du Colombier	BEQ	R8, ret
88*ce95e1b3SDavid du Colombier	MOVBU	0(R9), R14
89*ce95e1b3SDavid du Colombier	MOVBU	0(R10), R15
90*ce95e1b3SDavid du Colombier	ADD	$1, R9
91*ce95e1b3SDavid du Colombier	BNE	R14,R15, ne
92*ce95e1b3SDavid du Colombier	ADD	$1, R10
93*ce95e1b3SDavid du Colombier	JMP	out
94*ce95e1b3SDavid du Colombier
95*ce95e1b3SDavid du Colombier/*
96*ce95e1b3SDavid du Colombier * compare bytes in R12 and R13, lsb first
97*ce95e1b3SDavid du Colombier */
98*ce95e1b3SDavid du Colombierne1:
99*ce95e1b3SDavid du Colombier	MOVW	$0xff, R8
100*ce95e1b3SDavid du Colombierne1x:
101*ce95e1b3SDavid du Colombier	AND	R8, R12, R14
102*ce95e1b3SDavid du Colombier	AND	R8, R13, R15
103*ce95e1b3SDavid du Colombier	BNE	R14, R15, ne
104*ce95e1b3SDavid du Colombier	SLL	$8, R8
105*ce95e1b3SDavid du Colombier	BNE	R8, ne1x
106*ce95e1b3SDavid du Colombier	JMP	ret
107*ce95e1b3SDavid du Colombier
108*ce95e1b3SDavid du Colombierne:
109*ce95e1b3SDavid du Colombier	SLTU	R14,R15, R8
110*ce95e1b3SDavid du Colombier	BNE	R8, ret
111*ce95e1b3SDavid du Colombier	MOVW	$-1,R8
112*ce95e1b3SDavid du Colombierret:
113*ce95e1b3SDavid du Colombier	RET
114*ce95e1b3SDavid du Colombier	END
115