diff --git a/.gitignore b/.gitignore
index 975557746738fc77d8bdca381c015a2859f6f806..7ef41e831869f9e4faf8e1a0e9656a826b031688 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,6 +30,7 @@ test/unit/rope_avl
 test/unit/rope_basic
 test/unit/rope_stress
 test/unit/rlist
+test/unit/bit_test
 Makefile
 CMakeFiles
 CMakeCache.txt
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 55774f891b0a575670b077c00ebb176b6bc718c3..999465d6dcdd59218febe8b3eb10caf5130b9f54 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -9,9 +9,12 @@ include(CheckLibraryExists)
 include(CheckIncludeFile)
 include(CheckCCompilerFlag)
 include(CheckSymbolExists)
+include(CheckCSourceRuns)
 include(CheckCXXSourceRuns)
 include(TestBigEndian)
 include(CheckFunctionExists)
+include(CheckBuiltInFunctionExists)
+include(CheckPrototypeDefinition)
 
 find_program(ECHO echo)
 find_program(XSLTPROC xsltproc)
diff --git a/cmake/CheckBuiltInFunctionExists.cmake b/cmake/CheckBuiltInFunctionExists.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..6b4128f129f2f3effa521edcd17508964b3a03bd
--- /dev/null
+++ b/cmake/CheckBuiltInFunctionExists.cmake
@@ -0,0 +1,7 @@
+include(CheckCSourceCompiles)
+
+macro(check_builtin_function_exists function variable)
+    set(CMAKE_REQUIRED_FLAGS "-Wno-unused-value -Wno-error")
+    check_c_source_compiles("int main(void) { ${function}; return 0; }"
+        ${variable})
+endmacro(check_builtin_function_exists)
diff --git a/include/config.h.cmake b/include/config.h.cmake
index 407b4d8fc7a542980df123b1e5516b90af9725d0..e782061b1c31fddcd431d5000de8f8aff92b840f 100644
--- a/include/config.h.cmake
+++ b/include/config.h.cmake
@@ -74,6 +74,20 @@
  */
 #cmakedefine HAVE_BYTE_ORDER_BIG_ENDIAN 1
 
+/*
+ * Set if compiler has __builtin_XXX methods.
+ */
+#cmakedefine HAVE_BUILTIN_CTZ 1
+#cmakedefine HAVE_BUILTIN_CTZLL 1
+#cmakedefine HAVE_BUILTIN_CLZ 1
+#cmakedefine HAVE_BUILTIN_CLZLL 1
+#cmakedefine HAVE_BUILTIN_POPCOUNT 1
+#cmakedefine HAVE_BUILTIN_POPCOUNTLL 1
+#cmakedefine HAVE_BUILTIN_BSWAP32 1
+#cmakedefine HAVE_BUILTIN_BSWAP64 1
+#cmakedefine HAVE_FFSL 1
+#cmakedefine HAVE_FFSLL 1
+
 /*
  * pthread have problems with -std=c99
  */
diff --git a/include/lib/bit/bit.h b/include/lib/bit/bit.h
new file mode 100644
index 0000000000000000000000000000000000000000..1e6f853f0a65c7b9f8ff367f57cf8f1aaff98115
--- /dev/null
+++ b/include/lib/bit/bit.h
@@ -0,0 +1,306 @@
+#ifndef TARANTOOL_LIB_BIT_BIT_H_INCLUDED
+#define TARANTOOL_LIB_BIT_BIT_H_INCLUDED
+/*
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above
+ *    copyright notice, this list of conditions and the
+ *    following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials
+ *    provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * <COPYRIGHT HOLDER> OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/**
+ * @file
+ * @brief Bit manipulation library
+ */
+#include "config.h"
+
+#include <stddef.h>
+#include <stdint.h>
+#if defined(HAVE_FFSL) || defined(HAVE_FFSLL)
+#include <string.h>
+#include <strings.h>
+#endif /* defined(HAVE_FFSL) || defined(HAVE_FFSLL) */
+#include <limits.h>
+
+/**
+ * @cond false
+ * @brief Naive implementation of ctz.
+ */
+#define CTZ_NAIVE(x, bitsize) {						\
+	if (x == 0) {							\
+		return (bitsize);					\
+	}								\
+									\
+	int r = 0;							\
+	for (; (x & 1) == 0; r++) {					\
+		x >>= 1;						\
+	}								\
+									\
+	return r;							\
+}
+/** @endcond */
+
+/**
+ * @brief Count Trailing Zeros.
+ * Returns the number of trailing 0-bits in @a x, starting at the least
+ * significant bit position. If @a x is 0, the result is undefined.
+ * @param x integer
+ * @see __builtin_ctz()
+ * @return the number trailing 0-bits
+ */
+ __attribute__((const)) inline int
+bit_ctz_u32(uint32_t x)
+{
+#if defined(HAVE_BUILTIN_CTZ)
+	return __builtin_ctz(x);
+#elif defined(HAVE_FFSL)
+	return ffsl(x) - 1;
+#else
+	CTZ_NAIVE(x, sizeof(uint32_t) * CHAR_BIT);
+#endif
+}
+
+#include <stdio.h>
+#include <inttypes.h>
+
+/**
+ * @copydoc bit_ctz_u32
+ */
+ __attribute__((const)) inline int
+bit_ctz_u64(uint64_t x)
+{
+#if   defined(HAVE_BUILTIN_CTZLL)
+	return __builtin_ctzll(x);
+#elif defined(HAVE_FFSLL)
+	return ffsll(x) - 1;
+#else
+	CTZ_NAIVE(x, sizeof(uint64_t) * CHAR_BIT);
+#endif
+}
+
+#undef CTZ_NAIVE
+
+/**
+ * @cond false
+ * @brief Naive implementation of clz.
+ */
+#define CLZ_NAIVE(x, bitsize) {						\
+	if (x == 0) {							\
+		return  (bitsize);					\
+	}								\
+									\
+	int r = (bitsize);						\
+	for (; x; r--) {						\
+		x >>= 1;						\
+	}								\
+									\
+	return r;							\
+}
+/** @endcond */
+
+/**
+ * @brief Count Leading Zeros.
+ * Returns the number of leading 0-bits in @a x, starting at the most
+ * significant bit position. If @a x is 0, the result is undefined.
+ * @param x integer
+ * @see __builtin_clz()
+ * @return the number of leading 0-bits
+ */
+ __attribute__((const)) inline int
+bit_clz_u32(uint32_t x)
+{
+#if   defined(HAVE_BUILTIN_CLZ)
+	return __builtin_clz(x);
+#else /* !defined(HAVE_BUILTIN_CLZ) */
+	CLZ_NAIVE(x, sizeof(uint32_t) * CHAR_BIT);
+#endif
+}
+
+/**
+ * @copydoc bit_clz_u32
+ */
+__attribute__((const)) inline int
+bit_clz_u64(uint64_t x)
+{
+#if   defined(HAVE_BUILTIN_CLZLL)
+	return __builtin_clzll(x);
+#else /* !defined(HAVE_BUILTIN_CLZLL) */
+	CLZ_NAIVE(x, sizeof(uint64_t) * CHAR_BIT);
+#endif
+}
+
+#undef CLZ_NAIVE
+
+/**
+ * @cond false
+ * @brief Naive implementation of popcount.
+ */
+#define POPCOUNT_NAIVE(x, bitsize)  {					\
+	int r;								\
+	for (r = 0; x; r++) {						\
+		x &= (x-1);						\
+	}								\
+									\
+	return r;							\
+}
+/** @endcond */
+
+/**
+ * @brief Returns the number of 1-bits in @a x.
+ * @param x integer
+ * @see __builtin_popcount()
+ * @return the number of 1-bits in @a x
+ */
+__attribute__((const)) inline int
+bit_count_u32(uint32_t x)
+{
+#if   defined(HAVE_BUILTIN_POPCOUNT)
+	return __builtin_popcount(x);
+#else /* !defined(HAVE_BUILTIN_POPCOUNT) */
+	POPCOUNT_NAIVE(x, sizeof(uint32_t) * CHAR_BIT);
+#endif
+}
+
+/**
+ * @copydoc bit_count_u32
+ */
+__attribute__((const)) inline int
+bit_count_u64(uint64_t x)
+{
+#if   defined(HAVE_BUILTIN_POPCOUNTLL)
+	return __builtin_popcountll(x);
+#else /* !defined(HAVE_BUILTIN_POPCOUNTLL) */
+	POPCOUNT_NAIVE(x, sizeof(uint64_t) * CHAR_BIT);
+#endif
+}
+
+#undef POPCOUNT_NAIVE
+
+/**
+ * @brief Rotate @a x left by @a r bits
+ * @param x integer
+ * @param r number for bits to rotate
+ * @return @a x rotated left by @a r bits
+ */
+__attribute__ ((const)) inline uint32_t
+bit_rotl_u32(uint32_t x, int r)
+{
+	/* gcc recognises this code and generates a rotate instruction */
+	return ((x << r) | (x >> (32 - r)));
+}
+
+/**
+ * @copydoc bit_rotl_u32
+ */
+__attribute__ ((const)) inline uint64_t
+bit_rotl_u64(uint64_t x, int r)
+{
+	/* gcc recognises this code and generates a rotate instruction */
+	return ((x << r) | (x >> (64 - r)));
+}
+
+/**
+ * @brief Rotate @a x right by @a r bits
+ * @param x integer
+ * @param r number for bits to rotate
+ * @return @a x rotated right by @a r bits
+ * @todo Move this method to bit.h
+ */
+__attribute__ ((const)) inline uint32_t
+bit_rotr_u32(uint32_t x, int r)
+{
+	/* gcc recognises this code and generates a rotate instruction */
+	return ((x >> r) | (x << (32 - r)));
+}
+
+/**
+ * @copydoc bit_rotr_u32
+ */
+__attribute__ ((const)) inline uint64_t
+bit_rotr_u64(uint64_t x, int r)
+{
+	/* gcc recognises this code and generates a rotate instruction */
+	return ((x >> r) | (x << (64 - r)));
+}
+
+/**
+ * @brief Returns a byte order swapped integer @a x.
+ * This function does not take into account host architecture
+ * (as it done by htonl / ntohl functions) and always returns @a x
+ * with byte order swapped (BE -> LE if @a x is in BE and vice versa).
+ * @param x integer
+ * @return @a x with swapped bytes
+ */
+__attribute__ ((const)) inline uint32_t
+bswap_u32(uint32_t x)
+{
+#if defined(HAVE_BUILTIN_BSWAP32)
+	return __builtin_bswap32(x);
+#else /* !defined(HAVE_BUILTIN_BSWAP32) */
+	return	((x << 24) & UINT32_C(0xff000000)) |
+		((x <<  8) & UINT32_C(0x00ff0000)) |
+		((x >>  8) & UINT32_C(0x0000ff00)) |
+		((x >> 24) & UINT32_C(0x000000ff));
+#endif
+}
+
+/**
+ * @copydoc bswap_u32
+ */
+__attribute__ ((const)) inline uint64_t
+bswap_u64(uint64_t x)
+{
+#if defined(HAVE_BUILTIN_BSWAP64)
+	return __builtin_bswap64(x);
+#else /* !defined(HAVE_BUILTIN_BSWAP64) */
+	return  ( (x << 56) & UINT64_C(0xff00000000000000)) |
+		( (x << 40) & UINT64_C(0x00ff000000000000)) |
+		( (x << 24) & UINT64_C(0x0000ff0000000000)) |
+		( (x <<  8) & UINT64_C(0x000000ff00000000)) |
+		( (x >>  8) & UINT64_C(0x00000000ff000000)) |
+		( (x >> 24) & UINT64_C(0x0000000000ff0000)) |
+		( (x >> 40) & UINT64_C(0x000000000000ff00)) |
+		( (x >> 56) & UINT64_C(0x00000000000000ff));
+#endif
+}
+
+/**
+ * @brief Index bits in the @a x, i.e. find all positions where bits are set.
+ * This method fills @a indexes array with found positions in increasing order.
+ * @a offset is added to each index before putting it into @a indexes.
+ * @param x integer
+ * @param indexes memory array where found indexes are stored
+ * @param offset a number added to each index
+ * @return pointer to last+1 element in indexes array
+ */
+int *
+bit_index_u32(uint32_t x, int *indexes, int offset);
+
+/**
+ * @copydoc bit_index_u32
+ */
+int *
+bit_index_u64(uint64_t x, int *indexes, int offset);
+
+#endif /* TARANTOOL_LIB_BIT_BIT_H_INCLUDED */
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index d4dbfa486100af95f324917bda3e0c979bbab80d..6d4a02ce73c1eada33d14ed67336b59b7ad8bb74 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -143,6 +143,8 @@ endif()
 
 set (common_libraries ${common_libraries} PARENT_SCOPE)
 
+add_subdirectory(lib)
+
 function(tarantool_module mod)
     set (module_sources ${ARGN})
     set(cfg_c_flags "-Wno-unused -Wno-unused-parameter")
diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b272b19473065f527ddd9c8fb0afdba7bfcd5e11
--- /dev/null
+++ b/src/lib/CMakeLists.txt
@@ -0,0 +1,2 @@
+add_subdirectory(bit)
+
diff --git a/src/lib/bit/CMakeLists.txt b/src/lib/bit/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..96df0b6ba7d5d9d36ff7df3890428107b5b25605
--- /dev/null
+++ b/src/lib/bit/CMakeLists.txt
@@ -0,0 +1,40 @@
+check_builtin_function_exists("__builtin_ctz" HAVE_BUILTIN_CTZ)
+check_builtin_function_exists("__builtin_ctzll" HAVE_BUILTIN_CTZLL)
+check_builtin_function_exists("__builtin_clz" HAVE_BUILTIN_CLZ)
+check_builtin_function_exists("__builtin_clzll" HAVE_BUILTIN_CLZLL)
+check_builtin_function_exists("__builtin_popcount" HAVE_BUILTIN_POPCOUNT)
+check_builtin_function_exists("__builtin_popcountll" HAVE_BUILTIN_POPCOUNTLL)
+check_builtin_function_exists("__builtin_bswap32" HAVE_BUILTIN_BSWAP32)
+check_builtin_function_exists("__builtin_bswap64" HAVE_BUILTIN_BSWAP64)
+
+if (NOT HAVE_BUILTIN_CTZ OR NOT HAVE_BUILTIN_CTZLL)
+    # Check if -D_GNU_SOURCE has been defined and add this flag to
+    # CMAKE_REQUIRED_DEFINITIONS in order to get check_prototype_definition work
+    get_property(var DIRECTORY PROPERTY COMPILE_DEFINITIONS)
+    list(FIND var "_GNU_SOURCE" var)
+    if (NOT var EQUAL -1)
+        set(CMAKE_REQUIRED_FLAGS "-Wno-error")
+        set(CMAKE_REQUIRED_DEFINITIONS "-D_GNU_SOURCE")
+        check_prototype_definition("ffsl" "int ffsl(long int i);" "0"
+             "string.h;strings.h" HAVE_FFSL)
+        check_prototype_definition("ffsll" "int ffsll(long long int i);" "0"
+             "string.h;strings.h" HAVE_FFSLL)
+    endif()
+endif()
+
+if ((HAVE_BUILTIN_CTZ OR HAVE_FFSL) AND
+    (HAVE_BUILTIN_CTZLL OR HAVE_FFSLL) AND
+    HAVE_BUILTIN_CLZ AND HAVE_BUILTIN_CLZLL AND
+    HAVE_BUILTIN_POPCOUNT AND HAVE_BUILTIN_POPCOUNTLL AND
+    HAVE_BUILTIN_BSWAP32 AND HAVE_BUILTIN_BSWAP64)
+    message(STATUS "Using compiler version of bit operations")
+else()
+    message(WARNING "Using slow implementation of bit operations")
+endif()
+
+set(lib_sources
+    bit.c
+)
+
+set_source_files_compile_flags(${lib_sources})
+add_library(bit STATIC ${lib_sources})
diff --git a/src/lib/bit/bit.c b/src/lib/bit/bit.c
new file mode 100644
index 0000000000000000000000000000000000000000..b6af67a1522c0db96a5dae266513aad7e59a0345
--- /dev/null
+++ b/src/lib/bit/bit.c
@@ -0,0 +1,144 @@
+/*
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above
+ *    copyright notice, this list of conditions and the
+ *    following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials
+ *    provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * <COPYRIGHT HOLDER> OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <lib/bit/bit.h>
+
+__attribute__((const)) extern inline int
+bit_ctz_u32(uint32_t x);
+
+__attribute__((const))  extern inline int
+bit_ctz_u64(uint64_t x);
+
+__attribute__((const)) extern inline int
+bit_clz_u32(uint32_t x);
+
+__attribute__((const)) extern inline int
+bit_clz_u64(uint64_t x);
+
+__attribute__((const)) extern inline int
+bit_count_u32(uint32_t x);
+
+__attribute__((const)) extern inline int
+bit_count_u64(uint64_t x);
+
+__attribute__ ((const)) extern inline uint32_t
+bit_rotl_u32(uint32_t x, int r);
+
+__attribute__ ((const)) extern inline uint64_t
+bit_rotl_u64(uint64_t x, int r);
+
+__attribute__ ((const)) extern inline uint32_t
+bit_rotr_u32(uint32_t x, int r);
+
+__attribute__ ((const)) extern inline uint64_t
+bit_rotr_u64(uint64_t x, int r);
+
+__attribute__ ((const)) extern inline uint32_t
+bswap_u32(uint32_t x);
+
+__attribute__ ((const)) extern inline uint64_t
+bswap_u64(uint64_t x);
+
+#define BITINDEX_NAIVE(x, bitsize) {					\
+	/* naive generic implementation, worst case */			\
+	typeof(x) bit = 1;						\
+	int i = 0;							\
+	for (int k = 0; k < bitsize; k++) {				\
+		if (x & bit) {						\
+			indexes[i++] = offset + k + 1;			\
+		}							\
+		bit <<= 1;						\
+	}								\
+									\
+	indexes[i] = 0;							\
+	return indexes + i;						\
+}
+
+int *
+bit_index_u32(uint32_t x, int *indexes, int offset)
+{
+#if  defined(HAVE_BUILTIN_CTZ)
+	int prev_pos = 0;
+	int i = 0;
+
+#if defined(HAVE_BUILTIN_POPCOUNT)
+	/* fast implementation using built-in popcount function */
+	const int count = bit_count_u32(x);
+	while (i < count) {
+#else
+	/* sligtly slower implementation without using built-in popcount */
+	while(x) {
+#endif
+		/* use ctz */
+		const int a = bit_ctz_u32(x);
+
+		prev_pos += a + 1;
+		x >>= a;
+		x >>= 1;
+		indexes[i++] = offset + prev_pos;
+	}
+
+	indexes[i] = 0;
+	return indexes + i;
+#else /* !defined(HAVE_BUILTIN_CTZ) */
+	BITINDEX_NAIVE(x, sizeof(uint32_t) * CHAR_BIT);
+#endif
+}
+
+int *
+bit_index_u64(uint64_t x, int *indexes, int offset) {
+#if  defined(HAVE_CTZLL)
+	int prev_pos = 0;
+	int i = 0;
+
+#if defined(HAVE_POPCOUNTLL)
+	/* fast implementation using built-in popcount function */
+	const int count = bit_count_u64(x);
+	while (i < count) {
+#else
+	/* sligtly slower implementation without using built-in popcount */
+	while(x) {
+#endif
+		/* use ctz */
+		const int a = bit_ctz_u64(x);
+
+		prev_pos += a + 1;
+		x >>= a;
+		x >>= 1;
+		indexes[i++] = offset + prev_pos;
+	}
+
+	indexes[i] = 0;
+	return indexes + i;
+#else /* !defined(HAVE_CTZ) */
+	BITINDEX_NAIVE(x, sizeof(uint64_t) * CHAR_BIT);
+#endif
+}
+
+#undef BITINDEX_NAIVE
diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt
index 08db175ca2e9dc6a77421c081cf15077f6cdfc8c..0c84afb8971efb330bc5426e7c0476707d79bba6 100644
--- a/test/unit/CMakeLists.txt
+++ b/test/unit/CMakeLists.txt
@@ -8,6 +8,8 @@ add_executable(rope_basic rope_basic.c ${CMAKE_SOURCE_DIR}/src/rope.c)
 add_executable(rope_avl rope_avl.c ${CMAKE_SOURCE_DIR}/src/rope.c)
 add_executable(rope_stress rope_stress.c ${CMAKE_SOURCE_DIR}/src/rope.c)
 add_executable(rope rope.c ${CMAKE_SOURCE_DIR}/src/rope.c)
+add_executable(bit_test bit.c bit.c)
+target_link_libraries(bit_test bit)
 add_executable(objc_finally objc_finally.m)
 add_executable(objc_catchcxx objc_catchcxx.m)
 add_dependencies(objc_finally build_bundled_libs)
diff --git a/test/unit/bit.c b/test/unit/bit.c
new file mode 100644
index 0000000000000000000000000000000000000000..21aad1de313677613bfed5ad0a9ffa16aedd267e
--- /dev/null
+++ b/test/unit/bit.c
@@ -0,0 +1,169 @@
+#include <lib/bit/bit.h>
+
+#include <stdio.h>
+#include <inttypes.h>
+#include <assert.h>
+
+#include "unit.h"
+
+static uint64_t vals[] = {
+	0UL, 1UL, 2UL, 32768UL, 65535UL, 65536UL, 726075912UL, 858993459UL,
+	1073741824UL, 1245250552UL, 1431655765UL, 1656977767UL, 2147483648UL,
+	2283114629UL, 2502548245UL, 4294967295UL, 708915120906848425UL,
+	1960191741125985428UL, 3689348814741910323UL, 5578377670650038654UL,
+	9223372036854775808UL, 10755112315580060033UL, 11163782031541429823UL,
+	13903686156871869732UL, 14237897302422917095UL, 14302190498657618739UL,
+	15766411510232741269UL, 15984546468465238145UL, 18446744073709551615UL
+};
+
+static void
+test_ctz_clz(void)
+{
+	header();
+
+	for (size_t i = 0; i < sizeof(vals) / sizeof(vals[0]); i++) {
+		if (vals[i] == 0)
+			continue;
+
+		uint64_t val64 = vals[i];
+		uint32_t val32 = (uint32_t) vals[i];
+
+		printf("bit_ctz_u64(%" PRIu64 ") => %d\n", val64,
+			bit_ctz_u64(val64));
+		printf("bit_clz_u64(%" PRIu64 ") => %d\n", val64,
+			bit_clz_u64(val64));
+
+		if (vals[i] > UINT32_MAX)
+			continue;
+
+		printf("bit_ctz_u32(%" PRIu32 ") => %d\n", val32,
+			bit_ctz_u32(val32));
+		printf("bit_clz_u32(%" PRIu32 ") => %d\n", val32,
+			bit_clz_u32(val32));
+	}
+
+	footer();
+}
+
+static void
+test_count(void)
+{
+	header();
+
+	for (size_t i = 0; i < sizeof(vals) / sizeof(vals[0]); i++) {
+		uint64_t val64 = vals[i];
+		uint32_t val32 = (uint32_t) vals[i];
+
+		printf("bit_count_u64(%" PRIu64 ") => %d\n", val64,
+			bit_count_u64(val64));
+
+		if (vals[i] > UINT32_MAX)
+			continue;
+
+		printf("bit_count_u32(%" PRIu32 ") => %d\n", val32,
+			bit_count_u32(val32));
+	}
+
+	footer();
+}
+
+static void
+test_rotl_rotr_one(int rot)
+{
+	for (size_t i = 0; i < sizeof(vals) / sizeof(vals[0]); i++) {
+		uint64_t val64 = vals[i];
+		uint32_t val32 = (uint32_t) vals[i];
+
+		printf("bit_rotl_u64(%" PRIu64 ", %d) => %" PRIu64 "\n",
+		       val64, rot, bit_rotl_u64(val64, rot));
+		printf("bit_rotr_u64(%" PRIu64 ", %d) => %" PRIu64 "\n",
+		       val64, rot, bit_rotr_u64(val64, rot));
+
+		if (vals[i] > UINT32_MAX || rot > 32)
+			continue;
+
+		printf("bit_rotl_u32(%" PRIu32 ", %d) => %" PRIu32 "\n",
+		       val32, rot, bit_rotl_u32(val32, rot));
+		printf("bit_rotr_u32(%" PRIu32 ", %d) => %" PRIu32 "\n",
+		       val32, rot, bit_rotr_u32(val32, rot));
+	}
+}
+
+static void
+test_rotl_rotr(void)
+{
+	header();
+
+	int rots[] = { 0, 1, 15, 16, 31, 32, 63, 64 };
+	for (int r = 0; r < sizeof(rots) / sizeof(rots[0]); r++) {
+		test_rotl_rotr_one(rots[r]);
+	}
+
+	footer();
+}
+
+static void
+test_bswap(void)
+{
+	header();
+
+	for (size_t i = 0; i < sizeof(vals) / sizeof(vals[0]); i++) {
+		uint64_t val64 = vals[i];
+		uint32_t val32 = (uint32_t) vals[i];
+
+		printf("bswap_u64(%" PRIu64 ") => %" PRIu64 "\n", val64,
+			bswap_u64(val64));
+
+		if (vals[i] > UINT32_MAX)
+			continue;
+
+		printf("bswap_u32(%" PRIu32 ") => %" PRIu32 "\n", val32,
+			bswap_u32(val32));
+	}
+
+	footer();
+}
+
+static inline void
+test_index_print(const int *start, const int *end)
+{
+	for (const int *cur = start; cur < end; cur++) {
+		printf("%d ", *cur);
+	}
+}
+
+static void
+test_index(void)
+{
+	header();
+
+	int indexes[sizeof(int64_t) * CHAR_BIT];
+
+	for (size_t i = 0; i < sizeof(vals) / sizeof(vals[0]); i++) {
+		uint64_t val64 = vals[i];
+		uint32_t val32 = (uint32_t) vals[i];
+
+		printf("bit_index_u64(%" PRIu64 ", *, -1) => ", val64);
+		test_index_print(indexes, bit_index_u64(val64, indexes, -1));
+		printf("\n");
+
+		if (vals[i] > UINT32_MAX)
+			continue;
+
+		printf("bit_index_u32(%" PRIu32 ", *, -1) => ", val32);
+		test_index_print(indexes, bit_index_u32(val32, indexes, -1));
+		printf("\n");
+	}
+
+	footer();
+}
+
+int
+main(void)
+{
+	test_ctz_clz();
+	test_count();
+	test_rotl_rotr();
+	test_bswap();
+	test_index();
+}
diff --git a/test/unit/bit.result b/test/unit/bit.result
new file mode 100644
index 0000000000000000000000000000000000000000..dbb0193faa774c2eb6923ffb2742b5f5e52f994a
--- /dev/null
+++ b/test/unit/bit.result
@@ -0,0 +1,888 @@
+	*** test_ctz_clz ***
+bit_ctz_u64(1) => 0
+bit_clz_u64(1) => 63
+bit_ctz_u32(1) => 0
+bit_clz_u32(1) => 31
+bit_ctz_u64(2) => 1
+bit_clz_u64(2) => 62
+bit_ctz_u32(2) => 1
+bit_clz_u32(2) => 30
+bit_ctz_u64(32768) => 15
+bit_clz_u64(32768) => 48
+bit_ctz_u32(32768) => 15
+bit_clz_u32(32768) => 16
+bit_ctz_u64(65535) => 0
+bit_clz_u64(65535) => 48
+bit_ctz_u32(65535) => 0
+bit_clz_u32(65535) => 16
+bit_ctz_u64(65536) => 16
+bit_clz_u64(65536) => 47
+bit_ctz_u32(65536) => 16
+bit_clz_u32(65536) => 15
+bit_ctz_u64(726075912) => 3
+bit_clz_u64(726075912) => 34
+bit_ctz_u32(726075912) => 3
+bit_clz_u32(726075912) => 2
+bit_ctz_u64(858993459) => 0
+bit_clz_u64(858993459) => 34
+bit_ctz_u32(858993459) => 0
+bit_clz_u32(858993459) => 2
+bit_ctz_u64(1073741824) => 30
+bit_clz_u64(1073741824) => 33
+bit_ctz_u32(1073741824) => 30
+bit_clz_u32(1073741824) => 1
+bit_ctz_u64(1245250552) => 3
+bit_clz_u64(1245250552) => 33
+bit_ctz_u32(1245250552) => 3
+bit_clz_u32(1245250552) => 1
+bit_ctz_u64(1431655765) => 0
+bit_clz_u64(1431655765) => 33
+bit_ctz_u32(1431655765) => 0
+bit_clz_u32(1431655765) => 1
+bit_ctz_u64(1656977767) => 0
+bit_clz_u64(1656977767) => 33
+bit_ctz_u32(1656977767) => 0
+bit_clz_u32(1656977767) => 1
+bit_ctz_u64(2147483648) => 31
+bit_clz_u64(2147483648) => 32
+bit_ctz_u32(2147483648) => 31
+bit_clz_u32(2147483648) => 0
+bit_ctz_u64(2283114629) => 0
+bit_clz_u64(2283114629) => 32
+bit_ctz_u32(2283114629) => 0
+bit_clz_u32(2283114629) => 0
+bit_ctz_u64(2502548245) => 0
+bit_clz_u64(2502548245) => 32
+bit_ctz_u32(2502548245) => 0
+bit_clz_u32(2502548245) => 0
+bit_ctz_u64(4294967295) => 0
+bit_clz_u64(4294967295) => 32
+bit_ctz_u32(4294967295) => 0
+bit_clz_u32(4294967295) => 0
+bit_ctz_u64(708915120906848425) => 0
+bit_clz_u64(708915120906848425) => 4
+bit_ctz_u64(1960191741125985428) => 2
+bit_clz_u64(1960191741125985428) => 3
+bit_ctz_u64(3689348814741910323) => 0
+bit_clz_u64(3689348814741910323) => 2
+bit_ctz_u64(5578377670650038654) => 1
+bit_clz_u64(5578377670650038654) => 1
+bit_ctz_u64(9223372036854775808) => 63
+bit_clz_u64(9223372036854775808) => 0
+bit_ctz_u64(10755112315580060033) => 0
+bit_clz_u64(10755112315580060033) => 0
+bit_ctz_u64(11163782031541429823) => 0
+bit_clz_u64(11163782031541429823) => 0
+bit_ctz_u64(13903686156871869732) => 2
+bit_clz_u64(13903686156871869732) => 0
+bit_ctz_u64(14237897302422917095) => 0
+bit_clz_u64(14237897302422917095) => 0
+bit_ctz_u64(14302190498657618739) => 0
+bit_clz_u64(14302190498657618739) => 0
+bit_ctz_u64(15766411510232741269) => 0
+bit_clz_u64(15766411510232741269) => 0
+bit_ctz_u64(15984546468465238145) => 0
+bit_clz_u64(15984546468465238145) => 0
+bit_ctz_u64(18446744073709551615) => 0
+bit_clz_u64(18446744073709551615) => 0
+	*** test_ctz_clz: done ***
+ 	*** test_count ***
+bit_count_u64(0) => 0
+bit_count_u32(0) => 0
+bit_count_u64(1) => 1
+bit_count_u32(1) => 1
+bit_count_u64(2) => 1
+bit_count_u32(2) => 1
+bit_count_u64(32768) => 1
+bit_count_u32(32768) => 1
+bit_count_u64(65535) => 16
+bit_count_u32(65535) => 16
+bit_count_u64(65536) => 1
+bit_count_u32(65536) => 1
+bit_count_u64(726075912) => 11
+bit_count_u32(726075912) => 11
+bit_count_u64(858993459) => 16
+bit_count_u32(858993459) => 16
+bit_count_u64(1073741824) => 1
+bit_count_u32(1073741824) => 1
+bit_count_u64(1245250552) => 14
+bit_count_u32(1245250552) => 14
+bit_count_u64(1431655765) => 16
+bit_count_u32(1431655765) => 16
+bit_count_u64(1656977767) => 17
+bit_count_u32(1656977767) => 17
+bit_count_u64(2147483648) => 1
+bit_count_u32(2147483648) => 1
+bit_count_u64(2283114629) => 10
+bit_count_u32(2283114629) => 10
+bit_count_u64(2502548245) => 16
+bit_count_u32(2502548245) => 16
+bit_count_u64(4294967295) => 32
+bit_count_u32(4294967295) => 32
+bit_count_u64(708915120906848425) => 29
+bit_count_u64(1960191741125985428) => 19
+bit_count_u64(3689348814741910323) => 32
+bit_count_u64(5578377670650038654) => 31
+bit_count_u64(9223372036854775808) => 1
+bit_count_u64(10755112315580060033) => 24
+bit_count_u64(11163782031541429823) => 35
+bit_count_u64(13903686156871869732) => 28
+bit_count_u64(14237897302422917095) => 33
+bit_count_u64(14302190498657618739) => 37
+bit_count_u64(15766411510232741269) => 33
+bit_count_u64(15984546468465238145) => 25
+bit_count_u64(18446744073709551615) => 64
+	*** test_count: done ***
+ 	*** test_rotl_rotr ***
+bit_rotl_u64(0, 0) => 0
+bit_rotr_u64(0, 0) => 0
+bit_rotl_u32(0, 0) => 0
+bit_rotr_u32(0, 0) => 0
+bit_rotl_u64(1, 0) => 1
+bit_rotr_u64(1, 0) => 1
+bit_rotl_u32(1, 0) => 1
+bit_rotr_u32(1, 0) => 1
+bit_rotl_u64(2, 0) => 2
+bit_rotr_u64(2, 0) => 2
+bit_rotl_u32(2, 0) => 2
+bit_rotr_u32(2, 0) => 2
+bit_rotl_u64(32768, 0) => 32768
+bit_rotr_u64(32768, 0) => 32768
+bit_rotl_u32(32768, 0) => 32768
+bit_rotr_u32(32768, 0) => 32768
+bit_rotl_u64(65535, 0) => 65535
+bit_rotr_u64(65535, 0) => 65535
+bit_rotl_u32(65535, 0) => 65535
+bit_rotr_u32(65535, 0) => 65535
+bit_rotl_u64(65536, 0) => 65536
+bit_rotr_u64(65536, 0) => 65536
+bit_rotl_u32(65536, 0) => 65536
+bit_rotr_u32(65536, 0) => 65536
+bit_rotl_u64(726075912, 0) => 726075912
+bit_rotr_u64(726075912, 0) => 726075912
+bit_rotl_u32(726075912, 0) => 726075912
+bit_rotr_u32(726075912, 0) => 726075912
+bit_rotl_u64(858993459, 0) => 858993459
+bit_rotr_u64(858993459, 0) => 858993459
+bit_rotl_u32(858993459, 0) => 858993459
+bit_rotr_u32(858993459, 0) => 858993459
+bit_rotl_u64(1073741824, 0) => 1073741824
+bit_rotr_u64(1073741824, 0) => 1073741824
+bit_rotl_u32(1073741824, 0) => 1073741824
+bit_rotr_u32(1073741824, 0) => 1073741824
+bit_rotl_u64(1245250552, 0) => 1245250552
+bit_rotr_u64(1245250552, 0) => 1245250552
+bit_rotl_u32(1245250552, 0) => 1245250552
+bit_rotr_u32(1245250552, 0) => 1245250552
+bit_rotl_u64(1431655765, 0) => 1431655765
+bit_rotr_u64(1431655765, 0) => 1431655765
+bit_rotl_u32(1431655765, 0) => 1431655765
+bit_rotr_u32(1431655765, 0) => 1431655765
+bit_rotl_u64(1656977767, 0) => 1656977767
+bit_rotr_u64(1656977767, 0) => 1656977767
+bit_rotl_u32(1656977767, 0) => 1656977767
+bit_rotr_u32(1656977767, 0) => 1656977767
+bit_rotl_u64(2147483648, 0) => 2147483648
+bit_rotr_u64(2147483648, 0) => 2147483648
+bit_rotl_u32(2147483648, 0) => 2147483648
+bit_rotr_u32(2147483648, 0) => 2147483648
+bit_rotl_u64(2283114629, 0) => 2283114629
+bit_rotr_u64(2283114629, 0) => 2283114629
+bit_rotl_u32(2283114629, 0) => 2283114629
+bit_rotr_u32(2283114629, 0) => 2283114629
+bit_rotl_u64(2502548245, 0) => 2502548245
+bit_rotr_u64(2502548245, 0) => 2502548245
+bit_rotl_u32(2502548245, 0) => 2502548245
+bit_rotr_u32(2502548245, 0) => 2502548245
+bit_rotl_u64(4294967295, 0) => 4294967295
+bit_rotr_u64(4294967295, 0) => 4294967295
+bit_rotl_u32(4294967295, 0) => 4294967295
+bit_rotr_u32(4294967295, 0) => 4294967295
+bit_rotl_u64(708915120906848425, 0) => 708915120906848425
+bit_rotr_u64(708915120906848425, 0) => 708915120906848425
+bit_rotl_u64(1960191741125985428, 0) => 1960191741125985428
+bit_rotr_u64(1960191741125985428, 0) => 1960191741125985428
+bit_rotl_u64(3689348814741910323, 0) => 3689348814741910323
+bit_rotr_u64(3689348814741910323, 0) => 3689348814741910323
+bit_rotl_u64(5578377670650038654, 0) => 5578377670650038654
+bit_rotr_u64(5578377670650038654, 0) => 5578377670650038654
+bit_rotl_u64(9223372036854775808, 0) => 9223372036854775808
+bit_rotr_u64(9223372036854775808, 0) => 9223372036854775808
+bit_rotl_u64(10755112315580060033, 0) => 10755112315580060033
+bit_rotr_u64(10755112315580060033, 0) => 10755112315580060033
+bit_rotl_u64(11163782031541429823, 0) => 11163782031541429823
+bit_rotr_u64(11163782031541429823, 0) => 11163782031541429823
+bit_rotl_u64(13903686156871869732, 0) => 13903686156871869732
+bit_rotr_u64(13903686156871869732, 0) => 13903686156871869732
+bit_rotl_u64(14237897302422917095, 0) => 14237897302422917095
+bit_rotr_u64(14237897302422917095, 0) => 14237897302422917095
+bit_rotl_u64(14302190498657618739, 0) => 14302190498657618739
+bit_rotr_u64(14302190498657618739, 0) => 14302190498657618739
+bit_rotl_u64(15766411510232741269, 0) => 15766411510232741269
+bit_rotr_u64(15766411510232741269, 0) => 15766411510232741269
+bit_rotl_u64(15984546468465238145, 0) => 15984546468465238145
+bit_rotr_u64(15984546468465238145, 0) => 15984546468465238145
+bit_rotl_u64(18446744073709551615, 0) => 18446744073709551615
+bit_rotr_u64(18446744073709551615, 0) => 18446744073709551615
+bit_rotl_u64(0, 1) => 0
+bit_rotr_u64(0, 1) => 0
+bit_rotl_u32(0, 1) => 0
+bit_rotr_u32(0, 1) => 0
+bit_rotl_u64(1, 1) => 2
+bit_rotr_u64(1, 1) => 9223372036854775808
+bit_rotl_u32(1, 1) => 2
+bit_rotr_u32(1, 1) => 2147483648
+bit_rotl_u64(2, 1) => 4
+bit_rotr_u64(2, 1) => 1
+bit_rotl_u32(2, 1) => 4
+bit_rotr_u32(2, 1) => 1
+bit_rotl_u64(32768, 1) => 65536
+bit_rotr_u64(32768, 1) => 16384
+bit_rotl_u32(32768, 1) => 65536
+bit_rotr_u32(32768, 1) => 16384
+bit_rotl_u64(65535, 1) => 131070
+bit_rotr_u64(65535, 1) => 9223372036854808575
+bit_rotl_u32(65535, 1) => 131070
+bit_rotr_u32(65535, 1) => 2147516415
+bit_rotl_u64(65536, 1) => 131072
+bit_rotr_u64(65536, 1) => 32768
+bit_rotl_u32(65536, 1) => 131072
+bit_rotr_u32(65536, 1) => 32768
+bit_rotl_u64(726075912, 1) => 1452151824
+bit_rotr_u64(726075912, 1) => 363037956
+bit_rotl_u32(726075912, 1) => 1452151824
+bit_rotr_u32(726075912, 1) => 363037956
+bit_rotl_u64(858993459, 1) => 1717986918
+bit_rotr_u64(858993459, 1) => 9223372037284272537
+bit_rotl_u32(858993459, 1) => 1717986918
+bit_rotr_u32(858993459, 1) => 2576980377
+bit_rotl_u64(1073741824, 1) => 2147483648
+bit_rotr_u64(1073741824, 1) => 536870912
+bit_rotl_u32(1073741824, 1) => 2147483648
+bit_rotr_u32(1073741824, 1) => 536870912
+bit_rotl_u64(1245250552, 1) => 2490501104
+bit_rotr_u64(1245250552, 1) => 622625276
+bit_rotl_u32(1245250552, 1) => 2490501104
+bit_rotr_u32(1245250552, 1) => 622625276
+bit_rotl_u64(1431655765, 1) => 2863311530
+bit_rotr_u64(1431655765, 1) => 9223372037570603690
+bit_rotl_u32(1431655765, 1) => 2863311530
+bit_rotr_u32(1431655765, 1) => 2863311530
+bit_rotl_u64(1656977767, 1) => 3313955534
+bit_rotr_u64(1656977767, 1) => 9223372037683264691
+bit_rotl_u32(1656977767, 1) => 3313955534
+bit_rotr_u32(1656977767, 1) => 2975972531
+bit_rotl_u64(2147483648, 1) => 4294967296
+bit_rotr_u64(2147483648, 1) => 1073741824
+bit_rotl_u32(2147483648, 1) => 1
+bit_rotr_u32(2147483648, 1) => 1073741824
+bit_rotl_u64(2283114629, 1) => 4566229258
+bit_rotr_u64(2283114629, 1) => 9223372037996333122
+bit_rotl_u32(2283114629, 1) => 271261963
+bit_rotr_u32(2283114629, 1) => 3289040962
+bit_rotl_u64(2502548245, 1) => 5005096490
+bit_rotr_u64(2502548245, 1) => 9223372038106049930
+bit_rotl_u32(2502548245, 1) => 710129195
+bit_rotr_u32(2502548245, 1) => 3398757770
+bit_rotl_u64(4294967295, 1) => 8589934590
+bit_rotr_u64(4294967295, 1) => 9223372039002259455
+bit_rotl_u32(4294967295, 1) => 4294967295
+bit_rotr_u32(4294967295, 1) => 4294967295
+bit_rotl_u64(708915120906848425, 1) => 1417830241813696850
+bit_rotr_u64(708915120906848425, 1) => 9577829597308200020
+bit_rotl_u64(1960191741125985428, 1) => 3920383482251970856
+bit_rotr_u64(1960191741125985428, 1) => 980095870562992714
+bit_rotl_u64(3689348814741910323, 1) => 7378697629483820646
+bit_rotr_u64(3689348814741910323, 1) => 11068046444225730969
+bit_rotl_u64(5578377670650038654, 1) => 11156755341300077308
+bit_rotr_u64(5578377670650038654, 1) => 2789188835325019327
+bit_rotl_u64(9223372036854775808, 1) => 1
+bit_rotr_u64(9223372036854775808, 1) => 4611686018427387904
+bit_rotl_u64(10755112315580060033, 1) => 3063480557450568451
+bit_rotr_u64(10755112315580060033, 1) => 14600928194644805824
+bit_rotl_u64(11163782031541429823, 1) => 3880819989373308031
+bit_rotr_u64(11163782031541429823, 1) => 14805263052625490719
+bit_rotl_u64(13903686156871869732, 1) => 9360628240034187849
+bit_rotr_u64(13903686156871869732, 1) => 6951843078435934866
+bit_rotl_u64(14237897302422917095, 1) => 10029050531136282575
+bit_rotr_u64(14237897302422917095, 1) => 16342320688066234355
+bit_rotl_u64(14302190498657618739, 1) => 10157636923605685863
+bit_rotr_u64(14302190498657618739, 1) => 16374467286183585177
+bit_rotl_u64(15766411510232741269, 1) => 13086078946755930923
+bit_rotr_u64(15766411510232741269, 1) => 17106577791971146442
+bit_rotl_u64(15984546468465238145, 1) => 13522348863220924675
+bit_rotr_u64(15984546468465238145, 1) => 17215645271087394880
+bit_rotl_u64(18446744073709551615, 1) => 18446744073709551615
+bit_rotr_u64(18446744073709551615, 1) => 18446744073709551615
+bit_rotl_u64(0, 15) => 0
+bit_rotr_u64(0, 15) => 0
+bit_rotl_u32(0, 15) => 0
+bit_rotr_u32(0, 15) => 0
+bit_rotl_u64(1, 15) => 32768
+bit_rotr_u64(1, 15) => 562949953421312
+bit_rotl_u32(1, 15) => 32768
+bit_rotr_u32(1, 15) => 131072
+bit_rotl_u64(2, 15) => 65536
+bit_rotr_u64(2, 15) => 1125899906842624
+bit_rotl_u32(2, 15) => 65536
+bit_rotr_u32(2, 15) => 262144
+bit_rotl_u64(32768, 15) => 1073741824
+bit_rotr_u64(32768, 15) => 1
+bit_rotl_u32(32768, 15) => 1073741824
+bit_rotr_u32(32768, 15) => 1
+bit_rotl_u64(65535, 15) => 2147450880
+bit_rotr_u64(65535, 15) => 18446181123756130305
+bit_rotl_u32(65535, 15) => 2147450880
+bit_rotr_u32(65535, 15) => 4294836225
+bit_rotl_u64(65536, 15) => 2147483648
+bit_rotr_u64(65536, 15) => 2
+bit_rotl_u32(65536, 15) => 2147483648
+bit_rotr_u32(65536, 15) => 2
+bit_rotl_u64(726075912, 15) => 23792055484416
+bit_rotr_u64(726075912, 15) => 1445655480385951374
+bit_rotl_u32(726075912, 15) => 2231637411
+bit_rotr_u32(726075912, 15) => 336615054
+bit_rotl_u64(858993459, 15) => 28147497664512
+bit_rotr_u64(858993459, 15) => 7378585039493162598
+bit_rotl_u32(858993459, 15) => 2576980377
+bit_rotr_u32(858993459, 15) => 1717986918
+bit_rotl_u64(1073741824, 15) => 35184372088832
+bit_rotr_u64(1073741824, 15) => 32768
+bit_rotl_u32(1073741824, 15) => 8192
+bit_rotr_u32(1073741824, 15) => 32768
+bit_rotl_u64(1245250552, 15) => 40804370087936
+bit_rotr_u64(1245250552, 15) => 571957152676090994
+bit_rotl_u32(1245250552, 15) => 2180785436
+bit_rotr_u32(1245250552, 15) => 133207154
+bit_rotl_u64(1431655765, 15) => 46912496107520
+bit_rotr_u64(1431655765, 15) => 12297641732488604330
+bit_rotl_u32(1431655765, 15) => 2863311530
+bit_rotr_u32(1431655765, 15) => 2863311530
+bit_rotl_u64(1656977767, 15) => 54295847469056
+bit_rotr_u64(1656977767, 15) => 17495921602381006214
+bit_rotl_u32(1656977767, 15) => 3165892961
+bit_rotr_u32(1656977767, 15) => 4073637254
+bit_rotl_u64(2147483648, 15) => 70368744177664
+bit_rotr_u64(2147483648, 15) => 65536
+bit_rotl_u32(2147483648, 15) => 16384
+bit_rotr_u32(2147483648, 15) => 65536
+bit_rotl_u64(2283114629, 15) => 74813100163072
+bit_rotr_u64(2283114629, 15) => 2380715353018798123
+bit_rotl_u32(2283114629, 15) => 3359818762
+bit_rotr_u32(2283114629, 15) => 554373163
+bit_rotl_u64(2502548245, 15) => 82003500892160
+bit_rotr_u64(2502548245, 15) => 13126304063924808275
+bit_rotl_u32(2502548245, 15) => 3985296020
+bit_rotr_u32(2502548245, 15) => 3056282195
+bit_rotl_u64(4294967295, 15) => 140737488322560
+bit_rotr_u64(4294967295, 15) => 18446181123756261375
+bit_rotl_u32(4294967295, 15) => 4294967295
+bit_rotr_u32(4294967295, 15) => 4294967295
+bit_rotl_u64(708915120906848425, 15) => 5279893075283707115
+bit_rotr_u64(708915120906848425, 15) => 10471453717962410780
+bit_rotl_u64(1960191741125985428, 15) => 108559631781274
+bit_rotr_u64(1960191741125985428, 15) => 659837165714377456
+bit_rotl_u64(3689348814741910323, 15) => 11068046444225730969
+bit_rotr_u64(3689348814741910323, 15) => 7378697629483820646
+bit_rotl_u64(5578377670650038654, 15) => 3492485472519661237
+bit_rotr_u64(5578377670650038654, 15) => 1368138625390162978
+bit_rotl_u64(9223372036854775808, 15) => 16384
+bit_rotr_u64(9223372036854775808, 15) => 281474976710656
+bit_rotl_u64(10755112315580060033, 15) => 16921572780133108384
+bit_rotr_u64(10755112315580060033, 15) => 2522906961261232936
+bit_rotl_u64(11163782031541429823, 15) => 15874627889163914614
+bit_rotr_u64(11163782031541429823, 15) => 14735555722393159636
+bit_rotl_u64(13903686156871869732, 15) => 16749599972631142521
+bit_rotr_u64(13903686156871869732, 15) => 5352952463958352314
+bit_rotl_u64(14237897302422917095, 15) => 10814437605877473995
+bit_rotr_u64(14237897302422917095, 15) => 2292203766521423570
+bit_rotl_u64(14302190498657618739, 15) => 14645067421692060477
+bit_rotr_u64(14302190498657618739, 15) => 10837786021529578728
+bit_rotl_u64(15766411510232741269, 15) => 14257838996763372902
+bit_rotr_u64(15766411510232741269, 15) => 16945837700629926938
+bit_rotl_u64(15984546468465238145, 15) => 4767449759914979050
+bit_rotr_u64(15984546468465238145, 15) => 13908166408919157040
+bit_rotl_u64(18446744073709551615, 15) => 18446744073709551615
+bit_rotr_u64(18446744073709551615, 15) => 18446744073709551615
+bit_rotl_u64(0, 16) => 0
+bit_rotr_u64(0, 16) => 0
+bit_rotl_u32(0, 16) => 0
+bit_rotr_u32(0, 16) => 0
+bit_rotl_u64(1, 16) => 65536
+bit_rotr_u64(1, 16) => 281474976710656
+bit_rotl_u32(1, 16) => 65536
+bit_rotr_u32(1, 16) => 65536
+bit_rotl_u64(2, 16) => 131072
+bit_rotr_u64(2, 16) => 562949953421312
+bit_rotl_u32(2, 16) => 131072
+bit_rotr_u32(2, 16) => 131072
+bit_rotl_u64(32768, 16) => 2147483648
+bit_rotr_u64(32768, 16) => 9223372036854775808
+bit_rotl_u32(32768, 16) => 2147483648
+bit_rotr_u32(32768, 16) => 2147483648
+bit_rotl_u64(65535, 16) => 4294901760
+bit_rotr_u64(65535, 16) => 18446462598732840960
+bit_rotl_u32(65535, 16) => 4294901760
+bit_rotr_u32(65535, 16) => 4294901760
+bit_rotl_u64(65536, 16) => 4294967296
+bit_rotr_u64(65536, 16) => 1
+bit_rotl_u32(65536, 16) => 1
+bit_rotr_u32(65536, 16) => 1
+bit_rotl_u64(726075912, 16) => 47584110968832
+bit_rotr_u64(726075912, 16) => 722827740192975687
+bit_rotl_u32(726075912, 16) => 168307527
+bit_rotr_u32(726075912, 16) => 168307527
+bit_rotl_u64(858993459, 16) => 56294995329024
+bit_rotr_u64(858993459, 16) => 3689292519746581299
+bit_rotl_u32(858993459, 16) => 858993459
+bit_rotr_u32(858993459, 16) => 858993459
+bit_rotl_u64(1073741824, 16) => 70368744177664
+bit_rotr_u64(1073741824, 16) => 16384
+bit_rotl_u32(1073741824, 16) => 16384
+bit_rotr_u32(1073741824, 16) => 16384
+bit_rotl_u64(1245250552, 16) => 81608740175872
+bit_rotr_u64(1245250552, 16) => 285978576338045497
+bit_rotl_u32(1245250552, 16) => 66603577
+bit_rotr_u32(1245250552, 16) => 66603577
+bit_rotl_u64(1431655765, 16) => 93824992215040
+bit_rotr_u64(1431655765, 16) => 6148820866244302165
+bit_rotl_u32(1431655765, 16) => 1431655765
+bit_rotr_u32(1431655765, 16) => 1431655765
+bit_rotl_u64(1656977767, 16) => 108591694938112
+bit_rotr_u64(1656977767, 16) => 8747960801190503107
+bit_rotl_u32(1656977767, 16) => 2036818627
+bit_rotr_u32(1656977767, 16) => 2036818627
+bit_rotl_u64(2147483648, 16) => 140737488355328
+bit_rotr_u64(2147483648, 16) => 32768
+bit_rotl_u32(2147483648, 16) => 32768
+bit_rotr_u32(2147483648, 16) => 32768
+bit_rotl_u64(2283114629, 16) => 149626200326144
+bit_rotr_u64(2283114629, 16) => 10413729713364174869
+bit_rotl_u32(2283114629, 16) => 2424670229
+bit_rotr_u32(2283114629, 16) => 2424670229
+bit_rotl_u64(2502548245, 16) => 164007001784320
+bit_rotr_u64(2502548245, 16) => 15786524068817179945
+bit_rotl_u32(2502548245, 16) => 3675624745
+bit_rotr_u32(2502548245, 16) => 3675624745
+bit_rotl_u64(4294967295, 16) => 281474976645120
+bit_rotr_u64(4294967295, 16) => 18446462598732906495
+bit_rotl_u32(4294967295, 16) => 4294967295
+bit_rotr_u32(4294967295, 16) => 4294967295
+bit_rotl_u64(708915120906848425, 16) => 10559786150567414230
+bit_rotr_u64(708915120906848425, 16) => 5235726858981205390
+bit_rotl_u64(1960191741125985428, 16) => 217119263562548
+bit_rotr_u64(1960191741125985428, 16) => 329918582857188728
+bit_rotl_u64(3689348814741910323, 16) => 3689348814741910323
+bit_rotr_u64(3689348814741910323, 16) => 3689348814741910323
+bit_rotl_u64(5578377670650038654, 16) => 6984970945039322474
+bit_rotr_u64(5578377670650038654, 16) => 684069312695081489
+bit_rotl_u64(9223372036854775808, 16) => 32768
+bit_rotr_u64(9223372036854775808, 16) => 140737488355328
+bit_rotl_u64(10755112315580060033, 16) => 15396401486556665153
+bit_rotr_u64(10755112315580060033, 16) => 1261453480630616468
+bit_rotl_u64(11163782031541429823, 16) => 13302511704618277613
+bit_rotr_u64(11163782031541429823, 16) => 7367777861196579818
+bit_rotl_u64(13903686156871869732, 16) => 15052455871552733427
+bit_rotr_u64(13903686156871869732, 16) => 2676476231979176157
+bit_rotl_u64(14237897302422917095, 16) => 3182131138045396375
+bit_rotr_u64(14237897302422917095, 16) => 1146101883260711785
+bit_rotl_u64(14302190498657618739, 16) => 10843390769674569339
+bit_rotr_u64(14302190498657618739, 16) => 5418893010764789364
+bit_rotl_u64(15766411510232741269, 16) => 10068933919817194189
+bit_rotr_u64(15766411510232741269, 16) => 8472918850314963469
+bit_rotl_u64(15984546468465238145, 16) => 9534899519829958100
+bit_rotr_u64(15984546468465238145, 16) => 6954083204459578520
+bit_rotl_u64(18446744073709551615, 16) => 18446744073709551615
+bit_rotr_u64(18446744073709551615, 16) => 18446744073709551615
+bit_rotl_u64(0, 31) => 0
+bit_rotr_u64(0, 31) => 0
+bit_rotl_u32(0, 31) => 0
+bit_rotr_u32(0, 31) => 0
+bit_rotl_u64(1, 31) => 2147483648
+bit_rotr_u64(1, 31) => 8589934592
+bit_rotl_u32(1, 31) => 2147483648
+bit_rotr_u32(1, 31) => 2
+bit_rotl_u64(2, 31) => 4294967296
+bit_rotr_u64(2, 31) => 17179869184
+bit_rotl_u32(2, 31) => 1
+bit_rotr_u32(2, 31) => 4
+bit_rotl_u64(32768, 31) => 70368744177664
+bit_rotr_u64(32768, 31) => 281474976710656
+bit_rotl_u32(32768, 31) => 16384
+bit_rotr_u32(32768, 31) => 65536
+bit_rotl_u64(65535, 31) => 140735340871680
+bit_rotr_u64(65535, 31) => 562941363486720
+bit_rotl_u32(65535, 31) => 2147516415
+bit_rotr_u32(65535, 31) => 131070
+bit_rotl_u64(65536, 31) => 140737488355328
+bit_rotr_u64(65536, 31) => 562949953421312
+bit_rotl_u32(65536, 31) => 32768
+bit_rotr_u32(65536, 31) => 131072
+bit_rotl_u64(726075912, 31) => 1559236148226686976
+bit_rotr_u64(726075912, 31) => 6236944592906747904
+bit_rotl_u32(726075912, 31) => 363037956
+bit_rotr_u32(726075912, 31) => 1452151824
+bit_rotl_u64(858993459, 31) => 1844674406941458432
+bit_rotr_u64(858993459, 31) => 7378697627765833728
+bit_rotl_u32(858993459, 31) => 2576980377
+bit_rotr_u32(858993459, 31) => 1717986918
+bit_rotl_u64(1073741824, 31) => 2305843009213693952
+bit_rotr_u64(1073741824, 31) => 9223372036854775808
+bit_rotl_u32(1073741824, 31) => 536870912
+bit_rotr_u32(1073741824, 31) => 2147483648
+bit_rotl_u64(1245250552, 31) => 2674155198082973696
+bit_rotr_u64(1245250552, 31) => 10696620792331894784
+bit_rotl_u32(1245250552, 31) => 622625276
+bit_rotr_u32(1245250552, 31) => 2490501104
+bit_rotl_u64(1431655765, 31) => 3074457344902430720
+bit_rotr_u64(1431655765, 31) => 12297829379609722880
+bit_rotl_u32(1431655765, 31) => 2863311530
+bit_rotr_u32(1431655765, 31) => 2863311530
+bit_rotl_u64(1656977767, 31) => 3558332659732054016
+bit_rotr_u64(1656977767, 31) => 14233330638928216064
+bit_rotl_u32(1656977767, 31) => 2975972531
+bit_rotr_u32(1656977767, 31) => 3313955534
+bit_rotl_u64(2147483648, 31) => 4611686018427387904
+bit_rotr_u64(2147483648, 31) => 1
+bit_rotl_u32(2147483648, 31) => 1073741824
+bit_rotr_u32(2147483648, 31) => 1
+bit_rotl_u64(2283114629, 31) => 4902951332287086592
+bit_rotr_u64(2283114629, 31) => 1165061255438794753
+bit_rotl_u32(2283114629, 31) => 3289040962
+bit_rotr_u32(2283114629, 31) => 271261963
+bit_rotl_u64(2502548245, 31) => 5374181434468597760
+bit_rotr_u64(2502548245, 31) => 3049981664164839425
+bit_rotl_u32(2502548245, 31) => 3398757770
+bit_rotr_u32(2502548245, 31) => 710129195
+bit_rotl_u64(4294967295, 31) => 9223372034707292160
+bit_rotr_u64(4294967295, 31) => 18446744065119617025
+bit_rotl_u32(4294967295, 31) => 4294967295
+bit_rotr_u32(4294967295, 31) => 4294967295
+bit_rotl_u64(708915120906848425, 31) => 17493991222969846085
+bit_rotr_u64(708915120906848425, 31) => 14635732670750729495
+bit_rotl_u64(1960191741125985428, 31) => 7114564028417572864
+bit_rotr_u64(1960191741125985428, 31) => 10011512039960739841
+bit_rotl_u64(3689348814741910323, 31) => 11068046444225730969
+bit_rotr_u64(3689348814741910323, 31) => 7378697629483820646
+bit_rotl_u64(5578377670650038654, 31) => 14774204534111940727
+bit_rotr_u64(5578377670650038654, 31) => 3756585915319108063
+bit_rotl_u64(9223372036854775808, 31) => 1073741824
+bit_rotr_u64(9223372036854775808, 31) => 4294967296
+bit_rotl_u64(10755112315580060033, 31) => 9280239606276614869
+bit_rotr_u64(10755112315580060033, 31) => 227470277687356246
+bit_rotl_u64(11163782031541429823, 31) => 141075175016160334
+bit_rotr_u64(11163782031541429823, 31) => 564300700064641336
+bit_rotl_u64(13903686156871869732, 31) => 9830956193977854066
+bit_rotr_u64(13903686156871869732, 31) => 2430336628492313034
+bit_rotl_u64(14237897302422917095, 31) => 11075626865162688020
+bit_rotr_u64(14237897302422917095, 31) => 7409019313231648850
+bit_rotl_u64(14302190498657618739, 31) => 13491136976614443837
+bit_rotr_u64(14302190498657618739, 31) => 17071059759038672118
+bit_rotl_u64(15766411510232741269, 31) => 362182200778999262
+bit_rotr_u64(15766411510232741269, 31) => 1448728803115997048
+bit_rotl_u64(15984546468465238145, 31) => 7083089369391317545
+bit_rotr_u64(15984546468465238145, 31) => 9885613403855718565
+bit_rotl_u64(18446744073709551615, 31) => 18446744073709551615
+bit_rotr_u64(18446744073709551615, 31) => 18446744073709551615
+bit_rotl_u64(0, 32) => 0
+bit_rotr_u64(0, 32) => 0
+bit_rotl_u32(0, 32) => 0
+bit_rotr_u32(0, 32) => 0
+bit_rotl_u64(1, 32) => 4294967296
+bit_rotr_u64(1, 32) => 4294967296
+bit_rotl_u32(1, 32) => 1
+bit_rotr_u32(1, 32) => 1
+bit_rotl_u64(2, 32) => 8589934592
+bit_rotr_u64(2, 32) => 8589934592
+bit_rotl_u32(2, 32) => 2
+bit_rotr_u32(2, 32) => 2
+bit_rotl_u64(32768, 32) => 140737488355328
+bit_rotr_u64(32768, 32) => 140737488355328
+bit_rotl_u32(32768, 32) => 32768
+bit_rotr_u32(32768, 32) => 32768
+bit_rotl_u64(65535, 32) => 281470681743360
+bit_rotr_u64(65535, 32) => 281470681743360
+bit_rotl_u32(65535, 32) => 65535
+bit_rotr_u32(65535, 32) => 65535
+bit_rotl_u64(65536, 32) => 281474976710656
+bit_rotr_u64(65536, 32) => 281474976710656
+bit_rotl_u32(65536, 32) => 65536
+bit_rotr_u32(65536, 32) => 65536
+bit_rotl_u64(726075912, 32) => 3118472296453373952
+bit_rotr_u64(726075912, 32) => 3118472296453373952
+bit_rotl_u32(726075912, 32) => 726075912
+bit_rotr_u32(726075912, 32) => 726075912
+bit_rotl_u64(858993459, 32) => 3689348813882916864
+bit_rotr_u64(858993459, 32) => 3689348813882916864
+bit_rotl_u32(858993459, 32) => 858993459
+bit_rotr_u32(858993459, 32) => 858993459
+bit_rotl_u64(1073741824, 32) => 4611686018427387904
+bit_rotr_u64(1073741824, 32) => 4611686018427387904
+bit_rotl_u32(1073741824, 32) => 1073741824
+bit_rotr_u32(1073741824, 32) => 1073741824
+bit_rotl_u64(1245250552, 32) => 5348310396165947392
+bit_rotr_u64(1245250552, 32) => 5348310396165947392
+bit_rotl_u32(1245250552, 32) => 1245250552
+bit_rotr_u32(1245250552, 32) => 1245250552
+bit_rotl_u64(1431655765, 32) => 6148914689804861440
+bit_rotr_u64(1431655765, 32) => 6148914689804861440
+bit_rotl_u32(1431655765, 32) => 1431655765
+bit_rotr_u32(1431655765, 32) => 1431655765
+bit_rotl_u64(1656977767, 32) => 7116665319464108032
+bit_rotr_u64(1656977767, 32) => 7116665319464108032
+bit_rotl_u32(1656977767, 32) => 1656977767
+bit_rotr_u32(1656977767, 32) => 1656977767
+bit_rotl_u64(2147483648, 32) => 9223372036854775808
+bit_rotr_u64(2147483648, 32) => 9223372036854775808
+bit_rotl_u32(2147483648, 32) => 2147483648
+bit_rotr_u32(2147483648, 32) => 2147483648
+bit_rotl_u64(2283114629, 32) => 9805902664574173184
+bit_rotr_u64(2283114629, 32) => 9805902664574173184
+bit_rotl_u32(2283114629, 32) => 2283114629
+bit_rotr_u32(2283114629, 32) => 2283114629
+bit_rotl_u64(2502548245, 32) => 10748362868937195520
+bit_rotr_u64(2502548245, 32) => 10748362868937195520
+bit_rotl_u32(2502548245, 32) => 2502548245
+bit_rotr_u32(2502548245, 32) => 2502548245
+bit_rotl_u64(4294967295, 32) => 18446744069414584320
+bit_rotr_u64(4294967295, 32) => 18446744069414584320
+bit_rotl_u32(4294967295, 32) => 4294967295
+bit_rotr_u32(4294967295, 32) => 4294967295
+bit_rotl_u64(708915120906848425, 32) => 16541238372230140555
+bit_rotr_u64(708915120906848425, 32) => 16541238372230140555
+bit_rotl_u64(1960191741125985428, 32) => 14229128056835145728
+bit_rotr_u64(1960191741125985428, 32) => 14229128056835145728
+bit_rotl_u64(3689348814741910323, 32) => 3689348814741910323
+bit_rotr_u64(3689348814741910323, 32) => 3689348814741910323
+bit_rotl_u64(5578377670650038654, 32) => 11101664994514329839
+bit_rotr_u64(5578377670650038654, 32) => 11101664994514329839
+bit_rotl_u64(9223372036854775808, 32) => 2147483648
+bit_rotr_u64(9223372036854775808, 32) => 2147483648
+bit_rotl_u64(10755112315580060033, 32) => 113735138843678123
+bit_rotr_u64(10755112315580060033, 32) => 113735138843678123
+bit_rotl_u64(11163782031541429823, 32) => 282150350032320668
+bit_rotr_u64(11163782031541429823, 32) => 282150350032320668
+bit_rotl_u64(13903686156871869732, 32) => 1215168314246156517
+bit_rotr_u64(13903686156871869732, 32) => 1215168314246156517
+bit_rotl_u64(14237897302422917095, 32) => 3704509656615824425
+bit_rotr_u64(14237897302422917095, 32) => 3704509656615824425
+bit_rotl_u64(14302190498657618739, 32) => 8535529879519336059
+bit_rotr_u64(14302190498657618739, 32) => 8535529879519336059
+bit_rotl_u64(15766411510232741269, 32) => 724364401557998524
+bit_rotr_u64(15766411510232741269, 32) => 724364401557998524
+bit_rotl_u64(15984546468465238145, 32) => 14166178738782635090
+bit_rotr_u64(15984546468465238145, 32) => 14166178738782635090
+bit_rotl_u64(18446744073709551615, 32) => 18446744073709551615
+bit_rotr_u64(18446744073709551615, 32) => 18446744073709551615
+bit_rotl_u64(0, 63) => 0
+bit_rotr_u64(0, 63) => 0
+bit_rotl_u64(1, 63) => 9223372036854775808
+bit_rotr_u64(1, 63) => 2
+bit_rotl_u64(2, 63) => 1
+bit_rotr_u64(2, 63) => 4
+bit_rotl_u64(32768, 63) => 16384
+bit_rotr_u64(32768, 63) => 65536
+bit_rotl_u64(65535, 63) => 9223372036854808575
+bit_rotr_u64(65535, 63) => 131070
+bit_rotl_u64(65536, 63) => 32768
+bit_rotr_u64(65536, 63) => 131072
+bit_rotl_u64(726075912, 63) => 363037956
+bit_rotr_u64(726075912, 63) => 1452151824
+bit_rotl_u64(858993459, 63) => 9223372037284272537
+bit_rotr_u64(858993459, 63) => 1717986918
+bit_rotl_u64(1073741824, 63) => 536870912
+bit_rotr_u64(1073741824, 63) => 2147483648
+bit_rotl_u64(1245250552, 63) => 622625276
+bit_rotr_u64(1245250552, 63) => 2490501104
+bit_rotl_u64(1431655765, 63) => 9223372037570603690
+bit_rotr_u64(1431655765, 63) => 2863311530
+bit_rotl_u64(1656977767, 63) => 9223372037683264691
+bit_rotr_u64(1656977767, 63) => 3313955534
+bit_rotl_u64(2147483648, 63) => 1073741824
+bit_rotr_u64(2147483648, 63) => 4294967296
+bit_rotl_u64(2283114629, 63) => 9223372037996333122
+bit_rotr_u64(2283114629, 63) => 4566229258
+bit_rotl_u64(2502548245, 63) => 9223372038106049930
+bit_rotr_u64(2502548245, 63) => 5005096490
+bit_rotl_u64(4294967295, 63) => 9223372039002259455
+bit_rotr_u64(4294967295, 63) => 8589934590
+bit_rotl_u64(708915120906848425, 63) => 9577829597308200020
+bit_rotr_u64(708915120906848425, 63) => 1417830241813696850
+bit_rotl_u64(1960191741125985428, 63) => 980095870562992714
+bit_rotr_u64(1960191741125985428, 63) => 3920383482251970856
+bit_rotl_u64(3689348814741910323, 63) => 11068046444225730969
+bit_rotr_u64(3689348814741910323, 63) => 7378697629483820646
+bit_rotl_u64(5578377670650038654, 63) => 2789188835325019327
+bit_rotr_u64(5578377670650038654, 63) => 11156755341300077308
+bit_rotl_u64(9223372036854775808, 63) => 4611686018427387904
+bit_rotr_u64(9223372036854775808, 63) => 1
+bit_rotl_u64(10755112315580060033, 63) => 14600928194644805824
+bit_rotr_u64(10755112315580060033, 63) => 3063480557450568451
+bit_rotl_u64(11163782031541429823, 63) => 14805263052625490719
+bit_rotr_u64(11163782031541429823, 63) => 3880819989373308031
+bit_rotl_u64(13903686156871869732, 63) => 6951843078435934866
+bit_rotr_u64(13903686156871869732, 63) => 9360628240034187849
+bit_rotl_u64(14237897302422917095, 63) => 16342320688066234355
+bit_rotr_u64(14237897302422917095, 63) => 10029050531136282575
+bit_rotl_u64(14302190498657618739, 63) => 16374467286183585177
+bit_rotr_u64(14302190498657618739, 63) => 10157636923605685863
+bit_rotl_u64(15766411510232741269, 63) => 17106577791971146442
+bit_rotr_u64(15766411510232741269, 63) => 13086078946755930923
+bit_rotl_u64(15984546468465238145, 63) => 17215645271087394880
+bit_rotr_u64(15984546468465238145, 63) => 13522348863220924675
+bit_rotl_u64(18446744073709551615, 63) => 18446744073709551615
+bit_rotr_u64(18446744073709551615, 63) => 18446744073709551615
+bit_rotl_u64(0, 64) => 0
+bit_rotr_u64(0, 64) => 0
+bit_rotl_u64(1, 64) => 1
+bit_rotr_u64(1, 64) => 1
+bit_rotl_u64(2, 64) => 2
+bit_rotr_u64(2, 64) => 2
+bit_rotl_u64(32768, 64) => 32768
+bit_rotr_u64(32768, 64) => 32768
+bit_rotl_u64(65535, 64) => 65535
+bit_rotr_u64(65535, 64) => 65535
+bit_rotl_u64(65536, 64) => 65536
+bit_rotr_u64(65536, 64) => 65536
+bit_rotl_u64(726075912, 64) => 726075912
+bit_rotr_u64(726075912, 64) => 726075912
+bit_rotl_u64(858993459, 64) => 858993459
+bit_rotr_u64(858993459, 64) => 858993459
+bit_rotl_u64(1073741824, 64) => 1073741824
+bit_rotr_u64(1073741824, 64) => 1073741824
+bit_rotl_u64(1245250552, 64) => 1245250552
+bit_rotr_u64(1245250552, 64) => 1245250552
+bit_rotl_u64(1431655765, 64) => 1431655765
+bit_rotr_u64(1431655765, 64) => 1431655765
+bit_rotl_u64(1656977767, 64) => 1656977767
+bit_rotr_u64(1656977767, 64) => 1656977767
+bit_rotl_u64(2147483648, 64) => 2147483648
+bit_rotr_u64(2147483648, 64) => 2147483648
+bit_rotl_u64(2283114629, 64) => 2283114629
+bit_rotr_u64(2283114629, 64) => 2283114629
+bit_rotl_u64(2502548245, 64) => 2502548245
+bit_rotr_u64(2502548245, 64) => 2502548245
+bit_rotl_u64(4294967295, 64) => 4294967295
+bit_rotr_u64(4294967295, 64) => 4294967295
+bit_rotl_u64(708915120906848425, 64) => 708915120906848425
+bit_rotr_u64(708915120906848425, 64) => 708915120906848425
+bit_rotl_u64(1960191741125985428, 64) => 1960191741125985428
+bit_rotr_u64(1960191741125985428, 64) => 1960191741125985428
+bit_rotl_u64(3689348814741910323, 64) => 3689348814741910323
+bit_rotr_u64(3689348814741910323, 64) => 3689348814741910323
+bit_rotl_u64(5578377670650038654, 64) => 5578377670650038654
+bit_rotr_u64(5578377670650038654, 64) => 5578377670650038654
+bit_rotl_u64(9223372036854775808, 64) => 9223372036854775808
+bit_rotr_u64(9223372036854775808, 64) => 9223372036854775808
+bit_rotl_u64(10755112315580060033, 64) => 10755112315580060033
+bit_rotr_u64(10755112315580060033, 64) => 10755112315580060033
+bit_rotl_u64(11163782031541429823, 64) => 11163782031541429823
+bit_rotr_u64(11163782031541429823, 64) => 11163782031541429823
+bit_rotl_u64(13903686156871869732, 64) => 13903686156871869732
+bit_rotr_u64(13903686156871869732, 64) => 13903686156871869732
+bit_rotl_u64(14237897302422917095, 64) => 14237897302422917095
+bit_rotr_u64(14237897302422917095, 64) => 14237897302422917095
+bit_rotl_u64(14302190498657618739, 64) => 14302190498657618739
+bit_rotr_u64(14302190498657618739, 64) => 14302190498657618739
+bit_rotl_u64(15766411510232741269, 64) => 15766411510232741269
+bit_rotr_u64(15766411510232741269, 64) => 15766411510232741269
+bit_rotl_u64(15984546468465238145, 64) => 15984546468465238145
+bit_rotr_u64(15984546468465238145, 64) => 15984546468465238145
+bit_rotl_u64(18446744073709551615, 64) => 18446744073709551615
+bit_rotr_u64(18446744073709551615, 64) => 18446744073709551615
+	*** test_rotl_rotr: done ***
+ 	*** test_bswap ***
+bswap_u64(0) => 0
+bswap_u32(0) => 0
+bswap_u64(1) => 72057594037927936
+bswap_u32(1) => 16777216
+bswap_u64(2) => 144115188075855872
+bswap_u32(2) => 33554432
+bswap_u64(32768) => 36028797018963968
+bswap_u32(32768) => 8388608
+bswap_u64(65535) => 18446462598732840960
+bswap_u32(65535) => 4294901760
+bswap_u64(65536) => 1099511627776
+bswap_u32(65536) => 256
+bswap_u64(726075912) => 579353752079695872
+bswap_u32(726075912) => 134891307
+bswap_u64(858993459) => 3689348813882916864
+bswap_u32(858993459) => 858993459
+bswap_u64(1073741824) => 274877906944
+bswap_u32(1073741824) => 64
+bswap_u64(1245250552) => 17871190736326623232
+bswap_u32(1245250552) => 4160960842
+bswap_u64(1431655765) => 6148914689804861440
+bswap_u32(1431655765) => 1431655765
+bswap_u64(1656977767) => 7456205483762778112
+bswap_u32(1656977767) => 1736033122
+bswap_u64(2147483648) => 549755813888
+bswap_u32(2147483648) => 128
+bswap_u64(2283114629) => 9624216077550485504
+bswap_u32(2283114629) => 2240812424
+bswap_u64(2502548245) => 1574898214622986240
+bswap_u32(2502548245) => 366684565
+bswap_u64(4294967295) => 18446744069414584320
+bswap_u32(4294967295) => 4294967295
+bswap_u64(708915120906848425) => 12198156707273299465
+bswap_u64(1960191741125985428) => 10665782605024080923
+bswap_u64(3689348814741910323) => 3689348814741910323
+bswap_u64(5578377670650038654) => 9081809480708024909
+bswap_u64(9223372036854775808) => 128
+bswap_u64(10755112315580060033) => 9300377440395542933
+bswap_u64(11163782031541429823) => 4568596173249113498
+bswap_u64(13903686156871869732) => 2604731024148591552
+bswap_u64(14237897302422917095) => 16649642015867049925
+bswap_u64(14302190498657618739) => 3696175971416046534
+bswap_u64(15766411510232741269) => 10769528423690522074
+bswap_u64(15984546468465238145) => 9322619197622375645
+bswap_u64(18446744073709551615) => 18446744073709551615
+	*** test_bswap: done ***
+ 	*** test_index ***
+bit_index_u64(0, *, -1) => 
+bit_index_u32(0, *, -1) => 
+bit_index_u64(1, *, -1) => 0 
+bit_index_u32(1, *, -1) => 0 
+bit_index_u64(2, *, -1) => 1 
+bit_index_u32(2, *, -1) => 1 
+bit_index_u64(32768, *, -1) => 15 
+bit_index_u32(32768, *, -1) => 15 
+bit_index_u64(65535, *, -1) => 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
+bit_index_u32(65535, *, -1) => 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
+bit_index_u64(65536, *, -1) => 16 
+bit_index_u32(65536, *, -1) => 16 
+bit_index_u64(726075912, *, -1) => 3 9 11 16 17 18 22 24 25 27 29 
+bit_index_u32(726075912, *, -1) => 3 9 11 16 17 18 22 24 25 27 29 
+bit_index_u64(858993459, *, -1) => 0 1 4 5 8 9 12 13 16 17 20 21 24 25 28 29 
+bit_index_u32(858993459, *, -1) => 0 1 4 5 8 9 12 13 16 17 20 21 24 25 28 29 
+bit_index_u64(1073741824, *, -1) => 30 
+bit_index_u32(1073741824, *, -1) => 30 
+bit_index_u64(1245250552, *, -1) => 3 4 5 6 7 8 9 16 19 20 21 25 27 30 
+bit_index_u32(1245250552, *, -1) => 3 4 5 6 7 8 9 16 19 20 21 25 27 30 
+bit_index_u64(1431655765, *, -1) => 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 
+bit_index_u32(1431655765, *, -1) => 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 
+bit_index_u64(1656977767, *, -1) => 0 1 2 5 6 8 11 12 13 14 16 17 22 23 25 29 30 
+bit_index_u32(1656977767, *, -1) => 0 1 2 5 6 8 11 12 13 14 16 17 22 23 25 29 30 
+bit_index_u64(2147483648, *, -1) => 31 
+bit_index_u32(2147483648, *, -1) => 31 
+bit_index_u64(2283114629, *, -1) => 0 2 7 12 15 16 18 20 27 31 
+bit_index_u32(2283114629, *, -1) => 0 2 7 12 15 16 18 20 27 31 
+bit_index_u64(2502548245, *, -1) => 0 2 4 8 9 11 12 14 15 16 19 21 24 26 28 31 
+bit_index_u32(2502548245, *, -1) => 0 2 4 8 9 11 12 14 15 16 19 21 24 26 28 31 
+bit_index_u64(4294967295, *, -1) => 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 
+bit_index_u32(4294967295, *, -1) => 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 
+bit_index_u64(708915120906848425, *, -1) => 0 3 5 7 11 14 17 18 19 23 24 26 29 30 31 32 33 35 39 41 44 47 49 50 52 54 55 56 59 
+bit_index_u64(1960191741125985428, *, -1) => 2 4 7 10 19 20 21 22 24 26 30 31 50 52 53 56 57 59 60 
+bit_index_u64(3689348814741910323, *, -1) => 0 1 4 5 8 9 12 13 16 17 20 21 24 25 28 29 32 33 36 37 40 41 44 45 48 49 52 53 56 57 60 61 
+bit_index_u64(5578377670650038654, *, -1) => 1 2 3 4 5 6 8 11 16 20 25 27 28 31 32 33 34 35 37 38 39 45 46 49 51 53 54 56 58 59 62 
+bit_index_u64(9223372036854775808, *, -1) => 63 
+bit_index_u64(10755112315580060033, *, -1) => 0 7 8 12 18 20 23 24 32 33 35 37 39 40 42 44 46 47 48 54 56 58 60 63 
+bit_index_u64(11163782031541429823, *, -1) => 0 1 2 3 4 5 9 10 13 14 17 19 21 22 23 24 25 34 35 36 39 43 44 45 47 48 50 51 53 54 55 57 59 60 63 
+bit_index_u64(13903686156871869732, *, -1) => 2 5 8 10 13 16 18 19 20 22 23 28 32 34 37 38 39 44 46 47 48 49 52 53 54 55 62 63 
+bit_index_u64(14237897302422917095, *, -1) => 0 1 2 5 6 7 8 9 10 11 16 19 21 22 24 25 28 29 32 35 37 42 43 45 48 49 50 52 55 56 58 62 63 
+bit_index_u64(14302190498657618739, *, -1) => 0 1 4 5 8 9 11 14 18 20 21 22 25 26 28 29 30 32 33 35 36 37 38 41 42 44 47 48 49 51 52 53 54 57 58 62 63 
+bit_index_u64(15766411510232741269, *, -1) => 0 2 4 7 8 10 12 13 14 16 18 19 25 27 34 35 36 37 39 40 41 43 47 48 50 51 54 55 57 59 60 62 63 
+bit_index_u64(15984546468465238145, *, -1) => 0 7 13 14 19 20 23 26 30 31 33 36 38 42 47 50 52 54 55 56 58 59 60 62 63 
+bit_index_u64(18446744073709551615, *, -1) => 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 
+	*** test_index: done ***
+ 
\ No newline at end of file
diff --git a/test/unit/bit.test b/test/unit/bit.test
new file mode 100644
index 0000000000000000000000000000000000000000..bd42398b072ea067924ad5ff0977c8109be9636c
--- /dev/null
+++ b/test/unit/bit.test
@@ -0,0 +1 @@
+run_test("bit_test")