我发现了一点好奇心;当我有很多优化标志时,GCC 似乎会生成以下代码:
00000000004019ae: test %si,%si
00000000004019b1: movups %xmm0,%xmm0
00000000004019b4: je 0x401f40 <main(int, char**)+1904>
问题:第二条指令的目的是什么?它看起来不像/做/任何事情;那么,在指令缓存中对齐程序是否有一些优化?或者是乱序执行的东西? (如果有帮助,我正在 Nehalem 上使用
-mtune=native
进行编译:D)。当然,没什么紧急的,只是好奇而已。
最佳答案
可能 xmm0
包含一些计算的结果,在整数域中完成(使用整数 SSE 指令)。并且下一条使用 xmm0
的指令预计在浮点域(浮点 SSE 指令)。
如果使用 xmm0
或 movaps
等指令将 movups
迁移到浮点域,Nehalem 可能会更快地执行下一条指令。并且在条件跳转指令之前执行这种迁移可能是有益的。在这种情况下,迁移只进行一次。如果没有使用 movups
指令,迁移可能会进行两次(自动,通过该寄存器上的第一条 FP 指令),第一次是推测性的,在错误预测的分支上,第二次 - 在正确的分支上。
编译器注意到,似乎优化计算依赖链比优化代码大小和执行资源更好。
关于optimization - gcc 生成的虚拟 movups,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8966519/