Intel x86 0x2E / 0x3E-Präfix-Verzweigungsvorhersage tatsächlich verwendet?

Im neuesten Intel Software-Entwicklerhandbuch werden zwei Opcode-Präfixe beschrieben:

Group 2 > Branch Hints

    0x2E: Branch Not Taken
    0x3E: Branch Taken

Diese ermöglichen eine explizite Verzweigungsvorhersage von Sprungbefehlen (Opcodes wieJxx)

Ich erinnere mich, dass ich vor ein paar Jahren gelesen habe, dass die explizite Verzweigungsvorhersage auf x86 im Wesentlichen ein No-Op im Kontext der Intrinsics der GCCs-Verzweigungsvorhersage war.

Ich bin jetzt unklar, ob diese x86-Verzweigungshinweise eine neue Funktion sind oder ob es sich in der Praxis im Wesentlichen um No-Ops handelt.

Kann jemand das klären?

(Das heißt: Werden diese x86-Verzweigungshinweise von gccs-Verzweigungsvorhersagefunktionen generiert? - und werden sie von aktuellen Intel-CPUs nicht ignoriert? - und wann ist dies geschehen?)

Aktualisieren:

Ich habe ein schnelles Testprogramm erstellt:

int main(int argc, char** argv)
{
    if (__builtin_expect(argc,0))
        return 1;

    if (__builtin_expect(argc == 2, 1))
        return 2;

    return 3;
}

Zerlegt folgendes:

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

Ich sehe weder 2E noch 3E? Vielleicht hat gcc sie aus irgendeinem Grund ausgemerzt?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage