Thumb命令
読み:サムめいれい
外語:Thumb instructions
ARMの実行モードの一つ「T32」で使われる16ビット長の命令セットの命令のこと。
概要
32ビット長の命令が長いと感じられる場面向けに作られた、短い(?)16ビット長の命令である。
Thumb-1は、ほぼ16ビット固定長と言えるが、実際には16ビットを2つ組み合わせる命令が一つあるため、16ビット単位の可変長命令であるとも言える。
Thumb-2命令は、本格的な可変長命令セットとなった。各々、16ビットThumb、32ビットThumbと呼ぶ。
64ビット化されたARMv8では、この命令セットを、AArch32ステートという実行モードのうちのThumb命令セット「T32」と呼ぶ。
特徴
由来
従来の32ビット長命令から機能を削り、16ビット命令化した、縮小命令である。
16ビット長命令で済むような簡単な処理なら標準の32ビット長命令を使わずに済み、プログラムサイズを減らせ、消費電力を下げられる。公称、コードサイズを3割減らせるが、処理性能も2割強低下する、としている。
この命令セットの影響は大きく、ライバルであるMIPSまでも、対抗のためにMIPS16という圧縮16ビット命令セットを用意せざるを得なくなった。
しかし切り替えが必要で不便だったため、Thumb-2命令としてARMv6の拡張機能という扱いで両者混在も可能となった。公称、2%の性能低下でコードサイズを3割減らすことができるとしている。
限界
32ビット長だったものを半分の16ビット長にしたため、機能が大幅に削られており、ARMらしさが大幅に減少した。
- レジスターは8本(r0〜r7)
- 殆どが2オペランド命令
- 分岐命令などを除き、条件フィールドがなくなった
オペコード
以下は、Thumb-1の命令を記載する。Thumb-2命令の16ビットThumb命令は拡張があり、これと若干異なる。
| 15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
レジスターシフト | 0 | 0 | 0 | Op | Offset5 | Rs | Rd |
加減算 | 0 | 0 | 0 | 1 | 1 | I | Op | Rn/offset3 | Rs | Rd |
イミディエイト加減算 | 0 | 0 | 1 | Op | Rd | Offset8 |
ALU operations | 0 | 1 | 0 | 0 | 0 | 0 | Op | Rs | Rd |
Hiレジスター演算 | 0 | 1 | 0 | 0 | 0 | 1 | Op | H1 | H2 | Rs/Hs | Rd/Hd |
PC相対ロード | 0 | 1 | 0 | 0 | 1 | Rd | Word8 |
ロードストア | 0 | 1 | 0 | 1 | L | B | 0 | Ro | Rb | Rd |
ロードストア符号拡張 | 0 | 1 | 0 | 1 | H | S | 1 | Ro | Rb | Rd |
LSイミディエイト | 0 | 1 | 1 | B | L | Offset5 | Rb | Rd |
ロードストア16ビット | 1 | 0 | 0 | 0 | L | Offset5 | Rb | Rd |
SP相対ロードストア | 1 | 0 | 0 | 1 | L | Rd | Word8 |
ロードアドレス | 1 | 0 | 1 | 0 | SP | Rd | Word8 |
SP加算 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | S | SWord7 |
PUSH/POPレジスター | 1 | 0 | 1 | 1 | L | 1 | 0 | R | Rlist |
IT命令 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | firstcond | mask |
マルチプルLS | 1 | 1 | 0 | 0 | L | Rb | Rlist |
条件分岐 | 1 | 1 | 0 | 1 | Cond | Soffset8 |
ソフトウェア割り込み | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | Value8 |
無条件分岐 | 1 | 1 | 1 | 0 | 0 | Offset11 |
ロング分岐 | 1 | 1 | 1 | 1 | H | Offset |
最後のロング分岐は、16ビット命令を2セット組み合わせて32ビットで用いられる。
また、Thumb-2命令では、このロング分岐と同様のコンセプトで命令を拡張した。上位3ビットが111で、続く2ビットが00でない時に、Thumb-2命令の可変長命令となる。
再検索