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

Posted

技术标签:

【中文标题】NEON:如何将 128 位 ARGB 转换为具有饱和度的 32 位 ARGB?【英文标题】:NEON: How to convert an 128 bit ARGB to 32 bit ARGB with saturation? 【发布时间】:2011-02-08 07:10:13 【问题描述】:

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

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

最好的方法是什么?

【问题讨论】:

您的颜色分量是无符号的,还是 32 位分量可以变为负数(例如,也需要饱和度为零)? 【参考方案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 中的饱和运算并避免从一开始就扩大,还是您需要所有的空间?

【讨论】:

以上是关于NEON:如何将 128 位 ARGB 转换为具有饱和度的 32 位 ARGB?的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 NEON 指令中的完整 128 位?

如何将 A16B16G16R16F 转换为 ARGB32?

NEON:将 uint8_t 数组加载到 128 位寄存器中

Armv8a NEON 内联汇编代码:如何将 16x8 位向量转换为四个 4x32 位(整数)向量?

如何在 Neon 中将 uint32x4_t 转换为 uint8x16_t?

Cortex-A57 可以双发 128 位 neon 指令吗?