diff options
Diffstat (limited to 'src/3rdparty/libwebp/src/dsp/cpu.c')
-rw-r--r-- | src/3rdparty/libwebp/src/dsp/cpu.c | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/src/3rdparty/libwebp/src/dsp/cpu.c b/src/3rdparty/libwebp/src/dsp/cpu.c index ef04a75..8844cb4 100644 --- a/src/3rdparty/libwebp/src/dsp/cpu.c +++ b/src/3rdparty/libwebp/src/dsp/cpu.c @@ -13,7 +13,7 @@ #include "./dsp.h" -#if defined(__ANDROID__) +#if defined(WEBP_ANDROID_NEON) #include <cpu-features.h> #endif @@ -31,6 +31,18 @@ static WEBP_INLINE void GetCPUInfo(int cpu_info[4], int info_type) { : "=a"(cpu_info[0]), "=D"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3]) : "a"(info_type), "c"(0)); } +#elif defined(__x86_64__) && \ + (defined(__code_model_medium__) || defined(__code_model_large__)) && \ + defined(__PIC__) +static WEBP_INLINE void GetCPUInfo(int cpu_info[4], int info_type) { + __asm__ volatile ( + "xchg{q}\t{%%rbx}, %q1\n" + "cpuid\n" + "xchg{q}\t{%%rbx}, %q1\n" + : "=a"(cpu_info[0]), "=&r"(cpu_info[1]), "=c"(cpu_info[2]), + "=d"(cpu_info[3]) + : "a"(info_type), "c"(0)); +} #elif defined(__i386__) || defined(__x86_64__) static WEBP_INLINE void GetCPUInfo(int cpu_info[4], int info_type) { __asm__ volatile ( @@ -79,7 +91,16 @@ static WEBP_INLINE uint64_t xgetbv(void) { #if defined(__i386__) || defined(__x86_64__) || defined(WEBP_MSC_SSE2) static int x86CPUInfo(CPUFeature feature) { + int max_cpuid_value; int cpu_info[4]; + + // get the highest feature value cpuid supports + GetCPUInfo(cpu_info, 0); + max_cpuid_value = cpu_info[0]; + if (max_cpuid_value < 1) { + return 0; + } + GetCPUInfo(cpu_info, 1); if (feature == kSSE2) { return 0 != (cpu_info[3] & 0x04000000); @@ -87,6 +108,9 @@ static int x86CPUInfo(CPUFeature feature) { if (feature == kSSE3) { return 0 != (cpu_info[2] & 0x00000001); } + if (feature == kSSE4_1) { + return 0 != (cpu_info[2] & 0x00080000); + } if (feature == kAVX) { // bits 27 (OSXSAVE) & 28 (256-bit AVX) if ((cpu_info[2] & 0x18000000) == 0x18000000) { @@ -95,7 +119,7 @@ static int x86CPUInfo(CPUFeature feature) { } } if (feature == kAVX2) { - if (x86CPUInfo(kAVX)) { + if (x86CPUInfo(kAVX) && max_cpuid_value >= 7) { GetCPUInfo(cpu_info, 7); return ((cpu_info[1] & 0x00000020) == 0x00000020); } @@ -122,10 +146,14 @@ static int armCPUInfo(CPUFeature feature) { return 1; } VP8CPUInfo VP8GetCPUInfo = armCPUInfo; -#elif defined(WEBP_USE_MIPS32) +#elif defined(WEBP_USE_MIPS32) || defined(WEBP_USE_MIPS_DSP_R2) static int mipsCPUInfo(CPUFeature feature) { - (void)feature; - return 1; + if ((feature == kMIPS32) || (feature == kMIPSdspR2)) { + return 1; + } else { + return 0; + } + } VP8CPUInfo VP8GetCPUInfo = mipsCPUInfo; #else |