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