background image

Vol. 3B 22-15

ARCHITECTURE COMPATIBILITY

22.18.12 FPU Instruction Synchronization

On the 32-bit x87 FPUs, all floating-point instructions are automatically synchronized; that is, the processor auto-
matically waits until the previous floating-point instruction has completed before completing the next floating-point 
instruction. No explicit WAIT/FWAIT instructions are required to assure this synchronization. For the 8087 math 
coprocessors, explicit waits are required before each floating-point instruction to ensure synchronization. Although 
8087 programs having explicit WAIT instructions execute perfectly on the 32-bit IA-32 processors without reas-
sembly, these WAIT instructions are unnecessary.

22.19 SERIALIZING 

INSTRUCTIONS

Certain instructions have been defined to serialize instruction execution to ensure that modifications to flags, regis-
ters and memory are completed before the next instruction is executed (or in P6 family processor terminology 
“committed to machine state”). Because the P6 family processors use branch-prediction and out-of-order execu-
tion techniques to improve performance, instruction execution is not generally serialized until the results of an 
executed instruction are committed to machine state (see Chapter 2, “Intel® 64 and IA-32 Architectures,” in the 
Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1). 
As a result, at places in a program or task where it is critical to have execution completed for all previous instruc-
tions before executing the next instruction (for example, at a branch, at the end of a procedure, or in multipro-
cessor dependent code), it is useful to add a serializing instruction. See Section 8.3, “Serializing Instructions,” for 
more information on serializing instructions.

22.20  FPU AND MATH COPROCESSOR INITIALIZATION

Table 9-1 shows the states of the FPUs in the P6 family, Pentium, Intel486 processors and of the Intel 387 math 
coprocessor and Intel 287 coprocessor following a power-up, reset, or INIT, or following the execution of an 
FINIT/FNINIT instruction. The following is some additional compatibility information concerning the initialization of 
x87 FPUs and math coprocessors.

22.20.1 Intel

®

387 and Intel

®

287 Math Coprocessor Initialization

Following an Intel386 processor reset, the processor identifies its coprocessor type (Intel

®

287 or Intel

®

387 DX 

math coprocessor) by sampling its ERROR# input some time after the falling edge of RESET# signal and before 
execution of the first floating-point instruction. The Intel 287 coprocessor keeps its ERROR# output in inactive 
state after hardware reset; the Intel 387 coprocessor keeps its ERROR# output in active state after hardware 
reset. 
Upon hardware reset or execution of the FINIT/FNINIT instruction, the Intel 387 math coprocessor signals an error 
condition. The P6 family, Pentium, and Intel486 processors, like the Intel 287 coprocessor, do not.

22.20.2  Intel486 SX Processor and Intel 487 SX Math Coprocessor Initialization

When initializing an Intel486 SX processor and an Intel 487 SX math coprocessor, the initialization routine should 
check the presence of the math coprocessor and should set the FPU related flags (EM, MP, and NE) in control 
register CR0 accordingly (see Section 2.5, “Control Registers,” for a complete description of these flags). Table 
22-2 gives the 
recommended settings for these flags when the math coprocessor is present. The FSTCW instruction 
will give a value of FFFFH for the Intel486 SX microprocessor and 037FH for the Intel 487 SX math coprocessor.