xref: /plan9/sys/src/ape/lib/ap/arm/strcmp.s (revision 514807136a8518a9c368e175000825c6e1429f43)
1TEXT strcmp(SB), $-4
2	MOVW	R0, R1
3	MOVW	s2+4(FP), R2
4
5	MOVW	$0xFF, R3		/* mask */
6
7_align:					/* align s1 on 4 */
8	TST	$3, R1
9	BEQ	_aligned
10
11	MOVBU.P	1(R1), R4		/* implicit write back */
12	MOVBU.P	1(R2), R8		/* implicit write back */
13	SUB.S	R8, R4, R0
14	BNE	_return
15	CMP	$0, R4
16	BEQ	_return
17	B	_align
18
19_aligned:				/* is s2 now aligned? */
20	TST	$3, R2
21	BNE	_unaligned
22
23_aloop:
24	MOVW.P	4(R1), R5		/* 4 at a time */
25	MOVW.P	4(R2), R7
26
27	AND	R5, R3, R4
28	AND	R7, R3, R8
29	SUB.S	R8, R4, R0
30	BNE	_return
31	CMP	$0, R4
32	BEQ	_return
33
34	AND	R5>>8, R3, R4
35	AND	R7>>8, R3, R8
36	SUB.S	R8, R4, R0
37	BNE	_return
38	CMP	$0, R4
39	BEQ	_return
40
41	AND	R5>>16, R3, R4
42	AND	R7>>16, R3, R8
43	SUB.S	R8, R4, R0
44	BNE	_return
45	CMP	$0, R4
46	BEQ	_return
47
48	AND	R5>>24, R3, R4
49	AND	R7>>24, R3, R8
50	SUB.S	R8, R4, R0
51	BNE	_return
52	CMP	$0, R4
53	BEQ	_return
54
55	B	_aloop
56
57_return:
58	RET
59
60_unaligned:
61	MOVBU.P	1(R1), R4		/* implicit write back */
62	MOVBU.P	1(R2), R8		/* implicit write back */
63	SUB.S	R8, R4, R0
64	BNE	_return
65	CMP	$0, R4
66	BEQ	_return
67	B	_unaligned
68