Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ 为什么MSVC会使用SSE2指令来处理这些琐碎的事情?_Visual C++_Assembly_X86_Sse_Fpu - Fatal编程技术网

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] 
<>编辑:我不确定推< /COD>和 LEA与这个初始化有关,也许是在之后的事情,只是拆卸显示它们的C++代码行。 SSE2是否明显更好?除了短两条指令?这里做了什么样的优化


发现原因:该应用程序在不支持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是邪恶的,英特尔决定取代它。编译器编写者们花了一段时间才效仿,微软是最后一个主流编译器。