| From a4cdbc3086708450ae8163a2e2c93ba9b0f631fa Mon Sep 17 00:00:00 2001 |
| From: Alex Van Damme <atv@google.com> |
| Date: Wed, 27 Mar 2024 07:13:37 +0000 |
| Subject: [PATCH] Add memcpy-kelvin.c |
| |
| --- |
| newlib/libc/machine/riscv/Makefile.am | 2 +- |
| newlib/libc/machine/riscv/Makefile.in | 10 ++++- |
| newlib/libc/machine/riscv/memcpy-asm.S | 2 +- |
| newlib/libc/machine/riscv/memcpy-kelvin.c | 46 +++++++++++++++++++++++ |
| newlib/libc/machine/riscv/memcpy.c | 2 +- |
| 5 files changed, 57 insertions(+), 5 deletions(-) |
| create mode 100644 newlib/libc/machine/riscv/memcpy-kelvin.c |
| |
| diff --git a/newlib/libc/machine/riscv/Makefile.am b/newlib/libc/machine/riscv/Makefile.am |
| index 017b4be2e..c18f728a1 100644 |
| --- a/newlib/libc/machine/riscv/Makefile.am |
| +++ b/newlib/libc/machine/riscv/Makefile.am |
| @@ -8,7 +8,7 @@ AM_CCASFLAGS = $(INCLUDES) |
| |
| noinst_LIBRARIES = lib.a |
| |
| -lib_a_SOURCES = memmove.S memmove-stub.c memset.S memcpy-asm.S memcpy.c strlen.c \ |
| +lib_a_SOURCES = memmove.S memmove-stub.c memset.S memcpy-asm.S memcpy.c memcpy-kelvin.c strlen.c \ |
| strcpy.c strcmp.S setjmp.S ieeefp.c ffs.c |
| lib_a_CCASFLAGS=$(AM_CCASFLAGS) |
| lib_a_CFLAGS=$(AM_CFLAGS) |
| diff --git a/newlib/libc/machine/riscv/Makefile.in b/newlib/libc/machine/riscv/Makefile.in |
| index e6dee8763..0eefef21d 100644 |
| --- a/newlib/libc/machine/riscv/Makefile.in |
| +++ b/newlib/libc/machine/riscv/Makefile.in |
| @@ -71,7 +71,7 @@ lib_a_AR = $(AR) $(ARFLAGS) |
| lib_a_LIBADD = |
| am_lib_a_OBJECTS = lib_a-memmove.$(OBJEXT) \ |
| lib_a-memmove-stub.$(OBJEXT) lib_a-memset.$(OBJEXT) \ |
| - lib_a-memcpy-asm.$(OBJEXT) lib_a-memcpy.$(OBJEXT) \ |
| + lib_a-memcpy-asm.$(OBJEXT) lib_a-memcpy.$(OBJEXT) lib_a-memcpy-kelvin.$(OBJEXT) \ |
| lib_a-strlen.$(OBJEXT) lib_a-strcpy.$(OBJEXT) \ |
| lib_a-strcmp.$(OBJEXT) lib_a-setjmp.$(OBJEXT) \ |
| lib_a-ieeefp.$(OBJEXT) lib_a-ffs.$(OBJEXT) |
| @@ -200,7 +200,7 @@ AUTOMAKE_OPTIONS = cygnus |
| INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) |
| AM_CCASFLAGS = $(INCLUDES) |
| noinst_LIBRARIES = lib.a |
| -lib_a_SOURCES = memmove.S memmove-stub.c memset.S memcpy-asm.S memcpy.c strlen.c \ |
| +lib_a_SOURCES = memmove.S memmove-stub.c memset.S memcpy-asm.S memcpy.c memcpy-kelvin.c strlen.c \ |
| strcpy.c strcmp.S setjmp.S ieeefp.c ffs.c |
| |
| lib_a_CCASFLAGS = $(AM_CCASFLAGS) |
| @@ -313,6 +313,12 @@ lib_a-memcpy.o: memcpy.c |
| lib_a-memcpy.obj: memcpy.c |
| $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-memcpy.obj `if test -f 'memcpy.c'; then $(CYGPATH_W) 'memcpy.c'; else $(CYGPATH_W) '$(srcdir)/memcpy.c'; fi` |
| |
| +lib_a-memcpy-kelvin.o: memcpy-kelvin.c |
| + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-memcpy-kelvin.o `test -f 'memcpy-kelvin.c' || echo '$(srcdir)/'`memcpy-kelvin.c |
| + |
| +lib_a-memcpy-kelvin.obj: memcpy-kelvin.c |
| + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-memcpy-kelvin.obj `if test -f 'memcpy-kelvin.c'; then $(CYGPATH_W) 'memcpy-kelvin.c'; else $(CYGPATH_W) '$(srcdir)/memcpy-kelvin.c'; fi` |
| + |
| lib_a-strlen.o: strlen.c |
| $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-strlen.o `test -f 'strlen.c' || echo '$(srcdir)/'`strlen.c |
| |
| diff --git a/newlib/libc/machine/riscv/memcpy-asm.S b/newlib/libc/machine/riscv/memcpy-asm.S |
| index 5571e4704..2a271b095 100644 |
| --- a/newlib/libc/machine/riscv/memcpy-asm.S |
| +++ b/newlib/libc/machine/riscv/memcpy-asm.S |
| @@ -9,7 +9,7 @@ |
| http://www.opensource.org/licenses. |
| */ |
| |
| -#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) |
| +#if (defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)) && !defined(__KELVIN__) |
| .text |
| .global memcpy |
| .type memcpy, @function |
| diff --git a/newlib/libc/machine/riscv/memcpy-kelvin.c b/newlib/libc/machine/riscv/memcpy-kelvin.c |
| new file mode 100644 |
| index 000000000..6873b56c4 |
| --- /dev/null |
| +++ b/newlib/libc/machine/riscv/memcpy-kelvin.c |
| @@ -0,0 +1,46 @@ |
| +#if defined(__KELVIN__) |
| + |
| +#define __volatile_always__ volatile |
| +#define ARGS_F_A(FN, A0) FN " " #A0 "\n" |
| +#define ARGS_F_A_A(FN, A0, A1) FN " " #A0 ", " #A1 "\n" |
| +#define ARGS_F_A_A_A(FN, A0, A1, A2) FN " " #A0 ", " #A1 ", " #A2 "\n" |
| +#define ARGS_F_A_A_A_A(FN, A0, A1, A2, A3) \ |
| + FN " " #A0 ", " #A1 ", " #A2 ", " #A3 "\n" |
| +#define getvl_b_x_m(d, s) __asm__ __volatile__(ARGS_F_A_A("getvl.b.x.m", %0, %1) : "=r"(d) : "r"(s)) |
| +#define vld_b_lp_xx_m(Vd, s, t) __asm__ __volatile_always__(ARGS_F_A_A_A("vld.b.lp.xx.m", Vd, %0, %1) : "=r"(s) : "r"(t), "0"(s) : "memory") |
| +#define vst_b_lp_xx_m(Vd, s, t) __asm__ __volatile_always__(ARGS_F_A_A_A("vst.b.lp.xx.m", Vd, %0, %1) : "=r"(s) : "r"(t), "0"(s) : "memory") |
| +#define vld_w_x_m(Vd, s) __asm__ __volatile_always__(ARGS_F_A_A("vld.w.x.m", Vd, %0) : : "r"(s) : "memory") |
| +#define vst_w_x_m(Vd, s) __asm__ __volatile_always__(ARGS_F_A_A("vst.w.x.m", Vd, %0) : : "r"(s) : "memory") |
| + |
| +#include <stddef.h> |
| +#include <stdint.h> |
| + |
| +void * |
| +memcpy(void *__restrict dst, const void *__restrict src, size_t n) |
| +{ |
| + const uint8_t *s = (const uint8_t *)(src); |
| + uint8_t *d = (uint8_t *)(dst); |
| + int vl; |
| + // Storage for caller's v0-v7 |
| + uint32_t spill[8 * 8]; |
| + vst_w_x_m(v0, spill); |
| + vst_w_x_m(v4, spill + 32); |
| + while (1) { |
| + if (n <= 0) break; |
| + getvl_b_x_m(vl, n); |
| + n -= vl; |
| + vld_b_lp_xx_m(v0, s, vl); |
| + vst_b_lp_xx_m(v0, d, vl); |
| + |
| + if (n <= 0) break; |
| + getvl_b_x_m(vl, n); |
| + n -= vl; |
| + vld_b_lp_xx_m(v4, s, vl); |
| + vst_b_lp_xx_m(v4, d, vl); |
| + } |
| + vld_w_x_m(v0, spill); |
| + vld_w_x_m(v4, spill + 32); |
| + return dst; |
| +} |
| + |
| +#endif // defined(__KELVIN__) |
| diff --git a/newlib/libc/machine/riscv/memcpy.c b/newlib/libc/machine/riscv/memcpy.c |
| index 4098f3ab1..4e6c55071 100644 |
| --- a/newlib/libc/machine/riscv/memcpy.c |
| +++ b/newlib/libc/machine/riscv/memcpy.c |
| @@ -9,7 +9,7 @@ |
| http://www.opensource.org/licenses. |
| */ |
| |
| -#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) |
| +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) || defined(__KELVIN__) |
| //memcpy defined in memcpy-asm.S |
| #else |
| |
| -- |
| 2.44.0.396.g6e790dbe36-goog |
| |