web-dev-qa-db-fra.com

différence entre le registre MMX et XMM?

J'apprends actuellement la programmation d'assemblage sur un processeur Intel x86.

Quelqu'un pourrait-il m'expliquer, quelle est la différence entre le registre MMX et XMM? Je suis très confus en ce qui concerne les fonctions qu'ils remplissent et la différence et les similitudes entre eux?

14
Thor

Les registres MM sont les registres utilisés par le jeu d'instructions MMX, l'une des premières tentatives pour ajouter (entier uniquement) SIMD à x86. Ils ont une largeur de 64 bits et sont en fait des alias pour les parties mantisse des registres x87 (mais ils ne sont pas affectés par le FPU en haut de la position de la pile); cela a été fait pour garder la compatibilité avec les systèmes d'exploitation existants (qui ont déjà enregistré la pile FPU sur le changement de contexte), mais a rendu l'utilisation de MMX avec virgule flottante un travail non trivial.

De nos jours, ce n'est qu'une bizarrerie historique, je ne pense pas que quiconque utilise réellement MMX, car il a été complètement remplacé par les différentes extensions SSE. Edit : comme le souligne Peter Cordes dans les commentaires, il y a encore pas mal de code MMX.


Les registres XMM, au lieu de cela, sont un ensemble de registres complètement séparé, introduit avec SSE et encore largement utilisé à ce jour. Ils sont de 128 bits de large, avec des instructions qui peuvent les traiter comme des tableaux de 64, 32 (entier et virgule flottante), valeurs 16 ou 8 bits (entier uniquement). Vous en avez 8 en mode 32 bits, 16 en 64 bits. Pratiquement tous les calculs en virgule flottante sont effectués en SSE (et donc les registres XMM) en mode 64 bits, donc, contrairement aux registres MMX, ils sont toujours assez pertinents.

De nos jours, vous pouvez également rencontrer les registres YMM et ZMM; ils ont été introduits respectivement avec les jeux d'instructions AVX (2011) et AVX-512 (2015), et ils développent les registres XMM, un peu comme les extensions e et r des registres à usage général (rax étendu eax qui a étendu ax accessible par ah: al).

Dans un processeur compatible AVX, chaque registre du fichier de registre XMM est étendu à 256 bits. L'ensemble du registre 256 bits est appelé YMMx (x de 0 à 15) et peut être utilisé par les nouvelles instructions AVX, la moitié inférieure est XMMx et peut toujours être utilisée par les anciens SSE instructions.

De même, AVX-512 étend les registres ci-dessus à 512 bits; l'ensemble du registre est ZMMx (utilisable avec les instructions AVX-512), le 256 bits inférieur est YMMx (également utilisable avec les instructions AVX), les 128 bits inférieurs sont toujours XMMx (utilisable également avec SSE). En outre, le nombre de registres est augmenté à 32, de sorte que ces registres sont à la fois plus gros et deux fois plus nombreux.

23
Matteo Italia