xref: /plan9-contrib/sys/src/ape/lib/ap/spim/memcmp.s (revision 12b1df16f1a9233fb47d4260d51ef450cc19c368)
1	TEXT	memcmp(SB), $0
2MOVW R1, 0(FP)
3
4/*
5 * performance:
6 *	alligned about 1.0us/call and 17.4mb/sec
7 *	unalligned is about 3.1mb/sec
8 */
9
10	MOVW	n+8(FP), R3		/* R3 is count */
11	MOVW	s1+0(FP), R4		/* R4 is pointer1 */
12	MOVW	s2+4(FP), R5		/* R5 is pointer2 */
13	ADDU	R3,R4, R6		/* R6 is end pointer1 */
14
15	JMP	out		// XXX little endian
16
17/*
18 * if not at least 4 chars,
19 * dont even mess around.
20 * 3 chars to guarantee any
21 * rounding up to a word
22 * boundary and 4 characters
23 * to get at least maybe one
24 * full word cmp.
25 */
26	SGT	$4,R3, R1
27	BNE	R1, out
28
29/*
30 * test if both pointers
31 * are similarly word alligned
32 */
33	XOR	R4,R5, R1
34	AND	$3, R1
35	BNE	R1, out
36
37/*
38 * byte at a time to word allign
39 */
40l1:
41	AND	$3,R4, R1
42	BEQ	R1, l2
43	MOVB	0(R4), R8
44	MOVB	0(R5), R9
45	ADDU	$1, R4
46	BNE	R8,R9, ne
47	ADDU	$1, R5
48	JMP	l1
49
50/*
51 * turn R3 into end pointer1-15
52 * cmp 16 at a time while theres room
53 */
54l2:
55	ADDU	$-15,R6, R3
56l3:
57	SGTU	R3,R4, R1
58	BEQ	R1, l4
59	MOVW	0(R4), R8
60	MOVW	0(R5), R9
61	MOVW	4(R4), R10
62	BNE	R8,R9, ne
63	MOVW	4(R5), R11
64	MOVW	8(R4), R8
65	BNE	R10,R11, ne1
66	MOVW	8(R5), R9
67	MOVW	12(R4), R10
68	BNE	R8,R9, ne
69	MOVW	12(R5), R11
70	ADDU	$16, R4
71	BNE	R10,R11, ne1
72	BNE	R8,R9, ne
73	ADDU	$16, R5
74	JMP	l3
75
76/*
77 * turn R3 into end pointer1-3
78 * cmp 4 at a time while theres room
79 */
80l4:
81	ADDU	$-3,R6, R3
82l5:
83	SGTU	R3,R4, R1
84	BEQ	R1, out
85	MOVW	0(R4), R8
86	MOVW	0(R5), R9
87	ADDU	$4, R4
88	BNE	R8,R9, ne	/* only works because big endian */
89	ADDU	$4, R5
90	JMP	l5
91
92/*
93 * last loop, cmp byte at a time
94 */
95out:
96	SGTU	R6,R4, R1
97	BEQ	R1, ret
98	MOVB	0(R4), R8
99	MOVB	0(R5), R9
100	ADDU	$1, R4
101	BNE	R8,R9, ne
102	ADDU	$1, R5
103	JMP	out
104
105ne1:
106	SGTU	R10,R11, R1
107	BNE	R1, ret
108	MOVW	$-1,R1
109	RET
110ne:
111	SGTU	R8,R9, R1
112	BNE	R1, ret
113	MOVW	$-1,R1
114ret:
115	RET
116	END
117