xref: /plan9-contrib/sys/src/libc/sparc/memcmp.s (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*3e12c5d1SDavid du Colombier	TEXT	memcmp(SB), $0
2*3e12c5d1SDavid du Colombier
3*3e12c5d1SDavid du Colombier/*
4*3e12c5d1SDavid du Colombier * performance:
5*3e12c5d1SDavid du Colombier *	(tba)
6*3e12c5d1SDavid du Colombier */
7*3e12c5d1SDavid du Colombier
8*3e12c5d1SDavid du Colombier	MOVW	R7, 0(FP)
9*3e12c5d1SDavid du Colombier	MOVW	n+8(FP), R9		/* R9 is count */
10*3e12c5d1SDavid du Colombier	MOVW	s1+0(FP), R10		/* R10 is pointer1 */
11*3e12c5d1SDavid du Colombier	MOVW	s2+4(FP), R11		/* R11 is pointer2 */
12*3e12c5d1SDavid du Colombier	ADD	R9,R10, R12		/* R12 is end pointer1 */
13*3e12c5d1SDavid du Colombier
14*3e12c5d1SDavid du Colombier/*
15*3e12c5d1SDavid du Colombier * if not at least 4 chars,
16*3e12c5d1SDavid du Colombier * dont even mess around.
17*3e12c5d1SDavid du Colombier * 3 chars to guarantee any
18*3e12c5d1SDavid du Colombier * rounding up to a word
19*3e12c5d1SDavid du Colombier * boundary and 4 characters
20*3e12c5d1SDavid du Colombier * to get at least maybe one
21*3e12c5d1SDavid du Colombier * full word cmp.
22*3e12c5d1SDavid du Colombier */
23*3e12c5d1SDavid du Colombier	SUBCC	$4,R9, R0
24*3e12c5d1SDavid du Colombier	BL	out
25*3e12c5d1SDavid du Colombier
26*3e12c5d1SDavid du Colombier/*
27*3e12c5d1SDavid du Colombier * test if both pointers
28*3e12c5d1SDavid du Colombier * are similarly word alligned
29*3e12c5d1SDavid du Colombier */
30*3e12c5d1SDavid du Colombier	XOR	R10,R11, R7
31*3e12c5d1SDavid du Colombier	ANDCC	$3,R7, R0
32*3e12c5d1SDavid du Colombier	BNE	out
33*3e12c5d1SDavid du Colombier
34*3e12c5d1SDavid du Colombier/*
35*3e12c5d1SDavid du Colombier * byte at a time to word allign
36*3e12c5d1SDavid du Colombier */
37*3e12c5d1SDavid du Colombierl1:
38*3e12c5d1SDavid du Colombier	ANDCC	$3,R10, R0
39*3e12c5d1SDavid du Colombier	BE	l2
40*3e12c5d1SDavid du Colombier	MOVBU	0(R10), R16
41*3e12c5d1SDavid du Colombier	MOVBU	0(R11), R17
42*3e12c5d1SDavid du Colombier	ADD	$1, R10
43*3e12c5d1SDavid du Colombier	SUBCC	R16,R17, R0
44*3e12c5d1SDavid du Colombier	BNE	ne
45*3e12c5d1SDavid du Colombier	ADD	$1, R11
46*3e12c5d1SDavid du Colombier	JMP	l1
47*3e12c5d1SDavid du Colombier
48*3e12c5d1SDavid du Colombier/*
49*3e12c5d1SDavid du Colombier * turn R9 into end pointer1-15
50*3e12c5d1SDavid du Colombier * cmp 16 at a time while theres room
51*3e12c5d1SDavid du Colombier */
52*3e12c5d1SDavid du Colombierl2:
53*3e12c5d1SDavid du Colombier	SUB	$15,R12, R9
54*3e12c5d1SDavid du Colombierl3:
55*3e12c5d1SDavid du Colombier	SUBCC	R10,R9, R0
56*3e12c5d1SDavid du Colombier	BLEU	l4
57*3e12c5d1SDavid du Colombier	MOVW	0(R10), R16
58*3e12c5d1SDavid du Colombier	MOVW	0(R11), R17
59*3e12c5d1SDavid du Colombier	MOVW	4(R10), R18
60*3e12c5d1SDavid du Colombier	SUBCC	R16,R17, R0
61*3e12c5d1SDavid du Colombier	BNE	ne
62*3e12c5d1SDavid du Colombier	MOVW	4(R11), R19
63*3e12c5d1SDavid du Colombier	MOVW	8(R10), R16
64*3e12c5d1SDavid du Colombier	SUBCC	R18,R19, R0
65*3e12c5d1SDavid du Colombier	BNE	ne
66*3e12c5d1SDavid du Colombier	MOVW	8(R11), R17
67*3e12c5d1SDavid du Colombier	MOVW	12(R10), R18
68*3e12c5d1SDavid du Colombier	SUBCC	R16,R17, R0
69*3e12c5d1SDavid du Colombier	BNE	ne
70*3e12c5d1SDavid du Colombier	MOVW	12(R11), R19
71*3e12c5d1SDavid du Colombier	ADD	$16, R10
72*3e12c5d1SDavid du Colombier	SUBCC	R18,R19, R0
73*3e12c5d1SDavid du Colombier	BNE	ne
74*3e12c5d1SDavid du Colombier	SUBCC	R16,R17, R0
75*3e12c5d1SDavid du Colombier	BNE	ne
76*3e12c5d1SDavid du Colombier	ADD	$16, R11
77*3e12c5d1SDavid du Colombier	JMP	l3
78*3e12c5d1SDavid du Colombier
79*3e12c5d1SDavid du Colombier/*
80*3e12c5d1SDavid du Colombier * turn R9 into end pointer1-3
81*3e12c5d1SDavid du Colombier * cmp 4 at a time while theres room
82*3e12c5d1SDavid du Colombier */
83*3e12c5d1SDavid du Colombierl4:
84*3e12c5d1SDavid du Colombier	SUB	$3,R12, R9
85*3e12c5d1SDavid du Colombierl5:
86*3e12c5d1SDavid du Colombier	SUBCC	R10,R9, R0
87*3e12c5d1SDavid du Colombier	BLEU	out
88*3e12c5d1SDavid du Colombier	MOVW	0(R10), R16
89*3e12c5d1SDavid du Colombier	MOVW	0(R11), R17
90*3e12c5d1SDavid du Colombier	ADD	$4, R10
91*3e12c5d1SDavid du Colombier	SUBCC	R16,R17, R0		/* only works because big endian */
92*3e12c5d1SDavid du Colombier	BNE	ne
93*3e12c5d1SDavid du Colombier	ADD	$4, R11
94*3e12c5d1SDavid du Colombier	JMP	l5
95*3e12c5d1SDavid du Colombier
96*3e12c5d1SDavid du Colombier/*
97*3e12c5d1SDavid du Colombier * last loop, cmp byte at a time
98*3e12c5d1SDavid du Colombier */
99*3e12c5d1SDavid du Colombierout:
100*3e12c5d1SDavid du Colombier	SUBCC	R10,R12, R0
101*3e12c5d1SDavid du Colombier	BE	zero
102*3e12c5d1SDavid du Colombier	MOVBU	0(R10), R16
103*3e12c5d1SDavid du Colombier	MOVBU	0(R11), R17
104*3e12c5d1SDavid du Colombier	ADD	$1, R10
105*3e12c5d1SDavid du Colombier	SUBCC	R16,R17, R0
106*3e12c5d1SDavid du Colombier	BNE	ne
107*3e12c5d1SDavid du Colombier	ADD	$1, R11
108*3e12c5d1SDavid du Colombier	JMP	out
109*3e12c5d1SDavid du Colombier
110*3e12c5d1SDavid du Colombierne:
111*3e12c5d1SDavid du Colombier	BGU	plus
112*3e12c5d1SDavid du Colombier	MOVW	$1, R7
113*3e12c5d1SDavid du Colombier	RETURN
114*3e12c5d1SDavid du Colombierplus:
115*3e12c5d1SDavid du Colombier	MOVW	$-1, R7
116*3e12c5d1SDavid du Colombier	RETURN
117*3e12c5d1SDavid du Colombier
118*3e12c5d1SDavid du Colombierzero:
119*3e12c5d1SDavid du Colombier	MOVW	R0, R7
120*3e12c5d1SDavid du Colombier	RETURN
121