NEON: Как преобразовать 128-битный ARGB в 32-битный ARGB с насыщением?

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

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

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

1 ответ

Там нет такой кодировки, как 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 и избегать расширения с самого начала, или вам нужен весь этот запас?

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