Fix bug in construction of word-length version of 'c'.
Preserve input string and return it as per userlevel spec.
This commit is contained in:
parent
1990f5b094
commit
e22fd3b59d
@ -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 <machine/cdefs.h>
|
#include <machine/cdefs.h>
|
||||||
#include <mips/asm.h>
|
#include <mips/asm.h>
|
||||||
#include <machine/endian.h>
|
#include <machine/endian.h>
|
||||||
@ -10,11 +10,15 @@
|
|||||||
* memset(void *s1, int c, int len)
|
* memset(void *s1, int c, int len)
|
||||||
*/
|
*/
|
||||||
LEAF(memset)
|
LEAF(memset)
|
||||||
|
.set noreorder
|
||||||
blt a2, 12, smallclr # small amount to clear?
|
blt a2, 12, smallclr # small amount to clear?
|
||||||
sll t1, a1, 8
|
move v0, a0 # save s1 for result
|
||||||
or t1, t1, a1
|
|
||||||
sll t1, a1, 16
|
sll t1, a1, 8 # compute c << 8 in t1
|
||||||
or t1, t1, a1
|
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
|
subu t0, zero, a0 # compute # bytes to word align address
|
||||||
and t0, t0, 3
|
and t0, t0, 3
|
||||||
beq t0, zero, 1f # skip if word aligned
|
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
|
SWHI t1, 0(a0) # store 1, 2, or 3 bytes to align
|
||||||
addu a0, a0, t0
|
addu a0, a0, t0
|
||||||
1:
|
1:
|
||||||
and v0, a2, 3 # compute number of words left
|
and v1, a2, 3 # compute number of whole words left
|
||||||
subu t0, a2, v0
|
subu t0, a2, v1
|
||||||
move a2, v0
|
subu a2, a2, t0
|
||||||
addu t0, t0, a0 # compute ending address
|
addu t0, t0, a0 # compute ending address
|
||||||
2:
|
2:
|
||||||
addu a0, a0, 4 # clear words
|
addu a0, a0, 4 # clear words
|
||||||
bne a0, t0, 2b # unrolling loop does not help
|
bne a0, t0, 2b # unrolling loop does not help
|
||||||
sw t1, -4(a0) # since we are limited by memory speed
|
sw t1, -4(a0) # since we are limited by memory speed
|
||||||
|
|
||||||
smallclr:
|
smallclr:
|
||||||
ble a2, zero, 2f
|
ble a2, zero, 2f
|
||||||
addu t0, a2, a0 # compute ending address
|
addu t0, a2, a0 # compute ending address
|
||||||
@ -40,4 +45,5 @@ smallclr:
|
|||||||
2:
|
2:
|
||||||
j ra
|
j ra
|
||||||
nop
|
nop
|
||||||
|
.set reorder
|
||||||
END(memset)
|
END(memset)
|
||||||
|
Loading…
Reference in New Issue
Block a user