FXSAVE

保存 x87 FPU, MMX 技术,和 SSE 状态

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
NP 0F AE /0FXSAVE m512byteM有效有效将x87 FPU,MMX,XMM,MXCSR的注册状态保存为m512字节.
NP REX.W + 0F AE /0FXSAVE64 m512byteM有效不可编码将x87 FPU,MMX,XMM,MXCSR的注册状态保存为m512字节.

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

M

  1. modrm.rm escrituraModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

实测开销

正在从 arch-data 加载实测数据...

说明

将x87 FPU,MMX技术,XMM,和MXCSR注册的当前状态保存到目标操作数指定的512字节内存位置. 512字节区域的内容布局取决于处理器是以非64位操作模式运行,还是以IA-32e模式的64位子模式运行.

字节464:511可供软件使用. 处理器不写入FXSAVE区域的字节464:511.

首先描述了FXSAVE在非64位模式中的操作.

非64- Bit 模式操作

表3-45显示处理器以遗留模式运行时内存中的状态信息布局.

FXSAVE和FXRSTOR记忆区的非64-Bit-Mode布局

1514131211109876543210
斯维德FCSFIP[31:0]FOP斯维德FTWFSWFCW 0

FXSAVE和FXRSTOR记忆区的非64-Bit-Mode布局(康特)

1514131211109876543210
斯维德FCSFIP[31:0]FOP斯维德FTWFSWFCW 0

创建 FSAVE 格式

指标指标分数J级和M级FTW无效位数
全部1号所有0号所有0号位数x87 FTW
0000x1特别 10
0001x1有效期 00
001001特别 10
001101有效期 00
0100x1特别 10
0101x1特别 10
011001零点01
011101特别 10
1001x1特别 10
1001x1特别 10
101001特别 10
101101特别 10

64比特模式FXSAVE64地图的拉尤特(要求REX.W=1)

1514131211109876543210
FIPFOP备抵WFSWFCW0

64比特模式FXSAVE地图的拉尤特(REX.W=0)

1514131211109876543210
启动风向FCSFIP[31:0]FOP准备金FTWFSWFCW0
MXCSR_MASKMXCSR准备金FDSFDP[31:0]16

行动

IF 64-Bit Mode
    THEN
          IF REX.W = 1
                THEN
                      DEST := Save64BitPromotedFxsave(x87 FPU, MMX, XMM15-XMM0,
                      MXCSR);
                ELSE
                      DEST := Save64BitDefaultFxsave(x87 FPU, MMX, XMM15-XMM0, MXCSR);
          FI;
    ELSE
          DEST := SaveLegacyFxsave(x87 FPU, MMX, XMM7-XMM0, MXCSR);

FI;

异常

保护模式
#GP(0)对于CS,DS,ES,FS或GS片断中非法的内存操作数有效地址,如果一个内存操作数没有在16字节边界上对齐,无论片断是什么(见下文对齐检查例外[#AC]的描述).
#SS(0)用于在党卫军部分的一个非法地址. #PF(fault-code) for a 页面错误.
#NM如果 CR0.TS[bit 3] = 1. 如果 CR0.EM[bit 2] = 1.
#UD如果 CPUID.01H:EDX.FXSR[24]=0.
#UD如果使用 LOCK 前缀 。
#AC如果该例外被禁用, 如上文所述, 内存操作数 不在16字节边界上对齐, 则会发出一般保护例外( #GP) 信号。 例如, 如果启用对齐检查例外( #AC) (和 CPL 是 3) , 则无法保证对 #AC 的信号, 并可能随执行而变化, 如下所示。 在未对 #AC 发出信号的所有执行中, 都会发出一般保护例外。 此外, 对齐检查的宽度也会随执行而变化。 例如, 对特定执行来说, 对2字节的错位可能发出对齐检查例外信号, 而对于所有其他错位( 4- 8- 或 16字节错位) 则可能发出一般保护例外信号 。
实地址模式
#GP如果 内存操作数 不在16字节边界上对齐, 不论片段。 如果 操作数 的任何部分位于 0 到 FFFFH 的有效地址空间之外 。
#NM如果 CR0.TS[bit 3] = 1. 如果 CR0.EM[bit 2] = 1.
#UD如果 CPUID.01H: EDX.FXSR[24] = 0. 如果使用 LOCK 前缀.
虚拟 8086 模式
与真实地址模式相同的例外 。
#AC为了不匹配的记忆参考.
#UD如果使用 LOCK 前缀 。
兼容模式
与保护模式中的例外相同.
64 位模式
#SS(0)如果引用SS部分的内存地址是非冠状的.
#GP(0)如果内存地址是非冠状的。 如果 内存操作数 不在16字节边界上对齐, 不论片段。 #PF(fault-code) for a 页面错误 。
#NM如果 CR0.TS[bit 3] = 1. 如果 CR0.EM[bit 2] = 1.
#UD如果 CPUID.01H: EDX.FXSR[24] = 0. 如果使用 LOCK 前缀.
#AC如果该例外被禁用,则一般保护例外(#GP如果内存操作数未如上所述在16字节边界上对齐。如果对齐检查例外(#AC启用(和CPL3),表示#AC无法保证,执行方式可能有所不同,具体如下。#AC不表示信号,而是表示一般保护例外。此外,对齐检查的宽度也可能随执行的不同而异。例如,对某一执行来说,对2字节的错位可能表示调整检查例外,而对所有其他错位(4-、8-或16字节的错位)则表示一般保护例外。#GP)和页错(#PF在指令边界上出现这两种情况的例外情况,见Intel(R)64和IA-32"架构软件开发者手册",第3B卷,表5-2。FXSAVE用于不同的处理器执行。

来源