SPARC ( ARChitecture de procesador escalable ) es una arquitectura de conjunto de instrucciones de computadora con 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 de mayor éxito, y su éxito llevó 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 , reemplazando sus sistemas Sun-3 anteriores basados en la serie de procesadores Motorola 68000 . SPARC V8 agregó una serie de mejoras que formaron 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. Posteriormente, se utilizaron procesadores SPARC. en servidores de multiprocesamiento simétrico (SMP) y 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 otorgar licencias y promover la arquitectura SPARC, administrar las marcas comerciales SPARC (incluida SPARC, de su propiedad) 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 obtenido licencias para varios fabricantes, incluidos Atmel , Bipolar Integrated Technology , Cypress Semiconductor , Fujitsu , Matsushita y Texas Instruments . Gracias a SPARC International, SPARC es completamente abierto, no propietario y libre de regalías.
A partir de 2024, los últimos procesadores SPARC comerciales de alta gama 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 alta gama.
El 1 de septiembre de 2017, después de una ronda de despidos que comenzó en Oracle Labs en noviembre de 2016, Oracle puso fin al diseño SPARC después de completar el M8. Gran parte del grupo de desarrollo del núcleo del procesador en Austin, Texas, fue despedido, al igual que los equipos en Santa Clara, California y Burlington, Massachusetts. [4] [5]
Fujitsu también suspenderá su producción 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 planificado para 2021) y nuevamente en 2026-27. fin de venta en 2029, de servidores UNIX y un año después para su mainframe y fin de soporte en 2034 "para promover la modernización de los clientes". [6]
La arquitectura SPARC estuvo fuertemente influenciada por los diseños RISC anteriores, incluidos los 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 tenían como objetivo 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, incluida la falta de instrucciones como multiplicar o dividir. Otra característica de SPARC influenciada por este movimiento inicial de RISC es el intervalo de retardo de rama .
El procesador SPARC suele contener hasta 160 registros de uso general . Según la especificación "Oracle SPARC Architecture 2015", una "implementación puede contener de 72 a 640 registros de 64 bits de uso general". [7] En cualquier momento, sólo 32 de ellos son inmediatamente visibles para el software: 8 son un conjunto de registros globales (uno de los cuales, g0 , está conectado a cero, por lo que sólo siete de ellos se pueden utilizar como registros) y el 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 funciones y devolver valores, y los registros locales se utilizan para retener valores locales en las llamadas a funciones.
Lo "escalable" en SPARC proviene del hecho de que la especificación SPARC permite que las implementaciones escale desde procesadores integrados hasta procesadores de servidor grandes, todos compartiendo el mismo conjunto de instrucciones centrales (sin privilegios). Uno de los parámetros arquitectónicos que se puede escalar es el número de ventanas de registro implementadas; la especificación permite implementar 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 costo y la complejidad del diseño, o implementar algún número entre ellas. Otras arquitecturas que incluyen características de archivos de registro similares incluyen Intel i960 , IA-64 y AMD 29000 .
La arquitectura ha pasado por varias revisiones. Obtuvo funcionalidad de multiplicación y división de hardware en la versión 8. [8] [9] Se agregaron 64 bits (direccionamiento y datos) a la versión 9 de la especificación SPARC publicada en 1994. [10]
En SPARC versión 8, el archivo de registro de punto flotante tiene 16 registros de doble precisión . Cada uno de ellos se puede utilizar como dos registros de precisión simple , proporcionando un total de 32 registros de precisión simple. Se puede utilizar un par de registros de doble precisión de números pares e impares como un registro de precisión cuádruple , permitiendo así 8 registros de precisión cuádruple. SPARC Versión 9 agregó 16 registros más de doble precisión (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 en valores, verificando que los dos bits inferiores de ambos operandos sean 0 y reportando desbordamiento si no lo son. Esto puede resultar útil en la implementación del tiempo de ejecución de ML , Lisp y lenguajes similares que pueden usar un formato de entero etiquetado.
El endianidad 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 en el nivel de instrucción de la aplicación ( cargar-almacenar ) o en el nivel de la página de memoria (a través de un configuración de MMU). Este último se utiliza a menudo para acceder a datos desde dispositivos inherentemente little-endian, como los de los buses PCI.
Ha habido tres revisiones importantes de la arquitectura. La primera versión publicada fue la versión 7 (V7) de SPARC de 32 bits en 1986. La versión 8 (V8) de SPARC, una definición mejorada de la arquitectura SPARC, se lanzó en 1990. Las principales diferencias entre V7 y V8 fueron la suma de multiplicación de enteros y instrucciones de división 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. SPARC V8 sirvió como base para el estándar IEEE 1754-1994, un estándar IEEE para una arquitectura de microprocesador de 32 bits.
La versión 9 de SPARC , 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 Instrumentos Texas . Las especificaciones más nuevas siempre cumplen con la especificación SPARC V9 Nivel 1 completa.
En 2002, Fujitsu y Sun publicaron la Especificación de programación conjunta SPARC 1 (JPS1), que describe funciones de procesador que se implementaron de manera idéntica en las CPU de ambas compañías ("Commonality"). Las primeras CPU que cumplieron con JPS1 fueron la UltraSPARC III de Sun y la SPARC64 V de Fujitsu. Las funcionalidades que no están cubiertas por JPS1 están documentadas para cada procesador en "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 la UltraSPARC IV de Sun y la SPARC64 VI de Fujitsu.
A principios de 2006, Sun lanzó una especificación de arquitectura extendida, UltraSPARC Architecture 2005 . Esto incluye no solo las partes no privilegiadas y la mayoría de las privilegiadas de SPARC V9, sino también todas las extensiones arquitectónicas desarrolladas a través de las generaciones de procesadores de UltraSPARC III, IV IV+, así como extensiones CMT que comienzan con la implementación de UltraSPARC T1 :
En 2007, Sun lanzó una especificación actualizada, UltraSPARC Architecture 2007 , que cumplía la implementación UltraSPARC T2 .
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. [12]
En octubre de 2015, Oracle lanzó SPARC M7, el primer procesador basado en la nueva especificación Oracle SPARC Architecture 2015 . [7] [13] Esta revisión incluye extensiones del conjunto de instrucciones de VIS 4 y cifrado asistido por hardware y memoria segura de silicio (SSM). [14]
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 las pruebas comparativas SPEC CPU95 y CPU2000. El UltraSPARC-II de 296 MHz es el sistema de referencia para el benchmark SPEC CPU2006.
SPARC es una arquitectura de carga y 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, de acuerdo con los principios de diseño RISC.
Un procesador SPARC incluye una unidad de enteros (IU) que realiza operaciones aritméticas, de carga y de almacenamiento de enteros. [15] : 9 [10] : 15–16 Puede incluir una unidad de punto flotante (FPU) que realiza operaciones de punto flotante [15] : 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, aparte de las operaciones de carga y almacenamiento. [15] : 9
La arquitectura SPARC tiene un esquema de ventanas de registro superpuestas. En cualquier instante, son visibles 32 registros de propósito general. Una variable de puntero de ventana actual ( CWP ) en el hardware apunta al conjunto actual. El tamaño total del archivo de registro no forma parte de la arquitectura, lo que permite agregar más registros a medida que mejora la tecnología, hasta un máximo de 32 ventanas en SPARC V7 y V8, ya que CWP es de 5 bits y forma parte del registro PSR .
En SPARC V7 y V8, CWP normalmente se reducirá con la instrucción SAVE (utilizada 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 (que vuelve a la llamada antes). al regresar del procedimiento). Los eventos de trampa ( interrupciones , excepciones o instrucciones TRAP) y las instrucciones RETT (regreso de trampas) también cambian el CWP . Para SPARC V9, el registro CWP disminuye durante una instrucción RESTORE y aumenta durante una instrucción SAVE. Esto es lo opuesto al comportamiento de PSR.CWP en SPARC V8. Este cambio no tiene ningún efecto en las instrucciones sin privilegios.
Los registros SPARC se muestran en la figura anterior.
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. [15] : 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 doble precisión, y un grupo de cuatro registros de punto flotante alineados cuádruple puede contener un número de punto flotante IEEE 754 de precisión cuádruple. [15] : 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, utilizándose los primeros 32 como registros de punto flotante de 32 bits, y los pares pares e impares de los 64 registros como registros de punto flotante de 64 bits. y grupos de cuatro registros de punto flotante alineados cuádruple que se utilizan como registros de punto flotante de 128 bits.
Los registros de punto flotante no tienen ventanas; todos ellos 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, distinguidos por los dos primeros bits. Todas las instrucciones aritméticas y lógicas tienen 2 operandos de origen y 1 operando de destino. [16] RD es el "registro de destino", donde se deposita el resultado 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 fuente", que pueden estar presentes o no, o ser reemplazados por una constante.
Las instrucciones de carga y almacenamiento tienen un formato de tres operandos, ya que tienen dos operandos que representan valores para la dirección y un operando para que el registro lea o escriba. 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 cargas toman el valor en la dirección y lo colocan en el registro especificado por el tercer operando, mientras que las tiendas toman el valor en el registro especificado por el primer operando y lo colocan en la dirección. Para hacer esto más obvio, el lenguaje ensamblador indica las direcciones de los operandos usando corchetes con un signo más que separa los operandos, en lugar de usar una lista separada por comas. Ejemplos: [16]
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 compensación, que es lo mismo que +%G0st %L1,[%I2] !almacena el valor en %L1 en la ubicación almacenada en %I2st %G0,[%I1+8] !borrar la memoria en %I1+8
Debido al uso generalizado de datos que no son de 32 bits, como datos integrales de 16 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 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 superior del byte o media palabra ( carga firmada). Durante una tienda, esas instrucciones descartan los bits superiores en el registro y almacenan solo los bits inferiores. También hay instrucciones para cargar valores de doble precisión utilizados para la 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 configurarán L1 y L2. La lista completa de instrucciones SPARC de 32 bits es LD
, ST
, LDUB
(byte sin signo), LDSB
(byte con signo), LDUH
(medio-byte sin signo ). palabra), LDSH
(media palabra con signo), LDD
(cargar doble), STB
(almacenar byte), STH
(almacenar media palabra), STD
(almacenar doble). [16]
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 Registra y almacena sólo 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, doble o cuádruple desde la memoria a un registro de punto flotante; las instrucciones STF
, STDF
y STQF
almacenan en la memoria un registro de punto flotante de precisión simple, doble o cuádruple.
La instrucción de barrera de la memoria , MEMBAR, tiene dos propósitos interrelacionados: articula restricciones de orden entre las referencias de la memoria y facilita el control explícito sobre la finalización de las referencias de la memoria. Por ejemplo, todos los efectos de las tiendas 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. [17]
Las instrucciones aritméticas y lógicas también utilizan un formato de tres operandos, siendo los dos primeros los operandos y el último la ubicación para almacenar el resultado. El operando medio puede ser un registro o una constante entera con signo de 13 bits; los otros operandos son registros. Cualquiera de los operandos del registro puede apuntar a G0; apuntar el resultado a G0 descarta los resultados, que pueden usarse para pruebas. Los ejemplos incluyen: [16]
sumar %L1,%L2,%L3 !suma los valores en %L1 y %L2 y pone el resultado en %L3agregar %L1,1,%L1 !incrementar %L1agregar %G0,%G0,%L4 !borrar cualquier valor en %L4
La lista de instrucciones matemáticas es , ADD
, SUB
, , y versiones negadas , y . Una peculiaridad del diseño SPARC es que la mayoría de las instrucciones aritméticas vienen en pares: una versión configura los bits del código de condición NZVC en el registro de estado y la otra no los configura, siendo el valor predeterminado no configurar los códigos. Esto es para que el compilador tenga una forma de mover las instrucciones cuando intenta llenar los espacios de retardo. Si se desea que se establezcan los códigos de condición, esto se indica agregando a la instrucción: [16]AND
OR
XOR
ANDN
ORN
XNOR
cc
subcc %L1,10,%G0 !Compare %L1 con 10 e ignore el resultado, pero establezca 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 !Agregue 100 al valor en %L1 y realice un seguimiento del acarreo
SPARC V7 no tiene instrucciones de multiplicación o división, pero sí MULSCC
, que realiza un paso de una multiplicación probando un bit y sumando condicionalmente el multiplicando al producto. Esto se debe a que MULSCC
puede completar más de un ciclo de reloj de acuerdo con la filosofía RISC. SPARC V8 agregó UMUL
instrucciones (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 utilizan el registro Y para contener los 32 bits superiores del producto; las instrucciones de división lo utilizan para contener los 32 bits superiores del dividendo. La RDY
instrucción lee el valor del registro Y en un registro de uso general; la WRY
instrucción escribe el valor de un registro de propósito general en el registro Y. [15] : Se agregó 32 SPARC V9 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 ramas condicionales prueban 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 bifurcación normalmente se realizan con dos instrucciones; la primera es una instrucción ALU que establece los códigos de condición, seguida de una instrucción de rama que examina uno de esos indicadores. El SPARC no cuenta con 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 tiene el valor 10 y luego pasar al código que lo maneja, se podría:
subcc %L1,10,%G0 !resta 10 de %L1, estableciendo el indicador cero si %L1 es 10ser WASEQUAL! Si se establece el indicador cero, diríjase a la dirección marcada como 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 ramas condicionales pueden avanzar o retroceder hasta 8 megabytes. El bit ANNUL (A) se utiliza para eliminar algunos intervalos de retardo. Si es 0 en una rama condicional, el intervalo de retardo se ejecuta como de costumbre. Si es 1, el intervalo de retraso solo se ejecuta si se toma la rama. Si no se toma, se omite la instrucción que sigue a la rama condicional.
Hay una amplia variedad de ramas condicionales: BA
(ramificación siempre, esencialmente un jmp), BN
(ramificación nunca), BE
(igual), BNE
(no igual), 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
(llevar claro), BCS
(llevar conjunto), BVC
(desbordamiento claro), BVS
(desbordamiento conjunto). [15] : 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 rama 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 con los códigos de condición de la FPU, [15] : 121–122 mientras que, en SPARC V8, agregar una C prueba los indicadores en el CP que de otro modo no estaría definido. [15] : 123-124
La instrucción (saltar a subrutina) utiliza un desplazamiento de palabra relativo al contador de programaCALL
de 30 bits . Como la dirección de destino especifica el inicio de una palabra, no un byte, 30 bits es todo lo que se necesita para llegar a cualquier dirección en el espacio de direcciones de 4 gigabytes. [16] 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 (salto y enlace) 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 depositar 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 usando 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 instrucción de propósito especial SETHI
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 un o instrucción con solo los 10 bits inferiores del valor establecido. Para facilitar esto, el ensamblador incluye las macros %hi(X)
y %lo(X)
. Por ejemplo: [16]
sethi %hi(0x89ABCDEF),%L1 !Establece los 22 bits superiores de L1o %L1,%lo(0x89ABCDEF),%L1 !establece los 10 bits inferiores de L1 mediante operación OR
Las macros hi y lo se ejecutan en tiempo de compilación, no en tiempo de ejecución, por lo que no afecta el rendimiento pero deja más claro que está configurando L1 en un solo valor, no en dos no relacionados. Para hacerlo 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 que 13 bits; de lo contrario, emitirá una sola ld
con el valor. [dieciséis]
Como se señaló anteriormente, el ensamblador SPARC utiliza "instrucciones sintéticas" para facilitar las tareas de codificación comunes. Ejemplos adicionales incluyen (entre otros): [16]
Las siguientes organizaciones han obtenido licencias para la arquitectura SPARC:
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ó una adaptación de Windows NT a la arquitectura SPARC, [44] pero luego fue cancelada.
En octubre de 2015, Oracle anunció una "plataforma de referencia Linux para SPARC". [45]
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 FX SPARC64 especializados con un nuevo conjunto de extensiones de instrucciones, llamado HPC-ACE (Computación de alto rendimiento – Extensiones computacionales aritméticas).
La computadora 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 del TOP500 en ese momento. La computadora K era más poderosa 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. [46] 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. [47] En la versión de noviembre de 2012 de TOP500 , la computadora K ocupó el puesto número 3, utilizando con diferencia la mayor potencia de las tres primeras. [48] Ocupó el puesto 85 en la versión correspondiente de Green500 . [49] Los procesadores HPC más nuevos, IXfx y XIfx , se incluyeron en las supercomputadoras PRIMEHPC FX10 y FX100 recientes.
Tianhe-2 ( TOP500 No. 1 en noviembre de 2014 [50] ) tiene varios nodos con procesadores Galaxy FT-1500 basados en OpenSPARC desarrollados en China. Sin embargo, esos procesadores no contribuyeron a la puntuación LINPACK . [51] [52]
IMPL. DEP. #2-V8: Una implementación de la arquitectura Oracle SPARC puede contener de 72 a 640 registros R de 64 bits de uso 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. El número de ventanas de registro presentes (N_REG_WINDOWS) depende de la implementación y está dentro del rango de 3 a 32 (inclusive).
Sin embargo, hay cuatro situaciones en las que el hardware no completa con éxito una instrucción de punto flotante: ... La instrucción no es implementada por el hardware (como ... instrucciones de precisión cuádruple en cualquier FPU SPARC).
{{citation}}
: Mantenimiento CS1: URL no apta ( enlace )