3

アーム アセンブリと NEON SIMD 命令を使用します。2 つの Q レジスタにある最大 16 ビットの符号なし値を取得し、それらをしきい値と比較したいと考えています。すべての 16 ビット値がしきい値よりも小さい場合、関数を呼び出します。1 つ以上の値がしきい値より大きい場合は、別の関数を呼び出します。

次の SIMD 命令は最大値を取得します。

// しきい値は r レジスタです

vdup.16       q15, threshold  
vmax.u16      q12, q14, q13  
vcgt.u16      q11, q12, q15

vcgt は FPSCR フラグに影響しますか? ないと思います。次に、q11 がゼロかどうかを確認する必要があります。zeor の場合は function1 を呼び出し、そうでない場合は function2 を呼び出します。それは次のようになります

if (q11 == 0)
//call function1
else
//call function2 

q11を4つのrレジスタに移動せずにどうすればよいですか?

ありがとう

4

1 に答える 1

2

少なくともユーザーモードではありません。これらの cmp 命令は、基になる 2 つの結果の間で値を選択するマスク ベクトルを作成します。

  1. 適切な vcmp でマスクを作成します
  2. 両方のケースの結果を計算する
  3. 1 のマスクを使用して、上記の両方の結果から対応する要素を各レーンに配置します。

現在、電車の中で iPhone で書いているため、手順を正確にお伝えすることはできません。しかし、リファレンス マニュアルでそれらを見つけることは問題ありません。

于 2013-06-13T14:28:05.110 に答える