47 lines
1.1 KiB
ArmAsm
47 lines
1.1 KiB
ArmAsm
|
/* memset() Author: Kees J. Bot */
|
||
|
/* 2 Jan 1994 */
|
||
|
|
||
|
/* void *memset(void *s, int c, size_t n) */
|
||
|
/* Set a chunk of memory to the same byte value. */
|
||
|
/* */
|
||
|
.text
|
||
|
.globl _memset
|
||
|
.balign 16
|
||
|
_memset:
|
||
|
push %ebp
|
||
|
movl %esp, %ebp
|
||
|
push %edi
|
||
|
movl 8(%ebp), %edi /* The string */
|
||
|
movzbl 12(%ebp), %eax /* The fill byte */
|
||
|
movl 16(%ebp), %ecx /* Length */
|
||
|
cld
|
||
|
cmpl $16, %ecx
|
||
|
jb sbyte /* Don't bother being smart with short arrays */
|
||
|
testl $1, %edi
|
||
|
jne sbyte /* Bit 0 set, use byte store */
|
||
|
testl $2, %edi
|
||
|
jne sword /* Bit 1 set, use word store */
|
||
|
slword:
|
||
|
movb %al, %ah
|
||
|
movl %eax, %edx
|
||
|
sall $16, %edx
|
||
|
orl %edx, %eax /* One byte to four bytes */
|
||
|
shrdl $2, %ecx, %edx /* Save low two bits of ecx in edx */
|
||
|
shrl $2, %ecx
|
||
|
|
||
|
rep stosl /* Store longwords. */
|
||
|
shldl $2, %edx, %ecx /* Restore low two bits */
|
||
|
sword:
|
||
|
movb %al, %ah /* One byte to two bytes */
|
||
|
shrl $1, %ecx
|
||
|
|
||
|
rep stosw /* Store words */
|
||
|
adcl %ecx, %ecx /* One more byte? */
|
||
|
sbyte:
|
||
|
rep stosb /* Store bytes */
|
||
|
done:
|
||
|
movl 8(%ebp), %eax /* Return some value you have no need for */
|
||
|
pop %edi
|
||
|
pop %ebp
|
||
|
ret
|