手臂霓虹比较操作产生负面影响

时间:2016-06-19 12:04:44

标签: assembly arm neon

我正在尝试以下汇编代码:

vclt.f32 q9,q0,#0
vst1.i32 q9,[r2:128]

但如果条件为真,则q9中的相应元素设置为负数而不是正数。

我能做些什么来获得积极的一面?

2 个答案:

答案 0 :(得分:3)

在NEON中没有很多有条件的东西,但实际上只有按位而不是布尔逻辑才能使用 - 参见例如vbsl

如果你对BASIC有可怕的记忆并且真的讨厌按位真值,那么将掩码转换为布尔值的简单方法就是取每个元素的最高位:

vshr.u32 q9, q9, #31

虽然在某些情况下否定,虽然可以说不那么明确,但在某些情况下,显微镜可以在显微镜下更好地表现出来:

vneg.s32 q9, q9

(从浏览微架构时序开始,两个操作几乎完全相同,但vneg优于vshr的一些理论优势是它稍后在Cortex-A8上消耗其输入,并且可以向下发出两个ASIMD管道的Cortex-A57 / A72)

无论哪种方式,正如在顶部所说的那样,只有通过非矢量化代码将结果存储回内存才真正有意义。

答案 1 :(得分:2)

这对于矢量比较指令是正常的,因此您可以将比较结果用作带AND或XOR指令的掩码,或其他各种用例。

您通常不需要+1。如果要计算匹配的元素数,例如,只需使用减法指令从向量累加器中减去0或-1。

要获得整数+1,您可以从0减去它,或者按元素大小-1右移。 (例如,逻辑右移31,只留下低位0或1,其余位全零)。您也可以使用之前创建的+ 1s向量进行AND。

我不知道哪些最适合ARM,或者这取决于微体系结构。 (我真的只知道x86 SSE / AVX的SIMD。)我确信NEON至少可以做到我描述的其中一个选项。