| /* Copyright (C) 1998 Free Software Foundation, Inc. |
| This file is part of the GNU C Library. |
| Contributed by Philip Blundell <philb@gnu.org> |
| |
| The GNU C Library is free software; you can redistribute it and/or |
| modify it under the terms of the GNU Lesser General Public |
| License as published by the Free Software Foundation; either |
| version 2.1 of the License, or (at your option) any later version. |
| |
| The GNU C Library is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public |
| License along with the GNU C Library; if not, write to the Free |
| Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA |
| 02111-1307 USA. */ |
| |
| #include <features.h> |
| #include <sys/syscall.h> |
| #include <bits/arm_asm.h> |
| |
| .text |
| .global memset |
| .type memset,%function |
| .align 4 |
| |
| #if defined(THUMB1_ONLY) |
| .thumb_func |
| memset: |
| mov ip, r0 |
| cmp r2, #8 @ at least 8 bytes to do? |
| bcc 2f |
| |
| lsl r3, r1, #8 |
| orr r1, r3 |
| lsl r3, r1, #16 |
| orr r1, r3 |
| |
| mov r3, #3 |
| 1: @ Fill up to the first word boundary |
| tst r0, r3 |
| beq 1f |
| strb r1, [r0] |
| add r0, r0, #1 |
| sub r2, r2, #1 |
| b 1b |
| 1: @ Fill aligned words |
| str r1, [r0] |
| add r0, r0, #4 |
| sub r2, r2, #4 |
| cmp r2, #4 |
| bcs 1b |
| |
| 2: @ Fill the remaining bytes |
| cmp r2, #0 |
| beq 2f |
| 1: |
| strb r1, [r0] |
| add r0, r0, #1 |
| sub r2, r2, #1 |
| bne 1b |
| 2: |
| mov r0, ip |
| bx lr |
| #else |
| memset: |
| mov a4, a1 |
| cmp a3, $8 @ at least 8 bytes to do? |
| blt 2f |
| orr a2, a2, a2, lsl $8 |
| orr a2, a2, a2, lsl $16 |
| 1: |
| tst a4, $3 @ aligned yet? |
| #if defined(__thumb2__) |
| itt ne |
| strbne a2, [a4], $1 |
| subne a3, a3, $1 |
| #else |
| strneb a2, [a4], $1 |
| subne a3, a3, $1 |
| #endif |
| bne 1b |
| mov ip, a2 |
| 1: |
| cmp a3, $8 @ 8 bytes still to do? |
| blt 2f |
| stmia a4!, {a2, ip} |
| sub a3, a3, $8 |
| cmp a3, $8 @ 8 bytes still to do? |
| blt 2f |
| stmia a4!, {a2, ip} |
| sub a3, a3, $8 |
| cmp a3, $8 @ 8 bytes still to do? |
| blt 2f |
| stmia a4!, {a2, ip} |
| sub a3, a3, $8 |
| cmp a3, $8 @ 8 bytes still to do? |
| #if defined(__thumb2__) |
| itt ge |
| stmiage a4!, {a2, ip} |
| subge a3, a3, $8 |
| #else |
| stmgeia a4!, {a2, ip} |
| subge a3, a3, $8 |
| #endif |
| bge 1b |
| 2: |
| movs a3, a3 @ anything left? |
| IT(t, eq) |
| #if defined(__USE_BX__) |
| bxeq lr |
| #else |
| moveq pc, lr @ nope |
| #endif |
| #if defined (__thumb2__) |
| 1: |
| strb a2, [a4], #1 |
| subs a3, a3, #1 |
| bne 1b |
| bx lr |
| #else |
| rsb a3, a3, $7 |
| add pc, pc, a3, lsl $2 |
| mov r0, r0 |
| strb a2, [a4], $1 |
| strb a2, [a4], $1 |
| strb a2, [a4], $1 |
| strb a2, [a4], $1 |
| strb a2, [a4], $1 |
| strb a2, [a4], $1 |
| strb a2, [a4], $1 |
| #if defined(__USE_BX__) |
| bx lr |
| #else |
| mov pc, lr |
| #endif |
| #endif |
| #endif |
| |
| .size memset,.-memset |
| |
| libc_hidden_def(memset) |