(root)/
glibc-2.38/
sysdeps/
i386/
memcopy.h
       1  /* memcopy.h -- definitions for memory copy functions.  i386 version.
       2     Copyright (C) 1991-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <sysdeps/generic/memcopy.h>
      20  
      21  #undef	BYTE_COPY_FWD
      22  #define BYTE_COPY_FWD(dst_bp, src_bp, nbytes)				      \
      23    do {									      \
      24      int __d0;								      \
      25      asm volatile(/* Clear the direction flag, so copying goes forward.  */    \
      26  		 "cld\n"						      \
      27  		 /* Copy bytes.  */					      \
      28  		 "rep\n"						      \
      29  		 "movsb" :						      \
      30  		 "=D" (dst_bp), "=S" (src_bp), "=c" (__d0) :		      \
      31  		 "0" (dst_bp), "1" (src_bp), "2" (nbytes) :		      \
      32  		 "memory");						      \
      33    } while (0)
      34  
      35  #undef	BYTE_COPY_BWD
      36  #define BYTE_COPY_BWD(dst_ep, src_ep, nbytes)				      \
      37    do									      \
      38      {									      \
      39        int __d0;								      \
      40        asm volatile(/* Set the direction flag, so copying goes backwards.  */  \
      41  		   "std\n"						      \
      42  		   /* Copy bytes.  */					      \
      43  		   "rep\n"						      \
      44  		   "movsb\n"						      \
      45  		   /* Clear the dir flag.  Convention says it should be 0. */ \
      46  		   "cld" :						      \
      47  		   "=D" (dst_ep), "=S" (src_ep), "=c" (__d0) :		      \
      48  		   "0" (dst_ep - 1), "1" (src_ep - 1), "2" (nbytes) :	      \
      49  		   "memory");						      \
      50        dst_ep += 1;							      \
      51        src_ep += 1;							      \
      52      } while (0)
      53  
      54  #undef	WORD_COPY_FWD
      55  #define WORD_COPY_FWD(dst_bp, src_bp, nbytes_left, nbytes)		      \
      56    do									      \
      57      {									      \
      58        int __d0;								      \
      59        asm volatile(/* Clear the direction flag, so copying goes forward.  */  \
      60  		   "cld\n"						      \
      61  		   /* Copy longwords.  */				      \
      62  		   "rep\n"						      \
      63  		   "movsl" :						      \
      64   		   "=D" (dst_bp), "=S" (src_bp), "=c" (__d0) :		      \
      65  		   "0" (dst_bp), "1" (src_bp), "2" ((nbytes) / 4) :	      \
      66  		   "memory");						      \
      67        (nbytes_left) = (nbytes) % 4;					      \
      68      } while (0)
      69  
      70  #undef	WORD_COPY_BWD
      71  #define WORD_COPY_BWD(dst_ep, src_ep, nbytes_left, nbytes)		      \
      72    do									      \
      73      {									      \
      74        int __d0;								      \
      75        asm volatile(/* Set the direction flag, so copying goes backwards.  */  \
      76  		   "std\n"						      \
      77  		   /* Copy longwords.  */				      \
      78  		   "rep\n"						      \
      79  		   "movsl\n"						      \
      80  		   /* Clear the dir flag.  Convention says it should be 0. */ \
      81  		   "cld" :						      \
      82  		   "=D" (dst_ep), "=S" (src_ep), "=c" (__d0) :		      \
      83  		   "0" (dst_ep - 4), "1" (src_ep - 4), "2" ((nbytes) / 4) :   \
      84  		   "memory");						      \
      85        dst_ep += 4;							      \
      86        src_ep += 4;							      \
      87        (nbytes_left) = (nbytes) % 4;					      \
      88      } while (0)