2017-10-04 33 views
2

次のように2つの浮動小数点オペランドの比較の比較結果があります。すなわち:私は、比較の結果に基づいて行う必要があることは、以下を実行する必要がNEONパックベクトルの結果をビットマップに比較

neon_gt_res = vcgtq_f32(temp1, temp2); 
if(neon_gt_res[0]) array[0] |= (unsigned char)0x01; 
if(neon_gt_res[1]) array[0] |= (unsigned char)0x02; 
if(neon_gt_res[2]) array[0] |= (unsigned char)0x04; 
if(neon_gt_res[3]) array[0] |= (unsigned char)0x08; 

しかし、このように書くことが再び多重比較に相当します。これをネオンCの組み込み関数で最適に書く方法を教えてください。 x86では

、これはarray[0] |= _mm_movemask_ps(cmp_gt_res);

+0

どのようなタイプは、 '配列です[] '?私はそれがバイト配列であると仮定していますが、あなたのCソートの意味です。あなたは '1 2 4 8'のベクトルを求め、比較結果をマスクします。しかし、その結果をNEONレジスタの下位4バイトにパックするにはシャッフルが必要だと思います。私はNEONをよく知っていませんが、おそらくそれを行うことができれば、配列の32ビットの読み込み、パックされたORの実行、および保存が必要になります。 –

+0

array []はunsigned char型です。比較結果はint32x4_t型であるため、そのマスクを使用することはできません。 – Lakshmi

+0

しかし、NEONに比較結果の各要素から1バイトをパックするために使用できるバイトシャッフル命令はありませんか? –

答えて

3
vmov.i32 qmask, #1 
vand qres, qmask, qres 
vsra.u64 qres, qres, #30 
vsli.64 dres_bottom, dres_top, #2 

だろうそして、あなたは、あなたがqresの4つの最下位ビットに必要なビットを持っています。

////////////////////////編集

上記の改良版:

vshr.u64 qres, qres, #31 
vsli.64 dres_bot, dres_top, #2 
// the four LSBs already contain the bitmap, the rest is optional: 
vbic.i16 dres_bot, #0xf0 
// you can now use byte 0 of dres_bot as the result. 
関連する問題