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