00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <stdlib.h>
00024 #include "dsputil.h"
00025
00026 #undef printf
00027
00028 #ifdef ARCH_X86_64
00029 # define REG_b "rbx"
00030 # define REG_S "rsi"
00031 #else
00032 # define REG_b "ebx"
00033 # define REG_S "esi"
00034 #endif
00035
00036
00037 #define cpuid(index,eax,ebx,ecx,edx)\
00038 __asm __volatile\
00039 ("mov %%"REG_b", %%"REG_S"\n\t"\
00040 "cpuid\n\t"\
00041 "xchg %%"REG_b", %%"REG_S\
00042 : "=a" (eax), "=S" (ebx),\
00043 "=c" (ecx), "=d" (edx)\
00044 : "0" (index));
00045
00046
00047 int mm_support(void)
00048 {
00049 int rval = 0;
00050 int eax, ebx, ecx, edx;
00051 int max_std_level, max_ext_level, std_caps=0, ext_caps=0;
00052 long a, c;
00053
00054 __asm__ __volatile__ (
00055
00056
00057 "pushf\n\t"
00058 "pop %0\n\t"
00059 "mov %0, %1\n\t"
00060
00061
00062
00063 "xor $0x200000, %0\n\t"
00064 "push %0\n\t"
00065 "popf\n\t"
00066
00067
00068 "pushf\n\t"
00069 "pop %0\n\t"
00070 : "=a" (a), "=c" (c)
00071 :
00072 : "cc"
00073 );
00074
00075 if (a == c)
00076 return 0;
00077
00078 cpuid(0, max_std_level, ebx, ecx, edx);
00079
00080 if(max_std_level >= 1){
00081 cpuid(1, eax, ebx, ecx, std_caps);
00082 if (std_caps & (1<<23))
00083 rval |= FF_MM_MMX;
00084 if (std_caps & (1<<25))
00085 rval |= FF_MM_MMXEXT | FF_MM_SSE;
00086 if (std_caps & (1<<26))
00087 rval |= FF_MM_SSE2;
00088 if (ecx & 1)
00089 rval |= FF_MM_SSE3;
00090 if (ecx & 0x00000200 )
00091 rval |= FF_MM_SSSE3;
00092 }
00093
00094 cpuid(0x80000000, max_ext_level, ebx, ecx, edx);
00095
00096 if(max_ext_level >= 0x80000001){
00097 cpuid(0x80000001, eax, ebx, ecx, ext_caps);
00098 if (ext_caps & (1<<31))
00099 rval |= FF_MM_3DNOW;
00100 if (ext_caps & (1<<30))
00101 rval |= FF_MM_3DNOWEXT;
00102 if (ext_caps & (1<<23))
00103 rval |= FF_MM_MMX;
00104 if (ext_caps & (1<<22))
00105 rval |= FF_MM_MMXEXT;
00106 }
00107
00108 #if 0
00109 av_log(NULL, AV_LOG_DEBUG, "%s%s%s%s%s%s%s%s\n",
00110 (rval&FF_MM_MMX) ? "MMX ":"",
00111 (rval&FF_MM_MMXEXT) ? "MMX2 ":"",
00112 (rval&FF_MM_SSE) ? "SSE ":"",
00113 (rval&FF_MM_SSE2) ? "SSE2 ":"",
00114 (rval&FF_MM_SSE3) ? "SSE3 ":"",
00115 (rval&FF_MM_SSSE3) ? "SSSE3 ":"",
00116 (rval&FF_MM_3DNOW) ? "3DNow ":"",
00117 (rval&FF_MM_3DNOWEXT) ? "3DNowExt ":"");
00118 #endif
00119 return rval;
00120 }
00121
00122 #ifdef TEST
00123 int main ( void )
00124 {
00125 int mm_flags;
00126 mm_flags = mm_support();
00127 printf("mm_support = 0x%08X\n",mm_flags);
00128 return 0;
00129 }
00130 #endif