NEON:如何将 128 位 ARGB 转换为具有饱和度的 32 位 ARGB?
我有一个 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
没有
vmla.32 q1, q2, d0
这样的编码;假设您的意思是q0
。简单、幼稚的答案是:
这确实有符号饱和;如果您有无符号值,请使用
.u32
和.u16
类型,如果您有有符号值但想要饱和为无符号值,请使用vqmovun< /代码> 指令。
对于您是否可以进行某种缩小乘法的问题,这在很大程度上取决于确切的操作(以及所涉及的值);然而,鉴于您使用的是
vmla
,答案是“可能不是”。您可以在 NEON 中使用饱和操作并避免加宽,还是您需要所有的净空?
There's no such encoding as
vmla.32 q1, q2, d0
; let's assume you meantq0
.The simple, naive answer is:
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 thevqmovun
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?