GCC热点?

Luí*_*ier 5 c assembly gcc

当我编译这段代码时

unsigned char A[] = {1, 2, 3, 4};

unsigned int
f (unsigned int x)
{
  return A[x];
}
Run Code Online (Sandbox Code Playgroud)

gcc输出

mov edi, edi
movzx  eax, BYTE PTR A[rdi]
ret
Run Code Online (Sandbox Code Playgroud)

在x86_64机器上.

问题是:为什么有nop指令(mov edi,edi)?

我正在使用gcc-4.4.4.

jil*_*les 3

在 64 位模式下,mov edi, edi不是无操作。它的作用是将 的前 32 位设置rdi为 0。

这是一般事实的特例,即所有 32 位操作都会在 64 位模式下清除目标寄存器的高 32 位。(与保持不变相比,这允许更高效的 CPU,并且可能也更有用。)