本連載はHisa Ando氏による連載「コンピュータアーキテクチャ」の初掲載(2005年9月20日掲載)から第72回(2007年3月31日掲載)までの原稿を再掲載したものとなります。第73回以降、最新のものにつきましては、コチラにて、ご確認ください。

これまでは、ブロックダイヤグラムと命令セットの定義ありきから、Faggin氏の論理設計を追体験してきたが、この元となるブロックダイヤと命令セットをHoff氏はどのようにして作ったのであろうか?

Hoff氏が4004のマイクロアーキテクチャを考えた1969年頃の状況を見ると、今でも使われているメインフレームの最初のモデルグループであるIBM System/360が出来たのが1964年、そして、IBM 1130という16ビットのエンジニアリング向けのコンピュータも1965年に発売され、広く使用された。そして、ミニコンという名前で一世を風靡した12ビットのDEC社のPDP-8も1965年に発売されている。という状況で、これらのプロセサのアーキテクチャを参考にすることが出来た筈である。

4ビットプロセサのアーキテクチャを考えるにあたり、先ず、これらのマシンがどのような命令アーキテクチャを持っていたかを概観してみよう。

IBM Syetem/360

IBMのSystem/360は32ビットの本格的コンピュータで、当初のアーキテクチャから機能増強は続けられているものの、40年余りにわたって使い続けられているGene Amdahl博士の設計による傑作コンピュータアーキテクチャである。それまでは、コンピュータの命令セットはマシンごとに新たに作られていたが、超大型から小型メインフレームまでの一連のラインアップで全く同じ命令が動作するという点で画期的なマシンであった。但し、超大型は全ての命令をハードウェアが直接実行するのに対して、小さなモデルでは複雑な命令はマイクロプログラムを使用してエミュレートすることにより、小さなハードウェアで同じ命令セットの実行を可能とし、性能とコストのバリエーションを作り出していた。

IBM S/360は16個の汎用整数レジスタと4個の浮動小数点レジスタを持つアーキテクチャで、レジスタとレジスタの間で演算を行うRR形式の命令は16ビット長、レジスタとメモリ間で演算を行うRX形式の命令は32ビット長であった。この他にRS命令、SI命令、SS命令などがあったが、ここでは説明は省略する。

すべての命令は、命令の種別を示す8ビットのOPフィールドを持ち、その最初の2ビットは次のようなエンコードで命令の形式をあらわしている。

  • 00:16ビット長 RR形式
  • 01:32ビット長 RX形式
  • 10:32ビット長 RS、またはSI形式
  • 11:48ビット長 SS形式

RR形式は、命令種別を表すOPが8ビット、レジスタを指定するR1とR2は、汎用レジスタの数が16個であるので、それぞれ4ビットである。

  • RR形式

RR形式の命令は、たとえばOPが加算を行うADDの場合は、R1の汎用レジスタの内容とR2の汎用レジスタの内容を加算して、結果をR1に格納する。このように、2つのオペランドを同時に指定することが出来るので、S/360の命令は2アドレスの命令と呼ばれる。

RX形式は、次のような形であり、OPとR1はRR形式と同じであるが、その次は4ビットのX1、そして次の4ビットがB2、残りの12ビットがD2となっている。

  • RX形式

RR形式はレジスタ間の演算しか指定できないが、RX形式では2番目のオペランドはメモリ上にあり、そのアドレスをX1、B2、D2で指定する。X1とB2はそれぞれ4ビットであり、汎用レジスタの番号を指定する。そしてD2は12ビットの値である。X1はインデックスレジスタ、B2はベースレジスタと呼ばれ、2番目のオペランドのメモリアドレスは、X1で指された汎用レジスタの内容とB2で指された汎用レジスタの内容とD2フィールドの12ビットの正の整数の合計で指定される。

S/360は大型メインフレームであり、タイムシェアリングで多数のプログラムを同時(ミクロには短い時間で実行するプログラムを切り替えるが、人間から見ると、同時並行的に複数のプログラムが実行されているように見える)に実行するという使い方を意識しており、メモリが高価であったので、複数のプログラムをメモリに詰め込んで格納するために、メモリアドレスを変更しても動かせるというリロケーション機能が必要であった。これを可能にするのがベースレジスタであり、このベースレジスタの内容を変えることにより、プログラムを格納する物理番地を変えることが出来るようになっている。そして、インデックスレジスタは命令自体を変更することなく、このレジスタの内容を変更するだけで文字列や配列の各要素をアクセスすることを可能としている。

ということで、RX形式の命令は、強力なメモリアドレッシング機能を持ち、このメモリアドレスの内容とR1レジスタの内容を演算してR1レジスタに格納する。また、OPがストア命令の場合は、R1レジスタの内容をX1、B2、D2で指定されるメモリアドレスに格納する。

System/360は語長が32ビットのマシンであるが、半分の16ビットのHalf Word、2倍の64ビットのDouble Wordのデータも扱える。また、ここでは説明を省いたSS形式などでは2進化10進数なども扱うことが出来る。

S/360の命令の特徴は、例えば、ADD命令はRR形式にもRX形式にも存在し、また、ハーフワード、ワード、ダブルワードというデータ形式が扱えるADD命令が揃っているというように、命令の種別と扱えるアドレッシング、データ形式の独立性が高い点で、コンピュータアーキテクチャでは、これを直交性が高い命令アーキテクチャと呼び、綺麗なアーキテクチャと見なしている。

例えば、コンパイラで加算を処理しようとするとき、最初はレジスタとメモリの加算であったものが、最適化を行っていくと、メモリを読まなくてもレジスタに置けるようになるというケースがある。直交性が高い命令なら単にRX形式の命令をRR形式の命令に置き換えれば良いが、対応するRR形式の命令が無ければ、異なる命令列が必要となりコスト計算が変わってくるというように、直交性の悪い命令体系だとコンパイラの処理が複雑になる。