diff options
author | Mika Lindqvist <postmaster@raasu.org> | 2016-04-02 03:11:43 +0300 |
---|---|---|
committer | Mika Lindqvist <postmaster@raasu.org> | 2017-03-24 23:55:58 +0200 |
commit | 02f5b0b9c6666573024d3b149adc64ecc785caee (patch) | |
tree | 9ae5903257baa3b0ccfd6c9c0c5d93fd2b4f7bc6 /crc32.c | |
parent | 27f42890a1a9af2de387e197cc1af9adc92ab070 (diff) |
Add support for ARM ACLE instructions.
Diffstat (limited to 'crc32.c')
-rw-r--r-- | crc32.c | 14 |
1 files changed, 12 insertions, 2 deletions
@@ -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 |