mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-18 10:48:51 +00:00
81 lines
1.5 KiB
ArmAsm
81 lines
1.5 KiB
ArmAsm
|
/*
|
||
|
* 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
|