Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/m32r/lib/memset.S
10817 views
1
/*
2
* linux/arch/m32r/lib/memset.S
3
*
4
* Copyright (C) 2001,2002 Hiroyuki Kondo, and Hirokazu Takata
5
* Copyright (C) 2004 Hirokazu Takata
6
*
7
* void *memset(void *dst, int val, int len);
8
*
9
* dst: r0
10
* val: r1
11
* len: r2
12
* ret: r0
13
*
14
*/
15
16
.text
17
.global memset
18
19
#ifdef CONFIG_ISA_DUAL_ISSUE
20
21
.align 4
22
memset:
23
mv r4, r0 || cmpz r2
24
jc r14
25
cmpui r2, #16
26
bnc qword_align_check
27
cmpui r2, #4
28
bc byte_set
29
word_align_check: /* len >= 4 */
30
and3 r3, r4, #3
31
beqz r3, word_set
32
addi r3, #-4
33
neg r3, r3 /* r3 = -(r3 - 4) */
34
align_word:
35
stb r1, @r4 || addi r4, #1
36
addi r2, #-1 || addi r3, #-1
37
bnez r3, align_word
38
cmpui r2, #4
39
bc byte_set
40
word_set:
41
and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */
42
sll3 r3, r1, #8
43
or r1, r3 || addi r4, #-4
44
sll3 r3, r1, #16
45
or r1, r3 || addi r2, #-4
46
word_set_loop:
47
st r1, @+r4 || addi r2, #-4
48
bgtz r2, word_set_loop
49
bnez r2, byte_set_wrap
50
st r1, @+r4
51
jmp r14
52
53
qword_align_check: /* len >= 16 */
54
and3 r3, r4, #15
55
bnez r3, word_align_check
56
qword_set:
57
and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */
58
sll3 r3, r1, #8
59
or r1, r3 || addi r4, #-4
60
sll3 r3, r1, #16
61
or r1, r3 || ldi r5, #16
62
qword_set_loop:
63
ld r3, @(4,r4) /* cache line allocate */
64
st r1, @+r4 || addi r2, #-16
65
st r1, @+r4 || cmpu r2, r5
66
st r1, @+r4
67
st r1, @+r4
68
bnc qword_set_loop || cmpz r2
69
jc r14
70
set_remainder:
71
cmpui r2, #4
72
bc byte_set_wrap1
73
addi r2, #-4
74
bra word_set_loop
75
76
byte_set_wrap:
77
addi r2, #4
78
cmpz r2
79
jc r14
80
byte_set_wrap1:
81
addi r4, #4
82
#if defined(CONFIG_ISA_M32R2)
83
byte_set:
84
addi r2, #-1 || stb r1, @r4+
85
bnez r2, byte_set
86
#elif defined(CONFIG_ISA_M32R)
87
byte_set:
88
addi r2, #-1 || stb r1, @r4
89
addi r4, #1
90
bnez r2, byte_set
91
#else
92
#error unknown isa configuration
93
#endif
94
end_memset:
95
jmp r14
96
97
#else /* not CONFIG_ISA_DUAL_ISSUE */
98
99
.align 4
100
memset:
101
mv r4, r0
102
beqz r2, end_memset
103
cmpui r2, #16
104
bnc qword_align_check
105
cmpui r2, #4
106
bc byte_set
107
word_align_check: /* len >= 4 */
108
and3 r3, r4, #3
109
beqz r3, word_set
110
addi r3, #-4
111
neg r3, r3 /* r3 = -(r3 - 4) */
112
align_word:
113
stb r1, @r4
114
addi r4, #1
115
addi r2, #-1
116
addi r3, #-1
117
bnez r3, align_word
118
cmpui r2, #4
119
bc byte_set
120
word_set:
121
and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */
122
sll3 r3, r1, #8
123
or r1, r3
124
sll3 r3, r1, #16
125
or r1, r3
126
addi r2, #-4
127
addi r4, #-4
128
word_set_loop:
129
st r1, @+r4
130
addi r2, #-4
131
bgtz r2, word_set_loop
132
bnez r2, byte_set_wrap
133
st r1, @+r4
134
jmp r14
135
136
qword_align_check: /* len >= 16 */
137
and3 r3, r4, #15
138
bnez r3, word_align_check
139
qword_set:
140
and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */
141
sll3 r3, r1, #8
142
or r1, r3
143
sll3 r3, r1, #16
144
or r1, r3
145
addi r4, #-4
146
qword_set_loop:
147
ld r3, @(4,r4) /* cache line allocate */
148
addi r2, #-16
149
st r1, @+r4
150
st r1, @+r4
151
cmpui r2, #16
152
st r1, @+r4
153
st r1, @+r4
154
bnc qword_set_loop
155
bnez r2, set_remainder
156
jmp r14
157
set_remainder:
158
cmpui r2, #4
159
bc byte_set_wrap1
160
addi r2, #-4
161
bra word_set_loop
162
163
byte_set_wrap:
164
addi r2, #4
165
beqz r2, end_memset
166
byte_set_wrap1:
167
addi r4, #4
168
byte_set:
169
addi r2, #-1
170
stb r1, @r4
171
addi r4, #1
172
bnez r2, byte_set
173
end_memset:
174
jmp r14
175
176
#endif /* not CONFIG_ISA_DUAL_ISSUE */
177
178
.end
179
180