reason: this patch is created for performance optimization in crc calculation only suitable for openeuler of aarch64 architecture。 you can patch it to the source code of zip software package and install the zip software as usual。 effect: with this patch, the zip software can speed up nearly 20% when running than before。
115 lines
3.1 KiB
Diff
115 lines
3.1 KiB
Diff
From 6210c2007a430882d234d846d133d5f3799434aa Mon Sep 17 00:00:00 2001
|
|
From: Euler Hanzh <18221254@bjtu.edu.cn>
|
|
Date: Mon, 17 May 2021 17:32:51 +0800
|
|
Subject: [PATCH 2/2] 2
|
|
|
|
---
|
|
zip30/crc32.c | 27 +++++++++++++++++++++++++++
|
|
zip30/crc32.h | 4 ++++
|
|
zip30/unix/Makefile | 13 +++++++++++--
|
|
3 files changed, 42 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/zip30/crc32.c b/zip30/crc32.c
|
|
index 6b2403b..9e26af7 100644
|
|
--- a/zip30/crc32.c
|
|
+++ b/zip30/crc32.c
|
|
@@ -675,7 +675,32 @@ void free_crc_table()
|
|
|
|
#endif /* (IZ_CRC_BE_OPTIMIZ || IZ_CRC_LE_OPTIMIZ) */
|
|
|
|
+#ifdef ARCH_AARCH64
|
|
+u_int32_t crc32(u_int32_t crc,const u_int8_t *p, unsigned int len)
|
|
+{
|
|
+int64_t length = len;
|
|
+
|
|
+while ((length -= sizeof(u_int64_t)) >=0) {
|
|
+ __builtin_aarch64_crc32cx(crc, *((u_int64_t *)p));
|
|
+ p += sizeof(u_int64_t);
|
|
+}
|
|
|
|
+if (length & sizeof(u_int32_t)) {
|
|
+ __builtin_aarch64_crc32cw(crc, *((u_int32_t *)p));
|
|
+ p += sizeof(u_int32_t);
|
|
+}
|
|
+
|
|
+if (length & sizeof(u_int16_t)) {
|
|
+ __builtin_aarch64_crc32ch(crc, *((u_int16_t *)p));
|
|
+ p += sizeof(u_int16_t);
|
|
+}
|
|
+
|
|
+if (length & sizeof(u_int8_t))
|
|
+ __builtin_aarch64_crc32cb(crc, *p);
|
|
+
|
|
+return crc;
|
|
+}
|
|
+#else
|
|
/* ========================================================================= */
|
|
ulg crc32(crc, buf, len)
|
|
ulg crc; /* crc shift register */
|
|
@@ -726,6 +751,8 @@ ulg crc32(crc, buf, len)
|
|
|
|
return REV_BE(c) ^ 0xffffffffL; /* (instead of ~c for 64-bit machines) */
|
|
}
|
|
+#endif /* !ARCH_AARCH64*/
|
|
+
|
|
#endif /* !ASM_CRC */
|
|
#endif /* !CRC_TABLE_ONLY */
|
|
#endif /* !USE_ZLIB */
|
|
diff --git a/zip30/crc32.h b/zip30/crc32.h
|
|
index 83af240..6fdaf32 100644
|
|
--- a/zip30/crc32.h
|
|
+++ b/zip30/crc32.h
|
|
@@ -36,7 +36,11 @@
|
|
# undef IZ_CRC_BE_OPTIMIZ
|
|
# endif
|
|
#else /* !(USE_ZLIB || CRC_TABLE_ONLY) */
|
|
+# ifdef ARCH_AARCH64
|
|
+ u_int32_t crc32(u_int32_t crc,const u_int8_t *p, unsigned int len);
|
|
+# else
|
|
ulg crc32 OF((ulg crc, ZCONST uch *buf, extent len));
|
|
+# endif
|
|
#endif /* ?(USE_ZLIB || CRC_TABLE_ONLY) */
|
|
|
|
#ifndef CRC_32_TAB
|
|
diff --git a/zip30/unix/Makefile b/zip30/unix/Makefile
|
|
index abd0c44..065395a 100644
|
|
--- a/zip30/unix/Makefile
|
|
+++ b/zip30/unix/Makefile
|
|
@@ -37,6 +37,9 @@ CHMOD = chmod
|
|
BINFLAGS = 755
|
|
MANFLAGS = 644
|
|
|
|
+
|
|
+TARGET_ARCH = $(shell uname -m)
|
|
+ARCH = $(shell getconf LONG_BIT)
|
|
# target directories - where to install executables and man pages to
|
|
prefix = /usr/local
|
|
BINDIR = $(prefix)/bin
|
|
@@ -59,6 +62,12 @@ IZ_OUR_BZIP2_DIR = bzip2
|
|
# LFLAGS2 flags after obj file list (libraries, etc)
|
|
CFLAGS_NOOPT = -I. -DUNIX $(LOCAL_ZIP)
|
|
CFLAGS = -O2 $(CFLAGS_NOOPT)
|
|
+ifeq ($(TARGET_ARCH),aarch64)
|
|
+CFF = -DARCH=$(ARCH) -march=armv8.1-a -D ARCH_AARCH64
|
|
+else
|
|
+CFF =
|
|
+endif
|
|
+
|
|
LFLAGS1 =
|
|
LFLAGS2 = -s
|
|
|
|
@@ -80,10 +89,10 @@ ZIP_H = zip.h ziperr.h tailor.h unix/osdep.h
|
|
.SUFFIXES:
|
|
.SUFFIXES: _.o .o .c .doc .1
|
|
.c_.o:
|
|
- $(CC) -c $(CFLAGS) -DUTIL -o $@ $<
|
|
+ $(CC) -c $(CFLAGS) -DUTIL $(CFF) -o $@ $<
|
|
|
|
.c.o:
|
|
- $(CC) -c $(CFLAGS) $<
|
|
+ $(CC) -c $(CFLAGS) $(CFF) $<
|
|
|
|
.1.doc:
|
|
nroff -man $< | col -bx | uniq > $@
|
|
--
|
|
2.23.0
|