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