
2026/01/15 22:23
**Intel 8087 浮動小数点チップマイクロコードの条件** - **オペランド取得** - ソースオペランドは浮動小数点スタック(ST(0)–ST(7))から取得されます。 - 宛先オペランドは常に ST(0) です。 - **スタック管理** - スタックポインタ(TOP)は各命令実行後に更新されます。 - アンダーフロー/オーバーフローが発生するとスタック障害を引き起こします。 - **精度と丸め** - 演算は現在の精度設定(24‑, 32‑または 64‑ビット)で行われます。 - 結果の丸めは有効な丸めモード(最も近い値へ、ゼロ方向など)に従います。 - **ステータスフラグ** - 条件コードレジスタ(CCR)は例外フラグを更新します: - *無効演算*、*非正規化オペランド*、*ゼロ除算*、*オーバーフロー*、*アンダーフロー*、*不正確結果*。 - 符号フラグとゼロフラグは ST(0) の符号/ゼロに応じて設定されます。 - **例外処理** - 例外は MXCSR レジスタでマスクまたはアンマスクされます。 - アンマスクされた例外はホスト CPU に割り込みを送ります。 - **命令シーケンス** - マイクロコードのシーケンスは正しいオペランド順序(例えば `ADD` は ST(0) を宛先に使用)を保証します。 - 一部の命令では実行前にオペランドを二サイクルでフェッチする必要があります。 - **レイテンシとパイプライン** - 実行レイテンシは演算種別によって異なります: - *算術*(約10 µs)、*平方根*(約20 µs)、*逆数*(約15 µs)。 - マイクロコードパイプラインはオペランドフェッチ中に次の命令をプリフェッチできます。 - **互換性モード** - レガシーモード:80‑ビット拡張精度を使用します。 - 互換モード:以前の 8087 の動作を低精度でエミュレートします。 これらの条件は、8087 マイクロコードが浮動小数点演算を処理し、スタック状態を管理し、例外を扱い、ホスト CPU と相互作用する方法を規定しています。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
改訂サマリー
インテル 8087 浮動小数点共処理装置は、IBM PC のスプレッドシートや数値計算ワークロードに対して最大 100 倍の速度向上を実現します。マイクロコードエンジン―11 ビットアドレスジェネレータと 6 レジスタ スタックを備えたもの―は、2 バイト命令 1 648 を実行し、高水準 FP 操作を数百の内部ステップで駆動します。
データパスは 80 ビット浮動小数点値を処理し、左側に π やその他定数用の固定 ROM が配置され、右側にはスタック配列された 8 レジスタが存在します。各値は空、ゼロ、通常、NaN、無限などを示す 2 ビットタグを持ち、オーバーフロー/アンダーフロー検出と操作最適化を可能にします。
条件付きロジックは、64 のうち 49 個のテストで実装され、ほぼ 4‑to‑1 マルチプレクサからなるツリー構造がダイ全体に分散して配線量を最小限に抑えています。15 条件はオペコードビットを調べ、その他は一時レジスタ(tmpA、tmpB、tmpC)や丸めモード、符号、非正規化、例外状態などのプロパティを検査します。
マイクロ命令のビット P は条件をフリップできるため、ジャンプは 真 でも 偽 でも別々の命令なしで発生できます。例えば、FABS/FCHS ラウトインは下位オペコードビットをテストして符号トグルと符号クリア操作間で分岐し、そのマイクロ命令値は 0xC094 です。
「Opcode Collective」はこの複雑な条件付きロジックのリバースエンジニアリングを継続し、8087 が高速 FP 計算を実現する方法を明らかにするとともに、そのマイクロコードを解読する際の課題を浮き彫りにします。
本文
1980年代、コンピュータの浮動小数点計算を高速化したい場合は、Intel 8087 浮動小数点共処理器チップを購入すればよかった。IBM PC に差し込むと、スプレッドシートやその他の数値演算アプリケーションで最大 100 倍速くなる―大きな恩恵だった。
8087 は三角関数・対数・指数関数を計算するために複雑なアルゴリズムを採用し、これらはマイクロコードとしてチップ内部に実装されている。私はこのマイクロコードを逆解析しているグループの一員である。この投稿では、8087 のマイクロコードがアルゴリズム内で使用する 49 種類の条件テストについて検討する。
条件は単純(例:数値がゼロか負か)なものもあれば、特殊(例:四捨五入方向を決定する)といった高度なものまである。8087 の回路を調べるために、チップを開けて顕微鏡でシリコンダイの多数写真を撮影した。ダイの端部には 40 本の外部ピンへ接続する細いボンドワイヤが見える。複雑なパターンは金属配線、ポリシリコン、そしてその下のシリコンによって形成されている。
チップの下半分は データパス で、80 ビット浮動小数点値に対する計算を行う回路が配置されている。
- データパス左側には π など重要な定数を保持する ROM がある。
- 右側には浮動小数点値を保持するための 8 個のレジスタがあり、珍しい設計上、これらはスタック構成になっている。
チップの命令は中央にある大きなマイクロコード ROM により定義される。浮動小数点命令を実行すると、8087 は命令をデコードし、マイクロコードエンジンが ROM から適切なマイクロ命令を実行するよう開始する。ROM の右側にあるマイクロコードデコード回路は各マイクロ命令の制御信号を生成し、バスレジスタと制御回路はメイン 8086 プロセッサやシステム全体との相互作用を処理する。
例えば arctan のような 8087 命令は数百の内部ステップで構成される。これらはマイクロコードに実装され、アルゴリズムの各段階を指定するマイクロ命令で表現される。マイクロコード ROM には 1,648 個の 16 ビット長のマイクロ命令が格納されており、データ移動や二つの値の加算、データシフトといった単純操作を実行する。私は「Opcode Collective」と協力してこれらのマイクロ命令を逆解析し、マイクロコード全体を完全に理解する作業を進めている。
マイクロコードエンジン はマイクロ命令の実行を制御し、8087 内に存在するミニ CPU のような役割を果たす。11 ビットのマイクロアドレス(ROM 上のマイクロ命令のアドレス)を生成し、ジャンプ・サブルーチン呼び出し・戻りを実装する―すべては指定された条件に応じて行われる。エンジンには以下が含まれる:
- Instruction Decode PLA:8087 命令をデコードしてマイクロコード内の開始アドレスを決定。
- Jump PLA:ジャンプやサブルーチン呼び出し用のマイクロコードアドレスを保持。
- 11 ビットレジスタ 6 個で構成されるマイクロコードスタック(8 つの浮動小数点値を保持するレジスタスタックとは別)により、サブルーチン呼び出しを 6 層まで実現。
- コードをステップさせたり相対ジャンプを行うためのインクリメント器と加算器回路。
- 11 ビットアドレス出力をマイクロコード ROM にブーストするアドレスラッチとドライバ。
条件の選択
マイクロ命令は「レジスタがゼロなら 5 ステップ先へジャンプ」といった形で記述でき、マイクロコードエンジンはレジスタ値に応じてジャンプを実行するか無視するか決定する。マイクロ命令の 6 ビットは 64 個の条件のうちの一つを指定し、多重選択器ツリーが該当する条件を選び出す:
[条件入力] → [多重選択器ツリー] → [選択された条件] → マイクロコードエンジン
- 最上位のマルチプレクサは 4 ではなく 5 入力を持ち、物理的に配置された条件回路と一致。
- 各 4:1 マルチプレクサはパストランジスタで構成され、制御線が一つのトランジスタを駆動して入力を出力へ通す。
合計 49 個の条件が 8087 に実装されており、条件選択回路はチップ全体に分散化されているため配線複雑性が低減される。
条件の種類
49 の異なる条件は以下のカテゴリに分類できる:
- Opcode 関連(15) – 現在の命令オペコードビットを調べ、類似した一群の命令を単一マイクロコードで処理しつつ、特定命令に応じて挙動を変更する(例:乗算か FILD/FIST 整数ロード/ストアか、またはオペコードの下位ビットが立っているかなど)。
- レジスタ関連 – 一時レジスタ tmpA, tmpB, tmpC を使用し計算中に値を保持。8087 は 80 ビット浮動小数点値を「タグ」ビット 2 個(メタデータ)とともに保存し、レジスタが空・ゼロ・通常・NaN・無限かどうかを示す。これらのタグは演算最適化やスタックオーバーフロー/アンダーフロー検出に利用される。
- 特殊 – 四捨五入モード、符号、非正規数、精度損失、同符号判定などを扱う。
- ユニバーサル「真」 – 無条件分岐を可能にする。
条件は 反転(true ならジャンプ/false ならジャンプ)も可能で、マイクロコードのビット P によって制御される。これは P ビットと条件値を XOR して実現される。
例:FCHS と FABS
FCHS(符号変更)と FABS(絶対値)のマイクロコードルーチンは、両命令が底部オペコードビットだけで異なるため同一のルーチンを使用する。ルーチンには条件付きジャンプが含まれる:
hex 0xc094 → binary 110 000001 001010 0 - ABC = 110: 相対ジャンプ操作 - D–I = 000010: ジャンプロフセット (+1) - J–O = 001010 (hex 0a): テストする条件(最後のオペコードビット) - P = 0: フリップなし
FABS の場合、ジャンプは次のマイクロ命令へ進み、 FCHS 用に符号ビットを設定する命令をスキップ。FCHS の場合はジャンプが発生せず、符号ビットがトグルされる。
結論
8087 は浮動小数点演算を 8086 よりも高速に実行できる専用ハードウェアを備えている。条件コード回路はその一例で、複雑な条件を単一操作で判定できる。だが、そのような高度な条件はマイクロコードの理解を難しくする。一方で、回路解析とマイクロコード調査を組み合わせれば進展が見込める。
「Opcode Collective」のメンバー、特に Smartest Blob と Gloriouscow に感謝。更新情報は以下でフォロー:
- Bluesky: @righto.com
- Mastodon: @[email protected]
- RSS
備考・参考文献