| /* 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 |