为什么 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]
编辑: 我不确定 push
和 lea
是否与此初始化有关,也许是为了在那之后完成的工作,只是反汇编显示此 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.
代码:
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]
编辑: 我不确定 push
和 lea
是否与此初始化有关,也许是为了在那之后完成的工作,只是反汇编显示此 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.