7.10 C および C++ コードのインラインアセンブラの Thumb 命令セットの制限

インラインアセンブラでは、ARM アーキテクチャの v6T2、v6M、および v7 の Thumb 状態をサポートしています。Thumb 固有の制限が他にいくつかあります。

制限を以下に示します。
  1. TBBTBHCBZ、および CBNZ 命令はサポートされていません。
  2. 場合によっては、コンパイラが IT ブロックを分岐コードに置き換える可能性があります。
  3. 命令の幅指定子 .N は、コンパイラに対して要件ではなく、環境設定を示します。これは、最適化とレジスタの割り当てによって 16 ビットのエンコードを生成する効率が低下することが稀にあるからです。
ARMv6 以下のアーキテクチャの場合、インラインアセンブラでは、Thumb 命令がアセンブルされません。代わりに、Thumb 状態にあるインラインアセンブリを見つけたら、コンパイラは ARM 状態に自動的に切り替わります。このスイッチに依存するコードは現在サポートされていますが、この慣行は廃止される予定です。ARMv6T2 以上では、コードが Thumb ではなく有効な ARM アセンブリの場合、Thumb 状態から ARM 状態への自動切り替えが行われます。
ARM 状態を意図的に設定できます。ARMv6 以下でThumb 用にコンパイルするコードを含むソースファイルにインラインアセンブリ言語を含める場合、インラインアセンブリコードを含む関数を #pragma arm ステートメントと #pragma thumb ステートメントで囲んで下さい。例えば、
...// Thumb コード
#pragma arm // ARM コード。コード生成を ARM 命令セットに切り替えて、
            // ARMv6 以下で Thumb にインラインアセンブラを使用できます。
int add(int i, int j)
{
    int res;
    __asm
    {
        ADD   res, i, j   // ここに追加
    }
    return res;
}
#pragma thumb  // Thumb コード。Thumb 命令セットに再度切り替える。
                // ARMv6 以下では Thumb にインラインアセンブラを使用できなくなります。
                // 
また、コードをコンパイルする際は、--apcs /interwork コンパイラコマンドラインオプションを使用する必要があります。
関連する概念
7.7 C および C++ コードのインラインアセンブリ演算の制限
7.8 C および C++ コードのインラインアセンブラのレジスタの制限
7.9 C および C++ コードのインラインアセンブラのプロセッサモードの制限
7.11 C および C++ コードのインラインアセンブラのベクタ浮動小数点(VFP)の制限
7.12 C および C++ コードのインラインアセンブラの命令の制限
7.13 C および C++ コードのその他のインラインアセンブラの制限
関連する参考文書
8.6 --apcs=qualifier...qualifier
10.76 プラグマ
関連情報
命令の幅指定子
IT
TBB、TBH
CBZ、CBNZ
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.