1

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

有没有人可以解释一下?

谢谢!

4

1 回答 1

1

(代表 OP 发布解决方案)

使用usubl而不是ssubl做减法。

似乎usublandssubl只关心操作数是否有符号/无符号。

于 2016-10-23T19:41:21.287 回答