命令セット

命令セットの概要

Cortex-M3の命令セット

従来のARMプロセッサはARM命令(32ビット)とThumb命令(16ビット)の2つの命令セットを採用していました。しかし、Cortex-M3はARM命令セットを採用せず、Thumb命令セットの新版であるThumb-2命令セットを採用しています。

Thumb-2命令セットは従来のThumb命令セットバイナリ互換で、従来のThumbプログラムを再コンパイルせずにそのまま動作します。

Thumb-2は16ビットと32ビットの混在命令セットで、従来のThumb命令では採用できなかった命令が追加されています。そのためARM命令でしか記述できなかった特権命令が存在し、ARM命令が無くてもすべての処理が記述できます。

また、ビット操作命令、除算命令やテーブル分岐命令なども追加されています。

テーブル分岐命令

テーブルを使い、変数の値に基づいてプログラムフローを制御するのは、高級言語で一般的な機能です。これは、ARMおよびThumb命令セットについても当てはまります。

ARMは高性能コードに使用されることが多く、コンパイラがサイズを犠牲にして速度を優先したコードシーケンスを選択する傾向があります。逆にThumbコンパイラは、パックデータテーブルを使ったコードシーケンスで、組み合わせたコードとテーブルが使用するメモリを最小限に抑える傾向があります。

Thumb-2コア技術では、両方のテクニックの長所を組み合わせたテーブル分岐命令を使用します。このため、パックデータに使用する命令数が最小限となり、極めて少ないコードおよびデータフットプリントで最大限の性能を発揮します。

IT - if then -

ARM命令セットには、すべての命令を条件付きで実行する機能があります。この機能は、コンパイラが短い条件節を構成するコードを生成する際に有効です。しかし、Thumb 16ビット命令のエンコードスペースには、この機能を維持するのに十分なスペースがないため、Thumbコンパイラにこの機能はありません。

しかしThumb-2コア技術には、同様のメカニズムを提供する命令があります。このIT命令は、ステータスレジスタに含まれる1本以上の条件フラグに基づいた条件コードのうち、1つの条件コードに基づく最大4本のThumb命令ブロックが生成可能です。これにより、ThumbコードがARMコードに近いレベルの性能を発揮します。

図1
ARM Thumb Thumb-2
LDREQ r0,[r1] BNE L1 ITETE EQ(if then命令)
LDRNE r0,[r2] LDR r0, [r1] LDR r0, [r1]
ADDEQ r0, r3, r0 ADD r0, r3, r0 LDR r0, [r2]
ADDNE r0, r4, r0 B L2 ADD r0, r3, r0
L1 ADD r0, r4, r0
LDR r0, [r2]
ADD r0, r4, r0
L2

上記の例では、ARMコードが16バイト、Thumbコードが12バイト、Thumb-2コア技術コードが10バイトを使用しています。ARMコードは実行に4サイクル、Thumbコードは4~20サイクル、Thumb-2コア技術コードは4または5サイクルかかります。Thumbのサイクル数は、分岐が正確に予測されるかどうかによって決まります。Thumb-2コア技術の場合、IT命令を分岐命令と同様にフォールドできるため、サイクル数が5から4に減っています。