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