在 Neon 中,两个 uint8 值之间是否存在饱和减法到 int8 中

Sam*_*uel 1 arm neon

我必须在两个 unint8 向量之间做减法,然后饱和到 int8 向量。例如

uint8 a=8;
uint8 b=248;

subtract: a-b=-240
saturate cast: -240 -> -128 
make sure the value is in [-128, 127]
Run Code Online (Sandbox Code Playgroud)

我想在C API手臂霓虹灯

Not*_*hat 5

肯定没有单一的 NEON 操作可以从一种类型到另一种类型,以第三种中间类型的精度同时进行饱和和算术运算,但它似乎有两种可能:

无符号加宽减法 ( vsubl) 将计算中间结果而不会损失精度作为 uint16。由于 NEON 使用二进制补码,我们利用了这样一个事实,即这里的任何整数下溢都等效于有符号减法,而且我们仍然最多只有 9 位数据,因此很高兴将其转换为有符号int16。然后,我们可以执行缩小饱和度 ( vqmovn) 以将其降低到int8所需结果的签名。

将这些放在内部函数中给了我这个,这似乎可以完成这项工作:

int8x8_t dothething(uint8x8_t a, uint8x8_t b) {
    uint16x8_t tmp = vsubl_u8(a, b);
    return vqmovn_s16(vreinterpretq_s16_u16(tmp));
}
Run Code Online (Sandbox Code Playgroud)