diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2020-06-20 16:59:59 +0200 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2020-06-24 08:47:30 +0200 |
commit | 7ee6fa6487f01271c4374e4c260466b5041afe72 (patch) | |
tree | ade1cbf020229c04d8d859cb9ee9ebf583e31ed8 /tools | |
parent | 240758a972eb99dd4d26fa6040ff0b6614036621 (diff) |
Add test as an example how to add CPU intrinsics support
Also makes sure that if the CPU dataction or compiler detection
doesn't work correctly, the test could potentially crash.
Change-Id: If0862c0a736c8e1f5ba1117b248918e4c1fb2f4d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96779
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/CppunitTest_tools_test.mk | 12 | ||||
-rw-r--r-- | tools/qa/cppunit/test_cpu_runtime_detection_AVX2.cxx | 75 | ||||
-rw-r--r-- | tools/qa/cppunit/test_cpu_runtime_detection_SSE2.cxx | 58 | ||||
-rw-r--r-- | tools/qa/cppunit/test_cpu_runtime_detection_SSSE3.cxx | 58 |
4 files changed, 203 insertions, 0 deletions
diff --git a/tools/CppunitTest_tools_test.mk b/tools/CppunitTest_tools_test.mk index 46a6cf5242cd..aa5ac4606d02 100644 --- a/tools/CppunitTest_tools_test.mk +++ b/tools/CppunitTest_tools_test.mk @@ -34,6 +34,18 @@ $(eval $(call gb_CppunitTest_add_exception_objects,tools_test, \ tools/qa/cppunit/test_cpuid \ )) +$(eval $(call gb_CppunitTest_add_exception_objects,tools_test,\ + tools/qa/cppunit/test_cpu_runtime_detection_AVX2, $(CXXFLAGS_INTRINSICS_AVX2) \ +)) + +$(eval $(call gb_CppunitTest_add_exception_objects,tools_test,\ + tools/qa/cppunit/test_cpu_runtime_detection_SSE2, $(CXXFLAGS_INTRINSICS_SSE2) \ +)) + +$(eval $(call gb_CppunitTest_add_exception_objects,tools_test,\ + tools/qa/cppunit/test_cpu_runtime_detection_SSSE3, $(CXXFLAGS_INTRINSICS_SSSE3) \ +)) + $(eval $(call gb_CppunitTest_use_sdk_api,tools_test)) $(eval $(call gb_CppunitTest_use_libraries,tools_test, \ diff --git a/tools/qa/cppunit/test_cpu_runtime_detection_AVX2.cxx b/tools/qa/cppunit/test_cpu_runtime_detection_AVX2.cxx new file mode 100644 index 000000000000..0c98f2fc8c98 --- /dev/null +++ b/tools/qa/cppunit/test_cpu_runtime_detection_AVX2.cxx @@ -0,0 +1,75 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <tools/simdsupport.hxx> + +#ifdef LO_AVX2_AVAILABLE + +#include <cppunit/TestAssert.h> +#include <cppunit/TestFixture.h> +#include <cppunit/extensions/HelperMacros.h> +#include <cppunit/plugin/TestPlugIn.h> + +#include <tools/cpuid.hxx> + +namespace +{ +class CpuRuntimeDetection_AVX2 : public CppUnit::TestFixture +{ +public: + void checkAVX2(); + void testCpuRuntimeDetection(); + + CPPUNIT_TEST_SUITE(CpuRuntimeDetection_AVX2); + CPPUNIT_TEST(testCpuRuntimeDetection); + CPPUNIT_TEST_SUITE_END(); +}; + +void CpuRuntimeDetection_AVX2::testCpuRuntimeDetection() +{ + // can only run if this function if CPU supports AVX2 + if (cpuid::isCpuInstructionSetSupported(cpuid::InstructionSetFlags::AVX2)) + checkAVX2(); +} + +void CpuRuntimeDetection_AVX2::checkAVX2() +{ + __m256i a = _mm256_set_epi64x(1, 4, 8, 3); + __m256i b = _mm256_set_epi64x(2, 1, 1, 5); + __m256i c = _mm256_xor_si256(a, b); + + sal_Int64 values[4]; + _mm256_storeu_si256(reinterpret_cast<__m256i*>(&values), c); + + CPPUNIT_ASSERT_EQUAL(sal_Int64(6), values[0]); + CPPUNIT_ASSERT_EQUAL(sal_Int64(9), values[1]); + CPPUNIT_ASSERT_EQUAL(sal_Int64(5), values[2]); + CPPUNIT_ASSERT_EQUAL(sal_Int64(3), values[3]); + + __m256i d = _mm256_set_epi64x(3, 5, 1, 0); + + __m256i result = _mm256_cmpeq_epi64(d, c); + + // Compare equals + sal_Int64 compare[4]; + _mm256_storeu_si256(reinterpret_cast<__m256i*>(&compare), result); + + CPPUNIT_ASSERT_EQUAL(sal_Int64(0), compare[0]); + CPPUNIT_ASSERT_EQUAL(sal_Int64(0), compare[1]); + CPPUNIT_ASSERT_EQUAL(sal_Int64(-1), compare[2]); + CPPUNIT_ASSERT_EQUAL(sal_Int64(-1), compare[3]); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(CpuRuntimeDetection_AVX2); + +} // end anonymous namespace + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/tools/qa/cppunit/test_cpu_runtime_detection_SSE2.cxx b/tools/qa/cppunit/test_cpu_runtime_detection_SSE2.cxx new file mode 100644 index 000000000000..13dd48d2176e --- /dev/null +++ b/tools/qa/cppunit/test_cpu_runtime_detection_SSE2.cxx @@ -0,0 +1,58 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <tools/simdsupport.hxx> + +#ifdef LO_SSE2_AVAILABLE + +#include <cppunit/TestAssert.h> +#include <cppunit/TestFixture.h> +#include <cppunit/extensions/HelperMacros.h> +#include <cppunit/plugin/TestPlugIn.h> + +#include <tools/cpuid.hxx> + +namespace +{ +class CpuRuntimeDetection_SSE2 : public CppUnit::TestFixture +{ +public: + void checkSSE2(); + void testCpuRuntimeDetection(); + + CPPUNIT_TEST_SUITE(CpuRuntimeDetection_SSE2); + CPPUNIT_TEST(testCpuRuntimeDetection); + CPPUNIT_TEST_SUITE_END(); +}; + +void CpuRuntimeDetection_SSE2::testCpuRuntimeDetection() +{ + // can only run if this function if CPU supports SSE2 + if (cpuid::isCpuInstructionSetSupported(cpuid::InstructionSetFlags::SSE2)) + checkSSE2(); +} + +void CpuRuntimeDetection_SSE2::checkSSE2() +{ + // Try some SSE2 intrinsics calcualtion + __m128i a = _mm_set1_epi32(15); + __m128i b = _mm_set1_epi32(15); + __m128i c = _mm_xor_si128(a, b); + + // Check zero + CPPUNIT_ASSERT_EQUAL(0xFFFF, _mm_movemask_epi8(_mm_cmpeq_epi32(c, _mm_setzero_si128()))); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(CpuRuntimeDetection_SSE2); + +} // end anonymous namespace + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/tools/qa/cppunit/test_cpu_runtime_detection_SSSE3.cxx b/tools/qa/cppunit/test_cpu_runtime_detection_SSSE3.cxx new file mode 100644 index 000000000000..1d730d99e985 --- /dev/null +++ b/tools/qa/cppunit/test_cpu_runtime_detection_SSSE3.cxx @@ -0,0 +1,58 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <tools/simdsupport.hxx> + +#ifdef LO_SSSE3_AVAILABLE + +#include <cppunit/TestAssert.h> +#include <cppunit/TestFixture.h> +#include <cppunit/extensions/HelperMacros.h> +#include <cppunit/plugin/TestPlugIn.h> + +#include <tools/cpuid.hxx> + +namespace +{ +class CpuRuntimeDetection_SSSE3 : public CppUnit::TestFixture +{ +public: + void checkSSSE3(); + void testCpuRuntimeDetection(); + + CPPUNIT_TEST_SUITE(CpuRuntimeDetection_SSSE3); + CPPUNIT_TEST(testCpuRuntimeDetection); + CPPUNIT_TEST_SUITE_END(); +}; + +void CpuRuntimeDetection_SSSE3::testCpuRuntimeDetection() +{ + // can only run if this function if CPU supports SSSE3 + if (cpuid::isCpuInstructionSetSupported(cpuid::InstructionSetFlags::SSSE3)) + checkSSSE3(); +} + +void CpuRuntimeDetection_SSSE3::checkSSSE3() +{ + // Try some SSSE3 intrinsics calcualtion + __m128i a = _mm_set1_epi32(3); + __m128i b = _mm_set1_epi32(3); + __m128i c = _mm_maddubs_epi16(a, b); + + // Check result is 9 + CPPUNIT_ASSERT_EQUAL(0xFFFF, _mm_movemask_epi8(_mm_cmpeq_epi32(c, _mm_set1_epi32(9)))); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(CpuRuntimeDetection_SSSE3); + +} // end anonymous namespace + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |