[PATCH 2/5] RISC-V: memmove() speed optimized: Replace macros and use fixed-width types

m fally <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
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.

Reviewed-by: Christian Herber <[email protected]>
Signed-off-by: m fally <[email protected]>
---
 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 b48da0905..2e5c6ca9b 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 <limits.h>
 #include <stddef.h>
 #include <string.h>
 
-/*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--)
-- 
2.49.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.