Загрузка небольших чисел в 64-битные регистры x86 - PullRequest
3 голосов
/ 14 декабря 2011

Обычно под 64-битным процессором x86 мы загружаем число -1 для регистрации следующим образом:

mov     rdx, -1  //  48BAFFFFFFFFFFFFFFFF

... этот код операции занимает 10 байтов.

Другой способ:

xor     rdx, rdx //  4831D2        
dec     rdx      //  48FFCA  

... этот код операции занимает всего 6 байтов.

EDIT :

Как сказал Йенс Бьёрнхагер (я проверял) xor edx, edx код операции должен очистить весь регистр rdx:

xor     edx, edx //  31D2        
dec     rdx      //  48FFCA 

... этот код операции занимает всего 5 байтов.

РЕДАКТИРОВАТЬ:

Алекс находит другое решение:

mov     rdx, -1  // 48C7C2FFFFFFFF

... этот код операции занимает всего 7 байтов.Но как сказать компилятору использовать более короткий код операции (без использования БД)?

...

Что быстрее, а что экономичнее?

Ответы [ 3 ]

7 голосов
/ 28 декабря 2011

Это короче, чем все упомянутые: 4883CAFF OR rdx,-1
У него неприятное свойство ложной зависимости от всех архитектур, о которых я знаю, но это не должно остаться без упоминания IMO.Есть законные причины для его использования.Например, если результат не нужен, пока не пройдет много времени, и он находится в цикле, который в противном случае не поместился бы в четыре 16-байтовых блока.Кроме того, если скорость не имеет большого значения для определенного фрагмента кода, можно не тратить драгоценное пространство кеша.Это также может быть использовано по причинам выравнивания, но почти наверняка будет быстрее выполнить переход к следующему более высокому выравниванию.

Что касается сообщения компилятору, у меня нет подсказки.

5 голосов
/ 14 декабря 2011

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

Второй также имеет ложную зависимостьна значение rdx, что не первый.Некоторые процессоры могут быть достаточно умными, чтобы распознать эту ложную зависимость и не останавливать первую инструкцию до тех пор, пока не будет известно значение rdx (поскольку выходной результат равен нулю независимо от этого).Некоторые процессоры x86 имеют логику, чтобы игнорировать некоторые ложные зависимости.

Сравнение количества байтов кода не очень полезно.В самых реалистичных условиях очень маловероятно, что число байтов, которые занимает код, будет очень значительным.

3 голосов
/ 14 декабря 2011

Существует альтернативное 7-байтовое кодирование mov rdx, -1: 48C7C2FFFFFFFF.

Вы можете попробовать написать инструкцию как mov rdx, dword -1 в коде, чтобы помочь компилятору / ассемблеру использовать эту более короткую кодировку.

...