Макросы и код ассемблера - PullRequest
       58

Макросы и код ассемблера

0 голосов
/ 21 октября 2018

Я пытаюсь понять, как макросы предсказания ветвлений gcc likely() и unlikely() влияют на код сборки.В следующем фрагменте кода я не вижу никакой разницы в сгенерированном коде сборки независимо от того, какой макрос я использую.Есть какие-нибудь указатели на то, что происходит?

  0  int main() {
  1     volatile int x;
  2     unlikely(x)?x++:x--;
  3 }

Asm code:

  0 0000000000000014 <main>:
  1 int main() {
  2   14:   55                      push   rbp
  3   15:   48 89 e5                mov    rbp,rsp
  4     volatile int x;
  5     likely(x)?x++:x--;
  6   18:   8b 45 fc                mov    eax,DWORD PTR [rbp-0x4]
  7   1b:   85 c0                   test   eax,eax
  8   1d:   0f 95 c0                setne  al
  9   20:   0f b6 c0                movzx  eax,al
 10   23:   48 85 c0                test   rax,rax
 11   26:   74 0b                   je     33 <main+0x1f>
 12   28:   8b 45 fc                mov    eax,DWORD PTR [rbp-0x4]
 13   2b:   83 c0 01                add    eax,0x1
 14   2e:   89 45 fc                mov    DWORD PTR [rbp-0x4],eax
 15   31:   eb 09                   jmp    3c <main+0x28>
 16   33:   8b 45 fc                mov    eax,DWORD PTR [rbp-0x4]
 17   36:   83 e8 01                sub    eax,0x1
 18   39:   89 45 fc                mov    DWORD PTR [rbp-0x4],eax
 19 }
 20   3c:   5d                      pop    rbp
 21   3d:   c3                      ret

1 Ответ

0 голосов
/ 21 октября 2018

Похоже, вы скомпилировали без оптимизации. Переупорядочение базовых блоков - это оптимизация, поэтому без нее __builtin_expect не имеет этого эффекта.С оптимизацией я наблюдаю, что смысл переключения переворачивается при переключении ожидаемого результата.

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

...