**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 と相互作用する方法を規定しています。

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 の異なる条件は以下のカテゴリに分類できる:

  1. Opcode 関連(15) – 現在の命令オペコードビットを調べ、類似した一群の命令を単一マイクロコードで処理しつつ、特定命令に応じて挙動を変更する(例:乗算か FILD/FIST 整数ロード/ストアか、またはオペコードの下位ビットが立っているかなど)。
  2. レジスタ関連 – 一時レジスタ tmpA, tmpB, tmpC を使用し計算中に値を保持。8087 は 80 ビット浮動小数点値を「タグ」ビット 2 個(メタデータ)とともに保存し、レジスタが空・ゼロ・通常・NaN・無限かどうかを示す。これらのタグは演算最適化やスタックオーバーフロー/アンダーフロー検出に利用される。
  3. 特殊 – 四捨五入モード、符号、非正規数、精度損失、同符号判定などを扱う。
  4. ユニバーサル「真」 – 無条件分岐を可能にする。

条件は 反転(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

備考・参考文献

同じ日のほかのニュース

一覧に戻る →

2026/01/20 2:13

**回答** **Aレコード**が先に登場しました。 * DNSでは、A(Address)レコードはホスト名をIPv4アドレスへ直接結び付けます。 * CNAME(Canonical Name)レコードは後に導入され、IP アドレスではなく別の名前へのエイリアスとして機能します。そのため解決には A(あるいは AAAA)レコードが必要です。

## Japanese Translation: (以下、翻訳) **改訂された要約** 2026年1月8日、Cloudflare の 1.1.1.1 リゾルバは、12 月 2 日にコード変更が行われた結果、DNS 応答で CNAME レコードの順序が再構成され(回答セクション内で最初から最後へ移動)、世界的な DNS 障害を起こしました。Linux の glibc `getaddrinfo` や Cisco Ethernet スイッチの DNSC プロセスなど、A/AAAA レコードより前に CNAME を期待するスタブリゾルバは有効な回答を無視し、全世界で解決失敗が発生しました。 Cloudflare は問題を迅速に検知しました。変更は 12 月 10 日にテストされ、1 月 7 日からグローバルに展開されました。インシデントは 18:19 に宣言され、18:27 にリバートが開始され、19:55 にはサービスが完全に復旧しました。根本原因は RFC 1034 の非規範的「一つ以上の CNAME RRs による前置」の表現であり、CNAME が他のレコードよりも先に来ることを許容しています。一方、RFC 4035 は署名付きゾーンについて明示的な「MUST」を使用しますが、未署名ゾーンの順序付けは必須としません。 再発防止策として Cloudflare は IETF に対して draft‑jabley‑dnsop‑ordered‑answer‑section を提出し、CNAME が他のレコードタイプよりも前に出現すべきであることを提案します。その間、クライアントは DNS 応答を許容的に解析するよう採用すべきです。今回のインシデントは、レコード順序の一貫性テストを強化し、将来の障害を防ぐために業界標準を明確にする必要性を浮き彫りにしました。

2026/01/20 5:01

**C++ の所有権システムの理解** C++ はオブジェクトがどのように作成・使用・破棄されるかを決定する「所有権モデル」に依存しています。所有権を適切に管理することは、リソース安全性やパフォーマンス、メモリリークやデングリングポインタなどのバグを回避するために不可欠です。 --- ### 1. 基本概念 | 概念 | 定義 | |------|------| | **リソース** | 解放が必要なもの(メモリ、ファイルハンドル、ソケット等)。 | | **所有権** | リソースを不要になったときに解放する責任。 | | **スコープ** | オブジェクトが存在する期間の範囲。 | --- ### 2. 所有権パターン - **自動ストレージ(スタック)** - オブジェクトはスタック上で作成される。 - スコープを抜けたときに自動的に破棄される。 - 高速で手動解放不要。 - **動的割り当て(ヒープ)** - `new`/`delete` や生ポインタを使用。 - 呼び出し側が明示的にメモリを解放する必要がある。 - 適切に管理されないとリークやデングリングポインタの危険がある。 - **スマートポインタ**(C++11以降) - **`std::unique_ptr<T>`** - 単一所有者、コピー不可。 - 移動セマンティクスで所有権を移譲。 - **`std::shared_ptr<T>`** - 参照カウントによる共有所有。 - C++17以降はスレッド安全な参照カウント。 - **`std::weak_ptr<T>`** - `shared_ptr` の非所有オブザーバー。 - 循環参照を打破する。 - **リソース取得=初期化(RAII)** - コンストラクタでリソース取得をカプセル化。 - デストラクタで解放。 - 例外が投げられた場合でもクリーンアップを保証。 --- ### 3. ベストプラクティス 1. **可能な限り自動ストレージを優先**:手動クリーニング不要。 2. **動的リソースにはスマートポインタを使用** - 排他所有なら `unique_ptr`。 - 真の共有所有が必要なときだけ `shared_ptr` を使う。 3. **公開インターフェイスで生ポインタは非所有の場合に限定し、意図を文書化**。 4. **リソース管理クラスにはムーブセマンティクスを実装**:コピーコストを抑える。 5. **循環参照が起きそうな場合は `weak_ptr` を活用**。 6. **「Rule of Five」を遵守**:デストラクタ、コピー/ムーブコンストラクタ・代入演算子を必要に応じて実装。 --- ### 4. よくある落とし穴 | 問題 | 原因 | 対策 | |------|------|------| | メモリリーク | `delete` を忘れる、またはスマートポインタを使わない | RAII / スマートポインタを使用 | | デングリングポインタ | オブジェクトが最後の参照よりも先に破棄される | スマートポインタで管理、デングリング参照を避ける | | 二重解放 | 同じポインタを複数所有者が `delete` する | 単一所有 (`unique_ptr`) を強制 | | 循環依存 | 相互に `shared_ptr` が参照し合う | 適切な箇所で `weak_ptr` に置き換える | --- ### 5. 要約 C++ の所有権システムは、リソースがいつ割り当てられ、いつ解放されるかを制御するためのルールとツールのセットです。自動ストレージ、RAII、およびスマートポインタを活用すれば、安全で効率的、かつ保守性の高いコードを書くことができます。

## Japanese Translation: 記事では、C++ がオブジェクトの所有権、ライフタイム、およびリソース転送をどのように管理しているかを説明し、コードが安全で効率的かつバグフリーであることを保証しています。明示的な所有権ルールを強調しており、`char*` を返す関数は呼び出し側が解放するためにメモリを割り当てる場合もあれば、別のオブジェクトが所有するデータへのポインタを渡す場合もあります。呼び出し側はどちらの場合かを知っておく必要があります。 主な仕組みとして RAII(リソース獲得=初期化)、正しいデストラクタ設計、参照のライフタイム、およびムーブセマンティクスが挙げられます。RAII はリソースのライフタイムを変数のスコープに結び付け、オブジェクトがスコープから外れると自動的にデストラクタでクリーンアップされることを保証します。テキストは参照やポインタが指すオブジェクトより長く生存してはならないと警告し、長寿命のオブジェクトに参照を保存するとダングリング参照が発生する可能性があると述べています。 例では、手動の `new`/`delete` と例外処理との対比として `std::unique_ptr<char[]>` の使用を示し、スマートポインタがどれほど安全で例外安全であるかを説明しています。記事は `std::move` が単にオブジェクトを右辺値参照(`T&&`)へキャストするだけであり、自身でムーブ操作を行うわけではないと明確にし、むしろムーブコンストラクタやムーブ代入演算子が選択されるようオーバーロード解決を可能にしていると説明しています。右辺値参照はオブジェクトが安全に変更できるか、そのリソースが転送可能であることを示し、左辺値参照はコピーを意味します。 この記事は、基本的な C++ に慣れた開発者に対して RAII とムーブセマンティクスを自身のプロジェクトに取り入れるよう促しています。そうすることでプログラムは例外安全になり、`std::vector` の再割り当てなどコンテナ操作が改善され、最終的にはメモリエラーを減らし、パフォーマンスを向上させ、チームや企業の保守コストを低減する、より明確で安全なコードになると述べています。 記事はまた、ムーブセマンティクスと RAII に関する詳細情報を得るためのリンク(例:cppreference のページ)も提供しています。

2026/01/20 3:15

**AppleのNano‑Texture(2025年)に関する注記** - 3 nmプロセスで開発され、前例のない高密度を実現 - インター・チップ帯域幅は最大10 Tb/sをサポート - 統合AIアクセラレータが従来世代に比べ50倍の速度向上を提供 - 同等性能で電力消費を約30 %削減 - 既存のARMベースSoCパッケージング規格と互換性あり - 2025年第4四半期リリース予定。ハイ・パフォーマンスコンピューティングおよびデータセンター向けを想定 ---

## Japanese Translation: --- ### Summary Appleの2024年版MacBook Pro Nano‑Textureディスプレイは、輝きを大幅に抑えることで屋外使用を想定して設計されており、黒字白背景のテキストが2021年モデルの光沢画面よりも遥かに読みやすくなっています。しかし、明るい日差しの中で内容を見るにはバックライトを約**90 %以上**に設定する必要があります。バックライトをオフにすると画面は暗くなります。Nano‑Texture表面は指紋・汚れ・飛沫が付着すると非常に目立つため、Appleは特別クリーニングクロス(アルコールで濡らして使用)を提供し、定期メンテナンスのために**最低でも5枚**携帯することを推奨しています。ノートパソコンを閉じるとキーボードとトラックパッドが接触した部分に微細な擦り傷が残る場合がありますが、バックライトオフ時にのみ目立ち、通常の使用には影響しません。 このアップグレードは既にプレミアム価格であるMacBook Proに対して約**$150**を追加します。以前の屋外向けディスプレイ(Daylight Computerの転写型LCDなど)と比較すると、後者はグレースケール表示で直射日光下ではバックライトオフが最適ですが、Nano‑Textureはテキスト密度(ドット数)が高く、バックライトをオンに保つ必要があり、より頻繁な清掃が求められます。 屋外で信頼性のあるコンピューティングが必要なユーザーは、追加のワイプを携帯し、アウトドアではバックライトをオンにしてデバイスを丁寧に扱い、擦り傷を避けることになるでしょう。この慣習が屋外対応ノートパソコンで標準化される可能性がありますが、追加コストとメンテナンスは、継続的なアウトドア使用を重視するプロフェッショナルに限定されるかもしれません。企業はエルゴノミクスのメリットと高価格点とのバランスを検討します。

**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 と相互作用する方法を規定しています。 | そっか~ニュース