1/*
2 * Copyright (C) 2017 Hangzhou C-SKY Microsystems co.,ltd.
3 *
4 * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB
5 * in this tarball.
6 */
7
8#include <features.h>
9#include <endian.h>
10
11#ifdef WANT_WIDE
12# define Wstrcmp wcscmp
13# define Wstrcoll wcscoll
14#else
15# define Wstrcmp strcmp
16# define Wstrcoll strcoll
17#endif
18
19/* FIXME attention!!! it may be a bug when WANT_WIDE define */
20/*libc_hidden_proto(Wstrcmp)*/
21	.align 2
22	.global Wstrcmp
23	.type   Wstrcmp, @function
24Wstrcmp:
25    mov        r6, r2
26
27    or         r2, r3
28    andi       r2, 0x3
29    cmpnei     r2, 0x0     /* d or s is aligned ?*/
30    bt         4f          /* if not aligned, goto 4f*/
31    1:                   /* if aligned, load word each time.*/
32    ldw        r2, (r6, 0)
33    ldw        r7, (r3, 0)
34    cmpne      r2, r7
35    bt         1f       /* if d[i] != s[i], goto 1f */
36    tstnbz     r2       /* if d[i] == s[i], check if d or s is at the end. */
37    bf         3f       /* if at the end, goto 3f (finish comparing) */
38
39    ldw        r2, (r6, 4)
40    ldw        r7, (r3, 4)
41    cmpne      r2, r7
42    bt         1f
43    tstnbz     r2
44    bf         3f
45
46    ldw        r2, (r6, 8)
47    ldw        r7, (r3, 8)
48    cmpne      r2, r7
49    bt         1f
50    tstnbz     r2
51    bf         3f
52
53    ldw        r2, (r6, 12)
54    ldw        r7, (r3, 12)
55    cmpne      r2, r7
56    bt         1f
57    tstnbz     r2
58    bf         3f
59
60    ldw        r2, (r6, 16)
61    ldw        r7, (r3, 16)
62    cmpne      r2, r7
63    bt         1f
64    tstnbz     r2
65    bf         3f
66
67    ldw        r2, (r6, 20)
68    ldw        r7, (r3, 20)
69    cmpne      r2, r7
70    bt         1f
71    tstnbz     r2
72    bf         3f
73
74    ldw        r2, (r6, 24)
75    ldw        r7, (r3, 24)
76    cmpne      r2, r7
77    bt         1f
78    tstnbz     r2
79    bf         3f
80
81    ldw        r2, (r6, 28)
82    ldw        r7, (r3, 28)
83    cmpne      r2, r7
84    bt         1f
85    tstnbz     r2
86    bf         3f
87
88    addi       r6, 32
89    addi       r3, 32
90    br         1b
91
92#ifdef __CSKYBE__
93    /* d[i] != s[i] in word, so we check byte 0 ? */
94    1:
95    xtrb0      r1, r2
96    mov        r4, r1
97    xtrb0      r1, r7
98    cmpne      r4, r1
99    bt         2f
100    cmpnei     r4, 0
101    bf         2f
102
103    /* d[i] != s[i] in word, so we check byte 1 ? */
104    xtrb1      r1, r2
105    mov        r4, r1
106    xtrb1      r1, r7
107    cmpne      r4, r1
108    bt         2f
109    cmpnei     r4, 0
110    bf         2f
111
112    /* d[i] != s[i] in word, so we check byte 1 ? */
113    xtrb2      r1, r2
114    mov        r4, r1
115    xtrb2      r1, r7
116    cmpne      r4, r1
117    bt         2f
118    cmpnei     r4, 0
119    bf         2f
120
121    /* d[i] != s[i] in word, so we check byte 1 ? */
122    xtrb3      r1, r2
123    mov        r4, r1
124    xtrb3      r1, r7
125
126#else /* little endian */
127    /* d[i] != s[i] in word, so we check byte 0 ? */
1281:
129    xtrb3      r1, r2
130    mov        r4, r1
131    xtrb3      r1, r7
132    cmpne      r4, r1
133    bt         2f
134    cmpnei     r4, 0
135    bf         2f
136
137    /* d[i] != s[i] in word, so we check byte 1 ? */
138    xtrb2      r1, r2
139    mov        r4, r1
140    xtrb2      r1, r7
141    cmpne      r4, r1
142    bt         2f
143    cmpnei     r4, 0
144    bf         2f
145
146    /* d[i] != s[i] in word, so we check byte 1 ? */
147    xtrb1      r1, r2
148    mov        r4, r1
149    xtrb1      r1, r7
150    cmpne      r4, r1
151    bt         2f
152    cmpnei     r4, 0
153    bf         2f
154
155    /* d[i] != s[i] in word, so we check byte 1 ? */
156    xtrb0      r1, r2
157    mov        r4, r1
158    xtrb0      r1, r7
159
160#endif
161    /* get the result when d[i] != s[i] */
1622:
163    subu       r4, r1
164    mov        r2, r4
165    jmp        r15
166
167    /* return when d[i] == s[i] */
1683:
169    subu       r2, r7
170    jmp        r15
171
172     /* cmp when d or s is not aligned */
1734:
174     ldb       r2, (r6,0)
175     ldb       r7, (r3, 0)
176     cmpne     r2, r7
177     bt        3b
178     addi      r3, 1
179     addi      r6, 1
180     cmpnei    r2, 0
181     bt        4b
182     jmp       r15
183
184     .size   Wstrcmp, .-Wstrcmp
185
186libc_hidden_def(Wstrcmp)
187.weak Wstrcmp
188#ifndef __UCLIBC_HAS_LOCALE__
189/* libc_hidden_proto(Wstrcoll) */
190strong_alias(Wstrcmp,Wstrcoll)
191libc_hidden_def(Wstrcoll)
192#endif
193