Przejdź do zawartości

Asembler x86/Instrukcje/SSSE3/PALIGNR

Z Wikibooks, biblioteki wolnych podręczników.

PALIGNR łączy dwa 16-bajtowe wektory w jeden, 32-bajtowy, po czy wybiera z niego pewien zakres 16 bajtów i zapisuje w wektorze docelowym. Początek zakresu jest wskazywany przez trzeci argument rozkazu, 8-bitową stałą natychmiastową imm8.

Rozkazowi PALIGNR xmm1, xmm2, imm8 (128-bitowe argumenty, tj. 16-elementowe wektory) odpowiada

 { połączenie wektorów }
 { temp - wektor 32-elementowy }
 for i := 0 to 15 do begin
   temp[i]    := xmm1[i];
   temp[i+16] := xmm2[i];
 end;

 { wybranie fragmentu }
 for i := 0 to 15 do
   xmm1[i] := temp[i + imm8];

Np.

        0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
xmm1 = |W |i |k |i |p |e |d |i |a |, |  |W |o |l |n |a |  
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
       
        16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
xmm2 = |  |E |n |c |y |k |l |o |p |e |d |i |a |  |  |  |
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

Wynik działania PALIGNR xmm1, xmm2, 11:

        0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
xmm1 = |W |o |l |n |a |  |E |n |c |y |k |l |o |p |e |d |  
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+