【发布时间】:2013-08-21 04:35:59
【问题描述】:
我试图弄清楚如何在 ARM neon 中生成条件存储。我想做的是相当于这条 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);
【问题讨论】:
-
您需要分三步完成:首先加载矢量,使用掩码仅修改所需元素,然后将修改后的矢量存储回其原始位置。
-
抱歉,我还不清楚。我想做的是:使用这样的向量:mask={0,0,0,0,0,0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80} ;这是 _mm_maskmoveu_si128(__m128i d, __m128i n, char *p) 中的“n”参数;案子。你说的面具应该如何结构化?我应该做什么操作?谢谢(我以前从未使用过 Neon,所以我有点困惑)。
-
好的 - 因为它变得越来越复杂,我在下面以答案的形式给出了更详细的解释。
标签: arm store sse neon intrinsics