HADDPD, HSUBPD Rozkazy działają na wektorach liczb zmiennoprzecinkowych podwójnej precyzji. Rozkaz HADDPD dodaje do siebie sąsiednie elementy wektorów, natomiast HSUBPD odejmuje. Instrukcja HADDPD xmm1, xmm2 wykonuje:

temp := xmm1 + xmm1 temp := xmm2 + xmm2 xmm1 := temp

natomiast HSUBPD xmm1, xmm2:

temp := xmm1 - xmm1 temp := xmm2 - xmm2 xmm1 := temp

MOVSLDUP, MOVSHDUP Rozkazy działają na wektorze liczb zmiennoprzecinkowych pojedynczej precyzji; rozkaz MOVSLDUP powiela elementy o parzystych indeksach, MOVHLDUP – o nieparzystych. Instrukcja MOVSLDUP xmm1, xmm2 wykonuje:

xmm1 := xmm2 xmm1 := xmm2 xmm1 := xmm2 xmm1 := xmm2

natomiast MOVSHDUP xmm1, xmm2:

xmm1 := xmm2 xmm1 := xmm2 xmm1 := xmm2 xmm1 := xmm2

Np. 3 2 1 0 +-----+-----+-----+-----+ xmm2 = | d | c | b | a | +-----+-----+-----+-----+

Wynik MOVSLDUP:

+-----+-----+-----+-----+ xmm1 = | c | c | a | a | +-----+-----+-----+-----+

Wynik MOVSHDUP:

+-----+-----+-----+-----+ xmm1 = | d | d | b | b | +-----+-----+-----+-----+

MOVDDUP Argumentem rozkazu jest liczba zmiennoprzecinkowa podwójnej precyzji, która w rejestrze XMM jest powielana, tj.