INCLUDE(CheckIncludeFiles)
INCLUDE(TestBigEndian)
INCLUDE(CheckCSourceCompiles)
+INCLUDE(GenerateExportHeader)
PROJECT(libaec)
SET(libaec_VERSION_MAJOR 0)
SET(libaec_VERSION_MINOR 2)
{return __builtin_clzll(1LL);}"
HAVE_DECL___BUILTIN_CLZLL
)
+IF (NOT HAVE_DECL___BUILTIN_CLZLL)
+ CHECK_C_SOURCE_COMPILES(
+ "int main(int argc, char *argv[])
+{unsigned long foo; unsigned __int64 bar=1LL;
+return _BitScanReverse64(&foo, bar);}"
+ HAVE_BSR64
+ )
+ENDIF (NOT HAVE_DECL___BUILTIN_CLZLL)
#Inspired from http://www.cmake.org/Wiki/CMakeTestInline
SET(INLINE_TEST_SRC "/* Inspired by autoconf's c.m4 */
${CMAKE_CURRENT_BINARY_DIR}/config.h
)
-SET(BUILD_SHARED_LIBS TRUE)
+SET(BUILD_SHARED_LIBS FALSE)
INCLUDE_DIRECTORIES("${PROJECT_BINARY_DIR}")
+INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/src")
+
ADD_SUBDIRECTORY(src)
-ADD_SUBDIRECTORY(tests EXCLUDE_FROM_ALL)
+IF(WIN32)
+ ADD_SUBDIRECTORY(tests)
+ELSE(WIN32)
+ ADD_SUBDIRECTORY(tests EXCLUDE_FROM_ALL)
+ENDIF(WIN32)
#cmakedefine HAVE_STDINT_H 1
#cmakedefine WORDS_BIGENDIAN 1
#cmakedefine HAVE_DECL___BUILTIN_CLZLL 1
+#cmakedefine HAVE_BSR64 1
#include <config.h>
#if HAVE_STDINT_H
-# include <stdint.h>
+#include <stdint.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#ifdef HAVE_BSR64
+#include <intrin.h>
+#endif
+
#include "libaec.h"
#include "decode.h"
*/
uint32_t fs = 0;
-#if HAVE_DECL___BUILTIN_CLZLL
+#if HAVE_DECL___BUILTIN_CLZLL||HAVE_BSR64
uint32_t lz;
#endif
struct internal_state *state = strm->state;
lz = __builtin_clzll(state->acc);
fs += lz + state->bitp - 64;
state->bitp = 63 - lz;
+#elif HAVE_BSR64
+ _BitScanReverse64(&lz, state->acc);
+ fs += state->bitp - 1 - lz;
+ state->bitp = lz;
#else
state->bitp--;
while ((state->acc & (1ULL << state->bitp)) == 0) {