summaryrefslogtreecommitdiff
path: root/functable.c
diff options
context:
space:
mode:
authorNathan Moinvaziri <nathan@nathanm.com>2020-01-17 19:04:20 -0800
committerHans Kristian Rosbach <hk-github@circlestorm.org>2020-04-30 10:01:46 +0200
commit69bbb0d823771bc84ed1ba96381a91e06847c428 (patch)
treeb9f3732d273f20d898f03c5773635c7af6966aea /functable.c
parent42aa81beafa2ea14cd780a9acf3359a0a09ca44b (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.c29
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;