Allow compile time CPU detection to be used when trim_dsp is disabled

This commit is contained in:
Cameron Cawley
2024-08-29 20:58:31 +00:00
committed by Martin Storsjö
co-authored by Martin Storsjö
parent 41511bf12e
commit 4104018949
6 changed files with 33 additions and 26 deletions
+11 -17
View File
@@ -29,6 +29,7 @@
#include "common/attributes.h"
#include "src/cpu.h"
#include "src/arm/cpu.h"
#if defined(HAVE_GETAUXVAL) || defined(HAVE_ELF_AUX_INFO)
@@ -52,7 +53,7 @@ COLD unsigned dav1d_get_cpu_flags_arm(void) {
elf_aux_info(AT_HWCAP2, &hw_cap2, sizeof(hw_cap2));
#endif
unsigned flags = DAV1D_ARM_CPU_FLAG_NEON;
unsigned flags = dav1d_get_default_cpu_flags();
flags |= (hw_cap & HWCAP_AARCH64_ASIMDDP) ? DAV1D_ARM_CPU_FLAG_DOTPROD : 0;
flags |= (hw_cap2 & HWCAP2_AARCH64_I8MM) ? DAV1D_ARM_CPU_FLAG_I8MM : 0;
flags |= (hw_cap & HWCAP_AARCH64_SVE) ? DAV1D_ARM_CPU_FLAG_SVE : 0;
@@ -75,7 +76,8 @@ COLD unsigned dav1d_get_cpu_flags_arm(void) {
elf_aux_info(AT_HWCAP, &hw_cap, sizeof(hw_cap));
#endif
unsigned flags = (hw_cap & HWCAP_ARM_NEON) ? DAV1D_ARM_CPU_FLAG_NEON : 0;
unsigned flags = dav1d_get_default_cpu_flags();
flags |= (hw_cap & HWCAP_ARM_NEON) ? DAV1D_ARM_CPU_FLAG_NEON : 0;
flags |= (hw_cap & HWCAP_ARM_ASIMDDP) ? DAV1D_ARM_CPU_FLAG_DOTPROD : 0;
flags |= (hw_cap & HWCAP_ARM_I8MM) ? DAV1D_ARM_CPU_FLAG_I8MM : 0;
return flags;
@@ -95,7 +97,7 @@ static int have_feature(const char *feature) {
}
COLD unsigned dav1d_get_cpu_flags_arm(void) {
unsigned flags = DAV1D_ARM_CPU_FLAG_NEON;
unsigned flags = dav1d_get_default_cpu_flags();
if (have_feature("hw.optional.arm.FEAT_DotProd"))
flags |= DAV1D_ARM_CPU_FLAG_DOTPROD;
if (have_feature("hw.optional.arm.FEAT_I8MM"))
@@ -104,16 +106,14 @@ COLD unsigned dav1d_get_cpu_flags_arm(void) {
return flags;
}
#elif defined(__OpenBSD__)
#if ARCH_AARCH64
#elif defined(__OpenBSD__) && ARCH_AARCH64
#include <machine/armreg.h>
#include <machine/cpu.h>
#include <sys/types.h>
#include <sys/sysctl.h>
COLD unsigned dav1d_get_cpu_flags_arm(void) {
unsigned flags = DAV1D_ARM_CPU_FLAG_NEON;
unsigned flags = dav1d_get_default_cpu_flags();
#ifdef CPU_ID_AA64ISAR0
int mib[2];
@@ -142,19 +142,12 @@ COLD unsigned dav1d_get_cpu_flags_arm(void) {
return flags;
}
#else /* !ARCH_AARCH64 */
COLD unsigned dav1d_get_cpu_flags_arm(void) {
unsigned flags = DAV1D_ARM_CPU_FLAG_NEON;
return flags;
}
#endif /* ARCH_AARCH64 */
#elif defined(_WIN32)
#include <windows.h>
COLD unsigned dav1d_get_cpu_flags_arm(void) {
unsigned flags = DAV1D_ARM_CPU_FLAG_NEON;
unsigned flags = dav1d_get_default_cpu_flags();
#ifdef PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE
if (IsProcessorFeaturePresent(PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE))
flags |= DAV1D_ARM_CPU_FLAG_DOTPROD;
@@ -219,7 +212,8 @@ static unsigned parse_proc_cpuinfo(const char *flag) {
}
COLD unsigned dav1d_get_cpu_flags_arm(void) {
unsigned flags = parse_proc_cpuinfo("neon") ? DAV1D_ARM_CPU_FLAG_NEON : 0;
unsigned flags = dav1d_get_default_cpu_flags();
flags |= parse_proc_cpuinfo("neon") ? DAV1D_ARM_CPU_FLAG_NEON : 0;
flags |= parse_proc_cpuinfo("asimd") ? DAV1D_ARM_CPU_FLAG_NEON : 0;
flags |= parse_proc_cpuinfo("asimddp") ? DAV1D_ARM_CPU_FLAG_DOTPROD : 0;
flags |= parse_proc_cpuinfo("i8mm") ? DAV1D_ARM_CPU_FLAG_I8MM : 0;
@@ -233,7 +227,7 @@ COLD unsigned dav1d_get_cpu_flags_arm(void) {
#else /* Unsupported OS */
COLD unsigned dav1d_get_cpu_flags_arm(void) {
return 0;
return dav1d_get_default_cpu_flags();
}
#endif
+13 -5
View File
@@ -54,12 +54,9 @@ void dav1d_init_cpu(void);
DAV1D_API void dav1d_set_cpu_flags_mask(unsigned mask);
int dav1d_num_logical_processors(Dav1dContext *c);
static ALWAYS_INLINE unsigned dav1d_get_cpu_flags(void) {
unsigned flags = dav1d_cpu_flags & dav1d_cpu_flags_mask;
static ALWAYS_INLINE unsigned dav1d_get_default_cpu_flags(void) {
unsigned flags = 0;
#if TRIM_DSP_FUNCTIONS
/* Since this function is inlined, unconditionally setting a flag here will
* enable dead code elimination in the calling function. */
#if ARCH_AARCH64 || ARCH_ARM
#if defined(__ARM_NEON) || defined(__APPLE__) || defined(_WIN32) || ARCH_AARCH64
flags |= DAV1D_ARM_CPU_FLAG_NEON;
@@ -119,6 +116,17 @@ static ALWAYS_INLINE unsigned dav1d_get_cpu_flags(void) {
flags |= DAV1D_X86_CPU_FLAG_SSE2;
#endif
#endif
return flags;
}
static ALWAYS_INLINE unsigned dav1d_get_cpu_flags(void) {
unsigned flags = dav1d_cpu_flags & dav1d_cpu_flags_mask;
#if TRIM_DSP_FUNCTIONS
/* Since this function is inlined, unconditionally setting a flag here will
* enable dead code elimination in the calling function. */
flags |= dav1d_get_default_cpu_flags();
#endif
return flags;
+3 -1
View File
@@ -26,6 +26,8 @@
#include "config.h"
#include "common/attributes.h"
#include "src/cpu.h"
#include "src/loongarch/cpu.h"
#if defined(HAVE_GETAUXVAL)
@@ -36,7 +38,7 @@
#endif
COLD unsigned dav1d_get_cpu_flags_loongarch(void) {
unsigned flags = 0;
unsigned flags = dav1d_get_default_cpu_flags();
#if defined(HAVE_GETAUXVAL)
unsigned long hw_cap = getauxval(AT_HWCAP);
flags |= (hw_cap & LA_HWCAP_LSX) ? DAV1D_LOONGARCH_CPU_FLAG_LSX : 0;
+2 -1
View File
@@ -29,6 +29,7 @@
#include "common/attributes.h"
#include "src/cpu.h"
#include "src/ppc/cpu.h"
#if (defined(HAVE_GETAUXVAL) || defined(HAVE_ELF_AUX_INFO)) && ARCH_PPC64LE
@@ -37,7 +38,7 @@
#endif
COLD unsigned dav1d_get_cpu_flags_ppc(void) {
unsigned flags = 0;
unsigned flags = dav1d_get_default_cpu_flags();
#if defined(HAVE_GETAUXVAL) && ARCH_PPC64LE
unsigned long hw_cap = getauxval(AT_HWCAP);
unsigned long hw_cap2 = getauxval(AT_HWCAP2);
+2 -1
View File
@@ -29,6 +29,7 @@
#include "common/attributes.h"
#include "src/cpu.h"
#include "src/riscv/cpu.h"
#if defined(HAVE_GETAUXVAL)
@@ -41,7 +42,7 @@
int dav1d_has_compliant_rvv(void);
COLD unsigned dav1d_get_cpu_flags_riscv(void) {
unsigned flags = 0;
unsigned flags = dav1d_get_default_cpu_flags();
#if defined(HAVE_GETAUXVAL)
unsigned long hw_cap = getauxval(AT_HWCAP);
flags |= (hw_cap & HWCAP_RVV) && dav1d_has_compliant_rvv() ? DAV1D_RISCV_CPU_FLAG_V : 0;
+2 -1
View File
@@ -32,6 +32,7 @@
#include "common/attributes.h"
#include "src/cpu.h"
#include "src/x86/cpu.h"
typedef struct {
@@ -52,7 +53,7 @@ COLD unsigned dav1d_get_cpu_flags_x86(void) {
};
} cpu;
dav1d_cpu_cpuid(&cpu.r, 0, 0);
unsigned flags = 0;
unsigned flags = dav1d_get_default_cpu_flags();
if (cpu.max_leaf >= 1) {
CpuidRegisters r;