/* Copyright 2002 Andi Kleen, SuSE Labs */ | |
/* | |
* ISO C memset - set a memory block to a byte value. | |
* | |
* rdi destination | |
* rsi value (char) | |
* rdx count (bytes) | |
* | |
* rax original destination | |
*/ | |
.globl __memset | |
.globl memset | |
.p2align 4 | |
memset: | |
__memset: | |
movq %rdi,%r9 | |
movl %edx,%r8d | |
andl $7,%r8d | |
movl %edx,%ecx | |
shrl $3,%ecx | |
/* expand byte value */ | |
movzbl %sil,%esi | |
movabs $0x0101010101010101,%rax | |
mulq %rsi /* with rax, clobbers rdx */ | |
rep | |
stosq | |
movl %r8d,%ecx | |
rep | |
stosb | |
movq %r9,%rax | |
ret |