FXRSTOR

恢复x87 FPU,MMX,XMM,以及MXCSR状态

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
NP 0F AE /1FXRSTOR m512byteM有效有效从m512字节恢复x87 FPU,MMX,XMM,以及MXCSR的注册状态.
NP REX.W + 0F AE /1FXRSTOR64 m512byteM有效不可编码从m512字节恢复x87 FPU,MMX,XMM,以及MXCSR的注册状态.

操作数编码

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

M

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

实测开销

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

说明

重新装入FPU,MMX技术,XMM,以及MXCSR从源操作数指定的512字节内存图像中注册. 此数据本应是之前使用 FXSAVE 指令,并以与操作模式相同的格式写入存储器. 数据的第一个字节应位于16字节边界上. FXSAVE状态图有三种不同的布局:一种用于遗产和兼容模式,另一种用于64位模式FXSAVE/FXRSTOR与REX.W=0,第三种格式用于64位模式,FXSAVE64/FXRSTOR64. 表3-45显示了内存中遗留/兼容模式状态信息的布局,并描述了FXRSTOR和FXSAVE指令的内存图像中的字段. 表3-48显示了REX.W(FXSAVE64/FXRSTOR64)设定时64位模式状态信息的布局. 表3-49显示了REX.W清晰(FXSAVE/FXRSTOR)时64位模式状态信息的布局.

带有 FXRSTOR 指令的状态图像必须使用 FXSAVE 指令保存,或采用表3-45、表3-48或表3-49所要求的格式。 引用用 FSAVE 、 FNSAVE 指令或不兼容的字段布局保存的状态图像将导致状态恢复不正确。

FXRSTOR指令不冲出待处理的x87 FPU例外. 要检查和提升使用FXRSTOR指令加载x87 FPU状态信息时的例外,在FXRSTOR指令后使用FWAIT指令.

如果控制寄存器中的OSFXSR比特没有设置CR4,则FXRSTOR指令可能无法恢复XMM和MXCSR的寄存器状态. 这种行为取决于执行。

如果 MXCSR 状态包含一个未显示的例外,同时设置了相应的状态旗,那么用 FXRSTOR 指令加载寄存器将不会生成 SIMD 浮点 错误条件. 只有下一次出现这种无假冒的例外,才会产生例外.

MXCSR寄存器的位数16至32被定义为保留,应设定为0. 试图从保存的状态图像中在这些比特中任意写一个1,将导致生成一般的保护例外(#GP).

FXSAVE图像的字节464:511可供软件使用. FXRSTOR忽略了FXSAVE状态图像中字节464:511的内容.

行动

IF 64-Bit Mode

    THEN
         (x87 FPU, MMX, XMM15-XMM0, MXCSR) Load(SRC);

    ELSE
          (x87 FPU, MMX, XMM7-XMM0, MXCSR) := Load(SRC);

FI;

x87 FPU and SIMD Floating-Point Exceptions
None.

异常

保护模式
#GP(0)对于CS,DS,ES,FS或GS片断中非法的内存操作数有效地址,如果一个内存操作数没有在16字节的边界上对齐,无论片断是什么(见下文对齐检查例外[#AC]). )对于试图在MXCSR中设置保留位.
#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. 如果指令前加一个 LOCK 前缀.
#AC如果该例外被禁用, 如上文所述, 内存操作数 不在16字节边界上对齐, 则会发出一般保护例外( #GP) 信号。 例如, 如果启用对齐检查例外( #AC) (和 CPL 是 3) , 则无法保证对 #AC 的信号, 并可能随执行而变化, 如下所示。 在未对 #AC 发出信号的所有执行中, 都会发出一般保护例外。 此外, 对齐检查的宽度也会随执行而变化。 例如, 对特定执行来说, 对2字节的错位可能发出对齐检查例外信号, 而对于所有其他错位( 4- 8- 或 16字节错位) 则可能发出一般保护例外信号 。
#UD如果使用 LOCK 前缀 。
实地址模式
#GP如果 内存操作数 不在 16 字节边界上对齐, 不论片段。 如果 操作数 的任何部分位于 0 到 FFFFH 的有效地址空间之外, 则要尝试在 MXCSR 中设置保留位 。
#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 字节边界上对齐, 不论片段。 对于试图在 MXCSR. #PF(fault-code) 为 页面错误 设置保留位数的尝试, 则不在此限 。
#NM如果 CR0.TS[bit 3] = 1. 如果 CR0.EM[bit 2] = 1.
#UD如果 CPUID.01H: EDX.FXSR[24] = 0. 如果指令前加一个 LOCK 前缀.
#AC如果该例外被禁用, 如上文所述, 内存操作数 不在16字节边界上对齐, 则会发出一般保护例外( #GP) 信号。 例如, 如果启用对齐检查例外( #AC) (和 CPL 是 3) , 则无法保证对 #AC 的信号, 并可能随执行而变化, 如下所示。 在未对 #AC 发出信号的所有执行中, 都会发出一般保护例外。 此外, 对齐检查的宽度也会随执行而变化。 例如, 对特定执行来说, 对2字节的错位可能发出对齐检查例外信号, 而对于所有其他错位( 4- 8- 或 16字节错位) 则可能发出一般保护例外信号 。

来源