root/include/asm-sparc/string.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. strlen
  2. strcmp
  3. strncmp
  4. strcpy
  5. strncpy
  6. strcat
  7. strncat
  8. strchr
  9. strpbrk
  10. strspn
  11. strtok
  12. memset
  13. memcpy
  14. memmove
  15. memcmp

   1 /* string.h: External definitions for optimized assembly string
   2              routines for the Linux Kernel.
   3 
   4    Copyright (C) 1994 David S. Miller (davem@caip.rutgers.edu)
   5 */
   6 
   7 extern __inline__ size_t strlen(const char* str)
     /* [previous][next][first][last][top][bottom][index][help] */
   8 {
   9   register int retval, tmp;
  10 
  11   __asm__("ldub [%1], %2\n\t"
  12           "or %%g0, %%g0, %0\n\t"
  13           "orcc %2, %%g0, %%g0\n\t"
  14           "be 2f\n\t"
  15           "add %1, 0x1, %1\n\t"
  16           "1: ldub [%1], %2\n\t"
  17           "add %0, 0x1, %0\n\t"
  18           "orcc %2, %%g0, %%g0\n\t"
  19           "bne 1b\n\t"
  20           "add %1, 0x1, %1\n\t"
  21           "2:" :
  22           "=r" (retval) :
  23           "r" (str), "r" (tmp=0));
  24 
  25   return retval;
  26 }
  27 
  28 extern __inline__ int strcmp(const char* str1, const char* str2)
     /* [previous][next][first][last][top][bottom][index][help] */
  29 {
  30   register unsigned int tmp1, tmp2;
  31   register int retval;
  32 
  33   __asm__("ldub [%1], %3\n\t"
  34           "ldub [%2], %4\n\t"
  35           "1: add %2, 0x1, %2\n\t"
  36           "cmp %3, %4\n\t"
  37           "bne,a 2f\n\t"
  38           "sub %2, 0x1, %2\n\t"
  39           "ldub [%1], %3\n\t"
  40           "add %1, 0x1, %1\n\t"
  41           "cmp %3, 0x0\n\t"
  42           "bne,a 1b\n\t"
  43           "ldub [%2], %4\n\t"
  44           "b 3f\n\t"
  45           "or %%g0, %%g0, %0\n\t"
  46           "2: ldub [%1], %3\n\t"
  47           "ldub [%2], %4\n\t"
  48           "sub %3, %4, %0\n\t"
  49           "3: \n\t" :
  50           "=r" (retval) :
  51           "r" (str1), "r" (str2),
  52           "r" (tmp1=0), "r" (tmp2=0));
  53 
  54   return retval;
  55 }
  56 
  57 extern __inline__ int strncmp(const char* str1, const char* str2, size_t strlen)
     /* [previous][next][first][last][top][bottom][index][help] */
  58 {
  59   register char tmp1, tmp2;
  60   register int retval;
  61 
  62   __asm__("cmp %3, 0x0\n\t"
  63           "be 2f\n\t"
  64           "ldub [%2], %5\n\t"
  65           "1: ldub [%1], %4\n\t"
  66           "sub %4, %5, %0\n\t"
  67           "cmp %0, 0x0\n\t"
  68           "bne 2f\n\t"
  69           "add %2, 0x1, %2\n\t"
  70           "cmp %4, 0x0\n\t"
  71           "be 2f\n\t"
  72           "add %1, 0x1, %1\n\t"
  73           "addcc %3, -1, %3\n\t"
  74           "bne,a 1b\n\t"
  75           "ldub [%2], %5\n\t"
  76           "2: " :
  77           "=r" (retval) :
  78           "r" (str1), "r" (str2),
  79           "r" (strlen), "r" (tmp1=0),
  80           "r" (tmp2=0));
  81 
  82   return retval;
  83 }
  84 
  85 
  86 extern __inline__ char *strcpy(char* dest, const char* source)
     /* [previous][next][first][last][top][bottom][index][help] */
  87 {
  88   register char tmp;
  89   register char *retval;
  90 
  91   __asm__("or %%g0, %2, %0\n\t"
  92           "ldub [%1], %3\n\t"
  93           "1: stb %3, [%2]\n\t"
  94           "cmp %3, 0x0\n\t"
  95           "bne,a 1b\n\t"
  96           "ldub [%1], %3\n\t" :
  97           "=r" (retval) :
  98           "r" (source), "r" (dest), "r" (tmp));
  99 
 100   return retval;
 101 }
 102 
 103 extern __inline__ char *strncpy(char *dest, const char *source, size_t cpylen)
     /* [previous][next][first][last][top][bottom][index][help] */
 104 {
 105   register char tmp;
 106   register char *retval;
 107 
 108   __asm__("or %%g0, %1, %0\n\t"
 109           "1: cmp %4, 0x0\n\t"
 110           "be 2f\n\t"
 111           "ldub [%1], %3\n\t"
 112           "add %1, 0x1, %1\n\t"
 113           "stb %3, [%2]\n\t"
 114           "sub %4, 0x1, %4\n\t"
 115           "ba 1\n\t"
 116           "add %2, 0x1, %2\n\t" :
 117           "=r" (retval) :
 118           "r" (dest), "r" (source), 
 119           "r" (tmp), "r" (cpylen));
 120 
 121   return retval;
 122 }
 123 
 124 extern __inline__ char *strcat(char *dest, const char *src)
     /* [previous][next][first][last][top][bottom][index][help] */
 125 {
 126   register char *retval;
 127   register char temp;
 128 
 129   __asm__("or %%g0, %1, %0\n\t"
 130           "1: ldub [%1], %3\n\t"
 131           "cmp %3, 0x0\n\t"
 132           "bne,a 1b\n\t"
 133           "add %1, 0x1, %1\n\t"
 134           "2: ldub [%2], %3\n\t"
 135           "stb %3, [%1]\n\t"
 136           "add %1, 0x1, %1\n\t"
 137           "cmp %3, 0x0\n\t"
 138           "bne 2b\n\t"
 139           "add %2, 0x1, %2\n\t" :
 140           "=r" (retval) :
 141           "r" (dest), "r" (src), "r" (temp=0));
 142 
 143   return retval;
 144 }
 145 
 146 extern __inline__ char *strncat(char *dest, const char *src, size_t len)
     /* [previous][next][first][last][top][bottom][index][help] */
 147 {
 148   register char *retval;
 149   register char temp;
 150 
 151   __asm__("or %%g0, %1, %0\n\t"
 152           "1: ldub [%1], %3\n\t"
 153           "cmp %3, 0x0\n\t"
 154           "bne,a 1b\n\t"
 155           "add %1, 0x1, %1\n\t"
 156           "2: ldub [%2], %3\n\t"
 157           "stb %3, [%1]\n\t"
 158           "add %1, 0x1, %1\n\t"
 159           "add %3, -1, %3\n\t"
 160           "cmp %3, 0x0\n\t"
 161           "bne 2b\n\t"
 162           "add %2, 0x1, %2\n\t" :
 163           "=r" (retval) :
 164           "r" (dest), "r" (src), "r" (len), "r" (temp=0));
 165 
 166   return retval;
 167 }
 168 
 169 extern __inline__ char *strchr(const char *src, char c)
     /* [previous][next][first][last][top][bottom][index][help] */
 170 {
 171   register char temp;
 172   register char *trick;
 173 
 174   __asm__("1: ldub [%0], %2\n\t"
 175           "cmp %2, %1\n\t"
 176           "bne,a 1b\n\t"
 177           "add %0, 0x1, %0\n\t"
 178           "or %%g0, %0, %3\n\t" :
 179           "=r" (src) :
 180           "r" (c), "r" (temp=0), "r" (trick=0), "0" (src));
 181 
 182   return trick;
 183 }
 184 
 185 extern __inline__ char *strpbrk(const char *cs, const char *ct)
     /* [previous][next][first][last][top][bottom][index][help] */
 186 {
 187   register char temp1, temp2;
 188   register char *scratch;
 189   register char *trick;
 190 
 191   __asm__("or %%g0, %1, %4\n\t"
 192           "1: ldub [%0], %2\n\t"
 193           "2: ldub [%1], %3\n\t"
 194           "cmp %3, %2\n\t"
 195           "be 3f\n\t"
 196           "nop\n\t"
 197           "cmp %3, 0x0\n\t"
 198           "bne 2b\n\t"
 199           "add %1, 0x1, %1\n\t"
 200           "or %%g0, %4, %1\n\t"
 201           "b 1b\n\t"
 202           "add %0, 0x1, %0\n\t"
 203           "or %%g0, %0, %5\n\t" :
 204           "=r" (cs) :
 205           "r" (ct), "r" (temp1), "r" (temp2), "r" (scratch), "r" (trick=0),
 206           "0" (cs), "1" (ct));
 207 
 208   return trick;
 209 
 210 }
 211 
 212       
 213 extern __inline__ size_t strspn(const char *s, const char *accept)
     /* [previous][next][first][last][top][bottom][index][help] */
 214 {
 215   register char temp1, temp2;
 216   register char* scratch;
 217   register size_t trick;
 218 
 219   __asm__("or %%g0, %1, %4\n\t"
 220           "1: ldub [%0], %2\n\t"
 221           "2: ldub [%1], %3\n\t"
 222           "cmp %3, 0x0\n\t"
 223           "be 3f\n\t"
 224           "cmp %3, %2"
 225           "bne 2b\n\t"
 226           "add %1, 0x1, %1\n\t"
 227           "add %0, 0x1, %0\n\t"
 228           "b 1b\n\t"
 229           "add %5, 0x1, %5\n\t"
 230           "3: or %%g0, %0, %4\n\t" :
 231           "=r" (s) :
 232           "r" (accept), "r" (temp1), "r" (temp2), 
 233           "r" (scratch), "r" (trick=0), "0" (s));
 234 
 235   return trick;
 236 
 237 }
 238 
 239 extern __inline__ char *strtok(char *s, const char *ct)
     /* [previous][next][first][last][top][bottom][index][help] */
 240 {
 241   static char* old; /* frob this kludge for now */
 242   register char *tok;
 243 
 244   if (s == (char *) 0)
 245     {
 246       if (old == (char *) 0)
 247         {
 248           return (char *) 0;
 249         }
 250       else
 251         s = old;
 252     }
 253 
 254   s += strspn(s, ct);
 255   if(*s == '\0')
 256     {
 257       old = (char *) 0;
 258       return (char *) 0;
 259     }
 260 
 261   tok = s;
 262   s = strpbrk(tok, ct);
 263   if (s == (char *) 0)
 264     old = (char *) 0;
 265   else
 266     {
 267       *s = '\0';
 268       old = s + 1;
 269     }
 270   return tok;
 271 }
 272         
 273 
 274 extern __inline__ void *memset(void *src, char c, size_t count)
     /* [previous][next][first][last][top][bottom][index][help] */
 275 {
 276   register void *retval;
 277 
 278   __asm__("or %%g0, %1, %0\n\t"
 279           "1: add %1, 0x1, %1\n\t"
 280           "2: add %3, -1, %3\n\t"
 281           "cmp %3, -1\n\t"
 282           "bne,a 1b\n\t"
 283           "stb %2, [%1]\n\t" :
 284           "=r" (retval) :
 285           "r" (src), "r" (c), "r" (count));
 286 
 287   return retval;
 288 }
 289 
 290 extern __inline__ void *memcpy(void *dest, const void *src, size_t count)
     /* [previous][next][first][last][top][bottom][index][help] */
 291 {
 292   register void *retval;
 293   register char tmp;
 294 
 295   __asm__("or %%g0, %1, %0\n\t"
 296           "add %3, -1, %3\n\t"
 297           "cmp %3, -1\n\t"
 298           "be 2f\n\t"
 299           "1: ldub [%2], %4\n\t"
 300           "add %2, 0x1, %2\n\t"
 301           "add %3, -1, %3\n\t"
 302           "cmp %3, -1\n\t"
 303           "stb %4, [%1]\n\t"
 304           "bne 1b\n\t"
 305           "add %1, 0x1, %1\n\t"
 306           "2: " :
 307           "=r" (retval) :
 308           "r" (dest), "r" (src), "r" (count), "r" (tmp));
 309 
 310   return retval;
 311 }
 312 
 313 extern __inline__ void *memmove(void *dest, const void *src, size_t count)
     /* [previous][next][first][last][top][bottom][index][help] */
 314 {
 315   register void *retval;
 316   register char tmp;
 317 
 318   __asm__("or %%g0, %1, %1\n\t"
 319           "add %3, -1, %3\n\t"
 320           "cmp %3, -1\n\t"
 321           "be 2f\n\t"
 322           "1: ldub [%2], %4\n\t"
 323           "add %2, 0x1, %2\n\t"
 324           "add %3, -1, %3\n\t"
 325           "cmp %3, -1\n\t"
 326           "stb %4, [%1]\n\t"
 327           "bne 1b\n\t"
 328           "add %1, 0x1, %1\n\t"
 329           "2: " :
 330           "=r" (retval) :
 331           "r" (dest), "r" (src), "r" (count), "r" (tmp));
 332 
 333   return retval;
 334 }
 335 
 336 extern __inline__ int memcmp(const void *cs, const void *ct, size_t count)
     /* [previous][next][first][last][top][bottom][index][help] */
 337 {
 338   register int retval;
 339   register unsigned long tmp1, tmp2;
 340 
 341   __asm__("or %%g0, %1, %0\n\t"
 342           "cmp %3, 0x0\n\t"
 343           "ble,a 3f\n\t"
 344           "or %%g0, %%g0, %0\n\t"
 345           "1: ldub [%1], %4\n\t"
 346           "ldub [%2], %5\n\t"
 347           "cmp %4, %5\n\t"
 348           "be,a 2f\n\t"
 349           "add %1, 0x1, %1\n\t"
 350           "bgeu 3f\n\t"
 351           "or %%g0, 0x1, %0\n\t"
 352           "b 3f\n\t"
 353           "or %%g0, -1, %0\n\t"
 354           "2: add %3, -1, %3\n\t"
 355           "cmp %3, 0x0\n\t"
 356           "bg 1b\n\t"
 357           "add %2, 0x1, %2\n\t"
 358           "or %%g0, %%g0, %0\n\t"
 359           "3: " :
 360           "=r" (retval) :
 361           "r" (cs), "r" (ct), "r" (count), "r" (tmp1=0), "r" (tmp2=0));
 362 
 363   return retval;
 364 }
 365 

/* [previous][next][first][last][top][bottom][index][help] */