Intel x86 0x2E / 0x3E Prefixo Branch Prediction realmente usado?
No manual mais recente do software de desenvolvimento da Intel, descreve dois prefixos opcode:
Group 2 > Branch Hints
0x2E: Branch Not Taken
0x3E: Branch Taken
Isso permite a previsão explícita de ramificação das instruções de Jump (opcodes comoJxx
)
Lembro-me de ter lido há alguns anos que, em x86, a predição explícita de ramificação era essencialmente um não operacional no contexto de intrínsecos de predicção de ramificação de gccs.
Agora não estou claro se essas dicas de ramificação x86 são um novo recurso ou se elas são essencialmente não-operacionais na prática.
Alguém pode esclarecer isso?
(Isto é: as funções de previsão de ramificação do gccs geram essas dicas de ramificação do x86 - e os processadores atuais da Intel não as ignoram? - e quando isso aconteceu?)
Atualizar:
Eu criei um programa de teste rápido:
int main(int argc, char** argv)
{
if (__builtin_expect(argc,0))
return 1;
if (__builtin_expect(argc == 2, 1))
return 2;
return 3;
}
Desmonta para o seguinte:
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
Não vejo 2E ou 3E? Talvez o gcc os elimine por algum motivo?