Прогноз ветки префикса Intel x86 0x2E / 0x3E действительно используется?

В последнем руководстве разработчика программного обеспечения Intel описываются два префикса кода операции:

Group 2 > Branch Hints

    0x2E: Branch Not Taken
    0x3E: Branch Taken

Они позволяют явное предсказание перехода команд перехода (коды операций, такие какJxx)

Я помню, как читал пару лет назад, что в x86 явное предсказание ветвлений было, по сути, бездействующим в контексте встроенных предсказаний ветвления gccs.

Теперь мне неясно, являются ли эти подсказки веток x86 новой функцией или они практически не используются на практике.

Кто-нибудь может это прояснить?

(То есть: генерируют ли функции прогнозирования ветвлений gccs эти подсказки веток x86? - и современные процессоры Intel не игнорируют их? - и когда это произошло?)

Обновить:

Я создал программу быстрого тестирования:

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

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

    return 3;
}

Разбирает на следующее:

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

Я не вижу 2E или 3E? Может быть, GCC исключил их по какой-то причине?

Ответы на вопрос(4)

Ваш ответ на вопрос