AVX: rozkazy trójargumentowe

Autor: Wojciech Muła
Dodany:29.04.2008

W tej chwili zdecydowana większość rozkazów nadpisuje jeden z argumentów: Ra := Ra op Rb. AMD w swoim SSE5, zaś Intel w AVX zapowiadają wprowadzenie rozkazów trójargumentowych, tj. takich, które pozwalają podać dowolny rejestr docelowy, czyli Rc := Ra op Rb. To rozwiązanie, zapożyczone z RISC, ukrywa jedno przypisanie, które (jak można przypuszczać) na poziomie sprzętowym jest za darmo. Przy okazji zmniejsza się rozmiar kodu.

Przykład — konwersja obrazów ze skali szarości do ARGB 8:8:8:8

Obecnie:

movdqa  (%eax), %xmm0   ; wczytanie pikseli 0..15
movdqa   %xmm0, %xmm1
movdqa   %xmm0, %xmm2
movdqa   %xmm0, %xmm3

pshufb   P03,   %xmm0   ; konwersja pikseli 0..3 na ARGB (A=0)
                        ; P03 = {0, 0, 0, 0x80, 1, 1, 1, 0x80, 2, 2, 2, 0x80, 3, 3, 3 0x80}
pshufb   P47,   %xmm1   ; konwersja pikseli 4..7
pshufb   P8b,   %xmm2   ; konwersja pikseli 8..11
pshufb   Pcf,   %xmm3   ; konwersja pikseli 12..15

movdqa  %xmm0,  0(%ebx)
movdqa  %xmm1, 16(%ebx)
movdqa  %xmm2, 32(%ebx)
movdqa  %xmm3, 48(%ebx)

Z rozkazami trójargumentowymi (AVX):

movdqa  (%eax), %xmm0           ; wczytanie pikseli 0..15

vpshufb  P47,   %xmm0, %xmm1    ; konwersja pikseli 4..7
vpshufb  P8b,   %xmm0, %xmm2    ; konwersja pikseli 8..11
vpshufb  Pcf,   %xmm0, %xmm3    ; konwersja pikseli 12..15
pshufb   P03,   %xmm0           ; konwersja pikseli 0..3 na ARGB (A=0)
                                ; P03 = {0, 0, 0, 0x80, 1, 1, 1, 0x80, 2, 2, 2, 0x80, 3, 3, 3 0x80}

movdqa  %xmm0,  0(%ebx)
movdqa  %xmm1, 16(%ebx)
movdqa  %xmm2, 32(%ebx)
movdqa  %xmm3, 48(%ebx)