Assembly 霓虹灯:如何将一个128位的ARGB转换成32位的饱和ARGB?

Assembly 霓虹灯:如何将一个128位的ARGB转换成32位的饱和ARGB?,assembly,arm,neon,Assembly,Arm,Neon,我有一个ARGB像素存储在一个128位霓虹灯寄存器中,每个通道32位。我需要将其作为8位通道ARGB(窄化和饱和)存储到内存中 我在vmla.32 q1、q2、d0之后得到了我的结果;想知道我是否可以通过mul指令直接实现窄化或饱和,从而节省一些周期 最好的方法是什么?没有像vmla.32 q1、q2、d0这样的编码;假设您的意思是q0 简单而天真的答案是: vqmovn.s32 d0, q1 // saturate and narrow 32 -> 16 vqmovn.s16 d0

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

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


最好的方法是什么?

没有像
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中使用饱和操作并避免加宽吗?或者你需要所有的净空吗?

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

您的颜色组件是否无符号,或者32位组件是否可以变为负数(例如,也需要饱和到零)?您的颜色组件是否无符号,或者32位组件是否可以变为负数(例如,还需要饱和到零)?