linux/arch/m68k/include/asm/string.h
<<
>>
Prefs
   1#ifndef _M68K_STRING_H_
   2#define _M68K_STRING_H_
   3
   4#include <linux/types.h>
   5#include <linux/compiler.h>
   6
   7#define __HAVE_ARCH_STRNLEN
   8static inline size_t strnlen(const char *s, size_t count)
   9{
  10        const char *sc = s;
  11
  12        asm volatile ("\n"
  13                "1:     subq.l  #1,%1\n"
  14                "       jcs     2f\n"
  15                "       tst.b   (%0)+\n"
  16                "       jne     1b\n"
  17                "       subq.l  #1,%0\n"
  18                "2:"
  19                : "+a" (sc), "+d" (count));
  20        return sc - s;
  21}
  22
  23#define __HAVE_ARCH_STRNCPY
  24static inline char *strncpy(char *dest, const char *src, size_t n)
  25{
  26        char *xdest = dest;
  27
  28        asm volatile ("\n"
  29                "       jra     2f\n"
  30                "1:     move.b  (%1),(%0)+\n"
  31                "       jeq     2f\n"
  32                "       addq.l  #1,%1\n"
  33                "2:     subq.l  #1,%2\n"
  34                "       jcc     1b\n"
  35                : "+a" (dest), "+a" (src), "+d" (n)
  36                : : "memory");
  37        return xdest;
  38}
  39
  40#ifndef CONFIG_COLDFIRE
  41#define __HAVE_ARCH_STRCMP
  42static inline int strcmp(const char *cs, const char *ct)
  43{
  44        char res;
  45
  46        asm ("\n"
  47                "1:     move.b  (%0)+,%2\n"     /* get *cs */
  48                "       cmp.b   (%1)+,%2\n"     /* compare a byte */
  49                "       jne     2f\n"           /* not equal, break out */
  50                "       tst.b   %2\n"           /* at end of cs? */
  51                "       jne     1b\n"           /* no, keep going */
  52                "       jra     3f\n"           /* strings are equal */
  53                "2:     sub.b   -(%1),%2\n"     /* *cs - *ct */
  54                "3:"
  55                : "+a" (cs), "+a" (ct), "=d" (res));
  56        return res;
  57}
  58#endif /* CONFIG_COLDFIRE */
  59
  60#define __HAVE_ARCH_MEMMOVE
  61extern void *memmove(void *, const void *, __kernel_size_t);
  62
  63#define memcmp(d, s, n) __builtin_memcmp(d, s, n)
  64
  65#define __HAVE_ARCH_MEMSET
  66extern void *memset(void *, int, __kernel_size_t);
  67#define memset(d, c, n) __builtin_memset(d, c, n)
  68
  69#define __HAVE_ARCH_MEMCPY
  70extern void *memcpy(void *, const void *, __kernel_size_t);
  71#define memcpy(d, s, n) __builtin_memcpy(d, s, n)
  72
  73#endif /* _M68K_STRING_H_ */
  74