Arquitectura MIPS

Compartir Imprimir Citar

MIPS (Microprocesador sin etapas canalizadas entrelazadas) es una familia de arquitecturas de conjunto de instrucciones (ISA) de computadora con conjunto de instrucciones reducido (RISC) desarrolladas por MIPS Computer Systems, ahora MIPS Technologies, con sede en los Estados Unidos.

Hay varias versiones de MIPS: incluidas MIPS I, II, III, IV y V; así como cinco versiones de MIPS32/64 (para implementaciones de 32 y 64 bits, respectivamente). Las primeras arquitecturas MIPS eran de 32 bits; Las versiones de 64 bits se desarrollaron más tarde. A partir de abril de 2017, la versión actual de MIPS es MIPS32/64 Release 6. MIPS32/64 se diferencia principalmente de MIPS I–V al definir el coprocesador de control del sistema en modo kernel privilegiado además de la arquitectura del modo de usuario.

La arquitectura MIPS tiene varias extensiones opcionales. MIPS-3D, que es un conjunto simple de instrucciones SIMD de punto flotante dedicadas a tareas 3D comunes, MDMX (MaDMaX), que es un conjunto de instrucciones SIMD entero más extenso que utiliza registros de punto flotante de 64 bits, MIPS16e, que agrega compresión a la instrucción stream para que los programas ocupen menos espacio, y MIPS MT, que agrega capacidad de subprocesamiento múltiple.

Los cursos de arquitectura informática en universidades y escuelas técnicas a menudo estudian la arquitectura MIPS. La arquitectura influyó mucho en las arquitecturas RISC posteriores como Alpha. En marzo de 2021, MIPS anunció que el desarrollo de la arquitectura MIPS había terminado ya que la empresa está haciendo la transición a RISC-V.

Historia

La primera versión de la arquitectura MIPS fue diseñada por MIPS Computer Systems para su microprocesador R2000, la primera implementación de MIPS. Tanto MIPS como R2000 se introdujeron juntos en 1985. Cuando se introdujo MIPS II, MIPS pasó a llamarse MIPS I para distinguirlo de la nueva versión.

Sistemas informáticos MIPS' El microprocesador R6000 (1989) fue la primera implementación de MIPS II. Diseñado para servidores, el R6000 fue fabricado y vendido por Bipolar Integrated Technology, pero fue un fracaso comercial. A mediados de la década de 1990, muchos procesadores MIPS de 32 bits nuevos para sistemas integrados eran implementaciones de MIPS II porque la introducción de la arquitectura MIPS III de 64 bits en 1991 dejó a MIPS II como la arquitectura MIPS de 32 bits más nueva hasta que se introdujo MIPS32 en 1999..

Sistemas informáticos MIPS' El microprocesador R4000 (1991) fue la primera implementación de MIPS III. Fue diseñado para su uso en computadoras personales, estaciones de trabajo y servidores. MIPS Computer Systems promovió agresivamente la arquitectura MIPS y R4000, estableciendo el consorcio Advanced Computing Environment (ACE) para avanzar en su estándar Advanced RISC Computing (ARC), cuyo objetivo era establecer MIPS como la plataforma informática personal dominante. ARC tuvo poco éxito en las computadoras personales, pero el R4000 (y el derivado del R4400) fueron ampliamente utilizados en estaciones de trabajo y servidores, especialmente por su mayor usuario, Silicon Graphics. Otros usos del R4000 incluyeron supercomputadoras y sistemas integrados de alta gama. MIPS III finalmente fue implementado por una serie de microprocesadores integrados. Quantum Effect Design's R4600 (1993) y sus derivados se utilizaron ampliamente en sistemas integrados de alta gama y estaciones de trabajo y servidores de gama baja. Tecnologías MIPS' R4200 (1994), fue diseñado para sistemas integrados, portátiles y ordenadores personales. Un derivado, el R4300i, fabricado por NEC Electronics, se utilizó en la consola de juegos Nintendo 64. La Nintendo 64, junto con la PlayStation, se encontraban entre los usuarios de mayor volumen de procesadores de arquitectura MIPS a mediados de la década de 1990.

La primera implementación de MIPS IV fue el chipset de microprocesador MIPS Technologies R8000 (1994). El diseño del R8000 comenzó en Silicon Graphics, Inc. y solo se usó en servidores y estaciones de trabajo de gama alta para aplicaciones científicas y técnicas donde el alto rendimiento en grandes cargas de trabajo de punto flotante era importante. Las implementaciones posteriores fueron MIPS Technologies R10000 (1996) y Quantum Effect Devices R5000 (1996) y RM7000 (1998). El R10000, fabricado y vendido por NEC Electronics y Toshiba, y sus derivados fueron utilizados por NEC, Pyramid Technology, Silicon Graphics y Tandem Computers (entre otros) en estaciones de trabajo, servidores y supercomputadoras. El R5000 y el R7000 encontraron uso en sistemas integrados de alta gama, computadoras personales y estaciones de trabajo y servidores de gama baja. Un derivado del R5000 de Toshiba, el R5900, se usó en el motor de emoción de Sony Computer Entertainment, que impulsó su consola de juegos PlayStation 2.

Anunciado el 21 de octubre de 1996 en el Microprocessor Forum 1996 junto con la extensión MIPS Digital Media Extensions (MDMX), MIPS V fue diseñado para mejorar el rendimiento de las transformaciones de gráficos 3D. A mediados de la década de 1990, un uso importante de los microprocesadores MIPS no integrados fueron las estaciones de trabajo gráficas de Silicon Graphics. MIPS V se completó con la extensión MDMX de solo números enteros para proporcionar un sistema completo para mejorar el rendimiento de las aplicaciones de gráficos 3D. Las implementaciones de MIPS V nunca se introdujeron. El 12 de mayo de 1997, Silicon Graphics anunció los microprocesadores H1 ('Beast') y H2 ('Capitan'). El primero debía haber sido la primera implementación de MIPS V y debía presentarse en la primera mitad de 1999. Los proyectos H1 y H2 se combinaron más tarde y finalmente se cancelaron en 1998. Si bien no hubo implementaciones de MIPS V, MIPS64 La versión 1 (1999) se basó en MIPS V y conserva todas sus funciones como una función opcional del coprocesador 1 (FPU) denominada Paired-Single.

Cuando MIPS Technologies se separó de Silicon Graphics en 1998, se volvió a centrar en el mercado integrado. A través de MIPS V, cada versión sucesiva era un superconjunto estricto de la versión anterior, pero se descubrió que esta propiedad era un problema y se cambió la definición de la arquitectura para definir una arquitectura de 32 bits y una de 64 bits: MIPS32 y MIPS64. Ambos se introdujeron en 1999. MIPS32 se basa en MIPS II con algunas características adicionales de MIPS III, MIPS IV y MIPS V; MIPS64 se basa en MIPS V. NEC, Toshiba y SiByte (posteriormente adquirida por Broadcom) obtuvieron licencias para MIPS64 tan pronto como se anunció. Philips, LSI Logic, IDT, Raza Microelectronics, Inc., Cavium, Loongson Technology e Ingenic Semiconductor se han unido a ellos desde entonces. La versión 5 de MIPS32/MIPS64 se anunció el 6 de diciembre de 2012. La versión 4 se omitió porque el número cuatro se percibe como desafortunado en muchas culturas asiáticas.

En diciembre de 2018, Wave Computing, el nuevo propietario de la arquitectura MIPS, anunció que MIPS ISA sería de código abierto en un programa denominado MIPS Iniciativa abierta. El programa tenía la intención de abrir el acceso a las versiones más recientes de los diseños de 32 y 64 bits, haciéndolos disponibles sin ningún tipo de licencia o pago de regalías, y otorgando a los participantes licencias de patentes MIPS existentes.

En marzo de 2019, se puso a disposición una versión de la arquitectura con una licencia libre de regalías, pero ese mismo año el programa se cerró nuevamente.

En marzo de 2021, Wave Computing anunció que el desarrollo de la arquitectura MIPS había cesado. La empresa se ha unido a la fundación RISC-V y los futuros diseños de procesadores se basarán en la arquitectura RISC-V. A pesar de esto, algunos licenciatarios como Loongson continúan con nuevas extensiones de ISA compatibles con MIPS por su cuenta.

Diseño

MIPS es una arquitectura modular que admite hasta cuatro coprocesadores (CP0/1/2/3). En la terminología MIPS, CP0 es el coprocesador de control del sistema (una parte esencial del procesador definida por la implementación en MIPS I–V), CP1 es una unidad de punto flotante (FPU) opcional y CP2/3 son coprocesadores opcionales definidos por la implementación. (MIPS III eliminó CP3 y reutilizó sus códigos de operación para otros fines). Por ejemplo, en la consola de videojuegos PlayStation, CP2 es el motor de transformación de geometría (GTE), que acelera el procesamiento de geometría en gráficos de computadora en 3D.

Versiones

MIPS I

MIPS es una arquitectura de carga/almacenamiento (también conocida como arquitectura registro-registro); a excepción de las instrucciones de carga/almacenamiento utilizadas para acceder a la memoria, todas las instrucciones operan en los registros.

Registros

MIPS I tiene treinta y dos registros de propósito general (GPR) de 32 bits. El registro $0 está conectado a cero y las escrituras en él se descartan. El registro $31 es el registro de enlace. Para las instrucciones de multiplicación y división de enteros, que se ejecutan de forma asíncrona desde otras instrucciones, se proporcionan un par de registros de 32 bits, HI y LO. Hay un pequeño conjunto de instrucciones para copiar datos entre los registros de propósito general y los registros HI/LO.

El contador de programa tiene 32 bits. Los dos bits de orden inferior siempre contienen cero, ya que las instrucciones MIPS I tienen una longitud de 32 bits y están alineadas con sus límites naturales de palabras.

Formatos de instrucciones

Las instrucciones se dividen en tres tipos: R (registro), I (inmediato) y J (salto). Cada instrucción comienza con un código de operación de 6 bits. Además del código de operación, las instrucciones de tipo R especifican tres registros, un campo de cantidad de cambio y un campo de función; Las instrucciones de tipo I especifican dos registros y un valor inmediato de 16 bits; Las instrucciones de tipo J siguen el código de operación con un objetivo de salto de 26 bits.

Los siguientes son los tres formatos utilizados para el conjunto de instrucciones básicas:

Tipo-31- formato (bits) -0-
Ropcode (6)rs 5)rt (5)rd (5)shamt (5)funct (6)
Iopcode (6)rs 5)rt (5)inmediata (16)
Jopcode (6)dirección (26)

Instrucciones de la CPU

MIPS I tiene instrucciones que cargan y almacenan bytes de 8 bits, medias palabras de 16 bits y palabras de 32 bits. Solo se admite un modo de direccionamiento: base + desplazamiento. Dado que MIPS I es una arquitectura de 32 bits, la carga de cantidades inferiores a 32 bits requiere que el dato se extienda por signo o por cero a 32 bits. Las instrucciones de carga con el sufijo "sin firmar" realizar extensión cero; de lo contrario, se realiza la extensión del signo. Las instrucciones de carga obtienen la base del contenido de un GPR (rs) y escriben el resultado en otro GPR (rt). Las instrucciones de almacenamiento obtienen la base del contenido de un GPR (rs) y los datos de almacenamiento de otro GPR (rt). Todas las instrucciones de carga y almacenamiento calculan la dirección de memoria sumando la base con el inmediato de 16 bits con signo extendido. MIPS I requiere que todos los accesos a la memoria estén alineados con sus límites de palabras naturales; de lo contrario, se señala una excepción. Para admitir accesos de memoria no alineados eficientes, hay instrucciones de carga/almacenamiento de palabras con el sufijo "izquierda" o "derecha". Todas las instrucciones de carga van seguidas de una ranura de retraso de carga. La instrucción en la ranura de retardo de carga no puede usar los datos cargados por la instrucción de carga. La ranura de retardo de carga se puede llenar con una instrucción que no depende de la carga; se sustituye un nop si no se puede encontrar dicha instrucción.

MIPS I tiene instrucciones para realizar sumas y restas. Estas instrucciones obtienen sus operandos de dos GPR (rs y rt) y escriben el resultado en un tercer GPR (rd). Alternativamente, la suma puede generar uno de los operandos de un inmediato de 16 bits (que tiene un signo extendido a 32 bits). Las instrucciones de suma y resta tienen dos variantes: por defecto, se señala una excepción si el resultado se desborda; instrucciones con el "sin firmar" sufijo no señala una excepción. La comprobación de desbordamiento interpreta el resultado como un entero de complemento a dos de 32 bits. MIPS I tiene instrucciones para realizar AND, OR, XOR y NOR lógicos bit a bit. Estas instrucciones obtienen sus operandos de dos GPR y escriben el resultado en un tercer GPR. Las instrucciones AND, OR y XOR pueden generar alternativamente uno de los operandos de un inmediato de 16 bits (que se extiende desde cero a 32 bits). Las instrucciones Establecer en relación escriben uno o cero en el registro de destino si la relación especificada es verdadera o falsa. Estas instrucciones obtienen sus operandos de dos GPR o un GPR y un inmediato de 16 bits (que tiene un signo extendido a 32 bits) y escriben el resultado en un tercer GPR. De forma predeterminada, los operandos se interpretan como enteros con signo. Las variantes de estas instrucciones que tienen el sufijo "sin firmar" interprete los operandos como enteros sin signo (incluso aquellos que obtienen un operando del inmediato de 16 bits con signo extendido).

La instrucción Load Immediate Upper copia el inmediato de 16 bits en los 16 bits de orden superior de un GPR. Se usa junto con la instrucción O Inmediato para cargar un inmediato de 32 bits en un registro.

MIPS I tiene instrucciones para realizar cambios lógicos a la izquierda y a la derecha y cambios aritméticos a la derecha. El operando se obtiene de un GPR (rt) y el resultado se escribe en otro GPR (rd). La distancia de cambio se obtiene de un GPR (rs) o de una "cantidad de cambio" de 5 bits. (el campo "sa").

MIPS I tiene instrucciones para la multiplicación y división de enteros con y sin signo. Estas instrucciones obtienen sus operandos de dos GPR y escriben sus resultados en un par de registros de 32 bits llamados HI y LO, ya que pueden ejecutarse por separado (y simultáneamente con) las otras instrucciones de la CPU. Para la multiplicación, las mitades de orden superior e inferior del producto de 64 bits se escriben en HI y LO (respectivamente). Para la división, el cociente se escribe en LO y el resto en HI. Para acceder a los resultados, se proporcionan un par de instrucciones (Mover desde HI y Mover desde LO) para copiar el contenido de HI o LO a un GPR. Estas instrucciones están entrelazadas: las lecturas de HI y LO no pasan de una instrucción aritmética inconclusa que escribirá en HI y LO. Otro par de instrucciones (Mover a HI o Mover a LO) copia el contenido de un GPR a HI y LO. Estas instrucciones se utilizan para restaurar HI y LO a su estado original después del manejo de excepciones. Las instrucciones que dicen HI o LO deben estar separadas por dos instrucciones que no escriben HI o LO.

Todas las instrucciones de flujo de control de MIPS I van seguidas de una ranura de retardo de bifurcación. A menos que la ranura de retardo de bifurcación se llene con una instrucción que realiza un trabajo útil, se sustituye por un nop. Las instrucciones de bifurcación MIPS I comparan el contenido de un GPR (rs) con cero u otro GPR (rt) como enteros con signo y bifurca si la condición especificada es verdadera. El control se transfiere a la dirección calculada desplazando el desplazamiento de 16 bits a la izquierda dos bits, extendiendo el signo del resultado de 18 bits y sumando el resultado de signo extendido de 32 bits a la suma del contador del programa (dirección de instrucción) y 810. Los saltos tienen dos versiones: absolutos y de registro indirecto. Los saltos absolutos ("Jump" y "Jump and Link") calculan la dirección a la que se transfiere el control desplazando el instr_index de 26 bits dos bits a la izquierda y concatenando el resultado de 28 bits con los cuatro bits de orden superior de la dirección de la instrucción en la ranura de retardo de bifurcación. Los saltos indirectos de registro transfieren el control a la instrucción en la dirección procedente de un GPR (rs). La dirección procedente del GPR debe estar alineada con la palabra, de lo contrario, se señala una excepción después de que se ejecuta la instrucción en la ranura de retardo de bifurcación. Las instrucciones de bifurcación y salto que vinculan (excepto "Registro de salto y enlace") guardan la dirección de retorno en GPR 31. El "Registro de salto y enlace" La instrucción permite que la dirección del remitente se guarde en cualquier GPR grabable.

MIPS I tiene dos instrucciones para que el software señale una excepción: llamada al sistema y punto de interrupción. System Call es utilizado por el software de modo de usuario para realizar llamadas al kernel; y Breakpoint se usa para transferir el control a un depurador a través del controlador de excepciones del kernel. Ambas instrucciones tienen un campo de código de 20 bits que puede contener información específica del entorno operativo para el controlador de excepciones.

MIPS tiene 32 registros de punto flotante. Se emparejan dos registros para números de doble precisión. Los registros impares no se pueden usar para aritmética o bifurcación, solo como parte de un par de registros de doble precisión, lo que da como resultado 16 registros utilizables para la mayoría de las instrucciones (los movimientos/copias y las cargas/almacenamiento no se vieron afectados).

La precisión simple se indica con el sufijo.s, mientras que la precisión doble se indica con el sufijo.d.

MIPS II

MIPS II eliminó la ranura de retraso de carga y agregó varios conjuntos de instrucciones. Para el multiprocesamiento de memoria compartida, se agregaron las instrucciones Sincronizar memoria compartida, Cargar palabra vinculada y Almacenar palabra condicional. Se agregó un conjunto de instrucciones de Trap-on-Condition. Estas instrucciones causaron una excepción si la condición evaluada es verdadera. Todas las instrucciones de bifurcación existentes recibieron versiones probables de bifurcación que ejecutaban la instrucción en la ranura de retraso de bifurcación solo si se tomaba la bifurcación. Estas instrucciones mejoran el rendimiento en ciertos casos al permitir que instrucciones útiles llenen la ranura de demora de bifurcación. Se agregaron instrucciones de carga y almacenamiento de palabra doble para COP1–3. De acuerdo con otras instrucciones de acceso a la memoria, estas cargas y almacenamientos requerían que la palabra doble se alineara naturalmente.

El conjunto de instrucciones para el coprocesador de coma flotante también tenía varias instrucciones añadidas. Se agregó una instrucción de raíz cuadrada de coma flotante compatible con IEEE 754. Admitía operandos de precisión simple y doble. Se agregó un conjunto de instrucciones que convertían números de punto flotante de precisión simple y doble en palabras de 32 bits. Estos complementaron las instrucciones de conversión existentes al permitir que la instrucción especifique el modo de redondeo IEEE en lugar del registro de estado y control de punto flotante.

MIPS III

MIPS III es una extensión compatible con versiones anteriores de MIPS II que agregó soporte para direccionamiento de memoria de 64 bits y operaciones con números enteros. El tipo de datos de 64 bits se denomina palabra doble y MIPS III amplió los registros de uso general, los registros HI/LO y el contador de programa a 64 bits para admitirlo. Se agregaron nuevas instrucciones para cargar y almacenar palabras dobles, para realizar operaciones de suma, resta, multiplicación, división y desplazamiento de enteros en ellas, y para mover palabras dobles entre los registros GPR y HI/LO. Las instrucciones existentes originalmente definidas para operar en palabras de 32 bits se redefinieron, cuando fue necesario, para extender el signo de los resultados de 32 bits para permitir que la mayoría de las instrucciones traten las palabras y las palabras dobles de manera idéntica. Entre esas instrucciones redefinidas estaba Load Word. En MIPS III, extiende palabras de signo a 64 bits. Para complementar Load Word, se agregó una versión que se extiende cero.

La incapacidad del formato de instrucción R para especificar la distancia de cambio completa para cambios de 64 bits (su campo de cantidad de cambio de 5 bits es demasiado estrecho para especificar la distancia de cambio para palabras dobles) requería que MIPS III proporcionara tres versiones en bits de cada instrucción MIPS I shift. La primera versión es una versión de 64 bits de las instrucciones de cambio originales, que se utiliza para especificar distancias de cambio constantes de 0 a 31 bits. La segunda versión es similar a la primera, pero agrega 3210 al valor del campo de cantidad de desplazamiento para que se puedan especificar distancias de desplazamiento constantes de 32 a 64 bits. La tercera versión obtiene la distancia de desplazamiento de los seis bits de orden inferior de un GPR.

MIPS III agregó un nivel de privilegio de supervisor entre los niveles de privilegio de kernel y de usuario existentes. Esta función solo afectó al procesador de control del sistema definido por la implementación (coprocesador 0).

MIPS III eliminó las instrucciones de soporte del coprocesador 3 (CP3) y reutilizó sus códigos de operación para las nuevas instrucciones de doble palabra. Los coprocesadores restantes obtuvieron instrucciones para mover palabras dobles entre los registros del coprocesador y los GPR. Los registros generales flotantes (FGR) se ampliaron a 64 bits y se eliminó el requisito de que las instrucciones utilicen únicamente registros pares. Esto es incompatible con versiones anteriores de la arquitectura; se utiliza un bit en el registro de estado/control de punto flotante para operar la unidad de punto flotante (FPU) MIPS III en un modo compatible con MIPS I y II. Los registros de control de coma flotante no se ampliaron por motivos de compatibilidad. Las únicas instrucciones nuevas de punto flotante agregadas fueron aquellas para copiar palabras dobles entre la CPU y la FPU, convertir números de punto flotante de precisión simple y doble en enteros de palabras dobles y viceversa.

MIPS IV

MIPS IV es la cuarta versión de la arquitectura. Es un superconjunto de MIPS III y es compatible con todas las versiones existentes de MIPS. MIPS IV fue diseñado principalmente para mejorar el rendimiento de punto flotante (FP). Para mejorar el acceso a los operandos, se agregó un modo de direccionamiento indexado (base + índice, ambos provenientes de GPR) para cargas y almacenamientos de FP, al igual que instrucciones de captación previa para realizar la captación previa de memoria y especificar sugerencias de caché (estos admitían tanto la base + desplazamiento como la base). + modos de direccionamiento de índice).

MIPS IV agregó varias características para mejorar el paralelismo a nivel de instrucción. Para aliviar el cuello de botella causado por un solo bit de condición, se agregaron siete bits de código de condición al registro de estado y control de punto flotante, con lo que el total es ocho. Las instrucciones de bifurcación y comparación de FP se redefinieron para que pudieran especificar qué bit de condición se escribió o leyó (respectivamente); y se eliminó la ranura de retardo entre una rama de FP que leyó el bit de condición escrito por una comparación de FP anterior. Se agregó soporte para predicación parcial en forma de instrucciones de movimiento condicional para GPR y FPR; y una implementación podría elegir entre tener excepciones precisas o imprecisas para las trampas IEEE 754.

MIPS IV agregó varias instrucciones aritméticas FP nuevas para FPN de precisión simple y doble: suma o resta de multiplicación fusionada, recíproco y raíz cuadrada recíproca. Las instrucciones de suma o resta de multiplicación fusionada de FP realizan uno o dos redondeos (está definido por la implementación), para exceder o cumplir con los requisitos de precisión de IEEE 754 (respectivamente). Las instrucciones de raíz cuadrada recíproca y recíproca de FP no cumplen con los requisitos de precisión de IEEE 754 y producen resultados que difieren de la precisión requerida en una o dos unidades del último lugar (está definida por la implementación). Estas instrucciones sirven para aplicaciones en las que la latencia de las instrucciones es más importante que la precisión.

MIPS V

MIPS V agregó un nuevo tipo de datos, Paired Single (PS), que constaba de dos números de punto flotante de precisión simple (32 bits) almacenados en los registros de punto flotante de 64 bits existentes. Se agregaron variantes de las instrucciones de punto flotante existentes para aritmética, comparación y movimiento condicional para operar en este tipo de datos de manera SIMD. Se agregaron nuevas instrucciones para cargar, reorganizar y convertir datos de PS. Fue el primer conjunto de instrucciones para explotar SIMD de coma flotante con los recursos existentes.

MIPS32/MIPS64

La primera versión de MIPS32, basada en MIPS II, agregó movimientos condicionales, instrucciones de captación previa y otras funciones de las familias R4000 y R5000 de procesadores de 64 bits. La primera versión de MIPS64 agrega un modo MIPS32 para ejecutar código de 32 bits. Las instrucciones MUL y MADD (multiply-add), previamente disponibles en algunas implementaciones, se agregaron a las especificaciones MIPS32 y MIPS64, al igual que las instrucciones de control de caché.

MIPS32/MIPS64 versión 6 en 2014 agregó lo siguiente:

Se eliminaron las instrucciones de uso poco frecuente:

Reorganizó la codificación de instrucciones, liberando espacio para futuras expansiones.

MicroMIPS

Las arquitecturas microMIPS32/64 son superconjuntos de las arquitecturas MIPS32 y MIPS64 (respectivamente) diseñadas para reemplazar el MIPS16e ASE. Una desventaja de MIPS16e es que requiere un cambio de modo antes de poder procesar cualquiera de sus instrucciones de 16 bits. microMIPS agrega versiones de las instrucciones de 32 bits más utilizadas que están codificadas como instrucciones de 16 bits. Esto permite que los programas mezclen instrucciones de 16 y 32 bits sin tener que cambiar de modo. microMIPS se introdujo junto con MIPS32/64 versión 3, y cada versión posterior de MIPS32/64 tiene una versión microMIPS32/64 correspondiente. Un procesador puede implementar microMIPS32/64 o tanto microMIPS32/64 como su subconjunto MIPS32/64 correspondiente. A partir de MIPS32/64 versión 6, finalizó el soporte para MIPS16e y microMIPS es la única forma de compresión de código en MIPS.

Extensiones específicas de la aplicación

Las arquitecturas base MIPS32 y MIPS64 se pueden complementar con una serie de extensiones arquitectónicas opcionales, que se denominan colectivamente como extensiones específicas de la aplicación (ASE). Estos ASE proporcionan características que mejoran la eficiencia y el rendimiento de ciertas cargas de trabajo, como el procesamiento de señales digitales.

MIPS MCU
Mejoras para aplicaciones de microcontroladores. El MCU ASE (extensión específica para la aplicación) se ha desarrollado para ampliar el soporte del controlador interrumpido, reducir la latencia interrumpida y mejorar la función de control periférico I/O típicamente necesaria en los diseños del sistema de microcontroladores.
MIPS16
MIPS16 es una extensión de aplicación para MIPS I a V diseñada por LSI Logic y MIPS Technologies, anunciada el 21 de octubre de 1996, junto con su primera implementación, el procesador LSI Logic TinyRISC. MIPS16 fue licenciada posteriormente por NEC Electronics, Philips Semiconductors, y Toshiba (entre otros); e implementada como una extensión a las arquitecturas MIPS I, II, III. MIPS16 disminuye el tamaño de la aplicación hasta un 40% mediante instrucciones de 16 bits en lugar de instrucciones de 32 bits y también mejora la eficiencia energética, la tasa de éxito de caché de instrucción, y es equivalente en el rendimiento a su arquitectura base. Está respaldada por herramientas de desarrollo de hardware y software de MIPS Technologies y otros proveedores. MIPS16e es una versión mejorada de MIPS16 apoyada por primera vez por MIPS32 y MIPS64 Release 1. MIPS16e2 es una versión mejorada de MIPS16 que cuenta con el apoyo de MIPS32 y MIPS64 (hasta la versión 5). La versión 6 lo reemplazó con microMIPS.
MIPS Digital Signal Processing (DSP)
El DSP ASE es una extensión opcional a los conjuntos de instrucciones MIPS32/MIPS64 Release 2 y más nuevos que se pueden utilizar para acelerar una amplia gama de computaciones "media" —en particular audio y vídeo. El módulo DSP incluye un conjunto de instrucciones y estado en el oleoducto entero y requiere mínima lógica adicional para implementar en núcleos de procesadores MIPS. La revisión 2 de la ASE se introdujo en el segundo semestre de 2006. Esta revisión añade instrucciones extras al ASE original, pero de otra manera es compatible con él. A diferencia del grueso de la arquitectura MIPS, es un conjunto bastante irregular de operaciones, muchos elegidos para una relevancia particular para algún algoritmo clave. Su novela principal (vs original MIPS32):
MIPS SIMD architecture (MSA)
Ampliaciones de conjunto de instrucciones diseñadas para acelerar multimedia.
virtualización MIPS
Tecnología de virtualización compatible con hardware.
MIPS multi-threading
Cada núcleo MIPS de múltiples hilos puede soportar hasta dos VPE (Elementos de procesamiento virtual) que comparten un único oleoducto y otros recursos de hardware. Sin embargo, dado que cada VPE incluye una copia completa del estado procesador visto por el sistema de software, cada VPE aparece como un procesador independiente completo para un sistema operativo SMP Linux. Para aplicaciones de procesamiento de hilos más finas, cada VPE es capaz de soportar hasta nueve TCs asignados en dos VPE. Los TC comparten una unidad de ejecución común pero cada uno tiene su propio contador de programas y archivos de registro de núcleo para que cada uno pueda manejar un hilo del software. La arquitectura MIPS MT también permite la asignación de ciclos de procesadores a los hilos, y establece las prioridades relativas de los hilos con un bloque de gestión opcional de Calidad de Servicio (QoS). Esto permite dos mecanismos de priorización que determinan el flujo de información a través del bus. El primer mecanismo permite al usuario priorizar un hilo sobre otro. El segundo mecanismo se utiliza para asignar una relación específica de los ciclos a los hilos específicos con el tiempo. El uso combinado de ambos mecanismos permite la asignación efectiva del ancho de banda al conjunto de hilos, y un mejor control de las demoras. En sistemas en tiempo real, el determinismo a nivel de sistema es muy crítico, y el bloque QoS facilita la mejora de la previsibilidad de un sistema. Los diseñadores de hardware de sistemas avanzados pueden reemplazar el bloque QoS estándar proporcionado por MIPS Technologies con uno que se ajusta específicamente para su aplicación.
SmartMIPS
SmartMIPS es una extensión de aplicaciones específicas (ASE) diseñada por Gemplus International y MIPS Technologies para mejorar el rendimiento y reducir el consumo de memoria para el software de tarjetas inteligentes. Es compatible con MIPS32 solamente, ya que las tarjetas inteligentes no requieren las capacidades de los procesadores MIPS64. Pocas tarjetas inteligentes usan SmartMIPS.
MIPS Digital Media eXtension (MDMX)
Aceleraciones de aplicaciones multimedia comunes en los años noventa en los sistemas RISC y CISC.
MIPS-3D
Instrucciones adicionales para mejorar el rendimiento de aplicaciones gráficas 3D

Convenios de llamadas

MIPS ha tenido varias convenciones de llamadas, especialmente en la plataforma de 32 bits.

La ABI O32 es la ABI más utilizada, debido a su estado como la ABI System V original para MIPS. Está estrictamente basado en pilas, con solo cuatro registros $a0-$a3 disponibles para pasar argumentos. Se reserva espacio en la pila en caso de que la persona que llama necesite guardar sus argumentos, pero la persona que llama no almacena los registros allí. El valor devuelto se almacena en el registro $v0; se puede almacenar un segundo valor de retorno en $v1. El ABI tomó forma en 1990 y se actualizó por última vez en 1994. Esta lentitud percibida, junto con un modelo antiguo de coma flotante con solo 16 registros, ha fomentado la proliferación de muchas otras convenciones de llamadas. Solo está definido para MIPS de 32 bits, pero GCC ha creado una variación de 64 bits llamada O64.

Para 64 bits, el N64 ABI de Silicon Graphics es el más utilizado. La mejora más importante es que ahora hay ocho registros disponibles para pasar argumentos; también aumenta la cantidad de registros de coma flotante a 32. También hay una versión ILP32 llamada N32, que usa punteros de 32 bits para código más pequeño, de forma análoga a la ABI x32. Ambos se ejecutan en el modo de 64 bits de la CPU. Las ABI N32 y N64 pasan los primeros ocho argumentos a una función en los registros $a0-$a7; los argumentos posteriores se pasan a la pila. El valor devuelto (o un puntero a él) se almacena en los registros $v0; se puede almacenar un segundo valor de retorno en $v1. En las ABI N32 y N64, todos los registros se consideran de 64 bits de ancho.

Se han realizado algunos intentos para reemplazar O32 con una ABI de 32 bits que se parece más a N32. En una conferencia de 1995 surgió MIPS EABI, para el cual la versión de 32 bits era bastante similar. EABI inspiró a MIPS Technologies para proponer un "NUBI" ABI también reutiliza registros de argumentos para el valor de retorno. MIPS EABI es compatible con GCC pero no con LLVM, y tampoco es compatible con NUBI.

Para todos los O32 y N32/N64, la dirección de retorno se almacena en un registro $ra. Esto se establece automáticamente con el uso de las instrucciones JAL (salto y enlace) o JALR (registro de salto y enlace). El prólogo de función de una subrutina MIPS (no hoja) empuja la dirección de retorno (en $ra) a la pila.

Tanto en O32 como en N32/N64, la pila crece hacia abajo, pero las ABI de N32/N64 requieren una alineación de 64 bits para todas las entradas de la pila. El puntero de marco ($30) es opcional y, en la práctica, rara vez se usa, excepto cuando la asignación de la pila en una función se determina en tiempo de ejecución, por ejemplo, llamando a alloca()< /código>.

Para N32 y N64, la dirección de retorno normalmente se almacena 8 bytes antes del puntero de la pila, aunque esto puede ser opcional.

Para las ABI N32 y N64, una función debe conservar los registros $s0-$s7, el puntero global ($gp o $28), el puntero de pila ($sp o < span class="monospaced">$29) y el puntero de cuadro ($30). La ABI de O32 es la misma, excepto que se requiere la función de llamada para guardar el registro $gp en lugar de la función llamada.

Para el código de subprocesos múltiples, el puntero de almacenamiento local del subproceso generalmente se almacena en un registro de hardware especial $29 y se accede mediante la instrucción mfhw (mover desde el hardware). Se sabe que al menos un proveedor almacena esta información en el registro $k0 que normalmente está reservado para uso del núcleo, pero esto no es estándar.

Los registros $k0 y $k1 ($26–< span class="monospaced">$27) están reservados para uso del núcleo y no deben ser utilizados por las aplicaciones, ya que el núcleo puede cambiar estos registros en cualquier momento debido a interrupciones, cambios de contexto u otros eventos.

Registros para convención de llamadas O32
NombreNúmeroUsoCallee debe preservar?
$zero$0constante 0
$at1 dólarensamblador temporalNo
$v0$v1$2$3valores para el rendimiento de la función y evaluación de la expresiónNo
$a0$a3$4$7argumentos de funciónNo
$t0$t7$815 dólarestemporerosNo
$0$ 716 dólares$23temporeros salvadosSí.
$t8$t924 dólares$25temporerosNo
$k0$k1$26$27reservado para OS kernel
$gp$28global pointerSí (excepto el código PIC)
$sp$29apiladorSí.
$fp$30frame pointerSí.
$ra31 dólaresDirección de retorno
Registros para las convenciones N32 y N64 que llaman
NombreNúmeroUsoCallee debe preservar?
$zero$0constante 0
$at1 dólarensamblador temporalNo
$v0$v1$2$3valores para el rendimiento de la función y evaluación de la expresiónNo
$a0$a7$4$11argumentos de funciónNo
$t4$t712 dólares15 dólarestemporerosNo
$0$ 716 dólares$23temporeros salvadosSí.
$t8$t924 dólares$25temporerosNo
$k0$k1$26$27reservado para OS kernel
$gp$28global pointerSí.
$sp$29apiladorSí.
$s8$30frame pointerSí.
$ra31 dólaresDirección de retorno

Los registros que se conservan a través de una llamada son registros que (por convención) no serán cambiados por una llamada al sistema o una llamada a un procedimiento (función). Por ejemplo, los registros $s deben guardarse en la pila mediante un procedimiento que necesite usarlos, y $sp y $fp siempre se incrementan por constantes y se decrementan después de que se realiza el procedimiento con ellos (y la memoria a la que apuntan). Por el contrario, $ra se cambia automáticamente por cualquier llamada de función normal (las que usan jal), y el programa debe guardar $t-registers antes de cualquier llamada de procedimiento (si el programa necesita los valores dentro de ellos después de la llamada).

La convención de llamada del espacio de usuario del código independiente de la posición en Linux requiere además que cuando se llama a una función, el registro $t9 debe contener la dirección de esa función. Esta convención se remonta al suplemento System V ABI para MIPS.

Usos

Los procesadores MIPS se utilizan en sistemas integrados, como enrutadores y puertas de enlace residenciales. Originalmente, MIPS fue diseñado para computación de propósito general. Durante las décadas de 1980 y 1990, muchas empresas, como Digital Equipment Corporation, MIPS Computer Systems, NEC, Pyramid Technology, SiCortex, Siemens Nixdorf, Silicon Graphics y Tandem Computers, utilizaron procesadores MIPS para computadoras personales, estaciones de trabajo y servidores.

Históricamente, las consolas de videojuegos como Nintendo 64, Sony PlayStation, PlayStation 2 y PlayStation Portable usaban procesadores MIPS. Los procesadores MIPS también solían ser populares en las supercomputadoras durante la década de 1990, pero todos esos sistemas han desaparecido de la lista TOP500. Al principio, estos usos se complementaron con aplicaciones integradas, pero durante la década de 1990, MIPS se convirtió en una presencia importante en el mercado de procesadores integrados y, para la década de 2000, la mayoría de los procesadores MIPS eran para estas aplicaciones.

A mediados y finales de la década de 1990, se estimó que uno de cada tres microprocesadores RISC producidos era un procesador MIPS.

A fines de la década de 2010, las máquinas MIPS todavía se usaban comúnmente en mercados integrados, incluidos los de automóviles, enrutadores inalámbricos, módems LTE (principalmente a través de MediaTek) y microcontroladores (por ejemplo, Microchip Technology PIC32M). En su mayoría, se han desvanecido del espacio personal, del servidor y de la aplicación.

Simuladores

Open Virtual Platforms (OVP) incluye el simulador OVPsim disponible gratuitamente para uso no comercial, una biblioteca de modelos de procesadores, periféricos y plataformas, y API que permiten a los usuarios desarrollar sus propios modelos. Los modelos de la biblioteca son de código abierto, están escritos en C e incluyen los núcleos MIPS 4K, 24K, 34K, 74K, 1004K, 1074K, M14K, microAptiv, interAptiv, proAptiv de 32 bits y la gama de núcleos MIPS de 64 bits y 5K. Estos modelos son creados y mantenidos por Imperas y, en asociación con MIPS Technologies, han sido probados y se les ha asignado la marca MIPS-Verified. Las plataformas basadas en MIPS de muestra incluyen entornos bare metal y plataformas para arrancar imágenes binarias de Linux sin modificar. Estas plataformas-emuladores están disponibles como fuente o binarios y son rápidos, gratuitos para uso no comercial y fáciles de usar. Imperas desarrolla y mantiene OVPsim, es muy rápido (cientos de millones de instrucciones por segundo) y está diseñado para manejar arquitecturas y sistemas homogéneos y heterogéneos de varios núcleos.

Hay un simulador MIPS32 disponible gratuitamente (versiones anteriores simulaban solo el R2000/R3000) llamado SPIM para uso en educación. EduMIPS64 es un simulador de CPU MIPS64 multiplataforma gráfico GPL, escrito en Java/Swing. Es compatible con un amplio subconjunto de MIPS64 ISA y permite al usuario ver gráficamente lo que sucede en la tubería cuando la CPU ejecuta un programa ensamblador.

MARS es otro emulador de MIPS basado en GUI diseñado para su uso en educación, específicamente para su uso con la organización y diseño de computadoras de Hennessy.

WebMIPS es un simulador de MIPS basado en navegador con una representación visual de un procesador genérico canalizado. Este simulador es muy útil para el seguimiento de registros durante la ejecución paso a paso.

QtMips proporciona visualización simple de canalización de 5 etapas, así como visualización de principio de caché para cursos básicos de arquitecturas informáticas. Windows, Linux, macOS y la versión en línea están disponibles.

Emuladores gratuitos más avanzados están disponibles en los proyectos GXemul (anteriormente conocido como el proyecto mips64emul) y QEMU. Éstos emulan los diversos microprocesadores MIPS III y IV además de sistemas informáticos completos que los utilizan.

Los simuladores comerciales están disponibles especialmente para el uso integrado de procesadores MIPS, por ejemplo, Wind River Simics (MIPS 4Kc y 5Kc, PMC RM9000, QED RM7000, Broadcom/Netlogic ec4400, Cavium Octeon I), Imperas (todos los núcleos MIPS32 y MIPS64), VaST Systems (R3000, R4000) y CoWare (MIPS4KE, MIPS24K, MIPS25Kf y MIPS34K).

El simulador de Creator es portátil y permite al usuario aprender varios lenguajes ensambladores de diferentes procesadores (Creator tiene ejemplos con una implementación de instrucciones MIPS32 y RISC-V).

WepSIM es un simulador basado en navegador en el que se microprograma un subconjunto de instrucciones MIPS. Este simulador es muy útil para aprender cómo funciona una CPU (microprogramación, rutinas MIPS, interrupciones, llamadas al sistema, etc.)