| /* | |
| * 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 |