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