From e22fd3b59dbd197d7a01594b8ee6bb52dfe354ff Mon Sep 17 00:00:00 2001 From: jonathan Date: Mon, 15 Mar 1999 06:34:10 +0000 Subject: [PATCH] Fix bug in construction of word-length version of 'c'. Preserve input string and return it as per userlevel spec. --- sys/lib/libkern/arch/mips/memset.S | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/sys/lib/libkern/arch/mips/memset.S b/sys/lib/libkern/arch/mips/memset.S index d3bd69a41516..f8e617c6e6f6 100644 --- a/sys/lib/libkern/arch/mips/memset.S +++ b/sys/lib/libkern/arch/mips/memset.S @@ -1,4 +1,4 @@ -/* $NetBSD: memset.S,v 1.1 1999/01/28 03:08:57 jonathan Exp $ */ +/* $NetBSD: memset.S,v 1.2 1999/03/15 06:34:10 jonathan Exp $ */ #include #include #include @@ -10,11 +10,15 @@ * memset(void *s1, int c, int len) */ LEAF(memset) + .set noreorder blt a2, 12, smallclr # small amount to clear? - sll t1, a1, 8 - or t1, t1, a1 - sll t1, a1, 16 - or t1, t1, a1 + move v0, a0 # save s1 for result + + sll t1, a1, 8 # compute c << 8 in t1 + or t1, t1, a1 # compute c << 8 | c in 11 + sll t2, t1, 16 # shift that left 16 + or t1, t2, t1 # or together + subu t0, zero, a0 # compute # bytes to word align address and t0, t0, 3 beq t0, zero, 1f # skip if word aligned @@ -22,14 +26,15 @@ LEAF(memset) SWHI t1, 0(a0) # store 1, 2, or 3 bytes to align addu a0, a0, t0 1: - and v0, a2, 3 # compute number of words left - subu t0, a2, v0 - move a2, v0 + and v1, a2, 3 # compute number of whole words left + subu t0, a2, v1 + subu a2, a2, t0 addu t0, t0, a0 # compute ending address 2: addu a0, a0, 4 # clear words bne a0, t0, 2b # unrolling loop does not help sw t1, -4(a0) # since we are limited by memory speed + smallclr: ble a2, zero, 2f addu t0, a2, a0 # compute ending address @@ -40,4 +45,5 @@ smallclr: 2: j ra nop + .set reorder END(memset)