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らしさが大幅に減少した。

オペコード
 以下は、Thumb-1の命令を記載する。Thumb-2命令の16ビットThumb命令は拡張があり、これと若干異なる。
 15141312111009080706050403020100
レジスターシフト000OpOffset5RsRd
加減算00011IOpRn/offset3RsRd
イミディエイト加減算001OpRdOffset8
ALU operations010000OpRsRd
Hiレジスター演算010001OpH1H2Rs/HsRd/Hd
PC相対ロード01001RdWord8
ロードストア0101LB0RoRbRd
ロードストア符号拡張0101HS1RoRbRd
LSイミディエイト011BLOffset5RbRd
ロードストア16ビット1000LOffset5RbRd
SP相対ロードストア1001LRdWord8
ロードアドレス1010SPRdWord8
SP加算10110000SSWord7
PUSH/POPレジスター1011L10RRlist
IT命令10111111firstcondmask
マルチプルLS1100LRbRlist
条件分岐1101CondSoffset8
ソフトウェア割り込み11011111Value8
無条件分岐11100Offset11
ロング分岐1111HOffset
 最後のロング分岐は、16ビット命令を2セット組み合わせて32ビットで用いられる。
 また、Thumb-2命令では、このロング分岐と同様のコンセプトで命令を拡張した。上位3ビットが111で、続く2ビットが00でない時に、Thumb-2命令の可変長命令となる。

再検索