diff options
-rw-r--r-- | libass/ass_utils.c | 3 | ||||
-rw-r--r-- | libass/x86/cpuid.asm | 24 | ||||
-rw-r--r-- | libass/x86/cpuid.h | 1 |
3 files changed, 28 insertions, 0 deletions
diff --git a/libass/ass_utils.c b/libass/ass_utils.c index 0acc891..a9db9be 100644 --- a/libass/ass_utils.c +++ b/libass/ass_utils.c @@ -40,6 +40,9 @@ void ass_cpu_capabilities(bool *sse2, bool *avx2) *sse2 = false; *avx2 = false; + if (!ass_has_cpuid()) + return; + uint32_t eax = 0, ebx, ecx, edx; ass_get_cpuid(&eax, &ebx, &ecx, &edx); uint32_t max_leaf = eax; diff --git a/libass/x86/cpuid.asm b/libass/x86/cpuid.asm index 09b3e77..b27d906 100644 --- a/libass/x86/cpuid.asm +++ b/libass/x86/cpuid.asm @@ -23,6 +23,30 @@ SECTION .text ;------------------------------------------------------------------------------ +; uint32_t has_cpuid( void ); +;------------------------------------------------------------------------------ + +INIT_XMM +cglobal has_cpuid, 0, 0, 0 +%if ARCH_X86_64 + mov eax, 1 +%else + pushfd + pop ecx + mov eax, ecx + xor eax, 0x00200000 + push eax + popfd + pushfd + pop eax + xor eax, ecx + and eax, 0x00200000 ; non-zero if bit is writable + push ecx ; Restore original EFLAGS + popfd +%endif + RET + +;------------------------------------------------------------------------------ ; void get_cpuid( uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx); ;------------------------------------------------------------------------------ diff --git a/libass/x86/cpuid.h b/libass/x86/cpuid.h index ab50292..0218cde 100644 --- a/libass/x86/cpuid.h +++ b/libass/x86/cpuid.h @@ -21,6 +21,7 @@ #include <stdint.h> +uint32_t ass_has_cpuid( void ); void ass_get_cpuid( uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx); void ass_get_xgetbv( uint32_t op, uint32_t *eax, uint32_t *edx ); |