Arm NEON SSUBL指令有错误的结果?127-220=0x00a3(应为0xffa3)
在A64指令集中使用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
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),错误
事实上,经过几次测试,我发现这个问题与
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),正确
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
只关心操作数是否有符号/无符号