SSE3
# SSE3

SSE3 (conosciuto anche con il nome di Prescott New Instructions o PNI) è un instruction set SIMD dell'architettura IA-32, sviluppato da Intel, che estende la precedente versione (SSE2).

I primi set SIMD sulle piattaforme x86 sono stati l'MMX, e il 3DNow! (usato solo da parte di AMD), e successivamente SSE e SSE2.

Intel ha introdotto le istruzioni SSE3 agli inizi del 2004 con il Pentium 4 basato sul core Prescott, mentre AMD ha provveduto a implementarne il supporto nei suoi Athlon 64, attraverso la "revision" E, solo nell'aprile 2005.

Il set SSE3 originale aggiunge 13 nuove istruzioni rispetto al predecessore SSE2; la più rivoluzionaria di queste istruzioni consente di lavorare orizzontalmente in un registro in contrapposizione con quanto avveniva precedentemente in cui era possibile solo verticalmente. Più precisamente, sono state aggiunte le istruzioni per sommare e sottrarre i molteplici valori memorizzati in un singolo registro. Tali istruzioni semplificano l'implementazione di un gran numero di operazioni DSP e 3D. È inoltre presente una nuova istruzione per convertire i numeri a virgola mobile in interi senza interferire con il normale flusso dell'elaborazione della CPU, quindi senza creare stalli nella pipeline.

Nel 2006, con il lancio dell'architettura Intel Core Microarchitecture è stata lanciata sul mercato un'evoluzione del set SSE3, chiamato SSSE3 che aggiunge altre 32 istruzioni e ottimizza una serie di aspetti del set originale.

## Nuove istruzioni

### Aritmetiche

* ADDSUBPD - (Add-Subtract-Packed-Double)
   * Input - { A0, A1 }, { B0, B1 }
   * Output - { A0 - B0, A1 + B1 }
* ADDSUBPS - (Add-Subtract-Packed-Single)
   * Input: { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
   * Output: { A0 - B0, A1 + B1, A2 - B2, A3 + B3 }

### AOS ( Array di Strutture )v

* HADDPD - (Horizontal-Add-Packed-Double)
   * Input: { A0, A1 }, { B0, B1 }
   * Output: { A0 + A1, B0 + B1 }
* HADDPS (Horizontal-Add-Packed-Single)
   * Input: { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
   * Output: { A0 + A1, A2 + A3, B0 + B1, B2 + B3 }
* HSUBPD - (Horizontal-Subtract-Packed-Double)
   * Input: { A0, A1 }, { B0, B1 }
   * Output: { A0 - A1, B0 - B1 }
* HSUBPS - (Horizontal-Subtract-Packed-Single)
   * Input: { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
   * Output: { A0 - A1, A2 - A3, B0 - B1, B2 - B3 }
* LDDQU - un modo alternativo di caricare un vettore che non è allineato correttamente in memoria. Può servire per operazioni di compressione video.
* MOVDDUP, MOVSHDUP, MOVSLDUP - queste operazioni si prestano molto bene per calcoli su numeri complessi e vengono usate molto in calcoli su sinusoidi e suoni.
* FISTTP - analoga alla vecchia istruzione FISTP x87, ma ignora il metodo di arrotondamento impostato nel registro di controllo SSE e usa invece il troncamento; permette di evitare il salvataggio e caricamento del registro di controllo in linguaggi come il C, dove le conversioni da float a int prevedono il troncamento come comportamento standard.

### Istruzioni specifiche Intel

* MONITOR, MWAIT - Pensate per ottimizzare applicazioni multi-threaded, migliorano le prestazioni dei processori con Hyper-Threading.
