x87は、 x86アーキテクチャ命令セットの浮動小数点関連のサブセットです。これは、対応するx86 CPUと連携して動作するオプションの浮動小数点コプロセッサ(FPU )の形で、8086命令セットの拡張として生まれました。これらのマイクロチップの名前は「87」で終わります。これはNPX(数値プロセッサ拡張)とも呼ばれます。基本命令セットの他の拡張と同様に、x87命令は厳密にはプログラムの構築に必要ではありませんが、一般的な数値タスクのハードウェアおよびマイクロコード実装を提供し、これらのタスクを対応するマシンコードルーチンよりもはるかに高速に実行できるようにします。x87命令セットには、加算、減算、比較などの基本的な浮動小数点演算の命令だけでなく、正接関数とその逆関数の計算などのより複雑な数値演算の命令も含まれています。
Intel 80486以降のほとんどのx86プロセッサは、これらのx87命令をメインCPUに実装していますが、この用語は今でも命令セットのその部分を指すために使用されることがあります。x87命令がPCの標準となる前は、コンパイラやプログラマーは浮動小数点演算を実行するために、かなり低速なライブラリ呼び出しを使用する必要がありました。この方法は、(低コストの)組み込みシステムでは今でも一般的に使用されています。
x87レジスタは、ST(0)からST(7)までの8階層の非厳密スタック構造を形成し、これらのレジスタは、どちらのオペランドからも、先頭からのオフセットを使用して直接アクセスでき、プッシュおよびポップも可能です。(この方式は、スタックフレームがプッシュ/ポップされ、インデックス付けされる様子に似ています。)
このスタックの先頭に値をプッシュ、計算、ポップする命令があります。単項演算(FSQRT、FPTAN など) は暗黙的に最上位の ST(0) をアドレス指定し、二項演算(FADD、FMUL、FCOM など) は暗黙的に ST(0) と ST(1) をアドレス指定します。非厳密スタック モデルでは、二項演算で ST(0) を直接メモリ オペランドと一緒に使用することも、明示的に指定されたスタック レジスタ ST( x )と一緒に使用して、従来のアキュムレータ(結合された宛先と左オペランド)と同様の役割を果たすこともできます。これは、ST(0) を変更されていないオペランド、ST( x )を宛先として使用して、命令ごとに逆にすることもできます。さらに、ST(0) の内容を、FXCH ST( x )という命令を使用して別のスタック レジスタと交換することもできます。
これらの特性により、x87 スタックは、7 つの自由にアドレス指定可能なレジスタと 1 つの専用アキュムレータ (または 7 つの独立したアキュムレータ) として使用できます。これは、特にスーパースカラx86 プロセッサ ( 1993 年以降のPentiumなど) に当てはまります。これらの交換命令 (コード D9C8..D9CF h ) は、FXCH ST( x ) の整数パスの 1 つを FPU 命令と並行して使用することで、クロック ペナルティがゼロになるまで最適化されます。人間のアセンブリ言語プログラマにとっては自然で便利ですが、一部のコンパイラ作成者は、x87 コードを効果的にスケジュールする自動コードジェネレータの構築が複雑であることに気付いています。このようなスタックベースのインターフェイスは、レジスタベースのインターフェイスと比較して、関数呼び出しでスクラッチ変数を保存する必要性を最小限に抑えることができます[ 1 ] (ただし、歴史的には、8087 実装の設計上の問題により、その可能性は制限されていました。[ 2 ] [ 3 ] )
x87 は、 IEEE 754-1985標準に従って、単精度、倍精度、80 ビットの拡張倍精度の 2 進浮動小数点演算を提供します。デフォルトでは、x87 プロセッサはすべて内部で 80 ビットの拡張倍精度を使用します (多くの計算で精度を維持できるようにするため、IEEE 754 の設計原理を参照)。したがって、特定の算術演算シーケンスは、厳密な単精度または倍精度の IEEE 754 FPU と比較してわずかに異なる動作をする可能性があります。[ 4 ]これは、正しい操作のために倍精度を前提として記述された一部の半数値計算では問題になる場合があるため、このような問題を回避するために、x87 は、特別な構成/ステータス レジスタを使用して、各演算の後に自動的に単精度または倍精度に丸めるように構成できます。SSE2の導入以来、 x87 命令は以前ほど重要ではなくなりましたが、丸め誤差の影響を受けやすく、80 ビット形式で利用可能な64 ビットの仮数精度と拡張範囲を必要とする数値計算用の高精度スカラー ユニットとして重要なままです。
典型的なx87 FPU命令の例のクロックサイクル数(ここではレジスタ間バージョンのみを示しています)。[ 5 ]
A ... B表記(最小値から最大値)は、パイプラインの過渡状態と選択された演算精度(32、64、または80ビット)に依存するタイミング変動をカバーします。また、数値ケース(セットビットの数、ゼロなど)による変動も含まれます。L → H 表記は、利用可能な最低(L)および最高(H)の最大クロック周波数に対応する値を表します。
| x87実装 | ファッド | FMUL | FDIV | FXCH | FCOM | 平方根平方根 | FPTAN | FPATAN | 最大クロック(MHz) | ピークFMUL (百万/秒) | FMUL § rel. 5 MHz 8087 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 8087 | 70…100 | 90…145 | 193…203 | 10…15 | 40…50 | 180…186 | 30…540 | 250…800 | 5 → 10 | 0.034…0.055 → 0.100…0.111 | 1 → 2倍の速さ |
| 80287(オリジナル) | 6 → 12 | 0.041…0.066 → 0.083…0.133 | 1.2 → 2.4× | ||||||||
| 80387(およびそれ以降の287モデル) | 23…34 | 29…57 | 88…91 | 18 | 24 | 122…129 | 191…497 | 314…487 | 16 → 33 | 0.280…0.552 → 0.580…1.1 | ~10 → 20× |
| 80486(または80487) | 8…20 | 16 | 73 | 4 | 4 | 83…87 | 200…273 | 218…303 | 16 → 50 | 1.0 → 3.1 | ~18 → 56× |
| サイリックス 6x86、サイリックス MII | 4…7 | 4…6 | 24…34 | 2 | 4 | 59…60 | 117…129 | 97…161 | 66 → 300 | 11…16 → 50…75 | ~320 → 1400× |
| AMD K6(K6 II/IIIを含む) | 2 | 2 | 21…41 | 2 | 3 | 21…41 | ? | ? | 166 → 550 | 83 → 275 | ~1500→5000× |
| ペンティアム/ペンティアムMMX | 1…3 | 1…3 | 39 | 1 (0*) | 1…4 | 70 | 17…173 | 19…134 | 60 → 300 | 20…60 → 100…300 | ~1100→5400× |
| ペンティアムプロ | 1…3 | 2…5 | 16…56 | 1 | 28…68 | ? | ? | 150 → 200 | 30…75 → 40…100 | ~1400→1800× | |
| ペンティアムII / III | 1…3 | 2…5 | 17…38 | 1 | 27…50 | ? | ? | 233 → 1400 | 47…116 → 280…700 | ~2100→13000× | |
| アスロン(K7) | 1…4 | 1…4 | 13…24 | 1…2 | 16…35 | ? | ? | 500 → 2330 | 125…500 → 580…2330 | ~9000→42000× | |
| アスロン 64 (K8) | 1000 → 3200 | 250…1000 → 800…3200 | 約18000→58000× | ||||||||
| ペンティアム4 | 1…5 | 2…7 | 20…43 | 複数サイクル | 1 | 20…43 | ? | ? | 1300 → 3800 | 186…650 → 543…1900 | 約11000 → 34000× |
Intel 8087以降のモデルと互換性のある浮動小数点ユニットを設計または製造した企業としては、AMD(287、387、486DX、5x86、K5 、 K6、K7、K8 )、 Chips and Technologies ( Super MATHコプロセッサ)、 Cyrix ( FasMath 、 Cx87SLC 、 Cx87DLCなど、6x86、Cyrix MII )、富士通(初期のPentium Mobileなど)、Harris Semiconductor ( 80387および486DXプロセッサを製造)、IBM(さまざまな387および486設計)、IDT(WinChip、C3、C7、Nanoなど)、IIT(2C87、3C87など)、LC Technology(Green MATHコプロセッサ)、National Semiconductor(Geode GX1、Geode GXmなど)、NexGen ( Nx587 )、Rise Technology ( mP6 )、ST Microelectronics ( 486DX、5x86などを製造)、Texas Instruments ( 486DXプロセッサなどを製造)、Transmeta ( TM5600およびTM5800 )、ULSI ( Math·Coコプロセッサ)、VIA ( C3、C7、Nanoなど)、Weitek ( 1067、1167、3167、4167 )、および Xtend ( 83S87SX-25およびその他のコプロセッサ)。
8087は、 Intelが設計した16ビットプロセッサ向けの最初の数値演算コプロセッサである。1980年にリリースされ、 Intel 8088または8086マイクロプロセッサと組み合わせられた。(Intelがi8080 CPU向けに販売していた初期の8231および8232浮動小数点プロセッサは、実際には1977年と1979年にAMDが開発したAm9511およびAm9512 FPUのライセンス版であった。[ 6 ])

1982年のオリジナルの80188と80186のデータシート( NMOSベース)には特定の数値演算コプロセッサについて言及されているようですが、 [ 7 ]どちらのチップも実際には8087とペアになっていました。
しかし、1987年、 CMOSベースのIntel 80C186 CPUの刷新に伴い、Intelは80C187 [ 8 ]という数値演算コプロセッサを発表しました。80C187のメインプロセッサへのインターフェースは8087と同じですが、コア部分は基本的に80387SXのものであり、IEEE 754に完全準拠しており、80387のすべての追加命令を実行できます。[ 9 ]
1982年に発売された80287 (i287 )は、Intel 80286シリーズマイクロプロセッサ用の数値演算コプロセッサである。Intelのモデルには、6MHzから12MHzまでの上限周波数を持つバリエーションが含まれていた。NMOSバージョンは6MHz、8MHz、10MHzで提供されていた。[ 10 ] 10MHz版のIntel 80287-10数値コプロセッサは、100個単位で250ドルで販売されていた。 [ 11 ] 80287、80287-8、80287-10のボックス版は、それぞれ212ドル、326ドル、374ドルで販売されていた。80C287Aのボックス版は457ドルで販売されていた。[ 12 ]
387 のようなパフォーマンスを持つ他の 287 モデルとしては、 CHMOS IIIを使用して構築された Intel 80C287と、完全に静的なゲートのみを使用して AMD のCMOSプロセスで製造された AMD 80EC287 があります。
その後、287ピン配置の387SXマイクロアーキテクチャを採用したi80287XLが登場した[ 13 ]。ラップトップ向けの特別版であるi80287XLTやその他の派生版も登場した。このモデルは3/2乗算器を内蔵しており、コプロセッサをCPUの2/3倍の速度で動作させるマザーボードでも、FPUをCPUと同じ速度で動作させることができた。80287XLと80287XLTはどちらも、性能が50%向上し、消費電力が83%削減され、命令数も増加した[ 14 ] 。
80287 は80386マイクロプロセッサと連携して動作し、1987 年に80387が導入されるまでは、80386 で使用できる唯一のコプロセッサでした。80387は、その高いパフォーマンスとより有能な命令セットにより、非常に好まれています。

80387 ( 387またはi387 )は、 IEEE 754-1985規格に完全準拠した最初のインテル コプロセッサです。386 チップの 2 年後の 1987 年にリリースされた[ 15 ] i387 では、インテルの以前の 8087/80287 コプロセッサよりも大幅に高速化され、三角関数の特性も向上しています。100 個単位で 500 ドルで販売されました。[ 16 ]その後まもなく、インテルの Personal Computer Enhancement Operation を通じて小売市場価格 795 ドルで販売されました。[ 17 ] 25 MHz 版は小売チャネルで 1395 ドルで販売されました。[ 18 ]インテル M387 数値演算コプロセッサは、MIL-STD-883 Rev. C 規格に準拠しています。このデバイスは、-55~125 °Cの温度サイクル、気密封止、長時間のバーンインを含むテストを受けました。この軍用バージョンは16 MHzで動作します。この軍用バージョンは、68ピンPGAとクワッドフラットパックで提供されました。この軍用バージョンは、PGAバージョンの場合、100個単位で1,155ドルで提供されました。[ 19 ] 387DXの33 MHzバージョンも提供されており、毎秒 3.4メガ砥石の性能を持っています。[ 20 ] 16、20、25、33 MHzの387DX数値演算コプロセッサの以下のボックス版は、それぞれ570ドル、647ドル、814ドル、994ドルで提供されていました。[ 21 ] 8087と80287のFPTANとFPATAN命令は、±π/4(±45°)の範囲の引数に制限されており、8087と80287にはSIN関数とCOS関数を直接実行する命令はありません。[ 22 ]
コプロセッサがない場合、386は通常、(比較的低速な)ソフトウェアルーチンを介して浮動小数点演算を実行します。これらのルーチンは、実行時にソフトウェア例外ハンドラを介して実装されます。386に数値演算コプロセッサが組み込まれると、コプロセッサはハードウェアで浮動小数点演算を実行し、(エミュレーションによる)ソフトウェアライブラリ呼び出しよりもはるかに高速に結果を返します。
i387は、32ビットプロセッサバスを持つ標準のi386チップとのみ互換性があります。後発の低価格版i386SXは、より狭い16ビットデータバスを備えており、i387の32ビットバスとインターフェースできません。i386SXには、SXのより狭い16ビットデータバスと互換性のある独自のコプロセッサ80387SXが必要です。387SXコプロセッサには低消費電力版も提供されていました。[ 20 ]
さらに、ラップトップで使用されているi386SLと組み合わせるため、インテルはi387SL(N80387SL)をリリースしました。[ 23 ]「Intel387 SLモバイル数値演算コプロセッサ」として販売されたこのプロセッサは、バッテリー寿命を大幅に低下させることなく動作可能な電力管理機能を搭載していました。バッテリーを節約するためのパワーダウン機能は2つあります。1つ目は、CPUが「ストップクロック」モードに入るとコプロセッサのクロックを停止します。387SLはクロック停止時に約25マイクロアンペアを消費します。2つ目は、CPUが動作しているときに自動的に作動し、命令を実行していないときに387SLを「アイドルモード」に移行させます。387SLは、アクティブ時の消費電力が387SXよりも通常30%少なく、約100mAです。アイドルモードでは4mAしか消費せず、アクティブモードと比較して96%の電力削減となります。 16~25MHzの範囲で動作し、BIOSやハードウェアの再設定は必要ありません。[ 24 ]当初の価格は189ドルでした。[ 25 ]

1991年に発売されたi487SX(P23N)は、 Intel i486SXマシン用の浮動小数点演算ユニット・コプロセッサとして販売されました。実際には、本格的なi486DX実装を搭載していました。i486SXシステムにインストールされると、i487はメインCPUを無効化し、すべてのCPU操作を引き継ぎました。i487のマニュアルには、i486SXが搭載されていないと動作しない旨が記載されていましたが、独立したテスト(および後にIntel自身も認めた)により、動作しないことが判明しました。[ 26 ] [ 27 ] [ 28 ]
i487は、通常の168ピン486ソケットへの挿入を防ぐため、未接続(物理キー)ピンを備えた特殊な169ピンソケットを採用していました。少なくとも2つの情報源によると、このソケットは、同様のプロセッサ代替品であるi486 OverDriveのアップグレードソケットであるSocket 1と同一のものであるとのことです。[ 29 ] [ 28 ]
i486DX/i487SXのFPU命令セットは387と変わりませんでしたが、統合によってバス利用効率が向上しました。オンチップアルゴリズムも改良されました。
コンピュータ支援設計用に販売されている 386 から 486 へのアップグレード パッケージである RapidCAD には、メインプロセッサ(RapidCAD-1、486DX) にデフォルトで統合 FPU が含まれているため、互換性のために 80387 ソケットにインストールされるダミー FPU (RapidCAD-2) も含まれています。
1995 年にリリースされたNx586プロセッサ用のNexGenのNx587 FPU は、CPU とは別に製造された最後の x87 コプロセッサでした。