FXSAVE
保存 x87 FPU, MMX 技术,和 SSE 状态
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
NP 0F AE /0 | FXSAVE m512byte | M | 有效 | 有效 | 将x87 FPU,MMX,XMM,MXCSR的注册状态保存为m512字节. |
NP REX.W + 0F AE /0 | FXSAVE64 m512byte | M | 有效 | 不可编码 | 将x87 FPU,MMX,XMM,MXCSR的注册状态保存为m512字节. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
M
modrm.rmescrituraModRM 字节的 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布局
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 斯维德 | FCS | FIP[31:0] | FOP | 斯维德 | FTW | FSW | FCW 0 |
FXSAVE和FXRSTOR记忆区的非64-Bit-Mode布局(康特)
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 斯维德 | FCS | FIP[31:0] | FOP | 斯维德 | FTW | FSW | FCW 0 |
创建 FSAVE 格式
| 指标 | 指标 | 分数 | J级和M级 | FTW | 无效 | 位数 |
|---|---|---|---|---|---|---|
| 全部1号 | 所有0号 | 所有0号 | 位数 | x87 FTW | ||
| 0 | 0 | 0 | 0x | 1 | 特别 10 | |
| 0 | 0 | 0 | 1x | 1 | 有效期 00 | |
| 0 | 0 | 1 | 00 | 1 | 特别 10 | |
| 0 | 0 | 1 | 10 | 1 | 有效期 00 | |
| 0 | 1 | 0 | 0x | 1 | 特别 10 | |
| 0 | 1 | 0 | 1x | 1 | 特别 10 | |
| 0 | 1 | 1 | 00 | 1 | 零点01 | |
| 0 | 1 | 1 | 10 | 1 | 特别 10 | |
| 1 | 0 | 0 | 1x | 1 | 特别 10 | |
| 1 | 0 | 0 | 1x | 1 | 特别 10 | |
| 1 | 0 | 1 | 00 | 1 | 特别 10 | |
| 1 | 0 | 1 | 10 | 1 | 特别 10 |
64比特模式FXSAVE64地图的拉尤特(要求REX.W=1)
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| FIP | FOP | 备抵 | W | FSW | FCW | 0 |
64比特模式FXSAVE地图的拉尤特(REX.W=0)
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 启动 | 风向 | FCS | FIP[31: | 0] | FOP | 准备金 | FTW | FSW | FCW | 0 | |||||
| MXCSR_ | MASK | MXCSR | 准备金 | FDS | FDP[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用于不同的处理器执行。 |