In the latest Intel software dev manual it describes two opcode prefixes:
Group 2 > Branch Hints 0x2E: Branch Not Taken 0x3E: Branch Taken
These allow for explicit branch prediction of Jump instructions (opcodes likeJxx
)
I remember reading a couple of years ago that on x86 explicit branch prediction was essentially a no-op in the context of gccs branch prediciton intrinsics.
I am now unclear if these x86 branch hints are a new feature or whether they are essentially no-ops in practice.
Can anyone clear this up?
(That is: Does gccs branch prediction functions generate these x86 branch hints? - and do current Intel CPUs not ignore them? - and when did this happen?)
Update:
I created a quick test program:
int main(int argc, char** argv){ if (__builtin_expect(argc,0)) return 1; if (__builtin_expect(argc == 2, 1)) return 2; return 3;}
Disassembles to the following:
00000000004004cc <main>: 4004cc: 55 push %rbp 4004cd: 48 89 e5 mov %rsp,%rbp 4004d0: 89 7d fc mov %edi,-0x4(%rbp) 4004d3: 48 89 75 f0 mov %rsi,-0x10(%rbp) 4004d7: 8b 45 fc mov -0x4(%rbp),%eax 4004da: 48 98 cltq 4004dc: 48 85 c0 test %rax,%rax 4004df: 74 07 je 4004e8 <main+0x1c> 4004e1: b8 01 00 00 00 mov $0x1,%eax 4004e6: eb 1b jmp 400503 <main+0x37> 4004e8: 83 7d fc 02 cmpl $0x2,-0x4(%rbp) 4004ec: 0f 94 c0 sete %al 4004ef: 0f b6 c0 movzbl %al,%eax 4004f2: 48 85 c0 test %rax,%rax 4004f5: 74 07 je 4004fe <main+0x32> 4004f7: b8 02 00 00 00 mov $0x2,%eax 4004fc: eb 05 jmp 400503 <main+0x37> 4004fe: b8 03 00 00 00 mov $0x3,%eax 400503: 5d pop %rbp 400504: c3 retq 400505: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 40050c: 00 00 00 40050f: 90 nop
I don't see 2E or 3E ? Maybe gcc has elided them for some reason?