jueves, 8 de enero de 2009

Programando con la tecnología MMX de Intel

Las arquitecturas IA-32 y Intel 64 no soportan la emulación de instrucciones MMX, pero si las instrucciones x87 FPU. La bandera EM en el registro de control CR0 no puede ser usada para la emulación de instrucciones MMX. Si una instrucción MMX se ejecuta cuando está activada la bandera EM, se produce una excepción de opcode inválido.
El estado del MMX consiste en registros de 64 bits (desde MM0 hasta MM7). Estos son alias de los 64 bits más bajos de los registros en punto flotante R0 a R7. Los registros MMX están mapeados a las localizaciones físicas de los registros en punto flotante (R0 a R7), no a las relativas localizaciones de los registros en la pila de registros en punto flotante (ST0 a ST7). Como resultado, el mapeo de registros MMX es fijo y no le afecta el valor en el campo de la Top of Stack (TOS) en la palabra de estado de punto flotante (bits de 11 al 13). Cuando se escribe un valor en un registro MMX usando una instrucción MMX, el valor aparece en el registro de punto flotante correspondiente en los bits de 0 a 63. Asimismo, cuando un valor en punto flotante se escribe en un registro en punto flotante por la FPU x87, los 64 bits mas bajos del valor aparecen en el registro MMX correspondiente. La ejecución de este tipo de instrucciones tienen varios efectos en el estado de la FPU x87 contenido en los registros en punto flotante, en la palabra de la etiqueta de la FPU x87, y en la palabra de estado de la FPU x87. Los efectos son estos:
- Cuando una instrucción MMX escribe un valor en un registro MMX, al mismo tiempo, los bits 64 a 79 del registro correspondiente en punto flotante, se ponen a 1.
- Cuando una instrucción MMX se ejecuta, cada campo de etiquetas en la palabra de etiquetas de la FPU x87 se pone a 00B (válido).
- Cuando se ejecuta la instrucción EMMS, cada campo de etiquetas en la palabra de etiquetas de la FPU x87 se pone a 11B (vacío).
- Cada vez que se ejecuta una instrucción MMX, el valor de la TOS se pone a 000B.
Como los registros MMX están 'aliased' a los registros de datos de la FPU x87, el estado MMX se puede guardar en la memoria y se puede recuperar de estas formas:
- Ejecutando una instrucción FSAVE, FNSAVE, o FXSAVE para guardar el estado MMX en memoria.
- Ejecutando una instrucción FRSTOR o FXRSTOR para recuperar el estado MMX desde la memoria.
Estos métodos son requeridos por los sistemas operativos; las aplicaciones, en algunos casos, pueden guardar y recuperar solo los registros MMX de estas 2 formas:
- Ejecutando 8 instrucciones MOVQ para guardar el contenido del MMX0 al MMX7 a memoria. Una instrucción EMMS se puede ejecutar para borrar el estado MMX de la FPU x87.
- Ejecutando 8 instrucciones MOVQ para leer el contenido guardado de los registros MMX desde memoria en los registros MMX0 a MMX7.
Cuando se cambia desde una tarea a otra, a veces es necesario guardar el estado del MMX. Como regla general, si el código de cambio de tarea en un sistema operativo incluye facilidades para guardar el estado de la FPU x87, estas facilidades pueden depender sobre guardar el estado MMX, sin reescribir el código de cambio de tarea. Esta dependencia es posible porque el estado MMX es 'aliased' al estado de la FPU x87.
Existen facilidades de depuración que operan de la misma manera cuando se ejecutan instrucciones MMX que cuando se ejecutan otras instrucciones de la IA-32 o de la Intel 64. Para interpretar bien el contenido de los registros MMX o FPU x87 desde la imagen FSAVE/FNSAVE o FXSAVE en memoria, un depurador necesita estar informado de las relaciones entre los registros de la FPU x87 de las localizaciones lógicas relativas a la TOS y a las localizaciones físicas de registros MMX.

No hay comentarios: