^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include "sysdep.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) ENTRY(strcmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) mov a3, a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) /* Check if the s1 addr is aligned. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) xor a2, a3, a1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) andi a2, 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) bnez a2, 7f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) andi t1, a0, 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) bnez t1, 5f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) /* If aligned, load word each time. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) ldw t0, (a3, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) ldw t1, (a1, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) /* If s1[i] != s2[i], goto 2f. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) cmpne t0, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) bt 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) /* If s1[i] == s2[i], check if s1 or s2 is at the end. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) tstnbz t0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) /* If at the end, goto 3f (finish comparing). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) bf 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) ldw t0, (a3, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) ldw t1, (a1, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) cmpne t0, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) bt 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) tstnbz t0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) bf 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) ldw t0, (a3, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) ldw t1, (a1, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) cmpne t0, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) bt 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) tstnbz t0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) bf 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) ldw t0, (a3, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) ldw t1, (a1, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) cmpne t0, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) bt 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) tstnbz t0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) bf 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) ldw t0, (a3, 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) ldw t1, (a1, 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) cmpne t0, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) bt 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) tstnbz t0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) bf 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) ldw t0, (a3, 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) ldw t1, (a1, 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) cmpne t0, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) bt 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) tstnbz t0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) bf 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) ldw t0, (a3, 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) ldw t1, (a1, 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) cmpne t0, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) bt 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) tstnbz t0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) bf 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) ldw t0, (a3, 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) ldw t1, (a1, 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) cmpne t0, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) bt 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) tstnbz t0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) bf 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) addi a3, 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) addi a1, 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) br 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) # ifdef __CSKYBE__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) /* d[i] != s[i] in word, so we check byte 0. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) xtrb0 a0, t0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) xtrb0 a2, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) subu a0, a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) bez a2, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) bnez a0, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) /* check byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) xtrb1 a0, t0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) xtrb1 a2, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) subu a0, a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) bez a2, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) bnez a0, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /* check byte 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) xtrb2 a0, t0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) xtrb2 a2, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) subu a0, a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) bez a2, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) bnez a0, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) /* check byte 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) xtrb3 a0, t0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) xtrb3 a2, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) subu a0, a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) # else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) /* s1[i] != s2[i] in word, so we check byte 3. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) xtrb3 a0, t0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) xtrb3 a2, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) subu a0, a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) bez a2, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) bnez a0, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) /* check byte 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) xtrb2 a0, t0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) xtrb2 a2, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) subu a0, a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) bez a2, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) bnez a0, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) /* check byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) xtrb1 a0, t0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) xtrb1 a2, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) subu a0, a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) bez a2, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) bnez a0, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) /* check byte 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) xtrb0 a0, t0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) xtrb0 a2, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) subu a0, a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) # endif /* !__CSKYBE__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) jmp lr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) movi a0, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) jmp lr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) /* Compare when s1 or s2 is not aligned. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) subi t1, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) ldb a0, (a3, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) ldb a2, (a1, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) subu a0, a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) bez a2, 4b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) bnez a0, 4b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) addi t1, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) addi a1, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) addi a3, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) bnez t1, 6b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) br 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) ldb a0, (a3, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) addi a3, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) ldb a2, (a1, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) addi a1, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) subu a0, a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) bnez a0, 4b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) bnez a2, 7b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) jmp r15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) ENDPROC(strcmp)