代码:

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节(优化浮点代码的准则)说-


通过适当的开关,启用编译器对SSE,SSE2和更高级的SIMD指令集(例如AVX)的使用。
支持标量SIMD代码生成,以取代x87代码生成。


第3.8.5节继续说明:


除非需要x87功能,否则请使用Streaming SIMD Extensions 2或Streaming SIMD Extensions。大多数SSE2算术运算的等待时间短于X87对应的运算,并且消除了与
X87寄存器堆栈的管理。

关于visual-c++ - MSVC为什么对这种琐碎的事情使用SSE2指令?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28108244/

10-11 15:18