由gcc生成的虚拟movup

时间:2012-01-23 02:06:11

标签: optimization gcc assembly x86-64 low-level

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:2)

除了Evgeny Kluev提出的假设之外,其他可能性(无特定顺序)是(a)它是编译器优化器错误,(b)插入movups以破坏依赖关系或(c)它是为了代码对齐而插入的。