123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- /* SPDX-License-Identifier: GPL-2.0 */
- // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
- #include <linux/linkage.h>
- #include "sysdep.h"
- ENTRY(strcmp)
- mov a3, a0
- /* Check if the s1 addr is aligned. */
- xor a2, a3, a1
- andi a2, 0x3
- bnez a2, 7f
- andi t1, a0, 0x3
- bnez t1, 5f
- 1:
- /* If aligned, load word each time. */
- ldw t0, (a3, 0)
- ldw t1, (a1, 0)
- /* If s1[i] != s2[i], goto 2f. */
- cmpne t0, t1
- bt 2f
- /* If s1[i] == s2[i], check if s1 or s2 is at the end. */
- tstnbz t0
- /* If at the end, goto 3f (finish comparing). */
- bf 3f
- ldw t0, (a3, 4)
- ldw t1, (a1, 4)
- cmpne t0, t1
- bt 2f
- tstnbz t0
- bf 3f
- ldw t0, (a3, 8)
- ldw t1, (a1, 8)
- cmpne t0, t1
- bt 2f
- tstnbz t0
- bf 3f
- ldw t0, (a3, 12)
- ldw t1, (a1, 12)
- cmpne t0, t1
- bt 2f
- tstnbz t0
- bf 3f
- ldw t0, (a3, 16)
- ldw t1, (a1, 16)
- cmpne t0, t1
- bt 2f
- tstnbz t0
- bf 3f
- ldw t0, (a3, 20)
- ldw t1, (a1, 20)
- cmpne t0, t1
- bt 2f
- tstnbz t0
- bf 3f
- ldw t0, (a3, 24)
- ldw t1, (a1, 24)
- cmpne t0, t1
- bt 2f
- tstnbz t0
- bf 3f
- ldw t0, (a3, 28)
- ldw t1, (a1, 28)
- cmpne t0, t1
- bt 2f
- tstnbz t0
- bf 3f
- addi a3, 32
- addi a1, 32
- br 1b
- # ifdef __CSKYBE__
- /* d[i] != s[i] in word, so we check byte 0. */
- 2:
- xtrb0 a0, t0
- xtrb0 a2, t1
- subu a0, a2
- bez a2, 4f
- bnez a0, 4f
- /* check byte 1 */
- xtrb1 a0, t0
- xtrb1 a2, t1
- subu a0, a2
- bez a2, 4f
- bnez a0, 4f
- /* check byte 2 */
- xtrb2 a0, t0
- xtrb2 a2, t1
- subu a0, a2
- bez a2, 4f
- bnez a0, 4f
- /* check byte 3 */
- xtrb3 a0, t0
- xtrb3 a2, t1
- subu a0, a2
- # else
- /* s1[i] != s2[i] in word, so we check byte 3. */
- 2:
- xtrb3 a0, t0
- xtrb3 a2, t1
- subu a0, a2
- bez a2, 4f
- bnez a0, 4f
- /* check byte 2 */
- xtrb2 a0, t0
- xtrb2 a2, t1
- subu a0, a2
- bez a2, 4f
- bnez a0, 4f
- /* check byte 1 */
- xtrb1 a0, t0
- xtrb1 a2, t1
- subu a0, a2
- bez a2, 4f
- bnez a0, 4f
- /* check byte 0 */
- xtrb0 a0, t0
- xtrb0 a2, t1
- subu a0, a2
- # endif /* !__CSKYBE__ */
- jmp lr
- 3:
- movi a0, 0
- 4:
- jmp lr
- /* Compare when s1 or s2 is not aligned. */
- 5:
- subi t1, 4
- 6:
- ldb a0, (a3, 0)
- ldb a2, (a1, 0)
- subu a0, a2
- bez a2, 4b
- bnez a0, 4b
- addi t1, 1
- addi a1, 1
- addi a3, 1
- bnez t1, 6b
- br 1b
- 7:
- ldb a0, (a3, 0)
- addi a3, 1
- ldb a2, (a1, 0)
- addi a1, 1
- subu a0, a2
- bnez a0, 4b
- bnez a2, 7b
- jmp r15
- ENDPROC(strcmp)
|