Unità Floating Point
L’unità Floating Point (FPU) contiene due componenti, lo scheduler floating point, e le unità di esecuzione floating point
Scheduler Floating Point
Lo scheduler è in grado di accettare 3 macro-op per ciclo in qualsiasi combinazione tra le istruzioni supportate che sono: x87 floating-point, 3DNow!, MMX, SSE1/2/3/4a.
Esso gestisce il register renaming ed ha un buffer di tre code da 14 elementi ciascuno, per un totale di 42 elementi (la precedente architettura Stars aveva 3 code da 12 elementi per un totale di 36 macro-op: anche qui code più lunghe significano prestazioni maggiori).
Esso esegue anche il superforwarding, che consiste nell’inoltrare i risultati di una operazione di lettura dalla memoria alle operazioni dipendenti nello stesso ciclo di clock, senza aspettare la scrittura nei registri, come avviene per il regolare forwarding che avviene normalmente sia in questa unità che nella unità intera, tramite l’uso dei bus di risultato.
Inoltre esegue l’inoltro delle micro-op, e l’esecuzione fuori ordine. Lo scheduler comunica anche con l’ICU per ritirare le istruzioni completate, per gestire i risultati delle varie istruzioni di conversione floating point ad intero e viceversa (le due unità intere e floating point usano per comunicare un bus da 64 bit) e per ricevere i comandi di annullamento dei risultati dovuti alla predizione errata di un salto.
Unità di esecuzione floating point (FPU)
La FPU gestisce tutte le operazioni su registri del set di istruzioni x87, 3DNow!, MMX e SSE1/2/3/4a.
La FPU comprende una unità di rinominazione dello stack (poiché le istruzioni x87 lavorano non con registri ma con una architettura a stack di 8 elementi, ereditata dalle prime FPU esterne x87) che consente di tradurre l’accesso a stack in un accesso a uno degli 8 registri, una unità di register renaming convenzionale, uno scheduler, un register file, contenente i registri fisici e le unità di esecuzione capaci di elaborare ognuna fino a 128 bit per ciclo di clock. In figura è riportato un diagramma a blocchi per il flusso di dati della FPU.
Come è visibile in figura la FPU è composta da 3 unità (FADD, FMUL, and FSTORE).
L’unità FADD è in grado di eseguire tutte le istruzioni di addizione e sottrazione, sia intere SIMD (3DNow!, MMX e SSEn), sia floating point, nonché i tipi di movimento tra registri e gli shuffle (scambio) ed extract SSEn.
L’unità FMUL è in grado di eseguire tutte le istruzioni di moltiplicazione, divisione, inverso, radice quadrata e trascendenti sia intere SIMD (3DNow!, MMX e SSEn), sia floating point, nonché i movimenti tra registri e alcuni tipi semplici di shuffle ed extract.
L’unità FSTORE è utilizzata, da sola o in tandem, in ogni istruzione che richiede un accesso in memoria ed è anche in grado di effettuare i movimenti tra registri.