x87

出典: フリー百科事典『ウィキペディア(Wikipedia)』
Intel 80387SXから転送)
移動先: 案内検索


x87x86アーキテクチャー命令セットのうち浮動小数点数関係のサブセットのことである。もともとはx86系CPUと協調して動作するオプションの浮動小数点数コプロセッサでサポートされる8086命令セットの拡張機能であった。これらのマイクロチップは後ろに"87"という名前が付いていた。これはNPX(Numeric Processor eXtension)としても知られる。基本命令セットに対する他の拡張と同様、x87命令は作業プログラムの構築を厳重には必要とせず、共通の数値処理のハードウェアおよびマイクロコードの実装を提供し、これらの処理を機械語ルーチンで合わせるよりもはるかに高速に行うことができる。x87命令セットは加算、減算、比較の基本的な浮動小数点演算だけでなく、タンジェント関数やその逆関数などのより複雑な数値演算を含む。

Intel 80486以降のほとんどのx86プロセッサーはこれらのx87命令をメインCPUに含んでいるが、この用語は今でも命令セットの一部を指すのに用いられることがある。PCにおいてx87命令が標準になる前、コンパイラプログラマは浮動小数点演算を実行するためにかなり遅いライブラリコールを使用していた。この手法は(低価格の)組み込みシステムでは依然一般的である。

性能[編集]

典型的なx87 FPU命令(ここで示すのはレジスタ同士のみ)のクロックサイクル数の例。[1]

数値中のa~b表記はパイプラインの状況だけでなく選択された演算精度(32、64、80ビット)によって変動する。また、ビットのセットやゼロといった数値の場合によるバリエーションを含む。a→b表記は使用可能であった最小から最大のクロック周波数を示す。

x87実装 FADD FMUL FDIV FXCH FCOM FSQRT FPTAN FPATAN 最大クロック 最高 FMUL/sec 5MHz 8087§ FMULとの相対値
8087 70~100 90~145 193~203 10~15 40~50 180~186 30~540 250~800 5→10MHz 34~55K→100~111K 1.0→2.0倍速
80287(オリジナル) 70~100 90~145 193~203 10~15 40~50 180~186 30~540 250~800 6→12MHz 41~66K→83~133K 1.2→2.4倍速
80387(または80286後期) 23~34 29~57 88~91 18 24 122~129 191~497 314~487 16→33MHz 280~552K→579~1100K 約10→20倍速
80486(または80487) 8~20 16 73 4 4 83~87 200~273 218~303 16→50MHz 1.0M→3.1M 約18→56倍速
Cyrix 6x86, Cyrix MII 4~7 4~6 24~34 2 4 59~60 117~129 97~161 66→300MHz 11~16M→50~75M 約320→1400倍速
AMD K6 (K6 II/III含む) 2 2 21~41 2 3 21~41 todo todo 166→550MHz 83M→275M 約1500→5000倍速
Pentium / Pentium MMX 1~3 1~3 39 1 (0*) 1~4 70 17~173 19~134 60→300MHz 20~60M→100~300M 約1100→5400倍速
Pentium Pro 1~3 2~5 16~56 1 (0*) 1 28~68 todo todo 150→200MHz 30~75M→40~100M 約1400→1800倍速
Pentium II / III 1~3 2~5 17~38 1 (0*) 1 27~50 todo todo 233→1400MHz 47~116M→280~700M 約2100→13000倍速
Athlon (K7) 1~4 1~4 13~24 1 (0*) 1~2 16~35 todo todo 500→2330MHz 125~500M→0.580~2.33G 約9000→42000倍速
Pentium 4 1~5 2~7 20~43 複数サイクル 1 20~43 todo todo 1.3→3.8GHz 186~650M→0.543~1.90G 約11000→34000倍速
Athlon 64 (K8) 1~4 1~4 13~24 1 (0*) 1~2 16~35 todo todo 1.0→3.2GHz 250~1000M→0.800~3.2G 約18000→58000倍速

(0*) 高効率のゼロ遅延はスーパースカラー実行によって可能になることがある。

§ 5MHz版8087はオリジナルのx87プロセッサ。典型的な8086上の(8087を使わない)ソフトウェア実装による浮動小数点ルーチンに比べて、倍数ははるかに大きく、おそらく10倍以上になる。(すなわち、アセンブリ言語による正確な浮動小数点加算は1000サイクル以上を消費する。)

開発・製造を行った企業[編集]

Intel 8087またはそれ以降のモデルと互換性があるFPUを設計または製造した企業を掲げる。

アーキテクチャーの世代[編集]

Intel 8087[編集]

8087インテルによって設計された最初の16ビットプロセッサ用数値演算コプロセッサ(インテルでの呼称はNDP(Numeric Data Processor))。これはIntel 8088または8086とセットで組まれていた。しかし、Intel 8231浮動小数点プロセッサがより早期に設計されている。これは1977年のAMD製Am9511のライセンス生産品であった。[2]Am9511はIntel 8080用を意図していたが、いくつかのグルー・ロジックを使い、使用可能な予備の割り込み入力や割り込みベクタを持つ様々なマイクロプロセッサ(システム)に使用することができた。ファミリーには32ビットAm9511やAm9511A(またはIntel 8231/9231A)および後の64ビットAm9512(またはIntel 8232)を含む。

Intel 80187[編集]

80187(80C187)[3]Intel 80186 CPU用の数値演算コプロセッサ。80188は8ビットデータバスを持っているため8087しか使用できない。80187は80186や80187と同時期には登場せず、80287や80387の後に登場した。8087と同じメインプロセッサへのインターフェイスを持っているにもかかわらず、コアは80387のもので、IEEE754に完全に準拠するだけでなく全ての80387拡張命令を実行することができた。[4]

Intel 80287[編集]

6MHz版Intel 80287

Intel 80287は、80286のために用意されていた数値演算コプロセッサ。

8086同様80286は整数計算の命令しか備えていないため、80286だけで浮動小数点演算を行うには独自にライブラリを用意する必要があった。80287を80286の搭載されたコンピュータにセットすると、浮動小数点計算の命令を使うことができるようになる。また、互換性のため、アプリケーションからはNDPがあるように見せかけて、実際は割り込みルーチン内に浮動小数点演算ライブラリを組み込む手段も用意されていた。しかし、この方法は非常に遅いため、あまり使われる事は無かった。この手段を使わず、浮動小数点演算命令をエミュレーションライブラリにより実行していた場合は、NDPを利用するためにはアプリケーションソフトそのものも、再コンパイルが必要であった。

80287は、当初、協調して動作する80286と同一クロック周波数で同期して動作する見込みが立たなかったため、厳密な意味でのコプロセッサではなく、単なる入出力プロセッサとして設計された。このため、逆に、より高速なクロックで動作させる事もできた。また、このことにより、あまり意味はないがソフトウェア及び外部回路の工夫により、1つの80286に複数の80287を接続したり、他の種類のCPU、例えば386や、Vシリーズなどに80287を接続する事もできた。逆に、80286に、他の種類のNDPを接続する事も可能であった。 NECPC-9801VXなど、80286を搭載したコンピュータには、80287を刺すことができるソケットが用意されていた。

Intel 80287XL

後にIEEE 754への対応度を改善した80287XLが登場した。

Intel 80387[編集]

Intel 80387は、インテルの32ビットCPUである80386用の数値演算コプロセッサ。インテル最初のIEEE 754対応品となった(8087、80287はIEEE 754との間に非互換の部分を有する)。原理的にはこれ以前のプロセッサである8087や80287と同じである。

80386を搭載したコンピュータには、80387を挿すことができる専用のソケットが用意されていた。80386SX用には80387SXがある。

コプロセッサとのインターフェイスには特許が取得されていなかったため、IDTサイリックスが、さらに高速に演算を行う互換品を製造していた。

Intel487[編集]

i487SX

Intel487は、Intel486の、内蔵FPUをオミットした廉価版である486SX用の外付けFPUコプロセッサという名目で発売されたプロセッサである。実態は、486SXの全機能を乗っ取り、フル機能の486DXとして働くものであり、コプロセッサというよりは、後のオーバードライブプロセッサに近い。

486は最初から数値演算コプロセッサの機能が統合されて開発されたため、コプロセッサは必要なかった。しかし、後に数値演算機能のない廉価製品の486SXが発売されると、それ用の487SXが用意された。内部は、486DXとほとんど全く同等である。

クロックダブラを搭載したSX2が発売されると、487SX2が追加された。こちらの内部はDX2である。

原理[編集]

従来のx87シリーズは、x86シリーズCPU用の数値演算コプロセッサとして開発されているが、486は数値演算コプロセッサの機能を内蔵する形で開発され、外部の数値演算コプロセッサと通信する機能を持っていないため、浮動小数点演算機能のみを後から追加する事は出来ない(必要ない)。

しかし、廉価版として486SXを用意したため別の方法で浮動小数点演算機能を追加する必要ができた。このため487SXは486DXと同等のCPU機能を搭載し、システムは、487SXが装着された場合には従来のCPUを停止させて487SXをCPUとして動作させることとした。このようにしてシステムへの数値演算コプロセッサ機能の追加を実現したが、増設により従来の80x87シリーズと同等の役割を果たしているように見えることから、従前の命名規則による487SXという名称にされている。

487SX用スロットが用意されていない486SX搭載機では、(それが可能なように設計されていれば)CPUを単に486DXに乗せ変えることで浮動小数点演算機能に対応できる。このような考えはオーバードライブプロセッサに引き継がれた。また、486SX2を最後にFPU非内蔵モデルは消えたため、x86用数値演算コプロセッサは消滅した。

マルチプロセッサに対応するための機能は無いので、486SXと増設した487SXを同時に使用することはできない。

関連記事[編集]

脚注[編集]

  1. ^ 数字はプロセッサーのデータシート、プログラミングマニュアル、最適化マニュアルより。
  2. ^ http://www.cpushack.com/2010/09/23/arithmetic-processors-then-and-now/
  3. ^ CPU Collection - Model 80187
  4. ^ http://www.datasheetcatalog.org/datasheet/Intel/mXryvuw.pdf

注釈[編集]

外部リンク[編集]