/* * Copyright (C) 2004, 2007-2010, 2011-2014 Synopsys, Inc. All rights reserved. * * SPDX-License-Identifier: GPL-2.0+ */ .global strlen .align 4 strlen: or %r3, %r0, 7 ld %r2, [%r3, -7] ld.a %r6, [%r3, -3] mov %r4, 0x01010101 /* uses long immediate */ #ifdef __LITTLE_ENDIAN__ asl_s %r1, %r0, 3 btst_s %r0, 2 asl %r7, %r4, %r1 ror %r5, %r4 sub %r1, %r2, %r7 bic_s %r1, %r1, %r2 mov.eq %r7, %r4 sub %r12, %r6, %r7 bic %r12, %r12, %r6 or.eq %r12, %r12, %r1 and %r12, %r12, %r5 brne %r12, 0, .Learly_end #else /* __BIG_ENDIAN__ */ ror %r5, %r4 btst_s %r0, 2 mov_s %r1, 31 sub3 %r7, %r1, %r0 sub %r1, %r2, %r4 bic_s %r1, %r1, %r2 bmsk %r1, %r1, %r7 sub %r12, %r6, %r4 bic %r12, %r12, %r6 bmsk.ne %r12, %r12, %r7 or.eq %r12, %r12, %r1 and %r12, %r12, %r5 brne %r12, 0, .Learly_end #endif /* _ENDIAN__ */ .Loop: ld_s %r2, [%r3, 4] ld.a %r6, [%r3, 8] /* stall for load result */ sub %r1, %r2, %r4 bic_s %r1, %r1, %r2 sub %r12, %r6, %r4 bic %r12, %r12, %r6 or %r12, %r12, %r1 and %r12, %r12, %r5 breq %r12, 0, .Loop .Lend: and.f %r1, %r1, %r5 sub.ne %r3, %r3, 4 mov.eq %r1, %r12 #ifdef __LITTLE_ENDIAN__ sub_s %r2, %r1, 1 bic_s %r2, %r2, %r1 norm %r1, %r2 sub_s %r0, %r0, 3 lsr_s %r1, %r1, 3 sub %r0, %r3, %r0 j_s.d [%blink] sub %r0, %r0, %r1 #else /* __BIG_ENDIAN__ */ lsr_s %r1, %r1, 7 mov.eq %r2, %r6 bic_s %r1, %r1, %r2 norm %r1, %r1 sub %r0, %r3, %r0 lsr_s %r1, %r1, 3 j_s.d [%blink] add %r0, %r0, %r1 #endif /* _ENDIAN */ .Learly_end: b.d .Lend sub_s.ne %r1, %r1, %r1