В идущем процессе написания "небайтного" процессора наткнулся на одну мысль, КМК, вполне годную и сейчас для каких-нить "нормальных" процессоров и контроллеров без всякой привязки к размерам слова.
Простая идея даёт некоторые ощутимые выгоды по сравнению с RISC (в каком-то смысле, это развитие RISC) и упрощает написание очень даже годного суперскалярного процессора до уровня, когда это посильно одиночке-любителю. А заодно значительно ускоряет выполнение, снижает нагрузку на регистры и повышает плотность кода. Одновременно. И бесплатно.

Предлагаю попинать ногами и показать на недостатки.
Начну чуть издалека, чтобы было понятно, почему и нафига.
Аксиоматично, любую команду программы можно исполнить только исполнив все команды, от которых она зависит. Этакий направленый граф, скорость продвижения по которому нужно максимизировать (для универсальных процессоров это возможно за счёт максимального числа параллельно выполняемых команд). Вопрос лишь в том, как оптимально представить этот граф в коде. Сори, но придётся прожевать общеизвестное.
Традиционно "стыковку" вершин рёбрами во всех популярных архитектурах делают через регистры. Например:
0001 add A, B,
C 0002 add B, D, D
0005 sub
C, E, F
Неважно, сколько команд находится между ними, 3-я команда зависит от первой, и это выражено через регистр R3: первая команда туда пишет, третья читает.
В традиционном RISC-суперскаляре это используется для внеочередного исполнения команд: если вторая команда не использует как аргумент результат первой, то её можно выполнять вне очереди.
Но это реально дорого - нужно в аппаратуре отслеживать эти зависимости, приходится переименовывать (внтури, аппаратурой) регистры. Но по сути
хранение результата в регистре С нужно тольк…
Дальше »»»