logo
Методичка

10.5.6 Процесс декодирования

После этапа выборки инструкций х86 из кэша L1 в полном соответствии со схемой классического процессора наступает этап декодирования (трансляции) в машинные команды. Этап декодирования присущ любому современному х86-совместимому процессору, имеющему внутреннюю RISC-архитектуру. В этих процессорах внешние CISC-команды декодируются во внутренние RISC-инструкции, для чего используется декодер команд.

Процесс декодирования состоит из двух этапов. На первом этапе выбранные из кэша L1 блоки инструкций длиной 32 байта помещаются в специальный буфер преддекодирования Predecode/Pick Buffer. В нем из 32-байтных блоков выделяются отдельные инструкции, которые затем сортируются и распределяются по различным каналам декодера. Декодер транслирует х86-инструкции в простейшие машинные команды (микрооперации), называемые Micro-Ops. Сами х86-команды могут быть переменной длины, а вот длина микроопераций уже фиксированная.

Инструкции х86 разделяются на простые (Small x86 Instruction) и сложные (Large х86 Instruction). Простые инструкции при декодировании представляются с помощью одной-двух микроопераций, а сложные команды — тремя и более микрооперациями.

Простые инструкции отсылаются в аппаратный декодер, построенный на логических схемах и называемый DirectPath, а сложные – в микропрограммный (Microcode Engine) декодер, называемый VectorPath. Этот декодер представляет собой своеобразный программный процессор. Он содержит программный код, хранящийся в MIS (Microcode Instruction Sequencer), на основе которого воспроизводится последовательность микроопераций.

Аппаратный декодер DirectPath является трехканальным и может декодировать за один такт три простые инструкции, если каждая из них транслируется в одну микрооперацию, либо одну простую инструкцию, транслируемую в две микрооперации, и одну простую инструкцию, транслируемую в одну микрооперацию, либо две простые инструкции за два такта, если каждая инструкция транслируется в две микрооперации (полторы инструкции за такт). Таким образом, за каждый такт аппаратный декодер DirectPath выдает три микрооперации.

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

Микрооперации, полученные в результате декодирования инструкций в декодерах DirectPath и VectorPath, поступают в буфер Pack Buffer, где они объединяются в группы по три микрооперации. В том случае, когда за один такт в буфер поступает не три, а одна или две микрооперации (в результате задержек с выбором инструкций), группы заполняются пустыми микрооперациями, но так, чтобы в каждой группе было ровно три микрооперации. Далее группы микроинструкций отправляются на исполнение.

Если посмотреть на схему декодера в архитектурах К8 и К10, то видимых различий, казалось бы, нет (рис. 10.13). Действительно, принципиальная схема работы декодера осталась без изменений. Разница в данном случае заключается в том, какие инструкции считаются сложными, а какие простыми, а также в том, как декодируются различные инструкции. Так, в архитектуре К8 128-битные SSE-инструкций разбиваются на две микрооперации, а в архитектуре К10 большинство SSE-инструкций декодируется в аппаратном декодере как одна микрооперация. Кроме того, часть SSE-инструкций, которые в архитектуре К8 декодируются через микропрограммный VectorPath-декодер, в архитектуре К10 декодируются через аппаратный DirectPath-декодер.

Кроме того, в архитектуре К10 в декодер добавлен специальный блок, называемый Sideband Stack Optimizer. He вникая в подробности, отметим, что он повышает эффективность декодирования инструкций работы со стеком и, таким образом, позволяет переупорядочить микрооперации, получаемые в результате декодирования, чтобы они могли выполняться параллельно.