Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/sh/lib/memset.S
26439 views
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
16
ENTRY(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
28
1:
29
dt r0
30
bf/s 1b
31
mov.b r5,@-r4
32
2: ! 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
42
3:
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
53
4:
54
dt r6
55
bf/s 4b
56
mov.b r5,@-r4
57
5:
58
rts
59
mov r4,r0
60
61