NEON: Как преобразовать 128-битный ARGB в 32-битный ARGB с насыщением? - PullRequest
1 голос
/ 08 февраля 2011

У меня есть пиксель ARGB, хранящийся в 128-битном регистре NEON как 32-битный на канал. Мне нужно сохранить это в памяти как 8-битный канал ARGB (сужение и насыщение).

Я получил свой результат после vmla.32 q1, q2, d0; интересно, смогу ли я добиться сужения или насыщения с помощью инструкции mul, сохраняя некоторые циклы.

Какой лучший способ это сделать?

1 Ответ

1 голос
/ 17 февраля 2011

Нет такой кодировки как vmla.32 q1, q2, d0;давайте предположим, что вы имели в виду q0.

Простой, наивный ответ:

vqmovn.s32  d0, q1  // saturate and narrow 32 -> 16
vqmovn.s16  d0, q0  // saturate and narrow 16 -> 8

это делает насыщение со знаком;если у вас есть беззнаковые значения, используйте типы .u32 и .u16, и если у вас есть подписанные значения, но вы хотите насытить их без знака, вы используете инструкцию vqmovun.

На вопросвы не можете сделать какое-то сужение умножения, которое сильно зависит от конкретной операции (и задействованных значений);учитывая, что вы используете vmla, ответ «вероятно, нет», однако.

Можете ли вы использовать операции насыщения в NEON и избегать расширения с самого начала, или вам нужен весь этот запас

...