装配用寄存器值替换常量

时间:2014-02-13 18:49:29

标签: c++ assembly arm inline-assembly neon

我不是装配专家所以这可能很简单。

如果我有一个指令需要一个常量值作为参数,那么:

VQSHRN.U32 d0,q0,#16

如何将#16替换为寄存器中的值,例如r0?这条指令甚至可以允许你这样做,但我还没有找到关于这种能力的文档。有没有一种正常的方法呢?

如果这很重要,我正在编写ARMv7程序集并将其与c ++代码内联。感谢。

1 个答案:

答案 0 :(得分:1)

正如@Michael所指出的那样,VQRSHL是适当的逐位移位指令 - 幸运的是,正确的是正面消极。我首先使用VDUPr0转换为适当的移位值向量,然后使用VQMOVN进行缩小。所有这些都可以作为内在函数来帮助保持内联汇编的肮脏,如下所示:

vshift = vdupq_n_s32(-shift);
result = vqmovn_u32(vqrshlq_u32(data, vshift));