mirror of
https://code.videolan.org/videolan/dav1d
synced 2026-06-11 04:03:05 +00:00
Allow compile time CPU detection to be used when trim_dsp is disabled
This commit is contained in:
committed by
Martin Storsjö
co-authored by
Martin Storsjö
parent
41511bf12e
commit
4104018949
+11
-17
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user