stringtranslate.com

Conjunto de instrucciones comprimido

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 ejemplos del mundo real, las instrucciones comprimidas tienen una longitud de 16 bits en un procesador que, de otro modo, utilizarí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 requiere algunas concesiones: por lo general, hay menos instrucciones disponibles y se pueden utilizar menos registros del procesador .

El concepto fue introducido originalmente por Hitachi como una forma de mejorar la densidad de código de su diseño de procesador SuperH RISC a medida que pasaba 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 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 más pequeñas de memoria principal . Como la memoria de incluso los sistemas más pequeños es ahora órdenes de magnitud más grande que los sistemas que generaron el 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 uso 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". Se encuentran sistemas similares 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 comprimido, pero como en su mayoría son versiones modificadas de una ISA más antigua 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 un número de bytes de 8 bits . Por ejemplo, en el MOS 6502 , la ADCinstrucción realiza una suma binaria entre el valor de un operando y el valor ya almacenado en el acumulador . Hay una variedad de lugares en los que el procesador puede encontrar el operando; puede estar ubicado en la memoria principal , o en la página cero especial , o ser una constante explícita como "10". Cada una de estas variaciones usaba una instrucción de 8 bits diferente, o código de operación ; si uno quisiera agregar la constante 10 al acumulador, la instrucción se codificaría en la memoria como $69 $0A, donde $0A es hexadecimal para el valor decimal 10. Si en cambio estuviera agregando el valor almacenado en la memoria principal en la ubicación $4400, sería $6D $00 $44, con una dirección little-endian . [1]

Tenga en cuenta que la segunda instrucción requiere tres bytes porque la dirección de memoria tiene una longitud de 16 bits. Dependiendo de la instrucción, puede utilizar 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 minicomputadoras , normalmente usaban alguna variación de este concepto. Incluso a fines 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 8088 continuó utilizando códigos de operación de 8 bits que podían ser seguidos por cero a seis bytes adicionales según el modo de direccionamiento . [2]

Fue durante la transición a los sistemas de 32 bits, y especialmente cuando el concepto RISC comenzó a apoderarse del diseño de procesadores, que las instrucciones de longitud variable comenzaron 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 se utilizan de diversas formas que representan su conjunto limitado de modos de direccionamiento. La mayoría de los diseños RISC son similares. Pasar a un formato de instrucción de longitud fija fue uno de los conceptos de diseño clave detrás del rendimiento de los primeros diseños RISC; en sistemas anteriores, la instrucción podía tardar entre uno y seis ciclos de memoria en leerse, lo que requería un cableado entre varias 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 toman un ciclo, lo que simplifica enormemente la decodificación. Los ahorros en estos circuitos entrelazados se aplican en cambio a lógica adicional o a la adición de registros del procesador , que tienen 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 de desplazamiento lógico a la izquierda desplaza los bits de un registro hacia la izquierda. En el 6502, que tiene un solo registro aritmético A, esta instrucción se puede representar 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. Pero, como es el caso de 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]

En la década de 1980, cuando el concepto RISC estaba surgiendo por primera vez, este era un punto de queja común. Como las instrucciones ocupaban más espacio, el sistema tenía que dedicar más tiempo a leer instrucciones de la memoria. Se sugirió que estos accesos adicionales podrían, en realidad, ralentizar el programa. Una evaluación comparativa exhaustiva finalmente demostró que RISC era más rápido en casi todos los casos, y este argumento se desvaneció. Sin embargo, hay casos en los que el uso de la memoria sigue siendo una preocupación independientemente del rendimiento, y esto ocurre en sistemas pequeños y aplicaciones integradas. Incluso a principios de la década de 2000, el precio de la DRAM era suficiente para que los dispositivos sensibles al costo tuvieran memoria limitada. Fue para este mercado que Hitachi desarrolló el diseño SuperH . [5]

En los diseños anteriores de SuperH, SH-1 a SH-4, las instrucciones siempre ocupan 16 bits. El conjunto de instrucciones resultante tiene limitaciones en el mundo real; por ejemplo, solo puede realizar operaciones matemáticas de dos operandos de la forma A = A + B, mientras que la mayoría de los procesadores de la época usaban el formato de tres operandos, A = B + C. Al eliminar un operando, se eliminan cuatro bits de la instrucción (hay 16 registros, que necesitan 4 bits), aunque esto se hace a costa de hacer que el código matemático sea algo más complejo de escribir. Para los mercados a los que se dirigía el SuperH, esto era un compromiso fácil de hacer. Una ventaja significativa del formato de 16 bits es que la caché de instrucciones ahora contiene el doble de instrucciones para cualquier cantidad dada de SRAM . Esto permite que el sistema funcione a velocidades más altas, aunque parte de eso podría mitigarse mediante el uso de instrucciones adicionales necesarias para realizar operaciones que podrían realizarse con una sola instrucción de 3 operandos. [6]

Para el SH-5, Hitachi adoptó un formato de instrucciones de 32 bits. Para ofrecer compatibilidad con sus diseños anteriores, incluyeron un segundo conjunto de instrucciones, SHcompact. SHcompact asignaba las instrucciones originales de 16 bits en un solo sentido a la instrucción interna de 32 bits; no ejecutaba múltiples instrucciones como sería el caso en los procesadores microcodificados anteriores , era simplemente un formato más pequeño para la misma instrucción. Esto permitió que los programas originales de formato pequeño se pudieran trasladar fácilmente al nuevo SH-5, al tiempo que añadía poco a la complejidad del decodificador de instrucciones . [7]

ARM obtuvo la licencia 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 el nombre incluían este conjunto de instrucciones además de sus versiones originales de 32 bits, y podían cambiarse del modo de 32 a 16 bits sobre la marcha utilizando el BXcomando. Cuando se está en modo Thumb, solo los ocho registros superiores de los dieciséis registros normales de ARM son visibles, pero estos son los mismos registros que en el modo de 32 bits y, por lo tanto, los datos se pueden pasar 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. [8] 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 logró reduciendo el archivo de registros visibles a ocho, por lo que solo se requieren 3 bits para seleccionar un registro. [9]

La arquitectura MIPS también agregó un conjunto comprimido similar en su MIPS16e, que es muy similar a Thumb. También permite que se usen solo ocho registros, aunque no son simplemente los primeros ocho; el diseño MIPS usa el registro 0 como registro cero , por lo que los registros 0 y 1 en modo de 16 bits se asignan en cambio a los registros 16 y 17 de MIPS32. La mayoría de los demás detalles del sistema son similares a Thumb. [10] Asimismo, la última versión de Power ISA , anteriormente PowerPC , incluye las instrucciones "VLE" que son esencialmente idénticas. Estas se agregaron a instancias de Freescale Semiconductor , cuyo interés en Power está dirigido principalmente al mercado integrado. [11]

Uso moderno

A partir de 2015, muchos procesadores han pasado a un formato de 64 bits. Estos, por lo general, 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 invariablemente se refieren a versiones de 16 bits. [12]

Referencias

Citas

  1. ^abc Verdes 2004.
  2. ^ "Entendiendo las arquitecturas ARM". informIT . 23 de agosto de 2010.
  3. ^ Bacon, Jason. "Formatos de código de instrucción MIPS". Apuntes de la clase de Ciencias de la Computación 315. Archivado desde el original el 2019-07-17 . Consultado el 2021-04-09 .
  4. ^ Weaver y McKee 2009.
  5. ^ "Efectos de las instrucciones de 16 bits". Renesas .
  6. ^ SuperH 1996.
  7. ^ Núcleo de CPU SH-5, Volumen 1: Arquitectura (PDF) . pág. 8.
  8. ^ Lemieux 2004.
  9. ^ "Resumen de instrucciones del pulgar". Manual de referencia técnica ARM7TDMI .
  10. ^ Manual de referencia técnica de extensión específica de la aplicación MIPS16e2 . MIPS. 26 de abril de 2016.
  11. ^ Power ISA V2.07. IBM.
  12. ^ Manual de arquitectura Alpha (PDF) . DIC. Octubre de 1996. pág. 1.4.

Bibliografía