Viusal C++ .NET 2003 的 nox87copy
這曾經是個 x86 的 Optimize 功能
但是發生了 KB822412 的問題
就是當你的 Floating Point 是有問題的
而且有開 Floating Point Exception 的時候
會因為這個 Optimize 導致 miss 掉
所以之後的 Visual Studio 2003 Service Pack 1
就出現這個指令來控制
但是 Visual C++ 2005 之後就沒這個指令了
原因不明... 但是昨天終於讓我找到了
功能還是在的, 只是沒被列在 Options 裡面
很簡單, 就是 -d2QInomapX87 (大小寫必須一致)
範例
struct Coord
{
Coord (float x, float y)
:X (x), Y (y) {}
float X;
float Y;
};
Coord foo ()
{
return Coord (1.0f, 2.0f);
}
沒開 nox87copy
fld1
mov eax,dword ptr [esp+4]
fstp dword ptr [eax]
fld dword ptr [__real@40000000]
fstp dword ptr [eax+4]
ret
開 nox87copy
mov eax,dword ptr [esp+4]
mov dword ptr [eax],3F800000h
mov dword ptr [eax+4],40000000h
ret
果然簡潔, 連 x87 都不用跑了
但是發生了 KB822412 的問題
就是當你的 Floating Point 是有問題的
而且有開 Floating Point Exception 的時候
會因為這個 Optimize 導致 miss 掉
所以之後的 Visual Studio 2003 Service Pack 1
就出現這個指令來控制
但是 Visual C++ 2005 之後就沒這個指令了
原因不明... 但是昨天終於讓我找到了
功能還是在的, 只是沒被列在 Options 裡面
很簡單, 就是 -d2QInomapX87 (大小寫必須一致)
範例
struct Coord
{
Coord (float x, float y)
:X (x), Y (y) {}
float X;
float Y;
};
Coord foo ()
{
return Coord (1.0f, 2.0f);
}
沒開 nox87copy
fld1
mov eax,dword ptr [esp+4]
fstp dword ptr [eax]
fld dword ptr [__real@40000000]
fstp dword ptr [eax+4]
ret
開 nox87copy
mov eax,dword ptr [esp+4]
mov dword ptr [eax],3F800000h
mov dword ptr [eax+4],40000000h
ret
果然簡潔, 連 x87 都不用跑了
0 Comments:
張貼留言
<< Home