162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef __ASM_SH_STRING_H 362306a36Sopenharmony_ci#define __ASM_SH_STRING_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci/* 662306a36Sopenharmony_ci * Copyright (C) 1999 Niibe Yutaka 762306a36Sopenharmony_ci * But consider these trivial functions to be public domain. 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#define __HAVE_ARCH_STRCPY 1162306a36Sopenharmony_cistatic inline char *strcpy(char *__dest, const char *__src) 1262306a36Sopenharmony_ci{ 1362306a36Sopenharmony_ci register char *__xdest = __dest; 1462306a36Sopenharmony_ci unsigned long __dummy; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci __asm__ __volatile__("1:\n\t" 1762306a36Sopenharmony_ci "mov.b @%1+, %2\n\t" 1862306a36Sopenharmony_ci "mov.b %2, @%0\n\t" 1962306a36Sopenharmony_ci "cmp/eq #0, %2\n\t" 2062306a36Sopenharmony_ci "bf/s 1b\n\t" 2162306a36Sopenharmony_ci " add #1, %0\n\t" 2262306a36Sopenharmony_ci : "=r" (__dest), "=r" (__src), "=&z" (__dummy) 2362306a36Sopenharmony_ci : "0" (__dest), "1" (__src) 2462306a36Sopenharmony_ci : "memory", "t"); 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci return __xdest; 2762306a36Sopenharmony_ci} 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define __HAVE_ARCH_STRCMP 3062306a36Sopenharmony_cistatic inline int strcmp(const char *__cs, const char *__ct) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci register int __res; 3362306a36Sopenharmony_ci unsigned long __dummy; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci __asm__ __volatile__( 3662306a36Sopenharmony_ci "mov.b @%1+, %3\n" 3762306a36Sopenharmony_ci "1:\n\t" 3862306a36Sopenharmony_ci "mov.b @%0+, %2\n\t" 3962306a36Sopenharmony_ci "cmp/eq #0, %3\n\t" 4062306a36Sopenharmony_ci "bt 2f\n\t" 4162306a36Sopenharmony_ci "cmp/eq %2, %3\n\t" 4262306a36Sopenharmony_ci "bt/s 1b\n\t" 4362306a36Sopenharmony_ci " mov.b @%1+, %3\n\t" 4462306a36Sopenharmony_ci "add #-2, %1\n\t" 4562306a36Sopenharmony_ci "mov.b @%1, %3\n\t" 4662306a36Sopenharmony_ci "sub %3, %2\n" 4762306a36Sopenharmony_ci "2:" 4862306a36Sopenharmony_ci : "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy) 4962306a36Sopenharmony_ci : "0" (__cs), "1" (__ct) 5062306a36Sopenharmony_ci : "t"); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci return __res; 5362306a36Sopenharmony_ci} 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci#define __HAVE_ARCH_STRNCMP 5662306a36Sopenharmony_cistatic inline int strncmp(const char *__cs, const char *__ct, size_t __n) 5762306a36Sopenharmony_ci{ 5862306a36Sopenharmony_ci register int __res; 5962306a36Sopenharmony_ci unsigned long __dummy; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci if (__n == 0) 6262306a36Sopenharmony_ci return 0; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci __asm__ __volatile__( 6562306a36Sopenharmony_ci "mov.b @%1+, %3\n" 6662306a36Sopenharmony_ci "1:\n\t" 6762306a36Sopenharmony_ci "mov.b @%0+, %2\n\t" 6862306a36Sopenharmony_ci "cmp/eq %6, %0\n\t" 6962306a36Sopenharmony_ci "bt/s 2f\n\t" 7062306a36Sopenharmony_ci " cmp/eq #0, %3\n\t" 7162306a36Sopenharmony_ci "bt/s 3f\n\t" 7262306a36Sopenharmony_ci " cmp/eq %3, %2\n\t" 7362306a36Sopenharmony_ci "bt/s 1b\n\t" 7462306a36Sopenharmony_ci " mov.b @%1+, %3\n\t" 7562306a36Sopenharmony_ci "add #-2, %1\n\t" 7662306a36Sopenharmony_ci "mov.b @%1, %3\n" 7762306a36Sopenharmony_ci "2:\n\t" 7862306a36Sopenharmony_ci "sub %3, %2\n" 7962306a36Sopenharmony_ci "3:" 8062306a36Sopenharmony_ci :"=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy) 8162306a36Sopenharmony_ci : "0" (__cs), "1" (__ct), "r" (__cs+__n) 8262306a36Sopenharmony_ci : "t"); 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci return __res; 8562306a36Sopenharmony_ci} 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci#define __HAVE_ARCH_MEMSET 8862306a36Sopenharmony_ciextern void *memset(void *__s, int __c, size_t __count); 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci#define __HAVE_ARCH_MEMCPY 9162306a36Sopenharmony_ciextern void *memcpy(void *__to, __const__ void *__from, size_t __n); 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci#define __HAVE_ARCH_MEMMOVE 9462306a36Sopenharmony_ciextern void *memmove(void *__dest, __const__ void *__src, size_t __n); 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci#define __HAVE_ARCH_MEMCHR 9762306a36Sopenharmony_ciextern void *memchr(const void *__s, int __c, size_t __n); 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci#define __HAVE_ARCH_STRLEN 10062306a36Sopenharmony_ciextern size_t strlen(const char *); 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci#endif /* __ASM_SH_STRING_H */ 103