見出し画像

8087 - コプロセッサというもの

大型機はもちろんミニコンであっても普通は浮動小数点演算をハードウェアで処理しているのが普通でした(ミニコンではオプションの構成もありましたけど)。何せ計算機なんですから整数しか計算できないなんてあり得ません。ところが初期のマイコンの時代には、ひとつのチップに浮動小数点演算の回路を組み込むには半導体の集積度が足りませんでした。そこでアッサリと浮動小数点演算はソフトウェアで処理することとして、その機能を切り捨ててしまったんです。

まあ、マイコンで処理をする対象で、どの程度、小数の計算が必要なのかは微妙なのは確かで、大抵の場合は整数で間に合います。それにどうしても必要であればコードを書けば良いのですから、そんなに悪い判断ではなかったんだと思います。もちろんソフトウェアで実行するのですから、それなりにパフォーマンスは悪くなるのですが、そもそもそんなに処理速度が必要なのであれば、マイコンなんて使わないでくださいという時代でした。

CPUの機能で足りない処理を外部のハードウェアを使って実行するというのは、今でもグラフィックを外部のボードを使って処理するのは当たり前ですし、暗号処理などの専用チップもあります。外部の専用チップとアイ・オーであるとか共有メモリを使って処理に必要なデータとコマンドを送って処理してもらうことでパフォーマンスを上げる設計はよくあるのですが、ソフトウェア的にはあたかもCPUが実行しているかのように協調して処理を行えるように設計されているチップをコプロセッサと呼びます。

コプロセッサ

コプロセッサのうち浮動小数点演算など数値計算処理に特化したデバイスを特にFPUと呼んで、16ビットマイコンになった頃から登場するようになりました。

FPU

さすがにマイコンも16ビットの時代に入ると、ミニコンが使われていた領域に進出し始めていて、いつまでも整数だけで間に合わすと言うわけにもいかなかったのですが、CPUにFPUを組み込むにはまだ集積度が不足していましたし、数値計算が重要視されない用途も多く、FPUを内蔵することによるコストアップは避けたいという事情もありました。

コプロセッサ(よくコプロと略される)として有名だったのが8086向けの8087で、80ビットの浮動小数点レジスタを8つ持ち、これらのレジスタを使って浮動小数点演算だけではなく三角関数や対数計算を行う命令を持っています。変わっているのがレジスタを逆ポーランド記法のようにスタック的に使うところです。

Intel 8087

x87

8087の命令は外部プロセッサで処理をするという意味のESC命令を使うのですが、この命令は8086としては無効命令で、これを実行することにより発生する例外をトラップして処理を8087に渡すというなかなかトリッキーな仕組みになっています。

8087

パソコンなどで8087が使えるようになっているケースは多かったのですが、実際にそれを挿し込んで使っているケースは、殆どありませんでした。何せCPUなんかより、よほどお高かったですし、ちゃんとコプロに対応したインタプリタであるとかコンパイラを使わなければ意味がありませんでしたしね。

8086系のCPUも486以降はコプロセッサではなく、その機能をCPUに内蔵するようになりましたが、それまではコンパイラでコードを出す時に、コプロのあり、なし、もしくは実行時に判定を行うというオプション設定が必要でした。実は8087と互換性のある「正式な」浮動小数点演算は、ソフトウェアで実行するにはやや重いので、これを少し簡略化した代替浮動小数点演算というライブラリもあって、どの方法で演算を行うか悩み深いものがありました。計算方法によって、微妙な精度の違いもあって、同じコードでもちょっとだけ結果が異なり比較演算などで配慮が必要でした。まあ精度の話は浮動小数点演算あるあるなんですけどね。

外付けFPUのコプロは何もインテルの専売特許ではなく、モトローラの68000に対しても用意されていました。ただ68000はFPUが無くてもパフォーマンスが良かったためか、ソフトウェアで間に合っていたのか、あまりコプロが使われたケースをしりません。お高いワークステーションには、コッソリ入っていたのかなぁ。

Intel 8087からRapidCADまで コプロセッサーの歴史

ヘッダ画像は、以下のものを使わせていただきました。https://commons.wikimedia.org/wiki/File:I8087.jpg
在原ヶ谷戸 - 投稿者自身による著作物, CC 表示-継承 3.0, https://commons.wikimedia.org/w/index.php?curid=129677653による

#コプロセッサ #コプロ #インテル #8087 #x87 #8086 #FPU #浮動小数点演算  

この記事が気に入ったらサポートをしてみませんか?