Logo Search packages:      
Sourcecode: xbox-cromwell version File versions  Download package

string.h

#ifndef ETHERBOOT_BITS_STRING_H
#define ETHERBOOT_BITS_STRING_H

/*
 * Taken from Linux /usr/include/asm/string.h
 * All except memcpy, memmove, memset and memcmp removed.
 */

/*
 * This string-include defines all string functions as inline
 * functions. Use gcc. It also assumes ds=es=data space, this should be
 * normal. Most of the string-functions are rather heavily hand-optimized,
 * see especially strtok,strstr,str[c]spn. They should work, but are not
 * very easy to understand. Everything is done entirely within the register
 * set, making the functions fast and clean. String instructions have been
 * used through-out, making for "slightly" unclear code :-)
 *
 *          NO Copyright (C) 1991, 1992 Linus Torvalds,
 *          consider these trivial functions to be PD.
 */


#define __HAVE_ARCH_MEMCPY
static inline void *memcpy(void * to, const void * from, size_t n)
{
int d0, d1, d2;
__asm__ __volatile__(
      "cld\n\t"
      "rep ; movsl\n\t"
      "testb $2,%b4\n\t"
      "je 1f\n\t"
      "movsw\n"
      "1:\ttestb $1,%b4\n\t"
      "je 2f\n\t"
      "movsb\n"
      "2:"
      : "=&c" (d0), "=&D" (d1), "=&S" (d2)
      :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
      : "memory");
      return (to);
}

#define __HAVE_ARCH_MEMMOVE
static inline void * memmove(void * dest,const void * src, size_t n)
{
int d0, d1, d2;
if (dest<src)
__asm__ __volatile__(
      "cld\n\t"
      "rep\n\t"
      "movsb"
      : "=&c" (d0), "=&S" (d1), "=&D" (d2)
      :"0" (n),"1" (src),"2" (dest)
      : "memory");
else
__asm__ __volatile__(
      "std\n\t"
      "rep\n\t"
      "movsb\n\t"
      "cld"
      : "=&c" (d0), "=&S" (d1), "=&D" (d2)
      :"0" (n),
       "1" (n-1+(const char *)src),
       "2" (n-1+(char *)dest)
      :"memory");
return dest;
}

#define memcmp __builtin_memcmp
#define __HAVE_ARCH_MEMCMP


#define __HAVE_ARCH_MEMSET
static inline void *memset(void *s, int c,size_t count)
{
int d0, d1;
__asm__ __volatile__(
      "cld\n\t"
      "rep\n\t"
      "stosb"
      : "=&c" (d0), "=&D" (d1)
      :"a" (c),"1" (s),"0" (count)
      :"memory");
return s;
}

#define __HAVE_ARCH_STRNCMP
static inline int strncmp(const char * cs,const char * ct,size_t count)
{
register int __res;
int d0, d1, d2;
__asm__ __volatile__(
      "1:\tdecl %3\n\t"
      "js 2f\n\t"
      "lodsb\n\t"
      "scasb\n\t"
      "jne 3f\n\t"
      "testb %%al,%%al\n\t"
      "jne 1b\n"
      "2:\txorl %%eax,%%eax\n\t"
      "jmp 4f\n"
      "3:\tsbbl %%eax,%%eax\n\t"
      "orb $1,%%al\n"
      "4:"
                 :"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2)
                 :"1" (cs),"2" (ct),"3" (count));
return __res;
}

#define __HAVE_ARCH_STRLEN
static inline size_t strlen(const char * s)
{
int d0;
register int __res;
__asm__ __volatile__(
      "repne\n\t"
      "scasb\n\t"
      "notl %0\n\t"
      "decl %0"
      :"=c" (__res), "=&D" (d0) :"1" (s),"a" (0), "0" (0xffffffff));
return __res;
}

#endif /* ETHERBOOT_BITS_STRING_H */

Generated by  Doxygen 1.6.0   Back to index