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