| 一般情報 | |
|---|---|
| 発売 | 1980年 |
| 製造中止 | 2007年9月28日[1] |
| 販売元 | インテル、IBM [2] |
| デザイン: | インテル |
| 一般的なメーカー | |
| パフォーマンス | |
| 最大CPU クロックレート | 4MHz~10MHz |
| アーキテクチャと分類 | |
| テクノロジーノード | 4.5->3μm |
| 命令セット | x87 ( x86-16のコプロセッサ拡張) |
| 物理的仕様 | |
| トランジスタ |
|
| パッケージ |
|
| 歴史 | |
| 前任者 | 8231/8232 |
| 後継 | 80287 |
1980年に発表されたIntel 8087は、 8086マイクロプロセッサシリーズ初の浮動小数点 コプロセッサであった。[5] [6] [7]このチップの目的は、加算、減算、乗算、除算、平方根などの浮動小数点演算を高速化することであった。また、指数、対数、三角関数などの超越関数も計算する。性能向上は、具体的な用途に応じて約20%から500%以上に及んだ。8087は、約2.4ワットで約50,000 FLOPS [6] の性能を発揮することができた。 [7]
8087 は当時の製造技術の限界を押し広げた先進的な集積回路でした。[要出典] 8087 の加算や減算などの基本演算は実行に 100 マシン サイクル以上かかることがあり、命令によっては 1000 サイクルを超えるものもあります。[8]このチップにはハードウェア乗算器がなく、 CORDICアルゴリズムを使用して計算を実装しています。[9]
1981年のIBM PCマザーボードにコプロセッサソケットが搭載されると、8087の売上は大幅に伸びた。8087の開発は、浮動小数点演算のIEEE 754-1985標準につながった。利用可能な速度バージョンは、4.77(5)、8、および10MHzであった。[10] その後、80186、80286、80386、および80386SXプロセッサ用のx87コプロセッサが登場した。80486DXから、Intel x86プロセッサには統合浮動小数点コプロセッサが搭載され、浮動小数点関数はプロセッサに統合された。Intel 486SXプロセッサは浮動小数点ユニットが無効または存在しないが、別の80487を許可している。
Intel 80186とその関連製品は、2007年3月30日に注文が終了し、2007年9月28日に出荷が終了しました。[11]
バリエーション
- ^ 推奨単価
設計と開発
インテルは以前、 8231 演算処理装置と8232 浮動小数点プロセッサを製造していた。これらは8080または類似のプロセッサで使用するために設計されており、8ビットのデータバスを使用していた。これらはプログラムされたI/OまたはDMAコントローラを介してホストシステムに接続されていた。[13]
8087 は当初、8086 チップの開発を監督した Intel のエンジニアリング マネージャー、ビル ポールマンによって考案されました。ビルは、8086 チップがまだ開発されていない数学チップをサポートできることを確認するための措置を講じました。
1977 年、ポールマンは 8087 数学チップの設計をゴーサインを出した。ブルース・ラヴェネルが設計者に任命され、ジョン・パーマーがプロジェクトの共同設計者兼数学者として雇われた。2 人は、最長形式の実数に対して 64 ビットの仮数部と 16 ビットの指数部、スタック アーキテクチャ CPU、8 つの 80 ビット スタック レジスタ、計算能力に優れた命令セットを備えた革新的な設計を考案した。この設計により、数値計算と数値ソフトウェアにおけるいくつかの未解決の問題が解決された。64 ビット オペランドの丸め誤差の問題が解消され、すべての 64 ビット数値の数値モード変換が解決された。パーマーは、ウィリアム・カーハンの浮動小数点に関する著作が設計に大きな影響を与えたとしている。[14]
8087の設計は当初、その攻撃的な設計のためサンタクララでは冷ややかな反応だった。最終的に、設計はインテルイスラエルに譲渡され、ラフィ・ネイブがチップの実装を主導することになった。パーマー、ラベネル、ネイブは設計の特許を取得した。[15]ロバート・ケーラーとジョン・ベイリスも、特定のビットパターンを持つ命令をコプロセッサにオフロードする技術の特許を取得した。[16]
8087 には 65,000 個のトランジスタがあり、4.5 μm (その後 3 μm に縮小) のデプレッション ロードHMOS回路として製造されました。8086 または 8088 と連携して動作し、約 60 個の新しい命令が導入されました。8087 アセンブリニーモニックのほとんどはFADD、FMUL、FCOM など F で始まるため、8086 命令と簡単に区別できます。すべての 8087 命令のバイナリ エンコードは、ビット パターン 11011 (10 進数 27) で始まります。これはASCII文字 ESC と同じですが、バイトの上位ビットにあります。同様の命令プレフィックスは、「エスケープ コード」と呼ばれることもあります。Intel がこれらのコプロセッサ命令に割り当てた命令ニーモニックは「ESC」です。8087 は高価で製造が難しく、歩留まりも低かったです。また、動作時の熱も非常に高かったため、Intel は熱放散を改善するために、より高価なセラミック パッケージを使用せざるを得ませんでした。
8086 または 8088 CPU が ESC 命令を実行する際、2 番目のバイト (ModR/M バイト) がメモリ オペランドを指定していた場合、CPU はバス サイクルを実行して命令で指定されたメモリ位置から 1 ワードを読み取りますが (8086 のアドレッシング モードを使用)、読み取りオペランドを CPU レジスタに格納したり、それに対して操作を実行したりすることはありません。8087 はバスを監視し、8086 と同期して命令ストリームをデコードし、自身に対するコプロセッサ命令を認識します。メモリ オペランドを含む 8087 命令の場合、命令がオペランドの読み取りを要求した場合、8087 はデータ バスからメイン CPU によって読み取られたデータのワードを取得します。読み取りオペランドが 1 ワードより長い場合、8087 はアドレス バスからアドレスもコピーします。その後、CPU によって駆動されるデータ読み取りサイクルが完了すると、8087 は直ちに DMA を使用してバスを制御し、オペランド自体の追加バイトを転送します。メモリ オペランドを含む 8087 命令がそのオペランドの書き込みを要求した場合、8087 はデータ バス上の読み取りワードを無視し、アドレスをコピーしてから DMA を要求し、拡張オペランドの末尾を読み取るのと同じ方法でオペランド全体を書き込みます。このように、メイン CPU はバスとバス タイミングの一般的な制御を維持し、8087 はコプロセッサ命令の実行のその他のすべての側面を処理します。ただし、8087 がバスを引き継いで独自の内部レジスタにオペランドを読み書きする短い DMA 期間を除きます。この設計の結果、8087 はメモリまたは独自のレジスタから取得したオペランドのみを操作でき、8087 と 8086 または 8088 間のデータ交換は RAM を介してのみ行われます。
メイン CPU プログラムは、8087 が命令を実行している間も実行を継続しました。メインの 8086 または 8088 CPU の観点から見ると、コプロセッサ命令は、オペコードとメモリ オペランド サイクル (オペランドがない場合は 2 クロック サイクル、メモリ オペランドの場合は 8 クロック サイクルに EA 計算時間 (5 ~ 12 クロック サイクル) を加えたもの (8088 の場合はさらに 4 クロック サイクル)、オペランド ワードの 2 番目のバイトを転送するため) の処理にかかる時間だけかかり、その後 CPU はプログラムの次の命令の実行を開始します。したがって、8087 を搭載したシステムは、メイン CPU の整数 ALU で 1 つの演算を実行すると同時に、8087 コプロセッサで浮動小数点演算を実行するという、真の並列処理が可能でした。 8086 または 8088 は命令フローとタイミングを排他的に制御し、8087 の内部状態に直接アクセスできなかったため、また 8087 は一度に 1 つの命令しか実行できなかったため、8086/8087 または 8088/8087 を組み合わせたシステムのプログラムでは、8087 に次の命令が発行される前に、最後に発行された命令を完了する時間を確保する必要がありました。この目的のために WAIT 命令 (メイン CPU の) が提供され、ほとんどのアセンブラは、ほとんどの浮動小数点コプロセッサ命令の各インスタンスの前に WAIT 命令を暗黙的にアサートしていました。 (タイミングに敏感な 8087 命令の発行の間に十分な時間が経過し、8087 が前の命令を完了する前にそのような命令を受け取ることがないように、プログラムが他の手段を使用している場合は、8087 操作の前に WAIT 命令を使用する必要はありません。また、WAIT を使用する場合は、次の 8087 命令の直前に配置する必要もありません。) WAIT 命令は、8086/8088 の −TEST 入力ピンがアサートされる (ロー) のを待機し、このピンは 8087 が搭載されているすべてのシステムで 8087 の BUSY ピンに接続されていました (そのため、BUSY がデアサートされると TEST がアサートされました)。
8086 と 8088 の命令プリフェッチ キューでは、命令が実行される時間とフェッチされる時間が必ずしも同じではないため、8087 などのコプロセッサは、CPU バスを監視するだけでは、自分自身の命令が次に実行される命令であるかどうかを判断できません。8086 と 8088 には、コプロセッサに接続された 2 つのキュー ステータス信号があり、プリフェッチ キューからの命令の実行の CPU 内部タイミングと同期できます。8087 は独自の同一のプリフェッチ キューを維持し、そこから実際に実行するコプロセッサ オペコードを読み取ります。8086 と 8088 のプリフェッチ キューはサイズと管理アルゴリズムが異なるため、8087 は、システムのリセット時に特定の CPU バス ラインを監視することによって接続されている CPU の種類を判断し、それに応じて内部命令キューを調整します。 CPU とコプロセッサのプリフェッチ キュー ハードウェアの冗長な重複は、電力使用量と総ダイ面積の点では非効率的ですが、コプロセッサ インターフェイスで使用する専用 IC ピンの数が非常に少なくて済み、これは重要な点でした。コプロセッサ インターフェイスを定義した 8086 が導入された当時、40 ピンを超える IC パッケージは珍しく、高価で、信号速度の大きな制限要因となる過剰なリード容量などの問題を抱えていました。
コプロセッサ操作コードは、エスケープ シーケンスで始まり、2 バイトにわたって 6 ビットでエンコードされます。
┌───────┬───────┐ │ 1101 1xxx │ mmxx xrrr │ ━───────┴───────┘
最初の3つの「x」ビットは浮動小数点演算コードの最初の3ビットです。次に2つの「m」ビット、浮動小数点演算コードの後半の3ビット、そして3つの「r」ビットが続きます。「m」ビットと「r」ビットはアドレス指定モード情報を指定します。[17]
アプリケーションプログラムは、特殊な浮動小数点命令を使用するように作成する必要がありました。実行時にソフトウェアはコプロセッサを検出し、浮動小数点演算に使用できました。検出されない場合は、同様の浮動小数点関数をソフトウェアで計算するか、より正確な数値互換性のためにコプロセッサ全体をソフトウェアでエミュレートする必要がありました。[18]
レジスター

x87 ファミリは、x86 プロセッサのメイン レジスタのような直接アドレス指定可能なレジスタセットを使用しません。代わりに、x87 レジスタは st0 から st7 までの 8 レベルのディープスタック構造[19]を形成します。st0 が最上位です。x87 命令は、このスタックに値をプッシュ、計算、ポップすることで動作します。ただし、FADD、FMUL、FCMP などの 2 項演算では、最上位の st0 と st1 が暗黙的に使用されるか、明示的なメモリ オペランドまたはレジスタと共に st0 が使用される可能性があります。したがって、st0 レジスタはアキュムレータ(つまり、結合された宛先と左オペランド) として使用でき、FXCH st X (コード D9C8–D9CF h )という命令を使用して、8 つのスタック レジスタのいずれかと交換することもできます。これにより、x87 スタックは、7 つの自由にアドレス指定可能なレジスタとアキュムレータとして使用できます。これは、これらの交換命令がゼロクロックペナルティまで最適化されるスーパースカラーx86 プロセッサ ( 1993 年以降の Pentium )に特に当てはまります。
IEEE 浮動小数点標準
インテルが 8087 を設計したとき、将来の設計のための標準的な浮動小数点形式を作ることを目指していました。歴史的観点から見た 8087 の重要な側面は、IEEE 754浮動小数点標準の基礎となったことです。8087 は、最終的な IEEE 754 標準の詳細をすべて実装したわけではありません。標準は 1985 年まで完成しなかったためですが、80387 はそれを実現しました。8087 は、2 つの基本的な32/64ビット浮動小数点データ型と、追加の拡張 80 ビット内部一時形式 (メモリに格納することも可能) を提供し、大規模で複雑な計算の精度を向上させました。これとは別に、8087 は 80 ビット/18 桁のパック BCD ( 2 進化 10 進数) 形式と 16、32、64 ビットの整数データ型を提供しました。[19]
無限
8087 は、無限大の値をアフィン閉包または射影閉包(ステータス レジスタで選択) のいずれかで処理します。アフィン閉包では、正の無限大と負の無限大は異なる値として扱われます。射影閉包では、無限大は非常に小さい数または非常に大きい数の符号なし表現として扱われます。[20]無限大を処理するこれらの 2 つの方法は、 IEEE 754浮動小数点標準のドラフト バージョンに組み込まれました。ただし、射影閉包 (射影拡張実数システム) は、IEEE 754-1985 の後の正式版から削除されました。80287 は射影閉包をオプションとして保持しましたが、80387 およびそれ以降の浮動小数点プロセッサ (80187 を含む) は、アフィン閉包のみをサポートしました。
コプロセッサインターフェース
8087 は、アドレス バスとデータ バスに直接接続されていたという点で、その後の Intel コプロセッサとは異なっていました。8087 は、「11011」シーケンスで始まる命令を探してそれに基づいて動作し、1 ワード (16 ビット) より長いメモリ オペランドにアクセスするために必要に応じてメイン CPU に DMA を直ちに要求し、その後すぐにバス制御をメイン CPU に戻しました。コプロセッサは、コプロセッサ命令が完了するまでプログラムの実行を保留にせず、プログラムは、上記 (「設計と開発」セクション) で説明したように、2 つのプロセッサを明示的に同期する必要がありました。コプロセッサ命令がコプロセッサが理解できる命令にデコードできない場合、クラッシュの問題が発生していました。Intel のその後のコプロセッサは、同じ方法でバスに接続せず、メイン プロセッサの I/O ポートを介して命令を受け取りました。これにより実行時間が長くなりますが、コプロセッサが命令の受け入れを拒否した場合はメイン プロセッサが命令を無視するため、クラッシュの問題は回避されました。 8087 は、リセット サイクル中にデータ バスを監視することで、8088 に接続されているのか、8086 に接続されているのかを検出できました。
8087は、理論上は、8086/8が追加の命令を処理している間に同時に動作することが可能であった。実際には、コプロセッサが最後の命令が完了する前に新しい命令を発行すると、プログラムが失敗する可能性がありました。アセンブラは、コプロセッサのオペコードの後にFWAIT命令を自動的に挿入し、8087が終了したことを知らせるまで8086/8の実行を強制的に停止させました。[21] この制限は、後の設計では削除されました。
後継者
8088 および 8086 プロセッサが後継製品に置き換えられたのと同様に、8087 も置き換えられました。その他の Intel コプロセッサには、80287 (Intel はその時点で CMOS プロセスに移行していたため、実際には 80C287 )、80387、80187がありました。80486以降の Intel プロセッサでは、独立した浮動小数点コプロセッサは使用されなくなりました。実質的にすべて、メイン プロセッサ ダイにコプロセッサが搭載されましたが、80486SX だけは例外で、80486DX を改造して FPU を無効にしていました。80487は、実際にはピンを追加した本格的な80486DXチップでした。これをインストールすると、80486SX CPU が無効になりました。80486DX 、 Pentium 、およびそれ以降のプロセッサでは、CPU コアに浮動小数点機能が組み込まれています。
参考文献
- ^ 「製品変更通知」(PDF)。2006年5月2日。2006年10月9日時点のオリジナル(PDF)からアーカイブ。
- ^ Shvets, Gennadiy (2011 年 10 月 8 日). 「IBM 8087 浮動小数点ユニット」. CPU World . 2011 年12 月 1 日閲覧。
- ^ Shvets, Gennadiy (2011 年 10 月 8 日). 「AMD 8087 浮動小数点ユニット」. CPU World . 2011 年12 月 1 日閲覧。
- ^ Shvets, Gennadiy (2011 年 10 月 8 日). 「Cyrix 8087 浮動小数点ユニット」. CPU World . 2011 年12 月 1 日閲覧。
- ^ Palmer, John F. (1980). 「INTEL® 8087 数値データ プロセッサ」(PDF)。AFIPS '80 、1980 年 5 月 19 ~ 22 日開催の National Computer Conference の議事録。カリフォルニア州アナハイム: ACM。pp. 887 ~ 893。doi :10.1145/1500518.1500674。
- ^ ab "8087". Coprocessor Dot Info . 2007年. 2011年9月30日時点のオリジナルよりアーカイブ。 2011年12月1日閲覧。
- ^ ab "Intel FPU". cpu-collection.de . 2011年. 2011年12月1日閲覧。
- ^ 「Intel 8087 データシート」。
- ^ Shirriff, Ken (2020年5月). 「8087数学コプロセッサのダイからROM定数を抽出する」righto.com . Ken Shirriff による自費出版。 2020年9月3日閲覧。ROMには、2
−n
の逆正接値である16個の逆正接値が含まれています。また、(1+2
−n
)の2を底とする対数値である14個の対数値も含まれています
。これらは珍しい値のように思えるかもしれませんが、1958年に発明されたCORDICと呼ばれる効率的なアルゴリズムで使用されています。
- ^ 吉田、ステイシー、「数値演算コプロセッサ: コンピュータの稼働率を維持する」、インテル コーポレーション、マイクロコンピュータ ソリューション、1990 年 9 月/10 月、16 ページ
- ^ 「製品変更通知」(PDF)。2006年5月2日。2006年10月9日時点のオリジナル(PDF)からアーカイブ。
- ^ Intel Corporation、「1989 年 11 月 1 日より有効な Intel パーソナル コンピュータ拡張製品の価格表」、パーソナル コンピュータ拡張オペレーション、注文番号 245.2、10-89/75K/AL/GO、1989 年 10 月
- ^ Intelコンポーネントデータカタログ 1980、Intel カタログ番号 C-864/280/150K/CP、8-21、8-28 ページ。
- ^ サンチェス&カントン 2007年、96ページ。
- ^ US 4484259、「数値データプロセッサで使用するための分数バス」
- ^ US 4270167、「デュプレックス中央処理装置同期回路」
- ^ Lemone, Karen A. (1985). IBM PC および互換機用アセンブリ言語とシステムプログラミング。リトルブラウン。p. 302。ISBN 978-0-316-52069-0。
- ^ ミューラー、スコット (1992) 。PC のアップグレードと修理(第 2 版)。Que。pp. 395–403。ISBN 0-88022-856-3。
- ^ ab Shvets, Gennadiy (2011 年 10 月 8 日). 「Intel 8087 ファミリー」. CPU World . 2011 年12 月 1 日閲覧。
- ^ サンチェス&カントン 2007年、110ページ。
- ^ レモネ 1985、300 ページ
文献
- サンチェス、フリオ; カントン、マリア P. (2007)。エンジニアと科学者のためのソフトウェア ソリューション。CRC プレス。ISBN 978-1-4200-4302-0。
外部リンク
- cpu-collection.de の Intel 80x87 数値演算コプロセッサ
- Coprocessor.info: 8087 数値演算コプロセッサの歴史情報と写真
- Intel 8087 数値演算コプロセッサのデータシート
- Shirriff, Ken (2020 年 5 月)。「8087 数値演算コプロセッサの高速ビット シフターのダイ分析」。
