SIMD


Single Instruction, Single Data
SISD

Single Instruction, Multiple Data
SIMD

Le istruzioni MMX (e le IntegerSSE) sono operazioni SIMD rivolte a interi (solitamente 4 word a istruzione). Per questo motivo do un rimando al manuale dell'intel [1] e alla mia Guida alle istruzioni fornite da MMX.

SSE

Entriamo in dettaglio sulle istruzioni SSE per operazioni su floating point. Queste estensioni permettono di eseguire operazioni tra 4 floating point singola precisione con una sola istruzione.
Il registro XMM che viene usato nelle operazioni SSE e' un registro a 128bit, che contiene 4 floating point impacchettati. Questi 8 registri sono in piu ai registri floating point, cosa che non era invece avvenuta nel caso dell'MMX in cui i registri dell'MMX erano in comune con i registri dei calcoli in FloatingPoint.

In generale le SSE permettono per ogni istruzione un funzionamento SISD che SIMD. Percio' e' possibile sommare il primo floating point tra un registro XMM e la memoria usando il comando ADDSS, sia sommare tutti i 4 floating point tra XMM e memoria usando ADDPS.

Istruzioni aritmetiche


Le istruzioni aritmetiche che SSE forniscono sono

ADDPS/ADDSS somma tra floating point;
SUBPS/SUBSS sottrazione tra floating point
MULPS/MULSS moltiplicazione tra floating point
DIVPS/DIVSS divisione tra floating point
SQRTPS/SQRTSS radice quadrata
MAXPS/MAXSS il massimo tra due valori DestReg[i] = Max(DestReg[i], SrcReg[i]) 
MINPS/MINSS il minimo tra due valori DestReg[i] = Min(DestReg[i], SrcReg[i])

Calcolo del reciproco di un numero

RCPSS/RCPPS calcola il reciproco di un numero (1.0f/number).
RSQTRSS/RSQTRSP calcola il reciproco della radice quadrata di un numero (1.0f/sqrt(number))

Istruzioni di confronto


Sono presenti le solite istruzioni di confronto (uguale, maggiore, maggiore uguale, minore uguale).

Istruzioni di conversione

Le SSE possiedono le funzioni di conversione da e a i registri a 64 bit dell'MMX e i registri x86 a 32 bit.

CVTPI2PS converte i due integer a 32bit di un registro MMX nei due numeri a floating point meno significativi di un registo XMM.
CVTSI2SS converte un integer a 32 bit di un registro MMX nel floating point meno significativo di un registro MMX.
CVTPS2PI converte i due floating meno significativi di un registro XMM in due interi in un registro XMM. CVTTPS2PI e' simile a CVTPS2PI, tranne che la conversione si puo' considerare inesatta, e il risultato del troncamento viene restituito.
CVTSS2SI converte il numero meno significativo del registro XMM in un intero a 32 bit di un registro standard. CVTTSS2SI e' simile a CVTSS2SI, tranne che viene troncato e il resto restituito.

Reference

[1] http://www.tommesani.com/Docs.html
[2] Intel Architecture Software Developer’s Manual, Volume 2: Instruction Set Reference