Thumb-2命令
読み:サム-トゥー-めいれい
外語:Thumb-2 instructions

 Thumb-1の拡張で、追加の16ビットのオペコードを加えることで、16ビットまたは32ビットの可変長命令としたもの。
目次

概要
 ARMv6から導入された、Thumb命令の拡張仕様である。
 従来の16ビット長で未使用部分に命令を追加するほか、上位3ビットが111で、続く2ビットが00でない時に、もう16ビットを追加する可変長命令とし、ここにも命令を追加した。
 元々、Thumb-1では11110がロング分岐命令で、この場合は追加で11111から始まる16ビットの命令とペアとする長距離の分岐命令があり、このためThumb-1の時点で既に16ビット単位の可変長であった。
 Thumb-2ではここに目をつけた拡張をしており、11100以外の111から始まる命令を可変長命令とした。
 RISCなのに可変長にしてまで命令を増やし、更にARM CortexではThumb-2を標準にするあたり、相変わらずARMはRISCらしくない。

特徴

コンセプト
 Thumbは流石に縮小しすぎたため、高機能な32ビット命令も加えた。
 命令は計32ビットとなるが、しかし純粋な32ビットよりは効率が落ちる。

オペコード
 16ビット×2で32ビットになるが、あくまでもThumb-1の拡張であるため、従来のARM命令とは機械語は全く異なる。これは、32ビットThumb命令(32-bit Thumb instruction)と呼ばれている。
 32ビットThumb命令では、従来同様にレジスターが16本利用できる。

16ビットThumb命令
15141312111009080706050403020100
opcode 
 opcodeの定義は次の通りである。Thumb-1の上位互換の拡張だが、命令追加のため定義が若干広げられているものもある。
opcode命令または命令クラス
00xxxxシフト(イミディエイト)、加算、減算、移動、比較
010000データ処理
010001特殊なデータ命令、分岐、交換
01001xリテラルプールからのロード (PC相対ロード)
0101xx単一データアイテムのロード/ストア
011xxx
100xxx
10100xPC相対アドレスの生成
10101xSP相対アドレスの生成
1011xxその他の16ビット命令
11000xマルチプルレジスターストア
11001xマルチプルレジスターロード
1101xx条件分岐とスーパーバイザーコール
11100x無条件分岐

32ビットThumb命令
1514131211100908070605040302010015141312111009080706050403020100
111op1op2 op 
 Thumb-2命令の符号化方法は次の通り。なお、op1=00はThumb-1と同じ無条件分岐命令である。
 Thumb-2命令は、ARMv6で導入されて以降、命令は徐々に増えており、多機能化している。
op1op2op命令クラス
0100xx0xxxマルチプルロード/ストア命令
0100xx1xxxデュアルまたは排他的ロード/ストア命令
0101xxxxxxデータ処理(レジスターシフト)
011xxxxxxxコプロセッサー命令
10x0xxxxx0データ処理(イミディエイト)
10x1xxxxx0データ処理(プレーンバイナリイミディエイト)
10xxxxxxx1分岐とその他の制御
11000xxx0x単一のデータ項目の格納
11001xxx0xAdvanced SIMD(NEON)要素または構造体のロード/ストア命令
1100xx001xバイトのロード、メモリーのヒント
1100xx011xハーフワードのロード、メモリーのヒント
1100xx101xワードのロード
1100xx111x※未定義※
11010xxxxxデータ処理(レジスター)
110110xxxx乗算、積和演算、差の絶対値
110111xxxxロング乗算、ロング積和演算、除算
111xxxxxxxコプロセッサー命令

実行条件
 Thumb-2命令セット(T32)とARM命令セット(A32)の大きな違いは、32ビットThumb命令の機械語ビット列の殆どに条件指定がないことである。
 そこでThumb-2では、条件付き実行命令としてITが追加されている。
 一つのIT命令で、後続する1〜4命令を条件付きにすることができる。
 IT{x{y{z}}} <firstcond>
 オペコードは次の通り。
15141312111009080706050403020100
10111111firstcondmask
 具体的な使用例は、次の通り、
ITTE   NE
ITT    AL
IT     NE
 ITのあと、最大3文字でTまたはEを附すことが出来る。
 ただし、通常はアセンブリ言語でIT命令を書く必要はなく、各命令に対して条件を指定することで、アセンブラーが自動的にIT命令を出力する。
 IT命令を普通に用いた場合は必ず4ビットあるmaskのビットのどれか1つ以上が1となりmask≠0となるが、もしmask=='0000'の場合、firstcond領域をオペコードとする拡張命令となる。

NOP
 Thumb命令では、NOPはARMv6T2以降で新規に追加された。
 それよりも前のARMでは「mov r8, r8」(0x46C0)が推奨されている。

再検索