FPU 寄存器是浮点处理器单元中的寄存器,用于执行浮点运算。支持32位 和64位浮点数据运算使用独立的栈用于运算
专用寄存器 | ||
操作码寄存器 | 保存最后指向的非控制指令的操作码 | 11 bit |
控制寄存器 | 运算时,控制精度及舍入方法,隐藏各个浮点异常 | 16 bit |
状态寄存器 | 包含栈顶指针,条件码,以及异常警告 | 16 bit |
标志寄存器 | 指明栈内每个寄存器的内容 | 16 bit |
指针寄存器 | 保存指向最后执行的非控制指令指针 | 47 bit |
数据指针 | 保存指向最后执行指令所使用的数据指针 | 47 bit |
单精度 | 32位,1个符号位(最高位),8位阶数(23~30),23位小数部分(0-~22) |
双精度 | 64位,,1个符号位(最高位),11位阶数(52~63),52位小数部分(0~51) |
扩展双进度 | 80位,,1个符号位(最高位),1位整数部分,15位阶数,63位小数部分 |
控制寄存器字段图
RC: 舍入控制
00: 舍入到最近的偶数; 01: 向负无穷舍入;10: 向正无穷舍入;11: 向0舍入(截断)
浮点异常: IM:无效操作,ZM:用0 除,DM:非规格化操作数,OM:数据上溢,UM:数据下溢,PM:不确定精度
数据传输指令(data Transfer Instructions) | |
FINIT | 对FPU 进行初始化,FINIT 037FH(100101) 隐藏素浮点异常,舍入模式为最近偶数 |
FLD | FLD m32fp/ m64fp/ m80fp/ FLD ST(i): Copy ST(0) to ST(i). 加载浮点值,复制操作数到栈顶(ST0) |
FST | FST m32fp/m64fp 将栈顶复杂到内存中,Copy ST(0) to m32fp/m64fp |
FSTP | FSTP m32fp/m64fp/m80fp/ FSTP ST(i): Copy ST(0) to ST(i) and pop register stack. 将栈顶复杂到内存中,并将ST0弹出堆栈,修改ST0的位置 Copy m32fp/m64fp/m80fp/ to m32fp and pop register stack. |
FILD | FILD m16int/m32int/m64int 指令将一个整数值加载到浮点数寄存器ST(0)中 加载整数,复制操作数到栈顶(ST0) |
FIST | FIST m16int/m32int/m64int 存储整数 指令将浮点数寄存器ST(0)中的值舍入为整数,并将结果存储到指定的整数寄存器或内存位置中 |
FISTP | FISTP m32int/m64int 将ST(0)存储在m32int/m64int中并弹出寄存器堆栈。 |
FBLD | FBLD m80bcd 将BCD(二进制编码的十进制)数值加载到FPU(浮点处理器单元)的寄存器中 |
FBSTP | FBSTP m80bcd 将ST(0)存储在m80bcd中,然后弹出ST(O)。 |
FXCH | FXCH ST(i) :交换ST(0)和ST(i)的内容。 FXCH: 交换ST(0)和ST(1)的内容。 用于交换FPU(浮点处理器单元)的栈顶部分和次栈顶部分的两个浮点数值 |
FCMOVE | FCMOVE ST(0), ST(i) ,如果相等 Move if equal (ZF=1). |
FCMOVNE | FCMOVNE ST(0), ST(i) 如果不相等 Move if not equal (ZF=0). |
FCMOVB | FCMOVB ST(0), ST(i) 如果低于 Move if below (CF=1) |
FCMOVBE | FCMOVBE ST(0), ST(i) 如果低于或等于 Move if below or equal (CF=1 or ZF=1). |
FCMOVNB | FCMOVNB ST(0), ST(i) 如果不低于 Move if not below (CF=0). |
FCMOVNBE | FCMOVNBE ST(0), ST(i) 如果不低于或等于 Move if not below or equal (CF=0 and ZF=0). |
FCMOVU | FCMOVU ST(0), ST(i) 如果无序 Move if unordered (PF=1). |
FCMOVNU | FCMOVNU ST(0), ST(i) 如果不是无序的 Move if not unordered (PF=0) |
Basic Arithmetic Instructions 基本运算指令 | |
FADD | FADD m32fp / FADD m64fp :Add m32fp/m64fp to ST(0) and store result in ST(0). FADD ST(0), ST(i) : Add ST(0) to ST(i) and store result in ST(0). FADD ST(i), ST(0): Add ST(i) to ST(0) and store result in ST(i) |
FADDP | FADDP ST(i), ST(0): 相加,并将结果存储回ST(i)中,同时从FPU栈中弹出ST(0)。 |
FIADD | FIADD m32int / FIADD m16int Add m32int/m16int to ST(0) and store result in ST(0). |
FSUB | FSUB:从ST(1)中减去ST(0),将结果存储在ST1 弹出寄存器堆栈。 FSUB m32fp / FADD m64fp : 从ST(0)中减去m32fp/m64fp,并将结果存储在ST(1)中。 FSUB ST(0), ST(i) : 从ST(0)中减去ST(i),并将结果存储在ST(O)中。 FSUB ST(i), ST(0): 从ST(i)中减去ST(0),并将结果存储在ST(ⅰ)中。 |
FSUBP | FSUBP ST(i), ST(0) : 从ST(i)中减去ST(0),将结果存储在ST(i),并弹出寄存器堆栈。 FSUBP:从ST(1)中减去ST(0),将结果存储在ST(0),弹出寄存器堆栈。 |
FISUB | FISUB m32int/m64fp: 从ST(0)中减去m32int,并将结果存储在ST(1)中。 |
FSUBR | FSUBR m32fp/m64fp: 从m32fp/m64fp中减去ST(0),并将结果存储在ST(1)中。 FSUBR ST(0), ST(i): 从ST(i)中减去ST(0),并将结果存储在ST(O)中。 FSUBR ST(i), ST(0): 从ST(0)中减去ST(i),并将结果存储在ST(i)中。 |
FSUBRP | FSUBRP ST(i), ST(0):从ST(0)中减去ST(i),将结果存储在ST(i),弹出寄存器堆栈。 FSUBRP:从ST(0)中减去ST(1),将结果存储在ST(1),弹出寄存器堆栈。 |
FISUBR | FISUBR m32int/m64int: 从m32int/m64int中减去ST(0),并将结果存储在ST(1)中。 |
FMUL | FMUL: 将ST0 * ST1,结果存储在ST1中,并弹出堆栈 FMUL m32fp/m64fp: ST0 *m32fp/m64fp 并将结果存储回ST(0)中 FMUL ST(0), ST(i): ST(0) * ST(i) 并将结果存储回ST(0)中 FMUL ST(i), ST(0): ST(0) * ST(i) 并将结果存储回ST(i)中 |
FMULP | FMULP ST(i): ST(0): ST(0) * ST(i);保存在ST(i)中,并弹出ST(0) |
FIMUL | FIMUL m32fp/m64fp: MUL m32int/m16int to ST(0) and store result in ST(0). |
FDIV | FDIV m32fp / FDIV m64fp:Divide ST(0) by m32fp /m64fpand store result in ST(0). FDIV ST(0), ST(i) :Divide ST(0) by ST(i) and store result in ST(0). FDIV ST(i), ST(0): Divide ST(i) by ST(0) and store result in ST(i). |
FDIVP | FDIVP:将ST(1)中的值除以ST(0)中的值,并将结果存储回ST(1)中。接着,使用FSTP ST(0)指令将栈顶的数值弹出 FDIVP ST(i), ST(0) :Divide ST(i) by ST(0), store result in ST(i), and pop the register stack. 将ST(i)除以ST(0),将结果存储在ST(i)中,然后弹出寄存器堆栈。 |
FIDIV | FIDIV m32int/m16int 将ST(0)除以m32int/m16int,并将结果存储在ST(0)中。 |
FDIVR | FDIVR m32fp/m64fp 将m32fp/m64fp除以ST(0),并将结果存储在ST中(0)。 FDIVR ST(0), ST(i) 将ST(i)除以ST(0),并将结果存储在ST(零)中。 FDIVR ST(i), ST(0) 将ST(0)除以ST(i),并将结果存储在ST(i)中。 |
FDIVRP | FDIVRP ST(i), ST(0) 将ST(0)除以ST(i),将结果存储在ST(i)寄存器堆栈。 FDIVRP 将ST(0)除以ST(1),将结果存储在ST(1)寄存器堆栈。 |
FIDIVR | FIDIVR m32int/m16int 将 m32int/m16int 除以ST(0),并将结果存储在ST(1)中。 |
FPREM | Replace ST(0) with the remainder obtained from dividing ST(0) by ST(1). 用除法得到的余数替换ST(0),ST(0)乘以ST(1)。 |
FPREM | Replace ST(0) with the IEEE remainder obtained from dividing ST(0) by ST(1) 用ST(0)除以ST(1)所得的IEEE余数替换ST(0 |
FABS | Replace ST with its absolute value. 将ST(0)替换为其绝对值。 |
FCHS | 会将浮点寄存器ST(0)中的值取负,并将结果存储回ST(0)中 |
FRNDINT | Round ST(0) to an integer. 将(ST0)浮点数四舍五入为最接近的整数,并将结果存储回ST(0)中。 |
FSCALE | Scale ST(0) by ST(1) 将ST(0)中的值乘以2的n次方,其中n是ST(1)中的整数部分,并将结果存储回ST(0)中。 |
FSQRT | 计算浮点数的平方根,并将结果存储回ST(0)中 |
FXTRACT | Separate value in ST(0) into exponent and significand, store exponent in ST(0), and push the significand onto the register stack. 将ST(0)中的值分离为指数和有效位,存储ST(0)中的指数,并将有效位推送到寄存器堆栈 |
Comparison Instructions: 对比指令 | |
FCOM | FCOM: 比较ST(0) 与ST(1) FCOM m32fp/m64fp: 比较ST(0) 与m32fp/m64fp FCOM ST(i) 比较ST(0) 与 ST(i) 将ST(0)中的值与指定的值进行比较,并设置FPU状态字中的条件码以反映比较的结果。可能会影响FPU栈的状态,会处理NaN的情况 |
FCOMP | FCOMP : 比较ST(0) 与ST(1) FCOMP m32fp/m64fp :比较ST(0) 与m32fp/m64fp FCOMP ST(i): 比较ST(0) 与 ST(i) 设置FPU状态字中的条件码以反映比较结果,并从FPU栈中移除ST(0)中的值 |
FCOMPP | Compare ST(0) with ST(1) and pop register stack twice. 将ST(0)与ST(1)进行比较并弹出寄存器堆栈两次 |
FUCOM | FUCOMI ST(0), ST(i) 比较无序浮点数寄存器ST(0)中的值与另一个浮点数或内存中的浮点数 将ST(0)与ST(i)进行比较,检查有序值,然后设置相应的状态标志 无序浮点数是指在比较过程中,其中一个或两个操作数为NaN(非数)的情况 |
FUCOMIP | FUCOMIP ST(0), ST(i) 比较ST(0)和ST(i),检查有序值,设置 相应的状态标志,并弹出寄存器堆栈。 |
FUCOMP | FUCOMP ST(i) 比较无序浮点数寄存器ST(0)中的值与另一个浮点数或内存中的浮点数,并弹出栈顶元素 |
FUCOMPP | FUCOMPP:将ST(0)与ST(1)进行比较,并弹出寄存器堆栈两次 |
FICOM | FICOM m32int/m64int: 将ST(0)与m16int/m64int进行比较。并设置FPU状态字中的条件码以反映比较的结果 |
FICOMP | FICOMP m32int/m64int: 将ST(0)与m16int/m64int进行比较,然后弹出堆栈寄存器。,并设置FPU状态字中的条件码以反映比较的结果 |
FCOMI | FCOMI ST(0), ST(i) 比较浮点数寄存器ST(0)中的值与另一个浮点数或内存中的浮点数,并将比较结果更新到EFLAGS寄存器中,不会改变FPU栈的状态,它不处理NaN(非数)情况 |
FUCOMI | FCOMIP ST(0), ST(i) 将ST(0)与ST(i)进行比较,检查有序值,然后设置相应的状态标志。 |
FCOMIP | FCOMIP ST, ST(i) 将ST(0)与ST(i)进行比较,相应地设置状态标志,以及弹出寄存器堆栈。 |
FTST | FTST:将ST(0)中的值与零进行比较,并设置FPU状态字中的条件码以反映比较的结果 |
FXAM | 检查浮点数寄存器ST(0)中的值,并确定其类型(非规格化数、规格化数、无穷大、非数)。这个指令会设置FPU状态字中的条件码以反映ST(0)中值的类型 |
Control Instructions:控制器指令 | |
FINCSTP | 增加FPU状态寄存器中的TOP字段。 |
FDECSTP | 递减FPU寄存器堆栈指针。 |
FFREE | Free x87 FPU register. |
FINIT | 在检查错误条件后初始化FPU。 |
FNINIT | 在不检查错误条件的情况下初始化FPU。 |
FCLEX | 在检查错误条件后清除浮点异常标志。 |
FNCLEX | 清除浮点异常标志,而不检查错误情况。 |
FSTCW | 在检查错误条件后存储FPU控制字。 |
FNSTCW | 在不检查错误条件的情况下存储FPU控制字。 |
FLDCW | FLDCW m2byte 加载FPU控制字。 |
FSTENV | FSTENV m14/28byte 存储FPU环境检查错误条件后。 |
FNSTENV | FNSTENV1 m14/28byte 存储FPU环境,无需检查错误条件。 |
FLDENV | FLDENV m14/28byte 加载FPU环境。 |
FSAVE | FSAVE m94/108byte 检查错误条件后保存FPU状态。 |
FNSAVE | FNSAVE m94/108byte 保存FPU状态而不检查错误条件。 |
FRSTOR | FRSTOR m94/108byte (94 或108 字节) 恢复FPU状态。 |
FSTSW | FSTSW m2byte FSTSW AX 在检查错误条件后存储FPU状态字。 |
FNSTSW | FNSTSW m2byte NSTSW AX 在不检查错误条件的情况下存储FPU状态字。 |
WAIT/FWAIT | 等待FPU。 |
FNOP | FPU无操作 |
Transcendental Instructions | |
FSIN | 用于计算浮点数寄存器ST(0)中的值的正弦,并将结果存储回ST(0)中。 |
FCOS | FCOS指令用于计算浮点数寄存器ST(0)中的值的余弦,并将结果存储回ST(0)中 |
FSINCOS | 同时计算浮点数寄存器ST(0)中的值的正弦和余弦,并将结果存储回ST(0)和ST(1)中 |
FPTAN | 计算浮点数寄存器ST(0)中的值的正切,并将结果存储回ST(0)中。 |
FPATAN | 计算浮点数寄存器ST(1)中的值除以ST(0)中的值的反正切,并将结果存储回ST(1)中 |
F2XM1 | Replace ST(0) with (2ST(0) – 1) 用于计算2的x次方减1,其中x是浮点数寄存器ST(0)中的值 |
FYL2X | Replace ST(1) with (ST(1) ∗ log2ST(0)) and pop the register stack. 计算以2为底的对数乘以浮点数寄存器ST(0)中的值,并将结果存储回ST(1)中 |
FYL2XP1 | Replace ST(1) with ST(1) ∗ log2(ST(0) + 1.0) and pop the register stack. 指令用于计算以2为底的对数乘以浮点数寄存器ST(0)中的值加1,并将结果存储回ST(1)中 |
加载常量说明 | |
FLD1 | 常数1.0加载到浮点数寄存器ST(0)中。 |
FLDZ | 将常数0.0加载到浮点数寄存器ST(0)中。 |
FLDPI | 将π加载到浮点数寄存器ST(0)中。 |
FLDL2E | 将以2为底的对数e(L2E)加载到浮点数寄存器ST(0)中。 |
FLDLN2 | 将以e为底的对数2(LN2)加载到浮点数寄存器ST(0)中。 |
FLDL2T | 用于将以2为底的对数10(L2T)加载到浮点数寄存器ST(0)中。 |
FLDLG2 | 用于将以10为底的对数2(LG2)加载到浮点数寄存器ST(0)中。 |
FPU和SIMD状态管理指令 | |
FXSAVE |
(32位) FXSAVE m512byte (64位) FXSAVE64 m512byte 用于保存FPU(浮点处理器单元)的状态到内存中,包括寄存器状态、控制字、标志字等信息 |
FXRSTOR | (32位) FXRSTOR m512byte (64位) FXRSTOR64 m512byte 用于从内存中恢复之前保存的FPU(浮点处理器单元)状态,包括寄存器状态、控制字、标志字等信息 |