# SPARC

SPARC (de l'anglès Scalable Processor ARChitecture) és una arquitectura RISC big-endian. És a dir, una arquitectura amb un conjunt reduït d'instruccions.
Va ser originalment dissenyat per Sun Microsystems i dirigit per l'enginyer Kaa en 1985, es basa en els dissenys RISC I i II de la Universitat de Califòrnia, Berkeley, definits entre els anys 1980 i 1982.
L'empresa Sun Microsystems va dissenyar aquesta arquitectura i la va llicenciar a altres fabricants com Texas Instruments, Cypress Semiconductor, Fujitsu, LSI Logic entre d'altres.
SPARC és la primera arquitectura RISC oberta i com tal, les especificacions de disseny estan publicades, així més fabricants de microprocessadors poden desenvolupar el seu propi disseny.
Una de les idees innovadores d'aquesta arquitectura és la finestra de registres que permeten fer fàcilment compiladors d'alt rendiment i una significativa reducció de memòria en les instruccions load/store en relació amb altres arquitectures RISC. Els avantatges s'aprecien sobretot en programes grans.
La CPU SPARC està formada d'una unitat sencera, UI (Integer Unit) que processa l'execució bàsica i una FPU (Floating-Point Unit) que executa les operacions i càlculs de reals. La IU i la FPU poden o no estar integrades en el mateix xip.
Encara que no és una part formal de l'arquitectura, els PCs basats amb sistemes SPARC de Sun Microsystems tenen una unitat de maneig de memòria (MMU) i un gran caché d'adreces virtuals (per a instruccions i dades) que estan disposats perifèricament sobre un bus de dades i adreces de 32 bits.

## Principals característiques

* La seva característica distintiva és utilitzar finestres de registres.
* 32 registres de sencers de 32 bits.
* 16 registres de punt flotant de 64 bits (pel cas de doble precisió) que es poden utilitzar com 32 registres de 32 bits (per a precisió simple).
* Modes d'adreçament:
** Immediat, (constants de 13 bits).
** Directe, (offset de 13 bits).
** Indirecte, (registre + offset de 13 bits o registre + registre).
* Utilitza instruccions retardades (salts, load i store).
* Maneig de memòria:
** Espai virtual de 4 Gigabytes.
** Unitat de maneig de memòria (MMU) que treballa amb pàgines de mida configurable.

## Tipus d'instruccions

L'arquitectura SPARC té prop de 50 instruccions senceres, poques més que l'anterior disseny RISC, però menys de la meitat del nombre d'instruccions senceres del 6800 de Motorola.
Les instruccions de SPARC es poden classificar en cinc categories:
* LOAD i STORE (L'única manera d'accedir a la memòria). Aquestes instruccions utilitzen dos registres o, un registre i una constant per a calcular l'adreça de memòria que cal adreçar.
* Instruccions Aritmètico/Lògiques/Desplaçament. Executen operacions aritmètiques, lògiques i de desplaçament de bits. Aquestes instruccions calculen el resultat si és una funció de 2 operadors i emmagatzemen el resultat en un registre.
* Operacions del coprocessador. La IU extrau les operacions de punt flotant des de les instruccions del bus de dades i els situa en la cua per la FPU. La FPU executa els càlculs de punt flotant amb un nombre fix en unitat aritmètica de punt flotant, (el nombre depèn de l'aplicació). Les operacions de punt flotant són executades concurrentment amb les instruccions de la IU i amb altres operacions de punt flotant quan és necessari. L'arquitectura SPARC també especifica una interfície per la connexió d'un coprocessador addicional.
* Instruccions de Control de Transferència. Aquestes inclouen jumps, calls, traps i branches. El control de transferència és retardat usualment fins després de l'execució de la pròxima instrucció, així el pipeline no és buidat perquè es produeixi un control de temps. D'aquesta manera, els compiladors poden ser optimitzats per ramificacions retardades.
* Instruccions de control de registres Read/Write. Aquestes instruccions s'inclouen per llegir i enregistrar el contingut de diversos registres de control. Generalment la font del destí està implícit en la instrucció.

## Finestra de registres

Un tret únic que caracteritza al disseny SPARC, és la finestra amb superposició de registres. El processador posseeix molt més que 32 registres sencers, però presenta a cada instant 32. Una analogia pot ser creada comparant la finestra de registres amb una roda rotativa. Alguna part de la roda sempre està amb contacte amb el terra; així en girar-la prenem diferents porcions de la roda, (l'efecte és similar per al overlap de la finestra de registres). El resultat d'un registre es canvia per l'operand per la pròxima operació, descartant la necessitat d'una instrucció Load i Store extres.
Es va acordar per l'especificació de l'arquitectura, poder disposar de 32 registres "visibles" dividits en grups de 8.
* De r0 a r7, Registres GLOBALS.
* De r8 a r15, Registres SORTIDA.
* De r16 a r23, Registres LOCALS.
* De r24 a r31, Registres ENTRADA.
Els registres globals són "vistos" per totes les finestres, els locals solament són accessibles per la finestra actual i els registres de sortida se solapen amb els registres d'entrada de la següent finestra (els registres de sortida per una finestra s'han de ficar com a registres d'entrada per la pròxima, i han d'estar en el mateix registre).
El punter de finestra manté la pista de la finestra que actualment és activa. Existeixen instruccions per "obrir" i "tancar" finestres, per exemple per una instrucció "call", la finestra de registres gira en sentit anti horari; pel retorn des d'una instrucció "call", gira en sentit horari.
Una interrupció utilitza una finestra fresca, és a dir, obre una finestra nova. La quantitat de finestres és un paràmetre de la implementació, generalment 7 o \d.
L'alternativa més elaborada per circumdar lentament la finestra de registres és col·locar els registres durant el temps de compilació. Per a llenguatges com C, Pascal, etz., aquesta estratègia és difícil i consumeix molt temps. Per això, el compilador és crucial per millorar la productivitat del programa.
"Recents investigacions suggereixen que la finestra de registres, trobada en els sistemes SPARC però no en altres màquines RISC comercials, estan en condicions de proveir un rendiment excel·lent per a llenguatges de desenvolupament com Lisp i Smalltalk." (R. Blau, P.Foley, etz. 1984).

## Especificacions dels microprocessadors SPARC

Especificacions microprocessadors SPARC :
| Model | Freqüència [MHz] | Versió de l'Arquitectura | Any | Threads Per Core * Cores = Total Threads | Procés [µm] | Transistors [milions] | Die size [mm²] | Pins E/S | Potència [W] | Voltatge [V] | L1 Dcache [k] | L1 Icache [k] | L2 Cache [k] | L3 Cache [k] |
| microSPARC I | 40–50 | V8 | 1992 | 1*1=1 | 0.8 | 0.8 | 225? | 288 | 2.5 | 5 | 2 | 4 | -- | -- |
| SuperSPARC I | 33–60 | V8 | 1992 | 1*1=1 | 0.8 | 3.1 | -- | 293 | 14.3 | 5 | 16 | 20 | 0-2048 | -- |
| HyperSPARC A | 40–90 | V8 | 1993 | 1*1=1 | 0.5 | 1.5 | -- | -- | -- | 5? | 0 | 8 | 128-256 | -- |
| microSPARC II | 60–125 | V8 | 1994 | 1*1=1 | 0.5 | 2.3 | 233 | 321 | 5 | 3.3 | 8 | 16 | -- | -- |
| HyperSPARC B | 90–125 | V8 | 1994 | 1*1=1 | 0.4 | 1.5 | -- | -- | -- | 3.3 | 0 | 8 | 128-256 | -- |
| SuperSPARC II | 75–90 | V8 | 1994 | 1*1=1 | 0.8 | 3.1 | 299 | -- | 16 | -- | 16 | 20 | 1024-2048 | -- |
| HyperSPARC C | 125–166 | V8 | 1995 | 1*1=1 | 0.35 | 1.5 | -- | -- | -- | 3.3 | 0 | 8 | 512-1024 | -- |
| TurboSPARC | 160–180 | V8 | 1995 | 1*1=1 | 0.35 | 3.0 | 132 | 416 | 7 | 3.5 | 16 | 16 | 512 | -- |
| UltraSPARC I (Spitfire) | 143–167 | V9 | 1995 | 1*1=1 | 0.47 | 5.2 | 315 | 521 | 30 @167 MHz | 3.3 | 16 | 16 | 512-1024 | -- |
| UltraSPARC I (Hornet) | 200 | V9 | 1998 | 1*1=1 | 0.42 | 5.2 | 265 | 521 | -- | 3.3 | 16 | 16 | 512-1024 | -- |
| HyperSPARC D | 180–200 | V8 | 1996 | 1*1=1 | 0.35 | 1.7 | -- | -- | -- | 3.3 | 16 | 16 | 512 | -- |
| UltraSPARC IIs (Blackbird) | 250–400 | V9 | 1997 | 1*1=1 | 0.35 | 5.4 | 149 | 521 | 25 @250 MHz | 2.5 | 16 | 16 | 1024 or 4096 | -- |
| UltraSPARC IIs (Sapphire-Black) | 360–480 | V9 | 1999 | 1*1=1 | 0.25 | 5.4 | 126 | 521 | 21 @400 MHz | 1.9 | 16 | 16 | 1024–8192 | -- |
| UltraSPARC IIi (Sabre) | 270–360 | V9 | 1997 | 1*1=1 | 0.35 | 5.4 | 156 | 587 | 21 | 1.9 | 16 | 16 | 256–2048 | -- |
| UltraSPARC IIi (Sapphire-Red) | 333–480 | V9 | 1998 | 1*1=1 | 0.25 | 5.4 | -- | 587 | 21 @440 MHz | 1.9 | 16 | 16 | 2048 | -- |
| UltraSPARC IIe (Hummingbird) | 400–600 | V9 | 2000 | 1*1=1 | 0.18 Al | -- | -- | 370 | 13 max @500 MHz | 1.5-1.7 | 16 | 16 | 256 | -- |
| UltraSPARC III | 600 | V9 | 2001 | 1*1=1 | 0.18 Al | 29 | 330 | 1368 | 53 | 1.6 | 64 | 32 | 8192 | -- |
| UltraSPARC III | 750–900 | V9 | 2001 | 1*1=1 | 0.13 Al | 29 | -- | 1368 | -- | 1.6 | 64 | 32 | 8192 | -- |
| UltraSPARC IIIcu | 1002–1200 | V9 | 2001 | 1*1=1 | 0.13 Cu | 29 | -- | 1368 | -- | 1.6 | 64 | 32 | 8192 | -- |
| UltraSPARC IIi (IIe+) | 550–650 | V9 | 2002 | 1*1=1 | 0.18 Cu | -- | -- | 370 | 17.6 | 1.7 | 16 | 16 | 512 | -- |
| UltraSPARC IIIi | 1064–1593 | V9 | 2003 | 1*1=1 | 0.13 | 87.5 | 206 | 959 | 52 | 1.3 | 64 | 32 | 1024 | -- |
| SPARC64 V (Zeus) | 1100-1350 | V9/JPS1 | 2003 | 1*1=1 | 0.13 | 190 | 289 | 269 | 40 | 1.2 | 128 | 128 | 2048 | -- |
| SPARC64 V+ (Olympus-B) | 1650–2160 | V9/JPS1 | 2004 | 1*1=1 | 0.09 | 400 | 297 | 279 | 65 | 1 | 128 | 128 | 4096 | -- |
| UltraSPARC IV (Jaguar) | 1050–1350 | V9 | 2004 | 1*2=2 | 0.13 | 66 | 356 | 1368 | 108 | 1.35 | 64 | 32 | 16384 | -- |
| UltraSPARC IV+ (Panther) | 1500 | V9 | 2005 | 1*2=2 | 0.09 | 295 | 336 | 1368 | 90 | 1.1 | 64 | 64 | 2048 | 32768 |
| UltraSPARC T1 (Niagara) | 1000–1400 | V9 / UA 2005 | 2005 | 4*8=32 | 0.09 | 300 | 340 | 1933 | 72 | 1.3 | 8 | 16 | 3072 | -- |
| SPARC64 VI (Olympus-C) | 2150-2400 | V9 | 2007 | 2*2=4 | 0,09 | 540 | 422 | -- | 120 | -- | 128 | 128 | 6144 | -- |
| UltraSPARC T2 (Niagara) | 1000–1400 | V9 / UA 2007 | 2007 | 8*8=64 | 0.065 | 503 | 342 | 1831 | 95 | 1.1 | 8 | 16 | 4096 | -- |
| UltraSPARC T2+ (Victoria Falls) | 1000–1400 | V9 / UA 2007 | 2008 | 8*8=64 | 0.065 | 503 | 342 | 1831 | -- | -- | 8 | 16 | 4096 | -- |
| SPARC64 VII (Jupiter) | 2400–2520 | V9 | 2008 | 2*16=32 | 0.065 | 600 | 445 | -- | 135 | -- | 64 | 64 | 6144 | -- |
| UltraSPARC RK (Rock) | 2300 | V9 | 2009 | 2*16=32 | 0.065 | -- | 396 | 2326 | -- | -- | 32 | 32 | 2048 | -- |
| Model | Freqüència [MHz] | Versió de l'Arquitectura | Any | Threads Per Core * Cores = Total Threads | Procés [µm] | Transistors [milions] | Die size [mm²] | Pins E/S | Potència [W] | Voltatge [V] | L1 Dcache [k] | L1 Icache [k] | L2 Cache [k] | L3 Cache [k] |

## Vegeu també

* Arquitectura ARM
* Arquitectura RISC-V
* Arquitectura Intel
* Arquitectura MIPS
* Arquitectura XCore
* Arquitectura Xtensa

## Enllaços externs

* SPARC International, Inc. (anglès) (japonès)
* OpenSPARC - La iniciativa de SUN per crear una comunitat pel desenvolupament de l'arquitectura del processador (anglès)
* SPARC64™ V Background Briefing (anglès)