2

ARMネオンで条件付きストアを生成する方法を見つけようとしています。私がやりたいことは、この SSE 命令と同等です。

void _mm_maskmoveu_si128(__m128i d, __m128i n, char *p);

これは、条件付きで d のバイト要素をアドレス p に格納します。セレクタ n の各バイトの上位ビットは、d の対応するバイトが格納されるかどうかを決定します。

NEON組み込み関数でそれを行う方法について何か提案はありますか? ありがとうございました

これは私がしたことです:

int8x16_t store_mask = {0,0,0,0,0,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};

int8x16_t tmp_dest = vld1q_u8((int8_t*)p_dest);
vbslq_u8(source,tmp_dest,store_mask);
vst1q_u8((int8_t*)p_dest,tmp_dest);
4

1 に答える 1

0

16 x 1 バイト要素のベクトルを想定すると、各要素がすべて 0 ( 0x00) またはすべて 1 ( 0xff) であるマスク ベクトルを設定して、要素を格納するかどうかを決定します。次に、次のことを行う必要があります (疑似コード)。

 init mask vector = 0x00/0xff in each element
 init source vector = data to be selectively stored
 load dest vector from dest location
 apply `vbslq_u8` (`vbit` instruction) with dest vector, source vector and mask vector
 store dest vector back to dest location
于 2013-08-19T12:46:15.650 に答える