background image

Vol. 1 13-9

MANAGING STATE USING THE XSAVE FEATURE SET

13.5.1 x87 

State

Instructions in the XSAVE feature set can manage the same state of the x87 FPU execution environment (x87 
state
) that can be managed using the FXSAVE and FXRSTOR instructions. They organize all x87 state as a user 
state component in the legacy region of the XSAVE area (see Section 13.4.1). This region is illustrated in 
Table 13-1; the x87 state is listed below, along with details of its interactions with the XSAVE feature set:

Bytes 1:0, 3:2, 7:6. These are used for the x87 FPU Control Word (FCW), the x87 FPU Status Word (FSW), and 
the x87 FPU Opcode (FOP), respectively.

Byte 4 is used for an abridged version of the x87 FPU Tag Word (FTW). The following items describe its usage:
— For  each  j, 0 ≤ ≤ 7, XSAVE, XSAVEOPT, XSAVEC, and XSAVES save a 0 into bit j of byte 4 if x87 FPU data 

register STj has a empty tag; otherwise, XSAVE, XSAVEOPT, XSAVEC, and XSAVES save a 1 into bit j of 
byte 4.

— For  each  j, 0 ≤ ≤ 7, XRSTOR and XRSTORS establish the tag value for x87 FPU data register STj as follows. 

If bit j of byte 4 is 0, the tag for STj in the tag register for that data register is marked empty (11B); 
otherwise, the x87 FPU sets the tag for STj based on the value being loaded into that register (see below).

Bytes 15:8 are used as follows:
— If the instruction has no REX prefix, or if REX.W = 0:

Bytes 11:8 are used for bits 31:0 of the x87 FPU Instruction Pointer Offset (FIP).

If CPUID.(EAX=07H,ECX=0H):EBX[bit 13] = 0, bytes 13:12 are used for x87 FPU Instruction Pointer 
Selector (FCS). Otherwise, XSAVE, XSAVEOPT, XSAVEC, and XSAVES save these bytes as 0000H, and 
XRSTOR and XRSTORS ignore them.

Bytes 15:14 are not used.

— If the instruction has a REX prefix with REX.W = 1, bytes 15:8 are used for the full 64 bits of FIP.

Bytes 23:16 are used as follows:
— If the instruction has no REX prefix, or if REX.W = 0:

Bytes 19:16 are used for bits 31:0 of the x87 FPU Data Pointer Offset (FDP).

If CPUID.(EAX=07H,ECX=0H):EBX[bit 13] = 0, bytes 21:20 are used for x87 FPU Data Pointer Selector 
(FDS). Otherwise, XSAVE, XSAVEOPT, XSAVEC, and XSAVES save these bytes as 0000H; and XRSTOR 
and XRSTORS ignore them.

Bytes 23:22 are not used.

— If the instruction has a REX prefix with REX.W = 1, bytes 23:16 are used for the full 64 bits of FDP.

Bytes 31:24 are used for SSE state (see Section 13.5.2).

Bytes 159:32 are used for the registers ST0–ST7 (MM0–MM7). Each of the 8 register is allocated a 128-bit 
region, with the low 80 bits used for the register and the upper 48 bits unused.

x87 state is XSAVE-managed but the x87 FPU feature is not XSAVE-enabled. The XSAVE feature set can operate on 
x87 state only if the feature set is enabled (CR4.OSXSAVE = 1).

1

 Software can otherwise use x87 state even if the 

XSAVE feature set is not enabled.

13.5.2 SSE 

State

Instructions in the XSAVE feature set can manage the registers used by the streaming SIMD extensions (SSE 
state
) just as the FXSAVE and FXRSTOR instructions do. They organize all SSE state as a user state component in 
the legacy region of the XSAVE area (see Section 13.4.1). This region is illustrated in Table 13-1; the SSE state is 
listed below, along with details of its interactions with the XSAVE feature set:

Bytes 23:0 are used for x87 state (see Section 13.5.1).

Bytes 27:24 are used for the MXCSR register. XRSTOR and XRSTORS generate general-protection faults (#GP) 
in response to attempts to set any of the reserved bits of the MXCSR register.

2

1. The processor ensures that XCR0[0] is always 1.