Un conjunto de instrucciones comprimido , o simplemente instrucciones comprimidas , es una variación de la arquitectura del conjunto de instrucciones (ISA) de un microprocesador que permite representar las instrucciones en un formato más compacto. En la mayoría de los casos prácticos, las instrucciones comprimidas tienen 16 bits de longitud en un procesador que, de otro modo, usaría instrucciones de 32 bits. La ISA de 16 bits es un subconjunto de la ISA completa de 32 bits, no un conjunto de instrucciones independiente. El formato más pequeño implica algunas desventajas: generalmente, hay menos instrucciones disponibles, dos operandos por instrucción en lugar de tres, y se pueden usar menos registros del procesador .
El concepto fue introducido originalmente por Hitachi como una forma de mejorar la densidad de código de su procesador RISC SuperH al pasar de instrucciones de 16 bits a 32 bits en la versión SH-5. El nuevo diseño tenía dos conjuntos de instrucciones: uno que daba acceso a toda la arquitectura del conjunto de instrucciones (ISA) del nuevo diseño, y un conjunto más pequeño de 16 bits conocido como SHcompact que permitía que los programas se ejecutaran en cantidades menores de memoria principal . Dado que la memoria incluso de los sistemas más pequeños es ahora mucho mayor que la de los sistemas que dieron origen al concepto, el tamaño ya no es la principal preocupación. Hoy en día, la ventaja es que reduce el número de accesos a la memoria principal y, por lo tanto, reduce el consumo de energía en los dispositivos móviles .
Las patentes de Hitachi fueron licenciadas por Arm Ltd. para sus procesadores, donde se conocía como "Thumb". Sistemas similares se encuentran en MIPS16e y PowerPC VLE. Las patentes originales han expirado y el concepto se puede encontrar en varios diseños modernos, incluido RISC-V , que fue diseñado desde el principio para usarlo. La introducción de la computación de 64 bits ha hecho que el término ya no se use tan ampliamente; estos procesadores generalmente usan instrucciones de 32 bits y técnicamente son una forma de ISA comprimida, pero como son en su mayoría versiones modificadas de una ISA anterior de una versión de 32 bits de la misma familia de procesadores, no hay compresión real.
Concepto
Los microprocesadores codifican sus instrucciones como una serie de bits , normalmente divididos en varios bytes de 8 bits . Por ejemplo, en el MOS 6502 , la ADCinstrucción realiza una suma binaria entre un valor de operando y el valor ya almacenado en el acumulador . El procesador puede encontrar el operando en varios lugares: en la memoria principal , en la página cero especial o como una constante explícita como "10". Cada una de estas variantes utiliza una instrucción de 8 bits o código de operación diferente ; si se quisiera sumar la constante 10 al acumulador, la instrucción se codificaría en memoria como $69 $0A, donde $0A es el valor hexadecimal para el valor decimal 10. Si, en cambio, se tratara de sumar el valor almacenado en la memoria principal en la ubicación $4400, sería $6D $00 $44, con una dirección little-endian . [ 1 ]
Nótese que la segunda instrucción requiere tres bytes porque la dirección de memoria tiene 16 bits de longitud. Dependiendo de la instrucción, podría usar uno, dos o tres bytes. [ 1 ] Esto ahora se conoce como un conjunto de instrucciones de longitud variable , aunque ese término no era común en ese momento, ya que la mayoría de los procesadores, incluidos los mainframes y los minicomputadores , normalmente usaban alguna variación de este concepto y simplemente no necesitaba un nombre. Incluso a finales de la década de 1970, cuando los microprocesadores comenzaron a pasar de formatos de 8 bits a 16, este concepto siguió siendo común; el Intel 8086 continuó usando códigos de operación de 8 bits que podían ir seguidos de cero a cinco bytes adicionales dependiendo del modo de direccionamiento . [ 2 ]
Fue durante la transición a sistemas de 32 bits, y especialmente cuando el concepto RISC comenzó a dominar el diseño de procesadores, que las instrucciones de longitud variable empezaron a desaparecer. En la arquitectura MIPS , por ejemplo, todas las instrucciones son un único valor de 32 bits, con un código de operación de 6 bits en los bits más significativos y los 26 bits restantes utilizados de diversas maneras para representar su conjunto limitado de modos de direccionamiento. La mayoría de los diseños RISC son similares. La transición a un formato de instrucción de longitud fija fue uno de los conceptos clave del diseño que impulsaron el rendimiento de los primeros diseños RISC; en los sistemas de longitud variable, la instrucción podía tardar entre uno y seis ciclos de memoria en leerse, lo que requería interconexión entre las distintas partes de la lógica para garantizar que el procesador no intentara ejecutar la instrucción antes de que los datos estuvieran listos. En los diseños RISC, las operaciones normalmente tardan un ciclo, lo que simplifica enormemente la decodificación. El ahorro en estos circuitos de interconexión se aplica, en cambio, a lógica adicional o a la adición de registros del procesador , lo que tiene un impacto directo en el rendimiento. [ 3 ]
Densidad de código
La desventaja del enfoque RISC es que muchas instrucciones simplemente no requieren cuatro bytes. Por ejemplo, la instrucción Logical Shift Left desplaza los bits de un registro hacia la izquierda. En el 6502, que solo tiene un único registro aritmético A, esta instrucción puede representarse completamente mediante su código de operación de 8 bits $06. [ 1 ] En procesadores con más registros, todo lo que se necesita es el código de operación y el número de registro, otros 4 o 5 bits. En MIPS, por ejemplo, la instrucción solo necesita un código de operación de 6 bits y un número de registro de 5 bits para un total de 11 bits. Pero, como ocurre con la mayoría de los diseños RISC, la instrucción aún ocupa 32 bits completos. Como este tipo de instrucciones son relativamente comunes, los programas RISC generalmente ocupan más memoria que el mismo programa en un procesador de longitud variable. [ 4 ] [ a ]
En la década de 1980, cuando el concepto RISC comenzaba a surgir, el aumento del tamaño de los programas era un motivo de queja común. A medida que las instrucciones ocupaban más espacio, el sistema tenía que dedicar más tiempo a leerlas de la memoria. Se sugirió que estos accesos adicionales podrían ralentizar el programa. Sin embargo, extensas pruebas de rendimiento demostraron que RISC era más rápido en casi todos los casos, y este argumento se desvaneció. No obstante, existen casos en los que el uso de la memoria sigue siendo una preocupación, independientemente del rendimiento, como en sistemas pequeños y aplicaciones embebidas. Incluso a principios de la década de 2000, el precio de la DRAM era tan elevado que los dispositivos sensibles al costo tenían memoria limitada. Fue para este mercado que Hitachi desarrolló el diseño SuperH . [ 6 ]
En los primeros diseños de SuperH, SH-1 a SH-4, las instrucciones siempre ocupaban 16 bits. El conjunto de instrucciones resultante tenía limitaciones prácticas; por ejemplo, solo podía realizar operaciones matemáticas de dos operandos de la forma A = A + B, mientras que la mayoría de los procesadores de la época utilizaban el formato de tres operandos, A = B + C. Al eliminar un operando, se eliminaban cuatro bits de la instrucción (hay 16 registros, que necesitan 4 bits), aunque esto conllevaba una mayor complejidad en la escritura del código matemático. Para los mercados a los que se dirigía SuperH, esta era una compensación fácil de asumir. Una ventaja significativa del formato de 16 bits es que la caché de instrucciones ahora almacena el doble de instrucciones para cualquier cantidad dada de SRAM . Esto permite que el sistema funcione a velocidades más altas, aunque parte de esto podría verse mitigado por el uso de instrucciones adicionales necesarias para realizar operaciones que podrían realizarse con una sola instrucción de 3 operandos. [ 7 ]
Para el SH-5, Hitachi adoptó un formato de instrucción de 32 bits. Para garantizar la compatibilidad con sus diseños anteriores, incluyó un segundo conjunto de instrucciones, SHcompact. SHcompact mapeaba las instrucciones originales de 16 bits en una sola dirección a la instrucción interna de 32 bits; no realizaba múltiples instrucciones como ocurría en los procesadores microcodificados anteriores , sino que simplemente ofrecía un formato más pequeño para la misma instrucción. Esto permitió portar fácilmente los programas originales de formato pequeño al nuevo SH-5, sin aumentar significativamente la complejidad del decodificador de instrucciones . [ 8 ]
ARM obtuvo licencias de varias patentes de Hitachi sobre aspectos del diseño de instrucciones y las utilizó para implementar sus instrucciones Thumb. Los procesadores ARM con una "T" en su nombre incluían este conjunto de instrucciones además de sus versiones originales de 32 bits, y podían cambiarse del modo de 32 al de 16 bits sobre la marcha mediante el BXcomando. En el modo Thumb, solo son visibles los ocho registros superiores de los dieciséis registros normales de ARM, pero estos son los mismos registros que en el modo de 32 bits y, por lo tanto, se pueden pasar datos entre Thumb y el código normal utilizando esos registros. Cada instrucción Thumb era una contraparte de una versión de 32 bits, por lo que Thumb era un subconjunto estricto del ISA original. [ 9 ] Una diferencia clave entre el modelo de ARM y SuperH es que Thumb conserva algunas instrucciones de tres operandos en el formato de 16 bits, lo que se logró reduciendo el archivo de registros visibles a ocho, por lo que solo se requieren 3 bits para seleccionar un registro. [ 10 ]
La arquitectura MIPS también añadió un conjunto comprimido similar en su MIPS16e, que es muy similar a Thumb. También permite el uso de solo ocho registros, aunque no se trata simplemente de los primeros ocho; el diseño MIPS utiliza el registro 0 como registro cero , por lo que los registros 0 y 1 en modo de 16 bits se asignan a los registros 16 y 17 de MIPS32. La mayoría de los demás detalles del sistema son similares a Thumb. [ 11 ] Asimismo, la última versión de la Power ISA , anteriormente PowerPC , incluye las instrucciones "VLE", que son esencialmente idénticas. Estas se añadieron a petición de Freescale Semiconductor , cuyo interés en Power se centra principalmente en el mercado de sistemas embebidos. [ 12 ]
Uso moderno
A partir de 2015, muchos procesadores adoptaron un formato de 64 bits. Generalmente, conservaron un formato de instrucciones de 32 bits, pero ampliaron los registros internos a un formato de 64 bits. Según la definición original, se trata de instrucciones comprimidas, ya que son más pequeñas que el tamaño de la palabra de datos básica. Sin embargo, este término no se utiliza en este contexto; las referencias a instrucciones comprimidas se refieren invariablemente a versiones de 16 bits. [ 13 ]
Notas
- ↑ Una excepción notable entre los diseños RISC es la arquitectura IBM 801 , que mantiene cinco formatos de instrucción: dos que utilizan una longitud de instrucción de 16 bits y tres que utilizan una longitud de instrucción de 32 bits. Para las instrucciones que requieren menos espacio, como las instrucciones de desplazamiento que emplean solo operandos de registro, se utilizan los formatos de instrucción más cortos de 16 bits. [ 5 ]
Referencias
Citas
- 1 2 3 Verts 2004 .
- ↑ "Comprendiendo las arquitecturas ARM" . informIT . 23 de agosto de 2010.
- ↑ Bacon, Jason. "Formatos de código de instrucción MIPS" . Apuntes de clase de Ciencias de la Computación 315. Archivado del original el 17 de julio de 2019. Consultado el 9 de abril de 2021 .
- ↑ Weaver y McKee 2009 .
- ↑ Principios de funcionamiento del sistema 801 (PDF) . International Business Machines. 16 de enero de 1976. págs. 10, 51–58 . Consultado el 11 de noviembre de 2024 .
- ↑ "Efectos de las instrucciones de 16 bits" . Renesas .
- ↑ SuperH 1996 .
- ↑ Núcleo de CPU SH-5, Volumen 1: Arquitectura (PDF) . pág. 8.
- ↑ Lemieux 2004 .
- ↑ "Resumen de instrucciones para el pulgar" . Manual de referencia técnica de ARM7TDMI .
- ↑ Manual de referencia técnica de la extensión específica para aplicaciones MIPS16e2 . MIPS. 26 de abril de 2016.
- ↑ Power ISA V2.07 . IBM.
- ↑ Manual de Arquitectura Alpha (PDF) . DIC. Octubre de 1996. pág. 1.4.
Bibliografía
- Weaver, Vincent; McKee, Sally (2009). Problemas de densidad de código para nuevas arquitecturas (PDF) . ICCD 2009.
- Verts, William (30 de enero de 2004). "El procesador 6502" (PDF) . Universidad de Massachusetts .
- Lemieux, Joe (24 de septiembre de 2004). "Introducción al pulgar ARM" . Embedded .
- Motor RISC SuperH SH-1/SH-2 (PDF) . Hitachi America. 3 de septiembre de 1996.
- Arquitecturas de conjuntos de instrucciones
- Hitachi