¿Predicción de rama de prefijo Intel x86 0x2E / 0x3E realmente utilizada?
En el último manual de desarrollo de software Intel se describen dos prefijos de código de operación:
Group 2 > Branch Hints
0x2E: Branch Not Taken
0x3E: Branch Taken
Estos permiten una predicción explícita de las instrucciones de salto (códigos de operación comoJxx
)
Recuerdo haber leído hace un par de años que, en x86, la predicción explícita de rama era esencialmente una no operación en el contexto de los intrínsecos de predicción de rama de gccs.
Ahora no estoy claro si estos consejos de rama x86 son una característica nueva o si son esencialmente no operativos en la práctica.
¿Alguien puede aclarar esto?
(Es decir: ¿las funciones de predicción de rama gccs generan estas sugerencias de rama x86? ¿Y las CPU actuales de Intel no las ignoran? ¿Y cuándo sucedió esto?)
Actualizar:
He creado un programa de prueba rápida:
int main(int argc, char** argv)
{
if (__builtin_expect(argc,0))
return 1;
if (__builtin_expect(argc == 2, 1))
return 2;
return 3;
}
Desmonta lo siguiente:
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
No veo 2E o 3E? Tal vez gcc los ha eluido por alguna razón?