Imax9
NEWS   ARTICLES   MINIMIG   FILES   ABOUT

Выбор набора инструкций.

Предлагаю вам перевод цикла The EightThirtyTwo ISA Part 2: Choosing the Instruction Set автора Alastair M. Robinson.

В части 1 я рассказал о том, почему я хотел создать свой собственный микропроцессор и как я остановился на архитектуре, использующей восьмибитные слова команд и восемь адресуемых тридцатидвухбитных регистров.

Поскольку в наших командных словах не будет места для кодирования двух регистров, каждая команда будет принимать только один операнд – поэтому нам нужен способ подачи второго операнда в такие инструкции, как add, xor, load immediate и т.д. Для этого я определил девятый регистр, который назову temp. Этот регистр не адресуется через слово инструкции – он просто используется неявно везде, где это необходимо. Одно из ключевых решений, которое нужно принять, будет заключаться в том, будет ли результат арифметических инструкций поступать в используемый или во временный регистр.

Не совсем ясно, не подумав об этом (и в идеале не написав несколько тестовых программ), какие именно инструкции нам нужно реализовать, поэтому сначала я перечислю все возможные инструкции, которые приходят на ум, а затем выясню, что является обязательным, что необязательным и что наиболее выгодно с точки зрения уменьшения размера кода, в надежде, что мы сможем достичь нашей цели в 25 инструкций.

Возможные инструкции включают в себя:

Итак, это 42 инструкции – нам нужно потерять 17 из них. Итак, давайте посмотрим, что можно легко реализовать с точки зрения других инструкций.

Это экономит нам 12 инструкций – нам нужно потерять еще 5, так что нам нужно думать дальше, что выкинуть из коробки.

Предположим, мы сделаем PC одним из восьми адресуемых регистров: затем мы сможем реализовать переходы, манипулируя этим регистром, и обойтись без jmp, jsr, reljmp и reljsr.

Команда условного перехода может остаться, если мы сможем закодировать условия в три бита, но другой вариант, и весьма привлекательный, состоит в том, чтобы позаимствовать идею, которая восходит к 1950-м годам, но которая вышла из моды в последние годы: предикация.

Наборы команд с предикацией обычно отводят несколько битов команде кодировке для флагов условий, которые разрешают или предотвращают выполнение каждой команды на индивидуальном уровне в зависимости от того, соответствуют ли они текущим кодам условий процессора. PA-RISC, IA-64 и ARM32 имеют всестороннюю предикацию, но MIPS и x86 в основном ограничены условными ветвями и инструкцией условного перемещения.

Очевидно, что мы не можем выделить пространство кодирования для полной предикации, но то, что мы могли бы сделать, это определить инструкцию “Cond”, которая будет сравнивать соответствие кодов условий, а затем включать или отключать выполнение всех инструкций до дальнейшего уведомления. Результат может выглядеть следующим образом :

cmp r0
cond SGT ; выполнить следующие инструкции только в том случае, если temp был больше r0
li branchtarget
mv r7 ; r7-счетчик программы (PC)
cond EX ; Вернуться к безусловному выполнению

Самое привлекательное в этом то, что мы могли бы реализовать простой поток управления “If...else...” без необходимости ветвления вообще.

В следующий раз я напишу еще несколько фрагментов кода, посмотрю, как себя чувствует этот ISA, решу, какие инструкции сохранить и можно ли внести какие-то простые изменения, чтобы сделать его более удобным в использовании.


Адрес для контактов : imax9@narod.ru

Если вам понравились мои работы и вы желаете поддержать сайт - сделайте дотацию.

При копировании статьи – обязательна ссылка на авторство и источник. Без разрешения автора копирование запрещено.

© Максим Ильин 2022г.

Яндекс.Метрика