Avec le CPU ou le FPU, les différents problèmes qui pouvaient se produire lors d'un calcul (débordement, division par 0, etc.) étaient indiqués par des drapeaux ou par des exceptions. Dans le cas des instructions MMX, soit la retenue est ignorée (on obtient le modulo du résultat), soit les valeurs sont saturées : lorsqu'à la suite d'une opération, le résultat est supérieur à la borne maximale, il sera rendu égal à la borne maximale. Si le résultat est inférieur à la borne minimale, il sera rendu égal à la borne minimale. Cette manière de traiter les débordements est particulièrement bien adaptée aux algorithmes traitant de l'image, du son ou de la vidéo.
Les mnémoniques utilisés sont très proches de ceux utilisés pour les opérations d'arithmétique entière classique.
-
Pour les copies de données, on utilisera les instructions movd (32 bits) et movq (64 bits).
-
Pour additionner de 8 octets à 8 autres octets en parallèle sans saturation on écrira paddb <source>, <destination> . La destination doit être un registre MMX, la source est soit un registre MMX, soit un emplacement.
-
Pour additionner en parallèle 4 nombres de 16 bits à 4 autres nombres de 16 bits, on écrira paddw .
-
Enfin, une addition de 2x2 nombres de 32 bits en parallèles s'écrira paddd . L'addition avec saturation d'entiers signés s'écrira padds (avec « b » ou « w » en suffixe) et l'addition avec saturation d'entiers non signés s'écrira paddus (avec « b » ou « w » en suffixe).
-
Les mnémoniques correspondantes pour la soustraction sont psubb, psubw, psubd, psubsb, psubsw, psubusb et psubusw .
-
pmull réalise la multiplication en parallèle des 4 entiers signés de 16 bits de la source aux 4 entiers signés de 16 bits de la destination et stocke la partie basse (16 bits) du résultats dans la destination. pmulh réalise le même calcul mais stocke la partie haute du résultat. pmullw et pmulhw réalisent les mêmes opérations avec 2x2 entiers signés de 32 bits.
Le jeu d'instructions MMX contient également des opérations de comparaison, de conversion, d'opérations logiques et de décalage, mais nous avons vu les concepts principaux.
Supposons qu'à l'adresse photo, nous ayons une image de 256x256 pixels en 256 niveaux de gris (0-> noir, 255 -> blanc). Voici un petit programme parallèle, 8 fois plus rapide que son équivalent séquentiel, qui augmente d'un cran la luminosité de l'image :