From 9886d897e27ac741daa92304fb0e7917ec701954 Mon Sep 17 00:00:00 2001 From: pkubaj Date: Tue, 21 Sep 2021 16:23:48 +0000 Subject: [PATCH] Fix AltiVec detection on FreeBSD The previous code was not correct, because there's no PPC_FEATURE_HAS_ALTIVEC MIB. Instead, elf vector check should be done. --- src/cpuinfo/SDL_cpuinfo.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/cpuinfo/SDL_cpuinfo.c b/src/cpuinfo/SDL_cpuinfo.c index 0205729ae..7f54c589e 100644 --- a/src/cpuinfo/SDL_cpuinfo.c +++ b/src/cpuinfo/SDL_cpuinfo.c @@ -50,10 +50,13 @@ #endif #if defined(__MACOSX__) && (defined(__ppc__) || defined(__ppc64__)) #include /* For AltiVec check */ -#elif (defined(__OpenBSD__) || defined(__FreeBSD__)) && defined(__powerpc__) +#elif defined(__OpenBSD__) && defined(__powerpc__) #include #include /* For AltiVec check */ #include +#elif defined(__FreeBSD__) && defined(__powerpc__) +#include +#include #elif SDL_ALTIVEC_BLITTERS && HAVE_SETJMP #include #include @@ -110,7 +113,7 @@ #define CPU_HAS_AVX512F (1 << 12) #define CPU_HAS_ARM_SIMD (1 << 13) -#if SDL_ALTIVEC_BLITTERS && HAVE_SETJMP && !__MACOSX__ && !__OpenBSD__ +#if SDL_ALTIVEC_BLITTERS && HAVE_SETJMP && !__MACOSX__ && !__OpenBSD__ && !__FreeBSD__ /* This is the brute force way of detecting instruction sets... the idea is borrowed from the libmpeg2 library - thanks! */ @@ -314,11 +317,9 @@ CPU_haveAltiVec(void) { volatile int altivec = 0; #ifndef SDL_CPUINFO_DISABLED -#if (defined(__MACOSX__) && (defined(__ppc__) || defined(__ppc64__))) || (defined(__OpenBSD__) && defined(__powerpc__)) || (defined(__FreeBSD__) && defined(__powerpc__)) +#if (defined(__MACOSX__) && (defined(__ppc__) || defined(__ppc64__))) || (defined(__OpenBSD__) && defined(__powerpc__)) #ifdef __OpenBSD__ int selectors[2] = { CTL_MACHDEP, CPU_ALTIVEC }; -#elif defined(__FreeBSD__) - int selectors[2] = { CTL_HW, PPC_FEATURE_HAS_ALTIVEC }; #else int selectors[2] = { CTL_HW, HW_VECTORUNIT }; #endif @@ -327,6 +328,11 @@ CPU_haveAltiVec(void) int error = sysctl(selectors, 2, &hasVectorUnit, &length, NULL, 0); if (0 == error) altivec = (hasVectorUnit != 0); +#elif defined(__FreeBSD__) && defined(__powerpc__) + unsigned long cpufeatures = 0; + elf_aux_info(AT_HWCAP, &cpufeatures, sizeof(cpufeatures)); + altivec = cpufeatures & PPC_FEATURE_HAS_ALTIVEC; + return altivec; #elif SDL_ALTIVEC_BLITTERS && HAVE_SETJMP void (*handler) (int sig); handler = signal(SIGILL, illegal_instruction);