SSE3組み込み関数で記述されたコードをNEONSIMDに変換しようとしていますが、シャッフル機能が原因でスタックしています。GCC組み込み関数、 ARMマニュアル、その他のフォーラムを確認しましたが、解決策を見つけることができませんでした。
コード:
_m128i upper = _mm_loadu_si128((__m128i*)p1);
register __m128i mask1 = _mm_set_epi8 (0x80,0x80,0x80,0x80,0x80,0x80,0x80,12,0x80,10,0x80,7,0x80,4,0x80,1);
register __m128i mask2 = _mm_set_epi8 (0x80,0x80,0x80,0x80,0x80,0x80,12,0x80,10,0x80,7,0x80,4,0x80,1,0x80);
__m128i temp1_upper = _mm_or_si128(_mm_shuffle_epi8(upper,mask1),_mm_shuffle_epi8(upper,mask2));
vtbl1_u8(uint8x8_t、uint8x8_t)命令は、宛先レジスタに値を割り当てるために使用できるルックアップテーブルを作成しますが、64ビットレジスタでのみ動作します。また、シャッフル操作は、開始時に実行する必要がある比較を実行します。 NEONと私はそれを効率的に行う方法を知りません。
r0 =(mask0&0x80)?0:SELECT(a、mask0&0x0f)// SELECT(a、n)は、aからn番目の8ビットパラメータを抽出します。
r1 =(mask1&0x80)?0:SELECT(a、mask1&0x0f)
..。
最初にマスクの上位ビットをチェックし、次にマスクの下位4ビットを効率的に選択する命令が見つかりません。レジスタ内の各ビットを比較してから、条件が指定されている場合は下位4ビットを選択できることはわかっていますが、私はそれを効率的に行うことを望んでいました。誰かが助けてくれるか、参考になることを願っています。
どうもありがとう、
乾杯!