home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / asm-mips / string.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  3.0 KB  |  144 lines

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Copyright (c) 1994, 95, 96, 97, 98, 2000, 01 Ralf Baechle
  7.  * Copyright (c) 2000 by Silicon Graphics, Inc.
  8.  * Copyright (c) 2001 MIPS Technologies, Inc.
  9.  */
  10. #ifndef _ASM_STRING_H
  11. #define _ASM_STRING_H
  12.  
  13.  
  14. /*
  15.  * Most of the inline functions are rather naive implementations so I just
  16.  * didn't bother updating them for 64-bit ...
  17.  */
  18. #ifdef CONFIG_32BIT
  19.  
  20. #ifndef IN_STRING_C
  21.  
  22. #define __HAVE_ARCH_STRCPY
  23. static __inline__ char *strcpy(char *__dest, __const__ char *__src)
  24. {
  25.   char *__xdest = __dest;
  26.  
  27.   __asm__ __volatile__(
  28.     ".set\tnoreorder\n\t"
  29.     ".set\tnoat\n"
  30.     "1:\tlbu\t$1,(%1)\n\t"
  31.     "addiu\t%1,1\n\t"
  32.     "sb\t$1,(%0)\n\t"
  33.     "bnez\t$1,1b\n\t"
  34.     "addiu\t%0,1\n\t"
  35.     ".set\tat\n\t"
  36.     ".set\treorder"
  37.     : "=r" (__dest), "=r" (__src)
  38.         : "0" (__dest), "1" (__src)
  39.     : "memory");
  40.  
  41.   return __xdest;
  42. }
  43.  
  44. #define __HAVE_ARCH_STRNCPY
  45. static __inline__ char *strncpy(char *__dest, __const__ char *__src, size_t __n)
  46. {
  47.   char *__xdest = __dest;
  48.  
  49.   if (__n == 0)
  50.     return __xdest;
  51.  
  52.   __asm__ __volatile__(
  53.     ".set\tnoreorder\n\t"
  54.     ".set\tnoat\n"
  55.     "1:\tlbu\t$1,(%1)\n\t"
  56.     "subu\t%2,1\n\t"
  57.     "sb\t$1,(%0)\n\t"
  58.     "beqz\t$1,2f\n\t"
  59.     "addiu\t%0,1\n\t"
  60.     "bnez\t%2,1b\n\t"
  61.     "addiu\t%1,1\n"
  62.     "2:\n\t"
  63.     ".set\tat\n\t"
  64.     ".set\treorder"
  65.         : "=r" (__dest), "=r" (__src), "=r" (__n)
  66.         : "0" (__dest), "1" (__src), "2" (__n)
  67.         : "memory");
  68.  
  69.   return __xdest;
  70. }
  71.  
  72. #define __HAVE_ARCH_STRCMP
  73. static __inline__ int strcmp(__const__ char *__cs, __const__ char *__ct)
  74. {
  75.   int __res;
  76.  
  77.   __asm__ __volatile__(
  78.     ".set\tnoreorder\n\t"
  79.     ".set\tnoat\n\t"
  80.     "lbu\t%2,(%0)\n"
  81.     "1:\tlbu\t$1,(%1)\n\t"
  82.     "addiu\t%0,1\n\t"
  83.     "bne\t$1,%2,2f\n\t"
  84.     "addiu\t%1,1\n\t"
  85.     "bnez\t%2,1b\n\t"
  86.     "lbu\t%2,(%0)\n\t"
  87. #if defined(CONFIG_CPU_R3000)
  88.     "nop\n\t"
  89. #endif
  90.     "move\t%2,$1\n"
  91.     "2:\tsubu\t%2,$1\n"
  92.     "3:\t.set\tat\n\t"
  93.     ".set\treorder"
  94.     : "=r" (__cs), "=r" (__ct), "=r" (__res)
  95.     : "0" (__cs), "1" (__ct));
  96.  
  97.   return __res;
  98. }
  99.  
  100. #endif /* !defined(IN_STRING_C) */
  101.  
  102. #define __HAVE_ARCH_STRNCMP
  103. static __inline__ int
  104. strncmp(__const__ char *__cs, __const__ char *__ct, size_t __count)
  105. {
  106.     int __res;
  107.  
  108.     __asm__ __volatile__(
  109.     ".set\tnoreorder\n\t"
  110.     ".set\tnoat\n"
  111.     "1:\tlbu\t%3,(%0)\n\t"
  112.     "beqz\t%2,2f\n\t"
  113.     "lbu\t$1,(%1)\n\t"
  114.     "subu\t%2,1\n\t"
  115.     "bne\t$1,%3,3f\n\t"
  116.     "addiu\t%0,1\n\t"
  117.     "bnez\t%3,1b\n\t"
  118.     "addiu\t%1,1\n"
  119.     "2:\n\t"
  120. #if defined(CONFIG_CPU_R3000)
  121.     "nop\n\t"
  122. #endif
  123.     "move\t%3,$1\n"
  124.     "3:\tsubu\t%3,$1\n\t"
  125.     ".set\tat\n\t"
  126.     ".set\treorder"
  127.     : "=r" (__cs), "=r" (__ct), "=r" (__count), "=r" (__res)
  128.     : "0" (__cs), "1" (__ct), "2" (__count));
  129.  
  130.     return __res;
  131. }
  132. #endif /* CONFIG_32BIT */
  133.  
  134. #define __HAVE_ARCH_MEMSET
  135. extern void *memset(void *__s, int __c, size_t __count);
  136.  
  137. #define __HAVE_ARCH_MEMCPY
  138. extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
  139.  
  140. #define __HAVE_ARCH_MEMMOVE
  141. extern void *memmove(void *__dest, __const__ void *__src, size_t __n);
  142.  
  143. #endif /* _ASM_STRING_H */
  144.