Index: source/libvpx/vpx_ports/x86.h |
diff --git a/source/libvpx/vpx_ports/x86.h b/source/libvpx/vpx_ports/x86.h |
index ae349fb84c631ea40a5cbbd084938fd56ef113f4..7d93710c4b0381ae0199172d2c57fa4e6232ce71 100644 |
--- a/source/libvpx/vpx_ports/x86.h |
+++ b/source/libvpx/vpx_ports/x86.h |
@@ -152,7 +152,7 @@ static INLINE int |
x86_simd_caps(void) { |
unsigned int flags = 0; |
unsigned int mask = ~0; |
- unsigned int reg_eax, reg_ebx, reg_ecx, reg_edx; |
+ unsigned int max_cpuid_val, reg_eax, reg_ebx, reg_ecx, reg_edx; |
char *env; |
(void)reg_ebx; |
@@ -168,9 +168,9 @@ x86_simd_caps(void) { |
mask = strtol(env, NULL, 0); |
/* Ensure that the CPUID instruction supports extended features */ |
- cpuid(0, 0, reg_eax, reg_ebx, reg_ecx, reg_edx); |
+ cpuid(0, 0, max_cpuid_val, reg_ebx, reg_ecx, reg_edx); |
- if (reg_eax < 1) |
+ if (max_cpuid_val < 1) |
return 0; |
/* Get the standard feature flags */ |
@@ -193,10 +193,12 @@ x86_simd_caps(void) { |
if ((xgetbv() & 0x6) == 0x6) { |
flags |= HAS_AVX; |
- /* Get the leaf 7 feature flags. Needed to check for AVX2 support */ |
- cpuid(7, 0, reg_eax, reg_ebx, reg_ecx, reg_edx); |
+ if (max_cpuid_val >= 7) { |
+ /* Get the leaf 7 feature flags. Needed to check for AVX2 support */ |
+ cpuid(7, 0, reg_eax, reg_ebx, reg_ecx, reg_edx); |
- if (reg_ebx & BIT(5)) flags |= HAS_AVX2; |
+ if (reg_ebx & BIT(5)) flags |= HAS_AVX2; |
+ } |
} |
} |