arm neon 比较操作生成负一

arm neon compare operations generate negative one

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

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

但是如果条件为真,则q9中对应的元素被设置为负一而不是正一

我该怎么做才能获得积极的评价?

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

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


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

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

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

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

vshr.u32 q9, q9, #31

尽管否定可能乍一看不太清楚,但在某些情况下从微观上看可能会更好:

vneg.s32 q9, q9

(通过浏览微架构时序,两种操作几乎相同,但 vneg 相对于 vshr 的一些理论上的优势是它稍后在 Cortex-A8 上消耗其输入,并且可以发出 Cortex-A57/A72)

的两个 ASIMD 管道

无论哪种方式,如顶部所述,这仅对将结果存储回内存以供非矢量化代码查看才真正有意义。