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

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

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

当然,没什么紧急的,只是好奇而已。

最佳答案

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

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

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

关于optimization - gcc 生成的虚拟 movups,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8966519/

10-11 18:43