Subject: Use memcpy() instead of reinventing it
From: Simon McVittie <[email-masked]>
Date: Sun, 23 Nov 2014 22:50:33 +0000

gcc inlines memcpy() with results as fast as handwritten code (at
least in my brief testing with lzop), and knows the alignment
constraints for our architectures.

Change suggested by Julian Taylor.

Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=757037

RP: Patch is still in debian as of 20220524 in a revised form:
https://sources.debian.org/patches/lzo2/2.10-2/
https://sources.debian.org/patches/lzo2/2.10-2/0001-Conditionally-replace-reinvention-of-memcpy-with-cal.patch/
It was submitted in 2015, no reply to an email from RP in 2022 either.

We likely need this in OE to prevent against unaligned accesses
on systems such as armv5.

Upstream-Status: Inactive-Upstream
Signed-off-by: Saul Wold <[email-masked]>
---
 minilzo/minilzo.c | 14 ++++++++++++++
 src/lzo_func.h    | 14 ++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/minilzo/minilzo.c b/minilzo/minilzo.c
index ab2be5f..6913c2f 100644
--- a/minilzo/minilzo.c
+++ b/minilzo/minilzo.c
@@ -3523,6 +3523,20 @@ LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(*(lzo_memops_TU8p)0)==8)
     if ((void)0, n__n > 0) do { *d__n++ = *s__n++; } while (--n__n > 0); \
     LZO_BLOCK_END
 
+/* Debian-specific change: we know that our compiler inlines memcpy() with
+ * constant n to be as fast as handwritten code, and knows which architectures
+ * need things correctly aligned. */
+#undef LZO_MEMOPS_COPY1
+#undef LZO_MEMOPS_COPY2
+#undef LZO_MEMOPS_COPY4
+#undef LZO_MEMOPS_COPY8
+#undef LZO_MEMOPS_COPYN
+#define LZO_MEMOPS_COPY1(dd,ss) memcpy(dd, ss, 1)
+#define LZO_MEMOPS_COPY2(dd,ss) memcpy(dd, ss, 2)
+#define LZO_MEMOPS_COPY4(dd,ss) memcpy(dd, ss, 4)
+#define LZO_MEMOPS_COPY8(dd,ss) memcpy(dd, ss, 8)
+#define LZO_MEMOPS_COPYN(dd,ss,nn) memcpy(dd, ss, nn)
+
 __lzo_static_forceinline lzo_uint16_t lzo_memops_get_le16(const lzo_voidp ss)
 {
     lzo_uint16_t v;
diff --git a/src/lzo_func.h b/src/lzo_func.h
index dfaa676..1cc1b53 100644
--- a/src/lzo_func.h
+++ b/src/lzo_func.h
@@ -333,6 +333,20 @@ LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(*(lzo_memops_TU8p)0)==8)
     if ((void)0, n__n > 0) do { *d__n++ = *s__n++; } while (--n__n > 0); \
     LZO_BLOCK_END
 
+/* Debian-specific change: we know that our compiler inlines memcpy() with
+ * constant n to be as fast as handwritten code, and knows which architectures
+ * need things correctly aligned. */
+#undef LZO_MEMOPS_COPY1
+#undef LZO_MEMOPS_COPY2
+#undef LZO_MEMOPS_COPY4
+#undef LZO_MEMOPS_COPY8
+#undef LZO_MEMOPS_COPYN
+#define LZO_MEMOPS_COPY1(dd,ss) memcpy(dd, ss, 1)
+#define LZO_MEMOPS_COPY2(dd,ss) memcpy(dd, ss, 2)
+#define LZO_MEMOPS_COPY4(dd,ss) memcpy(dd, ss, 4)
+#define LZO_MEMOPS_COPY8(dd,ss) memcpy(dd, ss, 8)
+#define LZO_MEMOPS_COPYN(dd,ss,nn) memcpy(dd, ss, nn)
+
 __lzo_static_forceinline lzo_uint16_t lzo_memops_get_le16(const lzo_voidp ss)
 {
     lzo_uint16_t v;