1

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

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

最好的方法是什么?

4

1 回答 1

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

这确实有符号饱和;如果您有无符号值,请使用.u32and.u16类型,如果您有有符号值但想要饱和到无符号,则使用该vqmovun指令。

对于您是否可以进行某种缩小乘法的问题,这在很大程度上取决于确切的操作(以及所涉及的值);但是,鉴于您使用的是 a vmla,答案是“可能不是”。

您可以使用 NEON 中的饱和运算并避免从一开始就扩大,还是您需要所有的空间?

于 2011-02-17T04:31:05.680 回答