1/* memset/bzero -- set memory area to CH/0
2 Highly optimized version for ix86, x>=6.
3 Copyright (C) 1999-2024 Free Software Foundation, Inc.
4 This file is part of the GNU C Library.
5
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, see
18 <https://www.gnu.org/licenses/>. */
19
20#include <sysdep.h>
21#include "asm-syntax.h"
22
23#define PARMS 4+4 /* space for 1 saved reg */
24#define RTN PARMS
25#define DEST RTN
26#define CHR DEST+4
27#define LEN CHR+4
28
29 .text
30#if defined PIC && IS_IN (libc)
31ENTRY_CHK (__memset_chk)
32 movl 12(%esp), %eax
33 cmpl %eax, 16(%esp)
34 jb HIDDEN_JUMPTARGET (__chk_fail)
35END_CHK (__memset_chk)
36libc_hidden_builtin_def (__memset_chk)
37#endif
38ENTRY (memset)
39
40 cld
41 pushl %edi
42 cfi_adjust_cfa_offset (4)
43 movl DEST(%esp), %edx
44 movl LEN(%esp), %ecx
45 movzbl CHR(%esp), %eax
46 jecxz 1f
47 movl %edx, %edi
48 cfi_rel_offset (edi, 0)
49 andl $3, %edx
50 jz 2f /* aligned */
51 jp 3f /* misaligned at 3, store just one byte below */
52 stosb /* misaligned at 1 or 2, store two bytes */
53 decl %ecx
54 jz 1f
553: stosb
56 decl %ecx
57 jz 1f
58 xorl $1, %edx
59 jnz 2f /* was misaligned at 2 or 3, now aligned */
60 stosb /* was misaligned at 1, store third byte */
61 decl %ecx
622: movl %ecx, %edx
63 shrl $2, %ecx
64 andl $3, %edx
65 imul $0x01010101, %eax
66 rep
67 stosl
68 movl %edx, %ecx
69 rep
70 stosb
71
721:
73 movl DEST(%esp), %eax /* start address of destination is result */
74 popl %edi
75 cfi_adjust_cfa_offset (-4)
76 cfi_restore (edi)
77
78 ret
79END (memset)
80libc_hidden_builtin_def (memset)
81

source code of glibc/sysdeps/i386/i686/memset.S