OSDN Git Service

hidden_def/hidden_proto: convert all users (I hope) termios split, add some missing...
[uclinux-h8/uClibc.git] / libc / string / mips / memset.S
1 /* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Hartvig Ekner <hartvige@mips.com>, 2002.
4
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.
9
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.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <features.h>
21 /*#include <sysdep.h>*/
22 #include <endian.h>
23 #include "sysdep.h"
24
25 #ifdef __mips64
26 #error mips32 code being compiled for mips64!
27 #endif
28
29 /* void *memset(void *s, int c, size_t n).  */
30
31 #if __BYTE_ORDER == __BIG_ENDIAN
32 # define SWHI   swl             /* high part is left in big-endian      */
33 #else
34 # define SWHI   swr             /* high part is right in little-endian  */
35 #endif
36
37 ENTRY (memset)
38         .set    noreorder
39
40         slti    t1, a2, 8               # Less than 8?
41         bne     t1, zero, L(last8)
42         move    v0, a0                  # Setup exit value before too late
43
44         beq     a1, zero, L(ueven)      # If zero pattern, no need to extend
45         andi    a1, 0xff                # Avoid problems with bogus arguments
46         sll     t0, a1, 8
47         or      a1, t0
48         sll     t0, a1, 16
49         or      a1, t0                  # a1 is now pattern in full word
50
51 L(ueven):       
52         subu    t0, zero, a0            # Unaligned address?
53         andi    t0, 0x3
54         beq     t0, zero, L(chkw)
55         subu    a2, t0
56         SWHI    a1, 0(a0)               # Yes, handle first unaligned part
57         addu    a0, t0                  # Now both a0 and a2 are updated
58
59 L(chkw):        
60         andi    t0, a2, 0x7             # Enough left for one loop iteration?
61         beq     t0, a2, L(chkl)
62         subu    a3, a2, t0
63         addu    a3, a0                  # a3 is last loop address +1
64         move    a2, t0                  # a2 is now # of bytes left after loop
65 L(loopw):       
66         addiu   a0, 8                   # Handle 2 words pr. iteration
67         sw      a1, -8(a0)
68         bne     a0, a3, L(loopw)
69         sw      a1, -4(a0)
70
71 L(chkl):        
72         andi    t0, a2, 0x4             # Check if there is at least a full
73         beq     t0, zero, L(last8)      #  word remaining after the loop
74         subu    a2, t0
75         sw      a1, 0(a0)               # Yes...
76         addiu   a0, 4
77
78 L(last8):       
79         blez    a2, L(exit)             # Handle last 8 bytes (if cnt>0)
80         addu    a3, a2, a0              # a3 is last address +1
81 L(lst8l):       
82         addiu   a0, 1
83         bne     a0, a3, L(lst8l)
84         sb      a1, -1(a0)
85 L(exit):        
86         j       ra                      # Bye, bye
87         nop
88
89         .set    reorder
90 END (memset)
91
92 libc_hidden_def(memset)