Почему для сборки требуется повторная операция movzx на eax? - PullRequest
1 голос
/ 26 апреля 2020

Код - Разница в том, что один метод предназначен для коротких int со знаком, а другой для коротких int без знака.

short signedShortIntSwap(short int* a , short int* b)
{
    short tmp = *a;
    *a = *b;
    *b = tmp;
    return *a;
}

unsigned short unsignedShortIntSwap(unsigned short int* a ,unsigned short int* b)
{
    unsigned short tmp = *a;
    *a = *b;
    *b = tmp;
    return *a;
}

Сборка: - gcc -c -m64 -o func1 func1.c -O2 -fno-tree-vectorize

0000000000000000 <signedShortIntSwap>:
   0:   f3 0f 1e fa             endbr64 
   4:   0f b7 07                movzx  eax,WORD PTR [rdi]
   7:   0f b7 16                movzx  edx,WORD PTR [rsi]
   a:   66 89 17                mov    WORD PTR [rdi],dx
   d:   66 89 06                mov    WORD PTR [rsi],ax
  10:   0f b7 07                movzx  eax,WORD PTR [rdi]
  13:   c3                      ret    
  14:   66 66 2e 0f 1f 84 00    data16 nop WORD PTR cs:[rax+rax*1+0x0]
  1b:   00 00 00 00 
  1f:   90                      nop

0000000000000020 <unsignedShortIntSwap>:
  20:   f3 0f 1e fa             endbr64 
  24:   0f b7 07                movzx  eax,WORD PTR [rdi]
  27:   0f b7 16                movzx  edx,WORD PTR [rsi]
  2a:   66 89 17                mov    WORD PTR [rdi],dx
  2d:   66 89 06                mov    WORD PTR [rsi],ax
  30:   0f b7 07                movzx  eax,WORD PTR [rdi]
  33:   c3                      ret    
  34:   66 66 2e 0f 1f 84 00    data16 nop WORD PTR cs:[rax+rax*1+0x0]
  3b:   00 00 00 00 
  3f:   90                      nop
  1. Почему у нас movzx eax,WORD PTR [rdi] повторяется для каждой функции по адресу 4 && 10 и 24 && 30.
  2. Почему для функции как со знаком, так и без знака есть одинаковый набор команд. В каком случае это отличается?
...