162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* $Id: strlen.S,v 1.2 2001/06/29 14:07:15 gniibe Exp $
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * "strlen" implementation of SuperH
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 1999  Kaz Kojima
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci/* size_t strlen (const char *s)  */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/linkage.h>
1362306a36Sopenharmony_ciENTRY(strlen)
1462306a36Sopenharmony_ci	mov	r4,r0
1562306a36Sopenharmony_ci	and	#3,r0
1662306a36Sopenharmony_ci	tst	r0,r0
1762306a36Sopenharmony_ci	bt/s	1f
1862306a36Sopenharmony_ci	 mov	#0,r2
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	add	#-1,r0
2162306a36Sopenharmony_ci	shll2	r0
2262306a36Sopenharmony_ci	shll	r0
2362306a36Sopenharmony_ci	braf	r0
2462306a36Sopenharmony_ci	 nop
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	mov.b	@r4+,r1
2762306a36Sopenharmony_ci	tst	r1,r1
2862306a36Sopenharmony_ci	bt	8f
2962306a36Sopenharmony_ci	add	#1,r2
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	mov.b	@r4+,r1
3262306a36Sopenharmony_ci	tst	r1,r1
3362306a36Sopenharmony_ci	bt	8f
3462306a36Sopenharmony_ci	add	#1,r2
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	mov.b	@r4+,r1
3762306a36Sopenharmony_ci	tst	r1,r1
3862306a36Sopenharmony_ci	bt	8f
3962306a36Sopenharmony_ci	add	#1,r2
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci1:
4262306a36Sopenharmony_ci	mov	#0,r3
4362306a36Sopenharmony_ci2:
4462306a36Sopenharmony_ci	mov.l	@r4+,r1
4562306a36Sopenharmony_ci	cmp/str	r3,r1
4662306a36Sopenharmony_ci	bf/s	2b
4762306a36Sopenharmony_ci	 add	#4,r2
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	add	#-4,r2
5062306a36Sopenharmony_ci#ifndef __LITTLE_ENDIAN__
5162306a36Sopenharmony_ci	swap.b	r1,r1
5262306a36Sopenharmony_ci	swap.w	r1,r1
5362306a36Sopenharmony_ci	swap.b	r1,r1
5462306a36Sopenharmony_ci#endif
5562306a36Sopenharmony_ci	extu.b	r1,r0
5662306a36Sopenharmony_ci	tst	r0,r0
5762306a36Sopenharmony_ci	bt/s	8f
5862306a36Sopenharmony_ci	 shlr8	r1
5962306a36Sopenharmony_ci	add	#1,r2
6062306a36Sopenharmony_ci	extu.b	r1,r0
6162306a36Sopenharmony_ci	tst	r0,r0
6262306a36Sopenharmony_ci	bt/s	8f
6362306a36Sopenharmony_ci	 shlr8	r1
6462306a36Sopenharmony_ci	add	#1,r2
6562306a36Sopenharmony_ci	extu.b	r1,r0
6662306a36Sopenharmony_ci	tst	r0,r0
6762306a36Sopenharmony_ci	bt	8f
6862306a36Sopenharmony_ci	add	#1,r2
6962306a36Sopenharmony_ci8:
7062306a36Sopenharmony_ci	rts
7162306a36Sopenharmony_ci	 mov	r2,r0
72