blob: 5223e536525e106ee1dfe5f5c0432595dcf6981a [file] [log] [blame]
lh9ed821d2023-04-07 01:36:19 -07001/*
2 * Copyright (C) 2004-2007 Atmel Corporation
3 *
4 * This file is subject to the terms and conditions of the GNU Lesser General
5 * Public License. See the file "COPYING.LIB" in the main directory of this
6 * archive for more details.
7 */
8
9#include <features.h>
10
11#define str r12
12
13 .text
14 .global strlen
15 .type strlen, @function
16strlen:
17 mov r11, r12
18
19 mov r9, str
20 andl r9, 3, COH
21 brne .Lunaligned_str
22
231: ld.w r8, str++
24 tnbz r8
25 brne 1b
26
27 sub r12, r11
28 bfextu r9, r8, 24, 8
29 cp.w r9, 0
30 subeq r12, 4
31 reteq r12
32 bfextu r9, r8, 16, 8
33 cp.w r9, 0
34 subeq r12, 3
35 reteq r12
36 bfextu r9, r8, 8, 8
37 cp.w r9, 0
38 subeq r12, 2
39 reteq r12
40 sub r12, 1
41 retal r12
42
43.Lunaligned_str:
44 add pc, pc, r9 << 3
45 sub r0, r0, 0 /* 4-byte nop */
46 ld.ub r8, str++
47 sub r8, r8, 0
48 breq 1f
49 ld.ub r8, str++
50 sub r8, r8, 0
51 breq 1f
52 ld.ub r8, str++
53 sub r8, r8, 0
54 brne 1b
55
561: sub r12, 1
57 sub r12, r11
58 retal r12
59
60 .size strlen, . - strlen
61
62libc_hidden_def(strlen)