]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/i386/i686/memmove.S
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / i386 / i686 / memmove.S
CommitLineData
432a73f7
UD
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.
04277e02 4 Copyright (C) 2003-2019 Free Software Foundation, Inc.
432a73f7
UD
5 Contributed by Ulrich Drepper <drepper@cygnus.com>, 2003.
6
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.
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
15 Lesser General Public License for more details.
16
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/>. */
432a73f7
UD
20
21#include <sysdep.h>
22#include "asm-syntax.h"
432a73f7 23
2366713d 24#define PARMS 4+4 /* one spilled register */
432a73f7 25#define RTN PARMS
432a73f7
UD
26
27 .text
3af48cbd
L
28
29#ifdef USE_AS_BCOPY
2366713d
JM
30# define SRC RTN
31# define DEST SRC+4
32# define LEN DEST+4
3af48cbd 33#else
2366713d
JM
34# define DEST RTN
35# define SRC DEST+4
36# define LEN SRC+4
3af48cbd 37
4f41c682 38# if defined PIC && IS_IN (libc)
3af48cbd 39ENTRY_CHK (__memmove_chk)
b5cc329c
UD
40 movl 12(%esp), %eax
41 cmpl %eax, 16(%esp)
42 jb HIDDEN_JUMPTARGET (__chk_fail)
3af48cbd
L
43END_CHK (__memmove_chk)
44# endif
b5cc329c 45#endif
3af48cbd 46
2366713d 47ENTRY (memmove)
432a73f7
UD
48
49 pushl %edi
1ad9da69 50 cfi_adjust_cfa_offset (4)
432a73f7
UD
51
52 movl LEN(%esp), %ecx
53 movl DEST(%esp), %edi
1ad9da69 54 cfi_rel_offset (edi, 0)
432a73f7
UD
55 movl %esi, %edx
56 movl SRC(%esp), %esi
1ad9da69 57 cfi_register (esi, edx)
432a73f7
UD
58
59 movl %edi, %eax
60 subl %esi, %eax
66671c84
YK
61 cmpl %eax, %ecx
62 ja 3f
432a73f7
UD
63
64 cld
65 shrl $1, %ecx
66 jnc 1f
67 movsb
681: shrl $1, %ecx
69 jnc 2f
70 movsw
712: rep
72 movsl
73 movl %edx, %esi
1ad9da69 74 cfi_restore (esi)
3af48cbd 75#ifndef USE_AS_BCOPY
432a73f7 76 movl DEST(%esp), %eax
3af48cbd 77#endif
432a73f7
UD
78
79 popl %edi
1ad9da69
UD
80 cfi_adjust_cfa_offset (-4)
81 cfi_restore (edi)
432a73f7 82
2366713d 83 ret
432a73f7 84
fee732e5
UD
85 cfi_adjust_cfa_offset (4)
86 cfi_rel_offset (edi, 0)
87 cfi_register (esi, edx)
88
432a73f7
UD
89 /* Backward copying. */
903: std
91 leal -1(%edi, %ecx), %edi
92 leal -1(%esi, %ecx), %esi
93 shrl $1, %ecx
94 jnc 1f
95 movsb
961: subl $1, %edi
97 subl $1, %esi
98 shrl $1, %ecx
99 jnc 2f
100 movsw
1012: subl $2, %edi
102 subl $2, %esi
103 rep
104 movsl
105 movl %edx, %esi
1ad9da69 106 cfi_restore (esi)
3af48cbd 107#ifndef USE_AS_BCOPY
432a73f7 108 movl DEST(%esp), %eax
3af48cbd 109#endif
432a73f7
UD
110
111 cld
112 popl %edi
1ad9da69
UD
113 cfi_adjust_cfa_offset (-4)
114 cfi_restore (edi)
432a73f7 115
2366713d
JM
116 ret
117END (memmove)
3af48cbd 118#ifndef USE_AS_BCOPY
85dd1003 119libc_hidden_builtin_def (memmove)
3af48cbd 120#endif