linux/arch/xtensa/include/asm/string.h
<<
>>
Prefs
   1/*
   2 * include/asm-xtensa/string.h
   3 *
   4 * These trivial string functions are considered part of the public domain.
   5 *
   6 * This file is subject to the terms and conditions of the GNU General Public
   7 * License.  See the file "COPYING" in the main directory of this archive
   8 * for more details.
   9 *
  10 * Copyright (C) 2001 - 2005 Tensilica Inc.
  11 */
  12
  13/* We should optimize these. See arch/xtensa/lib/strncpy_user.S */
  14
  15#ifndef _XTENSA_STRING_H
  16#define _XTENSA_STRING_H
  17
  18#define __HAVE_ARCH_STRCPY
  19static inline char *strcpy(char *__dest, const char *__src)
  20{
  21        register char *__xdest = __dest;
  22        unsigned long __dummy;
  23
  24        __asm__ __volatile__("1:\n\t"
  25                "l8ui   %2, %1, 0\n\t"
  26                "s8i    %2, %0, 0\n\t"
  27                "addi   %1, %1, 1\n\t"
  28                "addi   %0, %0, 1\n\t"
  29                "bnez   %2, 1b\n\t"
  30                : "=r" (__dest), "=r" (__src), "=&r" (__dummy)
  31                : "0" (__dest), "1" (__src)
  32                : "memory");
  33
  34        return __xdest;
  35}
  36
  37#define __HAVE_ARCH_STRNCPY
  38static inline char *strncpy(char *__dest, const char *__src, size_t __n)
  39{
  40        register char *__xdest = __dest;
  41        unsigned long __dummy;
  42
  43        if (__n == 0)
  44                return __xdest;
  45
  46        __asm__ __volatile__(
  47                "1:\n\t"
  48                "l8ui   %2, %1, 0\n\t"
  49                "s8i    %2, %0, 0\n\t"
  50                "addi   %1, %1, 1\n\t"
  51                "addi   %0, %0, 1\n\t"
  52                "beqz   %2, 2f\n\t"
  53                "bne    %1, %5, 1b\n"
  54                "2:"
  55                : "=r" (__dest), "=r" (__src), "=&r" (__dummy)
  56                : "0" (__dest), "1" (__src), "r" ((uintptr_t)__src+__n)
  57                : "memory");
  58
  59        return __xdest;
  60}
  61
  62#define __HAVE_ARCH_STRCMP
  63static inline int strcmp(const char *__cs, const char *__ct)
  64{
  65        register int __res;
  66        unsigned long __dummy;
  67
  68        __asm__ __volatile__(
  69                "1:\n\t"
  70                "l8ui   %3, %1, 0\n\t"
  71                "addi   %1, %1, 1\n\t"
  72                "l8ui   %2, %0, 0\n\t"
  73                "addi   %0, %0, 1\n\t"
  74                "beqz   %2, 2f\n\t"
  75                "beq    %2, %3, 1b\n"
  76                "2:\n\t"
  77                "sub    %2, %2, %3"
  78                : "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&r" (__dummy)
  79                : "0" (__cs), "1" (__ct));
  80
  81        return __res;
  82}
  83
  84#define __HAVE_ARCH_STRNCMP
  85static inline int strncmp(const char *__cs, const char *__ct, size_t __n)
  86{
  87        register int __res;
  88        unsigned long __dummy;
  89
  90        __asm__ __volatile__(
  91                "mov    %2, %3\n"
  92                "1:\n\t"
  93                "beq    %0, %6, 2f\n\t"
  94                "l8ui   %3, %1, 0\n\t"
  95                "addi   %1, %1, 1\n\t"
  96                "l8ui   %2, %0, 0\n\t"
  97                "addi   %0, %0, 1\n\t"
  98                "beqz   %2, 2f\n\t"
  99                "beqz   %3, 2f\n\t"
 100                "beq    %2, %3, 1b\n"
 101                "2:\n\t"
 102                "sub    %2, %2, %3"
 103                : "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&r" (__dummy)
 104                : "0" (__cs), "1" (__ct), "r" ((uintptr_t)__cs+__n));
 105
 106        return __res;
 107}
 108
 109#define __HAVE_ARCH_MEMSET
 110extern void *memset(void *__s, int __c, size_t __count);
 111extern void *__memset(void *__s, int __c, size_t __count);
 112
 113#define __HAVE_ARCH_MEMCPY
 114extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
 115extern void *__memcpy(void *__to, __const__ void *__from, size_t __n);
 116
 117#define __HAVE_ARCH_MEMMOVE
 118extern void *memmove(void *__dest, __const__ void *__src, size_t __n);
 119extern void *__memmove(void *__dest, __const__ void *__src, size_t __n);
 120
 121/* Don't build bcopy at all ...  */
 122#define __HAVE_ARCH_BCOPY
 123
 124#if defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__)
 125
 126/*
 127 * For files that are not instrumented (e.g. mm/slub.c) we
 128 * should use not instrumented version of mem* functions.
 129 */
 130
 131#define memcpy(dst, src, len) __memcpy(dst, src, len)
 132#define memmove(dst, src, len) __memmove(dst, src, len)
 133#define memset(s, c, n) __memset(s, c, n)
 134
 135#ifndef __NO_FORTIFY
 136#define __NO_FORTIFY /* FORTIFY_SOURCE uses __builtin_memcpy, etc. */
 137#endif
 138#endif
 139
 140#endif  /* _XTENSA_STRING_H */
 141