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

このコンパイラ組み込み関数を使用して、コンパイラによって生成される命令ストリームに SEL 命令を挿入します。

入力パラメータからバイトを選択することができます。選択されるバイトは、直前の SIMD 命令のコンパイラ組み込み関数の結果によって決まります。直前の SIMD 命令の組み込み関数の結果は、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);  /* This intrinsic sets the GE flags */
    filtered_res = ge_filter(res); /* Filter the results of the __sasx */
                                   /* intrinsic. Some results are filtered */
                                   /* out based on the GE flags. */
    return filtered_res;
}
関連する参考文書
12.11 __sadd16 コンパイラ組み込み関数
12.13 __sasx コンパイラ組み込み関数
12.34 __ssax コンパイラ組み込み関数
12.36 __ssub8 コンパイラ組み込み関数
12.35 __ssub16 コンパイラ組み込み関数
10.153 ARMv6 SIMD コンパイラ組み込み関数
関連情報
SEL
ARM 命令と Thumb 命令の概要
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.