18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci#include <linux/linkage.h> 58c2ecf20Sopenharmony_ci#include "sysdep.h" 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ciENTRY(strcmp) 88c2ecf20Sopenharmony_ci mov a3, a0 98c2ecf20Sopenharmony_ci /* Check if the s1 addr is aligned. */ 108c2ecf20Sopenharmony_ci xor a2, a3, a1 118c2ecf20Sopenharmony_ci andi a2, 0x3 128c2ecf20Sopenharmony_ci bnez a2, 7f 138c2ecf20Sopenharmony_ci andi t1, a0, 0x3 148c2ecf20Sopenharmony_ci bnez t1, 5f 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci1: 178c2ecf20Sopenharmony_ci /* If aligned, load word each time. */ 188c2ecf20Sopenharmony_ci ldw t0, (a3, 0) 198c2ecf20Sopenharmony_ci ldw t1, (a1, 0) 208c2ecf20Sopenharmony_ci /* If s1[i] != s2[i], goto 2f. */ 218c2ecf20Sopenharmony_ci cmpne t0, t1 228c2ecf20Sopenharmony_ci bt 2f 238c2ecf20Sopenharmony_ci /* If s1[i] == s2[i], check if s1 or s2 is at the end. */ 248c2ecf20Sopenharmony_ci tstnbz t0 258c2ecf20Sopenharmony_ci /* If at the end, goto 3f (finish comparing). */ 268c2ecf20Sopenharmony_ci bf 3f 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci ldw t0, (a3, 4) 298c2ecf20Sopenharmony_ci ldw t1, (a1, 4) 308c2ecf20Sopenharmony_ci cmpne t0, t1 318c2ecf20Sopenharmony_ci bt 2f 328c2ecf20Sopenharmony_ci tstnbz t0 338c2ecf20Sopenharmony_ci bf 3f 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci ldw t0, (a3, 8) 368c2ecf20Sopenharmony_ci ldw t1, (a1, 8) 378c2ecf20Sopenharmony_ci cmpne t0, t1 388c2ecf20Sopenharmony_ci bt 2f 398c2ecf20Sopenharmony_ci tstnbz t0 408c2ecf20Sopenharmony_ci bf 3f 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci ldw t0, (a3, 12) 438c2ecf20Sopenharmony_ci ldw t1, (a1, 12) 448c2ecf20Sopenharmony_ci cmpne t0, t1 458c2ecf20Sopenharmony_ci bt 2f 468c2ecf20Sopenharmony_ci tstnbz t0 478c2ecf20Sopenharmony_ci bf 3f 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci ldw t0, (a3, 16) 508c2ecf20Sopenharmony_ci ldw t1, (a1, 16) 518c2ecf20Sopenharmony_ci cmpne t0, t1 528c2ecf20Sopenharmony_ci bt 2f 538c2ecf20Sopenharmony_ci tstnbz t0 548c2ecf20Sopenharmony_ci bf 3f 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci ldw t0, (a3, 20) 578c2ecf20Sopenharmony_ci ldw t1, (a1, 20) 588c2ecf20Sopenharmony_ci cmpne t0, t1 598c2ecf20Sopenharmony_ci bt 2f 608c2ecf20Sopenharmony_ci tstnbz t0 618c2ecf20Sopenharmony_ci bf 3f 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci ldw t0, (a3, 24) 648c2ecf20Sopenharmony_ci ldw t1, (a1, 24) 658c2ecf20Sopenharmony_ci cmpne t0, t1 668c2ecf20Sopenharmony_ci bt 2f 678c2ecf20Sopenharmony_ci tstnbz t0 688c2ecf20Sopenharmony_ci bf 3f 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci ldw t0, (a3, 28) 718c2ecf20Sopenharmony_ci ldw t1, (a1, 28) 728c2ecf20Sopenharmony_ci cmpne t0, t1 738c2ecf20Sopenharmony_ci bt 2f 748c2ecf20Sopenharmony_ci tstnbz t0 758c2ecf20Sopenharmony_ci bf 3f 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci addi a3, 32 788c2ecf20Sopenharmony_ci addi a1, 32 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci br 1b 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci# ifdef __CSKYBE__ 838c2ecf20Sopenharmony_ci /* d[i] != s[i] in word, so we check byte 0. */ 848c2ecf20Sopenharmony_ci2: 858c2ecf20Sopenharmony_ci xtrb0 a0, t0 868c2ecf20Sopenharmony_ci xtrb0 a2, t1 878c2ecf20Sopenharmony_ci subu a0, a2 888c2ecf20Sopenharmony_ci bez a2, 4f 898c2ecf20Sopenharmony_ci bnez a0, 4f 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci /* check byte 1 */ 928c2ecf20Sopenharmony_ci xtrb1 a0, t0 938c2ecf20Sopenharmony_ci xtrb1 a2, t1 948c2ecf20Sopenharmony_ci subu a0, a2 958c2ecf20Sopenharmony_ci bez a2, 4f 968c2ecf20Sopenharmony_ci bnez a0, 4f 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci /* check byte 2 */ 998c2ecf20Sopenharmony_ci xtrb2 a0, t0 1008c2ecf20Sopenharmony_ci xtrb2 a2, t1 1018c2ecf20Sopenharmony_ci subu a0, a2 1028c2ecf20Sopenharmony_ci bez a2, 4f 1038c2ecf20Sopenharmony_ci bnez a0, 4f 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci /* check byte 3 */ 1068c2ecf20Sopenharmony_ci xtrb3 a0, t0 1078c2ecf20Sopenharmony_ci xtrb3 a2, t1 1088c2ecf20Sopenharmony_ci subu a0, a2 1098c2ecf20Sopenharmony_ci# else 1108c2ecf20Sopenharmony_ci /* s1[i] != s2[i] in word, so we check byte 3. */ 1118c2ecf20Sopenharmony_ci2: 1128c2ecf20Sopenharmony_ci xtrb3 a0, t0 1138c2ecf20Sopenharmony_ci xtrb3 a2, t1 1148c2ecf20Sopenharmony_ci subu a0, a2 1158c2ecf20Sopenharmony_ci bez a2, 4f 1168c2ecf20Sopenharmony_ci bnez a0, 4f 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci /* check byte 2 */ 1198c2ecf20Sopenharmony_ci xtrb2 a0, t0 1208c2ecf20Sopenharmony_ci xtrb2 a2, t1 1218c2ecf20Sopenharmony_ci subu a0, a2 1228c2ecf20Sopenharmony_ci bez a2, 4f 1238c2ecf20Sopenharmony_ci bnez a0, 4f 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci /* check byte 1 */ 1268c2ecf20Sopenharmony_ci xtrb1 a0, t0 1278c2ecf20Sopenharmony_ci xtrb1 a2, t1 1288c2ecf20Sopenharmony_ci subu a0, a2 1298c2ecf20Sopenharmony_ci bez a2, 4f 1308c2ecf20Sopenharmony_ci bnez a0, 4f 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci /* check byte 0 */ 1338c2ecf20Sopenharmony_ci xtrb0 a0, t0 1348c2ecf20Sopenharmony_ci xtrb0 a2, t1 1358c2ecf20Sopenharmony_ci subu a0, a2 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci# endif /* !__CSKYBE__ */ 1388c2ecf20Sopenharmony_ci jmp lr 1398c2ecf20Sopenharmony_ci3: 1408c2ecf20Sopenharmony_ci movi a0, 0 1418c2ecf20Sopenharmony_ci4: 1428c2ecf20Sopenharmony_ci jmp lr 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci /* Compare when s1 or s2 is not aligned. */ 1458c2ecf20Sopenharmony_ci5: 1468c2ecf20Sopenharmony_ci subi t1, 4 1478c2ecf20Sopenharmony_ci6: 1488c2ecf20Sopenharmony_ci ldb a0, (a3, 0) 1498c2ecf20Sopenharmony_ci ldb a2, (a1, 0) 1508c2ecf20Sopenharmony_ci subu a0, a2 1518c2ecf20Sopenharmony_ci bez a2, 4b 1528c2ecf20Sopenharmony_ci bnez a0, 4b 1538c2ecf20Sopenharmony_ci addi t1, 1 1548c2ecf20Sopenharmony_ci addi a1, 1 1558c2ecf20Sopenharmony_ci addi a3, 1 1568c2ecf20Sopenharmony_ci bnez t1, 6b 1578c2ecf20Sopenharmony_ci br 1b 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_ci7: 1608c2ecf20Sopenharmony_ci ldb a0, (a3, 0) 1618c2ecf20Sopenharmony_ci addi a3, 1 1628c2ecf20Sopenharmony_ci ldb a2, (a1, 0) 1638c2ecf20Sopenharmony_ci addi a1, 1 1648c2ecf20Sopenharmony_ci subu a0, a2 1658c2ecf20Sopenharmony_ci bnez a0, 4b 1668c2ecf20Sopenharmony_ci bnez a2, 7b 1678c2ecf20Sopenharmony_ci jmp r15 1688c2ecf20Sopenharmony_ciENDPROC(strcmp) 169