summaryrefslogtreecommitdiffstats
path: root/arch/mips64/lib
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-01-16 01:37:19 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-01-16 01:37:19 +0000
commit6181fecaeccd0bf111d6196ad63bec0f6ba90438 (patch)
tree61e4cf111540c2d0a6aaaaecde3c142434867e70 /arch/mips64/lib
parentff460746296634c87227a834fae561255b7fb2fc (diff)
Fix memset which was misstreating certain argument cases.
Diffstat (limited to 'arch/mips64/lib')
-rw-r--r--arch/mips64/lib/memset.S35
1 files changed, 20 insertions, 15 deletions
diff --git a/arch/mips64/lib/memset.S b/arch/mips64/lib/memset.S
index 56dc72160..4a051cebf 100644
--- a/arch/mips64/lib/memset.S
+++ b/arch/mips64/lib/memset.S
@@ -1,4 +1,4 @@
-/* $Id: memset.S,v 1.2 1999/10/19 20:51:51 ralf Exp $
+/* $Id: memset.S,v 1.3 2000/01/15 23:48:55 ralf Exp $
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
@@ -18,14 +18,14 @@
.previous
#define F_FILL64(dst, offset, val, fixup) \
- EX(sw, val, (offset + 0x00)(dst), fixup); \
- EX(sw, val, (offset + 0x08)(dst), fixup); \
- EX(sw, val, (offset + 0x10)(dst), fixup); \
- EX(sw, val, (offset + 0x18)(dst), fixup); \
- EX(sw, val, (offset + 0x20)(dst), fixup); \
- EX(sw, val, (offset + 0x28)(dst), fixup); \
- EX(sw, val, (offset + 0x30)(dst), fixup); \
- EX(sw, val, (offset + 0x38)(dst), fixup)
+ EX(sd, val, (offset + 0x00)(dst), fixup); \
+ EX(sd, val, (offset + 0x08)(dst), fixup); \
+ EX(sd, val, (offset + 0x10)(dst), fixup); \
+ EX(sd, val, (offset + 0x18)(dst), fixup); \
+ EX(sd, val, (offset + 0x20)(dst), fixup); \
+ EX(sd, val, (offset + 0x28)(dst), fixup); \
+ EX(sd, val, (offset + 0x30)(dst), fixup); \
+ EX(sd, val, (offset + 0x38)(dst), fixup)
/*
* memset(void *s, int c, size_t n)
@@ -34,9 +34,11 @@
* a1: char to fill with
* a2: size of area to clear
*/
+#include <asm/mipsregs.h>
+#include <asm/stackframe.h>
.set noreorder
.align 5
-LEAF(xxmemset)
+LEAF(memset)
beqz a1, 1f
move v0, a0 /* result */
@@ -50,7 +52,7 @@ LEAF(xxmemset)
1:
-EXPORT(__bzero)
+FEXPORT(__bzero)
sltiu t0, a2, 8 /* very small region? */
bnez t0, small_memset
andi t0, a0, 7 /* aligned? */
@@ -81,12 +83,15 @@ EXPORT(__bzero)
memset_partial:
la t1, 2f /* where to start */
- dsubu t1, t0
+ .set noat
+ dsrl AT, t0, 1
+ dsubu t1, AT
+ .set noat
jr t1
daddu a0, t0 /* dest ptr */
F_FILL64(a0, -64, a1, partial_fixup) /* ... but first do dwds ... */
-2: andi a2, 7 /* 0 <= n <= 3 to go */
+2: andi a2, 7 /* 0 <= n <= 7 to go */
beqz a2, 1f
daddu a0, a2 /* What's left */
@@ -109,7 +114,7 @@ small_memset:
2: jr ra /* done */
move a2, zero
- END(xxmemset)
+ END(memset)
first_fixup:
jr ra
@@ -124,7 +129,7 @@ fwd_fixup:
partial_fixup:
ld t0, THREAD_BUADDR($28)
- andi a2, 3
+ andi a2, 7
daddu a2, t1
jr ra
dsubu a2, t0