x87 命令

レジスタに値をロード
FLDZ+0.0 の値をプッシュ
FLD1+1.0 の値をプッシュ
FLDL2E
FLDL2T
FLDLG2
FLDLN2
FLDPI
各定数値をプッシュ
FLD浮動小数点数をプッシュ
FILD整数からプッシュ
FBLDパックBCD整数値からプッシュ
値のコピー
FST
FSTP
ST(0) の値をコピー
FIST
FISTP
整数に変換してメモリにコピー
FISTTP整数に変換してメモリにコピー (切り捨て)
FBSTPST(0) を BCD 値に変換してポップ
FCMOVcc条件付きコピー
FXCHレジスタの値の交換
変換
FCHS符号反転
FABS絶対値に変換
FRNDINT浮動小数点を整数に丸める
FXTRACT指数と仮数の抽出
演算
FADD
FADDP
FIADD
加算
FSUB
FSUBP
FISUB
浮動小数点減算
FSUBR
FSUBRP
FISUBR
減算 (逆位置)
FMUL
FMULP
FIMUL
浮動小数点乗算
FDIV
FDIVP
FIDIV
除算
FDIVR
FDIVRP
FIDIVR
除算 (逆位置)
FPREM剰余
FPREM1剰余 (IEEE 754)
FSCALEST(0) に 2^x を乗算
F2XM12^x-1
FSQRT平方根
FCOSCOS
FSINSIN
FSINCOSSIN と COS
FPTAN正接 (tan)
FPATAN逆正接 (atan)
FYL2Xy * Log2(x)
FYL2XP1y * Log2(x+1)
比較
FCOM
FCOMP
FCOMPP
比較
FUCOM
FUCOMP
FUCOMPP
比較 (例外の違い)
FCOMI
FCOMIP
比較と rFLAGS の設定
FUCOMI
FUCOMIP
比較と rFLAGS の設定
FICOM
FICOMP
整数と比較
FTSTST(0) と 0.0 の比較
FXAM浮動小数点の値の検査
状態
FINIT
FNINIT
初期化
FFREE指定レジスタを解放
FINCSTPTOP をインクリメント
FDECSTPTOP をデクリメント
FCLEX
FNCLEX
ステータスワードのフラグをクリア
FSTSW
FNSTSW
スターテスワードの値を AX かメモリに保存
FSTCW
FNSTCW
コントロールワードの値をメモリに保存
FLDCWメモリの値をコントロールワードにロード
FSTENV
FNSTENV
x87 環境をメモリに保存
FLDENVメモリから x87 環境を復元
FSAVE
FNSAVE
x87 & MMX 状態の保存と初期化
FRSTORx87 & MMX 状態の復元
ほか
FNOP何もしない
FWAIT
WAIT
マスクされていない x87 浮動小数点例外を待つ
レジスタに値をロード
FLDZ | D9 EE
浮動小数点値 +0.0 を、レジスタスタックにプッシュします。
C1
1 = スタックフォルト時、スタックオーバーフロー。
FLD1 | D9 E8
浮動小数点値 +1.0 を、レジスタスタックにプッシュします。
C1
1 = スタックフォルト時、スタックオーバーフロー。
FLDL2E | D9 EA | log2e
FLDL2T | D9 E9 | log2e 10
FLDLG2 | D9 EC | log10 2
FLDLN2 | D9 ED | loge 2
FLDPI  | D9 EB | π
各定数値を、レジスタスタックにプッシュします。

内部の 66bit 定数は、RC の設定によって、拡張倍精度で丸められます。
C1
1 = スタックフォルト時、スタックオーバーフロー。
FLD ST(i)     | D9 C0+i
FLD mem32real | D9 /0
FLD mem64real | DD /0
FLD mem80real | DB /5
メモリまたは浮動小数点レジスタの値を、レジスタスタックにプッシュします。

メモリの場合、単精度、倍精度、拡張倍精度浮動小数点の値を指定できます。
単精度値または倍精度値は、スタックにプッシュする前に、拡張倍精度形式に変換します。
C1
0 = スタックフォルト時、スタックアンダーフロー。
1 = スタックフォルト時、スタックオーバーフロー。
FILD mem16int | DF /0
FILD mem32int | DB /0
FILD mem64int | DF /5
メモリ内の符号付き整数を、拡張倍精度形式に変換し、レジスタスタックにプッシュします。
値は、四捨五入せずに、常に正確に表現できます。
C1
1 = スタックフォルト時、スタックオーバーフロー。
FBLD mem80dec | DF /4
メモリ内の 80bit(10byte) のパック BCD 値を、拡張倍精度形式に変換し、結果をスタックにプッシュします。
ソースの符号は保持されます。

BCD の各桁は、0〜9 の範囲内である必要があります。
無効な桁がある場合、未定義の結果が生成されます。
C1
1 = スタックフォルト時、スタックオーバーフロー。
値のコピー
FST ST(i)      | DD D0+i
FST mem32real  | D9 /2
FST mem64real  | DD /2

FSTP ST(i)     | DD D8+i
FSTP mem32real | D9 /3
FSTP mem64real | DD /3
FSTP mem80real | DB /7
ST(0) の値を、指定された浮動小数点レジスタまたはメモリ位置にコピーします。

FSTP 命令は、値をコピーした後に、レジスタスタックをポップします。
FSTP ST(0) は、データ転送を行わずに、レジスタスタックをポップするのと同じです。

宛先が単精度または倍精度のメモリ位置である場合、RC の丸めモードによって、仮数部を丸め、適切な精度形式に変換します。

値が宛先フォーマットに対して大きすぎる場合、オーバーフロー例外 (OE) ビットを設定します。
その後、オーバーフロー例外がマスク解除されている場合 (OM ビットが 0) は、コピーを実行しません。

値が非正規化数の場合、アンダーフロー例外 (UE) ビットを設定します。
値が ±0、±∞、NaN の場合、仮数部と指数の最下位ビットを切り捨てます。
C1
0 = スタックフォルト時、スタックアンダーフロー。
1 = スタックフォルト時、スタックオーバーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FIST mem16int  | DF /2
FIST mem32int  | DB /2

FISTP mem16int | DF /3
FISTP mem32int | DB /3
FISTP mem64int | DF /7
ST(0) の値を、RC の丸めモードで符号付き整数に変換し、指定されたメモリ位置にコピーします。

FISTP 命令は、値をメモリに格納した後、スタックをポップします。

宛先に対して値が大きすぎる場合や、NaN である場合、サポートされていない形式である場合は、無効操作例外 (IE) ビットを 1 に設定します。
その後、例外がマスクされている場合 (IM ビットが 1)、不定の整数値が格納されます。
例外がマスクされていない (IM ビットが 0) 場合、値は格納されません。
C1
0 = 精度例外なし。
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FISTTP mem16int | DF /1
FISTTP mem32int | DB /1
FISTTP mem64int | DD /1
ST(0) の値の小数部分を切り捨てて、整数に変換した結果をメモリにコピーし、レジスタスタックをポップします。
FISTTP 命令は、丸めモードを無視します。

CPUID(SSE3): 0000_0001h > ECX(bit0)
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 結果は切り捨て (常に切り捨てられる)
FBSTP mem80dec | DF /6
ST(0) の値を、18 桁のパック BCD 値に変換して、結果を指定されたメモリ位置に格納し、レジスタスタックをポップします。

結果の 10 byte の、最初のバイトのメモリアドレスを指定します。
結果は、RC の丸めモードに応じて、整数値に丸められます。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FCMOVE ST(0),ST(i)   | DA C8+i | ZF = 1
FCMOVNE ST(0),ST(i)  | DB C8+i | ZF = 0
FCMOVB ST(0),ST(i)   | DA C0+i | CF = 1
FCMOVNB ST(0),ST(i)  | DB C0+i | CF = 0
FCMOVBE ST(0),ST(i)  | DA D0+i | CF = 1 or ZF = 1
FCMOVNBE ST(0),ST(i) | DB D0+i | CF = o and ZF = 0
FCMOVNU ST(0),ST(i)  | DB D8+i | PF = 0
FCMOVU ST(0),ST(i)   | DA D8+i | PF = 1
rFLAGS レジスタ内のフラグの条件に応じて、2番目のスタックレジスタ内の値を、ST(0) に移動します。

CPUID: CMOV (x64 には含まれている)
C1
0 = スタックフォルト時、スタックアンダーフロー。
FXCH       | D9 C9   | ST(0), ST(1)
FXCH ST(i) | D9 C8+i | ST(0), ST(i)
ST(0) の値を、他の x87 レジスタの値と交換します。
この命令を使用して、ST(0) でのみ動作する後続の処理のために、x87 レジスタから ST(0) に値を移動します。
C1
C1 = 0
変換
FCHS | D9 E0
ST(0) の符号ビットを反転させ、値を負から正、またはその逆に変更します。
この演算は、正と負の浮動小数点値、-0 と +0、NaN、+∞ と -∞ に適用されます。
C1
C1 = 0
FABS | D9 E1
符号ビットを 0 にすることで、ST(0) の値を絶対値に変換します。
結果の値は、ソースの数値のタイプによって異なります。

-有限実数 > +有限実数
+有限実数 > +有限実数
-0 > +0
+0 > +0
-∞ > +∞
+∞ > +∞
NaN > NaN
C1
C1 = 0
FRNDINT | D9 FC
丸め制御 (RC) の設定に応じて、ST(0) の値を整数に丸め、結果を ST(0) に格納します。

ST(0) の初期値が ∞ の場合、ST(0) を変更しません。
ST(0) の値が整数でない場合は、精度例外 (PE) ビットを 1 に設定します。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FXTRACT | D9 F4
ST(0) 内の、浮動小数点値の指数部と仮数部を抽出し、指数を ST(0) に格納してから、仮数部をレジスタスタックにプッシュします。

この演算の後、新しい ST(0) には、元の仮数部の符号と値、3FFFh の指数を持つ実数が含まれ、ST(1) には、元の値の指数値が含まれます。

FXTRACT 命令は、拡張倍精度数値を、10 進表現に変換するのに役立ちます。

ゼロ除算例外マスク (ZM) ビットが 1 に設定されており、ソース値が ±0 の場合、ST(0) に ±0 を格納し、ST(1) に指数値 -∞ を格納します。
C1
0 = スタックフォルト時、スタックアンダーフロー。
1 = スタックフォルト時、スタックオーバーフロー。
演算
FADD ST(0),ST(i)  | D8 C0+i | ST(0) + ST(i) -> ST(0)
FADD ST(i),ST(0)  | DC C0+i | ST(i) + ST(0) -> ST(i)
FADD mem32real    | D8 /0   | ST(0) + mem32real -> ST(0)
FADD mem64real    | DC /0   | ST(0) + mem64real -> ST(0)

FADDP             | DE C1   | ST(1) + ST(0) -> ST(1) & POP
FADDP ST(i),ST(0) | DE C0+i | ST(i) + ST(0) -> ST(i) & POP

FIADD mem16int    | DE /0   | ST(0) + mem16int -> ST(0)
FIADD mem32int    | DA /0   | ST(0) + mem32int -> ST(0)
2 つの値を加算し、結果をレジスタに格納します。

FADDP 命令は、ST(0) の値を、別のレジスタに加算し、レジスタスタックをポップします。
オペランドが指定されていない場合、FADDP ST(1),ST(0) になります。

FIADD 命令は、メモリ位置から 16/32bit の符号付き整数値を読み込み、拡張倍精度実数形式に変換した後、ST(0) に加算します。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FSUB ST(0),ST(i)  | D8 E0+i | ST(0) - ST(1) -> ST(0)
FSUB ST(i),ST(0)  | DC E8+i | ST(i) - ST(0) -> ST(i)
FSUB mem32real    | D8 /4   | ST(0) - mem32real -> ST(0)
FSUB mem64real    | DC /4   | ST(0) - mem64real -> ST(0)

FSUBP             | DE E9   | ST(1) - ST(0) -> ST(1) & POP
FSUBP ST(i),ST(0) | DE E8+i | ST(i) - ST(0) -> ST(i) & POP

FISUB mem16int    | DE /4   | ST(0) - mem16int -> ST(0)
FISUB mem32int    | DA /4   | ST(0) - mem32int -> ST(0)
2つの値を減算し、結果をレジスタに格納します。

FSUBP 命令は、減算の実行後にレジスタスタックをポップします。
一部のアセンブラでは、この命令のニーモニックは FSUBP ではなく FSUB です。

FISUB 命令は、減算を実行する前に、符号付き整数値を拡張倍精度形式に変換します。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FSUBR ST(0),ST(i)  | D8 E8+i | ST(i) - ST(0) -> ST(0)
FSUBR ST(i),ST(0)  | DC E0+i | ST(0) - ST(i) -> ST(i)
FSUBR mem32real    | D8 /5   | mem32real - ST(0) -> ST(0)
FSUBR mem64real    | DC /5   | mem64real - ST(0) -> ST(0)

FSUBRP             | DE E1   | ST(0) - ST(1) -> ST(1) & POP
FSUBRP ST(i),ST(0) | DE E0+i | ST(0) - ST(i) -> ST(i) & POP

FISUBR mem16int    | DE /5   | mem16int - ST(0) -> ST(0)
FISUBR mem32int    | DA /5   | mem32int - ST(0) -> ST(0)
FSUB とは逆の位置で減算を行います。
FMUL ST(0),ST(i)  | D8 C8+i | ST(0) * ST(i) -> ST(0)
FMUL ST(i),ST(0)  | DC C8+i | ST(i) * ST(0) -> ST(i)
FMUL mem32real    | D8 /1   | ST(0) * mem32real -> ST(0)
FMUL mem64real    | DC /1   | ST(0) * mem64real -> ST(0)

FMULP             | DE C9   | ST(1) * ST(0) -> ST(1) & POP
FMULP ST(i),ST(0) | DE C8+i | ST(i) * ST(0) -> ST(i) & POP

FIMUL mem16int    | DE /1   | ST(0) * mem16int -> ST(0)
FIMUL mem32int    | DA /1   | ST(0) * mem32int -> ST(0)
値を乗算し、結果をレジスタに格納します。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FDIV ST(0),ST(i)  | D8 F0+i | ST(0) / ST(i) -> ST(0)
FDIV ST(i),ST(0)  | DC F8+i | ST(i) / ST(0) -> ST(i)
FDIV mem32real    | D8 /6   | ST(0) / mem32real -> ST(0)
FDIV mem64real    | DC /6   | ST(0) / mem64real -> ST(0)

FDIVP             | DE F9   | ST(1) / ST(0) -> ST(1) & POP
FDIVP ST(i),ST(0) | DE F8+i | ST(i) / ST(0) -> ST(i) & POP

FIDIV mem16int    | DE /6   | ST(0) / mem16int -> ST(0)
FIDIV mem32int    | DA /6   | ST(0) / mem32int -> ST(0)
除算を行い、その結果をレジスタに格納します。

FIDIV 命令の場合は、整数 0 は +0 として扱います。
オペランドの一方が 0 であっても、オペランドの符号によって、結果の符号が決まります。

ゼロ除算例外がマスクされておらず (ZM ビットが 0)、ゼロ除算例外が発生する (ZE ビットが 1) 場合、結果を格納しません。
ゼロ除算例外がマスクされている (ZM ビットが 1) 場合は、ゼロ除算例外により、±∞ が格納されます。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FDIVR ST(0),ST(i)   | D8 F8+i  | ST(i) / ST(0) -> ST(0)
FDIVR ST(i), ST(0)  | DC F0+i  | ST(0) / ST(i) -> ST(i)
FDIVR mem32real     | D8 /7    | mem32real / ST(0) -> ST(0)
FDIVR mem64real     | DC /7    | mem64real / ST(0) - > ST(0)

FDIVRP              | DE F1    | ST(0) / ST(1) -> ST(1) & POP
FDIVRP ST(i), ST(0) | DE F0 +i | ST(0) / ST(i) -> ST(i) & POP

FIDIVR mem16int     | DE /7    | mem16int / ST(0) -> ST(0)
FIDIVR mem32int     | DA /7    | mem32int / ST(0) -> ST(0)
FDIV とは逆の位置で除算します。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FPREM | D9 F8
ST(0) の値を、ST(1) の値で割った余りを計算し、結果を ST(0) に格納します。

反復ごとに 1 つの商ビットが計算される、反復減算シフト長除算アルゴリズムによって、剰余を計算します。
ST(0) と ST(1) の指数の差が 64 未満の場合、商のすべての整数ビットを計算し、剰余の大きさが ST(1) の除数より小さいことを保証します。
指数の差が 64 以上の場合、32 から 63 までの番号を持つ整数商ビットのサブセットのみを計算し、部分剰余を返し、C2 条件コードビットを 1 に設定します。

FPREM1 命令とは異なり、IEEE 標準 754 による部分剰余を計算しません。
C0
商のビット 2 の値と等しくなる
C1
フォルトなしの場合、商のビット 0 の値と等しくなる。
0 = スタックフォルト時、スタックアンダーフロー。
C2
0 = FPREM は部分剰余を生成した。
1 = ソースオペランドの差異が 2^64 倍を超えているため、結果は不完全。
C3
商のビット 1 の値と等しくなる
FPREM1 | D9 F5
ST(0) の値を、ST(1) の値で割った、IEEE 標準 754 による余りを計算し、結果を ST(0) に格納します。

FPREM とは異なり、整数商を、最も近い偶数の整数に丸め、丸められた商の逆乗算に対応する剰余を返します。

ST(0) と ST(1) の指数の差が 64 未満の場合、すべての整数と商の追加の小数ビットを計算して、丸めを行います。返される剰余は完全な剰余であり、除数の大きさの 2 分の 1 以下です。
指数の差が 64 以上の場合、32 から 63 までの番号を持つ整数商ビットのサブセットのみを計算し、部分剰余を返し、C2 条件コードビットを 1 に設定します。丸め制御は効果がありません。

FPREM1 の結果は正確です。
C0
商のビット 2 の値と等しくなる
C1
フォルトなしの場合、商のビット 0 の値と等しくなる。
0 = スタックフォルト時、スタックアンダーフロー。
C2
0 = FPREM1 は部分剰余を生成した。
1 = ソースオペランドの差異が 2^64 倍を超えているため、結果は不完全。
C3
商のビット 1 の値と等しくなる
FSCALE | D9 FD | ST(0) * 2^ST(1) -> ST(0)
ST(0) と、2 の ST(1) 乗を乗算し、結果を ST(0) に格納します。

通常は、ST(0) の指数に ST(1) の整数値を加算するだけであり、仮数部には影響を与えません。
ただし、ST(0) の値が非正規化値の場合は、仮数部も変更され、結果は、正規化された数値になる可能性があります。
同様に、演算の結果として、オーバーフローまたはアンダーフローが発生した場合、結果の値の仮数部は、ソースの仮数部とは異なります。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
F2XM1 | D9 F0 | 2^ST(0) - 1 -> ST(0)
2 を、ST(0) で指定された値で累乗して、そこから 1 を減算し、結果を ST(0) に格納します。

ソース値は -1.0 〜 +1.0 の範囲内である必要があります。範囲外の場合、結果は未定義です。

FYL2X 命令と組み合わせて使用すると、対数プロパティ x^y = 2^(y*log2x) を利用して、z = x^y を計算するために適用できます。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FSQRT | D9 FA | sqrt(ST(0)) -> ST(0)
ST(0) の値の平方根を計算し、結果を ST(0) に格納します。
+∞ の平方根では、+∞ が返されます。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FCOS | D9 FF | cos(ST(0)) -> ST(0)
ST(0) のラジアン値のコサインを計算し、結果を ST(0) に保存します。

ラジアン値が -2^63 〜 +2^63 の有効範囲外にある場合、x87 ステータスワードの C2 フラグを 1 に設定して、値が範囲外であることを示し、ST(0) の値は変更しません。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
C2
0 = ラジアン値は範囲内。1 = ラジアン値は範囲外。
FSIN | D9 FE | sin(ST(0)) -> ST(0)
ST(0) のラジアン値の正弦 (sin) を計算し、結果を ST(0) に保存します。

ラジアン値が -2^63 〜 +2^63 の有効範囲外にある場合、x87 ステータスワードの C2 フラグを 1 に設定して、値が範囲外であることを示し、ST(0) の値は変更しません。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
C2
0 = ラジアン値は範囲内。1 = ラジアン値は範囲外。
FSINCOS | D9 FB
ST(0) の値のサインとコサインを計算し、サインを ST(0) に保存し、コサインをレジスタスタックにプッシュします。

ラジアン値が -2^63 〜 +2^63 の有効範囲外にある場合、x87 ステータスワードの C2 フラグを 1 に設定して、値が範囲外であることを示し、ST(0) の値は変更しません。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、ST(1) の結果は切り捨て。
1 = 精度例外時、ST(1) の結果は切り上げ。
C2
0 = ラジアン値は範囲内。1 = ラジアン値は範囲外。
FPTAN | D9 F2 | tan(ST(0)) -> ST(0)
ST(0) のラジアン値の正接を計算し、結果を ST(0) に保存して、値 1.0 をレジスタスタックにプッシュします。

ソース値は -2^63 〜 +2^63 のラジアン単位である必要があります。
ソース値が範囲外の場合、x87 ステータスワードの C2 ビットを 1 に設定し、ST(0) の値を変更しません。
C1
0 = スタックフォルト時、スタックアンダーフロー。
1 = スタックフォルト時、スタックオーバーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
C2
0 = ラジアン値は範囲内。1 = ラジアン値は範囲外。
FPATAN | D9 F3 | arctan(ST(1)/ST(0)) -> ST(1) & POP
ST(1) の縦座標 (Y) を、ST(0) の横座標 (X) で割った逆正接を計算し、結果を ST(1) に保存して、レジスタスタックをポップします。
結果の値は、縦座標値と同じ符号を持ち、大きさは π 以下です。

FPATAN が受け入れることができる値の範囲に制限はありません。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FYL2X | D9 F1
ST(1) * log2(ST(0)) を計算し、結果を ST(1) に格納して、レジスタスタックをポップします。

ST(0) の値は、ゼロより大きくなければなりません。

ゼロ除算例外マスク (ZM) ビットが 1 に設定されており、ST(0) が ±0 の場合、ST(1) の値と逆の符号を付けた無限大を返します。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FYL2XP1 | D9 F9
ST(1) * log2(ST(0) + 1.0) を計算し、結果を ST(1) に保存して、レジスタスタックをポップします。

ST(0) の値は、sqrt(1/2)-1 から sqrt(2)-1 の範囲内である必要があります。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
比較
FCOM            | D8 D1   | ST(0), ST(1)
FCOM ST(i)      | D8 D0+i | ST(0), ST(i)
FCOM mem32real  | D8 /2   | ST(0), mem32real
FCOM mem64real  | DC /2   | ST(0), mem64real

FCOMP           | D8 D9
FCOMP ST(i)     | D8 D8+i
FCOMP mem32real | D8 /3
FCOMP mem64real | DC /3

FCOMPP          | DE D9   | ST(0), ST(1) & POPx2
指定された値を、ST(0) の値と比較し、ステータスワードの C0、C2、C3 に、条件コードフラグを設定します。

C3 C2 C1 C0
 0  0  0  0 | ST(0) > source
 0  0  0  1 | ST(0) < source
 1  0  0  0 | ST(0) = source
 1  1  0  1 | 順序なし

オペランドのない形式では、ST(1) と ST(0) の値が比較されます。

比較演算では、ゼロの値の符号は無視されます (-0.0 = +0.0)。

比較演算の実行後、FCOMP 命令はレジスタスタックをポップし、FCOMPP 命令はレジスタスタックを 2 回ポップします。

比較された値の一方または両方が NaN であるか、サポートされていない形式である場合、無効操作例外 (IE) ビットを 1 に設定し、条件フラグを「順序なし」に設定します。
FUCOMx 命令は FCOMx 命令と同じ操作を実行しますが、QNaN の IE ビットは設定しません。
FUCOM        | DD E1   | ST(0), ST(1)
FUCOM ST(i)  | DD E0+i | ST(0), ST(i)

FUCOMP       | DD E9
FUCOMP ST(i) | DD E8+i

FUCOMPP      | DA E9
ST(0) の値を、別の x87 レジスタの値と比較し、ステータスワードに条件コードを設定します。

C3 C2 C1 C0
 0  0  0  0 | ST(0) > source
 0  0  0  1 | ST(0) < source
 1  0  0  0 | ST(0) = source
 1  1  0  1 | 順序なし

比較を行った後、FUCOMP 命令はスタックレジスタをポップし、FUCOMPP 命令はスタックレジスタを 2 回ポップします。

この命令は FCOM 命令と同じ比較演算を実行しますが、一方または両方のオペランドが SNaN であるか、サポートされていない形式である場合、無効演算例外 (IE) ビットを 1 に設定します。
いずれかまたは両方のオペランドが QNaN の場合、条件コードフラグは順序なしに設定されますが、IE ビットは設定されません。

FCOM 命令は、オペランドの一方または両方が NaN 値であるか、サポートされていない形式である場合に、IE 例外を発生させます。
FCOMI ST(0),ST(i)  | DB F0+i
FCOMIP ST(0),ST(i) | DF F0+i
ST(0) の値と、2つ目の浮動小数点レジスタの値を比較し、その結果に基づいて、rFLAGS レジスタの ZF, PF, CF を設定します。

ZF PF CF
 0  0  0 | ST(0) > source
 0  0  1 | ST(0) < source
 1  0  0 | ST(0) = source
 1  1  1 | 順序なし

FCOMIP は、比較後、レジスタスタックをポップします。

比較された値の一方または両方が NaN であるか、サポートされていない形式である場合、無効操作例外 (IE) ビットを 1 に設定し、フラグを「順序なし」に設定します。
FUCOMIx 命令は FCOMIx 命令と同じ操作を実行しますが、QNaN の IE ビットは設定しません。
C1
0 = スタックフォルト時、スタックアンダーフロー。
FUCOMI ST(0),ST(i)  | DB E8+i
FUCOMIP ST(0),ST(i) | DF E8+i
ST(0) の内容を、別のレジスタの内容と比較し、その結果に基づいて、rFLAGS レジスタの ZF, PF, CF を設定します。
FUCOMIP はレジスタスタックをポップします。

FCOMI, FCOMIP とは異なり、QNaN の場合、無効操作例外 (IE) ビットを設定しません。
C1
C1 = 0
FICOM mem16int  | DE /2
FICOM mem32int  | DA /2

FICOMP mem16int | DE /3
FICOMP mem32int | DA /3
16/32bit の符号付き整数値を拡張倍精度形式に変換し、それを ST(0) の値と比較して、C0、C2、C3 条件コードフラグを設定します。

C3 C2 C1 C0
 0  0  0  0 | ST(0) > source
 0  0  0  1 | ST(0) < source
 1  0  0  0 | ST(0) = source
 1  1  0  1 | 順序なし

比較演算では、ゼロの符号は無視されます (-0.0 = +0.0)。
比較演算の実行後、FICOMP 命令はレジスタスタックをポップします。

ST(0) が NaN であるか、サポートされていない形式である場合、条件フラグを「順序なし」に設定します。
FTST | D9 E4
ST(0) の値を 0.0 と比較し、条件コードフラグを設定します。
この命令は、-0.0 と +0.0 の符号の区別を無視します。

C3 C2 C1 C0
 0  0  0  0 | ST(0) > 0.0
 0  0  0  1 | ST(0) < 0.0
 1  0  0  0 | ST(0) = 0.0
 1  1  0  1 | 順序なし
FXAM | D9 E5
ST(0) の値の表現タイプを調べて、C0、C2、C3 条件コードフラグを設定します。

ST(0) の値の符号を示すために、C1 フラグも設定します (0 = 正、1 = 負)。

C3 C2 C0
 0  0  0 | サポートしていない形式
 0  0  1 | NaN
 0  1  0 | 通常の有限値
 0  1  1 | 無限
 1  0  0 | 0
 1  0  1 | 空
 1  1  0 | 非正規化
状態
FINIT  | 9B DB E3 | WAIT & FNINIT
FNINIT | DB E3
コントロールワードレジスタ、ステータスワードレジスタ、タグワードレジスタ、命令ポインタ、データポインタを、デフォルトの状態に設定します。

  • コントロールワードを 037Fh に設定。
    (RC = 00b, PC = 11b, すべての例外をマスク)
  • ステータスワードのすべてのビットをクリアします。
    (TOP = 0 となり、ST(0) が FPR0 にマップされる)
  • タグレジスタ内のすべての x87 レジスタを、空 (11b) に指定します。
  • 命令ポインタとデータポインタをクリアします。

x87 データレジスタの値はゼロに設定されません。

WAIT (9Bh) 命令は、保留中の x87 例外をチェックし、必要に応じて例外ハンドラを呼び出します。
FFREE ST(i) | DD C0+i
指定された x87 レジスタのタグレジスタ値を、空 (11b) として設定することにより、レジスタを解放します。
実際のレジスタの内容は変更されず、TOP も変更はされません。
FINCSTP | D9 F7
ステータスワードの TOP をインクリメントします。
TOP フィールドが 7 の場合は、0 になります。

データレジスタの内容とタグレジスタの内容は変更されないため、レジスタをポップすることと同じではありません。
C1
C1 = 0
FDECSTP | D9 F6
ステータスワードの TOP をデクリメントします。
TOP フィールドが 0 の場合は、7 になります。
C1
C1 = 0
FCLEX  | 9B DB E2 | WAIT + FNCLEX
FNCLEX | DB E2
ステータスワード内の次のフラグをクリアします。

  • 例外フラグ (PE、UE、OE、ZE、DE、IE)
  • スタックフォルトフラグ (SF)
  • 例外サマリステータスフラグ (ES)
  • ビジーフラグ (B)

C0〜C3 は未定義になります。

FNCLEX 命令は、フラグをクリアする前に、浮動小数点例外の可能性をチェックしません。
FSTSW AX       | 9B DF E0 | WAIT
FNSTSW AX      | DF E0

FSTSW mem2env  | 9B DD /7 | WAIT
FNSTSW mem2env | DD /7
ステータスワードレジスタの現在の値を、AX レジスタ、または、指定された 2 byte のメモリ位置に保存します。

AX レジスタに配置されるステータスワードのイメージは、常に、前の x87 命令の実行後の結果を反映します。

FNSTSW 命令は、x87 ステータスワードを保存する前に、浮動小数点例外の可能性をチェックしません。
WAIT (9Bh) 命令は、保留中の x87 例外をチェックし、必要に応じて例外ハンドラを呼び出します。
FSTCW mem2env  | 9B D9 /7 | WAIT
FNSTCW mem2env | D9 /7
コントロールワードの値を、指定された 2 byte のメモリ位置に保存します。

FNSTCW 命令は、浮動小数点例外の可能性をチェックしません。
WAIT (9Bh) 命令は、保留中の x87 例外をチェックし、必要に応じて例外ハンドラを呼び出します。
FLDCW mem2env | D9 /5
指定されたメモリ位置から、16bit 値をコントロールワードにロードします。

新しいコントロールワードが、保留中の浮動小数点例外のマスクを解除した場合、それらは、次の x87 または 64bit メディア命令の実行時に処理されます。
新しいコントロールワードをロードするときに、例外が生成されるのを回避するには、FCLEX or FNCLEX 命令を使用して、保留中の例外をクリアします。
FSTENV mem14/28env  | 9B D9 /6 | WAIT
FNSTENV mem14/28env | D9 /6
現在の x87 環境を、指定されたアドレスから始まるメモリに保存し、すべての浮動小数点例外をマスクします。

x87 環境は、コントロール、ステータス、タグワードレジスタ、最後の非制御 x87 命令のポインタ、最後の x87 データポインタ、最後に実行した非制御 x87 命令のオペコードで構成されます。

16bit のオペランドサイズでは、14 byte。32/64bit のオペランドサイズでは、28 byte のメモリ領域が必要です。
保存された x87 環境のレイアウトは、プロセッサがプロテクトモードで動作しているか、リアルモードで動作しているかによって異なります。
※FSTENV は、完全な 64bit データと命令ポインタを保存しないため、64bit アプリケーションでは、FSTENV/FLDENV ではなく、FXSAVE/FXRSTOR を使用する必要があります。

FNSTENV 命令は、環境を保存する前に浮動小数点例外の可能性をチェックしません。
WAIT (9Bh) 命令は、保留中の x87 例外をチェックし、必要に応じて例外ハンドラを呼び出します。

例外ハンドラは、x87 命令およびデータポインタへのアクセスを提供するため、これらの命令をよく使用します。
通常、例外ハンドラは、環境をスタックに保存します。
この命令は、環境を保存した後に、すべての浮動小数点例外をマスクして、それらの例外が例外ハンドラを中断するのを防ぎます。
FLDENV mem14/28env | D9 /4
指定されたアドレスで始まるメモリから、x87 環境を復元します。

ロードされる環境は通常、前の FNSTENV または FSTENV 命令によって保存されます。
FLDENV 命令は、x87 環境を保存した命令と同じ動作モードで実行する必要があります。

FLDENV の結果、ロードされたステータスワードレジスタに例外フラグが設定されており、これらの例外がコントロールワードレジスタでマスク解除される場合、次の浮動小数点命令が実行されるときに、浮動小数点例外が発生します。
新しい環境をロードするときに、例外が生成されないようにするには、その環境を保存する前に、FCLEX または FNCLEX 命令を使用して、ステータスワードの例外フラグをクリアします。
FSAVE mem94/108env  | 9B DD /6 | WAIT
FNSAVE mem94/108env | DD /6
完全な x87 状態を指定メモリに保存した後、x87 状態を、FINIT と同じ状態に初期化します。

16bit のオペランドサイズでは、94 byte。32/64bit のオペランドサイズでは、108 byte のメモリ領域が必要です。
保存された x87 状態のレイアウトは、プロセッサがプロテクトモードで動作しているか、リアルモードで動作しているかによって異なります。
※FSAVE は完全な 64bit データと命令ポインタを保存しないため、64bit アプリケーションでは、FSAVE/FRSTOR ではなく、FXSAVE/FXRSTOR を使用する必要があります。

MMX レジスタは、x87 浮動小数点レジスタの下位 64bit にマップされているため、この操作により MMX 状態も保存されます。

FNSAVE 命令は、保留中のマスクされていない x87 浮動小数点例外の処理を待ちません。
WAIT (9Bh) 命令は、保留中の x87 例外をチェックし、必要に応じて例外ハンドラを呼び出します。
FRSTOR mem94/108env | DD /4
以前の F(N)SAVE 呼び出しによって保存されたメモリの内容から、完全な x87 状態を復元します。
MMX レジスタは、x87 浮動小数点レジスタの下位 64bit にマップされているため、この操作により MMX 状態も復元されます。

FRSTOR の結果、ロードされたステータスワードレジスタに例外フラグが設定されており、これらの例外が、コントロールワードレジスタでマスク解除される場合、次の浮動小数点命令が実行されるときに、浮動小数点例外が発生します。
新しい環境をロードするときに例外が生成されないようにするには、その環境を保存する前に、FCLEX または FNCLEX 命令を使用して、ステータスワードの例外フラグをクリアします。
ほか
FNOP | D9 D0
何も操作しません。
この命令は、rIP レジスタにのみ影響します。
FWAIT | 9B
続行する前に、プロセッサに、保留中の、マスクされていない浮動小数点例外のテストを強制します。

保留中の浮動小数点例外があり、CR0.NE = 1 の場合、数値例外 (#MF) が生成されます。
保留中の浮動小数点例外があり、CR0.NE = 0 の場合、FWAIT は FERR 出力信号をアサートし、外部割り込みを待ちます。

この命令は、浮動小数点命令の結果を変更する前に、マスクされていない浮動小数点例外が確実に処理されるようにするのに役立ちます。
FWAIT と WAIT は、同じオペコードの同義語です。