为什么 MSVC 对这种微不足道的事情使用 SSE2 指令?

Why does MSVC use SSE2 instruction for such trivial thing?

代码:

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] 

编辑: 我不确定 pushlea 是否与此初始化有关,也许是为了在那之后完成的工作,只是反汇编显示此 C++ 代码行。

SSE2 明显更好吗?除了它短了 2 条指令?这里做了什么优化?

如何发现:应用程序在不支持 SSE2 的旧处理器上开始失败。

英特尔优化参考手册第 3.8.1 节(优化浮点代码的指南)说 -

Enable the compiler’s use of SSE, SSE2 and more advanced SIMD instruction sets (e.g. AVX) with appropriate switches. Favor scalar SIMD code generation to replace x87 code generation.

3.8.5节继续解释:

Use Streaming SIMD Extensions 2 or Streaming SIMD Extensions unless you need an x87 feature. Most SSE2 arithmetic operations have shorter latency then their X87 counterpart and they eliminate the overhead associated with the management of the X87 register stack.