Add Changelog ...
[glibc.git] / sysdeps / mips / memset.S
blob30a0ba44e78da201583cca2ac77ed8d0a074b26b
1 /* Copyright (C) 2002-2012 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Hartvig Ekner <hartvige@mips.com>, 2002.
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library.  If not, see
17    <http://www.gnu.org/licenses/>.  */
19 #include <sysdep.h>
22 /* void *memset(void *s, int c, size_t n).  */
24 #if __MIPSEB
25 # define SWHI   swl             /* high part is left in big-endian      */
26 #else
27 # define SWHI   swr             /* high part is right in little-endian  */
28 #endif
30 ENTRY (memset)
31         .set    noreorder
33         slti    t1, a2, 8               # Less than 8?
34         bne     t1, zero, L(last8)
35         move    v0, a0                  # Setup exit value before too late
37         beq     a1, zero, L(ueven)      # If zero pattern, no need to extend
38         andi    a1, 0xff                # Avoid problems with bogus arguments
39         sll     t0, a1, 8
40         or      a1, t0
41         sll     t0, a1, 16
42         or      a1, t0                  # a1 is now pattern in full word
44 L(ueven):       
45         subu    t0, zero, a0            # Unaligned address?
46         andi    t0, 0x3
47         beq     t0, zero, L(chkw)
48         subu    a2, t0
49         SWHI    a1, 0(a0)               # Yes, handle first unaligned part
50         addu    a0, t0                  # Now both a0 and a2 are updated
52 L(chkw):        
53         andi    t0, a2, 0x7             # Enough left for one loop iteration?
54         beq     t0, a2, L(chkl)
55         subu    a3, a2, t0
56         addu    a3, a0                  # a3 is last loop address +1
57         move    a2, t0                  # a2 is now # of bytes left after loop
58 L(loopw):       
59         addiu   a0, 8                   # Handle 2 words pr. iteration
60         sw      a1, -8(a0)
61         bne     a0, a3, L(loopw)
62         sw      a1, -4(a0)
64 L(chkl):        
65         andi    t0, a2, 0x4             # Check if there is at least a full
66         beq     t0, zero, L(last8)      #  word remaining after the loop
67         subu    a2, t0
68         sw      a1, 0(a0)               # Yes...
69         addiu   a0, 4
71 L(last8):       
72         blez    a2, L(exit)             # Handle last 8 bytes (if cnt>0)
73         addu    a3, a2, a0              # a3 is last address +1
74 L(lst8l):       
75         addiu   a0, 1
76         bne     a0, a3, L(lst8l)
77         sb      a1, -1(a0)
78 L(exit):        
79         j       ra                      # Bye, bye
80         nop
82         .set    reorder
83 END (memset)
84 libc_hidden_builtin_def (memset)