【问题标题】:gcc likely() unlikely() macros and assembly codegcc 可能()不太可能()宏和汇编代码
【发布时间】:2018-10-21 08:04:55
【问题描述】:

我想看看 gcc 的 likely()unlikely() 分支预测宏对汇编代码有何影响。在下面的代码中,无论我使用哪个宏,我都看不到生成的汇编代码有任何区别。关于发生了什么的任何指示?

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

汇编代码:

  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

【问题讨论】:

    标签: gcc compiler-optimization


    【解决方案1】:

    看起来你编译时没有优化。 Basic block reordering 是一个优化,所以没有它,__builtin_expect 没有这个效果。通过优化,我观察到切换预期结果时分支的感觉是反转的。

    请注意,这对当前的 x86 处理器是否有任何影响很难说。

    【讨论】:

    猜你喜欢
    • 2012-06-10
    • 2019-10-17
    • 1970-01-01
    • 2010-12-12
    • 2013-12-01
    • 2021-12-19
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多