]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libc/arm/strcmp.s
vt: but not too fast :-)
[plan9front.git] / sys / src / libc / arm / strcmp.s
1 TEXT strcmp(SB), $0
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