2014-01-13 2 views
5

Я заметил, что генератор кода GHC в настоящее время не выводит сборку, которая использует любой из нижних машинных регистров, например al. Даже операции по размеру байтов реализованы с использованием rax на 64 бит и eax на 32-разрядных машинах. Однако GCC часто использует эти меньшие регистры.Каковы преимущества использования меньших регистров, например. al vs eax/rax

Есть ли реальные преимущества при использовании небольших регистров как al?


Одно предложение, которое я слышал до сих пор является то, что опкод для inc al меньше inc rax (но не меньше, чем inc eax). Существуют ли другие соображения, связанные с отсутствием производительности, для использования небольших регистров?

+1

Некоторые инструкции по сдвигу принимают только 'cl'. В этом случае вы * обязаны * использовать небольшой регистр. – Mysticial

+1

В дополнение к меньшему кодированию некоторые инструкции просто быстрее с 8 бит, чем 32. –

+1

Я думаю, что ответ, как и все, подразумевается в кодировке. Я бы не использовал вывод GCC как ссылку. Документация Intel может/будет отображать кодировку для различных инструкций, и вы можете увидеть, например, если вы хотите добавить два небольших номера, которые вам не обязательно нужны на 64 бита, если, возможно, будет 16. Аналогично, один байт кода операции может выполняться для каждой команды, а не двух или более. Помимо бинарной выборки пропускной способности недвижимости, количества инструкций и размера каждого, тогда это становится проблемой микрокода, которая скрыта для нас. –

ответ

5

Для использования 64-разрядных регистров (rxx) на x86-64 требуются префиксы префиксов. Таким образом, инструкции длиннее, занимая больше места в памяти и кэше команд. Я не знаю, замедляет ли это декодирование. Размер кода может повредить производительность, если более крупный код используется в цикле, который не вписывается в кеш команд L1.

4

Если вы используете только al для 8-битного значения, он оставляет ah бесплатным для второго.

Грузовой топор против rax может обладает преимуществами пропускной способности памяти. Однако это также может вызвать проблемы. Надо быть осторожным.

+3

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

Смежные вопросы