Update copyright notices with scripts/update-copyrights.
[glibc.git] / sysdeps / i386 / i686 / memset.S
blobad0c9677fef05dbb46f39c82626afeba9c72dc8a
1 /* memset/bzero -- set memory area to CH/0
2    Highly optimized version for ix86, x>=6.
3    Copyright (C) 1999-2013 Free Software Foundation, Inc.
4    This file is part of the GNU C Library.
5    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
7    The GNU C Library is free software; you can redistribute it and/or
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.
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
15    Lesser General Public License for more details.
17    You should have received a copy of the GNU Lesser General Public
18    License along with the GNU C Library; if not, see
19    <http://www.gnu.org/licenses/>.  */
21 #include <sysdep.h>
22 #include "asm-syntax.h"
23 #include "bp-sym.h"
24 #include "bp-asm.h"
26 /* BEWARE: `#ifdef memset' means that memset is redefined as `bzero' */
27 #define BZERO_P (defined memset)
29 #define PARMS   LINKAGE+4       /* space for 1 saved reg */
30 #if BZERO_P
31 # define DEST   PARMS
32 # define LEN    DEST+PTR_SIZE
33 #else
34 # define RTN    PARMS
35 # define DEST   RTN+RTN_SIZE
36 # define CHR    DEST+PTR_SIZE
37 # define LEN    CHR+4
38 #endif
40         .text
41 #if defined PIC && !defined NOT_IN_libc && !BZERO_P
42 ENTRY_CHK (__memset_chk)
43         movl    12(%esp), %eax
44         cmpl    %eax, 16(%esp)
45         jb      HIDDEN_JUMPTARGET (__chk_fail)
46 END_CHK (__memset_chk)
47 #endif
48 ENTRY (BP_SYM (memset))
49         ENTER
51         cld
52         pushl   %edi
53         cfi_adjust_cfa_offset (4)
54         movl    DEST(%esp), %edx
55         movl    LEN(%esp), %ecx
56         CHECK_BOUNDS_BOTH_WIDE (%edx, DEST(%esp), %ecx)
57 #if BZERO_P
58         xorl    %eax, %eax      /* fill with 0 */
59 #else
60         movzbl  CHR(%esp), %eax
61 #endif
62         jecxz   1f
63         movl    %edx, %edi
64         cfi_rel_offset (edi, 0)
65         andl    $3, %edx
66         jz      2f      /* aligned */
67         jp      3f      /* misaligned at 3, store just one byte below */
68         stosb           /* misaligned at 1 or 2, store two bytes */
69         decl    %ecx
70         jz      1f
71 3:      stosb
72         decl    %ecx
73         jz      1f
74         xorl    $1, %edx
75         jnz     2f      /* was misaligned at 2 or 3, now aligned */
76         stosb           /* was misaligned at 1, store third byte */
77         decl    %ecx
78 2:      movl    %ecx, %edx
79         shrl    $2, %ecx
80         andl    $3, %edx
81 #if !BZERO_P
82         imul    $0x01010101, %eax
83 #endif
84         rep
85         stosl
86         movl    %edx, %ecx
87         rep
88         stosb
91 #if !BZERO_P
92         movl DEST(%esp), %eax   /* start address of destination is result */
93         RETURN_BOUNDED_POINTER (DEST(%esp))
94 #endif
95         popl    %edi
96         cfi_adjust_cfa_offset (-4)
97         cfi_restore (edi)
99         LEAVE
100 #if BZERO_P
101         ret
102 #else
103         RET_PTR
104 #endif
105 END (BP_SYM (memset))
106 libc_hidden_builtin_def (memset)
108 #if defined PIC && !defined NOT_IN_libc && !BZERO_P
109 strong_alias (__memset_chk, __memset_zero_constant_len_parameter)
110         .section .gnu.warning.__memset_zero_constant_len_parameter
111         .string "memset used with constant zero length parameter; this could be due to transposed parameters"
112 #endif