ssubl
在 A64 指令集中使用指令时出现问题。
我只想从 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 中的结果:
- v1:全部为 0x7f(十进制 127)
- v2:全部为 0xdc(十进制 220)
- v3:全部为 0x00a3(十进制 163),错误
[127 - 220 = -93 (0xffa3),正确]
我认为 v3 中的值应该是 0xff5d,因为它是一个负数。但为什么不是呢?
实际上,经过几次测试,我发现这个问题与 中的值无关w5
,无论是 220 还是 230 或其他值。只要 in 的值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
现在的结果是:
- v1:全部为 0x80(十进制 128)
- v2:全部为 0xdc(十进制 220)
- v3:全部为 0xffa4(十进制 -92),正确
[128 - 220 = -92 (0xffa4),正确]
现在结果是正确的,我也尝试使用 150, 250 in w5
,所有结果都是正确的。问题仅与 中的值有关w4
。
有没有人可以解释一下?
谢谢!