Diseñador | Sun Microsystems (adquirida por Oracle Corporation ) [1] [2] |
---|---|
Pedazos | 64 bits (32 → 64) |
Introducido | 1986 ( 1986 ) ( 1987 ) | (producción) 1987 (envíos)
Versión | V9 (1993) / OSA2017 |
Diseño | RIESGO |
Tipo | Cargar-almacenar |
Codificación | Fijado |
Derivación | Código de condición |
Endianidad | Bi (Grande → Bi) |
Tamaño de página | 8 KB (4 KB → 8 KB) |
Extensiones | VIS 1.0, 2.0, 3.0, 4.0 |
Abierto | Sí, y libre de regalías. |
Registros | |
De uso general | 31 (G0 = 0; los registros no globales utilizan ventanas de registro ) |
Punto flotante | 32 (utilizable como 32 de precisión simple, 32 de precisión doble o 16 de precisión cuádruple) |
SPARC ( Scalable Processor ARChitecture ) es una arquitectura de conjunto de instrucciones de computadora de conjunto de instrucciones reducido (RISC) desarrollada originalmente por Sun Microsystems . [1] [2] Su diseño estuvo fuertemente influenciado por el sistema experimental Berkeley RISC desarrollado a principios de la década de 1980. Desarrollado por primera vez en 1986 y lanzado en 1987, [3] [2] SPARC fue uno de los primeros sistemas RISC comerciales más exitosos, y su éxito condujo a la introducción de diseños RISC similares de muchos proveedores durante las décadas de 1980 y 1990.
La primera implementación de la arquitectura original de 32 bits (SPARC V7) se utilizó en los sistemas de servidores y estaciones de trabajo Sun-4 de Sun, en sustitución de sus anteriores sistemas Sun-3 basados en la serie de procesadores Motorola 68000. SPARC V8 añadió una serie de mejoras que formaban parte de la serie de procesadores SuperSPARC lanzada en 1992. SPARC V9, lanzada en 1993, introdujo una arquitectura de 64 bits y se lanzó por primera vez en los procesadores UltraSPARC de Sun en 1995. Más tarde, los procesadores SPARC se utilizaron en servidores de multiprocesamiento simétrico (SMP) y de acceso a memoria no uniforme ( CC-NUMA ) producidos por Sun, Solbourne y Fujitsu , entre otros.
El diseño fue entregado al grupo comercial SPARC International en 1989, y desde entonces su arquitectura ha sido desarrollada por sus miembros. SPARC International también es responsable de licenciar y promover la arquitectura SPARC, administrar las marcas comerciales SPARC (incluida SPARC, de la que es propietario) y proporcionar pruebas de conformidad . SPARC International tenía como objetivo hacer crecer la arquitectura SPARC para crear un ecosistema más grande; SPARC ha sido licenciado a varios fabricantes, incluidos Atmel , Bipolar Integrated Technology , Cypress Semiconductor , Fujitsu , Matsushita y Texas Instruments . Debido a SPARC International, SPARC es completamente abierto, no propietario y libre de regalías.
A partir de 2024, los últimos procesadores SPARC comerciales de gama alta son el SPARC64 XII de Fujitsu (presentado en septiembre de 2017 para su servidor SPARC M12) y el SPARC M8 de Oracle presentado en septiembre de 2017 para sus servidores de gama alta.
El 1 de septiembre de 2017, después de una serie de despidos que comenzaron en Oracle Labs en noviembre de 2016, Oracle dio por finalizado el diseño de SPARC después de completar el M8. Gran parte del grupo de desarrollo de núcleos de procesadores en Austin, Texas, fue despedido, al igual que los equipos de Santa Clara, California, y Burlington, Massachusetts. [4] [5]
Fujitsu también descontinuará su producción de SPARC (ya ha pasado a producir sus propias CPU basadas en ARM ), después de dos versiones "mejoradas" del antiguo servidor SPARC M12 de Fujitsu en 2020-22 (anteriormente planeado para 2021) y nuevamente en 2026-27, fin de la venta en 2029, de servidores UNIX y un año después para su mainframe y fin del soporte en 2034 "para promover la modernización del cliente". [6]
La arquitectura SPARC estuvo fuertemente influenciada por los diseños RISC anteriores, incluyendo el RISC I y II de la Universidad de California, Berkeley y el IBM 801. Estos diseños RISC originales eran minimalistas, incluían la menor cantidad posible de funciones o códigos de operación y apuntaban a ejecutar instrucciones a una velocidad de casi una instrucción por ciclo de reloj . Esto los hacía similares a la arquitectura MIPS en muchos aspectos, incluyendo la falta de instrucciones como multiplicar o dividir. Otra característica de SPARC influenciada por este movimiento RISC temprano es la ranura de retardo de bifurcación .
El procesador SPARC normalmente contiene hasta 160 registros de propósito general . Según la especificación "Oracle SPARC Architecture 2015", una "implementación puede contener de 72 a 640 registros de 64 bits de propósito general". [7] En cualquier punto, solo 32 de ellos son inmediatamente visibles para el software: 8 son un conjunto de registros globales (uno de los cuales, g0 , está cableado a cero, por lo que solo siete de ellos se pueden usar como registros) y los otros 24 son de la pila de registros. Estos 24 registros forman lo que se llama una ventana de registro , y en la llamada/retorno de función, esta ventana se mueve hacia arriba y hacia abajo en la pila de registros. Cada ventana tiene ocho registros locales y comparte ocho registros con cada una de las ventanas adyacentes. Los registros compartidos se utilizan para pasar parámetros de función y devolver valores, y los registros locales se utilizan para retener valores locales en las llamadas de función.
El término "escalable" en SPARC se debe a que la especificación SPARC permite que las implementaciones escalen desde procesadores integrados hasta procesadores de servidor de gran tamaño, todos ellos compartiendo el mismo conjunto de instrucciones básicas (sin privilegios). Uno de los parámetros arquitectónicos que pueden escalar es el número de ventanas de registro implementadas; la especificación permite que se implementen de tres a 32 ventanas, por lo que la implementación puede optar por implementar las 32 para proporcionar la máxima eficiencia de la pila de llamadas , o implementar solo tres para reducir el coste y la complejidad del diseño, o implementar una cantidad entre ellas. Otras arquitecturas que incluyen características de archivo de registro similares son Intel i960 , IA-64 y AMD 29000 .
La arquitectura ha pasado por varias revisiones. En la versión 8, se le agregó la funcionalidad de multiplicación y división de hardware. [8] [9] Se agregaron 64 bits (direccionamiento y datos) a la especificación SPARC de la versión 9 publicada en 1994. [10]
En la versión 8 de SPARC, el archivo de registros de punto flotante tiene 16 registros de doble precisión . Cada uno de ellos se puede utilizar como dos registros de precisión simple , lo que proporciona un total de 32 registros de precisión simple. Un par de registros de doble precisión de números pares e impares se puede utilizar como un registro de precisión cuádruple , lo que permite tener 8 registros de precisión cuádruple. La versión 9 de SPARC agregó 16 registros de doble precisión más (a los que también se puede acceder como 8 registros de precisión cuádruple), pero no se puede acceder a estos registros adicionales como registros de precisión simple. Ninguna CPU SPARC implementa operaciones de precisión cuádruple en hardware a partir de 2024. [11]
Las instrucciones de suma y resta etiquetadas realizan sumas y restas sobre valores, verificando que los dos bits inferiores de ambos operandos sean 0 e informando de un desbordamiento si no lo son. Esto puede resultar útil en la implementación del tiempo de ejecución para ML , Lisp y lenguajes similares que podrían usar un formato de entero etiquetado.
El orden de bytes de la arquitectura SPARC V8 de 32 bits es puramente big-endian. La arquitectura SPARC V9 de 64 bits utiliza instrucciones big-endian, pero puede acceder a los datos en orden de bytes big-endian o little-endian, elegidos ya sea en el nivel de instrucción de la aplicación ( cargar-almacenar ) o en el nivel de página de memoria (a través de una configuración MMU). Este último se utiliza a menudo para acceder a datos desde dispositivos inherentemente little-endian, como los de los buses PCI.
Se han producido tres revisiones importantes de la arquitectura. La primera versión publicada fue la SPARC versión 7 (V7) de 32 bits en 1986. La SPARC versión 8 (V8), una definición mejorada de la arquitectura SPARC, se publicó en 1990. Las principales diferencias entre la V7 y la V8 fueron la adición de instrucciones de multiplicación y división de números enteros y una actualización de la aritmética de punto flotante de "precisión extendida" de 80 bits a la aritmética de " precisión cuádruple " de 128 bits. La SPARC V8 sirvió como base para el estándar IEEE 1754-1994, un estándar IEEE para una arquitectura de microprocesador de 32 bits.
SPARC versión 9 , la arquitectura SPARC de 64 bits, fue lanzada por SPARC International en 1993. Fue desarrollada por el Comité de Arquitectura SPARC, compuesto por Amdahl Corporation , Fujitsu , ICL , LSI Logic , Matsushita , Philips , Ross Technology , Sun Microsystems y Texas Instruments . Las especificaciones más nuevas siempre cumplen con la especificación completa SPARC V9 Nivel 1.
En 2002, Fujitsu y Sun publicaron la especificación de programación conjunta SPARC 1 (JPS1), que describe las funciones de los procesadores que se implementaron de forma idéntica en las CPU de ambas empresas ("Commonality"). Las primeras CPU que se ajustaron a la JPS1 fueron la UltraSPARC III de Sun y la SPARC64 V de Fujitsu. Las funcionalidades que no están cubiertas por la JPS1 se documentan para cada procesador en los "Suplementos de implementación".
A finales de 2003, se lanzó JPS2 para admitir CPU multinúcleo. Las primeras CPU que se ajustaron a JPS2 fueron UltraSPARC IV de Sun y SPARC64 VI de Fujitsu.
A principios de 2006, Sun publicó una especificación de arquitectura extendida, UltraSPARC Architecture 2005. Esta incluye no sólo las partes no privilegiadas y la mayoría de las partes privilegiadas de SPARC V9, sino también todas las extensiones de arquitectura desarrolladas a través de las generaciones de procesadores de UltraSPARC III, IV y IV+, así como las extensiones CMT a partir de la implementación de UltraSPARC T1 :
En 2007, Sun publicó una especificación actualizada, UltraSPARC Architecture 2007 , a la que cumplía la implementación de UltraSPARC T2 .
En diciembre de 2007, Sun también puso a disposición el RTL del procesador UltraSPARC T2 a través del proyecto OpenSPARC . [12] También se publicó bajo la licencia pública general GNU v2. [13] OpenSPARC T2 tiene 8 núcleos, 16 pipelines con 64 subprocesos.
En agosto de 2012, Oracle Corporation puso a disposición una nueva especificación, Oracle SPARC Architecture 2011 , que además de la actualización general de la referencia, agrega las extensiones del conjunto de instrucciones VIS 3 y el modo hiperprivilegiado a la especificación de 2007. [14]
En octubre de 2015, Oracle lanzó SPARC M7, el primer procesador basado en la nueva especificación Oracle SPARC Architecture 2015. [7] [15] Esta revisión incluye extensiones del conjunto de instrucciones VIS 4 y cifrado asistido por hardware y memoria segura de silicio (SSM). [16]
La arquitectura SPARC ha proporcionado compatibilidad binaria de aplicaciones continua desde la primera implementación de SPARC V7 en 1987 hasta las implementaciones de la arquitectura Sun UltraSPARC.
Entre las diversas implementaciones de SPARC, SuperSPARC y UltraSPARC-I de Sun fueron muy populares y se utilizaron como sistemas de referencia para los tests de rendimiento SPEC CPU95 y CPU2000. El UltraSPARC-II de 296 MHz es el sistema de referencia para el test de rendimiento SPEC CPU2006.
SPARC 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, de acuerdo con los principios de diseño RISC.
Un procesador SPARC incluye una unidad de enteros (IU) que realiza operaciones de carga, almacenamiento y aritmética de enteros. [17] : 9 [10] : 15–16 Puede incluir una unidad de punto flotante (FPU) que realiza operaciones de punto flotante [17] : 9 [10] : 15–16 y, para SPARC V8, puede incluir un coprocesador (CP) que realiza operaciones específicas del coprocesador; la arquitectura no especifica qué funciones realizaría un coprocesador, además de las operaciones de carga y almacenamiento. [17] : 9
La arquitectura SPARC tiene un esquema de ventanas de registro superpuestas. En cualquier instante, 32 registros de propósito general son visibles. Una variable de puntero de ventana actual ( CWP ) en el hardware apunta al conjunto actual. El tamaño total del archivo de registros no es parte de la arquitectura, lo que permite agregar más registros a medida que la tecnología mejora, hasta un máximo de 32 ventanas en SPARC V7 y V8, ya que CWP es de 5 bits y es parte del registro PSR .
En SPARC V7 y V8, el CWP generalmente se reducirá con la instrucción SAVE (usada por la instrucción SAVE durante la llamada al procedimiento para abrir un nuevo marco de pila y cambiar la ventana de registro), o se incrementará con la instrucción RESTORE (regresando a la llamada antes de regresar del procedimiento). Los eventos de trampa ( interrupciones , excepciones o instrucciones TRAP) y las instrucciones RETT (que regresan de trampas) también cambian el CWP . Para SPARC V9, el registro CWP se reduce durante una instrucción RESTORE y se incrementa durante una instrucción SAVE. Esto es lo opuesto del comportamiento de PSR.CWP en SPARC V8. Este cambio no tiene efecto en las instrucciones no privilegiadas.
Registrar grupo | Mnemotécnico | Dirección de registro | Disponibilidad |
---|---|---|---|
global | G0...G7 | R[ 0 0]...R[ 0 7] | siempre los mismos, siendo G0 cero siempre |
afuera | O0...O7 | R[ 08 ]...R[15] | para ser entregado a, y devuelto desde, la subrutina llamada, como su "entrada" |
local | L0...L7 | R[16]...R[23] | verdaderamente local a la subrutina actual |
en | Yo0...yo7 | R[24]...R[31] | entregado por el que llama y devuelto al que llama, como si estuviera "fuera" |
Los registros SPARC se muestran en la figura de arriba.
También hay un registro Y sin ventana, utilizado por las instrucciones de multiplicación por pasos, multiplicación de enteros y división de enteros. [17] : 32
Un procesador SPARC V8 con una FPU incluye 32 registros de punto flotante de 32 bits, cada uno de los cuales puede contener un número de punto flotante IEEE 754 de precisión simple . Un par par-impar de registros de punto flotante puede contener un número de punto flotante IEEE 754 de precisión doble, y un grupo de cuatro registros de punto flotante alineados en cuádruple puede contener un número de punto flotante IEEE 754 de precisión cuádruple. [17] : 10
Un procesador SPARC V9 con una FPU incluye: [10] : 36–40
Los registros están organizados como un conjunto de 64 registros de 32 bits, donde los primeros 32 se utilizan como registros de punto flotante de 32 bits, los pares pares-impares de los 64 registros se utilizan como registros de punto flotante de 64 bits y los grupos alineados cuádruples de cuatro registros de punto flotante se utilizan como registros de punto flotante de 128 bits.
Los registros de punto flotante no tienen ventanas; todos son registros globales. [10] : 36–40
Todas las instrucciones SPARC ocupan una palabra completa de 32 bits y comienzan en un límite de palabra. Se utilizan cuatro formatos, que se distinguen por los dos primeros bits. Todas las instrucciones aritméticas y lógicas tienen 2 operandos de origen y 1 operando de destino. [18] RD es el "registro de destino", donde se deposita la salida de la operación. La mayoría de las instrucciones SPARC tienen al menos este registro, por lo que se coloca cerca del "frente" del formato de instrucción. RS1 y RS2 son los "registros de origen", que pueden estar presentes o no, o ser reemplazados por una constante.
Tipo | Poco | |||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
Formato SETHI | 00 | RD | 100 | Constante inmediata de 22 bits | ||||||||||||||||||||||||||||
Formato de la rama I | 00 | A | Corte Penal Internacional | 010 | Constante de desplazamiento de 22 bits | |||||||||||||||||||||||||||
Formato de la rama F | 00 | A | Comisión Federal de Comunicaciones | 110 | Constante de desplazamiento de 22 bits | |||||||||||||||||||||||||||
Formato de rama C | 00 | A | ccc | 111 | Constante de desplazamiento de 22 bits | |||||||||||||||||||||||||||
Llamada disp | 01 | Desplazamiento relativo de PC | ||||||||||||||||||||||||||||||
Registro aritmético | 10 | RD | código de operación | RS1 | 0 | 0 | RS2 | |||||||||||||||||||||||||
Aritmética inmediata | 10 | RD | código de operación | RS1 | 1 | Constante inmediata de 13 bits | ||||||||||||||||||||||||||
Operación de la FPU | 10 | Departamento de Bomberos | 110100/110101 | FS1 | OPF | FS2 | ||||||||||||||||||||||||||
Operación CP | 10 | RD | 110110/110111 | RS1 | OPC | RS2 | ||||||||||||||||||||||||||
Registro JMPL | 10 | RD | 111000 | RS1 | 0 | 0 | RS2 | |||||||||||||||||||||||||
JMPL inmediato | 10 | RD | 111000 | RS1 | 1 | Constante inmediata de 13 bits | ||||||||||||||||||||||||||
Registro LD/ST | 11 | RD | código de operación | RS1 | 0 | 0 | RS2 | |||||||||||||||||||||||||
LD/ST inmediato | 11 | RD | código de operación | RS1 | 1 | Constante inmediata de 13 bits |
Las instrucciones de carga y almacenamiento tienen un formato de tres operandos, es decir, tienen dos operandos que representan valores para la dirección y un operando para el registro en el que se leerá o escribirá. La dirección se crea sumando los dos operandos de dirección para producir una dirección. El segundo operando de dirección puede ser una constante o un registro. Las instrucciones de carga toman el valor en la dirección y lo colocan en el registro especificado por el tercer operando, mientras que las instrucciones de almacenamiento toman el valor en el registro especificado por el primer operando y lo colocan en la dirección. Para que esto sea más obvio, el lenguaje ensamblador indica los operandos de dirección utilizando corchetes con un signo más que separa los operandos, en lugar de utilizar una lista separada por comas. Ejemplos: [18]
ld [%L1+%L2],%L3 !carga el valor de 32 bits en la dirección %L1+%L2 y coloca el valor en %L3ld [%L1+8],%L2 !carga el valor en %L1+8 en %L2ld [%L1],%L2 !como arriba, pero sin desplazamiento, que es lo mismo que +%G0st %L1,[%I2] !almacena el valor en %L1 en la ubicación almacenada en %I2st %G0,[%I1+8] !borra la memoria en %I1+8
Debido al uso generalizado de datos que no son de 32 bits, como datos integrales de 16 bits u 8 bits o bytes de 8 bits en cadenas, existen instrucciones que cargan y almacenan medias palabras de 16 bits y bytes de 8 bits, así como instrucciones que cargan palabras de 32 bits. Durante una carga, esas instrucciones leerán solo el byte o la media palabra en la ubicación indicada y luego llenarán el resto del registro de destino con ceros (carga sin signo) o con el valor del bit más alto del byte o la media palabra (carga con signo). Durante un almacenamiento, esas instrucciones descartan los bits superiores en el registro y almacenan solo los bits inferiores. También existen instrucciones para cargar valores de doble precisión utilizados para aritmética de punto flotante , leyendo o escribiendo ocho bytes del registro indicado y el "siguiente", por lo que si el destino de una carga es L1, se establecerán L1 y L2. La lista completa de instrucciones de carga y almacenamiento para los registros de propósito general en SPARC de 32 bits es LD
, ST
, LDUB
(byte sin signo), LDSB
(byte con signo), LDUH
(media palabra sin signo), LDSH
(media palabra con signo), LDD
(carga doble), STB
(almacenamiento de byte), STH
(almacenamiento de media palabra), STD
(almacenamiento doble). [18]
En SPARC V9, los registros son de 64 bits, y la LD
instrucción, renombrada LDUW
, borra los 32 bits superiores del registro y carga el valor de 32 bits en los 32 bits inferiores, y la ST
instrucción, renombrada STW
, descarta los 32 bits superiores del registro y almacena solo los 32 bits inferiores. La nueva LDSW
instrucción establece los bits superiores del registro en el valor del bit superior de la palabra y carga el valor de 32 bits en los bits inferiores. La nueva LDX
instrucción carga un valor de 64 bits en el registro y la STX
instrucción almacena los 64 bits del registro.
Las instrucciones LDF
, LDDF
, y LDQF
cargan un valor de precisión simple, precisión doble o precisión cuádruple desde la memoria a un registro de punto flotante; las instrucciones STF
, STDF
, y STQF
almacenan un registro de punto flotante de precisión simple, precisión doble o precisión cuádruple en la memoria.
La instrucción de barrera de memoria , MEMBAR, cumple dos propósitos interrelacionados: articula restricciones de orden entre referencias de memoria y facilita el control explícito sobre la finalización de las referencias de memoria. Por ejemplo, todos los efectos de los almacenamientos que aparecen antes de la instrucción MEMBAR deben hacerse visibles para todos los procesadores antes de que se pueda ejecutar cualquier carga posterior a MEMBAR. [19]
Las instrucciones aritméticas y lógicas también utilizan un formato de tres operandos, donde los dos primeros son los operandos y el último es la ubicación donde se almacena el resultado. El operando del medio puede ser un registro o una constante entera con signo de 13 bits; los otros operandos son registros. Cualquiera de los operandos de registro puede apuntar a G0; apuntar el resultado a G0 descarta los resultados, que pueden usarse para pruebas. Algunos ejemplos incluyen: [18]
¡suma %L1,%L2,%L3! suma los valores en %L1 y %L2 y coloca el resultado en %L3añadir %L1,1,%L1 !incrementar %L1¡Agrega %G0,%G0,%L4! Limpia cualquier valor en %L4
La lista de instrucciones matemáticas es ADD
, SUB
, AND
, OR
, XOR
, y versiones negadas ANDN
, ORN
, y XNOR
. Una peculiaridad del diseño de SPARC es que la mayoría de las instrucciones aritméticas vienen en pares, con una versión que establece los bits del código de condición NZVC en el registro de estado , y la otra no los establece, siendo el valor predeterminado no establecer los códigos. Esto es para que el compilador tenga una forma de mover las instrucciones cuando intente llenar los espacios de retardo. Si uno quiere que se establezcan los códigos de condición, esto se indica añadiendo cc
a la instrucción: [18]
subcc %L1,10,%G0 !compara %L1 con 10 e ignora el resultado, pero establece las banderas
add y sub también tienen otro modificador, X, que indica si la operación debe establecer el bit de acarreo:
addx %L1,100,%L1 !suma 100 al valor en %L1 y rastrea el acarreo
SPARC V7 no tiene instrucciones de multiplicación o división, pero sí tiene MULSCC
, que realiza un paso de una multiplicación probando un bit y sumando condicionalmente el multiplicando al producto. Esto se debió a que MULSCC
puede completar más de un ciclo de reloj de acuerdo con la filosofía RISC. SPARC V8 agregó instrucciones UMUL
(multiplicación sin signo), SMUL
(multiplicación con signo), UDIV
(división sin signo) y SDIV
(división con signo), con versiones que no actualizan los códigos de condición y versiones que sí lo hacen. MULSCC
y las instrucciones de multiplicación usan el registro Y para almacenar los 32 bits superiores del producto; las instrucciones de división lo usan para almacenar los 32 bits superiores del dividendo. La RDY
instrucción lee el valor del registro Y en un registro de propósito general; la WRY
instrucción escribe el valor de un registro de propósito general en el registro Y. [17] : 32 SPARC V9 agregó MULX
, que multiplica dos valores de 64 bits y produce un resultado de 64 bits, SDIVX
, que divide un dividendo con signo de 64 bits por un divisor con signo de 64 bits y produce un cociente con signo de 64 bits, y UDIVX
, que divide un dividendo sin signo de 64 bits por un divisor sin signo de 64 bits y produce un cociente con signo de 64 bits; ninguna de esas instrucciones utiliza el registro Y. [10] : 199
Las ramificaciones condicionales prueban los códigos de condición en un registro de estado , como se ve en muchos conjuntos de instrucciones, como la arquitectura IBM System/360 y sus sucesores y la arquitectura x86 . Esto significa que una prueba y una ramificación se realizan normalmente con dos instrucciones; la primera es una instrucción ALU que establece los códigos de condición, seguida de una instrucción de ramificación que examina uno de esos indicadores. SPARC no tiene instrucciones de prueba especializadas; las pruebas se realizan utilizando instrucciones ALU normales con el destino establecido en %G0. Por ejemplo, para probar si un registro contiene el valor 10 y luego ramificarse al código que lo maneja, se haría lo siguiente:
subcc %L1,10,%G0 !resta 10 de %L1, estableciendo el indicador cero si %L1 es 10¡sea WASEQUAL! si el indicador cero está establecido, bifurca a la dirección marcada WASEQUAL
En una instrucción de bifurcación condicional, el campo icc o fcc especifica la condición que se está probando. El campo de desplazamiento de 22 bits es la dirección, relativa a la PC actual, del objetivo, en palabras, de modo que las bifurcaciones condicionales pueden avanzar o retroceder hasta 8 megabytes. El bit ANNUL (A) se utiliza para eliminar algunas ranuras de retardo. Si es 0 en una bifurcación condicional, la ranura de retardo se ejecuta de la manera habitual. Si es 1, la ranura de retardo solo se ejecuta si se toma la bifurcación. Si no se toma, se omite la instrucción que sigue a la bifurcación condicional.
Hay una amplia variedad de ramas condicionales: BA
(rama siempre, esencialmente un jmp), BN
(rama nunca), BE
(igual a), BNE
(no igual a), BL
(menor que), BLE
(menor o igual), BLEU
(menor o igual, sin signo), BG
(mayor), BGE
(mayor o igual), BGU
(mayor sin signo), BPOS
(positivo), BNEG
(negativo), BCC
(acarreo limpio), ( BCS
conjunto de acarreo BVC
limpio), BVS
(conjunto de desbordamiento). [17] : 119–120
La FPU y el CP tienen conjuntos de códigos de condición separados de los códigos de condición enteros y entre sí; se definieron dos conjuntos adicionales de instrucciones de bifurcación para probar esos códigos de condición. Agregar una F al principio de la instrucción de bifurcación en la lista anterior realiza la prueba contra los códigos de condición de la FPU, [17] : 121–122 mientras que, en SPARC V8, agregar una C prueba los indicadores en el CP que de otra manera no estaría definido. [17] : 123–124
La instrucción (saltar a subrutina) utiliza un desplazamiento de palabra relativo al contador de programa deCALL
30 bits . Como la dirección de destino especifica el comienzo de una palabra, no de un byte, 30 bits es todo lo que se necesita para alcanzar cualquier dirección en el espacio de direcciones de 4 gigabytes. [18] La instrucción CALL deposita la dirección de retorno en el registro R15, también conocido como registro de salida O7.
La JMPL
instrucción (saltar y enlazar) es una instrucción de tres operandos, con dos operandos que representan valores para la dirección de destino y un operando para un registro en el que se deposita la dirección de retorno. La dirección se crea sumando los dos operandos de dirección para producir una dirección de 32 bits. El segundo operando de dirección puede ser una constante o un registro.
Como el código de operación de la instrucción ocupa algunos bits de la palabra de instrucción de 32 bits, no hay forma de cargar una constante de 32 bits utilizando una sola instrucción. Esto es importante porque las direcciones se manipulan a través de registros y son de 32 bits. Para facilitar esto, la SETHI
instrucción de propósito especial copia su operando inmediato de 22 bits en los 22 bits de orden superior de cualquier registro especificado y establece cada uno de los 10 bits de orden inferior en 0. En el uso general, SETHI va seguido de una instrucción o con solo los 10 bits inferiores del valor establecido. Para facilitar esto, el ensamblador incluye las macros %hi(X)
y %lo(X)
. Por ejemplo: [18]
sethi %hi(0x89ABCDEF),%L1 !establece los 22 bits superiores de L1o %L1,%lo(0x89ABCDEF),%L1 !establece los 10 bits inferiores de L1 mediante ORing
Las macros hi y lo se ejecutan en tiempo de ensamblaje, no en tiempo de ejecución, por lo que no afectan al rendimiento y, al mismo tiempo, dejan más claro que L1 se establece en un solo valor, no en dos valores no relacionados. Para que esto sea aún más fácil, el ensamblador también incluye una "instrucción sintética", , set
que realiza estas dos operaciones en una sola línea:
establecer 0x89ABCDEF,%L1
Esto genera las dos instrucciones anteriores si el valor es mayor a 13 bits, de lo contrario emitirá una sola ld
con el valor. [18]
Como se señaló anteriormente, el ensamblador SPARC utiliza "instrucciones sintéticas" para facilitar las tareas de codificación habituales. Entre otros ejemplos, se incluyen los siguientes: [18]
mnemotécnico | producción real | objetivo |
---|---|---|
nop | sethi 0,%g0 | No hacer nada |
clr %reg | or %g0,%g0,%reg | Poner un registro a cero |
clr [address] | st %g0,[address] | Establecer una dirección de memoria a cero |
clrh [address] | sth %g0,[address] | Establece la media palabra en la dirección de memoria a cero |
clrb [address] | stb %g0,[address] | Establece el byte en la dirección de memoria a cero |
cmp %reg1,%reg2 | subcc %reg1,%reg2,%g0 | Comparar dos registros, establecer códigos, descartar resultados |
cmp %reg,const | subcc %reg,const,%g0 | Comparar registro con constante |
mov %reg1,%reg2 | or %g0,%reg1,%reg2 | Copiar valor de un registro a otro |
mov const,%reg | or %g0,const,%reg | Copiar valor constante en un registro |
inc %reg | add %reg,1,%reg | incrementar un registro |
inccc %reg | addcc %reg,1,%reg | incrementar un registro, establecer condiciones |
dec %reg | sub %reg,1,%reg | decrementar un registro |
deccc %reg | subcc %reg,1,%reg | decrementar un registro, establecer condiciones |
not %reg | xnor %reg,%g0,%reg | voltear los bits en un registro |
neg %reg | sub %g0,%reg,%reg | registro de complemento a dos |
tst %reg | orcc %reg,%g0,%g0 | Comprueba si el valor de un registro es > 0, 0 o < 0 |
Intel era el único productor del 80386 , lo que lo hacía muy caro y hacía que la industria desconfiara de las CPU de un solo proveedor . Cuando Sun anunció SPARC en 1987, la empresa afirmó que estaría disponible en múltiples fuentes. Fujitsu fue el primer proveedor de SPARC y Cypress Semiconductor fue el segundo licenciatario; a partir de febrero de 1989, [actualizar]sus CPU SPARC estaban disponibles, al igual que la FPU de Texas Instruments. [20] Las siguientes organizaciones han licenciado la arquitectura SPARC:
Nombre (nombre clave) | Modelo | Frecuencia (MHz) | Versión arquitectónica | Año | Total de hilos [nota 1] | Proceso (nm) | Transistores (millones) | Tamaño de la matriz (mm 2 ) | Pines de E/S | Potencia (W) | Voltaje (V) | Caché de nivel 1 (KB) | L1 caché (KB) | Caché L2 (KB) | Caché L3 (KB) |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
SPARCMB86900 | Fujitsu [1] [3] [2] | 14.28–33 | V7 | 1986 | 1×1=1 | 1300 | 0,11 | — | 256 | — | — | 0–128 (unificado) | ninguno | ninguno | |
SPARC | Varios [nota 2] | 14.28–40 | V7 | 1989–1992 | 1×1=1 | 800–1300 | ~0,1–1,8 | — | 160–256 | — | — | 0–128 (unificado) | ninguno | ninguno | |
MN10501 (PUNTO DE VISTA) | Computadora Solbourne , Matsushita [21] | 33–36 | V8 | 1990–1991 | 1x1=1 | — | 1.0 [22] | — | — | — | — | 8 | 8 | 0–256 | ninguno |
microSPARC I (Tsunami) | TI TMS390S10 | 40–50 | V8 | 1992 | 1×1=1 | 800 | 0,8 | 225? | 288 | 2.5 | 5 | 2 | 4 | ninguno | ninguno |
SuperSPARC I (Vikingo) | TI TMX390Z50 / Sun STP1020 | 33–60 | V8 | 1992 | 1×1=1 | 800 | 3.1 | — | 293 | 14.3 | 5 | 16 | 20 | 0–2048 | ninguno |
SPARClite | Fujitsu MB8683x | 66–108 | V8E | 1992 | 1×1=1 | — | — | — | 144, 176 | — | 2,5/3,3–5,0 V, 2,5–3,3 V | 1, 2, 8, 16 | 1, 2, 8, 16 | ninguno | ninguno |
hiperSPARC (Colorado 1) | Ross RT620A | 40–90 | V8 | 1993 | 1×1=1 | 500 | 1.5 | — | — | — | 5? | 0 | 8 | 128–256 | ninguno |
microSPARC II (rápido) | Fujitsu MB86904 / Sun STP1012 | 60–125 | V8 | 1994 | 1×1=1 | 500 | 2.3 | 233 | 321 | 5 | 3.3 | 8 | 16 | ninguno | ninguno |
hiperSPARC (Colorado 2) | Ross RT620B | 90–125 | V8 | 1994 | 1×1=1 | 400 | 1.5 | — | — | — | 3.3 | 0 | 8 | 128–256 | ninguno |
SuperSPARC II (Voyager) | Sol STP1021 | 75–90 | V8 | 1994 | 1×1=1 | 800 | 3.1 | 299 | — | 16 | — | 16 | 20 | 1024–2048 | ninguno |
hiperSPARC (Colorado 3) | Ross RT620C | 125–166 | V8 | 1995 | 1×1=1 | 350 | 1.5 | — | — | — | 3.3 | 0 | 8 | 512–1024 | ninguno |
TurboSPARC | Fujitsu MB86907 | 160–180 | V8 | 1996 | 1×1=1 | 350 | 3.0 | 132 | 416 | 7 | 3.5 | 16 | 16 | 512 | ninguno |
UltraSPARC (Spitfire) | Sol STP1030 | 143–167 | V9 | 1995 | 1×1=1 | 470 | 3.8 | 315 | 521 | 30 [nota 3] | 3.3 | 16 | 16 | 512–1024 | ninguno |
UltraSPARC (avispón) | Sol STP1030 | 200 | V9 | 1995 | 1×1=1 | 420 | 5.2 | 265 | 521 | — | 3.3 | 16 | 16 | 512–1024 | ninguno |
hiperSPARC (Colorado 4) | Ross RT620D | 180–200 | V8 | 1996 | 1×1=1 | 350 | 1.7 | — | — | — | 3.3 | 16 | 16 | 512 | ninguno |
SPARC64 | Fujitsu (HAL) | 101–118 | V9 | 1995 | 1×1=1 | 400 | — | Multichip | 286 | 50 | 3.8 | 128 | 128 | — | — |
SPARC64 II | Fujitsu (HAL) | 141–161 | V9 | 1996 | 1×1=1 | 350 | — | Multichip | 286 | 64 | 3.3 | 128 | 128 | — | — |
SPARC64 III | Fujitsu (HAL) MBCS70301 | 250–330 | V9 | 1998 | 1×1=1 | 240 | 17.6 | 240 | — | — | 2.5 | 64 | 64 | 8192 | — |
UltraSPARC II (Blackbird) | Sol STP1031 | 250–400 | V9 | 1997 | 1×1=1 | 350 | 5.4 | 149 | 521 | 25 [nota 4] | 2.5 | 16 | 16 | 1024 o 4096 | ninguno |
UltraSPARC IIs (negro zafiro) | Sol STP1032 / STP1034 | 360–480 | V9 | 1999 | 1×1=1 | 250 | 5.4 | 126 | 521 | 21 [nota 5] | 1.9 | 16 | 16 | 1024–8192 | ninguno |
UltraSPARC IIi (Sable) | Sol SME1040 | 270–360 | V9 | 1997 | 1×1=1 | 350 | 5.4 | 156 | 587 | 21 | 1.9 | 16 | 16 | 256–2048 | ninguno |
UltraSPARC IIi (rojo zafiro) | Sol SME1430 | 333–480 | V9 | 1998 | 1×1=1 | 250 | 5.4 | — | 587 | 21 [nota 6] | 1.9 | 16 | 16 | 2048 | ninguno |
UltraSPARC IIe (Hummingbird) | Sol SME1701 | 400–500 | V9 | 1999 | 1×1=1 | 180 Al | — | — | 370 | 13 [nota 7] | 1,5–1,7 | 16 | 16 | 256 | ninguno |
UltraSPARC IIi (IIe+) (fantasma) | Sol SME1532 | 550–650 | V9 | 2000 | 1×1=1 | 180 pies cúbicos | — | — | 370 | 17.6 | 1.7 | 16 | 16 | 512 | ninguno |
SPARC64-GP | Fujitsu SFCB81147 | 400–563 | V9 | 2000 | 1×1=1 | 180 | 30.2 | 217 | — | — | 1.8 | 128 | 128 | 8192 | — |
SPARC64-GP | -- | 600–810 | V9 | — | 1×1=1 | 150 | 30.2 | — | — | — | 1.5 | 128 | 128 | 8192 | — |
SPARC64 IV | Fujitsu MBCS80523 | 450–810 | V9 | 2000 | 1×1=1 | 130 | — | — | — | — | — | 128 | 128 | 2048 | — |
UltraSPARC III (guepardo) | Sol SME1050 | 600 | JP1 | 2001 | 1×1=1 | 180 Al | 29 | 330 | 1368 | 53 | 1.6 | 64 | 32 | 8192 | ninguno |
UltraSPARC III (guepardo) | Sol SME1052 | 750–900 | JP1 | 2001 | 1×1=1 | 130 Al | 29 | — | 1368 | — | 1.6 | 64 | 32 | 8192 | ninguno |
UltraSPARC III Cu (Cheetah+) | Sol SME1056 | 900–1200 | JP1 | 2001 | 1×1=1 | 130 pies cúbicos | 29 | 232 | 1368 | 50 [nota 8] | 1.6 | 64 | 32 | 8192 | ninguno |
UltraSPARC IIIi (Jalapeño) | Sol SME1603 | 1064–1593 | JP1 | 2003 | 1×1=1 | 130 | 87,5 | 206 | 959 | 52 | 1.3 | 64 | 32 | 1024 | ninguno |
SPARC64 V (Zeus) | Fujitsu | 1100–1350 | JP1 | 2003 | 1×1=1 | 130 | 190 | 289 | 269 | 40 | 1.2 | 128 | 128 | 2048 | — |
SPARC64 V+ (Olympus B) | Fujitsu | 1650–2160 | JP1 | 2004 | 1×1=1 | 90 | 400 | 297 | 279 | 65 | 1 | 128 | 128 | 4096 | — |
UltraSPARC IV (Jaguar) | Sol SME1167 | 1050–1350 | JPS2 | 2004 | 1×2=2 | 130 | 66 | 356 | 1368 | 108 | 1.35 | 64 | 32 | 16384 | ninguno |
UltraSPARC IV+ (Pantera) | Sol SME1167A | 1500–2100 | JPS2 | 2005 | 1×2=2 | 90 | 295 | 336 | 1368 | 90 | 1.1 | 64 | 64 | 2048 | 32768 |
UltraSPARC T1 (Niágara) | Sol SME1905 | 1000–1400 | UA2005 | 2005 | 4×8=32 | 90 | 300 | 340 | 1933 | 72 | 1.3 | 8 | 16 | 3072 | ninguno |
SPARC64 VI (Olympus-C) | Fujitsu | 2150–2400 | JPS2 | 2007 | 2×2=4 | 90 | 540 | 422 | — | 120–150 | 1.1 | 128×2 | 128×2 | 4096–6144 | ninguno |
UltraSPARC T2 (Niágara 2) | Sol SME1908A | 1000–1600 | UA2007 | 2007 | 8×8=64 | 65 | 503 | 342 | 1831 | 95 | 1.1–1.5 | 8 | 16 | 4096 | ninguno |
UltraSPARC T2 Plus (Cataratas Victoria) | Sol SME1910A | 1200–1600 | UA2007 | 2008 | 8×8=64 | 65 | 503 | 342 | 1831 | — | — | 8 | 16 | 4096 | ninguno |
SPARC64 VII (Júpiter) [23] | Fujitsu | 2400–2880 | JPS2 | 2008 | 2×4=8 | 65 | 600 | 445 | — | 150 | — | 64×4 | 64×4 | 6144 | ninguno |
UltraSPARC "RK" ( Roca ) [24] | Sol SME1832 | 2300 | ???? | cancelado [25] | 2×16=32 | 65 | ? | 396 | 2326 | ? | ? | 32 | 32 | 2048 | ? |
SPARC64 VIIIfx (Venus) [26] [27] | Fujitsu | 2000 | JPS2 / HPC-ACE | 2009 | 1×8=8 | 45 | 760 | 513 | 1271 | 58 | ? | 32×8 | 32×8 | 6144 | ninguno |
LEÓN2FT | Atmel AT697F | 100 | V8 | 2009 | 1×1=1 | 180 | — | — | 196 | 1 | 1.8/3.3 | 16 | 32 | — | —|ninguno |
SPARC T3 (Cascada Arcoiris) | Oráculo/Sol | 1650 | UA2007 | 2010 | 8×16=128 | 40 [28] | ???? | 371 | ? | 139 | ? | 8 | 16 | 6144 | ninguno |
Galaxia FT-1500 | NUDT (China) | 1800 | ¿UA2007? | 201? | 8×16=128 | 40 | ???? | ??? | ? | 65 | ? | 16×16 | 16×16 | 512×16 | 4096 |
SPARC64 VII+ (Júpiter-E o M3) [29] [30] | Fujitsu | 2667–3000 | JPS2 | 2010 | 2×4=8 | 65 | — | — | — | 160 | — | 64×4 | 64×4 | 12288 | ninguno |
LEÓN3FT | Cobham Gaisler GR712RC | 100 | V8E | 2011 | 1×2=2 | 180 | — | — | — | 1.5 [nota 9] | 1.8/3.3 | 4x4Kb | 4x4Kb | ninguno | ninguno |
1000 reales | MCST (Rusia) | 1000 | JPS2 | 2011 | 1×4=4 | 90 | 180 | 128 | — | 15 | 1, 1.8, 2.5 | 32 | 16 | 2048 | ninguno |
SPARC T4 (Cataratas de Yosemite) [31] | Oráculo | 2850–3000 | OSA2011 | 2011 | 8×8=64 | 40 | 855 | 403 | ? | 240 | ? | 16×8 | 16×8 | 128×8 | 4096 |
SPARC64 IXfx [32] [33] [34] | Fujitsu | 1850 | JPS2 / HPC-ACE | 2012 | 1x16=16 | 40 | 1870 | 484 | 1442 | 110 | ? | 32×16 | 32×16 | 12288 | ninguno |
SPARC64 X (Atenea) [35] | Fujitsu | 2800 | OSA2011 / HPC-ACE | 2012 | 2×16=32 | 28 | 2950 | 587,5 | 1500 | 270 | ? | 64×16 | 64×16 | 24576 | ninguno |
SPARC-T5 | Oráculo | 3600 | OSA2011 | 2013 | 8×16=128 | 28 | 1500 | 478 | ? | ? | ? | 16×16 | 16×16 | 128×16 | 8192 |
SPARC-M5 [36] | Oráculo | 3600 | OSA2011 | 2013 | 8×6=48 | 28 | 3900 | 511 | ? | ? | ? | 16×6 | 16×6 | 128×6 | 49152 |
SPARC-M6 [37] | Oráculo | 3600 | OSA2011 | 2013 | 8×12=96 | 28 | 4270 | 643 | ? | ? | ? | 16×12 | 16×12 | 128×12 | 49152 |
SPARC64 X+ (Atenea+) [38] | Fujitsu | 3200–3700 | OSA2011 / HPC-ACE | 2014 | 2×16=32 | 28 | 2990 | 600 | 1500 | 392 | ? | 64×16 | 64×16 | 24 millones | ninguno |
SPARC64XIfx [39] | Fujitsu | 2200 | JPS2 / HPC-ACE2 | 2014 | 1×(32+2)=34 | 20 | 3750 | ? | 1001 | ? | ? | 64×34 | 64×34 | 12M × 2 | ninguno |
SPARC-M7 [40] [41] | Oráculo | 4133 | OSA2015 | 2015 | 8×32=256 | 20 | >10.000 | ? | ? | ? | ? | 16×32 | 16×32 | 256×24 | 65536 |
SPARC S7 [42] [43] | Oráculo | 4270 | OSA2015 | 2016 | 8×8=64 | 20 | ???? | ? | ? | ? | ? | 16×8 | 16×8 | 256×2+256×4 | 16384 |
SPARC64 XII [44] | Fujitsu | 4250 | OSA201?/HPC-ACE | 2017 | 8×12=96 | 20 | 5500 | 795 | 1860 | ? | ? | 64×12 | 64×12 | 512×12 | 32768 |
SPARC-M8 [45] [46] | Oráculo | 5000 | OSA2017 | 2017 | 8×32=256 | 20 | ? | ? | ? | ? | ? | 32×32 | 16×32 | 128×32+256×8 | 65536 |
León4 | Cobham Gaisler GR740 | 250 [nota 10] | V8E | 2017 | 1×4=4 | 32 | — | — | — | — | 1.2/2.5/3.3 | 4x4 | 4x4 | 2048 | ninguno |
2000 reales | MCST (Rusia) | 2000 | ? | 2018 | 1×8=8 | 28 | 500 | ? | — | ? | ? | ? | ? | ? | ninguno |
León5 | Cobham Gaisler | — | V8E | 2019 | ? | ? | — | — | — | — | — | ? | ? | 16–8192 | ninguno |
Nombre (nombre clave) | Modelo | Frecuencia (MHz) | Versión arquitectónica | Año | Total de hilos [nota 1] | Proceso (nm) | Transistores (millones) | Tamaño de la matriz (mm 2 ) | Pines de E/S | Potencia (W) | Voltaje (V) | Caché de nivel 1 (KB) | L1 caché (KB) | Caché L2 (KB) | Caché L3 (KB) |
Notas :
Las máquinas SPARC generalmente han utilizado SunOS , Solaris , JavaOS u OpenSolaris de Sun , incluidos los derivados illumos y OpenIndiana , pero también se han utilizado otros sistemas operativos , como NeXTSTEP , RTEMS , FreeBSD , OpenBSD , NetBSD y Linux .
En 1993, Intergraph anunció un puerto de Windows NT a la arquitectura SPARC, [47] pero luego fue cancelado.
En octubre de 2015, Oracle anunció una "plataforma de referencia Linux para SPARC". [48]
Existen varias implementaciones de código totalmente abierto de la arquitectura SPARC:
También existe un simulador de código totalmente abierto para la arquitectura SPARC:
Para cargas HPC, Fujitsu construye procesadores SPARC64 fx especializados con un nuevo conjunto de extensiones de instrucciones, llamado HPC-ACE (High Performance Computing – Arithmetic Computational Extensions).
El ordenador K de Fujitsu ocupó el puesto número 1 en las listas TOP500 de junio de 2011 y noviembre de 2011. Combina 88.128 CPU SPARC64 VIIIfx , cada una con ocho núcleos, para un total de 705.024 núcleos, casi el doble que cualquier otro sistema en el TOP500 en ese momento. El ordenador K era más potente que los siguientes cinco sistemas de la lista combinados, y tenía la relación rendimiento-potencia más alta de cualquier sistema de supercomputadora. [49] También ocupó el puesto número 6 en la lista Green500 de junio de 2011, con una puntuación de 824,56 MFLOPS/W. [50] En la publicación de noviembre de 2012 de TOP500 , el ordenador K ocupó el puesto número 3, utilizando con diferencia la mayor potencia de los tres primeros. [51] Ocupó el puesto número 85 en la publicación correspondiente de Green500 . [52] Los procesadores HPC más nuevos, IXfx y XIfx , se incluyeron en las recientes supercomputadoras PRIMEHPC FX10 y FX100.
Tianhe-2 ( número 1 en el TOP500 a noviembre de 2014 [53] ) tiene varios nodos con procesadores basados en OpenSPARC Galaxy FT-1500 desarrollados en China. Sin embargo, esos procesadores no contribuyeron a la puntuación LINPACK . [54] [55]
IMPL. DEP. #2-V8: Una implementación de la arquitectura Oracle SPARC puede contener de 72 a 640 registros R de 64 bits de propósito general. Esto corresponde a una agrupación de los registros en conjuntos MAXPGL + 1 de registros R globales más una pila circular de conjuntos N_REG_WINDOWS de 16 registros cada uno, conocidos como ventanas de registro. La cantidad de ventanas de registro presentes (N_REG_WINDOWS) depende de la implementación, dentro del rango de 3 a 32 (inclusive).
existen cuatro situaciones en las que el hardware no completará correctamente una instrucción de punto flotante: ... La instrucción no está implementada por el hardware (como ... instrucciones de precisión cuádruple en cualquier FPU SPARC).
{{citation}}
: CS1 maint: URL no apta ( enlace )