命令の長さは短いに越したことは無い。命令が短ければ、命令を格納するメモリも少なくて済むし、一定サイズの命令キャッシュに格納できる命令数は増加し、キャッシュのヒット率が向上する。このため、使用頻度の高い命令は短いエンコーディングを行い、相対的に使用頻度の少ない命令は長くても良いというエンコーディングが推奨され、x86命令アーキテクチャにもその思想が取り入れられている。
しかし、処理全体を見ると、命令の占めるメモリはデータが使用するメモリに比べて小さいし、命令のフェッチはデータのフェッチに比べて必要なバンド幅も小さいので、命令を短くして詰め込むことを工夫するより、ハードウェアが高速に動作できる命令が良いという考え方もあり、RISCでは固定長の命令が用いられている。
プログラムが占めるメモリという点では、固定長命令のRISCのバイナリコードに比べて、CISCのバイナリコードは20~30%くらい小さいというのが通り相場で、バイナリコードの格納領域を減らしたいという用途では、CISCアーキテクチャの方が有利である。携帯電話などの組み込み用途では、機能が豊富になり格納するプログラム量も増えており、プログラムを格納するFlashメモリのコストを削減したいという要求があり、プログラムサイズが小さくなる命令アーキテクチャは魅力がある。
このため、携帯はで一番メジャーなアーキテクチャであるARMのRISCプロセサでは、標準の32ビット長のRISC命令に加えて、16ビット長のThumb(ARM:腕に対して、Thumb:親指という命名)という命令セットを追加し、一つのプログラムの中でも両者を切り替えて使用できるようにしている。そして、ARMの発表では、Thumb命令セットを使用することにより、コードサイズは35%程度縮小すると述べており、RISCベースの命令アーキテクチャでも、このような拡張を行うと、CISCと同じ程度のコード密度が得られてしまう。
また、汎用レジスタを使うアーキテクチャでは、レジスタの数が多い方がメモリへの退避、復元が減り、処理性能は向上する。x86アーキテクチャでは、汎用レジスタは8個であるが、VAXでは16個、そしてRISCでは一般的には32個というように汎用レジスタ数は増加の傾向にある。
レジスタ数が32個の場合は、その指定に5ビットが必要であり、3アドレス形式の命令の場合は、レジスタ指定に合計15ビットが必要となる。レジスタ数を更に増やして128個にしようとすると、それぞれのオペランドの指定に8ビットを必要とし、オペランド指定だけで24ビットを必要とする。このため、32ビットの命令長では、演算の種類などの指定に使うビット数が8ビットしか残らず、十分な命令バリエーションが作れなくなってしまう。もちろん、命令長を41ビットとかに増加すれば良いのであるが、昔の単一語長のマシンの時代はともかく、現在のバイト単位のアドレスを持つマシンでは、バイト単位でない長さの命令は非常に扱いにくい。そして、命令の長さが2のベキのバイト数であればより扱いやすい。このため、PowerPC、MIPS、SPARCなどのRISCアーキテクチャのマシンでは32ビットの命令長で、32個のレジスタという構成となっている。
しかし、Itaniumアーキテクチャでは、レジスタ数を128個に増やして性能を上げるというアプローチを採っている。そのため、命令は32ビットには納まらず、128ビットを命令バンドルと呼ぶ一つの単位として、その中に41ビット長の命令を3つ格納するという方法が採られている。
Itaniumプロセサの命令バンドル形式 |
そして、残りの5ビットはテンプレートと呼ばれるフィールドにあてられている。Itaniumでは、命令はALU(Arithmetic Logic Unit:整数/論理演算ユニット)を使う命令、ALUを使わない整数命令、浮動小数点演算ユニットを使う命令、分岐命令、メモリをアクセスする命令などにグループ分けされており、テンプレートは、それぞれの命令スロットにどのタイプの命令が入っているかを示し、命令のデコードを容易にしている。