1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun#include <linux/linkage.h> 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunENTRY_CFI(strlen) 9*4882a593Smuzhiyun or r3,r0,7 10*4882a593Smuzhiyun ld r2,[r3,-7] 11*4882a593Smuzhiyun ld.a r6,[r3,-3] 12*4882a593Smuzhiyun mov r4,0x01010101 13*4882a593Smuzhiyun ; uses long immediate 14*4882a593Smuzhiyun#ifdef __LITTLE_ENDIAN__ 15*4882a593Smuzhiyun asl_s r1,r0,3 16*4882a593Smuzhiyun btst_s r0,2 17*4882a593Smuzhiyun asl r7,r4,r1 18*4882a593Smuzhiyun ror r5,r4 19*4882a593Smuzhiyun sub r1,r2,r7 20*4882a593Smuzhiyun bic_s r1,r1,r2 21*4882a593Smuzhiyun mov.eq r7,r4 22*4882a593Smuzhiyun sub r12,r6,r7 23*4882a593Smuzhiyun bic r12,r12,r6 24*4882a593Smuzhiyun or.eq r12,r12,r1 25*4882a593Smuzhiyun and r12,r12,r5 26*4882a593Smuzhiyun brne r12,0,.Learly_end 27*4882a593Smuzhiyun#else /* BIG ENDIAN */ 28*4882a593Smuzhiyun ror r5,r4 29*4882a593Smuzhiyun btst_s r0,2 30*4882a593Smuzhiyun mov_s r1,31 31*4882a593Smuzhiyun sub3 r7,r1,r0 32*4882a593Smuzhiyun sub r1,r2,r4 33*4882a593Smuzhiyun bic_s r1,r1,r2 34*4882a593Smuzhiyun bmsk r1,r1,r7 35*4882a593Smuzhiyun sub r12,r6,r4 36*4882a593Smuzhiyun bic r12,r12,r6 37*4882a593Smuzhiyun bmsk.ne r12,r12,r7 38*4882a593Smuzhiyun or.eq r12,r12,r1 39*4882a593Smuzhiyun and r12,r12,r5 40*4882a593Smuzhiyun brne r12,0,.Learly_end 41*4882a593Smuzhiyun#endif /* ENDIAN */ 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun.Loop: 44*4882a593Smuzhiyun ld_s r2,[r3,4] 45*4882a593Smuzhiyun ld.a r6,[r3,8] 46*4882a593Smuzhiyun ; stall for load result 47*4882a593Smuzhiyun sub r1,r2,r4 48*4882a593Smuzhiyun bic_s r1,r1,r2 49*4882a593Smuzhiyun sub r12,r6,r4 50*4882a593Smuzhiyun bic r12,r12,r6 51*4882a593Smuzhiyun or r12,r12,r1 52*4882a593Smuzhiyun and r12,r12,r5 53*4882a593Smuzhiyun breq r12,0,.Loop 54*4882a593Smuzhiyun.Lend: 55*4882a593Smuzhiyun and.f r1,r1,r5 56*4882a593Smuzhiyun sub.ne r3,r3,4 57*4882a593Smuzhiyun mov.eq r1,r12 58*4882a593Smuzhiyun#ifdef __LITTLE_ENDIAN__ 59*4882a593Smuzhiyun sub_s r2,r1,1 60*4882a593Smuzhiyun bic_s r2,r2,r1 61*4882a593Smuzhiyun norm r1,r2 62*4882a593Smuzhiyun sub_s r0,r0,3 63*4882a593Smuzhiyun lsr_s r1,r1,3 64*4882a593Smuzhiyun sub r0,r3,r0 65*4882a593Smuzhiyun j_s.d [blink] 66*4882a593Smuzhiyun sub r0,r0,r1 67*4882a593Smuzhiyun#else /* BIG ENDIAN */ 68*4882a593Smuzhiyun lsr_s r1,r1,7 69*4882a593Smuzhiyun mov.eq r2,r6 70*4882a593Smuzhiyun bic_s r1,r1,r2 71*4882a593Smuzhiyun norm r1,r1 72*4882a593Smuzhiyun sub r0,r3,r0 73*4882a593Smuzhiyun lsr_s r1,r1,3 74*4882a593Smuzhiyun j_s.d [blink] 75*4882a593Smuzhiyun add r0,r0,r1 76*4882a593Smuzhiyun#endif /* ENDIAN */ 77*4882a593Smuzhiyun.Learly_end: 78*4882a593Smuzhiyun b.d .Lend 79*4882a593Smuzhiyun sub_s.ne r1,r1,r1 80*4882a593SmuzhiyunEND_CFI(strlen) 81