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