x87


X87
x87は、x86アーキテクチャ命令セットの浮動小数点関連のサブセットです。これは、対応するx86CPUと連携して動作するオプションの浮動小数点コプロセッサーの形式で8086命令セットを拡張したものとして始まりました。これらのマイクロチップの名前は「87」で終わります。これは、NPX(Numeric Processor eXtension)とも呼ばれていました。基本的な命令セットの他の拡張機能と同様に、x87命令は、動作するプログラムを構築するために厳密に必要ではありませんが、一般的な数値タスクのハードウェアおよびマイクロコードの実装を提供し、これらのタスクを対応するマシンコードよりもはるかに高速に実行できるようにします ルーチンはできます。x87命令セットには、加算、減算、比較などの基本的な浮動小数点演算の命令だけでなく、タンジェント関数とその逆関数の計算などのより複雑な数値演算の命令も含​​まれています。
Intel 80486以降のほとんどのx86プロセッサでは、これらのx87命令がメインCPUに実装されていますが、この用語は、命令セットのその部分を指すために使用されることもx87命令がPCで標準になる前は、コンパイラまたはプログラマは、浮動小数点演算を実行するためにかなり遅いライブラリ呼び出しを使用する必要がありました。これは、(低コストの)組み込みシステムではまだ一般的な方法です。

コンテンツ
1 説明
1.1 パフォーマンス
2 メーカー
3 建築世代
3.1 8087 3.2 80187 3.3 80287 3.43.4 80387 3.5 80487 3.6 80587
4 も参照してください
5 参考文献
6 ノート
7 外部リンク

説明
x87レジスタは、ST(0)からST(7)までの8レベルの深さの非厳密スタック構造を形成し、レジスタは、トップに対するオフセットを使用して、プッシュおよびポップするだけでなく、どちらのオペランドからも直接アクセスできます。 。(このスキームは、スタックフレームをプッシュ/ポップおよびインデックス付けする方法と比較できます。)
このスタックの上に値をプッシュ、計算、およびポップするための指示が単項演算(FSQRT、FPTANなど)は暗黙的に最上位のST(0)をアドレス指定し、二項演算(FADD、FMUL、FCOMなど)は暗黙的にST(0)とST(1)をアドレス指定します。非厳密スタックモデルでは、2項演算で、ST(0)を直接メモリオペランドまたは明示的に指定されたスタックレジスタST(x)とともに、従来のアキュムレータ(宛先と左オペランドの組み合わせ)と同様の役割で使用することもできます。)。これは、ST(0)を未変更のオペランド、ST(x)をデスティネーションとして、命令ごとに逆にすることもできます。さらに、ST(0)の内容は、FXCH ST(x)と呼ばれる命令を使用して別のスタックレジスタと交換できます。
これらのプロパティにより、x87スタックは、7つの自由にアドレス指定可能なレジスタと専用のアキュムレータ(または7つの独立したアキュムレータ)として使用できます。これは、スーパースカラーx86プロセッサ(1993年以降のPentiumなど)に特に当てはまります。これらの交換命令(コードD9C8..D9CF h)は、FXCH ST(の整数パスの1つを使用して、ゼロクロックペナルティまで最適化されます。x)FPU命令と並行して。人間のアセンブリ言語プログラマーにとって自然で便利であるにもかかわらず、一部のコンパイラー作成者は、x87コードを効果的にスケジュールする自動コードジェネレーターを構築するのが複雑であることに気づきました。このようなスタックベースのインターフェイスは、レジスタベースのインターフェイスと比較して、関数呼び出しでスクラッチ変数を保存する必要性を最小限に抑えることができる可能性があります(ただし、歴史的に、元の実装の設計上の問題により、その可能性が制限されていました。 )
x87は、IEEE 754-1985標準に従って、単精度、倍精度、および80ビットの倍精度拡張2進浮動小数点演算を提供します。デフォルトでは、x87プロセッサはすべて内部で80ビットの二重拡張精度を使用します(多くの計算で精度を維持できるようにするには、IEEE 754の設計根拠を参照してください)。したがって、算術演算の特定のシーケンスは、厳密な単精度または倍精度IEEE 754FPUと比較してわずかに異なる動作をする可能性がこれは、正しい操作のために倍精度を想定するように記述された一部の半数値計算では問題になることがあるため、このような問題を回避するために、x87は、特別な構成/ステータスレジスタを使用して構成し、後で自動的に倍精度または倍精度に丸めることができます。各操作。導入以来、SSE2彼らがかつてあったとして、のx87命令は必須でないようであるが、これらに敏感数値計算のための高精度スカラユニットとして重要残る丸め誤差と要求64ビットの仮数精度および拡張範囲利用可能にします80ビット形式。

パフォーマンス
典型的なx87FPU命令の例のクロックサイクルカウント(ここに示されているレジスタ-レジスタバージョンのみ)。
A … Bの表記(最大最小値)は、過渡パイプラインの状態と選択された演算精度(32、64または80ビット)に依存するタイミング変動をカバーします。また、数値の場合(セットビット数、ゼロなど)による変動も含まれます。LH表記は、使用可能な最低(L)および最高(H)の最大クロック周波数に対応する値を示します。
x87の実装 FADD FMUL FDIV FXCH FCOM FSQRT FPTAN FPATAN 最大クロック(MHz)
ピークFMUL (百万/秒)
FMUL § REL。5 MHz 80878087 70…100 90…145 193…203 10…15 40…50 180…186 30…540 250…800 000 5 00 10
0.034…0.0550.100…0.111
〜00001 2倍の速さ
80287(オリジナル)
000 6 00 12
0.041…0.0660.083…0.133
.0001.2 2.4×
80387(およびそれ以降の287モデル)23…34 29…57
88…9118 24122…129 191…497 314…487
00 16 00 33
0.280…0.5520.580…1.1
000〜10 20×
80486(または80487)
8…2016 73 4 483…87 200…273 218…303
00 16 00 50
….0000001.0 3.1
000〜18 56×
Cyrix 6×86、Cyrix MII4…7 4…6
24…342 459…60 117…129 97…161
00 66 0 300
..000011 …1650…75
00 1400〜320×
AMD K6(K6 II / IIIを含む)2 2
21…412 321…41 ? ?
0 166 0 550
…..00000083 275
0 5000〜1500×
Pentium / Pentium MMX1…3 1…3 39
1(0 *) 1…470 17…173 19…134
00 60 0 300
..000020 …60100…300
0 5400〜1100×Pentium Pro 1…3 2…5 16…56 1 28…68 ? ?
0 150 0 200
..000030 …7540…100
0 1800〜1400×
Pentium II / III1…3 2…5 17…38 1 27…50 ? ? 0 2331400
..00047 …116280…700
0〜210013000×
アスロン(K7)1…4 1…4 13…24 1…2 16…35 ? ? 0 5002330
..00125 …500580…2330
0〜900042000×
Athlon 64(K8) 10003200 ..0250 …1000800…3200
〜1800058000×Pentium 4 1…5 2…7 20…43
複数のサイクル1 20…43 ? ? 13003800
..00186 …650543…1900 〜1100034000× *スーパースカラー実行により、効果的なゼロクロック遅延が可能になることがよく
§ 5メガヘルツ8087は、元のx87プロセッサでした。8086(8087なし)でソフトウェアで実装された一般的な浮動小数点ルーチンと比較すると、係数はさらに大きくなり、おそらく10倍になります(つまり、アセンブリ言語での正しい浮動小数点の追加は、1000サイクル以上を消費する可能性があります) )。

メーカー
設計、製造している企業インテル8087以降のモデルと互換性のある浮動小数点ユニットは、AMD(287、387、486DX、5×86、K5、K6、K7、K8)、チップス・アンド・テクノロジーズ(スーパーMATHのコプロセッサ)を、Cyrix(FasMath、Cx87SLC、Cx87DLCなど、6×86、Cyrix MII)、Fujitsu(初期のPentium Mobileなど)、Harris Semiconductor(製造された80387および486DXプロセッサ)、IBM(さまざまな387および486デザイン)、IDT(WinChip、C3、C7、ナノなど)、IIT(2C87、3C87、など)、LC技術(グリーンMATHのコプロセッサ)、ナショナル・セミコンダクター(のGeode GX1、のGeode GXM、など)、NexGen(Nx587)、Rise Technology(mP6)、ST Microelectronics(486DX、5×86などで製造)、Texas Instruments(486DXプロセッサなどで製造)、Transmeta(TM5600およびTM5800)、ULSI(Math・Coコプロセッサ)、VIA(C3、C7、及びナノ、等)、及びXTEND(83S87SX-25および他のコプロセッサ)。

建築世代
8087

Intel 8087 8087最初の数学だったコプロセッサによって設計された16ビットプロセッサ用インテル。Intel8088または8086マイクロプロセッサとペアになるように構築されました。(i8080 CPUで使用するために販売されたIntelの初期の8231および8232浮動小数点プロセッサは、実際には1977年および1979年のAMDのAm9511およびAm9512 FPUのライセンスバージョンでした。)

80187
image"
  Intel80187の16MHzバージョン
80187(80C187)のための数値演算コプロセッサであるインテル80186 CPU。80188には8ビットのデータバスがあるため、80188では動作できません。80188は8087のみを使用できます。80187は80186および80188と同時に表示されませんでしたが、実際には80287および80387の後に発売されました。メインプロセッサへのインターフェイスは8087と同じですが、そのコアは80387のコアであるため、IEEE 754に完全に準拠しており、80387のすべての追加命令を実行できます。

80287
80287(i287は)数学であるコプロセッサのためのIntel 80286の一連のマイクロプロセッサ。Intelのモデルには、6〜12MHzの範囲の指定された上限周波数を持つバリアントが含まれていました。その後、387マイクロアーキテクチャを備えたi80287XL、ラップトップ向けの特別バージョンであるi80287XLT、およびその他のバリアントが続きました。
80287XLは、実際には287ピン配列の80387SXです。コプロセッサーを2 / 3CPU速度で実行したマザーボードが代わりにFPUをCPUと同じ速度で実行できるように、内部3/2乗算器が含まれています。387と同様のパフォーマンスを備えた他の287モデルは、CHMOSIIIを使用して構築されたIntel80C287と、完全に静的なゲートのみを使用してAMDのCMOSプロセスで製造されたAMD80EC287です。
80287および80287XLは80386マイクロプロセッサで動作し、1987年に80387が導入されるまで、最初は80386で使用できる唯一のコプロセッサでした。最後に、CyrixCx486SLCで動作することができました。ただし、これらのチップの両方で、80387は、その高性能と命令セットの優れた機能のために強く推奨されています。
image
  Intel80287の6MHzバージョン
image
  Intel80287ダイショット
image
  Intel 80287XL image
  Intel 80287XLT

80387
image
  Intel 80387CPUダイイメージ
80387(387またはi387は)に完全に準拠するための最初のIntelコプロセッサであるIEEE 754-1985標準。386チップから完全に2年後の1987年にリリースされたi387には、Intelの以前の8087/80287コプロセッサーよりも大幅に速度が向上し、三角関数の特性が向上しています。8087および80287のFPTANおよびFPATAN命令は、±π/ 4(±45°)の範囲の引数に制限されており、8087および80287には、SINおよびCOS関数の直接命令はありません。
コプロセッサーがない場合、386は通常、実行時にソフトウェア例外ハンドラーを介して実装される(比較的遅い)ソフトウェアルーチンを介して浮動小数点演算を実行します。数学コプロセッサーが386とペアになっている場合、コプロセッサーはハードウェアで浮動小数点演算を実行し、(エミュレートする)ソフトウェアライブラリ呼び出しよりもはるかに高速に結果を返します。
i387は、32ビットプロセッサバスを備えた標準のi386チップとのみ互換性が後のコスト削減されたi386SXは、より狭い16ビットデータバスを備えており、i387の32ビットバスとインターフェイスできません。i386SXには、SXのより狭い16ビットデータバスと互換性のある独自のコプロセッサ80387SXが必要です。
image
  i387 image
  i387SX image
  i387DX image
  16ビットバレルシフタとCORDICユニットを備えたi387マイクロアーキテクチャ
image
  i386DXとi387DX image
  80387用ソケット

80487
image
  i487SX i487SX(P23N)のように市販された浮動小数点ユニット コプロセッサ、インテルのためi486SXの機械。実際には、本格的なi486DX実装が含まれていました。i486SXシステムにインストールすると、i487はメインCPUを無効にし、すべてのCPU操作を引き継ぎました。i487は、i486SXの存在を検出するための対策を講じており、元のCPUが配置されていないと機能しませんでした。

80587
Nx587は、この場合、NexGenの中で、CPUとは別個に製造することがx86のための最後のFPUたNx586。

も参照してください MMX SSE、SSE2、SSE3、SSSE3、SSE4AVX 3DNow!
SIMD

参考文献
^ ウィリアムカハン(1990年11月2日)。「8087のスタックの利点について」 (PDF)。未発表のコースノート、カリフォルニア大学バークレー校のコンピュータサイエンス部門。2017年1月18日にオリジナル (PDF)からアーカイブされました。
^ ウィリアムカハン(1989年7月8日)。「Intel8087スタックのオーバーフロー/アンダーフローをどのように処理すべきか」(PDF)。2013年6月12日にオリジナル(PDF)からアーカイブされました。
^ Jack Woehr(1997年11月1日)。「ウィリアム・カハンとの会話」。
^ David Monniaux、浮動小数点計算を検証する際の落とし穴、 ACMTOPLASに表示されます。
^ 数値は、それぞれのプロセッサのデータシート、プログラミングマニュアル、および最適化マニュアルから取得されます。
^ 「算術プロセッサ:当時と現在-CPUシャック博物館」。www.cpushack.com 。
^ 「CPUコレクション–モデル80187」。cpu-info.com 。
^ 「80C18780ビット数学コプロセッサー」(PDF)。datasheetcatalog.org。1992年11月。
^ Borland TurboAssemblerのドキュメント。
^ インテル487SXでのコンピューティングの無料オンライン辞書
^ 「Intel80487」。www.cpu-world.com 。
インテル64およびIA-32アーキテクチャーソフトウェア開発者マニュアル第1巻:基本アーキテクチャー (PDF)。インテル。

ノート
^ ファブレス企業はチップを設計し、製造をファブレス企業に依存していますが、ファブレス企業は設計と製造の両方を自分で行うことができます。

外部リンク
数学コプロセッサーについていつも知りたいことすべて”