FCMOVは、 Intel x86アーキテクチャの浮動小数点条件付き移動オペコードであり、 Pentium Proプロセッサで初めて導入されました。この命令は、 EFLAGS整数フラグレジスタの内容に応じて、浮動小数点スタックレジスタの1つの内容をST(0)(スタックの先頭)レジスタにコピーします。この命令には、移動を実行するために設定する必要がある条件コードによって選択される8つのバリエーションがあります。
CMOV命令と同様に、FCMOVでは、通常の分岐オーバーヘッドなしでいくつかの条件付き操作を実行できます。 [ 1 ]ただし、条件分岐命令よりもレイテンシが高くなります。[ 2 ]したがって、単純だが予測できない比較や条件付き操作に最も役立ち、大幅なパフォーマンスの向上が得られます。
この命令は通常、FCOMI命令またはFCOM - FSTSW - SAHFイディオムと組み合わせて使用され、浮動小数点比較の結果に基づいて関連する条件コードを設定します。
変種
この表はFCMOV命令のバリエーションを示しています。[ 1 ]第1オペランドは常にST(0)レジスタ(浮動小数点スタックの先頭)です。オペコード列は2バイトのシーケンスを示しており、2バイト目は第2オペランドに使用する浮動小数点スタックレジスタの番号を示す基本値です。必要な数値を加算することで、対応するオペコード値を完成させます。
| オペコード | ニモニック | 意味 | 状態 |
|---|---|---|---|
| DA C0+i | FCMOVB | 下の場合移動 | キャリーフラグセット |
| DA C8+i | FCムーブ | 等しい場合は移動 | ゼロフラグセット |
| DA D0+i | FCMOVBE | 以下の場合または等しい場合移動 | キャリーフラグまたはゼロフラグがセットされている |
| DA D8+i | FCMOVU | 順序がない場合は移動する | パリティフラグセット |
| DB C0+i | FCMOVNB | 下回っている場合は移動 | キャリーフラグがクリアされました |
| DB C8+i | FCMOVNE | 等しくない場合は移動する | ゼロフラグがクリアされました |
| DB D0+i | FCMOVNBE | 以下または等しくない場合は移動 | キャリーフラグとゼロフラグがクリアされました |
| DB D8+i | FCMOVNU | 順序がない場合は移動する | パリティフラグがクリアされました |