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