root/arch/mips/include/asm/string.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. strcpy
  2. strncpy
  3. strcmp
  4. strncmp

   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 */

/* [<][>][^][v][top][bottom][index][help] */