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.
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, write to the Free
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
24 /* void *memset(void *s, int c, size_t n).
26 This routine could be optimized further for MIPS64, but this is left
27 as an exercise for the future. When it is done, the file should be kept
28 as a sisterfile to this one, and placed in the sysdeps/mips/mips64
31 #if __BYTE_ORDER == __BIG_ENDIAN
32 # define SWHI swl /* high part is left in big-endian */
34 # define SWHI swr /* high part is right in little-endian */
47 slti t1, a2, 8 # Less than 8?
48 bne t1, zero, L(last8)
49 move v0, a0 # Setup exit value before too late
51 beq a1, zero, L(ueven) # If zero pattern, no need to extend
52 andi a1, 0xff # Avoid problems with bogus arguments
56 or a1, t0 # a1 is now pattern in full word
58 L(ueven): subu t0, zero, a0 # Unaligned address?
62 SWHI a1, 0(a0) # Yes, handle first unaligned part
63 addu a0, t0 # Now both a0 and a2 are updated
65 L(chkw): andi t0, a2, 0x7 # Enough left for one loop iteration?
68 addu a3, a0 # a3 is last loop address +1
69 move a2, t0 # a2 is now # of bytes left after loop
70 L(loopw): addiu a0, 8 # Handle 2 words pr. iteration
75 L(chkl): andi t0, a2, 0x4 # Check if there is at least a full
76 beq t0, zero, L(last8) # word remaining after the loop
81 L(last8): blez a2, L(exit) # Handle last 8 bytes (if cnt>0)
82 addu a3, a2, a0 # a3 is last address +1
86 L(exit): j ra # Bye, bye