
2025/12/10 3:16
The stack circuitry of the Intel 8087 floating point chip, reverse-engineered
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
インテル 8087は、1980年に導入されたパイオニア的な浮動小数点共処理器であり、初期のマイクロプロセッサよりも最大100倍高速でFP演算を実行しました。5 mm × 6 mm のコンパクトなダイ上に40ピンの外部接続があり、トランジスタ数は40,000〜75,000個でした。このチップのデータパスは80ビット値(64ビット有効桁、15ビット指数、1ビット符号)を扱い、Stack Top ポインタとオフセットロジックでアクセスされる8レジスタスタックに格納されていました。π などの重要定数はコンスタント ROM に保持され、命令セットは半アナログマイクロコード ROM にエンコードされ、各トランジスタに対して4つのサイズを使って2ビットが保存されます。レジスタタグ(各2ビット)は状態(空、ゼロ、有効、特殊)を示し、16ビットの Tag Word として状態保存/ロード時にアクセス可能でした。
デコーダ回路は8個の3入力 NOR ゲートと、抵抗値と RC 遅延を軽減するためのダブルポリシリコン/メタル選択線を使用しました。スタック制御には、ポインタ算術用のキャリー・ローケア加算器と増減ロジック用のトグルフリップフロップがあり、すべてマイクロコード信号で駆動されました。スタックは8エントリしかなく、オーバーフローすると ST ポインタがラップし、下位レジスタを上書きします。タグチェックにより無効操作例外が発生します。
スタックのオーバーフロー/アンダーフロー処理における設計欠陥は、ソフトウェア側で頻繁な回避策を必要としました。関数呼び出し前に完全なスタックダンプを行い、コンパイラハック(例:GCC では x87 サポートのため約3,000 行の追加)が必要でした。1990 年代にはインテルが SSE(後の AVX)を導入し、非スタックレジスタと並列演算を実装したため、8087 のスタック命令はほぼ廃止されました。
8087 は Rafi Nave を率いる小規模なイスラエルチームによって開発され、初期の歩留まりは低く(約 4 インチウェーハあたり 2 枚の動作ダイ)でしたが、時にはインテルにとって最も収益性の高い製品ラインとなりました。この成功によりインテル イスラエルは主要なテック雇用主として確立され、後続の CPU(80486 など)に統合された FP ユニットへの道が開かれました。8087 のスタックアーキテクチャの遺産は、現代のデバイス全般にわたる浮動小数点システムに影響を与え続けていますが、現在の CPU は独自の専用 FP ユニットを実装しており、元のハードウェアに直接依存することはほとんどありません。
本文
浮動小数点演算を行う際、初期のマイクロプロセッサは非常に遅かった。
しかし1980年にインテルが8087浮動小数点共処理装置を導入し、浮動小数点演算速度を最大100倍高速化しました。これにより、AutoCAD、スプレッドシート、フライトシミュレータなどのIBM PCアプリケーションで大きな恩恵が得られました。8087は非常に効果的だったため、本当の意味で今日のコンピュータでも8087ベースの浮動小数点体系を採用しています。
チップ概要
- 複雑さ – 4万〜7.5万トランジスタ(情報源による)
- ダイサイズ – 5 mm × 6 mm。ダイは機能ブロックに分割されています:
- データパス – 80ビット浮動小数点値の計算を行います。
- 定数ROM – πなど重要な定数を保持します。
- レジスタスタック – スタックとして機能する8つのレジスタとスタック制御回路。
- 命令セット – ダイ中央にある大きなマイクロコードROMで定義されています。
- ROMは半アナログ構成:4種類のトランジスタサイズを使い、1トランジスタあたり2ビットを格納します。
- 実行フロー:命令デコード → マイクロインストラクション列 → 制御信号。
レジスタスタック
8087はレジスタを スタック として配置し、平坦で個別にアドレス指定できるレジスタとは異なります。
-
スタック操作
- PUSH – スタックトップ(ST)ポインタを減算し、新しいトップレジスタへ値を書き込みます。
- POP – スタックトップから値をコピーして、ST を増算します。
-
ST 相対アクセス – 命令は現在のトップからのオフセットでレジスタを参照できます(例:トップと2つ下にあるレジスタの和)。
-
意図されたメリット – コンパイラ設計を簡素化し、関数呼び出しを効率化することが狙いでしたが、実際には問題を引き起こしました。
レジスタストレージ
-
80ビット浮動小数点値は 静的RAMセル に格納されます。
- 二つのインバータがフィードバックループを形成し、0または1を保持します。
- インバータペアは一方のラインを低く引くことで反転できます。
-
八つのレジスタは 8 × 80 のセル格子に配置されます。
-
アクセス方法:
- ビットライン – 行ごとに2本設置し、各ビットへの読み書きアクセスを提供します。
- ワードライン – 80ビット列を有効化し、160個のパストランジスタでビットラインと選択インバータを接続します。
フィジカルレイヤ
- ボトム層 – シリコン(ドーピング領域が水平・垂直配線)
- ポリシリコン層 – ドーピングしたシリコン上を横断する際のトランジスタゲート
- メタル層 – 水平ワイヤで回路を結合し、低抵抗選択ラインも供給
タグビット
- 各レジスタは 2 ビットのタグを持ち、空、ゼロ、有効、または特殊値(無限大など)かどうかを示します。
- プログラマにとってはほぼ意味がなく、内部的には性能最適化のために使用されます。
- 16ビット「タグワード」は8087 の状態として保存・ロードできます。
デコーダとスタック制御
-
デコーダ – 3 入力 NOR ゲートで 8 レジスタを 3 ビット値から選択します。
-
セレクトライン – ポリシリコン(高抵抗)とメタル(低抵抗)の両方で走行し、RC 遅延を抑制します。
-
スタック制御回路 – スタックトップ(TOS)を追跡
- PUSH / POP の増減ロジック
- ST 相対アクセスのオフセット加算
- 高速 TOS 計算のためにキャリー・ルックアヘッド加算器、インクリメント/デクリメントはトグルフリップフロップネットワークで実装
欠点
-
スタックオーバーフロー – エントリが 8 個しかないため、第9 個をプッシュするとポインタがラップし、底部のレジスタを書き換えます。
- オーバーフローは「空でない」レジスタへの PUSH によって検出され、無効操作例外が発生します。
- ソフトウェア側でオーバーフローを処理する必要があり、信頼性の高い実装が難しいでした。
-
コンパイラ問題 – 平坦レジスタの方が扱いやすく、スタックをエミュレートすることで大きなオーバーヘッドが発生しました。
レガシー
-
8087 のスタックモデルは実際には多くの課題を抱えており、解決策というより問題点が目立ちました。
-
後続のインテルプロセッサ(SSE、AVX)では非スタックレジスタと並列演算が導入され、x87 スタックは性能面で時代遅れとなりました。
-
それでも8087 は大成功を収めました:
- 時にはインテルの最も利益率の高い製品ラインになった
- インテル・イスラエルがトップテクノロジー企業として名を馳せるきっかけに
- スマートフォンからメインフレームまで、ほぼすべての現代プロセッサで浮動小数点ハードウェアに影響を与えた
さらに読む
- ダイ、ROM、ビットシフター、定数に関する著者の記事
- 著者を Bluesky(@righto.com)、Mastodon(@[email protected])でフォロー、RSS で更新情報を受け取る