Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
0003 
0004 #include <linux/linkage.h>
0005 #include "sysdep.h"
0006 
0007 ENTRY(strcmp)
0008     mov a3, a0
0009     /* Check if the s1 addr is aligned.  */
0010     xor a2, a3, a1
0011     andi    a2, 0x3
0012     bnez    a2, 7f
0013     andi    t1, a0, 0x3
0014     bnez    t1, 5f
0015 
0016 1:
0017     /* If aligned, load word each time.  */
0018     ldw t0, (a3, 0)
0019     ldw t1, (a1, 0)
0020     /* If s1[i] != s2[i], goto 2f.  */
0021     cmpne   t0, t1
0022     bt      2f
0023     /* If s1[i] == s2[i], check if s1 or s2 is at the end.  */
0024     tstnbz  t0
0025     /* If at the end, goto 3f (finish comparing).  */
0026     bf  3f
0027 
0028     ldw t0, (a3, 4)
0029     ldw t1, (a1, 4)
0030     cmpne   t0, t1
0031     bt  2f
0032     tstnbz  t0
0033     bf  3f
0034 
0035     ldw t0, (a3, 8)
0036     ldw t1, (a1, 8)
0037     cmpne   t0, t1
0038     bt  2f
0039     tstnbz  t0
0040     bf  3f
0041 
0042     ldw t0, (a3, 12)
0043     ldw t1, (a1, 12)
0044     cmpne   t0, t1
0045     bt  2f
0046     tstnbz  t0
0047     bf  3f
0048 
0049     ldw t0, (a3, 16)
0050     ldw t1, (a1, 16)
0051     cmpne   t0, t1
0052     bt  2f
0053     tstnbz  t0
0054     bf  3f
0055 
0056     ldw t0, (a3, 20)
0057     ldw t1, (a1, 20)
0058     cmpne   t0, t1
0059     bt  2f
0060     tstnbz  t0
0061     bf  3f
0062 
0063     ldw t0, (a3, 24)
0064     ldw t1, (a1, 24)
0065     cmpne   t0, t1
0066     bt  2f
0067     tstnbz  t0
0068     bf  3f
0069 
0070     ldw t0, (a3, 28)
0071     ldw t1, (a1, 28)
0072     cmpne   t0, t1
0073     bt  2f
0074     tstnbz  t0
0075     bf  3f
0076 
0077     addi    a3, 32
0078     addi    a1, 32
0079 
0080     br  1b
0081 
0082 # ifdef __CSKYBE__
0083     /* d[i] != s[i] in word, so we check byte 0.  */
0084 2:
0085     xtrb0   a0, t0
0086     xtrb0   a2, t1
0087     subu    a0, a2
0088     bez     a2, 4f
0089     bnez    a0, 4f
0090 
0091     /* check byte 1 */
0092     xtrb1   a0, t0
0093     xtrb1   a2, t1
0094     subu    a0, a2
0095     bez     a2, 4f
0096     bnez    a0, 4f
0097 
0098     /* check byte 2 */
0099     xtrb2   a0, t0
0100     xtrb2   a2, t1
0101     subu    a0, a2
0102     bez     a2, 4f
0103     bnez    a0, 4f
0104 
0105     /* check byte 3 */
0106     xtrb3   a0, t0
0107     xtrb3   a2, t1
0108     subu    a0, a2
0109 # else
0110     /* s1[i] != s2[i] in word, so we check byte 3.  */
0111 2:
0112     xtrb3   a0, t0
0113     xtrb3   a2, t1
0114     subu    a0, a2
0115     bez     a2, 4f
0116     bnez    a0, 4f
0117 
0118     /* check byte 2 */
0119     xtrb2   a0, t0
0120     xtrb2   a2, t1
0121     subu    a0, a2
0122     bez     a2, 4f
0123     bnez    a0, 4f
0124 
0125     /* check byte 1 */
0126     xtrb1   a0, t0
0127     xtrb1   a2, t1
0128     subu    a0, a2
0129     bez a2, 4f
0130     bnez    a0, 4f
0131 
0132     /* check byte 0 */
0133     xtrb0   a0, t0
0134     xtrb0   a2, t1
0135     subu    a0, a2
0136 
0137 # endif /* !__CSKYBE__ */
0138     jmp     lr
0139 3:
0140     movi    a0, 0
0141 4:
0142     jmp     lr
0143 
0144     /* Compare when s1 or s2 is not aligned.  */
0145 5:
0146     subi    t1, 4
0147 6:
0148     ldb a0, (a3, 0)
0149     ldb a2, (a1, 0)
0150     subu    a0, a2
0151     bez a2, 4b
0152     bnez    a0, 4b
0153     addi    t1, 1
0154     addi    a1, 1
0155     addi    a3, 1
0156     bnez    t1, 6b
0157     br  1b
0158 
0159 7:
0160     ldb a0, (a3, 0)
0161     addi    a3, 1
0162     ldb a2, (a1, 0)
0163     addi    a1, 1
0164     subu    a0, a2
0165     bnez    a0, 4b
0166     bnez    a2, 7b
0167     jmp r15
0168 ENDPROC(strcmp)