FST, FSTP
存储 浮点 值
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
D9 /2 | FST m32fp | 有效 | 有效 | 复制 ST( 0) 到 m32fp. | |
DD /2 | FST m64fp | 有效 | 有效 | 复制ST( 0) 到 m64fp. | |
DD D0+i | FST ST(i) | 有效 | 有效 | 复制ST(0)到ST(i). | |
D9 /3 | FSTP m32fp | 有效 | 有效 | 复制 ST( 0) 到 m32fp 和 pop 寄存器堆栈 。 | |
DD /3 | FSTP m64fp | 有效 | 有效 | 复制 ST( 0) 到 m64fp 和 pop 寄存器堆栈 。 | |
DB /7 | FSTP m80fp | 有效 | 有效 | 复制 ST( 0) 到 m80fp 和 流行寄存器堆栈 。 | |
DD D8+i | FSTP ST(i) | 有效 | 有效 | 复制 ST( 0) 到 ST( i) 和 pop 寄存器堆栈 。 |
实测开销
正在从 arch-data 加载实测数据...
说明
FST指令将ST(0)寄存器中的值复制到目标操作数,它可以是内存位置或FPU寄存器堆栈中的另一个寄存器. 在存储内存中值时,该值被转换为单精度或双精度浮点格式.
FSTP指令执行与FST指令相同的操作,然后弹出寄存器堆栈. 要弹出寄存器堆栈,处理器将ST(0)寄存器标记为空,并将 栈指针 (TOP) 递增为 1 。 FSTP指令也可以以双倍扩展精度浮点格式存储内存中的值.
如果 目标操作数 是 内存位置,则 操作数 指定要存储目的地值的第一个字节的地址. 如果 目标操作数 是一个寄存器,则 操作数 在寄存器堆栈中指定一个相对于堆栈顶部的寄存器.
如果目的地大小是单精度或双精度,所存储的值的符号和值被四舍五入到目的地的宽度(根据FPU控制词的RC字段指定的四舍五入模式),而引子则转换成目的地格式的宽度和偏差. 如果存储的值对目的格式来说太大,则生成一个数字溢出例外(#O),如果例外被解析,则目标操作数中不存储值. 如果存储的值是异常值,则不生成异常例外(#D). 此条件仅作为数字下流例外(#U)条件表示.
如果所存储的值是+/-0,+/-,或者一个NaN,则符号和符号中最小的位点会被切换以适应目的地格式. 此操作保留了该值作为 0, 或 NaN 的特性.
如果 目标操作数 是非空的寄存器,则无效操作例外不会生成.
此指令的操作在非64位模式和64位模式中是相同的.
行动
DEST := ST(0);
IF Instruction = FSTP
THEN
PopRegisterStack;
FI;
FPU Flags Affected
C1 Set to 0 if stack underflow occurred.
Indicates rounding direction of if the floating-point inexact exception (#P) is generated: 0 :=
not roundup; 1 := roundup.
C0, C2, C3 Undefined.浮点 例外
#IS Stack underflow occurred.#IA If destination result is an SNaN value or unsupported format, except when the destination格式为双倍扩展精度浮点格式。
#U Result is too small for the destination format.#O Result is too large for the destination format.#P Value cannot be represented exactly in destination format.异常
保护模式
#GP(0) | 如果目的地位于不可写入的区段中。如果内存操作数的有效地址位于CS、DS、ES、FS或GS区段限制之外,则使用DS、ES、FS或GS寄存器访问内存,并含有NULL 段选择子。 |
#SS(0) | 如果 内存操作数 的有效地址在 SS 段限制之外。 |
#NM | CR0.EM[bit 2]或CR0.TS[bit 3] = 1. #PF(fault-code) 如果发生页面错误. |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用 LOCK 前缀 。 |
实地址模式
#GP | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS | 如果 内存操作数 的有效地址在 SS 段限制之外。 |
#NM | CR0.EM[bit 2] 或 CR0.TS[bit 3] = 1. |
#UD | 如果使用 LOCK 前缀 。 |
虚拟 8086 模式
#GP(0) | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS(0) | 如果 内存操作数 的有效地址在 SS 段限制之外。 |
#NM | CR0.EM[bit 2]或CR0.TS[bit 3] = 1. #PF(fault-code) 如果发生页面错误. |
#AC(0) | 如果启用对齐检查, 并使用不对齐的内存引用 。 |
#UD | 如果使用 LOCK 前缀 。 |
兼容模式
| 与保护模式中的例外相同. |
64 位模式
#SS(0) | 如果引用SS部分的内存地址是非冠状的. |
#GP(0) | 如果内存地址是非冠状的. |
#NM | CR0.EM[bit 2] 或 CR0.TS[bit 3] = 1. |
#MF | 如果存在待决的x87 FPU例外. #PF(fault-code) 如果发生 页面错误. |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用 LOCK 前缀 。 |