Чтобы понять форматы команд MIPS I, вам нужно понять конвейер MIPS, а также вспомнить технологию реализации ЦП около 1985 года. Если вы посмотрите на диаграмму (вы знаете одну), вы увидите, что чтение файла регистра находится в ID этап, сразу после IF.
Для целей инструкции R-типа на этапе идентификации необходимо выполнить следующие задачи:
- Определить , что это на самом деле является инструкцией R-типа.
- Если это так, скажите файлу регистров загрузить значения из регистров.
Для целей этого обсуждения это первое задание, о котором вам нужно подумать. Если вам нужно проделать большую работу по декодированию команд, чтобы даже отработать, если вам нужны какие-либо значения из регистров, это увеличивает задержку, прежде чем вы сможете начать чтение регистров. Это также увеличивает сложность этапа идентификации. Резервируя один код операции для всех команд R-типа, вы сводите сложность к минимуму.
Кажется немного странным, что вы посвящаете пять бит просто переключению. Я могу придумать несколько возможных объяснений. Во-первых, это упрощает маршрутизацию (эти пять битов ВСЕГДА подаются прямо в регистровый файл, эти пять битов ВСЕГДА подаются в устройство сдвига ствола, эти шесть битов ВСЕГДА направляются в АЛУ, чтобы определить, какую функцию выполнять).
Возможно, они думали о введении комбинированных команд shift-left-and-add в будущем. Это предположительно будет иметь вид:
$d = $s + ($t << shamt)
2s+ 1s
Сегодня, вероятно, мы бы дважды не задумывались о том, чтобы иметь более сложную стадию декодирования, тем более что обращения к файлам регистров, как правило, происходят позже в конвейере типичного суперскалярного ЦП. Многие современные процессоры даже выполняют грубое декодирование команд во время вставки команды в кэш L1 . Вы делаете линии I-кеша на несколько бит шире, чтобы хранить дополнительную информацию (благодаря закону Мура у вас много транзисторов, чтобы тратить впустую), чтобы сделать «правильное» декодирование команд проще и быстрее.
Одна из причин, по которой они, вероятно, хотели, чтобы поле кода операции было как можно меньшим, заключается в том, чтобы оно не влекло за собой чрезмерное наказание за команды J-типа. Как вы, вероятно, знаете, инструкции типа J используют псевдо-прямую адресацию. Для тех, кто играет дома, я кратко объясню.
Поле адреса инструкции J-типа составляет 26 бит. Поскольку инструкции всегда выровнены по 4 байта, вам не нужно хранить младшие два бита, что означает, что у вас фактически есть 28-битный адрес. Однако адресное пространство в MIPS I составляет 32 бита. Таким образом, верхние четыре бита местоположения перехода взяты из счетчика программы.
Это означает, что вы не можете напрямую перейти к местоположению, где старшие четыре бита местоположения ПК отличаются. Вместо этого вам придется выполнить более дорогой переход из трех команд через регистр нуля:
lui $r,target >> 16
ori $r,$r,target & 0xFFFF
jr $r
Сегодня это не так уж и плохо, но в 1985 году было много тактов.
Кража немного из поля адреса уменьшит эффективный диапазон прямого перехода еще больше. Вы можете видеть, как это может быть слишком высокой ценой, чтобы заплатить.