Что такое "ЕС" в архитектуре x86? (вычисляет эффективный адрес?)

Я где-то читал, что эффективные адреса (как в инструкции LEA) в инструкциях x86 вычисляются "ЕС". Что такое ЕС? Что конкретно связано с вычислением эффективного адреса?

Я только узнал о наборе команд MC68k (UC Boulder учит этому в первую очередь), и я не могу найти хорошую веб-страницу x86 через google =/.

Спасибо!

Ответ 1

"ЕС" является общим термином для Группы исполнения. ALU является одним из примеров исполнительного блока. FADD и FMUL, т.е. Сумматор с плавающей запятой или множитель, являются другими примерами - поскольку, в этом случае, это блок памяти для нагрузок и хранилищ.

ЕС, относящийся к инструкциям LEA, это ALU (добавление, вычитание, AND/OR и т.д.) и AGU (модуль формирования адреса). AGU связан с конвейерами памяти, TLB, кэшем данных и т.д.

Типичный процессор Intel x86 назад, когда я написал первое руководство по разработке кода, содержал 2 ALU, 1 загрузочный конвейер, привязанный к AGU, конвейер адреса магазина, привязанный ко второму ALU, и конвейер данных хранилища. По состоянию на 2016 год большинство из них имеют 3 или 4 ALU.

LEA - это 3 команды ввода - BaseReg + IndexReg * Шкала + Смещение. Точно так же, как режим адресации памяти x86, который на самом деле имеет 4-й вход, база сегментов, которая не является частью вычисления LEA. 3 входа обязательно стоят больше, чем 2 входа, необходимые для ADD.

На некоторых машинах ALU может выполнять только 2 операции ввода. Поэтому LEA может выполняться только в AGU, в частности, AGU, используемый для загрузки (потому что ALU магазина не записывает регистр). Это может означать, что вы не можете выполнять LEA одновременно с загрузкой или двумя LEA одновременно, тогда как вы можете использовать два добавления и нагрузку в одном цикле.

На других машинах LEA может выполняться одним или двумя или тремя из ALU. Возможно, вместо AGU - возможно, а также ALU. Это доказывает большую гибкость.

Или простые LEA, например regscale + offset, могут выполняться на ALU, тогда как самые большие LEA, например, breg + iregscale + offset, могут быть ограничены или, возможно, даже разбиты на два uops.

(Ouch: приложение усечено в < <, вероятно, ошибка HTML-кода. Я могу исправить на ПК. Ah - исправлено путем изменения < < to *.)

Итак, вопрос сводится к следующему: какой ЕС (блок исполнения) обрабатывает LEA? ALU или AGU? Ответ зависит от машины.

Общий текст в руководстве по оптимизации может просто сказать "ЕС", а не "AGU или ALU в зависимости от модели" или "какой бы ни был ЕС способен обрабатывать этот конкретный LEA".

Ответ 2

Intel Руководства для разработчиков программного обеспечения являются хорошим источником информации о x86, хотя они могут быть чересчур избыточными (и больше ссылок скорее, чем учебник).

Ссылка на ЕС (исполнительная единица) была скорее всего в отличие от ALU (Арифметическая логическая единица), которая обычно является частью процессора, ответственного за арифметические и логические инструкции. Однако для вычисления адресов памяти у ЕС есть (или были) некоторые арифметические возможности. Инструкция x86 LEA передает эти возможности программисту сборки.

Обычно вы можете предоставить некоторые довольно сложные адреса памяти для инструкции x86:

sub eax, [eax + ebx*4 + 0042]

и в то время как ALU обрабатывает арифметическое вычитание, ЕС отвечает за создание адреса.

С LEA вы можете использовать ограниченные возможности генерации адресов для других целей:

lea ebx, [eax + ebx*4 + 0042]

Сравните с:

mul ebx, 4
add ebx, eax
add ebx, 0042

"Том 1" на странице, с которой я связан, имеет раздел "3.7.5", описывающий режимы адресации - какие адреса памяти вы можете предоставить команде, ожидающей операнда памяти (из которых LEA является одним), что отражает какая арифметика ЕС (или что-то, что называется частью интерфейса памяти) способна.

"Том 2" является ссылкой на набор инструкций и содержит окончательную информацию обо всех инструкциях, включая LEA.

Ответ 3

EU = блок выполнения?

Эффективный адрес - это адрес, к которому был бы обращен доступ, если команда LEA была инструкцией, которая фактически выполняла какой-то арифметический или другой доступ к данным. Его "предназначенное" использование заключается в вычислении полученного указателя из операции арифметики указателя или индексации массива. Однако, поскольку он может выполнять некоторую комбинацию multiply и add, он также используется для оптимизации некоторых регулярных вычислений.

Ответ 4

Внутренности процессоров внутри одной семьи сильно изменились с годами, так что ссылка "ЕС" должна быть уточнена с помощью точной модели процессора. Как аналогия с вашим опытом m68k, набор команд для 68000, 010, 020, 030, 040 и 060 в основном одинаков, но их внутренности действительно разные, поэтому любая ссылка на внутреннее имя должна содержать номер своей части.