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-2022 Free Software Foundation, Inc. 5 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. 10 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. 15 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/>. */ 19 20#include <sysdep.h> 21#include "asm-syntax.h" 22 23#define PARMS 4+4 /* one spilled register */ 24#define RTN PARMS 25 26 .text 27 28#define DEST RTN 29#define SRC DEST+4 30#define LEN SRC+4 31 32#if defined PIC && IS_IN (libc) 33ENTRY_CHK (__memmove_chk) 34 movl 12(%esp), %eax 35 cmpl %eax, 16(%esp) 36 jb HIDDEN_JUMPTARGET (__chk_fail) 37END_CHK (__memmove_chk) 38#endif 39 40ENTRY (memmove) 41 42 pushl %edi 43 cfi_adjust_cfa_offset (4) 44 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) 51 52 movl %edi, %eax 53 subl %esi, %eax 54 cmpl %eax, %ecx 55 ja 3f 56 57 cld 58 shrl $1, %ecx 59 jnc 1f 60 movsb 611: shrl $1, %ecx 62 jnc 2f 63 movsw 642: rep 65 movsl 66 movl %edx, %esi 67 cfi_restore (esi) 68 movl DEST(%esp), %eax 69 70 popl %edi 71 cfi_adjust_cfa_offset (-4) 72 cfi_restore (edi) 73 74 ret 75 76 cfi_adjust_cfa_offset (4) 77 cfi_rel_offset (edi, 0) 78 cfi_register (esi, edx) 79 80 /* Backward copying. */ 813: std 82 leal -1(%edi, %ecx), %edi 83 leal -1(%esi, %ecx), %esi 84 shrl $1, %ecx 85 jnc 1f 86 movsb 871: subl $1, %edi 88 subl $1, %esi 89 shrl $1, %ecx 90 jnc 2f 91 movsw 922: subl $2, %edi 93 subl $2, %esi 94 rep 95 movsl 96 movl %edx, %esi 97 cfi_restore (esi) 98 movl DEST(%esp), %eax 99 100 cld 101 popl %edi 102 cfi_adjust_cfa_offset (-4) 103 cfi_restore (edi) 104 105 ret 106END (memmove) 107libc_hidden_builtin_def (memmove) 108