Инструкция NEON SSUBL имеет неверный результат? 127-220 = 0x00a3(должно быть 0xffa3)
У меня проблема при использовании 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 или другое значение. Пока значение в 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 в w5
Все результаты верны. Проблема связана только со значением в w4
,
Кто-нибудь может это объяснить?
Спасибо!
1 ответ
(Выложено решение от имени ОП).
использование usubl
скорее, чем ssubl
сделать вычитание.
Кажется, что usubl
а также ssubl
заботиться только о том, если операнды подписаны / не подписаны.