diff options
author | Nathan Moinvaziri <nathan@nathanm.com> | 2020-01-17 19:04:20 -0800 |
---|---|---|
committer | Hans Kristian Rosbach <hk-github@circlestorm.org> | 2020-04-30 10:01:46 +0200 |
commit | 69bbb0d823771bc84ed1ba96381a91e06847c428 (patch) | |
tree | b9f3732d273f20d898f03c5773635c7af6966aea /functable.c | |
parent | 42aa81beafa2ea14cd780a9acf3359a0a09ca44b (diff) |
Standardize insert_string functionality across architectures. Added unaligned conditionally compiled code for insert_string and quick_insert_string. Unify sse42 crc32 assembly between insert_string and quick_insert_string. Modified quick_insert_string to work across architectures.
Diffstat (limited to 'functable.c')
-rw-r--r-- | functable.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/functable.c b/functable.c index 2519744..c462a92 100644 --- a/functable.c +++ b/functable.c @@ -10,12 +10,21 @@ #include "functable.h" /* insert_string */ +extern Pos insert_string_c(deflate_state *const s, const Pos str, unsigned int count); #ifdef X86_SSE42_CRC_HASH -extern Pos insert_string_sse(deflate_state *const s, const Pos str, unsigned int count); +extern Pos insert_string_sse4(deflate_state *const s, const Pos str, unsigned int count); #elif defined(ARM_ACLE_CRC_HASH) extern Pos insert_string_acle(deflate_state *const s, const Pos str, unsigned int count); #endif +/* quick_insert_string */ +extern Pos quick_insert_string_c(deflate_state *const s, const Pos str); +#ifdef X86_SSE42_CRC_HASH +extern Pos quick_insert_string_sse4(deflate_state *const s, const Pos str); +#elif defined(ARM_ACLE_CRC_HASH) +extern Pos quick_insert_string_acle(deflate_state *const s, const Pos str); +#endif + /* fill_window */ #if defined(X86_SSE2) extern void fill_window_sse(deflate_state *s); @@ -55,6 +64,7 @@ extern uint32_t crc32_big(uint32_t, const unsigned char *, uint64_t); /* stub definitions */ ZLIB_INTERNAL Pos insert_string_stub(deflate_state *const s, const Pos str, unsigned int count); +ZLIB_INTERNAL Pos quick_insert_string_stub(deflate_state *const s, const Pos str); ZLIB_INTERNAL void fill_window_stub(deflate_state *s); ZLIB_INTERNAL uint32_t adler32_stub(uint32_t adler, const unsigned char *buf, size_t len); ZLIB_INTERNAL uint32_t crc32_stub(uint32_t crc, const unsigned char *buf, uint64_t len); @@ -64,6 +74,7 @@ ZLIB_INTERNAL void slide_hash_stub(deflate_state *s); ZLIB_INTERNAL __thread struct functable_s functable = { fill_window_stub, insert_string_stub, + quick_insert_string_stub, adler32_stub, crc32_stub, slide_hash_stub @@ -77,7 +88,7 @@ ZLIB_INTERNAL Pos insert_string_stub(deflate_state *const s, const Pos str, unsi #ifdef X86_SSE42_CRC_HASH if (x86_cpu_has_sse42) - functable.insert_string = &insert_string_sse; + functable.insert_string = &insert_string_sse4; #elif defined(__ARM_FEATURE_CRC32) && defined(ARM_ACLE_CRC_HASH) if (arm_cpu_has_crc32) functable.insert_string = &insert_string_acle; @@ -86,6 +97,20 @@ ZLIB_INTERNAL Pos insert_string_stub(deflate_state *const s, const Pos str, unsi return functable.insert_string(s, str, count); } +ZLIB_INTERNAL Pos quick_insert_string_stub(deflate_state *const s, const Pos str) { + functable.quick_insert_string = &quick_insert_string_c; + +#ifdef X86_SSE42_CRC_HASH + if (x86_cpu_has_sse42) + functable.quick_insert_string = &quick_insert_string_sse4; +#elif defined(__ARM_FEATURE_CRC32) && defined(ARM_ACLE_CRC_HASH) + if (arm_cpu_has_crc32) + functable.quick_insert_string = &quick_insert_string_acle; +#endif + + return functable.quick_insert_string(s, str); +} + ZLIB_INTERNAL void fill_window_stub(deflate_state *s) { // Initialize default functable.fill_window = &fill_window_c; |