# SSE4

SSE4 è un instruction set SIMD sviluppato dalla Intel Corporation e annunciato a settembre 2006, arrivato poi sul mercato a fine 2007 con i primi processori a 45 nm presentati dalla stessa Intel.
Come i set predecessori, anche con SSE4 è possibile ripetere la stessa operazione con più di un elemento di dati, al posto di richiedere che ogni istruzione sia direttamente legata ad un elemento dati, permettendo di ottenere un generale incremento della velocità di elaborazione con applicazioni di tipo multimediale.

## Campi di utilità delle SSE4

Di seguito sono riassunte le 3 tipologie di contenuti che dovrebbero trarre maggior vantaggio dall'utilizzo delle nuove istruzioni:
* Accelerazione video - 14 istruzioni saranno dedicate all'accelerazione dei calcoli tipicamente utilizzati nell'elaborazione di contenuti video;
* "Graphics Building Blocks" - 32 istruzioni primitive orientate alla grafica;
* "Streaming Load" - utile per accedere e ricevere dati di ritorno da dispositivi di memoria che non siano presenti nella cache del sistema.

## Implementazione di Intel

L'intero set prevede 54 nuove istruzioni, ma Intel ha scelto di inaugurare il proprio supporto a tali istruzioni integrandone solo 47, e indicandole come SSE4.1 (dove .1 indica la prima versione, l'implementazione definitiva arrivò solo nel 2008). Fra le 47 nuove istruzioni si possono citare i sottogruppi "Floating Point Dot Product" (DPPS, DPPD) e i "Floating Point Round" (ROUNDPS, ROUNDSS, ROUNDPD, ROUNDSD), coinvolti nell'ottimizzazione delle scene 2D e 3D. Appare chiaro quindi che uno degli ambiti di utilizzo che è in grado di trarre maggior beneficio da questo nuovo set d'istruzioni è quello dei videogiochi, insieme a tutti quelli che richiedono un uso massiccio dei calcoli in virgola mobile. Tra le altre novità, si possono citare "Vectorizing compiling", "Media, string and text processing" e "Application targeted accelerators".
È da evidenziare inoltre la funzionalità "Super Shuffle Engine" che riduce le latenze processando operazioni a 128 bit in un solo ciclo di clock velocizzando alcune tipiche operazioni legate all'utilizzo delle istruzioni SSE.
Le restanti istruzioni che vanno a comporre il set completo, indicato da Intel come SSE4.2, sono le seguenti: CRC32, PCMPESTRI, PCMPESTRM, PCMPISTRI, PCMPISTRM, PCMPGTQ, e POPCNT

## Nuove istruzioni

Diversamente dalle altre versioni di SSE, SSE4 contiene istruzioni non specifiche per operazioni multimediali. Implementa molte operazioni il cui comportamento dipende da un campo costante e un gruppo di istruzioni che prende XMM0 come terzo operando implicito. Parecchie di queste istruzioni sono attive con il motore di shuffle a ciclo singolo in Penryn (operazioni di shuffle sono quelle che causano il riposizionamento dei bit in un byte o in una word).

### SSE4.1

Queste istruzioni sono state introdotte con la microarchitettura Penryn, la riduzione a 45 nm della microarchitettura Core di Intel.
| Istruzione | Descrizione |
| MPSADBW | Calcola otto somme offset di differenze assolute (i.e. |x$_0$-y$_0$|+|x$_1$-y$_1$|+|x$_2$-y$_2$|+|x$_3$-y$_3$|, |x$_0$-y$_1$|+|x$_1$-y$_2$|+|x$_2$-y$_3$|+|x$_3$-y$_4$|, ...); questa operazione è fondamentale per i codec HDTV, e permette di calcolare le differenze in un blocco 8x8 in solo sette cicli di clock. Un bit in un operando immediato a tre bit indica se deve essere usato y$_0$ .. y$_{10}$ o y$_4$ .. y$_{14}$ dall'operando di destinazione, gli altri due dicono se devono essere usati x$_0$..x$_3$, x$_4$..x$_7$, x$_8$..x$_{11}$ o x$_{12}$..x$_{15}$ dall'operando sorgente. |
| PHMINPOSUW | Setta la word bassa a 16 bit della destinazione alla più piccola word unsigned a 16 bit nella sorgente, e la successiva word destinazione all'indice di quella word nella sorgente. |
| PMULDQ | Moltiplicazione packed con segno su due insiemi di due su quattro interi packed, il 1º e il 3º per i 4 packed, dando 2 interi packed a 64 bit come risultato. |
| PMULLD | Moltiplicazione packed con segno, 4 insiemi packed di interi a 32 bit moltiplicati per dare 4 risultati packed a 32 bit. |
| DPPS, DPPD | Prodotto scalare per dati AOS (Array of Structs). Prende un operando immediato fatto di quattro (o due per DPPD) bit per scegliere quale delle voci in input deve essere moltiplicata e accumulata, e altri quattro (o due per DPPD) per decidere se mettere 0 o il prodotto scalare nell'appropriato campo nell'output. |
| BLENDPS, BLENDPD, BLENDVPS, BLENDVPD, PBLENDVB, PBLENDW | Copia condizionale di elementi in una locazione con un'altra, basata (per la forma non-V) sui bit in un operando immediato e (per la forma V) sui bit nel registro XMM0. |
| PMINSB, PMAXSB, PMINUW, PMAXUW, PMINUD, PMAXUD, PMINSD, PMAXSD | Minimo/massimo packed per diversi tipi di operandi interi. |
| ROUNDPS, ROUNDSS, ROUNDPD, ROUNDSD | Arrotondamento dei valori di un registro da virgola mobile a interi, usando uno di quattro modi diversi di arrotondamento specificati da un operando immediato. |
| INSERTPS, PINSRB, PINSRD/PINSRQ, EXTRACTPS, PEXTRB, PEXTRW, PEXTRD/PEXTRQ | Le istruzioni INSERTPS e PINSR leggono 8, 16 o 32 bit da una locazione in memoria o da un registro x86 e li inseriscono in un campo del registro destinazione puntato da un operando immediato; EXTRACTPS e PEXTR leggono un campo dal registro sorgente e lo scrivono in un registro x86 o in una locazione di memoria. Per esempio, PEXTRD eax, [xmm0], 1; EXTRACTPS [addr+4*eax], xmm1, 1 scrive il primo campo di xmm1 all'indirizzo dato dal primo campo di xmm0. |
| PMOVSXBW, PMOVZXBW, PMOVSXBD, PMOVZXBD, PMOVSXBQ, PMOVZXBQ, PMOVSXWD, PMOVZXWD, PMOVSXWQ, PMOVZXWQ, PMOVSXDQ, PMOVZXDQ | Estensione packed dello zero o del segno a tipi più ampi. |
| PTEST | Simile all'istruzione TEST: setta il flag Z al risultato dell'AND fra i suoi operandi: ZF viene messo a zero se DEST AND SRC è pari a 0. Il flag Carry viene settato se (NOT DEST) AND SRC è zero. Questo equivale ad impostare il flag Zero se nessuno dei bit mascherati da SRC è a uno, e il flag Carry se tutti i bit mascherati da SRC sono a uno. |
| PCMPEQQ | Confronto di quadword (64 bit) per testare l'uguaglianza |
| PACKUSDW | Converte DWORD con segno in WORD senza segno, con saturazione. |
| MOVNTDQA | Lettura efficiente da un'area di memoria write-combining in un registro SSE; utile per caricare dati da periferiche collegate al bus di memoria. |

### SSE4.2

Queste istruzioni sono state implementate per la prima volta nella linea di prodotti Core i7 Intel basata su Nehalem, e completano il set di istruzioni SSE.
| Istruzione | Descrizione |
| CRC32 | Accumula il valore CRC32C usando il polinomio 0x11EDC6F41 (oppure, senza il bit di ordine alto, 0x1EDC6F41). |
| PCMPESTRI | Confronto su stringhe packed di lunghezza esplicita; ritorna un indice |
| PCMPESTRM | Confronto su stringhe packed di lunghezza esplicita; ritorna una maschera |
| PCMPISTRI | Confronto su stringhe packed di lunghezza implicita; ritorna un indice |
| PCMPISTRM | Confronto su stringhe packed di lunghezza implicita; ritorna una maschera |
| PCMPGTQ | Maggiore o uguale su dati packed a 64 bit con segno |
| POPCNT | Conteggio di popolazione (conta i bit uguali a 1). L'istruzione POPCNT può essere presente anche su processori che non supportano le altre istruzioni SSE4; in genere si può testare un bit a parte per determinarne la presenza sul particolare processore. |

### SSE4a

Il gruppo di istruzioni SSE4a fu implementato nella microarchitettura Barcelona di AMD. Con l'eccezione di POPCNT, queste istruzioni non sono disponibili sui processori Intel.
| Istruzione | Descrizione |
| LZCNT | Leading Zero Count - manipolazione di bit. L'istruzione LZCNT può essere implementata anche in processori che non supportano le altre istruzioni SSE4; in genere si può testare un bit a parte per determinarne la presenza sul particolare processore. |
| POPCNT | Conteggio di popolazione (conta i bit uguali a 1). L'istruzione POPCNT può essere presente anche su processori che non supportano le altre istruzioni SSE4; in genere si può testare un bit a parte per determinarne la presenza sul particolare processore. |
| EXTRQ/INSERTQ | Istruzioni combinate di mascheramento e scorrimento. |
| MOVNTSD/MOVNTSS | Istruzioni di memorizzazione di una stringa di scalari. |

## Processori con SSE4

Le istruzioni SSE4 dovevano essere implementate da Intel per la prima volta all'interno dei processori Core 2 Duo, Conroe e Merom, e nella controparte per i server, gli Xeon DP della serie 51xx, Woodcrest, e inizialmente sembrava che il set dovesse comprendere 16 nuove istruzioni. In realtà questi processori videro solo una revisione delle precedenti SSE3 (chiamata SSSE3) e si è quindi saputo che Intel aveva deciso di rimandare le SSE4 ai progetti successivi.
I primi processori a incorporare le nuove istruzioni e, più precisamente, il sottoinsieme di 47 istruzioni SSE4.1 sono stati i processori a 45 nm Penryn, Wolfdale e Yorkfield, appartenenti alla seconda generazione dell'architettura Intel Core Microarchitecture.
L'intero set delle istruzioni, indicato come SSE4.2 è arrivato invece nei processori appartenenti all'architettura Nehalem, successiva alla Core, e il cui primo esponente è il core Bloomfield.

## SSE4 e Tejas New Instructions: qualche attinenza?

Nel 2004 Intel interruppe lo sviluppo del processore Tejas che avrebbe dovuto portare con sé un nuovo set di istruzioni, chiamato Tejas New Instructions (o TNI). Dato che Tejas era il successore di Prescott che aveva introdotto le Prescott New Instructions (o PNI) divenute poi le SSE3, si è ipotizzato che le TNI potessero essere proprio lo stadio embrionale delle SSE4, e le scarsissime informazioni rilasciate da Intel riguardo a questo set di istruzioni poi sospeso insieme al processore che avrebbe dovuto introdurlo non hanno fatto altro che infittire il mistero infatti, sebbene plausibile, non ci sono prove certe di correlazione le TNI e le SSE4.
Alcune indicazioni preliminari, le uniche praticamente dato lo stop del progetto Tejas, indicavano questo set come formato da 8 nuove istruzioni studiate per il riconoscimento vocale avanzato, multi-threading e il supporto Dolby Digital (Azalia). Non è chiaro se tra le 54 istruzioni SSE4 siano comprese anche le 8 previste dalle TNI, ma dato che il nuovo set è arrivato sul mercato più di 3 anni dopo quello previsto per il progetto Tejas, è probabile che comprenda una completa rivisitazione delle istruzioni originarie, in modo da migliorare ulteriormente le prestazioni negli ambiti di utilizzo per i quali le TNI erano state pensate.