ARM霓虹灯:VQABS如何确定溢出条件

ARM霓虹灯:VQABS如何确定溢出条件,arm,overflow,neon,absolute-value,Arm,Overflow,Neon,Absolute Value,有人能给我解释一下ARM指令VQABS是如何工作的吗。 根据文件: VQABS返回向量中每个元素的绝对值。如果任何结果溢出,它们将饱和,并设置粘性QC标志(FPSCR位[27]) 如果我将此应用于uint16x8 QWORD类型,那么处理器如何确定存在溢出?我感到困惑,因为除了查找肯定不会“溢出”的16位数据的绝对值之外,没有其他操作正在执行。8位:-128~+127 16位:-32768~+32767 正如你所看到的,最大的负数总是比正数大1倍 例如,如果在-128(0x80)上使用vabs

有人能给我解释一下ARM指令VQABS是如何工作的吗。 根据文件:

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

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

8位:-128~+127

16位:-32768~+32767

正如你所看到的,最大的负数总是比正数大1倍

例如,如果在-128(0x80)上使用vabs,则返回值与0x80相同,可以根据信号的不同,将返回值解释为:-128和+128

只要将结果解释为unsigned(大多数情况下都是这样),就可以了。然而,0x80比0x7f(127)多需要一位,因此在以下期望7位输入的算术中可能会发生溢出

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


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

VQABS仅对有符号类型进行操作-根据定义,您已经拥有无符号类型的绝对值。现在,把霓虹灯放在一边,想一想基本的二元互补;只有16位,什么是abs(-32768)?明白了。我的问题即使对于有符号的值也是有效的:当没有执行算术运算时,如何确定溢出?但是如果值为负数,则会执行算术运算(否定),这是这里的第一个误解。至于第二个,就像我说的,试着将abs(-32768)计算为一个有符号的16位值,看看会发生什么。因此,您的意思是,当且仅当寄存器操作数中的值为0x80(假设为8位寄存器)时,才会设置溢出位?感谢您对0x7F与0x80的说明。这正是我想要的。是的,仅在输入0x80、0x8000、0x8000000的情况下,这取决于元素大小(8、16、32)