El artículo explora la complejidad de la arquitectura de registros en las CPUs x86-64, un aspecto que ha resurgido en la discusión de programación gracias a tecnologías como Rosetta 2 de Apple. A diferencia de otras arquitecturas modernas, x86-64 ofrece una gran cantidad y diversidad de registros, lo que a menudo genera debates sobre cómo contarlos. El autor establece reglas claras para su conteo: considera sub-registros (como EAX dentro de RAX) como entidades distintas debido a su impacto en la optimización del microcódigo, incluye registros presentes en x86-64 pero no utilizables en modo largo, y excluye registros específicos de modelos antiguos o detalles de implementación.
La arquitectura x86-64 se divide en varios grupos de registros. Primero, los registros de propósito general (GPRs) como RAX, RBX, RCX, etc., que, aunque tienen usos convencionales, pueden ser utilizados libremente por el programador. Estos GPRs se subdividen en versiones de 8, 16, 32 y 64 bits (AL, AH, AX, EAX, RAX). Luego, hay registros especiales como el puntero de instrucción (RIP), el registro de estado (RFLAGS) y los registros de segmento (CS, SS, DS, ES, FS, GS), cada uno con funciones específicas en la gestión de la ejecución y el acceso a la memoria. Además, se incluyen los registros asociados a las extensiones SIMD (Single Instruction, Multiple Data) como x87, MMX, SSE y AVX, que permiten procesar múltiples datos simultáneamente. Estos últimos se organizan en una estructura jerárquica (XMM, YMM, ZMM) para aprovechar al máximo el ancho de banda de los registros.
El artículo destaca que cada núcleo de un procesador multinúcleo generalmente tiene su propio estado de registro independiente. El número total de registros, considerando todas estas categorías y subcategorías, asciende a un número considerable, reflejando la evolución histórica y la complejidad de la arquitectura x86-64. Finalmente, el artículo menciona que existen registros específicos de cada modelo de CPU (como FSBASE y GSBASE) que no se incluyen en el conteo principal, pero que son importantes para ciertas funcionalidades, especialmente en el contexto del kernel del sistema operativo.
