newlib-cygwin/newlib/libc/machine/i386/memset.S

110 lines
1.5 KiB
ArmAsm
Raw Normal View History

2000-02-18 03:39:52 +08:00
/*
* ====================================================
* Copyright (C) 1998, 2002, 2008 by Red Hat Inc. All rights reserved.
2000-02-18 03:39:52 +08:00
*
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#include "i386mach.h"
.global SYM (memset)
SOTYPE_FUNCTION(memset)
2000-02-18 03:39:52 +08:00
SYM (memset):
#ifdef __iamcu__
pushl edi
movl eax,edi
movzbl dl,eax
mov edi,edx
rep stosb
mov edx,eax
popl edi
#else
2000-02-18 03:39:52 +08:00
pushl ebp
movl esp,ebp
pushl edi
movl 8(ebp),edi
movzbl 12(ebp),eax
2000-02-18 03:39:52 +08:00
movl 16(ebp),ecx
cld
#ifndef __OPTIMIZE_SIZE__
/* Less than 16 bytes won't benefit from the 'rep stosl' loop. */
2000-02-18 03:39:52 +08:00
cmpl $16,ecx
jbe .L19
testl $7,edi
je .L10
2000-02-18 03:39:52 +08:00
/* It turns out that 8-byte aligned 'rep stosl' outperforms
4-byte aligned on some x86 platforms. */
movb al,(edi)
incl edi
decl ecx
testl $7,edi
je .L10
movb al,(edi)
incl edi
decl ecx
testl $7,edi
je .L10
movb al,(edi)
incl edi
decl ecx
testl $7,edi
je .L10
movb al,(edi)
incl edi
decl ecx
testl $7,edi
je .L10
2000-02-18 03:39:52 +08:00
movb al,(edi)
incl edi
decl ecx
testl $7,edi
je .L10
movb al,(edi)
incl edi
decl ecx
testl $7,edi
je .L10
movb al,(edi)
incl edi
decl ecx
/* At this point, ecx>8 and edi%8==0. */
.L10:
movb al,ah
2000-02-18 03:39:52 +08:00
movl eax,edx
sall $16,edx
orl edx,eax
movl ecx,edx
2000-02-18 03:39:52 +08:00
shrl $2,ecx
andl $3,edx
2000-02-18 03:39:52 +08:00
rep
stosl
movl edx,ecx
2000-02-18 03:39:52 +08:00
#endif /* not __OPTIMIZE_SIZE__ */
2000-02-18 03:39:52 +08:00
.L19:
rep
stosb
movl 8(ebp),eax
leal -4(ebp),esp
2000-02-18 03:39:52 +08:00
popl edi
leave
#endif
2000-02-18 03:39:52 +08:00
ret