本連載は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の命令アーキテクチャはあまりうまく出来ていないというのは明瞭である。