source: trunk/libs/newlib/src/newlib/libc/machine/xscale/strchr.c @ 444

Last change on this file since 444 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 1.1 KB
Line 
1#if defined __thumb__
2
3#include "../../string/strchr.c"
4
5#else
6
7#include <string.h>
8#include "xscale.h"
9
10char *
11strchr (const char *s, int c)
12{
13  unsigned int c2;
14  asm (PRELOADSTR ("%0") : : "r" (s));
15
16  c &= 0xff;
17
18#ifndef __OPTIMIZE_SIZE__
19  /* Skip unaligned part.  */
20  if ((long)s & 3)
21    {
22      s--;
23      do
24        {
25          int c2 = *++s;
26          if (c2 == c)
27            return (char *)s;
28          if (c2 == '\0')
29            return 0;
30        }
31      while (((long)s & 3) != 0);
32    }
33
34  c2 = c + (c << 8);
35  c2 += c2 << 16;
36
37  /* Load two constants:
38     R6 = 0xfefefeff [ == ~(0x80808080 << 1) ]
39     R5 = 0x80808080  */
40
41  asm (PRELOADSTR ("%0") "\n\
42        mov     r5, #0x80\n\
43        add     r5, r5, #0x8000\n\
44        add     r5, r5, r5, lsl #16\n\
45        mvn     r6, r5, lsl #1\n\
46\n\
47        sub     %0, %0, #4\n\
480:\n\
49        ldr     r1, [%0, #4]!\n\
50"       PRELOADSTR ("%0") "\n\
51        add     r3, r1, r6\n\
52        bic     r3, r3, r1\n\
53        ands    r2, r3, r5\n\
54        bne     1f\n\
55        eor     r2, r1, %1\n\
56        add     r3, r2, r6\n\
57        bic     r3, r3, r2\n\
58        ands    r1, r3, r5\n\
59        beq     0b\n\
601:"
61       : "=&r" (s)
62       : "r" (c2), "0" (s)
63       : "r1", "r2", "r3", "r5", "r6", "cc");
64#endif
65
66  while (*s && *s != c)
67    s++;
68  if (*s == c)
69    return (char *)s;
70  return NULL;
71}
72
73#endif
Note: See TracBrowser for help on using the repository browser.