Skip to content

Commit 12108aa

Browse files
ammarfaizi2t-8ch
authored andcommitted
tools/nolibc: x86-64: Use rep stosb for memset()
Simplify memset() on the x86-64 arch. The x86-64 arch has a 'rep stosb' instruction, which can perform memset() using only a single instruction, given: %al = value (just like the second argument of memset()) %rdi = destination %rcx = length Before this patch: ``` 00000000000010c9 <memset>: 10c9: 48 89 f8 mov %rdi,%rax 10cc: 48 85 d2 test %rdx,%rdx 10cf: 74 0e je 10df <memset+0x16> 10d1: 31 c9 xor %ecx,%ecx 10d3: 40 88 34 08 mov %sil,(%rax,%rcx,1) 10d7: 48 ff c1 inc %rcx 10da: 48 39 ca cmp %rcx,%rdx 10dd: 75 f4 jne 10d3 <memset+0xa> 10df: c3 ret ``` After this patch: ``` 0000000000001511 <memset>: 1511: 96 xchg %eax,%esi 1512: 48 89 d1 mov %rdx,%rcx 1515: 57 push %rdi 1516: f3 aa rep stos %al,%es:(%rdi) 1518: 58 pop %rax 1519: c3 ret ``` v2: - Use pushq %rdi / popq %rax (Alviro). - Use xchg %eax, %esi (Willy). Link: https://lore.kernel.org/lkml/[email protected] Suggested-by: Alviro Iskandar Setiawan <[email protected]> Suggested-by: Willy Tarreau <[email protected]> Signed-off-by: Ammar Faizi <[email protected]> Reviewed-by: Alviro Iskandar Setiawan <[email protected]> Signed-off-by: Willy Tarreau <[email protected]> Signed-off-by: Thomas Weißschuh <[email protected]>
1 parent 553845e commit 12108aa

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed

tools/include/nolibc/arch-x86_64.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,9 @@ void *memmove(void *dst, const void *src, size_t len);
179179
#define NOLIBC_ARCH_HAS_MEMCPY
180180
void *memcpy(void *dst, const void *src, size_t len);
181181

182+
#define NOLIBC_ARCH_HAS_MEMSET
183+
void *memset(void *dst, int c, size_t len);
184+
182185
__asm__ (
183186
".section .text.nolibc_memmove_memcpy\n"
184187
".weak memmove\n"
@@ -200,6 +203,16 @@ __asm__ (
200203
"rep movsb\n\t"
201204
"cld\n\t"
202205
"retq\n"
206+
207+
".section .text.nolibc_memset\n"
208+
".weak memset\n"
209+
"memset:\n"
210+
"xchgl %eax, %esi\n\t"
211+
"movq %rdx, %rcx\n\t"
212+
"pushq %rdi\n\t"
213+
"rep stosb\n\t"
214+
"popq %rax\n\t"
215+
"retq\n"
203216
);
204217

205218
#endif /* _NOLIBC_ARCH_X86_64_H */

tools/include/nolibc/string.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ void *memcpy(void *dst, const void *src, size_t len)
8484
}
8585
#endif /* #ifndef NOLIBC_ARCH_HAS_MEMCPY */
8686

87+
#ifndef NOLIBC_ARCH_HAS_MEMSET
8788
/* might be ignored by the compiler without -ffreestanding, then found as
8889
* missing.
8990
*/
@@ -99,6 +100,7 @@ void *memset(void *dst, int b, size_t len)
99100
}
100101
return dst;
101102
}
103+
#endif /* #ifndef NOLIBC_ARCH_HAS_MEMSET */
102104

103105
static __attribute__((unused))
104106
char *strchr(const char *s, int c)

0 commit comments

Comments
 (0)