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

source code of linux/arch/sh/lib/memset.S