Hay muchas razones por las que uno elegiría implementar un CISC. La razón más destacada es la compatibilidad binaria con un conjunto de instrucciones CISC existente. Si bien la tecnología de traducción binaria de software ha mejorado, la compatibilidad basada en hardware tiene algunas ventajas técnicas (así como la desventaja de un menor almacenamiento en caché de traducción) y la menor ventaja técnica de parecer más confiable.
La densidad del código es quizás la segunda razón más importante para elegir CISC. El Renesas RX fue diseñado como un CISC específicamente para la densidad del código, ya que se dirige a los microcontroladores donde el tamaño de la memoria del código es un factor de costo significativo. Las instrucciones de longitud variable, las instrucciones complejas (principalmente más modos de direccionamiento), los operandos implícitos y el registro más bajo cuentan toda la densidad del código de beneficio.
Una razón histórica (y en mi opinión equivocada) para elegir CISC fue cerrar la brecha semántica entre los programadores que usan un lenguaje de nivel superior y el procesador. Dado que las instrucciones complejas generalmente se pueden reemplazar por una secuencia de instrucciones más simples, la complejidad de un compilador de lenguaje de nivel superior para un RISC no necesita ser mucho más compleja que para un CISC de coincidencia de idiomas. RISC evita el "choque semántico" (donde una instrucción de procesador hace más o menos trabajo que una declaración de lenguaje correspondiente) y facilita la reducción de fuerza y las optimizaciones de programación. (Ver "¿Cuáles son las ventajas y desventajas en el esfuerzo de desarrollo compilador relacionada con CISC vs RISC?" Para más detalles).
Puede haber un costo fijo significativo asociado con la ejecución de una instrucción. Esto fomenta el uso de instrucciones relativamente complejas para distribuir esta sobrecarga en un trabajo más real; La reducción del recuento dinámico de instrucciones puede mejorar el rendimiento. Cuando el costo de la lógica y la RAM era mucho mayor que el costo de la ROM, el incentivo para instrucciones complejas era significativo ya que una instrucción se decodificaba al buscar el microcódigo.
Una razón para usar CISC que tal vez se contradice con la evidencia histórica es que el microcódigo se puede optimizar para cada microarquitectura, mientras que las bibliotecas estándar pueden ser lentas para explotar las características de una nueva implementación. El nivel de optimización de las implementaciones de software de memcopy versus el del microcódigo para REP MOVSB implica que las bibliotecas pueden obtener más atención que el microcódigo. Parte de esto puede provenir del proveedor del procesador dirigido a una base de usuarios más amplia, por lo que la justificación del esfuerzo puede ser más difícil en comparación con el software de código abierto o interno donde los intereses localizados de los desarrolladores o usuarios pueden sesgar el esfuerzo de implementación.
Ser capaz de enviar una biblioteca estándar optimizada con el procesador tiene importantes atracciones. El almacenamiento y la ejecución de una biblioteca estándar de plataforma se pueden optimizar significativamente mediante el código de código de hardware y software. La distinción entre una instrucción compleja y una llamada de Capa de abstracción de plataforma puede ser sutil (o inexistente). Un diseño RISC podría usar las mismas técnicas de implementación para manejar llamadas PAL que un CISC para instrucciones complejas, incluido el uso de operaciones que no se proporcionan en el conjunto de instrucciones generales con hardware especializado, el uso de caché y decodificación inteligentes, y la especificación de operandos de registro (aunque un CISC lo haría a menudo usan registros dedicados similares a un ABI por función). El modelo mental asociado con CISC puede fomentar tales optimizaciones. Además, los usuarios pueden sentirse menos ofendidos por la inclusión forzada de un "
La decodificación de instrucciones relativamente complejas puede tener menos sobrecarga (y posiblemente sea más confiable en la intención de discernir) que la técnica RISC comparable de reconocimiento de idiomas donde una secuencia de instrucciones se reconoce como una unidad semántica. Esta diferencia de gastos generales sería más notable en una implementación más pequeña, pero los gastos generales para usar esta información reducen la importancia de los ahorros de decodificación.
La información contextual adicional puede facilitar la optimización del hardware. Por ejemplo, al incrementar un valor en la memoria, el hardware podría reconocer que la dirección de la memoria se usa dos veces (para la carga y la tienda), lo que brinda una oportunidad para la memoria caché y el almacenamiento en caché de la traducción. Las instrucciones complejas pueden proporcionar dicha información explícitamente. En una instrucción compleja, los valores intermedios tienen una vida útil explícita (la de la instrucción); con un registro RISC tradicional, los valores deben sobrescribirse explícitamente para indicar el final de la vida. (Nota: Un RISC podría especificar un registro que siempre se pone a cero después de cada uso, proporcionando un medio para especificar un valor temporal de un solo uso. Dichas instrucciones serían moderadamente más complejas).
Si los detalles de implementación no están ocultos detrás de una capa de abstracción, se hace más difícil usar diferentes microarquitecturas para optimizar las diferentes compensaciones. La exposición de detalles microarquitectónicos como garantías arquitectónicas bloquea la microarquitectura en la garantía de compatibilidad. Si bien el software PAL podría optimizarse de la misma manera que las instrucciones complejas, esto requiere un código de hardware y software. La separación organizacional y la diversidad hacen que el código sea más difícil.
Las instrucciones complejas pueden proporcionar acceso protegido al estado privilegiado. Por ejemplo, las instrucciones complejas son a menudo atómicas con respecto a las interrupciones. Si bien un conjunto de instrucciones RISC podría proporcionar un mecanismo a nivel de usuario para suspender temporalmente las interrupciones, posiblemente incluso algo así como la carga vinculada para que el software vuelva a intentar explícitamente la operación si se interrumpe, siempre que no sea típico para los RISC.
Del mismo modo, una instrucción compleja podría proporcionar acceso controlado y / o uso de información privilegiada. Debido a que la operación ejecutada tiene semántica controlada, se puede evitar la violación real de privilegios. Las alternativas orientadas a RISC incluyen el código PAL (que generalmente tiene una sobrecarga significativa) y el acceso enmascarado a los registros de configuración (o instantáneas de registros) que tienen algún estado privilegiado. Proporcionar una solución general (RISC) es más difícil que proporcionar una solución a uno o algunos casos especiales (CISC), pero es más poderoso y menos vulnerable a la acumulación de casos especiales. Si uno cree que los casos especiales importantes son pocos, CISC puede ser más atractivo.
Las instrucciones complejas también pueden ocultar el estado del software. Una ventaja destacada de esto sería para guardar y restaurar el contexto. Con instrucciones que guardan y restauran el estado, la arquitectura solo necesita comunicar el tamaño del contexto al sistema operativo, no los mecanismos específicos para transferir el estado a la memoria. Esto permite que las aplicaciones que se ejecutan en un sistema operativo heredado usen extensiones ISA que agregan estado. (Nuevamente, el software PAL podría proporcionar la misma funcionalidad).
Gran parte de la complejidad de x86 proviene de la compatibilidad en muchas extensiones. Con instrucciones complejas y menos ortogonales (útiles para la densidad de código), eliminando algunos trabajos que resultaron no ser comúnmente necesarios, evitando cadenas de dependencia innecesarias (por ejemplo, solo un bit de acarreo, solo un registro de cantidad de desplazamiento dinámico), agregando algo de trabajo que resultó fuera de uso común y que puede optimizarse dentro de la instrucción compleja: cualquiera de estos requeriría agregar una nueva instrucción y hacer que el ISA sea menos estéticamente agradable.
En muchos casos, un RISC no encontraría tales problemas porque las instrucciones son altamente ortogonales y primitivas. En algunos casos, un RISC podría necesitar agregar nuevas primitivas, pero normalmente sería aplicable a más de un uso.
Además, una vez que la infraestructura está en su lugar para soportar instrucciones complejas, las barreras se reducen para obtener instrucciones complejas adicionales. Es decir, gran parte del costo de instrucciones complejas no recurrentes. Los ISA RISC sufren un obstáculo complementario a la introducción de las características CISCy.
La frecuencia de extensión de x86 también puede atribuirse parcialmente a su popularidad para la informática de propósito general y el modelo de procesador comercial (esto también aumenta la importancia de la compatibilidad binaria). Los ISA RISC a menudo se han vinculado a proveedores de sistemas que fomentan un enfoque más limitado en las aplicaciones y la falta de competencia para la implementación de un ISA RISC específico desalienta el uso de extensiones de conjuntos de instrucciones para el marketing. La popularidad también hace que el costo de desarrollar nuevas extensiones sea menos significativo (los gastos no recurrentes son menos importantes a un volumen mayor).
La filosofía de compatibilidad x86 probablemente también sesga hacia la ampliación de los mecanismos existentes en lugar de proporcionar un descanso más limpio, lo que significa que las nuevas funciones están más influenciadas por las existentes. Una mayor frecuencia de extensión también fomenta cambios más incrementales, lo que fomenta la reutilización de mecanismos y tiende a reducir la ortogonalidad.
Comparando una presentación académica de MIPS clásico (que es un subconjunto de versiones modernas de MIPS y excluye varias extensiones ISA opcionales) a x86 moderno (que rastrea la compatibilidad binaria hasta el 8086 de 16 bits y la cuasi-compatibilidad de nivel de ensamblaje aún más atrás) con todo su equipaje histórico no presenta el mejor caso para CISC ni un caso realista para RISC.