Index: source/libvpx/vpx_ports/x86.h |
=================================================================== |
--- source/libvpx/vpx_ports/x86.h (revision 240950) |
+++ source/libvpx/vpx_ports/x86.h (working copy) |
@@ -35,51 +35,63 @@ |
#if defined(__GNUC__) && __GNUC__ || defined(__ANDROID__) |
#if ARCH_X86_64 |
-#define cpuid(func,ax,bx,cx,dx)\ |
+#define cpuid(func, func2, ax, bx, cx, dx)\ |
__asm__ __volatile__ (\ |
"cpuid \n\t" \ |
: "=a" (ax), "=b" (bx), "=c" (cx), "=d" (dx) \ |
- : "a" (func)); |
+ : "a" (func), "c" (func2)); |
#else |
-#define cpuid(func,ax,bx,cx,dx)\ |
+#define cpuid(func, func2, ax, bx, cx, dx)\ |
__asm__ __volatile__ (\ |
"mov %%ebx, %%edi \n\t" \ |
"cpuid \n\t" \ |
"xchg %%edi, %%ebx \n\t" \ |
: "=a" (ax), "=D" (bx), "=c" (cx), "=d" (dx) \ |
- : "a" (func)); |
+ : "a" (func), "c" (func2)); |
#endif |
#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) /* end __GNUC__ or __ANDROID__*/ |
#if ARCH_X86_64 |
-#define cpuid(func,ax,bx,cx,dx)\ |
+#define cpuid(func, func2, ax, bx, cx, dx)\ |
asm volatile (\ |
"xchg %rsi, %rbx \n\t" \ |
"cpuid \n\t" \ |
"movl %ebx, %edi \n\t" \ |
"xchg %rsi, %rbx \n\t" \ |
: "=a" (ax), "=D" (bx), "=c" (cx), "=d" (dx) \ |
- : "a" (func)); |
+ : "a" (func), "c" (func2)); |
#else |
-#define cpuid(func,ax,bx,cx,dx)\ |
+#define cpuid(func, func2, ax, bx, cx, dx)\ |
asm volatile (\ |
"pushl %ebx \n\t" \ |
"cpuid \n\t" \ |
"movl %ebx, %edi \n\t" \ |
"popl %ebx \n\t" \ |
: "=a" (ax), "=D" (bx), "=c" (cx), "=d" (dx) \ |
- : "a" (func)); |
+ : "a" (func), "c" (func2)); |
#endif |
#else /* end __SUNPRO__ */ |
#if ARCH_X86_64 |
+#if defined(_MSC_VER) && _MSC_VER > 1500 |
+void __cpuidex(int CPUInfo[4], int info_type, int ecxvalue); |
+#pragma intrinsic(__cpuidex) |
+#define cpuid(func, func2, a, b, c, d) do {\ |
+ int regs[4];\ |
+ __cpuidex(regs, func, func2); \ |
+ a = regs[0]; b = regs[1]; c = regs[2]; d = regs[3];\ |
+ } while(0) |
+#else |
void __cpuid(int CPUInfo[4], int info_type); |
#pragma intrinsic(__cpuid) |
-#define cpuid(func,a,b,c,d) do{\ |
+#define cpuid(func, func2, a, b, c, d) do {\ |
int regs[4];\ |
- __cpuid(regs,func); a=regs[0]; b=regs[1]; c=regs[2]; d=regs[3];\ |
- } while(0) |
+ __cpuid(regs, func); \ |
+ a = regs[0]; b = regs[1]; c = regs[2]; d = regs[3];\ |
+ } while (0) |
+#endif |
#else |
-#define cpuid(func,a,b,c,d)\ |
+#define cpuid(func, func2, a, b, c, d)\ |
__asm mov eax, func\ |
+ __asm mov ecx, func2\ |
__asm cpuid\ |
__asm mov a, eax\ |
__asm mov b, ebx\ |
@@ -120,13 +132,13 @@ |
mask = strtol(env, NULL, 0); |
/* Ensure that the CPUID instruction supports extended features */ |
- cpuid(0, reg_eax, reg_ebx, reg_ecx, reg_edx); |
+ cpuid(0, 0, reg_eax, reg_ebx, reg_ecx, reg_edx); |
if (reg_eax < 1) |
return 0; |
/* Get the standard feature flags */ |
- cpuid(1, reg_eax, reg_ebx, reg_ecx, reg_edx); |
+ cpuid(1, 0, reg_eax, reg_ebx, reg_ecx, reg_edx); |
if (reg_edx & BIT(23)) flags |= HAS_MMX; |
@@ -142,6 +154,11 @@ |
if (reg_ecx & BIT(28)) flags |= HAS_AVX; |
+ /* Get the leaf 7 feature flags. Needed to check for AVX2 support */ |
+ reg_eax = 7; |
+ reg_ecx = 0; |
+ cpuid(7, 0, reg_eax, reg_ebx, reg_ecx, reg_edx); |
+ |
if (reg_ebx & BIT(5)) flags |= HAS_AVX2; |
return flags & mask; |