Подтвердить что ты не робот

Загрузка небольших номеров в регистры 64 бит x86

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

mov     rdx, -1  //  48BAFFFFFFFFFFFFFFFF

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

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

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

... этот код операции принимает только 6 байтов.

ИЗМЕНИТЬ

Как говорит Jens Björnhager (я тестировал) xor edx, edx opcode должен очистить весь регистр rdx:

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

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

EDIT:

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

mov     rdx, -1  // 48C7C2FFFFFFFF

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

...

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Как сказать компилятору, у меня нет подсказки.

Ответ 3

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

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

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