按照立即数移位,左右移都可以,且都有饱和操作。
按照变量移位,只有左移可用。
在ARM汇编转NEON时,按变量右移会切换为左移。
即c = a-b, d>>c 要写成 c = b-a, d<<c 。
; C语言:a=SE_L_shr(tmp1, SE_sub(Q_tmp,1));
;q0=tmp1 q1=Q_tmp
vmov.s32 q14,#1
vsub.s32 q3,q14,q1 ;原本应是q1-q14
vqshl.s32 q2,q0,q3 ;原本是右移改成左移
本文探讨了从ARM汇编语言转换到NEON指令集时的特殊技巧,特别是关于移位操作的处理。文章指出,在进行立即数移位时,左移和右移均可使用,并包含饱和操作;但在变量移位中,仅左移适用,且右移需转换为左移操作。通过具体示例,如将c=a-b,d>>c转换为c=b-a,d<<c,展示了正确的转换方法。
按照立即数移位,左右移都可以,且都有饱和操作。
按照变量移位,只有左移可用。
在ARM汇编转NEON时,按变量右移会切换为左移。
即c = a-b, d>>c 要写成 c = b-a, d<<c 。
; C语言:a=SE_L_shr(tmp1, SE_sub(Q_tmp,1));
;q0=tmp1 q1=Q_tmp
vmov.s32 q14,#1
vsub.s32 q3,q14,q1 ;原本应是q1-q14
vqshl.s32 q2,q0,q3 ;原本是右移改成左移
1720

被折叠的 条评论
为什么被折叠?