我正在尝试查看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
答案 0 :(得分:1)
您似乎在没有优化的情况下进行了编译。 Basic block reordering是一种优化,因此如果没有优化,__builtin_expect
不会具有这种效果。通过优化,我观察到切换预期结果时分支的感觉是相反的。
请注意,这是否会对当前的x86处理器产生任何影响。