NEON SSUBL 指令有错误的结果? 127-220 = 0x00a3(应为 0xffa3)

NEON SSUBL instruction has wrong result? 127-220 = 0x00a3(should be 0xffa3)

我在使用 A64 指令集中的 ssubl 指令时遇到问题。

我只想从 8 字节 SIMD 向量中减去一个常量值。由于结果可能包含负数,我使用 ssubl 扩展数据范围并进行带符号减法。

这是我的代码:

mov w4, #127    // set a const
mov w5, #220    // set another const

dup v1.16b, w4  // move the const to a vector
dup v2.16b, w5  // move the const to a vector

ssubl v3.8h, v1.8b, v2.8b // long type vector subtraction, 127-220

我检查了向量寄存器v1、v2和v3中的结果:

[127 - 220 = -93 (0xffa3), 正确]

我认为v3 中的值应该是0xff5d,因为它是一个负数。但为什么不是呢?


实际上,经过几次测试,我发现这个问题与w5中的值无关,无论是220还是230或其他值。 只要w4中的值小于或等于127,减法结果就不正确。

因此,如果我们使用相同的代码,但将 w4 值更改为 128 或更大:

mov w4, #128    // set a const
mov w5, #220    // set another const

dup v1.16b, w4  // move the const to a vector
dup v2.16b, w5  // move the const to a vector

ssubl v3.8h, v1.8b, v2.8b // long type vector subtraction, 128-220

现在的结果是:

[128 - 220 = -92 (0xffa4), 正确]

现在结果是正确的,我也试过在w5中使用150、250,结果都是正确的。 问题只与w4中的值有关。

有没有人可以解释一下?

谢谢!

(代表OP发布解决方案).

使用 usubl 而不是 ssubl 进行减法。

似乎 usublssubl 只关心 操作数 是否为 signed/unsigned。