diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2015-11-13 16:31:13 +0100 |
---|---|---|
committer | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2015-11-13 16:37:29 +0100 |
commit | 2af4da0ea9ee0b029e89cf5ab65d378d426d1af1 (patch) | |
tree | a9ccdfb1a2620566ddca932ce7135d18934496ca | |
parent | 81860b908b0c6104d47886a172b65d8d31f59ec3 (diff) |
improve compile time SSE2 detection, fix broken android build
Prereq. to enable runtime SSE2 detection is that the compiler
supports it in the first place. MSVS and GCC use different
compiler flags for this so use __LO_SSE2_AVAILABLE__ to make this
build platform independent.
emmintrin.h is unavailable on ARM Android so include this and
compile the SSE2 specific code only when we are sure we can build
SSE2 code (__LO_SSE2_AVAILABLE__ is defined).
Change-Id: I212c4e0b99a314d087b9def822a81325b25f3469
-rw-r--r-- | include/tools/cpuid.hxx | 6 | ||||
-rw-r--r-- | sc/source/core/inc/arraysumfunctor.hxx | 11 | ||||
-rw-r--r-- | tools/source/misc/cpuid.cxx | 3 |
3 files changed, 17 insertions, 3 deletions
diff --git a/include/tools/cpuid.hxx b/include/tools/cpuid.hxx index 244512989cb6..348724e024dd 100644 --- a/include/tools/cpuid.hxx +++ b/include/tools/cpuid.hxx @@ -14,6 +14,12 @@ #include <sal/config.h> #include <tools/toolsdllapi.h> +#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && defined(__SSE2__) +#define __LO_SSE2_AVAILABLE__ 1 +#elif defined(_MSC_VER) && (defined(_M_AMD64) || (defined(_M_IX86) && defined(_M_IX86_FP) && _M_IX86_FP >= 2)) +#define __LO_SSE2_AVAILABLE__ 1 +#endif + namespace tools { namespace cpuid diff --git a/sc/source/core/inc/arraysumfunctor.hxx b/sc/source/core/inc/arraysumfunctor.hxx index 776c5143732e..34ccd81aad5b 100644 --- a/sc/source/core/inc/arraysumfunctor.hxx +++ b/sc/source/core/inc/arraysumfunctor.hxx @@ -11,9 +11,12 @@ #ifndef INCLUDED_SC_SOURCE_CORE_INC_ARRAYSUMFUNCTOR_HXX #define INCLUDED_SC_SOURCE_CORE_INC_ARRAYSUMFUNCTOR_HXX -#include <emmintrin.h> #include <tools/cpuid.hxx> +#if defined(__LO_SSE2_AVAILABLE__) +#include <emmintrin.h> +#endif + namespace sc { @@ -67,6 +70,7 @@ public: private: inline double executeSSE2(size_t& i, const double* pCurrent) const { +#if defined(__LO_SSE2_AVAILABLE__) double fSum = 0.0; size_t nRealSize = mnSize - i; size_t nUnrolledSize = nRealSize - (nRealSize % 8); @@ -107,6 +111,11 @@ private: fSum += temp; } return fSum; +#else + (void) i; + (void) pCurrent; + return 0.0; +#endif } inline double executeUnrolled(size_t& i, const double* pCurrent) const diff --git a/tools/source/misc/cpuid.cxx b/tools/source/misc/cpuid.cxx index b4406befb0e8..5e052fbbc166 100644 --- a/tools/source/misc/cpuid.cxx +++ b/tools/source/misc/cpuid.cxx @@ -16,8 +16,7 @@ namespace tools namespace cpuid { -// First minimize to MSVC / GCC compat. compiler and x86 / x64 architecture -#if (defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86))) || (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))) +#if defined(__LO_SSE2_AVAILABLE__) namespace { |