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