1

有人可以向我解释一下 ARM NEON 指令 VQABS 是如何运行的。根据文档:

“VQABS 返回向量中每个元素的绝对值。如果任何结果溢出,它们就会饱和并设置粘性 QC 标志(FPSCR 位 [27])。”

如果我将此应用于 uint16x8 QWORD 类型,那么处理器如何确定存在溢出?我很困惑,因为除了找到肯定不会“溢出”的 16 位数据的绝对值之外,没有执行任何操作。

4

1 回答 1

1

8位:-128 ~ +127

16位:-32768 ~ +32767

……

如您所见,最大的负数总是比正数大一倍。

例如,如果您在 -128 (0x80) 上使用 vabs,则返回值是相同的 0x80,可以两种方式解释:-128 和 +128,具体取决于符号。

只要您将结果解释为无符号(通常是这种情况),就可以了。但是,0x80 需要比 0x7f (127) 多一位,因此在期望 7 位输入的以下算术中可能会发生溢出。

或者您可能只是被迫将结果与有符号向量相乘,那么您将遇到严重的麻烦,因为 0x80 将被带符号的乘法解释为 -128。

vqabs 返回 0x7f 而不是 0x80。问题解决了。

于 2015-07-17T14:41:13.670 回答