forked from KolibriOS/kolibrios
1402c59305
git-svn-id: svn://kolibrios.org@1408 a494cfbc-eb01-0410-851d-a64ba20cac60
48 lines
1.4 KiB
ArmAsm
48 lines
1.4 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.
|
|
#
|
|
|
|
.intel_syntax
|
|
|
|
.global _memset
|
|
|
|
.text
|
|
.align 16
|
|
_memset:
|
|
push ebp
|
|
mov ebp, esp
|
|
push edi
|
|
mov edi, [8+ebp] # The string
|
|
movzx eax, byte ptr [12+ebp] # The fill byte
|
|
mov ecx, [16+ebp] # Length
|
|
cld
|
|
cmp ecx, 16
|
|
jb sbyte # Don't bother being smart with short arrays
|
|
test edi, 1
|
|
jnz sbyte # Bit 0 set, use byte store
|
|
test edi, 2
|
|
jnz sword # Bit 1 set, use word store
|
|
slword:
|
|
movb ah, al
|
|
mov edx, eax
|
|
sal edx, 16
|
|
or eax, edx # One byte to four bytes
|
|
shrd edx, ecx, 2 # Save low two bits of ecx in edx
|
|
shr ecx, 2
|
|
rep stosd # Store longwords.
|
|
shld ecx, edx, 2 # Restore low two bits
|
|
sword:
|
|
movb ah, al # One byte to two bytes
|
|
shr ecx, 1
|
|
rep stosw # Store words
|
|
adc ecx, ecx # One more byte?
|
|
sbyte:
|
|
rep stosb # Store bytes
|
|
done:
|
|
mov eax, [8+ebp] # Return some value you have no need for
|
|
pop edi
|
|
pop ebp
|
|
ret
|