76 lines
2.2 KiB
Plaintext
76 lines
2.2 KiB
Plaintext
- Assume NEON on FreeBSD armv7
|
|
- Implement NEON runtime detection on FreeBSD armv6
|
|
|
|
--- meson.build.orig 2018-12-11 14:14:56 UTC
|
|
+++ meson.build
|
|
@@ -147,6 +147,9 @@ if (host_machine.cpu_family() == 'aarch64' or
|
|
if cc.has_function('getauxval', prefix : '#include <sys/auxv.h>', args : test_args)
|
|
cdata.set('HAVE_GETAUXVAL', 1)
|
|
endif
|
|
+ if cc.has_function('elf_aux_info', prefix : '#include <sys/auxv.h>', args : test_args)
|
|
+ cdata.set('HAVE_ELF_AUX_INFO', 1)
|
|
+ endif
|
|
endif
|
|
|
|
# Compiler flag tests
|
|
--- src/arm/cpu.c.orig 2018-12-11 14:14:56 UTC
|
|
+++ src/arm/cpu.c
|
|
@@ -29,7 +29,7 @@
|
|
|
|
#include "src/arm/cpu.h"
|
|
|
|
-#if defined(HAVE_GETAUXVAL) && ARCH_ARM
|
|
+#if (defined(HAVE_GETAUXVAL) || defined(HAVE_ELF_AUX_INFO)) && ARCH_ARM
|
|
#include <sys/auxv.h>
|
|
|
|
#ifndef HWCAP_ARM_NEON
|
|
@@ -68,12 +68,48 @@ static unsigned parse_proc_cpuinfo(const char *flag) {
|
|
}
|
|
#endif
|
|
|
|
+#if defined(__FreeBSD__) && __FreeBSD__ < 12
|
|
+#include <sys/param.h>
|
|
+#include <sys/sysctl.h>
|
|
+#include <elf.h>
|
|
+#include <errno.h>
|
|
+#include <unistd.h>
|
|
+
|
|
+#define HAVE_GETAUXVAL
|
|
+#define NEON_HWCAP HWCAP_NEON
|
|
+static unsigned long getauxval(unsigned long type) {
|
|
+ Elf_Auxinfo auxv[AT_COUNT];
|
|
+ size_t len = sizeof(auxv);
|
|
+ int mib[] = {
|
|
+ CTL_KERN,
|
|
+ KERN_PROC,
|
|
+ KERN_PROC_AUXV,
|
|
+ getpid(),
|
|
+ };
|
|
+
|
|
+ if (sysctl(mib, nitems(mib), auxv, &len, NULL, 0) != -1) {
|
|
+ for (size_t i = 0; i < nitems(auxv); i++)
|
|
+ if ((unsigned long)auxv[i].a_type == type)
|
|
+ return auxv[i].a_un.a_val;
|
|
+
|
|
+ errno = ENOENT;
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+#endif
|
|
+
|
|
unsigned dav1d_get_cpu_flags_arm(void) {
|
|
unsigned flags = 0;
|
|
#if ARCH_AARCH64
|
|
flags |= DAV1D_ARM_CPU_FLAG_NEON;
|
|
+#elif defined(__ARM_NEON)
|
|
+ flags |= DAV1D_ARM_CPU_FLAG_NEON;
|
|
#elif defined(HAVE_GETAUXVAL) && ARCH_ARM
|
|
unsigned long hw_cap = getauxval(AT_HWCAP);
|
|
+ flags |= (hw_cap & NEON_HWCAP) ? DAV1D_ARM_CPU_FLAG_NEON : 0;
|
|
+#elif defined(HAVE_ELF_AUX_INFO) && ARCH_ARM
|
|
+ unsigned long hw_cap;
|
|
+ elf_aux_info(AT_HWCAP, &hw_cap, sizeof(hw_cap));
|
|
flags |= (hw_cap & NEON_HWCAP) ? DAV1D_ARM_CPU_FLAG_NEON : 0;
|
|
#elif defined(__ANDROID__)
|
|
flags |= parse_proc_cpuinfo("neon") ? DAV1D_ARM_CPU_FLAG_NEON : 0;
|