comparison cpudetect.c @ 8860:778989dba3a2

cpu cache line length detection from mplayerxp (Nick Kurshev <nickols_k@mail.ru>)
author arpi
date Thu, 09 Jan 2003 18:39:09 +0000
parents 9b73b801af55
children c428933c7e54
comparison
equal deleted inserted replaced
8859:fd13e4c4f323 8860:778989dba3a2
96 void GetCpuCaps( CpuCaps *caps) 96 void GetCpuCaps( CpuCaps *caps)
97 { 97 {
98 unsigned int regs[4]; 98 unsigned int regs[4];
99 unsigned int regs2[4]; 99 unsigned int regs2[4];
100 100
101 memset(caps, 0, sizeof(*caps));
101 caps->isX86=1; 102 caps->isX86=1;
102 103 caps->cl_size=32; /* default */
103 memset(caps, 0, sizeof(*caps));
104 if (!has_cpuid()) { 104 if (!has_cpuid()) {
105 mp_msg(MSGT_CPUDETECT,MSGL_WARN,"CPUID not supported!??? (maybe an old 486?)\n"); 105 mp_msg(MSGT_CPUDETECT,MSGL_WARN,"CPUID not supported!??? (maybe an old 486?)\n");
106 return; 106 return;
107 } 107 }
108 do_cpuid(0x00000000, regs); // get _max_ cpuid level and vendor name 108 do_cpuid(0x00000000, regs); // get _max_ cpuid level and vendor name
109 mp_msg(MSGT_CPUDETECT,MSGL_V,"CPU vendor name: %.4s%.4s%.4s max cpuid level: %d\n", 109 mp_msg(MSGT_CPUDETECT,MSGL_V,"CPU vendor name: %.4s%.4s%.4s max cpuid level: %d\n",
110 (char*) (regs+1),(char*) (regs+3),(char*) (regs+2), regs[0]); 110 (char*) (regs+1),(char*) (regs+3),(char*) (regs+2), regs[0]);
111 if (regs[0]>=0x00000001) 111 if (regs[0]>=0x00000001)
112 { 112 {
113 char *tmpstr; 113 char *tmpstr;
114 unsigned cl_size;
114 115
115 do_cpuid(0x00000001, regs2); 116 do_cpuid(0x00000001, regs2);
116 117
117 tmpstr=GetCpuFriendlyName(regs, regs2); 118 tmpstr=GetCpuFriendlyName(regs, regs2);
118 mp_msg(MSGT_CPUDETECT,MSGL_INFO,"CPU: %s ",tmpstr); 119 mp_msg(MSGT_CPUDETECT,MSGL_INFO,"CPU: %s ",tmpstr);
130 // general feature flags: 131 // general feature flags:
131 caps->hasMMX = (regs2[3] & (1 << 23 )) >> 23; // 0x0800000 132 caps->hasMMX = (regs2[3] & (1 << 23 )) >> 23; // 0x0800000
132 caps->hasSSE = (regs2[3] & (1 << 25 )) >> 25; // 0x2000000 133 caps->hasSSE = (regs2[3] & (1 << 25 )) >> 25; // 0x2000000
133 caps->hasSSE2 = (regs2[3] & (1 << 26 )) >> 26; // 0x4000000 134 caps->hasSSE2 = (regs2[3] & (1 << 26 )) >> 26; // 0x4000000
134 caps->hasMMX2 = caps->hasSSE; // SSE cpus supports mmxext too 135 caps->hasMMX2 = caps->hasSSE; // SSE cpus supports mmxext too
136 cl_size = ((regs2[1] >> 8) & 0xFF)*8;
137 if(cl_size) caps->cl_size = cl_size;
135 } 138 }
136 do_cpuid(0x80000000, regs); 139 do_cpuid(0x80000000, regs);
137 if (regs[0]>=0x80000001) { 140 if (regs[0]>=0x80000001) {
138 mp_msg(MSGT_CPUDETECT,MSGL_V,"extended cpuid-level: %d\n",regs[0]&0x7FFFFFFF); 141 mp_msg(MSGT_CPUDETECT,MSGL_V,"extended cpuid-level: %d\n",regs[0]&0x7FFFFFFF);
139 do_cpuid(0x80000001, regs2); 142 do_cpuid(0x80000001, regs2);
140 caps->hasMMX |= (regs2[3] & (1 << 23 )) >> 23; // 0x0800000 143 caps->hasMMX |= (regs2[3] & (1 << 23 )) >> 23; // 0x0800000
141 caps->hasMMX2 |= (regs2[3] & (1 << 22 )) >> 22; // 0x400000 144 caps->hasMMX2 |= (regs2[3] & (1 << 22 )) >> 22; // 0x400000
142 caps->has3DNow = (regs2[3] & (1 << 31 )) >> 31; //0x80000000 145 caps->has3DNow = (regs2[3] & (1 << 31 )) >> 31; //0x80000000
143 caps->has3DNowExt = (regs2[3] & (1 << 30 )) >> 30; 146 caps->has3DNowExt = (regs2[3] & (1 << 30 )) >> 30;
144 } 147 }
148 if(regs[0]>=0x80000006)
149 {
150 do_cpuid(0x80000006, regs2);
151 mp_msg(MSGT_CPUDETECT,MSGL_V,"extended cache-info: %d\n",regs2[2]&0x7FFFFFFF);
152 caps->cl_size = regs2[2] & 0xFF;
153 }
154 mp_msg(MSGT_CPUDETECT,MSGL_INFO,"Detected cache-line size is %u bytes\n",caps->cl_size);
145 #if 0 155 #if 0
146 mp_msg(MSGT_CPUDETECT,MSGL_INFO,"cpudetect: MMX=%d MMX2=%d SSE=%d SSE2=%d 3DNow=%d 3DNowExt=%d\n", 156 mp_msg(MSGT_CPUDETECT,MSGL_INFO,"cpudetect: MMX=%d MMX2=%d SSE=%d SSE2=%d 3DNow=%d 3DNowExt=%d\n",
147 gCpuCaps.hasMMX, 157 gCpuCaps.hasMMX,
148 gCpuCaps.hasMMX2, 158 gCpuCaps.hasMMX2,
149 gCpuCaps.hasSSE, 159 gCpuCaps.hasSSE,