]>
Commit | Line | Data |
---|---|---|
7ffe2de6 UD |
1 | /* memset/bzero -- set memory area to CH/0 |
2 | Highly optimized version for ix86, x>=6. | |
b168057a | 3 | Copyright (C) 1999-2015 Free Software Foundation, Inc. |
7ffe2de6 | 4 | This file is part of the GNU C Library. |
6923133b | 5 | Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. |
7ffe2de6 UD |
6 | |
7 | The GNU C Library is free software; you can redistribute it and/or | |
41bdb6e2 AJ |
8 | modify it under the terms of the GNU Lesser General Public |
9 | License as published by the Free Software Foundation; either | |
10 | version 2.1 of the License, or (at your option) any later version. | |
7ffe2de6 UD |
11 | |
12 | The GNU C Library is distributed in the hope that it will be useful, | |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
41bdb6e2 | 15 | Lesser General Public License for more details. |
7ffe2de6 | 16 | |
41bdb6e2 | 17 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 PE |
18 | License along with the GNU C Library; if not, see |
19 | <http://www.gnu.org/licenses/>. */ | |
7ffe2de6 UD |
20 | |
21 | #include <sysdep.h> | |
22 | #include "asm-syntax.h" | |
23 | ||
3f02f778 GM |
24 | /* BEWARE: `#ifdef memset' means that memset is redefined as `bzero' */ |
25 | #define BZERO_P (defined memset) | |
7ffe2de6 | 26 | |
2366713d | 27 | #define PARMS 4+4 /* space for 1 saved reg */ |
3f02f778 GM |
28 | #if BZERO_P |
29 | # define DEST PARMS | |
2366713d | 30 | # define LEN DEST+4 |
3f02f778 GM |
31 | #else |
32 | # define RTN PARMS | |
2366713d JM |
33 | # define DEST RTN |
34 | # define CHR DEST+4 | |
3f02f778 GM |
35 | # define LEN CHR+4 |
36 | #endif | |
7ffe2de6 UD |
37 | |
38 | .text | |
4f41c682 | 39 | #if defined PIC && IS_IN (libc) && !BZERO_P |
3af48cbd | 40 | ENTRY_CHK (__memset_chk) |
b5cc329c UD |
41 | movl 12(%esp), %eax |
42 | cmpl %eax, 16(%esp) | |
43 | jb HIDDEN_JUMPTARGET (__chk_fail) | |
3af48cbd | 44 | END_CHK (__memset_chk) |
b5cc329c | 45 | #endif |
2366713d | 46 | ENTRY (memset) |
3f02f778 | 47 | |
7ffe2de6 UD |
48 | cld |
49 | pushl %edi | |
1ad9da69 | 50 | cfi_adjust_cfa_offset (4) |
3f02f778 GM |
51 | movl DEST(%esp), %edx |
52 | movl LEN(%esp), %ecx | |
53 | #if BZERO_P | |
54 | xorl %eax, %eax /* fill with 0 */ | |
7ffe2de6 | 55 | #else |
3f02f778 | 56 | movzbl CHR(%esp), %eax |
7ffe2de6 UD |
57 | #endif |
58 | jecxz 1f | |
59 | movl %edx, %edi | |
1ad9da69 | 60 | cfi_rel_offset (edi, 0) |
7ffe2de6 | 61 | andl $3, %edx |
93b94c04 RM |
62 | jz 2f /* aligned */ |
63 | jp 3f /* misaligned at 3, store just one byte below */ | |
64 | stosb /* misaligned at 1 or 2, store two bytes */ | |
7ffe2de6 UD |
65 | decl %ecx |
66 | jz 1f | |
67 | 3: stosb | |
68 | decl %ecx | |
69 | jz 1f | |
93b94c04 RM |
70 | xorl $1, %edx |
71 | jnz 2f /* was misaligned at 2 or 3, now aligned */ | |
72 | stosb /* was misaligned at 1, store third byte */ | |
7ffe2de6 UD |
73 | decl %ecx |
74 | 2: movl %ecx, %edx | |
75 | shrl $2, %ecx | |
76 | andl $3, %edx | |
3f02f778 | 77 | #if !BZERO_P |
7ffe2de6 UD |
78 | imul $0x01010101, %eax |
79 | #endif | |
80 | rep | |
81 | stosl | |
82 | movl %edx, %ecx | |
83 | rep | |
84 | stosb | |
85 | ||
6923133b | 86 | 1: |
3f02f778 | 87 | #if !BZERO_P |
2fc08826 | 88 | movl DEST(%esp), %eax /* start address of destination is result */ |
6923133b | 89 | #endif |
7ffe2de6 | 90 | popl %edi |
1ad9da69 UD |
91 | cfi_adjust_cfa_offset (-4) |
92 | cfi_restore (edi) | |
3f02f778 | 93 | |
3f02f778 | 94 | #if BZERO_P |
7ffe2de6 | 95 | ret |
3f02f778 | 96 | #else |
2366713d | 97 | ret |
3f02f778 | 98 | #endif |
2366713d | 99 | END (memset) |
85dd1003 | 100 | libc_hidden_builtin_def (memset) |
553cc5f9 | 101 | |
4f41c682 | 102 | #if defined PIC && IS_IN (libc) && !BZERO_P |
553cc5f9 UD |
103 | strong_alias (__memset_chk, __memset_zero_constant_len_parameter) |
104 | .section .gnu.warning.__memset_zero_constant_len_parameter | |
105 | .string "memset used with constant zero length parameter; this could be due to transposed parameters" | |
106 | #endif |