10.127 __nop コンパイラ組み込み関数

このコンパイラ組み込み関数は、命令ストリームに NOP 命令または等価コードシーケンスを挿入します。

構文

void __nop(void)

使用法

コンパイラは、通常の到達できないコードの削除を除き、NOP 命令の削除による最適化は行いません。ソースファイル内の各 __nop コンパイラ組み込み関数ごとに、1 つの NOP 命令が生成されます。
ARMv6 およびそれ以前のアーキテクチャには NOP 命令はありません。したがって、コンパイラは、この命令の代わりに MOV r0,r0 命令を生成します。
さらに、__nop は、いかなる状況下でもそのポイントを過ぎると演算に副作用の影響が及ばない特殊なシーケンスポイントを作成します。通常のシーケンスポイントを使用すると、そのポイントを越すとプログラムの動作に副作用のある演算が影響しなくなるポイントを用意できます。副作用のない演算は、組み込み関数では制限されていません。また、コンパイラは、それらをシーケンスポイントを超えた場所に移動できます。__schedule_barrier コンパイラ組み込み関数は、 NOP 命令を挿入しない場合でもこの特殊なシーケンスポイントを作成します。
C++ 標準のセクション 5.1.2.3 には、実行環境の状態を変化させる副作用のある演算が定義されています。これらの演算は以下のとおりです。
  • volatile オブジェクトにアクセスする
  • メモリ位置を変更する
  • ファイルを変更する
  • 上記のいずれかの動作を行う関数を呼び出す

サンプル

以下のサンプルでは、コンパイラは volatile 変数 x からの読み込みを 2 つの NOP 命令で囲むように配置します。
volatile int x;
int z;
int read_variable(int y)
{
    int i;
    int a = 0;
    __nop();
    a = x;
    __nop();
    return z + y;
}
__nop 組み込み関数が削除され、例えば --cpu=Cortex-M3 のためのコンパイルが -O3 -Otime で実行される場合、コンパイラは不揮発性変数 z の読み取りが、変数 x の読み取りより前に行われるようにスケジュールすることができます。
以下のサンプルでは、コンパイラは変数 z への書き込みを 2 つの NOP 命令で囲むように配置します。
int x;
int z;
int write_variable(int y)
{
    int i;
    for (i = 0; i < 10; i++)
    {
        __nop();
        z = y;
        __nop();
        x += y;
    }
    return z;
}
この場合、__nop コンパイラ組み込み関数が削除されると、コンパイラは -O3 -Otime --cpu=Cortex-A8 を使用してループをフォルディングします。
以下のサンプルでは、pure_func に副作用がないため、コンパイラは、この関数の呼び出しをループ外に移動することができます。この場合でも、コンパイラは func への呼び出しを 2 つの NOP 命令で囲むように配置します。
int func(int x);
int pure_func(int x) __pure;
int read(int x)
{
    int i;
    int a=0;
    for (i=0; i<10; i++)
    {
        __nop();
        a += pure_func(x) + func(x);
        __nop();
    }
    return a;
}

  • __schedule_barrier コンパイラ組み込み関数を使用すると、NOP 命令を生成することなく、スケジューリングのバリアを挿入できます。
  • 上のサンプルでは、コンパイラは __schedule_barrier __nop と同様に扱います。
関連する参考文書
10.13 __pure
10.139  __schedule_barrier コンパイラ組み込み関数
4.4 汎用のコンパイラ組み込み関数
10.141 __sev コンパイラ組み込み関数
10.150 __wfe コンパイラ組み込み関数
10.151 __wfi コンパイラ組み込み関数
10.152 __yield コンパイラ組み込み関数
関連情報
NOP
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.