Блок выборки команд может значительно сократить длину пути для средней команды. Во-первых, он полностью устраняет основной цикл, поскольку в конце каждой команды сразу осуществляется переход к следующей. Во-вторых, АЛУ не нужно увеличивать значение PC. В-третьих, блок IFU сокращает длину пути всякий раз, когда вычисляется 16-разрядный индекс или смещение, поскольку объединяет 16-разрядное значение и сразу передает его в АЛУ в виде 32-разрядного значения без необходимости производить объединение в регистре Н. На рис. 4.20 показана микроархитектура Mic-2, представляющая собой усовершенствованную версию Mic-1, к которой добавлен блок выборки команд, изображенный на рис. 4.18. Микропрограмма для усовершенствованной машины приведена в табл. 4.8.
Чтобы продемонстрировать, как работает Mic-2, рассмотрим команду IADD. Она берет второе слово из стека и выполняет сложение как и раньше, но только сейчас ей не нужно осуществлять переход к Mai ni после завершения операции, чтобы увеличить значение PC и перейти к следующей микрокоманде. Когда блок выборки команд распознает, что в цикле iadd3 произошло обращение к регистру MBR1, его внутренний сдвиговый регистр сдвигает все вправо и перезагружает MBR1 и MBR2. Он также осуществляет переход в состояние, которое на 1 меньше текущего. Если новое состояние - это состояние 2, блок выборки команд начинает вызов слова из памяти. Все это реализуется аппаратно. Микропрограмма ничего не должна делать. Именно поэтому команду IADD можно сократить с пяти до трех микрокоманд.

Рис. 4.20. Тракт данных для Мю-2 Таблица 4.8. Микропрограмма для Мю-2
Микрокоманда порі |
Операции goto (MBR) |
Комментарий Переход к следующей команде |
іасЮІ |
MAR = SP = SP - 1; rd |
Чтение слова, идущего после верхнего слова |
стека |
||
іас!сІ2 |
H = TOS |
Н = вершина стека |
Микрокоманда |
Операции |
Комментарий |
iadd3 |
MDR = TOS = MDR + H; wr; goto (MBR1) |
Суммирование двух верхних слов; запись суммы в верхнюю позицию стека |
isuM |
MAR = SP = SP - 1; rd |
Чтение слова, идущего после верхнего слова стека |
isub2 |
H = TOS |
Н = вершина стека |
isub3 |
MDR = TOS = MDR -H; wr; goto (MBR1) |
Вычитание TOS из вызванного значения TOS - 1 |
iandl |
MAR = SP = SP - 1; rd |
Чтение слова, идущего после верхнего слова стека |
iand2 |
H = TOS |
Н = вершина стека |
iand3 |
MDR = TOS = MDR И H; wr; goto (MBR1) |
Логическое умножение вызванного значения TOS - 1 и TOS (операция И) |
iorl |
MAR = SP = SP - 1; rd |
Чтение слова, идущего после верхнего слова стека |
ior2 |
H = TOS |
Н = вершина стека |
ior3 |
MDR = TOS = MDR ИЛИ H; wr; goto (MBR1) |
Логическое сложение вызванного значения TOS - 1 и TOS (операция ИЛИ) |
dupl |
MAR = SP = SP + 1 |
Увеличение SP на 1 и копирование результата в регистр MAR |
dup2 |
MDR = TOS; wr; goto (MBR1) |
Запись нового слова в стек |
popl |
MAR = SP = SP - 1; rd |
Чтение слова, идущего после верхнего слова стека |
pop2 |
Программа ждет, пока закончится процесс чтения |
|
рорЗ |
TOS = MDR; goto (MBR1) |
Копирование нового слова в регистр TOS |
swapl |
MAR = SP - 1; rd |
Чтение второго слова из стека; установка регистра MAR на значение SP |
swap2 |
MAR = SP |
Подготовка к записи нового второго слова стека |
swap3 |
H = MDR; wr |
Сохранение нового значения TOS; запись второго слова стека |
swap4 |
MDR = TOS |
Копирование прежнего значения TOS в регистр MDR |
swap5 |
MAR = SP - 1; wr |
Запись прежнего значения TOS на второе место в стеке |
swap6 |
TOS = H; goto (MBR1) |
Обновление TOS |
bipushl |
SP = MAR = SP + 1 |
Установка регистра MAR для записи в новую вершину стека |
bipush2 |
MDR = TOS = MBR1; wr; goto (MBR1) |
Обновление стека в регистре TOS и памяти |
iloadl |
MAR = LV + MBR1U; rd |
Перемещение значения LV с индексом в регистр MAR; чтение операнда |
Продолжение &
Таблица 4.8 (продолжение) |
||
Микрокоманда |
Операции |
Комментарий |
iload2 |
MAR = SP = SP + 1 |
Увеличение SP на 1; перемещение нового значения SP в регистр MAR |
iload3 |
TOS = MDR; wr; goto (MBR1) |
Обновление стека в регистре TOS и памяти |
istorel |
MAR = LV + MBR1U |
Установка регистра MAR на значение LV + индекс |
istore2 |
MDR = TOS; wr |
Копирование значения TOS для сохранения в памяти |
istore3 |
MAR = SP = SP - 1; rd |
Уменьшение SP на 1; чтение нового значения TOS |
istore4 |
Машина ждет окончания процесса чтения |
|
istoreö |
TOS = MDR; goto (MBR1) |
Обновление TOS |
widel |
goto (MBR1 ИЛИ 0x100) |
Следующий адрес - 0x100 ИЛИ код операции |
wide_iload1 |
MAR = LV + MBR2U; rd; goto iload2 |
То же, что iioadl, но с использованием 2-байтного индекса |
wide_istore1 |
MAR = LV + MBR2U; goto istore2 |
То же, что istorel, но с использованием 2-байтного индекса |
Idc_w1 |
MAR = CPP + MBR2U; rd; goto iload2 |
То же, что wide_iload1, но индексирование осуществляется из регистра СРР |
und |
MAR = LV + MBR1U; rd |
Установка регистра MAR на значение LV + индекс; чтение этого значения |
iinc2 |
H = MBR1 |
Присваивание регистру Н константы |
iinc3 |
MDR = MDR + H; wr; goto (MBR1) |
Увеличение на константу и обновление |
gotol |
H = PC - 1 |
Копирование значения PC в регистр Н |
goto2 |
PC = H + MBR2 |
Прибавление смещения и обновление PC |
goto3 |
Машина ждет, пока блок выборки команд вызовет новый код операции |
|
goto4 |
goto (MBR1) |
Переход к следующей команде |
ifltl |
MAR = SP = SP - 1; rd |
Чтение второго сверху слова в стеке |
iflt2 |
OPC = TOS |
Временное сохранение TOS в ОРС |
iflt3 |
TOS = MDR |
Запись новой вершины стека в TOS |
iflt4 |
N = OPC; if(N) goto T; eise goto F |
Переход по биту N |
ifeql |
MAR = SP = SP - 1; rd |
Чтение второго сверху слова в стеке |
ifeq2 |
OPC = TOS |
Временное сохранение TOS в ОРС |
ifeq3 |
TOS = MDR |
Запись новой вершины стека в TOS |
ifeq4 |
Z = OPC; if(Z) goto T; eise goto F |
Переход по биту Z |
if_icmpeq1 |
MAR = SP = SP - 1; rd |
Чтение второго сверху слова в стеке |
Микрокоманда if_icmpeq2 |
Операции MAR = SP = SP - 1 |
Комментарий Установка регистра MAR на чтение новой вершины стека |
if_icmpeq3 |
H = MDR; rd |
Копирование второго слова из стека в регистр Н |
if_icmpeq4 |
OPC = TOS |
Временное сохранение TOS в ОРС |
if_icmpeq5 |
TOS = MDR |
Помещение новой вершины стека в TOS |
if_icmpeq6 |
Z = H - OPC; if(Z) goto T; else goto F |
Если два верхних слова равны, осуществляется переход к T; если они не равны, осуществляется переход к F |
T |
H = PC - 1; goto goto2 |
То же, что gotol |
F |
H = MBR2 |
Игнорирование байтов, находящихся в регистре MBR2 |
F2 |
goto (MBR1) |
|
invoke_virtual1 |
MAR = CPP + MBR2U; rd |
Помещение адреса указателя процедуры в регистр MAR |
invoke_virtual2 |
OPC = PC |
Сохранение значения PC в регистре ОРС |
invoke_virtual3 |
PC = MDR |
Установка PC на первый байт кода процедуры |
invoke_virtual4 |
TOS = SP - MBR2U |
TOS = адрес OBJREF - 1 |
invoke_virtual5 |
TOS = MAR = H = TOS + 1 |
TOS = адрес OBJREF |
invoke_virtual6 |
MDR = SP + MBR2U + 1; wr |
Перезапись OBJREF со связующим указателем |
invoke_virtual7 |
MAR = SP = MDR |
Установка регистров SP и MAR на адрес ячейки, в которой содержится старое значение PC |
invoke_virtual8 |
MDR = OPC; wr |
Подготовка к сохранению старого значения PC |
invoke_virtual9 |
MAR = SP = SP + 1 |
Увеличение SP на 1; теперь SP указывает на ячейку, в которой хранится старое значение LV |
invoke_virtual10 |
MDR = LV; wr |
Сохранение старого значения LV |
invoke_virtual11 |
LV = T05; goto (MBR1) |
Установка значения LV на нулевой параметр |
ireturnl |
MAR = SP = LV; rd |
Переустановка регистров SP и MAR для чтения связующего указателя |
ireturn2 |
Процесс считывания связующего указателя |
|
ireturn3 |
LV = MAR = MDR; rd |
Установка регистров LV и MAR на связующий указатель; чтение старого значения PC |
ireturn4 |
MAR = LV + 1 |
Установка регистра MAR на старое значение LV; чтение старого значения LV |
ireturn5 |
PC = MDR; rd |
Восстановление PC |
ireturn6 |
MAR = SP |
|
ireturn7 |
LV = MDR |
Восстановление LV |
ireturn8 |
MDR = TOS; wr; goto (MBR1) |
Сохранение результата в исходной вершине стека |
В микроархитектуре Mic-2 некоторые команды усовершенствованы в большей степени, чем другие. Команда LDCW сокращается с 9 до 3 микрокоманд, и, следовательно, время выполнения команды уменьшается втрое. Несколько по-другому дело обстоит с командой SWAP: изначально там было 8 микрокоманд, а стало 6. Для общей производительности компьютера играет роль сокращение наиболее часто повторяющихся команд, а это команды IL0AD (было 6, стало 3), IADD (было 4, стало 3) и IFICMPEQ (было 13, стало 10 для случая, когда слова равны; было 10, стало 8 для случая, когда слова не равны). Чтобы вычислить, насколько выросла производительность, можно проверить эффективность системы по эталонному тесту, но и без этого ясно, что имеет место значительный выигрыш в быстродействии.
⇐Сокращение длины пути || Оглавление || Конвейерная конструкция - микроархитектура Mic-З⇒