Linux 3.12.28
[linux/fpc-iii.git] / arch / arc / lib / memcmp.S
blobbc813d55b6c3ae5ce3bd2d559ca15a4adfb5593e
1 /*
2  * Copyright (C) 2004, 2007-2010, 2011-2012 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  */
9 #include <asm/linkage.h>
11 #ifdef __LITTLE_ENDIAN__
12 #define WORD2 r2
13 #define SHIFT r3
14 #else /* BIG ENDIAN */
15 #define WORD2 r3
16 #define SHIFT r2
17 #endif
19 ARC_ENTRY memcmp
20         or      r12,r0,r1
21         asl_s   r12,r12,30
22         sub     r3,r2,1
23         brls    r2,r12,.Lbytewise
24         ld      r4,[r0,0]
25         ld      r5,[r1,0]
26         lsr.f   lp_count,r3,3
27         lpne    .Loop_end
28         ld_s    WORD2,[r0,4]
29         ld_s    r12,[r1,4]
30         brne    r4,r5,.Leven
31         ld.a    r4,[r0,8]
32         ld.a    r5,[r1,8]
33         brne    WORD2,r12,.Lodd
34 .Loop_end:
35         asl_s   SHIFT,SHIFT,3
36         bhs_s   .Last_cmp
37         brne    r4,r5,.Leven
38         ld      r4,[r0,4]
39         ld      r5,[r1,4]
40 #ifdef __LITTLE_ENDIAN__
41         nop_s
42         ; one more load latency cycle
43 .Last_cmp:
44         xor     r0,r4,r5
45         bset    r0,r0,SHIFT
46         sub_s   r1,r0,1
47         bic_s   r1,r1,r0
48         norm    r1,r1
49         b.d     .Leven_cmp
50         and     r1,r1,24
51 .Leven:
52         xor     r0,r4,r5
53         sub_s   r1,r0,1
54         bic_s   r1,r1,r0
55         norm    r1,r1
56         ; slow track insn
57         and     r1,r1,24
58 .Leven_cmp:
59         asl     r2,r4,r1
60         asl     r12,r5,r1
61         lsr_s   r2,r2,1
62         lsr_s   r12,r12,1
63         j_s.d   [blink]
64         sub     r0,r2,r12
65         .balign 4
66 .Lodd:
67         xor     r0,WORD2,r12
68         sub_s   r1,r0,1
69         bic_s   r1,r1,r0
70         norm    r1,r1
71         ; slow track insn
72         and     r1,r1,24
73         asl_s   r2,r2,r1
74         asl_s   r12,r12,r1
75         lsr_s   r2,r2,1
76         lsr_s   r12,r12,1
77         j_s.d   [blink]
78         sub     r0,r2,r12
79 #else /* BIG ENDIAN */
80 .Last_cmp:
81         neg_s   SHIFT,SHIFT
82         lsr     r4,r4,SHIFT
83         lsr     r5,r5,SHIFT
84         ; slow track insn
85 .Leven:
86         sub.f   r0,r4,r5
87         mov.ne  r0,1
88         j_s.d   [blink]
89         bset.cs r0,r0,31
90 .Lodd:
91         cmp_s   WORD2,r12
93         mov_s   r0,1
94         j_s.d   [blink]
95         bset.cs r0,r0,31
96 #endif /* ENDIAN */
97         .balign 4
98 .Lbytewise:
99         breq    r2,0,.Lnil
100         ldb     r4,[r0,0]
101         ldb     r5,[r1,0]
102         lsr.f   lp_count,r3
103         lpne    .Lbyte_end
104         ldb_s   r3,[r0,1]
105         ldb     r12,[r1,1]
106         brne    r4,r5,.Lbyte_even
107         ldb.a   r4,[r0,2]
108         ldb.a   r5,[r1,2]
109         brne    r3,r12,.Lbyte_odd
110 .Lbyte_end:
111         bcc     .Lbyte_even
112         brne    r4,r5,.Lbyte_even
113         ldb_s   r3,[r0,1]
114         ldb_s   r12,[r1,1]
115 .Lbyte_odd:
116         j_s.d   [blink]
117         sub     r0,r3,r12
118 .Lbyte_even:
119         j_s.d   [blink]
120         sub     r0,r4,r5
121 .Lnil:
122         j_s.d   [blink]
123         mov     r0,0
124 ARC_EXIT memcmp