MIPS ( Microprocesador sin etapas canalizadas interbloqueadas ) [1] es una familia de arquitecturas de conjunto de instrucciones (ISA ) de computadora de conjunto de instrucciones reducido (RISC ) [2] : A-1 [3] : 19 desarrollada por MIPS Computer Systems, ahora MIPS Technologies , con sede en Estados Unidos.
Existen múltiples 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 de 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. [4] [5] 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 en modo usuario.
La arquitectura MIPS tiene varias extensiones opcionales: MIPS-3D , un conjunto simple de instrucciones SIMD de punto flotante dedicadas a tareas 3D comunes; [6] MDMX (MaDMaX), un conjunto de instrucciones SIMD de enteros más extenso que utiliza registros de punto flotante de 64 bits; MIPS16e, que agrega compresión al flujo de instrucciones para reducir el espacio que ocupan los programas; [7] y MIPS MT, que agrega capacidad de subprocesamiento múltiple . [8]
Los cursos de arquitectura informática en universidades y escuelas técnicas suelen estudiar la arquitectura MIPS. [9] La arquitectura influyó en gran medida en las arquitecturas RISC posteriores, como Alpha . En marzo de 2021, MIPS anunció que el desarrollo de la arquitectura MIPS había finalizado, ya que la empresa está realizando la transición a RISC-V . [10]
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 el R2000 se presentaron juntos en 1985. [11] [ verificación fallida ] Cuando se presentó MIPS II, MIPS pasó a llamarse MIPS I para distinguirlo de la nueva versión. [3] : 32
El microprocesador R6000 de MIPS Computer Systems (1989) fue la primera implementación de MIPS II. [3] : 8 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 fueron 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. [3] : 19
El microprocesador R4000 de MIPS Computer Systems (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 el R4000, estableciendo el consorcio Advanced Computing Environment (ACE) para avanzar su estándar Advanced RISC Computing (ARC), que apuntaba a establecer MIPS como la plataforma de computación personal dominante. ARC tuvo poco éxito en las computadoras personales, pero el R4000 (y el derivado R4400) fueron ampliamente utilizados en estaciones de trabajo y servidores, especialmente por su mayor usuario, Silicon Graphics . Otros usos del R4000 incluyeron sistemas integrados de alta gama y supercomputadoras. MIPS III finalmente fue implementado por una serie de microprocesadores integrados. El R4600 (1993) de Quantum Effect Design y sus derivados fueron ampliamente utilizados en sistemas integrados de alta gama y estaciones de trabajo y servidores de gama baja. El R4200 (1994) de MIPS Technologies fue diseñado para sistemas integrados, computadoras portátiles y 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 utilizó en estaciones de trabajo y servidores de alta gama para aplicaciones científicas y técnicas donde era importante un alto rendimiento en grandes cargas de trabajo de punto flotante. Las implementaciones posteriores fueron el MIPS Technologies R10000 (1996) y los 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 se utilizaron 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 utilizó en el Emotion Engine 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. [12] 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. [13] 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 se suponía que se introduciría en la primera mitad de 1999. [14] Los proyectos H1 y H2 se combinaron más tarde y finalmente se cancelaron en 1998. Si bien no ha habido ninguna implementación de MIPS V, MIPS64 Release 1 (1999) se basó en MIPS V y conserva todas sus características como una característica opcional del Coprocesador 1 (FPU) llamada Paired-Single.
Cuando MIPS Technologies se separó de Silicon Graphics en 1998, se reorientó hacia 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, [ cita requerida ] y se cambió la definición de la arquitectura para definir una arquitectura de 32 bits y otra de 64 bits: MIPS32 y MIPS64. Ambas se introdujeron en 1999. [15] 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. [15] 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 desde entonces a ellos. La versión 5 de MIPS32/MIPS64 se anunció el 6 de diciembre de 2012. [16] Según el director de marketing de productos de MIPS, se omitió la versión 4 porque el número cuatro se percibe como de mala suerte en muchas culturas asiáticas. [17]
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 iniciativa MIPS Open. [18] El programa tenía como objetivo abrir el acceso a las versiones más recientes de los diseños de 32 y 64 bits, haciéndolos disponibles sin licencias ni regalías, además de otorgar a los participantes licencias para las patentes MIPS existentes. [19] [20] [21]
En marzo de 2019, una versión de la arquitectura se puso a disposición bajo una licencia libre de regalías, [22] pero más tarde ese año el programa se cerró nuevamente. [23]
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. [10] [24] A pesar de esto, algunos licenciatarios como Loongson continúan con nuevas extensiones de ISA compatibles con MIPS por su cuenta. [25]
En enero de 2024, Loongson ganó un caso sobre los derechos de uso de la arquitectura MIPS. [26]
MIPS es una arquitectura modular que admite hasta cuatro coprocesadores (CP0/1/2/3). En la terminología de MIPS, CP0 es el coprocesador de control del sistema (una parte esencial del procesador que se define por implementación en MIPS I–V), CP1 es una unidad de punto flotante (FPU) opcional y CP2/3 son coprocesadores definidos por implementación opcionales (MIPS III eliminó a 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 la geometría en gráficos de computadora en 3D.
MIPS es una arquitectura de carga/almacenamiento (también conocida como arquitectura de registro-registro ); a excepción de las instrucciones de carga/almacenamiento utilizadas para acceder a la memoria , todas las instrucciones operan en los registros.
MIPS I tiene treinta y dos registros de propósito general (GPR) de 32 bits. El registro $0 está cableado 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 números enteros, que se ejecutan de forma asincrónica desde otras instrucciones, se proporciona 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 del 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 de palabras naturales.
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, [27] un campo de cantidad de desplazamiento 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 al código de operación con un objetivo de salto de 26 bits. [2] : A-174
Los siguientes son los tres formatos utilizados para el conjunto de instrucciones principal:
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 tenga signo extendido o extensión de cero a 32 bits. Las instrucciones de carga con el sufijo "unsigned" realizan la extensión de cero; de lo contrario, se realiza la extensión de 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 almacenan los datos 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 palabra naturales; de lo contrario, se señala una excepción. Para admitir accesos a memoria no alineados eficientes, existen instrucciones de palabra de carga/almacenamiento con el sufijo "left" o "right". Todas las instrucciones de carga van seguidas de una ranura de retardo de carga . La instrucción en la ranura de retardo de carga no puede utilizar los datos cargados por la instrucción de carga. La ranura de retardo de carga se puede llenar con una instrucción que no dependa de la carga; se sustituye por un nop si no se puede encontrar dicha instrucción.
MIPS I tiene instrucciones para realizar operaciones de suma y resta. Estas instrucciones obtienen sus operandos de dos GPR (rs y rt) y escriben el resultado en un tercer GPR (rd). Como alternativa, la operación de suma puede obtener uno de los operandos de un inmediato de 16 bits (que se extiende a 32 bits por signo). Las instrucciones para la operación de suma y resta tienen dos variantes: de manera predeterminada, se señala una excepción si el resultado se desborda; las instrucciones con el sufijo "sin signo" no señalan 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 operaciones lógicas AND, OR, XOR y NOR 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, como alternativa, obtener uno de los operandos de un inmediato de 16 bits (que se extiende a 32 bits por cero). Las instrucciones de establecimiento de relaciones 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 de un GPR y un inmediato de 16 bits (que se extiende a 32 bits con signo) y escriben el resultado en un tercer GPR. De manera predeterminada, los operandos se interpretan como enteros con signo. Las variantes de estas instrucciones que tienen el sufijo "unsigned" interpretan los operandos como enteros sin signo (incluso aquellas que obtienen un operando del inmediato de 16 bits con signo extendido).
La instrucción Load Immediate Upper copia el valor inmediato de 16 bits en los 16 bits de orden superior de un GPR. Se utiliza junto con la instrucción Or Immediate para cargar un valor inmediato de 32 bits en un registro.
MIPS I tiene instrucciones para realizar desplazamientos lógicos hacia la izquierda y hacia la derecha y desplazamientos aritméticos hacia la derecha. El operando se obtiene de un GPR (rt) y el resultado se escribe en otro GPR (rd). La distancia de desplazamiento se obtiene de un GPR (rs) o de una "cantidad de desplazamiento" de 5 bits (el campo "sa").
MIPS I tiene instrucciones para multiplicar y dividir 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 proporciona 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 interconectadas: las lecturas de HI y LO no proceden más allá de una instrucción aritmética inacabada 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 leen HI o LO deben estar separadas por dos instrucciones que no escriban en HI o LO.
Todas las instrucciones de flujo de control 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 realice 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 se bifurcan 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 en dos bits, extendiendo el signo del resultado de 18 bits y sumando el resultado de 32 bits extendido con el signo a la suma del contador de programa (dirección de instrucción) y 8 10 . Los saltos tienen dos versiones: absolutos e indirectos de registro. Los saltos absolutos ("Saltar" y "Saltar y vincular") calculan la dirección a la que se transfiere el control desplazando el instr_index de 26 bits a la izquierda en dos bits 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 obtenida de un GPR (rs). La dirección obtenida del GPR debe estar alineada con las palabras; de lo contrario, se indica 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 enlazan (excepto "Jump and Link Register") guardan la dirección de retorno en GPR 31. La instrucción "Jump and Link Register" permite guardar la dirección de retorno en cualquier GPR escribible.
MIPS I tiene dos instrucciones para que el software indique una excepción: Llamada al sistema y Punto de interrupción. La llamada al sistema la utiliza el software en modo usuario para realizar llamadas al núcleo, y el punto de interrupción se utiliza para transferir el control a un depurador a través del controlador de excepciones del núcleo. 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. Dos registros se emparejan para números de doble precisión. Los registros impares no se pueden usar para operaciones aritméticas o ramificaciones, 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/almacenamientos no se vieron afectados).
La precisión simple se denota con el sufijo .s, mientras que la precisión doble se denota con el sufijo .d.
MIPS II eliminó la ranura de retardo de carga [3] : 41 y agregó varios conjuntos de instrucciones. Para el multiprocesamiento de memoria compartida, se agregaron las instrucciones Synchronize Shared Memory , Load Linked Word y Store Conditional Word . [28] Se agregó un conjunto de instrucciones Trap-on-Condition. Estas instrucciones causaban una excepción si la condición evaluada era verdadera. A todas las instrucciones de bifurcación existentes se les dieron versiones con probabilidad de bifurcación que ejecutaban la instrucción en la ranura de retardo de bifurcación solo si la bifurcación estaba tomada. [3] : 40 Estas instrucciones mejoran el rendimiento en ciertos casos al permitir que instrucciones útiles llenen la ranura de retardo de bifurcación. [3] : 212 Se agregaron instrucciones de carga y almacenamiento de doble palabra para COP1–3. En consonancia con otras instrucciones de acceso a memoria, estas cargas y almacenamientos requerían que la doble palabra estuviera alineada naturalmente.
También se agregaron varias instrucciones al conjunto de instrucciones para el coprocesador de punto flotante. Se agregó una instrucción de raíz cuadrada de punto 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. Estas complementaron las instrucciones de conversión existentes al permitir que la instrucción especificara el modo de redondeo IEEE en lugar del registro de control y estado de punto flotante.
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 extendió los registros de propósito 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 números enteros en ellas, y para mover palabras dobles entre los GPR y los registros HI/LO. Para el multiprocesamiento de memoria compartida, se agregaron las instrucciones Load Linked Double Word y Store Conditional Double Word . [28] 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 las palabras y las palabras dobles se trataran de manera idéntica por la mayoría de las instrucciones. Entre esas instrucciones redefinidas estaba Load Word . En MIPS III, extiende el signo de las palabras a 64 bits. Para complementar Load Word , se agregó una versión que extiende a cero.
La incapacidad del formato de instrucción R para especificar la distancia de desplazamiento completa para desplazamientos de 64 bits (su campo de cantidad de desplazamiento de 5 bits es demasiado estrecho para especificar la distancia de desplazamiento para palabras dobles) requirió que MIPS III proporcionara tres versiones de 64 bits de cada instrucción de desplazamiento de MIPS I. La primera versión es una versión de 64 bits de las instrucciones de desplazamiento originales, que se utiliza para especificar distancias de desplazamiento constantes de 0 a 31 bits. La segunda versión es similar a la primera, pero agrega 32 10 al valor del campo de cantidad de desplazamiento para que se puedan especificar distancias de desplazamiento constantes de 32 a 63 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 usuario y de kernel existentes. Esta característica 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 utilizaran solo registros pares. Esto es incompatible con versiones anteriores de la arquitectura; un bit en el registro de control/estado de punto flotante se utiliza para operar la unidad de punto flotante (FPU) de MIPS III en un modo compatible con MIPS I y II. Los registros de control de punto flotante no se ampliaron para lograr compatibilidad. Las únicas instrucciones de punto flotante nuevas que se agregaron fueron las de copiar palabras dobles entre la CPU y la FPU, convertir números de punto flotante de precisión simple y doble en números enteros de doble palabra y viceversa.
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. [29] : A-1 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, así como instrucciones de precarga para realizar precargas de memoria y especificar sugerencias de caché (estas admitían los modos de direccionamiento base + desplazamiento y base + í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, lo que elevó el total a ocho. Las instrucciones de comparación y bifurcación de FP se redefinieron para que pudieran especificar qué bit de condición se escribía o leía (respectivamente); y se eliminó la ranura de retardo entre una bifurcación de FP que leía el bit de condición escrito por una comparación de FP anterior. Se agregó soporte para predicción parcial en forma de instrucciones de movimiento condicional tanto para GPR como para FPR; y una implementación podí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íproca y raíz cuadrada recíproca. Las instrucciones de suma o resta de multiplicación fusionada FP realizan uno o dos redondeos (según la implementación) para superar o cumplir con los requisitos de precisión IEEE 754 (respectivamente). Las instrucciones de raíz cuadrada recíproca y recíproca FP no cumplen con los requisitos de precisión IEEE 754 y producen resultados que difieren de la precisión requerida en una o dos unidades del último lugar (según la implementación). Estas instrucciones sirven para aplicaciones donde la latencia de la instrucción es más importante que la precisión.
MIPS V agregó un nuevo tipo de datos, Paired Single (PS), que consistía en 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 PS. [3] : 426–429 Fue el primer conjunto de instrucciones en explotar SIMD de punto flotante con los recursos existentes. [13]
La primera versión de MIPS32, basada en MIPS II, agregó movimientos condicionales, instrucciones de precarga y otras características de las familias R4000 y R5000 de procesadores de 64 bits. [15] La primera versión de MIPS64 agrega un modo MIPS32 para ejecutar código de 32 bits. [15] Las instrucciones MUL y MADD ( multiplicar-agregar ), previamente disponibles en algunas implementaciones, se agregaron a las especificaciones MIPS32 y MIPS64, al igual que las instrucciones de control de caché . [15] Para el control de caché, se prepararon tanto las instrucciones SYNC
como las instrucciones. [30] [31]SYNCI
La versión 6 de MIPS32/MIPS64 en 2014 agregó lo siguiente: [32]
Se eliminaron las instrucciones que se usan con poca frecuencia:
Se reorganizó la codificación de instrucciones, liberando espacio para futuras expansiones.
Las arquitecturas microMIPS32/64 son superconjuntos de las arquitecturas MIPS32 y MIPS64 (respectivamente) diseñadas para reemplazar al ASE MIPS16e. Una desventaja de MIPS16e es que requiere un cambio de modo antes de que se pueda 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 Release 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.
Las arquitecturas base MIPS32 y MIPS64 se pueden complementar con una serie de extensiones arquitectónicas opcionales, que se denominan colectivamente extensiones específicas de la aplicación (ASE). Estas ASE proporcionan funciones que mejoran la eficiencia y el rendimiento de determinadas cargas de trabajo, como el procesamiento de señales digitales .
MIPS ha tenido varias convenciones de llamada, especialmente en la plataforma de 32 bits.
La ABI O32 es la más utilizada, debido a su condición de ABI original del System V para MIPS. [37] [38] Está estrictamente basada en la pila, con solo cuatro registros $a0 - $a3 disponibles para pasar argumentos. El espacio en la pila está reservado en caso de que el llamado necesite guardar sus argumentos, pero los registros no son almacenados allí por el llamador. El valor de retorno se almacena en el registro $v0 ; un segundo valor de retorno puede almacenarse en $v1 . La ABI tomó forma en 1990 y se actualizó por última vez en 1994. Esta lentitud percibida, junto con un modelo de punto flotante antiguo con solo 16 registros, ha alentado la proliferación de muchas otras convenciones de llamada. Solo está definida para MIPS de 32 bits, pero GCC ha creado una variación de 64 bits llamada O64. [39]
Para 64 bits, la ABI N64 de Silicon Graphics es la más utilizada. La mejora más importante es que ahora hay ocho registros disponibles para el paso de argumentos; también aumenta el número de registros de punto flotante a 32. También hay una versión ILP32 llamada N32, que utiliza punteros de 32 bits para código más pequeño, análogo a la ABI x32 . Ambas se ejecutan bajo el modo de 64 bits de la CPU. [39] Las ABI N32 y N64 pasan los primeros ocho argumentos a una función en los registros $a0 - $a7 ; los argumentos posteriores se pasan en la pila. El valor de retorno (o un puntero a él) se almacena en los registros $v0 ; un segundo valor de retorno se puede almacenar en $v1 . En las ABI N32 y N64, todos los registros se consideran de 64 bits de ancho.
Se han hecho algunos intentos para reemplazar O32 con una ABI de 32 bits que se parezca más a N32. Una conferencia de 1995 presentó MIPS EABI, para la cual la versión de 32 bits era bastante similar. [40] EABI inspiró a MIPS Technologies a proponer una ABI "NUBI" más radical que además reutiliza los registros de argumentos para el valor de retorno. [41] GCC admite MIPS EABI pero no LLVM, y ninguno admite 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 leaf) envía la dirección de retorno (en $ra ) a la pila. [42] [43]
En O32 y 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 utiliza, excepto cuando la asignación de pila en una función se determina en tiempo de ejecución, por ejemplo, llamando a .alloca()
Para N32 y N64, la dirección de retorno normalmente se almacena 8 bytes antes del puntero de pila, aunque esto puede ser opcional.
Para las ABIs N32 y N64, una función debe preservar los registros $s0 - $s7 , el puntero global ( $gp o $28 ), el puntero de pila ( $sp o $29 ) y el puntero de marco ( $30 ). La ABI O32 es la misma, excepto que se requiere que la función que realiza la llamada guarde el registro $gp en lugar de la función llamada.
En el caso de código multiproceso, el puntero de almacenamiento local del subproceso se almacena normalmente en el registro de hardware especial $29 y se accede a él 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 el uso del núcleo, pero no es la norma.
Los registros $k0 y $k1 ( $26 – $27 ) están reservados para el uso del kernel y no deben ser utilizados por las aplicaciones ya que estos registros pueden ser modificados en cualquier momento por el kernel debido a interrupciones, cambios de contexto u otros eventos.
Los registros que se conservan a lo largo de una llamada son registros que (por convención) no se modificarán con una llamada al sistema o a un procedimiento (función). Por ejemplo, los registros $s deben guardarse en la pila por un procedimiento que necesite usarlos, y $sp y $fp siempre se incrementan mediante constantes y se decrementan nuevamente después de que el procedimiento haya terminado con ellos (y la memoria a la que apuntan). Por el contrario, $ra se modifica automáticamente con cualquier llamada a una función normal (aquellas que usan jal), y los registros $t deben ser guardados por el programa antes de cualquier llamada a un procedimiento (si el programa necesita los valores dentro de ellos después de la llamada).
La convención de llamada de 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. [45] Esta convención se remonta al suplemento ABI de System V para MIPS. [46]
Los procesadores MIPS se utilizan en sistemas integrados, como puertas de enlace residenciales y enrutadores . Originalmente, MIPS se diseñó para la informática de uso 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 utilizaban 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 . Estos usos se complementaron con aplicaciones integradas al principio, pero durante la década de 1990, MIPS se convirtió en una presencia importante en el mercado de procesadores integrados y, en la década de 2000, la mayoría de los procesadores MIPS eran para estas aplicaciones.
A mediados y fines de la década de 1990, se estimó que uno de cada tres microprocesadores RISC producidos era un procesador MIPS. [47]
A finales de la década de 2010, las máquinas MIPS todavía se usaban comúnmente en los mercados integrados, incluidos los de automóviles, enrutadores inalámbricos, módems LTE (principalmente a través de MediaTek ) y microcontroladores (por ejemplo, el PIC32M de Microchip Technology ). En su mayoría, han desaparecido del espacio personal, de servidores y de aplicaciones.
Open Virtual Platforms (OVP) [48] incluye el simulador OVPsim , disponible de forma gratuita 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 [49] y, en asociación con MIPS Technologies, han sido probados y se les ha asignado la marca MIPS-Verified. Las plataformas de muestra basadas en MIPS incluyen entornos de hardware y plataformas para arrancar imágenes binarias de Linux sin modificar. Estas plataformas-emuladores están disponibles como código fuente o binarios y son rápidas, gratuitas para uso no comercial y fáciles de usar. OVPsim es desarrollado y mantenido por Imperas y 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 múltiples núcleos.
Existe un simulador MIPS32 disponible de forma gratuita (las versiones anteriores simulaban únicamente el R2000/R3000) llamado SPIM para su uso en educación. EduMIPS64 [50] es un simulador de CPU MIPS64 multiplataforma gráfico con licencia GPL, escrito en Java/Swing. Es compatible con un amplio subconjunto de la ISA MIPS64 y permite al usuario ver gráficamente lo que sucede en el flujo de trabajo cuando la CPU ejecuta un programa de ensamblaje.
MARS [51] es otro emulador MIPS basado en GUI diseñado para su uso en educación, específicamente para su uso con Computer Organization and Design de Hennessy .
WebMIPS [52] es un simulador MIPS basado en navegador con representación visual de un procesador genérico segmentado. Este simulador es bastante útil para el seguimiento de registros durante la ejecución paso a paso.
QtMips proporciona una visualización simple de canalización de 5 etapas, así como una visualización del principio de caché para cursos básicos de arquitecturas informáticas. [53] [54] [55] Está disponible tanto como aplicación web como programa descargable para Windows, Linux y macOS .
Existen emuladores gratuitos más avanzados disponibles en los proyectos GXemul (antes conocido como proyecto mips64emul) y QEMU . Éstos emulan los diversos microprocesadores MIPS III y IV, además de sistemas informáticos completos que los utilizan.
Hay simuladores comerciales 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 Creator [56] [57] [58] [59] [60] 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 [61] [62] es un simulador basado en navegador donde se microprograman un subconjunto de instrucciones MIPS. Este simulador es muy útil para aprender cómo funciona una CPU (microprogramación Archivado el 26 de julio de 2022 en Wayback Machine , rutinas MIPS Archivado el 26 de julio de 2022 en Wayback Machine , interrupciones Archivado el 20 de agosto de 2022 en Wayback Machine , llamadas al sistema Archivado el 26 de julio de 2022 en Wayback Machine , etc.)
R-type es la abreviatura de tipo registro. Las instrucciones de tipo R utilizan tres registros como operandos: dos como fuentes y uno como destino.
{{cite web}}
: CS1 maint: copia archivada como título ( enlace )(fuente)