管理人様へ
最近のコンパイラはMMXだけでなくSSE命令にも対応してきているので、SSE命令の取得機能を追加してみました。おそらくバグはないと思います。よりしければ使ってください。
WINDATA構造体のメンバにint型でUseSSEFlagとUseSSE2Flagを追加して、その状態を得る関数を追加して、その後以下のようにDxWin.cppを以下のようにしてください。
あとはGetUseSSEFlag関数等を適当に追加してください。
DxWin.cppの変更点その1
CHECKMMX:
// 今度はMMXが使えるか検査
MOV EAX , 1
}
// db 0fh
// db 0a2h
cpuid
__asm{
AND EDX , 00800000H
JZ MMXEND
MOV ENDMODE , 3
//SSEが使えるか検査
MOV EAX , 1
}
cpuid
__asm{
AND EDX , 02000000H
JZ MMXEND
ADD ENDMODE , 1
//SSE2が使えるか検査
MOV EAX , 1
}
cpuid
__asm{
AND EDX , 04000000H
JZ MMXEND
ADD ENDMODE , 1
MMXEND:
POPFD
}
DxWin.cppの変更点その2
switch( ENDMODE )
{
case 0 :
DXST_ERRORLOG_ADD( "CPUID命令は使えません\n" );
break ;
case 1 :
DXST_ERRORLOG_ADD( "MMXは使えません\n" );
break ;
case 3 :
DXST_ERRORLOG_ADD( "MMX命令を使用します\n" ) ;
WinData.UseMMXFlag = TRUE ;
break ;
case 4 :
DXST_ERRORLOG_ADD( "MMX命令を使用します\n" ) ;
DXST_ERRORLOG_ADD( "SSE命令が使用可能です\n" ) ;
WinData.UseMMXFlag = TRUE ;
WinData.UseSSEFlag = TRUE ;
case 5 :
DXST_ERRORLOG_ADD( "MMX命令を使用します\n" ) ;
DXST_ERRORLOG_ADD( "SSE命令が使用可能です\n" ) ;
DXST_ERRORLOG_ADD( "SSE2命令が使用可能です\n" ) ;
WinData.UseMMXFlag = TRUE ;
WinData.UseSSEFlag = TRUE ;
WinData.UseSSE2Flag = TRUE ;
}