diff --git a/c_src/wiredtiger-build.patch b/c_src/wiredtiger-build.patch index 22628e6..8932c20 100644 --- a/c_src/wiredtiger-build.patch +++ b/c_src/wiredtiger-build.patch @@ -1,106 +1,12 @@ diff --git a/ext/compressors/snappy/Makefile.am b/ext/compressors/snappy/Makefile.am -index 6d78823..2122cf8 100644 +index 6d78823..c423590 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$(abs_top_builddir)/../../system/include +libwiredtiger_snappy_la_LDFLAGS = -avoid-version -module -L$(abs_top_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); - } diff --git a/rebar.config b/rebar.config index ecdc6ea..d1c7022 100644 --- a/rebar.config +++ b/rebar.config @@ -38,7 +38,7 @@ {port_specs, [{"priv/wterl.so", ["c_src/*.c"]}]}. {port_env, [ - {"DRV_CFLAGS", "$DRV_CFLAGS -fPIC -Wall -Wextra -Werror -O3 -march=native -mtune=native -I c_src/system/include"}, + {"DRV_CFLAGS", "$DRV_CFLAGS -O3 -mtune=native -march=native -fPIC -Wall -Wextra -Werror -I c_src/system/include"}, {"DRV_LDFLAGS", "$DRV_LDFLAGS -Wl,-rpath,lib/wterl/priv:lib/wterl-0.9.0/priv:priv -Lc_src/system/lib -lwiredtiger"} ]}.