代码:
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的旧处理器上开始失败。
答案 0 :(得分:3)
英特尔优化参考手册第3.8.1节(优化浮点代码的指南)说 -
使编译器能够使用适当的开关使用SSE,SSE2和更高级的SIMD指令集(例如AVX)。 支持标量SIMD代码生成以替换x87代码生成。
第3.8.5节继续解释:
除非您需要x87功能,否则请使用Streaming SIMD Extensions 2或Streaming SIMD Extensions。大多数SSE2算术运算具有比X87对应的更短的延迟,并且它们消除了与之相关的开销 管理X87寄存器堆栈。