MMX – Wprowadzenie
MMX (MultiMedia eXtensions) to zestaw 57 instrukcji SIMD (Single Instruction, Multiple Data), wprowadzony przez firmę Intel w 1996 roku dla procesorów Pentium. Rozkazy MMX realizują operacje logiczne i arytmetyczne na liczbach całkowitych, a ich zastosowanie znacząco przyspiesza przetwarzanie danych w specjalnych aplikacjach, takich jak obróbka dźwięku i obrazu.
Rejestry MMX
MMX wykorzystuje osiem 64-bitowych rejestrów, które są zamapowane na bity rejestrów koprocesora arytmetycznego. Odwołania do rejestrów MMX wpływają na zawartość rejestrów koprocesora, co uniemożliwia jednoczesne obliczenia MMX i zmiennoprzecinkowe. Mimo to, programy działające na wcześniejszych architekturach są kompatybilne z MMX.
Typy danych
MMX wprowadza nowe typy danych, znane jako „spakowane” (ang. packed), które można interpretować jako wektory lub macierze. Danych 64-bitowych można używać w następujący sposób:
- 8 × 8 bitów (packed byte)
- 4 × 16 bitów (packed word)
- 2 × 32 bity (packed dword)
- 1 × 64 bity (quad word)
Operacje na tych typach danych wykonywane są równolegle, co znacznie przyspiesza obliczenia.
Operacje arytmetyczne i logiczne
MMX obsługuje dwa rodzaje arytmetyki:
- Arytmetyka nasyceniowa: wyniki przekraczające zakres są ograniczane do wartości skrajnych.
- Arytmetyka modulo: przekroczenia zakresu są ignorowane, a zapisywane są tylko najmłodsze bity.
Porównania w MMX nie ustawiają flag ALU, a wynik porównania jest nowym wektorem z odpowiednimi wartościami.
Przykłady zastosowań
MMX znajduje zastosowanie w:
- Wyświetlaniu grafiki 3D (przekształcenia, cieniowanie)
- Dekodowaniu obrazów JPEG i PNG
- Kodowaniu filmów MPEG
- Filtrowaniu sygnałów dźwiękowych i obrazowych
Rozkazy MMX
Rozkazy MMX dzielą się na kilka kategorii:
- Transferowe: (
MOVD
,MOVQ
) - Arytmetyczne: dodawanie, odejmowanie, mnożenie oraz ich warianty z nasyceniem.
- Porównania: różne typy porównań między wektorami.
- Operacje logiczne: suma, iloczyn, różnica symetryczna.
- Specjalne: przygotowanie do działań zmiennoprzecinkowych (
EMMS
).
Asembler
W asemblerze rejestry MMX oznaczone są jako MM0 do MM7, a mnemoniki rozkazów zaczynają się zazwyczaj od litery P (od „packed”). Na przykład, PADDUSB
oznacza równoległe dodawanie bajtów bez znaku z nasyceniem.