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中的结果:
- 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
中使用150、250,结果都是正确的。 问题只与w4
中的值有关。
有没有人可以解释一下?
谢谢!
(代表OP发布解决方案).
使用 usubl
而不是 ssubl
进行减法。
似乎 usubl
和 ssubl
只关心 操作数 是否为 signed/unsigned。
我在使用 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
中使用150、250,结果都是正确的。 问题只与w4
中的值有关。
有没有人可以解释一下?
谢谢!
(代表OP发布解决方案).
使用 usubl
而不是 ssubl
进行减法。
似乎 usubl
和 ssubl
只关心 操作数 是否为 signed/unsigned。