source: trunk/libs/newlib/src/newlib/libc/machine/xscale/memmove.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.7 KB
Line 
1#if defined __thumb__
2
3#include "../../string/memmove.c"
4
5#else
6
7#include <string.h>
8#include "xscale.h"
9
10static inline void *
11do_memcpy (void *dst0, const void *src0, size_t len)
12{
13  int dummy;
14  asm volatile (
15#ifndef __OPTIMIZE_SIZE__
16       "cmp     %2, #0x3\n\
17        bls     3f\n\
18        and     lr, %1, #0x3\n\
19        and     r3, %0, #0x3\n\
20        cmp     lr, r3\n\
21        bne     3f\n\
22        cmp     lr, #0x0\n\
23        beq     2f\n\
24        b       1f\n\
250:\n\
26        ldrb    r3, [%1], #1\n\
27"
28        PRELOADSTR ("%1")
29"\n\
30        tst     %1, #0x3\n\
31        strb    r3, [%0], #1\n\
32        beq     3f\n\
331:\n\
34        sub     %2, %2, #1\n\
35        cmn     %2, #1\n\
36        bne     0b\n\
372:\n\
38        cmp     %2, #0xf\n\
39        bls     1f\n\
400:\n\
41        ldmia   %1!, { r3, r4, r5, lr }\n\
42"
43        PRELOADSTR ("%1")
44"\n\
45\n\
46        sub     %2, %2, #16\n\
47        cmp     %2, #0xf\n\
48        stmia   %0!, { r3, r4, r5, lr }\n\
49        bhi     0b\n\
501:\n\
51        cmp     %2, #0x7\n\
52        bls     1f\n\
530:\n\
54        ldmia   %1!, { r3, r4 }\n\
55"
56        PRELOADSTR ("%1")
57"\n\
58\n\
59        sub     %2, %2, #8\n\
60        cmp     %2, #0x7\n\
61        stmia   %0!, { r3, r4 }\n\
62        bhi     0b\n\
631:\n\
64        cmp     %2, #0x3\n\
65        bls     3f\n\
660:\n\
67        sub     %2, %2, #4\n\
68        ldr     r3, [%1], #4\n\
69"
70        PRELOADSTR ("%1")
71"\n\
72\n\
73        cmp     %2, #0x3\n\
74        str     r3, [%0], #4\n\
75        bhi     0b\n\
76"
77#endif /* !__OPTIMIZE_SIZE__ */
78"\n\
793:\n\
80"
81        PRELOADSTR ("%1")
82"\n\
83        sub     %2, %2, #1\n\
84        cmn     %2, #1\n\
85        beq     1f\n\
860:\n\
87        sub     %2, %2, #1\n\
88        ldrb    r3, [%1], #1\n\
89"
90        PRELOADSTR ("%1")
91"\n\
92        cmn     %2, #1\n\
93        strb    r3, [%0], #1\n\
94        bne     0b\n\
951:"
96       : "=&r" (dummy), "=&r" (src0), "=&r" (len)
97       : "0" (dst0), "1" (src0), "2" (len)
98       : "memory", "lr", "r3", "r4", "r5", "cc");
99  return dst0;
100}
101
102void *
103memmove (void *dst, const void *src, size_t len)
104{
105  char *d = dst;
106  const char *s = src;
107
108  if (s < d && d < s + len)
109    {
110      /* Destructive overlap...have to copy backwards.  */
111      s += len;
112      d += len;
113
114      while (len--)
115        *--d = *--s;
116
117      return dst;
118    }
119  else
120    return do_memcpy (dst, src, len);
121}
122#endif
Note: See TracBrowser for help on using the repository browser.