Há muitas razões pelas quais alguém escolheria implementar um CISC. O motivo mais importante é a compatibilidade binária com um conjunto de instruções CISC existente. Embora a tecnologia de tradução binária de software tenha melhorado, a compatibilidade baseada em hardware tem algumas vantagens técnicas (bem como a desvantagem de menos cache de tradução) e a vantagem menos técnica de parecer mais confiável.
A densidade do código é talvez o segundo motivo mais significativo para a escolha do CISC. O Renesas RX foi projetado como um CISC especificamente para a densidade de código, pois visa microcontroladores onde o tamanho da memória de código é um fator de custo significativo. Instruções de comprimento variável, instruções complexas (principalmente modos de endereçamento), operandos implícitos e registro mais baixo contam toda a densidade do código de benefício.
Uma razão histórica (e na minha opinião equivocada) para escolher o CISC foi fechar a lacuna semântica entre os programadores que usam uma linguagem de nível superior e o processador. Como instruções complexas geralmente podem ser substituídas por uma sequência de instruções mais simples, a complexidade de um compilador de linguagem de nível superior para um RISC não precisa ser muito mais complexa do que para um CISC de correspondência de idioma. O RISC evita "conflito semântico" (onde uma instrução do processador funciona mais ou menos do que uma declaração de idioma correspondente) e facilita a redução de força e otimizações de programação. (Consulte "Quais são as vantagens e desvantagens no esforço de desenvolvimento do compilador relacionadas ao CISC vs. RISC?" Para obter mais detalhes.)
Pode haver um custo fixo significativo associado à execução de uma instrução. Isso incentiva o uso de instruções relativamente complexas para espalhar essa sobrecarga por trabalhos mais reais; reduzir a contagem dinâmica de instruções pode melhorar o desempenho. Quando o custo da lógica e da RAM era muito maior que o custo da ROM, o incentivo para instruções complexas era significativo, uma vez que uma instrução era decodificada ao procurar o microcódigo.
Um motivo para usar o CISC que talvez seja contradito por evidências históricas é que o microcódigo pode ser otimizado para cada microarquitetura, enquanto as bibliotecas padrão podem demorar para explorar os recursos de uma nova implementação. O nível de otimização das implementações de software de memcopy versus o do microcódigo para REP MOVSB implica que as bibliotecas podem receber mais atenção do que o microcódigo. Parte disso pode vir do fornecedor do processador que visa uma base de usuários mais ampla, pelo que a justificativa do esforço pode ser mais difícil em comparação com o software de código aberto ou interno, onde os interesses localizados de desenvolvedores ou usuários podem influenciar o esforço de implementação.
Ser capaz de enviar uma biblioteca padrão otimizada com o processador tem atrações significativas. O armazenamento e a execução de uma biblioteca padrão de plataforma podem ser significativamente otimizados pelo código de código de hardware e software. A distinção entre uma instrução complexa e uma chamada da camada de abstração da plataforma pode ser sutil (ou inexistente). Um design RISC poderia usar as mesmas técnicas de implementação para lidar com chamadas PAL que um CISC faz para instruções complexas, incluindo o uso de operações não fornecidas no conjunto de instruções geral com hardware especializado, armazenamento em cache e decodificação inteligentes e especificação de operandos de registro (embora um CISC freqüentemente usam registros dedicados semelhantes a uma ABI por função). O modelo mental associado ao CISC pode incentivar essas otimizações. Além disso, os usuários podem ficar menos ofendidos com a inclusão forçada de um "
A decodificação de instruções relativamente complexas pode ter menos sobrecarga (e possivelmente ser mais confiável na intenção de discernir) do que a técnica RISC comparável de reconhecimento de idiomas, onde uma sequência de instruções é reconhecida como uma unidade semântica. Essa diferença de sobrecarga seria mais perceptível em uma implementação menor, mas a sobrecarga de usar essas informações reduz o significado da economia de decodificação.
Informações contextuais adicionais podem facilitar a otimização do hardware. Por exemplo, ao incrementar um valor na memória, o hardware pode reconhecer que o endereço de memória é usado duas vezes (para carregar e armazenar), oferecendo uma oportunidade para armazenamento em cache de memorização e conversão. Instruções complexas podem fornecer essas informações explicitamente. Em uma instrução complexa, os valores intermediários têm uma vida útil explícita (a da instrução); com um registro tradicional RISC, os valores devem ser substituídos explicitamente para indicar o fim da vida útil. (Nota: Um RISC pode especificar um registro que é sempre zerado após cada uso, fornecendo um meio para especificar um valor temporário de uso único. Essas instruções seriam moderadamente mais complexas.)
Se os detalhes da implementação não estiverem ocultos atrás de uma camada de abstração, torna-se mais difícil usar microarquiteturas diferentes para otimizar diferentes tradeoffs. A exposição de detalhes da microarquitetura como garantias arquitetônicas trava a microarquitetura na garantia de compatibilidade. Embora o software PAL possa ser otimizado da mesma forma que as instruções complexas, isso exige um código de hardware e software. A separação e a diversidade organizacional dificultam o design de código.
Instruções complexas podem fornecer acesso protegido ao estado privilegiado. Por exemplo, instruções complexas geralmente são atômicas em relação a interrupções. Embora um conjunto de instruções RISC possa fornecer um mecanismo no nível do usuário para suspender temporariamente as interrupções, possivelmente até algo como carga vinculada, para que o software tente explicitamente a operação se interrompido, desde que isso não seja típico para RISCs.
Da mesma forma, uma instrução complexa pode fornecer acesso controlado e / ou uso de informações privilegiadas. Como a operação executada tem semântica controlada, a violação real de privilégios pode ser evitada. As alternativas orientadas para RISC incluem código PAL (que normalmente possui sobrecarga significativa) e acesso mascarado a registros de configuração (ou cópias de sombra de registros) que possuem algum estado privilegiado. Fornecer uma solução geral (RISC) é mais difícil do que fornecer uma solução para um ou alguns casos especiais (CISC), mas é mais poderoso e menos vulnerável ao acúmulo de casos especiais. Se alguém acredita que os casos especiais importantes são poucos, o CISC pode ser mais atraente.
Instruções complexas também podem ocultar o estado do software. Uma vantagem proeminente disso seria para salvar e restaurar o contexto. Com instruções para salvar e restaurar o estado, a arquitetura precisa apenas comunicar o tamanho do contexto ao sistema operacional e não os mecanismos específicos para transferir o estado para a memória. Isso permite que aplicativos executados em um sistema operacional herdado usem extensões ISA que adicionam estado. (Mais uma vez, o software PAL poderia fornecer a mesma funcionalidade.)
Grande parte da complexidade do x86 vem da compatibilidade em várias extensões. Com instruções complexas e menos ortogonais (úteis para a densidade do código), a remoção de algum trabalho que acabou sendo desnecessário, evitando cadeias de dependência desnecessárias (por exemplo, apenas um bit de transporte, apenas um registro de quantidade de deslocamento dinâmico), adicionando algum trabalho que para ser comumente usado e que pode ser otimizado dentro das instruções complexas - qualquer uma delas exigiria adicionar uma nova instrução e tornar o ISA menos esteticamente agradável.
Em muitos casos, um RISC não encontraria esses problemas porque as instruções são altamente ortogonais e primitivas. Em alguns casos, um RISC pode precisar adicionar novas primitivas, mas isso normalmente seria aplicável a mais de um uso.
Além disso, uma vez que a infraestrutura está instalada para oferecer suporte a instruções complexas, as barreiras são reduzidas para instruções complexas adicionais. Ou seja, muito do custo de instruções complexas não é recorrente. Os ISAs fortemente RISC sofrem um impedimento complementar à introdução dos recursos do CISCy.
A frequência de extensão do x86 também pode ser parcialmente atribuída à sua popularidade na computação de uso geral e no modelo de processador comercial (isso também aumenta a importância da compatibilidade binária). Os ISA RISC têm sido frequentemente vinculados aos fornecedores de sistemas, o que incentiva um foco mais restrito nos aplicativos e a falta de concorrência pelas implementações de um ISA RISC específico desencoraja um pouco o uso de extensões de conjunto de instruções para marketing. A popularidade também reduz o custo de desenvolvimento de novas extensões (despesas não recorrentes são menos importantes em volumes mais altos).
A filosofia de compatibilidade do x86 provavelmente também inclina a extensão dos mecanismos existentes, em vez de fornecer uma pausa mais limpa, o que significa que os novos recursos são mais influenciados pelos recursos existentes. Maior frequência de extensão também incentiva mudanças mais incrementais, o que incentiva mecanismos de reutilização, tendendo a reduzir a ortogonalidade.
Comparando uma apresentação acadêmica do MIPS clássico (que é um subconjunto de versões modernas do MIPS e excluindo várias extensões ISA opcionais) com o x86 moderno (que rastreia a compatibilidade binária até o 8086 de 16 bits e a quase compatibilidade no nível de montagem ainda mais atrás) com toda a sua bagagem histórica, não apresenta o melhor argumento para o CISC nem um argumento realista para o RISC.