Intel x86 0x2E / 0x3E Predykcja rozgałęzienia faktycznie używana?

W najnowszym podręczniku oprogramowania Intel opisuje dwa prefiksy kodu:

Group 2 > Branch Hints

    0x2E: Branch Not Taken
    0x3E: Branch Taken

Umożliwiają one wyraźne przewidywanie rozgałęzień instrukcji Jump (opcodes jakJxx)

Pamiętam, że przeczytałem kilka lat temu, że w jawnym przewidywaniu gałęzi x86 było zasadniczo no-op w kontekście intrinsics predykcyjnych gałęzi gccs.

Nie jestem teraz pewien, czy te wskazówki dla oddziałów x86 są nową funkcją lub czy w praktyce są one operacjami typu no-op.

Czy ktoś może to wyjaśnić?

(Czyli: Czy funkcje przewidywania rozgałęzień gccs generują te wskazówki gałęzi x86? - a czy obecne procesory Intel nie ignorują ich? - a kiedy to się stało?)

Aktualizacja:

Stworzyłem szybki program testowy:

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

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

    return 3;
}

Demontuje do następujących:

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

Nie widzę 2E ani 3E? Może gcc z jakiegoś powodu ich opuścił?

questionAnswers(4)

yourAnswerToTheQuestion