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