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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [newlib-1.17.0/] [newlib/] [libc/] [machine/] [xscale/] [strlen.c] - Blame information for rev 158

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 148 jeremybenn
#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\n\
32
        add     r5, r5, #0x8000\n\
33
        add     r5, r5, r5, lsl #16\n\
34
        mvn     r4, r5, lsl #1\n\
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\n\
40
        ldreqd  r6, [%0]\n\
41
        beq     1f\n\
42
        ldr     r2, [%0]\n\
43
        add     r3, r2, r4\n\
44
        bic     r3, r3, r2\n\
45
        ands    r2, r3, r5\n\
46
        bne     2f\n\
47
        sub     %0, %0, #4\n\
48
\n\
49
0:\n\
50
        ldrd    r6, [%0, #8]!\n\
51
"
52
        PRELOADSTR ("%0")
53
"\n\
54
1:\n\
55
        add     r3, r6, r4\n\
56
        add     r2, r7, r4\n\
57
        bic     r3, r3, r6\n\
58
        bic     r2, r2, r7\n\
59
        and     r3, r3, r5\n\
60
        and     r2, r2, r5\n\
61
        orrs    r3, r2, r3\n\
62
        beq     0b\n\
63
"
64
#else
65
 
66
"       sub     %0, %0, #4\n\
67
\n\
68
0:\n\
69
        ldr     r6, [%0, #4]!\n\
70
"
71
        PRELOADSTR ("%0")
72
"\n\
73
        add     r3, r6, r4\n\
74
        bic     r3, r3, r6\n\
75
        ands    r3, r3, r5\n\
76
        beq     0b\n\
77
"
78
#endif /* __ARM_ARCH_5[T][E]__ */
79
"\n\
80
2:\n\
81
        ldrb    r3, [%0]\n\
82
        cmp     r3, #0x0\n\
83
        beq     1f\n\
84
\n\
85
0:\n\
86
        ldrb    r3, [%0, #1]!\n\
87
"
88
        PRELOADSTR ("%0")
89
"\n\
90
        cmp     r3, #0x0\n\
91
        bne     0b\n\
92
1:\n\
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.