ARM 32 ビット命令セットと比較すると、thumb 16 ビット命令セット (thumb2 拡張機能についてはまだ話していません) は、命令のサイズが半分であるため、必要なスペースが少なくなりますが、一般に、より多くの命令が必要になるため、パフォーマンスが低下します。腕と同じことをする。命令セットの機能は少なく、ほとんどの命令はレジスタ r0 ~ r7 でのみ動作します。リンゴとリンゴを比較すると、同じことを行う命令が増えるほど遅くなります。
現在、thumb2 拡張機能は、以前は定義されていなかった Thumb 命令を取り、32 ビットの Thumb 命令を作成します。thumb2 拡張機能のセットが複数あることを理解してください。ARMv6m は、おそらく数十を追加します。ARMv7m は、親指命令セットに 150 の命令のようなものを追加します。ARMv8 または将来が何を保持するかはわかりません。したがって、ARMv7m を想定すると、親指でできることと ARM でできることの間のギャップが埋められました。したがって、thumb2 は、thumb のように縮小された ARM 命令セットですが、縮小されたものではありません。そのため、thumb2 で同じことを行うには、同じことを行う ARM と比較して、さらに多くの命令が必要になる場合があります (プラスの親指を想定)。
これにより、問題の味、アーム内の単一の指示、および経験上の同等の指示が得られます。
ARM
and r8,r9,r10
THUMB
push {r0,r1}
mov r0,r8
mov r1,r9
and r0,r1
mov r1,r10
and r0,r1
mov r8,r0
pop {r0,r1}
現在、コンパイラはそれを行いません。コンパイラは、それが親指をターゲットにしていることを認識し、他のレジスタを選択することで別のことを行います。命令ごとのレジスタと機能はまだ少なくなります。
mov r0,r1
and r0,r2
オペランドを変更せずに、2 つのレジスタをまとめて 2 つの命令/実行サイクルを実行し、結果を 3 番目のレジスタに入れます。Thumb2 には 3 つのレジスタがあるため、thumb2 拡張機能を使用して単一の命令に戻ります。そして、thumb2 命令は、thumb が r0-r7 に制限されている 3 つのレジスタのいずれかで r0-r15 を許可します。
ARMv5 アーキテクチャ リファレンス マニュアルを参照してください。各親指命令の下に、同等の ARM 命令が示されています。次に、その ARM 命令に移動し、thumb 命令ではできないことをその ARM 命令で実行できることを比較します。これは、thumb 命令 (thumb2 ではない) が ARM 命令と 1 対 1 の関係を持つ一方向パスです。すべてのサム命令には、同等のアーム命令があります。ただし、すべてのアーム命令に同等のサム命令があるわけではありません。この演習から、thumb 命令セットを使用する場合のコンパイラの制限を確認できるはずです。次に、ARMv7m アーキテクチャ リファレンス マニュアルを入手し、命令セットを調べて、「すべての親指バリアント」を比較します。エンコーディング (ARMv4T を含むもの) および ARMv6 および/または v7 に限定されたものであり、thumb と thumb2 の間の機能の拡張と、thumb に対応するものがない thumb2 のみの命令が見られます。これにより、コンパイラがthumbとthumb2の間で何を処理する必要があるかが明確になります。次に、thumb+thumb2 を本格的な ARM 命令と比較するところまで行くことができます (ARMv7 AR はそれが呼ばれるものですか?)。そして、thumb2 が ARM にかなり近づいていることを確認してください。ただし、たとえばすべての命令で条件が失われるため、thumb での条件付き実行は、コードの分岐との比較になります。ARM では、分岐なしで if-then-else を使用できる場合があります。 . これにより、コンパイラがthumbとthumb2の間で何を処理する必要があるかが明確になります。次に、thumb+thumb2 を本格的な ARM 命令と比較するところまで行くことができます (ARMv7 AR はそれが呼ばれるものですか?)。そして、thumb2 が ARM にかなり近づいていることを確認してください。ただし、たとえばすべての命令で条件が失われるため、thumb での条件付き実行は、コードの分岐との比較になります。ARM では、分岐なしで if-then-else を使用できる場合があります。 . これにより、コンパイラがthumbとthumb2の間で何を処理する必要があるかが明確になります。次に、thumb+thumb2 を本格的な ARM 命令と比較するところまで行くことができます (ARMv7 AR はそれが呼ばれるものですか?)。そして、thumb2 が ARM にかなり近づいていることを確認してください。ただし、たとえばすべての命令で条件が失われるため、thumb での条件付き実行は、コードの分岐との比較になります。ARM では、分岐なしで if-then-else を使用できる場合があります。 .