From c073fb5c01ecc916b272a02b1dcb62f0ca368cfa Mon Sep 17 00:00:00 2001 From: m fally Date: Fri, 16 May 2025 09:42:55 +0200 Subject: [PATCH 1/5] RISC-V: memmove() speed optimized: Add implementation Copy the common implementation of memmove() to the RISC-V port. Rename memmove.S to memmove-asm.S to keep naming of files consistent between functions. Update Makefile.inc with the changed filenames. --- newlib/libc/machine/riscv/Makefile.inc | 2 +- .../riscv/{memmove.S => memmove-asm.S} | 0 newlib/libc/machine/riscv/memmove-stub.c | 14 --- newlib/libc/machine/riscv/memmove.c | 99 +++++++++++++++++++ 4 files changed, 100 insertions(+), 15 deletions(-) rename newlib/libc/machine/riscv/{memmove.S => memmove-asm.S} (100%) delete mode 100644 newlib/libc/machine/riscv/memmove-stub.c create mode 100644 newlib/libc/machine/riscv/memmove.c diff --git a/newlib/libc/machine/riscv/Makefile.inc b/newlib/libc/machine/riscv/Makefile.inc index 4d6c0469ab..ffc71339d2 100644 --- a/newlib/libc/machine/riscv/Makefile.inc +++ b/newlib/libc/machine/riscv/Makefile.inc @@ -1,3 +1,3 @@ libc_a_SOURCES += \ - %D%/memmove.S %D%/memmove-stub.c %D%/memset.S %D%/memcpy-asm.S %D%/memcpy.c %D%/strlen.c \ + %D%/memmove-asm.S %D%/memmove.c %D%/memset.S %D%/memcpy-asm.S %D%/memcpy.c %D%/strlen.c \ %D%/strcpy.c %D%/stpcpy.c %D%/strcmp.S %D%/setjmp.S %D%/ieeefp.c %D%/ffs.c diff --git a/newlib/libc/machine/riscv/memmove.S b/newlib/libc/machine/riscv/memmove-asm.S similarity index 100% rename from newlib/libc/machine/riscv/memmove.S rename to newlib/libc/machine/riscv/memmove-asm.S diff --git a/newlib/libc/machine/riscv/memmove-stub.c b/newlib/libc/machine/riscv/memmove-stub.c deleted file mode 100644 index d882e46c14..0000000000 --- a/newlib/libc/machine/riscv/memmove-stub.c +++ /dev/null @@ -1,14 +0,0 @@ -/* Copyright (c) 2019 SiFive Inc. All rights reserved. - - This copyrighted material is made available to anyone wishing to use, - modify, copy, or redistribute it subject to the terms and conditions - of the FreeBSD License. This program is distributed in the hope that - it will be useful, but WITHOUT ANY WARRANTY expressed or implied, - including the implied warranties of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. A copy of this license is available at - http://www.opensource.org/licenses. -*/ - -#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) -#include "../../string/memmove.c" -#endif diff --git a/newlib/libc/machine/riscv/memmove.c b/newlib/libc/machine/riscv/memmove.c new file mode 100644 index 0000000000..b48da09051 --- /dev/null +++ b/newlib/libc/machine/riscv/memmove.c @@ -0,0 +1,99 @@ +/* Copyright (c) 2019 SiFive Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ + +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) +/* memmove defined in memmove-asm.S */ +#else + +#include "../../string/local.h" +#include <_ansi.h> +#include +#include +#include + +/*SUPPRESS 20*/ +void *__inhibit_loop_to_libcall +memmove (void *dst_void, const void *src_void, size_t length) +{ + char *dst = dst_void; + const char *src = src_void; + long *aligned_dst; + const long *aligned_src; + + if (src < dst && dst < src + length) + { + /* Destructive overlap...have to copy backwards */ + src += length; + dst += length; + + if (!TOO_SMALL_LITTLE_BLOCK (length) && !UNALIGNED_X_Y (src, dst)) + { + aligned_dst = (long *)dst; + aligned_src = (long *)src; + + /* Copy one long word at a time if possible. */ + while (!TOO_SMALL_LITTLE_BLOCK (length)) + { + *--aligned_dst = *--aligned_src; + length -= LITTLE_BLOCK_SIZE; + } + + /* Pick up any residual with a byte copier. */ + dst = (char *)aligned_dst; + src = (char *)aligned_src; + } + + while (length--) + { + *--dst = *--src; + } + } + else + { + /* Use optimizing algorithm for a non-destructive copy to closely + match memcpy. If the size is small or either SRC or DST is unaligned, + then punt into the byte copy loop. This should be rare. */ + if (!TOO_SMALL_LITTLE_BLOCK (length) && !UNALIGNED_X_Y (src, dst)) + { + aligned_dst = (long *)dst; + aligned_src = (long *)src; + + /* Copy 4X long words at a time if possible. */ + while (!TOO_SMALL_BIG_BLOCK (length)) + { + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + length -= BIG_BLOCK_SIZE; + } + + /* Copy one long word at a time if possible. */ + while (!TOO_SMALL_LITTLE_BLOCK (length)) + { + *aligned_dst++ = *aligned_src++; + length -= LITTLE_BLOCK_SIZE; + } + + /* Pick up any residual with a byte copier. */ + dst = (char *)aligned_dst; + src = (char *)aligned_src; + } + + while (length--) + { + *dst++ = *src++; + } + } + + return dst_void; +} +#endif From 9ba4af76fc16eca5923d5b5cda862369283c6b5f Mon Sep 17 00:00:00 2001 From: m fally Date: Fri, 16 May 2025 09:55:18 +0200 Subject: [PATCH 2/5] RISC-V: memmove() speed optimized: Remove macros and use fixed-width types Remove macros or replace them with static inline functions or RISC-V specific macros where applicable. Change data types to fixed-width and/or RISC-V specific types. --- newlib/libc/machine/riscv/memmove.c | 60 +++++++++++++++++------------ 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/newlib/libc/machine/riscv/memmove.c b/newlib/libc/machine/riscv/memmove.c index b48da09051..2e5c6ca9b4 100644 --- a/newlib/libc/machine/riscv/memmove.c +++ b/newlib/libc/machine/riscv/memmove.c @@ -14,19 +14,29 @@ #else #include "../../string/local.h" -#include <_ansi.h> +#include "sys/asm.h" +#include "xlenint.h" #include #include #include -/*SUPPRESS 20*/ +static inline uint8_t +__libc_fast_xlen_aligned (void *dst, const void *src) +{ +#if defined(__riscv_misaligned_fast) + return 1; +#else + return !(((uintxlen_t)src & (SZREG - 1)) | ((uintxlen_t)dst & (SZREG - 1))); +#endif +} + void *__inhibit_loop_to_libcall memmove (void *dst_void, const void *src_void, size_t length) { - char *dst = dst_void; - const char *src = src_void; - long *aligned_dst; - const long *aligned_src; + unsigned char *dst = dst_void; + const unsigned char *src = src_void; + uintxlen_t *aligned_dst; + const uintxlen_t *aligned_src; if (src < dst && dst < src + length) { @@ -34,21 +44,21 @@ memmove (void *dst_void, const void *src_void, size_t length) src += length; dst += length; - if (!TOO_SMALL_LITTLE_BLOCK (length) && !UNALIGNED_X_Y (src, dst)) + if (length >= SZREG && __libc_fast_xlen_aligned (dst, src)) { - aligned_dst = (long *)dst; - aligned_src = (long *)src; + aligned_dst = (uintxlen_t *)dst; + aligned_src = (uintxlen_t *)src; - /* Copy one long word at a time if possible. */ - while (!TOO_SMALL_LITTLE_BLOCK (length)) + /* Copy one uintxlen_t word at a time if possible. */ + while (length >= SZREG) { *--aligned_dst = *--aligned_src; - length -= LITTLE_BLOCK_SIZE; + length -= SZREG; } /* Pick up any residual with a byte copier. */ - dst = (char *)aligned_dst; - src = (char *)aligned_src; + dst = (unsigned char *)aligned_dst; + src = (unsigned char *)aligned_src; } while (length--) @@ -61,31 +71,31 @@ memmove (void *dst_void, const void *src_void, size_t length) /* Use optimizing algorithm for a non-destructive copy to closely match memcpy. If the size is small or either SRC or DST is unaligned, then punt into the byte copy loop. This should be rare. */ - if (!TOO_SMALL_LITTLE_BLOCK (length) && !UNALIGNED_X_Y (src, dst)) + if (length >= SZREG && __libc_fast_xlen_aligned (dst, src)) { - aligned_dst = (long *)dst; - aligned_src = (long *)src; + aligned_dst = (uintxlen_t *)dst; + aligned_src = (uintxlen_t *)src; - /* Copy 4X long words at a time if possible. */ - while (!TOO_SMALL_BIG_BLOCK (length)) + /* Copy 4X uintxlen_t words at a time if possible. */ + while (length >= (SZREG * 4)) { *aligned_dst++ = *aligned_src++; *aligned_dst++ = *aligned_src++; *aligned_dst++ = *aligned_src++; *aligned_dst++ = *aligned_src++; - length -= BIG_BLOCK_SIZE; + length -= SZREG * 4; } - /* Copy one long word at a time if possible. */ - while (!TOO_SMALL_LITTLE_BLOCK (length)) + /* Copy one uintxlen_t word at a time if possible. */ + while (length >= SZREG) { *aligned_dst++ = *aligned_src++; - length -= LITTLE_BLOCK_SIZE; + length -= SZREG; } /* Pick up any residual with a byte copier. */ - dst = (char *)aligned_dst; - src = (char *)aligned_src; + dst = (unsigned char *)aligned_dst; + src = (unsigned char *)aligned_src; } while (length--) From 7f07a2fc602eddb17cd43424c0ec0f538830c77a Mon Sep 17 00:00:00 2001 From: m fally Date: Fri, 16 May 2025 10:05:57 +0200 Subject: [PATCH 3/5] RISC-V: memmove() speed optimized: Add loop-unrolling Add loop-unrolling for the case where both source and destination address are aligned in the case of a destructive overlap, and increase the unroll factor from four to nine for the word-by-word copy loop in the non-destructive case. This matches the loop-unrolling done in memcpy() and increases performance for lenghts >= SZREG*9 while not degrading performance for shorter lengths. --- newlib/libc/machine/riscv/memmove.c | 57 ++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 9 deletions(-) diff --git a/newlib/libc/machine/riscv/memmove.c b/newlib/libc/machine/riscv/memmove.c index 2e5c6ca9b4..de3e3cf14a 100644 --- a/newlib/libc/machine/riscv/memmove.c +++ b/newlib/libc/machine/riscv/memmove.c @@ -30,6 +30,31 @@ __libc_fast_xlen_aligned (void *dst, const void *src) #endif } +static inline void +__libc_aligned_copy_unrolled (uintxlen_t *aligned_dst, + const uintxlen_t *aligned_src) +{ + uintxlen_t dst0 = *aligned_src++; + uintxlen_t dst1 = *aligned_src++; + uintxlen_t dst2 = *aligned_src++; + uintxlen_t dst3 = *aligned_src++; + uintxlen_t dst4 = *aligned_src++; + uintxlen_t dst5 = *aligned_src++; + uintxlen_t dst6 = *aligned_src++; + uintxlen_t dst7 = *aligned_src++; + uintxlen_t dst8 = *aligned_src; + + *aligned_dst++ = dst0; + *aligned_dst++ = dst1; + *aligned_dst++ = dst2; + *aligned_dst++ = dst3; + *aligned_dst++ = dst4; + *aligned_dst++ = dst5; + *aligned_dst++ = dst6; + *aligned_dst++ = dst7; + *aligned_dst = dst8; +} + void *__inhibit_loop_to_libcall memmove (void *dst_void, const void *src_void, size_t length) { @@ -49,7 +74,20 @@ memmove (void *dst_void, const void *src_void, size_t length) aligned_dst = (uintxlen_t *)dst; aligned_src = (uintxlen_t *)src; - /* Copy one uintxlen_t word at a time if possible. */ + /* If possible, unroll the word-copy loop by a factor 9 to + match memcpy. This speeds up the copying process for longer + lengths while not degrading performance for lengths < SZREG*9. + Since we are copying backwards, decrement the addresses + before copying. + */ + while (length >= SZREG * 9) + { + aligned_dst -= 9; + aligned_src -= 9; + __libc_aligned_copy_unrolled (aligned_dst, aligned_src); + length -= (SZREG * 9); + } + while (length >= SZREG) { *--aligned_dst = *--aligned_src; @@ -76,17 +114,18 @@ memmove (void *dst_void, const void *src_void, size_t length) aligned_dst = (uintxlen_t *)dst; aligned_src = (uintxlen_t *)src; - /* Copy 4X uintxlen_t words at a time if possible. */ - while (length >= (SZREG * 4)) + /* If possible, unroll the word-copy loop by a factor 9 to + match memcpy. This speeds up the copying process for longer + lengths while not degrading performance for lengths < SZREG*9. + */ + while (length >= SZREG * 9) { - *aligned_dst++ = *aligned_src++; - *aligned_dst++ = *aligned_src++; - *aligned_dst++ = *aligned_src++; - *aligned_dst++ = *aligned_src++; - length -= SZREG * 4; + __libc_aligned_copy_unrolled (aligned_dst, aligned_src); + aligned_dst += 9; + aligned_src += 9; + length -= (SZREG * 9); } - /* Copy one uintxlen_t word at a time if possible. */ while (length >= SZREG) { *aligned_dst++ = *aligned_src++; From 0ec60d5ad782ad33c26ac07445c3341d0845f875 Mon Sep 17 00:00:00 2001 From: m fally Date: Fri, 16 May 2025 10:34:38 +0200 Subject: [PATCH 4/5] RISC-V: memmove() speed optimized: Align source address If misaligned accesses are slow or prohibited, either source or destination address are unaligned and the number of bytes to be copied is > SZREG*2, align the source address to xlen. This speeds up the function in the case where at least one address is unaligned, since now one word (or doubleword for rv64) is loaded at a time, therefore reducing the amount of memory accesses necessary. We still need to store back individual bytes since the destination address might (still) be unaligned after aligning the source. The threshold of SZREG*2 was chosen because the additional overhead caused by aligning the source would decrease performance for shorter lengths. --- newlib/libc/machine/riscv/memmove.c | 184 ++++++++++++++++++++-------- 1 file changed, 134 insertions(+), 50 deletions(-) diff --git a/newlib/libc/machine/riscv/memmove.c b/newlib/libc/machine/riscv/memmove.c index de3e3cf14a..05ba847aec 100644 --- a/newlib/libc/machine/riscv/memmove.c +++ b/newlib/libc/machine/riscv/memmove.c @@ -1,4 +1,5 @@ /* Copyright (c) 2019 SiFive Inc. All rights reserved. + Copyright (c) 2025 Marlene Fally This copyrighted material is made available to anyone wishing to use, modify, copy, or redistribute it subject to the terms and conditions @@ -30,6 +31,26 @@ __libc_fast_xlen_aligned (void *dst, const void *src) #endif } +#if !defined(__riscv_misaligned_fast) +static inline void +__libc_memmove_misaligned_copy (unsigned char *dst, + const uintxlen_t *aligned_src) +{ + uintxlen_t src_xlen = *aligned_src; + + *dst++ = (unsigned char)(src_xlen); + *dst++ = (unsigned char)(src_xlen >> 8); + *dst++ = (unsigned char)(src_xlen >> 16); + *dst++ = (unsigned char)(src_xlen >> 24); +#if __riscv_xlen == 64 + *dst++ = (unsigned char)(src_xlen >> 32); + *dst++ = (unsigned char)(src_xlen >> 40); + *dst++ = (unsigned char)(src_xlen >> 48); + *dst++ = (unsigned char)(src_xlen >> 56); +#endif +} +#endif + static inline void __libc_aligned_copy_unrolled (uintxlen_t *aligned_dst, const uintxlen_t *aligned_src) @@ -69,74 +90,137 @@ memmove (void *dst_void, const void *src_void, size_t length) src += length; dst += length; - if (length >= SZREG && __libc_fast_xlen_aligned (dst, src)) + if (length >= SZREG) { - aligned_dst = (uintxlen_t *)dst; - aligned_src = (uintxlen_t *)src; - - /* If possible, unroll the word-copy loop by a factor 9 to - match memcpy. This speeds up the copying process for longer - lengths while not degrading performance for lengths < SZREG*9. - Since we are copying backwards, decrement the addresses - before copying. - */ - while (length >= SZREG * 9) + if (__libc_fast_xlen_aligned (dst, src)) { - aligned_dst -= 9; - aligned_src -= 9; - __libc_aligned_copy_unrolled (aligned_dst, aligned_src); - length -= (SZREG * 9); + aligned_dst = (uintxlen_t *)dst; + aligned_src = (uintxlen_t *)src; + + /* If possible, unroll the word-copy loop by a factor 9 to + match memcpy. This speeds up the copying process for longer + lengths while not degrading performance for lengths < SZREG*9. + Since we are copying backwards, decrement the addresses + before copying. + */ + while (length >= SZREG * 9) + { + aligned_dst -= 9; + aligned_src -= 9; + __libc_aligned_copy_unrolled (aligned_dst, aligned_src); + length -= (SZREG * 9); + } + + while (length >= SZREG) + { + *--aligned_dst = *--aligned_src; + length -= SZREG; + } + + /* Pick up any residual with a byte copier. */ + dst = (unsigned char *)aligned_dst; + src = (unsigned char *)aligned_src; } - - while (length >= SZREG) +#if !defined(__riscv_misaligned_fast) + else if (length > (SZREG * 2)) { - *--aligned_dst = *--aligned_src; - length -= SZREG; + /* At least one address is not xlen-aligned. If + misaligned accesses are slow or prohibited, + align the src so we can load SZREG bytes at a time. + This reduces the amount of memory accesses made + and therefore improves performance. + */ + while ((uintxlen_t)src & (SZREG - 1)) + { + *--dst = *--src; + length--; + } + + aligned_src = (uintxlen_t *)src; + + /* Decrement the addresses before copying since + we are copying backwards. */ + do + { + aligned_src--; + dst -= SZREG; + __libc_memmove_misaligned_copy (dst, aligned_src); + length -= SZREG; + } + while (length >= SZREG); + + /* Pick up any residual with a byte copier. */ + src = (unsigned char *)aligned_src; } - - /* Pick up any residual with a byte copier. */ - dst = (unsigned char *)aligned_dst; - src = (unsigned char *)aligned_src; +#endif } - while (length--) { *--dst = *--src; } } - else + else /* Memory areas overlap non-destructively or not at all. */ { - /* Use optimizing algorithm for a non-destructive copy to closely - match memcpy. If the size is small or either SRC or DST is unaligned, - then punt into the byte copy loop. This should be rare. */ - if (length >= SZREG && __libc_fast_xlen_aligned (dst, src)) + if (length >= SZREG) { - aligned_dst = (uintxlen_t *)dst; - aligned_src = (uintxlen_t *)src; - - /* If possible, unroll the word-copy loop by a factor 9 to - match memcpy. This speeds up the copying process for longer - lengths while not degrading performance for lengths < SZREG*9. - */ - while (length >= SZREG * 9) + if (__libc_fast_xlen_aligned (dst, src)) { - __libc_aligned_copy_unrolled (aligned_dst, aligned_src); - aligned_dst += 9; - aligned_src += 9; - length -= (SZREG * 9); + aligned_dst = (uintxlen_t *)dst; + aligned_src = (uintxlen_t *)src; + + /* If possible, unroll the word-copy loop by a factor 9 to + match memcpy. This speeds up the copying process for longer + lengths while not degrading performance for lengths < SZREG*9. + */ + while (length >= SZREG * 9) + { + __libc_aligned_copy_unrolled (aligned_dst, aligned_src); + aligned_dst += 9; + aligned_src += 9; + length -= (SZREG * 9); + } + + while (length >= SZREG) + { + *aligned_dst++ = *aligned_src++; + length -= SZREG; + } + + /* Pick up any residual with a byte copier. */ + dst = (unsigned char *)aligned_dst; + src = (unsigned char *)aligned_src; } - - while (length >= SZREG) +#if !defined(__riscv_misaligned_fast) + else if (length > (SZREG * 2)) { - *aligned_dst++ = *aligned_src++; - length -= SZREG; + /* At least one address is not xlen-aligned. If + misaligned accesses are slow or prohibited, + align the src so we can load SZREG bytes at a time. + This reduces the amount of memory accesses made + and therefore improves performance. + */ + while ((uintxlen_t)src & (SZREG - 1)) + { + *dst++ = *src++; + length--; + } + + aligned_src = (uintxlen_t *)src; + + do + { + __libc_memmove_misaligned_copy (dst, aligned_src); + aligned_src++; + dst += SZREG; + length -= SZREG; + } + while (length >= SZREG); + + /* Pick up any residual with a byte copier. */ + src = (unsigned char *)aligned_src; } - - /* Pick up any residual with a byte copier. */ - dst = (unsigned char *)aligned_dst; - src = (unsigned char *)aligned_src; +#endif } - while (length--) { *dst++ = *src++; From dcc2e1d32d7846ec6caa302df8d249da869382fb Mon Sep 17 00:00:00 2001 From: m fally Date: Fri, 16 May 2025 12:43:43 +0200 Subject: [PATCH 5/5] newlib: Regenerate configuration files Regenerate the configuration files since a stub-file was replaced with a new implementation in the RISC-V port (memmove.c), and one other file has been renamed (memmove.S => memmove-asm.S). --- newlib/Makefile.in | 53 +++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/newlib/Makefile.in b/newlib/Makefile.in index 52b5d80dc0..d29e704631 100644 --- a/newlib/Makefile.in +++ b/newlib/Makefile.in @@ -855,7 +855,7 @@ check_PROGRAMS = @HAVE_LIBC_MACHINE_PRU_TRUE@am__append_113 = libc/machine/pru/setjmp.s @HAVE_LIBC_MACHINE_RISCV_TRUE@am__append_114 = \ -@HAVE_LIBC_MACHINE_RISCV_TRUE@ libc/machine/riscv/memmove.S libc/machine/riscv/memmove-stub.c libc/machine/riscv/memset.S libc/machine/riscv/memcpy-asm.S libc/machine/riscv/memcpy.c libc/machine/riscv/strlen.c \ +@HAVE_LIBC_MACHINE_RISCV_TRUE@ libc/machine/riscv/memmove-asm.S libc/machine/riscv/memmove.c libc/machine/riscv/memset.S libc/machine/riscv/memcpy-asm.S libc/machine/riscv/memcpy.c libc/machine/riscv/strlen.c \ @HAVE_LIBC_MACHINE_RISCV_TRUE@ libc/machine/riscv/strcpy.c libc/machine/riscv/stpcpy.c libc/machine/riscv/strcmp.S libc/machine/riscv/setjmp.S libc/machine/riscv/ieeefp.c libc/machine/riscv/ffs.c @HAVE_LIBC_MACHINE_RL78_TRUE@am__append_115 = libc/machine/rl78/setjmp.S @@ -2176,8 +2176,8 @@ am__objects_51 = libc/ssp/libc_a-chk_fail.$(OBJEXT) \ @HAVE_LIBC_MACHINE_POWERPC_TRUE@@HAVE_POWERPC_SPE_TRUE@ libc/machine/powerpc/libc_a-vfprintf.$(OBJEXT) \ @HAVE_LIBC_MACHINE_POWERPC_TRUE@@HAVE_POWERPC_SPE_TRUE@ libc/machine/powerpc/libc_a-vfscanf.$(OBJEXT) @HAVE_LIBC_MACHINE_PRU_TRUE@am__objects_123 = libc/machine/pru/libc_a-setjmp.$(OBJEXT) -@HAVE_LIBC_MACHINE_RISCV_TRUE@am__objects_124 = libc/machine/riscv/libc_a-memmove.$(OBJEXT) \ -@HAVE_LIBC_MACHINE_RISCV_TRUE@ libc/machine/riscv/libc_a-memmove-stub.$(OBJEXT) \ +@HAVE_LIBC_MACHINE_RISCV_TRUE@am__objects_124 = libc/machine/riscv/libc_a-memmove-asm.$(OBJEXT) \ +@HAVE_LIBC_MACHINE_RISCV_TRUE@ libc/machine/riscv/libc_a-memmove.$(OBJEXT) \ @HAVE_LIBC_MACHINE_RISCV_TRUE@ libc/machine/riscv/libc_a-memset.$(OBJEXT) \ @HAVE_LIBC_MACHINE_RISCV_TRUE@ libc/machine/riscv/libc_a-memcpy-asm.$(OBJEXT) \ @HAVE_LIBC_MACHINE_RISCV_TRUE@ libc/machine/riscv/libc_a-memcpy.$(OBJEXT) \ @@ -4002,7 +4002,6 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ -runstatedir = @runstatedir@ sbindir = @sbindir@ shared_machine_dir = @shared_machine_dir@ sharedstatedir = @sharedstatedir@ @@ -9158,10 +9157,10 @@ libc/machine/riscv/$(am__dirstamp): libc/machine/riscv/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) libc/machine/riscv/$(DEPDIR) @: > libc/machine/riscv/$(DEPDIR)/$(am__dirstamp) -libc/machine/riscv/libc_a-memmove.$(OBJEXT): \ +libc/machine/riscv/libc_a-memmove-asm.$(OBJEXT): \ libc/machine/riscv/$(am__dirstamp) \ libc/machine/riscv/$(DEPDIR)/$(am__dirstamp) -libc/machine/riscv/libc_a-memmove-stub.$(OBJEXT): \ +libc/machine/riscv/libc_a-memmove.$(OBJEXT): \ libc/machine/riscv/$(am__dirstamp) \ libc/machine/riscv/$(DEPDIR)/$(am__dirstamp) libc/machine/riscv/libc_a-memset.$(OBJEXT): \ @@ -13141,7 +13140,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@libc/machine/riscv/$(DEPDIR)/libc_a-ieeefp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libc/machine/riscv/$(DEPDIR)/libc_a-memcpy-asm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libc/machine/riscv/$(DEPDIR)/libc_a-memcpy.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@libc/machine/riscv/$(DEPDIR)/libc_a-memmove-stub.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@libc/machine/riscv/$(DEPDIR)/libc_a-memmove-asm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libc/machine/riscv/$(DEPDIR)/libc_a-memmove.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libc/machine/riscv/$(DEPDIR)/libc_a-memset.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libc/machine/riscv/$(DEPDIR)/libc_a-setjmp.Po@am__quote@ @@ -19165,19 +19164,19 @@ libc/machine/powerpc/libc_a-setjmp.obj: libc/machine/powerpc/setjmp.S @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CCASFLAGS) $(CCASFLAGS) -c -o libc/machine/powerpc/libc_a-setjmp.obj `if test -f 'libc/machine/powerpc/setjmp.S'; then $(CYGPATH_W) 'libc/machine/powerpc/setjmp.S'; else $(CYGPATH_W) '$(srcdir)/libc/machine/powerpc/setjmp.S'; fi` -libc/machine/riscv/libc_a-memmove.o: libc/machine/riscv/memmove.S -@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CCASFLAGS) $(CCASFLAGS) -MT libc/machine/riscv/libc_a-memmove.o -MD -MP -MF libc/machine/riscv/$(DEPDIR)/libc_a-memmove.Tpo -c -o libc/machine/riscv/libc_a-memmove.o `test -f 'libc/machine/riscv/memmove.S' || echo '$(srcdir)/'`libc/machine/riscv/memmove.S -@am__fastdepCCAS_TRUE@ $(AM_V_at)$(am__mv) libc/machine/riscv/$(DEPDIR)/libc_a-memmove.Tpo libc/machine/riscv/$(DEPDIR)/libc_a-memmove.Po -@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='libc/machine/riscv/memmove.S' object='libc/machine/riscv/libc_a-memmove.o' libtool=no @AMDEPBACKSLASH@ +libc/machine/riscv/libc_a-memmove-asm.o: libc/machine/riscv/memmove-asm.S +@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CCASFLAGS) $(CCASFLAGS) -MT libc/machine/riscv/libc_a-memmove-asm.o -MD -MP -MF libc/machine/riscv/$(DEPDIR)/libc_a-memmove-asm.Tpo -c -o libc/machine/riscv/libc_a-memmove-asm.o `test -f 'libc/machine/riscv/memmove-asm.S' || echo '$(srcdir)/'`libc/machine/riscv/memmove-asm.S +@am__fastdepCCAS_TRUE@ $(AM_V_at)$(am__mv) libc/machine/riscv/$(DEPDIR)/libc_a-memmove-asm.Tpo libc/machine/riscv/$(DEPDIR)/libc_a-memmove-asm.Po +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='libc/machine/riscv/memmove-asm.S' object='libc/machine/riscv/libc_a-memmove-asm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CCASFLAGS) $(CCASFLAGS) -c -o libc/machine/riscv/libc_a-memmove.o `test -f 'libc/machine/riscv/memmove.S' || echo '$(srcdir)/'`libc/machine/riscv/memmove.S +@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CCASFLAGS) $(CCASFLAGS) -c -o libc/machine/riscv/libc_a-memmove-asm.o `test -f 'libc/machine/riscv/memmove-asm.S' || echo '$(srcdir)/'`libc/machine/riscv/memmove-asm.S -libc/machine/riscv/libc_a-memmove.obj: libc/machine/riscv/memmove.S -@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CCASFLAGS) $(CCASFLAGS) -MT libc/machine/riscv/libc_a-memmove.obj -MD -MP -MF libc/machine/riscv/$(DEPDIR)/libc_a-memmove.Tpo -c -o libc/machine/riscv/libc_a-memmove.obj `if test -f 'libc/machine/riscv/memmove.S'; then $(CYGPATH_W) 'libc/machine/riscv/memmove.S'; else $(CYGPATH_W) '$(srcdir)/libc/machine/riscv/memmove.S'; fi` -@am__fastdepCCAS_TRUE@ $(AM_V_at)$(am__mv) libc/machine/riscv/$(DEPDIR)/libc_a-memmove.Tpo libc/machine/riscv/$(DEPDIR)/libc_a-memmove.Po -@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='libc/machine/riscv/memmove.S' object='libc/machine/riscv/libc_a-memmove.obj' libtool=no @AMDEPBACKSLASH@ +libc/machine/riscv/libc_a-memmove-asm.obj: libc/machine/riscv/memmove-asm.S +@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CCASFLAGS) $(CCASFLAGS) -MT libc/machine/riscv/libc_a-memmove-asm.obj -MD -MP -MF libc/machine/riscv/$(DEPDIR)/libc_a-memmove-asm.Tpo -c -o libc/machine/riscv/libc_a-memmove-asm.obj `if test -f 'libc/machine/riscv/memmove-asm.S'; then $(CYGPATH_W) 'libc/machine/riscv/memmove-asm.S'; else $(CYGPATH_W) '$(srcdir)/libc/machine/riscv/memmove-asm.S'; fi` +@am__fastdepCCAS_TRUE@ $(AM_V_at)$(am__mv) libc/machine/riscv/$(DEPDIR)/libc_a-memmove-asm.Tpo libc/machine/riscv/$(DEPDIR)/libc_a-memmove-asm.Po +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='libc/machine/riscv/memmove-asm.S' object='libc/machine/riscv/libc_a-memmove-asm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CCASFLAGS) $(CCASFLAGS) -c -o libc/machine/riscv/libc_a-memmove.obj `if test -f 'libc/machine/riscv/memmove.S'; then $(CYGPATH_W) 'libc/machine/riscv/memmove.S'; else $(CYGPATH_W) '$(srcdir)/libc/machine/riscv/memmove.S'; fi` +@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CCASFLAGS) $(CCASFLAGS) -c -o libc/machine/riscv/libc_a-memmove-asm.obj `if test -f 'libc/machine/riscv/memmove-asm.S'; then $(CYGPATH_W) 'libc/machine/riscv/memmove-asm.S'; else $(CYGPATH_W) '$(srcdir)/libc/machine/riscv/memmove-asm.S'; fi` libc/machine/riscv/libc_a-memset.o: libc/machine/riscv/memset.S @am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CCASFLAGS) $(CCASFLAGS) -MT libc/machine/riscv/libc_a-memset.o -MD -MP -MF libc/machine/riscv/$(DEPDIR)/libc_a-memset.Tpo -c -o libc/machine/riscv/libc_a-memset.o `test -f 'libc/machine/riscv/memset.S' || echo '$(srcdir)/'`libc/machine/riscv/memset.S @@ -34749,19 +34748,19 @@ libc/machine/powerpc/libc_a-ufix64toa.obj: libc/machine/powerpc/ufix64toa.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CFLAGS) $(CFLAGS) -c -o libc/machine/powerpc/libc_a-ufix64toa.obj `if test -f 'libc/machine/powerpc/ufix64toa.c'; then $(CYGPATH_W) 'libc/machine/powerpc/ufix64toa.c'; else $(CYGPATH_W) '$(srcdir)/libc/machine/powerpc/ufix64toa.c'; fi` -libc/machine/riscv/libc_a-memmove-stub.o: libc/machine/riscv/memmove-stub.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CFLAGS) $(CFLAGS) -MT libc/machine/riscv/libc_a-memmove-stub.o -MD -MP -MF libc/machine/riscv/$(DEPDIR)/libc_a-memmove-stub.Tpo -c -o libc/machine/riscv/libc_a-memmove-stub.o `test -f 'libc/machine/riscv/memmove-stub.c' || echo '$(srcdir)/'`libc/machine/riscv/memmove-stub.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libc/machine/riscv/$(DEPDIR)/libc_a-memmove-stub.Tpo libc/machine/riscv/$(DEPDIR)/libc_a-memmove-stub.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libc/machine/riscv/memmove-stub.c' object='libc/machine/riscv/libc_a-memmove-stub.o' libtool=no @AMDEPBACKSLASH@ +libc/machine/riscv/libc_a-memmove.o: libc/machine/riscv/memmove.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CFLAGS) $(CFLAGS) -MT libc/machine/riscv/libc_a-memmove.o -MD -MP -MF libc/machine/riscv/$(DEPDIR)/libc_a-memmove.Tpo -c -o libc/machine/riscv/libc_a-memmove.o `test -f 'libc/machine/riscv/memmove.c' || echo '$(srcdir)/'`libc/machine/riscv/memmove.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libc/machine/riscv/$(DEPDIR)/libc_a-memmove.Tpo libc/machine/riscv/$(DEPDIR)/libc_a-memmove.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libc/machine/riscv/memmove.c' object='libc/machine/riscv/libc_a-memmove.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CFLAGS) $(CFLAGS) -c -o libc/machine/riscv/libc_a-memmove-stub.o `test -f 'libc/machine/riscv/memmove-stub.c' || echo '$(srcdir)/'`libc/machine/riscv/memmove-stub.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CFLAGS) $(CFLAGS) -c -o libc/machine/riscv/libc_a-memmove.o `test -f 'libc/machine/riscv/memmove.c' || echo '$(srcdir)/'`libc/machine/riscv/memmove.c -libc/machine/riscv/libc_a-memmove-stub.obj: libc/machine/riscv/memmove-stub.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CFLAGS) $(CFLAGS) -MT libc/machine/riscv/libc_a-memmove-stub.obj -MD -MP -MF libc/machine/riscv/$(DEPDIR)/libc_a-memmove-stub.Tpo -c -o libc/machine/riscv/libc_a-memmove-stub.obj `if test -f 'libc/machine/riscv/memmove-stub.c'; then $(CYGPATH_W) 'libc/machine/riscv/memmove-stub.c'; else $(CYGPATH_W) '$(srcdir)/libc/machine/riscv/memmove-stub.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libc/machine/riscv/$(DEPDIR)/libc_a-memmove-stub.Tpo libc/machine/riscv/$(DEPDIR)/libc_a-memmove-stub.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libc/machine/riscv/memmove-stub.c' object='libc/machine/riscv/libc_a-memmove-stub.obj' libtool=no @AMDEPBACKSLASH@ +libc/machine/riscv/libc_a-memmove.obj: libc/machine/riscv/memmove.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CFLAGS) $(CFLAGS) -MT libc/machine/riscv/libc_a-memmove.obj -MD -MP -MF libc/machine/riscv/$(DEPDIR)/libc_a-memmove.Tpo -c -o libc/machine/riscv/libc_a-memmove.obj `if test -f 'libc/machine/riscv/memmove.c'; then $(CYGPATH_W) 'libc/machine/riscv/memmove.c'; else $(CYGPATH_W) '$(srcdir)/libc/machine/riscv/memmove.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libc/machine/riscv/$(DEPDIR)/libc_a-memmove.Tpo libc/machine/riscv/$(DEPDIR)/libc_a-memmove.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libc/machine/riscv/memmove.c' object='libc/machine/riscv/libc_a-memmove.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CFLAGS) $(CFLAGS) -c -o libc/machine/riscv/libc_a-memmove-stub.obj `if test -f 'libc/machine/riscv/memmove-stub.c'; then $(CYGPATH_W) 'libc/machine/riscv/memmove-stub.c'; else $(CYGPATH_W) '$(srcdir)/libc/machine/riscv/memmove-stub.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CFLAGS) $(CFLAGS) -c -o libc/machine/riscv/libc_a-memmove.obj `if test -f 'libc/machine/riscv/memmove.c'; then $(CYGPATH_W) 'libc/machine/riscv/memmove.c'; else $(CYGPATH_W) '$(srcdir)/libc/machine/riscv/memmove.c'; fi` libc/machine/riscv/libc_a-memcpy.o: libc/machine/riscv/memcpy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CFLAGS) $(CFLAGS) -MT libc/machine/riscv/libc_a-memcpy.o -MD -MP -MF libc/machine/riscv/$(DEPDIR)/libc_a-memcpy.Tpo -c -o libc/machine/riscv/libc_a-memcpy.o `test -f 'libc/machine/riscv/memcpy.c' || echo '$(srcdir)/'`libc/machine/riscv/memcpy.c