一方、RISCの場合は、メモリをアクセスするのはロード、ストア命令だけであり、一つのオペランドだけがメモリを参照できれば良い。RISC命令アーキテクチャの例として、SPARCのロード、ストア命令のフォーマットを次の図に示す。

SPARCのロード、ストア命令のフォーマット

OPとOP3が命令のOPコード部であり、この8ビットで命令の種別を表す。そして、ロード命令、ストア命令ともにRs1以降の19ビットでメモリアドレスを表現し、ロード命令の場合はRdはメモリからのデータを格納するレジスタを指定し、ストア命令の場合はメモリに格納すべきデータを保持しているレジスタを指定する。

右端から14ビット目が"0"の場合は形式1で、 Rs1レジスタの内容とRs2レジスタの内容の和がメモリアドレスとなる。この命令はRs2の内容をデータサイズ倍する機能は無いが、VAXのIndexedモードのようにRs1に配列の先頭アドレスを入れ、Rs2にオフセットを入れてメモリをアクセスするという使い方が出来る。一方、右端から14ビット目が"1"の場合には形式2であり、Rs1レジスタの内容にsimm13部分で表現される-4096~+4095までの数値が加算されたものがメモリアドレスとなる。

つまり、SPARCのロード、ストア命令のアドレッシングは、概略、VAXのByte / Word / Long DisplacementとRegister DeferredのベースモードにIndexedを付けたモードに相当する機能を持っている。また、演算命令自体がRegisterとLiteralモードをサポートしているので、全体では、VAXの最初の4つのモードのサポートに相当する機能を持っているが、二重の間接アドレスやインクレメント、デクレメントなどの機能は持っておらず、これらの機能が必要な場合は複数の命令を組み合わせて実現する必要がある。

データタイプとアライメント - データタイプ

初期のコンピュータでは、演算の対象となるデータはハードウェアの語の長さで決まっており、それを分割して文字として使用する場合や、複数の語を連結して1つの長いデータとして使用する場合は、全てソフトウェアで処理する必要があった。しかし、文字処理(英語圏がコンピュータ発祥の地であるので、1文字は8ビットで表現が可能)と数値処理の両方が必要であるという要請から、データタイプという考え方が出てきた。

データタイプはデータが何を表現するかという意味レベルの区別であり、文字を表現するバイト(8ビット)を最小単位として、2バイトの整数、4バイトの整数、そして64ビットアーキテクチャでは8バイトの整数というデータタイプが作られる。また、浮動小数点データでは4バイトの単精度、8バイトの倍精度のデータタイプを持つのが一般的である。更に、最近のアーキテクチャでは16バイト(128ビット)のデータタイプがサポートされているものも存在する。

このような各種のデータのタイプがあるが、どのタイプのデータを対象として処理を行うかは、一般には命令の種別で指定され、整数を対象とする命令と浮動小数点数を対象とする命令はOPコード部の値で区別されている。また、メモリアクセスを行う命令では、1バイトの整数を扱う命令、2バイトの整数を扱う命令、4バイトの整数を扱う命令などはOPコードの値が異なっている。

例外的であるが、Intelのx86命令アーキテクチャは、元々16ビットアーキテクチャとして設計された命令セットアーキテクチャであり、データタイプとしては16ビットのデータと8ビットのバイトしか取り扱えない構造となっている。

しかし、16ビットのデータやアドレスでは不足になってきたので、モードという概念を導入し、従来の動作は16ビットモードとして、新たに32ビットモードを付け加えた。そして、この32ビットモードでは各レジスタを32ビット長に拡張し、従来の16ビットのデータやアドレスのサイズを使う命令を32ビットのデータやアドレスを扱うという動作と定義した。つまり、32ビットモードでは、扱えるデータは32ビットか8ビットということになってしまった。これでは16ビットのデータが扱えなくなってしまうが、このような命令を新設するビットが命令語には残っていない。そこで、「モードに拘わらず、次の命令は16ビットデータを扱うものとする」というような但し書きをつけるという方法で、扱えるデータタイプを拡張するという方法をとった。この但し書きは1バイトで、対象とする命令の前に置かれるのでPrefixという名前が付けられている。

過去の製品からの連続性(上位互換)を維持するためには止むを得ないのであるが、この辺りがx86アーキテクチャの汚いところである。このため、Intelのアーキテクトがこれを清算したいと考え、HPと協力してItaniumのIA-64アーキテクチャを開発したのは無理からぬところであると筆者は思うのであるが、その結果はご存知の通りである。これはアーキテクチャが技術だけでは決まらないという好例であろう。