Merge branch 'work.splice_read' of git://git.kernel.org/pub/scm/linux/kernel/git...
[cascardo/linux.git] / arch / arc / lib / strcmp-archs.S
1 /*
2  * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com)
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  */
8
9 #include <linux/linkage.h>
10
11 ENTRY_CFI(strcmp)
12         or      r2, r0, r1
13         bmsk_s  r2, r2, 1
14         brne    r2, 0, @.Lcharloop
15
16 ;;; s1 and s2 are word aligned
17         ld.ab   r2, [r0, 4]
18
19         mov_s   r12, 0x01010101
20         ror     r11, r12
21         .align  4
22 .LwordLoop:
23         ld.ab   r3, [r1, 4]
24         ;; Detect NULL char in str1
25         sub     r4, r2, r12
26         ld.ab   r5, [r0, 4]
27         bic     r4, r4, r2
28         and     r4, r4, r11
29         brne.d.nt       r4, 0, .LfoundNULL
30         ;; Check if the read locations are the same
31         cmp     r2, r3
32         beq.d   .LwordLoop
33         mov.eq  r2, r5
34
35         ;; A match is found, spot it out
36 #ifdef __LITTLE_ENDIAN__
37         swape   r3, r3
38         mov_s   r0, 1
39         swape   r2, r2
40 #else
41         mov_s   r0, 1
42 #endif
43         cmp_s   r2, r3
44         j_s.d   [blink]
45         bset.lo r0, r0, 31
46
47         .align 4
48 .LfoundNULL:
49 #ifdef __BIG_ENDIAN__
50         swape   r4, r4
51         swape   r2, r2
52         swape   r3, r3
53 #endif
54         ;; Find null byte
55         ffs     r0, r4
56         bmsk    r2, r2, r0
57         bmsk    r3, r3, r0
58         swape   r2, r2
59         swape   r3, r3
60         ;; make the return value
61         sub.f   r0, r2, r3
62         mov.hi  r0, 1
63         j_s.d   [blink]
64         bset.lo r0, r0, 31
65
66         .align 4
67 .Lcharloop:
68         ldb.ab  r2, [r0, 1]
69         ldb.ab  r3, [r1, 1]
70         nop
71         breq    r2, 0, .Lcmpend
72         breq    r2, r3, .Lcharloop
73
74         .align 4
75 .Lcmpend:
76         j_s.d   [blink]
77         sub     r0, r2, r3
78 END_CFI(strcmp)