FXRSTOR
恢复x87 FPU,MMX,XMM,以及MXCSR状态
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
NP 0F AE /1 | FXRSTOR m512byte | M | 有效 | 有效 | 从m512字节恢复x87 FPU,MMX,XMM,以及MXCSR的注册状态. |
NP REX.W + 0F AE /1 | FXRSTOR64 m512byte | M | 有效 | 不可编码 | 从m512字节恢复x87 FPU,MMX,XMM,以及MXCSR的注册状态. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
M
modrm.rmlecturaModRM 字节的 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字节错位) 则可能发出一般保护例外信号 。 |