コンパイラ組み込み関数

C 言語および C++ 言語は、広範囲に及ぶタスクに適していますが、例えばデジタル信号処理(DSP)などのアプリケーションの特定エリアのサポートは組み込まれていません。

特定のアプリケーションドメイン内には、通常、頻繁に実行する必要のあるドメイン固有のさまざまな演算があります。ただし、これらの演算は C または C++ では効率的に実装できない場合もよくあります。代表的な例としては、通常 DSP プログラミングで使用する 2 の補数による 2 つの 32 ビット符号付き整数のサチュレート加算があります。Example 21 は、C によるその実装を示しています。

Example 21. サチュレート加算演算の C 実装

#include <limits.h>
int L_add(const int a, const int b)
{
    int c;
    c = a + b;
    if (((a ^ b) & INT_MIN) == 0)
    {
        if ((c ^ a) & INT_MIN)
        {
            c = (a < 0) ?INT_MIN :INT_MAX;
        }
    }
    return c;
}

コンパイラ組み込み関数は、コンパイラによって提供される関数です。コンパイラ組み込み関数を使用すると、アセンブリ言語での複雑な実装手順とらずに、C および C++ ソースコードでドメイン固有の演算を簡単に組み込むことができます。コンパイラ組み込み関数を使用すると、コンパラの命令選択よりも包括的にターゲットアーキテクチャの命令を実行できます。

コンパイラ組み込み関数は、C または C++ の関数呼び出しのように見えますが、コンパイル時に特定のシーケンスのローレベルの命令によって置換されます。Example 21 のサチュレート加算関数のように、コンパイラ組み込み関数を使用して実装した場合は、以下の形式が使用されます。

#include <dspfns.h>    /* ETSI 組み込み関数をインクルードする */
...
int a, b, result;
...
result = L_add(a, b);  /* a と b のサチュレート加算 */

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0472EJ
Non-ConfidentialID081711