Мы уже показали, как можно воплотить IJVM микропрограммно, использовав минимум аппаратуры. Теперь рассмотрим альтернативные варианты. Сначала мы выясним, какими способами можно снизить количество микрокоманд в одной команде (то есть каким образом можно сократить длину пути), а затем перейдем к другим подходам.
Слияние цикла интерпретатора с микропрограммой
В микроархитектуре Mic-1 основной цикл состоит из микрокоманды, которая должна выполняться в начале каждой IJVM-команды. В некоторых случаях допустимо ее перекрытие предыдущей командой. В каком-то смысле эта идея уже получила свое воплощение. Вспомните, что во время цикла Mai ni код следующей операции уже находится в регистре MBR. Этот код операции вызывается либо во время предыдущего основного цикла (если у предыдущей команды не было операндов), либо при выполнении предыдущей команды.
Эту идею можно развивать и дальше. В некоторых случаях основной цикл можно свести к нулю. Это происходит следующим образом. Рассмотрим каждую последовательность микрокоманд, которая завершается переходом к Mai ni. Каждый раз основной цикл может добавляться в конце этой последовательности (а не в начале следующей), при этом межуровневый переход дублируется много раз (но всегда с одним и тем же набором целевых объектов). В некоторых случаях микрокоманда микроархитектуры Mic-1 может сливаться с предыдущими микрокомандами, поскольку эти команды используются не всегда полностью.
В табл. 4.4 приведена последовательность выполнения микрокоманд для команды POP. Основной цикл идет перед каждой командой и после каждой команды, в таблице этот цикл показан только после команды POP. Отметим, что выполнение этой команды занимает 4 цикла: три цикла специальных микрокоманд команды POP и один основной цикл.
Таблица 4.4. Новая микропрограмма для выполнения команды POP
Микрокоманда |
Операции |
Комментарий |
рор1 |
MAR = SP = SP - 1 ; rd |
Считывание второго сверху слова в стеке |
рор2 |
Ожидание, пока из памяти считается новое значение TOS |
|
рорЗ |
TOS = MDR; goto Maini |
Копирование нового слова в регистр TOS |
Maini |
PC = PC + 1; fetch; goto(MBR) |
Регистр MBR содержит код операции; вызов следующего байта; переход |
В табл. 4.5 последовательность сокращена до трех команд за счет того, что в цикле рор2 АЛУ не используется. Отметим, что в конце этой последовательности сразу осуществляется переход к коду следующей команды, поэтому требуется всего 3 цикла. Этот небольшой трюк позволяет сократить время выполнения
следующей микрокоманды на один цикл, поэтому, например, последующая команда ШО сокращается с четырех циклов до трех. Это эквивалентно повышению частоты синхронизирующего сигнала с 250 МГц (каждая микрокоманда по 4 не) до 333 МГц (каждая микрокоманда по 3 не).
Таблица 4.5. Усовершенствованная микропрограмма для выполнения команды POP
Микрокоманда |
Операции |
Комментарий |
рор1 |
MAR = SP = SP - 1 ; rd |
Считывание второго сверху слова в стеке |
Mainl.pop |
PC = PC + 1 ; fetch |
Регистр MBR содержит код операции; вызов |
следующего байта |
||
рорЗ |
TOS = MDR; goto(MBR) |
Копирование нового слова в регистр TOS; |
переход к коду операции |
Команда POP очень хорошо подходит для такой доработки, поскольку она содержит цикл, в котором АЛУ не используется, а основной цикл требует АЛУ. Таким образом, чтобы сократить длину команды на одну микрокоманду, нужно в этой команде найти цикл, где АЛУ не используется. Такие циклы встречаются нечасто, но все-таки встречаются, поэтому установка цикла Mai ni в конце каждой последовательности микрокоманд вполне целесообразна. Для этого требуется всего лишь небольшая управляющая память. Итак, мы узнали о первой возможности сокращения длины пути: