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