106 lines
3.1 KiB
Diff
106 lines
3.1 KiB
Diff
diff --git a/ext/compressors/snappy/Makefile.am b/ext/compressors/snappy/Makefile.am
|
|
index 6d78823..2122cf8 100644
|
|
--- a/ext/compressors/snappy/Makefile.am
|
|
+++ b/ext/compressors/snappy/Makefile.am
|
|
@@ -2,5 +2,6 @@ AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src/include
|
|
|
|
lib_LTLIBRARIES = libwiredtiger_snappy.la
|
|
libwiredtiger_snappy_la_SOURCES = snappy_compress.c
|
|
-libwiredtiger_snappy_la_LDFLAGS = -avoid-version -module
|
|
+libwiredtiger_snappy_la_CFLAGS = -I$(src_builddir)/../../system/include
|
|
+libwiredtiger_snappy_la_LDFLAGS = -avoid-version -module -L$(src_builddir)/../../system/lib -Wl,-rpath,lib/wterl-0.9.0/priv:lib/wterl/priv:priv
|
|
libwiredtiger_snappy_la_LIBADD = -lsnappy
|
|
diff --git a/src/support/cksum.c b/src/support/cksum.c
|
|
index 7e9befe..b924db7 100644
|
|
--- a/src/support/cksum.c
|
|
+++ b/src/support/cksum.c
|
|
@@ -27,6 +27,13 @@
|
|
|
|
#include "wt_internal.h"
|
|
|
|
+#if defined(__amd64) || defined(__x86_64)
|
|
+#define USE_HARDWARE_CRC32 1
|
|
+#else
|
|
+#undef USE_HARDWARE_CRC32
|
|
+#endif
|
|
+
|
|
+#ifdef USE_HARDWARE_CRC32
|
|
static const uint32_t g_crc_slicing[8][256] = {
|
|
#ifdef WORDS_BIGENDIAN
|
|
/*
|
|
@@ -1078,6 +1085,7 @@ static const uint32_t g_crc_slicing[8][256] = {
|
|
}
|
|
#endif
|
|
};
|
|
+#endif /* USE_HARDWARE_CRC32 */
|
|
|
|
/*
|
|
* __wt_cksum --
|
|
@@ -1106,15 +1114,29 @@ __wt_cksum(const void *chunk, size_t len)
|
|
/* Checksum one byte at a time to the first 4B boundary. */
|
|
for (p = chunk;
|
|
((uintptr_t)p & (sizeof(uint32_t) - 1)) != 0 &&
|
|
- len > 0; ++p, --len)
|
|
+ len > 0; ++p, --len) {
|
|
+#ifdef USE_HARDWARE_CRC32
|
|
+ __asm__ __volatile__(
|
|
+ ".byte 0xF2, 0x0F, 0x38, 0xF0, 0xF1"
|
|
+ : "=S" (crc)
|
|
+ : "0" (crc), "c" (*p));
|
|
+#else
|
|
#ifdef WORDS_BIGENDIAN
|
|
crc = g_crc_slicing[0][((crc >> 24) ^ *p) & 0xFF] ^ (crc << 8);
|
|
#else
|
|
crc = g_crc_slicing[0][(crc ^ *p) & 0xFF] ^ (crc >> 8);
|
|
#endif
|
|
+#endif
|
|
+ }
|
|
|
|
/* Checksum in 8B chunks. */
|
|
for (nqwords = len / sizeof(uint64_t); nqwords; nqwords--) {
|
|
+#ifdef USE_HARDWARE_CRC32
|
|
+ __asm__ __volatile__ (
|
|
+ ".byte 0xf2, 0x48, 0x0f, 0x38, 0xf0, 0xf1;"
|
|
+ : "=S"(crc)
|
|
+ : "S"(crc), "c"(*p));
|
|
+#else
|
|
crc ^= *(uint32_t *)p;
|
|
p += sizeof(uint32_t);
|
|
next = *(uint32_t *)p;
|
|
@@ -1139,22 +1161,32 @@ __wt_cksum(const void *chunk, size_t len)
|
|
g_crc_slicing[1][(next >> 16) & 0xFF] ^
|
|
g_crc_slicing[0][(next >> 24)];
|
|
#endif
|
|
+#endif
|
|
}
|
|
|
|
/* Checksum trailing bytes one byte at a time. */
|
|
+ for (len &= 0x7; len > 0; ++p, len--) {
|
|
+#ifdef USE_HARDWARE_CRC32
|
|
+ __asm__ __volatile__(
|
|
+ ".byte 0xF2, 0x0F, 0x38, 0xF0, 0xF1"
|
|
+ : "=S" (crc)
|
|
+ : "0" (crc), "c" (*p));
|
|
+#else
|
|
#ifdef WORDS_BIGENDIAN
|
|
- for (len &= 0x7; len > 0; ++p, len--)
|
|
crc = g_crc_slicing[0][((crc >> 24) ^ *p) & 0xFF] ^ (crc << 8);
|
|
+#else
|
|
+ crc = g_crc_slicing[0][(crc ^ *p) & 0xFF] ^ (crc >> 8);
|
|
+#endif
|
|
+#endif
|
|
+ }
|
|
|
|
+#ifdef WORDS_BIGENDIAN
|
|
/* Do final byte swap to produce a result identical to little endian */
|
|
crc =
|
|
((crc << 24) & 0xFF000000) |
|
|
((crc << 8) & 0x00FF0000) |
|
|
((crc >> 8) & 0x0000FF00) |
|
|
((crc >> 24) & 0x000000FF);
|
|
-#else
|
|
- for (len &= 0x7; len > 0; ++p, len--)
|
|
- crc = g_crc_slicing[0][(crc ^ *p) & 0xFF] ^ (crc >> 8);
|
|
#endif
|
|
return (~crc);
|
|
}
|