xref: /kernel/linux/linux-6.6/arch/arc/lib/memcpy-700.S (revision 62306a36)
162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/linkage.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ciENTRY_CFI(memcpy)
962306a36Sopenharmony_ci	or	r3,r0,r1
1062306a36Sopenharmony_ci	asl_s	r3,r3,30
1162306a36Sopenharmony_ci	mov_s	r5,r0
1262306a36Sopenharmony_ci	brls.d	r2,r3,.Lcopy_bytewise
1362306a36Sopenharmony_ci	sub.f	r3,r2,1
1462306a36Sopenharmony_ci	ld_s	r12,[r1,0]
1562306a36Sopenharmony_ci	asr.f	lp_count,r3,3
1662306a36Sopenharmony_ci	bbit0.d	r3,2,.Lnox4
1762306a36Sopenharmony_ci	bmsk_s	r2,r2,1
1862306a36Sopenharmony_ci	st.ab	r12,[r5,4]
1962306a36Sopenharmony_ci	ld.a	r12,[r1,4]
2062306a36Sopenharmony_ci.Lnox4:
2162306a36Sopenharmony_ci	lppnz	.Lendloop
2262306a36Sopenharmony_ci	ld_s	r3,[r1,4]
2362306a36Sopenharmony_ci	st.ab	r12,[r5,4]
2462306a36Sopenharmony_ci	ld.a	r12,[r1,8]
2562306a36Sopenharmony_ci	st.ab	r3,[r5,4]
2662306a36Sopenharmony_ci.Lendloop:
2762306a36Sopenharmony_ci	breq	r2,0,.Last_store
2862306a36Sopenharmony_ci	ld	r3,[r5,0]
2962306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN__
3062306a36Sopenharmony_ci	add3	r2,-1,r2
3162306a36Sopenharmony_ci	; uses long immediate
3262306a36Sopenharmony_ci	xor_s	r12,r12,r3
3362306a36Sopenharmony_ci	bmsk	r12,r12,r2
3462306a36Sopenharmony_ci    xor_s	r12,r12,r3
3562306a36Sopenharmony_ci#else /* BIG ENDIAN */
3662306a36Sopenharmony_ci	sub3	r2,31,r2
3762306a36Sopenharmony_ci	; uses long immediate
3862306a36Sopenharmony_ci        xor_s	r3,r3,r12
3962306a36Sopenharmony_ci        bmsk	r3,r3,r2
4062306a36Sopenharmony_ci        xor_s	r12,r12,r3
4162306a36Sopenharmony_ci#endif /* ENDIAN */
4262306a36Sopenharmony_ci.Last_store:
4362306a36Sopenharmony_ci	j_s.d	[blink]
4462306a36Sopenharmony_ci	st	r12,[r5,0]
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	.balign	4
4762306a36Sopenharmony_ci.Lcopy_bytewise:
4862306a36Sopenharmony_ci	jcs	[blink]
4962306a36Sopenharmony_ci	ldb_s	r12,[r1,0]
5062306a36Sopenharmony_ci	lsr.f	lp_count,r3
5162306a36Sopenharmony_ci	bhs_s	.Lnox1
5262306a36Sopenharmony_ci	stb.ab	r12,[r5,1]
5362306a36Sopenharmony_ci	ldb.a	r12,[r1,1]
5462306a36Sopenharmony_ci.Lnox1:
5562306a36Sopenharmony_ci	lppnz	.Lendbloop
5662306a36Sopenharmony_ci	ldb_s	r3,[r1,1]
5762306a36Sopenharmony_ci	stb.ab	r12,[r5,1]
5862306a36Sopenharmony_ci	ldb.a	r12,[r1,2]
5962306a36Sopenharmony_ci	stb.ab	r3,[r5,1]
6062306a36Sopenharmony_ci.Lendbloop:
6162306a36Sopenharmony_ci	j_s.d	[blink]
6262306a36Sopenharmony_ci	stb	r12,[r5,0]
6362306a36Sopenharmony_ciEND_CFI(memcpy)
64