MMIX (pronunciado em-mix ) es una arquitectura de computación con conjunto de instrucciones reducido (RISC) de 64 bits diseñada por Donald Knuth , con importantes contribuciones de John L. Hennessy (quien contribuyó al diseño de la arquitectura MIPS ) y Richard L. Sites ( quien fue arquitecto de la arquitectura Alpha ). Knuth ha dicho que,
MMIX es una computadora destinada a ilustrar aspectos de la programación a nivel de máquina. En mis libros El arte de la programación informática , reemplaza a MIX , la máquina estilo años 60 que anteriormente desempeñaba ese papel... Me esforcé por diseñar MMIX para que su lenguaje de máquina fuera simple, elegante y fácil de aprender. Al mismo tiempo, tuve cuidado de incluir todas las complejidades necesarias para lograr un alto rendimiento en la práctica, de modo que MMIX pudiera, en principio, construirse e incluso tal vez ser competitivo con algunas de las computadoras de propósito general más rápidas del mercado." [1 ]
Knuth comenzó el diseño de MMIX en 1999 y lanzó la versión estable del diseño en 2011. [2] El procesador está numerado como "2009" y Knuth explica que esta es la media aritmética de los números de otras arquitecturas de computadora; además de ser “MMIX” en números romanos . [3]
MMIX es una computadora con conjunto de instrucciones reducido (RISC) big-endian de 64 bits , con 256 registros de propósito general de 64 bits, 32 registros de propósito especial de 64 bits, instrucciones de 32 bits de longitud fija y una dirección virtual de 64 bits. espacio . El conjunto de instrucciones MMIX comprende 256 códigos de operación, uno de los cuales está reservado para futuras ampliaciones. [ cita necesaria ] MMIX utiliza números de punto flotante IEEE 754 .
Todas las instrucciones tienen un mnemotécnico asociado. Por ejemplo, la instrucción n.º 20 (32 decimal) está asociada con ADD. La mayoría de las instrucciones tienen la forma simbólica OP X,Y,Z
, donde OP especifica el tipo de instrucción, X especifica el registro utilizado para almacenar el resultado de la instrucción y el resto especifica los operandos de la instrucción. Cada uno de estos campos tiene ocho bits de ancho. Por ejemplo, ADD $0,$1,3
significa "Establecer $0 como la suma de $1 y 3".
La mayoría de las instrucciones pueden tomar valores inmediatos o registrar contenidos; por lo tanto, una sola instrucción mnemotécnica puede corresponder a uno de dos códigos de operación.
Los programas MMIX normalmente se construyen utilizando el lenguaje ensamblador MMIXAL. El siguiente es un programa MMIXAL simple, que imprime la cadena " ¡Hola, mundo! ":
LOC #100 % Establecer la dirección del programa % inicialmente a 0x100.Main GETA $255,string % Pon la dirección de la cadena % en el registro 255. TRAP 0,Fputs,StdOut % Escribe la cadena apuntada por % registro 255 al estándar % archivo de salida. TRAP 0,Detener,0 % Finalizar proceso.string BYTE "¡Hola mundo!",#a,0 % Cadena a imprimir. #a es % nueva línea, 0 termina el % cadena.
Hay 256 registros arquitectónicos de propósito general direccionables directamente en un chip MMIX, designados por $0 a $255, y 32 registros arquitectónicos de propósito especial. Se puede acceder a los registros de propósito especial con las instrucciones GET y PUT. Dos de los registros especiales, rL y rG, determinan cuáles de los registros generales son locales y cuáles son globales. Todos los registros desde $0... ([rL] − 1) son registros locales y representan una ventana a una pila interna de registros. [4] Los registros de [rL]... ([rG] − 1) son "registros marginales", siempre devuelven 0 si se utilizan como fuente en una operación. El uso de un registro marginal como destino de una operación hará que la máquina aumente automáticamente rL para incluir ese registro. Todos los registros [rG]... $255 se denominan registros globales y no forman parte de la pila de registros.
La pila de registros locales proporciona a cada subrutina sus propios registros locales rL, designados por $0 a $(rL − 1) . Cada vez que se llama a una subrutina, una cantidad de registros locales se empujan hacia abajo en la pila (desplazando el inicio de la ventana). Los argumentos de la subrutina llamada se dejan en los registros locales restantes. Cuando una subrutina finaliza, muestra los registros previamente ingresados. Debido a que la pila interna sólo puede contener un número finito de registros, puede ser necesario almacenar una parte de la pila en la memoria. [4] Esto se implementa con los registros especiales rO y rS que registran qué parte de la pila de registros locales está en la memoria y qué parte todavía está en los registros físicos locales. La pila de registros proporciona un enlace rápido de subrutinas.
Los 32 registros arquitectónicos físicos especiales son los siguientes:
Al igual que los programas que se ejecutan en casi todas las demás CPU, los programas MMIX se pueden interrumpir de varias formas. El hardware externo, como los temporizadores, es una fuente común de interrupciones preventivas . Muchas instrucciones provocan una interrupción en determinados casos excepcionales; como las excepciones de falla de la página de protección de memoria utilizadas para implementar la memoria virtual y el manejo de excepciones de punto flotante . MMIX tiene 2 tipos de interrupciones: "disparos" y "trampas". La principal diferencia entre "viajes" y "trampas" es que las trampas envían el control a un programa "controlador de trampas" en el sistema operativo (trampas), pero los viajes envían el control a un programa "controlador de viajes" en la aplicación del usuario (tripping). Los usuarios también pueden forzar la ejecución de cualquier controlador de interrupciones con instrucciones explícitas de interrupción de software TRIP y TRAP, similares a algunos tipos de trampas en otros sistemas informáticos. En particular, una llamada al sistema desde un programa de usuario al sistema operativo utiliza una instrucción TRAP. [1] : 38
En octubre de 2015 [actualizar], no existen implementaciones de hardware conocidas de la arquitectura del conjunto de instrucciones MMIX. Sin embargo, el proyecto fpgammix [5] implementa MMIX en Verilog , lo que hace posible la implementación mediante una matriz de puertas programables en campo .
La arquitectura del conjunto de instrucciones MMIX está respaldada por una serie de herramientas de software para la investigación de arquitectura de computadoras y el desarrollo de software.
gzipped
tar
archivo).La colección de compiladores GNU incluye un back-end MMIX para sus compiladores C / C++ , aportado por Hans-Peter Nilsson y parte de la distribución principal de GCC desde finales de 2001. A partir de noviembre de 2017 [actualizar], el back-end MMIX para GCC continúa estando activo. desarrollado y mantenido por voluntarios.
En teoría, las herramientas anteriores podrían usarse para compilar, construir y arrancar un kernel completo de FreeBSD , Linux u otro sistema operativo similar en hardware MMIX, si dicho hardware existiera.
(
Cray-1
+
IBM 801
+
RISC II
+
Clipper
C300 +
AMD 29k
+
Motorola 88k
+
IBM 601
+
Intel i960
+
Alpha 21164
+
POWER2
+
MIPS R4000
+
Hitachi Super H4
+
StrongARM
110 +
SPARC
64) / 14 = 28126/14 = 2009