Un registro de procesador es una ubicación de acceso rápido disponible para el procesador de una computadora . [1] Los registros generalmente consisten en una pequeña cantidad de almacenamiento rápido , aunque algunos registros tienen funciones de hardware específicas y pueden ser de solo lectura o solo escritura. En la arquitectura de computadoras , los registros generalmente se direccionan mediante mecanismos distintos a la memoria principal , pero en algunos casos se les puede asignar una dirección de memoria, por ejemplo, DEC PDP-10 , ICT 1900. [ 2]
Casi todas las computadoras, ya sea que tengan arquitectura de carga/almacenamiento o no, cargan elementos de datos desde una memoria más grande en registros donde se usan para operaciones aritméticas , operaciones bit a bit y otras operaciones, y son manipulados o probados por instrucciones de máquina . Los elementos manipulados luego suelen almacenarse nuevamente en la memoria principal, ya sea por la misma instrucción o por una posterior. Los procesadores modernos usan RAM estática o dinámica como memoria principal, y a esta última generalmente se accede a través de uno o más niveles de caché .
Los registros del procesador normalmente se encuentran en la parte superior de la jerarquía de memoria y proporcionan la forma más rápida de acceder a los datos. El término normalmente se refiere solo al grupo de registros que están codificados directamente como parte de una instrucción, según lo definido por el conjunto de instrucciones . Sin embargo, las CPU modernas de alto rendimiento a menudo tienen duplicados de estos "registros arquitectónicos" para mejorar el rendimiento mediante el cambio de nombre de los registros , lo que permite la ejecución paralela y especulativa . El diseño x86 moderno adquirió estas técnicas alrededor de 1995 con los lanzamientos de Pentium Pro , Cyrix 6x86 , Nx586 y AMD K5 .
Cuando un programa informático accede a los mismos datos repetidamente, se habla de localidad de referencia . Mantener valores utilizados con frecuencia en registros puede ser fundamental para el rendimiento de un programa. La asignación de registros la realiza un compilador en la fase de generación de código o un programador en lenguaje ensamblador de forma manual .
Los registros se miden normalmente por la cantidad de bits que pueden almacenar, por ejemplo, un " registro de 8 bits ", un " registro de 32 bits ", un " registro de 64 bits " o incluso más. En algunos conjuntos de instrucciones , los registros pueden operar en varios modos, dividiendo su memoria de almacenamiento en partes más pequeñas (32 bits en cuatro de 8 bits, por ejemplo) en las que se pueden cargar y operar múltiples datos (vector o matriz unidimensional de datos) al mismo tiempo. Por lo general, se implementa agregando registros adicionales que mapean su memoria en un registro más grande. Los procesadores que tienen la capacidad de ejecutar instrucciones individuales en múltiples datos se denominan procesadores vectoriales .
Un procesador a menudo contiene varios tipos de registros, que pueden clasificarse según los tipos de valores que pueden almacenar o las instrucciones que operan sobre ellos:
Los registros de hardware son similares, pero ocurren fuera de las CPU.
En algunas arquitecturas (como SPARC y MIPS ), el primer o último registro del archivo de registros enteros es un pseudoregistro , ya que está programado para devolver siempre cero cuando se lee (principalmente para simplificar los modos de indexación) y no se puede sobrescribir. En Alpha , esto también se hace para el archivo de registros de punto flotante. Como resultado de esto, los archivos de registros se citan comúnmente como si tuvieran un registro más de la cantidad de ellos que son realmente utilizables; por ejemplo, se citan 32 registros cuando solo 31 de ellos encajan en la definición anterior de un registro.
La siguiente tabla muestra la cantidad de registros en varias arquitecturas de CPU convencionales. Tenga en cuenta que en los procesadores compatibles con x86 , el puntero de pila ( ESP
) se considera un registro entero, aunque existe una cantidad limitada de instrucciones que se pueden usar para operar sobre su contenido. Se aplican advertencias similares a la mayoría de las arquitecturas.
Aunque todas las arquitecturas que se enumeran a continuación son diferentes, casi todas se encuentran en una disposición básica conocida como arquitectura de von Neumann , propuesta por primera vez por el matemático húngaro-estadounidense John von Neumann . También es digno de mención que la cantidad de registros en las GPU es mucho mayor que en las CPU.
Arquitectura | GPR/registros de datos y direcciones | Registros FP | Notas |
---|---|---|---|
El hobbit de AT&T | 00 0 | pila de 7 | Todas las instrucciones de manipulación de datos funcionan únicamente dentro de registros, y los datos deben trasladarse a un registro antes de procesarse. |
Crayón 1 [3] | 8 datos escalares, 8 direcciones | 8 escalares, 8 vectoriales (64 elementos) | Los registros de datos escalares pueden ser enteros o de punto flotante; también 64 registros escalares T de bloc de notas y 64 registros B de bloc de notas de dirección |
4004 [4] | 1 acumulador, 16 más | 00 0 | |
8008 [5] | 1 acumulador, 6 más | 00 0 | El registro A es un acumulador en el que se realizan todas las operaciones aritméticas; los registros H y L se pueden utilizar en combinación como un registro de dirección; todos los registros se pueden utilizar como operandos en instrucciones de carga/almacenamiento/movimiento/incremento/decremento y como el otro operando en instrucciones aritméticas. No hay ninguna unidad de punto flotante (FPU) disponible. |
8080 [6] | 1 acumulador, 1 puntero de pila, 6 más | 00 0 | El registro A es un acumulador en el que se realizan todas las operaciones aritméticas; los pares de registros B+C, D+E y H+L se pueden utilizar como registros de dirección en algunas instrucciones; todos los registros se pueden utilizar como operandos en instrucciones de carga/almacenamiento/movimiento/incremento/decremento y como el otro operando en instrucciones aritméticas. Algunas instrucciones solo utilizan H+L; otra instrucción intercambia H+L y D+E. Los procesadores de punto flotante pensados para el 8080 fueron Intel 8231, AMD Am9511 e Intel 8232. También se podían utilizar fácilmente con el Z80 y procesadores similares. |
iAPX432 | 00 0 | pila de 6 | Máquina apiladora |
16 bits x86 [7] | 00 8 | pila de 8 (si hay FP presente) | Los procesadores 8086/8088 , 80186/80188 y 80286 , si se les proporciona un coprocesador 8087 , 80187 o 80287 para operaciones de punto flotante, admiten una pila de registros de 80 bits de ancho y 8 de profundidad con algunas instrucciones capaces de usar registros relativos a la parte superior de la pila como operandos; sin un coprocesador, no se admiten registros de punto flotante. |
IA-32 [8] | 00 8 | pila de 8 (si hay FP presente), 8 (si está presente SSE/MMX) | El procesador 80386 requiere un 80387 para operaciones de punto flotante; los procesadores posteriores tenían operaciones de punto flotante incorporadas y ambos tenían una pila de registros de 80 bits de ancho y 8 bits de profundidad, con algunas instrucciones capaces de usar registros relativos a la parte superior de la pila como operandos. El Pentium III y posteriores tenían el SSE con registros XMM adicionales de 128 bits. |
x86-64 [8] [9] | 0 16 | 16 o 32 (si está disponible AVX-512) | Los registros FP son registros XMM de 128 bits, ampliados posteriormente a registros YMM de 256 bits con AVX/AVX2 y registros ZMM0–ZMM31 de 512 bits con AVX-512 . [10] |
Fairchild F8 [11] | 1 acumulador, 64 registros de borrador, 1 registro de borrador indirecto (ISAR) | — | Las instrucciones pueden hacer referencia directamente a los primeros 16 registros del bloc de notas y pueden acceder a todos los registros del bloc de notas indirectamente a través del ISAR [12] |
Geoda GX | 1 dato, 1 dirección | 00 8 | Geode GX/ Media GX /4x86/ 5x86 es la emulación del procesador compatible con 486/Pentium fabricado por Cyrix / National Semiconductor . Al igual que Transmeta , el procesador tenía una capa de traducción que traducía el código x86 a código nativo y lo ejecutaba. [ cita requerida ] No admite registros SSE de 128 bits, solo la pila 80387 de ocho registros de punto flotante de 80 bits, y admite parcialmente 3DNow! de AMD. El procesador nativo solo contiene 1 registro de datos y 1 registro de dirección para todos los propósitos y se traduce en 4 rutas de registros de nombres de 32 bits r1 (base), r2 (datos), r3 (puntero posterior) y r4 (puntero de pila) dentro de la memoria SRAM del bloc de notas para operaciones con números enteros. [ cita requerida ] |
Sunplus μ'nSP (SPG200) | 8 (sp, r1-r4, pb, sr, pc) | 00 0 | Un procesador de 16 bits de la empresa taiwanesa Sunplus Technology, que se puede encontrar en la línea de consolas de videojuegos educativos V.Smile de VTech, así como en otras consolas como la Wireless 60 y varios juegos de TV enchufables Jakks Pacific. |
Laboratorios VM Nuon | 00 0 | 00 1 | Procesador de pila de 32 bits desarrollado por VM Labs y especializado en multimedia. Se puede encontrar en la línea de consolas con reproductor de DVD Nuon de la propia empresa y en el Game Wave Family Entertainment System de los juegos ZaPit. El diseño estaba muy influenciado por la tecnología MMX de Intel; contenía una caché de pila unificada de 128 bytes para instrucciones vectoriales y escalares. La caché unificada se puede dividir en ocho registros vectoriales de 128 bits o treinta y dos registros escalares SIMD de 32 bits mediante el cambio de nombre de los bancos; no hay registro entero en esta arquitectura. |
Nios II [13] [14] | 0 31 | 00 8 | Nios II se basa en el conjunto de instrucciones MIPS IV [ cita requerida ] y tiene 31 GPR de 32 bits, con el registro 0 conectado a cero y ocho registros de punto flotante de 64 bits [ cita requerida ] |
Motorola 6800 [15] | 2 datos, 1 índice, 1 pila | 00 0 | |
Motorola 68k [16] | 8 datos (d0–d7), 8 direcciones (a0–a7) | 00 8 (si hay FP presente) | El registro de dirección 8 (a7) es el puntero de la pila. 68000, 68010, 68012, 68020 y 68030 requieren una FPU para punto flotante; 68040 tenía una FPU incorporada. Los registros FP son de 80 bits. |
SH de 16 bits | 00 16 | 00 6 | |
Motor de emociones | 3(VU0)+32(VU1) | 32 SIMD (integrado en UV1) + 2 × 32 Vector (coprocesador vectorial dedicado ubicado cerca de su GPU) | El núcleo principal del Emotion Engine (VU0) es un núcleo general DSP muy modificado destinado a tareas generales en segundo plano y contiene un acumulador de 64 bits, dos registros de datos generales y un contador de programa de 32 bits. Un núcleo ejecutable MIPS III modificado (VU1) es para datos de juego y control de protocolo, y contiene treinta y dos registros de propósito general de 32 bits para el cálculo de números enteros y treinta y dos registros SIMD de 128 bits para almacenar instrucciones SIMD, valores de datos de transmisión y algún valor de cálculo de números enteros, y un registro acumulador para conectar el cálculo general de punto flotante al archivo de registro vectorial en el coprocesador. El coprocesador se construye a través de un archivo de registro vectorial de 128 bits y 32 entradas (solo puede almacenar valores vectoriales que pasan del acumulador en la CPU) y no se incorporan registros enteros. Tanto el coprocesador vectorial (VPU 0/1) como el módulo de procesador principal completo de Emotion Engine (VU0 + VU1 + VPU0 + VPU1) se construyen en base a un conjunto de instrucciones MIPS modificado. El acumulador en este caso no es de propósito general, sino de estado de control. |
CUDA [17] | configurable, hasta 255 por hilo | Las generaciones anteriores permitían hasta 127/63 registros por hilo ( Tesla / Fermi ). Cuantos más registros se configuran por hilo, menos hilos pueden ejecutarse al mismo tiempo. Los registros tienen 32 bits de ancho; por lo tanto, los números de punto flotante de doble precisión y los punteros de 64 bits requieren dos registros. Además, tiene hasta 8 registros de predicado por hilo. [18] | |
Serie CDC 6000 [19] | 0 16 | 00 8 | 8 registros 'A', A0–A7, contienen direcciones de 18 bits; 8 registros 'B', B0–B7, contienen valores enteros de 18 bits (con B0 permanentemente establecido en cero); 8 registros 'X', X0–X7, contienen 60 bits de datos enteros o de punto flotante. Siete de los ocho registros A de 18 bits estaban acoplados a sus registros X correspondientes: establecer cualquiera de los registros A1–A5 en un valor causaba una carga de memoria del contenido de esa dirección en el registro X correspondiente. Del mismo modo, establecer una dirección en los registros A6 o A7 causaba un almacenamiento en memoria en esa ubicación en la memoria desde X6 o X7. (Los registros A0 y X0 no estaban acoplados de esta manera). |
Sistema/360 , [20] Sistema/370 , [21] Sistema/390 , z/Architecture [22] | 0 16 | 4 (si hay FP); 16 en modelos G5 y posteriores S/390 y z/Architecture | El FP era opcional en System/360, y siempre estuvo presente en S/370 y posteriores. En procesadores con Vector Facility, hay 16 registros vectoriales que contienen un número de elementos de 32 bits que depende de la máquina. [23] A algunos registros se les asigna un propósito fijo mediante convenciones de llamada ; por ejemplo, el registro 14 se utiliza para direcciones de retorno de subrutina y, para las ABI ELF , el registro 15 se utiliza como puntero de pila. El procesador S/390 G5 aumentó el número de registros de punto flotante a 16. [24] |
MIX [25] | 256 | 256 | Un conjunto de instrucciones diseñado por Donald Knuth a finales de la década de 1990 con fines pedagógicos. |
NS320xx [26] | 00 8 | 00 8 (si hay FP presente) | |
X10 acelerado | 00 1 | 0 32 | Un procesador de red basado en una máquina de pila de 32/40 bits con un conjunto de instrucciones MIPS modificado y una unidad de punto flotante de 128 bits. [ cita requerida ] |
Hélice de paralaje | 00 0 | 00 2 | Controlador de máquina de pila dividida de ocho núcleos y 8/16 bits con un circuito lógico simple en su interior. Tiene 8 contadores cog (núcleos), cada uno de los cuales contiene tres registros de control especiales de 8/16 bits con 32 bits x 512 RAM de pila. Sin embargo, no contiene ningún registro general para fines de números enteros. A diferencia de la mayoría de los archivos de registro de sombra en los procesadores modernos y los sistemas multinúcleo , se puede acceder a toda la RAM de pila en cog en el nivel de instrucción, lo que permite que todos estos cogs actúen como un solo núcleo de propósito general si es necesario. La unidad de punto flotante es externa y contiene dos registros vectoriales de 80 bits. |
Itanio [27] | 128 | 128 | Y 64 registros de predicado de 1 bit y 8 registros de bifurcación. Los registros de predicado son de 82 bits. |
SPARC [28] | 0 31 | 0 32 | El registro global 0 está cableado a 0. Utiliza ventanas de registro . |
IBM POWER | 0 32 | 0 32 | También se incluyen un registro de enlace, un registro de conteo y un registro de cociente de multiplicación (MQ). |
PowerPC / PowerISA [29] | 0 32 | 0 32 | También se incluyen un registro de enlace y un registro de conteo. Los procesadores que admiten la función Vector también tienen 32 registros vectoriales de 128 bits. |
Aleta negra [30] | 8 datos, 2 acumuladores, 6 direcciones | 00 0 | También se incluyen un puntero de pila y un puntero de marco. Se utilizan registros adicionales para implementar bucles sin sobrecarga y DAG (generadores de direcciones de datos) de búfer circular. |
SPE de células IBM | 128 | 128 registros de propósito general, que pueden contener valores enteros, de dirección o de punto flotante [31] | |
PDP-10 | 0 16 | Todos los registros pueden usarse de manera general (entero, flotante, puntero de pila, salto, indexación, etc.). Cada palabra de memoria (o registro) de 36 bits también puede manipularse como media palabra, que puede considerarse una dirección (de 18 bits). Ciertas instrucciones usan otras interpretaciones de palabras. En los procesadores PDP-10 originales, estos 16 GPR también correspondían a las ubicaciones de memoria principal (es decir, núcleo ) 0-15; una opción de hardware llamada "memoria rápida" implementó los registros como IC separados, y las referencias a las ubicaciones de memoria 0-15 se referían a los registros de IC. Los modelos posteriores implementaron los registros como "memoria rápida" y continuaron haciendo que las ubicaciones de memoria 0-15 se refirieran a ellos. Las instrucciones de movimiento toman operandos (registro, memoria) : MOVE 1,2 es registro-registro y MOVE 1,1000 es memoria-a-registro. | |
PDP-11 | 00 7 | 00 6 (si FPP está presente) | R7 es el contador del programa. Cualquier registro puede ser un puntero de pila, pero R6 se utiliza para interrupciones y trampas de hardware. |
vacuna contra el ébola [32] | 0 16 | Los registros de propósito general también se utilizan para valores de punto flotante. Tres de los registros tienen usos especiales: R12 (puntero de argumento), R13 (puntero de marco) y R14 (puntero de pila), mientras que R15 se refiere al contador de programa. | |
Alfa [33] | 0 31 | 0 31 | Los registros R31 (entero) y F31 (punto flotante) están conectados a cero. |
6502 | 1 dato, 2 índice | 00 0 | El contenido del registro A (acumulador) del 6502 tiene como propósito principal almacenar datos y direcciones de memoria (datos de 8 bits/direcciones de 16 bits), X e Y son registros de índice indirecto y directo (respectivamente) y los registros SP son solo de índice específico. |
W65C816S | 00 1 | 00 0 | El 65c816 es el sucesor de 16 bits del 6502. X, Y y D (registro de página directa) son registros de condición y el registro SP es solo de índice específico. El acumulador principal se amplió a 16 bits (C) [34] mientras se conservan los 8 bits (A) por compatibilidad y los registros principales ahora pueden direccionar hasta 24 bits (instrucción de datos de 16 bits de ancho/dirección de memoria de 24 bits). |
Miembro del Parlamento | 00 4 | 00 8 | El procesador con medio incorporado era un procesador de 32 bits desarrollado por Toshiba con un conjunto de instrucciones 8080 modificado. Solo los registros A, B, C y D están disponibles en todos los modos (8/16/32 bits). Es incompatible con x86; sin embargo, contiene una unidad de punto flotante de 80 bits que es compatible con x87. |
Microcontrolador PIC | 00 1 | 00 0 | |
Microcontrolador AVR | 0 32 | 00 0 | |
ARM de 32 bits (ARM/A32, Thumb-2/T32) | 0 14 | Varía (hasta 32) | r15 es el contador de programa y no se puede utilizar como registro de propósito general; r13 es el puntero de pila; r8–r13 se pueden cambiar por otros (acumular) en un conmutador de modo de procesador. Las versiones anteriores tenían un direccionamiento de 26 bits, [35] y utilizaban los bits superiores del contador de programa (r15) para indicadores de estado, lo que hacía que ese registro fuera de 32 bits. |
ARM de 32 bits (miniatura) | 00 8 | 0 16 | Versión 1 de Thumb, que sólo admitía el acceso a los registros r0 a r7 [36] |
ARM de 64 bits (A64) [37] | 0 31 | 0 32 | El registro r31 es el puntero de la pila o está cableado a 0, según el contexto. |
MIPS [38] | 0 31 | 0 32 | El registro entero 0 está cableado a 0. |
RISC-V [39] | 0 31 | 0 32 | El registro entero 0 está cableado a 0. La variante RV32E, destinada a sistemas con recursos muy limitados, tiene 15 registros enteros. |
Epifanía | 64 (por núcleo) [40] | Cada instrucción controla si los registros se interpretan como números enteros o como coma flotante de precisión simple. La arquitectura es escalable a 4096 núcleos y actualmente hay implementaciones de 16 y 64 núcleos disponibles. |
La cantidad de registros disponibles en un procesador y las operaciones que se pueden realizar con esos registros tienen un impacto significativo en la eficiencia del código generado por los compiladores optimizadores . El número de Strahler de un árbol de expresión proporciona la cantidad mínima de registros necesarios para evaluar ese árbol de expresión.