changeset 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 fd13e4c4f323
children d2cb317c7f16
files cpudetect.c cpudetect.h
diffstat 2 files changed, 13 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/cpudetect.c	Thu Jan 09 18:28:56 2003 +0000
+++ b/cpudetect.c	Thu Jan 09 18:39:09 2003 +0000
@@ -98,9 +98,9 @@
 	unsigned int regs[4];
 	unsigned int regs2[4];
 
+	memset(caps, 0, sizeof(*caps));
 	caps->isX86=1;
-
-	memset(caps, 0, sizeof(*caps));
+	caps->cl_size=32; /* default */
 	if (!has_cpuid()) {
 	    mp_msg(MSGT_CPUDETECT,MSGL_WARN,"CPUID not supported!??? (maybe an old 486?)\n");
 	    return;
@@ -111,6 +111,7 @@
 	if (regs[0]>=0x00000001)
 	{
 		char *tmpstr;
+		unsigned cl_size;
 
 		do_cpuid(0x00000001, regs2);
 
@@ -132,6 +133,8 @@
 		caps->hasSSE  = (regs2[3] & (1 << 25 )) >> 25; // 0x2000000
 		caps->hasSSE2 = (regs2[3] & (1 << 26 )) >> 26; // 0x4000000
 		caps->hasMMX2 = caps->hasSSE; // SSE cpus supports mmxext too
+		cl_size = ((regs2[1] >> 8) & 0xFF)*8;
+		if(cl_size) caps->cl_size = cl_size;
 	}
 	do_cpuid(0x80000000, regs);
 	if (regs[0]>=0x80000001) {
@@ -142,6 +145,13 @@
 		caps->has3DNow    = (regs2[3] & (1 << 31 )) >> 31; //0x80000000
 		caps->has3DNowExt = (regs2[3] & (1 << 30 )) >> 30;
 	}
+	if(regs[0]>=0x80000006)
+	{
+		do_cpuid(0x80000006, regs2);
+		mp_msg(MSGT_CPUDETECT,MSGL_V,"extended cache-info: %d\n",regs2[2]&0x7FFFFFFF);
+		caps->cl_size  = regs2[2] & 0xFF;
+	}
+	mp_msg(MSGT_CPUDETECT,MSGL_INFO,"Detected cache-line size is %u bytes\n",caps->cl_size);
 #if 0
 	mp_msg(MSGT_CPUDETECT,MSGL_INFO,"cpudetect: MMX=%d MMX2=%d SSE=%d SSE2=%d 3DNow=%d 3DNowExt=%d\n",
 		gCpuCaps.hasMMX,
--- a/cpudetect.h	Thu Jan 09 18:28:56 2003 +0000
+++ b/cpudetect.h	Thu Jan 09 18:39:09 2003 +0000
@@ -16,6 +16,7 @@
 	int hasSSE;
 	int hasSSE2;
 	int isX86;
+	unsigned cl_size; /* size of cache line */
 } CpuCaps;
 
 extern CpuCaps gCpuCaps;