multimedia/libvpx: simplify NEON/VSX detection on FreeBSD 12
This commit is contained in:
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
|
@ -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."
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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."
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in a new issue