math: Fix i386 and m68k exp10 on static build (BZ 31775)
[glibc.git] / sysdeps / i386 / i686 / memmove.S
blobeffd958120082b0425afca41cb726bbbbf3777e3
1 /* Copy memory block and return pointer to beginning of destination block
2    For Intel 80x86, x>=6.
3    This file is part of the GNU C Library.
4    Copyright (C) 2003-2024 Free Software Foundation, Inc.
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     /* one spilled register */
24 #define RTN     PARMS
26         .text
28 #define DEST    RTN
29 #define SRC     DEST+4
30 #define LEN     SRC+4
32 #if defined SHARED && IS_IN (libc)
33 ENTRY_CHK (__memmove_chk)
34         movl    12(%esp), %eax
35         cmpl    %eax, 16(%esp)
36         jb      HIDDEN_JUMPTARGET (__chk_fail)
37 END_CHK (__memmove_chk)
38 libc_hidden_builtin_def (__memmove_chk)
39 #endif
41 ENTRY (memmove)
43         pushl   %edi
44         cfi_adjust_cfa_offset (4)
46         movl    LEN(%esp), %ecx
47         movl    DEST(%esp), %edi
48         cfi_rel_offset (edi, 0)
49         movl    %esi, %edx
50         movl    SRC(%esp), %esi
51         cfi_register (esi, edx)
53         movl    %edi, %eax
54         subl    %esi, %eax
55         cmpl    %eax, %ecx
56         ja      3f
58         cld
59         shrl    $1, %ecx
60         jnc     1f
61         movsb
62 1:      shrl    $1, %ecx
63         jnc     2f
64         movsw
65 2:      rep
66         movsl
67         movl    %edx, %esi
68         cfi_restore (esi)
69         movl    DEST(%esp), %eax
71         popl    %edi
72         cfi_adjust_cfa_offset (-4)
73         cfi_restore (edi)
75         ret
77         cfi_adjust_cfa_offset (4)
78         cfi_rel_offset (edi, 0)
79         cfi_register (esi, edx)
81         /* Backward copying.  */
82 3:      std
83         leal    -1(%edi, %ecx), %edi
84         leal    -1(%esi, %ecx), %esi
85         shrl    $1, %ecx
86         jnc     1f
87         movsb
88 1:      subl    $1, %edi
89         subl    $1, %esi
90         shrl    $1, %ecx
91         jnc     2f
92         movsw
93 2:      subl    $2, %edi
94         subl    $2, %esi
95         rep
96         movsl
97         movl    %edx, %esi
98         cfi_restore (esi)
99         movl    DEST(%esp), %eax
101         cld
102         popl    %edi
103         cfi_adjust_cfa_offset (-4)
104         cfi_restore (edi)
106         ret
107 END (memmove)
108 libc_hidden_builtin_def (memmove)