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

发布于 2024-10-16 12:28:38 字数 170 浏览 3 评论 0原文

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

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

最好的方法是什么?

I have an ARGB pixel stored in an 128 bit NEON register as 32bit per channel. I need to store this into memory as an 8bit channel ARGB (narrowing and saturating).

I got my result after a vmla.32 q1, q2, d0; wondering if I could achieve narrowing or saturation through the mul instruction directly saving some cycles.

What's the best way to go about it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

好菇凉咱不稀罕他 2024-10-23 12:28:38

没有 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 中使用饱和操作并避免加宽,还是您需要所有的净空?

There's no such encoding as vmla.32 q1, q2, d0; let's assume you meant q0.

The simple, naive answer is:

vqmovn.s32  d0, q1  // saturate and narrow 32 -> 16
vqmovn.s16  d0, q0  // saturate and narrow 16 -> 8

this does signed saturation; if you have unsigned values, use the .u32 and .u16 types, and if you have signed values but want to saturate to unsigned, you use the vqmovun instruction.

To your question of whether or not you can do some sort of narrowing multiply, that depends heavily on the exact operation (and the values involved); given that you're using a vmla, the answer is "probably not", however.

Can you use the saturating operations in NEON and avoid widening to start with, or do you need all of that headroom?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文