i686: Use generic sinf implementation for SSE2 version
[glibc.git] / sysdeps / i386 / i686 / memset.S
blob3cb86c016dbab8f95cbcaef2a17b3a81431cb7d5
1 /* memset/bzero -- set memory area to CH/0
2    Highly optimized version for ix86, x>=6.
3    Copyright (C) 1999-2022 Free Software Foundation, Inc.
4    This file is part of the GNU C Library.
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.
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.
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/>.  */
20 #include <sysdep.h>
21 #include "asm-syntax.h"
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
29         .text
30 #if defined SHARED && IS_IN (libc)
31 ENTRY_CHK (__memset_chk)
32         movl    12(%esp), %eax
33         cmpl    %eax, 16(%esp)
34         jb      HIDDEN_JUMPTARGET (__chk_fail)
35 END_CHK (__memset_chk)
36 #endif
37 ENTRY (memset)
39         cld
40         pushl   %edi
41         cfi_adjust_cfa_offset (4)
42         movl    DEST(%esp), %edx
43         movl    LEN(%esp), %ecx
44         movzbl  CHR(%esp), %eax
45         jecxz   1f
46         movl    %edx, %edi
47         cfi_rel_offset (edi, 0)
48         andl    $3, %edx
49         jz      2f      /* aligned */
50         jp      3f      /* misaligned at 3, store just one byte below */
51         stosb           /* misaligned at 1 or 2, store two bytes */
52         decl    %ecx
53         jz      1f
54 3:      stosb
55         decl    %ecx
56         jz      1f
57         xorl    $1, %edx
58         jnz     2f      /* was misaligned at 2 or 3, now aligned */
59         stosb           /* was misaligned at 1, store third byte */
60         decl    %ecx
61 2:      movl    %ecx, %edx
62         shrl    $2, %ecx
63         andl    $3, %edx
64         imul    $0x01010101, %eax
65         rep
66         stosl
67         movl    %edx, %ecx
68         rep
69         stosb
72         movl DEST(%esp), %eax   /* start address of destination is result */
73         popl    %edi
74         cfi_adjust_cfa_offset (-4)
75         cfi_restore (edi)
77         ret
78 END (memset)
79 libc_hidden_builtin_def (memset)