C++ 用寄存器值替换常量的程序集
我不是组装专家,所以这可能很简单 如果我有一条指令,它期望一个常量值作为参数,如下所示:C++ 用寄存器值替换常量的程序集,c++,assembly,arm,inline-assembly,neon,C++,Assembly,Arm,Inline Assembly,Neon,我不是组装专家,所以这可能很简单 如果我有一条指令,它期望一个常量值作为参数,如下所示: VQSHRN.U32 d0,q0,#16 如何用寄存器中的值替换#16,例如r0?这个指令甚至可能允许您这样做,但我还没有找到关于该功能的文档。有没有一种正常的方法可以做到这一点 在这种情况下,我正在编写ARMV7程序集,并将其与C++代码进行联机。谢谢。正如@Michael所指出的,VQRSHL是这里合适的按寄存器移位指令——幸运的是,右边正好是负左边。我首先使用VDUP将r0转换为适当的移位值向量,然
VQSHRN.U32 d0,q0,#16
如何用寄存器中的值替换#16
,例如r0
?这个指令甚至可能允许您这样做,但我还没有找到关于该功能的文档。有没有一种正常的方法可以做到这一点
在这种情况下,我正在编写ARMV7程序集,并将其与C++代码进行联机。谢谢。正如@Michael所指出的,
VQRSHL
是这里合适的按寄存器移位指令——幸运的是,右边正好是负左边。我首先使用VDUP
将r0
转换为适当的移位值向量,然后使用VQMOVN
进行缩小。所有这些都可以作为内部函数使用,以帮助防止内联装配的不洁,如下所示:
vshift = vdupq_n_s32(-shift);
result = vqmovn_u32(vqrshlq_u32(data, vshift));
请看@Michael,谢谢你的链接。除了使用寄存器中的移位外,我正在尝试执行上述指令。我想尽量少用说明书。有什么建议吗?我基本上需要一个向量舍入缩小饱和移位寄存器中的值的权利。感谢您指出的具体指示。这应该行得通。仅供参考,我试图复制的C代码是#define CV_desccale(x,n)((x)+(1>(n))