MMX (Intel)

Intel

De MMX-instructies, die in 1997 door Intel zijn geïntroduceerd, zijn een uitbreiding van 57 instructies op de IA-32-instructieset.[1] Deze toevoeging is voor het eerst gebruikt in de Pentium MMX processor om de verwerkingssnelheid van processoren op te voeren. Later heeft AMD deze instructies toegevoegd aan de eigen processoren, voor het eerst bij de K6 processor.

De MMX-registers zoals ze in de FPU-registers gedefinieerd zijn, met horizontaal de grenzen van de verschillende registers, dus de grootte en verticaal de registernamen.

Intel zag bij de ontwikkeling van MMX in, dat bij veel bewerkingen slechts met 8 of 16 bits integer-data gewerkt wordt en dus vaak een groot gedeelte van de registers leegstond en dat veel bewerkingen erg vaak herhaald werden. Als data naast elkaar geplakt zou worden, dan zouden deze kleine databrokjes in één keer, en dus aanzienlijk sneller, verwerkt worden, zoals in een vectorprocessor. Om de nieuwe SIMD-instructies te kunnen implementeren heeft Intel 4 nieuwe datatypen ingevoerd, de packed versies van de byte, word, doubleword en quadword. Met packed wordt hier bedoeld, dat de data achter elkaar wordt geplakt tot een eenheid van 64 bits, dus maximaal 8 bytes achter elkaar, of 1 quadword. Deze gegevens konden, nadat een MMX-commando was gegeven, in een speciaal voor MMX-data aangewezen gedeelte van de FPU-registers worden geplaatst en bewerkt met de nieuwe instructies.

Het grote voordeel van deze aanpak was dat er bijvoorbeeld bij het bewerken van 8 bytes met dezelfde instructie niet acht keer een instructie uitgevoerd hoeft te worden, maar dat de instructie in één keer op alle acht bytes tegelijk uitgevoerd kan worden. Hierdoor wordt in theorie een instructie acht keer zo snel uitgevoerd. De feitelijke snelheidswinst was echter sterk afhankelijk van een aantal factoren. Ten eerste van het formaat van de te bewerken variabelen: een grotere variabele betekent ten slotte, dat er minder tegelijk bewerkt kunnen worden. Als tweede was het aantal wisselingen tussen het bewerken van MMX-integer data en floating point-data van belang. Iedere keer als tussen de twee bewerkingen gewisseld werd, moest namelijk het hele register geleegd worden, gewacht worden op data uit het geheugen en kon pas daarna het register weer gevuld worden, waarbij een behoorlijk aantal CPU-cycles verloren ging.