我有这个 Win32 代码:
fld x
fmul y
fstsw ax
似乎fmul
没有清除 FPU 状态寄存器位,即如果溢出已经设置(ax
& 8),那么它将在之后保持设置fmul
。这是正确的行为吗?是否需要在 FPU 操作之后或之前清除状态?
即我想fmul
会设置这个位,但它应该重置它吗?我在网上找不到答案。
我有这个 Win32 代码:
fld x
fmul y
fstsw ax
似乎fmul
没有清除 FPU 状态寄存器位,即如果溢出已经设置(ax
& 8),那么它将在之后保持设置fmul
。这是正确的行为吗?是否需要在 FPU 操作之后或之前清除状态?
即我想fmul
会设置这个位,但它应该重置它吗?我在网上找不到答案。
你敢打赌这是正确的行为。
来自8.1.3.3 x87 FPU Floating-Point Exception Flags
,Intel® 64 and IA-32 Architectures Software Developer’s Manual
第 1 卷:
异常标志是“粘性”位(一旦设置,它们将保持设置直到明确清除)。它们可以通过执行 FCLEX/FNCLEX(清除异常)指令、使用 FINIT/FNINIT 或 FSAVE/FNSAVE 指令重新初始化 x87 FPU 或使用 FRSTOR 或 FLDENV 指令覆盖标志来清除。
如果禁用 FPU 异常,则不需要重置这些标志。