18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef __ASM_SH_STRING_H 38c2ecf20Sopenharmony_ci#define __ASM_SH_STRING_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci/* 68c2ecf20Sopenharmony_ci * Copyright (C) 1999 Niibe Yutaka 78c2ecf20Sopenharmony_ci * But consider these trivial functions to be public domain. 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#define __HAVE_ARCH_STRCPY 118c2ecf20Sopenharmony_cistatic inline char *strcpy(char *__dest, const char *__src) 128c2ecf20Sopenharmony_ci{ 138c2ecf20Sopenharmony_ci register char *__xdest = __dest; 148c2ecf20Sopenharmony_ci unsigned long __dummy; 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci __asm__ __volatile__("1:\n\t" 178c2ecf20Sopenharmony_ci "mov.b @%1+, %2\n\t" 188c2ecf20Sopenharmony_ci "mov.b %2, @%0\n\t" 198c2ecf20Sopenharmony_ci "cmp/eq #0, %2\n\t" 208c2ecf20Sopenharmony_ci "bf/s 1b\n\t" 218c2ecf20Sopenharmony_ci " add #1, %0\n\t" 228c2ecf20Sopenharmony_ci : "=r" (__dest), "=r" (__src), "=&z" (__dummy) 238c2ecf20Sopenharmony_ci : "0" (__dest), "1" (__src) 248c2ecf20Sopenharmony_ci : "memory", "t"); 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci return __xdest; 278c2ecf20Sopenharmony_ci} 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci#define __HAVE_ARCH_STRCMP 308c2ecf20Sopenharmony_cistatic inline int strcmp(const char *__cs, const char *__ct) 318c2ecf20Sopenharmony_ci{ 328c2ecf20Sopenharmony_ci register int __res; 338c2ecf20Sopenharmony_ci unsigned long __dummy; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci __asm__ __volatile__( 368c2ecf20Sopenharmony_ci "mov.b @%1+, %3\n" 378c2ecf20Sopenharmony_ci "1:\n\t" 388c2ecf20Sopenharmony_ci "mov.b @%0+, %2\n\t" 398c2ecf20Sopenharmony_ci "cmp/eq #0, %3\n\t" 408c2ecf20Sopenharmony_ci "bt 2f\n\t" 418c2ecf20Sopenharmony_ci "cmp/eq %2, %3\n\t" 428c2ecf20Sopenharmony_ci "bt/s 1b\n\t" 438c2ecf20Sopenharmony_ci " mov.b @%1+, %3\n\t" 448c2ecf20Sopenharmony_ci "add #-2, %1\n\t" 458c2ecf20Sopenharmony_ci "mov.b @%1, %3\n\t" 468c2ecf20Sopenharmony_ci "sub %3, %2\n" 478c2ecf20Sopenharmony_ci "2:" 488c2ecf20Sopenharmony_ci : "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy) 498c2ecf20Sopenharmony_ci : "0" (__cs), "1" (__ct) 508c2ecf20Sopenharmony_ci : "t"); 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci return __res; 538c2ecf20Sopenharmony_ci} 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci#define __HAVE_ARCH_STRNCMP 568c2ecf20Sopenharmony_cistatic inline int strncmp(const char *__cs, const char *__ct, size_t __n) 578c2ecf20Sopenharmony_ci{ 588c2ecf20Sopenharmony_ci register int __res; 598c2ecf20Sopenharmony_ci unsigned long __dummy; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci if (__n == 0) 628c2ecf20Sopenharmony_ci return 0; 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci __asm__ __volatile__( 658c2ecf20Sopenharmony_ci "mov.b @%1+, %3\n" 668c2ecf20Sopenharmony_ci "1:\n\t" 678c2ecf20Sopenharmony_ci "mov.b @%0+, %2\n\t" 688c2ecf20Sopenharmony_ci "cmp/eq %6, %0\n\t" 698c2ecf20Sopenharmony_ci "bt/s 2f\n\t" 708c2ecf20Sopenharmony_ci " cmp/eq #0, %3\n\t" 718c2ecf20Sopenharmony_ci "bt/s 3f\n\t" 728c2ecf20Sopenharmony_ci " cmp/eq %3, %2\n\t" 738c2ecf20Sopenharmony_ci "bt/s 1b\n\t" 748c2ecf20Sopenharmony_ci " mov.b @%1+, %3\n\t" 758c2ecf20Sopenharmony_ci "add #-2, %1\n\t" 768c2ecf20Sopenharmony_ci "mov.b @%1, %3\n" 778c2ecf20Sopenharmony_ci "2:\n\t" 788c2ecf20Sopenharmony_ci "sub %3, %2\n" 798c2ecf20Sopenharmony_ci "3:" 808c2ecf20Sopenharmony_ci :"=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy) 818c2ecf20Sopenharmony_ci : "0" (__cs), "1" (__ct), "r" (__cs+__n) 828c2ecf20Sopenharmony_ci : "t"); 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci return __res; 858c2ecf20Sopenharmony_ci} 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci#define __HAVE_ARCH_MEMSET 888c2ecf20Sopenharmony_ciextern void *memset(void *__s, int __c, size_t __count); 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci#define __HAVE_ARCH_MEMCPY 918c2ecf20Sopenharmony_ciextern void *memcpy(void *__to, __const__ void *__from, size_t __n); 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci#define __HAVE_ARCH_MEMMOVE 948c2ecf20Sopenharmony_ciextern void *memmove(void *__dest, __const__ void *__src, size_t __n); 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci#define __HAVE_ARCH_MEMCHR 978c2ecf20Sopenharmony_ciextern void *memchr(const void *__s, int __c, size_t __n); 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci#define __HAVE_ARCH_STRLEN 1008c2ecf20Sopenharmony_ciextern size_t strlen(const char *); 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci#endif /* __ASM_SH_STRING_H */ 103