Начиная с 32-разрядного режима ЦП, для архитектуры x86 доступны расширенные адресные операнды. Можно указать базовый адрес, смещение, индексный регистр и коэффициент масштабирования.Как операнд адреса влияет на производительность и размер машинного кода?
Например, мы хотели бы шагать через список 32-битные целые числа (каждый первые два из массива 32-байтовые длинных структур данных, %rdi
как индекс данных, %rbx
в качестве указателя базы).
addl $8, %rdi # skip eight values: advance index by 8
movl (%rbx, %rdi, 4), %eax # load data: pointer + scaled index
movl 4(%rbx, %rdi, 4), %edx # load data: pointer + scaled index + displacement
Как я знаю, такая сложная адресация вписывается в одну инструкцию машинного кода. Но какова стоимость такой операции и как она соотносится с простой адресацией с независимым вычислением указателя:
addl $32, %rbx # skip eight values: move pointer forward by 32 bytes
movl (%rbx), %eax # load data: pointer
addl $4, %rbx # point next value: move pointer forward by 4 bytes
movl (%rbx), %edx # load data: pointer
В последнем примере я ввел одну дополнительной инструкцию и зависимость. Но целочисленное добавление происходит очень быстро, я получил более простые адресные операнды, и больше нет умножений. С другой стороны, поскольку допустимые коэффициенты масштабирования имеют степень 2, умножение сводится к сдвигу бит, что также является очень быстрой операцией. Тем не менее, два добавления и сдвиг бит могут быть заменены одним дополнением.
Каковы различия в производительности и размере кода между этими двумя подходами? Существуют ли какие-либо рекомендации по использованию расширенных операндов адреса?
Или, спрашивая его с точки зрения программиста C, что быстрее: индексирование массива или арифметика указателя?
Есть ли какой-либо монтажный редактор, предназначенный для настройки размера и производительности? Хотелось бы, чтобы я видел размер машинного кода каждой инструкции сборки, время ее выполнения в тактах или графике зависимости. Есть тысячи сборщиков, которые выиграют от такого приложения, поэтому я уверен, что что-то вроде этого уже существует!
Общий ответ # 0: Оптимизация - это вуду, и такие вещи, как добавление инструкций или использование более длинных инструкций, могут ускорить работу в некоторых случаях. Такое поведение может варьироваться от CPU к CPU; что-то истинное на одной модели может быть неверным на более новой модели. В вашем случае все может идти в любом случае, и нет никакого хорошего способа предсказать без простого измерения. – Nayuki
Общий ответ №1: http://www.agner.org/optimize/; http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html – Nayuki
@NayukiMinase, некоторые v полезные ссылки. Очень стоит просмотреть. Благодарю. – TerryE