Инструкция 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 заботиться только о том, если операнды подписаны / не подписаны.

Другие вопросы по тегам