2012-02-02 3 views
2

После выполнения 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; 
    } 

} 
+0

Попробуйте более высокий уровень оптимизации? '-O2'? – Mysticial

+0

На самом деле, можете ли вы показать больше сборки вокруг этой инструкции? (включая адреса) – Mysticial

+0

Хм ... можете ли вы также показать источник этого фрагмента? – Mysticial

ответ

5

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

Итак:

mov %edi, %edi 

очищает верхние 32 бита rdi.

http://en.wikipedia.org/wiki/MOV_%28x86_instruction%29 (прокрутите весь путь вниз)

+0

Doh! Я должен был понять. Спасибо за помощь. Мне нужно немного подойти к этой архитектуре. –

+0

Я подозревал это с самого начала, но мне не удалось найти источник для этого. Затем, когда вы разместили источник (без 64-битных значений), стало ясно. – Mysticial

+0

Я просто продолжу это, сказав, что ** все ** 32-разрядные инструкции в 64-битном режиме очищают верхние (63-32) биты соответствующих регистров. Источник: Руководство по оптимизации Intel, глава 9.2.1 «Использование устаревших 32-разрядных инструкций, когда размер данных составляет 32 бит». –