Himik писал(а):
Но ты ведь понимаешь, что при нефиксированной длине кода операции, необходим анализ последовательности байт? И что ты предлагаешь - фиксированный размер _всех_ кодов?
К примеру, у PDP-11 и IBM/360 полный код команды мог занимать 2, 4 или 6 байтов, однако его длина всегда могла быть установлена по первым двум байтам (у IBM/360 -- вообще по двум старшим битам первого байта). Это намного упрощает выборку и декодирование команды. То, что системы команд этих машин имеют намного меньше инструкций, чем IA-32, аргументом не является, поскольку тут важен сам принцип -- единообразное кодирование команд с возможностью максимально быстрого определения длины команды, чтобы упростить выборку и декодирование. DEC, например, не стала извращаться, пытаясь сохранить бинарную совместимость в 32-разрядной VAX-11 с 16-разрядной PDP-11; вместо этого она реализовала отдельную 32-разрядную систему команд с нормальным кодированием плюс отдельный режим, в котором выполняла программы от PDP-11 (нечто вроде V86 на IA-32). Кстати говоря, по эффективности на коде общего назначения её никто так и не превзошёл, ну а всякие там SIMD... в конце 1970-х технологии ещё не позволяли пихать их в каждый компутер, для этого были специализированные матричные сопроцессоры к мэйнфреймам либо ещё более специализированные супер-ЭВМ.
Ну а фиксированный размер всех команд сделала ARM, на чём конкретно обломилась. Да, писать, используя родные АРМовские инструкции, приятно: они "ортогональны", все регистры равны между собой (ну, кроме счётчика команд, который доступен как регистр R15, а также регистров адреса возврата и указателя стека -- хотя два последних могут свободно использоваться как обычные РОНы, если по прямому назначению они не требуются), для каждой группы команд операнды используются одинаковым образом и имеют идентичные виды адресации независимо от конкретной команды... Однако каждая команда имеет размер 4 байта (концепция RISC требует равной длины под предлогом повышения скорости выборки команд), из-за чего память улетает впустую с дикой скоростью, а заодно и процессор тормозится (в микроконтроллерах программа обычно хранится в медленной флэш-памяти, а кэш жрёт много энергии и дорого стоит; когда RISC только выдумывали, никакой флэш-памяти не существовало, а разрыв в производительности процессора и пропускной способностью памяти был куда меньше, чем сейчас). Кинувшись исправлять ситуацию, ARM разродилась системой команд Thumb, наступив на те же грабли, но с противоположной стороны: каждая команда здесь имеет длину строго 2 байта (как же, это же RISC!), из-за чего им пришлось сильно ограничить функционал и сделать систему команд "неортогональной". Наконец, несколько лет назад до них дошло-таки, что для достижения высокой эффективности надо забить большой и толстый на принципы построения RISC-процессоров -- и появилась Thumb-2 с переменной длиной команды (2 или 4 байта). Но из-за сохранения совместимости по кодированию с обычной Тумбой само кодирование получилось уродским, хоть и не до такой степени, как в IA-32. Вот мне теперь интересно, как они 64-разрядный процессор лепить будут: озаботятся бинарной совместимостью или всё ж по-человечески сделают?..
SII писал(а):
С другой стороны, специализация регистров немножко упрощает внутреннюю логику процессора :-)
Ни в коей мере. Скорей, наоборот, усложняет, поскольку при универсальных регистрах всё остальное тоже получается единообразным и универсальным, а при специализированных приходится либо лепить кучу специализированных же схем, что дополнительно раздувает аппаратуру (например, дополнительные инкременторы-декременторы для *SI и *DI и декрементор для *CX для обслуживания строковых операций, а заодно и дополнительные схемы управления), либо... опять-таки выполнять всё на общих универсальных блоках обработки (как это и имеет место на практике: нафига делать лишние блоки, которые будут почти всегда простаивать, если эти операции можно сделать на общем АЛУ?). Ну а декодирование команд по-любому серьёзно усложняется.