multimedia/libvpx: simplify NEON/VSX detection on FreeBSD 12

This commit is contained in:
Jan Beich 2018-12-04 00:51:30 +00:00
parent 17d20df4a3
commit 3366163855
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=486564
4 changed files with 43 additions and 33 deletions

View file

@ -12,16 +12,14 @@
int aom_arm_cpu_caps(void) {
/* This function should actually be a no-op. There is no way to adjust any of
@@ -143,7 +143,61 @@ int aom_arm_cpu_caps(void) {
@@ -143,7 +143,57 @@ int aom_arm_cpu_caps(void) {
}
return flags & mask;
}
-#else /* end __linux__ */
+#elif defined(__FreeBSD__)
+
+#if 0 // __has_include(<sys/auxv.h>)
+#include <sys/auxv.h>
+#else
+#if __FreeBSD__ < 12
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <elf.h>
@ -47,31 +45,29 @@
+ }
+ return 0;
+}
+#endif
+
+#ifndef AT_HWCAP
+#define AT_HWCAP 25 /* 16 on Linux */
+#endif
+
+#ifndef HWCAP_NEON
+#define HWCAP_NEON (1 << 12)
+#else
+#include <sys/auxv.h>
+#endif
+
+int aom_arm_cpu_caps(void) {
+ int flags;
+ int mask;
+ unsigned long hwcaps;
+ u_long hwcaps = 0;
+ if (!arm_cpu_env_flags(&flags)) {
+ return flags;
+ }
+ mask = arm_cpu_env_mask();
+#if __FreeBSD__ < 12
+ hwcaps = getauxval(AT_HWCAP);
+#else
+ elf_aux_info(AT_HWCAP, &hwcaps, sizeof(hwcaps));
+#endif
+#if HAVE_NEON
+ if (hwcaps & HWCAP_NEON) flags |= HAS_NEON;
+#endif
+ return flags & mask;
+}
+#else /* end __FreeBSD__ */
+#else /* end __FreeBSD__ */
#error \
"--enable-runtime-cpu-detect selected, but no CPU detection method " \
"available for your platform. Reconfigure with --disable-runtime-cpu-detect."

View file

@ -29,20 +29,23 @@
int ppc_simd_caps(void) {
int flags;
int mask;
@@ -75,6 +76,36 @@ out_close:
@@ -75,6 +76,44 @@ out_close:
close(fd);
return flags & mask;
}
+#elif defined(__FreeBSD__)
+#if __FreeBSD__ < 12
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#else
+#include <sys/auxv.h>
+#endif
+#include <machine/cpu.h>
+
+int ppc_simd_caps(void) {
+ int flags;
+ int mask;
+ u_long cpu_features = 0;
+ size_t sz = sizeof(cpu_features);
+
+ // If AOM_SIMD_CAPS is set then allow only those capabilities.
+ if (!cpu_env_flags(&flags)) {
@ -51,7 +54,12 @@
+
+ mask = cpu_env_mask();
+
+#if __FreeBSD__ < 12
+ size_t sz = sizeof(cpu_features);
+ sysctlbyname("hw.cpu_features", &cpu_features, &sz, NULL, 0);
+#else
+ elf_aux_info(AT_HWCAP, &cpu_features, sizeof(cpu_features));
+#endif
+#if HAVE_VSX
+ if (cpu_features & PPC_FEATURE_HAS_VSX) flags |= HAS_VSX;
+#endif

View file

@ -1,14 +1,13 @@
--- vpx_ports/arm_cpudetect.c.orig 2017-01-12 20:27:27 UTC
+++ vpx_ports/arm_cpudetect.c
@@ -147,6 +147,60 @@ int arm_cpu_caps(void) {
@@ -147,7 +147,57 @@ int arm_cpu_caps(void) {
}
return flags & mask;
}
-#else /* end __linux__ */
+#elif defined(__FreeBSD__)
+
+#if 0 // __has_include(<sys/auxv.h>)
+#include <sys/auxv.h>
+#else
+#if __FreeBSD__ < 12
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <elf.h>
@ -34,30 +33,29 @@
+ }
+ return 0;
+}
+#endif
+
+#ifndef AT_HWCAP
+#define AT_HWCAP 25 /* 16 on Linux */
+#endif
+
+#ifndef HWCAP_NEON
+#define HWCAP_NEON (1 << 12)
+#else
+#include <sys/auxv.h>
+#endif
+
+int arm_cpu_caps(void) {
+ int flags;
+ int mask;
+ unsigned long hwcaps;
+ u_long hwcaps = 0;
+ if (!arm_cpu_env_flags(&flags)) {
+ return flags;
+ }
+ mask = arm_cpu_env_mask();
+#if __FreeBSD__ < 12
+ hwcaps = getauxval(AT_HWCAP);
+#else
+ elf_aux_info(AT_HWCAP, &hwcaps, sizeof(hwcaps));
+#endif
+#if HAVE_NEON || HAVE_NEON_ASM
+ if (hwcaps & HWCAP_NEON) flags |= HAS_NEON;
+#endif
+ return flags & mask;
+}
#else /* end __linux__ */
+#else /* end __FreeBSD__ */
#error \
"--enable-runtime-cpu-detect selected, but no CPU detection method " \
"available for your platform. Reconfigure with --disable-runtime-cpu-detect."

View file

@ -27,20 +27,23 @@
int ppc_simd_caps(void) {
int flags;
int mask;
@@ -73,6 +74,36 @@ out_close:
@@ -73,6 +74,44 @@ out_close:
close(fd);
return flags & mask;
}
+#elif defined(__FreeBSD__)
+#if __FreeBSD__ < 12
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#else
+#include <sys/auxv.h>
+#endif
+#include <machine/cpu.h>
+
+int ppc_simd_caps(void) {
+ int flags;
+ int mask;
+ u_long cpu_features = 0;
+ size_t sz = sizeof(cpu_features);
+
+ // If VPX_SIMD_CAPS is set then allow only those capabilities.
+ if (!cpu_env_flags(&flags)) {
@ -49,7 +52,12 @@
+
+ mask = cpu_env_mask();
+
+#if __FreeBSD__ < 12
+ size_t sz = sizeof(cpu_features);
+ sysctlbyname("hw.cpu_features", &cpu_features, &sz, NULL, 0);
+#else
+ elf_aux_info(AT_HWCAP, &cpu_features, sizeof(cpu_features));
+#endif
+#if HAVE_VSX
+ if (cpu_features & PPC_FEATURE_HAS_VSX) flags |= HAS_VSX;
+#endif
@ -60,7 +68,7 @@
+#error \
+ "--enable-runtime-cpu-detect selected, but no CPU detection method " \
+"available for your platform. Reconfigure with --disable-runtime-cpu-detect."
+#endif /* end __linux__ */
+#endif /* end __FreeBSD__ */
#else
// If there is no RTCD the function pointers are not used and can not be
// changed.