memset.S (9268022b74279434ed6300244e3f977e56a8ceb5) memset.S (a215cdfdb0656f80bfc9a43ff914107596fd560a)
1/* $NetBSD: memset.S,v 1.4 2003/10/14 07:51:45 scw Exp $ */
2
3/*
4 * Copyright 2003 Wasabi Systems, Inc.
5 * All rights reserved.
6 *
7 * Written by Steve C. Woodford for Wasabi Systems, Inc.
8 *

--- 55 unchanged lines hidden (view full) ---

64 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
65 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
66 * SUCH DAMAGE.
67 */
68
69#include <machine/asm.h>
70__FBSDID("$FreeBSD$");
71
1/* $NetBSD: memset.S,v 1.4 2003/10/14 07:51:45 scw Exp $ */
2
3/*
4 * Copyright 2003 Wasabi Systems, Inc.
5 * All rights reserved.
6 *
7 * Written by Steve C. Woodford for Wasabi Systems, Inc.
8 *

--- 55 unchanged lines hidden (view full) ---

64 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
65 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
66 * SUCH DAMAGE.
67 */
68
69#include <machine/asm.h>
70__FBSDID("$FreeBSD$");
71
72.syntax unified
73
72/*
73 * memset: Sets a block of memory to the specified value
74 *
75 * On entry:
76 * r0 - dest address
77 * r1 - byte to write
78 * r2 - number of bytes to write
79 *

--- 40 unchanged lines hidden (view full) ---

120 mov r2, r3 /* Duplicate data */
121 cmp r1, #0x80 /* If < 128 then skip the big loop */
122 blt .Lmemset_loop32
123
124 /* Do 128 bytes at a time */
125.Lmemset_loop128:
126 subs r1, r1, #0x80
127#ifdef _ARM_ARCH_5E
74/*
75 * memset: Sets a block of memory to the specified value
76 *
77 * On entry:
78 * r0 - dest address
79 * r1 - byte to write
80 * r2 - number of bytes to write
81 *

--- 40 unchanged lines hidden (view full) ---

122 mov r2, r3 /* Duplicate data */
123 cmp r1, #0x80 /* If < 128 then skip the big loop */
124 blt .Lmemset_loop32
125
126 /* Do 128 bytes at a time */
127.Lmemset_loop128:
128 subs r1, r1, #0x80
129#ifdef _ARM_ARCH_5E
128 strged r2, [ip], #0x08
129 strged r2, [ip], #0x08
130 strged r2, [ip], #0x08
131 strged r2, [ip], #0x08
132 strged r2, [ip], #0x08
133 strged r2, [ip], #0x08
134 strged r2, [ip], #0x08
135 strged r2, [ip], #0x08
136 strged r2, [ip], #0x08
137 strged r2, [ip], #0x08
138 strged r2, [ip], #0x08
139 strged r2, [ip], #0x08
140 strged r2, [ip], #0x08
141 strged r2, [ip], #0x08
142 strged r2, [ip], #0x08
143 strged r2, [ip], #0x08
130 strdge r2, [ip], #0x08
131 strdge r2, [ip], #0x08
132 strdge r2, [ip], #0x08
133 strdge r2, [ip], #0x08
134 strdge r2, [ip], #0x08
135 strdge r2, [ip], #0x08
136 strdge r2, [ip], #0x08
137 strdge r2, [ip], #0x08
138 strdge r2, [ip], #0x08
139 strdge r2, [ip], #0x08
140 strdge r2, [ip], #0x08
141 strdge r2, [ip], #0x08
142 strdge r2, [ip], #0x08
143 strdge r2, [ip], #0x08
144 strdge r2, [ip], #0x08
145 strdge r2, [ip], #0x08
144#else
146#else
145 stmgeia ip!, {r2-r3}
146 stmgeia ip!, {r2-r3}
147 stmgeia ip!, {r2-r3}
148 stmgeia ip!, {r2-r3}
149 stmgeia ip!, {r2-r3}
150 stmgeia ip!, {r2-r3}
151 stmgeia ip!, {r2-r3}
152 stmgeia ip!, {r2-r3}
153 stmgeia ip!, {r2-r3}
154 stmgeia ip!, {r2-r3}
155 stmgeia ip!, {r2-r3}
156 stmgeia ip!, {r2-r3}
157 stmgeia ip!, {r2-r3}
158 stmgeia ip!, {r2-r3}
159 stmgeia ip!, {r2-r3}
160 stmgeia ip!, {r2-r3}
147 stmiage ip!, {r2-r3}
148 stmiage ip!, {r2-r3}
149 stmiage ip!, {r2-r3}
150 stmiage ip!, {r2-r3}
151 stmiage ip!, {r2-r3}
152 stmiage ip!, {r2-r3}
153 stmiage ip!, {r2-r3}
154 stmiage ip!, {r2-r3}
155 stmiage ip!, {r2-r3}
156 stmiage ip!, {r2-r3}
157 stmiage ip!, {r2-r3}
158 stmiage ip!, {r2-r3}
159 stmiage ip!, {r2-r3}
160 stmiage ip!, {r2-r3}
161 stmiage ip!, {r2-r3}
162 stmiage ip!, {r2-r3}
161#endif
162 bgt .Lmemset_loop128
163 RETeq /* Zero length so just exit */
164
165 add r1, r1, #0x80 /* Adjust for extra sub */
166
167 /* Do 32 bytes at a time */
168.Lmemset_loop32:
169 subs r1, r1, #0x20
170#ifdef _ARM_ARCH_5E
163#endif
164 bgt .Lmemset_loop128
165 RETeq /* Zero length so just exit */
166
167 add r1, r1, #0x80 /* Adjust for extra sub */
168
169 /* Do 32 bytes at a time */
170.Lmemset_loop32:
171 subs r1, r1, #0x20
172#ifdef _ARM_ARCH_5E
171 strged r2, [ip], #0x08
172 strged r2, [ip], #0x08
173 strged r2, [ip], #0x08
174 strged r2, [ip], #0x08
173 strdge r2, [ip], #0x08
174 strdge r2, [ip], #0x08
175 strdge r2, [ip], #0x08
176 strdge r2, [ip], #0x08
175#else
177#else
176 stmgeia ip!, {r2-r3}
177 stmgeia ip!, {r2-r3}
178 stmgeia ip!, {r2-r3}
179 stmgeia ip!, {r2-r3}
178 stmiage ip!, {r2-r3}
179 stmiage ip!, {r2-r3}
180 stmiage ip!, {r2-r3}
181 stmiage ip!, {r2-r3}
180#endif
181 bgt .Lmemset_loop32
182 RETeq /* Zero length so just exit */
183
184 adds r1, r1, #0x10 /* Partially adjust for extra sub */
185
186 /* Deal with 16 bytes or more */
187#ifdef _ARM_ARCH_5E
182#endif
183 bgt .Lmemset_loop32
184 RETeq /* Zero length so just exit */
185
186 adds r1, r1, #0x10 /* Partially adjust for extra sub */
187
188 /* Deal with 16 bytes or more */
189#ifdef _ARM_ARCH_5E
188 strged r2, [ip], #0x08
189 strged r2, [ip], #0x08
190 strdge r2, [ip], #0x08
191 strdge r2, [ip], #0x08
190#else
192#else
191 stmgeia ip!, {r2-r3}
192 stmgeia ip!, {r2-r3}
193 stmiage ip!, {r2-r3}
194 stmiage ip!, {r2-r3}
193#endif
194 RETeq /* Zero length so just exit */
195
196 addlt r1, r1, #0x10 /* Possibly adjust for extra sub */
197
198 /* We have at least 4 bytes so copy as words */
199.Lmemset_loop4:
200 subs r1, r1, #0x04

--- 6 unchanged lines hidden (view full) ---

207 adds r1, r1, #0x04
208 RETeq
209 cmp r1, #2
210#else
211 cmp r1, #-2
212#endif
213
214 strb r3, [ip], #0x01 /* Set 1 byte */
195#endif
196 RETeq /* Zero length so just exit */
197
198 addlt r1, r1, #0x10 /* Possibly adjust for extra sub */
199
200 /* We have at least 4 bytes so copy as words */
201.Lmemset_loop4:
202 subs r1, r1, #0x04

--- 6 unchanged lines hidden (view full) ---

209 adds r1, r1, #0x04
210 RETeq
211 cmp r1, #2
212#else
213 cmp r1, #-2
214#endif
215
216 strb r3, [ip], #0x01 /* Set 1 byte */
215 strgeb r3, [ip], #0x01 /* Set another byte */
216 strgtb r3, [ip] /* and a third */
217 strbge r3, [ip], #0x01 /* Set another byte */
218 strbgt r3, [ip] /* and a third */
217 RET /* Exit */
218
219.Lmemset_wordunaligned:
220 rsb r2, r2, #0x004
221 strb r3, [ip], #0x01 /* Set 1 byte */
222 cmp r2, #0x02
219 RET /* Exit */
220
221.Lmemset_wordunaligned:
222 rsb r2, r2, #0x004
223 strb r3, [ip], #0x01 /* Set 1 byte */
224 cmp r2, #0x02
223 strgeb r3, [ip], #0x01 /* Set another byte */
225 strbge r3, [ip], #0x01 /* Set another byte */
224 sub r1, r1, r2
226 sub r1, r1, r2
225 strgtb r3, [ip], #0x01 /* and a third */
227 strbgt r3, [ip], #0x01 /* and a third */
226 cmp r1, #0x04 /* More than 4 bytes left? */
227 bge .Lmemset_wordaligned /* Yup */
228
229.Lmemset_lessthanfour:
230 cmp r1, #0x00
231 RETeq /* Zero length so exit */
232 strb r3, [ip], #0x01 /* Set 1 byte */
233 cmp r1, #0x02
228 cmp r1, #0x04 /* More than 4 bytes left? */
229 bge .Lmemset_wordaligned /* Yup */
230
231.Lmemset_lessthanfour:
232 cmp r1, #0x00
233 RETeq /* Zero length so exit */
234 strb r3, [ip], #0x01 /* Set 1 byte */
235 cmp r1, #0x02
234 strgeb r3, [ip], #0x01 /* Set another byte */
235 strgtb r3, [ip] /* and a third */
236 strbge r3, [ip], #0x01 /* Set another byte */
237 strbgt r3, [ip] /* and a third */
236 RET /* Exit */
237#ifdef _BZERO
238END(bzero)
239#else
240END(memset)
241#endif
238 RET /* Exit */
239#ifdef _BZERO
240END(bzero)
241#else
242END(memset)
243#endif