aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/powerpc/memmove.c
diff options
context:
space:
mode:
authorAdhemerval Zanella <azanella@linux.vnet.ibm.com>2014-06-24 06:42:31 -0500
committerAdhemerval Zanella <azanella@linux.vnet.ibm.com>2014-07-07 14:46:44 -0500
commitd6f68bbef4427850c2901728a1d13efc0e687297 (patch)
tree8198f2273262075c7372e681c09d06593e2e027e /sysdeps/powerpc/memmove.c
parent3f17b03b0947fbe2482e2776f654056d1d5ba093 (diff)
downloadglibc-d6f68bbef4427850c2901728a1d13efc0e687297.tar
glibc-d6f68bbef4427850c2901728a1d13efc0e687297.tar.gz
glibc-d6f68bbef4427850c2901728a1d13efc0e687297.tar.bz2
glibc-d6f68bbef4427850c2901728a1d13efc0e687297.zip
PowerPC: memmove default implementation cleanup
This patch removes the powerpc specific logic in memmove and instead include default implementation with MEMCPY_OK_FOR_FWD_MEMMOVE defined. This lead in a increase performance, since the constraints to use memcpy in powerpc code are too restrictive and memcpy can be used for any forward memmove.
Diffstat (limited to 'sysdeps/powerpc/memmove.c')
-rw-r--r--sysdeps/powerpc/memmove.c99
1 files changed, 2 insertions, 97 deletions
diff --git a/sysdeps/powerpc/memmove.c b/sysdeps/powerpc/memmove.c
index 98ffb14794..9c62ecb5cb 100644
--- a/sysdeps/powerpc/memmove.c
+++ b/sysdeps/powerpc/memmove.c
@@ -18,100 +18,5 @@
License along with the GNU C Library; see the file COPYING.LIB. If
not, see <http://www.gnu.org/licenses/>. */
-#include <string.h>
-#include <memcopy.h>
-
-/* All this is so that bcopy.c can #include
- this file after defining some things. */
-#ifndef a1
-#define a1 dest /* First arg is DEST. */
-#define a1const
-#define a2 src /* Second arg is SRC. */
-#define a2const const
-#undef memmove
-#endif
-#if !defined(RETURN) || !defined(rettype)
-#define RETURN(s) return (s) /* Return DEST. */
-#define rettype void *
-#endif
-
-#ifndef MEMMOVE
-#define MEMMOVE memmove
-#endif
-
-rettype
-MEMMOVE (a1, a2, len)
- a1const void *a1;
- a2const void *a2;
- size_t len;
-{
- unsigned long int dstp = (long int) dest;
- unsigned long int srcp = (long int) src;
-
- /* If there is no overlap between ranges, call the builtin memcpy. */
- if (dstp >= srcp + len || srcp > dstp + len)
- __builtin_memcpy (dest, src, len);
-
- /* This test makes the forward copying code be used whenever possible.
- Reduces the working set. */
- else if (dstp - srcp >= len) /* *Unsigned* compare! */
- {
- /* Copy from the beginning to the end. */
-
- /* If there not too few bytes to copy, use word copy. */
- if (len >= OP_T_THRES)
- {
- /* Copy just a few bytes to make DSTP aligned. */
- len -= (-dstp) % OPSIZ;
- BYTE_COPY_FWD (dstp, srcp, (-dstp) % OPSIZ);
-
- /* Copy whole pages from SRCP to DSTP by virtual address
- manipulation, as much as possible. */
-
- PAGE_COPY_FWD_MAYBE (dstp, srcp, len, len);
-
- /* Copy from SRCP to DSTP taking advantage of the known
- alignment of DSTP. Number of bytes remaining is put
- in the third argument, i.e. in LEN. This number may
- vary from machine to machine. */
-
- WORD_COPY_FWD (dstp, srcp, len, len);
-
- /* Fall out and copy the tail. */
- }
-
- /* There are just a few bytes to copy. Use byte memory operations. */
- BYTE_COPY_FWD (dstp, srcp, len);
- }
- else
- {
- /* Copy from the end to the beginning. */
- srcp += len;
- dstp += len;
-
- /* If there not too few bytes to copy, use word copy. */
- if (len >= OP_T_THRES)
- {
- /* Copy just a few bytes to make DSTP aligned. */
- len -= dstp % OPSIZ;
- BYTE_COPY_BWD (dstp, srcp, dstp % OPSIZ);
-
- /* Copy from SRCP to DSTP taking advantage of the known
- alignment of DSTP. Number of bytes remaining is put
- in the third argument, i.e. in LEN. This number may
- vary from machine to machine. */
-
- WORD_COPY_BWD (dstp, srcp, len, len);
-
- /* Fall out and copy the tail. */
- }
-
- /* There are just a few bytes to copy. Use byte memory operations. */
- BYTE_COPY_BWD (dstp, srcp, len);
- }
-
- RETURN (dest);
-}
-#ifndef memmove
-libc_hidden_builtin_def (memmove)
-#endif
+#define MEMCPY_OK_FOR_FWD_MEMMOVE 1
+#include <string/memmove.c>