X86 为什么将立即值移动到寄存器然后将其添加到第二个寄存器比添加立即值更快?

X86 为什么将立即值移动到寄存器然后将其添加到第二个寄存器比添加立即值更快?,x86,inline-assembly,amd,micro-optimization,X86,Inline Assembly,Amd,Micro Optimization,为什么将立即值移动到寄存器,然后将其添加到第二个寄存器会更快 增加即时价值 ;this is faster, test result : 1976.805144 cycles mov eax,7efefeffh add ebx, eax ;this is slower, test result : 2009.428059 cycles add ebx,7efefeffh 注: 然而,结果是针对应用程序基准测试的,而不仅仅是针对这些指令 代码中没有任何其他变化 两者使用

为什么将立即值移动到寄存器,然后将其添加到第二个寄存器会更快 增加即时价值

;this is faster, test result : 1976.805144 cycles
mov     eax,7efefeffh
add     ebx, eax

;this is slower, test result : 2009.428059 cycles
add     ebx,7efefeffh
注: 然而,结果是针对应用程序基准测试的,而不仅仅是针对这些指令 代码中没有任何其他变化 两者使用相同的测试数据 结果变化+/-5个周期
我有一个AMD E350处理器

可能是较大的代码导致了后续指令的不同对齐方式,而这恰好造成了差异。否则,这是一个循环的一部分,通过EAX或AL存在错误的依赖关系。根据Agner Fog的Microach指南(),
添加ebx,imm32是一个单uop,可以在AMD的Bobcat Microach上高效解码(这就是E350:)。我们需要一个包含完整循环的real,而不仅仅是您更改的指令,以便能够说出任何有用的内容。