Intel 253666-024US Computer Hardware User Manual


 
Vol. 2A 3-373
INSTRUCTION SET REFERENCE, A-M
FSAVE/FNSAVE—Store x87 FPU State
FSAVE/FNSAVE—Store x87 FPU State
Description
Stores the current FPU state (operating environment and register stack) at the spec-
ified destination in memory, and then re-initializes the FPU. The FSAVE instruction
checks for and handles pending unmasked floating-point exceptions before storing
the FPU state; the FNSAVE instruction does not.
The FPU operating environment consists of the FPU control word, status word, tag
word, instruction pointer, data pointer, and last opcode. Figures 8-9 through 8-12 in
the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, show
the layout in memory of the stored environment, depending on the operating mode
of the processor (protected or real) and the current operand-size attribute (16-bit or
32-bit). In virtual-8086 mode, the real mode layouts are used. The contents of the
FPU register stack are stored in the 80 bytes immediately follow the operating envi-
ronment image.
The saved image reflects the state of the FPU after all floating-point instructions
preceding the FSAVE/FNSAVE instruction in the instruction stream have been
executed.
After the FPU state has been saved, the FPU is reset to the same default values it is
set to with the FINIT/FNINIT instructions (see “FINIT/FNINIT—Initialize Floating-
Point Unit” in this chapter).
The FSAVE/FNSAVE instructions are typically used when the operating system needs
to perform a context switch, an exception handler needs to use the FPU, or an appli-
cation program needs to pass a “clean” FPU to a procedure.
The assembler issues two instructions for the FSAVE instruction (an FWAIT instruc-
tion followed by an FNSAVE instruction), and the processor executes each of these
Opcode Instruction 64-Bit
Mode
Compat/
Leg Mode
Description
9B DD /6 FSAVE m94/108byte Valid Valid Store FPU state to m94byte or
m108byte after checking for
pending unmasked floating-
point exceptions. Then re-
initialize the FPU.
DD /6 FNSAVE
*
m94/108byte Valid Valid Store FPU environment to
m94byte or m108byte without
checking for pending unmasked
floating-point exceptions. Then
re-initialize the FPU.
NOTES:
* See IA-32 Architecture Compatibility section below.