summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/util/u_cpu_detect.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/src/util/u_cpu_detect.c b/src/util/u_cpu_detect.c
index ae553d88701..960f990636d 100644
--- a/src/util/u_cpu_detect.c
+++ b/src/util/u_cpu_detect.c
@@ -60,6 +60,9 @@
#include <sys/auxv.h>
#define HAVE_ELF_AUX_INFO
#endif
+#if defined(PIPE_ARCH_PPC)
+#include <machine/cpu.h>
+#endif
#endif
#if defined(PIPE_OS_LINUX)
@@ -96,7 +99,7 @@ static int has_cpuid(void);
#endif
-#if defined(PIPE_ARCH_PPC) && !defined(PIPE_OS_APPLE) && !defined(PIPE_OS_LINUX)
+#if defined(PIPE_ARCH_PPC) && !defined(PIPE_OS_APPLE) && !defined(PIPE_OS_BSD) && !defined(PIPE_OS_LINUX)
static jmp_buf __lv_powerpc_jmpbuf;
static volatile sig_atomic_t __lv_powerpc_canjump = 0;
@@ -125,8 +128,12 @@ check_os_altivec_support(void)
#endif
#if defined(__ALTIVEC__) && defined(__VSX__)
/* Do nothing */
-#elif defined(PIPE_OS_APPLE)
+#elif defined(PIPE_OS_APPLE) || defined(PIPE_OS_NETBSD) || defined(PIPE_OS_OPENBSD)
+#ifdef HW_VECTORUNIT
int sels[2] = {CTL_HW, HW_VECTORUNIT};
+#else
+ int sels[2] = {CTL_MACHDEP, CPU_ALTIVEC};
+#endif
int has_vu = 0;
int len = sizeof (has_vu);
int err;
@@ -138,7 +145,19 @@ check_os_altivec_support(void)
util_cpu_caps.has_altivec = 1;
}
}
-#elif defined(PIPE_OS_LINUX) /* !PIPE_OS_APPLE */
+#elif defined(PIPE_OS_FREEBSD) /* !PIPE_OS_APPLE && !PIPE_OS_NETBSD && !PIPE_OS_OPENBSD */
+ unsigned long hwcap = 0;
+#ifdef HAVE_ELF_AUX_INFO
+ elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
+#else
+ size_t len = sizeof(hwcap);
+ sysctlbyname("hw.cpu_features", &hwcap, &len, NULL, 0);
+#endif
+ if (hwcap & PPC_FEATURE_HAS_ALTIVEC)
+ util_cpu_caps.has_altivec = 1;
+ if (hwcap & PPC_FEATURE_HAS_VSX)
+ util_cpu_caps.has_vsx = 1;
+#elif defined(PIPE_OS_LINUX) /* !PIPE_OS_FREEBSD */
#if defined(PIPE_ARCH_PPC_64)
Elf64_auxv_t aux;
#else
@@ -159,7 +178,7 @@ check_os_altivec_support(void)
}
close(fd);
}
-#else /* !PIPE_OS_APPLE && !PIPE_OS_LINUX */
+#else /* !PIPE_OS_APPLE && !PIPE_OS_BSD && !PIPE_OS_LINUX */
/* not on Apple/Darwin or Linux, do it the brute-force way */
/* this is borrowed from the libmpeg2 library */
signal(SIGILL, sigill_handler);