海湾合作委员会的可能性()的可能性()宏和汇编代码

时间:2018-10-21 08:04:56

标签: gcc compiler-optimization

我正在尝试查看gcc的likely()unlikely()分支预测宏如何对汇编代码产生影响。在下面的代码中,无论我使用哪个宏,我都不会在生成的汇编代码中看到任何区别。有什么指示吗?

  0  int main() {
  1     volatile int x;
  2     unlikely(x)?x++:x--;
  3 }

Asm代码:

  0 0000000000000014 <main>:
  1 int main() {
  2   14:   55                      push   rbp
  3   15:   48 89 e5                mov    rbp,rsp
  4     volatile int x;
  5     likely(x)?x++:x--;
  6   18:   8b 45 fc                mov    eax,DWORD PTR [rbp-0x4]
  7   1b:   85 c0                   test   eax,eax
  8   1d:   0f 95 c0                setne  al
  9   20:   0f b6 c0                movzx  eax,al
 10   23:   48 85 c0                test   rax,rax
 11   26:   74 0b                   je     33 <main+0x1f>
 12   28:   8b 45 fc                mov    eax,DWORD PTR [rbp-0x4]
 13   2b:   83 c0 01                add    eax,0x1
 14   2e:   89 45 fc                mov    DWORD PTR [rbp-0x4],eax
 15   31:   eb 09                   jmp    3c <main+0x28>
 16   33:   8b 45 fc                mov    eax,DWORD PTR [rbp-0x4]
 17   36:   83 e8 01                sub    eax,0x1
 18   39:   89 45 fc                mov    DWORD PTR [rbp-0x4],eax
 19 }
 20   3c:   5d                      pop    rbp
 21   3d:   c3                      ret

1 个答案:

答案 0 :(得分:1)

您似乎在没有优化的情况下进行了编译。 Basic block reordering是一种优化,因此如果没有优化,__builtin_expect不会具有这种效果。通过优化,我观察到切换预期结果时分支的感觉是相反的。

请注意,这是否会对当前的x86处理器产生任何影响。