Skip to content
Snippets Groups Projects
Commit 93f12c11 authored by Brad Smith's avatar Brad Smith Committed by Jean-Baptiste Kempf
Browse files

Provide dav1d_getauxval() wrapper for getauxvaul() and elf_aux_info()

parent a17c8625
No related branches found
No related tags found
1 merge request!1741Provide dav1d_getauxval() wrapper for getauxvaul() and elf_aux_info()
Pipeline #530811 passed with stages
in 38 minutes and 22 seconds
......@@ -43,15 +43,8 @@
#define HWCAP2_AARCH64_I8MM (1 << 13)
COLD unsigned dav1d_get_cpu_flags_arm(void) {
#if HAVE_GETAUXVAL
unsigned long hw_cap = getauxval(AT_HWCAP);
unsigned long hw_cap2 = getauxval(AT_HWCAP2);
#else
unsigned long hw_cap = 0;
unsigned long hw_cap2 = 0;
elf_aux_info(AT_HWCAP, &hw_cap, sizeof(hw_cap));
elf_aux_info(AT_HWCAP2, &hw_cap2, sizeof(hw_cap2));
#endif
unsigned long hw_cap = dav1d_getauxval(AT_HWCAP);
unsigned long hw_cap2 = dav1d_getauxval(AT_HWCAP2);
unsigned flags = dav1d_get_default_cpu_flags();
flags |= (hw_cap & HWCAP_AARCH64_ASIMDDP) ? DAV1D_ARM_CPU_FLAG_DOTPROD : 0;
......@@ -69,12 +62,7 @@ COLD unsigned dav1d_get_cpu_flags_arm(void) {
#define HWCAP_ARM_I8MM (1 << 27)
COLD unsigned dav1d_get_cpu_flags_arm(void) {
#if HAVE_GETAUXVAL
unsigned long hw_cap = getauxval(AT_HWCAP);
#else
unsigned long hw_cap = 0;
elf_aux_info(AT_HWCAP, &hw_cap, sizeof(hw_cap));
#endif
unsigned long hw_cap = dav1d_getauxval(AT_HWCAP);
unsigned flags = dav1d_get_default_cpu_flags();
flags |= (hw_cap & HWCAP_ARM_NEON) ? DAV1D_ARM_CPU_FLAG_NEON : 0;
......
......@@ -52,6 +52,10 @@
#endif
#endif
#if HAVE_GETAUXVAL || HAVE_ELF_AUX_INFO
#include <sys/auxv.h>
#endif
unsigned dav1d_cpu_flags = 0U;
unsigned dav1d_cpu_flags_mask = ~0U;
......@@ -107,3 +111,18 @@ COLD int dav1d_num_logical_processors(Dav1dContext *const c) {
dav1d_log(c, "Unable to detect thread count, defaulting to single-threaded mode\n");
return 1;
}
COLD unsigned long dav1d_getauxval(unsigned long type) {
#if HAVE_GETAUXVAL
return getauxval(type);
#elif HAVE_ELF_AUX_INFO
unsigned long aux = 0;
int ret = elf_aux_info(type, &aux, sizeof(aux));
if (ret != 0)
errno = ret;
return aux;
#else
errno = ENOSYS;
return 0;
#endif
}
......@@ -53,6 +53,7 @@ EXTERN unsigned dav1d_cpu_flags_mask;
void dav1d_init_cpu(void);
DAV1D_API void dav1d_set_cpu_flags_mask(unsigned mask);
int dav1d_num_logical_processors(Dav1dContext *c);
unsigned long dav1d_getauxval(unsigned long);
static ALWAYS_INLINE unsigned dav1d_get_default_cpu_flags(void) {
unsigned flags = 0;
......
......@@ -40,7 +40,7 @@
COLD unsigned dav1d_get_cpu_flags_loongarch(void) {
unsigned flags = dav1d_get_default_cpu_flags();
#if HAVE_GETAUXVAL
unsigned long hw_cap = getauxval(AT_HWCAP);
unsigned long hw_cap = dav1d_getauxval(AT_HWCAP);
flags |= (hw_cap & LA_HWCAP_LSX) ? DAV1D_LOONGARCH_CPU_FLAG_LSX : 0;
flags |= (hw_cap & LA_HWCAP_LASX) ? DAV1D_LOONGARCH_CPU_FLAG_LASX : 0;
#endif
......
......@@ -39,16 +39,9 @@
COLD unsigned dav1d_get_cpu_flags_ppc(void) {
unsigned flags = dav1d_get_default_cpu_flags();
#if HAVE_GETAUXVAL && ARCH_PPC64LE
unsigned long hw_cap = getauxval(AT_HWCAP);
unsigned long hw_cap2 = getauxval(AT_HWCAP2);
#elif HAVE_ELF_AUX_INFO && ARCH_PPC64LE
unsigned long hw_cap = 0;
unsigned long hw_cap2 = 0;
elf_aux_info(AT_HWCAP, &hw_cap, sizeof(hw_cap));
elf_aux_info(AT_HWCAP2, &hw_cap2, sizeof(hw_cap2));
#endif
#if HAVE_AUX
unsigned long hw_cap = dav1d_getauxval(AT_HWCAP);
unsigned long hw_cap2 = dav1d_getauxval(AT_HWCAP2);
flags |= (hw_cap & PPC_FEATURE_HAS_VSX) ? DAV1D_PPC_CPU_FLAG_VSX : 0;
flags |= (hw_cap2 & PPC_FEATURE2_ARCH_3_00) ? DAV1D_PPC_CPU_FLAG_PWR9 : 0;
#endif
......
......@@ -44,7 +44,7 @@ int dav1d_has_compliant_rvv(void);
COLD unsigned dav1d_get_cpu_flags_riscv(void) {
unsigned flags = dav1d_get_default_cpu_flags();
#if HAVE_GETAUXVAL
unsigned long hw_cap = getauxval(AT_HWCAP);
unsigned long hw_cap = dav1d_getauxval(AT_HWCAP);
flags |= (hw_cap & HWCAP_RVV) && dav1d_has_compliant_rvv() ? DAV1D_RISCV_CPU_FLAG_V : 0;
#endif
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment