| /* |
| * Copyright (C) 2004-2007 Atmel Corporation |
| * |
| * This file is subject to the terms and conditions of the GNU Lesser General |
| * Public License. See the file "COPYING.LIB" in the main directory of this |
| * archive for more details. |
| */ |
| |
| #include <features.h> |
| |
| #define s r12 |
| #define c r11 |
| #define n r10 |
| |
| .text |
| .global memset |
| .type memset, @function |
| |
| .align 1 |
| memset: |
| cp.w n, 32 |
| mov r9, s |
| brge .Llarge_memset |
| |
| sub n, 1 |
| retlt s |
| 1: st.b s++, c |
| sub n, 1 |
| brge 1b |
| |
| retal r9 |
| |
| .Llarge_memset: |
| mov r8, r11 |
| mov r11, 3 |
| bfins r8, r8, 8, 8 |
| bfins r8, r8, 16, 16 |
| tst s, r11 |
| breq 2f |
| |
| 1: st.b s++, r8 |
| sub n, 1 |
| tst s, r11 |
| brne 1b |
| |
| 2: mov r11, r9 |
| mov r9, r8 |
| sub n, 8 |
| |
| 3: st.d s++, r8 |
| sub n, 8 |
| brge 3b |
| |
| /* If we are done, n == -8 and we'll skip all st.b insns below */ |
| neg n |
| lsl n, 1 |
| add pc, n |
| .rept 7 |
| st.b s++, r8 |
| .endr |
| retal r11 |
| |
| .size memset, . - memset |
| |
| libc_hidden_def(memset) |