Asembler x86/Instrukcje/SSSE3/PSHUFB

Z Wikibooks, biblioteki wolnych podręczników.

PSHUFB rozmieszcza elementy w wektorze bajtów zgodnie ze wzorcem zapisanym w wektorze źródłowym.

Każdy bajt wzorca określa, jaka wartość zostanie zapisana na odpowiadającej mu pozycji w wynikowym wektorze:

  • jeśli najstarszy bit jest ustawiony, to zapisywany jest bajt o wartości zero;
  • w przeciwnym razie cztery lub trzy najmłodsze bity (zależnie, czy rozkaz działa na rejestrach XMM czy MMX) określają indeks bajta w wektorze docelowym, który zostanie przepisany do wyniku.

Rozkaz PSHUFB xmm1, xmm2 (128-bitowe argumenty) wykonuje:

 for i:=0 to 15 do
  begin
   if xmm2[i] AND 10000000b <> 0 then { ustawiony najstarszy bit }
     temp[i] := 0;
   else do;
     index = xmm2[i] AND 00001111b;   { albo indeks }
     temp[i] := xmm1[index];
   end;
  end;
 xmm1 := temp;

Np. dla danych

        0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
xmm2 = |0 |1 |2 |1 |3 |4 |5 |1 |6 |7 |0 |1 |2 |1 |7 |8 | (bajty jako liczby)
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
       
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
xmm1 = |W |i |k |p |e |d |a |- |. |  |  |  |  |  |  |  | (bajty jako znaki ASCII)
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
       

wynikiem działania PSHUFB xmm1, xmm2 będzie:

        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 |i |k |i |- |. |  
       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+