4.9 関数のインライン化に影響を与える要因

リンカのインライン関数に影響を与える、多くの要因があります。

関数がインライン化される方法に影響を与える要因は以下のとおりです。
  • リンカは、最も単純な命令だけを処理し、PC への読み出しまたは書き込みを行う命令をインライン化しません。これは、PC への読み出しや書き込みが関数の位置に依存しているためです。
  • イメージに ARM コードと Thumb コードの両方が含まれている場合、もう一方の状態から呼び出される関数はインターワーク用にビルドされる必要があります。リンカは 16 ビット Thumb 命令を 2 つまで含む関数をインライン化できますが、ARM の呼び出し元関数では、1 つの 16 ビットでエンコードされた Thumb 命令または 32 ビットでエンコードされた Thumb 命令を含む関数しかインライン化できません。
  • リンカの動作は、呼び出し先関数のサイズによって異なります。以下の表に、呼び出し元関数と呼び出し先関数の両方の状態を示します。

    表 4-1 小さな関数のインライン化

    呼び出し元関数の状態 呼び出し先関数の状態 呼び出し先関数のサイズ
    ARM ARM 4 ~ 8 バイト
    ARM Thumb 2 ~ 6 バイト
    Thumb Thumb 2 ~ 6 バイト
    等価の命令が存在する場合は、異なる状態でもインライン化できます。例えば、adds r0, r0 という Thumb 命令の場合、等価の ARM 命令をインライン化できます。ARM 命令と等価な Thumb 命令はほとんどないため、ARM から Thumb にインライン化することはできません。
  • 関数をインライン化するには、関数の最後の命令が以下のいずれかである必要があります。
    MOV pc, lr
    または
    BX lr
    復帰のシーケンスだけで構成される関数は、NOP としてインライン化できます。
  • 条件付き ARM 命令は、以下の場合にのみインライン化できます。
    • BL の条件が、インライン化する命令の条件と一致する場合。例えば、BLEQ でインライン化できるのは、ADDEQ のような条件が一致する命令だけです。
    • BL 命令またはインライン展開する命令が無条件の場合。無条件の ARM BL では、他のすべての条件を満たす任意の条件付き命令または無条件命令をインライン化できます。BL 命令が条件付きの場合、条件付きで実行できない命令はインライン展開できません。
  • Thumb If-Then(IT)ブロックの最後の命令である BL では、16 ビット Thumb 命令、あるいは 32 ビット MRSMSR、または CPS 命令をインライン化できません。これは、IT ブロックによりその有効範囲内の命令の動作が変更されるため、命令をインライン化すると、プログラムの動作が変更されるからです。
関連する概念
4.10 NOP に最適化される分岐について
関連情報
条件付き命令
ADD
B
CPS
IT
MOV
MRS(PSR から汎用レジスタへ)
MSR(汎用レジスタから PSR へ)
非機密扱いPDF file icon PDF 版ARM DUI0474LJ
Copyright © 2010-2015 ARM.All rights reserved.