圧縮命令セット、または単に圧縮命令とは、マイクロプロセッサの命令セットアーキテクチャ(ISA)のバリエーションであり、命令をよりコンパクトな形式で表現できるようにするものです。実際のほとんどの例では、本来32ビット命令を使用するプロセッサにおいて、圧縮命令は16ビット長になります。16ビットISAは、完全な32ビットISAのサブセットであり、独立した命令セットではありません。この小さな形式にはいくつかのトレードオフがあります。一般的に、使用できる命令の数が少なくなり、1命令あたりのオペランドが3つではなく2つになり、使用できるプロセッサレジスタの数も少なくなります。
このコンセプトは、日立製作所がSH-5バージョンでSuperH RISCプロセッサ設計のコード密度を向上させる方法として最初に導入したものです。SH-5バージョンでは、命令セットが16ビットから32ビットに移行しました。新しい設計では2つの命令セットが採用され、1つは新しい設計のISA全体にアクセスできるもので、もう1つはSHcompactと呼ばれるより小さな16ビット命令セットで、プログラムをより少ないメインメモリで実行できるようにしました。現在では、最小のシステムでさえメモリ容量が、このコンセプトを生み出したシステムよりも桁違いに大きくなっているため、サイズはもはや主な懸念事項ではありません。今日では、メインメモリへのアクセス回数を減らし、モバイルデバイスのエネルギー消費を削減できるという利点があります。
日立の特許はArm Ltd.にライセンス供与され、同社のプロセッサで「Thumb」として知られていました。同様のシステムはMIPS16eやPowerPC VLEにも見られます。元の特許は期限切れとなり、このコンセプトはRISC-Vをはじめとする多くの最新設計に見られます。RISC-Vは当初からこのコンセプトを使用するように設計されていました。64ビットコンピューティングの導入により、この用語は以前ほど広く使われなくなりました。これらのプロセッサは一般的に32ビット命令を使用し、技術的には圧縮ISAの一種ですが、同じプロセッサファミリーの32ビット版の古いISAを主に修正したものであるため、実際には圧縮されていません。
マイクロプロセッサは命令を一連のビットとしてエンコードし、通常は複数の 8 ビットバイトに分割します。たとえば、MOS 6502では、命令はオペランド値とアキュムレータADCに既に格納されている値との間のバイナリ加算を実行します。プロセッサがオペランドを見つける可能性のある場所は様々です。メイン メモリ、特別なゼロ ページ、または「10」のような明示的な定数である可能性があります。これらの各バリエーションは、異なる 8 ビット命令、つまりオペコードを使用します。定数 10 をアキュムレータに加算する場合、命令はメモリに としてエンコードされ、$0A は10 進数値の 16進数です。代わりに、メイン メモリの $4400 に格納されている値を加算する場合は、リトルエンディアンのアドレスを使用してとなります。[ 1 ]$69 $0A$6D $00 $44
2 番目の命令はメモリ アドレスが 16 ビット長であるため 3 バイトを必要とすることに注意してください。命令によっては、1、2、または 3 バイトを使用する場合があります。[ 1 ]これは現在では可変長命令セットとして知られていますが、当時はメインフレームやミニコンピュータを含むほとんどのプロセッサが通常この概念の何らかのバリエーションを使用していたため、この用語は一般的ではなく、単に名前が必要なかったのです。1970 年代後半、マイクロプロセッサが 8 ビット形式から 16 ビット形式に移行し始めたときでさえ、この概念は一般的でした。Intel 8086は、アドレッシング モードに応じて 0 から 5 バイトの追加バイトが続く可能性のある 8 ビット オペコードを使い続けました。[ 2 ]
可変長命令が姿を消し始めたのは、32ビットシステムへの移行期、特にRISCコンセプトがプロセッサ設計を席巻し始めた頃でした。例えば、 MIPSアーキテクチャでは、すべての命令は単一の32ビット値であり、最上位ビットに6ビットのオペコードがあり、残りの26ビットは、限られたアドレッシングモードを表すために様々な方法で使用されます。ほとんどのRISC設計も同様です。固定長命令フォーマットへの移行は、初期のRISC設計のパフォーマンスを支える重要な設計コンセプトの1つでした。可変長システムでは、命令の読み出しに1~6メモリサイクルかかる場合があり、プロセッサがデータ準備完了前に命令を実行しようとしないように、ロジックの様々な部分間で配線が必要でした。RISC設計では、通常、演算は1サイクルで完了するため、デコードが大幅に簡素化されます。これらの相互接続回路の節約分は、代わりに追加のロジックやプロセッサレジスタの追加に充てられ、パフォーマンスに直接影響を与えます。[ 3 ]
RISC方式の欠点は、多くの命令が4バイトを必要としないことです。たとえば、論理左シフト命令はレジスタのビットを左にシフトします。算術レジスタAが1つしかない6502では、この命令は8ビットのオペコードだけで表現できます$06。[ 1 ]レジスタが多いプロセッサでは、必要なのはオペコードとレジスタ番号だけで、さらに4ビットか5ビットです。たとえばMIPSでは、この命令に必要なのは6ビットのオペコードと5ビットのレジスタ番号だけで、合計11ビットです。しかし、ほとんどのRISC設計の場合と同様に、この命令は依然として32ビットを占有します。このような命令は比較的よく使われるため、RISCプログラムは一般的に可変長プロセッサ上の同じプログラムよりも多くのメモリを占有します。[ 4 ] [ a ]
1980年代、RISCの概念が初めて登場した頃、プログラムサイズの増加はよくある不満点でした。命令が占める領域が増えると、システムはメモリから命令を読み込むのに多くの時間を費やす必要が生じます。これらの余分なアクセスによって、実際にはプログラムの速度が低下する可能性があると指摘されていました。広範なベンチマークテストの結果、ほとんどの場合RISCの方が高速であることが実証され、この議論は収まりました。しかし、パフォーマンスに関係なくメモリ使用量が懸念事項となるケースもあり、それは小型システムや組み込みアプリケーションです。2000年代初頭でさえ、DRAMの価格が高かったため、コスト重視のデバイスはメモリ容量が限られていました。日立は、このような市場向けにSuperH設計を開発しました。[ 6 ]
初期の SuperH 設計、SH-1 から SH-4 では、命令は常に 16 ビットを占有します。結果として得られる命令セットには、実用上の制限があります。たとえば、 の形式の 2 オペランド演算しか実行できませんがA = A + B、当時のほとんどのプロセッサは 3 オペランド形式 を使用していましたA = B + C。 1 つのオペランドを削除することで、命令から 4 ビットが削除されます (レジスタは 16 個あり、4 ビットが必要です)。ただし、これは数学コードの記述がやや複雑になるという代償を伴います。SuperH が対象とする市場にとって、これは容易に受け入れられるトレードオフでした。 16 ビット形式の大きな利点は、SRAMの容量が一定であれば、命令キャッシュに 2 倍の命令が保持されるようになったことです。これにより、システムはより高速で動作できますが、単一の 3 オペランド命令で実行できる演算を実行するために必要な追加の命令を使用することで、その一部が緩和される可能性があります。[ 7 ]
SH-5では、日立は32ビット命令フォーマットを採用しました。以前の設計との後方互換性を確保するために、SHcompactという2つ目の命令セットを追加しました。SHcompactは、元の16ビット命令を内部の32ビット命令に一方向でマッピングするもので、以前のマイクロコードプロセッサのように複数の命令を実行するのではなく、単に同じ命令のより小さなフォーマットでした。これにより、元の小さなフォーマットのプログラムを新しいSH-5に簡単に移植でき、命令デコーダの複雑さをほとんど増やすことなく済みました。[ 8 ]
ARMは、命令設計の側面に関する日立の特許のいくつかをライセンス供与され、それらを使用してThumb命令を実装しました。名前に「T」が付いたARMプロセッサには、元の32ビットバージョンに加えてこの命令セットが含まれており、BXコマンドを使用して実行時に32ビットモードから16ビットモードに切り替えることができました。Thumbモードでは、ARMの通常の16個のレジスタのうち上位8個のレジスタのみが表示されますが、これらは32ビットモードと同じレジスタであるため、これらのレジスタを使用してThumbと通常のコード間でデータを渡すことができます。すべてのThumb命令は32ビットバージョンに対応するものであったため、Thumbは元のISAの厳密なサブセットでした。[ 9 ] ARMのモデルとSuperHの重要な違いの1つは、Thumbが16ビット形式で3オペランド命令の一部を保持していることです。これは、表示可能なレジスタファイルを8つに減らすことで実現され、レジスタを選択するために必要なのは3ビットだけです。[ 10 ]
MIPSアーキテクチャも、Thumbと非常によく似たMIPS16eで同様の圧縮セットを追加しました。これも8つのレジスタしか使用できませんが、これらは単に最初の8つではありません。MIPS設計ではレジスタ0をゼロレジスタとして使用するため、16ビットモードのレジスタ0と1は代わりにMIPS32レジスタ16と17にマッピングされます。システムのその他の詳細のほとんどはThumbと似ています。[ 11 ]同様に、 Power ISAの最新バージョン(以前はPowerPC )には、基本的に同じ「VLE」命令が含まれています。これらは、Powerへの関心が主に組み込み市場を狙っているFreescale Semiconductorの要請により追加されました。[ 12 ]
2015年頃から、多くのプロセッサが64ビット形式に移行しました。これらは一般的に32ビット命令形式を維持しつつ、内部レジスタを64ビット形式に拡張しました。本来の定義では、これらは基本データワードサイズよりも小さいため、圧縮命令です。しかし、この用語はこの文脈では使用されません。圧縮命令への言及は常に16ビット版を指します。[ 13 ]