xref: /plan9/sys/src/ape/lib/ap/power/memcmp.s (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier	TEXT	memcmp(SB), $0
2*7dd7cddfSDavid du Colombier#define	BDNZ	BC	16,0,
3*7dd7cddfSDavid du Colombier	MOVW R3, s1+0(FP)		/* R3 is pointer1 */
4*7dd7cddfSDavid du Colombier
5*7dd7cddfSDavid du Colombier/*
6*7dd7cddfSDavid du Colombier * performance:
7*7dd7cddfSDavid du Colombier *	67mb/sec aligned; 16mb/sec unaligned
8*7dd7cddfSDavid du Colombier */
9*7dd7cddfSDavid du Colombier
10*7dd7cddfSDavid du Colombier	MOVW	n+8(FP), R4		/* R4 is count */
11*7dd7cddfSDavid du Colombier	MOVW	s2+4(FP), R5		/* R5 is pointer2 */
12*7dd7cddfSDavid du Colombier
13*7dd7cddfSDavid du Colombier/*
14*7dd7cddfSDavid du Colombier * let LSW do the work for 4 characters or less; aligned and unaligned
15*7dd7cddfSDavid du Colombier */
16*7dd7cddfSDavid du Colombier	CMP	R4, $0
17*7dd7cddfSDavid du Colombier	BLE	eq
18*7dd7cddfSDavid du Colombier	CMP	R4, $4
19*7dd7cddfSDavid du Colombier	BLE	out
20*7dd7cddfSDavid du Colombier
21*7dd7cddfSDavid du Colombier	XOR	R3, R5, R9
22*7dd7cddfSDavid du Colombier	ANDCC	$3, R9
23*7dd7cddfSDavid du Colombier	BNE	l4	/* pointers misaligned; use LSW loop */
24*7dd7cddfSDavid du Colombier
25*7dd7cddfSDavid du Colombier/*
26*7dd7cddfSDavid du Colombier * do enough bytes to align pointers
27*7dd7cddfSDavid du Colombier */
28*7dd7cddfSDavid du Colombier	ANDCC	$3,R3, R9
29*7dd7cddfSDavid du Colombier	BEQ	l2
30*7dd7cddfSDavid du Colombier	SUBC	R9, $4, R9
31*7dd7cddfSDavid du Colombier	MOVW	R9, XER
32*7dd7cddfSDavid du Colombier	LSW	(R3), R10
33*7dd7cddfSDavid du Colombier	ADD	R9, R3
34*7dd7cddfSDavid du Colombier	LSW	(R5), R14
35*7dd7cddfSDavid du Colombier	ADD	R9, R5
36*7dd7cddfSDavid du Colombier	SUB	R9, R4
37*7dd7cddfSDavid du Colombier	CMPU	R10, R14
38*7dd7cddfSDavid du Colombier	BNE	ne
39*7dd7cddfSDavid du Colombier
40*7dd7cddfSDavid du Colombier/*
41*7dd7cddfSDavid du Colombier * compare 16 at a time
42*7dd7cddfSDavid du Colombier */
43*7dd7cddfSDavid du Colombierl2:
44*7dd7cddfSDavid du Colombier	SRAWCC	$4, R4, R9
45*7dd7cddfSDavid du Colombier	BLE	l4
46*7dd7cddfSDavid du Colombier	MOVW	R9, CTR
47*7dd7cddfSDavid du Colombier	SUB	$4, R3
48*7dd7cddfSDavid du Colombier	SUB	$4, R5
49*7dd7cddfSDavid du Colombierl3:
50*7dd7cddfSDavid du Colombier	MOVWU	4(R3), R10
51*7dd7cddfSDavid du Colombier	MOVWU	4(R5), R12
52*7dd7cddfSDavid du Colombier	MOVWU	4(R3), R11
53*7dd7cddfSDavid du Colombier	MOVWU	4(R5), R13
54*7dd7cddfSDavid du Colombier	CMPU	R10, R12
55*7dd7cddfSDavid du Colombier	BNE	ne
56*7dd7cddfSDavid du Colombier	MOVWU	4(R3), R10
57*7dd7cddfSDavid du Colombier	MOVWU	4(R5), R12
58*7dd7cddfSDavid du Colombier	CMPU	R11, R13
59*7dd7cddfSDavid du Colombier	BNE	ne
60*7dd7cddfSDavid du Colombier	MOVWU	4(R3), R11
61*7dd7cddfSDavid du Colombier	MOVWU	4(R5), R13
62*7dd7cddfSDavid du Colombier	CMPU	R10, R12
63*7dd7cddfSDavid du Colombier	BNE	ne
64*7dd7cddfSDavid du Colombier	CMPU	R11, R13
65*7dd7cddfSDavid du Colombier	BNE	ne
66*7dd7cddfSDavid du Colombier	BDNZ	l3
67*7dd7cddfSDavid du Colombier	ADD	$4, R3
68*7dd7cddfSDavid du Colombier	ADD	$4, R5
69*7dd7cddfSDavid du Colombier	RLWNMCC	$0, R4, $15, R4	/* residue */
70*7dd7cddfSDavid du Colombier	BEQ	eq
71*7dd7cddfSDavid du Colombier
72*7dd7cddfSDavid du Colombier/*
73*7dd7cddfSDavid du Colombier * do remaining words with LSW; also does unaligned case
74*7dd7cddfSDavid du Colombier */
75*7dd7cddfSDavid du Colombierl4:
76*7dd7cddfSDavid du Colombier	SRAWCC	$2, R4, R9
77*7dd7cddfSDavid du Colombier	BLE	out
78*7dd7cddfSDavid du Colombier	MOVW	R9, CTR
79*7dd7cddfSDavid du Colombierl5:
80*7dd7cddfSDavid du Colombier	LSW	(R3), $4, R10
81*7dd7cddfSDavid du Colombier	ADD	$4, R3
82*7dd7cddfSDavid du Colombier	LSW	(R5), $4, R11
83*7dd7cddfSDavid du Colombier	ADD	$4, R5
84*7dd7cddfSDavid du Colombier	CMPU	R10, R11
85*7dd7cddfSDavid du Colombier	BNE	ne
86*7dd7cddfSDavid du Colombier	BDNZ	l5
87*7dd7cddfSDavid du Colombier	RLWNMCC	$0, R4, $3, R4	/* residue */
88*7dd7cddfSDavid du Colombier	BEQ	eq
89*7dd7cddfSDavid du Colombier
90*7dd7cddfSDavid du Colombier/*
91*7dd7cddfSDavid du Colombier * do remaining bytes with final LSW
92*7dd7cddfSDavid du Colombier */
93*7dd7cddfSDavid du Colombierout:
94*7dd7cddfSDavid du Colombier	MOVW	R4, XER
95*7dd7cddfSDavid du Colombier	LSW	(R3), R10
96*7dd7cddfSDavid du Colombier	LSW	(R5), R11
97*7dd7cddfSDavid du Colombier	CMPU	R10, R11
98*7dd7cddfSDavid du Colombier	BNE	ne
99*7dd7cddfSDavid du Colombier
100*7dd7cddfSDavid du Colombiereq:
101*7dd7cddfSDavid du Colombier	MOVW	$0, R3
102*7dd7cddfSDavid du Colombier	RETURN
103*7dd7cddfSDavid du Colombier
104*7dd7cddfSDavid du Colombierne:
105*7dd7cddfSDavid du Colombier	MOVW	$1, R3
106*7dd7cddfSDavid du Colombier	BGE	ret
107*7dd7cddfSDavid du Colombier	MOVW	$-1,R3
108*7dd7cddfSDavid du Colombierret:
109*7dd7cddfSDavid du Colombier	RETURN
110*7dd7cddfSDavid du Colombier	END
111