summaryrefslogtreecommitdiff
path: root/crc32.c
diff options
context:
space:
mode:
authorMika Lindqvist <postmaster@raasu.org>2016-04-02 03:11:43 +0300
committerMika Lindqvist <postmaster@raasu.org>2017-03-24 23:55:58 +0200
commit02f5b0b9c6666573024d3b149adc64ecc785caee (patch)
tree9ae5903257baa3b0ccfd6c9c0c5d93fd2b4f7bc6 /crc32.c
parent27f42890a1a9af2de387e197cc1af9adc92ab070 (diff)
Add support for ARM ACLE instructions.
Diffstat (limited to 'crc32.c')
-rw-r--r--crc32.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/crc32.c b/crc32.c
index 4f71b22..000a868 100644
--- a/crc32.c
+++ b/crc32.c
@@ -16,12 +16,14 @@
#elif defined(WIN32) || defined(_WIN32)
# define LITTLE_ENDIAN 1234
# define BIG_ENDIAN 4321
-# if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
+# if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64) || defined (_M_ARM)
# define BYTE_ORDER LITTLE_ENDIAN
# else
# error Unknown endianness!
# endif
-#elif __APPLE__
+#elif defined(__linux__)
+# include <endian.h>
+#elif defined(__APPLE__) || defined(__arm__)
# include <machine/endian.h>
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__)
# include <sys/endian.h>
@@ -65,6 +67,10 @@
ZLIB_INTERNAL uint32_t crc32_generic(uint32_t, const unsigned char *, z_off64_t);
+#ifdef __ARM_FEATURE_CRC32
+extern uint32_t crc32_acle(uint32_t, const unsigned char *, z_off64_t);
+#endif
+
#if BYTE_ORDER == LITTLE_ENDIAN
ZLIB_INTERNAL uint32_t crc32_little(uint32_t, const unsigned char *, size_t);
#elif BYTE_ORDER == BIG_ENDIAN
@@ -217,7 +223,11 @@ uint32_t ZEXPORT crc32_z(uint32_t crc, const unsigned char *buf, size_t len) {
if (sizeof(void *) == sizeof(ptrdiff_t)) {
#if BYTE_ORDER == LITTLE_ENDIAN
+# if __ARM_FEATURE_CRC32
+ return crc32_acle(crc, buf, len);
+# else
return crc32_little(crc, buf, len);
+# endif
#elif BYTE_ORDER == BIG_ENDIAN
return crc32_big(crc, buf, len);
#endif