Super User's BSD Cross Reference: /OpenBSD/lib/libc/arch/amd64/string/memset.S

1 /*
2 * Written by J.T. Conklin <jtc@netbsd.org>.
3 * Public domain.
4 * Adapted for NetBSD/x86_64 by Frank van der Linden <fvdl@wasabisystems.com>
5 */
6
7#include "DEFS.h"
8
9 ENTRY(memset)
10 RETGUARD_SETUP(memset, r10)
11 movq %rsi,%rax
12 andq $0xff,%rax
13 movq %rdx,%rcx
14 movq %rdi,%r11
15
16 cld /* set fill direction forward */
17
18 /*
19 * if the string is too short, it's really not worth the overhead
20 * of aligning to word boundaries, etc. So we jump to a plain
21 * unaligned set.
22 */
23 cmpq $0x0f,%rcx
24 jle L1
25
26 movb %al,%ah /* copy char to all bytes in word */
27 movl %eax,%edx
28 sall $16,%eax
29 orl %edx,%eax
30
31 movl %eax,%edx
32 salq $32,%rax
33 orq %rdx,%rax
34
35 movq %rdi,%rdx /* compute misalignment */
36 negq %rdx
37 andq $7,%rdx
38 movq %rcx,%r8
39 subq %rdx,%r8
40
41 movq %rdx,%rcx /* set until word aligned */
42 rep
43 stosb
44
45 movq %r8,%rcx
46 shrq $3,%rcx /* set by words */
47 rep
48 stosq
49
50 movq %r8,%rcx /* set remainder by bytes */
51 andq $7,%rcx
52 L1: rep
53 stosb
54 movq %r11,%rax
55
56 RETGUARD_CHECK(memset, r10)
57 ret
58 END_BUILTIN(memset)
59 

AltStyle によって変換されたページ (->オリジナル) /