diff options
Diffstat (limited to 'newlib/libc/machine/i386/memset.S')
-rw-r--r-- | newlib/libc/machine/i386/memset.S | 69 |
1 files changed, 15 insertions, 54 deletions
diff --git a/newlib/libc/machine/i386/memset.S b/newlib/libc/machine/i386/memset.S index 6eb2cd6da..ce40820ff 100644 --- a/newlib/libc/machine/i386/memset.S +++ b/newlib/libc/machine/i386/memset.S @@ -1,6 +1,6 @@ /* * ==================================================== - * Copyright (C) 1998, 2002, 2008 by Red Hat Inc. All rights reserved. + * Copyright (C) 1998, 2002 by Red Hat Inc. All rights reserved. * * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice @@ -18,82 +18,43 @@ SYM (memset): pushl ebp movl esp,ebp pushl edi + pushl ebx movl 8(ebp),edi - movzbl 12(ebp),eax + movl 12(ebp),eax movl 16(ebp),ecx cld #ifndef __OPTIMIZE_SIZE__ -/* Less than 16 bytes won't benefit from the 'rep stosl' loop. */ + andl $255,eax + movl ecx,ebx + testl $3,edi + jne .L19 cmpl $16,ecx jbe .L19 - testl $7,edi - je .L10 -/* 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 - - 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 + movl eax,edx + sall $8,eax + orl edx,eax -/* At this point, ecx>8 and edi%8==0. */ -.L10: - movb al,ah movl eax,edx sall $16,edx orl edx,eax - movl ecx,edx shrl $2,ecx - andl $3,edx + andl $3,ebx rep stosl - movl edx,ecx + movl ebx,ecx #endif /* not __OPTIMIZE_SIZE__ */ - + .L19: rep stosb movl 8(ebp),eax - leal -4(ebp),esp + leal -8(ebp),esp + popl ebx popl edi leave ret |