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× |
- * スーパースカラー実行により、実質的なゼロクロック遅延が実現できる場合が多くあります。
- § 5MHzの8087は、最初のx87プロセッサでした。8086(8087なし)の典型的なソフトウェア実装の浮動小数点ルーチンと比較すると、係数はさらに大きくなり、おそらく10倍以上になるでしょう(つまり、アセンブリ言語で正しい浮動小数点加算を実行すると、1000サイクル以上かかる可能性があります)。
メーカー
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
8087は、 Intelが設計した16ビットプロセッサ向けの最初の数値演算コプロセッサである。1980年にリリースされ、 Intel 8088または8086マイクロプロセッサと組み合わせられた。(Intelがi8080 CPU向けに販売していた初期の8231および8232浮動小数点プロセッサは、実際には1977年と1979年にAMDが開発したAm9511およびAm9512 FPUのライセンス版であった。[ 6 ])
80C187

1982年のオリジナルの80188と80186のデータシート( NMOSベース)には特定の数値演算コプロセッサについて言及されているようですが、 [ 7 ]どちらのチップも実際には8087とペアになっていました。
しかし、1987年、 CMOSベースのIntel 80C186 CPUの刷新に伴い、Intelは80C187 [ 8 ]という数値演算コプロセッサを発表しました。80C187のメインプロセッサへのインターフェースは8087と同じですが、コア部分は基本的に80387SXのものであり、IEEE 754に完全準拠しており、80387のすべての追加命令を実行できます。[ 9 ]
80287
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は、その高いパフォーマンスとより有能な命令セットにより、非常に好まれています。
- Intel 80287の6MHzバージョン
- Intel 80287 ダイショット
- インテル 80287XL
- インテル 80287XLT
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 ]
- i387
- i387SX
- i387DX
- i386DX と i387DX
- 80387用ソケット
80487

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) も含まれています。
Nx587
1995 年にリリースされたNx586プロセッサ用のNexGenのNx587 FPU は、CPU とは別に製造された最後の x87 コプロセッサでした。
参照
注記
参考文献
- ^ William Kahan (1990年11月2日). 「8087スタックの利点について」(PDF) .未発表の講義ノート, カリフォルニア大学バークレー校 コンピュータサイエンス学科. 2017年1月18日時点のオリジナル(PDF)からアーカイブ。
- ^ William Kahan (1989年7月8日). 「Intel 8087のスタックオーバーフロー/アンダーフローはどのように処理されるべきだったか」(PDF) . 2013年6月12日時点のオリジナル(PDF)からのアーカイブ。
- ^ジャック・ヴェール(1997年11月1日)「ウィリアム・カーハンとの会話」。
- ^ David Monniaux (2008年5月). 「浮動小数点演算の検証における落とし穴」 . ACM Transactions on Programming Languages and Systems . 30 (3): 1– 41. arXiv : cs/0701192 . doi : 10.1145/1353445.1353446 . S2CID 218578808 .
- ^数値は各プロセッサのデータシート、プログラミングマニュアル、最適化マニュアルから取得されています。
- ^ 「算術プロセッサ:当時と現在」 www.cpushack.com 2010年9月23日. 2023年5月3日閲覧。
- ^ Intel (1983). Intel マイクロプロセッサ & 周辺機器ハンドブック. pp. 3-25 (iAPX 186/20) および 3-106 (iAPX 188/20).
- ^ 「CPU Collection – Model 80187」 . cpu-info.com . 2011年7月23日時点のオリジナルよりアーカイブ。2018年4月14日閲覧。
- ^ 「80C187 80ビット数値演算コプロセッサ」(PDF) 1992年11月. 2023年5月3日閲覧。
- ^吉田 ステイシー、「数値演算コプロセッサ:コンピュータの稼働率向上」、インテル社、マイクロコンピュータソリューション、1990年9月/10月、16ページ
- ^ Intel Corporation、「新製品の焦点コンポーネント: 友人たちのちょっとした助けを借りた 32 ビット マイクロプロセッサ」、Special 32-Bit Issue Solutions、1985 年 11 月/12 月、13 ページ。
- ^インテルコーポレーション、「パーソナルコンピュータの拡張」、パーソナルコンピュータの拡張オペレーション、注文番号245.2、10-89/75K/AL/GO、1989年10月、4ページ
- ^インテルコーポレーション、「新製品フォーカス:システム:SnapIn 386モジュールによるPS/2 PCのアップグレード」、マイクロコンピュータソリューションズ、1991年9月/10月号、12ページ
- ^吉田 ステイシー、「数値演算コプロセッサ:コンピュータの稼働率向上」、インテル社、マイクロコンピュータソリューション、1990年9月/10月、16ページ
- ^ Moran, Tom (1987-02-16). 「Intel、386マシンのパフォーマンスを向上させるチップを発表」 InfoWorld第9巻第7号 5ページ. ISSN 0199-6649 .
- ^「新製品フォーカスコンポーネント:32ビットコンピューティングエンジンがフルスピードで前進」ソリューション、インテルコーポレーション、1987年5月~6月10日。
- ^「NewsBit: Intel 80387、小売チャネルを通じて販売開始」ソリューションズ、Intel Corporation、1987年7月~8月号。
- ^ Intel Corporation、「NewsBits: 25 MHZ 80387 が小売チャネルを通じて入手可能」、Microcomputer Solutions、1988年9月/10月号、1ページ
- ^インテルコーポレーション、「フォーカス:コンポーネント:軍事用周辺機器がM386マイクロプロセッサをサポート」、マイクロコンピュータソリューション、1989年3月/4月、12ページ
- ^ a bルネス、アン、「Intel386アーキテクチャは今後も存続する」、インテルコーポレーション、マイクロコンピュータソリューション、1989年7/8月、2ページ
- ^インテルコーポレーション、「パーソナルコンピュータの拡張」、パーソナルコンピュータの拡張オペレーション、注文番号245.2、10-89/75K/AL/GO、1989年10月
- ^ Borland Turbo Assembler のドキュメント。
- ^ "Intel N80387SL" . www.cpu-world.com . 2024年12月4日閲覧。
- ^ 「Intel 387 SL 数値演算コプロセッサ」 PC World 誌第10巻第7号1992年7月72ページ。
- ^インテルコーポレーション、「新製品の焦点:エンドユーザー:数値演算コプロセッサがデスクトップの性能をポータブルにもたらす」、マイクロコンピュータソリューション、1992年5月/6月、16-17ページ
- ^ Intel 487SX は、Free On-line Dictionary of Computingに掲載されています。
- ^ "Intel 80487" . www.cpu-world.com . 2021年6月9日閲覧。
- ^ a b「Intel 487SX 数値演算コプロセッサ」 .分子表現:科学、光学、そしてあなた. フロリダ州立大学. 2026年1月11日閲覧。
- ^ 「マイクロプロセッサの種類と仕様」 InformITピアソン2001年6月8日。2021年12月7日時点のオリジナルよりアーカイブ。