3 saving and restoring the mmx state and registers – Intel IA-32 User Manual

Page 492

Advertising
background image

11-4 Vol. 3A

INTEL® MMX™ TECHNOLOGY SYSTEM PROGRAMMING

11.3

SAVING AND RESTORING THE MMX STATE AND
REGISTERS

Because the MMX registers are aliased to the x87 FPU data registers, the MMX state can be
saved to memory and restored from memory as follows:

Execute an FSAVE, FNSAVE, or FXSAVE instruction to save the MMX state to memory.
(The FXSAVE instruction also saves the state of the XMM and MXCSR registers.)

Execute an FRSTOR or FXRSTOR instruction to restore the MMX state from memory.
(The FXRSTOR instruction also restores the state of the XMM and MXCSR registers.)

The save and restore methods described above are required for operating systems (see Section
11.4, “Saving MMX State on Task or Context Switches”). Applications
can in some cases save
and restore only the MMX registers in the following way:

Execute eight MOVQ instructions to save the contents of the MMX0 through MMX7
registers to memory. An EMMS instruction may then (optionally) be executed to clear the
MMX state in the x87 FPU.

Execute eight MOVQ instructions to read the saved contents of MMX registers from
memory into the MMX0 through MMX7 registers.

Table 11-3. Effect of the MMX

,

x87 FPU, and FXSAVE/FXRSTOR Instructions on the

x87 FPU Tag Word

Instruction
Type

Instruction

x87 FPU Tag Word

Image of x87 FPU Tag Word
Stored in Memory

MMX

All (except EMMS)

All tags are set to 00B (valid).

Not affected.

MMX

EMMS

All tags are set to 11B (empty).

Not affected.

x87 FPU

All (except FSAVE,
FSTENV, FRSTOR,
FLDENV)

Tag for modified floating-point
register is set to 00B or 11B.

Not affected.

x87 FPU and
FXSAVE

FSAVE, FSTENV,
FXSAVE

Tags and register values are
read and interpreted; then all
tags are set to 11B.

Tags are set according to the
actual values in the floating-
point registers; that is, empty
registers are marked 11B and
valid registers are marked 00B
(nonzero), 01B (zero), or 10B
(special).

x87 FPU and
FXRSTOR

FRSTOR, FLDENV,
FXRSTOR

All tags marked 11B in memory
are set to 11B; all other tags are
set according to the value in the
corresponding floating-point
register: 00B (nonzero), 01B
(zero), or 10B (special).

Tags are read and interpreted,
but not modified.

Advertising