memset.c revision 1.1.1.2.4.2 1 1.1.1.2.4.2 martin /* Copyright (C) 2012-2018 Free Software Foundation, Inc.
2 1.1 mrg
3 1.1 mrg This file is part of GCC.
4 1.1 mrg
5 1.1 mrg GCC is free software; you can redistribute it and/or modify it
6 1.1 mrg under the terms of the GNU General Public License as published by
7 1.1 mrg the Free Software Foundation; either version 3, or (at your option)
8 1.1 mrg any later version.
9 1.1 mrg
10 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT
11 1.1 mrg ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
13 1.1 mrg License for more details.
14 1.1 mrg
15 1.1 mrg Under Section 7 of GPL version 3, you are granted additional
16 1.1 mrg permissions described in the GCC Runtime Library Exception, version
17 1.1 mrg 3.1, as published by the Free Software Foundation.
18 1.1 mrg
19 1.1 mrg You should have received a copy of the GNU General Public License and
20 1.1 mrg a copy of the GCC Runtime Library Exception along with this program;
21 1.1 mrg see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
22 1.1 mrg <http://www.gnu.org/licenses/>. */
23 1.1 mrg
24 1.1 mrg /* This file must be kept in sync with newlib/libc/machine/visium/memset.c */
25 1.1 mrg
26 1.1 mrg #include <stddef.h>
27 1.1 mrg #include "memset.h"
28 1.1 mrg
29 1.1 mrg #define SET_32_OBJECTS(out) \
30 1.1 mrg do { \
31 1.1 mrg out [0] = m0; \
32 1.1 mrg out [1] = m0; \
33 1.1 mrg out [2] = m0; \
34 1.1 mrg out [3] = m0; \
35 1.1 mrg out [4] = m0; \
36 1.1 mrg out [5] = m0; \
37 1.1 mrg out [6] = m0; \
38 1.1 mrg out [7] = m0; \
39 1.1 mrg out [8] = m0; \
40 1.1 mrg out [9] = m0; \
41 1.1 mrg out [10] = m0; \
42 1.1 mrg out [11] = m0; \
43 1.1 mrg out [12] = m0; \
44 1.1 mrg out [13] = m0; \
45 1.1 mrg out [14] = m0; \
46 1.1 mrg out [15] = m0; \
47 1.1 mrg out [16] = m0; \
48 1.1 mrg out [17] = m0; \
49 1.1 mrg out [18] = m0; \
50 1.1 mrg out [19] = m0; \
51 1.1 mrg out [20] = m0; \
52 1.1 mrg out [21] = m0; \
53 1.1 mrg out [22] = m0; \
54 1.1 mrg out [23] = m0; \
55 1.1 mrg out [24] = m0; \
56 1.1 mrg out [25] = m0; \
57 1.1 mrg out [26] = m0; \
58 1.1 mrg out [27] = m0; \
59 1.1 mrg out [28] = m0; \
60 1.1 mrg out [29] = m0; \
61 1.1 mrg out [30] = m0; \
62 1.1 mrg out [31] = m0; \
63 1.1 mrg out += 32; \
64 1.1 mrg } while(0)
65 1.1 mrg
66 1.1 mrg #define SET_16_OBJECTS(out) \
67 1.1 mrg do { \
68 1.1 mrg out [0] = m0; \
69 1.1 mrg out [1] = m0; \
70 1.1 mrg out [2] = m0; \
71 1.1 mrg out [3] = m0; \
72 1.1 mrg out [4] = m0; \
73 1.1 mrg out [5] = m0; \
74 1.1 mrg out [6] = m0; \
75 1.1 mrg out [7] = m0; \
76 1.1 mrg out [8] = m0; \
77 1.1 mrg out [9] = m0; \
78 1.1 mrg out [10] = m0; \
79 1.1 mrg out [11] = m0; \
80 1.1 mrg out [12] = m0; \
81 1.1 mrg out [13] = m0; \
82 1.1 mrg out [14] = m0; \
83 1.1 mrg out [15] = m0; \
84 1.1 mrg out += 16; \
85 1.1 mrg } while(0)
86 1.1 mrg
87 1.1 mrg #define SET_12_OBJECTS(out) \
88 1.1 mrg do { \
89 1.1 mrg out [0] = m0; \
90 1.1 mrg out [1] = m0; \
91 1.1 mrg out [2] = m0; \
92 1.1 mrg out [3] = m0; \
93 1.1 mrg out [4] = m0; \
94 1.1 mrg out [5] = m0; \
95 1.1 mrg out [6] = m0; \
96 1.1 mrg out [7] = m0; \
97 1.1 mrg out [8] = m0; \
98 1.1 mrg out [9] = m0; \
99 1.1 mrg out [10] = m0; \
100 1.1 mrg out [11] = m0; \
101 1.1 mrg out += 12; \
102 1.1 mrg } while(0)
103 1.1 mrg
104 1.1 mrg #define SET_11_OBJECTS(out) \
105 1.1 mrg do { \
106 1.1 mrg out [0] = m0; \
107 1.1 mrg out [1] = m0; \
108 1.1 mrg out [2] = m0; \
109 1.1 mrg out [3] = m0; \
110 1.1 mrg out [4] = m0; \
111 1.1 mrg out [5] = m0; \
112 1.1 mrg out [6] = m0; \
113 1.1 mrg out [7] = m0; \
114 1.1 mrg out [8] = m0; \
115 1.1 mrg out [9] = m0; \
116 1.1 mrg out [10] = m0; \
117 1.1 mrg out += 11; \
118 1.1 mrg } while(0)
119 1.1 mrg
120 1.1 mrg #define SET_10_OBJECTS(out) \
121 1.1 mrg do { \
122 1.1 mrg out [0] = m0; \
123 1.1 mrg out [1] = m0; \
124 1.1 mrg out [2] = m0; \
125 1.1 mrg out [3] = m0; \
126 1.1 mrg out [4] = m0; \
127 1.1 mrg out [5] = m0; \
128 1.1 mrg out [6] = m0; \
129 1.1 mrg out [7] = m0; \
130 1.1 mrg out [8] = m0; \
131 1.1 mrg out [9] = m0; \
132 1.1 mrg out += 10; \
133 1.1 mrg } while(0)
134 1.1 mrg
135 1.1 mrg #define SET_9_OBJECTS(out) \
136 1.1 mrg do { \
137 1.1 mrg out [0] = m0; \
138 1.1 mrg out [1] = m0; \
139 1.1 mrg out [2] = m0; \
140 1.1 mrg out [3] = m0; \
141 1.1 mrg out [4] = m0; \
142 1.1 mrg out [5] = m0; \
143 1.1 mrg out [6] = m0; \
144 1.1 mrg out [7] = m0; \
145 1.1 mrg out [8] = m0; \
146 1.1 mrg out += 9; \
147 1.1 mrg } while(0)
148 1.1 mrg
149 1.1 mrg #define SET_8_OBJECTS(out) \
150 1.1 mrg do { \
151 1.1 mrg out [0] = m0; \
152 1.1 mrg out [1] = m0; \
153 1.1 mrg out [2] = m0; \
154 1.1 mrg out [3] = m0; \
155 1.1 mrg out [4] = m0; \
156 1.1 mrg out [5] = m0; \
157 1.1 mrg out [6] = m0; \
158 1.1 mrg out [7] = m0; \
159 1.1 mrg out += 8; \
160 1.1 mrg } while(0)
161 1.1 mrg
162 1.1 mrg #define SET_7_OBJECTS(out) \
163 1.1 mrg do { \
164 1.1 mrg out [0] = m0; \
165 1.1 mrg out [1] = m0; \
166 1.1 mrg out [2] = m0; \
167 1.1 mrg out [3] = m0; \
168 1.1 mrg out [4] = m0; \
169 1.1 mrg out [5] = m0; \
170 1.1 mrg out [6] = m0; \
171 1.1 mrg out += 7; \
172 1.1 mrg } while(0)
173 1.1 mrg
174 1.1 mrg #define SET_6_OBJECTS(out) \
175 1.1 mrg do { \
176 1.1 mrg out [0] = m0; \
177 1.1 mrg out [1] = m0; \
178 1.1 mrg out [2] = m0; \
179 1.1 mrg out [3] = m0; \
180 1.1 mrg out [4] = m0; \
181 1.1 mrg out [5] = m0; \
182 1.1 mrg out += 6; \
183 1.1 mrg } while(0)
184 1.1 mrg
185 1.1 mrg #define SET_5_OBJECTS(out) \
186 1.1 mrg do { \
187 1.1 mrg out [0] = m0; \
188 1.1 mrg out [1] = m0; \
189 1.1 mrg out [2] = m0; \
190 1.1 mrg out [3] = m0; \
191 1.1 mrg out [4] = m0; \
192 1.1 mrg out += 5; \
193 1.1 mrg } while(0)
194 1.1 mrg
195 1.1 mrg #define SET_4_OBJECTS(out) \
196 1.1 mrg do { \
197 1.1 mrg out [0] = m0; \
198 1.1 mrg out [1] = m0; \
199 1.1 mrg out [2] = m0; \
200 1.1 mrg out [3] = m0; \
201 1.1 mrg out += 4; \
202 1.1 mrg } while(0)
203 1.1 mrg
204 1.1 mrg #define SET_3_OBJECTS(out) \
205 1.1 mrg do { \
206 1.1 mrg out [0] = m0; \
207 1.1 mrg out [1] = m0; \
208 1.1 mrg out [2] = m0; \
209 1.1 mrg out += 3; \
210 1.1 mrg } while(0)
211 1.1 mrg
212 1.1 mrg #define SET_2_OBJECTS(out) \
213 1.1 mrg do { \
214 1.1 mrg out [0] = m0; \
215 1.1 mrg out [1] = m0; \
216 1.1 mrg out += 2; \
217 1.1 mrg } while(0)
218 1.1 mrg
219 1.1 mrg #define SET_1_OBJECT(out) \
220 1.1 mrg do { \
221 1.1 mrg out [0] = m0; \
222 1.1 mrg out += 1; \
223 1.1 mrg } while(0)
224 1.1 mrg
225 1.1 mrg
226 1.1 mrg static inline void
227 1.1 mrg __int_memset (void *__restrict s1, int val, size_t n)
228 1.1 mrg {
229 1.1 mrg int value = n;
230 1.1 mrg int loop_var;
231 1.1 mrg int *out = s1;
232 1.1 mrg int count;
233 1.1 mrg int m0 = val;
234 1.1 mrg
235 1.1 mrg /* This code currently give a stall for any value with a 1->2 in the low 5
236 1.1 mrg bits, i.e. 1,2, 33,34 ? not acceptable! */
237 1.1 mrg switch (value & 0x1f)
238 1.1 mrg {
239 1.1 mrg case 0:
240 1.1 mrg break;
241 1.1 mrg case 1:
242 1.1 mrg SET_1_OBJECT (out);
243 1.1 mrg break;
244 1.1 mrg case 2:
245 1.1 mrg SET_2_OBJECTS (out);
246 1.1 mrg break;
247 1.1 mrg case 3:
248 1.1 mrg SET_3_OBJECTS (out);
249 1.1 mrg break;
250 1.1 mrg case 4:
251 1.1 mrg SET_4_OBJECTS (out);
252 1.1 mrg break;
253 1.1 mrg case 5:
254 1.1 mrg SET_5_OBJECTS (out);
255 1.1 mrg break;
256 1.1 mrg case 6:
257 1.1 mrg SET_6_OBJECTS (out);
258 1.1 mrg break;
259 1.1 mrg case 7:
260 1.1 mrg SET_7_OBJECTS (out);
261 1.1 mrg break;
262 1.1 mrg case 8:
263 1.1 mrg SET_8_OBJECTS (out);
264 1.1 mrg break;
265 1.1 mrg case 9:
266 1.1 mrg SET_9_OBJECTS (out);
267 1.1 mrg break;
268 1.1 mrg case 10:
269 1.1 mrg SET_10_OBJECTS (out);
270 1.1 mrg break;
271 1.1 mrg case 11:
272 1.1 mrg SET_11_OBJECTS (out);
273 1.1 mrg break;
274 1.1 mrg case 12:
275 1.1 mrg SET_12_OBJECTS (out);
276 1.1 mrg break;
277 1.1 mrg case 13:
278 1.1 mrg SET_9_OBJECTS (out);
279 1.1 mrg SET_4_OBJECTS (out);
280 1.1 mrg break;
281 1.1 mrg case 14:
282 1.1 mrg SET_12_OBJECTS (out);
283 1.1 mrg SET_2_OBJECTS (out);
284 1.1 mrg break;
285 1.1 mrg case 15:
286 1.1 mrg SET_11_OBJECTS (out);
287 1.1 mrg SET_4_OBJECTS (out);
288 1.1 mrg break;
289 1.1 mrg case 16:
290 1.1 mrg SET_16_OBJECTS (out);
291 1.1 mrg break;
292 1.1 mrg case 17:
293 1.1 mrg SET_11_OBJECTS (out);
294 1.1 mrg SET_6_OBJECTS (out);
295 1.1 mrg break;
296 1.1 mrg case 18:
297 1.1 mrg SET_9_OBJECTS (out);
298 1.1 mrg SET_9_OBJECTS (out);
299 1.1 mrg break;
300 1.1 mrg case 19:
301 1.1 mrg SET_16_OBJECTS (out);
302 1.1 mrg SET_3_OBJECTS (out);
303 1.1 mrg break;
304 1.1 mrg case 20:
305 1.1 mrg SET_16_OBJECTS (out);
306 1.1 mrg SET_4_OBJECTS (out);
307 1.1 mrg break;
308 1.1 mrg case 21:
309 1.1 mrg SET_16_OBJECTS (out);
310 1.1 mrg SET_5_OBJECTS (out);
311 1.1 mrg break;
312 1.1 mrg case 22:
313 1.1 mrg SET_16_OBJECTS (out);
314 1.1 mrg SET_6_OBJECTS (out);
315 1.1 mrg break;
316 1.1 mrg case 23:
317 1.1 mrg SET_16_OBJECTS (out);
318 1.1 mrg SET_7_OBJECTS (out);
319 1.1 mrg break;
320 1.1 mrg case 24:
321 1.1 mrg SET_16_OBJECTS (out);
322 1.1 mrg SET_8_OBJECTS (out);
323 1.1 mrg break;
324 1.1 mrg case 25:
325 1.1 mrg SET_16_OBJECTS (out);
326 1.1 mrg SET_9_OBJECTS (out);
327 1.1 mrg break;
328 1.1 mrg case 26:
329 1.1 mrg SET_16_OBJECTS (out);
330 1.1 mrg SET_10_OBJECTS (out);
331 1.1 mrg break;
332 1.1 mrg case 27:
333 1.1 mrg SET_16_OBJECTS (out);
334 1.1 mrg SET_11_OBJECTS (out);
335 1.1 mrg break;
336 1.1 mrg case 28:
337 1.1 mrg SET_16_OBJECTS (out);
338 1.1 mrg SET_8_OBJECTS (out);
339 1.1 mrg SET_4_OBJECTS (out);
340 1.1 mrg break;
341 1.1 mrg case 29:
342 1.1 mrg SET_16_OBJECTS (out);
343 1.1 mrg SET_9_OBJECTS (out);
344 1.1 mrg SET_4_OBJECTS (out);
345 1.1 mrg break;
346 1.1 mrg case 30:
347 1.1 mrg SET_16_OBJECTS (out);
348 1.1 mrg SET_12_OBJECTS (out);
349 1.1 mrg SET_2_OBJECTS (out);
350 1.1 mrg break;
351 1.1 mrg case 31:
352 1.1 mrg SET_16_OBJECTS (out);
353 1.1 mrg SET_11_OBJECTS (out);
354 1.1 mrg SET_4_OBJECTS (out);
355 1.1 mrg break;
356 1.1 mrg }
357 1.1 mrg
358 1.1 mrg /* This loop governs the asmptoptic behaviour of this algorithm, for long
359 1.1 mrg word copies. */
360 1.1 mrg count = value >> 5;
361 1.1 mrg for (loop_var = 0; loop_var < count; loop_var++)
362 1.1 mrg SET_32_OBJECTS (out);
363 1.1 mrg }
364 1.1 mrg
365 1.1 mrg static inline void
366 1.1 mrg __short_int_memset (void *__restrict s1, int val, size_t n)
367 1.1 mrg {
368 1.1 mrg int value = n;
369 1.1 mrg int loop_var;
370 1.1 mrg int short *out = s1;
371 1.1 mrg int count;
372 1.1 mrg int m0 = val;
373 1.1 mrg
374 1.1 mrg /* This code currently give a stall for any value with a 1->2 in the low 5
375 1.1 mrg bits, i.e. 1,2, 33,34 ? not acceptable! */
376 1.1 mrg switch (value & 0x1f)
377 1.1 mrg {
378 1.1 mrg case 0:
379 1.1 mrg break;
380 1.1 mrg case 1:
381 1.1 mrg SET_1_OBJECT (out);
382 1.1 mrg break;
383 1.1 mrg case 2:
384 1.1 mrg SET_2_OBJECTS (out);
385 1.1 mrg break;
386 1.1 mrg case 3:
387 1.1 mrg SET_3_OBJECTS (out);
388 1.1 mrg break;
389 1.1 mrg case 4:
390 1.1 mrg SET_4_OBJECTS (out);
391 1.1 mrg break;
392 1.1 mrg case 5:
393 1.1 mrg SET_5_OBJECTS (out);
394 1.1 mrg break;
395 1.1 mrg case 6:
396 1.1 mrg SET_6_OBJECTS (out);
397 1.1 mrg break;
398 1.1 mrg case 7:
399 1.1 mrg SET_7_OBJECTS (out);
400 1.1 mrg break;
401 1.1 mrg case 8:
402 1.1 mrg SET_8_OBJECTS (out);
403 1.1 mrg break;
404 1.1 mrg case 9:
405 1.1 mrg SET_9_OBJECTS (out);
406 1.1 mrg break;
407 1.1 mrg case 10:
408 1.1 mrg SET_10_OBJECTS (out);
409 1.1 mrg break;
410 1.1 mrg case 11:
411 1.1 mrg SET_11_OBJECTS (out);
412 1.1 mrg break;
413 1.1 mrg case 12:
414 1.1 mrg SET_12_OBJECTS (out);
415 1.1 mrg break;
416 1.1 mrg case 13:
417 1.1 mrg SET_9_OBJECTS (out);
418 1.1 mrg SET_4_OBJECTS (out);
419 1.1 mrg break;
420 1.1 mrg case 14:
421 1.1 mrg SET_12_OBJECTS (out);
422 1.1 mrg SET_2_OBJECTS (out);
423 1.1 mrg break;
424 1.1 mrg case 15:
425 1.1 mrg SET_11_OBJECTS (out);
426 1.1 mrg SET_4_OBJECTS (out);
427 1.1 mrg break;
428 1.1 mrg case 16:
429 1.1 mrg SET_16_OBJECTS (out);
430 1.1 mrg break;
431 1.1 mrg case 17:
432 1.1 mrg SET_11_OBJECTS (out);
433 1.1 mrg SET_6_OBJECTS (out);
434 1.1 mrg break;
435 1.1 mrg case 18:
436 1.1 mrg SET_9_OBJECTS (out);
437 1.1 mrg SET_9_OBJECTS (out);
438 1.1 mrg break;
439 1.1 mrg case 19:
440 1.1 mrg SET_16_OBJECTS (out);
441 1.1 mrg SET_3_OBJECTS (out);
442 1.1 mrg break;
443 1.1 mrg case 20:
444 1.1 mrg SET_16_OBJECTS (out);
445 1.1 mrg SET_4_OBJECTS (out);
446 1.1 mrg break;
447 1.1 mrg case 21:
448 1.1 mrg SET_16_OBJECTS (out);
449 1.1 mrg SET_5_OBJECTS (out);
450 1.1 mrg break;
451 1.1 mrg case 22:
452 1.1 mrg SET_16_OBJECTS (out);
453 1.1 mrg SET_6_OBJECTS (out);
454 1.1 mrg break;
455 1.1 mrg case 23:
456 1.1 mrg SET_16_OBJECTS (out);
457 1.1 mrg SET_7_OBJECTS (out);
458 1.1 mrg break;
459 1.1 mrg case 24:
460 1.1 mrg SET_16_OBJECTS (out);
461 1.1 mrg SET_8_OBJECTS (out);
462 1.1 mrg break;
463 1.1 mrg case 25:
464 1.1 mrg SET_16_OBJECTS (out);
465 1.1 mrg SET_9_OBJECTS (out);
466 1.1 mrg break;
467 1.1 mrg case 26:
468 1.1 mrg SET_16_OBJECTS (out);
469 1.1 mrg SET_10_OBJECTS (out);
470 1.1 mrg break;
471 1.1 mrg case 27:
472 1.1 mrg SET_16_OBJECTS (out);
473 1.1 mrg SET_11_OBJECTS (out);
474 1.1 mrg break;
475 1.1 mrg case 28:
476 1.1 mrg SET_16_OBJECTS (out);
477 1.1 mrg SET_8_OBJECTS (out);
478 1.1 mrg SET_4_OBJECTS (out);
479 1.1 mrg break;
480 1.1 mrg case 29:
481 1.1 mrg SET_16_OBJECTS (out);
482 1.1 mrg SET_9_OBJECTS (out);
483 1.1 mrg SET_4_OBJECTS (out);
484 1.1 mrg break;
485 1.1 mrg case 30:
486 1.1 mrg SET_16_OBJECTS (out);
487 1.1 mrg SET_12_OBJECTS (out);
488 1.1 mrg SET_2_OBJECTS (out);
489 1.1 mrg break;
490 1.1 mrg case 31:
491 1.1 mrg SET_16_OBJECTS (out);
492 1.1 mrg SET_11_OBJECTS (out);
493 1.1 mrg SET_4_OBJECTS (out);
494 1.1 mrg break;
495 1.1 mrg }
496 1.1 mrg
497 1.1 mrg /* This loop governs the asmptoptic behaviour of this algorithm, for long
498 1.1 mrg word copies. */
499 1.1 mrg count = value >> 5;
500 1.1 mrg for (loop_var = 0; loop_var < count; loop_var++)
501 1.1 mrg SET_32_OBJECTS (out);
502 1.1 mrg }
503 1.1 mrg
504 1.1 mrg static inline void
505 1.1 mrg __byte_memset (void *__restrict s1, int val, size_t n)
506 1.1 mrg {
507 1.1 mrg int value = n;
508 1.1 mrg int loop_var;
509 1.1 mrg char *out = s1;
510 1.1 mrg int count;
511 1.1 mrg int m0 = val;
512 1.1 mrg
513 1.1 mrg /* This code currently give a stall for any value with a 1->2 in the low 5
514 1.1 mrg bits, i.e. 1,2, 33,34 ? not acceptable! */
515 1.1 mrg switch (value & 0x1f)
516 1.1 mrg {
517 1.1 mrg case 0:
518 1.1 mrg break;
519 1.1 mrg case 1:
520 1.1 mrg SET_1_OBJECT (out);
521 1.1 mrg break;
522 1.1 mrg case 2:
523 1.1 mrg SET_2_OBJECTS (out);
524 1.1 mrg break;
525 1.1 mrg case 3:
526 1.1 mrg SET_3_OBJECTS (out);
527 1.1 mrg break;
528 1.1 mrg case 4:
529 1.1 mrg SET_4_OBJECTS (out);
530 1.1 mrg break;
531 1.1 mrg case 5:
532 1.1 mrg SET_5_OBJECTS (out);
533 1.1 mrg break;
534 1.1 mrg case 6:
535 1.1 mrg SET_6_OBJECTS (out);
536 1.1 mrg break;
537 1.1 mrg case 7:
538 1.1 mrg SET_7_OBJECTS (out);
539 1.1 mrg break;
540 1.1 mrg case 8:
541 1.1 mrg SET_8_OBJECTS (out);
542 1.1 mrg break;
543 1.1 mrg case 9:
544 1.1 mrg SET_9_OBJECTS (out);
545 1.1 mrg break;
546 1.1 mrg case 10:
547 1.1 mrg SET_10_OBJECTS (out);
548 1.1 mrg break;
549 1.1 mrg case 11:
550 1.1 mrg SET_11_OBJECTS (out);
551 1.1 mrg break;
552 1.1 mrg case 12:
553 1.1 mrg SET_12_OBJECTS (out);
554 1.1 mrg break;
555 1.1 mrg case 13:
556 1.1 mrg SET_9_OBJECTS (out);
557 1.1 mrg SET_4_OBJECTS (out);
558 1.1 mrg break;
559 1.1 mrg case 14:
560 1.1 mrg SET_12_OBJECTS (out);
561 1.1 mrg SET_2_OBJECTS (out);
562 1.1 mrg break;
563 1.1 mrg case 15:
564 1.1 mrg SET_11_OBJECTS (out);
565 1.1 mrg SET_4_OBJECTS (out);
566 1.1 mrg break;
567 1.1 mrg case 16:
568 1.1 mrg SET_16_OBJECTS (out);
569 1.1 mrg break;
570 1.1 mrg case 17:
571 1.1 mrg SET_11_OBJECTS (out);
572 1.1 mrg SET_6_OBJECTS (out);
573 1.1 mrg break;
574 1.1 mrg case 18:
575 1.1 mrg SET_9_OBJECTS (out);
576 1.1 mrg SET_9_OBJECTS (out);
577 1.1 mrg break;
578 1.1 mrg case 19:
579 1.1 mrg SET_16_OBJECTS (out);
580 1.1 mrg SET_3_OBJECTS (out);
581 1.1 mrg break;
582 1.1 mrg case 20:
583 1.1 mrg SET_16_OBJECTS (out);
584 1.1 mrg SET_4_OBJECTS (out);
585 1.1 mrg break;
586 1.1 mrg case 21:
587 1.1 mrg SET_16_OBJECTS (out);
588 1.1 mrg SET_5_OBJECTS (out);
589 1.1 mrg break;
590 1.1 mrg case 22:
591 1.1 mrg SET_16_OBJECTS (out);
592 1.1 mrg SET_6_OBJECTS (out);
593 1.1 mrg break;
594 1.1 mrg case 23:
595 1.1 mrg SET_16_OBJECTS (out);
596 1.1 mrg SET_7_OBJECTS (out);
597 1.1 mrg break;
598 1.1 mrg case 24:
599 1.1 mrg SET_16_OBJECTS (out);
600 1.1 mrg SET_8_OBJECTS (out);
601 1.1 mrg break;
602 1.1 mrg case 25:
603 1.1 mrg SET_16_OBJECTS (out);
604 1.1 mrg SET_9_OBJECTS (out);
605 1.1 mrg break;
606 1.1 mrg case 26:
607 1.1 mrg SET_16_OBJECTS (out);
608 1.1 mrg SET_10_OBJECTS (out);
609 1.1 mrg break;
610 1.1 mrg case 27:
611 1.1 mrg SET_16_OBJECTS (out);
612 1.1 mrg SET_11_OBJECTS (out);
613 1.1 mrg break;
614 1.1 mrg case 28:
615 1.1 mrg SET_16_OBJECTS (out);
616 1.1 mrg SET_8_OBJECTS (out);
617 1.1 mrg SET_4_OBJECTS (out);
618 1.1 mrg break;
619 1.1 mrg case 29:
620 1.1 mrg SET_16_OBJECTS (out);
621 1.1 mrg SET_9_OBJECTS (out);
622 1.1 mrg SET_4_OBJECTS (out);
623 1.1 mrg break;
624 1.1 mrg case 30:
625 1.1 mrg SET_16_OBJECTS (out);
626 1.1 mrg SET_12_OBJECTS (out);
627 1.1 mrg SET_2_OBJECTS (out);
628 1.1 mrg break;
629 1.1 mrg case 31:
630 1.1 mrg SET_16_OBJECTS (out);
631 1.1 mrg SET_11_OBJECTS (out);
632 1.1 mrg SET_4_OBJECTS (out);
633 1.1 mrg break;
634 1.1 mrg }
635 1.1 mrg
636 1.1 mrg /* This loop governs the asmptoptic behaviour of this algorithm, for long
637 1.1 mrg word copies. */
638 1.1 mrg count = value >> 5;
639 1.1 mrg for (loop_var = 0; loop_var < count; loop_var++)
640 1.1 mrg SET_32_OBJECTS (out);
641 1.1 mrg }
642 1.1 mrg
643 1.1 mrg
644 1.1 mrg /* Exposed interface. */
645 1.1 mrg
646 1.1 mrg void
647 1.1 mrg __long_int_memset (void *__restrict s, int c, size_t n)
648 1.1 mrg {
649 1.1 mrg int ic = (c << 24) + ((char) c << 16) + ((char) c << 8) + (char) c;
650 1.1 mrg __int_memset (s, ic, n);
651 1.1 mrg }
652 1.1 mrg
653 1.1 mrg void
654 1.1 mrg __wrd_memset (void *__restrict s, int c, size_t n)
655 1.1 mrg {
656 1.1 mrg int sc = ((c << 8) + (char) c);
657 1.1 mrg __short_int_memset (s, sc, n);
658 1.1 mrg }
659 1.1 mrg
660 1.1 mrg void
661 1.1 mrg __byt_memset (void *__restrict s, int c, size_t n)
662 1.1 mrg {
663 1.1 mrg __byte_memset (s, c, n);
664 1.1 mrg }
665