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

Arm NEON SSUBL指令有错误的结果?127-220=0x00a3(应为0xffa3),arm,neon,arm64,armasm,Arm,Neon,Arm64,Armasm,在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 vect

在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中检查了结果:

  • v1:所有0x7f(十进制127)
  • v2:所有0xdc(十进制220)
  • v3:所有0x00a3(十进制163),错误
[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
现在的结果是:

  • v1:所有0x80(十进制128)
  • v2:所有0xdc(十进制220)
  • v3:所有0xffa4(十进制-92),正确
[128-220=-92(0xffa4),正确

现在结果是正确的,我还尝试在
w5
中使用150250,所有结果都是正确的问题仅与
w4
中的值有关

有人能解释吗

谢谢

(代表OP发布解决方案)

使用
usubl
而不是
ssubl
进行减法


<> P>><代码> UBLL 和<代码> SUPL 只关心<强>操作数< /强>是否有符号/未签名。

您可能想考虑什么是八位整数,您分配的代码“220”/代码>将被解释为“代码> SSULL。”EOF:它不在220左右。我试了150250次,用于
w5
。当输入操作数无符号时,结果仅与
w4
中的值相关,您可能需要
usubl
。减法的结果是有符号和无符号的,如何解释它是您的选择,但由于输入操作数必须是零扩展或符号扩展的,因此指定它很重要。
127-(-36)==163
-似乎是合法的。记住,您正在使用该
ssubl
对有符号字节操作数进行减法运算(产生有符号半字结果)。您希望220的有符号字节表示是什么?@sh1:是的,我尝试了
usubl
,得到了正确的结果。我认为是的,
usubl
ssubl
只关心操作数是否有符号/无符号