レジスタに値をロード | |
FLDZ | +0.0 の値をプッシュ |
---|---|
FLD1 | +1.0 の値をプッシュ |
FLDL2E FLDL2T FLDLG2 FLDLN2 FLDPI | 各定数値をプッシュ |
FLD | 浮動小数点数をプッシュ |
FILD | 整数からプッシュ |
FBLD | パックBCD整数値からプッシュ |
値のコピー | |
FST FSTP | ST(0) の値をコピー |
FIST FISTP | 整数に変換してメモリにコピー |
FISTTP | 整数に変換してメモリにコピー (切り捨て) |
FBSTP | ST(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) |
FSCALE | ST(0) に 2^x を乗算 |
F2XM1 | 2^x-1 |
FSQRT | 平方根 |
FCOS | COS |
FSIN | SIN |
FSINCOS | SIN と COS |
FPTAN | 正接 (tan) |
FPATAN | 逆正接 (atan) |
FYL2X | y * Log2(x) |
FYL2XP1 | y * Log2(x+1) |
比較 | |
FCOM FCOMP FCOMPP | 比較 |
FUCOM FUCOMP FUCOMPP | 比較 (例外の違い) |
FCOMI FCOMIP | 比較と rFLAGS の設定 |
FUCOMI FUCOMIP | 比較と rFLAGS の設定 |
FICOM FICOMP | 整数と比較 |
FTST | ST(0) と 0.0 の比較 |
FXAM | 浮動小数点の値の検査 |
状態 | |
FINIT FNINIT | 初期化 |
FFREE | 指定レジスタを解放 |
FINCSTP | TOP をインクリメント |
FDECSTP | TOP をデクリメント |
FCLEX FNCLEX | ステータスワードのフラグをクリア |
FSTSW FNSTSW | スターテスワードの値を AX かメモリに保存 |
FSTCW FNSTCW | コントロールワードの値をメモリに保存 |
FLDCW | メモリの値をコントロールワードにロード |
FSTENV FNSTENV | x87 環境をメモリに保存 |
FLDENV | メモリから x87 環境を復元 |
FSAVE FNSAVE | x87 & MMX 状態の保存と初期化 |
FRSTOR | x87 & MMX 状態の復元 |
ほか | |
FNOP | 何もしない |
FWAIT WAIT | マスクされていない x87 浮動小数点例外を待つ |
レジスタに値をロード
FLDL2E | D9 EA | log2e FLDL2T | D9 E9 | log2e 10 FLDLG2 | D9 EC | log10 2 FLDLN2 | D9 ED | loge 2 FLDPI | D9 EB | π
各定数値を、レジスタスタックにプッシュします。
内部の 66bit 定数は、RC の設定によって、拡張倍精度で丸められます。
内部の 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 = スタックフォルト時、スタックオーバーフロー。
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 の範囲内である必要があります。
無効な桁がある場合、未定義の結果が生成されます。
ソースの符号は保持されます。
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 の場合、仮数部と指数の最下位ビットを切り捨てます。
FSTP 命令は、値をコピーした後に、レジスタスタックをポップします。
FSTP ST(0) は、データ転送を行わずに、レジスタスタックをポップするのと同じです。
宛先が単精度または倍精度のメモリ位置である場合、RC の丸めモードによって、仮数部を丸め、適切な精度形式に変換します。
値が宛先フォーマットに対して大きすぎる場合、オーバーフロー例外 (OE) ビットを設定します。
その後、オーバーフロー例外がマスク解除されている場合 (OM ビットが 0) は、コピーを実行しません。
値が非正規化数の場合、アンダーフロー例外 (UE) ビットを設定します。
値が ±0、±∞、NaN の場合、仮数部と指数の最下位ビットを切り捨てます。
C1
0 = スタックフォルト時、スタックアンダーフロー。
1 = スタックフォルト時、スタックオーバーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
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) 場合、値は格納されません。
FISTP 命令は、値をメモリに格納した後、スタックをポップします。
宛先に対して値が大きすぎる場合や、NaN である場合、サポートされていない形式である場合は、無効操作例外 (IE) ビットを 1 に設定します。
その後、例外がマスクされている場合 (IM ビットが 1)、不定の整数値が格納されます。
例外がマスクされていない (IM ビットが 0) 場合、値は格納されません。
C1
0 = 精度例外なし。
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FISTTP mem16int | DF /1 FISTTP mem32int | DB /1 FISTTP mem64int | DD /1
ST(0) の値の小数部分を切り捨てて、整数に変換した結果をメモリにコピーし、レジスタスタックをポップします。
FISTTP 命令は、丸めモードを無視します。
CPUID(SSE3): 0000_0001h > ECX(bit0)
FISTTP 命令は、丸めモードを無視します。
CPUID(SSE3): 0000_0001h > ECX(bit0)
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 結果は切り捨て (常に切り捨てられる)
0 = 結果は切り捨て (常に切り捨てられる)
FBSTP mem80dec | DF /6
ST(0) の値を、18 桁のパック BCD 値に変換して、結果を指定されたメモリ位置に格納し、レジスタスタックをポップします。
結果の 10 byte の、最初のバイトのメモリアドレスを指定します。
結果は、RC の丸めモードに応じて、整数値に丸められます。
結果の 10 byte の、最初のバイトのメモリアドレスを指定します。
結果は、RC の丸めモードに応じて、整数値に丸められます。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
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 には含まれている)
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) に値を移動します。
この命令を使用して、ST(0) でのみ動作する後続の処理のために、x87 レジスタから ST(0) に値を移動します。
C1
C1 = 0
変換
FCHS | D9 E0
ST(0) の符号ビットを反転させ、値を負から正、またはその逆に変更します。
この演算は、正と負の浮動小数点値、-0 と +0、NaN、+∞ と -∞ に適用されます。
この演算は、正と負の浮動小数点値、-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 に設定します。
ST(0) の初期値が ∞ の場合、ST(0) を変更しません。
ST(0) の値が整数でない場合は、精度例外 (PE) ビットを 1 に設定します。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FXTRACT | D9 F4
ST(0) 内の、浮動小数点値の指数部と仮数部を抽出し、指数を ST(0) に格納してから、仮数部をレジスタスタックにプッシュします。
この演算の後、新しい ST(0) には、元の仮数部の符号と値、3FFFh の指数を持つ実数が含まれ、ST(1) には、元の値の指数値が含まれます。
FXTRACT 命令は、拡張倍精度数値を、10 進表現に変換するのに役立ちます。
ゼロ除算例外マスク (ZM) ビットが 1 に設定されており、ソース値が ±0 の場合、ST(0) に ±0 を格納し、ST(1) に指数値 -∞ を格納します。
この演算の後、新しい ST(0) には、元の仮数部の符号と値、3FFFh の指数を持つ実数が含まれ、ST(1) には、元の値の指数値が含まれます。
FXTRACT 命令は、拡張倍精度数値を、10 進表現に変換するのに役立ちます。
ゼロ除算例外マスク (ZM) ビットが 1 に設定されており、ソース値が ±0 の場合、ST(0) に ±0 を格納し、ST(1) に指数値 -∞ を格納します。
C1
0 = スタックフォルト時、スタックアンダーフロー。
1 = スタックフォルト時、スタックオーバーフロー。
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) に加算します。
FADDP 命令は、ST(0) の値を、別のレジスタに加算し、レジスタスタックをポップします。
オペランドが指定されていない場合、FADDP ST(1),ST(0) になります。
FIADD 命令は、メモリ位置から 16/32bit の符号付き整数値を読み込み、拡張倍精度実数形式に変換した後、ST(0) に加算します。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
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 命令は、減算を実行する前に、符号付き整数値を拡張倍精度形式に変換します。
FSUBP 命令は、減算の実行後にレジスタスタックをポップします。
一部のアセンブラでは、この命令のニーモニックは FSUBP ではなく FSUB です。
FISUB 命令は、減算を実行する前に、符号付き整数値を拡張倍精度形式に変換します。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
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 = 精度例外時、結果は切り上げ。
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) 場合は、ゼロ除算例外により、±∞ が格納されます。
FIDIV 命令の場合は、整数 0 は +0 として扱います。
オペランドの一方が 0 であっても、オペランドの符号によって、結果の符号が決まります。
ゼロ除算例外がマスクされておらず (ZM ビットが 0)、ゼロ除算例外が発生する (ZE ビットが 1) 場合、結果を格納しません。
ゼロ除算例外がマスクされている (ZM ビットが 1) 場合は、ゼロ除算例外により、±∞ が格納されます。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
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 = 精度例外時、結果は切り上げ。
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 による部分剰余を計算しません。
反復ごとに 1 つの商ビットが計算される、反復減算シフト長除算アルゴリズムによって、剰余を計算します。
ST(0) と ST(1) の指数の差が 64 未満の場合、商のすべての整数ビットを計算し、剰余の大きさが ST(1) の除数より小さいことを保証します。
指数の差が 64 以上の場合、32 から 63 までの番号を持つ整数商ビットのサブセットのみを計算し、部分剰余を返し、C2 条件コードビットを 1 に設定します。
FPREM1 命令とは異なり、IEEE 標準 754 による部分剰余を計算しません。
C0
商のビット 2 の値と等しくなる
C1
フォルトなしの場合、商のビット 0 の値と等しくなる。
0 = スタックフォルト時、スタックアンダーフロー。
0 = スタックフォルト時、スタックアンダーフロー。
C2
0 = FPREM は部分剰余を生成した。
1 = ソースオペランドの差異が 2^64 倍を超えているため、結果は不完全。
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 の結果は正確です。
FPREM とは異なり、整数商を、最も近い偶数の整数に丸め、丸められた商の逆乗算に対応する剰余を返します。
ST(0) と ST(1) の指数の差が 64 未満の場合、すべての整数と商の追加の小数ビットを計算して、丸めを行います。返される剰余は完全な剰余であり、除数の大きさの 2 分の 1 以下です。
指数の差が 64 以上の場合、32 から 63 までの番号を持つ整数商ビットのサブセットのみを計算し、部分剰余を返し、C2 条件コードビットを 1 に設定します。丸め制御は効果がありません。
FPREM1 の結果は正確です。
C0
商のビット 2 の値と等しくなる
C1
フォルトなしの場合、商のビット 0 の値と等しくなる。
0 = スタックフォルト時、スタックアンダーフロー。
0 = スタックフォルト時、スタックアンダーフロー。
C2
0 = FPREM1 は部分剰余を生成した。
1 = ソースオペランドの差異が 2^64 倍を超えているため、結果は不完全。
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) の値が非正規化値の場合は、仮数部も変更され、結果は、正規化された数値になる可能性があります。
同様に、演算の結果として、オーバーフローまたはアンダーフローが発生した場合、結果の値の仮数部は、ソースの仮数部とは異なります。
通常は、ST(0) の指数に ST(1) の整数値を加算するだけであり、仮数部には影響を与えません。
ただし、ST(0) の値が非正規化値の場合は、仮数部も変更され、結果は、正規化された数値になる可能性があります。
同様に、演算の結果として、オーバーフローまたはアンダーフローが発生した場合、結果の値の仮数部は、ソースの仮数部とは異なります。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
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 を計算するために適用できます。
ソース値は -1.0 〜 +1.0 の範囲内である必要があります。範囲外の場合、結果は未定義です。
FYL2X 命令と組み合わせて使用すると、対数プロパティ x^y = 2^(y*log2x) を利用して、z = x^y を計算するために適用できます。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FSQRT | D9 FA | sqrt(ST(0)) -> ST(0)
ST(0) の値の平方根を計算し、結果を ST(0) に格納します。
+∞ の平方根では、+∞ が返されます。
+∞ の平方根では、+∞ が返されます。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FCOS | D9 FF | cos(ST(0)) -> ST(0)
ST(0) のラジアン値のコサインを計算し、結果を ST(0) に保存します。
ラジアン値が -2^63 〜 +2^63 の有効範囲外にある場合、x87 ステータスワードの C2 フラグを 1 に設定して、値が範囲外であることを示し、ST(0) の値は変更しません。
ラジアン値が -2^63 〜 +2^63 の有効範囲外にある場合、x87 ステータスワードの C2 フラグを 1 に設定して、値が範囲外であることを示し、ST(0) の値は変更しません。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
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) の値は変更しません。
ラジアン値が -2^63 〜 +2^63 の有効範囲外にある場合、x87 ステータスワードの C2 フラグを 1 に設定して、値が範囲外であることを示し、ST(0) の値は変更しません。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
C2
0 = ラジアン値は範囲内。1 = ラジアン値は範囲外。
FSINCOS | D9 FB
ST(0) の値のサインとコサインを計算し、サインを ST(0) に保存し、コサインをレジスタスタックにプッシュします。
ラジアン値が -2^63 〜 +2^63 の有効範囲外にある場合、x87 ステータスワードの C2 フラグを 1 に設定して、値が範囲外であることを示し、ST(0) の値は変更しません。
ラジアン値が -2^63 〜 +2^63 の有効範囲外にある場合、x87 ステータスワードの C2 フラグを 1 に設定して、値が範囲外であることを示し、ST(0) の値は変更しません。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、ST(1) の結果は切り捨て。
1 = 精度例外時、ST(1) の結果は切り上げ。
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) の値を変更しません。
ソース値は -2^63 〜 +2^63 のラジアン単位である必要があります。
ソース値が範囲外の場合、x87 ステータスワードの C2 ビットを 1 に設定し、ST(0) の値を変更しません。
C1
0 = スタックフォルト時、スタックアンダーフロー。
1 = スタックフォルト時、スタックオーバーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
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 が受け入れることができる値の範囲に制限はありません。
結果の値は、縦座標値と同じ符号を持ち、大きさは π 以下です。
FPATAN が受け入れることができる値の範囲に制限はありません。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FYL2X | D9 F1
ST(1) * log2(ST(0)) を計算し、結果を ST(1) に格納して、レジスタスタックをポップします。
ST(0) の値は、ゼロより大きくなければなりません。
ゼロ除算例外マスク (ZM) ビットが 1 に設定されており、ST(0) が ±0 の場合、ST(1) の値と逆の符号を付けた無限大を返します。
ST(0) の値は、ゼロより大きくなければなりません。
ゼロ除算例外マスク (ZM) ビットが 1 に設定されており、ST(0) が ±0 の場合、ST(1) の値と逆の符号を付けた無限大を返します。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
FYL2XP1 | D9 F9
ST(1) * log2(ST(0) + 1.0) を計算し、結果を ST(1) に保存して、レジスタスタックをポップします。
ST(0) の値は、sqrt(1/2)-1 から sqrt(2)-1 の範囲内である必要があります。
ST(0) の値は、sqrt(1/2)-1 から sqrt(2)-1 の範囲内である必要があります。
C1
0 = スタックフォルト時、スタックアンダーフロー。
0 = 精度例外時、結果は切り捨て。
1 = 精度例外時、結果は切り上げ。
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 に、条件コードフラグを設定します。
オペランドのない形式では、ST(1) と ST(0) の値が比較されます。
比較演算では、ゼロの値の符号は無視されます (-0.0 = +0.0)。
比較演算の実行後、FCOMP 命令はレジスタスタックをポップし、FCOMPP 命令はレジスタスタックを 2 回ポップします。
比較された値の一方または両方が NaN であるか、サポートされていない形式である場合、無効操作例外 (IE) ビットを 1 に設定し、条件フラグを「順序なし」に設定します。
FUCOMx 命令は FCOMx 命令と同じ操作を実行しますが、QNaN の IE ビットは設定しません。
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 レジスタの値と比較し、ステータスワードに条件コードを設定します。
比較を行った後、FUCOMP 命令はスタックレジスタをポップし、FUCOMPP 命令はスタックレジスタを 2 回ポップします。
この命令は FCOM 命令と同じ比較演算を実行しますが、一方または両方のオペランドが SNaN であるか、サポートされていない形式である場合、無効演算例外 (IE) ビットを 1 に設定します。
いずれかまたは両方のオペランドが QNaN の場合、条件コードフラグは順序なしに設定されますが、IE ビットは設定されません。
FCOM 命令は、オペランドの一方または両方が NaN 値であるか、サポートされていない形式である場合に、IE 例外を発生させます。
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 を設定します。
FCOMIP は、比較後、レジスタスタックをポップします。
比較された値の一方または両方が NaN であるか、サポートされていない形式である場合、無効操作例外 (IE) ビットを 1 に設定し、フラグを「順序なし」に設定します。
FUCOMIx 命令は FCOMIx 命令と同じ操作を実行しますが、QNaN の IE ビットは設定しません。
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) ビットを設定しません。
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 条件コードフラグを設定します。
比較演算では、ゼロの符号は無視されます (-0.0 = +0.0)。
比較演算の実行後、FICOMP 命令はレジスタスタックをポップします。
ST(0) が NaN であるか、サポートされていない形式である場合、条件フラグを「順序なし」に設定します。
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 の符号の区別を無視します。
この命令は、-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 = 負)。
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
コントロールワードレジスタ、ステータスワードレジスタ、タグワードレジスタ、命令ポインタ、データポインタを、デフォルトの状態に設定します。
x87 データレジスタの値はゼロに設定されません。
WAIT (9Bh) 命令は、保留中の x87 例外をチェックし、必要に応じて例外ハンドラを呼び出します。
- コントロールワードを 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 も変更はされません。
実際のレジスタの内容は変更されず、TOP も変更はされません。
FINCSTP | D9 F7
ステータスワードの TOP をインクリメントします。
TOP フィールドが 7 の場合は、0 になります。
データレジスタの内容とタグレジスタの内容は変更されないため、レジスタをポップすることと同じではありません。
TOP フィールドが 7 の場合は、0 になります。
データレジスタの内容とタグレジスタの内容は変更されないため、レジスタをポップすることと同じではありません。
C1
C1 = 0
FCLEX | 9B DB E2 | WAIT + FNCLEX FNCLEX | DB E2
ステータスワード内の次のフラグをクリアします。
C0〜C3 は未定義になります。
FNCLEX 命令は、フラグをクリアする前に、浮動小数点例外の可能性をチェックしません。
- 例外フラグ (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 例外をチェックし、必要に応じて例外ハンドラを呼び出します。
AX レジスタに配置されるステータスワードのイメージは、常に、前の x87 命令の実行後の結果を反映します。
FNSTSW 命令は、x87 ステータスワードを保存する前に、浮動小数点例外の可能性をチェックしません。
WAIT (9Bh) 命令は、保留中の x87 例外をチェックし、必要に応じて例外ハンドラを呼び出します。
FSTCW mem2env | 9B D9 /7 | WAIT FNSTCW mem2env | D9 /7
コントロールワードの値を、指定された 2 byte のメモリ位置に保存します。
FNSTCW 命令は、浮動小数点例外の可能性をチェックしません。
WAIT (9Bh) 命令は、保留中の x87 例外をチェックし、必要に応じて例外ハンドラを呼び出します。
FNSTCW 命令は、浮動小数点例外の可能性をチェックしません。
WAIT (9Bh) 命令は、保留中の x87 例外をチェックし、必要に応じて例外ハンドラを呼び出します。
FLDCW mem2env | D9 /5
指定されたメモリ位置から、16bit 値をコントロールワードにロードします。
新しいコントロールワードが、保留中の浮動小数点例外のマスクを解除した場合、それらは、次の x87 または 64bit メディア命令の実行時に処理されます。
新しいコントロールワードをロードするときに、例外が生成されるのを回避するには、FCLEX or FNCLEX 命令を使用して、保留中の例外をクリアします。
新しいコントロールワードが、保留中の浮動小数点例外のマスクを解除した場合、それらは、次の 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 命令およびデータポインタへのアクセスを提供するため、これらの命令をよく使用します。
通常、例外ハンドラは、環境をスタックに保存します。
この命令は、環境を保存した後に、すべての浮動小数点例外をマスクして、それらの例外が例外ハンドラを中断するのを防ぎます。
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 命令を使用して、ステータスワードの例外フラグをクリアします。
ロードされる環境は通常、前の 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 例外をチェックし、必要に応じて例外ハンドラを呼び出します。
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 命令を使用して、ステータスワードの例外フラグをクリアします。
MMX レジスタは、x87 浮動小数点レジスタの下位 64bit にマップされているため、この操作により MMX 状態も復元されます。
FRSTOR の結果、ロードされたステータスワードレジスタに例外フラグが設定されており、これらの例外が、コントロールワードレジスタでマスク解除される場合、次の浮動小数点命令が実行されるときに、浮動小数点例外が発生します。
新しい環境をロードするときに例外が生成されないようにするには、その環境を保存する前に、FCLEX または FNCLEX 命令を使用して、ステータスワードの例外フラグをクリアします。
ほか