Update copyright dates with scripts/update-copyrights
[glibc.git] / sysdeps / i386 / i686 / memmove.S
blobcff06c27e5e2496cfbc2c6bf129c8d0a59ddd1af
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-2023 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 PIC && 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 #endif
40 ENTRY (memmove)
42         pushl   %edi
43         cfi_adjust_cfa_offset (4)
45         movl    LEN(%esp), %ecx
46         movl    DEST(%esp), %edi
47         cfi_rel_offset (edi, 0)
48         movl    %esi, %edx
49         movl    SRC(%esp), %esi
50         cfi_register (esi, edx)
52         movl    %edi, %eax
53         subl    %esi, %eax
54         cmpl    %eax, %ecx
55         ja      3f
57         cld
58         shrl    $1, %ecx
59         jnc     1f
60         movsb
61 1:      shrl    $1, %ecx
62         jnc     2f
63         movsw
64 2:      rep
65         movsl
66         movl    %edx, %esi
67         cfi_restore (esi)
68         movl    DEST(%esp), %eax
70         popl    %edi
71         cfi_adjust_cfa_offset (-4)
72         cfi_restore (edi)
74         ret
76         cfi_adjust_cfa_offset (4)
77         cfi_rel_offset (edi, 0)
78         cfi_register (esi, edx)
80         /* Backward copying.  */
81 3:      std
82         leal    -1(%edi, %ecx), %edi
83         leal    -1(%esi, %ecx), %esi
84         shrl    $1, %ecx
85         jnc     1f
86         movsb
87 1:      subl    $1, %edi
88         subl    $1, %esi
89         shrl    $1, %ecx
90         jnc     2f
91         movsw
92 2:      subl    $2, %edi
93         subl    $2, %esi
94         rep
95         movsl
96         movl    %edx, %esi
97         cfi_restore (esi)
98         movl    DEST(%esp), %eax
100         cld
101         popl    %edi
102         cfi_adjust_cfa_offset (-4)
103         cfi_restore (edi)
105         ret
106 END (memmove)
107 libc_hidden_builtin_def (memmove)