【问题标题】:Assembly replacing constant with a register value汇编用寄存器值替换常量
【发布时间】:2014-02-13 18:49:28
【问题描述】:

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

如果我有一条指令需要一个常量值作为参数,如下所示:

VQSHRN.U32 d0,q0,#16

如何将#16 替换为寄存器中的值,例如r0?该指令甚至可能允许您这样做,但我还没有找到有关该功能的文档。有正常的方法吗?

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

【问题讨论】:

  • @Michael 感谢您的链接。除了使用寄存器中的移位外,我正在尝试执行上述指令。我想尽可能少地保留它。有小费吗?我基本上需要一个向量舍入缩小饱和移位寄存器中的值。

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


【解决方案1】:

正如@Michael 指出的那样,VQRSHL 在这里是适当的按寄存器移位指令-幸运的是,右恰好是负左。我首先使用VDUPr0 转换为适当的移位值向量,然后使用VQMOVN 进行缩小。所有这些都可以作为内在函数使用,以帮助避免内联汇编的讨厌,如下所示:

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

【讨论】:

  • 感谢您指出具体说明。这应该有效。仅供参考,我要复制的 C 代码是 #define CV_DESCALE(x,n) (((x) + (1 > (n))
猜你喜欢
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 2016-11-11
相关资源
最近更新 更多