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?

questionAnswers(4)

yourAnswerToTheQuestion