Почему создается эта сборка ?: - PullRequest
2 голосов
/ 03 февраля 2012

После выполнения gcc -m64 -O test.c -save-temps я заметил, что: mov %edi, %edi появляется в сгенерированной сборке.Эта инструкция вообще что-нибудь делает?Он движется %edi в себя, фактически ничего не делая.

Все уровни оптимизации создают эту сборку, хотя в некоторых случаях она размещается по-разному.

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

Код процедуры:

 subl    $400, %edi
 cmpl    $20, %edi
 ja      .L4
 mov     %edi, %edi
 jmp     *.L11(,%rdi,8)

Это ссылка на таблицу переходов дляоператор переключения.

C Источник:

int main()
{

}

int thing(int x)
{

   switch(x)
   {
        case 400:
        return  1;
        break;
        case 404:
        return  2;
        break;
        case 408:
        return  3;
        break;
        case 412:
        return  4;
        break;
        case 416:
        return  5;
        break;
        case 420:
        return  6;
        break;
   }

}

1 Ответ

5 голосов
/ 03 февраля 2012

В 64-битном режиме инструкция mov при использовании в 32-битных регистрах обнуляет верхние 32-битные регистры назначения.

Итак:

mov %edi, %edi

очищает старшие 32 бита rdi.

http://en.wikipedia.org/wiki/MOV_%28x86_instruction%29 (прокрутить до конца)

...