diff --git a/src/crc32.c b/src/crc32.c index 9a9b6f26..1dae47b4 100644 --- a/src/crc32.c +++ b/src/crc32.c @@ -30,12 +30,7 @@ #include "config.h" #include "ue2common.h" #include "util/arch.h" - -#if defined(HAVE_C_X86INTRIN_H) -#include -#elif defined(HAVE_C_INTRIN_H) -#include -#endif +#include "util/intrinsics.h" #if !defined(HAVE_SSE42) diff --git a/src/fdr/fdr.c b/src/fdr/fdr.c index 74e6c577..92e75aaa 100644 --- a/src/fdr/fdr.c +++ b/src/fdr/fdr.c @@ -124,7 +124,7 @@ const ALIGN_CL_DIRECTIVE u8 zone_or_mask[ITER_BYTES+1][ITER_BYTES] = { static really_inline u64a andn(const u32 a, const u8 *b) { u64a r; -#if defined(HAVE_BMI) +#if defined(HAVE_BMI) && !defined(NO_ASM) __asm__ ("andn\t%2,%1,%k0" : "=r"(r) : "r"(a), "m"(*(const u32 *)b)); #else r = unaligned_load_u32(b) & ~a; diff --git a/src/util/arch.h b/src/util/arch.h index 8584ee65..2ed1793a 100644 --- a/src/util/arch.h +++ b/src/util/arch.h @@ -72,4 +72,11 @@ #define HAVE_BMI2 #endif +/* + * MSVC uses a different form of inline asm + */ +#if defined(_WIN32) && defined(_MSC_VER) +#define NO_ASM +#endif + #endif // UTIL_ARCH_H_ diff --git a/src/util/bitutils.h b/src/util/bitutils.h index 66a07571..c545ee18 100644 --- a/src/util/bitutils.h +++ b/src/util/bitutils.h @@ -36,37 +36,7 @@ #include "ue2common.h" #include "popcount.h" #include "util/arch.h" - -#ifdef __cplusplus -# if defined(HAVE_CXX_X86INTRIN_H) -# define USE_X86INTRIN_H -# endif -#else // C, baby -# if defined(HAVE_C_X86INTRIN_H) -# define USE_X86INTRIN_H -# endif -#endif - -#ifdef __cplusplus -# if defined(HAVE_CXX_INTRIN_H) -# define USE_INTRIN_H -# endif -#else // C, baby -# if defined(HAVE_C_INTRIN_H) -# define USE_INTRIN_H -# endif -#endif - -#if defined(USE_X86INTRIN_H) -#include -#elif defined(USE_INTRIN_H) -#include -#endif - -// MSVC has a different form of inline asm -#ifdef _WIN32 -#define NO_ASM -#endif +#include "util/intrinsics.h" #define CASE_BIT 0x20 #define CASE_CLEAR 0xdf diff --git a/src/util/intrinsics.h b/src/util/intrinsics.h new file mode 100644 index 00000000..edc4f6ef --- /dev/null +++ b/src/util/intrinsics.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 THE COPYRIGHT OWNER 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 Wrapper around the compiler supplied intrinsic header + */ + +#ifndef INTRINSICS_H +#define INTRINSICS_H + +#include "config.h" + +#ifdef __cplusplus +# if defined(HAVE_CXX_X86INTRIN_H) +# define USE_X86INTRIN_H +# endif +#else // C +# if defined(HAVE_C_X86INTRIN_H) +# define USE_X86INTRIN_H +# endif +#endif + +#ifdef __cplusplus +# if defined(HAVE_CXX_INTRIN_H) +# define USE_INTRIN_H +# endif +#else // C +# if defined(HAVE_C_INTRIN_H) +# define USE_INTRIN_H +# endif +#endif + +#if defined(USE_X86INTRIN_H) +#include +#elif defined(USE_INTRIN_H) +#include +#else +#error no intrinsics file +#endif + +#endif // INTRINSICS_H diff --git a/src/util/math.h b/src/util/math.h index 3fd69dba..e18c5027 100644 --- a/src/util/math.h +++ b/src/util/math.h @@ -30,35 +30,10 @@ #define UTIL_MATH_H_ #include "arch.h" +#include "intrinsics.h" #include -#ifdef __cplusplus -# if defined(HAVE_CXX_X86INTRIN_H) -# define USE_X86INTRIN_H -# endif -#else // C -# if defined(HAVE_C_X86INTRIN_H) -# define USE_X86INTRIN_H -# endif -#endif - -#ifdef __cplusplus -# if defined(HAVE_CXX_INTRIN_H) -# define USE_INTRIN_H -# endif -#else // C -# if defined(HAVE_C_INTRIN_H) -# define USE_INTRIN_H -# endif -#endif - -#if defined(USE_X86INTRIN_H) -#include -#elif defined(USE_INTRIN_H) -#include -#endif - static really_inline double our_pow(double x, double y) { #if defined(HAVE_AVX) diff --git a/src/util/simd_types.h b/src/util/simd_types.h index ec86d4a9..a6c87db7 100644 --- a/src/util/simd_types.h +++ b/src/util/simd_types.h @@ -31,37 +31,9 @@ #include "config.h" #include "util/arch.h" +#include "util/intrinsics.h" #include "ue2common.h" -// more recent headers are bestest, but only if we can use them -#ifdef __cplusplus -# if defined(HAVE_CXX_X86INTRIN_H) -# define USE_X86INTRIN_H -# endif -#else // C -# if defined(HAVE_C_X86INTRIN_H) -# define USE_X86INTRIN_H -# endif -#endif - -#ifdef __cplusplus -# if defined(HAVE_CXX_INTRIN_H) -# define USE_INTRIN_H -# endif -#else // C -# if defined(HAVE_C_INTRIN_H) -# define USE_INTRIN_H -# endif -#endif - -#if defined(USE_X86INTRIN_H) -#include -#elif defined(USE_INTRIN_H) -#include -#else -#error no intrinsics! -#endif - #if defined(HAVE_SSE2) typedef __m128i m128; #else diff --git a/src/util/simd_utils.h b/src/util/simd_utils.h index ccbcabbb..bc49a046 100644 --- a/src/util/simd_utils.h +++ b/src/util/simd_utils.h @@ -38,42 +38,13 @@ #endif #include "config.h" -#include "util/arch.h" - -#include // for memcpy - -// more recent headers are bestest, but only if we can use them -#ifdef __cplusplus -# if defined(HAVE_CXX_X86INTRIN_H) -# define USE_X86INTRIN_H -# endif -#else // C -# if defined(HAVE_C_X86INTRIN_H) -# define USE_X86INTRIN_H -# endif -#endif - -#ifdef __cplusplus -# if defined(HAVE_CXX_INTRIN_H) -# define USE_INTRIN_H -# endif -#else // C -# if defined(HAVE_C_INTRIN_H) -# define USE_INTRIN_H -# endif -#endif - -#if defined(USE_X86INTRIN_H) -#include -#elif defined(USE_INTRIN_H) -#include -#else -#error no intrins! -#endif - #include "ue2common.h" #include "simd_types.h" #include "unaligned.h" +#include "util/arch.h" +#include "util/intrinsics.h" + +#include // for memcpy // Define a common assume_aligned using an appropriate compiler built-in, if // it's available. Note that we need to handle C or C++ compilation.