| 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;
|
|
|