HN 日本語サマリー

← 一覧へ戻る
科学・技術

Intel 8087浮動小数点チップのマイクロコード:SCALE命令

Microcode in Intel's 8087 floating-point chip: the scale instruction (righto.com)

49 pointsby pwg17 コメント

要約

この記事は、1980年に登場したIntel 8087浮動小数点コプロセッサのFSCALE命令のマイクロコードをリバースエンジニアリングした結果を解説しています。FSCALE命令は、浮動小数点数を2のべき乗でスケーリングする高速な命令ですが、その内部実装は予想以上に複雑で、多くの特殊ケースを処理するための140以上のマイクロ命令と3段階のサブルーチンコールを使用しています。

全文翻訳

Intel 8087浮動小数点チップのマイクロコード:SCALE命令 1970年代、浮動小数点演算は混乱していました。コンピュータメーカーは、十数もの互換性のない算術標準を持っていました。さらに、浮動小数点システムは、数学的な厳密さよりもハードウェアの単純さに基づいて設計されており、数値的安定性の問題につながっていました。これは、1980年にIntelが8087浮動小数点コプロセッサチップを導入したことで変化しました。このチップは、コーナーケースでも可能な限り正確になるように設計されていました。8087は、IBM PCに搭載できたため人気が出ました。これにより、スプレッドシートからCADに至るまで、さまざまなアプリケーションで浮動小数点演算を最大100倍高速化できました。しかし、より重要なのは、8087が今日のほとんどのコンピュータで使用されている浮動小数点標準になったことです。 8087は、マイクロコードと呼ばれる複雑な低レベルコードで命令を実装していました。私は、このマイクロコードをリバースエンジニアリングしているグループ、Opcode Collectiveの一員であり、最近進展がありました。この記事では、8087の命令の1つであるFSCALEのマイクロコードを調べ、このマイクロコードがどのように機能するかを説明します。 FSCALE (Floating-point Scale) 命令は、数値を2のべき乗でスケーリングする簡単な方法を提供し、乗算よりもはるかに高速です。私は、FSCALEはシンプルでほぼ些細な命令であり、理解して説明するのは簡単だろうと考えていました。ネタバレ:簡単ではありません。FSCALEは、多くの特殊ケースを処理するために、140以上のマイクロ命令と3段階のサブルーチンコールを使用しています。しかし、FSCALEのマイクロコードは、シフター、加算器、指数コンバーターなど、8087の多くの興味深い部分を示しており、8087の隠された機能も明らかにしていますので、興味を持っていただけることを願っています。 マイクロコードを調査するために、私は8087チップを開封し、顕微鏡で高解像度の画像を作成しました。中央にある大きなマイクロコードROMには、チップを制御する1648個のマイクロ命令が格納されています。左側にあるマイクロコードエンジンは、マイクロコードをステップ実行し、ジャンプやサブルーチンコールを処理します。チップの下半分は「データパス」であり、浮動小数点計算を実行する回路です。これは、数値の指数用の16ビットデータパスと、数値の仮数(または小数部)用の64ビットデータパスに分かれています。 Intel 8087浮動小数点ユニットチップのダイ、主要な機能ブロックをラベル付けして表示。ダイは5mm×6mmです。より大きな画像を表示するにはクリックしてください。 チップの下部を拡大すると、データパス回路が表示されます。関連部分を以下にハイライトしました。1 指数ROMにはさまざまな定数が格納されています。指数コンバーターは、指数を検査し、特殊な値を検出し、指数フォーマット間で変換する特殊な回路です。2 シフターは大きなコンポーネントです。64ビット3の値に対して、任意の量の左シフトまたは右シフトを可能にします。(8087のシフター回路についてはこちらに書きました。) 加算器は8087の計算の中心です。乗算、除算、平方根のためにループで使用されます。Bレジスタは加算器の一方の入力を保持し、複数のソースがもう一方の入力を提供できます。合計レジスタは加算器の出力を保持します。 8つのスタックレジスタと一時レジスタは、浮動小数点数を保持します。 FSCALEマイクロコードで使用される機能ブロックを示す8087のデータパスのクローズアップ。 8087の詳細 このセクションでは、FSCALEマイクロコードにとって重要な8087のいくつかの機能について説明します。8087を使用するために、プログラマは8つの内部レジスタに値を格納します。これらはスタックとして編成されています。各レジスタは80ビットの浮動小数点数を保持します。パフォーマンスを最適化するために、レジスタスタック内の各値には関連する「タグ」値があり、これはプログラマにはほとんど見えません。4 タグは、値を有効、特殊、ゼロ、または空としてラベル付けします。「正規」の浮動小数点値は有効とタグ付けされます。浮動小数点値が無限大、非数 (NaN)、または非正規化値の場合、特殊とタグ付けされます。ゼロ値はゼロとタグ付けされます。最後に、レジスタが空の場合(例えば、値がスタックからポップされた場合)、レジスタは空とタグ付けされます。 8087には、内部で使用するための一時レジスタ (tmpA, tmpB, tmpC) もあります。スタックレジスタと同様に、tmpAとtmpBは2つのタグビットを持つ80ビットレジスタです。しかし、tmpCは64ビットの仮数のみを保持します。 8087は、さまざまなサイズの浮動小数点数、整数、および2進化10進数など、さまざまなデータ型をサポートしています。しかし、内部的にはすべて「一時実数」と呼ばれる80ビット浮動小数点数として格納されます。この記事の残りの部分では、一時実数値のみを考慮します。 数値は、符号ビット、15ビット指数、および64ビット仮数(小数部)の3つの部分から構成されます。ほとんどの場合、浮動小数点数は符号 × 仮数 × 2^指数 で表されます。仮数は、先頭の1、バイナリポイント(10進数の小数点に相当)、および残りのビットで構成される1.bbb...の形式の64ビットバイナリ数です。5 浮動小数点数が有用なのは、指数が-16382から16383の範囲にあるため、その範囲が信じられないほど小さい値から天文学的に大きい値までをカバーしていることです。1つの重要な詳細は、指数には16383の「バイアス」が加算されて格納されていることです。したがって、実際の指数が負であっても、格納される指数は常に正です。6 80ビット一時実数フォーマット。三角形はバイナリポイントを示し、10進数の小数点に類似しています。Intel Numerics Supplementより。 8087は、以下に示すように、特殊な値として表現されるいくつかの種類の数値をサポートしています。ゼロと無限大には正と負の値の両方があります。「非数」(NaN) は、0/0やsqrt(-1)など、意味をなさない値を表します。NaNには単一の値ではなく、多数の表現があります。8087は、仮数に先頭の1がない、非常に小さい値である非正規化値および非正規化値もサポートしています。 特殊値のエンコーディング。Intel Numerics Supplementの表S-31に基づき、大幅に簡略化されています。「x」ビットは、他のタイプと競合しない限り任意です。 8087には、算術演算で何らかの問題が発生した場合を示す6種類の例外がある複雑な例外システムがあります。最も深刻なのは「無効な操作」で、0/0や∞-∞など、操作が無意味であることを示します。また、空のレジスタへのアクセス(スタックオーバーフローまたはアンダーフロー)、またはNaN値に対する操作も含まれます。8087には、値が大きすぎて格納できない場合のオーバーフロー例外、値が小さすぎて格納できない場合のアンダーフロー例外、およびゼロ除算例外(0/0を除く)もあります。非正規化オペランド例外は、結果が正規の値として格納するには小さすぎるが、非正規化値として格納できることを示します。最後に、精度例外は、値が正確に表現できず、丸められる必要があることを示します。(精度例外は非常に一般的です。1/10でさえ1つ生成されます。) 8087は、各例外タイプに対して細かい制御を提供しており、制御レジスタのビットで指定されます。例外がマスクされていない場合、8087は8086プロセッサに割り込みを送信し、プロセッサはソフトウェアで問題を処理します。例えば、プログラムを終了したり、エラーをログに記録したりします。あるいは、例外をマスクして、8087が可能な限り実行を続行することもできます。例えば、無効な結果はNaNに置き換えられ、オーバーフローまたはゼロ除算は無限大に置き換えられます。精度例外は丸めにつながります。(精度例外は非常に一般的です。1/10でさえ1つ生成されます。)マスクされた例外のポイントは、計算が継続され、可能な限り正確な結果が得られることです。ほとんどの場合、これがプログラマが望むことです。 これらの機能により、8087は柔軟になり、精度を提供しますが、特殊ケースの組み合わせを適切に処理する必要があるため、マイクロコードははるかに複雑になります。 8087のマイクロコード 8087命令の実行には、結果を計算するために数百の内部ステップが必要になる場合があります。これらのステップは実装されています