本連載はHisa Ando氏による連載「コンピュータアーキテクチャ」の初掲載(2005年9月20日掲載)から第72回(2007年3月31日掲載)までの原稿を再掲載したものとなります。第73回以降、最新のものにつきましては、コチラにて、ご確認ください。
最低限の命令が定義されたので、ここで10進16桁の数値を加算するケースについてコーディングと性能を考えてみよう。
オペランドのアドレスはIX1、IX2、結果を格納するアドレスはIX3に格納されている状態からスタートすると、MJアーキテクチャのプロセサでは、
- FIM IX0,-16;ループカウンタの初期化。IXCYもクリア
- CLB;アキュムレータとキャリーをクリア
- L1:ADD IX1++;第一オペランドをアキュムレータにロードし、IX1を+1
- ADD IX2++;第二オペランドをキャリー込みでアキュムレータに加算し、IX2を+1
- DAA;加算結果を10進補正
- ST IX3++/CLA;結果を格納し、アキュムレータをクリア
- INC IX0;ループカウンタを+1する
- JCN 1001,L1;キャリー(IXCY)が出なければL1に戻る
となる。ここでIX1++の形の表現は、インデックスレジスタを使用後+1することを意味している。また、ST命令で/CLAを付けたものは、アキュムレータの内容をストアし、その後、アキュムレータをクリアすることを意味している。
ここで書いた10進16桁の加算コードは、命令ROMの必要量は10バイトで、ループ1回の実行時間はRAMをアクセスするADD、ST命令が各11サイクル、DAA、INC命令が各8サイクル、JCN命令が16サイクルで、計67サイクルである。
一方、4004では、4002 RAMは10進16桁のMM文字を持っているので、これらの二つの16桁の数を足すプログラムを考える。それぞれの数値の最下位の数のアドレスはレジスタペア2と4に入っているとし、レジスタペア6に格納されたアドレスからの加算結果をRAMに書き込むこととする。また、これらのアドレスは全て同じRAMチップ内であり、その選択情報は既に4004のCMレジスタに格納済みであるとする。
この状態から加算を行うコードは以下のようになる。
- CLB;アキュムレータをクリア
- XCH R0;ループカウンタR0に0を格納
- L1:SRC R2;第一オペランドのメモリアドレスをセット
- RDM;第一オペランドをアキュムレータに読み込み
- SRC R4;第二オペランドのメモリアドレスをセット
- ADM;第二オペランドをキャリーと一緒にアキュムレータに加算
- DAA;10進補正
- SRC R6;結果のメモリアドレスをセット
- WRM;結果を格納
- INC R3;第一オペランドのアドレスを次の桁に進める
- INC R5;第二オペランドのアドレスを次の桁に進める
- INC R7;結果のアドレスを次の桁に進める
- ISZ R0,L1;ループカウンタを+1し、16にならなければL1へ戻る
このプログラムは、全体で命令ROMを14バイト必要とし、ループ1回の実行時間は96サイクルである。
つまり、 MJアーキテクチャと4004アーキテクチャのプロセサのハードウェア規模は同程度であるが、アーキテクチャの違いで、この10進16桁の加算の場合は、4004に比べて命令メモリの必要量は71%に減少し、ループボディーの実行性能は1.43倍に向上している。
また、4004のINCやISZ命令では4ビットのRレジスタをインクレメントしており、上記のプログラムでは4ビットレジスタからの桁上がりを考慮していないので、初期値がゼロでループ回数が16回以下の場合でないと処理できない。これに対してMJアーキでは12ビットのIXレジスタをインクレメントしているので、全メモリアドレス空間で問題なく動作するというメリットがあり、全体として、MJアーキと4004アーキの性能差は、この比較より大きいと言える。
このMJアーキテクチャは、設計時期が4004に遅れること35年であるので、その間の知見を加えてより効率の良いアーキテクチャが作れて当然であるが、この比較を見ると、やはり、4004の命令アーキテクチャはあまりうまく出来ていないというのは明瞭である。