1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- /*********************************************************************
- Blosc - Blocked Shuffling and Compression Library
- Author: Francesc Alted <francesc@blosc.org>
- See LICENSES/BLOSC.txt for details about copyright and rights to use.
- **********************************************************************/
- #ifndef SHUFFLE_COMMON_H
- #define SHUFFLE_COMMON_H
- #include "blosc-export.h"
- #include <string.h>
- /* Import standard integer type definitions */
- #if defined(_WIN32) && !defined(__MINGW32__)
- /* stdint.h only available in VS2010 (VC++ 16.0) and newer */
- #if defined(_MSC_VER) && _MSC_VER < 1600
- #include "win32/stdint-windows.h"
- #else
- #include <stdint.h>
- #endif
- /* Use inlined functions for supported systems */
- #if defined(_MSC_VER) && !defined(__cplusplus) /* Visual Studio */
- #define inline __inline /* Visual C is not C99, but supports some kind of inline */
- #endif
- #else
- #include <stdint.h>
- #endif /* _WIN32 */
- /* Define the __SSE2__ symbol if compiling with Visual C++ and
- targeting the minimum architecture level supporting SSE2.
- Other compilers define this as expected and emit warnings
- when it is re-defined. */
- #if !defined(__SSE2__) && defined(_MSC_VER) && \
- (defined(_M_X64) || (defined(_M_IX86) && _M_IX86_FP >= 2))
- #define __SSE2__
- #endif
- /*
- * Detect if the architecture is fine with unaligned access.
- */
- #if !defined(BLOSC_STRICT_ALIGN)
- #define BLOSC_STRICT_ALIGN
- #if defined(__i386__) || defined(__386) || defined (__amd64) /* GNU C, Sun Studio */
- #undef BLOSC_STRICT_ALIGN
- #elif defined(__i486__) || defined(__i586__) || defined(__i686__) /* GNU C */
- #undef BLOSC_STRICT_ALIGN
- #elif defined(_M_IX86) || defined(_M_X64) /* Intel, MSVC */
- #undef BLOSC_STRICT_ALIGN
- #elif defined(__386)
- #undef BLOSC_STRICT_ALIGN
- #elif defined(_X86_) /* MinGW */
- #undef BLOSC_STRICT_ALIGN
- #elif defined(__I86__) /* Digital Mars */
- #undef BLOSC_STRICT_ALIGN
- /* Seems like unaligned access in ARM (at least ARMv6) is pretty
- expensive, so we are going to always enforce strict aligment in ARM.
- If anybody suggest that newer ARMs are better, we can revisit this. */
- /* #elif defined(__ARM_FEATURE_UNALIGNED) */ /* ARM, GNU C */
- /* #undef BLOSC_STRICT_ALIGN */
- #elif defined(_ARCH_PPC) || defined(__PPC__)
- /* Modern PowerPC systems (like POWER8) should support unaligned access
- quite efficiently. */
- #undef BLOSC_STRICT_ALIGN
- #endif
- #endif
- #if defined(__SSE2__)
- #include <emmintrin.h>
- #endif
- #if defined(__AVX2__)
- #include <immintrin.h>
- #endif
- #endif /* SHUFFLE_COMMON_H */
|