summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/tools/cpuid.hxx6
-rw-r--r--sc/source/core/inc/arraysumfunctor.hxx11
-rw-r--r--tools/source/misc/cpuid.cxx3
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
{