¿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?

Respuestas a la pregunta(4)

Su respuesta a la pregunta