Visual c++ 为什么MSVC会使用SSE2指令来处理这些琐碎的事情?
守则:Visual c++ 为什么MSVC会使用SSE2指令来处理这些琐碎的事情?,visual-c++,assembly,x86,sse,fpu,Visual C++,Assembly,X86,Sse,Fpu,守则: double Ret_Value=0; 在默认设置下,VS2012编译为: 10112128 xorps xmm0,xmm0 1011212E movsd mmword ptr [Ret_Value],xmm0 如果在项目设置中禁用SSE2,则会将其编译为: 101102AC fldz 101102AE lea eax,[Ret_Value] 101102B1 push eax 101102B2 fst
double Ret_Value=0;
在默认设置下,VS2012编译为:
10112128 xorps xmm0,xmm0
1011212E movsd mmword ptr [Ret_Value],xmm0
如果在项目设置中禁用SSE2,则会将其编译为:
101102AC fldz
101102AE lea eax,[Ret_Value]
101102B1 push eax
101102B2 fstp qword ptr [Ret_Value]
<>编辑:我不确定发现原因:该应用程序在不支持SSE2的旧处理器上开始出现故障。英特尔优化参考手册第3.8.1节(优化浮点代码的指南)说- 允许编译器使用SSE、SSE2和更高级的SIMD指令集(如AVX)以及适当的开关。 支持标量SIMD代码生成,以取代x87代码生成 第3.8.5节继续解释: 除非您需要x87功能,否则请使用第二代数据流单指令多数据扩展指令集或第二代数据流单指令多数据扩展指令集。大多数SSE2算术运算的延迟比X87算术运算的延迟要短,并且消除了与 X87寄存器堆栈的管理
我认为这是一个简单的代码大小优化。代码越短,缓存越友好,速度也就越快。此外,不使用堆栈可以节省一些内存访问。不确定中间的2条指令应该做什么。只需将
Ret_值设置为零
所需的就是fldz;fstp[Ret\u Value]
@Jester:可能是管道重新安排(混合浮动指令和非浮动指令),因为堆栈中的eax
稍后会被需要,我想对于函数调用或类似的东西。@Jester是的,确实lea和push似乎不必要,我会在它周围寻找更多的代码。检查,这解释了为什么FPU是邪恶的,英特尔决定取代它。编译器编写者们花了一段时间才效仿,微软是最后一个主流编译器。