xref: /kernel/linux/linux-6.6/arch/arc/lib/memset.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_ci#define SMALL	7 /* Must be at least 6 to deal with alignment/loop issues.  */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciENTRY_CFI(memset)
1162306a36Sopenharmony_ci	mov_s	r4,r0
1262306a36Sopenharmony_ci	or	r12,r0,r2
1362306a36Sopenharmony_ci	bmsk.f	r12,r12,1
1462306a36Sopenharmony_ci	extb_s	r1,r1
1562306a36Sopenharmony_ci	asl	r3,r1,8
1662306a36Sopenharmony_ci	beq.d	.Laligned
1762306a36Sopenharmony_ci	or_s	r1,r1,r3
1862306a36Sopenharmony_ci	brls	r2,SMALL,.Ltiny
1962306a36Sopenharmony_ci	add	r3,r2,r0
2062306a36Sopenharmony_ci	stb	r1,[r3,-1]
2162306a36Sopenharmony_ci	bclr_s	r3,r3,0
2262306a36Sopenharmony_ci	stw	r1,[r3,-2]
2362306a36Sopenharmony_ci	bmsk.f	r12,r0,1
2462306a36Sopenharmony_ci	add_s	r2,r2,r12
2562306a36Sopenharmony_ci	sub.ne	r2,r2,4
2662306a36Sopenharmony_ci	stb.ab	r1,[r4,1]
2762306a36Sopenharmony_ci	and	r4,r4,-2
2862306a36Sopenharmony_ci	stw.ab	r1,[r4,2]
2962306a36Sopenharmony_ci	and	r4,r4,-4
3062306a36Sopenharmony_ci.Laligned:	; This code address should be aligned for speed.
3162306a36Sopenharmony_ci	asl	r3,r1,16
3262306a36Sopenharmony_ci	lsr.f	lp_count,r2,2
3362306a36Sopenharmony_ci	or_s	r1,r1,r3
3462306a36Sopenharmony_ci	lpne	.Loop_end
3562306a36Sopenharmony_ci	st.ab	r1,[r4,4]
3662306a36Sopenharmony_ci.Loop_end:
3762306a36Sopenharmony_ci	j_s	[blink]
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	.balign	4
4062306a36Sopenharmony_ci.Ltiny:
4162306a36Sopenharmony_ci	mov.f	lp_count,r2
4262306a36Sopenharmony_ci	lpne	.Ltiny_end
4362306a36Sopenharmony_ci	stb.ab	r1,[r4,1]
4462306a36Sopenharmony_ci.Ltiny_end:
4562306a36Sopenharmony_ci	j_s	[blink]
4662306a36Sopenharmony_ciEND_CFI(memset)
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci; memzero: @r0 = mem, @r1 = size_t
4962306a36Sopenharmony_ci; memset:  @r0 = mem, @r1 = char, @r2 = size_t
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ciENTRY_CFI(memzero)
5262306a36Sopenharmony_ci    ; adjust bzero args to memset args
5362306a36Sopenharmony_ci    mov r2, r1
5462306a36Sopenharmony_ci    mov r1, 0
5562306a36Sopenharmony_ci    b  memset    ;tail call so need to tinker with blink
5662306a36Sopenharmony_ciEND_CFI(memzero)
57