由gcc生成的虚拟movup

vpo*_*man 4 optimization assembly gcc x86-64 low-level

我发现了一点点好奇心; 当我有很多优化标志时,GCC似乎生成以下代码:

00000000004019ae:   test %si,%si
00000000004019b1:   movups %xmm0,%xmm0
00000000004019b4:   je 0x401f40 <main(int, char**)+1904>
Run Code Online (Sandbox Code Playgroud)

问题:第二条指令的用途是什么?它看起来不像/做/什么; 那么,在指令缓存中对齐程序是否有一些优化?或者它是无序执行的东西?(-mtune=native如果有帮助,我正在Nehalem上编译:D).

没什么急事,当然,只是好奇.

Evg*_*uev 6

可能xmm0包含一些计算的结果,在整数域中完成(使用整数SSE指令).并且使用的下一条指令xmm0应该在浮点域(浮点SSE指令)中.

如果xmm0使用movaps或等指令迁移到浮点域,则Nehalem可以更快地执行下一条指令movups.在条件跳转指令之前执行此迁移可能是有益的.在这种情况下,迁移只进行一次.如果没有movups使用指令,则可以进行两次迁移(自动地,通过该寄存器上的第一个FP指令),第一次推测性地,在错误预测的分支上,以及第二次 - 在正确的分支上.

编译器注意到,似乎优化计算依赖链比优化代码大小和执行资源更好.

  • 我没有说什么转换成浮动.`movups`不会以任何方式更改寄存器内容.它会逐位复制寄存器.此外,它还准备将该寄存器由浮点执行单元处理(将寄存器的内容物理移动到CPU内核中的适当位置). (2认同)