NEON:如何将128位ARGB转换为饱和的32位ARGB?

时间:2011-02-08 07:10:13

标签: assembly arm neon

我有一个存储在128位NEON寄存器中的ARGB像素,每通道32位。我需要将它作为8位通道ARGB(缩小和饱和)存储在内存中。

我在vmla.32 q1,q2,d0之后得到了我的结果;想知道我是否可以通过mul指令直接节省一些周期来缩小或饱和。

最好的方法是什么?

1 个答案:

答案 0 :(得分: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中使用饱和操作并避免扩大开始,或者您是否需要所有这些空间?