OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [newlib-1.10.0/] [newlib/] [libc/] [machine/] [xscale/] [strlen.c] - Blame information for rev 1010

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1010 ivang
#if defined __thumb__ || defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)
2
 
3
#include "../../string/strlen.c"
4
 
5
#else
6
 
7
#include <string.h>
8
#include "xscale.h"
9
 
10
size_t
11
strlen (const char *str)
12
{
13
  _CONST char *start = str;
14
 
15
  /* Skip unaligned part.  */
16
  if ((long)str & 3)
17
    {
18
      str--;
19
      do
20
        {
21
          if (*++str == '\0')
22
            goto out;
23
        }
24
      while ((long)str & 3);
25
    }
26
 
27
  /* Load two constants:
28
     R4 = 0xfefefeff [ == ~(0x80808080 << 1) ]
29
     R5 = 0x80808080  */
30
 
31
  asm ("mov     r5, #0x80
32
        add     r5, r5, #0x8000
33
        add     r5, r5, r5, lsl #16
34
        mvn     r4, r5, lsl #1
35
"
36
 
37
#if defined __ARM_ARCH_5__ || defined __ARM_ARCH_5T__ || defined __ARM_ARCH_5E__ || defined __ARM_ARCH_5TE__
38
 
39
"       tst     %0, #0x7
40
        ldreqd  r6, [%0]
41
        beq     1f
42
        ldr     r2, [%0]
43
        add     r3, r2, r4
44
        bic     r3, r3, r2
45
        ands    r2, r3, r5
46
        bne     2f
47
        sub     %0, %0, #4
48
 
49
0:
50
        ldrd    r6, [%0, #8]!
51
"
52
        PRELOADSTR ("%0")
53
"
54
1:
55
        add     r3, r6, r4
56
        add     r2, r7, r4
57
        bic     r3, r3, r6
58
        bic     r2, r2, r7
59
        and     r3, r3, r5
60
        and     r2, r2, r5
61
        orrs    r3, r2, r3
62
        beq     0b
63
"
64
#else
65
 
66
"       sub     %0, %0, #4
67
 
68
0:
69
        ldr     r6, [%0, #4]!
70
"
71
        PRELOADSTR ("%0")
72
"
73
        add     r3, r6, r4
74
        bic     r3, r3, r6
75
        ands    r3, r3, r5
76
        beq     0b
77
"
78
#endif /* __ARM_ARCH_5[T][E]__ */
79
"
80
2:
81
        ldrb    r3, [%0]
82
        cmp     r3, #0x0
83
        beq     1f
84
 
85
0:
86
        ldrb    r3, [%0, #1]!
87
"
88
        PRELOADSTR ("%0")
89
"
90
        cmp     r3, #0x0
91
        bne     0b
92
1:
93
"
94
       : "=r" (str) : "0" (str) : "r2", "r3", "r4", "r5", "r6", "r7");
95
 
96
  out:
97
  return str - start;
98
}
99
 
100
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.