~linaro-toolchain-dev/cortex-strings/trunk

« back to all changes in this revision

Viewing changes to reference/newlib-xscale/strcpy.c

  • Committer: Michael Hope
  • Date: 2011-08-31 23:54:55 UTC
  • Revision ID: michael.hope@linaro.org-20110831235455-1knk9yxvfcoxlm3a
Added the XScale specific routines from Newlib 1.19.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <string.h>
 
2
#include "xscale.h"
 
3
#undef strcpy
 
4
 
 
5
char *
 
6
strcpy (char *dest, const char *src)
 
7
{
 
8
  char *dest0 = dest;
 
9
 
 
10
  asm (PRELOADSTR ("%0") : : "r" (src));
 
11
 
 
12
#ifndef __OPTIMIZE_SIZE__
 
13
  if (((long)src & 3) == ((long)dest & 3))
 
14
    {
 
15
      /* Skip unaligned part.  */
 
16
      while ((long)src & 3)
 
17
        {
 
18
          if (! (*dest++ = *src++))
 
19
            return dest0;
 
20
        }
 
21
 
 
22
  /* Load two constants:
 
23
     R4 = 0xfefefeff [ == ~(0x80808080 << 1) ]
 
24
     R5 = 0x80808080  */
 
25
 
 
26
  asm ("mov     r5, #0x80\n\
 
27
        ldr     r1, [%1, #0]\n\
 
28
        add     r5, r5, #0x8000\n\
 
29
        add     r5, r5, r5, lsl #16\n\
 
30
        mvn     r4, r5, lsl #1\n\
 
31
\n\
 
32
        add     r3, r1, r5\n\
 
33
        bic     r3, r3, r1\n\
 
34
        ands    r2, r3, r4\n\
 
35
        bne     1f\n\
 
36
0:\n\
 
37
        ldr     r3, [%1, #0]\n\
 
38
        ldr     r1, [%1, #4]!\n\
 
39
"       PRELOADSTR("%1") "\n\
 
40
        str     r3, [%0], #4\n\
 
41
        add     r2, r1, r4\n\
 
42
        bic     r2, r2, r1\n\
 
43
        ands    r3, r2, r5\n\
 
44
        beq     0b\n\
 
45
1:"
 
46
       : "=&r" (dest), "=&r" (src)
 
47
       : "0" (dest), "1" (src)
 
48
       : "r1", "r2", "r3", "r4", "r5", "memory", "cc");
 
49
    }
 
50
#endif
 
51
 
 
52
  while (*dest++ = *src++)
 
53
    asm (PRELOADSTR ("%0") : : "r" (src));
 
54
  return dest0;
 
55
}