有人可以向我解释一下 ARM NEON 指令 VQABS 是如何运行的。根据文档:
“VQABS 返回向量中每个元素的绝对值。如果任何结果溢出,它们就会饱和并设置粘性 QC 标志(FPSCR 位 [27])。”
如果我将此应用于 uint16x8 QWORD 类型,那么处理器如何确定存在溢出?我很困惑,因为除了找到肯定不会“溢出”的 16 位数据的绝对值之外,没有执行任何操作。
有人可以向我解释一下 ARM NEON 指令 VQABS 是如何运行的。根据文档:
“VQABS 返回向量中每个元素的绝对值。如果任何结果溢出,它们就会饱和并设置粘性 QC 标志(FPSCR 位 [27])。”
如果我将此应用于 uint16x8 QWORD 类型,那么处理器如何确定存在溢出?我很困惑,因为除了找到肯定不会“溢出”的 16 位数据的绝对值之外,没有执行任何操作。
8位:-128 ~ +127
16位:-32768 ~ +32767
……
如您所见,最大的负数总是比正数大一倍。
例如,如果您在 -128 (0x80) 上使用 vabs,则返回值是相同的 0x80,可以两种方式解释:-128 和 +128,具体取决于符号。
只要您将结果解释为无符号(通常是这种情况),就可以了。但是,0x80 需要比 0x7f (127) 多一位,因此在期望 7 位输入的以下算术中可能会发生溢出。
或者您可能只是被迫将结果与有符号向量相乘,那么您将遇到严重的麻烦,因为 0x80 将被带符号的乘法解释为 -128。
vqabs 返回 0x7f 而不是 0x80。问题解决了。