diff --git a/modules/core/src/system.cpp b/modules/core/src/system.cpp index ad688a6c68..d0412a36e5 100644 --- a/modules/core/src/system.cpp +++ b/modules/core/src/system.cpp @@ -128,11 +128,14 @@ void* allocSingletonNewBuffer(size_t size) { return malloc(size); } #endif -#if CV_VSX && defined __linux__ +#if (defined __ppc64__ || defined __PPC64__) && defined __linux__ # include "sys/auxv.h" # ifndef AT_HWCAP2 # define AT_HWCAP2 26 # endif +# ifndef PPC_FEATURE2_ARCH_2_07 +# define PPC_FEATURE2_ARCH_2_07 0x80000000 +# endif # ifndef PPC_FEATURE2_ARCH_3_00 # define PPC_FEATURE2_ARCH_3_00 0x00800000 # endif @@ -587,14 +590,25 @@ struct HWFeatures #ifdef __mips_msa have[CV_CPU_MSA] = true; #endif - // there's no need to check VSX availability in runtime since it's always available on ppc64le CPUs - have[CV_CPU_VSX] = (CV_VSX); - // TODO: Check VSX3 availability in runtime for other platforms - #if CV_VSX && defined __linux__ - uint64 hwcap2 = getauxval(AT_HWCAP2); - have[CV_CPU_VSX3] = (hwcap2 & PPC_FEATURE2_ARCH_3_00); + + #if (defined __ppc64__ || defined __PPC64__) && defined __linux__ + unsigned int hwcap = getauxval(AT_HWCAP); + if (hwcap & PPC_FEATURE_HAS_VSX) { + hwcap = getauxval(AT_HWCAP2); + if (hwcap & PPC_FEATURE2_ARCH_3_00) { + have[CV_CPU_VSX] = have[CV_CPU_VSX3] = true; + } else { + have[CV_CPU_VSX] = (hwcap & PPC_FEATURE2_ARCH_2_07) != 0; + } + } #else - have[CV_CPU_VSX3] = (CV_VSX3); + // TODO: AIX, FreeBSD + #if CV_VSX || defined _ARCH_PWR8 || defined __POWER9_VECTOR__ + have[CV_CPU_VSX] = true; + #endif + #if CV_VSX3 || defined __POWER9_VECTOR__ + have[CV_CPU_VSX3] = true; + #endif #endif bool skip_baseline_check = false;