xref: /openbmc/linux/arch/sh/lib/memset.S (revision b4e18b29)
1/* SPDX-License-Identifier: GPL-2.0 */
2/* $Id: memset.S,v 1.1 2000/04/14 16:49:01 mjd Exp $
3 *
4 * "memset" implementation of SuperH
5 *
6 * Copyright (C) 1999  Niibe Yutaka
7 *
8 */
9
10/*
11 *            void *memset(void *s, int c, size_t n);
12 */
13
14#include <linux/linkage.h>
15
16ENTRY(memset)
17	tst	r6,r6
18	bt/s	5f		! if n=0, do nothing
19	 add	r6,r4
20	mov	#12,r0
21	cmp/gt	r6,r0
22	bt/s	4f		! if it's too small, set a byte at once
23	 mov	r4,r0
24	and	#3,r0
25	cmp/eq	#0,r0
26	bt/s	2f		! It's aligned
27	 sub	r0,r6
281:
29	dt	r0
30	bf/s	1b
31	 mov.b	r5,@-r4
322:				! make VVVV
33	extu.b	r5,r5
34	swap.b	r5,r0		!   V0
35	or	r0,r5		!   VV
36	swap.w	r5,r0		! VV00
37	or	r0,r5		! VVVV
38	!
39	mov	r6,r0
40	shlr2	r0
41	shlr	r0		! r0 = r6 >> 3
423:
43	dt	r0
44	mov.l	r5,@-r4		! set 8-byte at once
45	bf/s	3b
46	 mov.l	r5,@-r4
47	!
48	mov	#7,r0
49	and	r0,r6
50	tst	r6,r6
51	bt	5f
52	! fill bytes
534:
54	dt	r6
55	bf/s	4b
56	 mov.b	r5,@-r4
575:
58	rts
59	 mov	r4,r0
60