Есть много причин, по которым можно было бы внедрить CISC. Наиболее значимой причиной является двоичная совместимость с существующим набором команд CISC. Хотя технология двоичной трансляции программного обеспечения улучшилась, аппаратная совместимость имеет некоторые технические преимущества (а также недостаток, заключающийся в меньшем кешировании перевода) и меньшие технические преимущества, которые кажутся более надежными.
Плотность кода является, пожалуй, второй наиболее важной причиной выбора CISC. Renesas RX был разработан как CISC специально для плотности кода, поскольку он предназначен для микроконтроллеров, где размер памяти кода является значительным фактором стоимости. Команды переменной длины, сложные инструкции (в основном, больше режимов адресации), неявные операнды и меньший регистр подсчитывают всю плотность кода выгоды.
Исторической (и, на мой взгляд, ошибочной) причиной выбора CISC было закрытие семантического разрыва между программистами, использующими язык более высокого уровня, и процессором. Поскольку сложные инструкции, как правило, могут быть заменены последовательностью более простых инструкций, сложность компилятора языка более высокого уровня для RISC не должна быть намного более сложной, чем для CISC, соответствующей языку. RISC позволяет избежать «семантического столкновения» (когда инструкция процессора выполняет большую или меньшую работу, чем соответствующий оператор языка) и способствует снижению прочности и оптимизации планирования. (См. «Какие компромиссы в усилиях по разработке компилятора, связанных с CISC и RISC?» Для получения более подробной информации.)
Может быть значительная фиксированная стоимость, связанная с выполнением инструкции. Это поощряет использование относительно сложных инструкций, чтобы распределить эти накладные расходы на более актуальную работу; уменьшение количества динамических команд может повысить производительность. Когда стоимость логики и оперативной памяти была намного выше стоимости ПЗУ, стимул для сложных команд был значительным, поскольку инструкция была декодирована путем поиска микрокода.
Причиной использования CISC, которая, возможно, противоречит историческим свидетельствам, является то, что микрокод может быть оптимизирован для каждой микроархитектуры, тогда как стандартные библиотеки могут не спешить использовать возможности новой реализации. Уровень оптимизации программных реализаций memcopy по сравнению с микрокодом для REP MOVSB подразумевает, что библиотекам можно уделять больше внимания, чем микрокоду. Частично это может быть связано с тем, что поставщик процессора нацелен на более широкую пользовательскую базу, поэтому обоснование усилий может оказаться более сложным по сравнению с открытым исходным кодом или внутренним программным обеспечением, где локализованные интересы разработчиков или пользователей могут повлиять на усилия по реализации.
Возможность поставки оптимизированной стандартной библиотеки с процессором имеет значительные преимущества. Хранение и исполнение стандартной библиотеки платформы может быть значительно оптимизировано с помощью программно-аппаратного кодирования. Различие между сложной инструкцией и вызовом уровня абстракции платформы может быть тонким (или вообще отсутствовать). Проект RISC мог бы использовать те же методы реализации для обработки вызовов PAL, что и CISC для сложных команд, включая использование операций, не предусмотренных в общем наборе команд со специализированным оборудованием, использование умного кэширования и декодирования и указание операндов регистра (хотя CISC мог бы часто используют выделенные регистры, похожие на ABI для каждой функции). Ментальная модель, связанная с CISC, может способствовать такой оптимизации. Кроме того, пользователи могут меньше обижаться на принудительное включение "
Декодирование относительно сложных команд может иметь меньшие издержки (и, возможно, более надежно быть правильными в различении намерений), чем сопоставимый метод RISC распознавания идиом, где последовательность команд распознается как семантическая единица. Это различие в затратах было бы наиболее заметно в меньшей реализации, но издержки на использование этой информации уменьшают значимость экономии декодирования.
Дополнительная контекстная информация может облегчить оптимизацию оборудования. Например, при увеличении значения в памяти аппаратное обеспечение может распознать, что адрес памяти используется дважды (для нагрузки и хранилища), предоставляя возможность для кэширования, запоминания и трансляции. Сложные инструкции могут предоставить такую информацию явно. В сложной инструкции промежуточные значения имеют явное время жизни (время жизни инструкции); с традиционным регистром RISC значения должны быть явно перезаписаны, чтобы указать конец жизнеспособности. (Примечание: RISC может указывать регистр, который всегда обнуляется после каждого использования, предоставляя средство для указания временного значения одноразового использования. Такие инструкции были бы несколько более сложными.)
Если детали реализации не скрыты за уровнем абстракции, становится сложнее использовать разные микроархитектуры для оптимизации для разных компромиссов. Предоставление микроархитектурных деталей в качестве архитектурных гарантий фиксирует микроархитектуру в гарантии совместимости. Хотя программное обеспечение PAL можно оптимизировать так же, как сложные инструкции, для этого требуется программно-аппаратный код. Организационное разделение и разнообразие делают кодирование более сложным.
Сложные инструкции могут обеспечить защищенный доступ к привилегированному состоянию. Например, сложные инструкции часто являются атомарными по отношению к прерываниям. Хотя набор команд RISC может обеспечить механизм уровня пользователя для временной приостановки прерываний, возможно, даже что-то вроде связанной нагрузки, так что программное обеспечение явно повторяет операцию в случае прерывания, если это не характерно для RISC.
Аналогичным образом, сложная инструкция может обеспечить контролируемый доступ и / или использование привилегированной информации. Поскольку выполняемая операция имеет управляемую семантику, фактического нарушения привилегий можно избежать. RISC-ориентированные альтернативы включают в себя код PAL (который обычно имеет значительные накладные расходы) и маскированный доступ к регистрам конфигурации (или теневым копиям регистров), которые имеют некоторое привилегированное состояние. Предоставить общее решение (RISC) сложнее, чем предоставить решение для одного или нескольких особых случаев (CISC), но оно является более мощным и менее уязвимым для накопления особых случаев. Если считать, что важных особых случаев немного, CISC может быть более привлекательным.
Сложные инструкции также могут скрывать состояние от программного обеспечения. Одним из важных преимуществ такого подхода является сохранение и восстановление контекста. С инструкциями, которые сохраняют и восстанавливают состояние, архитектуре нужно только сообщать размер контекста ОС, а не конкретные механизмы для передачи состояния в память. Это позволяет приложениям, работающим в устаревшей ОС, использовать расширения ISA, которые добавляют состояние. (Опять же, программное обеспечение PAL может обеспечить ту же функциональность.)
Большая часть сложности x86 связана с совместимостью многих расширений. С помощью сложных и менее ортогональных инструкций (полезных для плотности кода) удаление некоторой работы, которая, как оказалось, обычно не требуется, избегая ненужных цепочек зависимостей (например, только один бит переноса, только один регистр величины динамического сдвига), добавляя некоторую работу, которая оказалась Он широко используется, и его можно оптимизировать в рамках сложной инструкции - любая из них потребует добавления новой инструкции и сделает ISA менее эстетичным.
Во многих случаях RISC не сталкивался бы с такими проблемами, потому что инструкции очень ортогональны и примитивны. В некоторых случаях RISC может потребоваться добавить новые примитивы, но, как правило, это может быть применимо для более чем одного использования.
Кроме того, после того, как создана инфраструктура для поддержки сложных инструкций, барьеры уменьшаются для дополнительных сложных инструкций. То есть большая часть затрат на сложные инструкции не повторяется. Сильно RISC ISA страдают дополнительным препятствием для внедрения функций CISCy.
Частота расширения x86 также может быть частично приписана его популярности для вычислений общего назначения и модели торгового процессора (это также увеличивает важность двоичной совместимости). ISA RISC часто привязаны к поставщикам sysem, что поощряет более узкую направленность на приложения, а отсутствие конкуренции за реализации конкретного ISA RISC несколько препятствует использованию расширений набора инструкций для маркетинга. Популярность также делает затраты на разработку новых расширений менее значительными (единовременные расходы менее важны при больших объемах).
Философия совместимости с x86, вероятно, также склоняется к расширению существующих механизмов, а не к более чистому разрыву, что означает, что новые функции в большей степени зависят от существующих функций. Более высокая частота расширения также способствует более постепенным изменениям, что стимулирует повторное использование механизмов, стремящихся уменьшить ортогональность.
Сравнение академической презентации классического MIPS (который является подмножеством современных версий MIPS и исключает различные дополнительные расширения ISA) с современным x86 (который отслеживает двоичную совместимость с 16-битной 8086 и квази-совместимость на уровне сборки еще дальше) При всем своем историческом багаже это не лучший случай для CISC и не реалистичный случай для RISC.