Что такое «ЕС» в архитектуре x86? (рассчитывает эффективный адрес?) - PullRequest
7 голосов
/ 27 апреля 2009

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

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

Ответы [ 4 ]

6 голосов
/ 27 апреля 2009

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

Ссылка на EU (исполнительный блок), скорее всего, была в отличие от 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.

4 голосов
/ 09 июля 2012

«ЕС» - это общий термин для Единицы исполнения. АЛУ является одним из примеров исполнительного устройства. FADD и FMUL, то есть сумматор или умножитель с плавающей запятой, являются другими примерами, так как в этом отношении есть (есть) блок памяти для загрузки и хранения.

ЕС, имеющие отношение к инструкциям LEA, - это ALU (сложение, вычитание, И / ИЛИ и т. Д.) И AGU (блок генерации адреса). AGU связан с конвейерами памяти, TLB, кешем данных и т. Д.

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

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

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

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

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

Итак, вопрос сводится к тому, какой ЕС (исполнительный блок) обрабатывает какие LEA? АЛУ или АГУ? Ответ зависит от машины.

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

3 голосов
/ 27 апреля 2009

EU = исполнительная единица?

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

0 голосов
/ 27 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...