La multimedia y las comunicaciones están generando aplicaciones con exigencias cada vez mayores. La tecnología MMX es una nueva extensión a la Arquitectura que:
Mejora el rendimiento de esas aplicaciones, y
Crea y activa nuevas características/posibilidades. MMX nació en los laboratorios de Intel Corporation, la empresa estadounidense que fabrica los procesadores Intel x86, los que usan la mayoría de los PC (386, 486, Pentium, Pentium Pro, etc.). Intel sacó su primer procesador MMX en enero de 1997, y en menos de seis meses inundó el mercado con versiones cada vez más veloces de esos chips. Para mejorar la multimedia y el procesado 3-D, la nueva tecnología MMX de Intel puede empaquetar múltiples pixeles en un registro y manipularlos con una sola instrucción. En efecto, MMX aporta un nuevo nivel de paralelismo a los procesadores x86. En lugar de añadir registros físicos nuevos a la arquitectura x86 (lo que ralentizaría la adopción del MMX), Intel reutiliza la pila de coma flotante (FP) existente a modo de registros lógicos MMX. Las instrucciones MMX utilizan sólo la porción de mantisa de 64 bits de los registros FP de 80 bits, ignorando la porción de 16 bits del exponente. Esto da lugar a 8 registros lógicos de 64 bits sin que se altere de forma significativa la arquitectura x86. Las instrucciones MMX pueden empaquetar varios tipos de datos dentro de estos registros de 64 bits: bytes empaquetados (ocho por registro); palabras empaquetadas (cuatro por registro); palabras dobles empaquetadas (dos por registro) y una palabra cuádruple (un valor de 64 bits por registro). Estos tipos de datos resultan útiles debido a que, normalmente, los programas multimedia trabajan con pequeñas unidades de datos. Por ejemplo, un pixel de color en modo color real, la resolución de color más utilizada, usa 24 bits: 1 byte por cada color RGB. Este modo permite trabajar con hasta 16,7 millones de colores, mucho más de lo que es capaz de distinguir el ojo humano. En modo HiColor, sólo se necesitan 16 bits por pixel. Para la mayoría de aplicaciones gráficas, 16 bits son más que suficientes. Los nuevos procesadores x86 que soporten MMX serán capaces de direccionar los nuevos registros, desde el MM0 hasta el MM7. En lugar de tratar los registros como si fueran una pila, que es lo que hacen las instrucciones FP, las instrucciones MMX acceden directamente a los registros. Al efectuarse el cambio de instrucciones MMX a FP (y viceversa), la instrucción FSAV guarda el estado de los registros y la instrucción FRSTR restaura los valores. Esto permite que la tecnología MMX sea compatible con los sistemas operativos existentes que, frecuentemente deben de efectuar operaciones de guardar y restaurar registros cuando se produce un cambio de contexto entre aplicaciones multitarea. El inconveniente de esta técnica reside en la imposibilidad de que los programadores puedan entremezclar instrucciones PF y MMX, ya que necesitan los mismos registros. Pero esto no es tan importante como parece, ya que los programas multimedia efectúan habitualmente sus operaciones en coma flotante antes de visualizar los datos (el proceso de modelado se basa fundamentalmente en instrucciones para enteros). MMX presenta un conjunto de instrucciones para enteros, de propósito general, que utiliza el paradigma SIMD (Single Instruction/Multiple Data). Una sola instrucción procesa todos los datos de los registros empaquetados. Este paralelismo incrementa el rendimiento. Casualmente este concepto no es nuevo para Intel. Hace años, la familia i860RISC, ahora obsoleta por completo, ofrecía una tecnología parecida, denominada PAX (Pixel Addressing Extension). Otra característica del nuevo conjunto de instrucciones, las operaciones que efectúan comparaciones en paralelo, podría incrementar el rendimiento al eliminar las bifurcaciones (los procesadores modernos intentan prever las bifurcaciones, pero cualquier error de predicción significa una penalización de varios ciclos de procesador). En combinación con las características de empaquetado de datos, las operaciones de comparación en paralelo resultan útiles cuando, por ejemplo, se quieren combinar o solapar dos imágenes. Punto 1 del gráfico: Las instrucciones MMX pueden empaquetar valores de 6, 16, 32 o 64 bits dentro de registros MMX de 64 bits. Aquí 8 pixeles de 8 bits son empaquetados en un solo registro. Punto 2 del gráfico: Cuando se ejecuta una instrucción MMX, los ocho valores de píxel de cada registro MMX se procesan simultáneamente. Aquí, la instrucción compara los píxeles de los registros 1 y 2 en busca de igualdad. Punto 3 del gráfico: Resultados de las comparaciones. El paralelismo que se logra cuando una única instrucción MMX procesa múltiples valores de píxel resulta más rápido que si tuvieran que ejecutar instrucciones separadas para cada comparación. Las instrucciones MMX son parecidas al conjunto de instrucciones visuales (VIS) del UltraSparc de Sun. VIS también empaqueta registros y utiliza los registros FP. Pero ofrece muchas más cosas que MMX: 32 registros nuevos (en comparación con los ocho de Intel), descompresión acelerada de vídeo con transformaciones discretas de coseno, modos de direccionamiento más potentes, enmascarado de pixels y un conjunto de operaciones superespecializadas que incrementan mucho la sensación de movimiento al trabajar con flujos de video con compresión MPEG. MMX no es el único enfoque nuevo de Intel para acelerar la tecnología 3-D. Otra nueva versión para aceleradores 3-D es la que constituye el AGP (Advanced Graphics Port). Para distribuir equitativamente las tareas del procesador principal y las del procesador gráfico, AGP crea una nueva vía de acceso para efectuar la transferencia de datos entre la memoria principal y la memoria de almacenamiento intermedio para marcos de la tarjeta gráfica. En teoría, según Intel, al evitar el bus PCI, AGP puede permitir transferencias para lectura y escritura a velocidades de hasta 400 MBps. Instrucciones MMX: Todas las instrucciones MMX (excepto EMMS) tienen dos operandos, destino y origen, y como siempre en ese mismo orden. El operando origen podrá ser memoria o un registro MMX, mientras que el destino siempre será un registro MMX (excepto en las operaciones de movimiento, claro, porque si no, apañados íbamos). Bueno, que empiece la fiesta. Instrucciones de movimientos de datos: MOVD (MOVe Dword) Copia una palabra doble (32 bits) de origen en destino. Cualquiera de los operandos puede ser un registro MMX, memoria, o incluso un registro de propósito general de 32 bits. Sin embargo no es válido mover entre registros MMX, entre posiciones de memoria, ni entre registros de propósito general. Si el destino es un registro MMX el dato se copia a la parte baja y se extiende con ceros. Si el origen es un registro MMX se copia es la parte baja de dicho registro sobre el destino. MOVQ (MOVe Qword) Copia una palabra cuádruple (64 bits) de origen en destino. Cualquier operando puede ser memoria o un registro MMX, o incluso ambos MMX. No se admiten los dos operandos en memoria. A partir de ahora, y salvo que se diga lo contrario, todas las instrucciones admiten como operandos origen registros MMX o memoria, y como destino obligatoriamente un registro MMX. Instrucciones aritméticas: PADDB, PADDW, PADDD (Packed ADD Byte/Word/Dword) Suman los paquetes con signo (bytes, words, o dwords) de destino y origen, almacenando el resultado en destino. Si el resultado de un paquete queda fuera del rango se trunca a la parte más baja (es decir, se ignoran los bits de carry de cada suma individual) PADDSB, PADDSW (Packed ADD with Saturation Byte/Word) Suman los paquetes con signo (bytes o words) de origen y destino, almacenando el resultado en destino. Si el resultado de un paquete queda fuera del rango de representación, se limita al máximo o mínimo según corresponda: aplica saturación PADDUSB, PADDUSW (Packed ADD Unsigned with Saturation Byte/Word) Suma los paquetes sin signo de origen y destino, almacenando el resultado en destino. Aplica saturación. PSUBB, PSUBW, PSUBD (Packed SUBstract Byte/Word/Dword) Resta a los paquetes de destino (bytes, words o dwords) los de origen. PSUBSB, PSUBSW (Packed SUBstract with Saturation Byte/Word) Resta a los paquets de destino con signo (bytes o words) los de origen. Aplica saturación. PSUBUSB, PSUBUSW (Packed SUBstract Unsigned with Saturation Byte/Word) Resta a los paquets de destino con signo (bytes o words) los de origen. Aplica saturación. PMULHW, PMULLW (Packed MULtiply High/Low Word) Multiplica las cuatro palabras del operando origen con las cuatro del operando destino, resultando en cuatro dwords. La parte alta o baja respectivamente de cada dword es almacenada en los paquetes correspondientes del destino. Las operaciones se realizan sobre números con signo. PMADDWD (Packed Multiply and ADD) Multiplica las cuatro palabras del operando origen con las cuatro del operando destino, resultando en cuatro dwords. Las dos dwords superiores son sumadas entre sí y almacenadas en la parte alta del destino. Lo mismo con las dwords inferiores en la parte inferior del destino. Instrucciones de comparación: PCMPEQB, PCMPEQW, PCMPEQD (Packed CoMPare for EQual Byte/Word/Dword) PCMPGTB, PCMPGTW, PCMPGTD (Packed CoMPare for Greater Than Byte/Word/Dword) Realiza la comparación de igualdad o de "mayor que" entre las palabras de origen y de destino, almacenando en destino el resultado de dicha comparación (verdadero todo a 1, falso todo a 0). Instrucciones lógicas: PAND, PANDN, POR, PXOR (Packed AND/AND Not/OR/XOR) Realizan las operaciones lógicas correspondientes bit a bit entre operando y destino, almacenando el resultado en destino. PANDN realiza la operación NOT sobre los bits de destino, y a continuación efectúa AND entre operando y destino, almacenando el resultado en destino. PANDN de un registro consigo mismo equivale a NOT, pues A AND A = A. Instrucciones de desplazamiento: PSLLW,PSLLD (Packed Shift Left Logical Word/Dword) PSRLW,PSRLD (Packed Shift Right Logical Word/Dword) Efectúan desplazamientos lógicos hacia la izquierda o derecha (Left/Right) sobre las palabras o palabras dobles empaquetadas (Word/Dword); desplazan los bits y rellenan con ceros. PSRAW,PSRAD (Packed Shift Right Arithmetic Word/Dword) Efectúan desplazamientos aritméticos hacia la derecha sobre las palabras o palabras dobles empaquetadas (Word/Dword); equivalen a dividir entre 2 números con signo, pues en el desplazamiento rellenan con el bit más significativo. EMMS (Empty MMX State) restaura el estado de los registros para que puedan ser usados por la FPU, pues cada vez que se ejecuta una instrucción MMX se marcan todos los registros como con un resultado numérico válido, cuando para su uso por la FPU han de ser marcados como vacíos (que es exactamente lo que hace FFREE). Ejemplo: El factor de fusión es un valor de un byte entre 0 y 255, al igual que los componentes del canal. Cada canal se mezcla usando la siguiente fórmula.