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