__sel コンパイラ組み込み関数

このコンパイラ組み込み関数を使用して、コンパイラによって生成される命令ストリームに SEL 命令を挿入します。入力パラメータからバイトを選択することができます。選択されるバイトは、直前の SIMD 命令のコンパイラ組み込み関数の結果によって決まります。直前の SIMD 命令のコンパイラ組み込み関数の結果は、Application Program Status Register (APSR)の Greater than or Equal フラグによって表されます。

作用の対象がハーフワードオペランドを使用したコンパイラ組み込み関数の結果であれ、バイトオペランドを使用したコンパイラ組み込み関数の果であれ、__sel コンパイラ組み込み関数は正しく機能します。なぜなら、ハーフワードオペランドの演算では、値ごとに 2 つの(二重の)GE ビットが設定されるらです。例えば、__sasx コンパイラ組み込み関数がそれに該当します。

unsigned int __sel(unsigned int val1, unsigned int val2)

各項目には以下の意味があります。

val1

4 つの選択可能なバイトを保持します。

val2

4 つの選択可能なバイトを保持します。

__sel コンパイラ組み込み関数は、以下の条件に従って入力パラメータからバイトを選択し、戻り値 res として返します。

if APSR.GE[0] == 1 then res[7:0] = val1[7:0] else res[7:0] = val2[7:0]
if APSR.GE[1] == 1 then res[15:8] = val1[15:8] else res[15:8] = val2[15:8]
if APSR.GE[2] == 1 then res[23:16] = val1[23:16] else res[23:16] = val2[23:16]
if APSR.GE[3] == 1 then res[31;24] = val1[31:24] else res = val2[31:24]

例:

unsigned int ge_filter(unsigned int val1, unsigned int val2)
{
  unsigned int res;

    res = __sel(val1,val2);
    return res;
}

unsigned int foo(unsigned int a, unsigned int b)
{
  int res;
  int filtered_res;

    res = __sasx(a,b);  /* このコンパイラ組み込み関数では GE フラグが設定されます*/
    filtered_res = ge_filter(res); /* __sasx コンパイラ組み込み関数*/
                                   /* の結果をフィルタします。GE フラグに基づいて*/
                                   /* 一部の結果がフィルタで除外されます。*/
    return filtered_res;
}

Show/hide関連項目

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