From: Mahmoud Abumandour <[email protected]>
Reviewed-by: Christian Herber <[email protected]>
Signed-off-by: Mahmoud Abumandour <[email protected]>
---
newlib/libc/machine/riscv/memcpy.c | 42 +++++++++++++++++-------------
1 file changed, 24 insertions(+), 18 deletions(-)
diff --git a/newlib/libc/machine/riscv/memcpy.c b/newlib/libc/machine/riscv/memcpy.c
index 7df35dd85..427005efd 100644
--- a/newlib/libc/machine/riscv/memcpy.c
+++ b/newlib/libc/machine/riscv/memcpy.c
@@ -1,4 +1,5 @@
/* Copyright (c) 2017 SiFive Inc. All rights reserved.
+ Copyright (c) 2025 Mahmoud Abumandour <[email protected]>
This copyrighted material is made available to anyone wishing to use,
modify, copy, or redistribute it subject to the terms and conditions
@@ -21,19 +22,22 @@
#define unlikely(X) __builtin_expect (!!(X), 0)
+static inline void
+__libc_memcpy_bytewise (unsigned char *dst, const unsigned char *src,
+ const size_t sz)
+{
+ const unsigned char *end = dst + sz;
+ while (dst < end)
+ *dst++ = *src++;
+}
+
void *
__inhibit_loop_to_libcall
memcpy (void *__restrict aa, const void *__restrict bb, size_t n)
{
- #define BODY(a, b, t) { \
- t tt = *b; \
- a++, b++; \
- *(a - 1) = tt; \
- }
-
- char *a = (char *)aa;
- const char *b = (const char *)bb;
- char *end = a + n;
+ unsigned char *a = (unsigned char *)aa;
+ const unsigned char *b = (const unsigned char *)bb;
+ unsigned char *end = a + n;
uintptr_t msk = SZREG - 1;
#if __riscv_misaligned_slow || __riscv_misaligned_fast
if (n < SZREG)
@@ -41,16 +45,18 @@ memcpy (void *__restrict aa, const void *__restrict bb, size_t n)
if (unlikely ((((uintptr_t)a & msk) != ((uintptr_t)b & msk)) || n < SZREG))
#endif
{
- small:
if (__builtin_expect (a < end, 1))
- while (a < end)
- BODY (a, b, char);
+ __libc_memcpy_bytewise (a, b, n);
return aa;
}
if (unlikely (((uintptr_t)a & msk) != 0))
- while ((uintptr_t)a & msk)
- BODY (a, b, char);
+ {
+ size_t rem = SZREG - ((uintptr_t)a & msk);
+ __libc_memcpy_bytewise (a, b, rem);
+ a += rem;
+ b += rem;
+ }
uintxlen_t *la = (uintxlen_t *)a;
const uintxlen_t *lb = (const uintxlen_t *)b;
@@ -82,12 +88,12 @@ memcpy (void *__restrict aa, const void *__restrict bb, size_t n)
}
while (la < lend)
- BODY (la, lb, uintxlen_t);
+ *la++ = *lb++;
- a = (char *)la;
- b = (const char *)lb;
+ a = (unsigned char *)la;
+ b = (const unsigned char *)lb;
if (unlikely (a < end))
- goto small;
+ __libc_memcpy_bytewise (a, b, end - a);
return aa;
}
#endif
--
2.43.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.