Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ARM Neon:有条件存储建议_Arm_Store_Sse_Neon_Intrinsics - Fatal编程技术网

ARM Neon:有条件存储建议

ARM Neon:有条件存储建议,arm,store,sse,neon,intrinsics,Arm,Store,Sse,Neon,Intrinsics,我正试图找出如何在ARM neon中生成条件存储。我想做的是与本SSE指令等效的: void u mm u maskmoveu si128(uu m128i d,uuu m128i n,char*p) 它有条件地将d的字节元素存储到地址p。选择器n中每个字节的高位决定是否存储d中的相应字节 有没有关于如何使用NEON intrinsics的建议? 多谢各位 这就是我所做的: int8x16_t store_mask = {0,0,0,0,0,0,0xff,0xff,0xff,0xff,0xff,

我正试图找出如何在ARM neon中生成条件存储。我想做的是与本SSE指令等效的:

void u mm u maskmoveu si128(uu m128i d,uuu m128i n,char*p)

它有条件地将d的字节元素存储到地址p。选择器n中每个字节的高位决定是否存储d中的相应字节

有没有关于如何使用NEON intrinsics的建议? 多谢各位

这就是我所做的:

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);

假设向量是16 x 1字节的元素,您将设置一个掩码向量,其中每个元素要么都是0(
0x00
),要么都是1(
0xff
),以确定该元素是否应存储在not上。然后需要执行以下操作(伪代码):


你需要分三步完成:首先加载向量,使用掩码修改所需元素,然后将修改后的向量存储回其原始位置。抱歉,我仍然不清楚。我想做的是:使用这样一个向量:mask={0,0,0,0,0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80};这是我在_mm_maskmoveu_si128中的“n”参数(__m128id,__m128in,char*p);案例你所说的面具应该如何构造?我应该做什么手术?谢谢你(我以前从未使用过霓虹灯,所以我有点困惑)。好吧-因为它变得越来越复杂,我在下面的答案中做了更详细的解释。谢谢!我将尝试按照您的解释来实现它。我按照您的伪代码来实现它(请参见编辑的问题)。这是正确的吗?我还有一个疑问。原始代码中的掩码(带有一些我试图转换为ARM Neon的SSE指令)是:{0,0,0,0,0,0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80};。是否有理由使用0x80代替0xff?谢谢,这只是一个不同的指令集,所以您必须使用可用的指令集。如果需要(一条指令),在0x80和0xff之间转换掩码非常容易,或者您可以更改生成掩码的代码,这样就不需要了。好的,如果我理解正确,我不能使用与SSE指令相同的掩码?要在ARM neon中获得相应的一个,我只需将0x80替换为0xff?是的,这是正确的-掩码的最常见形式是全1/全0。您只需要将0x80元素转换为0xff,如果需要,可以在一条指令中完成(算术右移7位)。
 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