桜、抹茶、白、日記

名古屋市在住のC++使いのcoderの日記だったもの。

AMD Turion64

d:id:youandi:20060728#p3
Turion64Linux上でせかせかCPUID判定のコードを書いていて、SSE3の判定が有効になるのでアレ?と思っていたら正式対応していた。

[MYCOM] AMDが「Turion 64」を正式発表 - 90nm SOIでSSE3にも対応し25Wと35Wを用意
http://journal.mycom.co.jp/news/2005/03/10/008.html

あまり意識しないで購入していたな。因みになぜアレ?となったかというと、

 $ cat /proc/cpuid

とした際のflagsに「sse3」が無かったから。Pen4 3.4GHz(Prescot)上のKnoppix5.0.1で確認しても同じだったので、そういうもんなんだろう。
作ってみた確認コード。g++ 3.3.4, 3.4.5, 4.0.2では確認しているがVC++は未確認。バグっているのでそのまま流用すると多分痛い目に合います。

	int nECX	= 0;
	int nEDX	= 0;
#if defined(_MSC_VER)
	__asm {
		mov		eax,0x00000001;
		cpuid;
		mov		nEDX,edx;
		mov		nECX,ecx;
	}
#elif defined(__GNUC__)
	__asm__ __volatile__ (
		"  movl   $0x00000001,%%eax  \n\t"
		"  cpuid                         "
		: "=c" (nECX), "=d" (nEDX)
	);
#endif
	if ( nEDX & (1 << 23) ) { fprintf( stdout, "with MMX\n" ); }
	if ( nEDX & (1 << 25) ) { fprintf( stdout, "with SSE\n" ); }
	if ( nEDX & (1 << 26) ) { fprintf( stdout, "with SSE2\n" ); }
	if ( nECX & (1 <<  0) ) { fprintf( stdout, "with SSE3\n" ); }
	if ( nECX & (1 <<  9) ) { fprintf( stdout, "with SSE4\n" ); }

3DNow!関連

	int nEDX	= 0;
#if defined(_MSC_VER)
	__asm {
		mov		eax,0x80000001;
		cpuid;
		mov		nEDX,edx;
	}
#elif defined(__GNUC__)
	__asm__ __volatile__ (
		"  movl   $0x80000001,%%eax  \n\t"
		"  cpuid                         "
		: "=d" (nEDX)
	);
#endif
	if ( nEDX & (1 << 31) ) { fprintf( stdout, "with 3DNow!\n" ); }
	if ( nEDX & (1 << 30) ) { fprintf( stdout, "with Enhanced 3DNow!\n" ); }